diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/description.xml b/templates/CordovaTizenWebUIFrameworkTemplate/description.xml
new file mode 100644
index 0000000..8a015e3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/description.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ 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.
+
+-->
+
+<?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/.DS_Store b/templates/CordovaTizenWebUIFrameworkTemplate/project/.DS_Store
new file mode 100644
index 0000000..a0f3f47
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/.DS_Store
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/.project b/templates/CordovaTizenWebUIFrameworkTemplate/project/.project
new file mode 100644
index 0000000..953e464
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/.project
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>cordova-tizen-web-ui</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.tizen.web.privilege.nature.PrivilegeBuilder</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.tizen.web.editor.css.nature.CSSBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.tizen.web.project.builder.WebBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>usedLibraryType</key>
+					<value>WebUIFramework</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.tizen.web.privilege.nature.PrivilegeNature</nature>
+		<nature>json.validation.nature</nature>
+		<nature>org.tizen.web.jslint.nature.JSLintNature</nature>
+		<nature>org.tizen.web.editor.css.nature.CSSNature</nature>
+		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+		<nature>org.tizen.web.project.builder.WebNature</nature>
+	</natures>
+</projectDescription>
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/.settings/.jsdtscope b/templates/CordovaTizenWebUIFrameworkTemplate/project/.settings/.jsdtscope
new file mode 100644
index 0000000..5a9acdc
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/.settings/.jsdtscope
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">
+		<attributes>
+			<attribute name="hide" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="src" path="">
+		<attributes>
+			<attribute name="provider" value="org.eclipse.wst.jsdt.web.core.internal.project.ModuleSourcePathProvider"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.tizen.web.project.initializer.WebLibraryInitializer"/>
+	<classpathentry kind="con" path="org.tizen.web.project.initializer.W3CLibraryInitializer"/>
+	<classpathentry kind="con" path="org.tizen.web.project.initializer.HTML5LibraryInitializer"/>
+	<classpathentry kind="con" path="org.eclipselabs.jsdt.jquery.core.CoflictLibrary_1.7"/>
+	<classpathentry kind="con" path="org.tizen.web.project.initializer.TizenLibraryInitializer"/>
+	<classpathentry kind="output" path=""/>
+</classpath>
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/.settings/org.eclipse.wst.css.core.prefs b/templates/CordovaTizenWebUIFrameworkTemplate/project/.settings/org.eclipse.wst.css.core.prefs
new file mode 100644
index 0000000..5ddc6bd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/.settings/org.eclipse.wst.css.core.prefs
@@ -0,0 +1,2 @@
+css-profile/<project>=org.eclipse.wst.css.core.cssprofile.css3
+eclipse.preferences.version=1
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/.settings/org.eclipse.wst.jsdt.ui.superType.container b/templates/CordovaTizenWebUIFrameworkTemplate/project/.settings/org.eclipse.wst.jsdt.ui.superType.container
new file mode 100644
index 0000000..3bd5d0a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/.settings/org.eclipse.wst.jsdt.ui.superType.container
@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/.settings/org.eclipse.wst.jsdt.ui.superType.name b/templates/CordovaTizenWebUIFrameworkTemplate/project/.settings/org.eclipse.wst.jsdt.ui.superType.name
new file mode 100644
index 0000000..05bd71b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/.settings/org.eclipse.wst.jsdt.ui.superType.name
@@ -0,0 +1 @@
+Window
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/.settings/org.eclipse.wst.validation.prefs b/templates/CordovaTizenWebUIFrameworkTemplate/project/.settings/org.eclipse.wst.validation.prefs
new file mode 100644
index 0000000..8917a19
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/.settings/org.eclipse.wst.validation.prefs
@@ -0,0 +1,8 @@
+DELEGATES_PREFERENCE=delegateValidatorList
+USER_BUILD_PREFERENCE=enabledBuildValidatorList
+USER_MANUAL_PREFERENCE=enabledManualValidatorList
+USER_PREFERENCE=overrideGlobalPreferencesfalse
+eclipse.preferences.version=1
+override=true
+suspend=false
+vf.version=3
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/config.xml b/templates/CordovaTizenWebUIFrameworkTemplate/project/config.xml
new file mode 100644
index 0000000..da091c1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" id="http://yourdomain/cordova-tizen-web-ui" version="1.0.0" viewmodes="maximized">
+    <tizen:application id="24DgQJcbbe.cordova-tizen-web-ui" package="24DgQJcbbe" required_version="2.2"/>
+    <content src="index.html"/>
+    <icon src="icon.png"/>
+    <name>cordova-tizen-web-ui</name>
+    <tizen:privilege name="http://tizen.org/privilege/application.launch"/>
+    <tizen:privilege name="http://tizen.org/privilege/contact.read"/>
+    <tizen:privilege name="http://tizen.org/privilege/contact.write"/>
+    <tizen:privilege name="http://tizen.org/privilege/filesystem.read"/>
+    <tizen:privilege name="http://tizen.org/privilege/filesystem.write"/>
+    <tizen:privilege name="http://tizen.org/privilege/unlimitedstorage"/>
+    <tizen:privilege name="http://tizen.org/privilege/setting"/>
+    <tizen:privilege name="http://tizen.org/privilege/package.info"/>
+    <tizen:privilege name="http://tizen.org/privilege/notification"/>
+    <tizen:privilege name="http://tizen.org/privilege/system"/>
+    <tizen:privilege name="http://tizen.org/privilege/content"/>
+    <tizen:privilege name="http://tizen.org/privilege/content.read"/>
+    <tizen:privilege name="http://tizen.org/privilege/content.write"/>
+    <tizen:privilege name="http://tizen.org/privilege/mediacapture"/>
+    <tizen:setting screen-orientation="auto-rotation" context-menu="enable" background-support="disable" encryption="disable" install-location="auto" hwkey-event="enable"/>
+    
+</widget>
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/cordova-2.9.0.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/cordova-2.9.0.js
new file mode 100644
index 0000000..0124b12
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/cordova-2.9.0.js
@@ -0,0 +1,9451 @@
+/*
+ *
+ * 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.
+ *
+*/
+
+/*
+ * No real native code
+ */
+
+/* Needed for File API implementation */
+window.webkitFileReader = window.FileReader;
+
+window._nativeReady = true;
+
+// Platform: tizen
+// 2.9.0-28-gc01c173
+/*
+ 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() {
+var CORDOVA_JS_BUILD_LABEL = '2.9.0-28-gc01c173';
+// file: lib/scripts/require.js
+
+var require,
+    define;
+
+(function () {
+    var modules = {},
+    // Stack of moduleIds currently being built.
+        requireStack = [],
+    // Map of module ID -> index into requireStack of modules currently being built.
+        inProgressModules = {},
+        SEPERATOR = ".";
+
+
+
+    function build(module) {
+        var factory = module.factory,
+            localRequire = function (id) {
+                var resultantId = id;
+                //Its a relative path, so lop off the last portion and add the id (minus "./")
+                if (id.charAt(0) === ".") {
+                    resultantId = module.id.slice(0, module.id.lastIndexOf(SEPERATOR)) + SEPERATOR + id.slice(2);
+                }
+                return require(resultantId);
+            };
+        module.exports = {};
+        delete module.factory;
+        factory(localRequire, module.exports, module);
+        return module.exports;
+    }
+
+    require = function (id) {
+        if (!modules[id]) {
+            throw "module " + id + " not found";
+        } else if (id in inProgressModules) {
+            var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id;
+            throw "Cycle in require graph: " + cycle;
+        }
+        if (modules[id].factory) {
+            try {
+                inProgressModules[id] = requireStack.length;
+                requireStack.push(id);
+                return build(modules[id]);
+            } finally {
+                delete inProgressModules[id];
+                requireStack.pop();
+            }
+        }
+        return 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];
+    };
+
+    define.moduleMap = modules;
+})();
+
+//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') {
+        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 unsubscribing 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 unsubscribing 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) {
+        return (windowEventHandlers[event] = channel.create(event));
+    },
+    addStickyDocumentEventHandler:function(event) {
+        return (documentEventHandlers[event] = channel.createSticky(event));
+    },
+    addDocumentEventHandler:function(event) {
+        return (documentEventHandlers[event] = channel.create(event));
+    },
+    removeWindowEventHandler:function(event) {
+        delete windowEventHandlers[event];
+    },
+    removeDocumentEventHandler:function(event) {
+        delete documentEventHandlers[event];
+    },
+    /**
+     * Retrieve 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
+     * bNoDetach is required for events which cause an exception which needs to be caught in native code
+     */
+    fireDocumentEvent: function(type, data, bNoDetach) {
+        var evt = createEvent(type, data);
+        if (typeof documentEventHandlers[type] != 'undefined') {
+            if( bNoDetach ) {
+              documentEventHandlers[type].fire(evt);
+            }
+            else {
+              setTimeout(function() {
+                  // Fire deviceready on listeners that were registered before cordova.js was loaded.
+                  if (type == 'deviceready') {
+                      document.dispatchEvent(evt);
+                  }
+                  documentEventHandlers[type].fire(evt);
+              }, 0);
+            }
+        } 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);
+        }
+    },
+
+    /**
+     * Plugin callback mechanism.
+     */
+    // Randomize the starting callbackId to avoid collisions after refreshing or navigating.
+    // This way, it's very unlikely that any new callback would get the same callbackId as an old callback.
+    callbackId: Math.floor(Math.random() * 2000000000),
+    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.
+     */
+    callbackSuccess: function(callbackId, args) {
+        try {
+            cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback);
+        } catch (e) {
+            console.log("Error in error callback: " + callbackId + " = "+e);
+        }
+    },
+
+    /**
+     * Called by native code when returning error result from an action.
+     */
+    callbackError: function(callbackId, args) {
+        // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative.
+        // Derive success from status.
+        try {
+            cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback);
+        } catch (e) {
+            console.log("Error in error callback: " + callbackId + " = "+e);
+        }
+    },
+
+    /**
+     * Called by native code when returning the result from an action.
+     */
+    callbackFromNative: function(callbackId, success, status, args, keepCallback) {
+        var callback = cordova.callbacks[callbackId];
+        if (callback) {
+            if (success && status == cordova.callbackStatus.OK) {
+                callback.success && callback.success.apply(null, args);
+            } else if (!success) {
+                callback.fail && callback.fail.apply(null, args);
+            }
+
+            // Clear callback if not expecting any more results
+            if (!keepCallback) {
+                delete cordova.callbacks[callbackId];
+            }
+        }
+    },
+    addConstructor: function(func) {
+        channel.onCordovaReady.subscribe(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.addStickyDocumentEventHandler('deviceready');
+
+module.exports = cordova;
+
+});
+
+// file: lib/common/argscheck.js
+define("cordova/argscheck", function(require, exports, module) {
+
+var exec = require('cordova/exec');
+var utils = require('cordova/utils');
+
+var moduleExports = module.exports;
+
+var typeMap = {
+    'A': 'Array',
+    'D': 'Date',
+    'N': 'Number',
+    'S': 'String',
+    'F': 'Function',
+    'O': 'Object'
+};
+
+function extractParamName(callee, argIndex) {
+  return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex];
+}
+
+function checkArgs(spec, functionName, args, opt_callee) {
+    if (!moduleExports.enableChecks) {
+        return;
+    }
+    var errMsg = null;
+    var typeName;
+    for (var i = 0; i < spec.length; ++i) {
+        var c = spec.charAt(i),
+            cUpper = c.toUpperCase(),
+            arg = args[i];
+        // Asterix means allow anything.
+        if (c == '*') {
+            continue;
+        }
+        typeName = utils.typeName(arg);
+        if ((arg === null || arg === undefined) && c == cUpper) {
+            continue;
+        }
+        if (typeName != typeMap[cUpper]) {
+            errMsg = 'Expected ' + typeMap[cUpper];
+            break;
+        }
+    }
+    if (errMsg) {
+        errMsg += ', but got ' + typeName + '.';
+        errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg;
+        // Don't log when running unit tests.
+        if (typeof jasmine == 'undefined') {
+            console.error(errMsg);
+        }
+        throw TypeError(errMsg);
+    }
+}
+
+function getValue(value, defaultValue) {
+    return value === undefined ? defaultValue : value;
+}
+
+moduleExports.checkArgs = checkArgs;
+moduleExports.getValue = getValue;
+moduleExports.enableChecks = true;
+
+
+});
+
+// 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 clobber(obj, key, value) {
+    exports.replaceHookForTesting(obj, key);
+    obj[key] = value;
+    // Getters can only be overridden by getters.
+    if (obj[key] !== value) {
+        utils.defineGetter(obj, key, function() {
+            return value;
+        });
+    }
+}
+
+function assignOrWrapInDeprecateGetter(obj, key, value, message) {
+    if (message) {
+        utils.defineGetter(obj, key, function() {
+            console.log(message);
+            delete obj[key];
+            clobber(obj, key, value);
+            return value;
+        });
+    } else {
+        clobber(obj, key, value);
+    }
+}
+
+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') {
+                  assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
+              } else if (typeof obj.path !== 'undefined') {
+                  // If merging, merge properties onto parent, otherwise, clobber.
+                  if (merge) {
+                      recursiveMerge(parent[key], result);
+                  } else {
+                      assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
+                  }
+              }
+              result = parent[key];
+          } else {
+            // Overwrite if not currently defined.
+            if (typeof parent[key] == 'undefined') {
+              assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated);
+            } 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 (target.prototype && target.prototype.constructor === target) {
+                // If the target object is a constructor override off prototype.
+                clobber(target.prototype, prop, src[prop]);
+            } else {
+                if (typeof src[prop] === 'object' && typeof target[prop] === 'object') {
+                    recursiveMerge(target[prop], src[prop]);
+                } else {
+                    clobber(target, prop, src[prop]);
+                }
+            }
+        }
+    }
+}
+
+exports.buildIntoButDoNotClobber = function(objects, target) {
+    include(target, objects, false, false);
+};
+exports.buildIntoAndClobber = function(objects, target) {
+    include(target, objects, true, false);
+};
+exports.buildIntoAndMerge = function(objects, target) {
+    include(target, objects, true, true);
+};
+exports.recursiveMerge = recursiveMerge;
+exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter;
+exports.replaceHookForTesting = function() {};
+
+});
+
+// file: lib/common/channel.js
+define("cordova/channel", function(require, exports, module) {
+
+var utils = require('cordova/utils'),
+    nextGuid = 1;
+
+/**
+ * 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, as well as for custom events thereafter.
+ *
+ * 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 events marked with an * are sticky. Once they have fired, they will stay in the fired state.
+ * All listeners that subscribe after the event is fired will be executed right away.
+ *
+ * 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
+ */
+var Channel = function(type, sticky) {
+    this.type = type;
+    // Map of guid -> function.
+    this.handlers = {};
+    // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired.
+    this.state = sticky ? 1 : 0;
+    // Used in sticky mode to remember args passed to fire().
+    this.fireArgs = null;
+    // Used by onHasSubscribersChange to know if there are any listeners.
+    this.numHandlers = 0;
+    // Function that is called when the first listener is subscribed, or when
+    // the last listener is unsubscribed.
+    this.onHasSubscribersChange = null;
+},
+    channel = {
+        /**
+         * Calls the provided function only after all of the channels specified
+         * have been fired. All channels must be sticky channels.
+         */
+        join: function(h, c) {
+            var len = c.length,
+                i = len,
+                f = function() {
+                    if (!(--i)) h();
+                };
+            for (var j=0; j<len; j++) {
+                if (c[j].state === 0) {
+                    throw Error('Can only use join with sticky channels.');
+                }
+                c[j].subscribe(f);
+            }
+            if (!len) h();
+        },
+        create: function(type) {
+            return channel[type] = new Channel(type, false);
+        },
+        createSticky: function(type) {
+            return channel[type] = new Channel(type, true);
+        },
+
+        /**
+         * 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 = channel[feature] || this.createSticky(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 (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) {
+    // need a function to call
+    forceFunction(f);
+    if (this.state == 2) {
+        f.apply(c || this, this.fireArgs);
+        return;
+    }
+
+    var func = f,
+        guid = f.observer_guid;
+    if (typeof c == "object") { func = utils.close(c, f); }
+
+    if (!guid) {
+        // first time any channel has seen this subscriber
+        guid = '' + nextGuid++;
+    }
+    func.observer_guid = guid;
+    f.observer_guid = guid;
+
+    // Don't add the same handler more than once.
+    if (!this.handlers[guid]) {
+        this.handlers[guid] = func;
+        this.numHandlers++;
+        if (this.numHandlers == 1) {
+            this.onHasSubscribersChange && this.onHasSubscribersChange();
+        }
+    }
+};
+
+/**
+ * Unsubscribes the function with the given guid from the channel.
+ */
+Channel.prototype.unsubscribe = function(f) {
+    // need a function to unsubscribe
+    forceFunction(f);
+
+    var guid = f.observer_guid,
+        handler = this.handlers[guid];
+    if (handler) {
+        delete this.handlers[guid];
+        this.numHandlers--;
+        if (this.numHandlers === 0) {
+            this.onHasSubscribersChange && this.onHasSubscribersChange();
+        }
+    }
+};
+
+/**
+ * Calls all functions subscribed to this channel.
+ */
+Channel.prototype.fire = function(e) {
+    var fail = false,
+        fireArgs = Array.prototype.slice.call(arguments);
+    // Apply stickiness.
+    if (this.state == 1) {
+        this.state = 2;
+        this.fireArgs = fireArgs;
+    }
+    if (this.numHandlers) {
+        // Copy the values first so that it is safe to modify it from within
+        // callbacks.
+        var toCall = [];
+        for (var item in this.handlers) {
+            toCall.push(this.handlers[item]);
+        }
+        for (var i = 0; i < toCall.length; ++i) {
+            toCall[i].apply(this, fireArgs);
+        }
+        if (this.state == 2 && this.numHandlers) {
+            this.numHandlers = 0;
+            this.handlers = {};
+            this.onHasSubscribersChange && this.onHasSubscribersChange();
+        }
+    }
+};
+
+
+// defining them here so they are ready super fast!
+// DOM event that is received when the web page is loaded and parsed.
+channel.createSticky('onDOMContentLoaded');
+
+// Event to indicate the Cordova native side is ready.
+channel.createSticky('onNativeReady');
+
+// Event to indicate that all Cordova JavaScript objects have been created
+// and it's time to run plugin constructors.
+channel.createSticky('onCordovaReady');
+
+// Event to indicate that device properties are available
+channel.createSticky('onCordovaInfoReady');
+
+// Event to indicate that the connection property has been set.
+channel.createSticky('onCordovaConnectionReady');
+
+// Event to indicate that all automatically loaded JS plugins are loaded and ready.
+channel.createSticky('onPluginsReady');
+
+// Event to indicate that Cordova is ready
+channel.createSticky('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.createSticky('onDestroy');
+
+// Channels that must fire before "deviceready" is fired.
+channel.waitForInitialization('onCordovaReady');
+channel.waitForInitialization('onCordovaConnectionReady');
+channel.waitForInitialization('onDOMContentLoaded');
+
+module.exports = channel;
+
+});
+
+// file: lib/common/commandProxy.js
+define("cordova/commandProxy", function(require, exports, module) {
+
+
+// internal map of proxy function
+var CommandProxyMap = {};
+
+module.exports = {
+
+    // example: cordova.commandProxy.add("Accelerometer",{getCurrentAcceleration: function(successCallback, errorCallback, options) {...},...);
+    add:function(id,proxyObj) {
+        console.log("adding proxy for " + id);
+        CommandProxyMap[id] = proxyObj;
+        return proxyObj;
+    },
+
+    // cordova.commandProxy.remove("Accelerometer");
+    remove:function(id) {
+        var proxy = CommandProxyMap[id];
+        delete CommandProxyMap[id];
+        CommandProxyMap[id] = null;
+        return proxy;
+    },
+
+    get:function(service,action) {
+        return ( CommandProxyMap[service] ? CommandProxyMap[service][action] : null );
+    }
+};
+});
+
+// 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
+ *      Asynchronous: 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
+ */
+/**
+ * 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
+ *      Asynchronous: 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
+ */
+
+//console.log("TIZEN EXEC START");
+
+
+var manager = require('cordova/plugin/tizen/manager'),
+    cordova = require('cordova'),
+    utils = require('cordova/utils');
+
+//console.log("TIZEN EXEC START bis");
+
+module.exports = function(successCB, failCB, service, action, args) {
+
+    try {
+        var v = manager.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);
+    }
+};
+
+//console.log("TIZEN EXEC END ");
+
+/*
+var plugins = {
+    "Device": require('cordova/plugin/tizen/Device'),
+    "NetworkStatus": require('cordova/plugin/tizen/NetworkStatus'),
+    "Accelerometer": require('cordova/plugin/tizen/Accelerometer'),
+    "Battery": require('cordova/plugin/tizen/Battery'),
+    "Compass": require('cordova/plugin/tizen/Compass'),
+    //"Capture": require('cordova/plugin/tizen/Capture'), not yet available
+    "Camera": require('cordova/plugin/tizen/Camera'),
+    "FileTransfer": require('cordova/plugin/tizen/FileTransfer'),
+    "Media": require('cordova/plugin/tizen/Media'),
+    "Notification": require('cordova/plugin/tizen/Notification')
+};
+
+console.log("TIZEN EXEC START");
+
+module.exports = function(success, fail, service, action, args) {
+    try {
+        console.log("exec: " + service + "." + action);
+        plugins[service][action](success, fail, args);
+    }
+    catch(e) {
+        console.log("missing exec: " + service + "." + action);
+        console.log(args);
+        console.log(e);
+        console.log(e.stack);
+    }
+};
+
+console.log("TIZEN EXEC START");
+*/
+
+});
+
+// file: lib/common/modulemapper.js
+define("cordova/modulemapper", function(require, exports, module) {
+
+var builder = require('cordova/builder'),
+    moduleMap = define.moduleMap,
+    symbolList,
+    deprecationMap;
+
+exports.reset = function() {
+    symbolList = [];
+    deprecationMap = {};
+};
+
+function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) {
+    if (!(moduleName in moduleMap)) {
+        throw new Error('Module ' + moduleName + ' does not exist.');
+    }
+    symbolList.push(strategy, moduleName, symbolPath);
+    if (opt_deprecationMessage) {
+        deprecationMap[symbolPath] = opt_deprecationMessage;
+    }
+}
+
+// Note: Android 2.3 does have Function.bind().
+exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) {
+    addEntry('c', moduleName, symbolPath, opt_deprecationMessage);
+};
+
+exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) {
+    addEntry('m', moduleName, symbolPath, opt_deprecationMessage);
+};
+
+exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) {
+    addEntry('d', moduleName, symbolPath, opt_deprecationMessage);
+};
+
+function prepareNamespace(symbolPath, context) {
+    if (!symbolPath) {
+        return context;
+    }
+    var parts = symbolPath.split('.');
+    var cur = context;
+    for (var i = 0, part; part = parts[i]; ++i) {
+        cur = cur[part] = cur[part] || {};
+    }
+    return cur;
+}
+
+exports.mapModules = function(context) {
+    var origSymbols = {};
+    context.CDV_origSymbols = origSymbols;
+    for (var i = 0, len = symbolList.length; i < len; i += 3) {
+        var strategy = symbolList[i];
+        var moduleName = symbolList[i + 1];
+        var symbolPath = symbolList[i + 2];
+        var lastDot = symbolPath.lastIndexOf('.');
+        var namespace = symbolPath.substr(0, lastDot);
+        var lastName = symbolPath.substr(lastDot + 1);
+
+        var module = require(moduleName);
+        var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null;
+        var parentObj = prepareNamespace(namespace, context);
+        var target = parentObj[lastName];
+
+        if (strategy == 'm' && target) {
+            builder.recursiveMerge(target, module);
+        } else if ((strategy == 'd' && !target) || (strategy != 'd')) {
+            if (!(symbolPath in origSymbols)) {
+                origSymbols[symbolPath] = target;
+            }
+            builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg);
+        }
+    }
+};
+
+exports.getOriginalSymbol = function(context, symbolPath) {
+    var origSymbols = context.CDV_origSymbols;
+    if (origSymbols && (symbolPath in origSymbols)) {
+        return origSymbols[symbolPath];
+    }
+    var parts = symbolPath.split('.');
+    var obj = context;
+    for (var i = 0; i < parts.length; ++i) {
+        obj = obj && obj[parts[i]];
+    }
+    return obj;
+};
+
+exports.loadMatchingModules = function(matchingRegExp) {
+    for (var k in moduleMap) {
+        if (matchingRegExp.exec(k)) {
+            require(k);
+        }
+    }
+};
+
+exports.reset();
+
+
+});
+
+// file: lib/tizen/platform.js
+define("cordova/platform", function(require, exports, module) {
+
+//console.log("TIZEN PLATFORM START");
+
+
+module.exports = {
+    id: "tizen",
+    initialize: function() {
+
+        //console.log("TIZEN PLATFORM initialize start");
+
+        var modulemapper = require('cordova/modulemapper');
+
+        //modulemapper.loadMatchingModules(/cordova.*\/plugininit$/);
+
+        modulemapper.loadMatchingModules(/cordova.*\/symbols$/);
+
+        modulemapper.mapModules(window);
+
+        //console.log("TIZEN PLATFORM initialize end");
+
+    }
+};
+
+//console.log("TIZEN PLATFORM START");
+
+
+});
+
+// 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 argscheck = require('cordova/argscheck'),
+    exec = require('cordova/exec'),
+    Camera = require('cordova/plugin/CameraConstants'),
+    CameraPopoverHandle = require('cordova/plugin/CameraPopoverHandle');
+
+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) {
+    argscheck.checkArgs('fFO', 'Camera.getPicture', arguments);
+    options = options || {};
+    var getValue = argscheck.getValue;
+
+    var quality = getValue(options.quality, 50);
+    var destinationType = getValue(options.destinationType, Camera.DestinationType.FILE_URI);
+    var sourceType = getValue(options.sourceType, Camera.PictureSourceType.CAMERA);
+    var targetWidth = getValue(options.targetWidth, -1);
+    var targetHeight = getValue(options.targetHeight, -1);
+    var encodingType = getValue(options.encodingType, Camera.EncodingType.JPEG);
+    var mediaType = getValue(options.mediaType, Camera.MediaType.PICTURE);
+    var allowEdit = !!options.allowEdit;
+    var correctOrientation = !!options.correctOrientation;
+    var saveToPhotoAlbum = !!options.saveToPhotoAlbum;
+    var popoverOptions = getValue(options.popoverOptions, null);
+    var cameraDirection = getValue(options.cameraDirection, Camera.Direction.BACK);
+
+    var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType,
+                mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions, cameraDirection];
+
+    exec(successCallback, errorCallback, "Camera", "takePicture", args);
+    return new CameraPopoverHandle();
+};
+
+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)
+    NATIVE_URI: 2        // Return native uri (eg. asset-library://... for iOS)
+  },
+  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
+  },
+  Direction:{
+      BACK: 0,
+      FRONT: 1
+  }
+};
+
+});
+
+// file: lib/common/plugin/CameraPopoverHandle.js
+define("cordova/plugin/CameraPopoverHandle", function(require, exports, module) {
+
+var exec = require('cordova/exec');
+
+/**
+ * A handle to an image picker popover.
+ */
+var CameraPopoverHandle = function() {
+    this.setPosition = function(popoverOptions) {
+        console.log('CameraPopoverHandle.setPosition is only supported on iOS.');
+    };
+};
+
+module.exports = CameraPopoverHandle;
+
+});
+
+// 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;
+};
+
+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;
+};
+
+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;
+};
+
+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 occurred
+ * @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;
+  this.trueHeading = trueHeading;
+  this.headingAccuracy = headingAccuracy;
+  this.timestamp = 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",
+        CELL:"cellular",
+        NONE: "none"
+};
+
+});
+
+// file: lib/common/plugin/Contact.js
+define("cordova/plugin/Contact", function(require, exports, module) {
+
+var argscheck = require('cordova/argscheck'),
+    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) {
+    argscheck.checkArgs('FF', 'Contact.remove', arguments);
+    var fail = errorCB && 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);
+    clonedContact.id = null;
+    clonedContact.rawId = null;
+
+    function nullIds(arr) {
+        if (arr) {
+            for (var i = 0; i < arr.length; ++i) {
+                arr[i].id = null;
+            }
+        }
+    }
+
+    // Loop through and clear out any id's in phones, emails, etc.
+    nullIds(clonedContact.phoneNumbers);
+    nullIds(clonedContact.emails);
+    nullIds(clonedContact.addresses);
+    nullIds(clonedContact.ims);
+    nullIds(clonedContact.organizations);
+    nullIds(clonedContact.categories);
+    nullIds(clonedContact.photos);
+    nullIds(clonedContact.urls);
+    return clonedContact;
+};
+
+/**
+* Persists contact to device storage.
+* @param successCB success callback
+* @param errorCB error callback
+*/
+Contact.prototype.save = function(successCB, errorCB) {
+    argscheck.checkArgs('FFO', 'Contact.save', arguments);
+    var fail = errorCB && function(code) {
+        errorCB(new ContactError(code));
+    };
+    var success = function(result) {
+        if (result) {
+            if (successCB) {
+                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 occurred
+ * @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 argscheck = require('cordova/argscheck'),
+    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.call(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 exclusively 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) {
+    argscheck.checkArgs('sOFF', 'DirectoryEntry.getDirectory', arguments);
+    var win = successCallback && function(result) {
+        var entry = new DirectoryEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = errorCallback && 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) {
+    argscheck.checkArgs('FF', 'DirectoryEntry.removeRecursively', arguments);
+    var fail = errorCallback && 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 exclusively 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) {
+    argscheck.checkArgs('sOFF', 'DirectoryEntry.getFile', arguments);
+    var win = successCallback && function(result) {
+        var FileEntry = require('cordova/plugin/FileEntry');
+        var entry = new FileEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = errorCallback && 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;
+    this.hasReadEntries = false;
+}
+
+/**
+ * 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) {
+    // If we've already read and passed on this directory's entries, return an empty list.
+    if (this.hasReadEntries) {
+        successCallback([]);
+        return;
+    }
+    var reader = this;
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var retVal = [];
+        for (var i=0; i<result.length; i++) {
+            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);
+        }
+        reader.hasReadEntries = true;
+        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 argscheck = require('cordova/argscheck'),
+    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 = !!isFile;
+    this.isDirectory = !!isDirectory;
+    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) {
+    argscheck.checkArgs('FF', 'Entry.getMetadata', arguments);
+    var success = successCallback && function(lastModified) {
+        var metadata = new Metadata(lastModified);
+        successCallback(metadata);
+    };
+    var fail = errorCallback && 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) {
+    argscheck.checkArgs('FFO', 'Entry.setMetadata', arguments);
+    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) {
+    argscheck.checkArgs('oSFF', 'Entry.moveTo', arguments);
+    var fail = errorCallback && function(code) {
+        errorCallback(new FileError(code));
+    };
+    // source path
+    var srcPath = this.fullPath,
+        // entry name
+        name = newName || this.name,
+        success = function(entry) {
+            if (entry) {
+                if (successCallback) {
+                    // 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);
+                    successCallback(result);
+                }
+            }
+            else {
+                // no Entry object returned
+                fail && 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) {
+    argscheck.checkArgs('oSFF', 'Entry.copyTo', arguments);
+    var fail = errorCallback && function(code) {
+        errorCallback(new FileError(code));
+    };
+
+        // source path
+    var srcPath = this.fullPath,
+        // entry name
+        name = newName || this.name,
+        // success callback
+        success = function(entry) {
+            if (entry) {
+                if (successCallback) {
+                    // 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);
+                    successCallback(result);
+                }
+            }
+            else {
+                // no Entry object returned
+                fail && 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) {
+    argscheck.checkArgs('FF', 'Entry.remove', arguments);
+    var fail = errorCallback && 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) {
+    argscheck.checkArgs('FF', 'Entry.getParent', arguments);
+    var win = successCallback && function(result) {
+        var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
+        var entry = new DirectoryEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = errorCallback && 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;
+
+    // These store the absolute start and end for slicing the file.
+    this.start = 0;
+    this.end = this.size;
+};
+
+/**
+ * Returns a "slice" of the file. Since Cordova Files don't contain the actual
+ * content, this really returns a File with adjusted start and end.
+ * Slices of slices are supported.
+ * start {Number} The index at which to start the slice (inclusive).
+ * end {Number} The index at which to end the slice (exclusive).
+ */
+File.prototype.slice = function(start, end) {
+    var size = this.end - this.start;
+    var newStart = 0;
+    var newEnd = size;
+    if (arguments.length) {
+        if (start < 0) {
+            newStart = Math.max(size + start, 0);
+        } else {
+            newStart = Math.min(size, start);
+        }
+    }
+
+    if (arguments.length >= 2) {
+        if (end < 0) {
+            newEnd = Math.max(size + end, 0);
+        } else {
+            newEnd = Math.min(end, size);
+        }
+    }
+
+    var newFile = new File(this.name, this.fullPath, this.type, this.lastModifiedData, this.size);
+    newFile.start = this.start + newStart;
+    newFile.end = this.start + newEnd;
+    return newFile;
+};
+
+
+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 === "") {
+            errorCallback && errorCallback(new FileError(FileError.INVALID_STATE_ERR));
+        } else {
+            successCallback && 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 = successCallback && function(f) {
+        var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size);
+        successCallback(file);
+    };
+    var fail = errorCallback && 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'),
+    modulemapper = require('cordova/modulemapper'),
+    utils = require('cordova/utils'),
+    File = require('cordova/plugin/File'),
+    FileError = require('cordova/plugin/FileError'),
+    ProgressEvent = require('cordova/plugin/ProgressEvent'),
+    origFileReader = modulemapper.getOriginalSymbol(this, 'FileReader');
+
+/**
+ * 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._readyState = 0;
+    this._error = null;
+    this._result = null;
+    this._fileName = '';
+    this._realReader = origFileReader ? new origFileReader() : {};
+};
+
+// States
+FileReader.EMPTY = 0;
+FileReader.LOADING = 1;
+FileReader.DONE = 2;
+
+utils.defineGetter(FileReader.prototype, 'readyState', function() {
+    return this._fileName ? this._readyState : this._realReader.readyState;
+});
+
+utils.defineGetter(FileReader.prototype, 'error', function() {
+    return this._fileName ? this._error: this._realReader.error;
+});
+
+utils.defineGetter(FileReader.prototype, 'result', function() {
+    return this._fileName ? this._result: this._realReader.result;
+});
+
+function defineEvent(eventName) {
+    utils.defineGetterSetter(FileReader.prototype, eventName, function() {
+        return this._realReader[eventName] || null;
+    }, function(value) {
+        this._realReader[eventName] = value;
+    });
+}
+defineEvent('onloadstart');    // When the read starts.
+defineEvent('onprogress');     // While reading (and decoding) file or fileBlob data, and reporting partial file data (progress.loaded/progress.total)
+defineEvent('onload');         // When the read has successfully completed.
+defineEvent('onerror');        // When the read has failed (see errors).
+defineEvent('onloadend');      // When the request has completed (either in success or failure).
+defineEvent('onabort');        // When the read has been aborted. For instance, by invoking the abort() method.
+
+function initRead(reader, file) {
+    // Already loading something
+    if (reader.readyState == FileReader.LOADING) {
+      throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    reader._result = null;
+    reader._error = null;
+    reader._readyState = FileReader.LOADING;
+
+    if (typeof file.fullPath == 'string') {
+        reader._fileName = file.fullPath;
+    } else {
+        reader._fileName = '';
+        return true;
+    }
+
+    reader.onloadstart && reader.onloadstart(new ProgressEvent("loadstart", {target:reader}));
+}
+
+/**
+ * Abort reading file.
+ */
+FileReader.prototype.abort = function() {
+    if (origFileReader && !this._fileName) {
+        return this._realReader.abort();
+    }
+    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) {
+    if (initRead(this, file)) {
+        return this._realReader.readAsText(file, encoding);
+    }
+
+    // Default encoding is UTF-8
+    var enc = encoding ? encoding : "UTF-8";
+    var me = this;
+    var execArgs = [this._fileName, enc, file.start, file.end];
+
+    // 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", execArgs);
+};
+
+
+/**
+ * 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) {
+    if (initRead(this, file)) {
+        return this._realReader.readAsDataURL(file);
+    }
+
+    var me = this;
+    var execArgs = [this._fileName, file.start, file.end];
+
+    // 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", execArgs);
+};
+
+/**
+ * Read file and return data as a binary data.
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsBinaryString = function(file) {
+    if (initRead(this, file)) {
+        return this._realReader.readAsBinaryString(file);
+    }
+
+    var me = this;
+    var execArgs = [this._fileName, file.start, file.end];
+
+    // 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;
+
+            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", "readAsBinaryString", execArgs);
+};
+
+/**
+ * Read file and return data as a binary data.
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsArrayBuffer = function(file) {
+    if (initRead(this, file)) {
+        return this._realReader.readAsArrayBuffer(file);
+    }
+
+    var me = this;
+    var execArgs = [this._fileName, file.start, file.end];
+
+    // 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;
+
+            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", "readAsArrayBuffer", execArgs);
+};
+
+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 argscheck = require('cordova/argscheck'),
+    exec = require('cordova/exec'),
+    FileTransferError = require('cordova/plugin/FileTransferError'),
+    ProgressEvent = require('cordova/plugin/ProgressEvent');
+
+function newProgressEvent(result) {
+    var pe = new ProgressEvent();
+    pe.lengthComputable = result.lengthComputable;
+    pe.loaded = result.loaded;
+    pe.total = result.total;
+    return pe;
+}
+
+function getBasicAuthHeader(urlString) {
+    var header =  null;
+
+    if (window.btoa) {
+        // parse the url using the Location object
+        var url = document.createElement('a');
+        url.href = urlString;
+
+        var credentials = null;
+        var protocol = url.protocol + "//";
+        var origin = protocol + url.host;
+
+        // check whether there are the username:password credentials in the url
+        if (url.href.indexOf(origin) !== 0) { // credentials found
+            var atIndex = url.href.indexOf("@");
+            credentials = url.href.substring(protocol.length, atIndex);
+        }
+
+        if (credentials) {
+            var authHeader = "Authorization";
+            var authHeaderValue = "Basic " + window.btoa(credentials);
+
+            header = {
+                name : authHeader,
+                value : authHeaderValue
+            };
+        }
+    }
+
+    return header;
+}
+
+var idCounter = 0;
+
+/**
+ * FileTransfer uploads a file to a remote server.
+ * @constructor
+ */
+var FileTransfer = function() {
+    this._id = ++idCounter;
+    this.onprogress = null; // optional callback
+};
+
+/**
+* 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) {
+    argscheck.checkArgs('ssFFO*', 'FileTransfer.upload', arguments);
+    // check for options
+    var fileKey = null;
+    var fileName = null;
+    var mimeType = null;
+    var params = null;
+    var chunkedMode = true;
+    var headers = null;
+    var httpMethod = null;
+    var basicAuthHeader = getBasicAuthHeader(server);
+    if (basicAuthHeader) {
+        options = options || {};
+        options.headers = options.headers || {};
+        options.headers[basicAuthHeader.name] = basicAuthHeader.value;
+    }
+
+    if (options) {
+        fileKey = options.fileKey;
+        fileName = options.fileName;
+        mimeType = options.mimeType;
+        headers = options.headers;
+        httpMethod = options.httpMethod || "POST";
+        if (httpMethod.toUpperCase() == "PUT"){
+            httpMethod = "PUT";
+        } else {
+            httpMethod = "POST";
+        }
+        if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") {
+            chunkedMode = options.chunkedMode;
+        }
+        if (options.params) {
+            params = options.params;
+        }
+        else {
+            params = {};
+        }
+    }
+
+    var fail = errorCallback && function(e) {
+        var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body);
+        errorCallback(error);
+    };
+
+    var self = this;
+    var win = function(result) {
+        if (typeof result.lengthComputable != "undefined") {
+            if (self.onprogress) {
+                self.onprogress(newProgressEvent(result));
+            }
+        } else {
+            successCallback && successCallback(result);
+        }
+    };
+    exec(win, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers, this._id, httpMethod]);
+};
+
+/**
+ * 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
+ * @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
+ * @param options {FileDownloadOptions} Optional parameters such as headers
+ */
+FileTransfer.prototype.download = function(source, target, successCallback, errorCallback, trustAllHosts, options) {
+    argscheck.checkArgs('ssFF*', 'FileTransfer.download', arguments);
+    var self = this;
+
+    var basicAuthHeader = getBasicAuthHeader(source);
+    if (basicAuthHeader) {
+        options = options || {};
+        options.headers = options.headers || {};
+        options.headers[basicAuthHeader.name] = basicAuthHeader.value;
+    }
+
+    var headers = null;
+    if (options) {
+        headers = options.headers || null;
+    }
+
+    var win = function(result) {
+        if (typeof result.lengthComputable != "undefined") {
+            if (self.onprogress) {
+                return self.onprogress(newProgressEvent(result));
+            }
+        } else if (successCallback) {
+            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 = errorCallback && function(e) {
+        var error = new FileTransferError(e.code, e.source, e.target, e.http_status, e.body);
+        errorCallback(error);
+    };
+
+    exec(win, fail, 'FileTransfer', 'download', [source, target, trustAllHosts, this._id, headers]);
+};
+
+/**
+ * Aborts the ongoing file transfer on this object. The original error
+ * callback for the file transfer will be called if necessary.
+ */
+FileTransfer.prototype.abort = function() {
+    exec(null, null, 'FileTransfer', 'abort', [this._id]);
+};
+
+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, body) {
+    this.code = code || null;
+    this.source = source || null;
+    this.target = target || null;
+    this.http_status = status || null;
+    this.body = body || null;
+};
+
+FileTransferError.FILE_NOT_FOUND_ERR = 1;
+FileTransferError.INVALID_URL_ERR = 2;
+FileTransferError.CONNECTION_ERR = 3;
+FileTransferError.ABORT_ERR = 4;
+
+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, httpMethod) {
+    this.fileKey = fileKey || null;
+    this.fileName = fileName || null;
+    this.mimeType = mimeType || null;
+    this.params = params || null;
+    this.headers = headers || null;
+    this.httpMethod = httpMethod || 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 data text or blob to be written
+ */
+FileWriter.prototype.write = function(data) {
+
+    var that=this;
+    var supportsBinary = (typeof window.Blob !== 'undefined' && typeof window.ArrayBuffer !== 'undefined');
+    var isBinary;
+
+    // Check to see if the incoming data is a blob
+    if (data instanceof File || (supportsBinary && data instanceof Blob)) {
+        var fileReader = new FileReader();
+        fileReader.onload = function() {
+            // Call this method again, with the arraybuffer as argument
+            FileWriter.prototype.write.call(that, this.result);
+        };
+        if (supportsBinary) {
+            fileReader.readAsArrayBuffer(data);
+        } else {
+            fileReader.readAsText(data);
+        }
+        return;
+    }
+
+    // Mark data type for safer transport over the binary bridge
+    isBinary = supportsBinary && (data instanceof ArrayBuffer);
+
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // 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, data, this.position, isBinary]);
+};
+
+/**
+ * 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 than 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/GlobalizationError.js
+define("cordova/plugin/GlobalizationError", function(require, exports, module) {
+
+
+/**
+ * Globalization error object
+ *
+ * @constructor
+ * @param code
+ * @param message
+ */
+var GlobalizationError = function(code, message) {
+    this.code = code || null;
+    this.message = message || '';
+};
+
+// Globalization error codes
+GlobalizationError.UNKNOWN_ERROR = 0;
+GlobalizationError.FORMATTING_ERROR = 1;
+GlobalizationError.PARSING_ERROR = 2;
+GlobalizationError.PATTERN_ERROR = 3;
+
+module.exports = GlobalizationError;
+
+});
+
+// file: lib/common/plugin/InAppBrowser.js
+define("cordova/plugin/InAppBrowser", function(require, exports, module) {
+
+var exec = require('cordova/exec');
+var channel = require('cordova/channel');
+var modulemapper = require('cordova/modulemapper');
+
+function InAppBrowser() {
+   this.channels = {
+        'loadstart': channel.create('loadstart'),
+        'loadstop' : channel.create('loadstop'),
+        'loaderror' : channel.create('loaderror'),
+        'exit' : channel.create('exit')
+   };
+}
+
+InAppBrowser.prototype = {
+    _eventHandler: function (event) {
+        if (event.type in this.channels) {
+            this.channels[event.type].fire(event);
+        }
+    },
+    close: function (eventname) {
+        exec(null, null, "InAppBrowser", "close", []);
+    },
+    show: function (eventname) {
+      exec(null, null, "InAppBrowser", "show", []);
+    },
+    addEventListener: function (eventname,f) {
+        if (eventname in this.channels) {
+            this.channels[eventname].subscribe(f);
+        }
+    },
+    removeEventListener: function(eventname, f) {
+        if (eventname in this.channels) {
+            this.channels[eventname].unsubscribe(f);
+        }
+    },
+
+    executeScript: function(injectDetails, cb) {
+        if (injectDetails.code) {
+            exec(cb, null, "InAppBrowser", "injectScriptCode", [injectDetails.code, !!cb]);
+        } else if (injectDetails.file) {
+            exec(cb, null, "InAppBrowser", "injectScriptFile", [injectDetails.file, !!cb]);
+        } else {
+            throw new Error('executeScript requires exactly one of code or file to be specified');
+        }
+    },
+
+    insertCSS: function(injectDetails, cb) {
+        if (injectDetails.code) {
+            exec(cb, null, "InAppBrowser", "injectStyleCode", [injectDetails.code, !!cb]);
+        } else if (injectDetails.file) {
+            exec(cb, null, "InAppBrowser", "injectStyleFile", [injectDetails.file, !!cb]);
+        } else {
+            throw new Error('insertCSS requires exactly one of code or file to be specified');
+        }
+    }
+};
+
+module.exports = function(strUrl, strWindowName, strWindowFeatures) {
+    var iab = new InAppBrowser();
+    var cb = function(eventname) {
+       iab._eventHandler(eventname);
+    };
+
+    // Don't catch calls that write to existing frames (e.g. named iframes).
+    if (window.frames && window.frames[strWindowName]) {
+        var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open');
+        return origOpenFunc.apply(window, arguments);
+    }
+
+    exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]);
+    return iab;
+};
+
+
+});
+
+// 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 argscheck = require('cordova/argscheck'),
+    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) {
+    argscheck.checkArgs('SFFF', 'Media', arguments);
+    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;
+    }, 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(null, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]);
+};
+
+/**
+ * Stop recording audio file.
+ */
+Media.prototype.stopRecord = function() {
+    exec(null, 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 msgType       The 'type' of update this is
+ * @param value         Use of value is determined by the msgType
+ */
+Media.onStatus = function(id, msgType, value) {
+
+    var media = mediaObjects[id];
+
+    if(media) {
+        switch(msgType) {
+            case Media.MEDIA_STATE :
+                media.statusCallback && media.statusCallback(value);
+                if(value == Media.MEDIA_STOPPED) {
+                    media.successCallback && media.successCallback();
+                }
+                break;
+            case Media.MEDIA_DURATION :
+                media._duration = value;
+                break;
+            case Media.MEDIA_ERROR :
+                media.errorCallback && media.errorCallback(value);
+                break;
+            case Media.MEDIA_POSITION :
+                media._position = Number(value);
+                break;
+            default :
+                console.error && console.error("Unhandled Media.onStatus :: " + msgType);
+                break;
+        }
+    }
+    else {
+         console.error && console.error("Received Media.onStatus callback for unknown media :: " + id);
+    }
+
+};
+
+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.
+*/
+/*
+ According to :: http://dev.w3.org/html5/spec-author-view/video.html#mediaerror
+ We should never be creating these objects, we should just implement the interface
+ which has 1 property for an instance, 'code'
+
+ instead of doing :
+    errorCallbackFunction( new MediaError(3,'msg') );
+we should simply use a literal :
+    errorCallbackFunction( {'code':3} );
+ */
+
+ var _MediaError = window.MediaError;
+
+
+if(!_MediaError) {
+    window.MediaError = _MediaError = function(code, msg) {
+        this.code = (typeof code != 'undefined') ? code : null;
+        this.message = msg || ""; // message is NON-standard! do not use!
+    };
+}
+
+_MediaError.MEDIA_ERR_NONE_ACTIVE    = _MediaError.MEDIA_ERR_NONE_ACTIVE    || 0;
+_MediaError.MEDIA_ERR_ABORTED        = _MediaError.MEDIA_ERR_ABORTED        || 1;
+_MediaError.MEDIA_ERR_NETWORK        = _MediaError.MEDIA_ERR_NETWORK        || 2;
+_MediaError.MEDIA_ERR_DECODE         = _MediaError.MEDIA_ERR_DECODE         || 3;
+_MediaError.MEDIA_ERR_NONE_SUPPORTED = _MediaError.MEDIA_ERR_NONE_SUPPORTED || 4;
+// TODO: MediaError.MEDIA_ERR_NONE_SUPPORTED is legacy, the W3 spec now defines it as below.
+// as defined by http://dev.w3.org/html5/spec-author-view/video.html#error-codes
+_MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = _MediaError.MEDIA_ERR_SRC_NOT_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]);
+    }
+};
+
+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 argscheck = require('cordova/argscheck'),
+    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 acquires 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) {
+        argscheck.checkArgs('fFO', 'accelerometer.getCurrentAcceleration', arguments);
+
+        var p;
+        var win = function(a) {
+            removeListeners(p);
+            successCallback(a);
+        };
+        var fail = function(e) {
+            removeListeners(p);
+            errorCallback && errorCallback(e);
+        };
+
+        p = createCallbackPair(win, fail);
+        listeners.push(p);
+
+        if (!running) {
+            start();
+        }
+    },
+
+    /**
+     * Asynchronously acquires 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) {
+        argscheck.checkArgs('fFO', 'accelerometer.watchAcceleration', arguments);
+        // Default interval (10 sec)
+        var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000;
+
+        // 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 && 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 retrieved 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/accelerometer/symbols.js
+define("cordova/plugin/accelerometer/symbols", function(require, exports, module) {
+
+
+var modulemapper = require('cordova/modulemapper');
+
+modulemapper.defaults('cordova/plugin/Acceleration', 'Acceleration');
+modulemapper.defaults('cordova/plugin/accelerometer', 'navigator.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)
+    this.channels = {
+      batterystatus:cordova.addWindowEventHandler("batterystatus"),
+      batterylow:cordova.addWindowEventHandler("batterylow"),
+      batterycritical:cordova.addWindowEventHandler("batterycritical")
+    };
+    for (var key in this.channels) {
+        this.channels[key].onHasSubscribersChange = Battery.onHasSubscribersChange;
+    }
+};
+/**
+ * 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.onHasSubscribersChange = function() {
+  // If we just registered the first handler, make sure native listener is started.
+  if (this.numHandlers === 1 && handlers() === 1) {
+      exec(battery._status, battery._error, "Battery", "start", []);
+  } else 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/battery/symbols.js
+define("cordova/plugin/battery/symbols", function(require, exports, module) {
+
+
+var modulemapper = require('cordova/modulemapper');
+
+modulemapper.defaults('cordova/plugin/battery', 'navigator.battery');
+
+});
+
+// file: lib/common/plugin/camera/symbols.js
+define("cordova/plugin/camera/symbols", function(require, exports, module) {
+
+
+var modulemapper = require('cordova/modulemapper');
+
+modulemapper.defaults('cordova/plugin/Camera', 'navigator.camera');
+modulemapper.defaults('cordova/plugin/CameraConstants', 'Camera');
+modulemapper.defaults('cordova/plugin/CameraPopoverOptions', 'CameraPopoverOptions');
+
+});
+
+// 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/capture/symbols.js
+define("cordova/plugin/capture/symbols", function(require, exports, module) {
+
+var modulemapper = require('cordova/modulemapper');
+
+modulemapper.clobbers('cordova/plugin/CaptureError', 'CaptureError');
+modulemapper.clobbers('cordova/plugin/CaptureAudioOptions', 'CaptureAudioOptions');
+modulemapper.clobbers('cordova/plugin/CaptureImageOptions', 'CaptureImageOptions');
+modulemapper.clobbers('cordova/plugin/CaptureVideoOptions', 'CaptureVideoOptions');
+modulemapper.clobbers('cordova/plugin/ConfigurationData', 'ConfigurationData');
+modulemapper.clobbers('cordova/plugin/MediaFile', 'MediaFile');
+modulemapper.clobbers('cordova/plugin/MediaFileData', 'MediaFileData');
+modulemapper.clobbers('cordova/plugin/capture', 'navigator.device.capture');
+
+});
+
+// file: lib/common/plugin/compass.js
+define("cordova/plugin/compass", function(require, exports, module) {
+
+var argscheck = require('cordova/argscheck'),
+    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) {
+            argscheck.checkArgs('fFO', 'compass.getCurrentHeading', arguments);
+
+            var win = function(result) {
+                var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp);
+                successCallback(ch);
+            };
+            var fail = errorCallback && 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) {
+            argscheck.checkArgs('fFO', 'compass.watchHeading', arguments);
+            // Default interval (100 msec)
+            var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100;
+            var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0;
+
+            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/compass/symbols.js
+define("cordova/plugin/compass/symbols", function(require, exports, module) {
+
+
+var modulemapper = require('cordova/modulemapper');
+
+modulemapper.clobbers('cordova/plugin/CompassHeading', 'CompassHeading');
+modulemapper.clobbers('cordova/plugin/CompassError', 'CompassError');
+modulemapper.clobbers('cordova/plugin/compass', 'navigator.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 = logger.format.apply(logger.format, [].slice.call(arguments, 1));
+    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 wrappedOrigCall(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] = wrappedOrigCall(WinConsole[key], console[key]);
+    }
+}
+
+});
+
+// file: lib/common/plugin/contacts.js
+define("cordova/plugin/contacts", function(require, exports, module) {
+
+var argscheck = require('cordova/argscheck'),
+    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) {
+        argscheck.checkArgs('afFO', 'contacts.find', arguments);
+        if (!fields.length) {
+            errorCB && 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 whose properties will be examined to create a new Contact
+     * @returns new Contact object
+     */
+    create:function(properties) {
+        argscheck.checkArgs('O', 'contacts.create', arguments);
+        var contact = new Contact();
+        for (var i in properties) {
+            if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) {
+                contact[i] = properties[i];
+            }
+        }
+        return contact;
+    }
+};
+
+module.exports = contacts;
+
+});
+
+// file: lib/common/plugin/contacts/symbols.js
+define("cordova/plugin/contacts/symbols", function(require, exports, module) {
+
+
+var modulemapper = require('cordova/modulemapper');
+
+modulemapper.clobbers('cordova/plugin/contacts', 'navigator.contacts');
+modulemapper.clobbers('cordova/plugin/Contact', 'Contact');
+modulemapper.clobbers('cordova/plugin/ContactAddress', 'ContactAddress');
+modulemapper.clobbers('cordova/plugin/ContactError', 'ContactError');
+modulemapper.clobbers('cordova/plugin/ContactField', 'ContactField');
+modulemapper.clobbers('cordova/plugin/ContactFindOptions', 'ContactFindOptions');
+modulemapper.clobbers('cordova/plugin/ContactName', 'ContactName');
+modulemapper.clobbers('cordova/plugin/ContactOrganization', 'ContactOrganization');
+
+});
+
+// file: lib/common/plugin/device.js
+define("cordova/plugin/device", function(require, exports, module) {
+
+var argscheck = require('cordova/argscheck'),
+    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.uuid = null;
+    this.cordova = null;
+    this.model = null;
+
+    var me = this;
+
+    channel.onCordovaReady.subscribe(function() {
+        me.getInfo(function(info) {
+            var buildLabel = info.cordova;
+            if (buildLabel != CORDOVA_JS_BUILD_LABEL) {
+                buildLabel += ' JS=' + CORDOVA_JS_BUILD_LABEL;
+            }
+            me.available = true;
+            me.platform = info.platform;
+            me.version = info.version;
+            me.uuid = info.uuid;
+            me.cordova = buildLabel;
+            me.model = info.model;
+            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) {
+    argscheck.checkArgs('fF', 'Device.getInfo', arguments);
+    exec(successCallback, errorCallback, "Device", "getDeviceInfo", []);
+};
+
+module.exports = new Device();
+
+});
+
+// file: lib/tizen/plugin/device/symbols.js
+define("cordova/plugin/device/symbols", function(require, exports, module) {
+
+
+var modulemapper = require('cordova/modulemapper');
+
+modulemapper.clobbers('cordova/plugin/tizen/Device', 'device');
+modulemapper.merges('cordova/plugin/tizen/Device', 'navigator.device');
+
+});
+
+// file: lib/common/plugin/echo.js
+define("cordova/plugin/echo", function(require, exports, module) {
+
+var exec = require('cordova/exec'),
+    utils = require('cordova/utils');
+
+/**
+ * Sends the given message through exec() to the Echo plugin, which sends it back to the successCallback.
+ * @param successCallback  invoked with a FileSystem object
+ * @param errorCallback  invoked if error occurs retrieving file system
+ * @param message  The string to be echoed.
+ * @param forceAsync  Whether to force an async return value (for testing native->js bridge).
+ */
+module.exports = function(successCallback, errorCallback, message, forceAsync) {
+    var action = 'echo';
+    var messageIsMultipart = (utils.typeName(message) == "Array");
+    var args = messageIsMultipart ? message : [message];
+
+    if (utils.typeName(message) == 'ArrayBuffer') {
+        if (forceAsync) {
+            console.warn('Cannot echo ArrayBuffer with forced async, falling back to sync.');
+        }
+        action += 'ArrayBuffer';
+    } else if (messageIsMultipart) {
+        if (forceAsync) {
+            console.warn('Cannot echo MultiPart Array with forced async, falling back to sync.');
+        }
+        action += 'MultiPart';
+    } else if (forceAsync) {
+        action += 'Async';
+    }
+
+    exec(successCallback, errorCallback, "Echo", action, args);
+};
+
+
+});
+
+// file: lib/tizen/plugin/file/symbols.js
+define("cordova/plugin/file/symbols", function(require, exports, module) {
+
+
+var modulemapper = require('cordova/modulemapper'),
+    symbolshelper = require('cordova/plugin/file/symbolshelper');
+
+symbolshelper(modulemapper.defaults);
+modulemapper.clobbers('cordova/plugin/File', 'File');
+modulemapper.clobbers('cordova/plugin/FileReader', 'FileReader');
+modulemapper.clobbers('cordova/plugin/FileError', 'FileError');
+
+});
+
+// file: lib/common/plugin/file/symbolshelper.js
+define("cordova/plugin/file/symbolshelper", function(require, exports, module) {
+
+module.exports = function(exportFunc) {
+    exportFunc('cordova/plugin/DirectoryEntry', 'DirectoryEntry');
+    exportFunc('cordova/plugin/DirectoryReader', 'DirectoryReader');
+    exportFunc('cordova/plugin/Entry', 'Entry');
+    exportFunc('cordova/plugin/File', 'File');
+    exportFunc('cordova/plugin/FileEntry', 'FileEntry');
+    exportFunc('cordova/plugin/FileError', 'FileError');
+    exportFunc('cordova/plugin/FileReader', 'FileReader');
+    exportFunc('cordova/plugin/FileSystem', 'FileSystem');
+    exportFunc('cordova/plugin/FileUploadOptions', 'FileUploadOptions');
+    exportFunc('cordova/plugin/FileUploadResult', 'FileUploadResult');
+    exportFunc('cordova/plugin/FileWriter', 'FileWriter');
+    exportFunc('cordova/plugin/Flags', 'Flags');
+    exportFunc('cordova/plugin/LocalFileSystem', 'LocalFileSystem');
+    exportFunc('cordova/plugin/Metadata', 'Metadata');
+    exportFunc('cordova/plugin/ProgressEvent', 'ProgressEvent');
+    exportFunc('cordova/plugin/requestFileSystem', 'requestFileSystem');
+    exportFunc('cordova/plugin/resolveLocalFileSystemURI', 'resolveLocalFileSystemURI');
+};
+
+});
+
+// file: lib/common/plugin/filetransfer/symbols.js
+define("cordova/plugin/filetransfer/symbols", function(require, exports, module) {
+
+
+var modulemapper = require('cordova/modulemapper');
+
+modulemapper.clobbers('cordova/plugin/FileTransfer', 'FileTransfer');
+modulemapper.clobbers('cordova/plugin/FileTransferError', 'FileTransferError');
+
+});
+
+// file: lib/common/plugin/geolocation.js
+define("cordova/plugin/geolocation", function(require, exports, module) {
+
+var argscheck = require('cordova/argscheck'),
+    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 acquires 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) {
+        argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments);
+        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 = {timer:null};
+
+        var win = function(p) {
+            clearTimeout(timeoutTimer.timer);
+            if (!(timeoutTimer.timer)) {
+                // 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.timer);
+            timeoutTimer.timer = 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 exceeds 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.timer = 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.timer = 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) {
+        argscheck.checkArgs('fFO', 'geolocation.getCurrentPosition', arguments);
+        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].timer);
+            var err = new PositionError(e.code, e.message);
+            if (errorCallback) {
+                errorCallback(err);
+            }
+        };
+
+        var win = function(p) {
+            clearTimeout(timers[id].timer);
+            if (options.timeout !== Infinity) {
+                timers[id].timer = 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].timer);
+            timers[id].timer = false;
+            exec(null, null, "Geolocation", "clearWatch", [id]);
+        }
+    }
+};
+
+module.exports = geolocation;
+
+});
+
+// file: lib/common/plugin/geolocation/symbols.js
+define("cordova/plugin/geolocation/symbols", function(require, exports, module) {
+
+
+var modulemapper = require('cordova/modulemapper');
+
+modulemapper.defaults('cordova/plugin/geolocation', 'navigator.geolocation');
+modulemapper.clobbers('cordova/plugin/PositionError', 'PositionError');
+modulemapper.clobbers('cordova/plugin/Position', 'Position');
+modulemapper.clobbers('cordova/plugin/Coordinates', 'Coordinates');
+
+});
+
+// file: lib/common/plugin/globalization.js
+define("cordova/plugin/globalization", function(require, exports, module) {
+
+var argscheck = require('cordova/argscheck'),
+    exec = require('cordova/exec'),
+    GlobalizationError = require('cordova/plugin/GlobalizationError');
+
+var globalization = {
+
+/**
+* Returns the string identifier for the client's current language.
+* It returns the language identifier string to the successCB callback with a
+* properties object as a parameter. If there is an error getting the language,
+* then the errorCB callback is invoked.
+*
+* @param {Function} successCB
+* @param {Function} errorCB
+*
+* @return Object.value {String}: The language identifier
+*
+* @error GlobalizationError.UNKNOWN_ERROR
+*
+* Example
+*    globalization.getPreferredLanguage(function (language) {alert('language:' + language.value + '\n');},
+*                                function () {});
+*/
+getPreferredLanguage:function(successCB, failureCB) {
+    argscheck.checkArgs('fF', 'Globalization.getPreferredLanguage', arguments);
+    exec(successCB, failureCB, "Globalization","getPreferredLanguage", []);
+},
+
+/**
+* Returns the string identifier for the client's current locale setting.
+* It returns the locale identifier string to the successCB callback with a
+* properties object as a parameter. If there is an error getting the locale,
+* then the errorCB callback is invoked.
+*
+* @param {Function} successCB
+* @param {Function} errorCB
+*
+* @return Object.value {String}: The locale identifier
+*
+* @error GlobalizationError.UNKNOWN_ERROR
+*
+* Example
+*    globalization.getLocaleName(function (locale) {alert('locale:' + locale.value + '\n');},
+*                                function () {});
+*/
+getLocaleName:function(successCB, failureCB) {
+    argscheck.checkArgs('fF', 'Globalization.getLocaleName', arguments);
+    exec(successCB, failureCB, "Globalization","getLocaleName", []);
+},
+
+
+/**
+* Returns a date formatted as a string according to the client's user preferences and
+* calendar using the time zone of the client. It returns the formatted date string to the
+* successCB callback with a properties object as a parameter. If there is an error
+* formatting the date, then the errorCB callback is invoked.
+*
+* The defaults are: formatLenght="short" and selector="date and time"
+*
+* @param {Date} date
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            formatLength {String}: 'short', 'medium', 'long', or 'full'
+*            selector {String}: 'date', 'time', or 'date and time'
+*
+* @return Object.value {String}: The localized date string
+*
+* @error GlobalizationError.FORMATTING_ERROR
+*
+* Example
+*    globalization.dateToString(new Date(),
+*                function (date) {alert('date:' + date.value + '\n');},
+*                function (errorCode) {alert(errorCode);},
+*                {formatLength:'short'});
+*/
+dateToString:function(date, successCB, failureCB, options) {
+    argscheck.checkArgs('dfFO', 'Globalization.dateToString', arguments);
+    var dateValue = date.valueOf();
+    exec(successCB, failureCB, "Globalization", "dateToString", [{"date": dateValue, "options": options}]);
+},
+
+
+/**
+* Parses a date formatted as a string according to the client's user
+* preferences and calendar using the time zone of the client and returns
+* the corresponding date object. It returns the date to the successCB
+* callback with a properties object as a parameter. If there is an error
+* parsing the date string, then the errorCB callback is invoked.
+*
+* The defaults are: formatLength="short" and selector="date and time"
+*
+* @param {String} dateString
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            formatLength {String}: 'short', 'medium', 'long', or 'full'
+*            selector {String}: 'date', 'time', or 'date and time'
+*
+* @return    Object.year {Number}: The four digit year
+*            Object.month {Number}: The month from (0 - 11)
+*            Object.day {Number}: The day from (1 - 31)
+*            Object.hour {Number}: The hour from (0 - 23)
+*            Object.minute {Number}: The minute from (0 - 59)
+*            Object.second {Number}: The second from (0 - 59)
+*            Object.millisecond {Number}: The milliseconds (from 0 - 999),
+*                                        not available on all platforms
+*
+* @error GlobalizationError.PARSING_ERROR
+*
+* Example
+*    globalization.stringToDate('4/11/2011',
+*                function (date) { alert('Month:' + date.month + '\n' +
+*                    'Day:' + date.day + '\n' +
+*                    'Year:' + date.year + '\n');},
+*                function (errorCode) {alert(errorCode);},
+*                {selector:'date'});
+*/
+stringToDate:function(dateString, successCB, failureCB, options) {
+    argscheck.checkArgs('sfFO', 'Globalization.stringToDate', arguments);
+    exec(successCB, failureCB, "Globalization", "stringToDate", [{"dateString": dateString, "options": options}]);
+},
+
+
+/**
+* Returns a pattern string for formatting and parsing dates according to the client's
+* user preferences. It returns the pattern to the successCB callback with a
+* properties object as a parameter. If there is an error obtaining the pattern,
+* then the errorCB callback is invoked.
+*
+* The defaults are: formatLength="short" and selector="date and time"
+*
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            formatLength {String}: 'short', 'medium', 'long', or 'full'
+*            selector {String}: 'date', 'time', or 'date and time'
+*
+* @return    Object.pattern {String}: The date and time pattern for formatting and parsing dates.
+*                                    The patterns follow Unicode Technical Standard #35
+*                                    http://unicode.org/reports/tr35/tr35-4.html
+*            Object.timezone {String}: The abbreviated name of the time zone on the client
+*            Object.utc_offset {Number}: The current difference in seconds between the client's
+*                                        time zone and coordinated universal time.
+*            Object.dst_offset {Number}: The current daylight saving time offset in seconds
+*                                        between the client's non-daylight saving's time zone
+*                                        and the client's daylight saving's time zone.
+*
+* @error GlobalizationError.PATTERN_ERROR
+*
+* Example
+*    globalization.getDatePattern(
+*                function (date) {alert('pattern:' + date.pattern + '\n');},
+*                function () {},
+*                {formatLength:'short'});
+*/
+getDatePattern:function(successCB, failureCB, options) {
+    argscheck.checkArgs('fFO', 'Globalization.getDatePattern', arguments);
+    exec(successCB, failureCB, "Globalization", "getDatePattern", [{"options": options}]);
+},
+
+
+/**
+* Returns an array of either the names of the months or days of the week
+* according to the client's user preferences and calendar. It returns the array of names to the
+* successCB callback with a properties object as a parameter. If there is an error obtaining the
+* names, then the errorCB callback is invoked.
+*
+* The defaults are: type="wide" and item="months"
+*
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            type {String}: 'narrow' or 'wide'
+*            item {String}: 'months', or 'days'
+*
+* @return Object.value {Array{String}}: The array of names starting from either
+*                                        the first month in the year or the
+*                                        first day of the week.
+* @error GlobalizationError.UNKNOWN_ERROR
+*
+* Example
+*    globalization.getDateNames(function (names) {
+*        for(var i = 0; i < names.value.length; i++) {
+*            alert('Month:' + names.value[i] + '\n');}},
+*        function () {});
+*/
+getDateNames:function(successCB, failureCB, options) {
+    argscheck.checkArgs('fFO', 'Globalization.getDateNames', arguments);
+    exec(successCB, failureCB, "Globalization", "getDateNames", [{"options": options}]);
+},
+
+/**
+* Returns whether daylight savings time is in effect for a given date using the client's
+* time zone and calendar. It returns whether or not daylight savings time is in effect
+* to the successCB callback with a properties object as a parameter. If there is an error
+* reading the date, then the errorCB callback is invoked.
+*
+* @param {Date} date
+* @param {Function} successCB
+* @param {Function} errorCB
+*
+* @return Object.dst {Boolean}: The value "true" indicates that daylight savings time is
+*                                in effect for the given date and "false" indicate that it is not.
+*
+* @error GlobalizationError.UNKNOWN_ERROR
+*
+* Example
+*    globalization.isDayLightSavingsTime(new Date(),
+*                function (date) {alert('dst:' + date.dst + '\n');}
+*                function () {});
+*/
+isDayLightSavingsTime:function(date, successCB, failureCB) {
+    argscheck.checkArgs('dfF', 'Globalization.isDayLightSavingsTime', arguments);
+    var dateValue = date.valueOf();
+    exec(successCB, failureCB, "Globalization", "isDayLightSavingsTime", [{"date": dateValue}]);
+},
+
+/**
+* Returns the first day of the week according to the client's user preferences and calendar.
+* The days of the week are numbered starting from 1 where 1 is considered to be Sunday.
+* It returns the day to the successCB callback with a properties object as a parameter.
+* If there is an error obtaining the pattern, then the errorCB callback is invoked.
+*
+* @param {Function} successCB
+* @param {Function} errorCB
+*
+* @return Object.value {Number}: The number of the first day of the week.
+*
+* @error GlobalizationError.UNKNOWN_ERROR
+*
+* Example
+*    globalization.getFirstDayOfWeek(function (day)
+*                { alert('Day:' + day.value + '\n');},
+*                function () {});
+*/
+getFirstDayOfWeek:function(successCB, failureCB) {
+    argscheck.checkArgs('fF', 'Globalization.getFirstDayOfWeek', arguments);
+    exec(successCB, failureCB, "Globalization", "getFirstDayOfWeek", []);
+},
+
+
+/**
+* Returns a number formatted as a string according to the client's user preferences.
+* It returns the formatted number string to the successCB callback with a properties object as a
+* parameter. If there is an error formatting the number, then the errorCB callback is invoked.
+*
+* The defaults are: type="decimal"
+*
+* @param {Number} number
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            type {String}: 'decimal', "percent", or 'currency'
+*
+* @return Object.value {String}: The formatted number string.
+*
+* @error GlobalizationError.FORMATTING_ERROR
+*
+* Example
+*    globalization.numberToString(3.25,
+*                function (number) {alert('number:' + number.value + '\n');},
+*                function () {},
+*                {type:'decimal'});
+*/
+numberToString:function(number, successCB, failureCB, options) {
+    argscheck.checkArgs('nfFO', 'Globalization.numberToString', arguments);
+    exec(successCB, failureCB, "Globalization", "numberToString", [{"number": number, "options": options}]);
+},
+
+/**
+* Parses a number formatted as a string according to the client's user preferences and
+* returns the corresponding number. It returns the number to the successCB callback with a
+* properties object as a parameter. If there is an error parsing the number string, then
+* the errorCB callback is invoked.
+*
+* The defaults are: type="decimal"
+*
+* @param {String} numberString
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            type {String}: 'decimal', "percent", or 'currency'
+*
+* @return Object.value {Number}: The parsed number.
+*
+* @error GlobalizationError.PARSING_ERROR
+*
+* Example
+*    globalization.stringToNumber('1234.56',
+*                function (number) {alert('Number:' + number.value + '\n');},
+*                function () { alert('Error parsing number');});
+*/
+stringToNumber:function(numberString, successCB, failureCB, options) {
+    argscheck.checkArgs('sfFO', 'Globalization.stringToNumber', arguments);
+    exec(successCB, failureCB, "Globalization", "stringToNumber", [{"numberString": numberString, "options": options}]);
+},
+
+/**
+* Returns a pattern string for formatting and parsing numbers according to the client's user
+* preferences. It returns the pattern to the successCB callback with a properties object as a
+* parameter. If there is an error obtaining the pattern, then the errorCB callback is invoked.
+*
+* The defaults are: type="decimal"
+*
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            type {String}: 'decimal', "percent", or 'currency'
+*
+* @return    Object.pattern {String}: The number pattern for formatting and parsing numbers.
+*                                    The patterns follow Unicode Technical Standard #35.
+*                                    http://unicode.org/reports/tr35/tr35-4.html
+*            Object.symbol {String}: The symbol to be used when formatting and parsing
+*                                    e.g., percent or currency symbol.
+*            Object.fraction {Number}: The number of fractional digits to use when parsing and
+*                                    formatting numbers.
+*            Object.rounding {Number}: The rounding increment to use when parsing and formatting.
+*            Object.positive {String}: The symbol to use for positive numbers when parsing and formatting.
+*            Object.negative: {String}: The symbol to use for negative numbers when parsing and formatting.
+*            Object.decimal: {String}: The decimal symbol to use for parsing and formatting.
+*            Object.grouping: {String}: The grouping symbol to use for parsing and formatting.
+*
+* @error GlobalizationError.PATTERN_ERROR
+*
+* Example
+*    globalization.getNumberPattern(
+*                function (pattern) {alert('Pattern:' + pattern.pattern + '\n');},
+*                function () {});
+*/
+getNumberPattern:function(successCB, failureCB, options) {
+    argscheck.checkArgs('fFO', 'Globalization.getNumberPattern', arguments);
+    exec(successCB, failureCB, "Globalization", "getNumberPattern", [{"options": options}]);
+},
+
+/**
+* Returns a pattern string for formatting and parsing currency values according to the client's
+* user preferences and ISO 4217 currency code. It returns the pattern to the successCB callback with a
+* properties object as a parameter. If there is an error obtaining the pattern, then the errorCB
+* callback is invoked.
+*
+* @param {String} currencyCode
+* @param {Function} successCB
+* @param {Function} errorCB
+*
+* @return    Object.pattern {String}: The currency pattern for formatting and parsing currency values.
+*                                    The patterns follow Unicode Technical Standard #35
+*                                    http://unicode.org/reports/tr35/tr35-4.html
+*            Object.code {String}: The ISO 4217 currency code for the pattern.
+*            Object.fraction {Number}: The number of fractional digits to use when parsing and
+*                                    formatting currency.
+*            Object.rounding {Number}: The rounding increment to use when parsing and formatting.
+*            Object.decimal: {String}: The decimal symbol to use for parsing and formatting.
+*            Object.grouping: {String}: The grouping symbol to use for parsing and formatting.
+*
+* @error GlobalizationError.FORMATTING_ERROR
+*
+* Example
+*    globalization.getCurrencyPattern('EUR',
+*                function (currency) {alert('Pattern:' + currency.pattern + '\n');}
+*                function () {});
+*/
+getCurrencyPattern:function(currencyCode, successCB, failureCB) {
+    argscheck.checkArgs('sfF', 'Globalization.getCurrencyPattern', arguments);
+    exec(successCB, failureCB, "Globalization", "getCurrencyPattern", [{"currencyCode": currencyCode}]);
+}
+
+};
+
+module.exports = globalization;
+
+});
+
+// file: lib/tizen/plugin/globalization/symbols.js
+define("cordova/plugin/globalization/symbols", function(require, exports, module) {
+
+
+var modulemapper = require('cordova/modulemapper');
+
+modulemapper.merges('cordova/plugin/tizen/Globalization', 'navigator.globalization');
+
+});
+
+// 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 UseLogger    = true;
+var Queued       = [];
+var DeviceReady  = false;
+var CurrentLevel;
+
+var originalConsole = console;
+
+/**
+ * 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.  E.g., 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.
+ */
+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;
+};
+
+/**
+ * Getter/Setter for the useLogger functionality
+ *
+ * When useLogger is true, the logger will log via the
+ * native Logger plugin.
+ */
+logger.useLogger = function (value) {
+    // Enforce boolean
+    if (arguments.length) UseLogger = !!value;
+    return UseLogger;
+};
+
+/**
+ * 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 /* , ... */) {
+    // format the message with the parameters
+    var formatArgs = [].slice.call(arguments, 1);
+    var message    = logger.format.apply(logger.format, 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;
+    }
+
+    // Log using the native logger if that is enabled
+    if (UseLogger) {
+        exec(null, null, "Logger", "logLevel", [level, message]);
+    }
+
+    // Log using the console if that is enabled
+    if (UseConsole) {
+        // 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:   originalConsole.log(message); break;
+            case logger.ERROR: originalConsole.log("ERROR: " + message); break;
+            case logger.WARN:  originalConsole.log("WARN: "  + message); break;
+            case logger.INFO:  originalConsole.log("INFO: "  + message); break;
+            case logger.DEBUG: originalConsole.log("DEBUG: " + message); break;
+        }
+    }
+};
+
+
+/**
+ * Formats a string and arguments following it ala console.log()
+ *
+ * Any remaining arguments will be appended to the formatted string.
+ *
+ * for rationale, see FireBug's Console API:
+ *    http://getfirebug.com/wiki/index.php/Console_API
+ */
+logger.format = function(formatString, args) {
+    return __format(arguments[0], [].slice.call(arguments,1)).join(' ');
+};
+
+
+//------------------------------------------------------------------------------
+/**
+ * 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().
+ *
+ * Returns an array containing the formatted string and any remaining
+ * arguments.
+ */
+function __format(formatString, args) {
+    if (formatString === null || formatString === undefined) return [""];
+    if (arguments.length == 1) return [formatString.toString()];
+
+    if (typeof formatString != "string")
+        formatString = formatString.toString();
+
+    var pattern = /(.*?)%(.)(.*)/;
+    var rest    = formatString;
+    var result  = [];
+
+    while (args.length) {
+        var match = pattern.exec(rest);
+        if (!match) break;
+
+        var arg   = args.shift();
+        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);
+
+    var remainingArgs = [].slice.call(args);
+    remainingArgs.unshift(result.join(''));
+    return remainingArgs;
+}
+
+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();
+}
+
+
+//------------------------------------------------------------------------------
+// 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/logger/symbols.js
+define("cordova/plugin/logger/symbols", function(require, exports, module) {
+
+
+var modulemapper = require('cordova/modulemapper');
+
+modulemapper.clobbers('cordova/plugin/logger', 'cordova.logger');
+
+});
+
+// file: lib/tizen/plugin/media/symbols.js
+define("cordova/plugin/media/symbols", function(require, exports, module) {
+
+
+var modulemapper = require('cordova/modulemapper');
+
+modulemapper.defaults('cordova/plugin/Media', 'Media');
+modulemapper.defaults('cordova/plugin/MediaError', 'MediaError');
+modulemapper.merges('cordova/plugin/tizen/MediaError', 'MediaError');
+
+});
+
+// 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'),
+    utils = require('cordova/utils');
+
+// Link the onLine property with the Cordova-supplied network info.
+// This works because we clobber the naviagtor object with our own
+// object in bootstrap.js.
+if (typeof navigator != 'undefined') {
+    utils.defineGetter(navigator, 'onLine', function() {
+        return this.connection.type != 'none';
+    });
+}
+
+function NetworkConnection() {
+    this.type = 'unknown';
+}
+
+/**
+ * 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) {
+    exec(successCallback, errorCallback, "NetworkStatus", "getConnectionInfo", []);
+};
+
+var me = new NetworkConnection();
+var timerId = null;
+var timeout = 500;
+
+channel.onCordovaReady.subscribe(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
+            timerId = setTimeout(function(){
+                cordova.fireDocumentEvent("offline");
+                timerId = null;
+            }, timeout);
+        } else {
+            // If there is a current offline event pending clear it
+            if (timerId !== null) {
+                clearTimeout(timerId);
+                timerId = null;
+            }
+            cordova.fireDocumentEvent("online");
+        }
+
+        // should only fire this once
+        if (channel.onCordovaConnectionReady.state !== 2) {
+            channel.onCordovaConnectionReady.fire();
+        }
+    },
+    function (e) {
+        // If we can't get the network info we should still tell Cordova
+        // to fire the deviceready event.
+        if (channel.onCordovaConnectionReady.state !== 2) {
+            channel.onCordovaConnectionReady.fire();
+        }
+        console.log("Error initializing Network Connection: " + e);
+    });
+});
+
+module.exports = me;
+
+});
+
+// file: lib/common/plugin/networkstatus/symbols.js
+define("cordova/plugin/networkstatus/symbols", function(require, exports, module) {
+
+
+var modulemapper = require('cordova/modulemapper');
+
+modulemapper.clobbers('cordova/plugin/network', 'navigator.network.connection', 'navigator.network.connection is deprecated. Use navigator.connection instead.');
+modulemapper.clobbers('cordova/plugin/network', 'navigator.connection');
+modulemapper.defaults('cordova/plugin/Connection', 'Connection');
+
+});
+
+// file: lib/common/plugin/notification.js
+define("cordova/plugin/notification", function(require, exports, module) {
+
+var exec = require('cordova/exec');
+var platform = require('cordova/platform');
+
+/**
+ * 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 {Array} buttonLabels          Array of the labels of the buttons (default: ['OK', 'Cancel'])
+     */
+    confirm: function(message, resultCallback, title, buttonLabels) {
+        var _title = (title || "Confirm");
+        var _buttonLabels = (buttonLabels || ["OK", "Cancel"]);
+
+        // Strings are deprecated!
+        if (typeof _buttonLabels === 'string') {
+            console.log("Notification.confirm(string, function, string, string) is deprecated.  Use Notification.confirm(string, function, string, array).");
+        }
+
+        // Some platforms take an array of button label names.
+        // Other platforms take a comma separated list.
+        // For compatibility, we convert to the desired type based on the platform.
+        if (platform.id == "android" || platform.id == "ios" || platform.id == "windowsphone" || platform.id == "blackberry10") {
+            if (typeof _buttonLabels === 'string') {
+                var buttonLabelString = _buttonLabels;
+                _buttonLabels = _buttonLabels.split(","); // not crazy about changing the var type here
+            }
+        } else {
+            if (Array.isArray(_buttonLabels)) {
+                var buttonLabelArray = _buttonLabels;
+                _buttonLabels = buttonLabelArray.toString();
+            }
+        }
+        exec(resultCallback, null, "Notification", "confirm", [message, _title, _buttonLabels]);
+    },
+
+    /**
+     * Open a native prompt dialog, with a customizable title and button text.
+     * The following results are returned to the result callback:
+     *  buttonIndex     Index number of the button selected.
+     *  input1          The text entered in the prompt dialog box.
+     *
+     * @param {String} message              Dialog message to display (default: "Prompt message")
+     * @param {Function} resultCallback     The callback that is called when user clicks on a button.
+     * @param {String} title                Title of the dialog (default: "Prompt")
+     * @param {Array} buttonLabels          Array of strings for the button labels (default: ["OK","Cancel"])
+     * @param {String} defaultText          Textbox input value (default: "Default text")
+     */
+    prompt: function(message, resultCallback, title, buttonLabels, defaultText) {
+        var _message = (message || "Prompt message");
+        var _title = (title || "Prompt");
+        var _buttonLabels = (buttonLabels || ["OK","Cancel"]);
+        var _defaultText = (defaultText || "Default text");
+        exec(resultCallback, null, "Notification", "prompt", [_message, _title, _buttonLabels, _defaultText]);
+    },
+
+    /**
+     * 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/tizen/plugin/notification/symbols.js
+define("cordova/plugin/notification/symbols", function(require, exports, module) {
+
+
+var modulemapper = require('cordova/modulemapper');
+
+modulemapper.defaults('cordova/plugin/notification', 'navigator.notification');
+modulemapper.merges('cordova/plugin/tizen/Notification', 'navigator.notification');
+
+});
+
+// file: lib/common/plugin/requestFileSystem.js
+define("cordova/plugin/requestFileSystem", function(require, exports, module) {
+
+var argscheck = require('cordova/argscheck'),
+    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) {
+    argscheck.checkArgs('nnFF', 'requestFileSystem', arguments);
+    var fail = function(code) {
+        errorCallback && 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 (successCallback) {
+                    // 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 argscheck = require('cordova/argscheck'),
+    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) {
+    argscheck.checkArgs('sFF', 'resolveLocalFileSystemURI', arguments);
+    // error callback
+    var fail = function(error) {
+        errorCallback && 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 (successCallback) {
+                // create appropriate Entry object
+                result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath) : new FileEntry(entry.name, entry.fullPath);
+                successCallback(result);
+            }
+        }
+        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/splashscreen/symbol.js
+define("cordova/plugin/splashscreen/symbol", function(require, exports, module) {
+
+
+var modulemapper = require('cordova/modulemapper');
+
+modulemapper.merges('cordova/plugin/tizen/SplashScreen', 'splashscreen'); /// is that correct???  PPL
+
+});
+
+// file: lib/common/plugin/splashscreen/symbols.js
+define("cordova/plugin/splashscreen/symbols", function(require, exports, module) {
+
+
+var modulemapper = require('cordova/modulemapper');
+
+modulemapper.clobbers('cordova/plugin/splashscreen', 'navigator.splashscreen');
+
+});
+
+// file: lib/tizen/plugin/tizen/Accelerometer.js
+define("cordova/plugin/tizen/Accelerometer", function(require, exports, module) {
+
+var accelerometerCallback = null;
+
+//console.log("TIZEN ACCELEROMETER START");
+
+module.exports = {
+
+    start: function (successCallback, errorCallback) {
+
+        if (accelerometerCallback) {
+            window.removeEventListener("devicemotion", accelerometerCallback, true);
+        }
+
+        accelerometerCallback = function (motion) {
+            successCallback({
+                x: motion.accelerationIncludingGravity.x,
+                y: motion.accelerationIncludingGravity.y,
+                z: motion.accelerationIncludingGravity.z,
+                timestamp: new Date().getTime()
+            });
+        };
+        window.addEventListener("devicemotion", accelerometerCallback, true);
+    },
+
+    stop: function (successCallback, errorCallback) {
+        window.removeEventListener("devicemotion", accelerometerCallback, true);
+        accelerometerCallback = null;
+    }
+};
+
+//console.log("TIZEN ACCELEROMETER END");
+
+
+});
+
+// file: lib/tizen/plugin/tizen/Battery.js
+define("cordova/plugin/tizen/Battery", function(require, exports, module) {
+
+/*global tizen:false */
+var batteryListenerId = null;
+
+//console.log("TIZEN BATTERY START");
+
+module.exports = {
+    start: function(successCallback, errorCallback) {
+        var batterySuccessCallback = function(power) {
+            if (successCallback) {
+                successCallback({level: Math.round(power.level * 100), isPlugged: power.isCharging});
+            }
+        };
+
+        if (batteryListenerId === null) {
+            batteryListenerId = tizen.systeminfo.addPropertyValueChangeListener("BATTERY", batterySuccessCallback);
+        }
+
+        tizen.systeminfo.getPropertyValue("BATTERY", batterySuccessCallback, errorCallback);
+    },
+
+    stop: function(successCallback, errorCallback) {
+        tizen.systeminfo.removePropertyValueChangeListener(batteryListenerId);
+        batteryListenerId = null;
+    }
+};
+
+//console.log("TIZEN BATTERY END");
+
+});
+
+// file: lib/tizen/plugin/tizen/BufferLoader.js
+define("cordova/plugin/tizen/BufferLoader", function(require, exports, module) {
+
+/*
+ * Buffer Loader Object
+ * This class provides a sound buffer for one or more sounds
+ * held in a local file located by an url
+ *
+ * uses W3C  Web Audio API
+ *
+ * @constructor
+ *
+ * @param {AudioContext} audio context object
+ * @param {Array} urlList, array of url for sound to load
+ * @param {function} callback , called after buffer was loaded
+ *
+ */
+
+function BufferLoader(context, urlList, callback) {
+    this.context = context;
+    this.urlList = urlList;
+    this.onload = callback;
+    this.bufferList = [];
+    this.loadCount = 0;
+}
+
+/*
+ * This method loads a sound into a buffer
+ * @param {Array} urlList, array of url for sound to load
+ * @param {Number} index, buffer index in the array where to load the url sound
+ *
+ */
+
+BufferLoader.prototype.loadBuffer = function(url, index) {
+    // Load buffer asynchronously
+    var request = null,
+        loader = null;
+
+    request = new XMLHttpRequest();
+
+    if (request === null) {
+        console.log ("BufferLoader.prototype.loadBuffer, cannot allocate XML http request");
+        return;
+    }
+
+    request.open("GET", url, true);
+    request.responseType = "arraybuffer";
+
+    loader = this;
+
+    request.onload = function() {
+    // Asynchronously decode the audio file data in request.response
+    loader.context.decodeAudioData(
+        request.response,
+        function(buffer) {
+                if (!buffer) {
+                    console.log ("BufferLoader.prototype.loadBuffer,error decoding file data: " + url);
+                    return;
+                }
+
+                loader.bufferList[index] = buffer;
+
+                if (++loader.loadCount == loader.urlList.length) {
+                    loader.onload(loader.bufferList);
+                }
+            }
+        );
+    };
+
+    request.onerror = function() {
+        console.log ("BufferLoader.prototype.loadBuffer, XHR error");
+    };
+
+    request.send();
+};
+
+/*
+ * This method loads all sounds identified by their url
+ * and that where given to the object constructor
+ *
+ */
+
+BufferLoader.prototype.load = function() {
+    for (var i = 0; i < this.urlList.length; ++i) {
+        this.loadBuffer(this.urlList[i], i);
+    }
+};
+
+module.exports = BufferLoader;
+
+});
+
+// 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');
+
+
+//console.log("TIZEN CAMERA START");
+
+
+function cameraMakeReplyCallback(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/appcontrol/operation/create_content';
+            }
+            else {
+                serviceId = 'http://tizen.org/appcontrol/operation/pick';
+            }
+
+            var serviceControl = new tizen.ApplicationControl(
+                                serviceId,
+                                null,
+                                mimeType,
+                                null);
+
+            tizen.application.launchAppControl(
+                    serviceControl,
+                    null,
+                    null,
+                    function(error) {
+                        errorCallback(error.message);
+                    },
+                    cameraMakeReplyCallback(successCallback, errorCallback)
+            );
+        }
+};
+
+//console.log("TIZEN CAMERA END");
+
+});
+
+// file: lib/tizen/plugin/tizen/Compass.js
+define("cordova/plugin/tizen/Compass", function(require, exports, module) {
+
+var CompassError = require('cordova/plugin/CompassError'),
+    CompassHeading = require('cordova/plugin/CompassHeading');
+
+var compassCallback = null,
+    compassReady = false;
+
+//console.log("TIZEN COMPASS START");
+
+module.exports = {
+    getHeading: function(successCallback, errorCallback) {
+
+        if (window.DeviceOrientationEvent !== undefined) {
+
+            compassCallback = function (orientation) {
+                var heading = 360 - orientation.alpha;
+
+                if (compassReady) {
+                    successCallback( new CompassHeading (heading, heading, 0, 0));
+                    window.removeEventListener("deviceorientation", compassCallback, true);
+                }
+                compassReady = true;
+            };
+            compassReady = false; // workaround invalid first event value returned by WRT
+            window.addEventListener("deviceorientation", compassCallback, true);
+        }
+        else {
+            errorCallback(CompassError.COMPASS_NOT_SUPPORTED);
+        }
+    }
+};
+
+//console.log("TIZEN COMPASS END");
+
+
+});
+
+// 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');
+
+// ------------------
+// Utility functions
+// ------------------
+
+
+//console.log("TIZEN CONTACT START");
+
+
+var ContactError = require('cordova/plugin/ContactError'),
+    ContactUtils = require('cordova/plugin/tizen/ContactUtils'),
+    utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+
+
+/**
+ * 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.personId " + tizenContact.personId);     //Tizen 2.0
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.addressBookId " + tizenContact.addressBookId);  //Tizen 2.0
+
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.lastUpdated " + tizenContact.lastUpdated);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.isFavorite " + tizenContact.isFavorite);  //Tizen 2.0
+
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.name " + tizenContact.name);
+
+    //console.log("cordova/plugin/tizen/Contact/  tizenContact.account " + tizenContact.account);  //Tizen 2.0
+
+    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.anniversaries " + tizenContact.anniversaries);
+
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.organizations " + tizenContact.organizations);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.notes " + tizenContact.notes);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.urls " + tizenContact.urls);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.ringtonesURI " + tizenContact.ringtonesURI);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.groupIds " + tizenContact.groupIds);    //Tizen 2.0
+
+    //console.log("cordova/plugin/tizen/Contact/  tizenContact.categories " + tizenContact.categories);  //Tizen 2.0
+};
+
+
+/**
+ * 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;
+            }
+        }
+
+        //Tizen 2.0
+        if (contact.name.honorificSuffix) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.suffix = contact.name.honorificSuffix;
+            }
+        }
+    }
+
+    // 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 = [];
+    }
+
+    // notes - Tizen 2.0 (was note)
+    if (contact.note !== null) {
+        if (tizenContact.notes === null) {
+            tizenContact.notes = [];
+        }
+        if (tizenContact.notes !== null) {
+            tizenContact.notes[0] = contact.note;
+        }
+    }
+
+    // photos
+    if (contact.photos && utils.isArray(contact.photos) && contact.photos.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 email 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);
+
+            emails.push(
+                new tizen.ContactEmailAddress(
+                    contact.emails[i].value,
+                    emailTypes,
+                    contact.emails[i].pref));    //Tizen 2.0
+
+        }
+        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]) {
+                continue;
+            }
+
+            var phoneTypes = [];
+            phoneTypes.push (contact.phoneNumbers[i].type);
+
+
+            phoneNumbers.push(
+                new tizen.ContactPhoneNumber(
+                    contact.phoneNumbers[i].value,
+                    phoneTypes,
+                    contact.phoneNumbers[i].pref)    //Tizen 2.0
+            );
+        }
+
+        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) {
+                continue;
+            }
+
+            var addressTypes = [];
+            addressTypes.push (address.type);
+
+            addresses.push(
+                new tizen.ContactAddress({
+                         country:                   address.country,
+                         region :                   address.region,
+                         city:                      address.locality,
+                         streetAddress:             address.streetAddress,
+                         additionalInformation:     "",
+                         postalCode:                address.postalCode,
+                         isDefault:                    address.pref, //Tizen 2.0
+                         types :                    addressTypes
+                }));
+
+        }
+        tizenContact.addresses = addresses.length > 0 ? addresses : [];
+
+    }
+    else{
+        tizenContact.addresses = [];
+    }
+
+    // copy first url found to cordova 'urls' 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 addresses
+        if (update) {
+        }
+
+        var organizations = [],
+            organization = null;
+
+        for ( i = 0; i < contact.organizations.length; i += 1) {
+            organization = contact.organizations[i];
+
+            if (!organization) {
+                continue;
+            }
+
+            organizations.push(
+                new tizen.ContactOrganization({
+                    name:          organization.name,
+                    department:    organization.department,
+                    title:         organization.title,
+                    role:          "",
+                    logoURI:       ""
+                }));
+
+        }
+        tizenContact.organizations = organizations.length > 0 ? organizations : [];
+
+    }
+    else{
+        tizenContact.organizations = [];
+    }
+
+    // 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);
+
+    tizenAddress.country = address.country || "";
+    tizenAddress.region = address.region || "";
+    tizenAddress.city = address.locality || "";
+    tizenAddress.streetAddress = address.streetAddress || "";
+    tizenAddress.postalCode = address.postalCode || "";
+    tizenAddress.isDefault = address.pref || false;   //Tizen SDK 2.0
+    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) {
+                //var addressBook =  tizen.contact.getDefaultAddressBook();
+                var addressBook =  tizen.contact.getAddressBook(tizenContact.addressBookId);   //Tizen SDk 2.0
+
+                addressBook.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));
+            }
+        }
+    }
+};
+
+//console.log("TIZEN CONTACT END");
+
+});
+
+// file: lib/tizen/plugin/tizen/ContactUtils.js
+define("cordova/plugin/tizen/ContactUtils", function(require, exports, module) {
+
+/*global tizen:false */
+var Contact = require('cordova/plugin/Contact'),
+    ContactAddress = require('cordova/plugin/ContactAddress'),
+    ContactName = require('cordova/plugin/ContactName'),
+    ContactField = require('cordova/plugin/ContactField'),
+    ContactOrganization = require('cordova/plugin/ContactOrganization'),
+    utils = require('cordova/utils');
+
+
+
+/**
+ * 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" : ["organizations.name","organizations.department","organizations.office", "organizations.title"],
+    "birthday" : ["birthday"],
+    "note" : ["notes"],
+    "photos" : ["photoURI"],
+    "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() {
+    for ( var key in fieldMappings) {
+        allFields.push(key);
+    }
+})();
+
+/**
+ * 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 isDefault = tizenAddress.isDefault;            //Tizen 2.0
+    var streetAddress = tizenAddress.streetAddress;
+    var locality = tizenAddress.city || "";
+    var region = tizenAddress.region || "";
+    var postalCode = tizenAddress.postalCode || "";
+    var country = tizenAddress.country || "";
+
+    //TODO improve formatted
+    var formatted = streetAddress + ", " + locality + ", " + region + ", " + postalCode + ", " + country;
+
+    var contact = new ContactAddress(isDefault, 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);
+                    }
+                }
+            }
+        }
+
+        // fulfill 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 || "");
+                }
+
+                //Tizen 2.0
+                if (tizenContact.name.suffix) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.suffix || "");
+                }
+
+                contact.name = new ContactName(
+                        formattedName,
+                        tizenContact.name.lastName,
+                        tizenContact.name.firstName,
+                        tizenContact.name.middleName,
+                        tizenContact.name.prefix,
+                        tizenContact.name.suffix);
+            }
+            // phoneNumbers - Tizen 2.0
+            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].isDefault));
+                }
+                contact.phoneNumbers = phoneNumbers.length > 0 ? phoneNumbers : null;
+            }
+
+            // emails - Tizen 2.0
+            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].isDefault));
+                }
+                contact.emails = emails.length > 0 ? emails : null;
+            }
+
+            // addresses Tizen 2.0
+            else if (field.indexOf('addresses') === 0) {
+                var addresses = [];
+
+                for (index = 0 ; index < tizenContact.addresses.length ; ++index) {
+                    addresses.push(
+                         new ContactAddress(
+                            tizenContact.addresses[index].isDefault,
+                            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 -Tizen 2.0
+            else if (field.indexOf('note') === 0) {
+                if (tizenContact.notes) {
+                    contact.note = tizenContact.notes[0];
+                }
+            }
+            // organizations Tizen 2.0
+            else if (field.indexOf('organizations') === 0) {
+                var organizations = [];
+
+                for (index = 0 ; index < tizenContact.organizations.length ; ++index) {
+                    organizations.push(
+                            new ContactOrganization(
+                                    (index === 0),
+                                    'WORK',
+                                    tizenContact.organizations.name,
+                                    tizenContact.organizations.department,
+                                    tizenContact.organizations.jobTitle));
+                }
+                contact.organizations = organizations.length > 0 ? organizations : 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');
+
+//console.log("TIZEN DEVICE START");
+
+
+// Tell cordova channel to wait on the CordovaInfoReady event - PPL is this useful?
+//channel.waitForInitialization('onCordovaInfoReady');
+
+function Device() {
+    this.version = "2.1.0"; // waiting a working solution of the security error see below
+    this.uuid = null;
+    this.model = null;
+    this.cordova = CORDOVA_JS_BUILD_LABEL;
+    this.platform = "Tizen";
+   
+    this.getDeviceInfo();
+}
+
+Device.prototype.getDeviceInfo = function() {
+
+    var deviceCapabilities =  tizen.systeminfo.getCapabilities();
+
+    if (deviceCapabilities) {
+        this.version = deviceCapabilities.platformVersion; // requires http://tizen.org/privilege/system  (and not "systeminfo")  privileges to be added in config.xml
+        this.uuid = deviceCapabilities.duid;
+        this.model = deviceCapabilities.platformName;
+        
+        channel.onCordovaInfoReady.fire();
+     }
+     else {
+         console.log("error initializing cordova: ");
+     }
+};
+
+module.exports = new Device();
+
+//console.log("TIZEN DEVICE END");
+
+
+
+});
+
+// file: lib/tizen/plugin/tizen/File.js
+define("cordova/plugin/tizen/File", function(require, exports, module) {
+
+
+//console.log("TIZEN FILE START");
+
+/*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 = {
+    /* common/equestFileSystem.js, args = [type, size] */
+    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);
+            }
+        );
+    },
+
+    /* common/resolveLocalFileSystemURI.js, args= [uri] */
+    resolveLocalFileSystemURI: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(
+            uri,
+            function(entry) {
+                successCallback(makeEntry(entry));
+            },
+            function(error) {
+                errorCallback(error.code);
+            }
+        );
+    },
+
+    /* common/DirectoryReader.js, args = [this.path] */
+    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);
+            }
+        );
+    },
+
+    /* common/Entry.js , args = [this.fullPath] */
+    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);
+            }
+        );
+    },
+
+    /* args = [this.fullPath, metadataObject] */
+    /* PPL to be implemented */
+    setMetadata: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            metadata = args[1];
+
+        if (errorCallback) {
+            errorCallback(FileError.NOT_FOUND_ERR);
+        }
+    },
+
+
+    /* args = [srcPath, parent.fullPath, name] */
+    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);
+            }
+        );
+    },
+
+    /* args = [srcPath, parent.fullPath, name] */
+    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);
+            }
+        );
+    },
+
+
+    /* args = [this.fullPath] */
+    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);
+            }
+        );
+    },
+
+    /* args = [this.fullPath] */
+    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);
+            }
+        );
+    },
+
+    /* common/FileEntry.js, args = [this.fullPath] */
+    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);
+            }
+        );
+    },
+
+    /* common/DirectoryEntry.js , args = [this.fullPath, path, options] */
+    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);
+            }
+        );
+    },
+
+    /* args = [this.fullPath] */
+    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);
+            }
+        );
+    },
+
+    /* args = [this.fullPath, path, options] */
+    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);
+            }
+        );
+    },
+
+    /* common/FileReader.js, args = execArgs = [filepath, encoding, file.start, file.end] */
+    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);
+            }
+        );
+    },
+
+    /* args = execArgs = [this._fileName, file.start, file.end] */
+    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);
+            }
+        );
+    },
+
+    /* args = execArgs =  [this._fileName, file.start, file.end] */
+    /* PPL, to Be implemented , for now it is pasted from readAsText...*/
+    readAsBinaryString: 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);
+            }
+        );
+    },
+
+
+    /* args = execArgs =  [this._fileName, file.start, file.end] */
+    /* PPL, to Be implemented , for now it is pasted from readAsText...*/
+    readAsArrayBuffer: 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);
+            }
+        );
+    },
+
+    /* common/FileWriter.js, args = [this.fileName, text, this.position] */
+    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);
+            }
+        );
+    },
+
+    /* args = [this.fileName, size] */
+    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);
+            }
+        );
+    }
+};
+
+
+//console.log("TIZEN FILE END");
+
+
+});
+
+// file: lib/tizen/plugin/tizen/FileTransfer.js
+define("cordova/plugin/tizen/FileTransfer", function(require, exports, module) {
+
+/*global WebKitBlobBuilder:false */
+
+
+//console.log("TIZEN FILE TRANSFER START");
+
+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 = {
+    /* common/FileTransfer.js, args = [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers, this._id, httpMethod] */
+    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));
+            }
+        );
+    },
+
+    /* args = [source, target, trustAllHosts, this._id, headers] */
+    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();
+    },
+
+
+    /* args = [this._id]); */
+    abort: function(successCallback, errorCallback, args) {
+        errorCallback(FileTransferError.ABORT_ERR);
+    }
+
+};
+
+
+//console.log("TIZEN FILE TRANSFER END");
+
+
+});
+
+// file: lib/tizen/plugin/tizen/Globalization.js
+define("cordova/plugin/tizen/Globalization", function(require, exports, module) {
+
+
+/*global tizen:false */
+
+var argscheck = require('cordova/argscheck'),
+    exec = require('cordova/exec'),
+    GlobalizationError = require('cordova/plugin/GlobalizationError');
+
+var globalization = {
+
+/**
+* Returns the string identifier for the client's current language.
+* It returns the language identifier string to the successCB callback with a
+* properties object as a parameter. If there is an error getting the language,
+* then the errorCB callback is invoked.
+*
+* @param {Function} successCB
+* @param {Function} errorCB
+*
+* @return Object.value {String}: The language identifier
+*
+* @error GlobalizationError.UNKNOWN_ERROR
+*
+* Example
+*    globalization.getPreferredLanguage(function (language) {alert('language:' + language.value + '\n');},
+*                                function () {});
+*/
+getPreferredLanguage:function(successCB, failureCB) {
+    console.log('exec(successCB, failureCB, "Globalization","getPreferredLanguage", []);');
+
+    tizen.systeminfo.getPropertyValue (
+        "LOCALE",
+        function (localeInfo) {
+            console.log("Cordova, getLocaleName, language is  " + localeInfo.language);
+            successCB( {"value": localeInfo.language});
+        },
+        function(error) {
+            console.log("Cordova, getLocaleName, An error occurred " + error.message);
+            failureCB(new GlobalizationError(GlobalizationError.UNKNOWN_ERROR , "cannot retrieve language name"));
+        }
+    );
+},
+
+/**
+* Returns the string identifier for the client's current locale setting.
+* It returns the locale identifier string to the successCB callback with a
+* properties object as a parameter. If there is an error getting the locale,
+* then the errorCB callback is invoked.
+*
+* @param {Function} successCB
+* @param {Function} errorCB
+*
+* @return Object.value {String}: The locale identifier
+*
+* @error GlobalizationError.UNKNOWN_ERROR
+*
+* Example
+*    globalization.getLocaleName(function (locale) {alert('locale:' + locale.value + '\n');},
+*                                function () {});
+*/
+getLocaleName:function(successCB, failureCB) {
+    tizen.systeminfo.getPropertyValue (
+        "LOCALE",
+        function (localeInfo) {
+            console.log("Cordova, getLocaleName, locale name (country) is  " + localeInfo.country);
+            successCB( {"value":localeInfo.language});
+        },
+        function(error) {
+            console.log("Cordova, getLocaleName, An error occurred " + error.message);
+            failureCB(new GlobalizationError(GlobalizationError.UNKNOWN_ERROR , "cannot retrieve locale name"));
+        }
+    );
+},
+
+
+/**
+* Returns a date formatted as a string according to the client's user preferences and
+* calendar using the time zone of the client. It returns the formatted date string to the
+* successCB callback with a properties object as a parameter. If there is an error
+* formatting the date, then the errorCB callback is invoked.
+*
+* The defaults are: formatLenght="short" and selector="date and time"
+*
+* @param {Date} date
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            formatLength {String}: 'short', 'medium', 'long', or 'full'
+*            selector {String}: 'date', 'time', or 'date and time'
+*
+* @return Object.value {String}: The localized date string
+*
+* @error GlobalizationError.FORMATTING_ERROR
+*
+* Example
+*    globalization.dateToString(new Date(),
+*                function (date) {alert('date:' + date.value + '\n');},
+*                function (errorCode) {alert(errorCode);},
+*                {formatLength:'short'});
+*/
+dateToString:function(date, successCB, failureCB, options) {
+    var dateValue = date.valueOf();
+    console.log('exec(successCB, failureCB, "Globalization", "dateToString", [{"date": dateValue, "options": options}]);');
+
+    var tzdate = null;
+    var format = null;
+
+    tzdate = new tizen.TZDate(date);
+
+    if (tzdate) {
+        if (options && (options.formatLength == 'short') ){
+            format = tzdate.toLocaleDateString();
+        }
+        else{
+            format = tzdate.toLocaleString();
+        }
+        console.log('Cordova, globalization, dateToString ' +format);
+    }
+
+    if (format)
+    {
+        successCB ({"value": format});
+    }
+    else {
+        failureCB(new GlobalizationError(GlobalizationError.FORMATTING_ERROR , "cannot format date string"));
+    }
+},
+
+
+/**
+* Parses a date formatted as a string according to the client's user
+* preferences and calendar using the time zone of the client and returns
+* the corresponding date object. It returns the date to the successCB
+* callback with a properties object as a parameter. If there is an error
+* parsing the date string, then the errorCB callback is invoked.
+*
+* The defaults are: formatLength="short" and selector="date and time"
+*
+* @param {String} dateString
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            formatLength {String}: 'short', 'medium', 'long', or 'full'
+*            selector {String}: 'date', 'time', or 'date and time'
+*
+* @return    Object.year {Number}: The four digit year
+*            Object.month {Number}: The month from (0 - 11)
+*            Object.day {Number}: The day from (1 - 31)
+*            Object.hour {Number}: The hour from (0 - 23)
+*            Object.minute {Number}: The minute from (0 - 59)
+*            Object.second {Number}: The second from (0 - 59)
+*            Object.millisecond {Number}: The milliseconds (from 0 - 999),
+*                                        not available on all platforms
+*
+* @error GlobalizationError.PARSING_ERROR
+*
+* Example
+*    globalization.stringToDate('4/11/2011',
+*                function (date) { alert('Month:' + date.month + '\n' +
+*                    'Day:' + date.day + '\n' +
+*                    'Year:' + date.year + '\n');},
+*                function (errorCode) {alert(errorCode);},
+*                {selector:'date'});
+*/
+stringToDate:function(dateString, successCB, failureCB, options) {
+    argscheck.checkArgs('sfFO', 'Globalization.stringToDate', arguments);
+    console.log('exec(successCB, failureCB, "Globalization", "stringToDate", [{"dateString": dateString, "options": options}]);');
+
+    //not supported
+    failureCB(new GlobalizationError(GlobalizationError.PARSING_ERROR , "unsupported"));
+},
+
+
+/**
+* Returns a pattern string for formatting and parsing dates according to the client's
+* user preferences. It returns the pattern to the successCB callback with a
+* properties object as a parameter. If there is an error obtaining the pattern,
+* then the errorCB callback is invoked.
+*
+* The defaults are: formatLength="short" and selector="date and time"
+*
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            formatLength {String}: 'short', 'medium', 'long', or 'full'
+*            selector {String}: 'date', 'time', or 'date and time'
+*
+* @return    Object.pattern {String}: The date and time pattern for formatting and parsing dates.
+*                                    The patterns follow Unicode Technical Standard #35
+*                                    http://unicode.org/reports/tr35/tr35-4.html
+*            Object.timezone {String}: The abbreviated name of the time zone on the client
+*            Object.utc_offset {Number}: The current difference in seconds between the client's
+*                                        time zone and coordinated universal time.
+*            Object.dst_offset {Number}: The current daylight saving time offset in seconds
+*                                        between the client's non-daylight saving's time zone
+*                                        and the client's daylight saving's time zone.
+*
+* @error GlobalizationError.PATTERN_ERROR
+*
+* Example
+*    globalization.getDatePattern(
+*                function (date) {alert('pattern:' + date.pattern + '\n');},
+*                function () {},
+*                {formatLength:'short'});
+*/
+getDatePattern:function(successCB, failureCB, options) {
+    console.log(' exec(successCB, failureCB, "Globalization", "getDatePattern", [{"options": options}]);');
+
+    var shortFormat = (options) ? ( options.formatLength === 'short') : true;
+
+    var formatString = tizen.time.getDateFormat ( shortFormat);
+
+
+    var current_datetime = tizen.time.getCurrentDateTime();
+
+    // probably will require some control of operation...
+    if (formatString)
+    {
+        successCB(
+            {
+                "pattern": formatString,
+                "timezone": current_datetime.getTimezoneAbbreviation(),
+                "utc_offset": current_datetime.difference(current_datetime.toUTC()).length,
+                "dst_offset": current_datetime.isDST()
+            }
+        );
+    }
+    else {
+        failureCB(new GlobalizationError(GlobalizationError.PATTERN_ERROR , "cannot get pattern"));
+    }
+},
+
+
+/**
+* Returns an array of either the names of the months or days of the week
+* according to the client's user preferences and calendar. It returns the array of names to the
+* successCB callback with a properties object as a parameter. If there is an error obtaining the
+* names, then the errorCB callback is invoked.
+*
+* The defaults are: type="wide" and item="months"
+*
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            type {String}: 'narrow' or 'wide'
+*            item {String}: 'months', or 'days'
+*
+* @return Object.value {Array{String}}: The array of names starting from either
+*                                        the first month in the year or the
+*                                        first day of the week.
+* @error GlobalizationError.UNKNOWN_ERROR
+*
+* Example
+*    globalization.getDateNames(function (names) {
+*        for(var i = 0; i < names.value.length; i++) {
+*            alert('Month:' + names.value[i] + '\n');}},
+*        function () {});
+*/
+getDateNames:function(successCB, failureCB, options) {
+    argscheck.checkArgs('fFO', 'Globalization.getDateNames', arguments);
+    console.log('exec(successCB, failureCB, "Globalization", "getDateNames", [{"options": options}]);');
+
+    failureCB(new GlobalizationError(GlobalizationError.UNKNOWN_ERROR , "unsupported"));
+},
+
+/**
+* Returns whether daylight savings time is in effect for a given date using the client's
+* time zone and calendar. It returns whether or not daylight savings time is in effect
+* to the successCB callback with a properties object as a parameter. If there is an error
+* reading the date, then the errorCB callback is invoked.
+*
+* @param {Date} date
+* @param {Function} successCB
+* @param {Function} errorCB
+*
+* @return Object.dst {Boolean}: The value "true" indicates that daylight savings time is
+*                                in effect for the given date and "false" indicate that it is not.
+*
+* @error GlobalizationError.UNKNOWN_ERROR
+*
+* Example
+*    globalization.isDayLightSavingsTime(new Date(),
+*                function (date) {alert('dst:' + date.dst + '\n');}
+*                function () {});
+*/
+isDayLightSavingsTime:function(date, successCB, failureCB) {
+
+    var tzdate = null,
+        isDLS = false;
+
+    console.log('exec(successCB, failureCB, "Globalization", "isDayLightSavingsTime", [{"date": dateValue}]);');
+    console.log("date " + date + " value " + date.valueOf()) ;
+
+    tzdate = new tizen.TZDate(date);
+    if (tzdate) {
+        isDLS = false | (tzdate && tzdate.isDST());
+
+        console.log ("Cordova, globalization, isDayLightSavingsTime, " + isDLS);
+
+        successCB({"dst":isDLS});
+    }
+    else {
+        failureCB(new GlobalizationError(GlobalizationError.UNKNOWN_ERROR , "cannot get information"));
+    }
+},
+
+/**
+* Returns the first day of the week according to the client's user preferences and calendar.
+* The days of the week are numbered starting from 1 where 1 is considered to be Sunday.
+* It returns the day to the successCB callback with a properties object as a parameter.
+* If there is an error obtaining the pattern, then the errorCB callback is invoked.
+*
+* @param {Function} successCB
+* @param {Function} errorCB
+*
+* @return Object.value {Number}: The number of the first day of the week.
+*
+* @error GlobalizationError.UNKNOWN_ERROR
+*
+* Example
+*    globalization.getFirstDayOfWeek(function (day)
+*                { alert('Day:' + day.value + '\n');},
+*                function () {});
+*/
+getFirstDayOfWeek:function(successCB, failureCB) {
+    argscheck.checkArgs('fF', 'Globalization.getFirstDayOfWeek', arguments);
+    console.log('exec(successCB, failureCB, "Globalization", "getFirstDayOfWeek", []);');
+
+    // there is no API to get the fist day of the week in Tizen Dvice API
+    successCB({value:1});
+
+    // first day of week is a settings in the date book app
+    // what about : getting the settings directly or asking the date book ?
+},
+
+
+/**
+* Returns a number formatted as a string according to the client's user preferences.
+* It returns the formatted number string to the successCB callback with a properties object as a
+* parameter. If there is an error formatting the number, then the errorCB callback is invoked.
+*
+* The defaults are: type="decimal"
+*
+* @param {Number} number
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            type {String}: 'decimal', "percent", or 'currency'
+*
+* @return Object.value {String}: The formatted number string.
+*
+* @error GlobalizationError.FORMATTING_ERROR
+*
+* Example
+*    globalization.numberToString(3.25,
+*                function (number) {alert('number:' + number.value + '\n');},
+*                function () {},
+*                {type:'decimal'});
+*/
+numberToString:function(number, successCB, failureCB, options) {
+    argscheck.checkArgs('nfFO', 'Globalization.numberToString', arguments);
+    console.log('exec(successCB, failureCB, "Globalization", "numberToString", [{"number": number, "options": options}]);');
+    //not supported
+    failureCB(new GlobalizationError(GlobalizationError.UNKNOWN_ERROR , "unsupported"));
+},
+
+/**
+* Parses a number formatted as a string according to the client's user preferences and
+* returns the corresponding number. It returns the number to the successCB callback with a
+* properties object as a parameter. If there is an error parsing the number string, then
+* the errorCB callback is invoked.
+*
+* The defaults are: type="decimal"
+*
+* @param {String} numberString
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            type {String}: 'decimal', "percent", or 'currency'
+*
+* @return Object.value {Number}: The parsed number.
+*
+* @error GlobalizationError.PARSING_ERROR
+*
+* Example
+*    globalization.stringToNumber('1234.56',
+*                function (number) {alert('Number:' + number.value + '\n');},
+*                function () { alert('Error parsing number');});
+*/
+stringToNumber:function(numberString, successCB, failureCB, options) {
+    argscheck.checkArgs('sfFO', 'Globalization.stringToNumber', arguments);
+    console.log('exec(successCB, failureCB, "Globalization", "stringToNumber", [{"numberString": numberString, "options": options}]);');
+
+    //not supported
+    failureCB(new GlobalizationError(GlobalizationError.UNKNOWN_ERROR , "unsupported"));
+},
+
+/**
+* Returns a pattern string for formatting and parsing numbers according to the client's user
+* preferences. It returns the pattern to the successCB callback with a properties object as a
+* parameter. If there is an error obtaining the pattern, then the errorCB callback is invoked.
+*
+* The defaults are: type="decimal"
+*
+* @param {Function} successCB
+* @param {Function} errorCB
+* @param {Object} options {optional}
+*            type {String}: 'decimal', "percent", or 'currency'
+*
+* @return    Object.pattern {String}: The number pattern for formatting and parsing numbers.
+*                                    The patterns follow Unicode Technical Standard #35.
+*                                    http://unicode.org/reports/tr35/tr35-4.html
+*            Object.symbol {String}: The symbol to be used when formatting and parsing
+*                                    e.g., percent or currency symbol.
+*            Object.fraction {Number}: The number of fractional digits to use when parsing and
+*                                    formatting numbers.
+*            Object.rounding {Number}: The rounding increment to use when parsing and formatting.
+*            Object.positive {String}: The symbol to use for positive numbers when parsing and formatting.
+*            Object.negative: {String}: The symbol to use for negative numbers when parsing and formatting.
+*            Object.decimal: {String}: The decimal symbol to use for parsing and formatting.
+*            Object.grouping: {String}: The grouping symbol to use for parsing and formatting.
+*
+* @error GlobalizationError.PATTERN_ERROR
+*
+* Example
+*    globalization.getNumberPattern(
+*                function (pattern) {alert('Pattern:' + pattern.pattern + '\n');},
+*                function () {});
+*/
+getNumberPattern:function(successCB, failureCB, options) {
+    argscheck.checkArgs('fFO', 'Globalization.getNumberPattern', arguments);
+    console.log('exec(successCB, failureCB, "Globalization", "getNumberPattern", [{"options": options}]);');
+
+    //not supported
+    failureCB(new GlobalizationError(GlobalizationError.UNKNOWN_ERROR , "unsupported"));
+},
+
+/**
+* Returns a pattern string for formatting and parsing currency values according to the client's
+* user preferences and ISO 4217 currency code. It returns the pattern to the successCB callback with a
+* properties object as a parameter. If there is an error obtaining the pattern, then the errorCB
+* callback is invoked.
+*
+* @param {String} currencyCode
+* @param {Function} successCB
+* @param {Function} errorCB
+*
+* @return    Object.pattern {String}: The currency pattern for formatting and parsing currency values.
+*                                    The patterns follow Unicode Technical Standard #35
+*                                    http://unicode.org/reports/tr35/tr35-4.html
+*            Object.code {String}: The ISO 4217 currency code for the pattern.
+*            Object.fraction {Number}: The number of fractional digits to use when parsing and
+*                                    formatting currency.
+*            Object.rounding {Number}: The rounding increment to use when parsing and formatting.
+*            Object.decimal: {String}: The decimal symbol to use for parsing and formatting.
+*            Object.grouping: {String}: The grouping symbol to use for parsing and formatting.
+*
+* @error GlobalizationError.FORMATTING_ERROR
+*
+* Example
+*    globalization.getCurrencyPattern('EUR',
+*                function (currency) {alert('Pattern:' + currency.pattern + '\n');}
+*                function () {});
+*/
+getCurrencyPattern:function(currencyCode, successCB, failureCB) {
+    argscheck.checkArgs('sfF', 'Globalization.getCurrencyPattern', arguments);
+    console.log('exec(successCB, failureCB, "Globalization", "getCurrencyPattern", [{"currencyCode": currencyCode}]);');
+
+    //not supported
+    failureCB(new GlobalizationError(GlobalizationError.UNKNOWN_ERROR , "unsupported"));
+}
+
+};
+
+module.exports = globalization;
+
+});
+
+// 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 = {};
+
+//console.log("TIZEN MEDIA START");
+
+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();
+    }
+};
+
+//console.log("TIZEN MEDIA END");
+
+
+});
+
+// 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');
+
+//console.log("TIZEN CONNECTION AKA NETWORK STATUS START");
+
+module.exports = {
+    getConnectionInfo: function (successCallback, errorCallback) {
+
+        var cncType = Connection.NONE;
+        var infoCount = 0;
+        var deviceCapabilities = null;
+        var timerId = 0;
+        var timeout = 300;
+
+
+        function connectionCB() {
+
+            if (timerId !== null) {
+                clearTimeout(timerId);
+                timerId = null;
+            }
+
+            infoCount++;
+
+            if (infoCount > 1) {
+                if (successCallback) {
+                    successCallback(cncType);
+                }
+            }
+        }
+
+        function errorCB(error) {
+            console.log("Error: " + error.code + "," + error.name + "," + error.message);
+
+            if (errorCallback) {
+                errorCallback();
+            }
+        }
+
+        function wifiSuccessCB(wifi) {
+            if ((wifi.status === "ON")  && (wifi.ipAddress.length !== 0)) {
+                cncType = Connection.WIFI;
+            }
+            connectionCB();
+        }
+
+        function cellularSuccessCB(cell) {
+            if ((cncType === Connection.NONE) && (cell.status === "ON") && (cell.ipAddress.length !== 0)) {
+                cncType = Connection.CELL_2G;
+            }
+            connectionCB();
+        }
+
+
+        deviceCapabilities = tizen.systeminfo.getCapabilities();
+
+
+        timerId = setTimeout( function(){
+            timerId = null;
+            infoCount = 1;
+            connectionCB();
+        }, timeout);
+
+
+        if (deviceCapabilities.wifi) {
+            tizen.systeminfo.getPropertyValue("WIFI_NETWORK", wifiSuccessCB, errorCB);
+        }
+
+        if (deviceCapabilities.telephony) {
+            tizen.systeminfo.getPropertyValue("CELLULAR_NETWORK", cellularSuccessCB, errorCB);
+        }
+
+    }
+};
+
+//console.log("TIZEN CONNECTION AKA NETWORK STATUS END");
+
+});
+
+// file: lib/tizen/plugin/tizen/Notification.js
+define("cordova/plugin/tizen/Notification", function(require, exports, module) {
+
+var SoundBeat = require('cordova/plugin/tizen/SoundBeat');
+
+/* TODO: get resource path from app environment? */
+var soundBeat = new SoundBeat(["./sounds/beep.wav"]);
+
+
+//console.log("TIZEN NOTIFICATION START");
+
+
+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;
+
+
+        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);
+       }
+    },
+
+    prompt: function (message, promptCallback, title, buttonLabels) {
+        console.log ("message" , message);
+        console.log ("promptCallback" , promptCallback);
+        console.log ("title" , title);
+        console.log ("buttonLabels" , buttonLabels);
+
+        //a temporary implementation using window.prompt()
+        // note taht buttons are cancel ok (in that order)
+        // gonna to return based on having OK  / Cancel
+        // ok is 1, cancel is 2
+
+        var result = prompt(message);
+
+        if (promptCallback && (typeof promptCallback == "function")) {
+            promptCallback((result === null) ? 2 : 1, result);
+        }
+    },
+
+    vibrate: function(milliseconds) {
+        console.log ("milliseconds" , milliseconds);
+
+        if (navigator.vibrate) {
+            navigator.vibrate(milliseconds);
+        }
+        else {
+            console.log ("cordova/plugin/tizen/Notification, vibrate API does not exist");
+        }
+    },
+
+    beep: function(count) {
+        console.log ("count" , count);
+        soundBeat.play(count);
+    }
+};
+
+//console.log("TIZEN NOTIFICATION END");
+
+
+});
+
+// file: lib/tizen/plugin/tizen/SoundBeat.js
+define("cordova/plugin/tizen/SoundBeat", function(require, exports, module) {
+
+/*global webkitAudioContext:false */
+/*
+ *  SoundBeat
+ * used by Notification Manager beep method
+ *
+ * This class provides sounds play
+ *
+ * uses W3C  Web Audio API
+ * uses BufferLoader object
+ *
+ * NOTE: the W3C Web Audio doc tells we do not need to recreate the audio
+ *       context to play a sound but only the audiosourcenode (createBufferSource)
+ *       in the WebKit implementation we have to.
+ *
+ */
+
+var BufferLoader = require('cordova/plugin/tizen/BufferLoader');
+
+function SoundBeat(urlList) {
+    this.context = null;
+    this.urlList = urlList || null;
+    this.buffers = null;
+}
+
+/*
+ * This method play a loaded sounds on the Device
+ * @param {Number} times Number of times to play loaded sounds.
+ *
+ */
+SoundBeat.prototype.play = function(times) {
+
+    var i = 0, sources = [], that = this;
+
+    function finishedLoading (bufferList) {
+        that.buffers = bufferList;
+
+        for (i = 0; i < that.buffers.length ; i +=1) {
+            if (that.context) {
+                sources[i] = that.context.createBufferSource();
+
+                sources[i].buffer = that.buffers[i];
+                sources[i].connect (that.context.destination);
+
+                sources[i].loop = true;
+                sources[i].noteOn (0);
+                sources[i].noteOff(sources[i].buffer.duration * times);
+            }
+        }
+    }
+
+    if (webkitAudioContext !== null) {
+        this.context = new webkitAudioContext();
+    }
+    else {
+        console.log ("SoundBeat.prototype.play, w3c web audio api not supported");
+        this.context = null;
+    }
+
+    if (this.context === null) {
+        console.log ("SoundBeat.prototype.play, cannot create audio context object");
+        return;
+    }
+
+    this.bufferLoader = new BufferLoader (this.context, this.urlList, finishedLoading);
+    if (this.bufferLoader === null) {
+        console.log ("SoundBeat.prototype.play, cannot create buffer loader object");
+        return;
+    }
+
+    this.bufferLoader.load();
+};
+
+module.exports = SoundBeat;
+
+});
+
+// file: lib/tizen/plugin/tizen/SplashScreen.js
+define("cordova/plugin/tizen/SplashScreen", function(require, exports, module) {
+
+var exec = require('cordova/exec'),
+	InAppBrowser = require('cordova/plugin/InAppBrowser');
+
+var splashscreen = {
+
+    window: null,
+
+
+    show:function() {
+        console.log ("tizen splashscreen show()");
+
+        // open a windows in splashscreen.window
+        // add DOM with an Image
+        window = window.open('splashscreen.html');
+        
+
+    },
+    hide:function() {
+        console.log ("tizen splashscreen hide()");
+        //delete the window splashscreen.window
+        //set to null
+        window.close();
+        window = null;
+    }
+};
+
+module.exports = splashscreen;
+
+});
+
+// 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/contacts/symbols.js
+define("cordova/plugin/tizen/contacts/symbols", function(require, exports, module) {
+
+require('cordova/plugin/contacts/symbols');
+
+var modulemapper = require('cordova/modulemapper');
+
+modulemapper.merges('cordova/plugin/tizen/contacts', 'navigator.contacts');
+modulemapper.merges('cordova/plugin/tizen/Contact', 'Contact');
+
+});
+
+// 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/symbols.js
+define("cordova/symbols", function(require, exports, module) {
+
+var modulemapper = require('cordova/modulemapper');
+
+// Use merges here in case others symbols files depend on this running first,
+// but fail to declare the dependency with a require().
+modulemapper.merges('cordova', 'cordova');
+modulemapper.clobbers('cordova/exec', 'cordova.exec');
+modulemapper.clobbers('cordova/exec', 'Cordova.exec');
+
+});
+
+// file: lib/common/utils.js
+define("cordova/utils", function(require, exports, module) {
+
+var utils = exports;
+
+/**
+ * Defines a property getter / setter for obj[key].
+ */
+utils.defineGetterSetter = function(obj, key, getFunc, opt_setFunc) {
+    if (Object.defineProperty) {
+        var desc = {
+            get: getFunc,
+            configurable: true
+        };
+        if (opt_setFunc) {
+            desc.set = opt_setFunc;
+        }
+        Object.defineProperty(obj, key, desc);
+    } else {
+        obj.__defineGetter__(key, getFunc);
+        if (opt_setFunc) {
+            obj.__defineSetter__(key, opt_setFunc);
+        }
+    }
+};
+
+/**
+ * Defines a property getter for obj[key].
+ */
+utils.defineGetter = utils.defineGetterSetter;
+
+utils.arrayIndexOf = function(a, item) {
+    if (a.indexOf) {
+        return a.indexOf(item);
+    }
+    var len = a.length;
+    for (var i = 0; i < len; ++i) {
+        if (a[i] == item) {
+            return i;
+        }
+    }
+    return -1;
+};
+
+/**
+ * Returns whether the item was found in the array.
+ */
+utils.arrayRemove = function(a, item) {
+    var index = utils.arrayIndexOf(a, item);
+    if (index != -1) {
+        a.splice(index, 1);
+    }
+    return index != -1;
+};
+
+utils.typeName = function(val) {
+    return Object.prototype.toString.call(val).slice(8, -1);
+};
+
+/**
+ * Returns an indication of whether the argument is an array or not
+ */
+utils.isArray = function(a) {
+    return utils.typeName(a) == 'Array';
+};
+
+/**
+ * Returns an indication of whether the argument is a Date or not
+ */
+utils.isDate = function(d) {
+    return utils.typeName(d) == '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 wrapped 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 (window.alert) {
+        window.alert(msg);
+    } else if (console && console.log) {
+        console.log(msg);
+    }
+};
+
+
+//------------------------------------------------------------------------------
+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;
+}
+
+
+});
+
+window.cordova = require('cordova');
+// file: lib/scripts/bootstrap.js
+
+(function (context) {
+    if (context._cordovaJsLoaded) {
+        throw new Error('cordova.js included multiple times.');
+    }
+    context._cordovaJsLoaded = true;
+
+    var channel = require('cordova/channel');
+    var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady];
+
+    function logUnfiredChannels(arr) {
+        for (var i = 0; i < arr.length; ++i) {
+            if (arr[i].state != 2) {
+                console.log('Channel not fired: ' + arr[i].type);
+            }
+        }
+    }
+
+    window.setTimeout(function() {
+        if (channel.onDeviceReady.state != 2) {
+            console.log('deviceready has not fired after 5 seconds.');
+            logUnfiredChannels(platformInitChannelsArray);
+            logUnfiredChannels(channel.deviceReadyChannelsArray);
+        }
+    }, 5000);
+
+    // Replace navigator before any modules are required(), to ensure it happens as soon as possible.
+    // We replace it so that properties that can't be clobbered can instead be overridden.
+    function replaceNavigator(origNavigator) {
+        var CordovaNavigator = function() {};
+        CordovaNavigator.prototype = origNavigator;
+        var newNavigator = new CordovaNavigator();
+        // This work-around really only applies to new APIs that are newer than Function.bind.
+        // Without it, APIs such as getGamepads() break.
+        if (CordovaNavigator.bind) {
+            for (var key in origNavigator) {
+                if (typeof origNavigator[key] == 'function') {
+                    newNavigator[key] = origNavigator[key].bind(origNavigator);
+                }
+            }
+        }
+        return newNavigator;
+    }
+    if (context.navigator) {
+        context.navigator = replaceNavigator(context.navigator);
+    }
+
+    // _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();
+    }
+
+    /**
+     * Create all cordova objects once native side is ready.
+     */
+    channel.join(function() {
+        // Call the platform-specific initialization
+        require('cordova/platform').initialize();
+
+        // Fire event to notify that all objects are created
+        channel.onCordovaReady.fire();
+
+        // Fire onDeviceReady event once page has fully loaded, all
+        // constructors have run and cordova info has been received from native
+        // side.
+        // This join call is deliberately made after platform.initialize() in
+        // order that plugins may manipulate channel.deviceReadyChannelsArray
+        // if necessary.
+        channel.join(function() {
+            require('cordova').fireDocumentEvent('deviceready');
+        }, channel.deviceReadyChannelsArray);
+
+    }, platformInitChannelsArray);
+
+}(window));
+
+// file: lib/scripts/bootstrap-tizen.js
+
+require('cordova/channel').onNativeReady.fire();
+
+// file: lib/scripts/plugin_loader.js
+
+// Tries to load all plugins' js-modules.
+// This is an async process, but onDeviceReady is blocked on onPluginsReady.
+// onPluginsReady is fired when there are no plugins to load, or they are all done.
+(function (context) {
+    // To be populated with the handler by handlePluginsObject.
+    var onScriptLoadingComplete;
+
+    var scriptCounter = 0;
+    function scriptLoadedCallback() {
+        scriptCounter--;
+        if (scriptCounter === 0) {
+            onScriptLoadingComplete && onScriptLoadingComplete();
+        }
+    }
+
+    function scriptErrorCallback(err) {
+        // Open Question: If a script path specified in cordova_plugins.js does not exist, do we fail for all?
+        // this is currently just continuing.
+        scriptCounter--;
+        if (scriptCounter === 0) {
+            onScriptLoadingComplete && onScriptLoadingComplete();
+        }
+    }
+
+    // Helper function to inject a <script> tag.
+    function injectScript(path) {
+        scriptCounter++;
+        var script = document.createElement("script");
+        script.onload = scriptLoadedCallback;
+        script.onerror = scriptErrorCallback;
+        script.src = path;
+        document.head.appendChild(script);
+    }
+
+    // Called when:
+    // * There are plugins defined and all plugins are finished loading.
+    // * There are no plugins to load.
+    function finishPluginLoading() {
+        context.cordova.require('cordova/channel').onPluginsReady.fire();
+    }
+
+    // Handler for the cordova_plugins.js content.
+    // See plugman's plugin_loader.js for the details of this object.
+    // This function is only called if the really is a plugins array that isn't empty.
+    // Otherwise the onerror response handler will just call finishPluginLoading().
+    function handlePluginsObject(modules, path) {
+        // First create the callback for when all plugins are loaded.
+        var mapper = context.cordova.require('cordova/modulemapper');
+        onScriptLoadingComplete = function() {
+            // Loop through all the plugins and then through their clobbers and merges.
+            for (var i = 0; i < modules.length; i++) {
+                var module = modules[i];
+                if (module) {
+                    try { 
+                        if (module.clobbers && module.clobbers.length) {
+                            for (var j = 0; j < module.clobbers.length; j++) {
+                                mapper.clobbers(module.id, module.clobbers[j]);
+                            }
+                        }
+
+                        if (module.merges && module.merges.length) {
+                            for (var k = 0; k < module.merges.length; k++) {
+                                mapper.merges(module.id, module.merges[k]);
+                            }
+                        }
+
+                        // Finally, if runs is truthy we want to simply require() the module.
+                        // This can be skipped if it had any merges or clobbers, though,
+                        // since the mapper will already have required the module.
+                        if (module.runs && !(module.clobbers && module.clobbers.length) && !(module.merges && module.merges.length)) {
+                            context.cordova.require(module.id);
+                        }
+                    }
+                    catch(err) {
+                        // error with module, most likely clobbers, should we continue?
+                    }
+                }
+            }
+
+            finishPluginLoading();
+        };
+
+        // Now inject the scripts.
+        for (var i = 0; i < modules.length; i++) {
+            injectScript(path + modules[i].file);
+        }
+    }
+
+    // Find the root of the app
+    var path = '';
+    var scripts = document.getElementsByTagName('script');
+    var term = 'cordova.js';
+    for (var n = scripts.length-1; n>-1; n--) {
+        var src = scripts[n].src;
+        if (src.indexOf(term) == (src.length - term.length)) {
+            path = src.substring(0, src.length - term.length);
+            break;
+        }
+    }
+
+    var plugins_json = path + 'cordova_plugins.json';
+    var plugins_js = path + 'cordova_plugins.js';
+
+    // One some phones (Windows) this xhr.open throws an Access Denied exception
+    // So lets keep trying, but with a script tag injection technique instead of XHR
+    var injectPluginScript = function injectPluginScript() {
+        try {
+            var script = document.createElement("script");
+            script.onload = function(){
+                var list = cordova.require("cordova/plugin_list");
+                handlePluginsObject(list,path);
+            };
+            script.onerror = function() {
+                // Error loading cordova_plugins.js, file not found or something
+                // this is an acceptable error, pre-3.0.0, so we just move on.
+                finishPluginLoading();
+            };
+            script.src = plugins_js;
+            document.head.appendChild(script);
+
+        } catch(err){
+            finishPluginLoading();
+        }
+    } 
+
+
+    // Try to XHR the cordova_plugins.json file asynchronously.
+    var xhr = new XMLHttpRequest();
+    xhr.onload = function() {
+        // If the response is a JSON string which composes an array, call handlePluginsObject.
+        // If the request fails, or the response is not a JSON array, just call finishPluginLoading.
+        var obj;
+        try {
+            obj = (this.status == 0 || this.status == 200) && this.responseText && JSON.parse(this.responseText);
+        } catch (err) {
+            // obj will be undefined.
+        }
+        if (Array.isArray(obj) && obj.length > 0) {
+            handlePluginsObject(obj, path);
+        } else {
+            finishPluginLoading();
+        }
+    };
+    xhr.onerror = function() {
+        // In this case, the json file was not present, but XHR was allowed, 
+        // so we should still try the script injection technique with the js file
+        // in case that is there.
+        injectPluginScript();
+    };
+    try { // we commented we were going to try, so let us actually try and catch
+        xhr.open('GET', plugins_json, true); // Async
+        xhr.send();
+    } catch(err){
+        injectPluginScript();
+    }
+}(window));
+
+
+})();
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/css/cordova-tizen.css b/templates/CordovaTizenWebUIFrameworkTemplate/project/css/cordova-tizen.css
new file mode 100644
index 0000000..4c9c07d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/css/cordova-tizen.css
@@ -0,0 +1,83 @@
+/*
+ *
+ * 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.
+ *
+*/
+
+.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;
+}
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/css/style.css b/templates/CordovaTizenWebUIFrameworkTemplate/project/css/style.css
new file mode 100644
index 0000000..77f9f52
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/css/style.css
@@ -0,0 +1,23 @@
+/*
+ *
+ * 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.
+ *
+*/
+
+body {
+}
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/icon.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/icon.png
new file mode 100644
index 0000000..c6fdaac
--- /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..969b1a9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/index.html
@@ -0,0 +1,81 @@
+<!--
+
+ 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.
+
+-->
+
+<!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/latest/js/jquery.js"></script>
+    <script src="tizen-web-ui-fw/latest/js/tizen-web-ui-fw-libs.js"></script>
+    <script src="tizen-web-ui-fw/latest/js/tizen-web-ui-fw.js"
+        data-framework-theme="tizen-white"></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(){ ... });
+    -->
+    
+    <link rel="stylesheet" type="text/css" href="./css/style.css"/>
+    <link rel="stylesheet" type="text/css" href="./css/cordova-tizen.css" />
+    
+    <script type="text/javascript" src="cordova-2.9.0.js"></script>
+    <script type="text/javascript" src="./js/main.js"></script>
+    
+</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/.DS_Store b/templates/CordovaTizenWebUIFrameworkTemplate/project/js/.DS_Store
new file mode 100644
index 0000000..5008ddf
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/js/.DS_Store
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/js/main.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/js/main.js
new file mode 100644
index 0000000..1d00216
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/js/main.js
@@ -0,0 +1,49 @@
+/*
+ *
+ * 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.
+ *
+*/
+
+var deviceReady = false;
+
+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 !!!");
+        }
+    }, 5000);
+    
+    $("#myButton").click(function () {
+        $(this).remove();
+        $("#myInfo").show();
+        window.addEventListener("batterystatus", function(info) {
+            $("#myInfo").text("Level = " + info.level + "%, Status: " + ((info.isPlugged) ? "Plugged" : "Unplugged"));
+        }, false);
+    });
+};
+
+$(document).bind('pageinit', init);
+
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/VERSION b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/VERSION
new file mode 100644
index 0000000..860e057
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/VERSION
@@ -0,0 +1 @@
+0.2.50
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.af-ZA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.af-ZA.js
new file mode 100644
index 0000000..8588aef
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.af.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.af.js
new file mode 100644
index 0000000..0f17c0d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.am-ET.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.am-ET.js
new file mode 100644
index 0000000..e603a0b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.am.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.am.js
new file mode 100644
index 0000000..fe1a37c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ar-AE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ar-AE.js
new file mode 100644
index 0000000..fdf1a51
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ar-BH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ar-BH.js
new file mode 100644
index 0000000..b073e2c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ar-DZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ar-DZ.js
new file mode 100644
index 0000000..75eaa7f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ar-EG.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ar-EG.js
new file mode 100644
index 0000000..9d2365c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ar-IQ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ar-IQ.js
new file mode 100644
index 0000000..0235336
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ar-JO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ar-JO.js
new file mode 100644
index 0000000..152ce08
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ar-KW.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ar-KW.js
new file mode 100644
index 0000000..07d1f89
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ar-LB.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ar-LB.js
new file mode 100644
index 0000000..8c82f5a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ar-LY.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ar-LY.js
new file mode 100644
index 0000000..5c16db8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ar-MA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ar-MA.js
new file mode 100644
index 0000000..483eba8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ar-OM.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ar-OM.js
new file mode 100644
index 0000000..630fef0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ar-QA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ar-QA.js
new file mode 100644
index 0000000..69839a2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ar-SA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ar-SA.js
new file mode 100644
index 0000000..86c73cd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ar-SY.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ar-SY.js
new file mode 100644
index 0000000..1444e7e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ar-TN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ar-TN.js
new file mode 100644
index 0000000..47eb3ca
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ar-YE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ar-YE.js
new file mode 100644
index 0000000..2d25f2f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ar.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ar.js
new file mode 100644
index 0000000..31938bd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.arn-CL.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.arn-CL.js
new file mode 100644
index 0000000..12a7ebe
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.arn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.arn.js
new file mode 100644
index 0000000..9839cd9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.as-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.as-IN.js
new file mode 100644
index 0000000..ead83ba
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.as.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.as.js
new file mode 100644
index 0000000..f20cccf
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.az-Cyrl-AZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.az-Cyrl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.az-Cyrl.js
new file mode 100644
index 0000000..786b81f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.az-Latn-AZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.az-Latn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.az-Latn.js
new file mode 100644
index 0000000..a8175c2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.az.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.az.js
new file mode 100644
index 0000000..94c9ad0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ba-RU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ba-RU.js
new file mode 100644
index 0000000..b5f9559
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ba.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ba.js
new file mode 100644
index 0000000..b026451
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.be-BY.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.be-BY.js
new file mode 100644
index 0000000..9f736f2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.be.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.be.js
new file mode 100644
index 0000000..422a644
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.bg-BG.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.bg-BG.js
new file mode 100644
index 0000000..bf3e085
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.bg.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.bg.js
new file mode 100644
index 0000000..06574e6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.bn-BD.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.bn-BD.js
new file mode 100644
index 0000000..7f746f8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.bn-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.bn-IN.js
new file mode 100644
index 0000000..169e4af
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.bn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.bn.js
new file mode 100644
index 0000000..9a07ddb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.bo-CN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.bo-CN.js
new file mode 100644
index 0000000..b337e02
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.bo.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.bo.js
new file mode 100644
index 0000000..f36be06
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.br-FR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.br-FR.js
new file mode 100644
index 0000000..73a711c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.br.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.br.js
new file mode 100644
index 0000000..cac444b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.bs-Cyrl-BA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.bs-Cyrl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.bs-Cyrl.js
new file mode 100644
index 0000000..47d2fa5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.bs-Latn-BA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.bs-Latn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.bs-Latn.js
new file mode 100644
index 0000000..f962bb3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.bs.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.bs.js
new file mode 100644
index 0000000..3fac524
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ca-ES.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ca-ES.js
new file mode 100644
index 0000000..b882330
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ca.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ca.js
new file mode 100644
index 0000000..5b515d8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.co-FR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.co-FR.js
new file mode 100644
index 0000000..203fecb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.co.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.co.js
new file mode 100644
index 0000000..885b5af
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.cs-CZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.cs-CZ.js
new file mode 100644
index 0000000..fd1c5c3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.cs.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.cs.js
new file mode 100644
index 0000000..4d6397b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.cy-GB.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.cy-GB.js
new file mode 100644
index 0000000..83e37b6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.cy.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.cy.js
new file mode 100644
index 0000000..fdaba63
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.da-DK.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.da-DK.js
new file mode 100644
index 0000000..703722c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.da.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.da.js
new file mode 100644
index 0000000..259e63e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.de-AT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.de-AT.js
new file mode 100644
index 0000000..d00ffc5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.de-CH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.de-CH.js
new file mode 100644
index 0000000..4cd202a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.de-DE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.de-DE.js
new file mode 100644
index 0000000..5466bd7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.de-LI.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.de-LI.js
new file mode 100644
index 0000000..b821044
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.de-LU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.de-LU.js
new file mode 100644
index 0000000..76f5feb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.de.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.de.js
new file mode 100644
index 0000000..a2183ac
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.dsb-DE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.dsb-DE.js
new file mode 100644
index 0000000..04ad511
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.dsb.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.dsb.js
new file mode 100644
index 0000000..f75129e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.dv-MV.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.dv-MV.js
new file mode 100644
index 0000000..367a759
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.dv.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.dv.js
new file mode 100644
index 0000000..04043e8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.el-GR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.el-GR.js
new file mode 100644
index 0000000..a598e0d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.el.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.el.js
new file mode 100644
index 0000000..7ab0a51
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.en-029.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.en-029.js
new file mode 100644
index 0000000..28a1705
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.en-AU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.en-AU.js
new file mode 100644
index 0000000..8c62088
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.en-BZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.en-BZ.js
new file mode 100644
index 0000000..1dd1ba6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.en-CA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.en-CA.js
new file mode 100644
index 0000000..7e0bab3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.en-GB.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.en-GB.js
new file mode 100644
index 0000000..5167db7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.en-IE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.en-IE.js
new file mode 100644
index 0000000..52772b1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.en-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.en-IN.js
new file mode 100644
index 0000000..8dd0d36
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.en-JM.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.en-JM.js
new file mode 100644
index 0000000..f1442b7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.en-MY.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.en-MY.js
new file mode 100644
index 0000000..5d6b8cc
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.en-NZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.en-NZ.js
new file mode 100644
index 0000000..08c28e9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.en-PH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.en-PH.js
new file mode 100644
index 0000000..8be79eb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.en-SG.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.en-SG.js
new file mode 100644
index 0000000..a4aaf12
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.en-TT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.en-TT.js
new file mode 100644
index 0000000..1ac4aa5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.en-US.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.en-US.js
new file mode 100644
index 0000000..0958d1d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.en-ZA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.en-ZA.js
new file mode 100644
index 0000000..64f2a0c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.en-ZW.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.en-ZW.js
new file mode 100644
index 0000000..8323c62
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-AR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-AR.js
new file mode 100644
index 0000000..853296f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-BO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-BO.js
new file mode 100644
index 0000000..f784f68
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-CL.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-CL.js
new file mode 100644
index 0000000..769ad2c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-CO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-CO.js
new file mode 100644
index 0000000..fb75fc9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-CR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-CR.js
new file mode 100644
index 0000000..13b90cf
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-DO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-DO.js
new file mode 100644
index 0000000..33a4f99
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-EC.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-EC.js
new file mode 100644
index 0000000..c2779ea
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-ES.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-ES.js
new file mode 100644
index 0000000..8a5b3df
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-GT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-GT.js
new file mode 100644
index 0000000..1e55ce6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-HN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-HN.js
new file mode 100644
index 0000000..d392d64
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-MX.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-MX.js
new file mode 100644
index 0000000..7cbf393
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-NI.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-NI.js
new file mode 100644
index 0000000..1b4a4c1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-PA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-PA.js
new file mode 100644
index 0000000..6369ea7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-PE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-PE.js
new file mode 100644
index 0000000..b0261ac
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-PR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-PR.js
new file mode 100644
index 0000000..63774f9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-PY.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-PY.js
new file mode 100644
index 0000000..6a1eed0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-SV.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-SV.js
new file mode 100644
index 0000000..4b4d088
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-US.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-US.js
new file mode 100644
index 0000000..2e4a89a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-UY.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-UY.js
new file mode 100644
index 0000000..50d6a2b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es-VE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es-VE.js
new file mode 100644
index 0000000..445181d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.es.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.es.js
new file mode 100644
index 0000000..6441bcd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.et-EE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.et-EE.js
new file mode 100644
index 0000000..6164b31
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.et.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.et.js
new file mode 100644
index 0000000..bf3384f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.eu-ES.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.eu-ES.js
new file mode 100644
index 0000000..2a98ef6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.eu.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.eu.js
new file mode 100644
index 0000000..ab2f3d9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.fa-IR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.fa-IR.js
new file mode 100644
index 0000000..3386f5f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.fa.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.fa.js
new file mode 100644
index 0000000..580eac1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.fi-FI.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.fi-FI.js
new file mode 100644
index 0000000..09f0dad
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.fi.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.fi.js
new file mode 100644
index 0000000..e8fa06c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.fil-PH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.fil-PH.js
new file mode 100644
index 0000000..3e6c8fa
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.fil.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.fil.js
new file mode 100644
index 0000000..6e4509f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.fo-FO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.fo-FO.js
new file mode 100644
index 0000000..68783ce
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.fo.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.fo.js
new file mode 100644
index 0000000..7b98c7d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.fr-BE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.fr-BE.js
new file mode 100644
index 0000000..e5d5b9b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.fr-CA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.fr-CA.js
new file mode 100644
index 0000000..d91d60e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.fr-CH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.fr-CH.js
new file mode 100644
index 0000000..89d416b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.fr-FR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.fr-FR.js
new file mode 100644
index 0000000..ddd833a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.fr-LU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.fr-LU.js
new file mode 100644
index 0000000..1a3408f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.fr-MC.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.fr-MC.js
new file mode 100644
index 0000000..a487097
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.fr.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.fr.js
new file mode 100644
index 0000000..a6ce16e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.fy-NL.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.fy-NL.js
new file mode 100644
index 0000000..bf16672
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.fy.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.fy.js
new file mode 100644
index 0000000..7d617a0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ga-IE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ga-IE.js
new file mode 100644
index 0000000..dabd2ca
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ga.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ga.js
new file mode 100644
index 0000000..b7df294
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.gd-GB.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.gd-GB.js
new file mode 100644
index 0000000..3716169
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.gd.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.gd.js
new file mode 100644
index 0000000..7c0c35b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.gl-ES.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.gl-ES.js
new file mode 100644
index 0000000..2f30b61
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.gl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.gl.js
new file mode 100644
index 0000000..a1fd8f1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.gsw-FR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.gsw-FR.js
new file mode 100644
index 0000000..a6528d3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.gsw.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.gsw.js
new file mode 100644
index 0000000..8eca7be
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.gu-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.gu-IN.js
new file mode 100644
index 0000000..b6c4009
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.gu.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.gu.js
new file mode 100644
index 0000000..cab1c0e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ha-Latn-NG.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.ha-Latn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ha-Latn.js
new file mode 100644
index 0000000..049ca5a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ha.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ha.js
new file mode 100644
index 0000000..07f4be8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.he-IL.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.he-IL.js
new file mode 100644
index 0000000..b0bd6b8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.he.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.he.js
new file mode 100644
index 0000000..bca17f3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.hi-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.hi-IN.js
new file mode 100644
index 0000000..7e228b2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.hi.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.hi.js
new file mode 100644
index 0000000..15dc5d4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.hr-BA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.hr-BA.js
new file mode 100644
index 0000000..63ff67e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.hr-HR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.hr-HR.js
new file mode 100644
index 0000000..f63a459
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.hr.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.hr.js
new file mode 100644
index 0000000..747e76c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.hsb-DE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.hsb-DE.js
new file mode 100644
index 0000000..8588f95
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.hsb.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.hsb.js
new file mode 100644
index 0000000..a6ce654
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.hu-HU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.hu-HU.js
new file mode 100644
index 0000000..e48037a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.hu.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.hu.js
new file mode 100644
index 0000000..5db2111
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.hy-AM.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.hy-AM.js
new file mode 100644
index 0000000..d4b0e3f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.hy.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.hy.js
new file mode 100644
index 0000000..914d70f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.id-ID.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.id-ID.js
new file mode 100644
index 0000000..7f7c890
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.id.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.id.js
new file mode 100644
index 0000000..278522d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ig-NG.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ig-NG.js
new file mode 100644
index 0000000..444f59f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ig.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ig.js
new file mode 100644
index 0000000..bce5771
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ii-CN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ii-CN.js
new file mode 100644
index 0000000..7157e36
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ii.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ii.js
new file mode 100644
index 0000000..6aace19
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.is-IS.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.is-IS.js
new file mode 100644
index 0000000..7af9121
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.is.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.is.js
new file mode 100644
index 0000000..971e18a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.it-CH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.it-CH.js
new file mode 100644
index 0000000..e231c2f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.it-IT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.it-IT.js
new file mode 100644
index 0000000..42ec54a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.it.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.it.js
new file mode 100644
index 0000000..34594b0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.iu-Cans-CA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.iu-Cans.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.iu-Cans.js
new file mode 100644
index 0000000..62f15ab
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.iu-Latn-CA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.iu-Latn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.iu-Latn.js
new file mode 100644
index 0000000..d2e54fa
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.iu.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.iu.js
new file mode 100644
index 0000000..093956b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ja-JP.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ja-JP.js
new file mode 100644
index 0000000..a9469d7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ja.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ja.js
new file mode 100644
index 0000000..1539f99
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ka-GE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ka-GE.js
new file mode 100644
index 0000000..97b767b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ka.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ka.js
new file mode 100644
index 0000000..6e19adf
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.kk-KZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.kk-KZ.js
new file mode 100644
index 0000000..138d486
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.kk.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.kk.js
new file mode 100644
index 0000000..7530988
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.kl-GL.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.kl-GL.js
new file mode 100644
index 0000000..03b9637
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.kl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.kl.js
new file mode 100644
index 0000000..cf71fed
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.km-KH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.km-KH.js
new file mode 100644
index 0000000..6c2ea1c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.km.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.km.js
new file mode 100644
index 0000000..b3d9b4c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.kn-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.kn-IN.js
new file mode 100644
index 0000000..23b8684
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.kn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.kn.js
new file mode 100644
index 0000000..43322e2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ko-KR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ko-KR.js
new file mode 100644
index 0000000..ce97685
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ko.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ko.js
new file mode 100644
index 0000000..a0a7376
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.kok-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.kok-IN.js
new file mode 100644
index 0000000..ec8cab9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.kok.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.kok.js
new file mode 100644
index 0000000..65a3678
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ky-KG.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ky-KG.js
new file mode 100644
index 0000000..3c35abd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ky.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ky.js
new file mode 100644
index 0000000..7bc386b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.lb-LU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.lb-LU.js
new file mode 100644
index 0000000..ef9d39a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.lb.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.lb.js
new file mode 100644
index 0000000..56983ff
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.lo-LA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.lo-LA.js
new file mode 100644
index 0000000..5556d3c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.lo.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.lo.js
new file mode 100644
index 0000000..bea14aa
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.lt-LT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.lt-LT.js
new file mode 100644
index 0000000..d0d31a3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.lt.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.lt.js
new file mode 100644
index 0000000..e06d87f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.lv-LV.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.lv-LV.js
new file mode 100644
index 0000000..145329b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.lv.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.lv.js
new file mode 100644
index 0000000..5065722
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.mi-NZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.mi-NZ.js
new file mode 100644
index 0000000..03720c9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.mi.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.mi.js
new file mode 100644
index 0000000..5f861db
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.mk-MK.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.mk-MK.js
new file mode 100644
index 0000000..f0d5e51
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.mk.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.mk.js
new file mode 100644
index 0000000..a6f8210
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ml-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ml-IN.js
new file mode 100644
index 0000000..3a915e5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ml.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ml.js
new file mode 100644
index 0000000..183a223
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.mn-Cyrl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.mn-Cyrl.js
new file mode 100644
index 0000000..9493c43
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.mn-MN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.mn-MN.js
new file mode 100644
index 0000000..90577b4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.mn-Mong-CN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.mn-Mong.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.mn-Mong.js
new file mode 100644
index 0000000..a263973
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.mn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.mn.js
new file mode 100644
index 0000000..acc45c4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.moh-CA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.moh-CA.js
new file mode 100644
index 0000000..ebea792
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.moh.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.moh.js
new file mode 100644
index 0000000..e8fa748
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.mr-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.mr-IN.js
new file mode 100644
index 0000000..b671dca
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.mr.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.mr.js
new file mode 100644
index 0000000..2a59f15
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ms-BN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ms-BN.js
new file mode 100644
index 0000000..61bedd0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ms-MY.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ms-MY.js
new file mode 100644
index 0000000..d6d916d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ms.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ms.js
new file mode 100644
index 0000000..033e5d2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.mt-MT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.mt-MT.js
new file mode 100644
index 0000000..bb7d40e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.mt.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.mt.js
new file mode 100644
index 0000000..b742360
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.nb-NO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.nb-NO.js
new file mode 100644
index 0000000..4961cb1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.nb.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.nb.js
new file mode 100644
index 0000000..31e3144
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ne-NP.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ne-NP.js
new file mode 100644
index 0000000..6b40800
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ne.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ne.js
new file mode 100644
index 0000000..874982f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.nl-BE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.nl-BE.js
new file mode 100644
index 0000000..c9f93c7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.nl-NL.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.nl-NL.js
new file mode 100644
index 0000000..263d5af
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.nl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.nl.js
new file mode 100644
index 0000000..560fa97
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.nn-NO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.nn-NO.js
new file mode 100644
index 0000000..921debf
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.nn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.nn.js
new file mode 100644
index 0000000..9942d9e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.no.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.no.js
new file mode 100644
index 0000000..e1131df
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.nso-ZA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.nso-ZA.js
new file mode 100644
index 0000000..ad3afa0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.nso.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.nso.js
new file mode 100644
index 0000000..76621b8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.oc-FR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.oc-FR.js
new file mode 100644
index 0000000..6681813
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.oc.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.oc.js
new file mode 100644
index 0000000..34705f0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.or-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.or-IN.js
new file mode 100644
index 0000000..f773323
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.or.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.or.js
new file mode 100644
index 0000000..55581bd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.pa-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.pa-IN.js
new file mode 100644
index 0000000..fa6672a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.pa.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.pa.js
new file mode 100644
index 0000000..f0f1bd5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.pl-PL.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.pl-PL.js
new file mode 100644
index 0000000..59b4330
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.pl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.pl.js
new file mode 100644
index 0000000..5b09eca
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.prs-AF.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.prs-AF.js
new file mode 100644
index 0000000..d487690
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.prs.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.prs.js
new file mode 100644
index 0000000..5111acc
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ps-AF.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ps-AF.js
new file mode 100644
index 0000000..15e57f0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ps.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ps.js
new file mode 100644
index 0000000..73e4c93
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.pt-BR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.pt-BR.js
new file mode 100644
index 0000000..ccbb632
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.pt-PT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.pt-PT.js
new file mode 100644
index 0000000..d521e23
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.pt.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.pt.js
new file mode 100644
index 0000000..5a83321
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.qut-GT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.qut-GT.js
new file mode 100644
index 0000000..93bcffb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.qut.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.qut.js
new file mode 100644
index 0000000..5d5790b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.quz-BO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.quz-BO.js
new file mode 100644
index 0000000..313a9ad
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.quz-EC.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.quz-EC.js
new file mode 100644
index 0000000..0b75b40
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.quz-PE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.quz-PE.js
new file mode 100644
index 0000000..5187503
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.quz.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.quz.js
new file mode 100644
index 0000000..fef7426
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.rm-CH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.rm-CH.js
new file mode 100644
index 0000000..9191f4b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.rm.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.rm.js
new file mode 100644
index 0000000..0cbe7d3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ro-RO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ro-RO.js
new file mode 100644
index 0000000..e36fe53
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ro.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ro.js
new file mode 100644
index 0000000..9cbe26a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ru-RU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ru-RU.js
new file mode 100644
index 0000000..c44493e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ru.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ru.js
new file mode 100644
index 0000000..e3f4750
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.rw-RW.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.rw-RW.js
new file mode 100644
index 0000000..7aa4cbc
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.rw.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.rw.js
new file mode 100644
index 0000000..c86c2e9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sa-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sa-IN.js
new file mode 100644
index 0000000..5408ab5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sa.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sa.js
new file mode 100644
index 0000000..3fb8cea
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sah-RU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sah-RU.js
new file mode 100644
index 0000000..17f487f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sah.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sah.js
new file mode 100644
index 0000000..ff1b18e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.se-FI.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.se-FI.js
new file mode 100644
index 0000000..424df67
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.se-NO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.se-NO.js
new file mode 100644
index 0000000..ccdb630
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.se-SE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.se-SE.js
new file mode 100644
index 0000000..b085955
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.se.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.se.js
new file mode 100644
index 0000000..c80207b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.si-LK.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.si-LK.js
new file mode 100644
index 0000000..9a114ed
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.si.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.si.js
new file mode 100644
index 0000000..724dc61
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sk-SK.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sk-SK.js
new file mode 100644
index 0000000..6bc1656
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sk.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sk.js
new file mode 100644
index 0000000..0fd4334
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sl-SI.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sl-SI.js
new file mode 100644
index 0000000..9cfb1f9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sl.js
new file mode 100644
index 0000000..ebfa588
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sma-NO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sma-NO.js
new file mode 100644
index 0000000..80879ff
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sma-SE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sma-SE.js
new file mode 100644
index 0000000..36747ff
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sma.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sma.js
new file mode 100644
index 0000000..284bf37
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.smj-NO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.smj-NO.js
new file mode 100644
index 0000000..d6556e5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.smj-SE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.smj-SE.js
new file mode 100644
index 0000000..4b3f8a2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.smj.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.smj.js
new file mode 100644
index 0000000..fe1e50f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.smn-FI.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.smn-FI.js
new file mode 100644
index 0000000..8226968
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.smn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.smn.js
new file mode 100644
index 0000000..ce7bcf8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sms-FI.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sms-FI.js
new file mode 100644
index 0000000..441c2f3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sms.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sms.js
new file mode 100644
index 0000000..990e43f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sq-AL.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sq-AL.js
new file mode 100644
index 0000000..f90be76
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sq.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sq.js
new file mode 100644
index 0000000..0e9c6b8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sr-Cyrl-BA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.sr-Cyrl-CS.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.sr-Cyrl-ME.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.sr-Cyrl-RS.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.sr-Cyrl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sr-Cyrl.js
new file mode 100644
index 0000000..cde93e1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sr-Latn-BA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.sr-Latn-CS.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.sr-Latn-ME.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.sr-Latn-RS.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.sr-Latn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sr-Latn.js
new file mode 100644
index 0000000..ae10f74
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sr.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sr.js
new file mode 100644
index 0000000..b74cd89
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sv-FI.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sv-FI.js
new file mode 100644
index 0000000..74aeca9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sv-SE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sv-SE.js
new file mode 100644
index 0000000..85e5a20
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sv.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sv.js
new file mode 100644
index 0000000..313eaf7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sw-KE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sw-KE.js
new file mode 100644
index 0000000..8df3960
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.sw.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.sw.js
new file mode 100644
index 0000000..c5cfe84
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.syr-SY.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.syr-SY.js
new file mode 100644
index 0000000..1ef86ec
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.syr.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.syr.js
new file mode 100644
index 0000000..74ea704
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ta-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ta-IN.js
new file mode 100644
index 0000000..63b16fe
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ta.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ta.js
new file mode 100644
index 0000000..e67c57f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.te-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.te-IN.js
new file mode 100644
index 0000000..b1b92ee
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.te.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.te.js
new file mode 100644
index 0000000..be5becb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.tg-Cyrl-TJ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.tg-Cyrl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.tg-Cyrl.js
new file mode 100644
index 0000000..30fa290
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.tg.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.tg.js
new file mode 100644
index 0000000..df4f26b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.th-TH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.th-TH.js
new file mode 100644
index 0000000..3ab70ab
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.th.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.th.js
new file mode 100644
index 0000000..1294351
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.tk-TM.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.tk-TM.js
new file mode 100644
index 0000000..8abafa0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.tk.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.tk.js
new file mode 100644
index 0000000..2727041
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.tn-ZA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.tn-ZA.js
new file mode 100644
index 0000000..32c861d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.tn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.tn.js
new file mode 100644
index 0000000..e331578
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.tr-TR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.tr-TR.js
new file mode 100644
index 0000000..0fb93f8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.tr.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.tr.js
new file mode 100644
index 0000000..a2ef8a5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.tt-RU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.tt-RU.js
new file mode 100644
index 0000000..b918faa
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.tt.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.tt.js
new file mode 100644
index 0000000..efefad6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.tzm-Latn-DZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.tzm-Latn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.tzm-Latn.js
new file mode 100644
index 0000000..6e30aa6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.tzm.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.tzm.js
new file mode 100644
index 0000000..176f0c9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ug-CN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ug-CN.js
new file mode 100644
index 0000000..dcfd852
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ug.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ug.js
new file mode 100644
index 0000000..5ea5a5a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.uk-UA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.uk-UA.js
new file mode 100644
index 0000000..ffd012a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.uk.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.uk.js
new file mode 100644
index 0000000..3aba558
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ur-PK.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ur-PK.js
new file mode 100644
index 0000000..befd62f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.ur.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.ur.js
new file mode 100644
index 0000000..ce12613
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.uz-Cyrl-UZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.uz-Cyrl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.uz-Cyrl.js
new file mode 100644
index 0000000..90d5f45
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.uz-Latn-UZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/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/latest/js/cultures/globalize.culture.uz-Latn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.uz-Latn.js
new file mode 100644
index 0000000..95a717e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.uz.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.uz.js
new file mode 100644
index 0000000..50bf9ce
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.vi-VN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.vi-VN.js
new file mode 100644
index 0000000..bc28d7a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.vi.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.vi.js
new file mode 100644
index 0000000..d0cec0b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.wo-SN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.wo-SN.js
new file mode 100644
index 0000000..e2def20
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.wo.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.wo.js
new file mode 100644
index 0000000..f2d4edb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.xh-ZA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.xh-ZA.js
new file mode 100644
index 0000000..4101be6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.xh.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.xh.js
new file mode 100644
index 0000000..8325e61
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.yo-NG.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.yo-NG.js
new file mode 100644
index 0000000..39af5b8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.yo.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.yo.js
new file mode 100644
index 0000000..b5e24cd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.zh-CHS.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.zh-CHS.js
new file mode 100644
index 0000000..c843bc8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.zh-CHT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.zh-CHT.js
new file mode 100644
index 0000000..7ca37c9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.zh-CN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.zh-CN.js
new file mode 100644
index 0000000..41e6294
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.zh-HK.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.zh-HK.js
new file mode 100644
index 0000000..dd769ca
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.zh-Hans.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.zh-Hans.js
new file mode 100644
index 0000000..8569374
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.zh-Hant.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.zh-Hant.js
new file mode 100644
index 0000000..44ba865
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.zh-MO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.zh-MO.js
new file mode 100644
index 0000000..e09274f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.zh-SG.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.zh-SG.js
new file mode 100644
index 0000000..8e99e6d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.zh-TW.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.zh-TW.js
new file mode 100644
index 0000000..22eea14
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.zh.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.zh.js
new file mode 100644
index 0000000..2bab388
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.zu-ZA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.zu-ZA.js
new file mode 100644
index 0000000..348cda6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.culture.zu.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.culture.zu.js
new file mode 100644
index 0000000..78873a5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/cultures/globalize.cultures.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/cultures/globalize.cultures.js
new file mode 100644
index 0000000..32b7d58
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/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/latest/js/jquery.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/jquery.js
new file mode 100644
index 0000000..12c7797
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/jquery.js
@@ -0,0 +1,9440 @@
+/*!
+ * jQuery JavaScript Library v1.8.2
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: Thu Sep 20 2012 21:13:05 GMT-0400 (Eastern Daylight Time)
+ */
+(function( window, undefined ) {
+var
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// Use the correct document accordingly with window argument (sandbox)
+	document = window.document,
+	location = window.location,
+	navigator = window.navigator,
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// Save a reference to some core methods
+	core_push = Array.prototype.push,
+	core_slice = Array.prototype.slice,
+	core_indexOf = Array.prototype.indexOf,
+	core_toString = Object.prototype.toString,
+	core_hasOwn = Object.prototype.hasOwnProperty,
+	core_trim = String.prototype.trim,
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Used for matching numbers
+	core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
+
+	// Used for detecting and trimming whitespace
+	core_rnotwhite = /\S/,
+	core_rspace = /\s+/,
+
+	// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
+
+	// Matches dashed string for camelizing
+	rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([\da-z])/gi,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return ( letter + "" ).toUpperCase();
+	},
+
+	// The ready event handler and self cleanup method
+	DOMContentLoaded = function() {
+		if ( document.addEventListener ) {
+			document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+			jQuery.ready();
+		} else if ( document.readyState === "complete" ) {
+			// we're here because readyState === "complete" in oldIE
+			// which is good enough for us to call the dom ready!
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	},
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			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 = rquickExpr.exec( selector );
+			}
+
+			// Match html or make sure no context is specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = ( context && context.nodeType ? context.ownerDocument || context : document );
+
+					// scripts is true for back-compat
+					selector = jQuery.parseHTML( match[1], doc, true );
+					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+						this.attr.call( selector, context, true );
+					}
+
+					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.8.2",
+
+	// 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 core_slice.call( this );
+	},
+
+	// 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 = jQuery.merge( this.constructor(), 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 ) {
+		// Add the callback
+		jQuery.ready.promise().done( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		i = +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( core_slice.apply( this, arguments ),
+			"slice", core_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: core_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 ) {
+
+		// Abort if there are pending holds or we're already ready
+		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+			return;
+		}
+
+		// 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").off("ready");
+		}
+	},
+
+	// 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";
+	},
+
+	isWindow: function( obj ) {
+		return obj != null && obj == obj.window;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ core_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 &&
+				!core_hasOwn.call(obj, "constructor") &&
+				!core_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 || core_hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		var name;
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	// data: string of html
+	// context (optional): If specified, the fragment will be created in this context, defaults to document
+	// scripts (optional): If true, will include scripts passed in the html string
+	parseHTML: function( data, context, scripts ) {
+		var parsed;
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		if ( typeof context === "boolean" ) {
+			scripts = context;
+			context = 0;
+		}
+		context = context || document;
+
+		// Single tag
+		if ( (parsed = rsingleTag.exec( data )) ) {
+			return [ context.createElement( parsed[1] ) ];
+		}
+
+		parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
+		return jQuery.merge( [],
+			(parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
+	},
+
+	parseJSON: function( data ) {
+		if ( !data || typeof data !== "string") {
+			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;
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		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 && core_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.toLowerCase() === name.toLowerCase();
+	},
+
+	// args is for internal usage only
+	each: function( obj, callback, args ) {
+		var name,
+			i = 0,
+			length = obj.length,
+			isObj = length === undefined || jQuery.isFunction( obj );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in obj ) {
+					if ( callback.apply( obj[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( obj[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in obj ) {
+					if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+		function( text ) {
+			return text == null ?
+				"" :
+				core_trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				( text + "" ).replace( rtrim, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( arr, results ) {
+		var type,
+			ret = results || [];
+
+		if ( arr != null ) {
+			// The window, strings (and functions) also have 'length'
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			type = jQuery.type( arr );
+
+			if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
+				core_push.call( ret, arr );
+			} else {
+				jQuery.merge( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		var len;
+
+		if ( arr ) {
+			if ( core_indexOf ) {
+				return core_indexOf.call( arr, elem, i );
+			}
+
+			len = arr.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in arr && arr[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var l = second.length,
+			i = first.length,
+			j = 0;
+
+		if ( typeof l === "number" ) {
+			for ( ; 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 retVal,
+			ret = [],
+			i = 0,
+			length = elems.length;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; 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 ) {
+		var tmp, args, proxy;
+
+		if ( typeof context === "string" ) {
+			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
+		args = core_slice.call( arguments, 2 );
+		proxy = function() {
+			return fn.apply( context, args.concat( core_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 || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Multifunctional method to get and set values of a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
+		var exec,
+			bulk = key == null,
+			i = 0,
+			length = elems.length;
+
+		// Sets many values
+		if ( key && typeof key === "object" ) {
+			for ( i in key ) {
+				jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
+			}
+			chainable = 1;
+
+		// Sets one value
+		} else if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = pass === undefined && jQuery.isFunction( value );
+
+			if ( bulk ) {
+				// Bulk operations only iterate when executing function values
+				if ( exec ) {
+					exec = fn;
+					fn = function( elem, key, value ) {
+						return exec.call( jQuery( elem ), value );
+					};
+
+				// Otherwise they run against the entire set
+				} else {
+					fn.call( elems, value );
+					fn = null;
+				}
+			}
+
+			if ( fn ) {
+				for (; i < length; i++ ) {
+					fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+				}
+			}
+
+			chainable = 1;
+		}
+
+		return chainable ?
+			elems :
+
+			// Gets
+			bulk ?
+				fn.call( elems ) :
+				length ? fn( elems[0], key ) : emptyGet;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	}
+});
+
+jQuery.ready.promise = function( obj ) {
+	if ( !readyList ) {
+
+		readyList = jQuery.Deferred();
+
+		// Catch cases where $(document).ready() is called after the browser event has already occurred.
+		// we once tried to use readyState "interactive" here, but it caused issues like the one
+		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			setTimeout( jQuery.ready, 1 );
+
+		// Standards-based browsers support DOMContentLoaded
+		} else 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 {
+			// 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 top = false;
+
+			try {
+				top = window.frameElement == null && document.documentElement;
+			} catch(e) {}
+
+			if ( top && top.doScroll ) {
+				(function doScrollCheck() {
+					if ( !jQuery.isReady ) {
+
+						try {
+							// Use the trick by Diego Perini
+							// http://javascript.nwbox.com/IEContentLoaded/
+							top.doScroll("left");
+						} catch(e) {
+							return setTimeout( doScrollCheck, 50 );
+						}
+
+						// and execute any waiting functions
+						jQuery.ready();
+					}
+				})();
+			}
+		}
+	}
+	return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+	var object = optionsCache[ options ] = {};
+	jQuery.each( options.split( core_rspace ), function( _, flag ) {
+		object[ flag ] = true;
+	});
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	options: an optional list of space-separated options that will change how
+ *			the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+	// Convert options from String-formatted to Object-formatted if needed
+	// (we check in cache first)
+	options = typeof options === "string" ?
+		( optionsCache[ options ] || createOptions( options ) ) :
+		jQuery.extend( {}, options );
+
+	var // Last fire value (for non-forgettable lists)
+		memory,
+		// Flag to know if list was already fired
+		fired,
+		// Flag to know if list is currently firing
+		firing,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = !options.once && [],
+		// Fire callbacks
+		fire = function( data ) {
+			memory = options.memory && data;
+			fired = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			firing = true;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+					memory = false; // To prevent further calls using add
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( stack ) {
+					if ( stack.length ) {
+						fire( stack.shift() );
+					}
+				} else if ( memory ) {
+					list = [];
+				} else {
+					self.disable();
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					// First, we save the current length
+					var start = list.length;
+					(function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							var type = jQuery.type( arg );
+							if ( type === "function" && ( !options.unique || !self.has( arg ) ) ) {
+								list.push( arg );
+							} else if ( arg && arg.length && type !== "string" ) {
+								// Inspect recursively
+								add( arg );
+							}
+						});
+					})( arguments );
+					// Do we need to add the callbacks to the
+					// current firing batch?
+					if ( firing ) {
+						firingLength = list.length;
+					// With memory, if we're not firing then
+					// we should call right away
+					} else if ( memory ) {
+						firingStart = start;
+						fire( memory );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					jQuery.each( arguments, function( _, arg ) {
+						var index;
+						while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+							list.splice( index, 1 );
+							// Handle firing indexes
+							if ( firing ) {
+								if ( index <= firingLength ) {
+									firingLength--;
+								}
+								if ( index <= firingIndex ) {
+									firingIndex--;
+								}
+							}
+						}
+					});
+				}
+				return this;
+			},
+			// Control if a given callback is in the list
+			has: function( fn ) {
+				return jQuery.inArray( fn, list ) > -1;
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				return this;
+			},
+			// Have the list do nothing anymore
+			disable: function() {
+				list = stack = memory = undefined;
+				return this;
+			},
+			// Is it disabled?
+			disabled: function() {
+				return !list;
+			},
+			// Lock the list in its current state
+			lock: function() {
+				stack = undefined;
+				if ( !memory ) {
+					self.disable();
+				}
+				return this;
+			},
+			// Is it locked?
+			locked: function() {
+				return !stack;
+			},
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				args = args || [];
+				args = [ context, args.slice ? args.slice() : args ];
+				if ( list && ( !fired || stack ) ) {
+					if ( firing ) {
+						stack.push( args );
+					} else {
+						fire( args );
+					}
+				}
+				return this;
+			},
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var tuples = [
+				// action, add listener, listener list, final state
+				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+				[ "notify", "progress", jQuery.Callbacks("memory") ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				then: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( tuples, function( i, tuple ) {
+							var action = tuple[ 0 ],
+								fn = fns[ i ];
+							// deferred[ done | fail | progress ] for forwarding actions to newDefer
+							deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
+								function() {
+									var returned = fn.apply( this, arguments );
+									if ( returned && jQuery.isFunction( returned.promise ) ) {
+										returned.promise()
+											.done( newDefer.resolve )
+											.fail( newDefer.reject )
+											.progress( newDefer.notify );
+									} else {
+										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+									}
+								} :
+								newDefer[ action ]
+							);
+						});
+						fns = null;
+					}).promise();
+				},
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					return obj != null ? jQuery.extend( obj, promise ) : promise;
+				}
+			},
+			deferred = {};
+
+		// Keep pipe for back-compat
+		promise.pipe = promise.then;
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 3 ];
+
+			// promise[ done | fail | progress ] = list.add
+			promise[ tuple[1] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add(function() {
+					// state = [ resolved | rejected ]
+					state = stateString;
+
+				// [ reject_list | resolve_list ].disable; progress_list.lock
+				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+			}
+
+			// deferred[ resolve | reject | notify ] = list.fire
+			deferred[ tuple[0] ] = list.fire;
+			deferred[ tuple[0] + "With" ] = list.fireWith;
+		});
+
+		// Make the deferred a promise
+		promise.promise( deferred );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( subordinate /* , ..., subordinateN */ ) {
+		var i = 0,
+			resolveValues = core_slice.call( arguments ),
+			length = resolveValues.length,
+
+			// the count of uncompleted subordinates
+			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+			// Update function for both resolve and progress values
+			updateFunc = function( i, contexts, values ) {
+				return function( value ) {
+					contexts[ i ] = this;
+					values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+					if( values === progressValues ) {
+						deferred.notifyWith( contexts, values );
+					} else if ( !( --remaining ) ) {
+						deferred.resolveWith( contexts, values );
+					}
+				};
+			},
+
+			progressValues, progressContexts, resolveContexts;
+
+		// add listeners to Deferred subordinates; treat others as resolved
+		if ( length > 1 ) {
+			progressValues = new Array( length );
+			progressContexts = new Array( length );
+			resolveContexts = new Array( length );
+			for ( ; i < length; i++ ) {
+				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+					resolveValues[ i ].promise()
+						.done( updateFunc( i, resolveContexts, resolveValues ) )
+						.fail( deferred.reject )
+						.progress( updateFunc( i, progressContexts, progressValues ) );
+				} else {
+					--remaining;
+				}
+			}
+		}
+
+		// if we're not waiting on anything, resolve the master
+		if ( !remaining ) {
+			deferred.resolveWith( resolveContexts, resolveValues );
+		}
+
+		return deferred.promise();
+	}
+});
+jQuery.support = (function() {
+
+	var support,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		fragment,
+		eventName,
+		i,
+		isSupported,
+		clickFn,
+		div = document.createElement("div");
+
+	// Preliminary tests
+	div.setAttribute( "className", "t" );
+	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+	all = div.getElementsByTagName("*");
+	a = div.getElementsByTagName("a")[ 0 ];
+	a.style.cssText = "top:1px;float:left;opacity:.5";
+
+	// Can't get basic test support
+	if ( !all || !all.length ) {
+		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.5/.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",
+
+		// Tests for enctype support on a form(#6743)
+		enctype: !!document.createElement("form").enctype,
+
+		// Makes sure cloning an html5 element does not cause problems
+		// Where outerHTML is undefined, this still works
+		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+		// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
+		boxModel: ( document.compatMode === "CSS1Compat" ),
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true,
+		boxSizingReliable: true,
+		pixelPosition: false
+	};
+
+	// 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", clickFn = function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent("onclick");
+		div.detachEvent( "onclick", clickFn );
+	}
+
+	// Check if a radio maintains its 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" );
+
+	// #11217 - WebKit loses check when the name is after the checked attribute
+	input.setAttribute( "name", "t" );
+
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.lastChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	fragment.removeChild( input );
+	fragment.appendChild( div );
+
+	// Technique from Juriy Zaytsev
+	// http://perfectionkills.com/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: true,
+			change: true,
+			focusin: true
+		}) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, div, tds, marginDiv,
+			divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		container = document.createElement("div");
+		container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
+		body.insertBefore( container, body.firstChild );
+
+		// Construct the test element
+		div = document.createElement("div");
+		container.appendChild( div );
+
+		// 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)
+		div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName("td");
+		tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+		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 );
+
+		// Check box-sizing and margin behavior
+		div.innerHTML = "";
+		div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+		support.boxSizing = ( div.offsetWidth === 4 );
+		support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
+
+		// NOTE: To any future maintainer, we've window.getComputedStyle
+		// because jsdom on node.js will break without it.
+		if ( window.getComputedStyle ) {
+			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+			// 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
+			marginDiv = document.createElement("div");
+			marginDiv.style.cssText = div.style.cssText = divReset;
+			marginDiv.style.marginRight = marginDiv.style.width = "0";
+			div.style.width = "1px";
+			div.appendChild( marginDiv );
+			support.reliableMarginRight =
+				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+		}
+
+		if ( typeof div.style.zoom !== "undefined" ) {
+			// 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.innerHTML = "";
+			div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+			// Check if elements with layout shrink-wrap their children
+			// (IE 6 does this)
+			div.style.display = "block";
+			div.style.overflow = "visible";
+			div.innerHTML = "<div></div>";
+			div.firstChild.style.width = "5px";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+			container.style.zoom = 1;
+		}
+
+		// Null elements to avoid leaks in IE
+		body.removeChild( container );
+		container = div = tds = marginDiv = null;
+	});
+
+	// Null elements to avoid leaks in IE
+	fragment.removeChild( div );
+	all = a = select = opt = input = fragment = div = null;
+
+	return support;
+})();
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	deletedIds: [],
+
+	// Remove at next major release (1.9/2.0)
+	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[ internalKey ] : elem[ internalKey ] && internalKey;
+
+		// 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 || !cache[id] || (!pvt && !cache[id].data)) && 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[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
+			} else {
+				id = internalKey;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// 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 ] = jQuery.extend( cache[ id ], name );
+			} else {
+				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+			}
+		}
+
+		thisCache = cache[ id ];
+
+		// jQuery data() is stored in a separate object inside the object's internal data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data.
+		if ( !pvt ) {
+			if ( !thisCache.data ) {
+				thisCache.data = {};
+			}
+
+			thisCache = thisCache.data;
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// 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, i, l,
+
+			isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+			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 ] : cache[ id ].data;
+
+			if ( thisCache ) {
+
+				// Support array or space separated string names for data keys
+				if ( !jQuery.isArray( name ) ) {
+
+					// try the string as a key before any manipulation
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+
+						// split the camel cased version by spaces unless a key with the spaces exists
+						name = jQuery.camelCase( name );
+						if ( name in thisCache ) {
+							name = [ name ];
+						} else {
+							name = name.split(" ");
+						}
+					}
+				}
+
+				for ( i = 0, l = name.length; i < l; i++ ) {
+					delete thisCache[ name[i] ];
+				}
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( !pvt ) {
+			delete cache[ id ].data;
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject( cache[ id ] ) ) {
+				return;
+			}
+		}
+
+		// Destroy the cache
+		if ( isNode ) {
+			jQuery.cleanData( [ elem ], true );
+
+		// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+		} else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+			delete cache[ id ];
+
+		// When all else fails, null
+		} else {
+			cache[ id ] = 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 ) {
+		var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+		// nodes accept data unless otherwise specified; rejection can be conditional
+		return !noData || noData !== true && elem.getAttribute("classid") === noData;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var parts, part, attr, name, l,
+			elem = this[0],
+			i = 0,
+			data = null;
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = jQuery.data( elem );
+
+				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+					attr = elem.attributes;
+					for ( l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( !name.indexOf( "data-" ) ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( elem, name, data[ name ] );
+						}
+					}
+					jQuery._data( elem, "parsedAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		parts = key.split( ".", 2 );
+		parts[1] = parts[1] ? "." + parts[1] : "";
+		part = parts[1] + "!";
+
+		return jQuery.access( this, function( value ) {
+
+			if ( value === undefined ) {
+				data = this.triggerHandler( "getData" + part, [ parts[0] ] );
+
+				// Try to fetch any internally stored data first
+				if ( data === undefined && elem ) {
+					data = jQuery.data( elem, key );
+					data = dataAttr( elem, key, data );
+				}
+
+				return data === undefined && parts[1] ?
+					this.data( parts[0] ) :
+					data;
+			}
+
+			parts[1] = value;
+			this.each(function() {
+				var self = jQuery( this );
+
+				self.triggerHandler( "setData" + part, parts );
+				jQuery.data( this, key, value );
+				self.triggerHandler( "changeData" + part, parts );
+			});
+		}, null, value, arguments.length > 1, null, false );
+	},
+
+	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 :
+				// Only convert to a number if it doesn't change the string
+				+data + "" === data ? +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;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	var name;
+	for ( name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+jQuery.extend({
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || jQuery.isArray(data) ) {
+					queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+				} else {
+					queue.push( data );
+				}
+			}
+			return queue || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			startLength = queue.length,
+			fn = queue.shift(),
+			hooks = jQuery._queueHooks( elem, type ),
+			next = function() {
+				jQuery.dequeue( elem, type );
+			};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+			startLength--;
+		}
+
+		if ( fn ) {
+
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			// clear up the last queue stop function
+			delete hooks.stop;
+			fn.call( elem, next, hooks );
+		}
+
+		if ( !startLength && hooks ) {
+			hooks.empty.fire();
+		}
+	},
+
+	// not intended for public consumption - generates a queueHooks object, or returns the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+			empty: jQuery.Callbacks("once memory").add(function() {
+				jQuery.removeData( elem, type + "queue", true );
+				jQuery.removeData( elem, key, true );
+			})
+		});
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[0], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each(function() {
+				var queue = jQuery.queue( this, type, data );
+
+				// ensure a hooks for this queue
+				jQuery._queueHooks( this, type );
+
+				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( next, hooks ) {
+			var timeout = setTimeout( next, time );
+			hooks.stop = function() {
+				clearTimeout( timeout );
+			};
+		});
+	},
+	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, obj ) {
+		var tmp,
+			count = 1,
+			defer = jQuery.Deferred(),
+			elements = this,
+			i = this.length,
+			resolve = function() {
+				if ( !( --count ) ) {
+					defer.resolveWith( elements, [ elements ] );
+				}
+			};
+
+		if ( typeof type !== "string" ) {
+			obj = type;
+			type = undefined;
+		}
+		type = type || "fx";
+
+		while( i-- ) {
+			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+});
+var nodeHook, boolHook, fixSpecified,
+	rclass = /[\t\r\n]/g,
+	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,
+	getSetAttribute = jQuery.support.getSetAttribute;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	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( core_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 ] + " " ) < 0 ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var removes, className, elem, c, cl, i, l;
+
+		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 ) {
+			removes = ( value || "" ).split( core_rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+				if ( elem.nodeType === 1 && elem.className ) {
+
+					className = (" " + elem.className + " ").replace( rclass, " " );
+
+					// loop over each item in the removal list
+					for ( c = 0, cl = removes.length; c < cl; c++ ) {
+						// Remove until there is nothing to remove,
+						while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) {
+							className = className.replace( " " + removes[ c ] + " " , " " );
+						}
+					}
+					elem.className = value ? jQuery.trim( 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( core_rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space separated 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 + " ",
+			i = 0,
+			l = this.length;
+		for ( ; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[0];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				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;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var val,
+				self = jQuery(this);
+
+			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.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// 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, i, max, option,
+					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
+				i = one ? index : 0;
+				max = one ? index + 1 : options.length;
+				for ( ; i < max; i++ ) {
+					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;
+			}
+		}
+	},
+
+	// Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
+	attrFn: {},
+
+	attr: function( elem, name, value, pass ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( notxml ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+
+			} 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, value ) {
+		var propName, attrNames, name, isBool,
+			i = 0;
+
+		if ( value && elem.nodeType === 1 ) {
+
+			attrNames = value.split( core_rspace );
+
+			for ( ; i < attrNames.length; i++ ) {
+				name = attrNames[ i ];
+
+				if ( name ) {
+					propName = jQuery.propFix[ name ] || name;
+					isBool = rboolean.test( name );
+
+					// See #9699 for explanation of this approach (setting first, then removal)
+					// Do not do this for boolean attributes (see #10870)
+					if ( !isBool ) {
+						jQuery.attr( elem, name, "" );
+					}
+					elem.removeAttribute( getSetAttribute ? name : propName );
+
+					// Set corresponding property to false for boolean attributes
+					if ( isBool && propName 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 ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		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;
+			}
+		}
+	}
+});
+
+// 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,
+			property = jQuery.prop( elem, name );
+		return property === true || typeof property !== "boolean" && ( 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 ( !getSetAttribute ) {
+
+	fixSpecified = {
+		name: true,
+		id: true,
+		coords: true
+	};
+
+	// 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 ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
+				ret.value :
+				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.value = 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;
+				}
+			}
+		});
+	});
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		get: nodeHook.get,
+		set: function( elem, value, name ) {
+			if ( value === "" ) {
+				value = "false";
+			}
+			nodeHook.set( elem, value, name );
+		}
+	};
+}
+
+
+// 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;
+		}
+	});
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// 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 rformElems = /^(?:textarea|input|select)$/i,
+	rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
+	rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	hoverHack = function( events ) {
+		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+	};
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var elemData, eventHandle, events,
+			t, tns, type, namespaces, handleObj,
+			handleObjIn, handlers, special;
+
+		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
+		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		events = elemData.events;
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+		eventHandle = elemData.handle;
+		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.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = jQuery.trim( hoverHack(types) ).split( " " );
+		for ( t = 0; t < types.length; t++ ) {
+
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = tns[1];
+			namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend({
+				type: type,
+				origType: tns[1],
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+				namespace: namespaces.join(".")
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			handlers = events[ type ];
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// 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 to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever 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, selector, mappedTypes ) {
+
+		var t, tns, type, origType, namespaces, origCount,
+			j, events, special, eventType, handleObj,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+		for ( t = 0; t < types.length; t++ ) {
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tns[1];
+			namespaces = tns[2];
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector? special.delegateType : special.bindType ) || type;
+			eventType = events[ type ] || [];
+			origCount = eventType.length;
+			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+
+			// Remove matching events
+			for ( j = 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					 ( !handler || handler.guid === handleObj.guid ) &&
+					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+					eventType.splice( j--, 1 );
+
+					if ( handleObj.selector ) {
+						eventType.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( eventType.length === 0 && origCount !== eventType.length ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			delete elemData.handle;
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery.removeData( elem, "events", 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 ) {
+		// Don't do events on text and comment nodes
+		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+			return;
+		}
+
+		// Event object or event type
+		var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
+			type = event.type || event,
+			namespaces = [];
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		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.isTrigger = true;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join( "." );
+		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+		// Handle a global trigger
+		if ( !elem ) {
+
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			cache = jQuery.cache;
+			for ( i in cache ) {
+				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+				}
+			}
+			return;
+		}
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			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 );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		eventPath = [[ elem, special.bindType || type ]];
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+			for ( old = elem; cur; cur = cur.parentNode ) {
+				eventPath.push([ cur, bubbleType ]);
+				old = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( old === (elem.ownerDocument || document) ) {
+				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+			}
+		}
+
+		// Fire handlers on the event path
+		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+			cur = eventPath[i][0];
+			event.type = eventPath[i][1];
+
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+			// Note that this is a bare JS function and not a jQuery handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
+				event.preventDefault();
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === 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.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				// IE<9 dies on focus/blur to hidden element (#1486)
+				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					old = elem[ ontype ];
+
+					if ( old ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					elem[ type ]();
+					jQuery.event.triggered = undefined;
+
+					if ( old ) {
+						elem[ ontype ] = old;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event || window.event );
+
+		var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
+			handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+			delegateCount = handlers.delegateCount,
+			args = core_slice.call( arguments ),
+			run_all = !event.exclusive && !event.namespace,
+			special = jQuery.event.special[ event.type ] || {},
+			handlerQueue = [];
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[0] = event;
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers that should run if there are delegated events
+		// Avoid non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && !(event.button && event.type === "click") ) {
+
+			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+
+				// Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.disabled !== true || event.type !== "click" ) {
+					selMatch = {};
+					matches = [];
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+						sel = handleObj.selector;
+
+						if ( selMatch[ sel ] === undefined ) {
+							selMatch[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) >= 0 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( selMatch[ sel ] ) {
+							matches.push( handleObj );
+						}
+					}
+					if ( matches.length ) {
+						handlerQueue.push({ elem: cur, matches: matches });
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( handlers.length > delegateCount ) {
+			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+		}
+
+		// Run delegates first; they may want to stop propagation beneath us
+		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+			matched = handlerQueue[ i ];
+			event.currentTarget = matched.elem;
+
+			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+				handleObj = matched.matches[ j ];
+
+				// Triggered event must either 1) be non-exclusive and have no namespace, or
+				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+					event.data = handleObj.data;
+					event.handleObj = handleObj;
+
+					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+							.apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						event.result = ret;
+						if ( ret === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+	fixHooks: {},
+
+	keyHooks: {
+		props: "char charCode key keyCode".split(" "),
+		filter: function( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var eventDoc, doc, body,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop,
+			originalEvent = event,
+			fixHook = jQuery.event.fixHooks[ event.type ] || {},
+			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = jQuery.Event( originalEvent );
+
+		for ( i = copy.length; i; ) {
+			prop = copy[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Target should not be a text node (#504, Safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
+		event.metaKey = !!event.metaKey;
+
+		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	special: {
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+
+		focus: {
+			delegateType: "focusin"
+		},
+		blur: {
+			delegateType: "focusout"
+		},
+
+		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;
+				}
+			}
+		}
+	},
+
+	simulate: function( type, elem, event, bubble ) {
+		// 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.
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{ type: type,
+				isSimulated: true,
+				originalEvent: {}
+			}
+		);
+		if ( bubble ) {
+			jQuery.event.trigger( e, null, elem );
+		} else {
+			jQuery.event.dispatch.call( elem, e );
+		}
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		var name = "on" + type;
+
+		if ( elem.detachEvent ) {
+
+			// #8545, #7054, preventing memory leaks for custom events in IE6-8 –
+			// detachEvent needed property on element, by name of that event, to properly expose it to GC
+			if ( typeof elem[ name ] === "undefined" ) {
+				elem[ name ] = null;
+			}
+
+			elem.detachEvent( name, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !(this instanceof jQuery.Event) ) {
+		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 );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.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
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var ret,
+				target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj,
+				selector = handleObj.selector;
+
+			// For mousenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !jQuery._data( form, "_submit_attached" ) ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						event._submit_bubble = true;
+					});
+					jQuery._data( form, "_submit_attached", true );
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+
+		postDispatch: function( event ) {
+			// If form was submitted by the user, bubble the event up the tree
+			if ( event._submit_bubble ) {
+				delete event._submit_bubble;
+				if ( this.parentNode && !event.isTrigger ) {
+					jQuery.event.simulate( "submit", this.parentNode, event, true );
+				}
+			}
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+						}
+						// Allow triggered, simulated change events (#11500)
+						jQuery.event.simulate( "change", this, event, true );
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					jQuery._data( elem, "_change_attached", true );
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return !rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// 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,
+			handler = function( event ) {
+				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+			};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+	});
+}
+
+jQuery.fn.extend({
+
+	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+		var origFn, type;
+
+		// Types can be a map of types/handlers
+		if ( typeof types === "object" ) {
+			// ( types-Object, selector, data )
+			if ( typeof selector !== "string" ) { // && selector != null
+				// ( types-Object, data )
+				data = data || selector;
+				selector = undefined;
+			}
+			for ( type in types ) {
+				this.on( type, selector, data, types[ type ], one );
+			}
+			return this;
+		}
+
+		if ( data == null && fn == null ) {
+			// ( types, fn )
+			fn = selector;
+			data = selector = undefined;
+		} else if ( fn == null ) {
+			if ( typeof selector === "string" ) {
+				// ( types, selector, fn )
+				fn = data;
+				data = undefined;
+			} else {
+				// ( types, data, fn )
+				fn = data;
+				data = selector;
+				selector = undefined;
+			}
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		} else if ( !fn ) {
+			return this;
+		}
+
+		if ( one === 1 ) {
+			origFn = fn;
+			fn = function( event ) {
+				// Can use an empty set, since event contains the info
+				jQuery().off( event );
+				return origFn.apply( this, arguments );
+			};
+			// Use same guid so caller can remove using origFn
+			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+		}
+		return this.each( function() {
+			jQuery.event.add( this, types, fn, data, selector );
+		});
+	},
+	one: function( types, selector, data, fn ) {
+		return this.on( types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		var handleObj, type;
+		if ( types && types.preventDefault && types.handleObj ) {
+			// ( event )  dispatched jQuery.Event
+			handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+			// ( types-object [, selector] )
+			for ( type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each(function() {
+			jQuery.event.remove( this, types, fn, selector );
+		});
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	live: function( types, data, fn ) {
+		jQuery( this.context ).on( types, this.selector, data, fn );
+		return this;
+	},
+	die: function( types, fn ) {
+		jQuery( this.context ).off( types, this.selector || "**", fn );
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+	},
+
+	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 );
+	}
+});
+
+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 contextmenu").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.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( rkeyEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+	}
+
+	if ( rmouseEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+	}
+});
+/*!
+ * Sizzle CSS Selector Engine
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://sizzlejs.com/
+ */
+(function( window, undefined ) {
+
+var cachedruns,
+	assertGetIdNotName,
+	Expr,
+	getText,
+	isXML,
+	contains,
+	compile,
+	sortOrder,
+	hasDuplicate,
+	outermostContext,
+
+	baseHasDuplicate = true,
+	strundefined = "undefined",
+
+	expando = ( "sizcache" + Math.random() ).replace( ".", "" ),
+
+	Token = String,
+	document = window.document,
+	docElem = document.documentElement,
+	dirruns = 0,
+	done = 0,
+	pop = [].pop,
+	push = [].push,
+	slice = [].slice,
+	// Use a stripped-down indexOf if a native one is unavailable
+	indexOf = [].indexOf || function( elem ) {
+		var i = 0,
+			len = this.length;
+		for ( ; i < len; i++ ) {
+			if ( this[i] === elem ) {
+				return i;
+			}
+		}
+		return -1;
+	},
+
+	// Augment a function for special use by Sizzle
+	markFunction = function( fn, value ) {
+		fn[ expando ] = value == null || value;
+		return fn;
+	},
+
+	createCache = function() {
+		var cache = {},
+			keys = [];
+
+		return markFunction(function( key, value ) {
+			// Only keep the most recent entries
+			if ( keys.push( key ) > Expr.cacheLength ) {
+				delete cache[ keys.shift() ];
+			}
+
+			return (cache[ key ] = value);
+		}, cache );
+	},
+
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+
+	// Regex
+
+	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+	// http://www.w3.org/TR/css3-syntax/#characters
+	characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",
+
+	// Loosely modeled on CSS identifier characters
+	// An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
+	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+	identifier = characterEncoding.replace( "w", "w#" ),
+
+	// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
+	operators = "([*^$|!~]?=)",
+	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
+		"*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
+
+	// Prefer arguments not in parens/brackets,
+	//   then attribute selectors and non-pseudos (denoted by :),
+	//   then anything else
+	// These preferences are here to reduce the number of selectors
+	//   needing tokenize in the PSEUDO preFilter
+	pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",
+
+	// For matchExpr.POS and matchExpr.needsContext
+	pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
+		"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
+	rpseudo = new RegExp( pseudos ),
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,
+
+	rnot = /^:not/,
+	rsibling = /[\x20\t\r\n\f]*[+~]/,
+	rendsWithNot = /:not\($/,
+
+	rheader = /h\d/i,
+	rinputs = /input|select|textarea|button/i,
+
+	rbackslash = /\\(?!\\)/g,
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
+		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+		"NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
+		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+		"ATTR": new RegExp( "^" + attributes ),
+		"PSEUDO": new RegExp( "^" + pseudos ),
+		"POS": new RegExp( pos, "i" ),
+		"CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace +
+			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+		// For use in libraries implementing .is()
+		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )
+	},
+
+	// Support
+
+	// Used for testing something on an element
+	assert = function( fn ) {
+		var div = document.createElement("div");
+
+		try {
+			return fn( div );
+		} catch (e) {
+			return false;
+		} finally {
+			// release memory in IE
+			div = null;
+		}
+	},
+
+	// Check if getElementsByTagName("*") returns only elements
+	assertTagNameNoComments = assert(function( div ) {
+		div.appendChild( document.createComment("") );
+		return !div.getElementsByTagName("*").length;
+	}),
+
+	// Check if getAttribute returns normalized href attributes
+	assertHrefNotNormalized = assert(function( div ) {
+		div.innerHTML = "<a href='#'></a>";
+		return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
+			div.firstChild.getAttribute("href") === "#";
+	}),
+
+	// Check if attributes should be retrieved by attribute nodes
+	assertAttributes = assert(function( div ) {
+		div.innerHTML = "<select></select>";
+		var type = typeof div.lastChild.getAttribute("multiple");
+		// IE8 returns a string for some attributes even when not present
+		return type !== "boolean" && type !== "string";
+	}),
+
+	// Check if getElementsByClassName can be trusted
+	assertUsableClassName = assert(function( div ) {
+		// Opera can't find a second classname (in 9.6)
+		div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
+		if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
+			return false;
+		}
+
+		// Safari 3.2 caches class attributes and doesn't catch changes
+		div.lastChild.className = "e";
+		return div.getElementsByClassName("e").length === 2;
+	}),
+
+	// Check if getElementById returns elements by name
+	// Check if getElementsByName privileges form controls or returns elements by ID
+	assertUsableName = assert(function( div ) {
+		// Inject content
+		div.id = expando + 0;
+		div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
+		docElem.insertBefore( div, docElem.firstChild );
+
+		// Test
+		var pass = document.getElementsByName &&
+			// buggy browsers will return fewer than the correct 2
+			document.getElementsByName( expando ).length === 2 +
+			// buggy browsers will return more than the correct 0
+			document.getElementsByName( expando + 0 ).length;
+		assertGetIdNotName = !document.getElementById( expando );
+
+		// Cleanup
+		docElem.removeChild( div );
+
+		return pass;
+	});
+
+// If slice is not available, provide a backup
+try {
+	slice.call( docElem.childNodes, 0 )[0].nodeType;
+} catch ( e ) {
+	slice = function( i ) {
+		var elem,
+			results = [];
+		for ( ; (elem = this[i]); i++ ) {
+			results.push( elem );
+		}
+		return results;
+	};
+}
+
+function Sizzle( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+	var match, elem, xml, m,
+		nodeType = context.nodeType;
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	if ( nodeType !== 1 && nodeType !== 9 ) {
+		return [];
+	}
+
+	xml = isXML( context );
+
+	if ( !xml && !seed ) {
+		if ( (match = rquickExpr.exec( selector )) ) {
+			// Speed-up: Sizzle("#ID")
+			if ( (m = match[1]) ) {
+				if ( nodeType === 9 ) {
+					elem = context.getElementById( m );
+					// 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, Opera, and Webkit return items
+						// by name instead of ID
+						if ( elem.id === m ) {
+							results.push( elem );
+							return results;
+						}
+					} else {
+						return results;
+					}
+				} else {
+					// Context is not a document
+					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+						contains( context, elem ) && elem.id === m ) {
+						results.push( elem );
+						return results;
+					}
+				}
+
+			// Speed-up: Sizzle("TAG")
+			} else if ( match[2] ) {
+				push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
+				return results;
+
+			// Speed-up: Sizzle(".CLASS")
+			} else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {
+				push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
+				return results;
+			}
+		}
+	}
+
+	// All others
+	return select( selector.replace( rtrim, "$1" ), context, results, seed, xml );
+}
+
+Sizzle.matches = function( expr, elements ) {
+	return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+	return Sizzle( expr, null, null, [ elem ] ).length > 0;
+};
+
+// Returns a function to use in pseudos for input types
+function createInputPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return name === "input" && elem.type === type;
+	};
+}
+
+// Returns a function to use in pseudos for buttons
+function createButtonPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return (name === "input" || name === "button") && elem.type === type;
+	};
+}
+
+// Returns a function to use in pseudos for positionals
+function createPositionalPseudo( fn ) {
+	return markFunction(function( argument ) {
+		argument = +argument;
+		return markFunction(function( seed, matches ) {
+			var j,
+				matchIndexes = fn( [], seed.length, argument ),
+				i = matchIndexes.length;
+
+			// Match elements found at the specified indexes
+			while ( i-- ) {
+				if ( seed[ (j = matchIndexes[i]) ] ) {
+					seed[j] = !(matches[j] = seed[j]);
+				}
+			}
+		});
+	});
+}
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+	var node,
+		ret = "",
+		i = 0,
+		nodeType = elem.nodeType;
+
+	if ( nodeType ) {
+		if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+			// Use textContent for elements
+			// innerText usage removed for consistency of new lines (see #11153)
+			if ( typeof elem.textContent === "string" ) {
+				return elem.textContent;
+			} else {
+				// Traverse its children
+				for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+					ret += getText( elem );
+				}
+			}
+		} else if ( nodeType === 3 || nodeType === 4 ) {
+			return elem.nodeValue;
+		}
+		// Do not include comment or processing instruction nodes
+	} else {
+
+		// If no nodeType, this is expected to be an array
+		for ( ; (node = elem[i]); i++ ) {
+			// Do not traverse comment nodes
+			ret += getText( node );
+		}
+	}
+	return ret;
+};
+
+isXML = 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).documentElement;
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+// Element contains another
+contains = Sizzle.contains = docElem.contains ?
+	function( a, b ) {
+		var adown = a.nodeType === 9 ? a.documentElement : a,
+			bup = b && b.parentNode;
+		return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );
+	} :
+	docElem.compareDocumentPosition ?
+	function( a, b ) {
+		return b && !!( a.compareDocumentPosition( b ) & 16 );
+	} :
+	function( a, b ) {
+		while ( (b = b.parentNode) ) {
+			if ( b === a ) {
+				return true;
+			}
+		}
+		return false;
+	};
+
+Sizzle.attr = function( elem, name ) {
+	var val,
+		xml = isXML( elem );
+
+	if ( !xml ) {
+		name = name.toLowerCase();
+	}
+	if ( (val = Expr.attrHandle[ name ]) ) {
+		return val( elem );
+	}
+	if ( xml || assertAttributes ) {
+		return elem.getAttribute( name );
+	}
+	val = elem.getAttributeNode( name );
+	return val ?
+		typeof elem[ name ] === "boolean" ?
+			elem[ name ] ? name : null :
+			val.specified ? val.value : null :
+		null;
+};
+
+Expr = Sizzle.selectors = {
+
+	// Can be adjusted by the user
+	cacheLength: 50,
+
+	createPseudo: markFunction,
+
+	match: matchExpr,
+
+	// IE6/7 return a modified href
+	attrHandle: assertHrefNotNormalized ?
+		{} :
+		{
+			"href": function( elem ) {
+				return elem.getAttribute( "href", 2 );
+			},
+			"type": function( elem ) {
+				return elem.getAttribute("type");
+			}
+		},
+
+	find: {
+		"ID": assertGetIdNotName ?
+			function( id, context, xml ) {
+				if ( typeof context.getElementById !== strundefined && !xml ) {
+					var m = context.getElementById( id );
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					return m && m.parentNode ? [m] : [];
+				}
+			} :
+			function( id, context, xml ) {
+				if ( typeof context.getElementById !== strundefined && !xml ) {
+					var m = context.getElementById( id );
+
+					return m ?
+						m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
+							[m] :
+							undefined :
+						[];
+				}
+			},
+
+		"TAG": assertTagNameNoComments ?
+			function( tag, context ) {
+				if ( typeof context.getElementsByTagName !== strundefined ) {
+					return context.getElementsByTagName( tag );
+				}
+			} :
+			function( tag, context ) {
+				var results = context.getElementsByTagName( tag );
+
+				// Filter out possible comments
+				if ( tag === "*" ) {
+					var elem,
+						tmp = [],
+						i = 0;
+
+					for ( ; (elem = results[i]); i++ ) {
+						if ( elem.nodeType === 1 ) {
+							tmp.push( elem );
+						}
+					}
+
+					return tmp;
+				}
+				return results;
+			},
+
+		"NAME": assertUsableName && function( tag, context ) {
+			if ( typeof context.getElementsByName !== strundefined ) {
+				return context.getElementsByName( name );
+			}
+		},
+
+		"CLASS": assertUsableClassName && function( className, context, xml ) {
+			if ( typeof context.getElementsByClassName !== strundefined && !xml ) {
+				return context.getElementsByClassName( className );
+			}
+		}
+	},
+
+	relative: {
+		">": { dir: "parentNode", first: true },
+		" ": { dir: "parentNode" },
+		"+": { dir: "previousSibling", first: true },
+		"~": { dir: "previousSibling" }
+	},
+
+	preFilter: {
+		"ATTR": function( match ) {
+			match[1] = match[1].replace( rbackslash, "" );
+
+			// Move the given value to match[3] whether quoted or unquoted
+			match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[3] = " " + match[3] + " ";
+			}
+
+			return match.slice( 0, 4 );
+		},
+
+		"CHILD": function( match ) {
+			/* matches from matchExpr["CHILD"]
+				1 type (only|nth|...)
+				2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+				3 xn-component of xn+y argument ([+-]?\d*n|)
+				4 sign of xn-component
+				5 x of xn-component
+				6 sign of y-component
+				7 y of y-component
+			*/
+			match[1] = match[1].toLowerCase();
+
+			if ( match[1] === "nth" ) {
+				// nth-child requires argument
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				// numeric x and y parameters for Expr.filter.CHILD
+				// remember that false/true cast respectively to 0/1
+				match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );
+				match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );
+
+			// other types prohibit arguments
+			} else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			return match;
+		},
+
+		"PSEUDO": function( match ) {
+			var unquoted, excess;
+			if ( matchExpr["CHILD"].test( match[0] ) ) {
+				return null;
+			}
+
+			if ( match[3] ) {
+				match[2] = match[3];
+			} else if ( (unquoted = match[4]) ) {
+				// Only check arguments that contain a pseudo
+				if ( rpseudo.test(unquoted) &&
+					// Get excess from tokenize (recursively)
+					(excess = tokenize( unquoted, true )) &&
+					// advance to the next closing parenthesis
+					(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+					// excess is a negative index
+					unquoted = unquoted.slice( 0, excess );
+					match[0] = match[0].slice( 0, excess );
+				}
+				match[2] = unquoted;
+			}
+
+			// Return only captures needed by the pseudo filter method (type and argument)
+			return match.slice( 0, 3 );
+		}
+	},
+
+	filter: {
+		"ID": assertGetIdNotName ?
+			function( id ) {
+				id = id.replace( rbackslash, "" );
+				return function( elem ) {
+					return elem.getAttribute("id") === id;
+				};
+			} :
+			function( id ) {
+				id = id.replace( rbackslash, "" );
+				return function( elem ) {
+					var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+					return node && node.value === id;
+				};
+			},
+
+		"TAG": function( nodeName ) {
+			if ( nodeName === "*" ) {
+				return function() { return true; };
+			}
+			nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();
+
+			return function( elem ) {
+				return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+			};
+		},
+
+		"CLASS": function( className ) {
+			var pattern = classCache[ expando ][ className ];
+			if ( !pattern ) {
+				pattern = classCache( className, new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)") );
+			}
+			return function( elem ) {
+				return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
+			};
+		},
+
+		"ATTR": function( name, operator, check ) {
+			return function( elem, context ) {
+				var result = Sizzle.attr( elem, name );
+
+				if ( result == null ) {
+					return operator === "!=";
+				}
+				if ( !operator ) {
+					return true;
+				}
+
+				result += "";
+
+				return operator === "=" ? result === check :
+					operator === "!=" ? result !== check :
+					operator === "^=" ? check && result.indexOf( check ) === 0 :
+					operator === "*=" ? check && result.indexOf( check ) > -1 :
+					operator === "$=" ? check && result.substr( result.length - check.length ) === check :
+					operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+					operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :
+					false;
+			};
+		},
+
+		"CHILD": function( type, argument, first, last ) {
+
+			if ( type === "nth" ) {
+				return function( elem ) {
+					var node, diff,
+						parent = elem.parentNode;
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+
+					if ( parent ) {
+						diff = 0;
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								diff++;
+								if ( elem === node ) {
+									break;
+								}
+							}
+						}
+					}
+
+					// Incorporate the offset (or cast to NaN), then check against cycle size
+					diff -= last;
+					return diff === first || ( diff % first === 0 && diff / first >= 0 );
+				};
+			}
+
+			return function( elem ) {
+				var 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;
+
+						/* falls through */
+					case "last":
+						while ( (node = node.nextSibling) ) {
+							if ( node.nodeType === 1 ) {
+								return false;
+							}
+						}
+
+						return true;
+				}
+			};
+		},
+
+		"PSEUDO": function( pseudo, argument ) {
+			// pseudo-class names are case-insensitive
+			// http://www.w3.org/TR/selectors/#pseudo-classes
+			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+			// Remember that setFilters inherits from pseudos
+			var args,
+				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+					Sizzle.error( "unsupported pseudo: " + pseudo );
+
+			// The user may use createPseudo to indicate that
+			// arguments are needed to create the filter function
+			// just as Sizzle does
+			if ( fn[ expando ] ) {
+				return fn( argument );
+			}
+
+			// But maintain support for old signatures
+			if ( fn.length > 1 ) {
+				args = [ pseudo, pseudo, "", argument ];
+				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+					markFunction(function( seed, matches ) {
+						var idx,
+							matched = fn( seed, argument ),
+							i = matched.length;
+						while ( i-- ) {
+							idx = indexOf.call( seed, matched[i] );
+							seed[ idx ] = !( matches[ idx ] = matched[i] );
+						}
+					}) :
+					function( elem ) {
+						return fn( elem, 0, args );
+					};
+			}
+
+			return fn;
+		}
+	},
+
+	pseudos: {
+		"not": markFunction(function( selector ) {
+			// Trim the selector passed to compile
+			// to avoid treating leading and trailing
+			// spaces as combinators
+			var input = [],
+				results = [],
+				matcher = compile( selector.replace( rtrim, "$1" ) );
+
+			return matcher[ expando ] ?
+				markFunction(function( seed, matches, context, xml ) {
+					var elem,
+						unmatched = matcher( seed, null, xml, [] ),
+						i = seed.length;
+
+					// Match elements unmatched by `matcher`
+					while ( i-- ) {
+						if ( (elem = unmatched[i]) ) {
+							seed[i] = !(matches[i] = elem);
+						}
+					}
+				}) :
+				function( elem, context, xml ) {
+					input[0] = elem;
+					matcher( input, null, xml, results );
+					return !results.pop();
+				};
+		}),
+
+		"has": markFunction(function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		}),
+
+		"contains": markFunction(function( text ) {
+			return function( elem ) {
+				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+			};
+		}),
+
+		"enabled": function( elem ) {
+			return elem.disabled === false;
+		},
+
+		"disabled": function( elem ) {
+			return elem.disabled === true;
+		},
+
+		"checked": function( elem ) {
+			// In CSS3, :checked should return both checked and selected elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			var nodeName = elem.nodeName.toLowerCase();
+			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+		},
+
+		"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 !Expr.pseudos["empty"]( elem );
+		},
+
+		"empty": function( elem ) {
+			// http://www.w3.org/TR/selectors/#empty-pseudo
+			// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
+			//   not comment, processing instructions, or others
+			// Thanks to Diego Perini for the nodeName shortcut
+			//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+			var nodeType;
+			elem = elem.firstChild;
+			while ( elem ) {
+				if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {
+					return false;
+				}
+				elem = elem.nextSibling;
+			}
+			return true;
+		},
+
+		"header": function( elem ) {
+			return rheader.test( elem.nodeName );
+		},
+
+		"text": function( elem ) {
+			var type, attr;
+			// 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" &&
+				(type = elem.type) === "text" &&
+				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );
+		},
+
+		// Input types
+		"radio": createInputPseudo("radio"),
+		"checkbox": createInputPseudo("checkbox"),
+		"file": createInputPseudo("file"),
+		"password": createInputPseudo("password"),
+		"image": createInputPseudo("image"),
+
+		"submit": createButtonPseudo("submit"),
+		"reset": createButtonPseudo("reset"),
+
+		"button": function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && elem.type === "button" || name === "button";
+		},
+
+		"input": function( elem ) {
+			return rinputs.test( elem.nodeName );
+		},
+
+		"focus": function( elem ) {
+			var doc = elem.ownerDocument;
+			return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href);
+		},
+
+		"active": function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		},
+
+		// Positional types
+		"first": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ 0 ];
+		}),
+
+		"last": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ length - 1 ];
+		}),
+
+		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ argument < 0 ? argument + length : argument ];
+		}),
+
+		"even": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			for ( var i = 0; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"odd": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			for ( var i = 1; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		})
+	}
+};
+
+function siblingCheck( a, b, ret ) {
+	if ( a === b ) {
+		return ret;
+	}
+
+	var cur = a.nextSibling;
+
+	while ( cur ) {
+		if ( cur === b ) {
+			return -1;
+		}
+
+		cur = cur.nextSibling;
+	}
+
+	return 1;
+}
+
+sortOrder = docElem.compareDocumentPosition ?
+	function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?
+			a.compareDocumentPosition :
+			a.compareDocumentPosition(b) & 4
+		) ? -1 : 1;
+	} :
+	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 );
+	};
+
+// Always assume the presence of duplicates if sort doesn't
+// pass them to our comparison function (as in Google Chrome).
+[0, 0].sort( sortOrder );
+baseHasDuplicate = !hasDuplicate;
+
+// Document sorting and removing duplicates
+Sizzle.uniqueSort = function( results ) {
+	var elem,
+		i = 1;
+
+	hasDuplicate = baseHasDuplicate;
+	results.sort( sortOrder );
+
+	if ( hasDuplicate ) {
+		for ( ; (elem = results[i]); i++ ) {
+			if ( elem === results[ i - 1 ] ) {
+				results.splice( i--, 1 );
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+function tokenize( selector, parseOnly ) {
+	var matched, match, tokens, type, soFar, groups, preFilters,
+		cached = tokenCache[ expando ][ selector ];
+
+	if ( cached ) {
+		return parseOnly ? 0 : cached.slice( 0 );
+	}
+
+	soFar = selector;
+	groups = [];
+	preFilters = Expr.preFilter;
+
+	while ( soFar ) {
+
+		// Comma and first run
+		if ( !matched || (match = rcomma.exec( soFar )) ) {
+			if ( match ) {
+				soFar = soFar.slice( match[0].length );
+			}
+			groups.push( tokens = [] );
+		}
+
+		matched = false;
+
+		// Combinators
+		if ( (match = rcombinators.exec( soFar )) ) {
+			tokens.push( matched = new Token( match.shift() ) );
+			soFar = soFar.slice( matched.length );
+
+			// Cast descendant combinators to space
+			matched.type = match[0].replace( rtrim, " " );
+		}
+
+		// Filters
+		for ( type in Expr.filter ) {
+			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+				// The last two arguments here are (context, xml) for backCompat
+				(match = preFilters[ type ]( match, document, true ))) ) {
+
+				tokens.push( matched = new Token( match.shift() ) );
+				soFar = soFar.slice( matched.length );
+				matched.type = type;
+				matched.matches = match;
+			}
+		}
+
+		if ( !matched ) {
+			break;
+		}
+	}
+
+	// Return the length of the invalid excess
+	// if we're just parsing
+	// Otherwise, throw an error or return tokens
+	return parseOnly ?
+		soFar.length :
+		soFar ?
+			Sizzle.error( selector ) :
+			// Cache the tokens
+			tokenCache( selector, groups ).slice( 0 );
+}
+
+function addCombinator( matcher, combinator, base ) {
+	var dir = combinator.dir,
+		checkNonElements = base && combinator.dir === "parentNode",
+		doneName = done++;
+
+	return combinator.first ?
+		// Check against closest ancestor/preceding element
+		function( elem, context, xml ) {
+			while ( (elem = elem[ dir ]) ) {
+				if ( checkNonElements || elem.nodeType === 1  ) {
+					return matcher( elem, context, xml );
+				}
+			}
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+			if ( !xml ) {
+				var cache,
+					dirkey = dirruns + " " + doneName + " ",
+					cachedkey = dirkey + cachedruns;
+				while ( (elem = elem[ dir ]) ) {
+					if ( checkNonElements || elem.nodeType === 1 ) {
+						if ( (cache = elem[ expando ]) === cachedkey ) {
+							return elem.sizset;
+						} else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {
+							if ( elem.sizset ) {
+								return elem;
+							}
+						} else {
+							elem[ expando ] = cachedkey;
+							if ( matcher( elem, context, xml ) ) {
+								elem.sizset = true;
+								return elem;
+							}
+							elem.sizset = false;
+						}
+					}
+				}
+			} else {
+				while ( (elem = elem[ dir ]) ) {
+					if ( checkNonElements || elem.nodeType === 1 ) {
+						if ( matcher( elem, context, xml ) ) {
+							return elem;
+						}
+					}
+				}
+			}
+		};
+}
+
+function elementMatcher( matchers ) {
+	return matchers.length > 1 ?
+		function( elem, context, xml ) {
+			var i = matchers.length;
+			while ( i-- ) {
+				if ( !matchers[i]( elem, context, xml ) ) {
+					return false;
+				}
+			}
+			return true;
+		} :
+		matchers[0];
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+	var elem,
+		newUnmatched = [],
+		i = 0,
+		len = unmatched.length,
+		mapped = map != null;
+
+	for ( ; i < len; i++ ) {
+		if ( (elem = unmatched[i]) ) {
+			if ( !filter || filter( elem, context, xml ) ) {
+				newUnmatched.push( elem );
+				if ( mapped ) {
+					map.push( i );
+				}
+			}
+		}
+	}
+
+	return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+	if ( postFilter && !postFilter[ expando ] ) {
+		postFilter = setMatcher( postFilter );
+	}
+	if ( postFinder && !postFinder[ expando ] ) {
+		postFinder = setMatcher( postFinder, postSelector );
+	}
+	return markFunction(function( seed, results, context, xml ) {
+		// Positional selectors apply to seed elements, so it is invalid to follow them with relative ones
+		if ( seed && postFinder ) {
+			return;
+		}
+
+		var i, elem, postFilterIn,
+			preMap = [],
+			postMap = [],
+			preexisting = results.length,
+
+			// Get initial elements from seed or context
+			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [], seed ),
+
+			// Prefilter to get matcher input, preserving a map for seed-results synchronization
+			matcherIn = preFilter && ( seed || !selector ) ?
+				condense( elems, preMap, preFilter, context, xml ) :
+				elems,
+
+			matcherOut = matcher ?
+				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+					// ...intermediate processing is necessary
+					[] :
+
+					// ...otherwise use results directly
+					results :
+				matcherIn;
+
+		// Find primary matches
+		if ( matcher ) {
+			matcher( matcherIn, matcherOut, context, xml );
+		}
+
+		// Apply postFilter
+		if ( postFilter ) {
+			postFilterIn = condense( matcherOut, postMap );
+			postFilter( postFilterIn, [], context, xml );
+
+			// Un-match failing elements by moving them back to matcherIn
+			i = postFilterIn.length;
+			while ( i-- ) {
+				if ( (elem = postFilterIn[i]) ) {
+					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+				}
+			}
+		}
+
+		// Keep seed and results synchronized
+		if ( seed ) {
+			// Ignore postFinder because it can't coexist with seed
+			i = preFilter && matcherOut.length;
+			while ( i-- ) {
+				if ( (elem = matcherOut[i]) ) {
+					seed[ preMap[i] ] = !(results[ preMap[i] ] = elem);
+				}
+			}
+		} else {
+			matcherOut = condense(
+				matcherOut === results ?
+					matcherOut.splice( preexisting, matcherOut.length ) :
+					matcherOut
+			);
+			if ( postFinder ) {
+				postFinder( null, results, matcherOut, xml );
+			} else {
+				push.apply( results, matcherOut );
+			}
+		}
+	});
+}
+
+function matcherFromTokens( tokens ) {
+	var checkContext, matcher, j,
+		len = tokens.length,
+		leadingRelative = Expr.relative[ tokens[0].type ],
+		implicitRelative = leadingRelative || Expr.relative[" "],
+		i = leadingRelative ? 1 : 0,
+
+		// The foundational matcher ensures that elements are reachable from top-level context(s)
+		matchContext = addCombinator( function( elem ) {
+			return elem === checkContext;
+		}, implicitRelative, true ),
+		matchAnyContext = addCombinator( function( elem ) {
+			return indexOf.call( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				(checkContext = context).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+		} ];
+
+	for ( ; i < len; i++ ) {
+		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
+		} else {
+			// The concatenated values are (context, xml) for backCompat
+			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+			// Return special upon seeing a positional matcher
+			if ( matcher[ expando ] ) {
+				// Find the next relative operator (if any) for proper handling
+				j = ++i;
+				for ( ; j < len; j++ ) {
+					if ( Expr.relative[ tokens[j].type ] ) {
+						break;
+					}
+				}
+				return setMatcher(
+					i > 1 && elementMatcher( matchers ),
+					i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),
+					matcher,
+					i < j && matcherFromTokens( tokens.slice( i, j ) ),
+					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+					j < len && tokens.join("")
+				);
+			}
+			matchers.push( matcher );
+		}
+	}
+
+	return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+	var bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, expandContext ) {
+			var elem, j, matcher,
+				setMatched = [],
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				outermost = expandContext != null,
+				contextBackup = outermostContext,
+				// We must always have either seed elements or context
+				elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
+				// Nested matchers should use non-integer dirruns
+				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);
+
+			if ( outermost ) {
+				outermostContext = context !== document && context;
+				cachedruns = superMatcher.el;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			for ( ; (elem = elems[i]) != null; i++ ) {
+				if ( byElement && elem ) {
+					for ( j = 0; (matcher = elementMatchers[j]); j++ ) {
+						if ( matcher( elem, context, xml ) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+						cachedruns = ++superMatcher.el;
+					}
+				}
+
+				// Track unmatched elements for set filters
+				if ( bySet ) {
+					// They will have gone through all possible matchers
+					if ( (elem = !matcher && elem) ) {
+						matchedCount--;
+					}
+
+					// Lengthen the array for every element, matched or not
+					if ( seed ) {
+						unmatched.push( elem );
+					}
+				}
+			}
+
+			// Apply set filters to unmatched elements
+			matchedCount += i;
+			if ( bySet && i !== matchedCount ) {
+				for ( j = 0; (matcher = setMatchers[j]); j++ ) {
+					matcher( unmatched, setMatched, context, xml );
+				}
+
+				if ( seed ) {
+					// Reintegrate element matches to eliminate the need for sorting
+					if ( matchedCount > 0 ) {
+						while ( i-- ) {
+							if ( !(unmatched[i] || setMatched[i]) ) {
+								setMatched[i] = pop.call( results );
+							}
+						}
+					}
+
+					// Discard index placeholder values to get only actual matches
+					setMatched = condense( setMatched );
+				}
+
+				// Add matches to results
+				push.apply( results, setMatched );
+
+				// Seedless set matches succeeding multiple successful matchers stipulate sorting
+				if ( outermost && !seed && setMatched.length > 0 &&
+					( matchedCount + setMatchers.length ) > 1 ) {
+
+					Sizzle.uniqueSort( results );
+				}
+			}
+
+			// Override manipulation of globals by nested matchers
+			if ( outermost ) {
+				dirruns = dirrunsUnique;
+				outermostContext = contextBackup;
+			}
+
+			return unmatched;
+		};
+
+	superMatcher.el = 0;
+	return bySet ?
+		markFunction( superMatcher ) :
+		superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
+	var i,
+		setMatchers = [],
+		elementMatchers = [],
+		cached = compilerCache[ expando ][ selector ];
+
+	if ( !cached ) {
+		// Generate a function of recursive functions that can be used to check each element
+		if ( !group ) {
+			group = tokenize( selector );
+		}
+		i = group.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( group[i] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+	}
+	return cached;
+};
+
+function multipleContexts( selector, contexts, results, seed ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[i], results, seed );
+	}
+	return results;
+}
+
+function select( selector, context, results, seed, xml ) {
+	var i, tokens, token, type, find,
+		match = tokenize( selector ),
+		j = match.length;
+
+	if ( !seed ) {
+		// Try to minimize operations if there is only one group
+		if ( match.length === 1 ) {
+
+			// Take a shortcut and set the context if the root selector is an ID
+			tokens = match[0] = match[0].slice( 0 );
+			if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+					context.nodeType === 9 && !xml &&
+					Expr.relative[ tokens[1].type ] ) {
+
+				context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0];
+				if ( !context ) {
+					return results;
+				}
+
+				selector = selector.slice( tokens.shift().length );
+			}
+
+			// Fetch a seed set for right-to-left matching
+			for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {
+				token = tokens[i];
+
+				// Abort if we hit a combinator
+				if ( Expr.relative[ (type = token.type) ] ) {
+					break;
+				}
+				if ( (find = Expr.find[ type ]) ) {
+					// Search, expanding context for leading sibling combinators
+					if ( (seed = find(
+						token.matches[0].replace( rbackslash, "" ),
+						rsibling.test( tokens[0].type ) && context.parentNode || context,
+						xml
+					)) ) {
+
+						// If seed is empty or no tokens remain, we can return early
+						tokens.splice( i, 1 );
+						selector = seed.length && tokens.join("");
+						if ( !selector ) {
+							push.apply( results, slice.call( seed, 0 ) );
+							return results;
+						}
+
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	// Compile and execute a filtering function
+	// Provide `match` to avoid retokenization if we modified the selector above
+	compile( selector, match )(
+		seed,
+		context,
+		xml,
+		results,
+		rsibling.test( selector )
+	);
+	return results;
+}
+
+if ( document.querySelectorAll ) {
+	(function() {
+		var disconnectedMatch,
+			oldSelect = select,
+			rescape = /'|\\/g,
+			rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
+
+			// qSa(:focus) reports false when true (Chrome 21),
+			// A support test would require too much code (would include document ready)
+			rbuggyQSA = [":focus"],
+
+			// matchesSelector(:focus) reports false when true (Chrome 21),
+			// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+			// A support test would require too much code (would include document ready)
+			// just skip matchesSelector for :active
+			rbuggyMatches = [ ":active", ":focus" ],
+			matches = docElem.matchesSelector ||
+				docElem.mozMatchesSelector ||
+				docElem.webkitMatchesSelector ||
+				docElem.oMatchesSelector ||
+				docElem.msMatchesSelector;
+
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert(function( div ) {
+			// Select is set to empty string on purpose
+			// This is to test IE's treatment of not explictly
+			// setting a boolean content attribute,
+			// since its presence should be enough
+			// http://bugs.jquery.com/ticket/12359
+			div.innerHTML = "<select><option selected=''></option></select>";
+
+			// IE8 - Some boolean attributes are not treated correctly
+			if ( !div.querySelectorAll("[selected]").length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
+			}
+
+			// Webkit/Opera - :checked should return selected option elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			// IE8 throws error here (do not put tests after this one)
+			if ( !div.querySelectorAll(":checked").length ) {
+				rbuggyQSA.push(":checked");
+			}
+		});
+
+		assert(function( div ) {
+
+			// Opera 10-12/IE9 - ^= $= *= and empty values
+			// Should not select anything
+			div.innerHTML = "<p test=''></p>";
+			if ( div.querySelectorAll("[test^='']").length ) {
+				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
+			}
+
+			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+			// IE8 throws error here (do not put tests after this one)
+			div.innerHTML = "<input type='hidden'/>";
+			if ( !div.querySelectorAll(":enabled").length ) {
+				rbuggyQSA.push(":enabled", ":disabled");
+			}
+		});
+
+		// rbuggyQSA always contains :focus, so no need for a length check
+		rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") );
+
+		select = function( selector, context, results, seed, xml ) {
+			// Only use querySelectorAll when not filtering,
+			// when this is not xml,
+			// and when no QSA bugs apply
+			if ( !seed && !xml && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+				var groups, i,
+					old = true,
+					nid = expando,
+					newContext = context,
+					newSelector = context.nodeType === 9 && selector;
+
+				// 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
+				if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					groups = tokenize( selector );
+
+					if ( (old = context.getAttribute("id")) ) {
+						nid = old.replace( rescape, "\\$&" );
+					} else {
+						context.setAttribute( "id", nid );
+					}
+					nid = "[id='" + nid + "'] ";
+
+					i = groups.length;
+					while ( i-- ) {
+						groups[i] = nid + groups[i].join("");
+					}
+					newContext = rsibling.test( selector ) && context.parentNode || context;
+					newSelector = groups.join(",");
+				}
+
+				if ( newSelector ) {
+					try {
+						push.apply( results, slice.call( newContext.querySelectorAll(
+							newSelector
+						), 0 ) );
+						return results;
+					} catch(qsaError) {
+					} finally {
+						if ( !old ) {
+							context.removeAttribute("id");
+						}
+					}
+				}
+			}
+
+			return oldSelect( selector, context, results, seed, xml );
+		};
+
+		if ( matches ) {
+			assert(function( div ) {
+				// Check to see if it's possible to do matchesSelector
+				// on a disconnected node (IE 9)
+				disconnectedMatch = matches.call( div, "div" );
+
+				// This should fail with an exception
+				// Gecko does not error, returns false instead
+				try {
+					matches.call( div, "[test!='']:sizzle" );
+					rbuggyMatches.push( "!=", pseudos );
+				} catch ( e ) {}
+			});
+
+			// rbuggyMatches always contains :active and :focus, so no need for a length check
+			rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );
+
+			Sizzle.matchesSelector = function( elem, expr ) {
+				// Make sure that attribute selectors are quoted
+				expr = expr.replace( rattributeQuotes, "='$1']" );
+
+				// rbuggyMatches always contains :active, so no need for an existence check
+				if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && (!rbuggyQSA || !rbuggyQSA.test( expr )) ) {
+					try {
+						var ret = matches.call( elem, 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
+								elem.document && elem.document.nodeType !== 11 ) {
+							return ret;
+						}
+					} catch(e) {}
+				}
+
+				return Sizzle( expr, null, null, [ elem ] ).length > 0;
+			};
+		}
+	})();
+}
+
+// Deprecated
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Back-compat
+function setFilters() {}
+Expr.filters = setFilters.prototype = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})( window );
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prev(?:Until|All))/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	rneedsContext = jQuery.expr.match.needsContext,
+	// 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 i, l, length, n, r, ret,
+			self = this;
+
+		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;
+					}
+				}
+			});
+		}
+
+		ret = this.pushStack( "", "find", selector );
+
+		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 i,
+			targets = jQuery( target, this ),
+			len = targets.length;
+
+		return this.filter(function() {
+			for ( i = 0; i < len; 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" ?
+				// If this is a positional/relative selector, check membership in the returned set
+				// so $("p:first").is("p:last") won't return true for a doc with two "p".
+				rneedsContext.test( selector ) ?
+					jQuery( selector, this.context ).index( this[0] ) >= 0 :
+					jQuery.filter( selector, this ).length > 0 :
+				this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			ret = [],
+			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( ; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+				}
+				cur = cur.parentNode;
+			}
+		}
+
+		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 ) );
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter(selector)
+		);
+	}
+});
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+// 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;
+}
+
+function sibling( cur, dir ) {
+	do {
+		cur = cur[ dir ];
+	} while ( cur && cur.nodeType !== 1 );
+
+	return cur;
+}
+
+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 sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "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.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		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 && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, core_slice.call( arguments ).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;
+	},
+
+	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;
+	});
+}
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+	safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style|link)/i,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+	rcheckableType = /^(?:checkbox|radio)$/,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
+	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, "", "" ]
+	},
+	safeFragment = createSafeFragment( document ),
+	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+// unless wrapped in a div with non-breaking characters in front of it.
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "X<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( value ) {
+		return jQuery.access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+		}, null, value, arguments.length );
+	},
+
+	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 ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each(function(i) {
+			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : 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.nodeType === 11 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( !isDisconnected( this[0] ) ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		}
+
+		if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
+		}
+	},
+
+	after: function() {
+		if ( !isDisconnected( this[0] ) ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		}
+
+		if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		var elem,
+			i = 0;
+
+		for ( ; (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() {
+		var elem,
+			i = 0;
+
+		for ( ; (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 ) {
+		return jQuery.access( this, function( value ) {
+			var elem = this[0] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined ) {
+				return elem.nodeType === 1 ?
+					elem.innerHTML.replace( rinlinejQuery, "" ) :
+					undefined;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+				value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+				try {
+					for (; i < l; i++ ) {
+						// Remove element nodes and prevent memory leaks
+						elem = this[i] || {};
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( elem.getElementsByTagName( "*" ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch(e) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function( value ) {
+		if ( !isDisconnected( this[0] ) ) {
+			// 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 );
+				}
+			});
+		}
+
+		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 ) {
+
+		// Flatten any nested arrays
+		args = [].concat.apply( [], args );
+
+		var results, first, fragment, iNoClone,
+			i = 0,
+			value = args[0],
+			scripts = [],
+			l = this.length;
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback );
+			});
+		}
+
+		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] ) {
+			results = jQuery.buildFragment( args, this, scripts );
+			fragment = results.fragment;
+			first = fragment.firstChild;
+
+			if ( fragment.childNodes.length === 1 ) {
+				fragment = first;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				// Use the original fragment for the last item instead of the first because it can end up
+				// being emptied incorrectly in certain situations (#8070).
+				// Fragments from the fragment cache must always be cloned and never used in place.
+				for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
+					callback.call(
+						table && jQuery.nodeName( this[i], "table" ) ?
+							findOrAppend( this[i], "tbody" ) :
+							this[i],
+						i === iNoClone ?
+							fragment :
+							jQuery.clone( fragment, true, true )
+					);
+				}
+			}
+
+			// Fix #11809: Avoid leaking memory
+			fragment = first = null;
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, function( i, elem ) {
+					if ( elem.src ) {
+						if ( jQuery.ajax ) {
+							jQuery.ajax({
+								url: elem.src,
+								type: "GET",
+								dataType: "script",
+								async: false,
+								global: false,
+								"throws": true
+							});
+						} else {
+							jQuery.error("no ajax");
+						}
+					} else {
+						jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
+					}
+
+					if ( elem.parentNode ) {
+						elem.parentNode.removeChild( elem );
+					}
+				});
+			}
+		}
+
+		return this;
+	}
+});
+
+function findOrAppend( elem, tag ) {
+	return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type, events[ type ][ i ] );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.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();
+
+	if ( nodeName === "object" ) {
+		// IE6-10 improperly clones children of object elements using classid.
+		// IE10 throws NoModificationAllowedError if parent is null, #12132.
+		if ( dest.parentNode ) {
+			dest.outerHTML = src.outerHTML;
+		}
+
+		// This path appears unavoidable for IE9. When cloning an object
+		// element in IE9, the outerHTML strategy above is not sufficient.
+		// If the src has innerHTML and the destination does not,
+		// copy the src.innerHTML into the dest.innerHTML. #10324
+		if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
+			dest.innerHTML = src.innerHTML;
+		}
+
+	} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+		// 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
+
+		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;
+
+	// IE blanks contents when cloning scripts
+	} else if ( nodeName === "script" && dest.text !== src.text ) {
+		dest.text = src.text;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, context, scripts ) {
+	var fragment, cacheable, cachehit,
+		first = args[ 0 ];
+
+	// Set context from what may come in as undefined or a jQuery collection or a node
+	// Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
+	// also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
+	context = context || document;
+	context = !context.nodeType && context[0] || context;
+	context = context.ownerDocument || context;
+
+	// 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
+	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+	if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
+		first.charAt(0) === "<" && !rnocache.test( first ) &&
+		(jQuery.support.checkClone || !rchecked.test( first )) &&
+		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+		// Mark cacheable and look for a hit
+		cacheable = true;
+		fragment = jQuery.fragments[ first ];
+		cachehit = fragment !== undefined;
+	}
+
+	if ( !fragment ) {
+		fragment = context.createDocumentFragment();
+		jQuery.clean( args, context, fragment, scripts );
+
+		// Update the cache, but only store false
+		// unless this is a second parsing of the same content
+		if ( cacheable ) {
+			jQuery.fragments[ first ] = cachehit && fragment;
+		}
+	}
+
+	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 elems,
+			i = 0,
+			ret = [],
+			insert = jQuery( selector ),
+			l = insert.length,
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+		} else {
+			for ( ; i < l; i++ ) {
+				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 ( typeof elem.getElementsByTagName !== "undefined" ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( rcheckableType.test( elem.type ) ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var srcElements,
+			destElements,
+			i,
+			clone;
+
+		if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+			clone = elem.cloneNode( true );
+
+		// IE<=8 does not properly clone detached, unknown element nodes
+		} else {
+			fragmentDiv.innerHTML = elem.outerHTML;
+			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+		}
+
+		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 i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
+			safe = context === document && safeFragment,
+			ret = [];
+
+		// Ensure that context is a document
+		if ( !context || typeof context.createDocumentFragment === "undefined" ) {
+			context = document;
+		}
+
+		// Use the already-created safe fragment if context permits
+		for ( i = 0; (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 {
+					// Ensure a safe container in which to render the html
+					safe = safe || createSafeFragment( context );
+					div = context.createElement("div");
+					safe.appendChild( div );
+
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Go to html and back, then peel off extra wrappers
+					tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
+					wrap = wrapMap[ tag ] || wrapMap._default;
+					depth = wrap[0];
+					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>
+						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;
+
+					// Take out of fragment container (we need a fresh div each time)
+					div.parentNode.removeChild( div );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				jQuery.merge( ret, elem );
+			}
+		}
+
+		// Fix #11356: Clear elements from safeFragment
+		if ( div ) {
+			elem = div = safe = null;
+		}
+
+		// Reset defaultChecked for any radios and checkboxes
+		// about to be appended to the DOM in IE 6/7 (#8060)
+		if ( !jQuery.support.appendChecked ) {
+			for ( i = 0; (elem = ret[i]) != null; i++ ) {
+				if ( jQuery.nodeName( elem, "input" ) ) {
+					fixDefaultChecked( elem );
+				} else if ( typeof elem.getElementsByTagName !== "undefined" ) {
+					jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+				}
+			}
+		}
+
+		// Append elements to a provided document fragment
+		if ( fragment ) {
+			// Special handling of each script element
+			handleScript = function( elem ) {
+				// Check if we consider it executable
+				if ( !elem.type || rscriptType.test( elem.type ) ) {
+					// Detach the script and store it in the scripts array (if provided) or the fragment
+					// Return truthy to indicate that it has been handled
+					return scripts ?
+						scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+						fragment.appendChild( elem );
+				}
+			};
+
+			for ( i = 0; (elem = ret[i]) != null; i++ ) {
+				// Check if we're done after handling an executable script
+				if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+					// Append to fragment and handle embedded scripts
+					fragment.appendChild( elem );
+					if ( typeof elem.getElementsByTagName !== "undefined" ) {
+						// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+						jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
+
+						// Splice the scripts into ret after their former ancestor and advance our index beyond them
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+						i += jsTags.length;
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems, /* internal */ acceptData ) {
+		var data, id, elem, type,
+			i = 0,
+			internalKey = jQuery.expando,
+			cache = jQuery.cache,
+			deleteExpando = jQuery.support.deleteExpando,
+			special = jQuery.event.special;
+
+		for ( ; (elem = elems[i]) != null; i++ ) {
+
+			if ( acceptData || jQuery.acceptData( elem ) ) {
+
+				id = elem[ internalKey ];
+				data = id && cache[ id ];
+
+				if ( data ) {
+					if ( data.events ) {
+						for ( 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 );
+							}
+						}
+					}
+
+					// Remove cache only if it was not already removed by jQuery.event.remove
+					if ( cache[ id ] ) {
+
+						delete cache[ id ];
+
+						// 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 ( deleteExpando ) {
+							delete elem[ internalKey ];
+
+						} else if ( elem.removeAttribute ) {
+							elem.removeAttribute( internalKey );
+
+						} else {
+							elem[ internalKey ] = null;
+						}
+
+						jQuery.deletedIds.push( id );
+					}
+				}
+			}
+		}
+	}
+});
+// Limit scope pollution from any deprecated API
+(function() {
+
+var matched, browser;
+
+// Use of jQuery.browser is frowned upon.
+// More details: http://api.jquery.com/jQuery.browser
+// jQuery.uaMatch maintained for back-compat
+jQuery.uaMatch = function( ua ) {
+	ua = ua.toLowerCase();
+
+	var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+		/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+		/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+		/(msie) ([\w.]+)/.exec( ua ) ||
+		ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+		[];
+
+	return {
+		browser: match[ 1 ] || "",
+		version: match[ 2 ] || "0"
+	};
+};
+
+matched = jQuery.uaMatch( navigator.userAgent );
+browser = {};
+
+if ( matched.browser ) {
+	browser[ matched.browser ] = true;
+	browser.version = matched.version;
+}
+
+// Chrome is Webkit, but Webkit is also Safari.
+if ( browser.chrome ) {
+	browser.webkit = true;
+} else if ( browser.webkit ) {
+	browser.safari = true;
+}
+
+jQuery.browser = browser;
+
+jQuery.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;
+};
+
+})();
+var curCSS, iframe, iframeDoc,
+	ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	rposition = /^(top|right|bottom|left)$/,
+	// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+	// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+	rmargin = /^margin/,
+	rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+	rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+	rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
+	elemdisplay = {},
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: 0,
+		fontWeight: 400
+	},
+
+	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
+
+	eventsToggle = jQuery.fn.toggle;
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+	// shortcut for names that are not vendor prefixed
+	if ( name in style ) {
+		return name;
+	}
+
+	// check for vendor prefixed names
+	var capName = name.charAt(0).toUpperCase() + name.slice(1),
+		origName = name,
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in style ) {
+			return name;
+		}
+	}
+
+	return origName;
+}
+
+function isHidden( elem, el ) {
+	elem = el || elem;
+	return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
+
+function showHide( elements, show ) {
+	var elem, display,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+		values[ index ] = jQuery._data( elem, "olddisplay" );
+		if ( show ) {
+			// Reset the inline display of this element to learn if it is
+			// being hidden by cascaded rules or not
+			if ( !values[ index ] && elem.style.display === "none" ) {
+				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 ( elem.style.display === "" && isHidden( elem ) ) {
+				values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+			}
+		} else {
+			display = curCSS( elem, "display" );
+
+			if ( !values[ index ] && display !== "none" ) {
+				jQuery._data( elem, "olddisplay", display );
+			}
+		}
+	}
+
+	// Set the display of most of the elements in a second loop
+	// to avoid the constant reflow
+	for ( index = 0; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+			elem.style.display = show ? values[ index ] || "" : "none";
+		}
+	}
+
+	return elements;
+}
+
+jQuery.fn.extend({
+	css: function( name, value ) {
+		return jQuery.access( this, function( elem, name, value ) {
+			return value !== undefined ?
+				jQuery.style( elem, name, value ) :
+				jQuery.css( elem, name );
+		}, name, value, arguments.length > 1 );
+	},
+	show: function() {
+		return showHide( this, true );
+	},
+	hide: function() {
+		return showHide( this );
+	},
+	toggle: function( state, fn2 ) {
+		var bool = typeof state === "boolean";
+
+		if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
+			return eventsToggle.apply( this, arguments );
+		}
+
+		return this.each(function() {
+			if ( bool ? state : isHidden( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		});
+	}
+});
+
+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" );
+					return ret === "" ? "1" : ret;
+
+				}
+			}
+		}
+	},
+
+	// 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, hooks,
+			origName = jQuery.camelCase( name ),
+			style = elem.style;
+
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ 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, extra )) !== 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, numeric, extra ) {
+		var val, num, hooks,
+			origName = jQuery.camelCase( name );
+
+		// Make sure that we're working with the right name
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks ) {
+			val = hooks.get( elem, true, extra );
+		}
+
+		// Otherwise, if a way to get the computed value exists, use that
+		if ( val === undefined ) {
+			val = curCSS( elem, name );
+		}
+
+		//convert "normal" to computed value
+		if ( val === "normal" && name in cssNormalTransform ) {
+			val = cssNormalTransform[ name ];
+		}
+
+		// Return, converting to number if forced or a qualifier was provided and val looks numeric
+		if ( numeric || extra !== undefined ) {
+			num = parseFloat( val );
+			return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
+		}
+		return val;
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var ret, name,
+			old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		ret = callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+
+		return ret;
+	}
+});
+
+// NOTE: To any future maintainer, we've window.getComputedStyle
+// because jsdom on node.js will break without it.
+if ( window.getComputedStyle ) {
+	curCSS = function( elem, name ) {
+		var ret, width, minWidth, maxWidth,
+			computed = window.getComputedStyle( elem, null ),
+			style = elem.style;
+
+		if ( computed ) {
+
+			ret = computed[ name ];
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+
+			// A tribute to the "awesome hack by Dean Edwards"
+			// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+			// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+			// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+			if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+				width = style.width;
+				minWidth = style.minWidth;
+				maxWidth = style.maxWidth;
+
+				style.minWidth = style.maxWidth = style.width = ret;
+				ret = computed.width;
+
+				style.width = width;
+				style.minWidth = minWidth;
+				style.maxWidth = maxWidth;
+			}
+		}
+
+		return ret;
+	};
+} else if ( document.documentElement.currentStyle ) {
+	curCSS = function( elem, name ) {
+		var left, rsLeft,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret == null && style && style[ name ] ) {
+			ret = style[ name ];
+		}
+
+		// 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
+		// but not position css attributes, as those are proportional to the parent element instead
+		// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle.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;
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+	var matches = rnumsplit.exec( value );
+	return matches ?
+			Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+			value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
+	var i = extra === ( isBorderBox ? "border" : "content" ) ?
+		// If we already have the right measurement, avoid augmentation
+		4 :
+		// Otherwise initialize for horizontal or vertical properties
+		name === "width" ? 1 : 0,
+
+		val = 0;
+
+	for ( ; i < 4; i += 2 ) {
+		// both box models exclude margin, so add it if we want it
+		if ( extra === "margin" ) {
+			// we use jQuery.css instead of curCSS here
+			// because of the reliableMarginRight CSS hook!
+			val += jQuery.css( elem, extra + cssExpand[ i ], true );
+		}
+
+		// From this point on we use curCSS for maximum performance (relevant in animations)
+		if ( isBorderBox ) {
+			// border-box includes padding, so remove it if we want content
+			if ( extra === "content" ) {
+				val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+			}
+
+			// at this point, extra isn't border nor margin, so remove border
+			if ( extra !== "margin" ) {
+				val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+			}
+		} else {
+			// at this point, extra isn't content, so add padding
+			val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+
+			// at this point, extra isn't content nor padding, so add border
+			if ( extra !== "padding" ) {
+				val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+			}
+		}
+	}
+
+	return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with offset property, which is equivalent to the border-box value
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		valueIsBorderBox = true,
+		isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
+
+	// some non-html elements return undefined for offsetWidth, so check for null/undefined
+	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+	if ( val <= 0 || val == null ) {
+		// Fall back to computed then uncomputed css if necessary
+		val = curCSS( elem, name );
+		if ( val < 0 || val == null ) {
+			val = elem.style[ name ];
+		}
+
+		// Computed unit is not pixels. Stop here and return.
+		if ( rnumnonpx.test(val) ) {
+			return val;
+		}
+
+		// we need the check for style in case a browser which returns unreliable values
+		// for getComputedStyle silently falls back to the reliable elem.style
+		valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+
+		// Normalize "", auto, and prepare for extra
+		val = parseFloat( val ) || 0;
+	}
+
+	// use the active box-sizing model to add/subtract irrelevant styles
+	return ( val +
+		augmentWidthOrHeight(
+			elem,
+			name,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox
+		)
+	) + "px";
+}
+
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+	if ( elemdisplay[ nodeName ] ) {
+		return elemdisplay[ nodeName ];
+	}
+
+	var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.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 === "" ) {
+		// Use the already-created iframe if possible
+		iframe = document.body.appendChild(
+			iframe || jQuery.extend( document.createElement("iframe"), {
+				frameBorder: 0,
+				width: 0,
+				height: 0
+			})
+		);
+
+		// 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("<!doctype html><html><body>");
+			iframeDoc.close();
+		}
+
+		elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
+
+		display = curCSS( elem, "display" );
+		document.body.removeChild( iframe );
+	}
+
+	// Store the correct default display
+	elemdisplay[ nodeName ] = display;
+
+	return display;
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+				// certain elements can have dimension info if we invisibly show them
+				// however, it must have a current display style that would benefit from this
+				if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
+					return jQuery.swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, name, extra );
+					});
+				} else {
+					return getWidthOrHeight( elem, name, extra );
+				}
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			return setPositiveNumber( elem, value, extra ?
+				augmentWidthOrHeight(
+					elem,
+					name,
+					extra,
+					jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
+				) : 0
+			);
+		}
+	};
+});
+
+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) || "" ) ?
+				( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( 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, "" ) ) === "" &&
+				style.removeAttribute ) {
+
+				// 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;
+		}
+	};
+}
+
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+	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
+				return jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						return curCSS( elem, "marginRight" );
+					}
+				});
+			}
+		};
+	}
+
+	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+	// getComputedStyle returns percent when specified for top/left/bottom/right
+	// rather than make the css module depend on the offset module, we just check for it here
+	if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+		jQuery.each( [ "top", "left" ], function( i, prop ) {
+			jQuery.cssHooks[ prop ] = {
+				get: function( elem, computed ) {
+					if ( computed ) {
+						var ret = curCSS( elem, prop );
+						// if curCSS returns percentage, fallback to offset
+						return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
+					}
+				}
+			};
+		});
+	}
+
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i,
+
+				// assumes a single number if not a string
+				parts = typeof value === "string" ? value.split(" ") : [ value ],
+				expanded = {};
+
+			for ( i = 0; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+
+	if ( !rmargin.test( prefix ) ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+});
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	rselectTextarea = /^(?:select|textarea)/i;
+
+jQuery.fn.extend({
+	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();
+	}
+});
+
+//Serialize an array of form elements or a set of
+//key/values into a query string
+jQuery.param = function( a, traditional ) {
+	var prefix,
+		s = [],
+		add = function( key, value ) {
+			// If value is a function, invoke it and return its value
+			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+		};
+
+	// Set traditional to true for jQuery <= 1.3.2 behavior.
+	if ( traditional === undefined ) {
+		traditional = jQuery.ajaxSettings && 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 ( prefix in a ) {
+			buildParams( prefix, a[ prefix ], traditional, add );
+		}
+	}
+
+	// Return the resulting serialization
+	return s.join( "&" ).replace( r20, "+" );
+};
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	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" ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+var
+	// Document location
+	ajaxLocParts,
+	ajaxLocation,
+
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	// #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,
+	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 = {},
+
+	// 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 = "*";
+		}
+
+		var dataType, list, placeBefore,
+			dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
+			i = 0,
+			length = dataTypes.length;
+
+		if ( jQuery.isFunction( func ) ) {
+			// 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 selection,
+		list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters );
+
+	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.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
+	if ( !this.length ) {
+		return this;
+	}
+
+	var selector, type, response,
+		self = this,
+		off = url.indexOf(" ");
+
+	if ( off >= 0 ) {
+		selector = url.slice( off, url.length );
+		url = url.slice( 0, off );
+	}
+
+	// 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 ( params && typeof params === "object" ) {
+		type = "POST";
+	}
+
+	// Request the remote document
+	jQuery.ajax({
+		url: url,
+
+		// if "type" variable is undefined, then "GET" method will be used
+		type: type,
+		dataType: "html",
+		data: params,
+		complete: function( jqXHR, status ) {
+			if ( callback ) {
+				self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+			}
+		}
+	}).done(function( responseText ) {
+
+		// Save response for use in complete callback
+		response = arguments;
+
+		// 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 );
+
+	});
+
+	return this;
+};
+
+// 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.on( 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; charset=UTF-8",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		throws: false,
+		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 // ifModified key
+			ifModifiedKey,
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// 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.Callbacks( "once memory" ),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// The jqXHR state
+			state = 0,
+			// Default abort message
+			strAbort = "canceled",
+			// 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 || strAbort;
+					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 ) {
+			var isSuccess, success, error, response, modified,
+				statusText = nativeStatusText;
+
+			// 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;
+
+			// Get response data
+			if ( responses ) {
+				response = ajaxHandleResponses( s, jqXHR, responses );
+			}
+
+			// 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 ) {
+
+					modified = jqXHR.getResponseHeader("Last-Modified");
+					if ( modified ) {
+						jQuery.lastModified[ ifModifiedKey ] = modified;
+					}
+					modified = jqXHR.getResponseHeader("Etag");
+					if ( modified ) {
+						jQuery.etag[ ifModifiedKey ] = modified;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					isSuccess = ajaxConvert( s, response );
+					statusText = isSuccess.state;
+					success = isSuccess.data;
+					error = isSuccess.error;
+					isSuccess = !error;
+				}
+			} 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.fireWith( 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.add;
+
+		// 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.always( 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( core_rspace );
+
+		// A cross-domain request is in order when we have a protocol:host:port mismatch
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() ) || false;
+			s.crossDomain = parts && ( parts.join(":") + ( parts[ 3 ] ? "" : parts[ 1 ] === "http:" ? 80 : 443 ) ) !==
+				( ajaxLocParts.join(":") + ( 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 prefilter, stop there
+		if ( state === 2 ) {
+			return jqXHR;
+		}
+
+		// 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 and return
+				return jqXHR.abort();
+
+		}
+
+		// aborting is no longer a cancellation
+		strAbort = "abort";
+
+		// 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 {
+					throw e;
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// 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 ct, type, finalDataType, firstDataType,
+		contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields;
+
+	// 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 ) {
+
+	var conv, conv2, current, tmp,
+		// Work with a copy of dataTypes in case we need to modify it for conversion
+		dataTypes = s.dataTypes.slice(),
+		prev = dataTypes[ 0 ],
+		converters = {},
+		i = 0;
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	// Create converters map with lowercased keys
+	if ( dataTypes[ 1 ] ) {
+		for ( conv in s.converters ) {
+			converters[ conv.toLowerCase() ] = s.converters[ conv ];
+		}
+	}
+
+	// Convert to each sequential dataType, tolerating list modification
+	for ( ; (current = dataTypes[++i]); ) {
+
+		// There's only work to do if current dataType is non-auto
+		if ( current !== "*" ) {
+
+			// Convert response if prev dataType is non-auto and differs from current
+			if ( prev !== "*" && prev !== current ) {
+
+				// Seek a direct converter
+				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+				// If none found, seek a pair
+				if ( !conv ) {
+					for ( conv2 in converters ) {
+
+						// If conv2 outputs current
+						tmp = conv2.split(" ");
+						if ( tmp[ 1 ] === current ) {
+
+							// If prev can be converted to accepted input
+							conv = converters[ prev + " " + tmp[ 0 ] ] ||
+								converters[ "* " + tmp[ 0 ] ];
+							if ( conv ) {
+								// Condense equivalence converters
+								if ( conv === true ) {
+									conv = converters[ conv2 ];
+
+								// Otherwise, insert the intermediate dataType
+								} else if ( converters[ conv2 ] !== true ) {
+									current = tmp[ 0 ];
+									dataTypes.splice( i--, 0, current );
+								}
+
+								break;
+							}
+						}
+					}
+				}
+
+				// Apply converter (if not an equivalence)
+				if ( conv !== true ) {
+
+					// Unless errors are allowed to bubble, catch and return them
+					if ( conv && s["throws"] ) {
+						response = conv( response );
+					} else {
+						try {
+							response = conv( response );
+						} catch ( e ) {
+							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+						}
+					}
+				}
+			}
+
+			// Update prev for next iteration
+			prev = current;
+		}
+	}
+
+	return { state: "success", data: response };
+}
+var oldCallbacks = [],
+	rquestion = /\?/,
+	rjsonp = /(=)\?(?=&|$)|\?\?/,
+	nonce = jQuery.now();
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+		this[ callback ] = true;
+		return callback;
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var callbackName, overwritten, responseContainer,
+		data = s.data,
+		url = s.url,
+		hasCallback = s.jsonp !== false,
+		replaceInUrl = hasCallback && rjsonp.test( url ),
+		replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
+			!( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
+			rjsonp.test( data );
+
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
+	if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
+
+		// Get callback name, remembering preexisting value associated with it
+		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+			s.jsonpCallback() :
+			s.jsonpCallback;
+		overwritten = window[ callbackName ];
+
+		// Insert callback into url or form data
+		if ( replaceInUrl ) {
+			s.url = url.replace( rjsonp, "$1" + callbackName );
+		} else if ( replaceInData ) {
+			s.data = data.replace( rjsonp, "$1" + callbackName );
+		} else if ( hasCallback ) {
+			s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+		}
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( callbackName + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Install callback
+		window[ callbackName ] = function() {
+			responseContainer = arguments;
+		};
+
+		// Clean-up function (fires after converters)
+		jqXHR.always(function() {
+			// Restore preexisting value
+			window[ callbackName ] = overwritten;
+
+			// Save back as free
+			if ( s[ callbackName ] ) {
+				// make sure that re-using the options doesn't screw things around
+				s.jsonpCallback = originalSettings.jsonpCallback;
+
+				// save the callback name for future use
+				oldCallbacks.push( callbackName );
+			}
+
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+				overwritten( responseContainer[ 0 ] );
+			}
+
+			responseContainer = overwritten = undefined;
+		});
+
+		// 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 xhrCallbacks,
+	// #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;
+
+// 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 handle, i,
+						xhr = s.xhr();
+
+					// 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 occurred
+						// 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;
+									}
+
+									// When requesting binary data, IE6-9 will throw an exception
+									// on any attempt to access responseText (#11426)
+									try {
+										responses.text = xhr.responseText;
+									} catch( _ ) {
+									}
+
+									// 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 ( !s.async ) {
+						// if we're in sync mode we fire the callback
+						callback();
+					} else if ( xhr.readyState === 4 ) {
+						// (IE6 & IE7) if it's in cache and has been
+						// retrieved directly we need to fire the callback
+						setTimeout( callback, 0 );
+					} 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 fxNow, timerId,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+	rrun = /queueHooks$/,
+	animationPrefilters = [ defaultPrefilter ],
+	tweeners = {
+		"*": [function( prop, value ) {
+			var end, unit,
+				tween = this.createTween( prop, value ),
+				parts = rfxnum.exec( value ),
+				target = tween.cur(),
+				start = +target || 0,
+				scale = 1,
+				maxIterations = 20;
+
+			if ( parts ) {
+				end = +parts[2];
+				unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+
+				// We need to compute starting value
+				if ( unit !== "px" && start ) {
+					// Iteratively approximate from a nonzero starting point
+					// Prefer the current property, because this process will be trivial if it uses the same units
+					// Fallback to end or a simple constant
+					start = jQuery.css( tween.elem, prop, true ) || end || 1;
+
+					do {
+						// If previous iteration zeroed out, double until we get *something*
+						// Use a string for doubling factor so we don't accidentally see scale as unchanged below
+						scale = scale || ".5";
+
+						// Adjust and apply
+						start = start / scale;
+						jQuery.style( tween.elem, prop, start + unit );
+
+					// Update scale, tolerating zero or NaN from tween.cur()
+					// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+					} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+				}
+
+				tween.unit = unit;
+				tween.start = start;
+				// If a +=/-= token was provided, we're doing a relative animation
+				tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
+			}
+			return tween;
+		}]
+	};
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout(function() {
+		fxNow = undefined;
+	}, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function createTweens( animation, props ) {
+	jQuery.each( props, function( prop, value ) {
+		var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+			index = 0,
+			length = collection.length;
+		for ( ; index < length; index++ ) {
+			if ( collection[ index ].call( animation, prop, value ) ) {
+
+				// we're done with this property
+				return;
+			}
+		}
+	});
+}
+
+function Animation( elem, properties, options ) {
+	var result,
+		index = 0,
+		tweenerIndex = 0,
+		length = animationPrefilters.length,
+		deferred = jQuery.Deferred().always( function() {
+			// don't match elem in the :animated selector
+			delete tick.elem;
+		}),
+		tick = function() {
+			var currentTime = fxNow || createFxNow(),
+				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+				percent = 1 - ( remaining / animation.duration || 0 ),
+				index = 0,
+				length = animation.tweens.length;
+
+			for ( ; index < length ; index++ ) {
+				animation.tweens[ index ].run( percent );
+			}
+
+			deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+			if ( percent < 1 && length ) {
+				return remaining;
+			} else {
+				deferred.resolveWith( elem, [ animation ] );
+				return false;
+			}
+		},
+		animation = deferred.promise({
+			elem: elem,
+			props: jQuery.extend( {}, properties ),
+			opts: jQuery.extend( true, { specialEasing: {} }, options ),
+			originalProperties: properties,
+			originalOptions: options,
+			startTime: fxNow || createFxNow(),
+			duration: options.duration,
+			tweens: [],
+			createTween: function( prop, end, easing ) {
+				var tween = jQuery.Tween( elem, animation.opts, prop, end,
+						animation.opts.specialEasing[ prop ] || animation.opts.easing );
+				animation.tweens.push( tween );
+				return tween;
+			},
+			stop: function( gotoEnd ) {
+				var index = 0,
+					// if we are going to the end, we want to run all the tweens
+					// otherwise we skip this part
+					length = gotoEnd ? animation.tweens.length : 0;
+
+				for ( ; index < length ; index++ ) {
+					animation.tweens[ index ].run( 1 );
+				}
+
+				// resolve when we played the last frame
+				// otherwise, reject
+				if ( gotoEnd ) {
+					deferred.resolveWith( elem, [ animation, gotoEnd ] );
+				} else {
+					deferred.rejectWith( elem, [ animation, gotoEnd ] );
+				}
+				return this;
+			}
+		}),
+		props = animation.props;
+
+	propFilter( props, animation.opts.specialEasing );
+
+	for ( ; index < length ; index++ ) {
+		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( result ) {
+			return result;
+		}
+	}
+
+	createTweens( animation, props );
+
+	if ( jQuery.isFunction( animation.opts.start ) ) {
+		animation.opts.start.call( elem, animation );
+	}
+
+	jQuery.fx.timer(
+		jQuery.extend( tick, {
+			anim: animation,
+			queue: animation.opts.queue,
+			elem: elem
+		})
+	);
+
+	// attach callbacks from options
+	return animation.progress( animation.opts.progress )
+		.done( animation.opts.done, animation.opts.complete )
+		.fail( animation.opts.fail )
+		.always( animation.opts.always );
+}
+
+function propFilter( props, specialEasing ) {
+	var index, name, easing, value, hooks;
+
+	// camelCase, specialEasing and expand cssHook pass
+	for ( index in props ) {
+		name = jQuery.camelCase( index );
+		easing = specialEasing[ name ];
+		value = props[ index ];
+		if ( jQuery.isArray( value ) ) {
+			easing = value[ 1 ];
+			value = props[ index ] = value[ 0 ];
+		}
+
+		if ( index !== name ) {
+			props[ name ] = value;
+			delete props[ index ];
+		}
+
+		hooks = jQuery.cssHooks[ name ];
+		if ( hooks && "expand" in hooks ) {
+			value = hooks.expand( value );
+			delete props[ name ];
+
+			// not quite $.extend, this wont overwrite keys already present.
+			// also - reusing 'index' from above because we have the correct "name"
+			for ( index in value ) {
+				if ( !( index in props ) ) {
+					props[ index ] = value[ index ];
+					specialEasing[ index ] = easing;
+				}
+			}
+		} else {
+			specialEasing[ name ] = easing;
+		}
+	}
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+	tweener: function( props, callback ) {
+		if ( jQuery.isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.split(" ");
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length ; index++ ) {
+			prop = props[ index ];
+			tweeners[ prop ] = tweeners[ prop ] || [];
+			tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			animationPrefilters.unshift( callback );
+		} else {
+			animationPrefilters.push( callback );
+		}
+	}
+});
+
+function defaultPrefilter( elem, props, opts ) {
+	var index, prop, value, length, dataShow, tween, hooks, oldfire,
+		anim = this,
+		style = elem.style,
+		orig = {},
+		handled = [],
+		hidden = elem.nodeType && isHidden( elem );
+
+	// handle queue: false promises
+	if ( !opts.queue ) {
+		hooks = jQuery._queueHooks( elem, "fx" );
+		if ( hooks.unqueued == null ) {
+			hooks.unqueued = 0;
+			oldfire = hooks.empty.fire;
+			hooks.empty.fire = function() {
+				if ( !hooks.unqueued ) {
+					oldfire();
+				}
+			};
+		}
+		hooks.unqueued++;
+
+		anim.always(function() {
+			// doing this makes sure that the complete handler will be called
+			// before this completes
+			anim.always(function() {
+				hooks.unqueued--;
+				if ( !jQuery.queue( elem, "fx" ).length ) {
+					hooks.empty.fire();
+				}
+			});
+		});
+	}
+
+	// height/width overflow pass
+	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+		// 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
+		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+		// Set display property to inline-block for height/width
+		// animations on inline elements that are having width/height animated
+		if ( jQuery.css( elem, "display" ) === "inline" &&
+				jQuery.css( elem, "float" ) === "none" ) {
+
+			// inline-level elements accept inline-block;
+			// block-level elements need to be inline with layout
+			if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+				style.display = "inline-block";
+
+			} else {
+				style.zoom = 1;
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		if ( !jQuery.support.shrinkWrapBlocks ) {
+			anim.done(function() {
+				style.overflow = opts.overflow[ 0 ];
+				style.overflowX = opts.overflow[ 1 ];
+				style.overflowY = opts.overflow[ 2 ];
+			});
+		}
+	}
+
+
+	// show/hide pass
+	for ( index in props ) {
+		value = props[ index ];
+		if ( rfxtypes.exec( value ) ) {
+			delete props[ index ];
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+				continue;
+			}
+			handled.push( index );
+		}
+	}
+
+	length = handled.length;
+	if ( length ) {
+		dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
+		if ( hidden ) {
+			jQuery( elem ).show();
+		} else {
+			anim.done(function() {
+				jQuery( elem ).hide();
+			});
+		}
+		anim.done(function() {
+			var prop;
+			jQuery.removeData( elem, "fxshow", true );
+			for ( prop in orig ) {
+				jQuery.style( elem, prop, orig[ prop ] );
+			}
+		});
+		for ( index = 0 ; index < length ; index++ ) {
+			prop = handled[ index ];
+			tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
+			orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
+
+			if ( !( prop in dataShow ) ) {
+				dataShow[ prop ] = tween.start;
+				if ( hidden ) {
+					tween.end = tween.start;
+					tween.start = prop === "width" || prop === "height" ? 1 : 0;
+				}
+			}
+		}
+	}
+}
+
+function Tween( elem, options, prop, end, easing ) {
+	return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+	constructor: Tween,
+	init: function( elem, options, prop, end, easing, unit ) {
+		this.elem = elem;
+		this.prop = prop;
+		this.easing = easing || "swing";
+		this.options = options;
+		this.start = this.now = this.cur();
+		this.end = end;
+		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+	},
+	cur: function() {
+		var hooks = Tween.propHooks[ this.prop ];
+
+		return hooks && hooks.get ?
+			hooks.get( this ) :
+			Tween.propHooks._default.get( this );
+	},
+	run: function( percent ) {
+		var eased,
+			hooks = Tween.propHooks[ this.prop ];
+
+		if ( this.options.duration ) {
+			this.pos = eased = jQuery.easing[ this.easing ](
+				percent, this.options.duration * percent, 0, 1, this.options.duration
+			);
+		} else {
+			this.pos = eased = percent;
+		}
+		this.now = ( this.end - this.start ) * eased + this.start;
+
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		if ( hooks && hooks.set ) {
+			hooks.set( this );
+		} else {
+			Tween.propHooks._default.set( this );
+		}
+		return this;
+	}
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+	_default: {
+		get: function( tween ) {
+			var result;
+
+			if ( tween.elem[ tween.prop ] != null &&
+				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+				return tween.elem[ tween.prop ];
+			}
+
+			// passing any value as a 4th parameter to .css will automatically
+			// attempt a parseFloat and fallback to a string if the parse fails
+			// so, simple values such as "10px" are parsed to Float.
+			// complex values such as "rotate(1rad)" are returned as is.
+			result = jQuery.css( tween.elem, tween.prop, false, "" );
+			// Empty strings, null, undefined and "auto" are converted to 0.
+			return !result || result === "auto" ? 0 : result;
+		},
+		set: function( tween ) {
+			// use step hook for back compat - use cssHook if its there - use .style if its
+			// available and use plain properties where available
+			if ( jQuery.fx.step[ tween.prop ] ) {
+				jQuery.fx.step[ tween.prop ]( tween );
+			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+			} else {
+				tween.elem[ tween.prop ] = tween.now;
+			}
+		}
+	}
+};
+
+// Remove in 2.0 - this supports IE8's panic based approach
+// to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+	set: function( tween ) {
+		if ( tween.elem.nodeType && tween.elem.parentNode ) {
+			tween.elem[ tween.prop ] = tween.now;
+		}
+	}
+};
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+	var cssFn = jQuery.fn[ name ];
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return speed == null || typeof speed === "boolean" ||
+			// special check for .toggle( handler, handler, ... )
+			( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
+			cssFn.apply( this, arguments ) :
+			this.animate( genFx( name, true ), speed, easing, callback );
+	};
+});
+
+jQuery.fn.extend({
+	fadeTo: function( speed, to, easing, callback ) {
+
+		// show any hidden elements after setting opacity to 0
+		return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+			// animate to the value specified
+			.end().animate({ opacity: to }, speed, easing, callback );
+	},
+	animate: function( prop, speed, easing, callback ) {
+		var empty = jQuery.isEmptyObject( prop ),
+			optall = jQuery.speed( speed, easing, callback ),
+			doAnimation = function() {
+				// Operate on a copy of prop so per-property easing won't be lost
+				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+				// Empty animations resolve immediately
+				if ( empty ) {
+					anim.stop( true );
+				}
+			};
+
+		return empty || optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+	stop: function( type, clearQueue, gotoEnd ) {
+		var stopQueue = function( hooks ) {
+			var stop = hooks.stop;
+			delete hooks.stop;
+			stop( gotoEnd );
+		};
+
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each(function() {
+			var dequeue = true,
+				index = type != null && type + "queueHooks",
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			if ( index ) {
+				if ( data[ index ] && data[ index ].stop ) {
+					stopQueue( data[ index ] );
+				}
+			} else {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+						stopQueue( data[ index ] );
+					}
+				}
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+					timers[ index ].anim.stop( gotoEnd );
+					dequeue = false;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// start the next in the queue if the last step wasn't forced
+			// timers currently will call their complete callbacks, which will dequeue
+			// but only if they were gotoEnd
+			if ( dequeue || !gotoEnd ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	}
+});
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+	var which,
+		attrs = { height: type },
+		i = 0;
+
+	// if we include width, step value is 1 to do all cssExpand values,
+	// if we don't include width, step value is 2 to skip over Left and Right
+	includeWidth = includeWidth? 1 : 0;
+	for( ; i < 4 ; i += 2 - includeWidth ) {
+		which = cssExpand[ i ];
+		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+	}
+
+	if ( includeWidth ) {
+		attrs.opacity = attrs.width = type;
+	}
+
+	return attrs;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show"),
+	slideUp: genFx("hide"),
+	slideToggle: genFx("toggle"),
+	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.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;
+
+	// normalize opt.queue - true/undefined/null -> "fx"
+	if ( opt.queue == null || opt.queue === true ) {
+		opt.queue = "fx";
+	}
+
+	// Queueing
+	opt.old = opt.complete;
+
+	opt.complete = function() {
+		if ( jQuery.isFunction( opt.old ) ) {
+			opt.old.call( this );
+		}
+
+		if ( opt.queue ) {
+			jQuery.dequeue( this, opt.queue );
+		}
+	};
+
+	return opt;
+};
+
+jQuery.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p*Math.PI ) / 2;
+	}
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+	var timer,
+		timers = jQuery.timers,
+		i = 0;
+
+	for ( ; i < timers.length; i++ ) {
+		timer = timers[ i ];
+		// Checks the timer has not already been removed
+		if ( !timer() && timers[ i ] === timer ) {
+			timers.splice( i--, 1 );
+		}
+	}
+
+	if ( !timers.length ) {
+		jQuery.fx.stop();
+	}
+};
+
+jQuery.fx.timer = function( timer ) {
+	if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
+		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+	}
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.stop = function() {
+	clearInterval( timerId );
+	timerId = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+	// Default speed
+	_default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+var rroot = /^(?:body|html)$/i;
+
+jQuery.fn.offset = function( options ) {
+	if ( arguments.length ) {
+		return options === undefined ?
+			this :
+			this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+	}
+
+	var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft,
+		box = { top: 0, left: 0 },
+		elem = this[ 0 ],
+		doc = elem && elem.ownerDocument;
+
+	if ( !doc ) {
+		return;
+	}
+
+	if ( (body = doc.body) === elem ) {
+		return jQuery.offset.bodyOffset( elem );
+	}
+
+	docElem = doc.documentElement;
+
+	// Make sure it's not a disconnected DOM node
+	if ( !jQuery.contains( docElem, elem ) ) {
+		return box;
+	}
+
+	// If we don't have gBCR, just use 0,0 rather than error
+	// BlackBerry 5, iOS 3 (original iPhone)
+	if ( typeof elem.getBoundingClientRect !== "undefined" ) {
+		box = elem.getBoundingClientRect();
+	}
+	win = getWindow( doc );
+	clientTop  = docElem.clientTop  || body.clientTop  || 0;
+	clientLeft = docElem.clientLeft || body.clientLeft || 0;
+	scrollTop  = win.pageYOffset || docElem.scrollTop;
+	scrollLeft = win.pageXOffset || docElem.scrollLeft;
+	return {
+		top: box.top  + scrollTop  - clientTop,
+		left: box.left + scrollLeft - clientLeft
+	};
+};
+
+jQuery.offset = {
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		if ( jQuery.support.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;
+		}
+
+		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 || document.body;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+	var top = /Y/.test( prop );
+
+	jQuery.fn[ method ] = function( val ) {
+		return jQuery.access( this, function( elem, method, val ) {
+			var win = getWindow( elem );
+
+			if ( val === undefined ) {
+				return win ? (prop in win) ? win[ prop ] :
+					win.document.documentElement[ method ] :
+					elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : jQuery( win ).scrollLeft(),
+					 top ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length, null );
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+		// margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return jQuery.access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( jQuery.isWindow( elem ) ) {
+					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+					// isn't a whole lot we can do. See pull request at this URL for discussion:
+					// https://github.com/jquery/jquery/pull/764
+					return elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
+					// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, value, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable, null );
+		};
+	});
+});
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+	define( "jquery", [], function () { return jQuery; } );
+}
+
+})( window );
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/depData.json b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/depData.json
new file mode 100644
index 0000000..9242ea5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/depData.json
@@ -0,0 +1,442 @@
+{
+	"jquery.mobile.tizen.scrollview": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "jquery.mobile.tizen.scrollview.js",
+		"name": "jquery.mobile.tizen.scrollview",
+		"depends": [],
+		"label": "Scrollview",
+		"group": "Tizen:Core",
+		"description": "Implements scroll by javascript"
+	},
+	"jquery.mobile.tizen.pinch": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "jquery.mobile.tizen.pinch.js",
+		"name": "jquery.mobile.tizen.pinch",
+		"depends": [
+			"jquery.mobile.core"
+		],
+		"label": "Tizen core",
+		"group": "Tizen:Core",
+		"description": "Tizen core library"
+	},
+	"jquery.mobile.tizen.core": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "jquery.mobile.tizen.core.js",
+		"name": "jquery.mobile.tizen.core",
+		"depends": [
+			"jquery.mobile.core",
+			"jquery.mobile.tizen.configure",
+			"util/ensurens"
+		],
+		"label": "Tizen core",
+		"group": "Tizen:Core",
+		"description": "Tizen core library"
+	},
+	"util/range": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "util/range.js",
+		"name": "util/range",
+		"depends": [],
+		"label": "Range",
+		"group": "Tizen:Utilities",
+		"description": "Makes array with given range"
+	},
+	"util/ensurens": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "util/ensurens.js",
+		"name": "util/ensurens",
+		"depends": [],
+		"label": "Ensurens",
+		"group": "Tizen:Utilities",
+		"description": "Make namespace for modules"
+	},
+	"jquery.mobile.tizen.clrlib": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "jquery.mobile.tizen.clrlib.js",
+		"name": "jquery.mobile.tizen.clrlib",
+		"depends": [
+			"util/ensurens"
+		],
+		"label": "Color library",
+		"group": "Tizen:Core",
+		"description": "Color code converter"
+	},
+	"jquery.mobile.tizen.configure": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "jquery.mobile.tizen.configure.js",
+		"name": "jquery.mobile.tizen.configure",
+		"depends": [],
+		"label": "Configuration",
+		"group": "Tizen:Core",
+		"description": "jQuery Mobile configuration for Tizen widgets"
+	},
+	"widgets/jquery.mobile.tizen.gallery3d": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.gallery3d.js",
+		"name": "widgets/jquery.mobile.tizen.gallery3d",
+		"depends": [
+			"widgets/components/imageloader",
+			"widgets/components/motionpath",
+			"widgets/components/webgl"
+		],
+		"label": "Gallery3d",
+		"group": "Tizen:Widgets",
+		"description": "3D photo gallery widget."
+	},
+	"widgets/jquery.mobile.tizen.multimediaview": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.multimediaview.js",
+		"name": "widgets/jquery.mobile.tizen.multimediaview",
+		"depends": [
+			"jquery.mobile.tizen.scrollview"
+		],
+		"label": "Multimedia view",
+		"group": "Tizen:Widgets",
+		"description": "Shows multimedia and its controls"
+	},
+	"widgets/jquery.mobile.tizen.button": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.button.js",
+		"name": "widgets/jquery.mobile.tizen.button",
+		"depends": [],
+		"label": "Button",
+		"group": "Tizen:Widgets",
+		"description": "Tizen button"
+	},
+	"widgets/jquery.mobile.tizen.scrollview.handler": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.scrollview.handler.js",
+		"name": "widgets/jquery.mobile.tizen.scrollview.handler",
+		"depends": [
+			"jquery.mobile.tizen.core",
+			"jquery.mobile.tizen.scrollview"
+		],
+		"label": "Scrollview Handler",
+		"group": "Tizen:Widgets",
+		"description": "Shows a scroll-handler with a scrollview"
+	},
+	"widgets/jquery.mobile.tizen.popupwindow.ctxpopup": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.popupwindow.ctxpopup.js",
+		"name": "widgets/jquery.mobile.tizen.popupwindow.ctxpopup",
+		"depends": [
+			"jquery.mobile.tizen.core",
+			"widgets/jquery.mobile.tizen.popupwindow",
+			"widgets/jquery.mobile.tizen.triangle"
+		],
+		"label": "Context popup",
+		"group": "Tizen:Widgets",
+		"description": "Shows popup at any place in the page content, with various styles"
+	},
+	"widgets/jquery.mobile.tizen.datetimepicker": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.datetimepicker.js",
+		"name": "widgets/jquery.mobile.tizen.datetimepicker",
+		"depends": [
+			"widgets/jquery.mobile.tizen.widgetex",
+			"widgets/jquery.mobile.tizen.popupwindow",
+			"widgets/jquery.mobile.tizen.popupwindow.ctxpopup"
+		],
+		"label": "Datetime picker",
+		"group": "Tizen:Widgets",
+		"description": "Shows date and time, and make them able to be changed by user"
+	},
+	"widgets/jquery.mobile.tizen.slider": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.slider.js",
+		"name": "widgets/jquery.mobile.tizen.slider",
+		"depends": [
+			"jquery.mobile.tizen.core"
+		],
+		"label": "Slider",
+		"group": "Tizen:Widgets",
+		"description": "Shows slider bar to input number by dragging"
+	},
+	"widgets/jquery.mobile.tizen.swipe": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.swipe.js",
+		"name": "widgets/jquery.mobile.tizen.swipe",
+		"depends": [
+			"jquery.mobile.tizen.core"
+		],
+		"label": "Swipe list",
+		"group": "Tizen:Widgets",
+		"description": "Shows background listitem by swiping left/right on a listitem"
+	},
+	"widgets/jquery.mobile.tizen.listdivider": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.listdivider.js",
+		"name": "widgets/jquery.mobile.tizen.listdivider",
+		"depends": [],
+		"label": "List divider",
+		"group": "Tizen:Widgets",
+		"description": "Divider listitem in listview"
+	},
+	"widgets/jquery.mobile.tizen.notification": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.notification.js",
+		"name": "widgets/jquery.mobile.tizen.notification",
+		"depends": [
+			"jquery.mobile.tizen.core"
+		],
+		"label": "Notification",
+		"group": "Tizen:Widgets",
+		"description": "Shows notification popup over header/footer"
+	},
+	"widgets/jquery.mobile.tizen.pagelayout": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.pagelayout.js",
+		"name": "widgets/jquery.mobile.tizen.pagelayout",
+		"depends": [
+			"jquery.mobile.tizen.core"
+		],
+		"label": "Pagelayout",
+		"group": "Tizen:Widgets",
+		"description": "Set a layout of pages"
+	},
+	"widgets/jquery.mobile.tizen.checkbox": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.checkbox.js",
+		"name": "widgets/jquery.mobile.tizen.checkbox",
+		"depends": [],
+		"label": "//>>label: Checkbox",
+		"group": "//>>group: Tizen:Widgets",
+		"description": "//>>description: Checkbox widget"
+	},
+	"widgets/jquery.mobile.tizen.splitview": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.splitview.js",
+		"name": "widgets/jquery.mobile.tizen.splitview",
+		"depends": [
+			"jquery.mobile.tizen.scrollview"
+		],
+		"label": "Split view",
+		"group": "Tizen:Widgets",
+		"description": "Show different HTML contents at the same time on each divided pane."
+	},
+	"widgets/jquery.mobile.tizen.virtualgrid": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.virtualgrid.js",
+		"name": "widgets/jquery.mobile.tizen.virtualgrid",
+		"depends": [
+			"jquery.mobile.tizen.core",
+			"jquery.mobile.tizen.scrollview"
+		],
+		"label": "Virtual grid",
+		"group": "Tizen:Widgets",
+		"description": "Shows grid swapping its contents automatically"
+	},
+	"widgets/jquery.mobile.tizen.searchbar": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.searchbar.js",
+		"name": "widgets/jquery.mobile.tizen.searchbar",
+		"depends": [
+			"jquery.mobile.tizen.core",
+			"widgets/jquery.mobile.tizen.pagelayout"
+		],
+		"label": "Searchbar",
+		"group": "Tizen:Widgets",
+		"description": "Shows searchbar, for text search"
+	},
+	"widgets/jquery.mobile.tizen.gallery": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.gallery.js",
+		"name": "widgets/jquery.mobile.tizen.gallery",
+		"depends": [],
+		"label": "Gallery",
+		"group": "Tizen:Widgets",
+		"description": "Shows images one by one, and moves them by flicking"
+	},
+	"widgets/jquery.mobile.tizen.circularview": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.circularview.js",
+		"name": "widgets/jquery.mobile.tizen.circularview",
+		"depends": [
+			"jquery.mobile.tizen.scrollview"
+		],
+		"label": "Circularview",
+		"group": "Tizen:Widgets",
+		"description": "Container widget showing children circulary"
+	},
+	"widgets/components/imageloader": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/components/imageloader.js",
+		"name": "widgets/components/imageloader",
+		"depends": [],
+		"label": "Image loader",
+		"group": "Tizen:Widgets:Components",
+		"description": "Tizen image loader component for gallery3d"
+	},
+	"widgets/components/motionpath": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/components/motionpath.js",
+		"name": "widgets/components/motionpath",
+		"depends": [],
+		"label": "Motion path",
+		"group": "Tizen:Widgets:Components",
+		"description": "Tizen motion path component for gallery3d"
+	},
+	"widgets/components/webgl": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/components/webgl.js",
+		"name": "widgets/components/webgl",
+		"depends": [],
+		"label": "WebGL",
+		"group": "Tizen:Widgets:Lib",
+		"description": "Tizen WebGL component for gallery3d"
+	},
+	"widgets/jquery.mobile.tizen.popupwindow": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.popupwindow.js",
+		"name": "widgets/jquery.mobile.tizen.popupwindow",
+		"depends": [
+			"jquery.mobile.tizen.core",
+			"widgets/jquery.mobile.tizen.widgetex"
+		],
+		"label": "Popup",
+		"group": "Tizen:Widgets",
+		"description": "Shows popup on the page"
+	},
+	"widgets/jquery.mobile.tizen.virtuallistview": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.virtuallistview.js",
+		"name": "widgets/jquery.mobile.tizen.virtuallistview",
+		"depends": [
+			"jquery.mobile.tizen.core",
+			"jquery.mobile.tizen.scrollview"
+		],
+		"label": "Virtual listview",
+		"group": "Tizen:Widgets",
+		"description": "Shows listview swapping its contents automatically"
+	},
+	"widgets/jquery.mobile.tizen.progress": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.progress.js",
+		"name": "widgets/jquery.mobile.tizen.progress",
+		"depends": [
+			"jquery.mobile.tizen.core"
+		],
+		"label": "Progress",
+		"group": "Tizen:Widgets",
+		"description": "Shows progressbar or progress circle"
+	},
+	"widgets/jquery.mobile.tizen.fastscroll": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.fastscroll.js",
+		"name": "widgets/jquery.mobile.tizen.fastscroll",
+		"depends": [
+			"jquery.mobile.tizen.scrollview"
+		],
+		"label": "Fastscroll",
+		"group": "Tizen:Widgets",
+		"description": "Shows list index and scroll to the index directly"
+	},
+	"widgets/jquery.mobile.tizen.widgetex": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.widgetex.js",
+		"name": "widgets/jquery.mobile.tizen.widgetex",
+		"depends": [
+			"jquery.mobile.tizen.core"
+		],
+		"label": "Widget extension",
+		"group": "Tizen:Widgets",
+		"description": "Widget class extending functionality of jQueryMobile widget class"
+	},
+	"widgets/jquery.mobile.tizen.tabbar": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.tabbar.js",
+		"name": "widgets/jquery.mobile.tizen.tabbar",
+		"depends": [
+			"jquery.mobile.tizen.core",
+			"widgets/jquery.mobile.tizen.pagelayout"
+		],
+		"label": "Tabbar",
+		"group": "Tizen:Widgets",
+		"description": "Shows buttons divided automatically on the header"
+	},
+	"widgets/jquery.mobile.tizen.triangle": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.triangle.js",
+		"name": "widgets/jquery.mobile.tizen.triangle",
+		"depends": [
+			"jquery.mobile.tizen.core",
+			"widgets/jquery.mobile.tizen.widgetex"
+		],
+		"label": "Triangle",
+		"group": "Tizen:Widgets",
+		"description": "Shows triangle, used by context popup"
+	},
+	"widgets/jquery.mobile.tizen.tokentextarea": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.tokentextarea.js",
+		"name": "widgets/jquery.mobile.tizen.tokentextarea",
+		"depends": [
+			"jquery.mobile.tizen.core"
+		],
+		"label": "Token textarea",
+		"group": "Tizen:Widgets",
+		"description": "Make words to selectable tokens"
+	},
+	"widgets/jquery.mobile.tizen.progressbar": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.progressbar.js",
+		"name": "widgets/jquery.mobile.tizen.progressbar",
+		"depends": [
+			"jquery.mobile.tizen.core"
+		],
+		"label": "Progressbar",
+		"group": "Tizen:Widgets",
+		"description": "Shows progressbar"
+	},
+	"widgets/jquery.mobile.tizen.extendablelist": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "widgets/jquery.mobile.tizen.extendablelist.js",
+		"name": "widgets/jquery.mobile.tizen.extendablelist",
+		"depends": [
+			"jquery.mobile.tizen.scrollview"
+		],
+		"label": "Extendable list",
+		"group": "Tizen:Widgets",
+		"description": "Listview which can be extended more and more"
+	},
+	"jquery.mobile.tizen.loadprototype": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "jquery.mobile.tizen.loadprototype.js",
+		"name": "jquery.mobile.tizen.loadprototype",
+		"depends": [
+			"util/ensurens"
+		],
+		"label": "Widget prototype loader",
+		"group": "Tizen:Core",
+		"description": "Loads widget's prototype"
+	},
+	"jquery.mobile.tizen.loader": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "jquery.mobile.tizen.loader.js",
+		"name": "jquery.mobile.tizen.loader",
+		"depends": [
+			"jquery.mobile.tizen.core"
+		],
+		"label": "Loader",
+		"group": "Tizen:Core",
+		"description": "Loader doing theme loading, viewport setting, globalize loading, etc."
+	},
+	"jquery.mobile.label": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "jquery.mobile.label.js",
+		"name": "jquery.mobile.label",
+		"depends": [],
+		"label": "Label",
+		"group": "Tizen:Core",
+		"description": "Add markup for labels"
+	},
+	"jquery.mobile.core": {
+		"basedir": "/home/blueisle/playground/web/tizen/web-ui-fw.release/src/js",
+		"path": "jquery.mobile.core",
+		"name": "jquery.mobile.core",
+		"depends": [],
+		"label": "",
+		"group": "",
+		"description": ""
+	}
+}
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/depend.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/depend.js
new file mode 100644
index 0000000..8de7760
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/depend.js
@@ -0,0 +1,27 @@
+/** @license
+ * Plugin to load JS files that have dependencies but aren't wrapped into
+ * `define` calls.
+ * Author: Miller Medeiros
+ * Version: 0.1.0 (2011/12/13)
+ * Released under the MIT license
+ */
+define(function () {
+
+    var rParts = /^(.*)\[([^\]]*)\]$/;
+
+    return {
+
+        //example: depend!bar[jquery,lib/foo]
+        load : function(name, req, onLoad, config){
+            var parts = rParts.exec(name);
+
+            req(parts[2].split(','), function(){
+                req([parts[1]], function(mod){
+                    onLoad(mod);
+                });
+            });
+        }
+
+    };
+
+});
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/events/orientationchange.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/events/orientationchange.js
new file mode 100644
index 0000000..db9e01e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/events/orientationchange.js
@@ -0,0 +1,155 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Orientation change event
+//>>label: orientationchange
+//>>group: Events
+
+define( [ "jquery", "../jquery.mobile.support.orientation", "./throttledresize" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+
+(function( $, window ) {
+	var win = $.mobile.$window,
+		event_name = "orientationchange",
+		special_event,
+		get_orientation,
+		last_orientation,
+		initial_orientation_is_landscape,
+		initial_orientation_is_default,
+		portrait_map = { "0": true, "180": true };
+
+	// It seems that some device/browser vendors use window.orientation values 0 and 180 to
+	// denote the "default" orientation. For iOS devices, and most other smart-phones tested,
+	// the default orientation is always "portrait", but in some Android and RIM based tablets,
+	// the default orientation is "landscape". The following code attempts to use the window
+	// dimensions to figure out what the current orientation is, and then makes adjustments
+	// to the to the portrait_map if necessary, so that we can properly decode the
+	// window.orientation value whenever get_orientation() is called.
+	//
+	// Note that we used to use a media query to figure out what the orientation the browser
+	// thinks it is in:
+	//
+	//     initial_orientation_is_landscape = $.mobile.media("all and (orientation: landscape)");
+	//
+	// but there was an iPhone/iPod Touch bug beginning with iOS 4.2, up through iOS 5.1,
+	// where the browser *ALWAYS* applied the landscape media query. This bug does not
+	// happen on iPad.
+
+	if ( $.support.orientation ) {
+
+		// Check the window width and height to figure out what the current orientation
+		// of the device is at this moment. Note that we've initialized the portrait map
+		// values to 0 and 180, *AND* we purposely check for landscape so that if we guess
+		// wrong, , we default to the assumption that portrait is the default orientation.
+		// We use a threshold check below because on some platforms like iOS, the iPhone
+		// form-factor can report a larger width than height if the user turns on the
+		// developer console. The actual threshold value is somewhat arbitrary, we just
+		// need to make sure it is large enough to exclude the developer console case.
+
+		var ww = window.innerWidth || $.mobile.$window.width(),
+			wh = window.innerHeight || $.mobile.$window.height(),
+			landscape_threshold = 50;
+
+		initial_orientation_is_landscape = ww > wh && ( ww - wh ) > landscape_threshold;
+
+
+		// Now check to see if the current window.orientation is 0 or 180.
+		initial_orientation_is_default = portrait_map[ window.orientation ];
+
+		// If the initial orientation is landscape, but window.orientation reports 0 or 180, *OR*
+		// if the initial orientation is portrait, but window.orientation reports 90 or -90, we
+		// need to flip our portrait_map values because landscape is the default orientation for
+		// this device/browser.
+		if ( ( initial_orientation_is_landscape && initial_orientation_is_default ) || ( !initial_orientation_is_landscape && !initial_orientation_is_default ) ) {
+			portrait_map = { "-90": true, "90": true };
+		}
+	}
+
+	$.event.special.orientationchange = $.extend( {}, $.event.special.orientationchange, {
+		setup: function() {
+			// If the event is supported natively, return false so that jQuery
+			// will bind to the event using DOM methods.
+			if ( $.support.orientation && 
+				$.event.special.orientationchange.disabled === false ) {
+				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 && !$.event.special.orientationchange.disabled ) {
+				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( event_name );
+		}
+	}
+
+	// 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 = portrait_map[ window.orientation ];
+		} else {
+			isPortrait = elem && elem.clientWidth / elem.clientHeight < 1.1;
+		}
+
+		return isPortrait ? "portrait" : "landscape";
+	};
+
+	$.fn[ event_name ] = function( fn ) {
+		return fn ? this.bind( event_name, fn ) : this.trigger( event_name );
+	};
+
+	// jQuery < 1.8
+	if ( $.attrFn ) {
+		$.attrFn[ event_name ] = true;
+	}
+
+}( jQuery, this ));
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/events/throttledresize.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/events/throttledresize.js
new file mode 100644
index 0000000..3efeb46
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/events/throttledresize.js
@@ -0,0 +1,47 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Throttled resize event
+//>>label: throttledresize
+//>>group: Events
+
+define( [ "jquery" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+
+	// 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;
+	})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/events/touch.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/events/touch.js
new file mode 100644
index 0000000..fbd2637
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/events/touch.js
@@ -0,0 +1,209 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Touch events: touchstart, touchmove, touchend, tap, taphold, swipe, swipeleft, swiperight, scrollstart, scrollstop
+//>>label: touch
+//>>group: Events
+
+define( [ "jquery", "../jquery.mobile.vmouse", "../jquery.mobile.support.touch" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+
+(function( $, window, undefined ) {
+	// add new event shortcuts
+	$.each( ( "touchstart touchmove touchend " +
+		"tap taphold " +
+		"swipe swipeleft swiperight " +
+		"scrollstart scrollstop" ).split( " " ), function( i, name ) {
+
+		$.fn[ name ] = function( fn ) {
+			return fn ? this.bind( name, fn ) : this.trigger( name );
+		};
+
+		// jQuery < 1.8
+		if ( $.attrFn ) {
+			$.attrFn[ name ] = true;
+		}
+	});
+
+	var supportTouch = $.mobile.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 = {
+		tapholdThreshold: 750,
+
+		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 );
+					$.mobile.$document.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( "vmouseup", clearTapTimer )
+					.bind( "vclick", clickHandler );
+				$.mobile.$document.bind( "vmousecancel", clearTapHandlers );
+
+				timer = setTimeout( function() {
+					triggerCustomEvent( thisObject, "taphold", $.Event( "taphold", { target: origTarget } ) );
+				}, $.event.special.tap.tapholdThreshold );
+			});
+		}
+	};
+
+	// also handles swipeleft, swiperight
+	$.event.special.swipe = {
+		scrollSupressionThreshold: 30, // 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;
+					});
+			});
+		}
+	};
+	$.each({
+		scrollstop: "scrollstart",
+		taphold: "tap",
+		swipeleft: "swipe",
+		swiperight: "swipe"
+	}, function( event, sourceEvent ) {
+
+		$.event.special[ event ] = {
+			setup: function() {
+				$( this ).bind( sourceEvent, $.noop );
+			}
+		};
+	});
+
+})( jQuery, this );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/index.php b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/index.php
new file mode 100644
index 0000000..f8ab8b9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/index.php
@@ -0,0 +1,61 @@
+<?php
+$type = 'text/javascript';
+$files = array(
+	'../LICENSE-INFO.txt',
+	// note that define is only included here as a means
+	// to revert to the pre async include, and should not be
+	// used in other build methods
+	'jquery.mobile.define.js',
+	'jquery.ui.widget.js',
+	'jquery.mobile.widget.js',
+	'jquery.mobile.media.js',
+	'jquery.mobile.support.touch.js',
+	'jquery.mobile.support.orientation.js',
+	'jquery.mobile.support.js',
+	'jquery.mobile.vmouse.js',
+	'events/touch.js',
+	'events/throttledresize.js',
+	'events/orientationchange.js',
+	'jquery.hashchange.js',
+	'widgets/page.js',
+	'jquery.mobile.core.js',
+    'widgets/loader.js',
+	'jquery.mobile.navigation.js',
+	'jquery.mobile.navigation.pushstate.js',
+	'jquery.mobile.transition.js',
+	'transitions/pop.js',
+	'transitions/slide.js',
+	'transitions/slidedown.js',
+	'transitions/slideup.js',
+	'transitions/flip.js',
+	'transitions/flow.js',
+	'transitions/turn.js',
+	'jquery.mobile.degradeInputs.js',
+	'widgets/dialog.js',
+	'widgets/page.sections.js',
+	'widgets/collapsible.js',
+	'widgets/collapsibleSet.js',
+	'jquery.mobile.fieldContain.js',
+	'jquery.mobile.grid.js',
+	'widgets/navbar.js',
+	'widgets/listview.js',
+	'widgets/listview.filter.js',
+	'widgets/listview.autodividers.js',
+	'jquery.mobile.nojs.js',
+	'widgets/forms/checkboxradio.js',
+	'widgets/forms/button.js',
+	'widgets/forms/slider.js',
+	'widgets/forms/textinput.js',
+	'widgets/forms/select.custom.js',
+	'widgets/forms/select.js',
+	'jquery.mobile.buttonMarkup.js',
+	'jquery.mobile.controlGroup.js',
+	'jquery.mobile.links.js',
+	'widgets/fixedToolbar.js',
+	'widgets/popup.js',
+	'jquery.mobile.zoom.js',
+	'jquery.mobile.zoom.iosorientationfix.js',
+	'jquery.mobile.init.js'
+);
+
+require_once('../combine.php');
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.hashchange.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.hashchange.js
new file mode 100644
index 0000000..8d8bf64
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.hashchange.js
@@ -0,0 +1,394 @@
+// 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.
+
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: jQuery hashchange event
+//>>label: jQuery hashchange event
+//>>group: Core
+
+define( [ 
+	"jquery" 
+	], function( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+(function( $, window, undefined ) {
+  // 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);
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.js
new file mode 100644
index 0000000..12c7797
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.js
@@ -0,0 +1,9440 @@
+/*!
+ * jQuery JavaScript Library v1.8.2
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: Thu Sep 20 2012 21:13:05 GMT-0400 (Eastern Daylight Time)
+ */
+(function( window, undefined ) {
+var
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// Use the correct document accordingly with window argument (sandbox)
+	document = window.document,
+	location = window.location,
+	navigator = window.navigator,
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// Save a reference to some core methods
+	core_push = Array.prototype.push,
+	core_slice = Array.prototype.slice,
+	core_indexOf = Array.prototype.indexOf,
+	core_toString = Object.prototype.toString,
+	core_hasOwn = Object.prototype.hasOwnProperty,
+	core_trim = String.prototype.trim,
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Used for matching numbers
+	core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
+
+	// Used for detecting and trimming whitespace
+	core_rnotwhite = /\S/,
+	core_rspace = /\s+/,
+
+	// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
+
+	// Matches dashed string for camelizing
+	rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([\da-z])/gi,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return ( letter + "" ).toUpperCase();
+	},
+
+	// The ready event handler and self cleanup method
+	DOMContentLoaded = function() {
+		if ( document.addEventListener ) {
+			document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+			jQuery.ready();
+		} else if ( document.readyState === "complete" ) {
+			// we're here because readyState === "complete" in oldIE
+			// which is good enough for us to call the dom ready!
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	},
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			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 = rquickExpr.exec( selector );
+			}
+
+			// Match html or make sure no context is specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = ( context && context.nodeType ? context.ownerDocument || context : document );
+
+					// scripts is true for back-compat
+					selector = jQuery.parseHTML( match[1], doc, true );
+					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+						this.attr.call( selector, context, true );
+					}
+
+					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.8.2",
+
+	// 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 core_slice.call( this );
+	},
+
+	// 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 = jQuery.merge( this.constructor(), 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 ) {
+		// Add the callback
+		jQuery.ready.promise().done( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		i = +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( core_slice.apply( this, arguments ),
+			"slice", core_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: core_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 ) {
+
+		// Abort if there are pending holds or we're already ready
+		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+			return;
+		}
+
+		// 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").off("ready");
+		}
+	},
+
+	// 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";
+	},
+
+	isWindow: function( obj ) {
+		return obj != null && obj == obj.window;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ core_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 &&
+				!core_hasOwn.call(obj, "constructor") &&
+				!core_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 || core_hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		var name;
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	// data: string of html
+	// context (optional): If specified, the fragment will be created in this context, defaults to document
+	// scripts (optional): If true, will include scripts passed in the html string
+	parseHTML: function( data, context, scripts ) {
+		var parsed;
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		if ( typeof context === "boolean" ) {
+			scripts = context;
+			context = 0;
+		}
+		context = context || document;
+
+		// Single tag
+		if ( (parsed = rsingleTag.exec( data )) ) {
+			return [ context.createElement( parsed[1] ) ];
+		}
+
+		parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
+		return jQuery.merge( [],
+			(parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
+	},
+
+	parseJSON: function( data ) {
+		if ( !data || typeof data !== "string") {
+			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;
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		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 && core_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.toLowerCase() === name.toLowerCase();
+	},
+
+	// args is for internal usage only
+	each: function( obj, callback, args ) {
+		var name,
+			i = 0,
+			length = obj.length,
+			isObj = length === undefined || jQuery.isFunction( obj );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in obj ) {
+					if ( callback.apply( obj[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( obj[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in obj ) {
+					if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+		function( text ) {
+			return text == null ?
+				"" :
+				core_trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				( text + "" ).replace( rtrim, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( arr, results ) {
+		var type,
+			ret = results || [];
+
+		if ( arr != null ) {
+			// The window, strings (and functions) also have 'length'
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			type = jQuery.type( arr );
+
+			if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
+				core_push.call( ret, arr );
+			} else {
+				jQuery.merge( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		var len;
+
+		if ( arr ) {
+			if ( core_indexOf ) {
+				return core_indexOf.call( arr, elem, i );
+			}
+
+			len = arr.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in arr && arr[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var l = second.length,
+			i = first.length,
+			j = 0;
+
+		if ( typeof l === "number" ) {
+			for ( ; 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 retVal,
+			ret = [],
+			i = 0,
+			length = elems.length;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; 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 ) {
+		var tmp, args, proxy;
+
+		if ( typeof context === "string" ) {
+			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
+		args = core_slice.call( arguments, 2 );
+		proxy = function() {
+			return fn.apply( context, args.concat( core_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 || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Multifunctional method to get and set values of a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
+		var exec,
+			bulk = key == null,
+			i = 0,
+			length = elems.length;
+
+		// Sets many values
+		if ( key && typeof key === "object" ) {
+			for ( i in key ) {
+				jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
+			}
+			chainable = 1;
+
+		// Sets one value
+		} else if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = pass === undefined && jQuery.isFunction( value );
+
+			if ( bulk ) {
+				// Bulk operations only iterate when executing function values
+				if ( exec ) {
+					exec = fn;
+					fn = function( elem, key, value ) {
+						return exec.call( jQuery( elem ), value );
+					};
+
+				// Otherwise they run against the entire set
+				} else {
+					fn.call( elems, value );
+					fn = null;
+				}
+			}
+
+			if ( fn ) {
+				for (; i < length; i++ ) {
+					fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+				}
+			}
+
+			chainable = 1;
+		}
+
+		return chainable ?
+			elems :
+
+			// Gets
+			bulk ?
+				fn.call( elems ) :
+				length ? fn( elems[0], key ) : emptyGet;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	}
+});
+
+jQuery.ready.promise = function( obj ) {
+	if ( !readyList ) {
+
+		readyList = jQuery.Deferred();
+
+		// Catch cases where $(document).ready() is called after the browser event has already occurred.
+		// we once tried to use readyState "interactive" here, but it caused issues like the one
+		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			setTimeout( jQuery.ready, 1 );
+
+		// Standards-based browsers support DOMContentLoaded
+		} else 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 {
+			// 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 top = false;
+
+			try {
+				top = window.frameElement == null && document.documentElement;
+			} catch(e) {}
+
+			if ( top && top.doScroll ) {
+				(function doScrollCheck() {
+					if ( !jQuery.isReady ) {
+
+						try {
+							// Use the trick by Diego Perini
+							// http://javascript.nwbox.com/IEContentLoaded/
+							top.doScroll("left");
+						} catch(e) {
+							return setTimeout( doScrollCheck, 50 );
+						}
+
+						// and execute any waiting functions
+						jQuery.ready();
+					}
+				})();
+			}
+		}
+	}
+	return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+	var object = optionsCache[ options ] = {};
+	jQuery.each( options.split( core_rspace ), function( _, flag ) {
+		object[ flag ] = true;
+	});
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	options: an optional list of space-separated options that will change how
+ *			the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+	// Convert options from String-formatted to Object-formatted if needed
+	// (we check in cache first)
+	options = typeof options === "string" ?
+		( optionsCache[ options ] || createOptions( options ) ) :
+		jQuery.extend( {}, options );
+
+	var // Last fire value (for non-forgettable lists)
+		memory,
+		// Flag to know if list was already fired
+		fired,
+		// Flag to know if list is currently firing
+		firing,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = !options.once && [],
+		// Fire callbacks
+		fire = function( data ) {
+			memory = options.memory && data;
+			fired = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			firing = true;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+					memory = false; // To prevent further calls using add
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( stack ) {
+					if ( stack.length ) {
+						fire( stack.shift() );
+					}
+				} else if ( memory ) {
+					list = [];
+				} else {
+					self.disable();
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					// First, we save the current length
+					var start = list.length;
+					(function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							var type = jQuery.type( arg );
+							if ( type === "function" && ( !options.unique || !self.has( arg ) ) ) {
+								list.push( arg );
+							} else if ( arg && arg.length && type !== "string" ) {
+								// Inspect recursively
+								add( arg );
+							}
+						});
+					})( arguments );
+					// Do we need to add the callbacks to the
+					// current firing batch?
+					if ( firing ) {
+						firingLength = list.length;
+					// With memory, if we're not firing then
+					// we should call right away
+					} else if ( memory ) {
+						firingStart = start;
+						fire( memory );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					jQuery.each( arguments, function( _, arg ) {
+						var index;
+						while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+							list.splice( index, 1 );
+							// Handle firing indexes
+							if ( firing ) {
+								if ( index <= firingLength ) {
+									firingLength--;
+								}
+								if ( index <= firingIndex ) {
+									firingIndex--;
+								}
+							}
+						}
+					});
+				}
+				return this;
+			},
+			// Control if a given callback is in the list
+			has: function( fn ) {
+				return jQuery.inArray( fn, list ) > -1;
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				return this;
+			},
+			// Have the list do nothing anymore
+			disable: function() {
+				list = stack = memory = undefined;
+				return this;
+			},
+			// Is it disabled?
+			disabled: function() {
+				return !list;
+			},
+			// Lock the list in its current state
+			lock: function() {
+				stack = undefined;
+				if ( !memory ) {
+					self.disable();
+				}
+				return this;
+			},
+			// Is it locked?
+			locked: function() {
+				return !stack;
+			},
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				args = args || [];
+				args = [ context, args.slice ? args.slice() : args ];
+				if ( list && ( !fired || stack ) ) {
+					if ( firing ) {
+						stack.push( args );
+					} else {
+						fire( args );
+					}
+				}
+				return this;
+			},
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var tuples = [
+				// action, add listener, listener list, final state
+				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+				[ "notify", "progress", jQuery.Callbacks("memory") ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				then: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( tuples, function( i, tuple ) {
+							var action = tuple[ 0 ],
+								fn = fns[ i ];
+							// deferred[ done | fail | progress ] for forwarding actions to newDefer
+							deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
+								function() {
+									var returned = fn.apply( this, arguments );
+									if ( returned && jQuery.isFunction( returned.promise ) ) {
+										returned.promise()
+											.done( newDefer.resolve )
+											.fail( newDefer.reject )
+											.progress( newDefer.notify );
+									} else {
+										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+									}
+								} :
+								newDefer[ action ]
+							);
+						});
+						fns = null;
+					}).promise();
+				},
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					return obj != null ? jQuery.extend( obj, promise ) : promise;
+				}
+			},
+			deferred = {};
+
+		// Keep pipe for back-compat
+		promise.pipe = promise.then;
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 3 ];
+
+			// promise[ done | fail | progress ] = list.add
+			promise[ tuple[1] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add(function() {
+					// state = [ resolved | rejected ]
+					state = stateString;
+
+				// [ reject_list | resolve_list ].disable; progress_list.lock
+				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+			}
+
+			// deferred[ resolve | reject | notify ] = list.fire
+			deferred[ tuple[0] ] = list.fire;
+			deferred[ tuple[0] + "With" ] = list.fireWith;
+		});
+
+		// Make the deferred a promise
+		promise.promise( deferred );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( subordinate /* , ..., subordinateN */ ) {
+		var i = 0,
+			resolveValues = core_slice.call( arguments ),
+			length = resolveValues.length,
+
+			// the count of uncompleted subordinates
+			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+			// Update function for both resolve and progress values
+			updateFunc = function( i, contexts, values ) {
+				return function( value ) {
+					contexts[ i ] = this;
+					values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+					if( values === progressValues ) {
+						deferred.notifyWith( contexts, values );
+					} else if ( !( --remaining ) ) {
+						deferred.resolveWith( contexts, values );
+					}
+				};
+			},
+
+			progressValues, progressContexts, resolveContexts;
+
+		// add listeners to Deferred subordinates; treat others as resolved
+		if ( length > 1 ) {
+			progressValues = new Array( length );
+			progressContexts = new Array( length );
+			resolveContexts = new Array( length );
+			for ( ; i < length; i++ ) {
+				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+					resolveValues[ i ].promise()
+						.done( updateFunc( i, resolveContexts, resolveValues ) )
+						.fail( deferred.reject )
+						.progress( updateFunc( i, progressContexts, progressValues ) );
+				} else {
+					--remaining;
+				}
+			}
+		}
+
+		// if we're not waiting on anything, resolve the master
+		if ( !remaining ) {
+			deferred.resolveWith( resolveContexts, resolveValues );
+		}
+
+		return deferred.promise();
+	}
+});
+jQuery.support = (function() {
+
+	var support,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		fragment,
+		eventName,
+		i,
+		isSupported,
+		clickFn,
+		div = document.createElement("div");
+
+	// Preliminary tests
+	div.setAttribute( "className", "t" );
+	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+	all = div.getElementsByTagName("*");
+	a = div.getElementsByTagName("a")[ 0 ];
+	a.style.cssText = "top:1px;float:left;opacity:.5";
+
+	// Can't get basic test support
+	if ( !all || !all.length ) {
+		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.5/.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",
+
+		// Tests for enctype support on a form(#6743)
+		enctype: !!document.createElement("form").enctype,
+
+		// Makes sure cloning an html5 element does not cause problems
+		// Where outerHTML is undefined, this still works
+		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+		// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
+		boxModel: ( document.compatMode === "CSS1Compat" ),
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true,
+		boxSizingReliable: true,
+		pixelPosition: false
+	};
+
+	// 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", clickFn = function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent("onclick");
+		div.detachEvent( "onclick", clickFn );
+	}
+
+	// Check if a radio maintains its 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" );
+
+	// #11217 - WebKit loses check when the name is after the checked attribute
+	input.setAttribute( "name", "t" );
+
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.lastChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	fragment.removeChild( input );
+	fragment.appendChild( div );
+
+	// Technique from Juriy Zaytsev
+	// http://perfectionkills.com/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: true,
+			change: true,
+			focusin: true
+		}) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, div, tds, marginDiv,
+			divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		container = document.createElement("div");
+		container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
+		body.insertBefore( container, body.firstChild );
+
+		// Construct the test element
+		div = document.createElement("div");
+		container.appendChild( div );
+
+		// 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)
+		div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName("td");
+		tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+		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 );
+
+		// Check box-sizing and margin behavior
+		div.innerHTML = "";
+		div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+		support.boxSizing = ( div.offsetWidth === 4 );
+		support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
+
+		// NOTE: To any future maintainer, we've window.getComputedStyle
+		// because jsdom on node.js will break without it.
+		if ( window.getComputedStyle ) {
+			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+			// 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
+			marginDiv = document.createElement("div");
+			marginDiv.style.cssText = div.style.cssText = divReset;
+			marginDiv.style.marginRight = marginDiv.style.width = "0";
+			div.style.width = "1px";
+			div.appendChild( marginDiv );
+			support.reliableMarginRight =
+				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+		}
+
+		if ( typeof div.style.zoom !== "undefined" ) {
+			// 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.innerHTML = "";
+			div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+			// Check if elements with layout shrink-wrap their children
+			// (IE 6 does this)
+			div.style.display = "block";
+			div.style.overflow = "visible";
+			div.innerHTML = "<div></div>";
+			div.firstChild.style.width = "5px";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+			container.style.zoom = 1;
+		}
+
+		// Null elements to avoid leaks in IE
+		body.removeChild( container );
+		container = div = tds = marginDiv = null;
+	});
+
+	// Null elements to avoid leaks in IE
+	fragment.removeChild( div );
+	all = a = select = opt = input = fragment = div = null;
+
+	return support;
+})();
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	deletedIds: [],
+
+	// Remove at next major release (1.9/2.0)
+	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[ internalKey ] : elem[ internalKey ] && internalKey;
+
+		// 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 || !cache[id] || (!pvt && !cache[id].data)) && 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[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
+			} else {
+				id = internalKey;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// 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 ] = jQuery.extend( cache[ id ], name );
+			} else {
+				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+			}
+		}
+
+		thisCache = cache[ id ];
+
+		// jQuery data() is stored in a separate object inside the object's internal data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data.
+		if ( !pvt ) {
+			if ( !thisCache.data ) {
+				thisCache.data = {};
+			}
+
+			thisCache = thisCache.data;
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// 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, i, l,
+
+			isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+			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 ] : cache[ id ].data;
+
+			if ( thisCache ) {
+
+				// Support array or space separated string names for data keys
+				if ( !jQuery.isArray( name ) ) {
+
+					// try the string as a key before any manipulation
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+
+						// split the camel cased version by spaces unless a key with the spaces exists
+						name = jQuery.camelCase( name );
+						if ( name in thisCache ) {
+							name = [ name ];
+						} else {
+							name = name.split(" ");
+						}
+					}
+				}
+
+				for ( i = 0, l = name.length; i < l; i++ ) {
+					delete thisCache[ name[i] ];
+				}
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( !pvt ) {
+			delete cache[ id ].data;
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject( cache[ id ] ) ) {
+				return;
+			}
+		}
+
+		// Destroy the cache
+		if ( isNode ) {
+			jQuery.cleanData( [ elem ], true );
+
+		// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+		} else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+			delete cache[ id ];
+
+		// When all else fails, null
+		} else {
+			cache[ id ] = 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 ) {
+		var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+		// nodes accept data unless otherwise specified; rejection can be conditional
+		return !noData || noData !== true && elem.getAttribute("classid") === noData;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var parts, part, attr, name, l,
+			elem = this[0],
+			i = 0,
+			data = null;
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = jQuery.data( elem );
+
+				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+					attr = elem.attributes;
+					for ( l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( !name.indexOf( "data-" ) ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( elem, name, data[ name ] );
+						}
+					}
+					jQuery._data( elem, "parsedAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		parts = key.split( ".", 2 );
+		parts[1] = parts[1] ? "." + parts[1] : "";
+		part = parts[1] + "!";
+
+		return jQuery.access( this, function( value ) {
+
+			if ( value === undefined ) {
+				data = this.triggerHandler( "getData" + part, [ parts[0] ] );
+
+				// Try to fetch any internally stored data first
+				if ( data === undefined && elem ) {
+					data = jQuery.data( elem, key );
+					data = dataAttr( elem, key, data );
+				}
+
+				return data === undefined && parts[1] ?
+					this.data( parts[0] ) :
+					data;
+			}
+
+			parts[1] = value;
+			this.each(function() {
+				var self = jQuery( this );
+
+				self.triggerHandler( "setData" + part, parts );
+				jQuery.data( this, key, value );
+				self.triggerHandler( "changeData" + part, parts );
+			});
+		}, null, value, arguments.length > 1, null, false );
+	},
+
+	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 :
+				// Only convert to a number if it doesn't change the string
+				+data + "" === data ? +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;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	var name;
+	for ( name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+jQuery.extend({
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || jQuery.isArray(data) ) {
+					queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+				} else {
+					queue.push( data );
+				}
+			}
+			return queue || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			startLength = queue.length,
+			fn = queue.shift(),
+			hooks = jQuery._queueHooks( elem, type ),
+			next = function() {
+				jQuery.dequeue( elem, type );
+			};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+			startLength--;
+		}
+
+		if ( fn ) {
+
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			// clear up the last queue stop function
+			delete hooks.stop;
+			fn.call( elem, next, hooks );
+		}
+
+		if ( !startLength && hooks ) {
+			hooks.empty.fire();
+		}
+	},
+
+	// not intended for public consumption - generates a queueHooks object, or returns the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+			empty: jQuery.Callbacks("once memory").add(function() {
+				jQuery.removeData( elem, type + "queue", true );
+				jQuery.removeData( elem, key, true );
+			})
+		});
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[0], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each(function() {
+				var queue = jQuery.queue( this, type, data );
+
+				// ensure a hooks for this queue
+				jQuery._queueHooks( this, type );
+
+				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( next, hooks ) {
+			var timeout = setTimeout( next, time );
+			hooks.stop = function() {
+				clearTimeout( timeout );
+			};
+		});
+	},
+	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, obj ) {
+		var tmp,
+			count = 1,
+			defer = jQuery.Deferred(),
+			elements = this,
+			i = this.length,
+			resolve = function() {
+				if ( !( --count ) ) {
+					defer.resolveWith( elements, [ elements ] );
+				}
+			};
+
+		if ( typeof type !== "string" ) {
+			obj = type;
+			type = undefined;
+		}
+		type = type || "fx";
+
+		while( i-- ) {
+			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+});
+var nodeHook, boolHook, fixSpecified,
+	rclass = /[\t\r\n]/g,
+	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,
+	getSetAttribute = jQuery.support.getSetAttribute;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	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( core_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 ] + " " ) < 0 ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var removes, className, elem, c, cl, i, l;
+
+		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 ) {
+			removes = ( value || "" ).split( core_rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+				if ( elem.nodeType === 1 && elem.className ) {
+
+					className = (" " + elem.className + " ").replace( rclass, " " );
+
+					// loop over each item in the removal list
+					for ( c = 0, cl = removes.length; c < cl; c++ ) {
+						// Remove until there is nothing to remove,
+						while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) {
+							className = className.replace( " " + removes[ c ] + " " , " " );
+						}
+					}
+					elem.className = value ? jQuery.trim( 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( core_rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space separated 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 + " ",
+			i = 0,
+			l = this.length;
+		for ( ; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[0];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				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;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var val,
+				self = jQuery(this);
+
+			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.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// 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, i, max, option,
+					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
+				i = one ? index : 0;
+				max = one ? index + 1 : options.length;
+				for ( ; i < max; i++ ) {
+					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;
+			}
+		}
+	},
+
+	// Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
+	attrFn: {},
+
+	attr: function( elem, name, value, pass ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( notxml ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+
+			} 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, value ) {
+		var propName, attrNames, name, isBool,
+			i = 0;
+
+		if ( value && elem.nodeType === 1 ) {
+
+			attrNames = value.split( core_rspace );
+
+			for ( ; i < attrNames.length; i++ ) {
+				name = attrNames[ i ];
+
+				if ( name ) {
+					propName = jQuery.propFix[ name ] || name;
+					isBool = rboolean.test( name );
+
+					// See #9699 for explanation of this approach (setting first, then removal)
+					// Do not do this for boolean attributes (see #10870)
+					if ( !isBool ) {
+						jQuery.attr( elem, name, "" );
+					}
+					elem.removeAttribute( getSetAttribute ? name : propName );
+
+					// Set corresponding property to false for boolean attributes
+					if ( isBool && propName 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 ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		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;
+			}
+		}
+	}
+});
+
+// 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,
+			property = jQuery.prop( elem, name );
+		return property === true || typeof property !== "boolean" && ( 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 ( !getSetAttribute ) {
+
+	fixSpecified = {
+		name: true,
+		id: true,
+		coords: true
+	};
+
+	// 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 ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
+				ret.value :
+				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.value = 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;
+				}
+			}
+		});
+	});
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		get: nodeHook.get,
+		set: function( elem, value, name ) {
+			if ( value === "" ) {
+				value = "false";
+			}
+			nodeHook.set( elem, value, name );
+		}
+	};
+}
+
+
+// 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;
+		}
+	});
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// 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 rformElems = /^(?:textarea|input|select)$/i,
+	rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
+	rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	hoverHack = function( events ) {
+		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+	};
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var elemData, eventHandle, events,
+			t, tns, type, namespaces, handleObj,
+			handleObjIn, handlers, special;
+
+		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
+		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		events = elemData.events;
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+		eventHandle = elemData.handle;
+		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.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = jQuery.trim( hoverHack(types) ).split( " " );
+		for ( t = 0; t < types.length; t++ ) {
+
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = tns[1];
+			namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend({
+				type: type,
+				origType: tns[1],
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+				namespace: namespaces.join(".")
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			handlers = events[ type ];
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// 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 to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever 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, selector, mappedTypes ) {
+
+		var t, tns, type, origType, namespaces, origCount,
+			j, events, special, eventType, handleObj,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+		for ( t = 0; t < types.length; t++ ) {
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tns[1];
+			namespaces = tns[2];
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector? special.delegateType : special.bindType ) || type;
+			eventType = events[ type ] || [];
+			origCount = eventType.length;
+			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+
+			// Remove matching events
+			for ( j = 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					 ( !handler || handler.guid === handleObj.guid ) &&
+					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+					eventType.splice( j--, 1 );
+
+					if ( handleObj.selector ) {
+						eventType.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( eventType.length === 0 && origCount !== eventType.length ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			delete elemData.handle;
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery.removeData( elem, "events", 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 ) {
+		// Don't do events on text and comment nodes
+		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+			return;
+		}
+
+		// Event object or event type
+		var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
+			type = event.type || event,
+			namespaces = [];
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		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.isTrigger = true;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join( "." );
+		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+		// Handle a global trigger
+		if ( !elem ) {
+
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			cache = jQuery.cache;
+			for ( i in cache ) {
+				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+				}
+			}
+			return;
+		}
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			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 );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		eventPath = [[ elem, special.bindType || type ]];
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+			for ( old = elem; cur; cur = cur.parentNode ) {
+				eventPath.push([ cur, bubbleType ]);
+				old = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( old === (elem.ownerDocument || document) ) {
+				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+			}
+		}
+
+		// Fire handlers on the event path
+		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+			cur = eventPath[i][0];
+			event.type = eventPath[i][1];
+
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+			// Note that this is a bare JS function and not a jQuery handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
+				event.preventDefault();
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === 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.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				// IE<9 dies on focus/blur to hidden element (#1486)
+				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					old = elem[ ontype ];
+
+					if ( old ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					elem[ type ]();
+					jQuery.event.triggered = undefined;
+
+					if ( old ) {
+						elem[ ontype ] = old;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event || window.event );
+
+		var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
+			handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+			delegateCount = handlers.delegateCount,
+			args = core_slice.call( arguments ),
+			run_all = !event.exclusive && !event.namespace,
+			special = jQuery.event.special[ event.type ] || {},
+			handlerQueue = [];
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[0] = event;
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers that should run if there are delegated events
+		// Avoid non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && !(event.button && event.type === "click") ) {
+
+			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+
+				// Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.disabled !== true || event.type !== "click" ) {
+					selMatch = {};
+					matches = [];
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+						sel = handleObj.selector;
+
+						if ( selMatch[ sel ] === undefined ) {
+							selMatch[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) >= 0 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( selMatch[ sel ] ) {
+							matches.push( handleObj );
+						}
+					}
+					if ( matches.length ) {
+						handlerQueue.push({ elem: cur, matches: matches });
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( handlers.length > delegateCount ) {
+			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+		}
+
+		// Run delegates first; they may want to stop propagation beneath us
+		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+			matched = handlerQueue[ i ];
+			event.currentTarget = matched.elem;
+
+			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+				handleObj = matched.matches[ j ];
+
+				// Triggered event must either 1) be non-exclusive and have no namespace, or
+				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+					event.data = handleObj.data;
+					event.handleObj = handleObj;
+
+					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+							.apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						event.result = ret;
+						if ( ret === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+	fixHooks: {},
+
+	keyHooks: {
+		props: "char charCode key keyCode".split(" "),
+		filter: function( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var eventDoc, doc, body,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop,
+			originalEvent = event,
+			fixHook = jQuery.event.fixHooks[ event.type ] || {},
+			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = jQuery.Event( originalEvent );
+
+		for ( i = copy.length; i; ) {
+			prop = copy[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Target should not be a text node (#504, Safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
+		event.metaKey = !!event.metaKey;
+
+		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	special: {
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+
+		focus: {
+			delegateType: "focusin"
+		},
+		blur: {
+			delegateType: "focusout"
+		},
+
+		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;
+				}
+			}
+		}
+	},
+
+	simulate: function( type, elem, event, bubble ) {
+		// 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.
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{ type: type,
+				isSimulated: true,
+				originalEvent: {}
+			}
+		);
+		if ( bubble ) {
+			jQuery.event.trigger( e, null, elem );
+		} else {
+			jQuery.event.dispatch.call( elem, e );
+		}
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		var name = "on" + type;
+
+		if ( elem.detachEvent ) {
+
+			// #8545, #7054, preventing memory leaks for custom events in IE6-8 –
+			// detachEvent needed property on element, by name of that event, to properly expose it to GC
+			if ( typeof elem[ name ] === "undefined" ) {
+				elem[ name ] = null;
+			}
+
+			elem.detachEvent( name, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !(this instanceof jQuery.Event) ) {
+		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 );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.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
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var ret,
+				target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj,
+				selector = handleObj.selector;
+
+			// For mousenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !jQuery._data( form, "_submit_attached" ) ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						event._submit_bubble = true;
+					});
+					jQuery._data( form, "_submit_attached", true );
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+
+		postDispatch: function( event ) {
+			// If form was submitted by the user, bubble the event up the tree
+			if ( event._submit_bubble ) {
+				delete event._submit_bubble;
+				if ( this.parentNode && !event.isTrigger ) {
+					jQuery.event.simulate( "submit", this.parentNode, event, true );
+				}
+			}
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+						}
+						// Allow triggered, simulated change events (#11500)
+						jQuery.event.simulate( "change", this, event, true );
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					jQuery._data( elem, "_change_attached", true );
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return !rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// 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,
+			handler = function( event ) {
+				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+			};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+	});
+}
+
+jQuery.fn.extend({
+
+	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+		var origFn, type;
+
+		// Types can be a map of types/handlers
+		if ( typeof types === "object" ) {
+			// ( types-Object, selector, data )
+			if ( typeof selector !== "string" ) { // && selector != null
+				// ( types-Object, data )
+				data = data || selector;
+				selector = undefined;
+			}
+			for ( type in types ) {
+				this.on( type, selector, data, types[ type ], one );
+			}
+			return this;
+		}
+
+		if ( data == null && fn == null ) {
+			// ( types, fn )
+			fn = selector;
+			data = selector = undefined;
+		} else if ( fn == null ) {
+			if ( typeof selector === "string" ) {
+				// ( types, selector, fn )
+				fn = data;
+				data = undefined;
+			} else {
+				// ( types, data, fn )
+				fn = data;
+				data = selector;
+				selector = undefined;
+			}
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		} else if ( !fn ) {
+			return this;
+		}
+
+		if ( one === 1 ) {
+			origFn = fn;
+			fn = function( event ) {
+				// Can use an empty set, since event contains the info
+				jQuery().off( event );
+				return origFn.apply( this, arguments );
+			};
+			// Use same guid so caller can remove using origFn
+			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+		}
+		return this.each( function() {
+			jQuery.event.add( this, types, fn, data, selector );
+		});
+	},
+	one: function( types, selector, data, fn ) {
+		return this.on( types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		var handleObj, type;
+		if ( types && types.preventDefault && types.handleObj ) {
+			// ( event )  dispatched jQuery.Event
+			handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+			// ( types-object [, selector] )
+			for ( type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each(function() {
+			jQuery.event.remove( this, types, fn, selector );
+		});
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	live: function( types, data, fn ) {
+		jQuery( this.context ).on( types, this.selector, data, fn );
+		return this;
+	},
+	die: function( types, fn ) {
+		jQuery( this.context ).off( types, this.selector || "**", fn );
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+	},
+
+	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 );
+	}
+});
+
+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 contextmenu").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.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( rkeyEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+	}
+
+	if ( rmouseEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+	}
+});
+/*!
+ * Sizzle CSS Selector Engine
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://sizzlejs.com/
+ */
+(function( window, undefined ) {
+
+var cachedruns,
+	assertGetIdNotName,
+	Expr,
+	getText,
+	isXML,
+	contains,
+	compile,
+	sortOrder,
+	hasDuplicate,
+	outermostContext,
+
+	baseHasDuplicate = true,
+	strundefined = "undefined",
+
+	expando = ( "sizcache" + Math.random() ).replace( ".", "" ),
+
+	Token = String,
+	document = window.document,
+	docElem = document.documentElement,
+	dirruns = 0,
+	done = 0,
+	pop = [].pop,
+	push = [].push,
+	slice = [].slice,
+	// Use a stripped-down indexOf if a native one is unavailable
+	indexOf = [].indexOf || function( elem ) {
+		var i = 0,
+			len = this.length;
+		for ( ; i < len; i++ ) {
+			if ( this[i] === elem ) {
+				return i;
+			}
+		}
+		return -1;
+	},
+
+	// Augment a function for special use by Sizzle
+	markFunction = function( fn, value ) {
+		fn[ expando ] = value == null || value;
+		return fn;
+	},
+
+	createCache = function() {
+		var cache = {},
+			keys = [];
+
+		return markFunction(function( key, value ) {
+			// Only keep the most recent entries
+			if ( keys.push( key ) > Expr.cacheLength ) {
+				delete cache[ keys.shift() ];
+			}
+
+			return (cache[ key ] = value);
+		}, cache );
+	},
+
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+
+	// Regex
+
+	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+	// http://www.w3.org/TR/css3-syntax/#characters
+	characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",
+
+	// Loosely modeled on CSS identifier characters
+	// An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
+	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+	identifier = characterEncoding.replace( "w", "w#" ),
+
+	// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
+	operators = "([*^$|!~]?=)",
+	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
+		"*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
+
+	// Prefer arguments not in parens/brackets,
+	//   then attribute selectors and non-pseudos (denoted by :),
+	//   then anything else
+	// These preferences are here to reduce the number of selectors
+	//   needing tokenize in the PSEUDO preFilter
+	pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",
+
+	// For matchExpr.POS and matchExpr.needsContext
+	pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
+		"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
+	rpseudo = new RegExp( pseudos ),
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,
+
+	rnot = /^:not/,
+	rsibling = /[\x20\t\r\n\f]*[+~]/,
+	rendsWithNot = /:not\($/,
+
+	rheader = /h\d/i,
+	rinputs = /input|select|textarea|button/i,
+
+	rbackslash = /\\(?!\\)/g,
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
+		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+		"NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
+		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+		"ATTR": new RegExp( "^" + attributes ),
+		"PSEUDO": new RegExp( "^" + pseudos ),
+		"POS": new RegExp( pos, "i" ),
+		"CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace +
+			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+		// For use in libraries implementing .is()
+		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )
+	},
+
+	// Support
+
+	// Used for testing something on an element
+	assert = function( fn ) {
+		var div = document.createElement("div");
+
+		try {
+			return fn( div );
+		} catch (e) {
+			return false;
+		} finally {
+			// release memory in IE
+			div = null;
+		}
+	},
+
+	// Check if getElementsByTagName("*") returns only elements
+	assertTagNameNoComments = assert(function( div ) {
+		div.appendChild( document.createComment("") );
+		return !div.getElementsByTagName("*").length;
+	}),
+
+	// Check if getAttribute returns normalized href attributes
+	assertHrefNotNormalized = assert(function( div ) {
+		div.innerHTML = "<a href='#'></a>";
+		return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
+			div.firstChild.getAttribute("href") === "#";
+	}),
+
+	// Check if attributes should be retrieved by attribute nodes
+	assertAttributes = assert(function( div ) {
+		div.innerHTML = "<select></select>";
+		var type = typeof div.lastChild.getAttribute("multiple");
+		// IE8 returns a string for some attributes even when not present
+		return type !== "boolean" && type !== "string";
+	}),
+
+	// Check if getElementsByClassName can be trusted
+	assertUsableClassName = assert(function( div ) {
+		// Opera can't find a second classname (in 9.6)
+		div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
+		if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
+			return false;
+		}
+
+		// Safari 3.2 caches class attributes and doesn't catch changes
+		div.lastChild.className = "e";
+		return div.getElementsByClassName("e").length === 2;
+	}),
+
+	// Check if getElementById returns elements by name
+	// Check if getElementsByName privileges form controls or returns elements by ID
+	assertUsableName = assert(function( div ) {
+		// Inject content
+		div.id = expando + 0;
+		div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
+		docElem.insertBefore( div, docElem.firstChild );
+
+		// Test
+		var pass = document.getElementsByName &&
+			// buggy browsers will return fewer than the correct 2
+			document.getElementsByName( expando ).length === 2 +
+			// buggy browsers will return more than the correct 0
+			document.getElementsByName( expando + 0 ).length;
+		assertGetIdNotName = !document.getElementById( expando );
+
+		// Cleanup
+		docElem.removeChild( div );
+
+		return pass;
+	});
+
+// If slice is not available, provide a backup
+try {
+	slice.call( docElem.childNodes, 0 )[0].nodeType;
+} catch ( e ) {
+	slice = function( i ) {
+		var elem,
+			results = [];
+		for ( ; (elem = this[i]); i++ ) {
+			results.push( elem );
+		}
+		return results;
+	};
+}
+
+function Sizzle( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+	var match, elem, xml, m,
+		nodeType = context.nodeType;
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	if ( nodeType !== 1 && nodeType !== 9 ) {
+		return [];
+	}
+
+	xml = isXML( context );
+
+	if ( !xml && !seed ) {
+		if ( (match = rquickExpr.exec( selector )) ) {
+			// Speed-up: Sizzle("#ID")
+			if ( (m = match[1]) ) {
+				if ( nodeType === 9 ) {
+					elem = context.getElementById( m );
+					// 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, Opera, and Webkit return items
+						// by name instead of ID
+						if ( elem.id === m ) {
+							results.push( elem );
+							return results;
+						}
+					} else {
+						return results;
+					}
+				} else {
+					// Context is not a document
+					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+						contains( context, elem ) && elem.id === m ) {
+						results.push( elem );
+						return results;
+					}
+				}
+
+			// Speed-up: Sizzle("TAG")
+			} else if ( match[2] ) {
+				push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
+				return results;
+
+			// Speed-up: Sizzle(".CLASS")
+			} else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {
+				push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
+				return results;
+			}
+		}
+	}
+
+	// All others
+	return select( selector.replace( rtrim, "$1" ), context, results, seed, xml );
+}
+
+Sizzle.matches = function( expr, elements ) {
+	return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+	return Sizzle( expr, null, null, [ elem ] ).length > 0;
+};
+
+// Returns a function to use in pseudos for input types
+function createInputPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return name === "input" && elem.type === type;
+	};
+}
+
+// Returns a function to use in pseudos for buttons
+function createButtonPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return (name === "input" || name === "button") && elem.type === type;
+	};
+}
+
+// Returns a function to use in pseudos for positionals
+function createPositionalPseudo( fn ) {
+	return markFunction(function( argument ) {
+		argument = +argument;
+		return markFunction(function( seed, matches ) {
+			var j,
+				matchIndexes = fn( [], seed.length, argument ),
+				i = matchIndexes.length;
+
+			// Match elements found at the specified indexes
+			while ( i-- ) {
+				if ( seed[ (j = matchIndexes[i]) ] ) {
+					seed[j] = !(matches[j] = seed[j]);
+				}
+			}
+		});
+	});
+}
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+	var node,
+		ret = "",
+		i = 0,
+		nodeType = elem.nodeType;
+
+	if ( nodeType ) {
+		if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+			// Use textContent for elements
+			// innerText usage removed for consistency of new lines (see #11153)
+			if ( typeof elem.textContent === "string" ) {
+				return elem.textContent;
+			} else {
+				// Traverse its children
+				for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+					ret += getText( elem );
+				}
+			}
+		} else if ( nodeType === 3 || nodeType === 4 ) {
+			return elem.nodeValue;
+		}
+		// Do not include comment or processing instruction nodes
+	} else {
+
+		// If no nodeType, this is expected to be an array
+		for ( ; (node = elem[i]); i++ ) {
+			// Do not traverse comment nodes
+			ret += getText( node );
+		}
+	}
+	return ret;
+};
+
+isXML = 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).documentElement;
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+// Element contains another
+contains = Sizzle.contains = docElem.contains ?
+	function( a, b ) {
+		var adown = a.nodeType === 9 ? a.documentElement : a,
+			bup = b && b.parentNode;
+		return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );
+	} :
+	docElem.compareDocumentPosition ?
+	function( a, b ) {
+		return b && !!( a.compareDocumentPosition( b ) & 16 );
+	} :
+	function( a, b ) {
+		while ( (b = b.parentNode) ) {
+			if ( b === a ) {
+				return true;
+			}
+		}
+		return false;
+	};
+
+Sizzle.attr = function( elem, name ) {
+	var val,
+		xml = isXML( elem );
+
+	if ( !xml ) {
+		name = name.toLowerCase();
+	}
+	if ( (val = Expr.attrHandle[ name ]) ) {
+		return val( elem );
+	}
+	if ( xml || assertAttributes ) {
+		return elem.getAttribute( name );
+	}
+	val = elem.getAttributeNode( name );
+	return val ?
+		typeof elem[ name ] === "boolean" ?
+			elem[ name ] ? name : null :
+			val.specified ? val.value : null :
+		null;
+};
+
+Expr = Sizzle.selectors = {
+
+	// Can be adjusted by the user
+	cacheLength: 50,
+
+	createPseudo: markFunction,
+
+	match: matchExpr,
+
+	// IE6/7 return a modified href
+	attrHandle: assertHrefNotNormalized ?
+		{} :
+		{
+			"href": function( elem ) {
+				return elem.getAttribute( "href", 2 );
+			},
+			"type": function( elem ) {
+				return elem.getAttribute("type");
+			}
+		},
+
+	find: {
+		"ID": assertGetIdNotName ?
+			function( id, context, xml ) {
+				if ( typeof context.getElementById !== strundefined && !xml ) {
+					var m = context.getElementById( id );
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					return m && m.parentNode ? [m] : [];
+				}
+			} :
+			function( id, context, xml ) {
+				if ( typeof context.getElementById !== strundefined && !xml ) {
+					var m = context.getElementById( id );
+
+					return m ?
+						m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
+							[m] :
+							undefined :
+						[];
+				}
+			},
+
+		"TAG": assertTagNameNoComments ?
+			function( tag, context ) {
+				if ( typeof context.getElementsByTagName !== strundefined ) {
+					return context.getElementsByTagName( tag );
+				}
+			} :
+			function( tag, context ) {
+				var results = context.getElementsByTagName( tag );
+
+				// Filter out possible comments
+				if ( tag === "*" ) {
+					var elem,
+						tmp = [],
+						i = 0;
+
+					for ( ; (elem = results[i]); i++ ) {
+						if ( elem.nodeType === 1 ) {
+							tmp.push( elem );
+						}
+					}
+
+					return tmp;
+				}
+				return results;
+			},
+
+		"NAME": assertUsableName && function( tag, context ) {
+			if ( typeof context.getElementsByName !== strundefined ) {
+				return context.getElementsByName( name );
+			}
+		},
+
+		"CLASS": assertUsableClassName && function( className, context, xml ) {
+			if ( typeof context.getElementsByClassName !== strundefined && !xml ) {
+				return context.getElementsByClassName( className );
+			}
+		}
+	},
+
+	relative: {
+		">": { dir: "parentNode", first: true },
+		" ": { dir: "parentNode" },
+		"+": { dir: "previousSibling", first: true },
+		"~": { dir: "previousSibling" }
+	},
+
+	preFilter: {
+		"ATTR": function( match ) {
+			match[1] = match[1].replace( rbackslash, "" );
+
+			// Move the given value to match[3] whether quoted or unquoted
+			match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[3] = " " + match[3] + " ";
+			}
+
+			return match.slice( 0, 4 );
+		},
+
+		"CHILD": function( match ) {
+			/* matches from matchExpr["CHILD"]
+				1 type (only|nth|...)
+				2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+				3 xn-component of xn+y argument ([+-]?\d*n|)
+				4 sign of xn-component
+				5 x of xn-component
+				6 sign of y-component
+				7 y of y-component
+			*/
+			match[1] = match[1].toLowerCase();
+
+			if ( match[1] === "nth" ) {
+				// nth-child requires argument
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				// numeric x and y parameters for Expr.filter.CHILD
+				// remember that false/true cast respectively to 0/1
+				match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );
+				match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );
+
+			// other types prohibit arguments
+			} else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			return match;
+		},
+
+		"PSEUDO": function( match ) {
+			var unquoted, excess;
+			if ( matchExpr["CHILD"].test( match[0] ) ) {
+				return null;
+			}
+
+			if ( match[3] ) {
+				match[2] = match[3];
+			} else if ( (unquoted = match[4]) ) {
+				// Only check arguments that contain a pseudo
+				if ( rpseudo.test(unquoted) &&
+					// Get excess from tokenize (recursively)
+					(excess = tokenize( unquoted, true )) &&
+					// advance to the next closing parenthesis
+					(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+					// excess is a negative index
+					unquoted = unquoted.slice( 0, excess );
+					match[0] = match[0].slice( 0, excess );
+				}
+				match[2] = unquoted;
+			}
+
+			// Return only captures needed by the pseudo filter method (type and argument)
+			return match.slice( 0, 3 );
+		}
+	},
+
+	filter: {
+		"ID": assertGetIdNotName ?
+			function( id ) {
+				id = id.replace( rbackslash, "" );
+				return function( elem ) {
+					return elem.getAttribute("id") === id;
+				};
+			} :
+			function( id ) {
+				id = id.replace( rbackslash, "" );
+				return function( elem ) {
+					var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+					return node && node.value === id;
+				};
+			},
+
+		"TAG": function( nodeName ) {
+			if ( nodeName === "*" ) {
+				return function() { return true; };
+			}
+			nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();
+
+			return function( elem ) {
+				return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+			};
+		},
+
+		"CLASS": function( className ) {
+			var pattern = classCache[ expando ][ className ];
+			if ( !pattern ) {
+				pattern = classCache( className, new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)") );
+			}
+			return function( elem ) {
+				return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
+			};
+		},
+
+		"ATTR": function( name, operator, check ) {
+			return function( elem, context ) {
+				var result = Sizzle.attr( elem, name );
+
+				if ( result == null ) {
+					return operator === "!=";
+				}
+				if ( !operator ) {
+					return true;
+				}
+
+				result += "";
+
+				return operator === "=" ? result === check :
+					operator === "!=" ? result !== check :
+					operator === "^=" ? check && result.indexOf( check ) === 0 :
+					operator === "*=" ? check && result.indexOf( check ) > -1 :
+					operator === "$=" ? check && result.substr( result.length - check.length ) === check :
+					operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+					operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :
+					false;
+			};
+		},
+
+		"CHILD": function( type, argument, first, last ) {
+
+			if ( type === "nth" ) {
+				return function( elem ) {
+					var node, diff,
+						parent = elem.parentNode;
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+
+					if ( parent ) {
+						diff = 0;
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								diff++;
+								if ( elem === node ) {
+									break;
+								}
+							}
+						}
+					}
+
+					// Incorporate the offset (or cast to NaN), then check against cycle size
+					diff -= last;
+					return diff === first || ( diff % first === 0 && diff / first >= 0 );
+				};
+			}
+
+			return function( elem ) {
+				var 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;
+
+						/* falls through */
+					case "last":
+						while ( (node = node.nextSibling) ) {
+							if ( node.nodeType === 1 ) {
+								return false;
+							}
+						}
+
+						return true;
+				}
+			};
+		},
+
+		"PSEUDO": function( pseudo, argument ) {
+			// pseudo-class names are case-insensitive
+			// http://www.w3.org/TR/selectors/#pseudo-classes
+			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+			// Remember that setFilters inherits from pseudos
+			var args,
+				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+					Sizzle.error( "unsupported pseudo: " + pseudo );
+
+			// The user may use createPseudo to indicate that
+			// arguments are needed to create the filter function
+			// just as Sizzle does
+			if ( fn[ expando ] ) {
+				return fn( argument );
+			}
+
+			// But maintain support for old signatures
+			if ( fn.length > 1 ) {
+				args = [ pseudo, pseudo, "", argument ];
+				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+					markFunction(function( seed, matches ) {
+						var idx,
+							matched = fn( seed, argument ),
+							i = matched.length;
+						while ( i-- ) {
+							idx = indexOf.call( seed, matched[i] );
+							seed[ idx ] = !( matches[ idx ] = matched[i] );
+						}
+					}) :
+					function( elem ) {
+						return fn( elem, 0, args );
+					};
+			}
+
+			return fn;
+		}
+	},
+
+	pseudos: {
+		"not": markFunction(function( selector ) {
+			// Trim the selector passed to compile
+			// to avoid treating leading and trailing
+			// spaces as combinators
+			var input = [],
+				results = [],
+				matcher = compile( selector.replace( rtrim, "$1" ) );
+
+			return matcher[ expando ] ?
+				markFunction(function( seed, matches, context, xml ) {
+					var elem,
+						unmatched = matcher( seed, null, xml, [] ),
+						i = seed.length;
+
+					// Match elements unmatched by `matcher`
+					while ( i-- ) {
+						if ( (elem = unmatched[i]) ) {
+							seed[i] = !(matches[i] = elem);
+						}
+					}
+				}) :
+				function( elem, context, xml ) {
+					input[0] = elem;
+					matcher( input, null, xml, results );
+					return !results.pop();
+				};
+		}),
+
+		"has": markFunction(function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		}),
+
+		"contains": markFunction(function( text ) {
+			return function( elem ) {
+				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+			};
+		}),
+
+		"enabled": function( elem ) {
+			return elem.disabled === false;
+		},
+
+		"disabled": function( elem ) {
+			return elem.disabled === true;
+		},
+
+		"checked": function( elem ) {
+			// In CSS3, :checked should return both checked and selected elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			var nodeName = elem.nodeName.toLowerCase();
+			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+		},
+
+		"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 !Expr.pseudos["empty"]( elem );
+		},
+
+		"empty": function( elem ) {
+			// http://www.w3.org/TR/selectors/#empty-pseudo
+			// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
+			//   not comment, processing instructions, or others
+			// Thanks to Diego Perini for the nodeName shortcut
+			//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+			var nodeType;
+			elem = elem.firstChild;
+			while ( elem ) {
+				if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {
+					return false;
+				}
+				elem = elem.nextSibling;
+			}
+			return true;
+		},
+
+		"header": function( elem ) {
+			return rheader.test( elem.nodeName );
+		},
+
+		"text": function( elem ) {
+			var type, attr;
+			// 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" &&
+				(type = elem.type) === "text" &&
+				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );
+		},
+
+		// Input types
+		"radio": createInputPseudo("radio"),
+		"checkbox": createInputPseudo("checkbox"),
+		"file": createInputPseudo("file"),
+		"password": createInputPseudo("password"),
+		"image": createInputPseudo("image"),
+
+		"submit": createButtonPseudo("submit"),
+		"reset": createButtonPseudo("reset"),
+
+		"button": function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && elem.type === "button" || name === "button";
+		},
+
+		"input": function( elem ) {
+			return rinputs.test( elem.nodeName );
+		},
+
+		"focus": function( elem ) {
+			var doc = elem.ownerDocument;
+			return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href);
+		},
+
+		"active": function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		},
+
+		// Positional types
+		"first": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ 0 ];
+		}),
+
+		"last": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ length - 1 ];
+		}),
+
+		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ argument < 0 ? argument + length : argument ];
+		}),
+
+		"even": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			for ( var i = 0; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"odd": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			for ( var i = 1; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		})
+	}
+};
+
+function siblingCheck( a, b, ret ) {
+	if ( a === b ) {
+		return ret;
+	}
+
+	var cur = a.nextSibling;
+
+	while ( cur ) {
+		if ( cur === b ) {
+			return -1;
+		}
+
+		cur = cur.nextSibling;
+	}
+
+	return 1;
+}
+
+sortOrder = docElem.compareDocumentPosition ?
+	function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?
+			a.compareDocumentPosition :
+			a.compareDocumentPosition(b) & 4
+		) ? -1 : 1;
+	} :
+	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 );
+	};
+
+// Always assume the presence of duplicates if sort doesn't
+// pass them to our comparison function (as in Google Chrome).
+[0, 0].sort( sortOrder );
+baseHasDuplicate = !hasDuplicate;
+
+// Document sorting and removing duplicates
+Sizzle.uniqueSort = function( results ) {
+	var elem,
+		i = 1;
+
+	hasDuplicate = baseHasDuplicate;
+	results.sort( sortOrder );
+
+	if ( hasDuplicate ) {
+		for ( ; (elem = results[i]); i++ ) {
+			if ( elem === results[ i - 1 ] ) {
+				results.splice( i--, 1 );
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+function tokenize( selector, parseOnly ) {
+	var matched, match, tokens, type, soFar, groups, preFilters,
+		cached = tokenCache[ expando ][ selector ];
+
+	if ( cached ) {
+		return parseOnly ? 0 : cached.slice( 0 );
+	}
+
+	soFar = selector;
+	groups = [];
+	preFilters = Expr.preFilter;
+
+	while ( soFar ) {
+
+		// Comma and first run
+		if ( !matched || (match = rcomma.exec( soFar )) ) {
+			if ( match ) {
+				soFar = soFar.slice( match[0].length );
+			}
+			groups.push( tokens = [] );
+		}
+
+		matched = false;
+
+		// Combinators
+		if ( (match = rcombinators.exec( soFar )) ) {
+			tokens.push( matched = new Token( match.shift() ) );
+			soFar = soFar.slice( matched.length );
+
+			// Cast descendant combinators to space
+			matched.type = match[0].replace( rtrim, " " );
+		}
+
+		// Filters
+		for ( type in Expr.filter ) {
+			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+				// The last two arguments here are (context, xml) for backCompat
+				(match = preFilters[ type ]( match, document, true ))) ) {
+
+				tokens.push( matched = new Token( match.shift() ) );
+				soFar = soFar.slice( matched.length );
+				matched.type = type;
+				matched.matches = match;
+			}
+		}
+
+		if ( !matched ) {
+			break;
+		}
+	}
+
+	// Return the length of the invalid excess
+	// if we're just parsing
+	// Otherwise, throw an error or return tokens
+	return parseOnly ?
+		soFar.length :
+		soFar ?
+			Sizzle.error( selector ) :
+			// Cache the tokens
+			tokenCache( selector, groups ).slice( 0 );
+}
+
+function addCombinator( matcher, combinator, base ) {
+	var dir = combinator.dir,
+		checkNonElements = base && combinator.dir === "parentNode",
+		doneName = done++;
+
+	return combinator.first ?
+		// Check against closest ancestor/preceding element
+		function( elem, context, xml ) {
+			while ( (elem = elem[ dir ]) ) {
+				if ( checkNonElements || elem.nodeType === 1  ) {
+					return matcher( elem, context, xml );
+				}
+			}
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+			if ( !xml ) {
+				var cache,
+					dirkey = dirruns + " " + doneName + " ",
+					cachedkey = dirkey + cachedruns;
+				while ( (elem = elem[ dir ]) ) {
+					if ( checkNonElements || elem.nodeType === 1 ) {
+						if ( (cache = elem[ expando ]) === cachedkey ) {
+							return elem.sizset;
+						} else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {
+							if ( elem.sizset ) {
+								return elem;
+							}
+						} else {
+							elem[ expando ] = cachedkey;
+							if ( matcher( elem, context, xml ) ) {
+								elem.sizset = true;
+								return elem;
+							}
+							elem.sizset = false;
+						}
+					}
+				}
+			} else {
+				while ( (elem = elem[ dir ]) ) {
+					if ( checkNonElements || elem.nodeType === 1 ) {
+						if ( matcher( elem, context, xml ) ) {
+							return elem;
+						}
+					}
+				}
+			}
+		};
+}
+
+function elementMatcher( matchers ) {
+	return matchers.length > 1 ?
+		function( elem, context, xml ) {
+			var i = matchers.length;
+			while ( i-- ) {
+				if ( !matchers[i]( elem, context, xml ) ) {
+					return false;
+				}
+			}
+			return true;
+		} :
+		matchers[0];
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+	var elem,
+		newUnmatched = [],
+		i = 0,
+		len = unmatched.length,
+		mapped = map != null;
+
+	for ( ; i < len; i++ ) {
+		if ( (elem = unmatched[i]) ) {
+			if ( !filter || filter( elem, context, xml ) ) {
+				newUnmatched.push( elem );
+				if ( mapped ) {
+					map.push( i );
+				}
+			}
+		}
+	}
+
+	return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+	if ( postFilter && !postFilter[ expando ] ) {
+		postFilter = setMatcher( postFilter );
+	}
+	if ( postFinder && !postFinder[ expando ] ) {
+		postFinder = setMatcher( postFinder, postSelector );
+	}
+	return markFunction(function( seed, results, context, xml ) {
+		// Positional selectors apply to seed elements, so it is invalid to follow them with relative ones
+		if ( seed && postFinder ) {
+			return;
+		}
+
+		var i, elem, postFilterIn,
+			preMap = [],
+			postMap = [],
+			preexisting = results.length,
+
+			// Get initial elements from seed or context
+			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [], seed ),
+
+			// Prefilter to get matcher input, preserving a map for seed-results synchronization
+			matcherIn = preFilter && ( seed || !selector ) ?
+				condense( elems, preMap, preFilter, context, xml ) :
+				elems,
+
+			matcherOut = matcher ?
+				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+					// ...intermediate processing is necessary
+					[] :
+
+					// ...otherwise use results directly
+					results :
+				matcherIn;
+
+		// Find primary matches
+		if ( matcher ) {
+			matcher( matcherIn, matcherOut, context, xml );
+		}
+
+		// Apply postFilter
+		if ( postFilter ) {
+			postFilterIn = condense( matcherOut, postMap );
+			postFilter( postFilterIn, [], context, xml );
+
+			// Un-match failing elements by moving them back to matcherIn
+			i = postFilterIn.length;
+			while ( i-- ) {
+				if ( (elem = postFilterIn[i]) ) {
+					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+				}
+			}
+		}
+
+		// Keep seed and results synchronized
+		if ( seed ) {
+			// Ignore postFinder because it can't coexist with seed
+			i = preFilter && matcherOut.length;
+			while ( i-- ) {
+				if ( (elem = matcherOut[i]) ) {
+					seed[ preMap[i] ] = !(results[ preMap[i] ] = elem);
+				}
+			}
+		} else {
+			matcherOut = condense(
+				matcherOut === results ?
+					matcherOut.splice( preexisting, matcherOut.length ) :
+					matcherOut
+			);
+			if ( postFinder ) {
+				postFinder( null, results, matcherOut, xml );
+			} else {
+				push.apply( results, matcherOut );
+			}
+		}
+	});
+}
+
+function matcherFromTokens( tokens ) {
+	var checkContext, matcher, j,
+		len = tokens.length,
+		leadingRelative = Expr.relative[ tokens[0].type ],
+		implicitRelative = leadingRelative || Expr.relative[" "],
+		i = leadingRelative ? 1 : 0,
+
+		// The foundational matcher ensures that elements are reachable from top-level context(s)
+		matchContext = addCombinator( function( elem ) {
+			return elem === checkContext;
+		}, implicitRelative, true ),
+		matchAnyContext = addCombinator( function( elem ) {
+			return indexOf.call( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				(checkContext = context).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+		} ];
+
+	for ( ; i < len; i++ ) {
+		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
+		} else {
+			// The concatenated values are (context, xml) for backCompat
+			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+			// Return special upon seeing a positional matcher
+			if ( matcher[ expando ] ) {
+				// Find the next relative operator (if any) for proper handling
+				j = ++i;
+				for ( ; j < len; j++ ) {
+					if ( Expr.relative[ tokens[j].type ] ) {
+						break;
+					}
+				}
+				return setMatcher(
+					i > 1 && elementMatcher( matchers ),
+					i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),
+					matcher,
+					i < j && matcherFromTokens( tokens.slice( i, j ) ),
+					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+					j < len && tokens.join("")
+				);
+			}
+			matchers.push( matcher );
+		}
+	}
+
+	return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+	var bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, expandContext ) {
+			var elem, j, matcher,
+				setMatched = [],
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				outermost = expandContext != null,
+				contextBackup = outermostContext,
+				// We must always have either seed elements or context
+				elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
+				// Nested matchers should use non-integer dirruns
+				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);
+
+			if ( outermost ) {
+				outermostContext = context !== document && context;
+				cachedruns = superMatcher.el;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			for ( ; (elem = elems[i]) != null; i++ ) {
+				if ( byElement && elem ) {
+					for ( j = 0; (matcher = elementMatchers[j]); j++ ) {
+						if ( matcher( elem, context, xml ) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+						cachedruns = ++superMatcher.el;
+					}
+				}
+
+				// Track unmatched elements for set filters
+				if ( bySet ) {
+					// They will have gone through all possible matchers
+					if ( (elem = !matcher && elem) ) {
+						matchedCount--;
+					}
+
+					// Lengthen the array for every element, matched or not
+					if ( seed ) {
+						unmatched.push( elem );
+					}
+				}
+			}
+
+			// Apply set filters to unmatched elements
+			matchedCount += i;
+			if ( bySet && i !== matchedCount ) {
+				for ( j = 0; (matcher = setMatchers[j]); j++ ) {
+					matcher( unmatched, setMatched, context, xml );
+				}
+
+				if ( seed ) {
+					// Reintegrate element matches to eliminate the need for sorting
+					if ( matchedCount > 0 ) {
+						while ( i-- ) {
+							if ( !(unmatched[i] || setMatched[i]) ) {
+								setMatched[i] = pop.call( results );
+							}
+						}
+					}
+
+					// Discard index placeholder values to get only actual matches
+					setMatched = condense( setMatched );
+				}
+
+				// Add matches to results
+				push.apply( results, setMatched );
+
+				// Seedless set matches succeeding multiple successful matchers stipulate sorting
+				if ( outermost && !seed && setMatched.length > 0 &&
+					( matchedCount + setMatchers.length ) > 1 ) {
+
+					Sizzle.uniqueSort( results );
+				}
+			}
+
+			// Override manipulation of globals by nested matchers
+			if ( outermost ) {
+				dirruns = dirrunsUnique;
+				outermostContext = contextBackup;
+			}
+
+			return unmatched;
+		};
+
+	superMatcher.el = 0;
+	return bySet ?
+		markFunction( superMatcher ) :
+		superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
+	var i,
+		setMatchers = [],
+		elementMatchers = [],
+		cached = compilerCache[ expando ][ selector ];
+
+	if ( !cached ) {
+		// Generate a function of recursive functions that can be used to check each element
+		if ( !group ) {
+			group = tokenize( selector );
+		}
+		i = group.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( group[i] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+	}
+	return cached;
+};
+
+function multipleContexts( selector, contexts, results, seed ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[i], results, seed );
+	}
+	return results;
+}
+
+function select( selector, context, results, seed, xml ) {
+	var i, tokens, token, type, find,
+		match = tokenize( selector ),
+		j = match.length;
+
+	if ( !seed ) {
+		// Try to minimize operations if there is only one group
+		if ( match.length === 1 ) {
+
+			// Take a shortcut and set the context if the root selector is an ID
+			tokens = match[0] = match[0].slice( 0 );
+			if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+					context.nodeType === 9 && !xml &&
+					Expr.relative[ tokens[1].type ] ) {
+
+				context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0];
+				if ( !context ) {
+					return results;
+				}
+
+				selector = selector.slice( tokens.shift().length );
+			}
+
+			// Fetch a seed set for right-to-left matching
+			for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {
+				token = tokens[i];
+
+				// Abort if we hit a combinator
+				if ( Expr.relative[ (type = token.type) ] ) {
+					break;
+				}
+				if ( (find = Expr.find[ type ]) ) {
+					// Search, expanding context for leading sibling combinators
+					if ( (seed = find(
+						token.matches[0].replace( rbackslash, "" ),
+						rsibling.test( tokens[0].type ) && context.parentNode || context,
+						xml
+					)) ) {
+
+						// If seed is empty or no tokens remain, we can return early
+						tokens.splice( i, 1 );
+						selector = seed.length && tokens.join("");
+						if ( !selector ) {
+							push.apply( results, slice.call( seed, 0 ) );
+							return results;
+						}
+
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	// Compile and execute a filtering function
+	// Provide `match` to avoid retokenization if we modified the selector above
+	compile( selector, match )(
+		seed,
+		context,
+		xml,
+		results,
+		rsibling.test( selector )
+	);
+	return results;
+}
+
+if ( document.querySelectorAll ) {
+	(function() {
+		var disconnectedMatch,
+			oldSelect = select,
+			rescape = /'|\\/g,
+			rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
+
+			// qSa(:focus) reports false when true (Chrome 21),
+			// A support test would require too much code (would include document ready)
+			rbuggyQSA = [":focus"],
+
+			// matchesSelector(:focus) reports false when true (Chrome 21),
+			// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+			// A support test would require too much code (would include document ready)
+			// just skip matchesSelector for :active
+			rbuggyMatches = [ ":active", ":focus" ],
+			matches = docElem.matchesSelector ||
+				docElem.mozMatchesSelector ||
+				docElem.webkitMatchesSelector ||
+				docElem.oMatchesSelector ||
+				docElem.msMatchesSelector;
+
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert(function( div ) {
+			// Select is set to empty string on purpose
+			// This is to test IE's treatment of not explictly
+			// setting a boolean content attribute,
+			// since its presence should be enough
+			// http://bugs.jquery.com/ticket/12359
+			div.innerHTML = "<select><option selected=''></option></select>";
+
+			// IE8 - Some boolean attributes are not treated correctly
+			if ( !div.querySelectorAll("[selected]").length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
+			}
+
+			// Webkit/Opera - :checked should return selected option elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			// IE8 throws error here (do not put tests after this one)
+			if ( !div.querySelectorAll(":checked").length ) {
+				rbuggyQSA.push(":checked");
+			}
+		});
+
+		assert(function( div ) {
+
+			// Opera 10-12/IE9 - ^= $= *= and empty values
+			// Should not select anything
+			div.innerHTML = "<p test=''></p>";
+			if ( div.querySelectorAll("[test^='']").length ) {
+				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
+			}
+
+			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+			// IE8 throws error here (do not put tests after this one)
+			div.innerHTML = "<input type='hidden'/>";
+			if ( !div.querySelectorAll(":enabled").length ) {
+				rbuggyQSA.push(":enabled", ":disabled");
+			}
+		});
+
+		// rbuggyQSA always contains :focus, so no need for a length check
+		rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") );
+
+		select = function( selector, context, results, seed, xml ) {
+			// Only use querySelectorAll when not filtering,
+			// when this is not xml,
+			// and when no QSA bugs apply
+			if ( !seed && !xml && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+				var groups, i,
+					old = true,
+					nid = expando,
+					newContext = context,
+					newSelector = context.nodeType === 9 && selector;
+
+				// 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
+				if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					groups = tokenize( selector );
+
+					if ( (old = context.getAttribute("id")) ) {
+						nid = old.replace( rescape, "\\$&" );
+					} else {
+						context.setAttribute( "id", nid );
+					}
+					nid = "[id='" + nid + "'] ";
+
+					i = groups.length;
+					while ( i-- ) {
+						groups[i] = nid + groups[i].join("");
+					}
+					newContext = rsibling.test( selector ) && context.parentNode || context;
+					newSelector = groups.join(",");
+				}
+
+				if ( newSelector ) {
+					try {
+						push.apply( results, slice.call( newContext.querySelectorAll(
+							newSelector
+						), 0 ) );
+						return results;
+					} catch(qsaError) {
+					} finally {
+						if ( !old ) {
+							context.removeAttribute("id");
+						}
+					}
+				}
+			}
+
+			return oldSelect( selector, context, results, seed, xml );
+		};
+
+		if ( matches ) {
+			assert(function( div ) {
+				// Check to see if it's possible to do matchesSelector
+				// on a disconnected node (IE 9)
+				disconnectedMatch = matches.call( div, "div" );
+
+				// This should fail with an exception
+				// Gecko does not error, returns false instead
+				try {
+					matches.call( div, "[test!='']:sizzle" );
+					rbuggyMatches.push( "!=", pseudos );
+				} catch ( e ) {}
+			});
+
+			// rbuggyMatches always contains :active and :focus, so no need for a length check
+			rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );
+
+			Sizzle.matchesSelector = function( elem, expr ) {
+				// Make sure that attribute selectors are quoted
+				expr = expr.replace( rattributeQuotes, "='$1']" );
+
+				// rbuggyMatches always contains :active, so no need for an existence check
+				if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && (!rbuggyQSA || !rbuggyQSA.test( expr )) ) {
+					try {
+						var ret = matches.call( elem, 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
+								elem.document && elem.document.nodeType !== 11 ) {
+							return ret;
+						}
+					} catch(e) {}
+				}
+
+				return Sizzle( expr, null, null, [ elem ] ).length > 0;
+			};
+		}
+	})();
+}
+
+// Deprecated
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Back-compat
+function setFilters() {}
+Expr.filters = setFilters.prototype = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})( window );
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prev(?:Until|All))/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	rneedsContext = jQuery.expr.match.needsContext,
+	// 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 i, l, length, n, r, ret,
+			self = this;
+
+		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;
+					}
+				}
+			});
+		}
+
+		ret = this.pushStack( "", "find", selector );
+
+		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 i,
+			targets = jQuery( target, this ),
+			len = targets.length;
+
+		return this.filter(function() {
+			for ( i = 0; i < len; 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" ?
+				// If this is a positional/relative selector, check membership in the returned set
+				// so $("p:first").is("p:last") won't return true for a doc with two "p".
+				rneedsContext.test( selector ) ?
+					jQuery( selector, this.context ).index( this[0] ) >= 0 :
+					jQuery.filter( selector, this ).length > 0 :
+				this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			ret = [],
+			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( ; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+				}
+				cur = cur.parentNode;
+			}
+		}
+
+		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 ) );
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter(selector)
+		);
+	}
+});
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+// 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;
+}
+
+function sibling( cur, dir ) {
+	do {
+		cur = cur[ dir ];
+	} while ( cur && cur.nodeType !== 1 );
+
+	return cur;
+}
+
+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 sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "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.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		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 && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, core_slice.call( arguments ).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;
+	},
+
+	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;
+	});
+}
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+	safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style|link)/i,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+	rcheckableType = /^(?:checkbox|radio)$/,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
+	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, "", "" ]
+	},
+	safeFragment = createSafeFragment( document ),
+	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+// unless wrapped in a div with non-breaking characters in front of it.
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "X<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( value ) {
+		return jQuery.access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+		}, null, value, arguments.length );
+	},
+
+	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 ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each(function(i) {
+			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : 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.nodeType === 11 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( !isDisconnected( this[0] ) ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		}
+
+		if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
+		}
+	},
+
+	after: function() {
+		if ( !isDisconnected( this[0] ) ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		}
+
+		if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		var elem,
+			i = 0;
+
+		for ( ; (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() {
+		var elem,
+			i = 0;
+
+		for ( ; (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 ) {
+		return jQuery.access( this, function( value ) {
+			var elem = this[0] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined ) {
+				return elem.nodeType === 1 ?
+					elem.innerHTML.replace( rinlinejQuery, "" ) :
+					undefined;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+				value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+				try {
+					for (; i < l; i++ ) {
+						// Remove element nodes and prevent memory leaks
+						elem = this[i] || {};
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( elem.getElementsByTagName( "*" ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch(e) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function( value ) {
+		if ( !isDisconnected( this[0] ) ) {
+			// 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 );
+				}
+			});
+		}
+
+		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 ) {
+
+		// Flatten any nested arrays
+		args = [].concat.apply( [], args );
+
+		var results, first, fragment, iNoClone,
+			i = 0,
+			value = args[0],
+			scripts = [],
+			l = this.length;
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback );
+			});
+		}
+
+		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] ) {
+			results = jQuery.buildFragment( args, this, scripts );
+			fragment = results.fragment;
+			first = fragment.firstChild;
+
+			if ( fragment.childNodes.length === 1 ) {
+				fragment = first;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				// Use the original fragment for the last item instead of the first because it can end up
+				// being emptied incorrectly in certain situations (#8070).
+				// Fragments from the fragment cache must always be cloned and never used in place.
+				for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
+					callback.call(
+						table && jQuery.nodeName( this[i], "table" ) ?
+							findOrAppend( this[i], "tbody" ) :
+							this[i],
+						i === iNoClone ?
+							fragment :
+							jQuery.clone( fragment, true, true )
+					);
+				}
+			}
+
+			// Fix #11809: Avoid leaking memory
+			fragment = first = null;
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, function( i, elem ) {
+					if ( elem.src ) {
+						if ( jQuery.ajax ) {
+							jQuery.ajax({
+								url: elem.src,
+								type: "GET",
+								dataType: "script",
+								async: false,
+								global: false,
+								"throws": true
+							});
+						} else {
+							jQuery.error("no ajax");
+						}
+					} else {
+						jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
+					}
+
+					if ( elem.parentNode ) {
+						elem.parentNode.removeChild( elem );
+					}
+				});
+			}
+		}
+
+		return this;
+	}
+});
+
+function findOrAppend( elem, tag ) {
+	return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type, events[ type ][ i ] );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.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();
+
+	if ( nodeName === "object" ) {
+		// IE6-10 improperly clones children of object elements using classid.
+		// IE10 throws NoModificationAllowedError if parent is null, #12132.
+		if ( dest.parentNode ) {
+			dest.outerHTML = src.outerHTML;
+		}
+
+		// This path appears unavoidable for IE9. When cloning an object
+		// element in IE9, the outerHTML strategy above is not sufficient.
+		// If the src has innerHTML and the destination does not,
+		// copy the src.innerHTML into the dest.innerHTML. #10324
+		if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
+			dest.innerHTML = src.innerHTML;
+		}
+
+	} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+		// 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
+
+		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;
+
+	// IE blanks contents when cloning scripts
+	} else if ( nodeName === "script" && dest.text !== src.text ) {
+		dest.text = src.text;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, context, scripts ) {
+	var fragment, cacheable, cachehit,
+		first = args[ 0 ];
+
+	// Set context from what may come in as undefined or a jQuery collection or a node
+	// Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
+	// also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
+	context = context || document;
+	context = !context.nodeType && context[0] || context;
+	context = context.ownerDocument || context;
+
+	// 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
+	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+	if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
+		first.charAt(0) === "<" && !rnocache.test( first ) &&
+		(jQuery.support.checkClone || !rchecked.test( first )) &&
+		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+		// Mark cacheable and look for a hit
+		cacheable = true;
+		fragment = jQuery.fragments[ first ];
+		cachehit = fragment !== undefined;
+	}
+
+	if ( !fragment ) {
+		fragment = context.createDocumentFragment();
+		jQuery.clean( args, context, fragment, scripts );
+
+		// Update the cache, but only store false
+		// unless this is a second parsing of the same content
+		if ( cacheable ) {
+			jQuery.fragments[ first ] = cachehit && fragment;
+		}
+	}
+
+	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 elems,
+			i = 0,
+			ret = [],
+			insert = jQuery( selector ),
+			l = insert.length,
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+		} else {
+			for ( ; i < l; i++ ) {
+				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 ( typeof elem.getElementsByTagName !== "undefined" ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( rcheckableType.test( elem.type ) ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var srcElements,
+			destElements,
+			i,
+			clone;
+
+		if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+			clone = elem.cloneNode( true );
+
+		// IE<=8 does not properly clone detached, unknown element nodes
+		} else {
+			fragmentDiv.innerHTML = elem.outerHTML;
+			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+		}
+
+		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 i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
+			safe = context === document && safeFragment,
+			ret = [];
+
+		// Ensure that context is a document
+		if ( !context || typeof context.createDocumentFragment === "undefined" ) {
+			context = document;
+		}
+
+		// Use the already-created safe fragment if context permits
+		for ( i = 0; (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 {
+					// Ensure a safe container in which to render the html
+					safe = safe || createSafeFragment( context );
+					div = context.createElement("div");
+					safe.appendChild( div );
+
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Go to html and back, then peel off extra wrappers
+					tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
+					wrap = wrapMap[ tag ] || wrapMap._default;
+					depth = wrap[0];
+					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>
+						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;
+
+					// Take out of fragment container (we need a fresh div each time)
+					div.parentNode.removeChild( div );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				jQuery.merge( ret, elem );
+			}
+		}
+
+		// Fix #11356: Clear elements from safeFragment
+		if ( div ) {
+			elem = div = safe = null;
+		}
+
+		// Reset defaultChecked for any radios and checkboxes
+		// about to be appended to the DOM in IE 6/7 (#8060)
+		if ( !jQuery.support.appendChecked ) {
+			for ( i = 0; (elem = ret[i]) != null; i++ ) {
+				if ( jQuery.nodeName( elem, "input" ) ) {
+					fixDefaultChecked( elem );
+				} else if ( typeof elem.getElementsByTagName !== "undefined" ) {
+					jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+				}
+			}
+		}
+
+		// Append elements to a provided document fragment
+		if ( fragment ) {
+			// Special handling of each script element
+			handleScript = function( elem ) {
+				// Check if we consider it executable
+				if ( !elem.type || rscriptType.test( elem.type ) ) {
+					// Detach the script and store it in the scripts array (if provided) or the fragment
+					// Return truthy to indicate that it has been handled
+					return scripts ?
+						scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+						fragment.appendChild( elem );
+				}
+			};
+
+			for ( i = 0; (elem = ret[i]) != null; i++ ) {
+				// Check if we're done after handling an executable script
+				if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+					// Append to fragment and handle embedded scripts
+					fragment.appendChild( elem );
+					if ( typeof elem.getElementsByTagName !== "undefined" ) {
+						// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+						jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
+
+						// Splice the scripts into ret after their former ancestor and advance our index beyond them
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+						i += jsTags.length;
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems, /* internal */ acceptData ) {
+		var data, id, elem, type,
+			i = 0,
+			internalKey = jQuery.expando,
+			cache = jQuery.cache,
+			deleteExpando = jQuery.support.deleteExpando,
+			special = jQuery.event.special;
+
+		for ( ; (elem = elems[i]) != null; i++ ) {
+
+			if ( acceptData || jQuery.acceptData( elem ) ) {
+
+				id = elem[ internalKey ];
+				data = id && cache[ id ];
+
+				if ( data ) {
+					if ( data.events ) {
+						for ( 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 );
+							}
+						}
+					}
+
+					// Remove cache only if it was not already removed by jQuery.event.remove
+					if ( cache[ id ] ) {
+
+						delete cache[ id ];
+
+						// 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 ( deleteExpando ) {
+							delete elem[ internalKey ];
+
+						} else if ( elem.removeAttribute ) {
+							elem.removeAttribute( internalKey );
+
+						} else {
+							elem[ internalKey ] = null;
+						}
+
+						jQuery.deletedIds.push( id );
+					}
+				}
+			}
+		}
+	}
+});
+// Limit scope pollution from any deprecated API
+(function() {
+
+var matched, browser;
+
+// Use of jQuery.browser is frowned upon.
+// More details: http://api.jquery.com/jQuery.browser
+// jQuery.uaMatch maintained for back-compat
+jQuery.uaMatch = function( ua ) {
+	ua = ua.toLowerCase();
+
+	var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+		/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+		/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+		/(msie) ([\w.]+)/.exec( ua ) ||
+		ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+		[];
+
+	return {
+		browser: match[ 1 ] || "",
+		version: match[ 2 ] || "0"
+	};
+};
+
+matched = jQuery.uaMatch( navigator.userAgent );
+browser = {};
+
+if ( matched.browser ) {
+	browser[ matched.browser ] = true;
+	browser.version = matched.version;
+}
+
+// Chrome is Webkit, but Webkit is also Safari.
+if ( browser.chrome ) {
+	browser.webkit = true;
+} else if ( browser.webkit ) {
+	browser.safari = true;
+}
+
+jQuery.browser = browser;
+
+jQuery.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;
+};
+
+})();
+var curCSS, iframe, iframeDoc,
+	ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	rposition = /^(top|right|bottom|left)$/,
+	// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+	// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+	rmargin = /^margin/,
+	rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+	rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+	rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
+	elemdisplay = {},
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: 0,
+		fontWeight: 400
+	},
+
+	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
+
+	eventsToggle = jQuery.fn.toggle;
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+	// shortcut for names that are not vendor prefixed
+	if ( name in style ) {
+		return name;
+	}
+
+	// check for vendor prefixed names
+	var capName = name.charAt(0).toUpperCase() + name.slice(1),
+		origName = name,
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in style ) {
+			return name;
+		}
+	}
+
+	return origName;
+}
+
+function isHidden( elem, el ) {
+	elem = el || elem;
+	return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
+
+function showHide( elements, show ) {
+	var elem, display,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+		values[ index ] = jQuery._data( elem, "olddisplay" );
+		if ( show ) {
+			// Reset the inline display of this element to learn if it is
+			// being hidden by cascaded rules or not
+			if ( !values[ index ] && elem.style.display === "none" ) {
+				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 ( elem.style.display === "" && isHidden( elem ) ) {
+				values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+			}
+		} else {
+			display = curCSS( elem, "display" );
+
+			if ( !values[ index ] && display !== "none" ) {
+				jQuery._data( elem, "olddisplay", display );
+			}
+		}
+	}
+
+	// Set the display of most of the elements in a second loop
+	// to avoid the constant reflow
+	for ( index = 0; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+			elem.style.display = show ? values[ index ] || "" : "none";
+		}
+	}
+
+	return elements;
+}
+
+jQuery.fn.extend({
+	css: function( name, value ) {
+		return jQuery.access( this, function( elem, name, value ) {
+			return value !== undefined ?
+				jQuery.style( elem, name, value ) :
+				jQuery.css( elem, name );
+		}, name, value, arguments.length > 1 );
+	},
+	show: function() {
+		return showHide( this, true );
+	},
+	hide: function() {
+		return showHide( this );
+	},
+	toggle: function( state, fn2 ) {
+		var bool = typeof state === "boolean";
+
+		if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
+			return eventsToggle.apply( this, arguments );
+		}
+
+		return this.each(function() {
+			if ( bool ? state : isHidden( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		});
+	}
+});
+
+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" );
+					return ret === "" ? "1" : ret;
+
+				}
+			}
+		}
+	},
+
+	// 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, hooks,
+			origName = jQuery.camelCase( name ),
+			style = elem.style;
+
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ 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, extra )) !== 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, numeric, extra ) {
+		var val, num, hooks,
+			origName = jQuery.camelCase( name );
+
+		// Make sure that we're working with the right name
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks ) {
+			val = hooks.get( elem, true, extra );
+		}
+
+		// Otherwise, if a way to get the computed value exists, use that
+		if ( val === undefined ) {
+			val = curCSS( elem, name );
+		}
+
+		//convert "normal" to computed value
+		if ( val === "normal" && name in cssNormalTransform ) {
+			val = cssNormalTransform[ name ];
+		}
+
+		// Return, converting to number if forced or a qualifier was provided and val looks numeric
+		if ( numeric || extra !== undefined ) {
+			num = parseFloat( val );
+			return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
+		}
+		return val;
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var ret, name,
+			old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		ret = callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+
+		return ret;
+	}
+});
+
+// NOTE: To any future maintainer, we've window.getComputedStyle
+// because jsdom on node.js will break without it.
+if ( window.getComputedStyle ) {
+	curCSS = function( elem, name ) {
+		var ret, width, minWidth, maxWidth,
+			computed = window.getComputedStyle( elem, null ),
+			style = elem.style;
+
+		if ( computed ) {
+
+			ret = computed[ name ];
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+
+			// A tribute to the "awesome hack by Dean Edwards"
+			// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+			// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+			// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+			if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+				width = style.width;
+				minWidth = style.minWidth;
+				maxWidth = style.maxWidth;
+
+				style.minWidth = style.maxWidth = style.width = ret;
+				ret = computed.width;
+
+				style.width = width;
+				style.minWidth = minWidth;
+				style.maxWidth = maxWidth;
+			}
+		}
+
+		return ret;
+	};
+} else if ( document.documentElement.currentStyle ) {
+	curCSS = function( elem, name ) {
+		var left, rsLeft,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret == null && style && style[ name ] ) {
+			ret = style[ name ];
+		}
+
+		// 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
+		// but not position css attributes, as those are proportional to the parent element instead
+		// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle.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;
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+	var matches = rnumsplit.exec( value );
+	return matches ?
+			Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+			value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
+	var i = extra === ( isBorderBox ? "border" : "content" ) ?
+		// If we already have the right measurement, avoid augmentation
+		4 :
+		// Otherwise initialize for horizontal or vertical properties
+		name === "width" ? 1 : 0,
+
+		val = 0;
+
+	for ( ; i < 4; i += 2 ) {
+		// both box models exclude margin, so add it if we want it
+		if ( extra === "margin" ) {
+			// we use jQuery.css instead of curCSS here
+			// because of the reliableMarginRight CSS hook!
+			val += jQuery.css( elem, extra + cssExpand[ i ], true );
+		}
+
+		// From this point on we use curCSS for maximum performance (relevant in animations)
+		if ( isBorderBox ) {
+			// border-box includes padding, so remove it if we want content
+			if ( extra === "content" ) {
+				val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+			}
+
+			// at this point, extra isn't border nor margin, so remove border
+			if ( extra !== "margin" ) {
+				val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+			}
+		} else {
+			// at this point, extra isn't content, so add padding
+			val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+
+			// at this point, extra isn't content nor padding, so add border
+			if ( extra !== "padding" ) {
+				val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+			}
+		}
+	}
+
+	return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with offset property, which is equivalent to the border-box value
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		valueIsBorderBox = true,
+		isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
+
+	// some non-html elements return undefined for offsetWidth, so check for null/undefined
+	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+	if ( val <= 0 || val == null ) {
+		// Fall back to computed then uncomputed css if necessary
+		val = curCSS( elem, name );
+		if ( val < 0 || val == null ) {
+			val = elem.style[ name ];
+		}
+
+		// Computed unit is not pixels. Stop here and return.
+		if ( rnumnonpx.test(val) ) {
+			return val;
+		}
+
+		// we need the check for style in case a browser which returns unreliable values
+		// for getComputedStyle silently falls back to the reliable elem.style
+		valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+
+		// Normalize "", auto, and prepare for extra
+		val = parseFloat( val ) || 0;
+	}
+
+	// use the active box-sizing model to add/subtract irrelevant styles
+	return ( val +
+		augmentWidthOrHeight(
+			elem,
+			name,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox
+		)
+	) + "px";
+}
+
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+	if ( elemdisplay[ nodeName ] ) {
+		return elemdisplay[ nodeName ];
+	}
+
+	var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.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 === "" ) {
+		// Use the already-created iframe if possible
+		iframe = document.body.appendChild(
+			iframe || jQuery.extend( document.createElement("iframe"), {
+				frameBorder: 0,
+				width: 0,
+				height: 0
+			})
+		);
+
+		// 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("<!doctype html><html><body>");
+			iframeDoc.close();
+		}
+
+		elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
+
+		display = curCSS( elem, "display" );
+		document.body.removeChild( iframe );
+	}
+
+	// Store the correct default display
+	elemdisplay[ nodeName ] = display;
+
+	return display;
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+				// certain elements can have dimension info if we invisibly show them
+				// however, it must have a current display style that would benefit from this
+				if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
+					return jQuery.swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, name, extra );
+					});
+				} else {
+					return getWidthOrHeight( elem, name, extra );
+				}
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			return setPositiveNumber( elem, value, extra ?
+				augmentWidthOrHeight(
+					elem,
+					name,
+					extra,
+					jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
+				) : 0
+			);
+		}
+	};
+});
+
+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) || "" ) ?
+				( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( 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, "" ) ) === "" &&
+				style.removeAttribute ) {
+
+				// 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;
+		}
+	};
+}
+
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+	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
+				return jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						return curCSS( elem, "marginRight" );
+					}
+				});
+			}
+		};
+	}
+
+	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+	// getComputedStyle returns percent when specified for top/left/bottom/right
+	// rather than make the css module depend on the offset module, we just check for it here
+	if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+		jQuery.each( [ "top", "left" ], function( i, prop ) {
+			jQuery.cssHooks[ prop ] = {
+				get: function( elem, computed ) {
+					if ( computed ) {
+						var ret = curCSS( elem, prop );
+						// if curCSS returns percentage, fallback to offset
+						return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
+					}
+				}
+			};
+		});
+	}
+
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i,
+
+				// assumes a single number if not a string
+				parts = typeof value === "string" ? value.split(" ") : [ value ],
+				expanded = {};
+
+			for ( i = 0; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+
+	if ( !rmargin.test( prefix ) ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+});
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	rselectTextarea = /^(?:select|textarea)/i;
+
+jQuery.fn.extend({
+	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();
+	}
+});
+
+//Serialize an array of form elements or a set of
+//key/values into a query string
+jQuery.param = function( a, traditional ) {
+	var prefix,
+		s = [],
+		add = function( key, value ) {
+			// If value is a function, invoke it and return its value
+			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+		};
+
+	// Set traditional to true for jQuery <= 1.3.2 behavior.
+	if ( traditional === undefined ) {
+		traditional = jQuery.ajaxSettings && 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 ( prefix in a ) {
+			buildParams( prefix, a[ prefix ], traditional, add );
+		}
+	}
+
+	// Return the resulting serialization
+	return s.join( "&" ).replace( r20, "+" );
+};
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	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" ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+var
+	// Document location
+	ajaxLocParts,
+	ajaxLocation,
+
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	// #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,
+	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 = {},
+
+	// 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 = "*";
+		}
+
+		var dataType, list, placeBefore,
+			dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
+			i = 0,
+			length = dataTypes.length;
+
+		if ( jQuery.isFunction( func ) ) {
+			// 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 selection,
+		list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters );
+
+	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.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
+	if ( !this.length ) {
+		return this;
+	}
+
+	var selector, type, response,
+		self = this,
+		off = url.indexOf(" ");
+
+	if ( off >= 0 ) {
+		selector = url.slice( off, url.length );
+		url = url.slice( 0, off );
+	}
+
+	// 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 ( params && typeof params === "object" ) {
+		type = "POST";
+	}
+
+	// Request the remote document
+	jQuery.ajax({
+		url: url,
+
+		// if "type" variable is undefined, then "GET" method will be used
+		type: type,
+		dataType: "html",
+		data: params,
+		complete: function( jqXHR, status ) {
+			if ( callback ) {
+				self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+			}
+		}
+	}).done(function( responseText ) {
+
+		// Save response for use in complete callback
+		response = arguments;
+
+		// 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 );
+
+	});
+
+	return this;
+};
+
+// 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.on( 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; charset=UTF-8",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		throws: false,
+		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 // ifModified key
+			ifModifiedKey,
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// 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.Callbacks( "once memory" ),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// The jqXHR state
+			state = 0,
+			// Default abort message
+			strAbort = "canceled",
+			// 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 || strAbort;
+					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 ) {
+			var isSuccess, success, error, response, modified,
+				statusText = nativeStatusText;
+
+			// 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;
+
+			// Get response data
+			if ( responses ) {
+				response = ajaxHandleResponses( s, jqXHR, responses );
+			}
+
+			// 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 ) {
+
+					modified = jqXHR.getResponseHeader("Last-Modified");
+					if ( modified ) {
+						jQuery.lastModified[ ifModifiedKey ] = modified;
+					}
+					modified = jqXHR.getResponseHeader("Etag");
+					if ( modified ) {
+						jQuery.etag[ ifModifiedKey ] = modified;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					isSuccess = ajaxConvert( s, response );
+					statusText = isSuccess.state;
+					success = isSuccess.data;
+					error = isSuccess.error;
+					isSuccess = !error;
+				}
+			} 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.fireWith( 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.add;
+
+		// 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.always( 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( core_rspace );
+
+		// A cross-domain request is in order when we have a protocol:host:port mismatch
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() ) || false;
+			s.crossDomain = parts && ( parts.join(":") + ( parts[ 3 ] ? "" : parts[ 1 ] === "http:" ? 80 : 443 ) ) !==
+				( ajaxLocParts.join(":") + ( 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 prefilter, stop there
+		if ( state === 2 ) {
+			return jqXHR;
+		}
+
+		// 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 and return
+				return jqXHR.abort();
+
+		}
+
+		// aborting is no longer a cancellation
+		strAbort = "abort";
+
+		// 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 {
+					throw e;
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// 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 ct, type, finalDataType, firstDataType,
+		contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields;
+
+	// 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 ) {
+
+	var conv, conv2, current, tmp,
+		// Work with a copy of dataTypes in case we need to modify it for conversion
+		dataTypes = s.dataTypes.slice(),
+		prev = dataTypes[ 0 ],
+		converters = {},
+		i = 0;
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	// Create converters map with lowercased keys
+	if ( dataTypes[ 1 ] ) {
+		for ( conv in s.converters ) {
+			converters[ conv.toLowerCase() ] = s.converters[ conv ];
+		}
+	}
+
+	// Convert to each sequential dataType, tolerating list modification
+	for ( ; (current = dataTypes[++i]); ) {
+
+		// There's only work to do if current dataType is non-auto
+		if ( current !== "*" ) {
+
+			// Convert response if prev dataType is non-auto and differs from current
+			if ( prev !== "*" && prev !== current ) {
+
+				// Seek a direct converter
+				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+				// If none found, seek a pair
+				if ( !conv ) {
+					for ( conv2 in converters ) {
+
+						// If conv2 outputs current
+						tmp = conv2.split(" ");
+						if ( tmp[ 1 ] === current ) {
+
+							// If prev can be converted to accepted input
+							conv = converters[ prev + " " + tmp[ 0 ] ] ||
+								converters[ "* " + tmp[ 0 ] ];
+							if ( conv ) {
+								// Condense equivalence converters
+								if ( conv === true ) {
+									conv = converters[ conv2 ];
+
+								// Otherwise, insert the intermediate dataType
+								} else if ( converters[ conv2 ] !== true ) {
+									current = tmp[ 0 ];
+									dataTypes.splice( i--, 0, current );
+								}
+
+								break;
+							}
+						}
+					}
+				}
+
+				// Apply converter (if not an equivalence)
+				if ( conv !== true ) {
+
+					// Unless errors are allowed to bubble, catch and return them
+					if ( conv && s["throws"] ) {
+						response = conv( response );
+					} else {
+						try {
+							response = conv( response );
+						} catch ( e ) {
+							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+						}
+					}
+				}
+			}
+
+			// Update prev for next iteration
+			prev = current;
+		}
+	}
+
+	return { state: "success", data: response };
+}
+var oldCallbacks = [],
+	rquestion = /\?/,
+	rjsonp = /(=)\?(?=&|$)|\?\?/,
+	nonce = jQuery.now();
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+		this[ callback ] = true;
+		return callback;
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var callbackName, overwritten, responseContainer,
+		data = s.data,
+		url = s.url,
+		hasCallback = s.jsonp !== false,
+		replaceInUrl = hasCallback && rjsonp.test( url ),
+		replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
+			!( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
+			rjsonp.test( data );
+
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
+	if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
+
+		// Get callback name, remembering preexisting value associated with it
+		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+			s.jsonpCallback() :
+			s.jsonpCallback;
+		overwritten = window[ callbackName ];
+
+		// Insert callback into url or form data
+		if ( replaceInUrl ) {
+			s.url = url.replace( rjsonp, "$1" + callbackName );
+		} else if ( replaceInData ) {
+			s.data = data.replace( rjsonp, "$1" + callbackName );
+		} else if ( hasCallback ) {
+			s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+		}
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( callbackName + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Install callback
+		window[ callbackName ] = function() {
+			responseContainer = arguments;
+		};
+
+		// Clean-up function (fires after converters)
+		jqXHR.always(function() {
+			// Restore preexisting value
+			window[ callbackName ] = overwritten;
+
+			// Save back as free
+			if ( s[ callbackName ] ) {
+				// make sure that re-using the options doesn't screw things around
+				s.jsonpCallback = originalSettings.jsonpCallback;
+
+				// save the callback name for future use
+				oldCallbacks.push( callbackName );
+			}
+
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+				overwritten( responseContainer[ 0 ] );
+			}
+
+			responseContainer = overwritten = undefined;
+		});
+
+		// 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 xhrCallbacks,
+	// #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;
+
+// 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 handle, i,
+						xhr = s.xhr();
+
+					// 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 occurred
+						// 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;
+									}
+
+									// When requesting binary data, IE6-9 will throw an exception
+									// on any attempt to access responseText (#11426)
+									try {
+										responses.text = xhr.responseText;
+									} catch( _ ) {
+									}
+
+									// 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 ( !s.async ) {
+						// if we're in sync mode we fire the callback
+						callback();
+					} else if ( xhr.readyState === 4 ) {
+						// (IE6 & IE7) if it's in cache and has been
+						// retrieved directly we need to fire the callback
+						setTimeout( callback, 0 );
+					} 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 fxNow, timerId,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+	rrun = /queueHooks$/,
+	animationPrefilters = [ defaultPrefilter ],
+	tweeners = {
+		"*": [function( prop, value ) {
+			var end, unit,
+				tween = this.createTween( prop, value ),
+				parts = rfxnum.exec( value ),
+				target = tween.cur(),
+				start = +target || 0,
+				scale = 1,
+				maxIterations = 20;
+
+			if ( parts ) {
+				end = +parts[2];
+				unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+
+				// We need to compute starting value
+				if ( unit !== "px" && start ) {
+					// Iteratively approximate from a nonzero starting point
+					// Prefer the current property, because this process will be trivial if it uses the same units
+					// Fallback to end or a simple constant
+					start = jQuery.css( tween.elem, prop, true ) || end || 1;
+
+					do {
+						// If previous iteration zeroed out, double until we get *something*
+						// Use a string for doubling factor so we don't accidentally see scale as unchanged below
+						scale = scale || ".5";
+
+						// Adjust and apply
+						start = start / scale;
+						jQuery.style( tween.elem, prop, start + unit );
+
+					// Update scale, tolerating zero or NaN from tween.cur()
+					// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+					} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+				}
+
+				tween.unit = unit;
+				tween.start = start;
+				// If a +=/-= token was provided, we're doing a relative animation
+				tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
+			}
+			return tween;
+		}]
+	};
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout(function() {
+		fxNow = undefined;
+	}, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function createTweens( animation, props ) {
+	jQuery.each( props, function( prop, value ) {
+		var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+			index = 0,
+			length = collection.length;
+		for ( ; index < length; index++ ) {
+			if ( collection[ index ].call( animation, prop, value ) ) {
+
+				// we're done with this property
+				return;
+			}
+		}
+	});
+}
+
+function Animation( elem, properties, options ) {
+	var result,
+		index = 0,
+		tweenerIndex = 0,
+		length = animationPrefilters.length,
+		deferred = jQuery.Deferred().always( function() {
+			// don't match elem in the :animated selector
+			delete tick.elem;
+		}),
+		tick = function() {
+			var currentTime = fxNow || createFxNow(),
+				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+				percent = 1 - ( remaining / animation.duration || 0 ),
+				index = 0,
+				length = animation.tweens.length;
+
+			for ( ; index < length ; index++ ) {
+				animation.tweens[ index ].run( percent );
+			}
+
+			deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+			if ( percent < 1 && length ) {
+				return remaining;
+			} else {
+				deferred.resolveWith( elem, [ animation ] );
+				return false;
+			}
+		},
+		animation = deferred.promise({
+			elem: elem,
+			props: jQuery.extend( {}, properties ),
+			opts: jQuery.extend( true, { specialEasing: {} }, options ),
+			originalProperties: properties,
+			originalOptions: options,
+			startTime: fxNow || createFxNow(),
+			duration: options.duration,
+			tweens: [],
+			createTween: function( prop, end, easing ) {
+				var tween = jQuery.Tween( elem, animation.opts, prop, end,
+						animation.opts.specialEasing[ prop ] || animation.opts.easing );
+				animation.tweens.push( tween );
+				return tween;
+			},
+			stop: function( gotoEnd ) {
+				var index = 0,
+					// if we are going to the end, we want to run all the tweens
+					// otherwise we skip this part
+					length = gotoEnd ? animation.tweens.length : 0;
+
+				for ( ; index < length ; index++ ) {
+					animation.tweens[ index ].run( 1 );
+				}
+
+				// resolve when we played the last frame
+				// otherwise, reject
+				if ( gotoEnd ) {
+					deferred.resolveWith( elem, [ animation, gotoEnd ] );
+				} else {
+					deferred.rejectWith( elem, [ animation, gotoEnd ] );
+				}
+				return this;
+			}
+		}),
+		props = animation.props;
+
+	propFilter( props, animation.opts.specialEasing );
+
+	for ( ; index < length ; index++ ) {
+		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( result ) {
+			return result;
+		}
+	}
+
+	createTweens( animation, props );
+
+	if ( jQuery.isFunction( animation.opts.start ) ) {
+		animation.opts.start.call( elem, animation );
+	}
+
+	jQuery.fx.timer(
+		jQuery.extend( tick, {
+			anim: animation,
+			queue: animation.opts.queue,
+			elem: elem
+		})
+	);
+
+	// attach callbacks from options
+	return animation.progress( animation.opts.progress )
+		.done( animation.opts.done, animation.opts.complete )
+		.fail( animation.opts.fail )
+		.always( animation.opts.always );
+}
+
+function propFilter( props, specialEasing ) {
+	var index, name, easing, value, hooks;
+
+	// camelCase, specialEasing and expand cssHook pass
+	for ( index in props ) {
+		name = jQuery.camelCase( index );
+		easing = specialEasing[ name ];
+		value = props[ index ];
+		if ( jQuery.isArray( value ) ) {
+			easing = value[ 1 ];
+			value = props[ index ] = value[ 0 ];
+		}
+
+		if ( index !== name ) {
+			props[ name ] = value;
+			delete props[ index ];
+		}
+
+		hooks = jQuery.cssHooks[ name ];
+		if ( hooks && "expand" in hooks ) {
+			value = hooks.expand( value );
+			delete props[ name ];
+
+			// not quite $.extend, this wont overwrite keys already present.
+			// also - reusing 'index' from above because we have the correct "name"
+			for ( index in value ) {
+				if ( !( index in props ) ) {
+					props[ index ] = value[ index ];
+					specialEasing[ index ] = easing;
+				}
+			}
+		} else {
+			specialEasing[ name ] = easing;
+		}
+	}
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+	tweener: function( props, callback ) {
+		if ( jQuery.isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.split(" ");
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length ; index++ ) {
+			prop = props[ index ];
+			tweeners[ prop ] = tweeners[ prop ] || [];
+			tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			animationPrefilters.unshift( callback );
+		} else {
+			animationPrefilters.push( callback );
+		}
+	}
+});
+
+function defaultPrefilter( elem, props, opts ) {
+	var index, prop, value, length, dataShow, tween, hooks, oldfire,
+		anim = this,
+		style = elem.style,
+		orig = {},
+		handled = [],
+		hidden = elem.nodeType && isHidden( elem );
+
+	// handle queue: false promises
+	if ( !opts.queue ) {
+		hooks = jQuery._queueHooks( elem, "fx" );
+		if ( hooks.unqueued == null ) {
+			hooks.unqueued = 0;
+			oldfire = hooks.empty.fire;
+			hooks.empty.fire = function() {
+				if ( !hooks.unqueued ) {
+					oldfire();
+				}
+			};
+		}
+		hooks.unqueued++;
+
+		anim.always(function() {
+			// doing this makes sure that the complete handler will be called
+			// before this completes
+			anim.always(function() {
+				hooks.unqueued--;
+				if ( !jQuery.queue( elem, "fx" ).length ) {
+					hooks.empty.fire();
+				}
+			});
+		});
+	}
+
+	// height/width overflow pass
+	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+		// 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
+		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+		// Set display property to inline-block for height/width
+		// animations on inline elements that are having width/height animated
+		if ( jQuery.css( elem, "display" ) === "inline" &&
+				jQuery.css( elem, "float" ) === "none" ) {
+
+			// inline-level elements accept inline-block;
+			// block-level elements need to be inline with layout
+			if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+				style.display = "inline-block";
+
+			} else {
+				style.zoom = 1;
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		if ( !jQuery.support.shrinkWrapBlocks ) {
+			anim.done(function() {
+				style.overflow = opts.overflow[ 0 ];
+				style.overflowX = opts.overflow[ 1 ];
+				style.overflowY = opts.overflow[ 2 ];
+			});
+		}
+	}
+
+
+	// show/hide pass
+	for ( index in props ) {
+		value = props[ index ];
+		if ( rfxtypes.exec( value ) ) {
+			delete props[ index ];
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+				continue;
+			}
+			handled.push( index );
+		}
+	}
+
+	length = handled.length;
+	if ( length ) {
+		dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
+		if ( hidden ) {
+			jQuery( elem ).show();
+		} else {
+			anim.done(function() {
+				jQuery( elem ).hide();
+			});
+		}
+		anim.done(function() {
+			var prop;
+			jQuery.removeData( elem, "fxshow", true );
+			for ( prop in orig ) {
+				jQuery.style( elem, prop, orig[ prop ] );
+			}
+		});
+		for ( index = 0 ; index < length ; index++ ) {
+			prop = handled[ index ];
+			tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
+			orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
+
+			if ( !( prop in dataShow ) ) {
+				dataShow[ prop ] = tween.start;
+				if ( hidden ) {
+					tween.end = tween.start;
+					tween.start = prop === "width" || prop === "height" ? 1 : 0;
+				}
+			}
+		}
+	}
+}
+
+function Tween( elem, options, prop, end, easing ) {
+	return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+	constructor: Tween,
+	init: function( elem, options, prop, end, easing, unit ) {
+		this.elem = elem;
+		this.prop = prop;
+		this.easing = easing || "swing";
+		this.options = options;
+		this.start = this.now = this.cur();
+		this.end = end;
+		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+	},
+	cur: function() {
+		var hooks = Tween.propHooks[ this.prop ];
+
+		return hooks && hooks.get ?
+			hooks.get( this ) :
+			Tween.propHooks._default.get( this );
+	},
+	run: function( percent ) {
+		var eased,
+			hooks = Tween.propHooks[ this.prop ];
+
+		if ( this.options.duration ) {
+			this.pos = eased = jQuery.easing[ this.easing ](
+				percent, this.options.duration * percent, 0, 1, this.options.duration
+			);
+		} else {
+			this.pos = eased = percent;
+		}
+		this.now = ( this.end - this.start ) * eased + this.start;
+
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		if ( hooks && hooks.set ) {
+			hooks.set( this );
+		} else {
+			Tween.propHooks._default.set( this );
+		}
+		return this;
+	}
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+	_default: {
+		get: function( tween ) {
+			var result;
+
+			if ( tween.elem[ tween.prop ] != null &&
+				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+				return tween.elem[ tween.prop ];
+			}
+
+			// passing any value as a 4th parameter to .css will automatically
+			// attempt a parseFloat and fallback to a string if the parse fails
+			// so, simple values such as "10px" are parsed to Float.
+			// complex values such as "rotate(1rad)" are returned as is.
+			result = jQuery.css( tween.elem, tween.prop, false, "" );
+			// Empty strings, null, undefined and "auto" are converted to 0.
+			return !result || result === "auto" ? 0 : result;
+		},
+		set: function( tween ) {
+			// use step hook for back compat - use cssHook if its there - use .style if its
+			// available and use plain properties where available
+			if ( jQuery.fx.step[ tween.prop ] ) {
+				jQuery.fx.step[ tween.prop ]( tween );
+			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+			} else {
+				tween.elem[ tween.prop ] = tween.now;
+			}
+		}
+	}
+};
+
+// Remove in 2.0 - this supports IE8's panic based approach
+// to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+	set: function( tween ) {
+		if ( tween.elem.nodeType && tween.elem.parentNode ) {
+			tween.elem[ tween.prop ] = tween.now;
+		}
+	}
+};
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+	var cssFn = jQuery.fn[ name ];
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return speed == null || typeof speed === "boolean" ||
+			// special check for .toggle( handler, handler, ... )
+			( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
+			cssFn.apply( this, arguments ) :
+			this.animate( genFx( name, true ), speed, easing, callback );
+	};
+});
+
+jQuery.fn.extend({
+	fadeTo: function( speed, to, easing, callback ) {
+
+		// show any hidden elements after setting opacity to 0
+		return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+			// animate to the value specified
+			.end().animate({ opacity: to }, speed, easing, callback );
+	},
+	animate: function( prop, speed, easing, callback ) {
+		var empty = jQuery.isEmptyObject( prop ),
+			optall = jQuery.speed( speed, easing, callback ),
+			doAnimation = function() {
+				// Operate on a copy of prop so per-property easing won't be lost
+				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+				// Empty animations resolve immediately
+				if ( empty ) {
+					anim.stop( true );
+				}
+			};
+
+		return empty || optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+	stop: function( type, clearQueue, gotoEnd ) {
+		var stopQueue = function( hooks ) {
+			var stop = hooks.stop;
+			delete hooks.stop;
+			stop( gotoEnd );
+		};
+
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each(function() {
+			var dequeue = true,
+				index = type != null && type + "queueHooks",
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			if ( index ) {
+				if ( data[ index ] && data[ index ].stop ) {
+					stopQueue( data[ index ] );
+				}
+			} else {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+						stopQueue( data[ index ] );
+					}
+				}
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+					timers[ index ].anim.stop( gotoEnd );
+					dequeue = false;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// start the next in the queue if the last step wasn't forced
+			// timers currently will call their complete callbacks, which will dequeue
+			// but only if they were gotoEnd
+			if ( dequeue || !gotoEnd ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	}
+});
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+	var which,
+		attrs = { height: type },
+		i = 0;
+
+	// if we include width, step value is 1 to do all cssExpand values,
+	// if we don't include width, step value is 2 to skip over Left and Right
+	includeWidth = includeWidth? 1 : 0;
+	for( ; i < 4 ; i += 2 - includeWidth ) {
+		which = cssExpand[ i ];
+		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+	}
+
+	if ( includeWidth ) {
+		attrs.opacity = attrs.width = type;
+	}
+
+	return attrs;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show"),
+	slideUp: genFx("hide"),
+	slideToggle: genFx("toggle"),
+	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.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;
+
+	// normalize opt.queue - true/undefined/null -> "fx"
+	if ( opt.queue == null || opt.queue === true ) {
+		opt.queue = "fx";
+	}
+
+	// Queueing
+	opt.old = opt.complete;
+
+	opt.complete = function() {
+		if ( jQuery.isFunction( opt.old ) ) {
+			opt.old.call( this );
+		}
+
+		if ( opt.queue ) {
+			jQuery.dequeue( this, opt.queue );
+		}
+	};
+
+	return opt;
+};
+
+jQuery.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p*Math.PI ) / 2;
+	}
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+	var timer,
+		timers = jQuery.timers,
+		i = 0;
+
+	for ( ; i < timers.length; i++ ) {
+		timer = timers[ i ];
+		// Checks the timer has not already been removed
+		if ( !timer() && timers[ i ] === timer ) {
+			timers.splice( i--, 1 );
+		}
+	}
+
+	if ( !timers.length ) {
+		jQuery.fx.stop();
+	}
+};
+
+jQuery.fx.timer = function( timer ) {
+	if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
+		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+	}
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.stop = function() {
+	clearInterval( timerId );
+	timerId = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+	// Default speed
+	_default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+var rroot = /^(?:body|html)$/i;
+
+jQuery.fn.offset = function( options ) {
+	if ( arguments.length ) {
+		return options === undefined ?
+			this :
+			this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+	}
+
+	var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft,
+		box = { top: 0, left: 0 },
+		elem = this[ 0 ],
+		doc = elem && elem.ownerDocument;
+
+	if ( !doc ) {
+		return;
+	}
+
+	if ( (body = doc.body) === elem ) {
+		return jQuery.offset.bodyOffset( elem );
+	}
+
+	docElem = doc.documentElement;
+
+	// Make sure it's not a disconnected DOM node
+	if ( !jQuery.contains( docElem, elem ) ) {
+		return box;
+	}
+
+	// If we don't have gBCR, just use 0,0 rather than error
+	// BlackBerry 5, iOS 3 (original iPhone)
+	if ( typeof elem.getBoundingClientRect !== "undefined" ) {
+		box = elem.getBoundingClientRect();
+	}
+	win = getWindow( doc );
+	clientTop  = docElem.clientTop  || body.clientTop  || 0;
+	clientLeft = docElem.clientLeft || body.clientLeft || 0;
+	scrollTop  = win.pageYOffset || docElem.scrollTop;
+	scrollLeft = win.pageXOffset || docElem.scrollLeft;
+	return {
+		top: box.top  + scrollTop  - clientTop,
+		left: box.left + scrollLeft - clientLeft
+	};
+};
+
+jQuery.offset = {
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		if ( jQuery.support.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;
+		}
+
+		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 || document.body;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+	var top = /Y/.test( prop );
+
+	jQuery.fn[ method ] = function( val ) {
+		return jQuery.access( this, function( elem, method, val ) {
+			var win = getWindow( elem );
+
+			if ( val === undefined ) {
+				return win ? (prop in win) ? win[ prop ] :
+					win.document.documentElement[ method ] :
+					elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : jQuery( win ).scrollLeft(),
+					 top ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length, null );
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+		// margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return jQuery.access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( jQuery.isWindow( elem ) ) {
+					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+					// isn't a whole lot we can do. See pull request at this URL for discussion:
+					// https://github.com/jquery/jquery/pull/764
+					return elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
+					// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, value, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable, null );
+		};
+	});
+});
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+	define( "jquery", [], function () { return jQuery; } );
+}
+
+})( window );
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.buttonMarkup.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.buttonMarkup.js
new file mode 100644
index 0000000..38726a6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.buttonMarkup.js
@@ -0,0 +1,330 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Applies button styling to links
+//>>label: Buttons: Link-based
+//>>group: Forms
+//>>css.structure: ../css/structure/jquery.mobile.button.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [ "jquery", "./jquery.mobile.core", "./jquery.mobile.vmouse" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+$.fn.buttonMarkup = function( options ) {
+	var $workingSet = this,
+		prefix = "data-" + $.mobile.ns,
+		mapToDataAttr = function( key, value ) {
+			e.setAttribute( "data-" + $.mobile.ns + key, value );
+			el.jqmData( key, value );
+		};
+
+	// Enforce options to be of type string
+	options = ( options && ( $.type( options ) === "object" ) )? options : {};
+	for ( var i = 0; i < $workingSet.length; i++ ) {
+		var el = $workingSet.eq( i ),
+			e = el[ 0 ],
+			o = $.extend( {}, $.fn.buttonMarkup.defaults, {
+				icon:       options.icon       !== undefined ? options.icon       : $.mobile.getAttrFixed( e, prefix + "icon" ),
+				iconpos:    options.iconpos    !== undefined ? options.iconpos    : $.mobile.getAttrFixed( e, prefix + "iconpos" ),
+				theme:      options.theme      !== undefined ? options.theme      : $.mobile.getAttrFixed( e, prefix + "theme" ) || $.mobile.getInheritedTheme( el, $.fn.buttonMarkup.defaults["theme"] ),
+				inline:     options.inline     !== undefined ? options.inline     : $.mobile.getAttrFixed( e, prefix + "inline" ),
+				shadow:     options.shadow     !== undefined ? options.shadow     : $.mobile.getAttrFixed( e, prefix + "shadow" ),
+				corners:    options.corners    !== undefined ? options.corners    : $.mobile.getAttrFixed( e, prefix + "corners" ),
+				iconshadow: options.iconshadow !== undefined ? options.iconshadow : $.mobile.getAttrFixed( e, prefix + "iconshadow" ),
+				mini:       options.mini       !== undefined ? options.mini       : $.mobile.getAttrFixed( e, prefix + "mini" )
+			}, options ),
+
+			// Classes Defined
+			innerClass = "ui-btn-inner",
+			textClass = "ui-btn-text",
+			buttonClass, iconClass,
+			// Button inner markup
+			buttonInner,
+			buttonText,
+			buttonIcon,
+			buttonElements;
+
+		for ( key in o ) {
+			e.setAttribute ( prefix + key, o[ key ])
+		}
+
+		if ( $.mobile.getAttrFixed( e, prefix + "rel" ) === "popup" && el.attr( "href" ) ) {
+			e.setAttribute( "aria-haspopup", true );
+			e.setAttribute( "aria-owns", e.getAttribute( "href" ) );
+		}
+
+		if ( e.tagName !== "LI" && e.tagName !== "LABEL" ) {
+			e.setAttribute( "role", "button" );
+			e.setAttribute( "tabindex", "0" );
+		}
+
+		// Check if this element is already enhanced
+		buttonElements = $.data( ( ( e.tagName === "INPUT" || e.tagName === "BUTTON" ) ? e.parentNode : e ), "buttonElements" );
+
+		if ( buttonElements ) {
+			e = buttonElements.outer;
+			el = $( e );
+			buttonInner = buttonElements.inner;
+			buttonText = buttonElements.text;
+			// We will recreate this icon below
+			$( buttonElements.icon ).remove();
+			buttonElements.icon = null;
+		}
+		else {
+			buttonInner = document.createElement( o.wrapperEls );
+			buttonText = document.createElement( o.wrapperEls );
+		}
+		buttonIcon = o.icon ? document.createElement( "span" ) : null;
+
+		if ( attachEvents && !buttonElements ) {
+			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;
+		buttonClass += o.shadow ? " ui-shadow" : "";
+		buttonClass += o.corners ? " ui-btn-corner-all" : "";
+
+		// To distinguish real buttons
+		if(  $.mobile.getAttrFixed( e, prefix + "role" ) == "button" || e.tagName == "BUTTON" || e.tagName == "DIV" ){
+			buttonClass += " ui-btn-box-" + o.theme;
+		}
+
+		/* TIZEN style markup */
+		var buttonStyle =  $.mobile.getAttrFixed( e, prefix + "style" );
+
+		if ( buttonStyle == "circle" && !($(el).text().length > 0) ) {
+			/* 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";
+		} else if ( buttonStyle == "round" || ( buttonStyle == "circle" && $(el).text().length > 0 ) ) {
+			buttonClass += " ui-btn-round";
+		}
+		if ( o.icon ) {
+			if ( $(el).text().length > 0 ) {
+
+				switch ( o.iconpos ) {
+				case "right" :
+				case "left" :
+				case "top" :
+				case "bottom" :
+					textClass += " ui-btn-text-padding-" + o.iconpos;
+					break;
+				default:
+					textClass += " ui-btn-text-padding-left";
+					break;
+				}
+
+				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";
+
+				if ( e.tagName !== "LABEL" ) {
+					$( el ).text( o.icon.replace( "naviframe-", "" ) );
+				}
+			}
+		} else {
+			if ( $(el).text().length > 0 ) {
+				innerClass += " ui-btn-hastxt";
+			} else if ( buttonStyle == "circle" ){
+				buttonClass += " ui-btn-round";
+			}
+		}
+		if ( o.mini !== undefined ) {
+			// Used to control styling in headers/footers, where buttons default to `mini` style.
+			buttonClass += o.mini === true ? " ui-mini" : " ui-fullsize";
+		}
+
+		if ( o.inline !== undefined ) {
+			// Used to control styling in headers/footers, where buttons default to `inline` style.
+			buttonClass += o.inline === true ? " ui-btn-inline" : " ui-btn-block";
+		}
+
+		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() );
+			}
+		}
+
+		innerClass += o.corners ? " ui-btn-corner-all" : "";
+
+		if ( o.iconpos && o.iconpos === "notext" && !el.attr( "title" ) ) {
+			el.attr( "title", el.getEncodedText() );
+		}
+
+		if ( buttonElements ) {
+			el.removeClass( buttonElements.bcls || "" );
+		}
+		el.removeClass( "ui-link" ).addClass( buttonClass );
+
+		buttonInner.className = innerClass;
+
+		buttonText.className = textClass;
+		if ( !buttonElements ) {
+			buttonInner.appendChild( buttonText );
+		}
+		if ( buttonIcon ) {
+			buttonIcon.className = iconClass;
+			if ( !( buttonElements && buttonElements.icon ) ) {
+				buttonIcon.innerHTML = "&#160;";
+				buttonInner.appendChild( buttonIcon );
+			}
+		}
+
+		while ( e.firstChild && !buttonElements ) {
+			buttonText.appendChild( e.firstChild );
+		}
+
+		if ( !buttonElements ) {
+			e.appendChild( buttonInner );
+		}
+
+		// Assign a structure containing the elements of this button to the elements of this button. This
+		// will allow us to recognize this as an already-enhanced button in future calls to buttonMarkup().
+		buttonElements = {
+			bcls  : buttonClass,
+			outer : e,
+			inner : buttonInner,
+			text  : buttonText,
+			icon  : buttonIcon
+		};
+
+		$.data( e,           'buttonElements', buttonElements );
+		$.data( buttonInner, 'buttonElements', buttonElements );
+		$.data( buttonText,  'buttonElements', buttonElements );
+		if ( buttonIcon ) {
+			$.data( buttonIcon, 'buttonElements', buttonElements );
+		}
+	}
+
+	return this;
+};
+
+$.fn.buttonMarkup.defaults = {
+	theme: "c",
+	corners: true,
+	shadow: true,
+	iconshadow: true,
+	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 + ' ' );
+        if ( cname && cname.indexOf( "ui-btn " ) > -1 && cname.indexOf( "ui-disabled " ) < 0 ) {
+            break;
+        }
+
+        element = element.parentNode;
+    }
+
+    return element;
+}
+
+var attachEvents = function() {
+	var hoverDelay = $.mobile.buttonMarkup.hoverDelay, hov, foc;
+
+	$.mobile.$document.bind( {
+		"vmousedown vmousecancel vmouseup vmouseover vmouseout focus blur scrollstart touchend touchcancel": function( event ) {
+			var theme,
+				$btn = $( closestEnabledButton( event.target ) ),
+				isTouchEvent = event.originalEvent && /^touch/.test( event.originalEvent.type ),
+				evt = event.type;
+
+			if ( $btn.length ) {
+				theme = $btn.attr( "data-" + $.mobile.ns + "theme" );
+
+				if ( evt === "vmousedown" ) {
+					if ( isTouchEvent ) {
+						// Use a short delay to determine if the user is scrolling before highlighting
+						hov = setTimeout( function() {
+							$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-down-" + theme );
+						}, hoverDelay );
+					} else {
+						$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-down-" + theme );
+					}
+				} else if ( evt === "vmousecancel" || evt === "vmouseup" || evt === "touchend" || evt === "touchcancel" ) {
+					$btn.removeClass( "ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme );
+				} else if ( evt === "vmouseover" || evt === "focus" ) {
+					if ( isTouchEvent ) {
+						// Use a short delay to determine if the user is scrolling before highlighting
+						foc = setTimeout( function() {
+							$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-hover-" + theme );
+						}, hoverDelay );
+					} else {
+						$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-hover-" + theme );
+					}
+				} else if ( evt === "vmouseout" || evt === "blur" || evt === "scrollstart" ) {
+					$btn.removeClass( "ui-btn-hover-" + theme  + " ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme );
+					if ( hov ) {
+						clearTimeout( hov );
+					}
+					if ( foc ) {
+						clearTimeout( foc );
+					}
+				}
+			}
+		},
+		"focusin focus": function( event ) {
+			$( closestEnabledButton( event.target ) ).addClass( $.mobile.focusClass );
+		},
+		"focusout blur": function( event ) {
+			$( closestEnabledButton( event.target ) ).removeClass( $.mobile.focusClass );
+		}
+	});
+
+	attachEvents = null;
+};
+
+//links in bars, or those with  data-role become buttons
+//auto self-init widgets
+$.mobile.$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 )
+		.jqmEnhanceable()
+		.not( "button, input, .ui-btn, :jqmData(role='none'), :jqmData(role='nojs')" )
+		.buttonMarkup();
+});
+
+})( jQuery );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.controlGroup.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.controlGroup.js
new file mode 100644
index 0000000..f1c5ba9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.controlGroup.js
@@ -0,0 +1,70 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Visually groups sets of buttons, checks, radios, etc.
+//>>label: Controlgroups
+//>>group: Forms
+//>>css.structure: ../css/structure/jquery.mobile.controlgroup.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [ "jquery", "./jquery.mobile.buttonMarkup" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+$.fn.controlgroup = function( options ) {
+	function flipClasses( els, flCorners  ) {
+		els.removeClass( "ui-btn-corner-all ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-controlgroup-last ui-shadow" )
+			.eq( 0 ).addClass( flCorners[ 0 ] )
+			.end()
+			.last().addClass( flCorners[ 1 ] ).addClass( "ui-controlgroup-last" );
+	}
+
+	return this.each(function() {
+		var $el = $( this ),
+			o = $.extend({
+						direction:  $.mobile.getAttrFixed( $el[0], "data-"+ $.mobile.ns + "type" ) || "vertical",
+						shadow: false,
+						excludeInvisible: true,
+						mini: $.mobile.getAttrFixed( $el[0], "data-"+ $.mobile.ns + "mini" )
+					}, options ),
+			grouplegend = $el.children( "legend" ),
+			groupheading = $el.children( ".ui-controlgroup-label" ),
+			groupcontrols = $el.children( ".ui-controlgroup-controls" ),
+			flCorners = o.direction === "horizontal" ? [ "ui-corner-left", "ui-corner-right" ] : [ "ui-corner-top", "ui-corner-bottom" ],
+			type = $el.find( "input" ).first().attr( "type" );
+
+		// First unwrap the controls if the controlgroup was already enhanced
+		if ( groupcontrols.length ) {
+			groupcontrols.contents().unwrap();
+		}
+		$el.wrapInner( "<div class='ui-controlgroup-controls'></div>" );
+
+		if ( grouplegend.length ) {
+			// Replace legend with more stylable replacement div
+			$( "<div role='heading' class='ui-controlgroup-label'>" + grouplegend.html() + "</div>" ).insertBefore( $el.children( 0 ) );
+			grouplegend.remove();
+		} else if ( groupheading.length ) {
+			// Just move the heading if the controlgroup was already enhanced
+			$el.prepend( groupheading );
+		}
+
+		$el.addClass( "ui-corner-all ui-controlgroup ui-controlgroup-" + o.direction );
+
+		flipClasses( $el.find( ".ui-btn" + ( o.excludeInvisible ? ":visible" : "" ) ).not( '.ui-slider-handle' ), flCorners );
+		flipClasses( $el.find( ".ui-btn-inner" ), flCorners );
+
+		if ( o.shadow ) {
+			$el.addClass( "ui-shadow" );
+		}
+
+		if ( o.mini ) {
+			$el.addClass( "ui-mini" );
+		}
+
+	});
+};
+
+// The pagecreate handler for controlgroup is in jquery.mobile.init because of the soft-dependency on the wrapped widgets
+
+})(jQuery);
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.core.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.core.js
new file mode 100644
index 0000000..92310f4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.core.js
@@ -0,0 +1,390 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Base file for jQuery Mobile
+//>>label: Core
+//>>group: Core
+//>>css.structure: ../css/structure/jquery.mobile.core.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [ "jquery" ], function( jQuery, __version__ ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, window, undefined ) {
+
+	var nsNormalizeDict = {};
+
+	// jQuery.mobile configurable options
+	$.mobile = $.extend( {}, {
+
+		// Version of the jQuery Mobile Framework
+		version: __version__,
+
+		// 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",
+
+		// Class used for "focus" form element state, from CSS framework
+		focusClass: "ui-focus",
+
+		// 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: "fade",
+
+		// Set maximum window width for transitions to apply - 'false' for no limit
+		maxTransitionWidth: false,
+
+		// Minimum scroll distance that will be remembered when returning to a page
+		minScrollBack: 250,
+
+		// DEPRECATED: the following property is no longer in use, but defined until 2.0 to prevent conflicts
+		touchOverflowEnabled: false,
+
+		// Set default dialog transition - 'none' for no transitions
+		defaultDialogTransition: "pop",
+
+		// Error response message - appears when an Ajax page request fails
+		pageLoadErrorMessage: "Error Loading Page",
+
+		// For error messages, which theme does the box uses?
+		pageLoadErrorMessageTheme: "e",
+
+		// replace calls to window.history.back with phonegaps navigation helper
+		// where it is provided on the window object
+		phonegapNavigationEnabled: false,
+
+		//automatically initialize the DOM when it's ready
+		autoInitializePage: true,
+
+		pushStateEnabled: true,
+
+		// allows users to opt in to ignoring content by marking a parent element as
+		// data-ignored
+		ignoreContentEnabled: false,
+
+		// turn of binding to the native orientationchange due to android orientation behavior
+		orientationChangeEnabled: true,
+
+		buttonMarkup: {
+			hoverDelay: 200
+		},
+
+		// define the window and the document objects
+		$window: $( window ),
+		$document: $( document ),
+
+		getAttrFixed : function( e, key ) {
+			var value = e.getAttribute( key );
+
+			return value === "true" ? true :
+				value === "false" ? false :
+				value === null ? undefined : value;
+		},
+
+		// 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 );
+				$.mobile.$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 ) );
+		},
+
+		// 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.
+		getInheritedTheme: function( el, defaultTheme ) {
+			var e = el[ 0 ],
+				ltr = "",
+				re = /ui-(bar|body|overlay)-([a-z])\b/,
+				c, m;
+
+			while ( e ) {
+				c = e.className || "";
+				if ( c && ( 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";
+		},
+
+		// TODO the following $ and $.fn extensions can/probably should be moved into jquery.mobile.core.helpers
+		//
+		// Find the closest javascript page element to gather settings data jsperf test
+		// http://jsperf.com/single-complex-selector-vs-many-complex-selectors/edit
+		// possibly naive, but it shows that the parsing overhead for *just* the page selector vs
+		// the page and dialog selector is negligable. This could probably be speed up by
+		// doing a similar parent node traversal to the one found in the inherited theme code above
+		closestPageData: function( $target ) {
+			return $target
+				.closest( ':jqmData(role="page"), :jqmData(role="dialog")' )
+				.data( "page" );
+		},
+
+		enhanceable: function( $set ) {
+			return this.haveParents( $set, "enhance" );
+		},
+
+		hijackable: function( $set ) {
+			return this.haveParents( $set, "ajax" );
+		},
+
+		haveParents: function( $set, attr ) {
+			if ( !$.mobile.ignoreContentEnabled ) {
+				return $set;
+			}
+
+			var count = $set.length,
+				$newSet = $(),
+				e, $element, excluded;
+
+			for ( var i = 0; i < count; i++ ) {
+				$element = $set.eq( i );
+				excluded = false;
+				e = $set[ i ];
+
+				while ( e ) {
+					var c = e.getAttribute ? e.getAttribute( "data-" + $.mobile.ns + attr ) : "";
+
+					if ( c === "false" ) {
+						excluded = true;
+						break;
+					}
+
+					e = e.parentNode;
+				}
+
+				if ( !excluded ) {
+					$newSet = $newSet.add( $element );
+				}
+			}
+
+			return $newSet;
+		},
+
+		getScreenHeight: function() {
+			// Native innerHeight returns more accurate value for this across platforms,
+			// jQuery version is here as a normalized fallback for platforms like Symbian
+			return window.innerHeight || $.mobile.$window.height();
+		}
+	}, $.mobile );
+
+	// 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" ) {
+			if ( prop ) {
+				prop = $.mobile.nsNormalize( prop );
+			}
+
+			// undefined is permitted as an explicit input for the second param
+			// in this case it returns the value and does not set it to undefined
+			if( arguments.length < 2 || value === undefined ){
+				result = this.data( prop );
+			} else {
+				result = this.data( 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();
+	};
+
+	// fluent helper function for the mobile namespaced equivalent
+	$.fn.jqmEnhanceable = function() {
+		return $.mobile.enhanceable( this );
+	};
+
+	$.fn.jqmHijackable = function() {
+		return $.mobile.hijackable( this );
+	};
+
+	// 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;
+	};
+
+	$.extend({
+		creatorDict: {},
+
+		delegateSelfInitWithSingleSelector: function( target, useKeepNative ) {
+			if ( typeof target !== 'function' ) {
+				return false;
+			}
+			var selector = target.prototype.options.initSelector;
+			var selectorRE = /:jqmData\(role='[A-z\-]+'\)$/;
+			if ( selectorRE.test(selector) ) {
+				var firstIdx = selector.indexOf( "'" ) + 1;
+				var lastIdx = selector.lastIndexOf( "'" );
+				var key = selector.substring( firstIdx, lastIdx );
+				if ( !$.creatorDict.hasOwnProperty( key ) ) {
+					$.creatorDict[key] = {};
+					$.creatorDict[key].target = target;
+					if ( useKeepNative === true ) {
+						$.creatorDict[key].useKeepNative = useKeepNative;
+					}
+					return true;
+				}
+			}
+			return false;
+		}
+	});
+
+	//auto self-init widgets
+	$( document ).bind( "pagecreate create", function( e ) {
+		var selector = "*[data-" + $.mobile.ns + "role]";
+		$( selector, e.target ).each( function () {
+			var dataRoleValue = this.getAttribute( "data-role" ),
+				matchedObj = $.creatorDict[dataRoleValue];
+			if ( matchedObj ) {
+				matchedObj.target.prototype.enhance( this, matchedObj.useKeepNative );
+			}
+		});
+	});
+})( jQuery, this );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
+
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.define.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.define.js
new file mode 100644
index 0000000..973b05b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.define.js
@@ -0,0 +1,5 @@
+// creates the define method on window, only used where async loading
+// is not desired in the docs and experiments
+window.define = function() {
+	Array.prototype.slice.call( arguments ).pop()( window.jQuery );
+};
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.degradeInputs.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.degradeInputs.js
new file mode 100644
index 0000000..00f277b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.degradeInputs.js
@@ -0,0 +1,61 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Changes input type to another after custom enhancements are made (ex. range > numberic).
+//>>label: Degrade Inputs
+//>>group: Utilities
+
+
+define( [ "jquery", "./widgets/page" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(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
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+
+	var page = $.mobile.closestPageData( $( e.target ) ), 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 );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.docs.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.docs.js
new file mode 100644
index 0000000..adad1c6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.docs.js
@@ -0,0 +1,5 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+define( [ "depend!../docs/_assets/js/jqm-docs[jquery]" ], function() {
+	require( [ "./jquery.mobile" ] );
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.events.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.events.js
new file mode 100644
index 0000000..02c39bd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.events.js
@@ -0,0 +1,10 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Custom events and shortcuts.
+//>>label: Events
+//>>group: Events
+
+define( [ "jquery", "./events/touch", "./events/orientationchange" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.fieldContain.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.fieldContain.js
new file mode 100644
index 0000000..63751b0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.fieldContain.js
@@ -0,0 +1,29 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Styling to responsively position forms and labels based on screen width and add visual separation
+//>>label: Fieldcontainers
+//>>group: Forms
+//>>css.structure: ../css/structure/jquery.mobile.forms.fieldcontain.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [ "jquery" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+// filter function removes whitespace between label and form element so we can use inline-block (nodeType 3 = text)
+$.fn.fieldcontain = function( options ) {
+	return this
+		.addClass( "ui-field-contain ui-body ui-br" )
+		.contents().filter( function() {
+			return ( this.nodeType === 3 && !/\S/.test( this.nodeValue ) );
+		}).remove();
+};
+
+//auto self-init widgets
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$( ":jqmData(role='fieldcontain')", e.target ).jqmEnhanceable().fieldcontain();
+});
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.grid.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.grid.js
new file mode 100644
index 0000000..3a25f16
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.grid.js
@@ -0,0 +1,59 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Applies classes for creating grid or column styling.
+//>>label: Grid Layouts (Columns)
+//>>group: Widgets
+//>>css.structure:../css/structure/jquery.mobile.grid.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [ "jquery" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(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";
+					$this.addClass( "ui-grid-duo" );
+				}
+			}
+			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(" + iterator + "n+3)" ).addClass( "ui-block-c" );
+		}
+		if ( iterator > 3 ) {
+			$kids.filter( ":nth-child(" + iterator + "n+4)" ).addClass( "ui-block-d" );
+		}
+		if ( iterator > 4 ) {
+			$kids.filter( ":nth-child(" + iterator + "n+5)" ).addClass( "ui-block-e" );
+		}
+	});
+};
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.init.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.init.js
new file mode 100644
index 0000000..43ff2fe
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.init.js
@@ -0,0 +1,168 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Global initialization of the library.
+//>>label: Init
+//>>group: Core
+
+
+define( [ "jquery", "./jquery.mobile.core", "./jquery.mobile.support", "./jquery.mobile.navigation",
+	"./jquery.mobile.navigation.pushstate", "./widgets/loader", "./jquery.mobile.vmouse", "./jquery.hashchange" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, window, undefined ) {
+	var	$html = $( "html" ),
+			$head = $( "head" ),
+			$window = $.mobile.$window;
+
+	//remove initial build class (only present on first pageshow)
+	function hideRenderingClass() {
+		$html.removeClass( "ui-mobile-rendering" );
+	}
+
+	// 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" );
+
+	// This is a fallback. If anything goes wrong (JS errors, etc), or events don't fire,
+	// this ensures the rendering class is removed after 5 seconds, so content is visible and accessible
+	setTimeout( hideRenderingClass, 5000 );
+
+	$.extend( $.mobile, {
+		addEventBlocker: function () {
+			$html.addClass( "ui-blocker" );
+			$html.bind( "touchstart touchend vclick mousedown mouseup click", function () {
+				return false;
+			} );
+		},
+
+		removeEventBlocker: function () {
+			$html.removeClass( "ui-blocker" );
+			$html.unbind( "touchstart touchend vclick mousedown mouseup click" );
+		},
+
+		// find and enhance the pages in the dom and transition to the first page.
+		initializePage: function() {
+			// find present pages
+			var $pages = $( ":jqmData(role='page'), :jqmData(role='dialog')" ),
+				hash = $.mobile.path.parseLocation().hash.replace("#", ""),
+				hashPage = document.getElementById( hash );
+
+			// 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.each(function() {
+				var $this = $( this );
+
+				// unless the data url is already set set it to the pathname
+				if ( !$this[0].getAttribute( "data-" + $.mobile.ns + "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 = $.mobile.firstPage.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();
+			$.mobile.addEventBlocker();
+
+			//remove initial build class (only present on first pageshow)
+			hideRenderingClass();
+
+			// if hashchange listening is disabled, there's no hash deeplink,
+			// the hash is not valid (contains more than one # or does not start with #)
+			// or there is no page with that hash, change to the first page in the DOM
+			// Remember, however, that the hash can also be a path!
+			if ( ! ( $.mobile.hashListeningEnabled &&
+				$.mobile.path.isHashValid( location.hash ) &&
+				( $( hashPage ).is( ':jqmData(role="page")' ) ||
+					$.mobile.path.isPath( hash ) ||
+					hash === $.mobile.dialogHashKey ) ) ) {
+
+				// Store the initial destination
+				if ( $.mobile.path.isHashValid( location.hash ) ) {
+					$.mobile.urlHistory.initialDst = hash.replace( "#", "" );
+				}
+				$.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 ] );
+			}
+		}
+	});
+
+	// initialize events now, after mobileinit has occurred
+	$.mobile.navreadyDeferred.resolve();
+
+	// 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 || $.mobile.$window.scrollTop() === 1 ) ? 0 : 1;
+
+
+		// TODO: Implement a proper registration mechanism with dependency handling in order to not have exceptions like the one below
+		//auto self-init widgets for those widgets that have a soft dependency on others
+		if ( $.fn.controlgroup ) {
+			$.mobile.$document.bind( "pagecreate create", function( e ) {
+				$( ":jqmData(role='controlgroup')", e.target )
+					.jqmEnhanceable()
+					.controlgroup({ excludeInvisible: false });
+			});
+		}
+
+		//dom-ready inits
+		if ( $.mobile.autoInitializePage ) {
+			$.mobile.initializePage();
+		}
+
+		// window load event
+		// hide iOS browser chrome on load
+		$window.load( $.mobile.silentScroll );
+
+		if ( !$.support.cssPointerEvents ) {
+			// IE and Opera don't support CSS pointer-events: none that we use to disable link-based buttons
+			// by adding the 'ui-disabled' class to them. Using a JavaScript workaround for those browser.
+			// https://github.com/jquery/jquery-mobile/issues/3558
+
+			$.mobile.$document.delegate( ".ui-disabled", "vclick",
+				function( e ) {
+					e.preventDefault();
+					e.stopImmediatePropagation();
+				}
+			);
+		}
+	});
+}( jQuery, this ));
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.js
new file mode 100644
index 0000000..d386b6e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.js
@@ -0,0 +1,38 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>group: exclude
+
+define([
+	'require',
+	'./widgets/loader',
+	'./jquery.mobile.navigation',
+	'./jquery.mobile.navigation.pushstate',
+	'./jquery.mobile.transitions',
+	'./jquery.mobile.degradeInputs',
+	'./widgets/dialog',
+	'./widgets/page.sections',
+	'./widgets/collapsible',
+	'./widgets/collapsibleSet',
+	'./jquery.mobile.fieldContain',
+	'./jquery.mobile.grid',
+	'./widgets/navbar',
+	'./widgets/listview',
+	'./widgets/listview.filter',
+	'./widgets/listview.autodividers',
+	'./jquery.mobile.nojs',
+	'./widgets/forms/checkboxradio',
+	'./widgets/forms/button',
+	'./widgets/forms/slider',
+	'./widgets/forms/textinput',
+	'./widgets/forms/select.custom',
+	'./widgets/forms/select',
+	'./jquery.mobile.buttonMarkup',
+	'./jquery.mobile.controlGroup',
+	'./jquery.mobile.links',
+	'./widgets/fixedToolbar',
+	'./widgets/popup',
+	'./jquery.mobile.zoom',
+	'./jquery.mobile.zoom.iosorientationfix'
+], function( require ) {
+	require( [ './jquery.mobile.init' ], function() {} );
+});
+//>>excludeEnd("jqmBuildExclude");
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.links.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.links.js
new file mode 100644
index 0000000..1c13bc4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.links.js
@@ -0,0 +1,26 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Adds classes to links.
+//>>label: Link Classes
+//>>group: Utilities
+
+
+define( [ "jquery" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+
+	//links within content areas, tests included with page
+	$( e.target )
+		.find( "a" )
+		.jqmEnhanceable()
+		.not( ".ui-btn, .ui-link-inherit, :jqmData(role='none'), :jqmData(role='nojs')" )
+		.addClass( "ui-link" );
+
+});
+
+})( jQuery );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.media.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.media.js
new file mode 100644
index 0000000..3ef76e4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.media.js
@@ -0,0 +1,52 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: A workaround for browsers without window.matchMedia
+//>>label: Match Media Polyfill
+//>>group: Utilities
+
+
+define( [ "jquery", "./jquery.mobile.core" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+var $window = $.mobile.$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'></div>" ),
+		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);
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.navigation.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.navigation.js
new file mode 100644
index 0000000..189dc84
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.navigation.js
@@ -0,0 +1,1555 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Applies the AJAX navigation system to links and forms to enable page transitions
+//>>label: AJAX Navigation System
+//>>group: Navigation
+
+define( [
+	"jquery",
+	"./jquery.mobile.core",
+	"./jquery.mobile.events",
+	"./jquery.mobile.support",
+	"./jquery.hashchange",
+	"./widgets/page",
+	"./jquery.mobile.transition" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+	//define vars for interal use
+	var $window = $.mobile.$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]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,
+
+			// Abstraction to address xss (Issue #4787) by removing the authority in
+			// browsers that auto	decode it. All references to location.href should be
+			// replaced with a call to this method so that it can be dealt with properly here
+			getLocation: function( url ) {
+				var uri = url ? this.parseUrl( url ) : location,
+					hash = this.parseUrl( url || location.href ).hash;
+
+				// mimic the browser with an empty string when the hash is empty
+				hash = hash === "#" ? "" : hash;
+
+				// Make sure to parse the url or the location object for the hash because using location.hash
+				// is autodecoded in firefox, the rest of the url should be from the object (location unless
+				// we're testing) to avoid the inclusion of the authority
+				return uri.protocol + "//" + uri.host + uri.pathname + uri.search + hash;
+			},
+
+			parseLocation: function() {
+				return this.parseUrl( this.getLocation() );
+			},
+
+			//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;
+				}
+
+				if ( absUrl === undefined ) {
+					absUrl = documentBase;
+				}
+
+				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, "" ).split( dialogHashKey )[0];
+				}
+
+				return window.decodeURIComponent(absUrl);
+			},
+
+			//get path from current hash, or from a file path
+			get: function( newPath ) {
+				if ( newPath === undefined ) {
+					newPath = path.parseLocation().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, "" ) );
+			},
+
+			isHashValid: function( hash ) {
+				return ( /^#[^#]+$/ ).test( hash );
+			},
+
+			//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 );
+			},
+
+
+			// 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.
+			isPermittedCrossDomainRequest: function( docUrl, reqUrl ) {
+				return $.mobile.allowCrossDomainPages &&
+					docUrl.protocol === "file:" &&
+					reqUrl.search( /^https?:/ ) !== -1;
+			}
+		},
+
+		//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 is 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 ( decodeURIComponent( opts.currentUrl ) === decodeURIComponent( 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.parseLocation(),
+
+		//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 ),
+
+		getScreenHeight = $.mobile.getScreenHeight;
+
+		//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 */
+
+	// NOTE Issue #4950 Android phonegap doesn't navigate back properly
+	//      when a full page refresh has taken place. It appears that hashchange
+	//      and replacestate history alterations work fine but we need to support
+	//      both forms of history traversal in our code that uses backward history
+	//      movement
+	$.mobile.back = function() {
+		var nav = window.navigator;
+
+		// if the setting is on and the navigator object is
+		// available use the phonegap navigation capability
+		if( this.phonegapNavigationEnabled &&
+			nav &&
+			nav.app &&
+			nav.app.backHistory ){
+			nav.app.backHistory();
+		} else {
+			window.history.back();
+		}
+	};
+
+	//direct focus to the page title, or otherwise first focusable element
+	$.mobile.focusPage = function ( page ) {
+		var autofocus = page.find( "[autofocus]" ),
+			pageTitle = page.find( ".ui-title:eq(0)" );
+
+		if ( autofocus.length ) {
+			autofocus.focus();
+			return;
+		}
+
+		if ( pageTitle.length ) {
+			pageTitle.focus();
+		} else{
+			page.focus();
+		}
+	};
+
+	//remove active classes after page transition or error
+	function removeActiveLinkClass( forceRemoval ) {
+		if ( !!$activeClickedLink && ( !$activeClickedLink.closest( "." + $.mobile.activePageClass ).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,
+		setLastScroll, delayedSetLastScroll;
+
+	setLastScroll = function() {
+		// 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 = $window.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 );
+	};
+
+	// 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() {
+
+			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
+			$window.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
+			$window.bind( "scrollstop", delayedSetLastScroll );
+		});
+	});
+
+	// bind to scrollstop for the first page as "pagechange" won't be fired in that case
+	$window.bind( "scrollstop", delayedSetLastScroll );
+
+	// No-op implementation of transition degradation
+	$.mobile._maybeDegradeTransition = $.mobile._maybeDegradeTransition || function( transition ) {
+		return transition;
+	};
+
+	//function for transitioning between two existing pages
+	function transitionPages( toPage, fromPage, transition, reverse ) {
+
+		if ( fromPage ) {
+			//trigger before show/hide events
+			fromPage.data( "page" )._trigger( "beforehide", null, { nextPage: toPage } );
+		}
+
+		toPage.data( "page" )._trigger( "beforeshow", null, { prevPage: fromPage || $( "" ) } );
+
+		//clear page loader
+		$.mobile.hidePageLoadingMsg();
+
+		transition = $.mobile._maybeDegradeTransition( transition );
+
+		//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 || "default" ] || $.mobile.defaultTransitionHandler,
+			promise = th( transition, reverse, toPage, fromPage );
+
+		promise.done(function() {
+
+			//trigger show/hide events
+			if ( fromPage ) {
+				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 || $( "" ) } );
+
+			setTimeout( function () {
+				$.mobile.removeEventBlocker();
+			}, 0 );
+		});
+
+		return promise;
+	}
+
+	//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 animationend', 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;
+
+
+
+	//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.
+		// NOTE do _not_ use the :jqmData psuedo selector because parenthesis
+		//      are a valid url char and it breaks on the first occurence
+		page = settings.pageContainer.children( "[data-" + $.mobile.ns +"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 )
+				.jqmData( "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();
+			}
+		}
+
+		// 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 );
+				//if we are reloading the page make sure we update the base if its not a prefetch
+				if( base && ( !options || !options.prefetch ) ){
+					base.set(url);
+				}
+				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();
+				};
+		}
+
+		// Reset base to the default document base.
+		// only reset if we are not prefetching
+		if ( base && ( typeof options === "undefined" || typeof options.prefetch === "undefined" ) ) {
+			base.reset();
+		}
+
+		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( $( "<div>" + RegExp.$1 + "</div>" ).text() );
+					}
+
+					//dont update the base tag if we are prefetching
+					if ( base && ( typeof options === "undefined" || typeof options.prefetch === "undefined" ) ) {
+						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( "[data-" + $.mobile.ns +"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
+						$.mobile.showPageLoadingMsg( $.mobile.pageLoadErrorMessageTheme, $.mobile.pageLoadErrorMessage, true );
+
+						// hide after delay
+						setTimeout( $.mobile.hidePageLoadingMsg, 1500 );
+					}
+
+					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" || $.mobile.getAttrFixed( toPage [0], "data-" + $.mobile.ns + "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 );
+
+			// Even if there is no page change to be done, we should keep the urlHistory in sync with the hash changes
+			if ( settings.fromHashChange ) {
+				urlHistory.directHashChange({
+					currentUrl:	url,
+					isBack:		function() {},
+					isForward:	function() {}
+				});
+			}
+
+			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 delegate() 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 ) {}
+
+		// Record whether we are at a place in history where a dialog used to be - if so, do not add a new history entry and do not change the hash either
+		var alreadyThere = false;
+
+		// 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
+
+			// If we are at a place in history that once belonged to a dialog, reuse
+			// this state without adding to urlHistory and without modifying the hash.
+			// However, if a dialog is already displayed at this point, and we're
+			// about to display another dialog, then we must add another hash and
+			// history entry on top so that one may navigate back to the original dialog
+			if ( active.url.indexOf( dialogHashKey ) > -1 && !$.mobile.activePage.is( ".ui-dialog" ) ) {
+				settings.changeHash = false;
+				alreadyThere = true;
+			}
+
+			// Normally, we tack on a dialog hash key, but if this is the location of a stale dialog,
+			// we reuse the URL from the entry
+			url = ( active.url || "" ) + ( alreadyThere ? "" : dialogHashKey );
+
+			// tack on another dialogHashKey if this is the same as the initial hash
+			// this makes sure that a history entry is created for this dialog
+			if ( urlHistory.activeIndex === 0 && url === urlHistory.initialDst ) {
+				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 ) {
+			// Overwrite the current entry if it's a leftover from a dialog
+			if ( alreadyThere ) {
+				urlHistory.activeIndex = Math.max( 0, urlHistory.activeIndex - 1 );
+			}
+			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( name, reverse, $to, $from, alreadyFocused ) {
+				removeActiveLinkClass();
+
+				//if there's a duplicateCachedPage, remove it from the DOM now that it's hidden
+				if ( settings.duplicateCachedPage ) {
+					settings.duplicateCachedPage.remove();
+				}
+
+				// Send focus to the newly shown page. Moved from promise .done binding in transitionPages
+				// itself to avoid ie bug that reports offsetWidth as > 0 (core check for visibility)
+				// despite visibility: hidden addresses issue #2965
+				// https://github.com/jquery/jquery-mobile/issues/2965
+				if ( !alreadyFocused ) {
+					$.mobile.focusPage( toPage );
+				}
+
+				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 deferred is resolved in the init file
+	$.mobile.navreadyDeferred = $.Deferred();
+	$.mobile.navreadyDeferred.done(function() {
+		//bind to form submit events, handle with Ajax
+		$.mobile.$document.delegate( "form", "submit", function( event ) {
+			var $this = $( this );
+
+			if ( !$.mobile.ajaxEnabled ||
+					// test that the form is, itself, ajax false
+					$this.is( ":jqmData(ajax='false')" ) ||
+					// test that $.mobile.ignoreContentEnabled is set and
+					// the form or one of it's parents is ajax=false
+					!$this.jqmHijackable().length ) {
+				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 ) );
+
+			if ( ( path.isExternal( url ) && !path.isPermittedCrossDomainRequest( documentUrl, url ) ) || target ) {
+				return;
+			}
+
+			$.mobile.changePage(
+				url,
+				{
+					type:		type && type.length && type.toLowerCase() || "get",
+					data:		$this.serialize(),
+					transition:	$.mobile.getAttrFixed( $this [0], "data-" + $.mobile.ns + "transition" ),
+					reverse:	$.mobile.getAttrFixed( $this [0], "data-" + $.mobile.ns + "direction" ) === "reverse",
+					reloadPage:	true
+				}
+			);
+			event.preventDefault();
+		});
+
+		//add active state on vclick
+		$.mobile.$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 the which attr
+			if ( event.which > 1 || !$.mobile.linkBindingEnabled ) {
+				return;
+			}
+
+			var link = findClosestLink( event.target );
+
+			// split from the previous return logic to avoid find closest where possible
+			// TODO teach $.mobile.hijackable to operate on raw dom elements so the link wrapping
+			// can be avoided
+			if ( !$( link ).jqmHijackable().length ) {
+				return;
+			}
+
+			if ( link ) {
+				if ( path.parseUrl( link.getAttribute( "href" ) || "#" ).hash !== "#" ) {
+					removeActiveLinkClass( true );
+					$activeClickedLink = $( link ).closest( ".ui-btn" ).not( ".ui-disabled" );
+					$activeClickedLink.addClass( $.mobile.activeBtnClass );
+				}
+			}
+		});
+
+		// click routing - direct to HTTP or Ajax, accordingly
+		$.mobile.$document.bind( "click", function( event ) {
+			if ( !$.mobile.linkBindingEnabled ) {
+				return;
+			}
+
+			var link = findClosestLink( event.target ), $link = $( link ), httpCleanup;
+
+			// If there is no link associated with the click or its not a left
+			// click we want to ignore the click
+			// TODO teach $.mobile.hijackable to operate on raw dom elements so the link wrapping
+			// can be avoided
+			if ( !link || event.which > 1 || !$link.jqmHijackable().length ) {
+				return;
+			}
+
+			//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')" ) ) {
+				$.mobile.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.
+
+				//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 ) && !path.isPermittedCrossDomainRequest( documentUrl, href ) );
+
+			if ( isExternal ) {
+				httpCleanup();
+				//use default click handling
+				return;
+			}
+
+			//use ajax
+			var transition = $.mobile.getAttrFixed( $link [0], "data-" + $.mobile.ns + "transition" ),
+				reverse =  $.mobile.getAttrFixed( $link [0], "data-" + $.mobile.ns + "direction" ) === "reverse" ||
+							// deprecated - remove by 1.0
+							 $.mobile.getAttrFixed( $link [0], "data-" + $.mobile.ns + "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, link: $link } );
+			event.preventDefault();
+		});
+
+		//prefetch pages when anchors with data-prefetch are encountered
+		$.mobile.$document.delegate( ".ui-page", "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" ),prefetch: true } );
+				}
+			});
+		});
+
+		$.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,
+
+				// "navigate" event fired to allow others to take advantage of the more robust hashchange handling
+				navEvent = new $.Event( "navigate" ),
+
+				// 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 ( 0 === urlHistory.stack.length ) {
+				urlHistory.initialDst = to;
+			}
+
+			// We should probably fire the "navigate" event from those places that make calls to _handleHashChange,
+			// and have _handleHashChange hook into the "navigate" event instead of triggering it here
+			$.mobile.pageContainer.trigger( navEvent );
+			if ( navEvent.isDefaultPrevented() ) {
+				return;
+			}
+
+			//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 && urlHistory.initialDst !== to ) {
+
+				// 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() { $.mobile.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;
+
+				// If we're about to go to an initial URL that contains a reference to a non-existent
+				// internal page, go to the first page instead. We know that the initial hash refers to a
+				// non-existent page, because the initial hash did not end up in the initial urlHistory entry
+				if ( to === path.makeUrlAbsolute( '#' + urlHistory.initialDst, documentBase ) &&
+					urlHistory.stack.length && urlHistory.stack[0].url !== urlHistory.initialDst.replace( dialogHashKey, "" ) ) {
+					to = $.mobile.firstPage;
+				}
+				$.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 ) {
+			// Firefox auto-escapes the location.hash as for v13 but
+			// leaves the href untouched
+			$.mobile._handleHashChange( path.parseLocation().hash );
+		});
+
+	});//navreadyDeferred done callback
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.navigation.js.orig b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.navigation.js.orig
new file mode 100644
index 0000000..56564eb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.navigation.js.orig
@@ -0,0 +1,1555 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Applies the AJAX navigation system to links and forms to enable page transitions
+//>>label: AJAX Navigation System
+//>>group: Navigation
+
+define( [
+	"jquery",
+	"./jquery.mobile.core",
+	"./jquery.mobile.events",
+	"./jquery.mobile.support",
+	"depend!./jquery.hashchange[jquery]",
+	"./widgets/page",
+	"./jquery.mobile.transition" ], function( $ ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+	//define vars for interal use
+	var $window = $.mobile.$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]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,
+
+			// Abstraction to address xss (Issue #4787) by removing the authority in
+			// browsers that auto	decode it. All references to location.href should be
+			// replaced with a call to this method so that it can be dealt with properly here
+			getLocation: function( url ) {
+				var uri = url ? this.parseUrl( url ) : location,
+					hash = this.parseUrl( url || location.href ).hash;
+
+				// mimic the browser with an empty string when the hash is empty
+				hash = hash === "#" ? "" : hash;
+
+				// Make sure to parse the url or the location object for the hash because using location.hash
+				// is autodecoded in firefox, the rest of the url should be from the object (location unless
+				// we're testing) to avoid the inclusion of the authority
+				return uri.protocol + "//" + uri.host + uri.pathname + uri.search + hash;
+			},
+
+			parseLocation: function() {
+				return this.parseUrl( this.getLocation() );
+			},
+
+			//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;
+				}
+
+				if ( absUrl === undefined ) {
+					absUrl = documentBase;
+				}
+
+				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, "" ).split( dialogHashKey )[0];
+				}
+
+				return window.decodeURIComponent(absUrl);
+			},
+
+			//get path from current hash, or from a file path
+			get: function( newPath ) {
+				if ( newPath === undefined ) {
+					newPath = path.parseLocation().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, "" ) );
+			},
+
+			isHashValid: function( hash ) {
+				return ( /^#[^#]+$/ ).test( hash );
+			},
+
+			//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 );
+			},
+
+
+			// 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.
+			isPermittedCrossDomainRequest: function( docUrl, reqUrl ) {
+				return $.mobile.allowCrossDomainPages &&
+					docUrl.protocol === "file:" &&
+					reqUrl.search( /^https?:/ ) !== -1;
+			}
+		},
+
+		//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 is 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 ( decodeURIComponent( opts.currentUrl ) === decodeURIComponent( 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.parseLocation(),
+
+		//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 ),
+
+		getScreenHeight = $.mobile.getScreenHeight;
+
+		//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 */
+
+	// NOTE Issue #4950 Android phonegap doesn't navigate back properly
+	//      when a full page refresh has taken place. It appears that hashchange
+	//      and replacestate history alterations work fine but we need to support
+	//      both forms of history traversal in our code that uses backward history
+	//      movement
+	$.mobile.back = function() {
+		var nav = window.navigator;
+
+		// if the setting is on and the navigator object is
+		// available use the phonegap navigation capability
+		if( this.phonegapNavigationEnabled &&
+			nav &&
+			nav.app &&
+			nav.app.backHistory ){
+			nav.app.backHistory();
+		} else {
+			window.history.back();
+		}
+	};
+
+	//direct focus to the page title, or otherwise first focusable element
+	$.mobile.focusPage = function ( page ) {
+		var autofocus = page.find( "[autofocus]" ),
+			pageTitle = page.find( ".ui-title:eq(0)" );
+
+		if ( autofocus.length ) {
+			autofocus.focus();
+			return;
+		}
+
+		if ( pageTitle.length ) {
+			pageTitle.focus();
+		} else{
+			page.focus();
+		}
+	};
+
+	//remove active classes after page transition or error
+	function removeActiveLinkClass( forceRemoval ) {
+		if ( !!$activeClickedLink && ( !$activeClickedLink.closest( "." + $.mobile.activePageClass ).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,
+		setLastScroll, delayedSetLastScroll;
+
+	setLastScroll = function() {
+		// 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 = $window.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 );
+	};
+
+	// 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() {
+
+			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
+			$window.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
+			$window.bind( "scrollstop", delayedSetLastScroll );
+		});
+	});
+
+	// bind to scrollstop for the first page as "pagechange" won't be fired in that case
+	$window.bind( "scrollstop", delayedSetLastScroll );
+
+	// No-op implementation of transition degradation
+	$.mobile._maybeDegradeTransition = $.mobile._maybeDegradeTransition || function( transition ) {
+		return transition;
+	};
+
+	//function for transitioning between two existing pages
+	function transitionPages( toPage, fromPage, transition, reverse ) {
+
+		if ( fromPage ) {
+			//trigger before show/hide events
+			fromPage.data( "page" )._trigger( "beforehide", null, { nextPage: toPage } );
+		}
+
+		toPage.data( "page" )._trigger( "beforeshow", null, { prevPage: fromPage || $( "" ) } );
+
+		//clear page loader
+		$.mobile.hidePageLoadingMsg();
+
+		transition = $.mobile._maybeDegradeTransition( transition );
+
+		//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 || "default" ] || $.mobile.defaultTransitionHandler,
+			promise = th( transition, reverse, toPage, fromPage );
+
+		promise.done(function() {
+
+			//trigger show/hide events
+			if ( fromPage ) {
+				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 || $( "" ) } );
+
+			setTimeout( function () {
+				$.mobile.removeEventBlocker();
+			}, 0 );
+		});
+
+		return promise;
+	}
+
+	//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 animationend', 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;
+
+
+
+	//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.
+		// NOTE do _not_ use the :jqmData psuedo selector because parenthesis
+		//      are a valid url char and it breaks on the first occurence
+		page = settings.pageContainer.children( "[data-" + $.mobile.ns +"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 )
+				.jqmData( "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();
+			}
+		}
+
+		// 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 );
+				//if we are reloading the page make sure we update the base if its not a prefetch
+				if( base && !options.prefetch ){
+					base.set(url);
+				}
+				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();
+				};
+		}
+
+		// Reset base to the default document base.
+		// only reset if we are not prefetching
+		if ( base && typeof options.prefetch === "undefined" ) {
+			base.reset();
+		}
+
+		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( $( "<div>" + RegExp.$1 + "</div>" ).text() );
+					}
+
+					//dont update the base tag if we are prefetching
+					if ( base && typeof options.prefetch === "undefined") {
+						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( "[data-" + $.mobile.ns +"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
+						$.mobile.showPageLoadingMsg( $.mobile.pageLoadErrorMessageTheme, $.mobile.pageLoadErrorMessage, true );
+
+						// hide after delay
+						setTimeout( $.mobile.hidePageLoadingMsg, 1500 );
+					}
+
+					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" || $.mobile.getAttrFixed( toPage [0], "data-" + $.mobile.ns + "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 );
+
+			// Even if there is no page change to be done, we should keep the urlHistory in sync with the hash changes
+			if ( settings.fromHashChange ) {
+				urlHistory.directHashChange({
+					currentUrl:	url,
+					isBack:		function() {},
+					isForward:	function() {}
+				});
+			}
+
+			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 delegate() 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 ) {}
+
+		// Record whether we are at a place in history where a dialog used to be - if so, do not add a new history entry and do not change the hash either
+		var alreadyThere = false;
+
+		// 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
+
+			// If we are at a place in history that once belonged to a dialog, reuse
+			// this state without adding to urlHistory and without modifying the hash.
+			// However, if a dialog is already displayed at this point, and we're
+			// about to display another dialog, then we must add another hash and
+			// history entry on top so that one may navigate back to the original dialog
+			if ( active.url.indexOf( dialogHashKey ) > -1 && !$.mobile.activePage.is( ".ui-dialog" ) ) {
+				settings.changeHash = false;
+				alreadyThere = true;
+			}
+
+			// Normally, we tack on a dialog hash key, but if this is the location of a stale dialog,
+			// we reuse the URL from the entry
+			url = ( active.url || "" ) + ( alreadyThere ? "" : dialogHashKey );
+
+			// tack on another dialogHashKey if this is the same as the initial hash
+			// this makes sure that a history entry is created for this dialog
+			if ( urlHistory.activeIndex === 0 && url === urlHistory.initialDst ) {
+				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 ) {
+			// Overwrite the current entry if it's a leftover from a dialog
+			if ( alreadyThere ) {
+				urlHistory.activeIndex = Math.max( 0, urlHistory.activeIndex - 1 );
+			}
+			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( name, reverse, $to, $from, alreadyFocused ) {
+				removeActiveLinkClass();
+
+				//if there's a duplicateCachedPage, remove it from the DOM now that it's hidden
+				if ( settings.duplicateCachedPage ) {
+					settings.duplicateCachedPage.remove();
+				}
+
+				// Send focus to the newly shown page. Moved from promise .done binding in transitionPages
+				// itself to avoid ie bug that reports offsetWidth as > 0 (core check for visibility)
+				// despite visibility: hidden addresses issue #2965
+				// https://github.com/jquery/jquery-mobile/issues/2965
+				if ( !alreadyFocused ) {
+					$.mobile.focusPage( toPage );
+				}
+
+				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 deferred is resolved in the init file
+	$.mobile.navreadyDeferred = $.Deferred();
+	$.mobile.navreadyDeferred.done(function() {
+		//bind to form submit events, handle with Ajax
+		$.mobile.$document.delegate( "form", "submit", function( event ) {
+			var $this = $( this );
+
+			if ( !$.mobile.ajaxEnabled ||
+					// test that the form is, itself, ajax false
+					$this.is( ":jqmData(ajax='false')" ) ||
+					// test that $.mobile.ignoreContentEnabled is set and
+					// the form or one of it's parents is ajax=false
+					!$this.jqmHijackable().length ) {
+				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 ) );
+
+			if ( ( path.isExternal( url ) && !path.isPermittedCrossDomainRequest( documentUrl, url ) ) || target ) {
+				return;
+			}
+
+			$.mobile.changePage(
+				url,
+				{
+					type:		type && type.length && type.toLowerCase() || "get",
+					data:		$this.serialize(),
+					transition:	$.mobile.getAttrFixed( $this [0], "data-" + $.mobile.ns + "transition" ),
+					reverse:	$.mobile.getAttrFixed( $this [0], "data-" + $.mobile.ns + "direction" ) === "reverse",
+					reloadPage:	true
+				}
+			);
+			event.preventDefault();
+		});
+
+		//add active state on vclick
+		$.mobile.$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 the which attr
+			if ( event.which > 1 || !$.mobile.linkBindingEnabled ) {
+				return;
+			}
+
+			var link = findClosestLink( event.target );
+
+			// split from the previous return logic to avoid find closest where possible
+			// TODO teach $.mobile.hijackable to operate on raw dom elements so the link wrapping
+			// can be avoided
+			if ( !$( link ).jqmHijackable().length ) {
+				return;
+			}
+
+			if ( link ) {
+				if ( path.parseUrl( link.getAttribute( "href" ) || "#" ).hash !== "#" ) {
+					removeActiveLinkClass( true );
+					$activeClickedLink = $( link ).closest( ".ui-btn" ).not( ".ui-disabled" );
+					$activeClickedLink.addClass( $.mobile.activeBtnClass );
+				}
+			}
+		});
+
+		// click routing - direct to HTTP or Ajax, accordingly
+		$.mobile.$document.bind( "click", function( event ) {
+			if ( !$.mobile.linkBindingEnabled ) {
+				return;
+			}
+
+			var link = findClosestLink( event.target ), $link = $( link ), httpCleanup;
+
+			// If there is no link associated with the click or its not a left
+			// click we want to ignore the click
+			// TODO teach $.mobile.hijackable to operate on raw dom elements so the link wrapping
+			// can be avoided
+			if ( !link || event.which > 1 || !$link.jqmHijackable().length ) {
+				return;
+			}
+
+			//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')" ) ) {
+				$.mobile.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.
+
+				//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 ) && !path.isPermittedCrossDomainRequest( documentUrl, href ) );
+
+			if ( isExternal ) {
+				httpCleanup();
+				//use default click handling
+				return;
+			}
+
+			//use ajax
+			var transition = $.mobile.getAttrFixed( $link [0], "data-" + $.mobile.ns + "transition" ),
+				reverse =  $.mobile.getAttrFixed( $link [0], "data-" + $.mobile.ns + "direction" ) === "reverse" ||
+							// deprecated - remove by 1.0
+							 $.mobile.getAttrFixed( $link [0], "data-" + $.mobile.ns + "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, link: $link } );
+			event.preventDefault();
+		});
+
+		//prefetch pages when anchors with data-prefetch are encountered
+		$.mobile.$document.delegate( ".ui-page", "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" ),prefetch: true } );
+				}
+			});
+		});
+
+		$.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,
+
+				// "navigate" event fired to allow others to take advantage of the more robust hashchange handling
+				navEvent = new $.Event( "navigate" ),
+
+				// 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 ( 0 === urlHistory.stack.length ) {
+				urlHistory.initialDst = to;
+			}
+
+			// We should probably fire the "navigate" event from those places that make calls to _handleHashChange,
+			// and have _handleHashChange hook into the "navigate" event instead of triggering it here
+			$.mobile.pageContainer.trigger( navEvent );
+			if ( navEvent.isDefaultPrevented() ) {
+				return;
+			}
+
+			//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 && urlHistory.initialDst !== to ) {
+
+				// 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() { $.mobile.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;
+
+				// If we're about to go to an initial URL that contains a reference to a non-existent
+				// internal page, go to the first page instead. We know that the initial hash refers to a
+				// non-existent page, because the initial hash did not end up in the initial urlHistory entry
+				if ( to === path.makeUrlAbsolute( '#' + urlHistory.initialDst, documentBase ) &&
+					urlHistory.stack.length && urlHistory.stack[0].url !== urlHistory.initialDst.replace( dialogHashKey, "" ) ) {
+					to = $.mobile.firstPage;
+				}
+				$.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 ) {
+			// Firefox auto-escapes the location.hash as for v13 but
+			// leaves the href untouched
+			$.mobile._handleHashChange( path.parseLocation().hash );
+		});
+
+	});//navreadyDeferred done callback
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.navigation.pushstate.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.navigation.pushstate.js
new file mode 100644
index 0000000..fb72964
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.navigation.pushstate.js
@@ -0,0 +1,158 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: history.pushState support, layered on top of hashchange.
+//>>label: Pushstate Support
+//>>group: Navigation
+
+define( [ "jquery", "./jquery.mobile.navigation", "./jquery.hashchange" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(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 = $.mobile.$window,
+		url = $.mobile.path.parseLocation(),
+		mobileinitDeferred = $.Deferred(),
+		domreadyDeferred = $.Deferred();
+
+	$.mobile.$document.ready( $.proxy( domreadyDeferred, "resolve" ) );
+
+	$.mobile.$document.one( "mobileinit", $.proxy( mobileinitDeferred, "resolve" ) );
+
+	$.extend( pushStateHandler, {
+		// TODO move to a path helper, this is rather common functionality
+		initialFilePath: (function() {
+			return url.pathname + url.search;
+		})(),
+
+		hashChangeTimeout: 200,
+
+		hashChangeEnableTimer: undefined,
+
+		initialHref: url.hrefNoHash,
+
+		state: function() {
+			return {
+				// firefox auto decodes the url when using location.hash but not href
+				hash: $.mobile.path.parseLocation().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,
+				// firefox auto decodes the url when using location.hash but not href
+				hash = $.mobile.path.parseLocation().hash,
+				isPath = $.mobile.path.isPath( hash ),
+				resolutionUrl = isPath ? $.mobile.path.getLocation() : $.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 $.mobile.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,
+				fromHash, toHash, hashChanged;
+
+			// if there's no state its not a popstate we care about, eg chrome's initial popstate
+			if ( poppedState ) {
+				// if we get two pop states in under this.hashChangeTimeout
+				// make sure to clear any timer set for the previous change
+				clearTimeout( self.hashChangeEnableTimer );
+
+				// make sure to enable hash handling for the the _handleHashChange call
+				self.nextHashChangePrevented( false );
+
+				// change the page based on the hash in the popped state
+				$.mobile._handleHashChange( poppedState.hash );
+
+				// prevent any hashchange in the next self.hashChangeTimeout
+				self.nextHashChangePrevented( true );
+
+				// re-enable hash change handling after swallowing a possible hash
+				// change event that comes on all popstates courtesy of browsers like Android
+				self.hashChangeEnableTimer = setTimeout( function() {
+					self.nextHashChangePrevented( false );
+				}, self.hashChangeTimeout );
+			}
+		},
+
+		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, $.mobile.path.getLocation() );
+			}
+		}
+	});
+
+	// We need to init when "mobileinit", "domready", and "navready" have all happened
+	$.when( domreadyDeferred, mobileinitDeferred, $.mobile.navreadyDeferred ).done(function() {
+		if ( $.mobile.pushStateEnabled && $.support.pushState ) {
+			pushStateHandler.init();
+		}
+	});
+})( jQuery, this );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.nojs.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.nojs.js
new file mode 100644
index 0000000..cffd909
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.nojs.js
@@ -0,0 +1,18 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Adds class to make elements hidden to A grade browsers
+//>>label: “nojs” Classes
+//>>group: Utilities
+
+define( [ "jquery" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$( ":jqmData(role='nojs')", e.target ).addClass( "ui-nojs" );
+	
+});
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.support.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.support.js
new file mode 100644
index 0000000..64f889f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.support.js
@@ -0,0 +1,193 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Assorted tests to qualify browsers by detecting features
+//>>label: Support Tests
+//>>group: Core
+define( [  "jquery", "./jquery.mobile.core", "./jquery.mobile.media" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+// 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;
+		}
+	}
+}
+
+var fakeBody = $( "<body>" ).prependTo( "html" ),
+	fbCSS = fakeBody[ 0 ].style,
+	vendors = [ "Webkit", "Moz", "O" ],
+	webos = "palmGetResource" in window, //only used to rule out scrollTop
+	opera = window.opera,
+	operamini = window.operamini && ({}).toString.call( window.operamini ) === "[object OperaMini]",
+	bb = window.blackberry && !propExists( "-webkit-transform" ); //only used to rule out box shadow, as it's filled opaque on BB 5 and lower
+
+
+function validStyle( prop, value, check_vend ) {
+	var div = document.createElement( 'div' ),
+		uc = function( txt ) {
+			return txt.charAt( 0 ).toUpperCase() + txt.substr( 1 );
+		},
+		vend_pref = function( vend ) {
+			return  "-" + vend.charAt( 0 ).toLowerCase() + vend.substr( 1 ) + "-";
+		},
+		check_style = function( vend ) {
+			var vend_prop = vend_pref( vend ) + prop + ": " + value + ";",
+				uc_vend = uc( vend ),
+				propStyle = uc_vend + uc( prop );
+
+			div.setAttribute( "style", vend_prop );
+
+			if ( !!div.style[ propStyle ] ) {
+				ret = true;
+			}
+		},
+		check_vends = check_vend ? [ check_vend ] : vendors,
+		ret;
+
+	for( var i = 0; i < check_vends.length; i++ ) {
+		check_style( check_vends[i] );
+	}
+	return !!ret;
+}
+
+// Thanks to Modernizr src for this test idea. `perspective` check is limited to Moz to prevent a false positive for 3D transforms on Android.
+function transform3dTest() {
+	var prop = "transform-3d";
+	return validStyle( 'perspective', '10px', 'moz' ) || $.mobile.media( "(-" + vendors.join( "-" + prop + "),(-" ) + "-" + prop + "),(" + prop + ")" );
+}
+
+// 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;
+}
+
+// Thanks Modernizr
+function cssPointerEventsTest() {
+	var element = document.createElement( 'x' ),
+		documentElement = document.documentElement,
+		getComputedStyle = window.getComputedStyle,
+		supports;
+
+	if ( !( 'pointerEvents' in element.style ) ) {
+		return false;
+	}
+
+	element.style.pointerEvents = 'auto';
+	element.style.pointerEvents = 'x';
+	documentElement.appendChild( element );
+	supports = getComputedStyle &&
+	getComputedStyle( element, '' ).pointerEvents === 'auto';
+	documentElement.removeChild( element );
+	return !!supports;
+}
+
+function boundingRect() {
+	var div = document.createElement( "div" );
+	return typeof div.getBoundingClientRect !== "undefined";
+}
+
+// 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
+$.extend( $.mobile, { browser: {} } );
+$.mobile.browser.ie = (function() {
+	var v = 3,
+		div = document.createElement( "div" ),
+		a = div.all || [];
+
+	do {
+		div.innerHTML = "<!--[if gt IE " + ( ++v ) + "]><br><![endif]-->";
+	} while( a[0] );
+
+	return v > 4 ? v : !v;
+})();
+
+
+$.extend( $.support, {
+	cssTransitions: "WebKitTransitionEvent" in window || validStyle( 'transition', 'height 100ms linear' ) && !opera,
+	pushState: "pushState" in history && "replaceState" in history,
+	mediaquery: $.mobile.media( "only all" ),
+	cssPseudoElement: !!propExists( "content" ),
+	touchOverflow: !!propExists( "overflowScrolling" ),
+	cssTransform3d: transform3dTest(),
+	boxShadow: !!propExists( "boxShadow" ) && !bb,
+	scrollTop: ( "pageXOffset" in window || "scrollTop" in document.documentElement || "scrollTop" in fakeBody[ 0 ] ) && !webos && !operamini,
+	dynamicBaseTag: baseTagTest(),
+	cssPointerEvents: cssPointerEventsTest(),
+	boundingRect: boundingRect()
+});
+
+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]/ );
+})();
+
+// Support conditions that must be met in order to proceed
+// default enhanced qualifications are media query support OR IE 7+
+
+$.mobile.gradeA = function() {
+	return ( $.support.mediaquery || $.mobile.browser.ie && $.mobile.browser.ie >= 7 ) && ( $.support.boundingRect || $.fn.jquery.match(/1\.[0-7+]\.[0-9+]?/) !== null );
+};
+
+$.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 );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.support.orientation.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.support.orientation.js
new file mode 100644
index 0000000..5e96fa7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.support.orientation.js
@@ -0,0 +1,15 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Feature test for orientation
+//>>label: Orientation support test
+//>>group: Core
+
+define( [ "jquery", "./jquery.mobile.support" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+	(function( $, undefined ) {
+		$.extend( $.support, {
+			orientation: "orientation" in window && "onorientationchange" in window
+		});
+	}( jQuery ));
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.support.touch.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.support.touch.js
new file mode 100644
index 0000000..ed21e67
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.support.touch.js
@@ -0,0 +1,20 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Touch feature test
+//>>label: Touch support test
+//>>group: Core
+
+define( [ "jquery", "./jquery.mobile.support" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+	(function( $, undefined ) {
+		var support = {
+			touch: "ontouchend" in document
+		};
+
+		$.mobile = $.mobile || {};
+		$.mobile.support = $.mobile.support || {};
+		$.extend( $.support, support );
+		$.extend( $.mobile.support, support );
+	}( jQuery ));
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.transition.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.transition.js
new file mode 100644
index 0000000..c0024f3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.transition.js
@@ -0,0 +1,186 @@
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Animated page change core logic and sequence handlers
+//>>label: Transition Core
+//>>group: Transitions
+//>>css.structure: ../css/structure/jquery.mobile.transition.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [ "jquery", "./jquery.mobile.core" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, window, undefined ) {
+
+var createHandler = function( sequential ) {
+
+	// Default to sequential
+	if ( sequential === undefined ) {
+		sequential = true;
+	}
+
+	return function( name, reverse, $to, $from ) {
+
+		var deferred = new $.Deferred(),
+			reverseClass = reverse ? " reverse" : "",
+			active	= $.mobile.urlHistory.getActive(),
+			toScroll = active.lastScroll || $.mobile.defaultHomeScroll,
+			screenHeight = $.mobile.getScreenHeight(),
+			maxTransitionOverride = $.mobile.maxTransitionWidth !== false && $.mobile.$window.width() > $.mobile.maxTransitionWidth,
+			none = !$.support.cssTransitions || maxTransitionOverride || !name || name === "none" || Math.max( $.mobile.$window.scrollTop(), toScroll ) > $.mobile.getMaxScrollForTransition(),
+			toPreClass = " ui-page-pre-in",
+			toggleViewportClass = function() {
+				$.mobile.pageContainer.toggleClass( "ui-mobile-viewport-transitioning viewport-" + name );
+			},
+			scrollPage = function() {
+				// Prevent blinking on page scrolling in Tizen/Android devices.
+				// Don't scoll window, when current scroll top(scrollTop()) is already at toScroll,
+				// or when current scroll top is 0 and toScroll is same to defaultHomeScroll
+				// (which means the top position of page). In these case, page scrolling is not needed.
+				var st = $.mobile.$window.scrollTop();
+				if( st === toScroll || ( $.mobile.defaultHomeScroll === toScroll && st == 0 ) ) {
+					return;
+				}
+
+				// By using scrollTo instead of silentScroll, we can keep things better in order
+				// Just to be precautios, disable scrollstart listening like silentScroll would
+				$.event.special.scrollstart.enabled = false;
+
+				window.scrollTo( 0, toScroll );
+
+				// reenable scrollstart listening like silentScroll would
+				setTimeout( function() {
+					$.event.special.scrollstart.enabled = true;
+				}, 150 );
+			},
+			cleanFrom = function() {
+				$from
+					.removeClass( $.mobile.activePageClass + " out in reverse " + name )
+					.height( "" );
+			},
+			startOut = function() {
+				// if it's not sequential, call the doneOut transition to start the TO page animating in simultaneously
+				if ( !sequential ) {
+					doneOut();
+				}
+				else {
+					$from.animationComplete( doneOut );
+				}
+
+				// Set the from page's height and start it transitioning out
+				// Note: setting an explicit height helps eliminate tiling in the transitions
+				$from
+					.height( screenHeight + $.mobile.$window.scrollTop() )
+					.addClass( name + " out" + reverseClass );
+			},
+
+			doneOut = function() {
+
+				if ( $from && sequential ) {
+					cleanFrom();
+				}
+
+				startIn();
+			},
+
+			startIn = function() {
+
+				// Prevent flickering in phonegap container: see comments at #4024 regarding iOS
+				$to.css( "z-index", -10 );
+
+				$to.addClass( $.mobile.activePageClass + toPreClass );
+
+				// Send focus to page as it is now display: block
+				$.mobile.focusPage( $to );
+
+				// Set to page height
+				$to.height( screenHeight + toScroll );
+
+				scrollPage();
+
+				// Restores visibility of the new page: added together with $to.css( "z-index", -10 );
+				$to.css( "z-index", "" );
+
+				if ( !none ) {
+					$to.animationComplete( doneIn );
+				}
+
+				$to
+					.removeClass( toPreClass )
+					.addClass( name + " in" + reverseClass );
+
+				if ( none ) {
+					setTimeout( doneIn, 0 );
+				}
+
+			},
+
+			doneIn = function() {
+
+				if ( !sequential ) {
+
+					if ( $from ) {
+						cleanFrom();
+					}
+				}
+
+				$to
+					.removeClass( "out in reverse " + name )
+					.height( "" );
+
+				toggleViewportClass();
+
+				// In some browsers (iOS5), 3D transitions block the ability to scroll to the desired location during transition
+				// This ensures we jump to that spot after the fact, if we aren't there already.
+				if ( $.mobile.$window.scrollTop() !== toScroll ) {
+					scrollPage();
+				}
+
+				deferred.resolve( name, reverse, $to, $from, true );
+			};
+
+		toggleViewportClass();
+
+		if ( $from && !none ) {
+			startOut();
+		}
+		else {
+			doneOut();
+		}
+
+		return deferred.promise();
+	};
+};
+
+// generate the handlers from the above
+var sequentialHandler = createHandler(),
+	simultaneousHandler = createHandler( false ),
+	defaultGetMaxScrollForTransition = function() {
+		return $.mobile.getScreenHeight() * 3;
+	};
+
+// Make our transition handler the public default.
+$.mobile.defaultTransitionHandler = sequentialHandler;
+
+//transition handler dictionary for 3rd party transitions
+$.mobile.transitionHandlers = {
+	"default": $.mobile.defaultTransitionHandler,
+	"sequential": sequentialHandler,
+	"simultaneous": simultaneousHandler
+};
+
+$.mobile.transitionFallbacks = {};
+
+// If transition is defined, check if css 3D transforms are supported, and if not, if a fallback is specified
+$.mobile._maybeDegradeTransition = function( transition ) {
+		if ( transition && !$.support.cssTransform3d && $.mobile.transitionFallbacks[ transition ] ) {
+			transition = $.mobile.transitionFallbacks[ transition ];
+		}
+
+		return transition;
+};
+
+// Set the getMaxScrollForTransition to default if no implementation was set by user
+$.mobile.getMaxScrollForTransition = $.mobile.getMaxScrollForTransition || defaultGetMaxScrollForTransition;
+})( jQuery, this );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.transitions.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.transitions.js
new file mode 100644
index 0000000..453a8b9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.transitions.js
@@ -0,0 +1,19 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: All the stock transitions
+//>>label: All Transitions
+//>>group: Transitions
+
+define( [
+	"./transitions/flip",
+	"./transitions/flow",
+	"./transitions/pop",
+	"./transitions/slide",
+	"./transitions/slidedown",
+	"./transitions/slidefade",
+	"./transitions/slideup",
+	"./transitions/turn"
+], function( $ ) {
+//>>excludeEnd("jqmBuildExclude");
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.vmouse.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.vmouse.js
new file mode 100644
index 0000000..5bdec86
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.vmouse.js
@@ -0,0 +1,517 @@
+
+// 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"
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Normalizes touch/mouse events.
+//>>label: Virtual Mouse (vmouse) Bindings
+//>>group: Core
+
+define( [ "jquery" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(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( " " ),
+	mouseHookProps = $.event.mouseHooks ? $.event.mouseHooks.props : [],
+	mouseEventProps = $.event.props.concat( mouseHookProps ),
+	activeDocHandlers = {},
+	resetTimerID = 0,
+	startX = 0,
+	startY = 0,
+	didScroll = false,
+	clickBlockList = [],
+	blockMouseTriggers = false,
+	blockTouchTriggers = false,
+	eventCaptureSupported = "addEventListener" in document,
+	$document = $.mobile.$document,
+	nextTouchID = 1,
+	lastTouchID = 0, threshold;
+
+$.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, len;
+
+	event = $.Event( event );
+	event.type = eventType;
+
+	oe = event.originalEvent;
+	props = $.event.props;
+
+	// addresses separation of $.event.props in to $.event.mouseHook.props and Issue 3280
+	// https://github.com/jquery/jquery-mobile/issues/3280
+	if ( t.search( /^(mouse|click)/ ) > -1 ) {
+		props = mouseEventProps;
+	}
+
+	// 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 ( ( $.support.touch === true ) && ( touchID === undefined ) ) {
+		return;
+	}
+
+	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,
+		flags = getVirtualBindingFlags( event.target );
+
+		didScroll = didScroll ||
+			( Math.abs( t.pageX - startX ) > moveThreshold ||
+				Math.abs( t.pageY - startY ) > moveThreshold );
+
+
+	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,
+				target: event.target,
+				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 && target === o.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 );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.widget.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.widget.js
new file mode 100644
index 0000000..adba034
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.widget.js
@@ -0,0 +1,75 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Widget factory extentions for mobile.
+//>>label: Widget Factory 
+//>>group: Core
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [ "jquery", "./jquery.ui.widget" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(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, useKeepNative ) {
+		this.enhance( $( this.options.initSelector, $( target )), useKeepNative );
+	},
+
+	enhance: function( targets, useKeepNative ) {
+		var page, keepNative, $widgetElements = $( targets ), self = this;
+
+		// if ignoreContentEnabled is set to true the framework should
+		// only enhance the selected elements when they do NOT have a
+		// parent with the data-namespace-ignore attribute
+		$widgetElements = $.mobile.enhanceable( $widgetElements );
+
+		if ( useKeepNative && $widgetElements.length ) {
+			// 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
+			page = $.mobile.closestPageData( $widgetElements );
+			keepNative = ( page && page.keepNativeSelector()) || "";
+
+			$widgetElements = $widgetElements.not( keepNative );
+		}
+
+		$widgetElements[ this.widgetName ]();
+	},
+
+	raise: function( msg ) {
+		throw "Widget [" + this.widgetName + "]: " + msg;
+	}
+});
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.zoom.iosorientationfix.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.zoom.iosorientationfix.js
new file mode 100644
index 0000000..eb9fc7a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.zoom.iosorientationfix.js
@@ -0,0 +1,43 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Fixes the orientation change bug in iOS when switching between landspace and portrait
+//>>label: iOS Orientation Change Fix
+//>>group: Utilities
+
+define( [ "jquery", "./jquery.mobile.core", "./jquery.mobile.zoom" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, window ) {
+
+	// This fix addresses an iOS bug, so return early if the UA claims it's something else.
+	if ( !(/iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( "AppleWebKit" ) > -1 ) ) {
+		return;
+	}
+
+  var zoom = $.mobile.zoom,
+		evt, x, y, z, aig;
+
+  function checkTilt( e ) {
+		evt = e.originalEvent;
+		aig = evt.accelerationIncludingGravity;
+
+		x = Math.abs( aig.x );
+		y = Math.abs( aig.y );
+		z = Math.abs( aig.z );
+
+		// If portrait orientation and in one of the danger zones
+    if ( !window.orientation && ( x > 7 || ( ( z > 6 && y < 8 || z < 8 && y > 6 ) && x > 5 ) ) ) {
+			if ( zoom.enabled ) {
+				zoom.disable();
+			}
+    }	else if ( !zoom.enabled ) {
+			zoom.enable();
+    }
+  }
+
+  $.mobile.$window
+		.bind( "orientationchange.iosorientationfix", zoom.enable )
+		.bind( "devicemotion.iosorientationfix", checkTilt );
+
+}( jQuery, this ));
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.zoom.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.zoom.js
new file mode 100644
index 0000000..56906b8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.mobile.zoom.js
@@ -0,0 +1,43 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Utility methods for enabling and disabling user scaling (pinch zoom)
+//>>label: Zoom Handling
+//>>group: Utilities
+
+define( [ "jquery", "./jquery.mobile.core" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $ ) {
+	var	meta = $( "meta[name=viewport]" ),
+		initialContent = meta.attr( "content" ),
+		disabledZoom = initialContent + ",maximum-scale=1, user-scalable=no",
+		enabledZoom = initialContent + ",maximum-scale=10, user-scalable=yes",
+		disabledInitially = /(user-scalable[\s]*=[\s]*no)|(maximum-scale[\s]*=[\s]*1)[$,\s]/.test( initialContent );
+
+	$.mobile.zoom = $.extend( {}, {
+		enabled: !disabledInitially,
+		locked: false,
+		disable: function( lock ) {
+			if ( !disabledInitially && !$.mobile.zoom.locked ) {
+				meta.attr( "content", disabledZoom );
+				$.mobile.zoom.enabled = false;
+				$.mobile.zoom.locked = lock || false;
+			}
+		},
+		enable: function( unlock ) {
+			if ( !disabledInitially && ( !$.mobile.zoom.locked || unlock === true ) ) {
+				meta.attr( "content", enabledZoom );
+				$.mobile.zoom.enabled = true;
+				$.mobile.zoom.locked = false;
+			}
+		},
+		restore: function() {
+			if ( !disabledInitially ) {
+				meta.attr( "content", initialContent );
+				$.mobile.zoom.enabled = true;
+			}
+		}
+	});
+
+}( jQuery ));
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.tag.inserter.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.tag.inserter.js
new file mode 100644
index 0000000..9251675
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.tag.inserter.js
@@ -0,0 +1,26 @@
+(function() {
+	// Insert a script tag pointing at the desired version of jQuery
+
+	// Get the version from the url
+	var jqueryRE = /[\\?&]jquery=([^&#]*)/,
+		results = jqueryRE.exec( location.search ),
+		version = "",
+		myScriptTag = document.getElementsByTagName( "script" )[document.getElementsByTagName( "script" ).length - 1],
+		baseUrl = myScriptTag.src.replace( /(.*)\/.*$/, "$1/" ),
+		url = baseUrl + "jquery.js";
+
+	if ( results ) {
+		version = decodeURIComponent(results[results.length - 1].replace(/\+/g, " "));
+		url = "http://code.jquery.com/jquery-"+version+".js";
+	}
+
+	document.write( "<script src='" + url + "'></script>" );
+
+	document.write(
+		'<script>' +
+			'if ( parseInt( jQuery.fn.jquery.replace( /\\./g, "" ), 10 ) < 170 && window.define && window.define.amd ) {' +
+			    'define( "jquery", [], function () { return jQuery; } );'+
+			'}'+
+		'</script>'
+	);
+}());
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.ui.widget.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.ui.widget.js
new file mode 100644
index 0000000..db26a02
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/jquery.ui.widget.js
@@ -0,0 +1,516 @@
+/*!
+ * jQuery UI Widget v1.9.0-beta.1
+ *
+ * Copyright 2012, https://github.com/jquery/jquery-ui/blob/1.9.0-beta.1/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
+ */
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: jQuery UI Widget
+//>>label: jQuery UI Widget
+//>>group: Core
+
+define( [ 
+	"jquery"
+	], function( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+(function( $, undefined ) {
+
+var uuid = 0,
+	slice = Array.prototype.slice,
+	_cleanData = $.cleanData;
+$.cleanData = function( elems ) {
+	for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+		try {
+			$( elem ).triggerHandler( "remove" );
+		// http://bugs.jquery.com/ticket/8235
+		} catch( e ) {}
+	}
+	_cleanData( elems );
+};
+
+$.widget = function( name, base, prototype ) {
+	var fullName, existingConstructor, constructor, basePrototype,
+		namespace = name.split( "." )[ 0 ];
+
+	name = name.split( "." )[ 1 ];
+	fullName = namespace + "-" + name;
+
+	if ( !prototype ) {
+		prototype = base;
+		base = $.Widget;
+	}
+
+	// create selector for plugin
+	$.expr[ ":" ][ fullName ] = function( elem ) {
+		return !!$.data( elem, fullName );
+	};
+
+	$[ namespace ] = $[ namespace ] || {};
+	existingConstructor = $[ namespace ][ name ];
+	constructor = $[ namespace ][ name ] = function( options, element ) {
+		// allow instantiation without "new" keyword
+		if ( !this._createWidget ) {
+			return new constructor( options, element );
+		}
+
+		// allow instantiation without initializing for simple inheritance
+		// must use "new" keyword (the code above always passes args)
+		if ( arguments.length ) {
+			this._createWidget( options, element );
+		}
+	};
+	// extend with the existing constructor to carry over any static properties
+	$.extend( constructor, existingConstructor, {
+		version: prototype.version,
+		// copy the object used to create the prototype in case we need to
+		// redefine the widget later
+		_proto: $.extend( {}, prototype ),
+		// track widgets that inherit from this widget in case this widget is
+		// redefined after a widget inherits from it
+		_childConstructors: []
+	});
+
+	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
+	basePrototype.options = $.widget.extend( {}, basePrototype.options );
+	$.each( prototype, function( prop, value ) {
+		if ( $.isFunction( value ) ) {
+			prototype[ prop ] = (function() {
+				var _super = function() {
+						return base.prototype[ prop ].apply( this, arguments );
+					},
+					_superApply = function( args ) {
+						return base.prototype[ prop ].apply( this, args );
+					};
+				return function() {
+					var __super = this._super,
+						__superApply = this._superApply,
+						returnValue;
+
+					this._super = _super;
+					this._superApply = _superApply;
+
+					returnValue = value.apply( this, arguments );
+
+					this._super = __super;
+					this._superApply = __superApply;
+
+					return returnValue;
+				};
+			})();
+		}
+	});
+	constructor.prototype = $.widget.extend( basePrototype, {
+		// TODO: remove support for widgetEventPrefix
+		// always use the name + a colon as the prefix, e.g., draggable:start
+		// don't prefix for widgets that aren't DOM-based
+		widgetEventPrefix: name
+	}, prototype, {
+		constructor: constructor,
+		namespace: namespace,
+		widgetName: name,
+		// TODO remove widgetBaseClass, see #8155
+		widgetBaseClass: fullName,
+		widgetFullName: fullName
+	});
+
+	// If this widget is being redefined then we need to find all widgets that
+	// are inheriting from it and redefine all of them so that they inherit from
+	// the new version of this widget. We're essentially trying to replace one
+	// level in the prototype chain.
+	if ( existingConstructor ) {
+		$.each( existingConstructor._childConstructors, function( i, child ) {
+			var childPrototype = child.prototype;
+
+			// redefine the child widget using the same prototype that was
+			// originally used, but inherit from the new version of the base
+			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
+		});
+		// remove the list of existing child constructors from the old constructor
+		// so the old child constructors can be garbage collected
+		delete existingConstructor._childConstructors;
+	} else {
+		base._childConstructors.push( constructor );
+	}
+
+	$.widget.bridge( name, constructor );
+};
+
+$.widget.extend = function( target ) {
+	var input = slice.call( arguments, 1 ),
+		inputIndex = 0,
+		inputLength = input.length,
+		key,
+		value;
+	for ( ; inputIndex < inputLength; inputIndex++ ) {
+		for ( key in input[ inputIndex ] ) {
+			value = input[ inputIndex ][ key ];
+			if (input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
+				target[ key ] = $.isPlainObject( value ) ? $.widget.extend( {}, target[ key ], value ) : value;
+			}
+		}
+	}
+	return target;
+};
+
+$.widget.bridge = function( name, object ) {
+	var fullName = object.prototype.widgetFullName;
+	$.fn[ name ] = function( options ) {
+		var isMethodCall = typeof options === "string",
+			args = slice.call( arguments, 1 ),
+			returnValue = this;
+
+		// allow multiple hashes to be passed on init
+		options = !isMethodCall && args.length ?
+			$.widget.extend.apply( null, [ options ].concat(args) ) :
+			options;
+
+		if ( isMethodCall ) {
+			this.each(function() {
+				var methodValue,
+					instance = $.data( this, fullName );
+				if ( !instance ) {
+					return $.error( "cannot call methods on " + name + " prior to initialization; " +
+						"attempted to call method '" + options + "'" );
+				}
+				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
+					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
+				}
+				methodValue = instance[ options ].apply( instance, args );
+				if ( methodValue !== instance && methodValue !== undefined ) {
+					returnValue = methodValue && methodValue.jquery ?
+						returnValue.pushStack( methodValue.get() ) :
+						methodValue;
+					return false;
+				}
+			});
+		} else {
+			this.each(function() {
+				var instance = $.data( this, fullName );
+				if ( instance ) {
+					instance.option( options || {} )._init();
+				} else {
+					new object( options, this );
+				}
+			});
+		}
+
+		return returnValue;
+	};
+};
+
+$.Widget = function( options, element ) {};
+$.Widget._childConstructors = [];
+
+$.Widget.prototype = {
+	widgetName: "widget",
+	widgetEventPrefix: "",
+	defaultElement: "<div>",
+	options: {
+		disabled: false,
+
+		// callbacks
+		create: null
+	},
+	_createWidget: function( options, element ) {
+		element = $( element || this.defaultElement || this )[ 0 ];
+		this.element = $( element );
+		this.uuid = uuid++;
+		this.eventNamespace = "." + this.widgetName + this.uuid;
+		this.options = $.widget.extend( {},
+			this.options,
+			this._getCreateOptions(),
+			options );
+
+		this.bindings = $();
+		this.hoverable = $();
+		this.focusable = $();
+
+		if ( element !== this ) {
+			// 1.9 BC for #7810
+			// TODO remove dual storage
+			$.data( element, this.widgetName, this );
+			$.data( element, this.widgetFullName, this );
+			this._on({ remove: "destroy" });
+			this.document = $( element.style ?
+				// element within the document
+				element.ownerDocument :
+				// element is window or document
+				element.document || element );
+			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
+		}
+
+		this._create();
+		this._trigger( "create", null, this._getCreateEventData() );
+		this._init();
+	},
+	_getCreateOptions: $.noop,
+	_getCreateEventData: $.noop,
+	_create: $.noop,
+	_init: $.noop,
+
+	destroy: function() {
+		this._destroy();
+		// we can probably remove the unbind calls in 2.0
+		// all event bindings should go through this._on()
+		this.element
+			.unbind( this.eventNamespace )
+			// 1.9 BC for #7810
+			// TODO remove dual storage
+			.removeData( this.widgetName )
+			.removeData( this.widgetFullName )
+			// support: jquery <1.6.3
+			// http://bugs.jquery.com/ticket/9413
+			.removeData( $.camelCase( this.widgetFullName ) );
+		this.widget()
+			.unbind( this.eventNamespace )
+			.removeAttr( "aria-disabled" )
+			.removeClass(
+				this.widgetFullName + "-disabled " +
+				"ui-state-disabled" );
+
+		// clean up events and states
+		this.bindings.unbind( this.eventNamespace );
+		this.hoverable.removeClass( "ui-state-hover" );
+		this.focusable.removeClass( "ui-state-focus" );
+	},
+	_destroy: $.noop,
+
+	widget: function() {
+		return this.element;
+	},
+
+	option: function( key, value ) {
+		var options = key,
+			parts,
+			curOption,
+			i;
+
+		if ( arguments.length === 0 ) {
+			// don't return a reference to the internal hash
+			return $.widget.extend( {}, this.options );
+		}
+
+		if ( typeof key === "string" ) {
+			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
+			options = {};
+			parts = key.split( "." );
+			key = parts.shift();
+			if ( parts.length ) {
+				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
+				for ( i = 0; i < parts.length - 1; i++ ) {
+					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
+					curOption = curOption[ parts[ i ] ];
+				}
+				key = parts.pop();
+				if ( value === undefined ) {
+					return curOption[ key ] === undefined ? null : curOption[ key ];
+				}
+				curOption[ key ] = value;
+			} else {
+				if ( value === undefined ) {
+					return this.options[ key ] === undefined ? null : this.options[ key ];
+				}
+				options[ key ] = value;
+			}
+		}
+
+		this._setOptions( options );
+
+		return this;
+	},
+	_setOptions: function( options ) {
+		var key;
+
+		for ( key in options ) {
+			this._setOption( key, options[ key ] );
+		}
+
+		return this;
+	},
+	_setOption: function( key, value ) {
+		this.options[ key ] = value;
+
+		if ( key === "disabled" ) {
+			this.widget()
+				.toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
+				.attr( "aria-disabled", value );
+			this.hoverable.removeClass( "ui-state-hover" );
+			this.focusable.removeClass( "ui-state-focus" );
+		}
+
+		return this;
+	},
+
+	enable: function() {
+		return this._setOption( "disabled", false );
+	},
+	disable: function() {
+		return this._setOption( "disabled", true );
+	},
+
+	_on: function( element, handlers ) {
+		// no element argument, shuffle and use this.element
+		if ( !handlers ) {
+			handlers = element;
+			element = this.element;
+		} else {
+			// accept selectors, DOM elements
+			element = $( element );
+			this.bindings = this.bindings.add( element );
+		}
+
+		var instance = this;
+		$.each( handlers, function( event, handler ) {
+			function handlerProxy() {
+				// allow widgets to customize the disabled handling
+				// - disabled as an array instead of boolean
+				// - disabled class as method for disabling individual parts
+				if ( instance.options.disabled === true ||
+						$( this ).hasClass( "ui-state-disabled" ) ) {
+					return;
+				}
+				return ( typeof handler === "string" ? instance[ handler ] : handler )
+					.apply( instance, arguments );
+			}
+
+			// copy the guid so direct unbinding works
+			if ( typeof handler !== "string" ) {
+				handlerProxy.guid = handler.guid =
+					handler.guid || handlerProxy.guid || $.guid++;
+			}
+
+			var match = event.match( /^(\w+)\s*(.*)$/ ),
+				eventName = match[1] + instance.eventNamespace,
+				selector = match[2];
+			if ( selector ) {
+				instance.widget().delegate( selector, eventName, handlerProxy );
+			} else {
+				element.bind( eventName, handlerProxy );
+			}
+		});
+	},
+
+	_off: function( element, eventName ) {
+		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
+		element.unbind( eventName ).undelegate( eventName );
+	},
+
+	_delay: function( handler, delay ) {
+		function handlerProxy() {
+			return ( typeof handler === "string" ? instance[ handler ] : handler )
+				.apply( instance, arguments );
+		}
+		var instance = this;
+		return setTimeout( handlerProxy, delay || 0 );
+	},
+
+	_hoverable: function( element ) {
+		this.hoverable = this.hoverable.add( element );
+		this._on( element, {
+			mouseenter: function( event ) {
+				$( event.currentTarget ).addClass( "ui-state-hover" );
+			},
+			mouseleave: function( event ) {
+				$( event.currentTarget ).removeClass( "ui-state-hover" );
+			}
+		});
+	},
+
+	_focusable: function( element ) {
+		this.focusable = this.focusable.add( element );
+		this._on( element, {
+			focusin: function( event ) {
+				$( event.currentTarget ).addClass( "ui-state-focus" );
+			},
+			focusout: function( event ) {
+				$( event.currentTarget ).removeClass( "ui-state-focus" );
+			}
+		});
+	},
+
+	_trigger: function( type, event, data ) {
+		var prop, orig,
+			callback = this.options[ type ];
+
+		data = data || {};
+		event = $.Event( event );
+		event.type = ( type === this.widgetEventPrefix ?
+			type :
+			this.widgetEventPrefix + type ).toLowerCase();
+		// the original event may come from any element
+		// so we need to reset the target on the new event
+		event.target = this.element[ 0 ];
+
+		// copy original event properties over to the new event
+		orig = event.originalEvent;
+		if ( orig ) {
+			for ( prop in orig ) {
+				if ( !( prop in event ) ) {
+					event[ prop ] = orig[ prop ];
+				}
+			}
+		}
+
+		this.element.trigger( event, data );
+		return !( $.isFunction( callback ) &&
+			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
+			event.isDefaultPrevented() );
+	}
+};
+
+$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
+	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
+		if ( typeof options === "string" ) {
+			options = { effect: options };
+		}
+		var hasOptions,
+			effectName = !options ?
+				method :
+				options === true || typeof options === "number" ?
+					defaultEffect :
+					options.effect || defaultEffect;
+		options = options || {};
+		if ( typeof options === "number" ) {
+			options = { duration: options };
+		}
+		hasOptions = !$.isEmptyObject( options );
+		options.complete = callback;
+		if ( options.delay ) {
+			element.delay( options.delay );
+		}
+		if ( hasOptions && $.effects && ( $.effects.effect[ effectName ] || $.uiBackCompat !== false && $.effects[ effectName ] ) ) {
+			element[ method ]( options );
+		} else if ( effectName !== method && element[ effectName ] ) {
+			element[ effectName ]( options.duration, options.easing, callback );
+		} else {
+			element.queue(function( next ) {
+				$( this )[ method ]();
+				if ( callback ) {
+					callback.call( element[ 0 ] );
+				}
+				next();
+			});
+		}
+	};
+});
+
+// DEPRECATED
+if ( $.uiBackCompat !== false ) {
+	$.Widget.prototype._getCreateOptions = function() {
+		return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
+	};
+}
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/text.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/text.js
new file mode 100644
index 0000000..6ef7422
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/text.js
@@ -0,0 +1,283 @@
+/**
+ * @license RequireJS text 1.0.2 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/jrburke/requirejs for details
+ */
+/*jslint regexp: false, nomen: false, plusplus: false, strict: false */
+/*global require: false, XMLHttpRequest: false, ActiveXObject: false,
+  define: false, window: false, process: false, Packages: false,
+  java: false, location: false */
+
+(function () {
+    var progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'],
+        xmlRegExp = /^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,
+        bodyRegExp = /<body[^>]*>\s*([\s\S]+)\s*<\/body>/im,
+        hasLocation = typeof location !== 'undefined' && location.href,
+        defaultProtocol = hasLocation && location.protocol && location.protocol.replace(/\:/, ''),
+        defaultHostName = hasLocation && location.hostname,
+        defaultPort = hasLocation && (location.port || undefined),
+        buildMap = [];
+
+    define(function () {
+        var text, get, fs;
+
+        if (typeof window !== "undefined" && window.navigator && window.document) {
+            get = function (url, callback) {
+                var xhr = text.createXhr();
+                xhr.open('GET', url, true);
+                xhr.onreadystatechange = function (evt) {
+                    //Do not explicitly handle errors, those should be
+                    //visible via console output in the browser.
+                    if (xhr.readyState === 4) {
+                        callback(xhr.responseText);
+                    }
+                };
+                xhr.send(null);
+            };
+        } else if (typeof process !== "undefined" &&
+                 process.versions &&
+                 !!process.versions.node) {
+            //Using special require.nodeRequire, something added by r.js.
+            fs = require.nodeRequire('fs');
+
+            get = function (url, callback) {
+                callback(fs.readFileSync(url, 'utf8'));
+            };
+        } else if (typeof Packages !== 'undefined') {
+            //Why Java, why is this so awkward?
+            get = function (url, callback) {
+                var encoding = "utf-8",
+                    file = new java.io.File(url),
+                    lineSeparator = java.lang.System.getProperty("line.separator"),
+                    input = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(file), encoding)),
+                    stringBuffer, line,
+                    content = '';
+                try {
+                    stringBuffer = new java.lang.StringBuffer();
+                    line = input.readLine();
+
+                    // Byte Order Mark (BOM) - The Unicode Standard, version 3.0, page 324
+                    // http://www.unicode.org/faq/utf_bom.html
+
+                    // Note that when we use utf-8, the BOM should appear as "EF BB BF", but it doesn't due to this bug in the JDK:
+                    // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058
+                    if (line && line.length() && line.charAt(0) === 0xfeff) {
+                        // Eat the BOM, since we've already found the encoding on this file,
+                        // and we plan to concatenating this buffer with others; the BOM should
+                        // only appear at the top of a file.
+                        line = line.substring(1);
+                    }
+
+                    stringBuffer.append(line);
+
+                    while ((line = input.readLine()) !== null) {
+                        stringBuffer.append(lineSeparator);
+                        stringBuffer.append(line);
+                    }
+                    //Make sure we return a JavaScript string and not a Java string.
+                    content = String(stringBuffer.toString()); //String
+                } finally {
+                    input.close();
+                }
+                callback(content);
+            };
+        }
+
+        text = {
+            version: '1.0.2',
+
+            strip: function (content) {
+                //Strips <?xml ...?> declarations so that external SVG and XML
+                //documents can be added to a document without worry. Also, if the string
+                //is an HTML document, only the part inside the body tag is returned.
+                if (content) {
+                    content = content.replace(xmlRegExp, "");
+                    var matches = content.match(bodyRegExp);
+                    if (matches) {
+                        content = matches[1];
+                    }
+                } else {
+                    content = "";
+                }
+                return content;
+            },
+
+            jsEscape: function (content) {
+                return content.replace(/(['\\])/g, '\\$1')
+                    .replace(/[\f]/g, "\\f")
+                    .replace(/[\b]/g, "\\b")
+                    .replace(/[\n]/g, "\\n")
+                    .replace(/[\t]/g, "\\t")
+                    .replace(/[\r]/g, "\\r");
+            },
+
+            createXhr: function () {
+                //Would love to dump the ActiveX crap in here. Need IE 6 to die first.
+                var xhr, i, progId;
+                if (typeof XMLHttpRequest !== "undefined") {
+                    return new XMLHttpRequest();
+                } else {
+                    for (i = 0; i < 3; i++) {
+                        progId = progIds[i];
+                        try {
+                            xhr = new ActiveXObject(progId);
+                        } catch (e) {}
+
+                        if (xhr) {
+                            progIds = [progId];  // so faster next time
+                            break;
+                        }
+                    }
+                }
+
+                if (!xhr) {
+                    throw new Error("createXhr(): XMLHttpRequest not available");
+                }
+
+                return xhr;
+            },
+
+            get: get,
+
+            /**
+             * Parses a resource name into its component parts. Resource names
+             * look like: module/name.ext!strip, where the !strip part is
+             * optional.
+             * @param {String} name the resource name
+             * @returns {Object} with properties "moduleName", "ext" and "strip"
+             * where strip is a boolean.
+             */
+            parseName: function (name) {
+                var strip = false, index = name.indexOf("."),
+                    modName = name.substring(0, index),
+                    ext = name.substring(index + 1, name.length);
+
+                index = ext.indexOf("!");
+                if (index !== -1) {
+                    //Pull off the strip arg.
+                    strip = ext.substring(index + 1, ext.length);
+                    strip = strip === "strip";
+                    ext = ext.substring(0, index);
+                }
+
+                return {
+                    moduleName: modName,
+                    ext: ext,
+                    strip: strip
+                };
+            },
+
+            xdRegExp: /^((\w+)\:)?\/\/([^\/\\]+)/,
+
+            /**
+             * Is an URL on another domain. Only works for browser use, returns
+             * false in non-browser environments. Only used to know if an
+             * optimized .js version of a text resource should be loaded
+             * instead.
+             * @param {String} url
+             * @returns Boolean
+             */
+            useXhr: function (url, protocol, hostname, port) {
+                var match = text.xdRegExp.exec(url),
+                    uProtocol, uHostName, uPort;
+                if (!match) {
+                    return true;
+                }
+                uProtocol = match[2];
+                uHostName = match[3];
+
+                uHostName = uHostName.split(':');
+                uPort = uHostName[1];
+                uHostName = uHostName[0];
+
+                return (!uProtocol || uProtocol === protocol) &&
+                       (!uHostName || uHostName === hostname) &&
+                       ((!uPort && !uHostName) || uPort === port);
+            },
+
+            finishLoad: function (name, strip, content, onLoad, config) {
+                content = strip ? text.strip(content) : content;
+                if (config.isBuild) {
+                    buildMap[name] = content;
+                }
+                onLoad(content);
+            },
+
+            load: function (name, req, onLoad, config) {
+                //Name has format: some.module.filext!strip
+                //The strip part is optional.
+                //if strip is present, then that means only get the string contents
+                //inside a body tag in an HTML string. For XML/SVG content it means
+                //removing the <?xml ...?> declarations so the content can be inserted
+                //into the current doc without problems.
+
+                // Do not bother with the work if a build and text will
+                // not be inlined.
+                if (config.isBuild && !config.inlineText) {
+                    onLoad();
+                    return;
+                }
+
+                var parsed = text.parseName(name),
+                    nonStripName = parsed.moduleName + '.' + parsed.ext,
+                    url = req.toUrl(nonStripName),
+                    useXhr = (config && config.text && config.text.useXhr) ||
+                             text.useXhr;
+
+                //Load the text. Use XHR if possible and in a browser.
+                if (!hasLocation || useXhr(url, defaultProtocol, defaultHostName, defaultPort)) {
+                    text.get(url, function (content) {
+                        text.finishLoad(name, parsed.strip, content, onLoad, config);
+                    });
+                } else {
+                    //Need to fetch the resource across domains. Assume
+                    //the resource has been optimized into a JS module. Fetch
+                    //by the module name + extension, but do not include the
+                    //!strip part to avoid file system issues.
+                    req([nonStripName], function (content) {
+                        text.finishLoad(parsed.moduleName + '.' + parsed.ext,
+                                        parsed.strip, content, onLoad, config);
+                    });
+                }
+            },
+
+            write: function (pluginName, moduleName, write, config) {
+                if (moduleName in buildMap) {
+                    var content = text.jsEscape(buildMap[moduleName]);
+                    write.asModule(pluginName + "!" + moduleName,
+                                   "define(function () { return '" +
+                                       content +
+                                   "';});\n");
+                }
+            },
+
+            writeFile: function (pluginName, moduleName, req, write, config) {
+                var parsed = text.parseName(moduleName),
+                    nonStripName = parsed.moduleName + '.' + parsed.ext,
+                    //Use a '.js' file name so that it indicates it is a
+                    //script that can be loaded across domains.
+                    fileName = req.toUrl(parsed.moduleName + '.' +
+                                         parsed.ext) + '.js';
+
+                //Leverage own load() method to load plugin value, but only
+                //write out values that do not have the strip argument,
+                //to avoid any potential issues with ! in file names.
+                text.load(nonStripName, req, function (value) {
+                    //Use own write() method to construct full module value.
+                    //But need to create shell that translates writeFile's
+                    //write() to the right interface.
+                    var textWrite = function (contents) {
+                        return write(fileName, contents);
+                    };
+                    textWrite.asModule = function (moduleName, contents) {
+                        return write.asModule(moduleName, fileName, contents);
+                    };
+
+                    text.write(pluginName, nonStripName, textWrite, config);
+                }, config);
+            }
+        };
+
+        return text;
+    });
+}());
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/flip.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/flip.js
new file mode 100644
index 0000000..eb26131
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/flip.js
@@ -0,0 +1,20 @@
+/*
+* fallback transition for flip in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Animation styles and fallback transitions definition for non-3D supporting browsers
+//>>label: Flip Transition
+//>>group: Transitions
+//>>css.structure: ../css/structure/jquery.mobile.transition.flip.css
+
+define( [ "jquery", "../jquery.mobile.transition" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.flip = "fade";
+
+})( jQuery, this );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/flow.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/flow.js
new file mode 100644
index 0000000..30f1bb9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/flow.js
@@ -0,0 +1,20 @@
+/*
+* fallback transition for flow in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Animation styles and fallback transitions definition for non-3D supporting browsers
+//>>label: Flow Transition
+//>>group: Transitions
+//>>css.structure: ../css/structure/jquery.mobile.transition.flow.css
+
+define( [ "jquery", "../jquery.mobile.transition" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.flow = "fade";
+
+})( jQuery, this );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/pop.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/pop.js
new file mode 100644
index 0000000..7be8729
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/pop.js
@@ -0,0 +1,20 @@
+/*
+* fallback transition for pop in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Animation styles and fallback transitions definition for non-3D supporting browsers
+//>>label: Pop Transition
+//>>group: Transitions
+//>>css.structure: ../css/structure/jquery.mobile.transition.pop.css
+
+define( [ "jquery", "../jquery.mobile.transition" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.pop = "fade";
+
+})( jQuery, this );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/slide.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/slide.js
new file mode 100644
index 0000000..733ea6d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/slide.js
@@ -0,0 +1,24 @@
+/*
+* fallback transition for slide in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Animation styles and fallback transitions definition for non-3D supporting browsers
+//>>label: Slide Transition
+//>>group: Transitions
+//>>css.structure: ../css/structure/jquery.mobile.transition.slide.css
+
+define( [ "jquery", "../jquery.mobile.transition" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, window, undefined ) {
+
+// Use the simultaneous transitions handler for slide transitions
+$.mobile.transitionHandlers.slide = $.mobile.transitionHandlers.simultaneous;
+
+// Set the slide transitions's fallback to "fade"
+$.mobile.transitionFallbacks.slide = "fade";
+
+})( jQuery, this );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/slidedown.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/slidedown.js
new file mode 100644
index 0000000..efde6f2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/slidedown.js
@@ -0,0 +1,20 @@
+/*
+* fallback transition for slidedown in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Animation styles and fallback transitions definition for non-3D supporting browsers
+//>>label: Slidedown Transition
+//>>group: Transitions
+//>>css.structure: ../css/structure/jquery.mobile.transition.slidedown.css
+
+define( [ "jquery", "../jquery.mobile.transition" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.slidedown = "fade";
+
+})( jQuery, this );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/slidefade.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/slidefade.js
new file mode 100644
index 0000000..1dfda31
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/slidefade.js
@@ -0,0 +1,21 @@
+/*
+* fallback transition for slidefade in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Animation styles and fallback transitions definition for non-3D supporting browsers
+//>>label: Slidefade Transition
+//>>group: Transitions
+//>>css.structure: ../css/structure/jquery.mobile.transition.slidefade.css
+
+define( [ "jquery", "../jquery.mobile.transition" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, window, undefined ) {
+
+// Set the slide transitions's fallback to "fade"
+$.mobile.transitionFallbacks.slidefade = "fade";
+
+})( jQuery, this );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/slideup.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/slideup.js
new file mode 100644
index 0000000..b0b579f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/slideup.js
@@ -0,0 +1,20 @@
+/*
+* fallback transition for slideup in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Animation styles and fallback transitions definition for non-3D supporting browsers
+//>>label: Slideup Transition
+//>>group: Transitions
+//>>css.structure: ../css/structure/jquery.mobile.transition.slideup.css
+
+define( [ "jquery", "../jquery.mobile.transition" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.slideup = "fade";
+
+})( jQuery, this );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/turn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/turn.js
new file mode 100644
index 0000000..359fd87
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/transitions/turn.js
@@ -0,0 +1,20 @@
+/*
+* fallback transition for turn in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Animation styles and fallback transitions definition for non-3D supporting browsers
+//>>label: Turn Transition
+//>>group: Transitions
+//>>css.structure: ../css/structure/jquery.mobile.transition.turn.css
+
+define( [ "jquery", "../jquery.mobile.transition" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.turn = "fade";
+
+})( jQuery, this );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/collapsible.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/collapsible.js
new file mode 100644
index 0000000..5637883
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/collapsible.js
@@ -0,0 +1,180 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Creates collapsible content blocks.
+//>>label: Collapsible
+//>>group: Widgets
+//>>css.structure: ../css/structure/jquery.mobile.collapsible.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [ "jquery", "../jquery.mobile.widget", "../jquery.mobile.buttonMarkup" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+$.widget( "mobile.collapsible", $.mobile.widget, {
+	options: {
+		expandCueText: " Expandable list, tap to open list",
+		collapseCueText: " Expandable list, tap to close list",
+		collapsed: true,
+		heading: "h1,h2,h3,h4,h5,h6,legend",
+		theme: null,
+		contentTheme: null,
+		inset: true,
+		mini: false,
+		initSelector: ":jqmData(role='collapsible')"
+	},
+	_create: function() {
+
+		var $el = this.element,
+			o = this.options,
+			collapsible = $el.addClass( "ui-collapsible" ),
+			collapsibleHeading = $el.children( o.heading ).first(),
+			collapsedIcon = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "collapsed-icon" ) || o.collapsedIcon,
+			expandedIcon = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "expanded-icon" ) || o.expandedIcon,
+			collapsibleContent = collapsible.wrapInner( "<div class='ui-collapsible-content'></div>" ).children( ".ui-collapsible-content" ),
+			collapsibleSet = $el.closest( ":jqmData(role='collapsible-set')" ).addClass( "ui-collapsible-set" );
+
+		// 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 = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "theme" ) || $.mobile.getInheritedTheme( collapsibleSet, "c" );
+			}
+			// Inherit the content-theme from collapsible-set
+			if ( !o.contentTheme ) {
+				o.contentTheme = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "content-theme" );
+			}
+
+			// Get the preference for collapsed icon in the set
+			if ( !o.collapsedIcon ) {
+				o.collapsedIcon = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "collapsed-icon" );
+			}
+			// Get the preference for expanded icon in the set
+			if ( !o.expandedIcon ) {
+				o.expandedIcon = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "expanded-icon" );
+			}
+			// Gets the preference icon position in the set
+			if ( !o.iconPos ) {
+				o.iconPos = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "iconpos" );
+			}
+			// Inherit the preference for inset from collapsible-set or set the default value to ensure equalty within a set
+			if ( $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "inset" ) !== undefined ) {
+				o.inset = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "inset" );
+			} else {
+				o.inset = true;
+			}
+			// Gets the preference for mini in the set
+			if ( !o.mini ) {
+				o.mini = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "mini" );
+			}
+		} else {
+			// get inherited theme if not a set and no theme has been set
+			if ( !o.theme ) {
+				o.theme = $.mobile.getInheritedTheme( $el, "c" );
+			}
+		}
+		
+		if ( !!o.inset ) {
+			collapsible.addClass( "ui-collapsible-inset" );
+		}
+		
+		collapsibleContent.addClass( ( o.contentTheme ) ? ( "ui-body-" + o.contentTheme ) : "");
+
+		collapsedIcon = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "collapsed-icon" ) || o.collapsedIcon || "plus";
+		expandedIcon = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "expanded-icon" ) || o.expandedIcon || "minus";
+
+		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: $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "iconpos" ) || o.iconPos || "left",
+					icon: collapsedIcon,
+					mini: o.mini,
+					theme: o.theme
+				})
+				.attr( "role", "");
+
+		if ( !!o.inset ) {				
+			collapsibleHeading
+				.find( "a" ).first().add( ".ui-btn-inner", $el )
+					.addClass( "ui-corner-top ui-corner-bottom" );
+		}
+
+		//events
+		collapsible
+			.bind( "expand collapse", function( event ) {
+				if ( !event.isDefaultPrevented() ) {
+					var $this = $( this ),
+						isCollapse = ( event.type === "collapse" ),
+						contentTheme = o.contentTheme;
+
+					event.preventDefault();
+
+					// Custom event callback
+					if ( o.customEventHandler ) { o.customEventHandler.call( this, isCollapse ) };
+
+					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-" + expandedIcon, !isCollapse )
+							// logic or cause same icon for expanded/collapsed state would remove the ui-icon-class
+							.toggleClass( "ui-icon-" + collapsedIcon, ( isCollapse || expandedIcon === collapsedIcon ) )
+						.end()
+						.find( "a" ).first().removeClass( $.mobile.activeBtnClass );
+
+					$this.toggleClass( "ui-collapsible-collapsed", isCollapse );
+					collapsibleContent.toggleClass( "ui-collapsible-content-collapsed", isCollapse ).attr( "aria-hidden", isCollapse );
+					collapsibleContent.children( "li" ).not( "ui-collapsible-content" ).attr( "tabindex", isCollapse ? "" : "0" );
+
+					if ( contentTheme && !!o.inset && ( !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( "tap", function() {
+				collapsibleHeading.find( "a" ).first().addClass( $.mobile.activeBtnClass );
+			})
+			.bind( "vmousecancel", function() {
+				collapsibleHeading.find( "a" ).first().removeClass( $.mobile.activeBtnClass );
+			})
+			.bind( "click", function( event ) {
+
+				var type = collapsibleHeading.is( ".ui-collapsible-heading-collapsed" ) ? "expand" : "collapse";
+
+				collapsible.trigger( type );
+
+				event.preventDefault();
+				event.stopPropagation();
+			});
+	}
+});
+
+//delegate auto self-init widgets
+$.delegateSelfInitWithSingleSelector( $.mobile.collapsible );
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/collapsibleSet.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/collapsibleSet.js
new file mode 100644
index 0000000..687df67
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/collapsibleSet.js
@@ -0,0 +1,116 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: For creating grouped collapsible content areas.
+//>>label: Collapsible Sets (Accordions)
+//>>group: Widgets
+//>>css.structure: ../css/structure/jquery.mobile.collapsible.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [ "jquery", "../jquery.mobile.widget", "./collapsible" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+$.widget( "mobile.collapsibleset", $.mobile.widget, {
+	options: {
+		initSelector: ":jqmData(role='collapsible-set')"
+	},
+	_create: function() {
+		var $el = this.element.addClass( "ui-collapsible-set" ),
+			o = this.options;
+
+		// Inherit the theme from collapsible-set
+		if ( !o.theme ) {
+			o.theme = $.mobile.getInheritedTheme( $el, "c" );
+		}
+		// Inherit the content-theme from collapsible-set
+		if ( !o.contentTheme ) {
+			o.contentTheme = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "content-theme" );
+		}
+
+		if ( $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "inset" ) !== undefined ) {
+			o.inset = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "inset" );
+		}
+		o.inset = o.inset !== undefined ? o.inset : true;
+
+		// Initialize the collapsible set if it's not already initialized
+		if ( !$el.jqmData( "collapsiblebound" ) ) {
+			$el
+				.jqmData( "collapsiblebound", true )
+				.bind( "expand collapse", function( event ) {
+					var isCollapse = ( event.type === "collapse" ),
+						collapsible = $( event.target ).closest( ".ui-collapsible" ),
+						widget = collapsible.data( "collapsible" );
+					if ( collapsible.jqmData( "collapsible-last" ) && !!o.inset ) {
+						collapsible.find( ".ui-collapsible-heading" ).first()
+							.find( "a" ).first()
+							.toggleClass( "ui-corner-bottom", isCollapse )
+							.find( ".ui-btn-inner" )
+							.toggleClass( "ui-corner-bottom", isCollapse );
+						collapsible.find( ".ui-collapsible-content" ).toggleClass( "ui-corner-bottom", !isCollapse );
+					}
+				})
+				.bind( "expand", function( event ) {
+					var closestCollapsible = $( event.target )
+						.closest( ".ui-collapsible" );
+					if ( closestCollapsible.parent().is( ":jqmData(role='collapsible-set')" ) ) {
+						closestCollapsible
+							.siblings( ".ui-collapsible" )
+							.trigger( "collapse" );
+					}
+				});
+		}
+	},
+
+	_init: function() {
+		var $el = this.element,
+			collapsiblesInSet = $el.children( ":jqmData(role='collapsible')" ),
+			expanded = collapsiblesInSet.filter( ":jqmData(collapsed='false')" );
+		this.refresh();
+
+		// Because the corners are handled by the collapsible itself and the default state is collapsed
+		// That was causing https://github.com/jquery/jquery-mobile/issues/4116
+		expanded.trigger( "expand" );
+	},
+
+	refresh: function() {
+		var $el = this.element,
+			o = this.options,
+			collapsiblesInSet = $el.children( ":jqmData(role='collapsible')" );
+
+		$.mobile.collapsible.prototype.enhance( collapsiblesInSet.not( ".ui-collapsible" ) );
+
+		// clean up borders
+		if ( !!o.inset ) {
+			collapsiblesInSet.each(function() {
+				$( this ).jqmRemoveData( "collapsible-last" )
+					.find( ".ui-collapsible-heading" )
+					.find( "a" ).first()
+					.removeClass( "ui-corner-top ui-corner-bottom" )
+					.find( ".ui-btn-inner" )
+					.removeClass( "ui-corner-top ui-corner-bottom" );
+			});
+
+			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" );
+		}
+	}
+});
+
+//delegate auto self-init widgets
+$.delegateSelfInitWithSingleSelector( $.mobile.collapsibleset );
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/dialog.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/dialog.js
new file mode 100644
index 0000000..adcbaf7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/dialog.js
@@ -0,0 +1,112 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Displays a page as a modal dialog with inset appearance and overlay background
+//>>label: Dialogs
+//>>group: Widgets
+//>>css.structure: ../css/structure/jquery.mobile.dialog.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [ "jquery", "../jquery.mobile.widget" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(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>" ),
+			dialogWrap = $( "<div/>", {
+					"role" : "dialog",
+					"class" : "ui-dialog-contain ui-corner-all ui-overlay-shadow"
+				});
+
+		$el.addClass( "ui-dialog ui-overlay-" + this.options.overlayTheme );
+
+		// Class the markup for dialog styling
+		// Set aria role
+		$el
+			.wrapInner( dialogWrap )
+			.children()
+				.find( ":jqmData(role='header')" )
+					.prepend( headerCloseButton )
+				.end()
+				.children( ':first-child')
+					.addClass( "ui-corner-top" )
+				.end()
+				.children( ":last-child" )
+					.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
+		//
+		// Use click rather than vclick in order to prevent the possibility of unintentionally
+		// reopening the dialog if the dialog opening item was directly under the close button.
+		headerCloseButton.bind( "click", 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 && !$.mobile.getAttrFixed( $target[0], "data-" + $.mobile.ns + "transition" ) ) {
+
+				active = $.mobile.urlHistory.getActive() || {};
+
+				$target.attr( "data-" + $.mobile.ns + "transition", ( active.transition || $.mobile.defaultDialogTransition ) )
+					.attr( "data-" + $.mobile.ns + "direction", "reverse" );
+			}
+		})
+		.bind( "pagehide", function( e, ui ) {
+			$( this ).find( "." + $.mobile.activeBtnClass ).not( ".ui-slider-bg" ).removeClass( $.mobile.activeBtnClass );
+		})
+		// Override the theme set by the page plugin on pageshow
+		.bind( "pagebeforeshow", function() {
+			self._isCloseable = true;
+			if ( self.options.overlayTheme ) {
+				self.element
+					.page( "removeContainerBackground" )
+					.page( "setContainerBackground", self.options.overlayTheme );
+			}
+		});
+	},
+
+	// Close method goes back in history
+	close: function() {
+		var dst;
+
+		if ( this._isCloseable ) {
+			this._isCloseable = false;
+			if ( $.mobile.hashListeningEnabled ) {
+				$.mobile.back();
+			} else {
+				dst = $.mobile.urlHistory.getPrev().url;
+				if ( !$.mobile.path.isPath( dst ) ) {
+					dst = $.mobile.path.makeUrlAbsolute( "#" + dst );
+				}
+
+				$.mobile.changePage( dst, { changeHash: false, fromHashChange: true } );
+			}
+		}
+	}
+});
+
+//auto self-init widgets
+$.mobile.$document.delegate( $.mobile.dialog.prototype.options.initSelector, "pagecreate", function() {
+	$.mobile.dialog.prototype.enhance( this );
+});
+
+})( jQuery, this );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/fixedToolbar.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/fixedToolbar.js
new file mode 100644
index 0000000..880d451
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/fixedToolbar.js
@@ -0,0 +1,280 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Behavior for "fixed" headers and footers
+//>>label: Toolbars: Fixed
+//>>group: Widgets
+//>>css.structure: ../css/structure/jquery.mobile.fixedToolbar.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [ "jquery", "../jquery.mobile.widget", "../jquery.mobile.core", "../jquery.mobile.navigation", "./page", "./page.sections", "../jquery.mobile.zoom" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+
+	$.widget( "mobile.fixedtoolbar", $.mobile.widget, {
+		options: {
+			visibleOnPageShow: true,
+			disablePageZoom: true,
+			transition: "slide", //can be none, fade, slide (slide maps to slideup or slidedown)
+			fullscreen: false,
+			tapToggle: true,
+			tapToggleBlacklist: "a, button, input, select, textarea, .ui-header-fixed, .ui-footer-fixed, .ui-popup",
+			hideDuringFocus: "input, textarea, select",
+			updatePagePadding: true,
+			trackPersistentToolbars: true,
+
+			// Browser detection! Weeee, here we go...
+			// Unfortunately, position:fixed is costly, not to mention probably impossible, to feature-detect accurately.
+			// Some tests exist, but they currently return false results in critical devices and browsers, which could lead to a broken experience.
+			// Testing fixed positioning is also pretty obtrusive to page load, requiring injected elements and scrolling the window
+			// The following function serves to rule out some popular browsers with known fixed-positioning issues
+			// This is a plugin option like any other, so feel free to improve or overwrite it
+			supportBlacklist: function() {
+				var w = window,
+					ua = navigator.userAgent,
+					platform = navigator.platform,
+					// Rendering engine is Webkit, and capture major version
+					wkmatch = ua.match( /AppleWebKit\/([0-9]+)/ ),
+					wkversion = !!wkmatch && wkmatch[ 1 ],
+					ffmatch = ua.match( /Fennec\/([0-9]+)/ ),
+					ffversion = !!ffmatch && ffmatch[ 1 ],
+					operammobilematch = ua.match( /Opera Mobi\/([0-9]+)/ ),
+					omversion = !!operammobilematch && operammobilematch[ 1 ];
+
+				if(
+					// iOS 4.3 and older : Platform is iPhone/Pad/Touch and Webkit version is less than 534 (ios5)
+					( ( platform.indexOf( "iPhone" ) > -1 || platform.indexOf( "iPad" ) > -1  || platform.indexOf( "iPod" ) > -1 ) && wkversion && wkversion < 534 ) ||
+					// Opera Mini
+					( w.operamini && ({}).toString.call( w.operamini ) === "[object OperaMini]" ) ||
+					( operammobilematch && omversion < 7458 )	||
+					//Android lte 2.1: Platform is Android and Webkit version is less than 533 (Android 2.2)
+					( ua.indexOf( "Android" ) > -1 && wkversion && wkversion < 533 ) ||
+					// Firefox Mobile before 6.0 -
+					( ffversion && ffversion < 6 ) ||
+					// WebOS less than 3
+					( "palmGetResource" in window && wkversion && wkversion < 534 )	||
+					// MeeGo
+					( ua.indexOf( "MeeGo" ) > -1 && ua.indexOf( "NokiaBrowser/8.5.0" ) > -1 ) ) {
+					return true;
+				}
+
+				return false;
+			},
+			initSelector: ":jqmData(position='dummy')"
+		},
+
+		_create: function() {
+
+			var self = this,
+				o = self.options,
+				$el = self.element,
+				tbtype = $el.is( ":jqmData(role='header')" ) ? "header" : "footer",
+				$page = $el.closest( ".ui-page" );
+
+			// Feature detecting support for
+			if ( o.supportBlacklist() ) {
+				self.destroy();
+				return;
+			}
+
+			$el.addClass( "ui-"+ tbtype +"-fixed" );
+
+			// "fullscreen" overlay positioning
+			if ( o.fullscreen ) {
+				$el.addClass( "ui-"+ tbtype +"-fullscreen" );
+				$page.addClass( "ui-page-" + tbtype + "-fullscreen" );
+			}
+			// If not fullscreen, add class to page to set top or bottom padding
+			else{
+				$page.addClass( "ui-page-" + tbtype + "-fixed" );
+			}
+
+			self._addTransitionClass();
+			self._bindPageEvents();
+			self._bindToggleHandlers();
+		},
+
+		_addTransitionClass: function() {
+			var tclass = this.options.transition;
+
+			if ( tclass && tclass !== "none" ) {
+				// use appropriate slide for header or footer
+				if ( tclass === "slide" ) {
+					tclass = this.element.is( ".ui-header" ) ? "slidedown" : "slideup";
+				}
+
+				this.element.addClass( tclass );
+			}
+		},
+
+		_bindPageEvents: function() {
+			var self = this,
+				o = self.options,
+				$el = self.element;
+
+			//page event bindings
+			// Fixed toolbars require page zoom to be disabled, otherwise usability issues crop up
+			// This method is meant to disable zoom while a fixed-positioned toolbar page is visible
+			$el.closest( ".ui-page" )
+				.bind( "pagebeforeshow", function() {
+					if ( o.disablePageZoom ) {
+						$.mobile.zoom.disable( true );
+					}
+					if ( !o.visibleOnPageShow ) {
+						self.hide( true );
+					}
+				} )
+				.bind( "webkitAnimationStart animationstart updatelayout", function() {
+					var thisPage = this;
+					if ( o.updatePagePadding ) {
+						self.updatePagePadding( thisPage );
+					}
+				})
+				.bind( "pageshow", function() {
+					var thisPage = this;
+					self.updatePagePadding( thisPage );
+					if ( o.updatePagePadding ) {
+						$.mobile.$window.bind( "throttledresize." + self.widgetName, function() {
+							self.updatePagePadding( thisPage );
+						});
+					}
+				})
+				.bind( "pagebeforehide", function( e, ui ) {
+					if ( o.disablePageZoom ) {
+						$.mobile.zoom.enable( true );
+					}
+					if ( o.updatePagePadding ) {
+						$.mobile.$window.unbind( "throttledresize." + self.widgetName );
+					}
+
+					if ( o.trackPersistentToolbars ) {
+						var thisFooter = $( ".ui-footer-fixed:jqmData(id)", this ),
+							thisHeader = $( ".ui-header-fixed:jqmData(id)", this ),
+							nextFooter = thisFooter.length && ui.nextPage && $( ".ui-footer-fixed:jqmData(id='" + thisFooter.jqmData( "id" ) + "')", ui.nextPage ) || $(),
+							nextHeader = thisHeader.length && ui.nextPage && $( ".ui-header-fixed:jqmData(id='" + thisHeader.jqmData( "id" ) + "')", ui.nextPage ) || $();
+
+							if ( nextFooter.length || nextHeader.length ) {
+
+								nextFooter.add( nextHeader ).appendTo( $.mobile.pageContainer );
+
+								ui.nextPage.one( "pageshow", function() {
+									nextFooter.add( nextHeader ).appendTo( this );
+								});
+							}
+					}
+				});
+		},
+
+		_visible: true,
+
+		// This will set the content element's top or bottom padding equal to the toolbar's height
+		updatePagePadding: function( tbPage ) {
+			var $el = this.element,
+				header = $el.is( ".ui-header" );
+
+			// This behavior only applies to "fixed", not "fullscreen"
+			if ( this.options.fullscreen ) { return; }
+
+			tbPage = tbPage || $el.closest( ".ui-page" );
+			$( tbPage ).css( "padding-" + ( header ? "top" : "bottom" ), $el.outerHeight() );
+		},
+
+		_useTransition: function( notransition ) {
+			var $win = $.mobile.$window,
+				$el = this.element,
+				scroll = $win.scrollTop(),
+				elHeight = $el.height(),
+				pHeight = $el.closest( ".ui-page" ).height(),
+				viewportHeight = $.mobile.getScreenHeight(),
+				tbtype = $el.is( ":jqmData(role='header')" ) ? "header" : "footer";
+
+			return !notransition &&
+				( this.options.transition && this.options.transition !== "none" &&
+				(
+					( tbtype === "header" && !this.options.fullscreen && scroll > elHeight ) ||
+					( tbtype === "footer" && !this.options.fullscreen && scroll + viewportHeight < pHeight - elHeight )
+				) || this.options.fullscreen
+				);
+		},
+
+		show: function( notransition ) {
+			var hideClass = "ui-fixed-hidden",
+				$el = this.element;
+
+			if ( this._useTransition( notransition ) ) {
+				$el
+					.removeClass( "out " + hideClass )
+					.addClass( "in" );
+			}
+			else {
+				$el.removeClass( hideClass );
+			}
+			this._visible = true;
+		},
+
+		hide: function( notransition ) {
+			var hideClass = "ui-fixed-hidden",
+				$el = this.element,
+				// if it's a slide transition, our new transitions need the reverse class as well to slide outward
+				outclass = "out" + ( this.options.transition === "slide" ? " reverse" : "" );
+
+			if( this._useTransition( notransition ) ) {
+				$el
+					.addClass( outclass )
+					.removeClass( "in" )
+					.animationComplete(function() {
+						$el.addClass( hideClass ).removeClass( outclass );
+					});
+			}
+			else {
+				$el.addClass( hideClass ).removeClass( outclass );
+			}
+			this._visible = false;
+		},
+
+		toggle: function() {
+			this[ this._visible ? "hide" : "show" ]();
+		},
+
+		_bindToggleHandlers: function() {
+			var self = this,
+				o = self.options,
+				$el = self.element;
+
+			// tap toggle
+			$el.closest( ".ui-page" )
+				.bind( "vclick", function( e ) {
+					if ( o.tapToggle && !$( e.target ).closest( o.tapToggleBlacklist ).length ) {
+						self.toggle();
+					}
+				})
+				.bind( "focusin focusout", function( e ) {
+					if ( screen.width < 500 && $( e.target ).is( o.hideDuringFocus ) && !$( e.target ).closest( ".ui-header-fixed, .ui-footer-fixed" ).length ) {
+						self[ ( e.type === "focusin" && self._visible ) ? "hide" : "show" ]();
+					}
+				});
+		},
+
+		destroy: function() {
+			this.element.removeClass( "ui-header-fixed ui-footer-fixed ui-header-fullscreen ui-footer-fullscreen in out fade slidedown slideup ui-fixed-hidden" );
+			this.element.closest( ".ui-page" ).removeClass( "ui-page-header-fixed ui-page-footer-fixed ui-page-header-fullscreen ui-page-footer-fullscreen" );
+		}
+
+	});
+
+	//auto self-init widgets
+	$.mobile.$document
+		.bind( "pagecreate create", function( e ) {
+
+			// DEPRECATED in 1.1: support for data-fullscreen=true|false on the page element.
+			// This line ensures it still works, but we recommend moving the attribute to the toolbars themselves.
+			if ( $( e.target ).jqmData( "fullscreen" ) ) {
+				$( $.mobile.fixedtoolbar.prototype.options.initSelector, e.target ).not( ":jqmData(fullscreen)" ).jqmData( "fullscreen", true );
+			}
+
+			$.mobile.fixedtoolbar.prototype.enhanceWithin( e.target );
+		});
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/button.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/button.js
new file mode 100644
index 0000000..d390071
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/button.js
@@ -0,0 +1,156 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Custom-styled native input/buttons
+//>>label: Buttons: Input or button-based
+//>>group: Forms
+//>>css.structure: ../css/structure/jquery.mobile.button.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [ "jquery", "../../jquery.mobile.widget", "../../jquery.mobile.buttonMarkup"  ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+$.widget( "mobile.button", $.mobile.widget, {
+	options: {
+		theme: null,
+		icon: null,
+		iconpos: null,
+		corners: true,
+		shadow: true,
+		iconshadow: true,
+		initSelector: "button, [type='button'], [type='submit'], [type='reset']"
+	},
+	_create: function() {
+		var $el = this.element,
+			$button,
+			o = this.options,
+			type,
+			name,
+			inline = o.inline ||  $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "inline" ),
+			mini = o.mini || $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "mini" ),
+			classes = "",
+			$buttonPlaceholder;
+
+		// if this is a link, check if it's been enhanced and, if not, use the right function
+		if ( $el[ 0 ].tagName === "A" ) {
+			if ( !$el.hasClass( "ui-btn" ) ) {
+				$el.buttonMarkup();
+			}
+
+			return;
+		}
+
+		// get the inherited theme
+		// TODO centralize for all widgets
+		if ( !this.options.theme ) {
+			this.options.theme = $.mobile.getInheritedTheme( this.element, "c" );
+		}
+
+		// TODO: Post 1.1--once we have time to test thoroughly--any classes manually applied to the original element should be carried over to the enhanced element, with an `-enhanced` suffix. See https://github.com/jquery/jquery-mobile/issues/3577
+		/* if ( $el[0].className.length ) {
+			classes = $el[0].className;
+		} */
+		if ( !!~$el[0].className.indexOf( "ui-btn-left" ) ) {
+			classes = "ui-btn-left";
+		}
+
+		if (  !!~$el[0].className.indexOf( "ui-btn-right" ) ) {
+			classes = "ui-btn-right";
+		}
+
+		if (  $el.attr( "type" ) === "submit" || $el.attr( "type" ) === "reset" ) {
+			classes ? classes += " ui-submit" :  classes = "ui-submit";
+		}
+		$( "label[for='" + $el.attr( "id" ) + "']" ).addClass( "ui-submit" );
+
+		// Add ARIA role
+		this.button = $( "<div></div>" )
+			[ $el.html() ? "html" : "text" ]( $el.html() || $el.val() )
+			.insertBefore( $el )
+			.buttonMarkup({
+				theme: o.theme,
+				icon: o.icon,
+				iconpos: o.iconpos,
+				inline: inline,
+				corners: o.corners,
+				shadow: o.shadow,
+				iconshadow: o.iconshadow,
+				mini: mini
+			})
+			.addClass( classes )
+			.append( $el.addClass( "ui-btn-hidden" ) );
+
+        $button = this.button;
+		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
+						$.mobile.$document.one( "submit", function() {
+							$buttonPlaceholder.remove();
+
+							// reset the local var so that the hidden input
+							// will be re-added on subsequent clicks
+							$buttonPlaceholder = undefined;
+						});
+					}
+				});
+		}
+
+		$el.bind({
+			focus: function() {
+				$button.addClass( $.mobile.focusClass );
+			},
+
+			blur: function() {
+				$button.removeClass( $.mobile.focusClass );
+			}
+		});
+
+		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();
+		}
+
+		// Grab the button's text element from its implementation-independent data item
+		$( this.button.data( 'buttonElements' ).text )[ $el.html() ? "html" : "text" ]( $el.html() || $el.val() );
+	}
+});
+
+//auto self-init widgets
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$.mobile.button.prototype.enhanceWithin( e.target, true );
+});
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/checkboxradio.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/checkboxradio.js
new file mode 100644
index 0000000..a8f0082
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/checkboxradio.js
@@ -0,0 +1,229 @@
+/*
+* "checkboxradio" plugin
+*/
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Consistent styling for checkboxes/radio buttons.
+//>>label: Checkboxes & Radio Buttons
+//>>group: Forms
+//>>css.structure: ../css/structure/jquery.mobile.forms.checkboxradio.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [ "jquery", "../../jquery.mobile.core", "../../jquery.mobile.widget", "../../jquery.mobile.buttonMarkup" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(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,
+			inheritAttr = function( input, dataAttr ) {
+				return input.jqmData( dataAttr ) || input.closest( "form, fieldset" ).jqmData( dataAttr );
+			},
+			// NOTE: Windows Phone could not find the label through a selector
+			// filter works though.
+			parentLabel = $( input ).closest( "label" ),
+			label = parentLabel.length ? parentLabel : ( input[0].id ? $( input ).closest( "form, fieldset, :jqmData(role='page'), :jqmData(role='dialog')" ).find( "label" ).filter( "[for='" + input[0].id + "']" ) : [ ] ),
+			inputtype = input[0].type,
+			mini = inheritAttr( input, "mini" ),
+			checkedState = inputtype + "-on",
+			uncheckedState = inputtype + "-off",
+			icon = input.parents( ":jqmData(type='horizontal')" ).length ? undefined : uncheckedState,
+			iconpos = inheritAttr( input, "iconpos" ),
+			activeBtn = icon ? "" : " " + $.mobile.activeBtnClass,
+			checkedClass = "ui-" + checkedState + activeBtn,
+			uncheckedClass = "ui-" + uncheckedState,
+			checkedicon = "ui-icon-" + checkedState,
+			uncheckedicon = "ui-icon-" + uncheckedState,
+			ariaCheckedAttr = "";
+
+		if ( inputtype !== "checkbox" && inputtype !== "radio" ) {
+			return;
+		}
+
+		ariaCheckedAttr = ( inputtype === "checkbox" ) ? "aria-checked" : "aria-selected";
+
+		// Support fake label
+		if ( label.length == 0 ) {
+			label = $( "<label for='" + input[ 0 ].id  +
+				"'></label>" );
+		}
+
+		// Expose for other methods
+		$.extend( this, {
+			label: label,
+			inputtype: inputtype,
+			checkedClass: checkedClass,
+			uncheckedClass: uncheckedClass,
+			checkedicon: checkedicon,
+			uncheckedicon: uncheckedicon,
+			ariaCheckedAttr : ariaCheckedAttr
+		});
+
+		// If there's no selected theme check the data attr
+		if ( !this.options.theme ) {
+			this.options.theme = $.mobile.getInheritedTheme( this.element, "c" );
+		}
+
+		label.buttonMarkup({
+			theme: this.options.theme,
+			icon: icon,
+			shadow: false,
+			mini: mini,
+			iconpos: iconpos
+		});
+
+		// Wrap the input + label in a div
+		var wrapper = document.createElement('div');
+		wrapper.className = 'ui-' + inputtype;
+		wrapper.setAttribute( "role", inputtype );
+
+		if ( input.hasClass( "favorite" ) ) {
+			wrapper.className += ' favorite';
+		}
+
+		input.add( label ).wrapAll( wrapper );
+
+		label.bind({
+			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( $.mobile.focusClass );
+				},
+
+				blur: function() {
+					label.removeClass( $.mobile.focusClass );
+				}
+			});
+
+		this.refresh();
+	},
+
+	_cacheVals: function() {
+		this._getInputSet().each(function() {
+			$( this ).jqmData( "cacheVal", this.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'), :jqmData(role='dialog')" )
+			.find( "input[name='" + this.element[0].name + "'][type='" + this.inputtype + "']" );
+	},
+
+	_updateAll: function() {
+		var self = this;
+
+		this._getInputSet().each(function() {
+			var $this = $( this );
+
+			if ( this.checked || self.inputtype === "checkbox" ) {
+				$this.trigger( "change" );
+			}
+			$this.focus();
+		})
+		.checkboxradio( "refresh" );
+	},
+
+	refresh: function() {
+		var input = this.element[0],
+			label = this.label,
+			wrapper = input.parentNode,
+			icon = label.find( ".ui-icon" );
+
+		if ( input.checked ) {
+			label.addClass( this.checkedClass ).removeClass( this.uncheckedClass );
+			icon.addClass( this.checkedicon ).removeClass( this.uncheckedicon );
+			wrapper.setAttribute( this.ariaCheckedAttr, true );
+		} else {
+			label.removeClass( this.checkedClass ).addClass( this.uncheckedClass );
+			icon.removeClass( this.checkedicon ).addClass( this.uncheckedicon );
+			wrapper.setAttribute( this.ariaCheckedAttr, false );
+		}
+
+		if ( input.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
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$.mobile.checkboxradio.prototype.enhanceWithin( e.target, true );
+});
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/select.custom.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/select.custom.js
new file mode 100644
index 0000000..02ae263
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/select.custom.js
@@ -0,0 +1,524 @@
+/*
+* custom "selectmenu" plugin
+*/
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Extension to select menus to support menu styling, placeholder options, and multi-select features.
+//>>label: Selects: Custom menus
+//>>group: Forms
+//>>css.structure: ../css/structure/jquery.mobile.forms.select.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [
+	"jquery",
+	"../../jquery.mobile.buttonMarkup",
+	"../../jquery.mobile.core",
+	"../dialog",
+	"./select",
+	"../listview",
+	"../page",
+	"../popup",
+	// NOTE expects ui content in the defined page, see selector for menuPageContent definition
+	"../page.sections" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+	var extendSelect = function( widget ) {
+
+		var select = widget.select,
+			selectID  = widget.selectID,
+			label = widget.label,
+			thisPage = widget.select.closest( ".ui-page" ),
+			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>" ),
+
+			listbox =  $( "<div>", { "class": "ui-selectmenu" } ).insertAfter( widget.select ).popup( { theme: "a" } ),
+
+			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 ),
+
+			menuPageContent,
+			menuPageClose,
+			headerClose;
+
+		if ( widget.isMultiple ) {
+			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();
+		}
+
+		$.extend( widget, {
+			select: widget.select,
+			selectID: selectID,
+			buttonId: buttonId,
+			menuId: menuId,
+			thisPage: thisPage,
+			menuPage: menuPage,
+			label: label,
+			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" )
+					.bind( "focusin", function( e ) {
+						$( e.target )
+							.attr( "tabindex", "0" )
+							.trigger( "vmouseover" );
+
+					})
+					.bind( "focusout", function( e ) {
+						$( e.target )
+							.attr( "tabindex", "-1" )
+							.trigger( "vmouseout" );
+					})
+					.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 - otherwise focus clicked item
+						// We need to grab the clicked item the hard way, because the list may have been rebuilt
+						if ( self.isMultiple ) {
+							self.list.find( "li:not(.ui-li-divider)" ).eq( newIndex )
+								.addClass( "ui-btn-down-" + widget.options.theme ).find( "a" ).first().focus();
+						}
+						else {
+							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().not( ".ui-selectmenu-placeholder" );
+
+							if ( prev.is( ".ui-li-divider" ) ) {
+								prev = prev.prev();
+							}
+
+							// if there's a previous option, focus it
+							if ( prev.length ) {
+								target
+									.blur()
+									.attr( "tabindex", "-1" );
+
+								prev.addClass( "ui-btn-down-" + widget.options.theme ).find( "a" ).first().focus();
+							}
+
+							return false;
+							// down or right arrow keys
+						case 40:
+							next = li.next();
+
+							if ( next.is( ".ui-li-divider" ) ) {
+								next = next.next();
+							}
+
+							// if there's a next option, focus it
+							if ( next.length ) {
+								target
+									.blur()
+									.attr( "tabindex", "-1" );
+
+								next.addClass( "ui-btn-down-" + widget.options.theme ).find( "a" ).first().focus();
+							}
+
+							return false;
+							// If enter or space is pressed, trigger click
+						case 13:
+						case 32:
+							target.trigger( "click" );
+
+							return false;
+						}
+					});
+
+				// 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 the popup
+				self.listbox.bind( "popupafterclose", function( event ) {
+					self.close();
+				});
+
+				// Close button on small overlays
+				if ( self.isMultiple ) {
+					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();
+			},
+
+			selected: function() {
+				return this._selectOptions().filter( ":selected:not( :jqmData(placeholder='true') )" );
+			},
+
+			refresh: function( forceRebuild , foo ) {
+				var self = this,
+				select = this.element,
+				isMultiple = this.isMultiple,
+				indicies;
+
+				if (  forceRebuild || this._isRebuildRequired() ) {
+					self._buildList();
+				}
+
+				indicies = this.selectedIndices();
+
+				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 {
+								if ( item.is( ".ui-selectmenu-placeholder" ) ) {
+									item.next().addClass( $.mobile.activeBtnClass );
+								} 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
+					$.mobile.back();
+				} else {
+					self.listbox.popup( "close" );
+					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,
+					$window = $.mobile.$window,
+					selfListParent = self.list.parent(),
+					menuHeight = selfListParent.outerHeight(),
+					menuWidth = selfListParent.outerWidth(),
+					activePage = $( "." + $.mobile.activePageClass ),
+					scrollTop = $window.scrollTop(),
+					btnOffset = self.button.offset().top,
+					screenHeight = $window.height(),
+					screenWidth = $window.width();
+
+				//add active class to button
+				self.button.addClass( $.mobile.activeBtnClass );
+
+				//remove after delay
+				setTimeout( function() {
+					self.button.removeClass( $.mobile.activeBtnClass );
+				}, 300);
+
+				function focusMenuItem() {
+					var selector = self.list.find( "." + $.mobile.activeBtnClass + " a" );
+					if ( selector.length === 0 ) {
+						selector = self.list.find( "li.ui-btn:not( :jqmData(placeholder='true') ) a" );
+					}
+					selector.first().focus().closest( "li" ).addClass( "ui-btn-down-" + widget.options.theme );
+				}
+
+				if ( menuHeight > screenHeight - 80 || !$.support.scrollTop ) {
+
+					self.menuPage.appendTo( $.mobile.pageContainer ).page();
+					self.menuPageContent = menuPage.find( ".ui-content" );
+					self.menuPageClose = menuPage.find( ".ui-header a" );
+
+					// 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() {
+						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.listbox
+						.one( "popupafteropen", focusMenuItem )
+						.popup( "open", {
+							x: self.button.offset().left + self.button.outerWidth() / 2,
+							y: self.button.offset().top + self.button.outerHeight() / 2
+						});
+
+					// 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,
+					needPlaceholder = true,
+					optgroups = [],
+					lis = [],
+					dataIcon = self.isMultiple ? "checkbox-off" : "false";
+
+				self.list.empty().filter( ".ui-listview" ).listview( "destroy" );
+
+				var $options = self.select.find( "option" ),
+					numOptions = $options.length,
+					select = this.select[ 0 ],
+					dataPrefix = 'data-' + $.mobile.ns,
+					dataIndexAttr = dataPrefix + 'option-index',
+					dataIconAttr = dataPrefix + 'icon',
+					dataRoleAttr = dataPrefix + 'role',
+					dataPlaceholderAttr = dataPrefix + 'placeholder',
+					fragment = document.createDocumentFragment(),
+					isPlaceholderItem = false,
+					optGroup;
+
+				for (var i = 0; i < numOptions;i++, isPlaceholderItem = false) {
+					var option = $options[i],
+						$option = $( option ),
+						parent = option.parentNode,
+						text = $option.text(),
+						anchor  = document.createElement( 'a' ),
+						classes = [];
+
+					anchor.setAttribute( 'href', '#' );
+					anchor.appendChild( document.createTextNode( text ) );
+
+					// Are we inside an optgroup?
+					if ( parent !== select && parent.nodeName.toLowerCase() === "optgroup" ) {
+						var optLabel = parent.getAttribute( 'label' );
+						if ( optLabel !== optGroup ) {
+							var divider = document.createElement( 'li' );
+							divider.setAttribute( dataRoleAttr, 'list-divider' );
+							divider.setAttribute( 'role', 'option' );
+							divider.setAttribute( 'tabindex', '-1' );
+							divider.appendChild( document.createTextNode( optLabel ) );
+							fragment.appendChild( divider );
+							optGroup = optLabel;
+						}
+					}
+
+					if ( needPlaceholder && ( !option.getAttribute( "value" ) || text.length === 0 || $option.jqmData( "placeholder" ) ) ) {
+						needPlaceholder = false;
+						isPlaceholderItem = true;
+
+						// If we have identified a placeholder, mark it retroactively in the select as well
+						option.setAttribute( dataPlaceholderAttr, true );
+						if ( o.hidePlaceholderMenuItems ) {
+							classes.push( "ui-selectmenu-placeholder" );
+						}
+						if (!placeholder) {
+							placeholder = self.placeholder = text;
+						}
+					}
+
+					var item = document.createElement('li');
+					if ( option.disabled ) {
+						classes.push( "ui-disabled" );
+						item.setAttribute('aria-disabled',true);
+					}
+					item.setAttribute( dataIndexAttr,i );
+					item.setAttribute( dataIconAttr, dataIcon );
+					if ( isPlaceholderItem ) {
+						item.setAttribute( dataPlaceholderAttr, true );
+					}
+					item.className = classes.join( " " );
+					item.setAttribute( 'role', 'option' );
+					anchor.setAttribute( 'tabindex', '-1' );
+					item.appendChild( anchor );
+					fragment.appendChild( item );
+				}
+
+				self.list[0].appendChild( fragment );
+
+				// 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
+				});
+			}
+		});
+	};
+
+	// issue #3894 - core doesn't trigger events on disabled delegates
+	$.mobile.$document.bind( "selectmenubeforecreate", function( event ) {
+		var selectmenuWidget = $( event.target ).data( "selectmenu" );
+
+		if ( !selectmenuWidget.options.nativeMenu &&
+				selectmenuWidget.element.parents( ":jqmData(role='popup')" ).length === 0 ) {
+			extendSelect( selectmenuWidget );
+		}
+	});
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/select.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/select.js
new file mode 100644
index 0000000..fb462c9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/select.js
@@ -0,0 +1,265 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Consistent styling for native select menus. Tapping opens a native select menu.
+//>>label: Selects
+//>>group: Forms
+//>>css.structure: ../css/structure/jquery.mobile.forms.select.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [ "jquery", "../../jquery.mobile.core", "../../jquery.mobile.widget", "../../jquery.mobile.buttonMarkup", "../../jquery.mobile.zoom" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+$.widget( "mobile.selectmenu", $.mobile.widget, {
+	options: {
+		theme: null,
+		disabled: false,
+		icon: "arrow-d",
+		iconpos: "right",
+		inline: false,
+		corners: true,
+		shadow: true,
+		iconshadow: true,
+		overlayTheme: "a",
+		hidePlaceholderMenuItems: true,
+		closeText: "Close",
+		nativeMenu: true,
+		// This option defaults to true on iOS devices.
+		preventFocusZoom: /iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( "AppleWebKit" ) > -1,
+		initSelector: "select:not( :jqmData(role='slider') )",
+		mini: false
+	},
+
+	_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() {
+		var classes = "";
+		// TODO: Post 1.1--once we have time to test thoroughly--any classes manually applied to the original element should be carried over to the enhanced element, with an `-enhanced` suffix. See https://github.com/jquery/jquery-mobile/issues/3577
+		/* if ( $el[0].className.length ) {
+			classes = $el[0].className;
+		} */
+		if ( !!~this.element[0].className.indexOf( "ui-btn-left" ) ) {
+			classes =  " ui-btn-left";
+		}
+
+		if (  !!~this.element[0].className.indexOf( "ui-btn-right" ) ) {
+			classes = " ui-btn-right";
+		}
+
+		this.select = this.element.wrap( "<div class='ui-select" + classes + "'>" );
+		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,
+
+			inline = options.inline ||  $.mobile.getAttrFixed( this.select[0], "data-" + $.mobile.ns + "inline" ),
+			mini = options.mini || $.mobile.getAttrFixed( this.select[0], "data-" + $.mobile.ns + "mini" ),
+			iconpos = options.icon ? ( options.iconpos || $.mobile.getAttrFixed( this.select[0], "data-" + $.mobile.ns + "iconpos" ) ) : false,
+
+			// 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
+				.insertBefore( this.select )
+				.buttonMarkup( {
+					theme: options.theme,
+					icon: options.icon,
+					iconpos: iconpos,
+					inline: inline,
+					corners: options.corners,
+					shadow: options.shadow,
+					iconshadow: options.iconshadow,
+					mini: mini
+				});
+
+		this.setButtonText();
+
+		// TIZEN fix: The TIZEN buttonMarkup patch adds 'ui-btn-icon-only' class to the ui-btn-inner.
+		// It makes the text not to be shown, so the class must be removed. (Like JQM)
+		button.children('.ui-btn-inner').removeClass('ui-btn-icon-only');
+
+		// 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 ) {
+			button.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", function() {
+				self.button.addClass( $.mobile.focusClass );
+			})
+			.bind( "blur", function() {
+				self.button.removeClass( $.mobile.focusClass );
+			})
+			.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 );
+			});
+
+		// In many situations, iOS will zoom into the select upon tap, this prevents that from happening
+		self.button.bind( "vmousedown", function() {
+			if ( self.options.preventFocusZoom ) {
+				$.mobile.zoom.disable( true );
+			}
+		}).bind( "mouseup", function() {
+			if ( self.options.preventFocusZoom ) {
+				setTimeout(function() {
+					$.mobile.zoom.enable( true );
+				}, 0);
+			}
+		});
+	},
+
+	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(),
+			text = this.placeholder,
+			span = $( document.createElement( "span" ) );
+
+		this.button.find( ".ui-btn-text" ).html(function() {
+			if ( selected.length ) {
+				text = selected.map(function() {
+					return $( this ).text();
+				}).get().join( ", " );
+			} else {
+				text = self.placeholder;
+			}
+
+			// TODO possibly aggregate multiple select option classes
+			return span.text( text )
+				.addClass( self.select.attr( "class" ) )
+				.addClass( selected.attr( "class" ) );
+		});
+	},
+
+	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
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$.mobile.selectmenu.prototype.enhanceWithin( e.target, true );
+});
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/slider.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/slider.js
new file mode 100644
index 0000000..4c14574
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/slider.js
@@ -0,0 +1,472 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Slider form widget
+//>>label: Slider
+//>>group: Forms
+//>>css.structure: ../css/structure/jquery.mobile.forms.slider.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [ "jquery", "../../jquery.mobile.core", "../../jquery.mobile.widget", "./textinput", "../../jquery.mobile.buttonMarkup" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+$.widget( "mobile.slider", $.mobile.widget, {
+	widgetEventPrefix: "slide",
+
+	options: {
+		theme: null,
+		trackTheme: null,
+		disabled: false,
+		initSelector: "input[type='range'], :jqmData(type='range'), :jqmData(role='slider')",
+		mini: false
+	},
+
+	_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" ),
+
+			$label = $( "[for='" + controlID + "']" ),
+
+			labelID = $label.attr( "id" ) || controlID + "-label",
+
+			label = $label.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 ),
+
+			inlineClass = ( this.options.inline || $.mobile.getAttrFixed( control[0], "data-" + $.mobile.ns + "inline" ) === true ) ? " ui-slider-inline" : "",
+
+			miniClass = ( this.options.mini || $.mobile.getAttrFixed( control[0], "data-" + $.mobile.ns + "min" ) ) ? " ui-slider-mini" : "",
+
+
+			domHandle = document.createElement( 'a' ),
+			handle = $( domHandle ),
+			domSlider = document.createElement( 'div' ),
+			slider = $( domSlider ),
+
+			valuebg = $.mobile.getAttrFixed( control[0], "data-" + $.mobile.ns + "highlight" ) !== false && cType !== "select" ? (function() {
+				var bg = document.createElement('div');
+				bg.className = 'ui-slider-bg ' + $.mobile.activeBtnClass + ' ui-btn-corner-all';
+				return $( bg ).prependTo( slider );
+			})() : false,
+
+			options;
+
+		this._type = cType;
+
+		domHandle.setAttribute( 'href', "#" );
+		domSlider.setAttribute('role','application');
+		domSlider.className = ['ui-slider ',selectClass," ui-btn-down-",trackTheme,' ui-btn-corner-all', inlineClass, miniClass].join( "" );
+		domHandle.className = 'ui-slider-handle';
+		domSlider.appendChild( domHandle );
+		if ( $( control ).find( "option" ).length && $( control ).find( "option" ).text() === "" ) {
+			$( domSlider ).addClass( "ui-toggle-switch" );
+		}
+		if( val() === "1" ) {
+			$( domHandle ).addClass( "ui-toggle-on" );
+		} else {
+			$( domHandle ).addClass( "ui-toggle-off" );
+		}
+		handle.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
+				});
+
+		$.extend( this, {
+			slider: slider,
+			handle: handle,
+			valuebg: valuebg,
+			dragging: false,
+			beforeStart: null,
+			userModified: false,
+			mouseMoved: false
+		});
+
+		if ( cType === "select" ) {
+			var wrapper = document.createElement('div');
+			wrapper.className = 'ui-slider-inneroffset';
+
+			for ( var j = 0,length = domSlider.childNodes.length;j < length;j++ ) {
+				wrapper.appendChild( domSlider.childNodes[j] );
+			}
+
+			domSlider.appendChild( wrapper );
+
+			// 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" );
+
+			for ( var i = 0, optionsCount = options.length; i < optionsCount; i++ ) {
+				var side = !i ? "b" : "a",
+					sliderTheme = !i ? " ui-btn-down-" + trackTheme : ( " " + $.mobile.activeBtnClass ),
+					sliderLabel = document.createElement( 'div' ),
+					sliderImg = document.createElement( 'span' );
+
+				sliderImg.className = ['ui-slider-label ui-slider-label-',side,sliderTheme," ui-btn-corner-all"].join( "" );
+				sliderImg.setAttribute('role','img');
+				sliderImg.appendChild( document.createTextNode( options[i].innerHTML ) );
+				$( sliderImg ).html() ? $( sliderImg ).html( $( sliderImg ).text() ) : $( sliderImg ).html();
+				$(sliderImg).prependTo( slider );
+			}
+
+			self._labels = $( ".ui-slider-label", slider );
+
+		}
+
+		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 );
+			});
+
+		this._preventDocumentDrag = function( event ) {
+			// NOTE: we don't do this in refresh because we still want to
+			//       support programmatic alteration of disabled inputs
+			var et = $(event.target);
+			if ( self.dragging && !self.options.disabled && ( ( et.parents( ".ui-slider" ).is( ".ui-toggle-switch" ) && et.parents( ".ui-slider-handle" ).is( ".ui-btn-hover-s" ) ) || ( !$( self.element ).siblings( ".ui-slider" ).is( ".ui-toggle-switch"))) ) {
+
+				// 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;
+			}
+		}
+
+		this._on( $.mobile.$document, { "vmousemove": this._preventDocumentDrag });
+
+		// it appears the clicking the up and down buttons in chrome on
+		// range/number inputs doesn't trigger a change until the field is
+		// blurred. Here we check thif the value has changed and refresh
+		control.bind( "vmouseup", $.proxy( self._checkedRefresh, self));
+
+		slider.bind( "vmousedown", function( event ) {
+			// NOTE: we don't do this in refresh because we still want to
+			//       support programmatic alteration of disabled inputs
+			if ( self.options.disabled ) {
+				return false;
+			}
+
+			self.dragging = true;
+			self.userModified = false;
+			self.mouseMoved = false;
+
+			if ( cType === "select" ) {
+				self.beforeStart = control[0].selectedIndex;
+			}
+
+			self.refresh( event );
+			self._trigger( "start" );
+			return false;
+		})
+		.bind( "vclick", false );
+
+		this._sliderMouseUp = 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;
+				self._trigger( "stop" );
+				return false;
+			}
+		};
+
+		this._on( slider.add( document ), { "vmouseup": this._sliderMouseUp });
+		slider.insertAfter( control );
+
+		// Only add focus class to toggle switch, sliders get it automatically from ui-btn
+		if ( cType === 'select' ) {
+			this.handle.bind({
+				focus: function() {
+					slider.addClass( $.mobile.focusClass );
+				},
+
+				blur: function() {
+					slider.removeClass( $.mobile.focusClass );
+				}
+			});
+		}
+
+		this.handle.bind({
+			// NOTE force focus on handle
+			vmousedown: function() {
+				$( this ).focus();
+			},
+
+			vclick: false,
+
+			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 );
+	},
+
+	_checkedRefresh: function() {
+		if( this.value != this._value() ){
+			this.refresh( this._value() );
+		}
+	},
+
+	_value: function() {
+		return  this._type === "input" ?
+			parseFloat( this.element.val() ) : this.element[0].selectedIndex;
+	},
+
+	refresh: function( val, isfromControl, preventInputUpdate ) {
+
+		// NOTE: we don't return here because we want to support programmatic
+		//       alteration of the input value, which should still update the slider
+		if ( this.options.disabled || this.element.attr('disabled')) {
+			this.disable();
+		}
+
+		// set the stored value for comparison later
+		this.value = this._value();
+
+		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,
+			step = ( cType === "input" && parseFloat( control.attr( "step" ) ) > 0 ) ? parseFloat( control.attr( "step" ) ) : 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() || 0 ) : 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 = ( percent / 100 ) * ( max - min ) + min;
+
+		//from jQuery UI slider, the following source will round to the nearest step
+		var valModStep = ( newval - min ) % step;
+		var alignValue = newval - valModStep;
+
+		if ( Math.abs( valModStep ) * 2 >= step ) {
+			alignValue += ( valModStep > 0 ) ? step : ( -step );
+		}
+		// Since JavaScript has problems with large floats, round
+		// the final value to 5 digits after the decimal point (see jQueryUI: #4124)
+		newval = parseFloat( alignValue.toFixed(5) );
+
+		if ( newval < min ) {
+			newval = min;
+		}
+
+		if ( newval > max ) {
+			newval = max;
+		}
+
+		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: cType === "input" ? newval : control.find( "option" ).eq( newval ).getEncodedText()
+			});
+
+		if( percent === 100 && this.handle.hasClass( "ui-slider-handle-snapping" ) ) {
+			this.handle.removeClass( "ui-toggle-off" );
+			this.handle.addClass( "ui-toggle-on" );
+		} else if ( percent === 0 && this.handle.hasClass( "ui-slider-handle-snapping" ) ) {
+			this.handle.removeClass( "ui-toggle-on" );
+			this.handle.addClass( "ui-toggle-off" );
+		}
+
+		if ( this.valuebg ) {
+			this.valuebg.css( "width", percent + "%" );
+		}
+
+		// drag the label widths
+		if ( this._labels ) {
+			var handlePercent = this.handle.width() / this.slider.width() * 100,
+				aPercent = percent && handlePercent + ( 100 - handlePercent ) * percent / 100,
+				bPercent = percent === 100 ? 0 : Math.min( handlePercent + 100 - aPercent, 100 );
+
+			this._labels.each(function() {
+				var ab = $( this ).is( ".ui-slider-label-a" );
+				$( this ).width( ( ab ? aPercent : bPercent  ) + "%" );
+			});
+		}
+
+		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
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$.mobile.slider.prototype.enhanceWithin( e.target, true );
+});
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/textinput.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/textinput.js
new file mode 100644
index 0000000..db404b8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/forms/textinput.js
@@ -0,0 +1,158 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Enhances and consistently styles text inputs.
+//>>label: Text Inputs & Textareas
+//>>group: Forms
+//>>css.structure: ../css/structure/jquery.mobile.forms.textinput.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [ "jquery", "../../jquery.mobile.core", "../../jquery.mobile.widget", "../../jquery.mobile.degradeInputs", "../../jquery.mobile.buttonMarkup", "../../jquery.mobile.zoom"  ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+$.widget( "mobile.textinput", $.mobile.widget, {
+	options: {
+		theme: null,
+		// This option defaults to true on iOS devices.
+		preventFocusZoom: /iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( "AppleWebKit" ) > -1,
+		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])",
+		disabled: false
+	},
+
+	_create: function() {
+
+		var self = this,
+			input = this.element,
+			o = this.options,
+			theme = o.theme || $.mobile.getInheritedTheme( this.element, "c" ),
+			themeclass  = " ui-body-" + theme,
+			mini = $.mobile.getAttrFixed( input[0], "data-" + $.mobile.ns + "mini" ) === true,
+			miniclass = mini ? " ui-mini" : "",
+			focusedEl, clearbtn;
+
+		function toggleClear() {
+			setTimeout( function() {
+				clearbtn.toggleClass( "ui-input-clear-hidden", !input.val() );
+			}, 0 );
+		}
+
+		$( "label[for='" + input.attr( "id" ) + "']" ).addClass( "ui-input-text" );
+
+		focusedEl = input.addClass("ui-input-text ui-body-"+ theme );
+
+		switch ( input.attr( "type" ) ) {
+			case "text":
+			case "password":
+			case "number":
+			case "email":
+			case "url":
+			case "tel":
+				input.attr( { "role" : "textbox", "aria-label" : "Keyboard opened" } );
+				break;
+			default:
+				if ( input.prop( "tagName" ).toLowerCase() === "textarea" ) {
+					input.attr( { "role" : "textbox", "aria-label" : "Keyboard opened" } );
+				}
+		}
+
+		// 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.focus(function() {
+				focusedEl.addClass( $.mobile.focusClass );
+			})
+			.blur(function() {
+				focusedEl.removeClass( $.mobile.focusClass );
+			})
+			// In many situations, iOS will zoom into the select upon tap, this prevents that from happening
+			.bind( "focus", function() {
+				if ( o.preventFocusZoom ) {
+					$.mobile.zoom.disable( true );
+				}
+			})
+			.bind( "blur", function() {
+				if ( o.preventFocusZoom ) {
+					$.mobile.zoom.enable( true );
+				}
+			});
+
+		// Autogrow
+		if ( input.is( "textarea" ) ) {
+			var extraLineHeight = 15,
+				keyupTimeoutBuffer = 100,
+				keyupTimeout;
+
+			this._keyup = function() {
+				var scrollHeight = input[ 0 ].scrollHeight,
+					clientHeight = input[ 0 ].clientHeight;
+
+				if ( clientHeight < scrollHeight && window.innerHeight / 2 > scrollHeight ) {
+					input.height(scrollHeight + extraLineHeight);
+				}
+			};
+
+			input.keyup(function() {
+				clearTimeout( keyupTimeout );
+				keyupTimeout = setTimeout( self._keyup, keyupTimeoutBuffer );
+			});
+
+			// binding to pagechange here ensures that for pages loaded via
+			// ajax the height is recalculated without user input
+			this._on( $.mobile.$document, {"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
+				this._on( $.mobile.$window, {"load": "_keyup"});
+			}
+		}
+		if ( input.attr( "disabled" ) ) {
+			this.disable();
+		}
+	},
+
+	disable: function() {
+		var $el;
+		if ( this.element.attr( "disabled", true ) ) {
+			$el = this.element;
+		} else {
+			return;
+		}
+		$el.addClass( "ui-disabled" );
+		return this._setOption( "disabled", true );
+	},
+
+	enable: function() {
+		var $el;
+
+		// TODO using more than one line of code is acceptable ;)
+		if ( this.element.attr( "disabled", false ) ) {
+			$el = this.element;
+		} else {
+			return;
+		}
+		$el.removeClass( "ui-disabled" );
+		return this._setOption( "disabled", false );
+	}
+});
+
+//auto self-init widgets
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$.mobile.textinput.prototype.enhanceWithin( e.target, true );
+});
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/listview.autodividers.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/listview.autodividers.js
new file mode 100644
index 0000000..474945a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/listview.autodividers.js
@@ -0,0 +1,67 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Generates dividers for listview items
+//>>label: Listview Autodividers
+//>>group: Widgets
+define( [ "jquery", "./listview" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+$.mobile.listview.prototype.options.autodividers = false;
+$.mobile.listview.prototype.options.autodividersSelector = function( elt ) {
+	// look for the text in the given element
+	var text = elt.text() || null;
+
+	if ( !text ) {
+		return null;
+	}
+
+	// create the text for the divider (first uppercased letter)
+	text = text.trim().slice( 0, 1 ).toUpperCase();
+
+	return text;
+};
+
+$.mobile.$document.delegate( "ul,ol", "listviewcreate", function() {
+
+	var list = $( this ),
+			listview = list.data( "listview" );
+
+	if ( !listview || !listview.options.autodividers ) {
+		return;
+	}
+
+	var replaceDividers = function () {
+		list.find( "li:jqmData(role='list-divider')" ).remove();
+
+		var lis = list.find( 'li' ),
+			lastDividerText = null, li, dividerText;
+
+		for ( var i = 0; i < lis.length ; i++ ) {
+			li = lis[i];
+			dividerText = listview.options.autodividersSelector( $( li ) );
+
+			if ( dividerText && lastDividerText !== dividerText ) {
+				var divider = document.createElement( 'li' );
+				divider.appendChild( document.createTextNode( dividerText ) );
+				divider.setAttribute( 'data-' + $.mobile.ns + 'role', 'list-divider' );
+				li.parentNode.insertBefore( divider, li );
+			}
+
+			lastDividerText = dividerText;
+		}
+	};
+
+	var afterListviewRefresh = function () {
+		list.unbind( 'listviewafterrefresh', afterListviewRefresh );
+		replaceDividers();
+		listview.refresh();
+		list.bind( 'listviewafterrefresh', afterListviewRefresh );
+	};
+
+	afterListviewRefresh();
+});
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/listview.filter.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/listview.filter.js
new file mode 100644
index 0000000..1e0cd73
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/listview.filter.js
@@ -0,0 +1,126 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Extends the listview to add a search box to filter lists
+//>>label: Listview: Filter
+//>>group: Widgets
+
+
+define( [ "jquery", "./listview", "./forms/textinput" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+$.mobile.listview.prototype.options.filter = false;
+$.mobile.listview.prototype.options.filterPlaceholder = "";
+$.mobile.listview.prototype.options.filterTheme = "c";
+// TODO rename callback/deprecate and default to the item itself as the first argument
+var defaultFilterCallback = function( text, searchValue, item ) {
+		return text.toString().toLowerCase().indexOf( searchValue ) === -1;
+	};
+
+$.mobile.listview.prototype.options.filterCallback = defaultFilterCallback;
+
+$.mobile.$document.delegate( ":jqmData(role='listview')", "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,
+				// Check if a custom filter callback applies
+				isCustomFilterCallback = listview.options.filterCallback !== defaultFilterCallback;
+
+			listview._trigger( "beforefilter", "beforefilter", { input: this } );
+
+			// Change val as lastval for next execution
+			$this.jqmData( "lastval" , val );
+			if ( isCustomFilterCallback || val.length < lastval.length || val.indexOf( lastval ) !== 0 ) {
+
+				// Custom filter callback applies or 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 =  $.mobile.getAttrFixed( item[0], "data-" + $.mobile.ns + "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, item ) ) {
+
+						//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 ( listview.options.inset ) {
+		wrapper.addClass( "ui-listview-filter-inset" );
+	}
+
+	wrapper.bind( "submit", function() {
+		return false;
+	})
+	.insertBefore( list );
+});
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/listview.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/listview.js
new file mode 100644
index 0000000..9a56d4b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/listview.js
@@ -0,0 +1,550 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Applies listview styling of various types (standard, numbered, split button, etc.)
+//>>label: Listview
+//>>group: Widgets
+//>>css.structure: ../css/structure/jquery.mobile.listview.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+define( [ "jquery", "../jquery.mobile.widget", "../jquery.mobile.buttonMarkup", "./page", "./page.sections" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(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,
+			listviewClasses = "";
+
+		listviewClasses += t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : "";
+
+		// create listview markup
+		t.element.addClass(function( i, orig ) {
+			return orig + " ui-listview " + listviewClasses;
+		});
+
+		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;
+
+		$li = this.element.children( "li" );
+		// At create time and when autodividers calls refresh the li are not visible yet so we need to rely on .ui-screen-hidden
+		$visibleli = create || $li.filter( ":visible" ).length === 0 ? $li.not( ".ui-screen-hidden" ) : $li.filter( ":visible" );
+
+		// ui-li-last is used for setting border-bottom on the last li		
+		$li.filter( ".ui-li-last" ).removeClass( "ui-li-last" );
+					
+		if ( this.options.inset ) {
+			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 ui-li-last" );
+
+			$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" );
+		} else {
+			$visibleli.last().addClass( "ui-li-last" );
+		}
+		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" ).attr( {
+					"role" : "",
+					"aria-label" : "icon"
+				});
+				$( this._findFirstElementByTagName( img[ 0 ].parentNode, "parentNode", "li", "LI" ) ).addClass( img.is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" );
+			}
+		}
+	},
+
+	_addCheckboxRadioClasses: function( containers )
+	{
+		var i, inputAttr, len = containers.length;
+		for ( i = 0; i < len; i++ ) {
+			inputAttr = $( containers[ i ] ).find( "input" );
+			if ( inputAttr.attr( "type" ) == "checkbox" ) {
+				$( containers[ i ] ).addClass( "ui-li-has-checkbox" );
+			} else if ( inputAttr.attr( "type" ) == "radio" ) {
+				$( containers[ i ] ).addClass( "ui-li-has-radio" );
+			}
+		}
+	},
+
+	_addRightBtnClasses: function( containers )
+	{
+		var i, btnAttr, len = containers.length;
+		for ( i = 0; i < len; i++ ) {
+			btnAttr = $( containers[ i ] ).find( ":jqmData(role='button'),input[type='button'],select:jqmData(role='slider')" );
+			if ( btnAttr.length ) {
+				if ( btnAttr.jqmData( "style" ) == "circle" )  {
+					$( containers[ i ] ).addClass( "ui-li-has-right-circle-btn" );
+				} else {
+					$( containers[ i ] ).addClass( "ui-li-has-right-btn" );
+				}
+			}
+		}
+	},
+
+	refresh: function( create ) {
+		this.parentPage = this.element.closest( ".ui-page" );
+		this._createSubPages();
+
+		var o = this.options,
+			$list = this.element,
+			self = this,
+			dividertheme = $.mobile.getAttrFixed( $list[0], "data-" + $.mobile.ns + "dividertheme" ) || o.dividerTheme,
+			listsplittheme =  $.mobile.getAttrFixed( $list[0], "data-" + $.mobile.ns + "splittheme" ),
+			listspliticon = $.mobile.getAttrFixed( $list[0], "data-" + $.mobile.ns + "spliticon" ),
+			li = this._getChildrenByTagName( $list[ 0 ], "li", "LI" ),
+			ol = !!$.nodeName( $list[ 0 ], "ol" ),
+			jsCount = !$.support.cssPseudoElement,
+			start = $list.attr( "start" ),
+			itemClassDict = {},
+			item, itemClass, itemTheme,
+			a, last, splittheme, counter, startCount, newStartCount, countParent, icon, imgParents, img, linkIcon;
+
+		if ( ol && jsCount ) {
+			$list.find( ".ui-li-dec" ).remove();
+		}
+
+		if ( ol ) {	
+			// Check if a start attribute has been set while taking a value of 0 into account
+			if ( start || start === 0 ) {
+				if ( !jsCount ) {
+					startCount = parseFloat( start ) - 1;
+					$list.css( "counter-reset", "listnumbering " + startCount );
+				} else {
+					counter = parseFloat( start );
+				}
+			} else if ( jsCount ) {
+					counter = 1;
+			}	
+		}
+
+		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 = $.mobile.getAttrFixed( item[0], "data-" + $.mobile.ns + "theme" ) || o.theme;
+				a = this._getChildrenByTagName( item[ 0 ], "a", "A" ).attr( {
+					"role": "",
+					"tabindex": "0"
+				});
+				var isDivider = ( $.mobile.getAttrFixed( item[0], "data-" + $.mobile.ns + "role" ) === "list-divider" );
+
+				if ( item.hasClass( "ui-li-has-checkbox" ) || item.hasClass( "ui-li-has-radio" ) ) {
+					item.on( "vclick", function ( e ) {
+						var targetItem = $( e.target );
+						var checkboxradio = targetItem.find( ".ui-checkbox" );
+						if ( !checkboxradio.length ) {
+							checkboxradio = targetItem.find( ".ui-radio" );
+						}
+
+						if ( checkboxradio.length ) {
+							checkboxradio.children( "label" ).trigger( "vclick" );
+						}
+					});
+				}
+
+				if ( a.length && !isDivider ) {
+					icon = $.mobile.getAttrFixed( item[0], "data-" + $.mobile.ns + "icon" );
+
+					/* Remove auto populated right-arrow button. */
+					if ( icon === undefined ) {
+						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().removeClass( "ui-link" ).addClass( "ui-link-inherit" );
+
+					if ( a.length > 1 ) {
+						itemClass += " ui-li-has-alt";
+
+						last = a.last();
+						splittheme = listsplittheme || $.mobile.getAttrFixed( last[0], "data-" + $.mobile.ns + "theme" ) || o.splitTheme;
+						linkIcon = $.mobile.getAttrFixed( last[0], "data-" + $.mobile.ns + "icon" );
+
+						last.appendTo( item )
+							.attr( "title", last.getEncodedText() )
+							.addClass( "ui-li-link-alt" )
+							.empty()
+							.buttonMarkup({
+								shadow: false,
+								corners: false,
+								theme: itemTheme,
+								icon: false,
+								iconpos: "notext"
+							})
+							.find( ".ui-btn-inner" )
+								.append(
+									$( document.createElement( "span" ) ).buttonMarkup({
+										shadow: true,
+										corners: true,
+										theme: splittheme,
+										iconpos: "notext",
+										// link icon overrides list item icon overrides ul element overrides options
+										icon: linkIcon || icon || listspliticon || o.splitIcon
+									})
+								);
+					}
+				} else if ( isDivider ) {
+
+					itemClass += " ui-li-divider ui-bar-" + dividertheme;
+					item.attr( { "role": "heading", "tabindex": "0" } );
+
+					if ( ol ) {	
+						//reset counter when a divider heading is encountered
+						if ( start || start === 0 ) {
+							if ( !jsCount ) {
+								newStartCount = parseFloat( start ) - 1;
+								item.css( "counter-reset", "listnumbering " + newStartCount );
+							} else {
+								counter = parseFloat( start );
+							}
+						} else if ( jsCount ) {
+								counter = 1;
+						}	
+					}
+				
+				} else {
+					itemClass += " ui-li-static ui-btn-up-" + itemTheme;
+					item.attr( "tabindex", "0" );
+				}
+			}
+
+			if ( ol && jsCount && itemClass.indexOf( "ui-li-divider" ) < 0 ) {
+				countParent = itemClass.indexOf( "ui-li-static" ) > 0 ? 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-" + ( $.mobile.getAttrFixed( $list[0], "data-" + $.mobile.ns + "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._addCheckboxRadioClasses( li );
+		this._addCheckboxRadioClasses( $list.find( ".ui-link-inherit" ) );
+
+		this._addRightBtnClasses( li );
+		this._addRightBtnClasses( $list.find( ".ui-link-inherit" ) );
+
+		this._refreshCorners( create );
+
+    // autodividers binds to this to redraw dividers after the listview refresh
+		this._trigger( "afterrefresh" );
+	},
+
+	//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(),
+				nodeElsFull = $( list.prevAll().toArray().reverse() ),
+				nodeEls = nodeElsFull.length ? nodeElsFull : $( "<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 = $.mobile.getAttrFixed( list[0], "data-" + $.mobile.ns + "theme" ) || o.theme,
+				countTheme = $.mobile.getAttrFixed( list[0], "data-" + $.mobile.ns + "counttheme" ) || $.mobile.getAttrFixed( parentList[0], "data-" + $.mobile.ns + "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,
+					prEvent = new $.Event( "pageremove" );
+
+				if ( ui.nextPage ) {
+					npURL = nextPage.jqmData( "url" );
+					if ( npURL.indexOf( parentUrl + "&" + $.mobile.subPageUrlKey ) !== 0 ) {
+						self.childPages().remove();
+						parentPage.trigger( prEvent );
+						if ( !prEvent.isDefaultPrevented() ) {
+							parentPage.removeWithDependents();
+						}
+					}
+				}
+			};
+
+			// unbind the original page remove and replace with our specialized version
+			parentPage
+				.unbind( "pagehide.remove" )
+				.bind( "pagehide.remove", newRemove);
+		}
+	},
+
+	addItem : function( listitem , idx ) {
+		var $item = $(listitem),
+			$li,
+			_self = this;
+
+		$li = _self.element.children( 'li' );
+		$item.css( { 'opacity' : 0,
+					 'display' : 'none' } );
+		if( $li.length == 0
+			|| $li.length <= idx)
+		{
+			$( _self.element ).append( $item );
+		} else {
+			$( $li.get( idx ) ).before( $item );
+		}
+		$(_self.element).trigger("create")
+			.listview( 'refresh' );
+
+		$item.css( 'min-height' , '0px' );
+
+		$item.slideDown( 'fast' , function( ){
+			$item.addClass("addli");
+			$item.css( { 'opacity' : 1 } );
+		} );
+	},
+
+	removeItem : function( idx ) {
+		var $item,
+			$li,
+			_self = this;
+
+		$li = _self.element.children( 'li' );
+		if( $li.length <= 0 ||
+			$li.length < idx ) {
+			return ;
+		}
+		$item = $( $li.get( idx ) );
+		$item.addClass("removeli");
+		$item.slideUp('normal',
+			function( ) {
+			$(this).remove();
+		});
+	},
+
+	// 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 + "')" );
+	}
+});
+
+//delegate auto self-init widgets
+$.delegateSelfInitWithSingleSelector( $.mobile.listview );
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/loader.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/loader.js
new file mode 100644
index 0000000..ba5c190
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/loader.js
@@ -0,0 +1,185 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: packaged loading message functionality
+//>>label: loading message
+//>>group: Navigation
+
+define( [ "jquery",	"../jquery.mobile.core", "../jquery.mobile.widget" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+
+(function( $, window ) {
+	// DEPRECATED
+	// NOTE global mobile object settings
+	$.extend( $.mobile, {
+		// DEPRECATED Should the text be visble in the loading message?
+		loadingMessageTextVisible: undefined,
+
+		// DEPRECATED When the text is visible, what theme does the loading box use?
+		loadingMessageTheme: undefined,
+
+		// DEPRECATED default message setting
+		loadingMessage: undefined,
+
+		// DEPRECATED
+		// Turn on/off page loading message. Theme doubles as an object argument
+		// with the following shape: { theme: '', text: '', html: '', textVisible: '' }
+		// NOTE that the $.mobile.loading* settings and params past the first are deprecated
+		showPageLoadingMsg: function( theme, msgText, textonly ) {
+			$.mobile.loading( 'show', theme, msgText, textonly );
+		},
+
+		// DEPRECATED
+		hidePageLoadingMsg: function() {
+			$.mobile.loading( 'hide' );
+		},
+
+		loading: function() {
+			this.loaderWidget.loader.apply( this.loaderWidget, arguments );
+		}
+	});
+
+	// TODO move loader class down into the widget settings
+	var loaderClass = "ui-loader", $html = $( "html" ), $window = $.mobile.$window;
+
+	$.widget( "mobile.loader", {
+		// NOTE if the global config settings are defined they will override these
+		//      options
+		options: {
+			// the theme for the loading message
+			theme: "a",
+
+			// whether the text in the loading message is shown
+			textVisible: false,
+
+			// custom html for the inner content of the loading message
+			html: "",
+
+			// the text to be displayed when the popup is shown
+			text: "loading"
+		},
+
+		defaultHtml: "<div class='" + loaderClass + "'>" +
+			"<span class='ui-icon ui-icon-loading'></span>" +
+			"<h1></h1>" +
+			"</div>",
+
+		// For non-fixed supportin browsers. Position at y center (if scrollTop supported), above the activeBtn (if defined), or just 100px from top
+		fakeFixLoader: function() {
+			var activeBtn = $( "." + $.mobile.activeBtnClass ).first();
+
+			this.element
+				.css({
+					top: $.support.scrollTop && $window.scrollTop() + $window.height() / 2 ||
+						activeBtn.length && activeBtn.offset().top || 100
+				});
+		},
+
+		// check position of loader to see if it appears to be "fixed" to center
+		// if not, use abs positioning
+		checkLoaderPosition: function() {
+			var offset = this.element.offset(),
+				scrollTop = $window.scrollTop(),
+				screenHeight = $.mobile.getScreenHeight();
+
+			if ( offset.top < scrollTop || ( offset.top - scrollTop ) > screenHeight ) {
+				this.element.addClass( "ui-loader-fakefix" );
+				this.fakeFixLoader();
+				$window
+					.unbind( "scroll", this.checkLoaderPosition )
+					.bind( "scroll", this.fakeFixLoader );
+			}
+		},
+
+		resetHtml: function() {
+			this.element.html( $( this.defaultHtml ).html() );
+		},
+
+		// Turn on/off page loading message. Theme doubles as an object argument
+		// with the following shape: { theme: '', text: '', html: '', textVisible: '' }
+		// NOTE that the $.mobile.loading* settings and params past the first are deprecated
+		// TODO sweet jesus we need to break some of this out
+		show: function( theme, msgText, textonly ) {
+			var textVisible, message, $header, loadSettings;
+
+			this.resetHtml();
+
+			// use the prototype options so that people can set them globally at
+			// mobile init. Consistency, it's what's for dinner
+			if ( $.type(theme) === "object" ) {
+				loadSettings = $.extend( {}, this.options, theme );
+
+				// prefer object property from the param then the old theme setting
+				theme = loadSettings.theme || $.mobile.loadingMessageTheme;
+			} else {
+				loadSettings = this.options;
+
+				// here we prefer the them value passed as a string argument, then
+				// we prefer the global option because we can't use undefined default
+				// prototype options, then the prototype option
+				theme = theme || $.mobile.loadingMessageTheme || loadSettings.theme;
+			}
+
+			// set the message text, prefer the param, then the settings object
+			// then loading message
+			message = msgText || $.mobile.loadingMessage || loadSettings.text;
+
+			// prepare the dom
+			$html.addClass( "ui-loading" );
+
+			if ( $.mobile.loadingMessage !== false || loadSettings.html ) {
+				// boolean values require a bit more work :P, supports object properties
+				// and old settings
+				if ( $.mobile.loadingMessageTextVisible !== undefined ) {
+					textVisible = $.mobile.loadingMessageTextVisible;
+				} else {
+					textVisible = loadSettings.textVisible;
+				}
+
+				// add the proper css given the options (theme, text, etc)
+				// Force text visibility if the second argument was supplied, or
+				// if the text was explicitly set in the object args
+				this.element.attr("class", loaderClass +
+					" ui-corner-all ui-body-" + theme +
+					" ui-loader-" + ( textVisible || msgText || theme.text ? "verbose" : "default" ) +
+					( loadSettings.textonly || textonly ? " ui-loader-textonly" : "" ) );
+
+				// TODO verify that jquery.fn.html is ok to use in both cases here
+				//      this might be overly defensive in preventing unknowing xss
+				// if the html attribute is defined on the loading settings, use that
+				// otherwise use the fallbacks from above
+				if ( loadSettings.html ) {
+					this.element.html( loadSettings.html );
+				} else {
+					this.element.find( "h1" ).text( message );
+				}
+
+				// attach the loader to the DOM
+				this.element.appendTo( $.mobile.pageContainer );
+
+				// check that the loader is visible
+				this.checkLoaderPosition();
+
+				// on scroll check the loader position
+				$window.bind( "scroll", $.proxy( this.checkLoaderPosition, this ) );
+			}
+		},
+
+		hide: function() {
+			$html.removeClass( "ui-loading" );
+
+			if ( $.mobile.loadingMessage ) {
+				this.element.removeClass( "ui-loader-fakefix" );
+			}
+
+			$.mobile.$window.unbind( "scroll", $.proxy( this.fakeFixLoader, this) );
+			$.mobile.$window.unbind( "scroll", $.proxy( this.checkLoaderPosition, this ) );
+		}
+	});
+
+	$window.bind( 'pagecontainercreate', function() {
+		$.mobile.loaderWidget = $.mobile.loaderWidget || $( $.mobile.loader.prototype.defaultHtml ).loader();
+	});
+})(jQuery, this);
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/navbar.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/navbar.js
new file mode 100644
index 0000000..f4842f8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/navbar.js
@@ -0,0 +1,60 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Formats groups of links as horizontal navigation bars.
+//>>label: Navbars
+//>>group: Widgets
+//>>css.structure: ../css/structure/jquery.mobile.navbar.css
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+
+
+define( [ "jquery", "../jquery.mobile.widget", "../jquery.mobile.buttonMarkup", "../jquery.mobile.grid" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(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 ui-mini" )
+			.attr( "role", "navigation" )
+			.find( "ul" )
+			.jqmEnhanceable()
+			.grid({ grid: this.options.grid });
+
+		$navbtns.buttonMarkup({
+			corners:	false,
+			shadow:		false,
+			inline:     true,
+			iconpos:	iconpos
+		});
+
+		$navbar.delegate( "a", "vclick", function( event ) {
+			if ( !$(event.target).hasClass( "ui-disabled" ) ) {
+				$navbtns.removeClass( $.mobile.activeBtnClass );
+				$( this ).addClass( $.mobile.activeBtnClass );
+			}
+		});
+
+		// Buttons in the navbar with ui-state-persist class should regain their active state before page show
+		$navbar.closest( ".ui-page" ).bind( "pagebeforeshow", function() {
+			$navbtns.filter( ".ui-state-persist" ).addClass( $.mobile.activeBtnClass );
+		});
+	}
+});
+
+//delegate auto self-init widgets
+$.delegateSelfInitWithSingleSelector( $.mobile.navbar );
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/page.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/page.js
new file mode 100644
index 0000000..cd7efa6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/page.js
@@ -0,0 +1,84 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Basic page definition and formatting.
+//>>label: Page Creation
+//>>group: Core
+
+define( [ "jquery", "../jquery.mobile.widget" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+$.widget( "mobile.page", $.mobile.widget, {
+	options: {
+		theme: "c",
+		domCache: false,
+		keepNativeDefault: ":jqmData(role='none'), :jqmData(role='nojs')"
+	},
+
+	_create: function() {
+		
+		var self = this;
+		
+		// if false is returned by the callbacks do not create the page
+		if ( self._trigger( "beforecreate" ) === false ) {
+			return false;
+		}
+
+		self.element
+			.addClass( "ui-page ui-body-" + self.options.theme )
+			.bind( "pagebeforehide", function() {
+				self.removeContainerBackground();
+			} )
+			.bind( "pagebeforeshow", function() {
+				self.setContainerBackground();
+			} );
+
+	},
+	
+	refresh: function() {
+		$( this.element ).children( ".ui-content" ).trigger("updatelayout", ["external"]);
+	},
+
+	/* GUI Builder only : redesign page when user drag&drop header, footer */
+	setToolbar: function () {
+		$( this.element ).trigger( "pagebeforeshow" );
+	},
+
+	removeContainerBackground: function() {
+		$.mobile.pageContainer.removeClass( "ui-overlay-" + $.mobile.getInheritedTheme( this.element.parent() ) );
+	},
+	
+	// set the page container background to the page theme
+	setContainerBackground: function( theme ) {
+		if ( this.options.theme ) {
+			$.mobile.pageContainer.addClass( "ui-overlay-" + ( theme || this.options.theme ) );
+		}
+	},
+
+	addBackBtn : function ( target ) {
+		var $dest = $( ".ui-page-active .ui-footer" );
+
+		if ( target == "header" ) {
+			$dest = $( ".ui-page-active .ui-header" );
+		}
+		backBtn = $( "<a href='#' class='ui-btn-back' data-" + $.mobile.ns + "rel='back'></a>" )
+			.buttonMarkup( {icon: "header-back-btn", theme : "s"} );
+		if ( !$dest.find( ".ui-btn-back").length ) {
+			backBtn.prependTo( $dest );
+		}
+	},
+
+	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 );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/page.sections.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/page.sections.js
new file mode 100644
index 0000000..352355e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/page.sections.js
@@ -0,0 +1,119 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Theming and layout of headers, footers, and content areas
+//>>label: Page Sections
+//>>group: Core
+
+define( [ "jquery", "../jquery.mobile.core", "./page" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(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;
+
+// NOTE bind used to force this binding to run before the buttonMarkup binding
+//      which expects .ui-footer top be applied in its gigantic selector
+// TODO remove the buttonMarkup giant selector and move it to the various modules
+//      on which it depends
+$.mobile.$document.bind( "pagecreate", function( e ) {
+	var $page = $( e.target ),
+		o = $page.data( "page" ).options,
+		prefix = "data-"+$.mobile.ns,
+		pageRole = $page[0].getAttribute( prefix + "role" ) || undefined,
+		pageTheme = o.theme;
+
+	$( ":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')", $page )
+		.jqmEnhanceable()
+		.each(function() {
+
+		var $this = $( this ),
+			role = $this[0].getAttribute( prefix + "role" ) || undefined,
+			theme = $this[0].getAttribute( prefix + "theme" ) || undefined,
+			contentTheme = theme || o.contentTheme || ( pageRole === "dialog" && pageTheme ),
+			$headeranchors,
+			leftbtn,
+			rightbtn,
+			$dest = $page.find( ".ui-footer" ),
+			backBtn;
+
+		$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" );
+
+			if ( role === "header") {
+				// Right,left buttons
+				$headeranchors	= $this.children( "a, div.naviframe-button, a.naviframe-button, button" );
+				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;
+
+				$( $headeranchors.get().reverse() ).each( function ( i ) {
+					$( this ).addClass( "ui-btn-right-" + i );
+				});
+			}
+
+			// Auto-add back btn on pages beyond first view
+			if ( o.addBackBtn &&
+				( role === "footer" || role === "header" ) &&
+				$page[0].getAttribute( prefix + "url" ) !== $.mobile.path.stripHash( location.hash ) &&
+				!leftbtn ) {
+
+				if ( o.addBackBtn == "header" ) {
+					$dest = $page.find( ".ui-header" );
+				} else {
+					$dest = $page.find( ".ui-footer" );
+				}
+
+				if ( !$dest.find( ".ui-btn-back" ).length ) {
+					backBtn = $( "<a href='javascript:void(0);' class='ui-btn-back' data-" + $.mobile.ns + "rel='back'></a>" )
+						// // If theme is provided, override default inheritance
+						.buttonMarkup( { icon: "header-back-btn", theme: o.backBtnTheme || thisTheme } );
+
+					backBtn.find( ".ui-btn-text" ).text( o.backBtnText );
+					backBtn.appendTo( $dest );
+				}
+			}
+
+			// 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({
+					"role": "heading",
+					"aria-level": "1",
+					"aria-label": "title",
+					"tabindex": "0"
+				});
+
+			$( ".ui-title-text-sub" ).attr( { "tabindex": "0", "aria-label": "subtitle" } );
+
+		} else if ( role === "content" ) {
+			if ( contentTheme ) {
+				$this.addClass( "ui-body-" + ( contentTheme ) );
+			}
+
+			// Add ARIA role
+			$this.attr( "role", "main" );
+		}
+	});
+});
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/popup.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/popup.js
new file mode 100644
index 0000000..136686c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/popup.js
@@ -0,0 +1,977 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Popup windows
+//>>label: Popups
+//>>group: Widgets
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+//>>css.structure: ../css/structure/jquery.mobile.popup.css,../css/structure/jquery.mobile.transition.css,../css/structure/jquery.mobile.transition.fade.css
+
+define( [ "jquery",
+	"../jquery.mobile.widget",
+	"../jquery.mobile.support",
+	"../jquery.mobile.navigation",
+	"../jquery.hashchange" ], function( jQuery ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+	function fitSegmentInsideSegment( winSize, segSize, offset, desired ) {
+		var ret = desired;
+
+		if ( winSize < segSize ) {
+			// Center segment if it's bigger than the window
+			ret = offset + ( winSize - segSize ) / 2;
+		} else {
+			// Otherwise center it at the desired coordinate while keeping it completely inside the window
+			ret = Math.min( Math.max( offset, desired - segSize / 2 ), offset + winSize - segSize );
+		}
+
+		return ret;
+	}
+
+	function windowCoords() {
+		var $win = $.mobile.$window;
+
+		return {
+			x: $win.scrollLeft(),
+			y: $win.scrollTop(),
+			cx: ( window.innerWidth || $win.width() ),
+			cy: ( window.innerHeight || $win.height() )
+		};
+	}
+
+	$.widget( "mobile.popup", $.mobile.widget, {
+		options: {
+			theme: null,
+			overlayTheme: null,
+			shadow: true,
+			corners: true,
+			transition: "pop",
+			positionTo: "origin",
+			tolerance: null,
+			initSelector: ":jqmData(role='popup')",
+			closeLinkSelector: "a:jqmData(rel='back')",
+			closeLinkEvents: "click.popup",
+			navigateEvents: "navigate.popup",
+			closeEvents: "navigate.popup pagebeforechange.popup",
+			isHardwarePopup: false,
+			// NOTE Windows Phone 7 has a scroll position caching issue that
+			//      requires us to disable popup history management by default
+			//      https://github.com/jquery/jquery-mobile/issues/4784
+			//
+			// NOTE this option is modified in _create!
+			history: false
+		},
+
+		_eatEventAndClose: function( e ) {
+			e.preventDefault();
+			e.stopImmediatePropagation();
+			this.close();
+			return false;
+		},
+
+		// Make sure the screen size is increased beyond the page height if the popup's causes the document to increase in height
+		_resizeScreen: function() {
+			var popupHeight = this._ui.container.outerHeight( true );
+
+			this._ui.screen.removeAttr( "style" );
+			if ( popupHeight > this._ui.screen.height() ) {
+				this._ui.screen.height( popupHeight );
+			}
+		},
+
+		_handleWindowKeyUp: function( e ) {
+			if ( this._isOpen && e.keyCode === $.mobile.keyCode.ESCAPE ) {
+				return this._eatEventAndClose( e );
+			}
+		},
+
+		_maybeRefreshTimeout: function() {
+			var winCoords = windowCoords();
+
+			if ( this._resizeData ) {
+				if ( winCoords.x === this._resizeData.winCoords.x &&
+					winCoords.y === this._resizeData.winCoords.y &&
+					winCoords.cx === this._resizeData.winCoords.cx &&
+					winCoords.cy === this._resizeData.winCoords.cy ) {
+					// timeout not refreshed
+					return false;
+				} else {
+					// clear existing timeout - it will be refreshed below
+					clearTimeout( this._resizeData.timeoutId );
+				}
+			}
+
+			this._resizeData = {
+				timeoutId: setTimeout( $.proxy( this, "_resizeTimeout" ), 200 ),
+				winCoords: winCoords
+			};
+
+			return true;
+		},
+
+		_resizeTimeout: function() {
+			if ( !this._maybeRefreshTimeout() && this.positionTo === "window" && this._isOpen ) {
+				// effectively rapid-open the popup while leaving the screen intact
+				this._trigger( "beforeposition" );
+				this._ui.container
+					.removeClass( "ui-selectmenu-hidden" )
+					.offset( this._placementCoords( this._desiredCoords( undefined, undefined, "window" ) ) );
+
+				this._resizeScreen();
+				this._resizeData = null;
+				this._orientationchangeInProgress = false;
+			}
+		},
+
+		_handleWindowResize: function( e ) {
+			if ( this._isOpen ) {
+				// Context popup close when Window resize event
+				if( this.positionTo !== "window" ) {
+					this.close();
+					return false;
+				}
+				this._maybeRefreshTimeout();
+			}
+		},
+
+		_handleWindowOrientationchange: function( e ) {
+
+			if ( !this._orientationchangeInProgress ) {
+				// effectively rapid-close the popup while leaving the screen intact
+				this._ui.container
+					.addClass( "ui-selectmenu-hidden" )
+					.removeAttr( "style" );
+
+				this._orientationchangeInProgress = true;
+			}
+		},
+
+		_create: function() {
+			var ui = {
+					screen: $( "<div class='ui-screen-hidden ui-popup-screen'></div>" ),
+					placeholder: $( "<div style='display: none;'><!-- placeholder --></div>" ),
+					container: $( "<div class='ui-popup-container ui-selectmenu-hidden'></div>" ),
+					arrow : $("<div class='ui-arrow'></div>")
+				},
+				thisPage = this.element.closest( ".ui-page" ),
+				myId = this.element.attr( "id" ),
+				self = this;
+
+			// We need to adjust the history option to be false if there's no AJAX nav.
+			// We can't do it in the option declarations because those are run before
+			// it is determined whether there shall be AJAX nav.
+			this.options.history = this.options.history && $.mobile.ajaxEnabled && $.mobile.hashListeningEnabled;
+
+			if ( thisPage.length === 0 ) {
+				thisPage = $( "body" );
+			}
+
+			// define the container for navigation event bindings
+			// TODO this would be nice at the the mobile widget level
+			this.options.container = this.options.container || $.mobile.pageContainer;
+
+			// Apply the proto
+			thisPage.append( ui.screen );
+			ui.container.insertAfter( ui.screen );
+			// Leave a placeholder where the element used to be
+			ui.placeholder.insertAfter( this.element );
+			if ( myId ) {
+				ui.screen.attr( "id", myId + "-screen" );
+				ui.container.attr( "id", myId + "-popup" );
+				ui.placeholder.html( "<!-- placeholder for " + myId + " -->" );
+			}
+			ui.container.append( this.element );
+			ui.container.append( ui.arrow );
+			// Add class to popup element
+			this.element.addClass( "ui-popup" );
+
+			// Define instance variables
+			$.extend( this, {
+				_page: thisPage,
+				_ui: ui,
+				_fallbackTransition: "",
+				_currentTransition: false,
+				_prereqs: null,
+				_isOpen: false,
+				_tolerance: null,
+				_resizeData: null,
+				_orientationchangeInProgress: false,
+				_globalHandlers: [
+					{
+						src: $.mobile.$window,
+						handler: {
+							orientationchange: $.proxy( this, "_handleWindowOrientationchange" ),
+							resize: $.proxy( this, "_handleWindowResize" ),
+							keyup: $.proxy( this, "_handleWindowKeyUp" )
+						}
+					}
+				]
+			});
+
+			$.each( this.options, function( key, value ) {
+				// Cause initial options to be applied by their handler by temporarily setting the option to undefined
+				// - the handler then sets it to the initial value
+				self.options[ key ] = undefined;
+				self._setOption( key, value, true );
+			});
+
+			ui.screen.bind( "vclick", $.proxy( this, "_eatEventAndClose" ) );
+
+			$.each( this._globalHandlers, function( idx, value ) {
+				value.src.bind( value.handler );
+			});
+		},
+
+		_applyTheme: function( dst, theme, prefix ) {
+			var classes = ( dst.attr( "class" ) || "").split( " " ),
+				alreadyAdded = true,
+				currentTheme = null,
+				matches,
+				themeStr = String( theme );
+
+			while ( classes.length > 0 ) {
+				currentTheme = classes.pop();
+				matches = ( new RegExp( "^ui-" + prefix + "-([a-z])$" ) ).exec( currentTheme );
+				if ( matches && matches.length > 1 ) {
+					currentTheme = matches[ 1 ];
+					break;
+				} else {
+					currentTheme = null;
+				}
+			}
+
+			if ( theme !== currentTheme ) {
+				dst.removeClass( "ui-" + prefix + "-" + currentTheme );
+				if ( ! ( theme === null || theme === "none" ) ) {
+					dst.addClass( "ui-" + prefix + "-" + themeStr );
+				}
+			}
+		},
+
+		_setTheme: function( value ) {
+			this._applyTheme( this.element, value, "body" );
+		},
+
+		_setOverlayTheme: function( value ) {
+			this._applyTheme( this._ui.screen, value, "overlay" );
+
+			if ( this._isOpen ) {
+				this._ui.screen.addClass( "in" );
+			}
+		},
+
+		_setShadow: function( value ) {
+			this.element.toggleClass( "ui-overlay-shadow", value );
+		},
+
+		_setCorners: function( value ) {
+			this.element.toggleClass( "ui-corner-all", value );
+		},
+
+		_applyTransition: function( value ) {
+			this._ui.container.removeClass( this._fallbackTransition );
+			if ( value && value !== "none" ) {
+				this._fallbackTransition = $.mobile._maybeDegradeTransition( value );
+				this._ui.container.addClass( this._fallbackTransition );
+			}
+		},
+
+		_setTransition: function( value ) {
+			if ( !this._currentTransition ) {
+				this._applyTransition( value );
+			}
+		},
+
+		_setTolerance: function( value ) {
+			var tol = { t: 5, r: 5, b: 5, l: 5 };
+
+			if ( value ) {
+				var ar = String( value ).split( "," );
+
+				$.each( ar, function( idx, val ) { ar[ idx ] = parseInt( val, 10 ); } );
+
+				switch( ar.length ) {
+					// All values are to be the same
+					case 1:
+						if ( !isNaN( ar[ 0 ] ) ) {
+							tol.t = tol.r = tol.b = tol.l = ar[ 0 ];
+						}
+						break;
+
+					// The first value denotes top/bottom tolerance, and the second value denotes left/right tolerance
+					case 2:
+						if ( !isNaN( ar[ 0 ] ) ) {
+							tol.t = tol.b = ar[ 0 ];
+						}
+						if ( !isNaN( ar[ 1 ] ) ) {
+							tol.l = tol.r = ar[ 1 ];
+						}
+						break;
+
+					// The array contains values in the order top, right, bottom, left
+					case 4:
+						if ( !isNaN( ar[ 0 ] ) ) {
+							tol.t = ar[ 0 ];
+						}
+						if ( !isNaN( ar[ 1 ] ) ) {
+							tol.r = ar[ 1 ];
+						}
+						if ( !isNaN( ar[ 2 ] ) ) {
+							tol.b = ar[ 2 ];
+						}
+						if ( !isNaN( ar[ 3 ] ) ) {
+							tol.l = ar[ 3 ];
+						}
+						break;
+
+					default:
+						break;
+				}
+			}
+
+			this._tolerance = tol;
+		},
+
+		_setOption: function( key, value ) {
+			var exclusions, setter = "_set" + key.charAt( 0 ).toUpperCase() + key.slice( 1 );
+
+			if ( this[ setter ] !== undefined ) {
+				this[ setter ]( value );
+			}
+
+			// TODO REMOVE FOR 1.2.1 by moving them out to a default options object
+			exclusions = [
+				"initSelector",
+				"closeLinkSelector",
+				"closeLinkEvents",
+				"navigateEvents",
+				"closeEvents",
+				"history",
+				"container"
+			];
+
+			$.mobile.widget.prototype._setOption.apply( this, arguments );
+			if ( $.inArray( key, exclusions ) === -1 ) {
+				// Record the option change in the options and in the DOM data-* attributes
+				this.element.attr( "data-" + ( $.mobile.ns || "" ) + ( key.replace( /([A-Z])/, "-$1" ).toLowerCase() ), value );
+			}
+		},
+
+		// Try and center the overlay over the given coordinates
+		_placementCoords: function( desired ) {
+			// rectangle within which the popup must fit
+			var
+				winCoords = windowCoords(),
+				rc = {
+					x: this._tolerance.l,
+					y: winCoords.y + this._tolerance.t,
+					cx: winCoords.cx - this._tolerance.l - this._tolerance.r,
+					cy: winCoords.cy - this._tolerance.t - this._tolerance.b
+				},
+				menuSize, ret,
+				linkOffset = $(this.link).offset(),
+				positionOffsets = [],
+				correctionValue = [0,0],
+				arrayIdx;
+
+			// Clamp the width of the menu before grabbing its size
+			this._ui.container.css( "max-width", rc.cx );
+			menuSize = {
+				cx: this._ui.container.outerWidth( true ),
+				cy: this._ui.container.outerHeight( true )
+			};
+
+			// Center the menu over the desired coordinates, while not going outside
+			// the window tolerances. This will center wrt. the window if the popup is too large.
+			ret = {
+				x: fitSegmentInsideSegment( rc.cx, menuSize.cx, rc.x, desired.x ),
+				y: fitSegmentInsideSegment( rc.cy, menuSize.cy, rc.y, desired.y )
+			};
+
+			// Make sure the top of the menu is visible
+			ret.y = Math.max( 0, ret.y );
+
+			// If the height of the menu is smaller than the height of the document
+			// align the bottom with the bottom of the document
+
+			// fix for $( document ).height() bug in core 1.7.2.
+			var docEl = document.documentElement, docBody = document.body,
+				docHeight = Math.max( docEl.clientHeight, docBody.scrollHeight, docBody.offsetHeight, docEl.scrollHeight, docEl.offsetHeight );
+
+			ret.y -= Math.min( ret.y, Math.max( 0, ret.y + menuSize.cy - docHeight ) );
+
+			if ( this.positionTo !== "origin" ) {
+				return { left: ret.x, top: ret.y , arrowleft: 0 , arrowtop: 0};
+			} else if( this.options.isHardwarePopup )  {
+				return { left: this._tolerance.l, top: $(window).height() - menuSize.cy - this._tolerance.b, arrowleft: 0 , arrowtop: 0 };
+			}
+
+			positionOffsets = [ linkOffset.left,
+								linkOffset.top,
+								docEl.clientHeight - ( linkOffset.top + $(this.link).height() ),
+								docEl.clientWidth - ( linkOffset.left + $(this.link).width() )];
+			arrayIdx = positionOffsets.indexOf(Math.max.apply(window,positionOffsets));
+
+			switch( arrayIdx )
+			{
+				case 0:
+					correctionValue = [ -$(this.link).width() , 0];
+					arrowtop = ( linkOffset.top - ret.y  ) + ( $(this.link).height() / 2 ) - parseInt( $(this._ui.arrow).css("border-width") ) ;
+					arrowleft = menuSize.cx;
+					$(this._ui.arrow).attr( "class", "" )
+									.addClass( "ui-arrow left" )
+					break;
+				case 1:
+					correctionValue = [ 0 , -(ret.y + menuSize.cy - linkOffset.top)];
+					arrowtop = menuSize.cy - 2;
+					arrowleft = (linkOffset.left - ret.x + correctionValue[0]) + ( $(this.link).width() / 2 ) - parseInt( $(this._ui.arrow).css("border-width") ) / 2;
+					$(this._ui.arrow).attr( "class", "" )
+									.addClass( "ui-arrow bottom" );
+					break;
+				case 2:
+					correctionValue = [ 0 , ( linkOffset.top + $(this.link).height() - ret.y ) ];
+					arrowtop = - parseInt( $(this._ui.arrow).css("border-width") ) * 2 + 1;
+					arrowleft = (linkOffset.left - ret.x + correctionValue[0]) + ( $(this.link).width() / 2 ) - parseInt( $(this._ui.arrow).css("border-width") ) / 2;
+					$(this._ui.arrow).attr( "class", "" )
+									.addClass("ui-arrow top");
+					break;
+				case 3:
+					correctionValue = [ ( menuSize.cx < $(this.link).width() ) ? ( $(this.link).width() / 2 ) + ( menuSize.cx / 2) : $(this.link).width() , 0];
+					arrowtop = ( linkOffset.top - ret.y  ) + ( $(this.link).height() / 2 ) - parseInt( $(this._ui.arrow).css("border-width") ) ;
+					arrowleft = - parseInt( $(this._ui.arrow).css("border-width") ) * 2;
+					$(this._ui.arrow).attr( "class", "" )
+									.addClass("ui-arrow right");
+					break;
+			}
+
+			return { left: ret.x + correctionValue[0], top: ret.y + correctionValue[1] , arrowleft: arrowleft , arrowtop: arrowtop };
+		},
+
+		_createPrereqs: function( screenPrereq, containerPrereq, whenDone ) {
+			var self = this, prereqs;
+
+			// It is important to maintain both the local variable prereqs and self._prereqs. The local variable remains in
+			// the closure of the functions which call the callbacks passed in. The comparison between the local variable and
+			// self._prereqs is necessary, because once a function has been passed to .animationComplete() it will be called
+			// next time an animation completes, even if that's not the animation whose end the function was supposed to catch
+			// (for example, if an abort happens during the opening animation, the .animationComplete handler is not called for
+			// that animation anymore, but the handler remains attached, so it is called the next time the popup is opened
+			// - making it stale. Comparing the local variable prereqs to the widget-level variable self._prereqs ensures that
+			// callbacks triggered by a stale .animationComplete will be ignored.
+
+			prereqs = {
+				screen: $.Deferred(),
+				container: $.Deferred()
+			};
+
+			prereqs.screen.then( function() {
+				if ( prereqs === self._prereqs ) {
+					screenPrereq();
+				}
+			});
+
+			prereqs.container.then( function() {
+				if ( prereqs === self._prereqs ) {
+					containerPrereq();
+				}
+			});
+
+			$.when( prereqs.screen, prereqs.container ).done( function() {
+				if ( prereqs === self._prereqs ) {
+					self._prereqs = null;
+					whenDone();
+				}
+			});
+
+			self._prereqs = prereqs;
+		},
+
+		_animate: function( args ) {
+			// NOTE before removing the default animation of the screen
+			//      this had an animate callback that would relove the deferred
+			//      now the deferred is resolved immediately
+			// TODO remove the dependency on the screen deferred
+			this._ui.screen
+				.removeClass( args.classToRemove )
+				.addClass( args.screenClassToAdd );
+
+			args.prereqs.screen.resolve();
+
+			if ( args.transition && args.transition !== "none" ) {
+				if ( args.applyTransition ) {
+					this._applyTransition( args.transition );
+				}
+				this._ui.container
+					.animationComplete( $.proxy( args.prereqs.container, "resolve" ) )
+					.addClass( args.containerClassToAdd )
+					.removeClass( args.classToRemove );
+			} else {
+				this._ui.container.removeClass( args.classToRemove );
+				args.prereqs.container.resolve();
+			}
+		},
+
+		// The desired coordinates passed in will be returned untouched if no reference element can be identified via
+		// desiredPosition.positionTo. Nevertheless, this function ensures that its return value always contains valid
+		// x and y coordinates by specifying the center middle of the window if the coordinates are absent.
+		_desiredCoords: function( x, y, positionTo ) {
+			var dst = null, offset, winCoords = windowCoords();
+
+			self.positionTo = positionTo;
+
+			// Establish which element will serve as the reference
+			if ( positionTo && positionTo !== "origin" ) {
+				if ( positionTo === "window" ) {
+					x = winCoords.cx / 2 + winCoords.x;
+					y = winCoords.cy / 2 + winCoords.y;
+				} else {
+					try {
+						dst = $( positionTo );
+					} catch( e ) {
+						dst = null;
+					}
+					if ( dst ) {
+						dst.filter( ":visible" );
+						if ( dst.length === 0 ) {
+							dst = null;
+						}
+					}
+				}
+			}
+
+			// If an element was found, center over it
+			if ( dst ) {
+				offset = dst.offset();
+				x = offset.left + dst.outerWidth() / 2;
+				y = offset.top + dst.outerHeight() / 2;
+			}
+
+			// Make sure x and y are valid numbers - center over the window
+			if ( $.type( x ) !== "number" || isNaN( x ) ) {
+				x = winCoords.cx / 2 + winCoords.x;
+			}
+			if ( $.type( y ) !== "number" || isNaN( y ) ) {
+				y = winCoords.cy / 2 + winCoords.y;
+			}
+
+			return { x: x, y: y };
+		},
+
+		_reposition: function() {
+			var self = this,
+					coords;
+
+			if( self._isOpen
+				&& self.link
+				&& self.positionTo !== "window") {
+					coords = self._placementCoords( self._desiredCoords( $(self.link).offset().left + $(self.link).outerWidth() /2 , $(self.link).offset().top + $(self.link).outerHeight() /2 , self.positionTo || self.options.positionTo || "origin" ) );
+					self._ui.container
+						.offset( { top : coords.top } );
+			}
+		},
+
+		_openPrereqsComplete: function() {
+			var self = this;
+
+			self._ui.container.addClass( "ui-popup-active" );
+			self._isOpen = true;
+			self._resizeScreen();
+
+			// Android appears to trigger the animation complete before the popup
+			// is visible. Allowing the stack to unwind before applying focus prevents
+			// the "blue flash" of element focus in android 4.0
+			setTimeout(function(){
+				self._ui.container.attr( "tabindex", "0" ).focus();
+				self._trigger( "afteropen" );
+				self._reposition();
+			});
+		},
+
+		_open: function( options ) {
+			var coords, transition,
+				androidBlacklist = ( function() {
+					var w = window,
+						ua = navigator.userAgent,
+						// Rendering engine is Webkit, and capture major version
+						wkmatch = ua.match( /AppleWebKit\/([0-9\.]+)/ ),
+						wkversion = !!wkmatch && wkmatch[ 1 ],
+						androidmatch = ua.match( /Android (\d+(?:\.\d+))/ ),
+						andversion = !!androidmatch && androidmatch[ 1 ],
+						chromematch = ua.indexOf( "Chrome" ) > -1;
+
+					// Platform is Android, WebKit version is greater than 534.13 ( Android 3.2.1 ) and not Chrome.
+					if( androidmatch !== null && andversion === "4.0" && wkversion && wkversion > 534.13 && !chromematch ) {
+						return true;
+					}
+					return false;
+				}());
+
+			// Make sure options is defined
+			options = ( options || {} );
+
+			// Copy out the transition, because we may be overwriting it later and we don't want to pass that change back to the caller
+			transition = options.transition || this.options.transition;
+
+			// Give applications a chance to modify the contents of the container before it appears
+			this._trigger( "beforeposition" );
+
+			coords = this._placementCoords( this._desiredCoords( options.x, options.y, options.positionTo || this.options.positionTo || "origin" ) );
+
+			// Count down to triggering "popupafteropen" - we have two prerequisites:
+			// 1. The popup window animation completes (container())
+			// 2. The screen opacity animation completes (screen())
+			this._createPrereqs(
+				$.noop,
+				$.noop,
+				$.proxy( this, "_openPrereqsComplete" ) );
+
+			if ( transition ) {
+				this._currentTransition = transition;
+				this._applyTransition( transition );
+			} else {
+				transition = this.options.transition;
+			}
+
+			if ( !this.options.theme ) {
+				this._setTheme( this._page.jqmData( "theme" ) || $.mobile.getInheritedTheme( this._page, "c" ) );
+			}
+
+			this._ui.screen.removeClass( "ui-screen-hidden" );
+
+			this._ui.container
+				.removeClass( "ui-selectmenu-hidden" )
+				.offset( coords );
+			this._ui.arrow.css( { top : coords.arrowtop, left : coords.arrowleft } );
+			if ( this.options.overlayTheme && androidBlacklist ) {
+				/* TODO:
+				The native browser on Android 4.0.X ("Ice Cream Sandwich") suffers from an issue where the popup overlay appears to be z-indexed
+				above the popup itself when certain other styles exist on the same page -- namely, any element set to `position: fixed` and certain
+				types of input. These issues are reminiscent of previously uncovered bugs in older versions of Android's native browser:
+				https://github.com/scottjehl/Device-Bugs/issues/3
+
+				This fix closes the following bugs ( I use "closes" with reluctance, and stress that this issue should be revisited as soon as possible ):
+
+				https://github.com/jquery/jquery-mobile/issues/4816
+				https://github.com/jquery/jquery-mobile/issues/4844
+				https://github.com/jquery/jquery-mobile/issues/4874
+				*/
+
+				// TODO sort out why this._page isn't working
+				this.element.closest( ".ui-page" ).addClass( "ui-popup-open" );
+			}
+			this._animate({
+				additionalCondition: true,
+				transition: transition,
+				classToRemove: "",
+				screenClassToAdd: "in",
+				containerClassToAdd: "in",
+				applyTransition: false,
+				prereqs: this._prereqs
+			});
+		},
+
+		_closePrereqScreen: function() {
+			this._ui.screen
+				.removeClass( "out" )
+				.addClass( "ui-screen-hidden" );
+		},
+
+		_closePrereqContainer: function() {
+			this._ui.container
+				.removeClass( "reverse out" )
+				.addClass( "ui-selectmenu-hidden" )
+				.removeAttr( "style" );
+		},
+
+		_closePrereqsDone: function() {
+			var self = this, opts = self.options;
+
+			self._ui.container.removeAttr( "tabindex" );
+
+			// remove nav bindings if they are still present
+			opts.container.unbind( opts.closeEvents );
+
+			// unbind click handlers added when history is disabled
+			self.element.undelegate( opts.closeLinkSelector, opts.closeLinkEvents );
+
+			// remove the global mutex for popups
+			$.mobile.popup.active = undefined;
+
+			// alert users that the popup is closed
+			self._trigger( "afterclose" );
+		},
+
+		_close: function( immediate ) {
+			this._ui.container.removeClass( "ui-popup-active" );
+			this._page.removeClass( "ui-popup-open" );
+
+			this._isOpen = false;
+
+			// IME hide when popup is closed
+			this.element.find("input").blur();
+
+			// Count down to triggering "popupafterclose" - we have two prerequisites:
+			// 1. The popup window reverse animation completes (container())
+			// 2. The screen opacity animation completes (screen())
+			this._createPrereqs(
+				$.proxy( this, "_closePrereqScreen" ),
+				$.proxy( this, "_closePrereqContainer" ),
+				$.proxy( this, "_closePrereqsDone" ) );
+
+			this._animate( {
+				additionalCondition: this._ui.screen.hasClass( "in" ),
+				transition: ( immediate ? "none" : ( this._currentTransition || this.options.transition ) ),
+				classToRemove: "in",
+				screenClassToAdd: "out",
+				containerClassToAdd: "reverse out",
+				applyTransition: true,
+				prereqs: this._prereqs
+			});
+		},
+
+		_destroy: function() {
+			var self = this;
+
+			// hide and remove bindings
+			self._close();
+
+			// Put the element back to where the placeholder was and remove the "ui-popup" class
+			self._setTheme( "none" );
+			self.element
+				.insertAfter( self._ui.placeholder )
+				.removeClass( "ui-popup ui-overlay-shadow ui-corner-all" );
+			self._ui.screen.remove();
+			self._ui.container.remove();
+			self._ui.placeholder.remove();
+
+			// Unbind handlers that were bound to elements outside self.element (the window, in self case)
+			// window history back is call "_destroy method"
+			// if this method is called, all kind of window resize event has been unbind
+			/*
+			$.each( self._globalHandlers, function( idx, oneSrc ) {
+				$.each( oneSrc.handler, function( eventType, handler ) {
+					oneSrc.src.unbind( eventType, handler );
+				});
+			});
+			*/
+		},
+
+		_closePopup: function( e, data ) {
+			var parsedDst, toUrl;
+
+			if ( e.type === "pagebeforechange" && data ) {
+				if ( typeof data.toPage === "string" ) {
+					parsedDst = data.toPage;
+				} else {
+				parsedDst = data.toPage.jqmData( "url" );
+				}
+				parsedDst = $.mobile.path.parseUrl( parsedDst );
+				toUrl = parsedDst.pathname + parsedDst.search + parsedDst.hash;
+
+				if ( this._myUrl !== toUrl ) {
+					this.options.container.unbind( this.options.closeEvents );
+					this._close( true );
+				} else {
+					this._close();
+				}
+				return;	// skip normal close
+			}
+
+			this._close();
+		},
+
+		// any navigation event after a popup is opened should close the popup
+		// NOTE the pagebeforechange is bound to catch navigation events that don't
+		//      alter the url (eg, dialogs from popups)
+		_bindContainerClose: function() {
+			var self = this;
+
+			self.options.container
+				.one( self.options.closeEvents, $.proxy( self, "_closePopup" ) );
+		},
+
+		// TODO no clear deliniation of what should be here and
+		// what should be in _open. Seems to be "visual" vs "history" for now
+		open: function( options ) {
+			var self = this, opts = this.options, url, hashkey, activePage, currentIsDialog, hasHash, urlHistory;
+			// self.link = ( $(event.target).attr('data-role') === 'button') ? event.target : $(event.target).closest('[data-role="button"]')[0];
+			// make sure open is idempotent
+			if( $.mobile.popup.active ) {
+				return;
+			}
+			// set the global popup mutex
+			$.mobile.popup.active = this;
+			if( !options ) {
+				options = [];
+			}
+
+			if ( !options.link ) {
+				if ( !event ) {
+					self.positionTo = "window";
+				} else {
+					self.link = ( $(event.target).closest('a')[0] || $(event.target).closest('div')[0] );
+				}
+			} else {
+				self.link = options.link;
+			}
+			if ( event ) {
+				self.positionTo = ( options != null && options.positionTo != null ) ? options.positionTo : "origin";
+			}
+
+			if ( $(self.link).jqmData("position-to") !== "window"
+					&& self.positionTo !== "window" ) {
+
+				$(self.element).addClass("ui-ctxpopup");
+				$(self._ui.container).removeClass("ui-popup-container")
+					.addClass("ui-ctxpopup-container");
+
+				if( self.positionTo !== "origin" ) {
+					$(self._ui.arrow).hide();
+				} else {
+					$(self._ui.arrow).show();
+				}
+			} else {
+				$(self._ui.arrow).hide();
+				// apply opacity back screen
+				this._setOverlayTheme( "dim" );
+			}
+			if( !options.x
+				&& self.positionTo === "origin"
+				&& self.link ) {
+				options.x = $(self.link).offset().left + $(self.link).outerWidth() / 2;
+			}
+			if( !options.y
+				&& self.positionTo === "origin" 
+				&& self.link ) {
+				options.y = $(self.link).offset().top + $(self.link).outerHeight() / 2;
+			}
+
+			// Hadeware key style popup
+			if( $(self.element).hasClass( "ui-ctxpopup-optionmenu" ) ){
+				self.options.isHardwarePopup = true;
+				$( self._ui.arrow).hide();
+			}
+
+			// if history alteration is disabled close on navigate events
+			// and leave the url as is
+			if( !( opts.history ) ) {
+				self._open( options );
+				self._bindContainerClose();
+
+				// When histoy is disabled we have to grab the data-rel
+				// back link clicks so we can close the popup instead of
+				// relying on history to do it for us
+				self.element
+					.delegate( opts.closeLinkSelector, opts.closeLinkEvents, function( e ) {
+						self._close();
+
+						// NOTE prevent the browser and navigation handlers from
+						// working with the link's rel=back. This may cause
+						// issues for developers expecting the event to bubble
+						return false;
+					});
+
+				return;
+			}
+
+			// cache some values for min/readability
+			hashkey = $.mobile.dialogHashKey;
+			activePage = $.mobile.activePage;
+			currentIsDialog = activePage.is( ".ui-dialog" );
+			// Set active page url
+			this._myUrl = url = urlHistory.getActive().url;
+			//
+			url = $.mobile.urlHistory.getActive().url;
+			hasHash = ( url.indexOf( hashkey ) > -1 ) && !currentIsDialog;
+			urlHistory = $.mobile.urlHistory;
+
+			if ( hasHash ) {
+				self._open( options );
+				self._bindContainerClose();
+				return;
+			}
+
+			// if the current url has no dialog hash key proceed as normal
+			// otherwise, if the page is a dialog simply tack on the hash key
+			if ( url.indexOf( hashkey ) === -1 && !currentIsDialog ){
+				url = url + hashkey;
+			} else {
+				url = $.mobile.path.parseLocation().hash + hashkey;
+			}
+
+			// Tack on an extra hashkey if this is the first page and we've just reconstructed the initial hash
+			if ( urlHistory.activeIndex === 0 && url === urlHistory.initialDst ) {
+				url += hashkey;
+			}
+
+			// swallow the the initial navigation event, and bind for the next
+			opts.container.one( opts.navigateEvents, function( e ) {
+				e.preventDefault();
+				self._open( options );
+				self._bindContainerClose();
+			});
+
+			urlHistory.ignoreNextHashChange = currentIsDialog;
+
+			// Gotta love methods with 1mm args :(
+			urlHistory.addNew( url, undefined, undefined, undefined, "dialog" );
+
+			// set the new url with (or without) the new dialog hash key
+			$.mobile.path.set( url );
+		},
+
+		close: function() {
+			// make sure close is idempotent
+			if( !$.mobile.popup.active ){
+				return;
+			}
+
+			if( this.options.history ) {
+				$.mobile.back();
+			} else {
+				this._close();
+			}
+		}
+	});
+
+
+	// TODO this can be moved inside the widget
+	$.mobile.popup.handleLink = function( $link ) {
+		var closestPage = $link.closest( ":jqmData(role='page')" ),
+			scope = ( ( closestPage.length === 0 ) ? $( "body" ) : closestPage ),
+			// NOTE make sure to get only the hash, ie7 (wp7) return the absolute href
+			//      in this case ruining the element selection
+			popup = $( $.mobile.path.parseUrl($link.attr( "href" )).hash, scope[0] ),
+			offset;
+
+		if ( popup.data( "popup" ) ) {
+			offset = $link.offset();
+			popup.popup( "open", {
+				x: offset.left + $link.outerWidth() / 2,
+				y: offset.top + $link.outerHeight() / 2,
+				transition: $.mobile.getAttrFixed( $link[0], "data-" + $.mobile.ns + "transition" ),
+				positionTo: $.mobile.getAttrFixed( $link[0], "data-" + $.mobile.ns + "position-to" ),
+				link: $link
+			});
+		}
+
+		//remove after delay
+		setTimeout( function() {
+			$link.removeClass( $.mobile.activeBtnClass );
+		}, 300 );
+	};
+
+	// TODO move inside _create
+	$.mobile.$document.bind( "pagebeforechange", function( e, data ) {
+		if ( data.options.role === "popup" ) {
+			$.mobile.popup.handleLink( data.options.link );
+			e.preventDefault();
+		}
+	});
+
+	//delegate self-init widgets
+	$.delegateSelfInitWithSingleSelector( $.mobile.popup, true );
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/popup.js.orig b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/popup.js.orig
new file mode 100644
index 0000000..8faa909
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jqm/widgets/popup.js.orig
@@ -0,0 +1,963 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Popup windows
+//>>label: Popups
+//>>group: Widgets
+//>>css.theme: ../css/themes/default/jquery.mobile.theme.css
+//>>css.structure: ../css/structure/jquery.mobile.popup.css,../css/structure/jquery.mobile.transition.css,../css/structure/jquery.mobile.transition.fade.css
+
+define( [ "jquery",
+	"../jquery.mobile.widget",
+	"../jquery.mobile.support",
+	"../jquery.mobile.navigation",
+	"depend!../jquery.hashchange[jquery]" ], function( $ ) {
+//>>excludeEnd("jqmBuildExclude");
+(function( $, undefined ) {
+
+	function fitSegmentInsideSegment( winSize, segSize, offset, desired ) {
+		var ret = desired;
+
+		if ( winSize < segSize ) {
+			// Center segment if it's bigger than the window
+			ret = offset + ( winSize - segSize ) / 2;
+		} else {
+			// Otherwise center it at the desired coordinate while keeping it completely inside the window
+			ret = Math.min( Math.max( offset, desired - segSize / 2 ), offset + winSize - segSize );
+		}
+
+		return ret;
+	}
+
+	function windowCoords() {
+		var $win = $.mobile.$window;
+
+		return {
+			x: $win.scrollLeft(),
+			y: $win.scrollTop(),
+			cx: ( window.innerWidth || $win.width() ),
+			cy: ( window.innerHeight || $win.height() )
+		};
+	}
+
+	$.widget( "mobile.popup", $.mobile.widget, {
+		options: {
+			theme: null,
+			overlayTheme: null,
+			shadow: true,
+			corners: true,
+			transition: "pop",
+			positionTo: "origin",
+			tolerance: null,
+			initSelector: ":jqmData(role='popup')",
+			closeLinkSelector: "a:jqmData(rel='back')",
+			closeLinkEvents: "click.popup",
+			navigateEvents: "navigate.popup",
+			closeEvents: "navigate.popup pagebeforechange.popup",
+
+			// NOTE Windows Phone 7 has a scroll position caching issue that
+			//      requires us to disable popup history management by default
+			//      https://github.com/jquery/jquery-mobile/issues/4784
+			//
+			// NOTE this option is modified in _create!
+			history: false
+		},
+
+		_eatEventAndClose: function( e ) {
+			e.preventDefault();
+			e.stopImmediatePropagation();
+			this.close();
+			return false;
+		},
+
+		// Make sure the screen size is increased beyond the page height if the popup's causes the document to increase in height
+		_resizeScreen: function() {
+			var popupHeight = this._ui.container.outerHeight( true );
+
+			this._ui.screen.removeAttr( "style" );
+			if ( popupHeight > this._ui.screen.height() ) {
+				this._ui.screen.height( popupHeight );
+			}
+		},
+
+		_handleWindowKeyUp: function( e ) {
+			if ( this._isOpen && e.keyCode === $.mobile.keyCode.ESCAPE ) {
+				return this._eatEventAndClose( e );
+			}
+		},
+
+		_maybeRefreshTimeout: function() {
+			var winCoords = windowCoords();
+
+			if ( this._resizeData ) {
+				if ( winCoords.x === this._resizeData.winCoords.x &&
+					winCoords.y === this._resizeData.winCoords.y &&
+					winCoords.cx === this._resizeData.winCoords.cx &&
+					winCoords.cy === this._resizeData.winCoords.cy ) {
+					// timeout not refreshed
+					return false;
+				} else {
+					// clear existing timeout - it will be refreshed below
+					clearTimeout( this._resizeData.timeoutId );
+				}
+			}
+
+			this._resizeData = {
+				timeoutId: setTimeout( $.proxy( this, "_resizeTimeout" ), 200 ),
+				winCoords: winCoords
+			};
+
+			return true;
+		},
+
+		_resizeTimeout: function() {
+			if ( !this._maybeRefreshTimeout() && this.positionTo === "window" ) {
+				// effectively rapid-open the popup while leaving the screen intact
+				this._trigger( "beforeposition" );
+				this._ui.container
+					.removeClass( "ui-selectmenu-hidden" )
+					.offset( this._placementCoords( this._desiredCoords( undefined, undefined, "window" ) ) );
+
+				this._resizeScreen();
+				this._resizeData = null;
+				this._orientationchangeInProgress = false;
+			}
+		},
+
+		_handleWindowResize: function( e ) {
+			if ( this._isOpen ) {
+				// Context popup close when Window resize event
+				if( this.positionTo !== "window" ) {
+					this.close();
+					return false;
+				}
+				this._maybeRefreshTimeout();
+			}
+		},
+
+		_handleWindowOrientationchange: function( e ) {
+
+			if ( !this._orientationchangeInProgress ) {
+				// effectively rapid-close the popup while leaving the screen intact
+				this._ui.container
+					.addClass( "ui-selectmenu-hidden" )
+					.removeAttr( "style" );
+
+				this._orientationchangeInProgress = true;
+			}
+		},
+
+		_create: function() {
+			var ui = {
+					screen: $( "<div class='ui-screen-hidden ui-popup-screen'></div>" ),
+					placeholder: $( "<div style='display: none;'><!-- placeholder --></div>" ),
+					container: $( "<div class='ui-popup-container ui-selectmenu-hidden'></div>" ),
+					arrow : $("<div class='ui-arrow'></div>")
+				},
+				thisPage = this.element.closest( ".ui-page" ),
+				myId = this.element.attr( "id" ),
+				self = this;
+
+			// We need to adjust the history option to be false if there's no AJAX nav.
+			// We can't do it in the option declarations because those are run before
+			// it is determined whether there shall be AJAX nav.
+			this.options.history = this.options.history && $.mobile.ajaxEnabled && $.mobile.hashListeningEnabled;
+
+			if ( thisPage.length === 0 ) {
+				thisPage = $( "body" );
+			}
+
+			// define the container for navigation event bindings
+			// TODO this would be nice at the the mobile widget level
+			this.options.container = this.options.container || $.mobile.pageContainer;
+
+			// Apply the proto
+			thisPage.append( ui.screen );
+			ui.container.insertAfter( ui.screen );
+			// Leave a placeholder where the element used to be
+			ui.placeholder.insertAfter( this.element );
+			if ( myId ) {
+				ui.screen.attr( "id", myId + "-screen" );
+				ui.container.attr( "id", myId + "-popup" );
+				ui.placeholder.html( "<!-- placeholder for " + myId + " -->" );
+			}
+			ui.container.append( this.element );
+			ui.container.append( ui.arrow );
+			// Add class to popup element
+			this.element.addClass( "ui-popup" );
+
+			// Define instance variables
+			$.extend( this, {
+				_page: thisPage,
+				_ui: ui,
+				_fallbackTransition: "",
+				_currentTransition: false,
+				_prereqs: null,
+				_isOpen: false,
+				_tolerance: null,
+				_resizeData: null,
+				_orientationchangeInProgress: false,
+				_globalHandlers: [
+					{
+						src: $.mobile.$window,
+						handler: {
+							orientationchange: $.proxy( this, "_handleWindowOrientationchange" ),
+							resize: $.proxy( this, "_handleWindowResize" ),
+							keyup: $.proxy( this, "_handleWindowKeyUp" )
+						}
+					}
+				]
+			});
+
+			$.each( this.options, function( key, value ) {
+				// Cause initial options to be applied by their handler by temporarily setting the option to undefined
+				// - the handler then sets it to the initial value
+				self.options[ key ] = undefined;
+				self._setOption( key, value, true );
+			});
+
+			ui.screen.bind( "vclick", $.proxy( this, "_eatEventAndClose" ) );
+
+			$.each( this._globalHandlers, function( idx, value ) {
+				value.src.bind( value.handler );
+			});
+		},
+
+		_applyTheme: function( dst, theme, prefix ) {
+			var classes = ( dst.attr( "class" ) || "").split( " " ),
+				alreadyAdded = true,
+				currentTheme = null,
+				matches,
+				themeStr = String( theme );
+
+			while ( classes.length > 0 ) {
+				currentTheme = classes.pop();
+				matches = ( new RegExp( "^ui-" + prefix + "-([a-z])$" ) ).exec( currentTheme );
+				if ( matches && matches.length > 1 ) {
+					currentTheme = matches[ 1 ];
+					break;
+				} else {
+					currentTheme = null;
+				}
+			}
+
+			if ( theme !== currentTheme ) {
+				dst.removeClass( "ui-" + prefix + "-" + currentTheme );
+				if ( ! ( theme === null || theme === "none" ) ) {
+					dst.addClass( "ui-" + prefix + "-" + themeStr );
+				}
+			}
+		},
+
+		_setTheme: function( value ) {
+			this._applyTheme( this.element, value, "body" );
+		},
+
+		_setOverlayTheme: function( value ) {
+			this._applyTheme( this._ui.screen, value, "overlay" );
+
+			if ( this._isOpen ) {
+				this._ui.screen.addClass( "in" );
+			}
+		},
+
+		_setShadow: function( value ) {
+			this.element.toggleClass( "ui-overlay-shadow", value );
+		},
+
+		_setCorners: function( value ) {
+			this.element.toggleClass( "ui-corner-all", value );
+		},
+
+		_applyTransition: function( value ) {
+			this._ui.container.removeClass( this._fallbackTransition );
+			if ( value && value !== "none" ) {
+				this._fallbackTransition = $.mobile._maybeDegradeTransition( value );
+				this._ui.container.addClass( this._fallbackTransition );
+			}
+		},
+
+		_setTransition: function( value ) {
+			if ( !this._currentTransition ) {
+				this._applyTransition( value );
+			}
+		},
+
+		_setTolerance: function( value ) {
+			var tol = { t: 5, r: 5, b: 5, l: 5 };
+
+			if ( value ) {
+				var ar = String( value ).split( "," );
+
+				$.each( ar, function( idx, val ) { ar[ idx ] = parseInt( val, 10 ); } );
+
+				switch( ar.length ) {
+					// All values are to be the same
+					case 1:
+						if ( !isNaN( ar[ 0 ] ) ) {
+							tol.t = tol.r = tol.b = tol.l = ar[ 0 ];
+						}
+						break;
+
+					// The first value denotes top/bottom tolerance, and the second value denotes left/right tolerance
+					case 2:
+						if ( !isNaN( ar[ 0 ] ) ) {
+							tol.t = tol.b = ar[ 0 ];
+						}
+						if ( !isNaN( ar[ 1 ] ) ) {
+							tol.l = tol.r = ar[ 1 ];
+						}
+						break;
+
+					// The array contains values in the order top, right, bottom, left
+					case 4:
+						if ( !isNaN( ar[ 0 ] ) ) {
+							tol.t = ar[ 0 ];
+						}
+						if ( !isNaN( ar[ 1 ] ) ) {
+							tol.r = ar[ 1 ];
+						}
+						if ( !isNaN( ar[ 2 ] ) ) {
+							tol.b = ar[ 2 ];
+						}
+						if ( !isNaN( ar[ 3 ] ) ) {
+							tol.l = ar[ 3 ];
+						}
+						break;
+
+					default:
+						break;
+				}
+			}
+
+			this._tolerance = tol;
+		},
+
+		_setOption: function( key, value ) {
+			var exclusions, setter = "_set" + key.charAt( 0 ).toUpperCase() + key.slice( 1 );
+
+			if ( this[ setter ] !== undefined ) {
+				this[ setter ]( value );
+			}
+
+			// TODO REMOVE FOR 1.2.1 by moving them out to a default options object
+			exclusions = [
+				"initSelector",
+				"closeLinkSelector",
+				"closeLinkEvents",
+				"navigateEvents",
+				"closeEvents",
+				"history",
+				"container"
+			];
+
+			$.mobile.widget.prototype._setOption.apply( this, arguments );
+			if ( $.inArray( key, exclusions ) === -1 ) {
+				// Record the option change in the options and in the DOM data-* attributes
+				this.element.attr( "data-" + ( $.mobile.ns || "" ) + ( key.replace( /([A-Z])/, "-$1" ).toLowerCase() ), value );
+			}
+		},
+
+		// Try and center the overlay over the given coordinates
+		_placementCoords: function( desired ) {
+			// rectangle within which the popup must fit
+			var
+				winCoords = windowCoords(),
+				rc = {
+					x: this._tolerance.l,
+					y: winCoords.y + this._tolerance.t,
+					cx: winCoords.cx - this._tolerance.l - this._tolerance.r,
+					cy: winCoords.cy - this._tolerance.t - this._tolerance.b
+				},
+				menuSize, ret,
+				linkOffset = $(this.link).offset(),
+				positionOffsets = [],
+				correctionValue = [0,0],
+				arrayIdx;
+
+			// Clamp the width of the menu before grabbing its size
+			this._ui.container.css( "max-width", rc.cx );
+			menuSize = {
+				cx: this._ui.container.outerWidth( true ),
+				cy: this._ui.container.outerHeight( true )
+			};
+
+			// Center the menu over the desired coordinates, while not going outside
+			// the window tolerances. This will center wrt. the window if the popup is too large.
+			ret = {
+				x: fitSegmentInsideSegment( rc.cx, menuSize.cx, rc.x, desired.x ),
+				y: fitSegmentInsideSegment( rc.cy, menuSize.cy, rc.y, desired.y )
+			};
+
+			// Make sure the top of the menu is visible
+			ret.y = Math.max( 0, ret.y );
+
+			// If the height of the menu is smaller than the height of the document
+			// align the bottom with the bottom of the document
+
+			// fix for $( document ).height() bug in core 1.7.2.
+			var docEl = document.documentElement, docBody = document.body,
+				docHeight = Math.max( docEl.clientHeight, docBody.scrollHeight, docBody.offsetHeight, docEl.scrollHeight, docEl.offsetHeight );
+
+			ret.y -= Math.min( ret.y, Math.max( 0, ret.y + menuSize.cy - docHeight ) );
+
+			if ( this.positionTo !== "origin" )
+			{
+				return { left: ret.x, top: ret.y , arrowleft: 0 , arrowtop: 0};
+			}
+
+			positionOffsets = [ linkOffset.left,
+								linkOffset.top,
+								docEl.clientHeight - ( linkOffset.top + $(this.link).height() ),
+								docEl.clientWidth - ( linkOffset.left + $(this.link).width() )];
+			arrayIdx = positionOffsets.indexOf(Math.max.apply(window,positionOffsets));
+
+			switch( arrayIdx )
+			{
+				case 0:
+					correctionValue = [ -$(this.link).width() , 0];
+					arrowtop = ( linkOffset.top - ret.y  ) + ( $(this.link).height() / 2 ) - parseInt( $(this._ui.arrow).css("border-width") ) ;
+					arrowleft = menuSize.cx;
+					$(this._ui.arrow).attr( "class", "" )
+									.addClass( "ui-arrow left" )
+					break;
+				case 1:
+					correctionValue = [ 0 , -(ret.y + menuSize.cy - linkOffset.top)];
+					arrowtop = menuSize.cy - 2;
+					arrowleft = (linkOffset.left - ret.x + correctionValue[0]) + ( $(this.link).width() / 2 ) - parseInt( $(this._ui.arrow).css("border-width") ) / 2;
+					$(this._ui.arrow).attr( "class", "" )
+									.addClass( "ui-arrow bottom" );
+					break;
+				case 2:
+					correctionValue = [ 0 , ( linkOffset.top + $(this.link).height() - ret.y ) ];
+					arrowtop = - parseInt( $(this._ui.arrow).css("border-width") ) * 2 + 1;
+					arrowleft = (linkOffset.left - ret.x + correctionValue[0]) + ( $(this.link).width() / 2 ) - parseInt( $(this._ui.arrow).css("border-width") ) / 2;
+					$(this._ui.arrow).attr( "class", "" )
+									.addClass("ui-arrow top");
+					break;
+				case 3:
+					correctionValue = [ ( menuSize.cx < $(this.link).width() ) ? ( $(this.link).width() / 2 ) + ( menuSize.cx / 2) : $(this.link).width() , 0];
+					arrowtop = ( linkOffset.top - ret.y  ) + ( $(this.link).height() / 2 ) - parseInt( $(this._ui.arrow).css("border-width") ) ;
+					arrowleft = - parseInt( $(this._ui.arrow).css("border-width") ) * 2;
+					$(this._ui.arrow).attr( "class", "" )
+									.addClass("ui-arrow right");
+					break;
+			}
+
+			return { left: ret.x + correctionValue[0], top: ret.y + correctionValue[1] , arrowleft: arrowleft , arrowtop: arrowtop };
+		},
+
+		_createPrereqs: function( screenPrereq, containerPrereq, whenDone ) {
+			var self = this, prereqs;
+
+			// It is important to maintain both the local variable prereqs and self._prereqs. The local variable remains in
+			// the closure of the functions which call the callbacks passed in. The comparison between the local variable and
+			// self._prereqs is necessary, because once a function has been passed to .animationComplete() it will be called
+			// next time an animation completes, even if that's not the animation whose end the function was supposed to catch
+			// (for example, if an abort happens during the opening animation, the .animationComplete handler is not called for
+			// that animation anymore, but the handler remains attached, so it is called the next time the popup is opened
+			// - making it stale. Comparing the local variable prereqs to the widget-level variable self._prereqs ensures that
+			// callbacks triggered by a stale .animationComplete will be ignored.
+
+			prereqs = {
+				screen: $.Deferred(),
+				container: $.Deferred()
+			};
+
+			prereqs.screen.then( function() {
+				if ( prereqs === self._prereqs ) {
+					screenPrereq();
+				}
+			});
+
+			prereqs.container.then( function() {
+				if ( prereqs === self._prereqs ) {
+					containerPrereq();
+				}
+			});
+
+			$.when( prereqs.screen, prereqs.container ).done( function() {
+				if ( prereqs === self._prereqs ) {
+					self._prereqs = null;
+					whenDone();
+				}
+			});
+
+			self._prereqs = prereqs;
+		},
+
+		_animate: function( args ) {
+			// NOTE before removing the default animation of the screen
+			//      this had an animate callback that would relove the deferred
+			//      now the deferred is resolved immediately
+			// TODO remove the dependency on the screen deferred
+			this._ui.screen
+				.removeClass( args.classToRemove )
+				.addClass( args.screenClassToAdd );
+
+			args.prereqs.screen.resolve();
+
+			if ( args.transition && args.transition !== "none" ) {
+				if ( args.applyTransition ) {
+					this._applyTransition( args.transition );
+				}
+				this._ui.container
+					.animationComplete( $.proxy( args.prereqs.container, "resolve" ) )
+					.addClass( args.containerClassToAdd )
+					.removeClass( args.classToRemove );
+			} else {
+				this._ui.container.removeClass( args.classToRemove );
+				args.prereqs.container.resolve();
+			}
+		},
+
+		// The desired coordinates passed in will be returned untouched if no reference element can be identified via
+		// desiredPosition.positionTo. Nevertheless, this function ensures that its return value always contains valid
+		// x and y coordinates by specifying the center middle of the window if the coordinates are absent.
+		_desiredCoords: function( x, y, positionTo ) {
+			var dst = null, offset, winCoords = windowCoords();
+
+			self.positionTo = positionTo;
+
+			// Establish which element will serve as the reference
+			if ( positionTo && positionTo !== "origin" ) {
+				if ( positionTo === "window" ) {
+					x = winCoords.cx / 2 + winCoords.x;
+					y = winCoords.cy / 2 + winCoords.y;
+				} else {
+					try {
+						dst = $( positionTo );
+					} catch( e ) {
+						dst = null;
+					}
+					if ( dst ) {
+						dst.filter( ":visible" );
+						if ( dst.length === 0 ) {
+							dst = null;
+						}
+					}
+				}
+			}
+
+			// If an element was found, center over it
+			if ( dst ) {
+				offset = dst.offset();
+				x = offset.left + dst.outerWidth() / 2;
+				y = offset.top + dst.outerHeight() / 2;
+			}
+
+			// Make sure x and y are valid numbers - center over the window
+			if ( $.type( x ) !== "number" || isNaN( x ) ) {
+				x = winCoords.cx / 2 + winCoords.x;
+			}
+			if ( $.type( y ) !== "number" || isNaN( y ) ) {
+				y = winCoords.cy / 2 + winCoords.y;
+			}
+
+			return { x: x, y: y };
+		},
+
+		_reposition: function() {
+			var self = this,
+					coords;
+
+			if( self._isOpen
+				&& self.link
+				&& self.positionTo !== "window") {
+					coords = self._placementCoords( self._desiredCoords( $(self.link).offset().left + $(self.link).outerWidth() /2 , $(self.link).offset().top + $(self.link).outerHeight() /2 , self.positionTo || self.options.positionTo || "origin" ) );
+					self._ui.container
+						.offset( { top : coords.top } );
+			}
+		},
+
+		_openPrereqsComplete: function() {
+			var self = this;
+
+			self._ui.container.addClass( "ui-popup-active" );
+			self._isOpen = true;
+			self._resizeScreen();
+
+			// Android appears to trigger the animation complete before the popup
+			// is visible. Allowing the stack to unwind before applying focus prevents
+			// the "blue flash" of element focus in android 4.0
+			setTimeout(function(){
+				self._ui.container.attr( "tabindex", "0" ).focus();
+				self._trigger( "afteropen" );
+				self._reposition();
+			});
+		},
+
+		_open: function( options ) {
+			var coords, transition,
+				androidBlacklist = ( function() {
+					var w = window,
+						ua = navigator.userAgent,
+						// Rendering engine is Webkit, and capture major version
+						wkmatch = ua.match( /AppleWebKit\/([0-9\.]+)/ ),
+						wkversion = !!wkmatch && wkmatch[ 1 ],
+						androidmatch = ua.match( /Android (\d+(?:\.\d+))/ ),
+						andversion = !!androidmatch && androidmatch[ 1 ],
+						chromematch = ua.indexOf( "Chrome" ) > -1;
+
+					// Platform is Android, WebKit version is greater than 534.13 ( Android 3.2.1 ) and not Chrome.
+					if( androidmatch !== null && andversion === "4.0" && wkversion && wkversion > 534.13 && !chromematch ) {
+						return true;
+					}
+					return false;
+				}());
+
+			// Make sure options is defined
+			options = ( options || {} );
+
+			// Copy out the transition, because we may be overwriting it later and we don't want to pass that change back to the caller
+			transition = options.transition || this.options.transition;
+
+			// Give applications a chance to modify the contents of the container before it appears
+			this._trigger( "beforeposition" );
+
+			coords = this._placementCoords( this._desiredCoords( options.x, options.y, options.positionTo || this.options.positionTo || "origin" ) );
+
+			// Count down to triggering "popupafteropen" - we have two prerequisites:
+			// 1. The popup window animation completes (container())
+			// 2. The screen opacity animation completes (screen())
+			this._createPrereqs(
+				$.noop,
+				$.noop,
+				$.proxy( this, "_openPrereqsComplete" ) );
+
+			if ( transition ) {
+				this._currentTransition = transition;
+				this._applyTransition( transition );
+			} else {
+				transition = this.options.transition;
+			}
+
+			if ( !this.options.theme ) {
+				this._setTheme( this._page.jqmData( "theme" ) || $.mobile.getInheritedTheme( this._page, "c" ) );
+			}
+
+			this._ui.screen.removeClass( "ui-screen-hidden" );
+
+			this._ui.container
+				.removeClass( "ui-selectmenu-hidden" )
+				.offset( coords );
+			this._ui.arrow.css( { top : coords.arrowtop, left : coords.arrowleft } );
+			if ( this.options.overlayTheme && androidBlacklist ) {
+				/* TODO:
+				The native browser on Android 4.0.X ("Ice Cream Sandwich") suffers from an issue where the popup overlay appears to be z-indexed
+				above the popup itself when certain other styles exist on the same page -- namely, any element set to `position: fixed` and certain
+				types of input. These issues are reminiscent of previously uncovered bugs in older versions of Android's native browser:
+				https://github.com/scottjehl/Device-Bugs/issues/3
+
+				This fix closes the following bugs ( I use "closes" with reluctance, and stress that this issue should be revisited as soon as possible ):
+
+				https://github.com/jquery/jquery-mobile/issues/4816
+				https://github.com/jquery/jquery-mobile/issues/4844
+				https://github.com/jquery/jquery-mobile/issues/4874
+				*/
+
+				// TODO sort out why this._page isn't working
+				this.element.closest( ".ui-page" ).addClass( "ui-popup-open" );
+			}
+			this._animate({
+				additionalCondition: true,
+				transition: transition,
+				classToRemove: "",
+				screenClassToAdd: "in",
+				containerClassToAdd: "in",
+				applyTransition: false,
+				prereqs: this._prereqs
+			});
+		},
+
+		_closePrereqScreen: function() {
+			this._ui.screen
+				.removeClass( "out" )
+				.addClass( "ui-screen-hidden" );
+		},
+
+		_closePrereqContainer: function() {
+			this._ui.container
+				.removeClass( "reverse out" )
+				.addClass( "ui-selectmenu-hidden" )
+				.removeAttr( "style" );
+		},
+
+		_closePrereqsDone: function() {
+			var self = this, opts = self.options;
+
+			self._ui.container.removeAttr( "tabindex" );
+
+			// remove nav bindings if they are still present
+			opts.container.unbind( opts.closeEvents );
+
+			// unbind click handlers added when history is disabled
+			self.element.undelegate( opts.closeLinkSelector, opts.closeLinkEvents );
+
+			// remove the global mutex for popups
+			$.mobile.popup.active = undefined;
+
+			// alert users that the popup is closed
+			self._trigger( "afterclose" );
+		},
+
+		_close: function( immediate ) {
+			this._ui.container.removeClass( "ui-popup-active" );
+			this._page.removeClass( "ui-popup-open" );
+
+			this._isOpen = false;
+
+			// IME hide when popup is closed
+			this.element.find("input").blur();
+
+			// Count down to triggering "popupafterclose" - we have two prerequisites:
+			// 1. The popup window reverse animation completes (container())
+			// 2. The screen opacity animation completes (screen())
+			this._createPrereqs(
+				$.proxy( this, "_closePrereqScreen" ),
+				$.proxy( this, "_closePrereqContainer" ),
+				$.proxy( this, "_closePrereqsDone" ) );
+
+			this._animate( {
+				additionalCondition: this._ui.screen.hasClass( "in" ),
+				transition: ( immediate ? "none" : ( this._currentTransition || this.options.transition ) ),
+				classToRemove: "in",
+				screenClassToAdd: "out",
+				containerClassToAdd: "reverse out",
+				applyTransition: true,
+				prereqs: this._prereqs
+			});
+		},
+
+		_destroy: function() {
+			var self = this;
+
+			// hide and remove bindings
+			self._close();
+
+			// Put the element back to where the placeholder was and remove the "ui-popup" class
+			self._setTheme( "none" );
+			self.element
+				.insertAfter( self._ui.placeholder )
+				.removeClass( "ui-popup ui-overlay-shadow ui-corner-all" );
+			self._ui.screen.remove();
+			self._ui.container.remove();
+			self._ui.placeholder.remove();
+
+			// Unbind handlers that were bound to elements outside self.element (the window, in self case)
+			$.each( self._globalHandlers, function( idx, oneSrc ) {
+				$.each( oneSrc.handler, function( eventType, handler ) {
+					oneSrc.src.unbind( eventType, handler );
+				});
+			});
+		},
+
+		_closePopup: function( e, data ) {
+			var parsedDst, toUrl;
+
+			if ( e.type === "pagebeforechange" && data ) {
+				if ( typeof data.toPage === "string" ) {
+					parsedDst = data.toPage;
+				} else {
+				parsedDst = data.toPage.jqmData( "url" );
+				}
+				parsedDst = $.mobile.path.parseUrl( parsedDst );
+				toUrl = parsedDst.pathname + parsedDst.search + parsedDst.hash;
+
+				if ( this._myUrl !== toUrl ) {
+					this.options.container.unbind( this.options.closeEvents );
+					this._close( true );
+				} else {
+					this._close();
+				}
+				return;	// skip normal close
+			}
+
+			this._close();
+		},
+
+		// any navigation event after a popup is opened should close the popup
+		// NOTE the pagebeforechange is bound to catch navigation events that don't
+		//      alter the url (eg, dialogs from popups)
+		_bindContainerClose: function() {
+			var self = this;
+
+			self.options.container
+				.one( self.options.closeEvents, $.proxy( self, "_closePopup" ) );
+		},
+
+		// TODO no clear deliniation of what should be here and
+		// what should be in _open. Seems to be "visual" vs "history" for now
+		open: function( options ) {
+			var self = this, opts = this.options, url, hashkey, activePage, currentIsDialog, hasHash, urlHistory;
+			// self.link = ( $(event.target).attr('data-role') === 'button') ? event.target : $(event.target).closest('[data-role="button"]')[0];
+			// make sure open is idempotent
+			if( $.mobile.popup.active ) {
+				return;
+			}
+			// set the global popup mutex
+			$.mobile.popup.active = this;
+			if( !options ) {
+				options = [];
+			}
+
+			if ( !options.link ) {
+				if ( !event ) {
+					self.positionTo = "window";
+				} else {
+					self.link = ( $(event.target).closest('a')[0] || $(event.target).closest('div')[0] );
+				}
+			} else {
+				self.link = options.link;
+			}
+			if ( event ) {
+				self.positionTo = ( options != null && options.positionTo != null ) ? options.positionTo : "origin";
+			}
+
+			if ( $(self.link).jqmData("position-to") !== "window"
+					&& self.positionTo !== "window" ) {
+
+				$(self.element).addClass("ui-ctxpopup");
+				$(self._ui.container).removeClass("ui-popup-container")
+					.addClass("ui-ctxpopup-container");
+
+				if( self.positionTo !== "origin" ) {
+					$(self._ui.arrow).hide();
+				} else {
+					$(self._ui.arrow).show();
+				}
+			} else {
+				$(self._ui.arrow).hide();
+				// apply opacity back screen
+				this._setOverlayTheme( "dim" );
+			}
+			if( !options.x
+				&& self.positionTo === "origin" ) {
+				options.x = $(self.link).offset().left + $(self.link).outerWidth() / 2;
+			}
+			if( !options.y
+				&& self.positionTo === "origin" ) {
+				options.y = $(self.link).offset().top + $(self.link).outerHeight() / 2;
+			}
+			// if history alteration is disabled close on navigate events
+			// and leave the url as is
+			if( !( opts.history ) ) {
+				self._open( options );
+				self._bindContainerClose();
+
+				// When histoy is disabled we have to grab the data-rel
+				// back link clicks so we can close the popup instead of
+				// relying on history to do it for us
+				self.element
+					.delegate( opts.closeLinkSelector, opts.closeLinkEvents, function( e ) {
+						self._close();
+
+						// NOTE prevent the browser and navigation handlers from
+						// working with the link's rel=back. This may cause
+						// issues for developers expecting the event to bubble
+						return false;
+					});
+
+				return;
+			}
+
+			// cache some values for min/readability
+			hashkey = $.mobile.dialogHashKey;
+			activePage = $.mobile.activePage;
+			currentIsDialog = activePage.is( ".ui-dialog" );
+			// Set active page url
+			this._myUrl = url = urlHistory.getActive().url;
+			//
+			url = $.mobile.urlHistory.getActive().url;
+			hasHash = ( url.indexOf( hashkey ) > -1 ) && !currentIsDialog;
+			urlHistory = $.mobile.urlHistory;
+
+			if ( hasHash ) {
+				self._open( options );
+				self._bindContainerClose();
+				return;
+			}
+
+			// if the current url has no dialog hash key proceed as normal
+			// otherwise, if the page is a dialog simply tack on the hash key
+			if ( url.indexOf( hashkey ) === -1 && !currentIsDialog ){
+				url = url + hashkey;
+			} else {
+				url = $.mobile.path.parseLocation().hash + hashkey;
+			}
+
+			// Tack on an extra hashkey if this is the first page and we've just reconstructed the initial hash
+			if ( urlHistory.activeIndex === 0 && url === urlHistory.initialDst ) {
+				url += hashkey;
+			}
+
+			// swallow the the initial navigation event, and bind for the next
+			opts.container.one( opts.navigateEvents, function( e ) {
+				e.preventDefault();
+				self._open( options );
+				self._bindContainerClose();
+			});
+
+			urlHistory.ignoreNextHashChange = currentIsDialog;
+
+			// Gotta love methods with 1mm args :(
+			urlHistory.addNew( url, undefined, undefined, undefined, "dialog" );
+
+			// set the new url with (or without) the new dialog hash key
+			$.mobile.path.set( url );
+		},
+
+		close: function() {
+			// make sure close is idempotent
+			if( !$.mobile.popup.active ){
+				return;
+			}
+
+			if( this.options.history ) {
+				$.mobile.back();
+			} else {
+				this._close();
+			}
+		}
+	});
+
+
+	// TODO this can be moved inside the widget
+	$.mobile.popup.handleLink = function( $link ) {
+		var closestPage = $link.closest( ":jqmData(role='page')" ),
+			scope = ( ( closestPage.length === 0 ) ? $( "body" ) : closestPage ),
+			// NOTE make sure to get only the hash, ie7 (wp7) return the absolute href
+			//      in this case ruining the element selection
+			popup = $( $.mobile.path.parseUrl($link.attr( "href" )).hash, scope[0] ),
+			offset;
+
+		if ( popup.data( "popup" ) ) {
+			offset = $link.offset();
+			popup.popup( "open", {
+				x: offset.left + $link.outerWidth() / 2,
+				y: offset.top + $link.outerHeight() / 2,
+				transition: $.mobile.getAttrFixed( $link[0], "data-" + $.mobile.ns + "transition" ),
+				positionTo: $.mobile.getAttrFixed( $link[0], "data-" + $.mobile.ns + "position-to" ),
+				link: $link
+			});
+		}
+
+		//remove after delay
+		setTimeout( function() {
+			$link.removeClass( $.mobile.activeBtnClass );
+		}, 300 );
+	};
+
+	// TODO move inside _create
+	$.mobile.$document.bind( "pagebeforechange", function( e, data ) {
+		if ( data.options.role === "popup" ) {
+			$.mobile.popup.handleLink( data.options.link );
+			e.preventDefault();
+		}
+	});
+
+	//delegate self-init widgets
+	$.delegateSelfInitWithSingleSelector( $.mobile.popup, true );
+
+})( jQuery );
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.clrlib.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.clrlib.js
new file mode 100644
index 0000000..057fb0f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.clrlib.js
@@ -0,0 +1,230 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Color code converter
+//>>label: Color library
+//>>group: Tizen:Core
+
+define( [ 
+	'jquery',
+	'./util/ensurens',
+	'jqm/jquery.mobile.core',
+	'./jquery.mobile.tizen.core'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+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));
+    }
+});
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.configure.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.configure.js
new file mode 100644
index 0000000..d61f28c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.configure.js
@@ -0,0 +1,39 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: jQuery Mobile configuration for Tizen widgets
+//>>label: Configuration
+//>>group: Tizen:Core
+
+define( [ 
+	"jquery",
+	"jqm/jquery.mobile.core",
+	"jqm/jquery.mobile.transition",
+	"jqm/jquery.mobile.buttonMarkup"
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/*
+ * set TIZEN specific configures
+ */
+
+( function( $, window, undefined ) {
+
+	/* set default transition */
+	$.mobile.defaultPageTransition = "none";
+
+	/* depth transition */
+	$.mobile.transitionHandlers.depth = $.mobile.transitionHandlers.simultaneous;
+	$.mobile.transitionFallbacks.depth = "fade";
+
+	/* Button data-corners default value */
+	$.fn.buttonMarkup.defaults.corners = false;
+
+	/* button hover delay */
+	$.mobile.buttonMarkup.hoverDelay = 0;
+
+})( jQuery, this );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
+
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.core.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.core.js
new file mode 100644
index 0000000..c43f93c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.core.js
@@ -0,0 +1,163 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Tizen core library
+//>>label: Tizen core
+//>>group: Tizen:Core
+
+define( [ 
+	'jquery',
+	'jqm/jquery.mobile.core',
+	'./jquery.mobile.tizen.configure',
+	'./util/ensurens'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/*
+ * 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, {
+	disableSelection: function (element) {
+		this.enableSelection(
+			$(element).find('*').not( 'input, [type="text"], textarea' ),
+			'none'
+		);
+		return true;
+	},
+
+	enableSelection: function (element, value) {
+		var val;
+		switch ( value ) {
+			case 'text' :
+			case 'auto' :
+			case 'none' :
+				val = value;
+			break;
+			default :
+				val = 'auto';
+			break;
+		}
+		return $(element).css( {
+			'user-select': val,
+			'-moz-user-select': val,
+			'-webkit-user-select': val,
+			'-o-user-select': val,
+			'-ms-transform': val
+		} );
+    },
+
+    disableContextMenu: function(element) {
+	var self = this;
+	$(element).find('*').each( function() {
+		if( ( $(this).get(0).tagName !== 'INPUT' &&
+			$(this).attr("type") !== 'text' ) &&
+			$(this).get(0).tagName !== 'TEXTAREA' ) {
+			self._disableContextMenu( this );
+		}
+	} );
+    },
+
+    _disableContextMenu: function(element) {
+
+	$(element).each( function() {
+		$(this).bind("contextmenu", function( event ) {
+			return false;
+		} );
+	} );
+    },
+
+    enableContextMenu: function(element) {
+	$(element).each( function() {
+		$(this).unbind( "contextmenu" );
+	} );
+    },
+
+    // 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;
+    }
+});
+
+})();
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.full.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.full.js
new file mode 100644
index 0000000..7af1679
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.full.js
@@ -0,0 +1,75 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Config file to build whole tizen web-ui-fw
+
+define( [
+	"jquery", //make sure that jqeru is loaded before libraries that don"t use requirejs
+	"libs/jquery.easing.1.3",
+	"jqm/widgets/loader",
+	"jqm/jquery.mobile.navigation",
+	"jqm/jquery.mobile.navigation.pushstate",
+	"jqm/jquery.mobile.transitions",
+	"jqm/jquery.mobile.degradeInputs",
+	"jqm/widgets/dialog",
+	"jqm/widgets/page.sections",
+	"jqm/widgets/collapsible",
+	"jqm/widgets/collapsibleSet",
+	"jqm/jquery.mobile.fieldContain",
+	"jqm/widgets/navbar",
+	"jqm/widgets/listview",
+	"jqm/widgets/listview.filter",
+	"jqm/widgets/listview.autodividers",
+	"jqm/jquery.mobile.nojs",
+	"jqm/widgets/forms/checkboxradio",
+	"jqm/widgets/forms/button",
+	"jqm/widgets/forms/slider",
+	"jqm/widgets/forms/textinput",
+	"jqm/widgets/forms/select.custom",
+	"jqm/widgets/forms/select",
+	"jqm/jquery.mobile.buttonMarkup",
+	"jqm/jquery.mobile.controlGroup",
+	"jqm/jquery.mobile.links",
+	"jqm/widgets/fixedToolbar",
+	"jqm/widgets/popup",
+	"jqm/jquery.mobile.zoom",
+	"jqm/jquery.mobile.zoom.iosorientationfix",
+	"jqm/jquery.mobile.init",
+	"./jquery.mobile.tizen.label",
+	"./jquery.mobile.tizen.clrlib",
+	"./jquery.mobile.tizen.core",
+	"./jquery.mobile.tizen.loader",
+	"./jquery.mobile.tizen.pinch",
+	"./jquery.mobile.tizen.scrollview",
+	"./widgets/jquery.mobile.tizen.circularview",
+	"./widgets/jquery.mobile.tizen.datetimepicker",
+	"./widgets/jquery.mobile.tizen.extendablelist",
+	"./widgets/jquery.mobile.tizen.fastscroll",
+	"./widgets/jquery.mobile.tizen.gallery",
+	"./widgets/jquery.mobile.tizen.gallery3d",
+	"./widgets/jquery.mobile.tizen.listdivider",
+	"./widgets/jquery.mobile.tizen.multimediaview",
+	"./widgets/jquery.mobile.tizen.notification",
+	"./widgets/jquery.mobile.tizen.pagelayout",
+	"./widgets/jquery.mobile.tizen.popupwindow.ctxpopup",
+	"./widgets/jquery.mobile.tizen.popupwindow",
+	"./widgets/jquery.mobile.tizen.progress",
+	"./widgets/jquery.mobile.tizen.progressbar",
+	"./widgets/jquery.mobile.tizen.scrollview.handler",
+	"./widgets/jquery.mobile.tizen.searchbar",
+	"./widgets/jquery.mobile.tizen.slider",
+	"./widgets/jquery.mobile.tizen.splitview",
+	"./widgets/jquery.mobile.tizen.swipe",
+	"./widgets/jquery.mobile.tizen.tabbar",
+	"./widgets/jquery.mobile.tizen.tokentextarea",
+	"./widgets/jquery.mobile.tizen.triangle",
+	"./widgets/jquery.mobile.tizen.virtualgrid",
+	"./widgets/jquery.mobile.tizen.virtuallistview",
+	"./widgets/jquery.mobile.tizen.widgetex",
+	], function ( ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+//Version: __version__
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.label.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.label.js
new file mode 100644
index 0000000..aadc014
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.label.js
@@ -0,0 +1,58 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Add markup for labels
+//>>label: Label
+//>>group: Tizen:Core
+
+define( [
+	"jquery",
+	"jqm/jquery.mobile.core"
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/*
+ *
+ * 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);
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
+
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.loader.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.loader.js
new file mode 100644
index 0000000..a313d41
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.loader.js
@@ -0,0 +1,526 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Loader doing theme loading, viewport setting, globalize loading, etc.
+//>>label: Loader
+//>>group: Tizen:Core
+
+define( [ 
+	'jquery',
+	'libs/globalize',
+	"jqm/jquery.mobile.init",
+
+	// used by theme.js
+	"jqm/widgets/loader",
+	"jqm/widgets/listview",
+	"jqm/widgets/collapsible",
+	"jqm/widgets/forms/button",
+
+	"jqm/widgets/page.sections",
+
+	'./jquery.mobile.tizen.configure',
+	'./jquery.mobile.tizen.core',
+	'widgets/jquery.mobile.tizen.pagelayout'
+	], function ( jQuery, Globalize ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/**
+ * @class core
+ * loader.js
+ *
+ * Youmin Ha <youmin.ha@samsung.com>
+ *
+ *
+ */
+/*
+	Web UI scaling concept in Tizen Web UI
+
+Generally, web applications must be designed to be showed acceptable on various size and resolution of screens, and web winsets have to be scaled well.  Tizen Web UI Framework supports various viewport settings, and Tizen Web UI widgets are designed to be scalable on various screen sizes.  In order to make web applications scalable on many devices which have different screen size, it is necessary to understand how mobile web browsers deal with screen resolution, and how Tizen Web UI Framework supports scaling for web applications.
+
+
+* Viewport on mobile web browser
+
+Viewport is an area showing web content on the browser.  Unlike desktop browsers, mobile browsers support logical viewport seting, which means that application can set viewport width/height and zoom level by itself.
+The very important thing that to be remembered is that the viewport resolution in pixel is 'Logical', not physical.  For example, if the viewport width is set to 480 on a mobile device having 720px screen width, the viewport width is considered to 480px logically. All elements put on right side from 480px horizontal position will not be shown on the viewport.
+Most mobile browsers set viewport with given content attribute with <meta name="viewport" content="..."> tag in <head> section in the application source html, whereas desktop browsers ignore the tag.
+Detailed usage of viewport meta tag is found in here: http://www.w3.org/TR/mwabp/#bp-viewport
+
+
+* Viewport setting by application developers
+
+When developers write <meta name="viewport" content="..."> in the <head> section of the web application HTML file, Tizen Web UI Framework does not add another viewport meta tag, nor modify developer-defined viewport.
+
+
+* Automatic viewport setting by Tizen Web UI Framework
+
+If developers do not give a viewport meta tag, Tizen Web UI Framework automatically add a viewport meta tag with default viewport setting.
+
+
+* Portrait/landscape mode
+
+
+* Tizen Web UI widgets scaling
+
+
+ */
+( function ($, Globalize, window, undefined) {
+
+	var tizen = {
+		libFileName : "tizen-web-ui-fw(.custom|.full)?(.min)?.js",
+
+		frameworkData : {
+			rootDir: '/usr/share/tizen-web-ui-fw',
+			version: '0.2',
+			theme: "tizen-black",
+			viewportWidth: "device-width",
+			viewportScale: false,
+
+			defaultFontSize: 22,
+			minified: false,
+			deviceCapa: { inputKeyBack: true, inputKeyMenu: true },
+			debug: false
+		},
+
+		log : {
+			debug : function ( msg ) {
+				if ( tizen.frameworkData.debug ) {
+					console.log( msg );
+				}
+			},
+			warn : function ( msg ) {
+				console.warn( msg );
+			},
+			error : function ( msg ) {
+				console.error( msg );
+			},
+			alert : function ( msg ) {
+				window.alert( msg );
+			}
+		},
+
+		util : {
+
+			loadScriptSync : function ( scriptPath, successCB, errorCB ) {
+				$.ajax( {
+					url: scriptPath,
+					dataType: 'script',
+					async: false,
+					crossDomain: false,
+					success: successCB,
+					error: function ( jqXHR, textStatus, errorThrown ) {
+						if ( errorCB ) {
+							errorCB( jqXHR, textStatus, errorThrown );
+						} else {
+							var ignoreStatusList = [ 404 ],  // 404: not found
+								errmsg = ( 'Error while loading ' + scriptPath + '\n' + jqXHR.status + ':' + jqXHR.statusText );
+							if ( -1 == $.inArray( jqXHR.status, ignoreStatusList ) ) {
+								tizen.log.alert( errmsg );
+							} else {
+								tizen.log.warn( errmsg );
+							}
+						}
+					}
+				} );
+			},
+			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];
+				if ( head ) {
+					$( head ).prepend( elem );
+				}
+			},
+			makeLink : function ( href ) {
+				var cssLink = document.createElement( 'link' );
+				cssLink.setAttribute( 'rel', 'stylesheet' );
+				cssLink.setAttribute( 'href', href );
+				cssLink.setAttribute( 'name', 'tizen-theme' );
+				return cssLink;
+			},
+			load: function ( path ) {
+				var head = document.getElementsByTagName( 'head' )[0],
+					cssLinks = head.getElementsByTagName( 'link' ),
+					idx,
+					l = null;
+				// Find css link element
+				for ( idx = 0; idx < cssLinks.length; idx++ ) {
+					if ( cssLinks[idx].getAttribute( 'rel' ) != "stylesheet" ) {
+						continue;
+					}
+					if ( cssLinks[idx].getAttribute( 'name' ) == "tizen-theme"
+							|| cssLinks[idx].getAttribute( 'href' ) == path ) {
+						l = cssLinks[idx];
+						break;
+					}
+				}
+				if ( l ) {	// Found the link element!
+					if ( l.getAttribute( 'href' ) == path ) {
+						tizen.log.debug( "Theme is already loaded. Skip theme loading in the framework." );
+					} else {
+						l.setAttribute( 'href', path );
+					}
+				} else {
+					this.addElementToHead( this.makeLink( path ) );
+				}
+			}
+		},
+
+		getParams: function ( ) {
+			/* Get data-* params from <script> tag, and set tizen.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;
+/*
+			function getTizenTheme( ) {
+				var t = navigator.theme ? navigator.theme.split( ':' )[0] : null;
+				if ( t ) {
+					t = t.replace('-hd', '');
+					if ( ! t.match( /^tizen-/ ) ) {
+						t = 'tizen-' + t;
+					}
+				}
+				return t;
+			}
+*/
+			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 ).replace( /^file:(\/\/)?/, '' );
+					this.frameworkData.version = elem.getAttribute( 'data-framework-version' )
+						|| tokens[ tokens.length + version_idx ]
+						|| this.frameworkData.version;
+					this.frameworkData.theme = elem.getAttribute( 'data-framework-theme' )
+						//|| getTizenTheme( )
+						|| this.frameworkData.theme;
+					this.frameworkData.viewportWidth = elem.getAttribute( 'data-framework-viewport-width' )
+						|| this.frameworkData.viewportWidth;
+					this.frameworkData.viewportScale =
+						"true" === elem.getAttribute( 'data-framework-viewport-scale' ) ? true
+						: this.frameworkData.viewportScale;
+					this.frameworkData.minified = src.search(/\.min\.js$/) > -1 ? true : false;
+					this.frameworkData.debug = "true" === elem.getAttribute( 'data-framework-debug' ) ? true
+						: this.frameworkData.debug;
+					foundScriptTag = true;
+					break;
+				}
+			}
+			return foundScriptTag;
+		},
+
+		loadTheme: function ( theme ) {
+			var themePath,
+			cssPath,
+			jsPath;
+
+			if ( ! theme ) {
+				theme = tizen.frameworkData.theme;
+			}
+			
+			themePath = tizen.frameworkData.rootDir + '/' + tizen.frameworkData.version + '/themes/' + theme;
+			
+			jsPath = themePath + '/theme.js';
+	
+			if ( tizen.frameworkData.minified ) {
+				cssPath = themePath + '/tizen-web-ui-fw-theme.min.css';
+			} else {
+				cssPath = themePath + '/tizen-web-ui-fw-theme.css';
+			}
+			tizen.css.load( cssPath );
+			tizen.util.loadScriptSync( jsPath );
+		},
+
+		/** Load Globalize culture file, and set default culture.
+		 *  @param[in]  language  (optional) Language code. ex) en-US, en, ko-KR, ko
+		 *                        If language is not given, read language from html 'lang' attribute, 
+		 *                        or from system setting.
+		 *  @param[in]  cultureDic (optional) Dictionary having language code->
+		 */
+		loadGlobalizeCulture: function ( language, cultureDic ) {
+			var self = this,
+				cFPath,
+				lang,
+				mockJSXHR;
+
+			function getLang ( language ) {
+				var 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!
+				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( '-' );
+					}
+				}
+				// NOTE: 'en' to 'en-US', because globalize has no 'en' culture file.
+				lang = lang == 'en' ? 'en-US' : lang;
+				return lang;
+			}
+
+			function getNeutralLang ( lang ) {
+				var neutralLangIdx = lang.lastIndexOf( '-' ),
+					neutralLang;
+				if ( neutralLangIdx != -1 ) {
+					neutralLang = lang.substr( 0, neutralLangIdx );
+				}
+				return neutralLang;
+			}
+
+			function getCultureFilePath ( lang, cFDic ) {
+				var cFPath = null;	// error value
+
+				if ( "string" != typeof lang ) {
+					return null;
+				}
+				if ( cFDic && cFDic[lang] ) {
+					cFPath = cFDic[lang];
+				} else {
+					// Default Globalize culture file path
+					cFPath = [
+						self.frameworkData.rootDir,
+						self.frameworkData.version,
+						'js',
+						'cultures',
+						['globalize.culture.', lang, '.js'].join( '' )
+					].join( '/' );
+				}
+				return cFPath;
+			}
+
+			function printLoadError( cFPath, jqXHR ) {
+				tizen.log.error( "Error " + jqXHR.status + ": " + jqXHR.statusText
+						+ "::Culture file (" + cFPath + ") is failed to load.");
+			}
+
+			function loadCultureFile ( cFPath, errCB ) {
+				function _successCB ( ) {
+					tizen.log.debug( "Culture file (" + cFPath + ") is loaded successfully." );
+				}
+				function _errCB ( jqXHR, textStatus, err ) {
+					if ( errCB ) {
+						errCB( jqXHR, textStatus, err );
+					} else {
+						printLoadError( cFPath, jqXHR );
+					}
+				}
+
+				if ( ! cFPath ) {	// Invalid cFPath -> Regard it as '404 Not Found' error.
+					mockJSXHR = {
+						status: 404,
+						statusText: "Not Found"
+					};
+					_errCB( mockJSXHR, null, null );
+				} else {
+					$.ajax( {
+						url: cFPath,
+						dataType: 'script',
+						cache: true,
+						async: false,
+						success: _successCB,
+						error: _errCB
+					} );
+				}
+			}
+
+			lang = getLang( language );
+			cFPath = getCultureFilePath( lang, cultureDic );
+			loadCultureFile( cFPath,
+				function ( jqXHR, textStatus, err ) {
+					if ( jqXHR.status == 404 ) {
+						// If culture file is not found, try once more with neutral lang.
+						var nLang = getNeutralLang( lang ),
+							ncFPath = getCultureFilePath( nLang, cultureDic );
+						loadCultureFile( ncFPath, null );
+					} else {
+						printLoadError( cFPath, jqXHR );
+					}
+				} );
+
+			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 );
+		},
+		/**
+		 * Load custom globalize culture file
+		 * Find current system language, and load appropriate culture file from given colture file list.
+		 *
+		 * @param[in]	cultureDic	collection of 'language':'culture file path' key-val pair.
+		 * @example
+		 * var myCultures = {
+		 *	"en"    : "culture/en.js",
+		 *	"fr"    : "culture/fr.js",
+		 *	"ko-KR" : "culture/ko-KR.js"
+		 * };
+		 * loadCultomGlobalizeCulture( myCultures );
+		 *
+		 * ex) culture/fr.js
+		 * -------------------------------
+		 * Globalize.addCultureInfo( "fr", {
+		 *   messages: {
+		 *     "hello" : "bonjour",
+		 *     "translate" : "traduire"
+		 *   }
+		 * } );
+		 * -------------------------------
+		 */
+		loadCustomGlobalizeCulture: function ( cultureDic ) {
+			tizen.loadGlobalizeCulture( null, cultureDic );
+		},
+
+		/** Set viewport meta tag for mobile devices.
+		 *
+		 * @param[in]	viewportWidth	viewport width. "device-width" is OK.
+		 */
+		setViewport: function ( viewportWidth ) {
+			var meta = null,
+				head,
+				content;
+
+			// Do nothing if viewport setting code is already in the code.
+			$( "meta[name=viewport]" ).each( function ( ) {
+				meta = this;
+				return;
+			});
+			if ( meta ) {	// Found custom viewport!
+				content = $( meta ).prop( "content" );
+				viewportWidth = content.replace( /.*width=(device-width|\d+)\s*,?.*$/gi, "$1" );
+				tizen.log.debug( "Viewport is set to '" + viewportWidth + "' in a meta tag. Framework skips viewport setting." );
+			} else {
+				// Create a meta tag
+				meta = document.createElement( "meta" );
+				if ( meta ) {
+					meta.name = "viewport";
+					content = "width=" + viewportWidth + ", user-scalable=no";
+					if ( ! isNaN( viewportWidth ) ) {
+						// Fix scale to 1.0, if viewport width is set to fixed value.
+						// NOTE: Works wrong in Tizen browser!
+						//content = [ content, ", initial-scale=1.0, maximum-scale=1.0" ].join( "" );
+					}
+					meta.content = content;
+					tizen.log.debug( content );
+					head = document.getElementsByTagName( 'head' ).item( 0 );
+					head.insertBefore( meta, head.firstChild );
+				}
+			}
+			return viewportWidth;
+		},
+
+		/**	Read body's font-size, scale it, and reset it.
+		 *  param[in]	desired font-size / base font-size.
+		 */
+		scaleBaseFontSize: function ( themeDefaultFontSize, ratio ) {
+			tizen.log.debug( "themedefaultfont size: " + themeDefaultFontSize + ", ratio: " + ratio );
+			var scaledFontSize = Math.max( Math.floor( themeDefaultFontSize * ratio ), 4 );
+
+			$( 'html' ).css( { 'font-size': scaledFontSize + "px" } );
+			tizen.log.debug( 'html:font size is set to ' + scaledFontSize );
+			$( document ).ready( function ( ) {
+				$( '.ui-mobile' ).children( 'body' ).css( { 'font-size': scaledFontSize + "px" } );
+			} );
+		},
+
+		setScaling: function ( ) {
+			var viewportWidth = this.frameworkData.viewportWidth,
+				themeDefaultFontSize = this.frameworkData.defaultFontSize, // comes from theme.js
+				ratio = 1;
+
+			// Keep original font size
+			$( 'body' ).attr( 'data-tizen-theme-default-font-size', themeDefaultFontSize );
+
+			if ( !tizen.util.isMobileBrowser() ) {
+				return;
+			}
+
+			// Legacy support: tizen.frameworkData.viewportScale
+			if ( this.frameworkData.viewportScale == true ) {
+				viewportWidth = "screen-width";
+			}
+
+			// screen-width support
+			if ( "screen-width" == viewportWidth ) {
+				if ( window.self == window.top ) {
+					// Top frame: for target. Use window.outerWidth.
+					viewportWidth = window.outerWidth;
+				} else {
+					// iframe: for web simulator. Use clientWidth.
+					viewportWidth = document.documentElement.clientWidth;
+				}
+			}
+
+			// set viewport meta tag
+			viewportWidth = this.setViewport( viewportWidth );	// If custom viewport setting exists, get viewport width
+
+			if ( viewportWidth == "device-width" ) {
+				// Do nothing!
+			} else {	// fixed width!
+				ratio = parseFloat( viewportWidth / this.frameworkData.defaultViewportWidth );
+				this.scaleBaseFontSize( themeDefaultFontSize, ratio );
+			}
+		}
+	};
+
+	function export2TizenNS ( $, tizen ) {
+		if ( !$.tizen ) {
+			$.tizen = { };
+		}
+
+		$.tizen.frameworkData = tizen.frameworkData;
+		$.tizen.loadCustomGlobalizeCulture = tizen.loadCustomGlobalizeCulture;
+		$.tizen.loadTheme = tizen.loadTheme;
+
+		$.tizen.__tizen__ = tizen;	// for unit-test
+	}
+
+	export2TizenNS( $, tizen );
+
+	tizen.getParams( );
+	tizen.loadTheme( );
+	tizen.setScaling( );	// Run after loadTheme(), for the default font size.
+	tizen.setGlobalize( );
+	// Turn off JQM's auto initialization option.
+	// NOTE: This job must be done before domready.
+	$.mobile.autoInitializePage = false;
+
+	$(document).ready( function ( ) {
+		$.mobile.initializePage( );
+	});
+
+} ( jQuery, Globalize, window ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.loadprototype.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.loadprototype.js
new file mode 100644
index 0000000..b14b860
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.loadprototype.js
@@ -0,0 +1,152 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Loads widget's prototype
+//>>label: Widget prototype loader
+//>>group: Tizen:Core
+
+define( [ ], function ( ) {
+//>>excludeEnd("jqmBuildExclude");
+
+(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);
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.pinch.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.pinch.js
new file mode 100644
index 0000000..cece62a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.pinch.js
@@ -0,0 +1,373 @@
+/* ***************************************************************************
+	Flora License
+
+	Version 1.1, April, 2013
+
+	http://floralicense.org/license/
+
+	TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+	1. Definitions.
+
+	"License" shall mean the terms and conditions for use, reproduction,
+	and distribution as defined by Sections 1 through 9 of this document.
+
+	"Licensor" shall mean the copyright owner or entity authorized by
+	the copyright owner that is granting the License.
+
+	"Legal Entity" shall mean the union of the acting entity and
+	all other entities that control, are controlled by, or are
+	under common control with that entity. For the purposes of
+	this definition, "control" means (i) the power, direct or indirect,
+	to cause the direction or management of such entity,
+	whether by contract or otherwise, or (ii) ownership of fifty percent (50%)
+	or more of the outstanding shares, or (iii) beneficial ownership of
+	such entity.
+
+	"You" (or "Your") shall mean an individual or Legal Entity
+	exercising permissions granted by this License.
+
+	"Source" form shall mean the preferred form for making modifications,
+	including but not limited to software source code, documentation source,
+	and configuration files.
+
+	"Object" form shall mean any form resulting from mechanical
+	transformation or translation of a Source form, including but
+	not limited to compiled object code, generated documentation,
+	and conversions to other media types.
+
+	"Work" shall mean the work of authorship, whether in Source or Object form,
+	made available under the License, as indicated by a copyright notice
+	that is included in or attached to the work (an example is provided
+	in the Appendix below).
+
+	"Derivative Works" shall mean any work, whether in Source or Object form,
+	that is based on (or derived from) the Work and for which the editorial
+	revisions, annotations, elaborations, or other modifications represent,
+	as a whole, an original work of authorship. For the purposes of this License,
+	Derivative Works shall not include works that remain separable from,
+	or merely link (or bind by name) to the interfaces of, the Work and
+	Derivative Works thereof.
+
+	"Contribution" shall mean any work of authorship, including the original
+	version of the Work and any modifications or additions to that Work or
+	Derivative Works thereof, that is intentionally submitted to Licensor
+	for inclusion in the Work by the copyright owner or by an individual or
+	Legal Entity authorized to submit on behalf of the copyright owner.
+	For the purposes of this definition, "submitted" means any form of
+	electronic, verbal, or written communication sent to the Licensor or
+	its representatives, including but not limited to communication on
+	electronic mailing lists, source code control systems, and issue
+	tracking systems that are managed by, or on behalf of, the Licensor
+	for the purpose of discussing and improving the Work, but excluding
+	communication that is conspicuously marked or otherwise designated
+	in writing by the copyright owner as "Not a Contribution."
+
+	"Contributor" shall mean Licensor and any individual or Legal Entity
+	on behalf of whom a Contribution has been received by Licensor and
+	subsequently incorporated within the Work.
+
+	"Tizen Certified Platform" shall mean a software platform that complies
+	with the standards set forth in the Tizen Compliance Specification
+	and passes the Tizen Compliance Tests as defined from time to time
+	by the Tizen Technical Steering Group and certified by the Tizen
+	Association or its designated agent.
+
+	2. Grant of Copyright License.  Subject to the terms and conditions of
+	this License, each Contributor hereby grants to You a perpetual,
+	worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+	copyright license to reproduce, prepare Derivative Works of,
+	publicly display, publicly perform, sublicense, and distribute the
+	Work and such Derivative Works in Source or Object form.
+
+	3. Grant of Patent License.  Subject to the terms and conditions of
+	this License, each Contributor hereby grants to You a perpetual,
+	worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+	(except as stated in this section) patent license to make, have made,
+	use, offer to sell, sell, import, and otherwise transfer the Work
+	solely as incorporated into a Tizen Certified Platform, where such
+	license applies only to those patent claims licensable by such
+	Contributor that are necessarily infringed by their Contribution(s)
+	alone or by combination of their Contribution(s) with the Work solely
+	as incorporated into a Tizen Certified Platform to which such
+	Contribution(s) was submitted. If You institute patent litigation
+	against any entity (including a cross-claim or counterclaim
+	in a lawsuit) alleging that the Work or a Contribution incorporated
+	within the Work constitutes direct or contributory patent infringement,
+	then any patent licenses granted to You under this License for that
+	Work shall terminate as of the date such litigation is filed.
+
+	4. Redistribution.  You may reproduce and distribute copies of the
+	Work or Derivative Works thereof pursuant to the copyright license
+	above, in any medium, with or without modifications, and in Source or
+	Object form, provided that You meet the following conditions:
+
+	  1. You must give any other recipients of the Work or Derivative Works
+		 a copy of this License; and
+	  2. You must cause any modified files to carry prominent notices stating
+		 that You changed the files; and
+	  3. You must retain, in the Source form of any Derivative Works that
+		 You distribute, all copyright, patent, trademark, and attribution
+		 notices from the Source form of the Work, excluding those notices
+		 that do not pertain to any part of the Derivative Works; and
+	  4. If the Work includes a "NOTICE" text file as part of its distribution,
+		 then any Derivative Works that You distribute must include a readable
+		 copy of the attribution notices contained within such NOTICE file,
+		 excluding those notices that do not pertain to any part of
+		 the Derivative Works, in at least one of the following places:
+		 within a NOTICE text file distributed as part of the Derivative Works;
+		 within the Source form or documentation, if provided along with the
+		 Derivative Works; or, within a display generated by the Derivative Works,
+		 if and wherever such third-party notices normally appear.
+		 The contents of the NOTICE file are for informational purposes only
+		 and do not modify the License.
+
+	You may add Your own attribution notices within Derivative Works
+	that You distribute, alongside or as an addendum to the NOTICE text
+	from the Work, provided that such additional attribution notices
+	cannot be construed as modifying the License. You may add Your own
+	copyright statement to Your modifications and may provide additional or
+	different license terms and conditions for use, reproduction, or
+	distribution of Your modifications, or for any such Derivative Works
+	as a whole, provided Your use, reproduction, and distribution of
+	the Work otherwise complies with the conditions stated in this License.
+
+	5. Submission of Contributions. Unless You explicitly state otherwise,
+	any Contribution intentionally submitted for inclusion in the Work
+	by You to the Licensor shall be under the terms and conditions of
+	this License, without any additional terms or conditions.
+	Notwithstanding the above, nothing herein shall supersede or modify
+	the terms of any separate license agreement you may have executed
+	with Licensor regarding such Contributions.
+
+	6. Trademarks.  This License does not grant permission to use the trade
+	names, trademarks, service marks, or product names of the Licensor,
+	except as required for reasonable and customary use in describing the
+	origin of the Work and reproducing the content of the NOTICE file.
+
+	7. Disclaimer of Warranty. Unless required by applicable law or
+	agreed to in writing, Licensor provides the Work (and each
+	Contributor provides its Contributions) on an "AS IS" BASIS,
+	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+	implied, including, without limitation, any warranties or conditions
+	of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+	PARTICULAR PURPOSE. You are solely responsible for determining the
+	appropriateness of using or redistributing the Work and assume any
+	risks associated with Your exercise of permissions under this License.
+
+	8. Limitation of Liability. In no event and under no legal theory,
+	whether in tort (including negligence), contract, or otherwise,
+	unless required by applicable law (such as deliberate and grossly
+	negligent acts) or agreed to in writing, shall any Contributor be
+	liable to You for damages, including any direct, indirect, special,
+	incidental, or consequential damages of any character arising as a
+	result of this License or out of the use or inability to use the
+	Work (including but not limited to damages for loss of goodwill,
+	work stoppage, computer failure or malfunction, or any and all
+	other commercial damages or losses), even if such Contributor
+	has been advised of the possibility of such damages.
+
+	9. Accepting Warranty or Additional Liability. While redistributing
+	the Work or Derivative Works thereof, You may choose to offer,
+	and charge a fee for, acceptance of support, warranty, indemnity,
+	or other liability obligations and/or rights consistent with this
+	License. However, in accepting such obligations, You may act only
+	on Your own behalf and on Your sole responsibility, not on behalf
+	of any other Contributor, and only if You agree to indemnify,
+	defend, and hold each Contributor harmless for any liability
+	incurred by, or claims asserted against, such Contributor by reason
+	of your accepting any such warranty or additional liability.
+
+	END OF TERMS AND CONDITIONS
+
+	APPENDIX: How to apply the Flora License to your work
+
+	To apply the Flora License to your work, attach the following
+	boilerplate notice, with the fields enclosed by brackets "[]"
+	replaced with your own identifying information. (Don't include
+	the brackets!) The text should be enclosed in the appropriate
+	comment syntax for the file format. We also recommend that a
+	file or class name and description of purpose be included on the
+	same "printed page" as the copyright notice for easier
+	identification within third-party archives.
+
+	   Copyright [yyyy] [name of copyright owner]
+
+	   Licensed under the Flora License, Version 1.1 (the "License");
+	   you may not use this file except in compliance with the License.
+	   You may obtain a copy of the License at
+
+		   http://floralicense.org/license/
+
+	   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.
+
+ *	Author: Minkyu Kang <mk7.kang@samsung.com>
+ */
+
+/*
+ * Pinch Event
+ *
+ * Events
+ *	pinchstart: triggered when start the touched two points
+ *	pinch: triggered when move the touch point after pinchstart event occured
+ *	pinchend: triggered when touchend event after pinchstart event occured
+ *
+ * Parameters
+ *	point: touched points
+ *	ratio: origin point-to-current point ratio for moving distance
+ *
+ *	$("#pinch").bind("pinch", function (e, p) {
+ *		console.log("point[0].x: " + p.point[0].x);
+ *		console.log("point[0].y: " + p.point[0].y);
+ *		console.log("point[1].x: " + p.point[1].x);
+ *		console.log("point[1].y: " + p.point[1].y);
+ *		console.log("ratio: " + p.ratio);
+ *	});
+ *
+ * Options
+ *	$.mobile.pinch.enabled: true or false
+ *	$.mobile.pinch.min: minimum value of ratio
+ *	$.mobile.pinch.max: maximum value of ratio
+ *	$.mobile.pinch.factor: scale factor of ratio
+ *	$.mobile.pinch.threshold: move threshold of ratio
+ *	$.mobile.pinch.interval: interval for pinch event
+ */
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Pinch Event
+//>>label: Pinch Event
+//>>group: Tizen:Core
+
+define( [ 
+	'jquery',
+	'jqm/jquery.mobile.core'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+( function( $, window, undefined ) {
+
+pinch_event = {
+	setup: function () {
+		var thisObject = this,
+			$this = $( thisObject );
+
+		if ( !$.mobile.support.touch ) {
+			return;
+		}
+
+		function getSize( point ) {
+			var x = point[0].x - point[1].x,
+				y = point[0].y - point[1].y;
+
+			return Math.abs( x * y );
+		}
+
+		function getParameter( point, ratio ) {
+			return { point: point, ratio: ratio };
+		}
+
+		$this.bind( "touchstart", function ( event ) {
+			var data = event.originalEvent.touches,
+				origin,
+				last_ratio = 1,
+				processing = false;
+
+			if ( !$.mobile.pinch.enabled ) {
+				return;
+			}
+
+			if ( data.length != 2 ) {
+				return;
+			}
+
+			origin = [
+					{ x: data[0].pageX, y: data[0].pageY },
+					{ x: data[1].pageX, y: data[1].pageY }
+			];
+
+			$( event.target ).trigger( "pinchstart", getParameter( origin, undefined ) );
+
+			function pinchHandler( event ) {
+				var data = event.originalEvent.touches,
+					current,
+					ratio,
+					delta,
+					factor = $( window ).width() / $.mobile.pinch.factor;
+
+				if ( processing ) {
+					return;
+				}
+
+				if ( !origin ) {
+					return;
+				}
+
+				current = [
+						{ x: data[0].pageX, y: data[0].pageY },
+						{ x: data[1].pageX, y: data[1].pageY }
+				];
+
+				delta = Math.sqrt( getSize( current ) / getSize( origin )  ) ;
+				if( delta ) {
+					ratio = delta;
+				}
+
+				if ( ratio < $.mobile.pinch.min ) {
+					ratio = $.mobile.pinch.min;
+				} else if ( ratio > $.mobile.pinch.max ) {
+					ratio = $.mobile.pinch.max;
+				}
+
+				if ( Math.abs( ratio - last_ratio ) < $.mobile.pinch.threshold ) {
+					return;
+				}
+
+				$( event.target ).trigger( "pinch", getParameter( current, ratio ) );
+
+				last_ratio = ratio;
+
+				if ( $.mobile.pinch.interval ) {
+					processing = true;
+
+					setTimeout( function () {
+						processing = false;
+					}, $.mobile.pinch.interval );
+				}
+			}
+
+			$this.bind( "touchmove", pinchHandler )
+				.one( "touchend", function ( event ) {
+					$this.unbind( "touchmove", pinchHandler );
+					$( event.target ).trigger( "pinchend",
+								getParameter( undefined, last_ratio ) );
+
+					origin = undefined;
+					current = undefined;
+					last_ratio = 1;
+					processing = false;
+				});
+		});
+	}
+};
+
+$.event.special["pinch"] = pinch_event;
+
+$.mobile.pinch = {
+	enabled: true,
+	min: 0.1,
+	max: 3,
+	factor: 4,
+	threshold: 0.01,
+	interval: 50
+};
+
+})( jQuery, this );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.scrollview.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.scrollview.js
new file mode 100644
index 0000000..baeb51b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/jquery.mobile.tizen.scrollview.js
@@ -0,0 +1,1942 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Implements scroll by javascript
+//>>label: Scrollview
+//>>group: Tizen:Core
+
+define( [ 
+	"jquery",
+	"jqm/jquery.mobile.widget",
+	'libs/jquery.easing.1.3'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/*
+* jQuery Mobile Framework : scrollview plugin
+* Copyright (c) 2010 Adobe Systems Incorporated - Kin Blas (jblas@adobe.com)
+* Licensed under the MIT (MIT-LICENSE.txt) license.
+* 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 ) {
+
+	/**
+	 * Resizes page content height according to footer
+	 * header elements, and page padding
+	 * @param {HTMLElement|jQuery} page
+	 */
+	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) );
+	}
+
+	/**
+	 * MomentumTracker - helper class to ease momentum
+	 * movement calculations
+	 * @class
+	 * @param {Object} options
+	 */
+	function MomentumTracker( options ) {
+		this.options = $.extend( {}, options );
+		this.easing = "easeOutQuad";
+		this.reset();
+	}
+
+	/**
+	 * Scroll states dictionary
+	 * @type {Object}
+	 */
+	var tstates = {
+		scrolling: 0,
+		overshot:  1,
+		snapback:  2,
+		done:      3
+	};
+
+	/**
+	 * Returns current time in miliseconds
+	 * @return {number}
+	 */
+	function getCurrentTime() {
+		return Date.now();
+	};
+
+	function bitwiseAbs( e ) {
+		return ( e ^ (e>>31)) - (e>>31);
+	}
+
+	jQuery.widget( "tizen.scrollview", jQuery.mobile.widget, {
+		/**
+		 * Default options
+		 * @type {Object}
+		 */
+		options: {
+			/**
+			 * Direction of scroll, can be:
+			 * "x" for horizontal scroll
+			 * "y" for vertical scroll
+			 * null for horizontal and vertical scroll
+			 * @type {string|null}
+			 */
+			direction:         null,  // "x", "y", or null for both.
+
+			/**
+			 * Internal timer inteval
+			 * @type {number}
+			 */
+			timerInterval:     10,
+
+			/**
+			 * Duration of the scrolling animation in miliseconds
+			 * @type {number}
+			 */
+			scrollDuration:    1000,
+
+			/**
+			 * Duration of the overshoot animation in miliseconds
+			 * @type {number}
+			 */
+			overshootDuration: 250,
+
+			/**
+			 * Duration of snapback animation in miliseconds
+			 * @type {number}
+			 */
+			snapbackDuration:  500,
+
+			/**
+			 * Scroll detection threshold
+			 * @type {number}
+			 */
+			moveThreshold:     10,
+
+			/**
+			 * Maximal time between mouse movements while scrolling
+			 * @type {number}
+			 */
+			moveIntervalThreshold:     150,
+
+			/**
+			 * Scroll method type, can be "translate" or "position"
+			 * @type {string}
+			 */
+			scrollMethod:      "translate",
+
+			/**
+			 * The event fired when started scrolling
+			 * @type {string}
+			 */
+			startEventName:    "scrollstart",
+
+			/**
+			 * The event fired on each scroll update (movement)
+			 * @type {string}
+			 */
+			updateEventName:   "scrollupdate",
+
+			/**
+			 * The event fired after scroll stopped
+			 * @type {string}
+			 */
+			stopEventName:     "scrollstop",
+
+			/**
+			 * Determines the event group for detecting scroll
+			 * if $.support.touch has truthy value the group
+			 * that starts scroll will be touch events, otherwise
+			 * mouse events will be used
+			 * @type {string}
+			 */
+			eventType:         $.support.touch ? "touch" : "mouse",
+
+			/**
+			 * Determines if we should show the scrollbars
+			 * @type {boolean}
+			 */
+			showScrollBars:    true,
+
+			/**
+			 * Determines if overshoot animation is enabled
+			 * @type {boolean}
+			 */
+			overshootEnable:   false,
+
+			/**
+			 * Determines if we enable the window scroll
+			 * @type {boolean}
+			 */
+			outerScrollEnable: false,
+
+			/**
+			 * Determines if the overflow animation is enabled
+			 * @type {boolean}
+			 */
+			overflowEnable:    true,
+
+			/**
+			 * Determines if we allow scroll jumps
+			 * @type {boolean}
+			 */
+			scrollJump:        false
+		},
+
+		/**
+		 * Returns view height
+		 * @private
+		 * @return {number}
+		 */
+		_getViewHeight: function () {
+			return this._$view.height();
+		},
+
+		/**
+		 * Returns view width
+		 * @private
+		 * @return {number}
+		 */
+		_getViewWidth: function () {
+			return this._$view.width();
+		},
+
+		/**
+		 * Changes specified elements position to relative if
+		 * previous position state was static
+		 * @private
+		 * @param {jQuery} $ele
+		 */
+		_makePositioned: function ( $ele ) {
+			if ( $ele.css("position") === "static" ) {
+				$ele.css( "position", "relative" );
+			}
+		},
+
+		/**
+		 * Creates scrollview widget,
+		 * binds events and initiaties timers
+		 * @private
+		 */
+		_create: function () {
+			var direction,
+				self = this;
+
+			this._$clip = $( this.element ).addClass("ui-scrollview-clip");
+
+			if ( this._$clip.children(".ui-scrollview-view").length ) {
+				this._$view = this._$clip.children(".ui-scrollview-view");
+			} else {
+				this._$view = this._$clip.wrapInner("<div></div>").children()
+							.addClass("ui-scrollview-view");
+			}
+
+			if ( this.options.scrollMethod === "translate" ) {
+				if ( this._$view.css("transform") === undefined ) {
+					this.options.scrollMethod = "position";
+				}
+			}
+
+			this._$clip.css( "overflow", "hidden" );
+			this._makePositioned( this._$clip );
+
+			this._makePositioned( this._$view );
+			this._$view.css( { left: 0, top: 0 } );
+
+			this._view_height = this._getViewHeight();
+
+			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 = this.options.timerInterval;
+			this._timerID = 0;
+
+			this._timerCB = function () {
+				self._handleMomentumScroll();
+			};
+
+			this._add_event();
+			this._add_scrollbar();
+			this._add_scroll_jump();
+			this._add_overflow_indicator();
+			this._moveInterval = 10; /* Add Interval */
+			this._clipHeight = 0;
+		},
+
+		/**
+		 * Starts momentum scroll after user stopped
+		 * scrolling
+		 * @private
+		 * @param {number} speedX Horizontal speed
+		 * @param {number} speedY Vertical speed
+		 */
+		_startMScroll: function ( speedX, speedY ) {
+			var keepGoing = false,
+				duration = this.options.scrollDuration,
+				ht = this._hTracker,
+				vt = this._vTracker,
+				c,
+				v;
+
+			this._$clip.trigger( this.options.startEventName );
+
+			if ( ht ) {
+				c = this._$clip.width();
+				v = this._getViewWidth();
+
+				if ( (( this._sx === 0 && speedX > 0 ) ||
+					( this._sx === -(v - c) && speedX < 0 )) &&
+						v > c ) {
+					return;
+				}
+
+				ht.start( this._sx, speedX,
+					duration, (v > c) ? -(v - c) : 0, 0 );
+				keepGoing = !ht.done();
+			}
+
+			if ( vt ) {
+				c = this._$clip.height();
+				v = this._getViewHeight();
+
+				if ( (( this._sy === 0 && speedY > 0 ) ||
+					( this._sy === -(v - c) && speedY < 0 )) &&
+						v > c ) {
+					return;
+				}
+
+				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();
+			}
+		},
+
+		/**
+		 * Ends momentum scroll
+		 * @private
+		 */
+		_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();
+			this._hideOverflowIndicator();
+		},
+
+		/**
+		 * Updates scroll while in momentum scroll mode
+		 * @private
+		 */
+		_handleMomentumScroll: function () {
+			var keepGoing = false,
+				x = 0,
+				y = 0,
+				scroll_height = 0,
+				self = this,
+				vt = this._vTracker,
+				ht = this._hTracker;
+
+			if ( this._outerScrolling ) {
+				return;
+			}
+
+			if ( vt ) {
+				vt.update( this.options.overshootEnable );
+				y = vt.getPosition();
+				keepGoing = !vt.done();
+
+				if ( vt.getRemained() > this.options.overshootDuration ) {
+					scroll_height = this._getViewHeight() - this._$clip.height();
+
+					if ( !vt.isAvail() ) {
+						if ( this._speedY > 0 ) {
+							this._outerScroll( vt.getRemained() / 3, scroll_height );
+						} else {
+							this._outerScroll( y - vt.getRemained() / 3, scroll_height );
+						}
+					} else if ( vt.isMin() ) {
+						this._outerScroll( y - vt.getRemained() / 3, scroll_height );
+
+					} else if ( vt.isMax() ) {
+						this._outerScroll( vt.getRemained() / 3, scroll_height );
+					}
+				}
+			}
+
+			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();
+			}
+		},
+
+		/**
+		 * Sets css translate transformation for element
+		 * @param {jQuery} $ele
+		 * @param {number} x
+		 * @param {number} y
+		 * @param {number} duration
+		 */
+		_setElementTransform: function ( $ele, x, y, duration ) {
+			var translate,
+				transition;
+
+			if ( !duration || duration === undefined ) {
+				transition = "none";
+			} else {
+				transition =  "-webkit-transform " + duration / 1000 + "s ease-out";
+			}
+
+			if ( $.support.cssTransform3d ) {
+				translate = "translate3d(" + x + "," + y + ", 0px)";
+			} else {
+				translate = "translate(" + x + "," + y + ")";
+			}
+
+			$ele.css({
+				"-moz-transform": translate,
+				"-webkit-transform": translate,
+				"-ms-transform": translate,
+				"-o-transform": translate,
+				"transform": translate,
+				"-webkit-transition": transition
+			});
+		},
+
+		/**
+		 * Applies scroll end effect according to direction
+		 * @param {string} dir Direction, can be "in" or "out"
+		 */
+		_setEndEffect: function ( dir ) {
+			var scroll_height = this._getViewHeight() - this._$clip.height();
+
+			if ( this._softkeyboard ) {
+				if ( this._effect_dir ) {
+					this._outerScroll( -scroll_height - this._softkeyboardHeight,
+							scroll_height );
+				} else {
+					this._outerScroll( this._softkeyboardHeight, scroll_height );
+				}
+				return;
+			}
+
+			if ( dir === "in" ) {
+				if ( this._endEffect ) {
+					return;
+				}
+
+				this._endEffect = true;
+				this._setOverflowIndicator( this._effect_dir );
+				this._showOverflowIndicator();
+			} else if ( dir === "out" ) {
+				if ( !this._endEffect ) {
+					return;
+				}
+
+				this._endEffect = false;
+			} else {
+				this._endEffect = false;
+				this._setOverflowIndicator();
+				this._showOverflowIndicator();
+			}
+		},
+
+		/**
+		 * Calibrates scroll position and scroll end effect
+		 * @private
+		 * @param {number} x
+		 * @param {number} y
+		 */
+		_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,
+				scroll_width = 0,
+				vh,
+				ch;
+
+			if ( dirLock !== "y" && this._hTracker ) {
+				scroll_width = $v.width() - $c.width();
+
+				if ( x >= 0 ) {
+					this._sx = 0;
+				} else if ( x < -scroll_width ) {
+					this._sx = -scroll_width;
+				} else {
+					this._sx = x;
+				}
+
+				if ( scroll_width < 0 ) {
+					this._sx = 0;
+				}
+			}
+
+			if ( dirLock !== "x" && this._vTracker ) {
+				vh = this._getViewHeight();
+				ch = $c.height();
+				/*
+				When used changePage() function, this._getViewHeight() value set 0.
+				So scroll_height has incorrect value and showed indicator incorrectly.
+				Below condition is exception handling that avoid this situation.
+				*/
+				if ( vh != 0 && ch > 0 ) {
+					scroll_height = vh - ch;
+				}
+
+				if ( y > 0 ) {
+					this._sy = 0;
+
+					this._effect_dir = 0;
+					this._setEndEffect( "in" );
+				} else if ( y < -scroll_height ) {
+					this._sy = -scroll_height;
+
+					this._effect_dir = 1;
+					this._setEndEffect( "in" );
+				} else {
+					if ( this._endEffect && this._sy !== y ) {
+						this._setEndEffect();
+					}
+
+					this._sy = y;
+				}
+
+				if ( scroll_height < 0 ) {
+					this._sy = 0;
+				}
+			}
+		},
+
+		/**
+		 * Moves scroll to specified position
+		 * @private
+		 * @param {number} x
+		 * @param {number} y
+		 * @param {number} duration
+		 */
+		_setScrollPosition: function ( x, y, duration ) {
+			var $v = this._$view,
+				sm = this.options.scrollMethod,
+				$vsb = this._$vScrollBar,
+				$hsb = this._$hScrollBar,
+				$sbt;
+
+			this._setCalibration( x, y );
+
+			x = this._sx;
+			y = this._sy;
+
+			if ( sm === "translate" ) {
+				this._setElementTransform( $v, x + "px", y + "px", duration );
+			} else {
+				$v.css( {left: x + "px", top: y + "px"} );
+			}
+
+			if ( $vsb ) {
+				$sbt = $vsb.find(".ui-scrollbar-thumb");
+
+				if ( sm === "translate" ) {
+					if ( bitwiseAbs( this._moveInterval - bitwiseAbs(y)) > 20 ) {
+						/* update scrollbar every 20(clientY) move*/
+						/* Add Interval */
+						this._setElementTransform( $sbt, "0px",
+							-y / this._getViewHeight() * this._clipHeight + "px",
+							duration );
+					}
+				} else {
+					$sbt.css( "top", -y / this._getViewHeight() * 100 + "%" );
+				}
+			}
+
+			if ( $hsb ) {
+				$sbt = $hsb.find(".ui-scrollbar-thumb");
+
+				if ( sm === "translate" ) {
+					this._setElementTransform( $sbt,
+						-x / $v.outerWidth() * $sbt.parent().width() + "px", "0px",
+						duration);
+				} else {
+					$sbt.css("left", -x / $v.width() * 100 + "%");
+				}
+			}
+		},
+
+		/**
+		 * Handles window scrolling
+		 * @private
+		 * @param {number} y
+		 * @param {number} scroll_height
+		 */
+		_outerScroll: function ( y, scroll_height ) {
+			var self = this,
+				top = $( window ).scrollTop() - window.screenTop,
+				sy = 0,
+				duration = this.options.snapbackDuration,
+				start = getCurrentTime(),
+				tfunc;
+
+			if ( !this.options.outerScrollEnable ) {
+				return;
+			}
+
+			if ( this._$clip.jqmData("scroll") !== "y" ) {
+				return;
+			}
+
+			if ( this._outerScrolling ) {
+				return;
+			}
+
+			if ( y > 0 ) {
+				sy = ( window.screenTop ? window.screenTop : -y );
+			} else if ( y < -scroll_height ) {
+				sy = -y - scroll_height;
+			} else {
+				return;
+			}
+
+			tfunc = function () {
+				var elapsed = getCurrentTime() - start;
+
+				if ( elapsed >= duration ) {
+					window.scrollTo( 0, top + sy );
+					self._outerScrolling = undefined;
+
+					self._stopMScroll();
+				} else {
+					ec = $.easing.easeOutQuad( elapsed / duration,
+							elapsed, 0, 1, duration );
+
+					window.scrollTo( 0, top + ( sy * ec ) );
+					self._outerScrolling = setTimeout( tfunc, self._timerInterval );
+				}
+			};
+			this._outerScrolling = setTimeout( tfunc, self._timerInterval );
+		},
+
+		/**
+		 * Scrolls to specified position with easeOutQuad calculations
+		 * @private
+		 * @param {number} x
+		 * @param {number} y
+		 * @param {number} duration
+		 */
+		_scrollTo: function ( x, y, duration ) {
+			var self = this,
+				start = getCurrentTime(),
+				efunc = $.easing.easeOutQuad,
+				sx = this._sx,
+				sy = this._sy,
+				dx = x - sx,
+				dy = y - sy,
+				tfunc;
+
+			x = -x;
+			y = -y;
+
+			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 );
+		},
+
+		/**
+		 * Scrolls to specified position
+		 * If scroll method is css translation or duration is a
+		 * falsy value, the position is changed via translation,
+		 * otherwise it's animated to that position
+		 * @param {number} x
+		 * @param {number} y
+		 * @param {number} duration
+		 */
+		scrollTo: function ( x, y, duration ) {
+			this._stopMScroll();
+			this._didDrag = false;
+
+			if ( !duration || this.options.scrollMethod === "translate" ) {
+				this._setScrollPosition( x, y, duration );
+			} else {
+				this._scrollTo( x, y, duration );
+			}
+		},
+
+		/**
+		 * Centers scroll to view the specified child element
+		 * @param {Element|jQuery} target
+		 */
+		centerToElement: function ( element ) {
+			var $clip = this._$clip,
+				$view = this._$view,
+				$element = element.get ? element : $( element ),
+				delta = ( $clip.height() / 2 ) - ( element.height() / 2 ),
+				elementPosition = element.position().top;
+
+			element.parentsUntil( $view ).each( function () {
+				var $parent = $( this );
+				elementPosition += ( $parent.position().top + parseFloat( $parent.css( "marginTop" ) ) + parseFloat( $parent.css( "paddingTop" ) ) );
+			});
+
+			this.scrollTo( this._sx, -( elementPosition - delta ) );
+		},
+
+		/**
+		 * Checks if the specified child element is visible
+		 * and centers the scroll on it if it's not visible
+		 * @param {Element|jQuery}
+		 */
+		ensureElementIsVisible: function ( element ) {
+			var $element = element.get ? element : $( element ),
+				$clip = this._$clip,
+				clipHeight = $clip.height(),
+				clipTop = $clip.offset().top,
+				clipBottom = clipTop + clipHeight,
+				elementHeight = $element.height(),
+				elementTop = $element.offset().top,
+				elementBottom = elementTop + elementHeight,
+				elementFits = clipHeight > elementHeight,
+				$anchor,
+				anchorPosition = 0,
+				findPositionAnchor = function ( input ) {
+					var $label,
+						id = input.attr( "id" );
+					if ( input.is( ":input" ) && id ) {
+						$label = input.siblings( "label[for=" + id + "]" );
+						if ( $label.length > 0 ) {
+							return $label.eq( 0 );
+						}
+					}
+					return input;
+				};
+
+			switch( true ) {
+				case elementFits && clipTop < elementTop && clipBottom > elementBottom: // element fits in view is inside clip area
+					// pass, element position is ok
+					break;
+				case elementFits && clipTop < elementTop && clipBottom < elementBottom: // element fits in view but its visible only at top
+				case elementFits && clipTop > elementTop && clipBottom > elementBottom: // element fits in view but its visible only at bottom
+				case elementFits: // element fits in view but is not visible
+					this.centerToElement(element);
+					break;
+				case clipTop < elementTop && clipBottom < elementBottom: // element visible only at top
+				case clipTop > elementTop && clipBottom > elementBottom: // element visible only at bottom
+					// pass, we cant do anything, if we move the scroll
+					// the user could lost view of something he scrolled to
+					break;
+				default: // element is not visible
+					$anchor = findPositionAnchor( $element );
+					anchorPosition = $anchor.position().top + parseFloat( $anchor.css("marginTop" ) );
+					$anchor.parentsUntil($view).each(function () {
+						var $p = $( this );
+						anchorPosition += ( $p.position().top + parseFloat( $p.css("marginTop" ) ) );
+					});
+					this.scrollTo( self._sx, -anchorPosition );
+					break;
+			}
+		},
+
+		/**
+		 * Returns current scroll position {x,y}
+		 * @return {Object}
+		 */
+		getScrollPosition: function () {
+			return { x: -this._sx, y: -this._sy };
+		},
+
+		/**
+		 * Skipps dragging
+		 * @param {Boolean}
+		 */
+		skipDragging: function ( value ) {
+			this._skip_dragging = value;
+		},
+
+		/**
+		 * Returns scroll hierarchy in an array of elements
+		 * @private
+		 * @return {Array}
+		 */
+		_getScrollHierarchy: function () {
+			var svh = [],
+				d;
+
+			this._$clip.parents( ".ui-scrollview-clip").each( function () {
+				d = $( this ).jqmData("scrollview");
+				if ( d ) {
+					svh.unshift( d );
+				}
+			} );
+			return svh;
+		},
+
+		/**
+		 * Returns ancestor for specified direction
+		 * @private
+		 * @param {string} dir
+		 */
+		_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;
+		},
+
+		/**
+		 * Handles dragstart event
+		 * @private
+		 * @param {Event} e
+		 * @param {number} ex Event x position
+		 * @param {number} ey Event y position
+		 */
+		_handleDragStart: function ( e, ex, ey ) {
+			this._stopMScroll();
+
+			this._didDrag = false;
+			this._skip_dragging = false;
+			this._clipHeight = this._$clip.height();
+			var target = $( e.target ),
+				self = this,
+				$c = this._$clip,
+				svdir = this.options.direction;
+
+			/* should prevent the default behavior when click the button */
+			this._is_button = target.is( '.ui-btn' ) ||
+					target.is( '.ui-btn-text' ) ||
+					target.is( '.ui-btn-inner' ) ||
+					target.is( '.ui-btn-inner .ui-icon' );
+
+			/* should prevent the default behavior when click the slider */
+			if ( target.parents('.ui-slider').length || target.is('.ui-slider') ) {
+				this._skip_dragging = true;
+				return;
+			}
+
+			if ( target.is('textarea') ) {
+				target.bind( "scroll", function () {
+					self._skip_dragging = true;
+					target.unbind("scroll");
+				});
+			}
+
+			/*
+			 * We need to prevent the default behavior to
+			 * suppress accidental selection of text, etc.
+			 */
+			this._is_inputbox = target.is(':input') ||
+					target.parents(':input').length > 0;
+
+			if ( this._is_inputbox ) {
+				target.one( "resize.scrollview", function () {
+					if ( ey > $c.height() ) {
+						self.scrollTo( -ex, self._sy - ey + $c.height(),
+							self.options.snapbackDuration );
+					}
+				});
+			}
+
+			if ( this.options.eventType === "mouse" && !this._is_inputbox && !this._is_button ) {
+				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 = "";
+
+			this._lastMove = 0;
+			this._enableTracking();
+
+			this._set_scrollbar_size();
+		},
+
+		/**
+		 * Propagates dragging
+		 * @private
+		 * @param {jQuery} sv
+		 * @param {Event} e
+		 * @param {number} ex
+		 * @param {number} ey
+		 * @param {string} dir
+		 */
+		_propagateDragMove: function ( sv, e, ex, ey, dir ) {
+			this._hideScrollBars();
+			this._hideOverflowIndicator();
+			this._disableTracking();
+			sv._handleDragStart( e, ex, ey );
+			sv._directionLock = dir;
+			sv._didDrag = this._didDrag;
+		},
+
+		/**
+		 * Handles drag event
+		 * @private
+		 * @param {Event}
+		 * @param {number} ex
+		 * @param {number} ey
+		 * @return {boolean|undefined}
+		 */
+		_handleDragMove: function ( e, ex, ey ) {
+			this._moveInterval = ey;
+			if ( this._skip_dragging ) {
+				return;
+			}
+
+			if ( !this._dragging ) {
+				return;
+			}
+
+			if ( !this._is_inputbox && !this._is_button ) {
+				e.preventDefault();
+			}
+
+			var mt = this.options.moveThreshold,
+				dx = ex - this._lastX,
+				dy = ey - this._lastY,
+				svdir = this.options.direction,
+				dir = null,
+				x,
+				y,
+				sv,
+				scope,
+				newX,
+				newY,
+				dirLock;
+
+			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 || (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;
+
+				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 ) {
+				if ( Math.abs( this._startY - ey ) < mt && dirLock !== "xy" && this._didDrag === false ) {
+					return;
+				}
+
+				y = this._sy;
+				this._speedY = dy;
+				newY = y + dy;
+
+				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;
+			}
+
+			this._lastX = ex;
+			this._lastY = ey;
+
+			this._setScrollPosition( newX, newY );
+
+			if ( this._didDrag === false ) {
+				this._didDrag = true;
+				this._showScrollBars();
+				this._showOverflowIndicator();
+
+				this._$clip.parents(".ui-scrollview-clip").each( function () {
+					$( this ).scrollview( "skipDragging", true );
+				} );
+			}
+		},
+
+		/**
+		 * Handles drag stop event, and returns drag status
+		 * @param {Event} e
+		 * @return {Boolean|undefined}
+		 */
+		_handleDragStop: function ( e ) {
+			var self = this;
+
+			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 ( sx || sy ) {
+				if ( !this._setGestureScroll( sx, sy ) ) {
+					this._startMScroll( sx, sy );
+				}
+			} else {
+				this._hideScrollBars();
+				this._hideOverflowIndicator();
+			}
+
+			this._disableTracking();
+
+			if ( this._endEffect ) {
+				setTimeout( function () {
+					self._setEndEffect( "out" );
+					self._hideScrollBars();
+					self._hideOverflowIndicator();
+				}, 300 );
+			}
+
+			return !this._didDrag;
+		},
+
+		/**
+		 * Detects gestures and sets proper gesture direction
+		 * @private
+		 * @param {number} sx
+		 * @param {number} sy
+		 * @return {boolean}
+		 */
+		_setGestureScroll: function ( sx, sy ) {
+			var self = this,
+				reset = function () {
+					clearTimeout( self._gesture_timer );
+					self._gesture_dir = 0;
+					self._gesture_timer = undefined;
+				},
+				direction = {
+					top: 0,
+					bottom: 1,
+					left: 2,
+					right: 3
+				};
+
+			if ( !sy && !sx ) {
+				return false;
+			}
+
+			if ( Math.abs( sx ) > Math.abs( sy ) ) {
+				dir = sx > 0 ? direction.left : direction.right;
+			} else {
+				dir = sy > 0 ? direction.top : direction.bottom;
+			}
+
+			if ( !this._gesture_timer ) {
+				this._gesture_dir = dir;
+
+				this._gesture_timer = setTimeout( function () {
+					reset();
+				}, 1000 );
+
+				return false;
+			}
+
+			if ( this._gesture_dir !== dir ) {
+				reset();
+				return false;
+			}
+
+			return false;
+		},
+
+		/**
+		 * Enables dragging
+		 * @private
+		 */
+		_enableTracking: function () {
+			this._dragging = true;
+		},
+
+		/**
+		 * Disables dragging
+		 * @private
+		 */
+		_disableTracking: function () {
+			this._dragging = false;
+		},
+
+		/**
+		 * Shows scrollbars
+		 * When interval is specified, the scrollbars will be
+		 * hidden after the specified time in miliseconds
+		 * @private
+		 * @param {number} [interval]
+		 */
+		_showScrollBars: function ( interval ) {
+			var vclass = "ui-scrollbar-visible",
+				self = this;
+
+			if ( !this.options.showScrollBars ) {
+				return;
+			}
+			if ( this._scrollbar_showed ) {
+				return;
+			}
+
+			if ( this._$vScrollBar ) {
+				this._$vScrollBar.addClass( vclass );
+			}
+			if ( this._$hScrollBar ) {
+				this._$hScrollBar.addClass( vclass );
+			}
+
+			this._scrollbar_showed = true;
+
+			if ( interval ) {
+				setTimeout( function () {
+					self._hideScrollBars();
+				}, interval );
+			}
+		},
+
+		/**
+		 * Hides scrollbars
+		 * @private
+		 */
+		_hideScrollBars: function () {
+			var vclass = "ui-scrollbar-visible";
+
+			if ( !this.options.showScrollBars ) {
+				return;
+			}
+			if ( !this._scrollbar_showed ) {
+				return;
+			}
+
+			if ( this._$vScrollBar ) {
+				this._$vScrollBar.removeClass( vclass );
+			}
+			if ( this._$hScrollBar ) {
+				this._$hScrollBar.removeClass( vclass );
+			}
+
+			this._scrollbar_showed = false;
+		},
+
+		/**
+		 * Sets opacities for the oveflow indicator
+		 * according to specified direction. The direction
+		 * is optional. Specify 1 for top, 0 for bottom, and
+		 * a falsy value for both
+		 * @private
+		 * @param {number} [dir] 0
+		 */
+		_setOverflowIndicator: function ( dir ) {
+			if ( dir === 1 ) {
+				this._display_indicator_top = "none";
+				this._display_indicator_bottom = "block";
+			} else if ( dir === 0 ) {
+				this._display_indicator_top = "block";
+				this._display_indicator_bottom = "none";
+			} else {
+				this._display_indicator_top = "block";
+				this._display_indicator_bottom = "block";
+			}
+		},
+
+		/**
+		 * Display overflow indicator
+		 * @private
+		 */
+		_showOverflowIndicator: function () {
+			if ( !$( this.element ).is( ".ui-content" ) ) {
+				return true;
+			}
+
+			if ( !this.options.overflowEnable || !this._overflowAvail || this._softkeyboard ) {
+				return;
+			}
+
+			this._overflow_top.css( "display", this._display_indicator_top );
+			this._overflow_bottom.css( "display", this._display_indicator_bottom );
+
+			this._overflow_showed = true;
+		},
+
+		/**
+		 * Hide overflow indicator
+		 * @private
+		 */
+		_hideOverflowIndicator: function () {
+			if ( !this.options.overflowEnable || !this._overflowAvail || this._softkeyboard ) {
+				return;
+			}
+
+			if ( this._overflow_showed === false ) {
+				return;
+			}
+
+			this._overflow_top.css( "display", "none" );
+			this._overflow_bottom.css( "display", "none" );
+
+			this._overflow_showed = false;
+			this._setOverflowIndicator();
+		},
+
+		/**
+		 * Bind events
+		 * @private
+		 * @return {boolean|undefined}
+		 */
+		_add_event: function () {
+			var self = this,
+				$c = this._$clip,
+				$v = this._$view;
+
+			if ( this.options.eventType === "mouse" ) {
+				this._dragEvt = "mousedown mousemove mouseup click mousewheel";
+
+				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;
+
+					case "mousewheel":
+						var old = self.getScrollPosition();
+						self.scrollTo( -old.x,
+							-(old.y - e.originalEvent.wheelDelta) );
+						break;
+					}
+				};
+			} else {
+				this._dragEvt = "touchstart touchmove touchend";
+				var _in_progress = false;
+				this._dragCB = function ( e ) {
+					var touches = e.originalEvent.touches;
+
+					switch ( e.type ) {
+					case "touchstart":
+						if ( touches.length != 1 || _in_progress ) {
+							return;
+						}
+
+						_in_progress = true;
+
+						return self._handleDragStart( e,
+								touches[0].pageX, touches[0].pageY );
+
+					case "touchmove":
+						if ( !_in_progress || touches.length != 1) {
+							return;
+						}
+
+						return self._handleDragMove( e,
+								touches[0].pageX, touches[0].pageY );
+
+					case "touchend":
+						if ( !_in_progress ) {
+							return;
+						}
+
+						_in_progress = false;
+
+						if ( touches.length != 0 ) {
+							return;
+						}
+
+						return self._handleDragStop( e );
+					}
+				};
+			};
+
+			$v.bind( this._dragEvt, this._dragCB );
+
+			// N_SE-35696 / N_SE-35800
+			var clipScrollDelta = 0,
+				clipScrollLast = 0;
+			$c.on( "scroll", function () {
+				var clipScrollTop = $c.scrollTop(),
+					currentPositon = self.getScrollPosition(),
+					inputs;
+
+				clipScrollDelta = clipScrollTop - clipScrollLast;
+				clipScrollLast = clipScrollTop;
+
+				if ( clipScrollDelta > 0 ) {
+					inputs = $v.find( ":input.ui-focus" );
+					$c.scrollTop( 0 );
+					if ( inputs.length ) {
+						// CHECK WHERE WE ARE IN THE INPUTS
+						clipScrollDelta = 0;
+					}
+					self.scrollTo( -currentPositon.x, -( currentPositon.y + clipScrollDelta ) );
+				}
+			} );
+
+			$v.bind( "keydown", function ( e ) {
+				var $focusedElement;
+
+				if ( e.keyCode == 9 ) {
+					return false;
+				}
+
+				$focusedElement = $c.find( ".ui-focus" );
+				if ( !$focusedElement.length ) {
+					return;
+				}
+				self.ensureElementIsVisible( $focusedElement );
+
+				return;
+			});
+
+			$v.bind( "keyup", function ( e ) {
+				var $input;
+
+				if ( e.keyCode !== 9 ) {
+					return;
+				}
+
+				/* Tab Key */
+				$input = $( this ).find( ":input.ui-focus" ).eq( 0 );
+				if ( !$input ) {
+					return;
+				}
+				self.ensureElementIsVisible( $input );
+				$input.focus();
+
+				return false;
+			});
+
+			$c.bind( "updatelayout", function ( e ) {
+				var sy,
+					vh,
+					view_h = self._getViewHeight();
+
+				if ( !$c.height() || !view_h ) {
+					self.scrollTo( 0, 0, 0 );
+					return;
+				}
+
+				sy = $c.height() - view_h;
+				vh = view_h - self._view_height;
+
+				self._view_height = view_h;
+
+				if ( vh == 0 || vh > $c.height() / 2 ) {
+					return;
+				}
+
+				if ( sy > 0 ) {
+					self.scrollTo( 0, 0, 0 );
+				} else if ( self._sy - sy <= -vh ) {
+					self.scrollTo( 0, self._sy,
+						self.options.snapbackDuration );
+				} else if ( self._sy - sy <= vh + self.options.moveThreshold ) {
+					self.scrollTo( 0, sy,
+						self.options.snapbackDuration );
+				}
+			});
+
+			$( window ).bind( "resize", function ( e ) {
+				var focused,
+					view_h = self._getViewHeight();
+
+				if ( $(".ui-page-active").get(0) !== $c.closest(".ui-page").get(0) ) {
+					return;
+				}
+
+				if ( !$c.height() || !view_h ) {
+					return;
+				}
+
+				focused = $c.find(".ui-focus");
+
+				if ( focused ) {
+					focused.trigger("resize.scrollview");
+				}
+
+				/* calibration - after triggered throttledresize */
+				setTimeout( function () {
+					var view_w = $v.outerWidth(),
+						cw = $c.outerWidth(),
+						scroll_x,
+						scroll_y;
+					if ( self._sy < $c.height() - self._getViewHeight() ) {
+						scroll_y = $c.height() - self._getViewHeight();
+						scroll_x = 0;
+					}
+					if ( self._sx < cw - view_w ) {
+						scroll_x = cw - view_w;
+						scroll_y = scroll_y || 0;
+					}
+					if (scroll_x || scroll_y) {
+						self.scrollTo( scroll_x, scroll_y, self.options.overshootDuration );
+					}
+				}, 260 );
+
+				self._view_height = view_h;
+				self._clipHeight = self._$clip.height();
+			});
+
+			$( window ).bind( "vmouseout", function ( e ) {
+				var drag_stop = false;
+
+				if ( $(".ui-page-active").get(0) !== $c.closest(".ui-page").get(0) ) {
+					return;
+				}
+
+				if ( !self._dragging ) {
+					return;
+				}
+
+				if ( e.pageX < 0 || e.pageX > $( window ).width() ) {
+					drag_stop = true;
+				}
+
+				if ( e.pageY < 0 || e.pageY > $( window ).height() ) {
+					drag_stop = true;
+				}
+
+				if ( drag_stop ) {
+					self._hideScrollBars();
+					self._hideOverflowIndicator();
+					self._disableTracking();
+				}
+			});
+
+			this._softkeyboard = false;
+			this._softkeyboardHeight = 0;
+
+			window.addEventListener( "softkeyboardchange", function ( e ) {
+				if ( $(".ui-page-active").get(0) !== $c.closest(".ui-page").get(0) ) {
+					return;
+				}
+
+				self._softkeyboard = ( e.state === "on" ? true : false );
+				self._softkeyboardHeight = parseInt( e.height ) *
+						( $( window ).width() / window.screen.availWidth );
+			});
+
+			$c.closest(".ui-page")
+				.bind( "pageshow", function ( e ) {
+					self._view_height = self._$view.height();
+
+					/* should be called after pagelayout */
+					setTimeout( function () {
+						self._view_height = self._getViewHeight();
+						self._set_scrollbar_size();
+						self._setScrollPosition( self._sx, self._sy );
+						self._showScrollBars( 2000 );
+					}, 0 );
+				});
+
+			$c.closest(".ui-page").find( ".ui-popup" )
+				.bind( "popupafteropen", function ( e ) {
+					if ( !$( self.element ).parents().is( ".ui-ctxpopup" ) ) {
+						return true;
+					}
+
+                                        setTimeout( function () {
+                                                self._setScrollPosition( self._sx, self._sy );
+						self._showScrollBars( 2000 );
+                                        }, 0 );
+				});
+		},
+
+		/**
+		 * Adds scrollbar elements to DOM
+		 * @private
+		 */
+		_add_scrollbar: function () {
+			var $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.showScrollBars ) {
+				return;
+			}
+
+			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");
+			}
+
+			this._scrollbar_showed = false;
+		},
+
+		/**
+		 * Adds scroll jump button to DOM
+		 * @private
+		 */
+		_add_scroll_jump: function () {
+			var $c = this._$clip,
+				self = this,
+				top_btn,
+				left_btn;
+
+			if ( !this.options.scrollJump ) {
+				return;
+			}
+
+			if ( this._vTracker ) {
+				top_btn = $( '<div class="ui-scroll-jump-top-bg">' +
+						'<div data-role="button" data-inline="true" data-icon="scrolltop" data-style="box"></div></div>' );
+				$c.append( top_btn ).trigger("create");
+
+				top_btn.bind( "vclick", function () {
+					self.scrollTo( 0, 0, self.options.overshootDuration );
+				} );
+			}
+
+			if ( this._hTracker ) {
+				left_btn = $( '<div class="ui-scroll-jump-left-bg">' +
+						'<div data-role="button" data-inline="true" data-icon="scrollleft" data-style="box"></div></div>' );
+				$c.append( left_btn ).trigger("create");
+
+				left_btn.bind( "vclick", function () {
+					self.scrollTo( 0, 0, self.options.overshootDuration );
+				} );
+			}
+		},
+
+		/**
+		 * Adds overflow indicator to DOM
+		 * @private
+		 */
+		_add_overflow_indicator: function () {
+			if ( !this.options.overflowEnable ) {
+				return;
+			}
+
+			this._overflow_top = $( '<div class="ui-overflow-indicator-top"></div>' );
+			this._overflow_bottom = $( '<div class="ui-overflow-indicator-bottom"></div>' );
+
+			this._$clip.append( this._overflow_top );
+			this._$clip.append( this._overflow_bottom );
+
+			this._display_indicator_top = "block";
+			this._display_indicator_bottom = "block";
+			this._overflow_showed = false;
+		},
+
+		/**
+		 * Sets the size of the scrollbars
+		 * @private
+		 */
+		_set_scrollbar_size: function () {
+			var $c = this._$clip,
+				$v = this._$view,
+				cw = 0,
+				vw = 0,
+				ch = 0,
+				vh = 0,
+				thumb;
+
+			if ( !this.options.showScrollBars ) {
+				return;
+			}
+
+			if ( this._hTracker ) {
+				cw = $c.width();
+				vw = $v.width();
+				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 ? "0" :
+							(Math.floor(cw / vw * 100) || 1) + "%") );
+				}
+			}
+
+			if ( this._vTracker ) {
+				ch = $c.height();
+				vh = this._getViewHeight();
+				this._maxY = ch - vh;
+
+				if ( this._maxY > 0 || vh === 0 ) {
+					this._maxY = 0;
+				}
+				if ( ( this._$vScrollBar && vh ) || vh === 0 ) {
+					thumb = this._$vScrollBar.find(".ui-scrollbar-thumb");
+					thumb.css( "height", (ch >= vh ? "0" :
+							(Math.floor(ch / vh * 100) || 1) + "%") );
+
+					this._overflowAvail = !!thumb.height();
+				}
+			}
+		}
+	});
+
+	/**
+	 * Momentum tracker
+	 */
+	$.extend( MomentumTracker.prototype, {
+		/**
+		 * Starts momentum callculations
+		 * @param {number} pos
+		 * @param {number} speed
+		 * @param {number} duration
+		 * @param {number} minPos
+		 * @param {number} maxPos
+		 */
+		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();
+		},
+
+		/**
+		 * Resets momentum tracker calculations and sets
+		 * state to done
+		 */
+		reset: function () {
+			this.state = tstates.done;
+			this.pos = 0;
+			this.speed = 0;
+			this.minPos = 0;
+			this.maxPos = 0;
+			this.duration = 0;
+			this.remained = 0;
+		},
+
+		/**
+		 * Recalculate momentum tracker estimates
+		 * @param {boolean} overshootEnable
+		 * @return {number} position
+		 */
+		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;
+
+			this.remained = 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 ( !overshootEnable ) {
+						this.state = tstates.done;
+					}
+					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;
+		},
+
+		/**
+		 * Checks if momentum state is done
+		 * @return {boolean}
+		 */
+		done: function () {
+			return this.state === tstates.done;
+		},
+
+		/**
+		 * Checks if the position is minimal
+		 * @return {boolean}
+		 */
+		isMin: function () {
+			return this.pos === this.minPos;
+		},
+
+		/**
+		 * Checks if the position is maximal
+		 * @return {boolean}
+		 */
+		isMax: function () {
+			return this.pos === this.maxPos;
+		},
+
+		/**
+		 * Check if momentum tracking is available
+		 * @return {boolean}
+		 */
+		isAvail: function () {
+			return !( this.minPos === this.maxPos );
+		},
+
+		/**
+		 * Returns remaining time
+		 * @return {number}
+		 */
+		getRemained: function () {
+			return this.remained;
+		},
+
+		/**
+		 * Returns current position
+		 * @return {number}
+		 */
+		getPosition: function () {
+			return this.pos;
+		}
+	});
+
+	$( document ).bind( 'pagecreate create', function ( e ) {
+		var $page = $( e.target ),
+			content_scroll = $page.find(".ui-content").jqmData("scroll");
+
+		/* content scroll */
+		if ( $.support.scrollview === undefined ) {
+			$.support.scrollview = true;
+		}
+
+		if ( $.support.scrollview === true && content_scroll === undefined ) {
+			content_scroll = "y";
+		}
+
+		if ( content_scroll !== "y" ) {
+			content_scroll = "none";
+		}
+
+		$page.find(".ui-content").attr( "data-scroll", content_scroll );
+
+		$page.find(":jqmData(scroll)").not(".ui-scrollview-clip").each( function () {
+			if ( $( this ).hasClass("ui-scrolllistview") ) {
+				$( this ).scrolllistview();
+			} else {
+				var st = $( this ).jqmData("scroll"),
+					dir = st && ( st.search(/^[xy]/) !== -1 ) ? st : null,
+					content = $(this).hasClass("ui-content"),
+					opts;
+
+				if ( st === "none" ) {
+					return;
+				}
+
+				opts = {
+					direction: dir || undefined,
+					overflowEnable: content,
+					scrollMethod: $( this ).jqmData("scroll-method") || undefined,
+					scrollJump: $( this ).jqmData("scroll-jump") || undefined
+				};
+
+				$( this ).scrollview( opts );
+			}
+		});
+	});
+
+	$( document ).bind( 'pageshow', function ( e ) {
+		var $page = $( e.target ),
+			scroll = $page.find(".ui-content").jqmData("scroll");
+
+		if ( scroll === "y" ) {
+			resizePageContentHeight( e.target );
+		}
+	});
+
+}( jQuery, window, document ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/libs/gl-matrix.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/libs/gl-matrix.js
new file mode 100644
index 0000000..c7f1006
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/libs/gl-matrix.js
@@ -0,0 +1,3458 @@
+/**
+ * @fileoverview gl-matrix - High performance matrix and vector operations for WebGL
+ * @author Brandon Jones
+ * @author Colin MacKenzie IV
+ * @version 1.3.7
+ */
+
+/*
+ * Copyright (c) 2012 Brandon Jones, Colin MacKenzie IV
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ *    1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ *
+ *    2. Altered source versions must be plainly marked as such, and must not
+ *    be misrepresented as being the original software.
+ *
+ *    3. This notice may not be removed or altered from any source
+ *    distribution.
+ */
+
+// Updated to use a modification of the "returnExportsGlobal" pattern from https://github.com/umdjs/umd
+
+(function (root, factory) {
+    if (typeof exports === 'object') {
+        // Node. Does not work with strict CommonJS, but
+        // only CommonJS-like enviroments that support module.exports,
+        // like Node.
+        module.exports = factory(global);
+    } else if (typeof define === 'function' && define.amd) {
+        // AMD. Register as an anonymous module.
+        define([], function () {
+            return factory(root);
+        });
+    } else {
+        // Specific initialization for TIZEN Web UI Framework
+        root.initGlMatrix = function ( targetRoot ) {
+            factory( targetRoot || root );
+        };
+    }
+}(this, function (root) {
+    "use strict";
+
+    // Tweak to your liking
+    var FLOAT_EPSILON = 0.000001;
+
+    var glMath = {};
+    (function() {
+        if (typeof(Float32Array) != 'undefined') {
+            var y = new Float32Array(1);
+            var i = new Int32Array(y.buffer);
+
+            /**
+             * Fast way to calculate the inverse square root,
+             * see http://jsperf.com/inverse-square-root/5
+             *
+             * If typed arrays are not available, a slower
+             * implementation will be used.
+             *
+             * @param {Number} number the number
+             * @returns {Number} Inverse square root
+             */
+            glMath.invsqrt = function(number) {
+              var x2 = number * 0.5;
+              y[0] = number;
+              var threehalfs = 1.5;
+
+              i[0] = 0x5f3759df - (i[0] >> 1);
+
+              var number2 = y[0];
+
+              return number2 * (threehalfs - (x2 * number2 * number2));
+            };
+        } else {
+            glMath.invsqrt = function(number) { return 1.0 / Math.sqrt(number); };
+        }
+    })();
+
+    /**
+     * @class System-specific optimal array type
+     * @name MatrixArray
+     */
+    var MatrixArray = null;
+    
+    // explicitly sets and returns the type of array to use within glMatrix
+    function setMatrixArrayType(type) {
+        MatrixArray = type;
+        return MatrixArray;
+    }
+
+    // auto-detects and returns the best type of array to use within glMatrix, falling
+    // back to Array if typed arrays are unsupported
+    function determineMatrixArrayType() {
+        MatrixArray = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
+        return MatrixArray;
+    }
+    
+    determineMatrixArrayType();
+
+    /**
+     * @class 3 Dimensional Vector
+     * @name vec3
+     */
+    var vec3 = {};
+     
+    /**
+     * Creates a new instance of a vec3 using the default array type
+     * Any javascript array-like objects containing at least 3 numeric elements can serve as a vec3
+     *
+     * @param {vec3} [vec] vec3 containing values to initialize with
+     *
+     * @returns {vec3} New vec3
+     */
+    vec3.create = function (vec) {
+        var dest = new MatrixArray(3);
+
+        if (vec) {
+            dest[0] = vec[0];
+            dest[1] = vec[1];
+            dest[2] = vec[2];
+        } else {
+            dest[0] = dest[1] = dest[2] = 0;
+        }
+
+        return dest;
+    };
+
+    /**
+     * Creates a new instance of a vec3, initializing it with the given arguments
+     *
+     * @param {number} x X value
+     * @param {number} y Y value
+     * @param {number} z Z value
+
+     * @returns {vec3} New vec3
+     */
+    vec3.createFrom = function (x, y, z) {
+        var dest = new MatrixArray(3);
+
+        dest[0] = x;
+        dest[1] = y;
+        dest[2] = z;
+
+        return dest;
+    };
+
+    /**
+     * Copies the values of one vec3 to another
+     *
+     * @param {vec3} vec vec3 containing values to copy
+     * @param {vec3} dest vec3 receiving copied values
+     *
+     * @returns {vec3} dest
+     */
+    vec3.set = function (vec, dest) {
+        dest[0] = vec[0];
+        dest[1] = vec[1];
+        dest[2] = vec[2];
+
+        return dest;
+    };
+
+    /**
+     * Compares two vectors for equality within a certain margin of error
+     *
+     * @param {vec3} a First vector
+     * @param {vec3} b Second vector
+     *
+     * @returns {Boolean} True if a is equivalent to b
+     */
+    vec3.equal = function (a, b) {
+        return a === b || (
+            Math.abs(a[0] - b[0]) < FLOAT_EPSILON &&
+            Math.abs(a[1] - b[1]) < FLOAT_EPSILON &&
+            Math.abs(a[2] - b[2]) < FLOAT_EPSILON
+        );
+    };
+
+    /**
+     * Performs a vector addition
+     *
+     * @param {vec3} vec First operand
+     * @param {vec3} vec2 Second operand
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.add = function (vec, vec2, dest) {
+        if (!dest || vec === dest) {
+            vec[0] += vec2[0];
+            vec[1] += vec2[1];
+            vec[2] += vec2[2];
+            return vec;
+        }
+
+        dest[0] = vec[0] + vec2[0];
+        dest[1] = vec[1] + vec2[1];
+        dest[2] = vec[2] + vec2[2];
+        return dest;
+    };
+
+    /**
+     * Performs a vector subtraction
+     *
+     * @param {vec3} vec First operand
+     * @param {vec3} vec2 Second operand
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.subtract = function (vec, vec2, dest) {
+        if (!dest || vec === dest) {
+            vec[0] -= vec2[0];
+            vec[1] -= vec2[1];
+            vec[2] -= vec2[2];
+            return vec;
+        }
+
+        dest[0] = vec[0] - vec2[0];
+        dest[1] = vec[1] - vec2[1];
+        dest[2] = vec[2] - vec2[2];
+        return dest;
+    };
+
+    /**
+     * Performs a vector multiplication
+     *
+     * @param {vec3} vec First operand
+     * @param {vec3} vec2 Second operand
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.multiply = function (vec, vec2, dest) {
+        if (!dest || vec === dest) {
+            vec[0] *= vec2[0];
+            vec[1] *= vec2[1];
+            vec[2] *= vec2[2];
+            return vec;
+        }
+
+        dest[0] = vec[0] * vec2[0];
+        dest[1] = vec[1] * vec2[1];
+        dest[2] = vec[2] * vec2[2];
+        return dest;
+    };
+
+    /**
+     * Negates the components of a vec3
+     *
+     * @param {vec3} vec vec3 to negate
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.negate = function (vec, dest) {
+        if (!dest) { dest = vec; }
+
+        dest[0] = -vec[0];
+        dest[1] = -vec[1];
+        dest[2] = -vec[2];
+        return dest;
+    };
+
+    /**
+     * Multiplies the components of a vec3 by a scalar value
+     *
+     * @param {vec3} vec vec3 to scale
+     * @param {number} val Value to scale by
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.scale = function (vec, val, dest) {
+        if (!dest || vec === dest) {
+            vec[0] *= val;
+            vec[1] *= val;
+            vec[2] *= val;
+            return vec;
+        }
+
+        dest[0] = vec[0] * val;
+        dest[1] = vec[1] * val;
+        dest[2] = vec[2] * val;
+        return dest;
+    };
+
+    /**
+     * Generates a unit vector of the same direction as the provided vec3
+     * If vector length is 0, returns [0, 0, 0]
+     *
+     * @param {vec3} vec vec3 to normalize
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.normalize = function (vec, dest) {
+        if (!dest) { dest = vec; }
+
+        var x = vec[0], y = vec[1], z = vec[2],
+            len = Math.sqrt(x * x + y * y + z * z);
+
+        if (!len) {
+            dest[0] = 0;
+            dest[1] = 0;
+            dest[2] = 0;
+            return dest;
+        } else if (len === 1) {
+            dest[0] = x;
+            dest[1] = y;
+            dest[2] = z;
+            return dest;
+        }
+
+        len = 1 / len;
+        dest[0] = x * len;
+        dest[1] = y * len;
+        dest[2] = z * len;
+        return dest;
+    };
+
+    /**
+     * Generates the cross product of two vec3s
+     *
+     * @param {vec3} vec First operand
+     * @param {vec3} vec2 Second operand
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.cross = function (vec, vec2, dest) {
+        if (!dest) { dest = vec; }
+
+        var x = vec[0], y = vec[1], z = vec[2],
+            x2 = vec2[0], y2 = vec2[1], z2 = vec2[2];
+
+        dest[0] = y * z2 - z * y2;
+        dest[1] = z * x2 - x * z2;
+        dest[2] = x * y2 - y * x2;
+        return dest;
+    };
+
+    /**
+     * Caclulates the length of a vec3
+     *
+     * @param {vec3} vec vec3 to calculate length of
+     *
+     * @returns {number} Length of vec
+     */
+    vec3.length = function (vec) {
+        var x = vec[0], y = vec[1], z = vec[2];
+        return Math.sqrt(x * x + y * y + z * z);
+    };
+
+    /**
+     * Caclulates the squared length of a vec3
+     *
+     * @param {vec3} vec vec3 to calculate squared length of
+     *
+     * @returns {number} Squared Length of vec
+     */
+    vec3.squaredLength = function (vec) {
+        var x = vec[0], y = vec[1], z = vec[2];
+        return x * x + y * y + z * z;
+    };
+
+    /**
+     * Caclulates the dot product of two vec3s
+     *
+     * @param {vec3} vec First operand
+     * @param {vec3} vec2 Second operand
+     *
+     * @returns {number} Dot product of vec and vec2
+     */
+    vec3.dot = function (vec, vec2) {
+        return vec[0] * vec2[0] + vec[1] * vec2[1] + vec[2] * vec2[2];
+    };
+
+    /**
+     * Generates a unit vector pointing from one vector to another
+     *
+     * @param {vec3} vec Origin vec3
+     * @param {vec3} vec2 vec3 to point to
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.direction = function (vec, vec2, dest) {
+        if (!dest) { dest = vec; }
+
+        var x = vec[0] - vec2[0],
+            y = vec[1] - vec2[1],
+            z = vec[2] - vec2[2],
+            len = Math.sqrt(x * x + y * y + z * z);
+
+        if (!len) {
+            dest[0] = 0;
+            dest[1] = 0;
+            dest[2] = 0;
+            return dest;
+        }
+
+        len = 1 / len;
+        dest[0] = x * len;
+        dest[1] = y * len;
+        dest[2] = z * len;
+        return dest;
+    };
+
+    /**
+     * Performs a linear interpolation between two vec3
+     *
+     * @param {vec3} vec First vector
+     * @param {vec3} vec2 Second vector
+     * @param {number} lerp Interpolation amount between the two inputs
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.lerp = function (vec, vec2, lerp, dest) {
+        if (!dest) { dest = vec; }
+
+        dest[0] = vec[0] + lerp * (vec2[0] - vec[0]);
+        dest[1] = vec[1] + lerp * (vec2[1] - vec[1]);
+        dest[2] = vec[2] + lerp * (vec2[2] - vec[2]);
+
+        return dest;
+    };
+
+    /**
+     * Calculates the euclidian distance between two vec3
+     *
+     * Params:
+     * @param {vec3} vec First vector
+     * @param {vec3} vec2 Second vector
+     *
+     * @returns {number} Distance between vec and vec2
+     */
+    vec3.dist = function (vec, vec2) {
+        var x = vec2[0] - vec[0],
+            y = vec2[1] - vec[1],
+            z = vec2[2] - vec[2];
+            
+        return Math.sqrt(x*x + y*y + z*z);
+    };
+
+    // Pre-allocated to prevent unecessary garbage collection
+    var unprojectMat = null;
+    var unprojectVec = new MatrixArray(4);
+    /**
+     * Projects the specified vec3 from screen space into object space
+     * Based on the <a href="http://webcvs.freedesktop.org/mesa/Mesa/src/glu/mesa/project.c?revision=1.4&view=markup">Mesa gluUnProject implementation</a>
+     *
+     * @param {vec3} vec Screen-space vector to project
+     * @param {mat4} view View matrix
+     * @param {mat4} proj Projection matrix
+     * @param {vec4} viewport Viewport as given to gl.viewport [x, y, width, height]
+     * @param {vec3} [dest] vec3 receiving unprojected result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.unproject = function (vec, view, proj, viewport, dest) {
+        if (!dest) { dest = vec; }
+
+        if(!unprojectMat) {
+            unprojectMat = mat4.create();
+        }
+
+        var m = unprojectMat;
+        var v = unprojectVec;
+        
+        v[0] = (vec[0] - viewport[0]) * 2.0 / viewport[2] - 1.0;
+        v[1] = (vec[1] - viewport[1]) * 2.0 / viewport[3] - 1.0;
+        v[2] = 2.0 * vec[2] - 1.0;
+        v[3] = 1.0;
+        
+        mat4.multiply(proj, view, m);
+        if(!mat4.inverse(m)) { return null; }
+        
+        mat4.multiplyVec4(m, v);
+        if(v[3] === 0.0) { return null; }
+
+        dest[0] = v[0] / v[3];
+        dest[1] = v[1] / v[3];
+        dest[2] = v[2] / v[3];
+        
+        return dest;
+    };
+
+    var xUnitVec3 = vec3.createFrom(1,0,0);
+    var yUnitVec3 = vec3.createFrom(0,1,0);
+    var zUnitVec3 = vec3.createFrom(0,0,1);
+
+    var tmpvec3 = vec3.create();
+    /**
+     * Generates a quaternion of rotation between two given normalized vectors
+     *
+     * @param {vec3} a Normalized source vector
+     * @param {vec3} b Normalized target vector
+     * @param {quat4} [dest] quat4 receiving operation result.
+     *
+     * @returns {quat4} dest if specified, a new quat4 otherwise
+     */
+    vec3.rotationTo = function (a, b, dest) {
+        if (!dest) { dest = quat4.create(); }
+        
+        var d = vec3.dot(a, b);
+        var axis = tmpvec3;
+        if (d >= 1.0) {
+            quat4.set(identityQuat4, dest);
+        } else if (d < (0.000001 - 1.0)) {
+            vec3.cross(xUnitVec3, a, axis);
+            if (vec3.length(axis) < 0.000001)
+                vec3.cross(yUnitVec3, a, axis);
+            if (vec3.length(axis) < 0.000001)
+                vec3.cross(zUnitVec3, a, axis);
+            vec3.normalize(axis);
+            quat4.fromAngleAxis(Math.PI, axis, dest);
+        } else {
+            var s = Math.sqrt((1.0 + d) * 2.0);
+            var sInv = 1.0 / s;
+            vec3.cross(a, b, axis);
+            dest[0] = axis[0] * sInv;
+            dest[1] = axis[1] * sInv;
+            dest[2] = axis[2] * sInv;
+            dest[3] = s * 0.5;
+            quat4.normalize(dest);
+        }
+        if (dest[3] > 1.0) dest[3] = 1.0;
+        else if (dest[3] < -1.0) dest[3] = -1.0;
+        return dest;
+    };
+
+    /**
+     * Returns a string representation of a vector
+     *
+     * @param {vec3} vec Vector to represent as a string
+     *
+     * @returns {string} String representation of vec
+     */
+    vec3.str = function (vec) {
+        return '[' + vec[0] + ', ' + vec[1] + ', ' + vec[2] + ']';
+    };
+
+    /**
+     * @class 3x3 Matrix
+     * @name mat3
+     */
+    var mat3 = {};
+
+    /**
+     * Creates a new instance of a mat3 using the default array type
+     * Any javascript array-like object containing at least 9 numeric elements can serve as a mat3
+     *
+     * @param {mat3} [mat] mat3 containing values to initialize with
+     *
+     * @returns {mat3} New mat3
+     */
+    mat3.create = function (mat) {
+        var dest = new MatrixArray(9);
+
+        if (mat) {
+            dest[0] = mat[0];
+            dest[1] = mat[1];
+            dest[2] = mat[2];
+            dest[3] = mat[3];
+            dest[4] = mat[4];
+            dest[5] = mat[5];
+            dest[6] = mat[6];
+            dest[7] = mat[7];
+            dest[8] = mat[8];
+        } else {
+            dest[0] = dest[1] =
+            dest[2] = dest[3] =
+            dest[4] = dest[5] =
+            dest[6] = dest[7] =
+            dest[8] = 0;
+        }
+
+        return dest;
+    };
+
+    /**
+     * Creates a new instance of a mat3, initializing it with the given arguments
+     *
+     * @param {number} m00
+     * @param {number} m01
+     * @param {number} m02
+     * @param {number} m10
+     * @param {number} m11
+     * @param {number} m12
+     * @param {number} m20
+     * @param {number} m21
+     * @param {number} m22
+
+     * @returns {mat3} New mat3
+     */
+    mat3.createFrom = function (m00, m01, m02, m10, m11, m12, m20, m21, m22) {
+        var dest = new MatrixArray(9);
+
+        dest[0] = m00;
+        dest[1] = m01;
+        dest[2] = m02;
+        dest[3] = m10;
+        dest[4] = m11;
+        dest[5] = m12;
+        dest[6] = m20;
+        dest[7] = m21;
+        dest[8] = m22;
+
+        return dest;
+    };
+
+    /**
+     * Calculates the determinant of a mat3
+     *
+     * @param {mat3} mat mat3 to calculate determinant of
+     *
+     * @returns {Number} determinant of mat
+     */
+    mat3.determinant = function (mat) {
+        var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+            a10 = mat[3], a11 = mat[4], a12 = mat[5],
+            a20 = mat[6], a21 = mat[7], a22 = mat[8];
+
+        return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);
+    };
+
+    /**
+     * Calculates the inverse matrix of a mat3
+     *
+     * @param {mat3} mat mat3 to calculate inverse of
+     * @param {mat3} [dest] mat3 receiving inverse matrix. If not specified result is written to mat
+     *
+     * @param {mat3} dest is specified, mat otherwise, null if matrix cannot be inverted
+     */
+    mat3.inverse = function (mat, dest) {
+        var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+            a10 = mat[3], a11 = mat[4], a12 = mat[5],
+            a20 = mat[6], a21 = mat[7], a22 = mat[8],
+
+            b01 = a22 * a11 - a12 * a21,
+            b11 = -a22 * a10 + a12 * a20,
+            b21 = a21 * a10 - a11 * a20,
+
+            d = a00 * b01 + a01 * b11 + a02 * b21,
+            id;
+
+        if (!d) { return null; }
+        id = 1 / d;
+
+        if (!dest) { dest = mat3.create(); }
+
+        dest[0] = b01 * id;
+        dest[1] = (-a22 * a01 + a02 * a21) * id;
+        dest[2] = (a12 * a01 - a02 * a11) * id;
+        dest[3] = b11 * id;
+        dest[4] = (a22 * a00 - a02 * a20) * id;
+        dest[5] = (-a12 * a00 + a02 * a10) * id;
+        dest[6] = b21 * id;
+        dest[7] = (-a21 * a00 + a01 * a20) * id;
+        dest[8] = (a11 * a00 - a01 * a10) * id;
+        return dest;
+    };
+    
+    /**
+     * Performs a matrix multiplication
+     *
+     * @param {mat3} mat First operand
+     * @param {mat3} mat2 Second operand
+     * @param {mat3} [dest] mat3 receiving operation result. If not specified result is written to mat
+     *
+     * @returns {mat3} dest if specified, mat otherwise
+     */
+    mat3.multiply = function (mat, mat2, dest) {
+        if (!dest) { dest = mat; }
+        
+
+        // Cache the matrix values (makes for huge speed increases!)
+        var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+            a10 = mat[3], a11 = mat[4], a12 = mat[5],
+            a20 = mat[6], a21 = mat[7], a22 = mat[8],
+
+            b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
+            b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
+            b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
+
+        dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
+        dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
+        dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
+
+        dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
+        dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
+        dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
+
+        dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
+        dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
+        dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
+
+        return dest;
+    };
+
+    /**
+     * Transforms the vec2 according to the given mat3.
+     *
+     * @param {mat3} matrix mat3 to multiply against
+     * @param {vec2} vec    the vector to multiply
+     * @param {vec2} [dest] an optional receiving vector. If not given, vec is used.
+     *
+     * @returns {vec2} The multiplication result
+     **/
+    mat3.multiplyVec2 = function(matrix, vec, dest) {
+      if (!dest) dest = vec;
+      var x = vec[0], y = vec[1];
+      dest[0] = x * matrix[0] + y * matrix[3] + matrix[6];
+      dest[1] = x * matrix[1] + y * matrix[4] + matrix[7];
+      return dest;
+    };
+
+    /**
+     * Transforms the vec3 according to the given mat3
+     *
+     * @param {mat3} matrix mat3 to multiply against
+     * @param {vec3} vec    the vector to multiply
+     * @param {vec3} [dest] an optional receiving vector. If not given, vec is used.
+     *
+     * @returns {vec3} The multiplication result
+     **/
+    mat3.multiplyVec3 = function(matrix, vec, dest) {
+      if (!dest) dest = vec;
+      var x = vec[0], y = vec[1], z = vec[2];
+      dest[0] = x * matrix[0] + y * matrix[3] + z * matrix[6];
+      dest[1] = x * matrix[1] + y * matrix[4] + z * matrix[7];
+      dest[2] = x * matrix[2] + y * matrix[5] + z * matrix[8];
+      
+      return dest;
+    };
+
+    /**
+     * Copies the values of one mat3 to another
+     *
+     * @param {mat3} mat mat3 containing values to copy
+     * @param {mat3} dest mat3 receiving copied values
+     *
+     * @returns {mat3} dest
+     */
+    mat3.set = function (mat, dest) {
+        dest[0] = mat[0];
+        dest[1] = mat[1];
+        dest[2] = mat[2];
+        dest[3] = mat[3];
+        dest[4] = mat[4];
+        dest[5] = mat[5];
+        dest[6] = mat[6];
+        dest[7] = mat[7];
+        dest[8] = mat[8];
+        return dest;
+    };
+
+    /**
+     * Compares two matrices for equality within a certain margin of error
+     *
+     * @param {mat3} a First matrix
+     * @param {mat3} b Second matrix
+     *
+     * @returns {Boolean} True if a is equivalent to b
+     */
+    mat3.equal = function (a, b) {
+        return a === b || (
+            Math.abs(a[0] - b[0]) < FLOAT_EPSILON &&
+            Math.abs(a[1] - b[1]) < FLOAT_EPSILON &&
+            Math.abs(a[2] - b[2]) < FLOAT_EPSILON &&
+            Math.abs(a[3] - b[3]) < FLOAT_EPSILON &&
+            Math.abs(a[4] - b[4]) < FLOAT_EPSILON &&
+            Math.abs(a[5] - b[5]) < FLOAT_EPSILON &&
+            Math.abs(a[6] - b[6]) < FLOAT_EPSILON &&
+            Math.abs(a[7] - b[7]) < FLOAT_EPSILON &&
+            Math.abs(a[8] - b[8]) < FLOAT_EPSILON
+        );
+    };
+
+    /**
+     * Sets a mat3 to an identity matrix
+     *
+     * @param {mat3} dest mat3 to set
+     *
+     * @returns dest if specified, otherwise a new mat3
+     */
+    mat3.identity = function (dest) {
+        if (!dest) { dest = mat3.create(); }
+        dest[0] = 1;
+        dest[1] = 0;
+        dest[2] = 0;
+        dest[3] = 0;
+        dest[4] = 1;
+        dest[5] = 0;
+        dest[6] = 0;
+        dest[7] = 0;
+        dest[8] = 1;
+        return dest;
+    };
+
+    /**
+     * Transposes a mat3 (flips the values over the diagonal)
+     *
+     * Params:
+     * @param {mat3} mat mat3 to transpose
+     * @param {mat3} [dest] mat3 receiving transposed values. If not specified result is written to mat
+     *
+     * @returns {mat3} dest is specified, mat otherwise
+     */
+    mat3.transpose = function (mat, dest) {
+        // If we are transposing ourselves we can skip a few steps but have to cache some values
+        if (!dest || mat === dest) {
+            var a01 = mat[1], a02 = mat[2],
+                a12 = mat[5];
+
+            mat[1] = mat[3];
+            mat[2] = mat[6];
+            mat[3] = a01;
+            mat[5] = mat[7];
+            mat[6] = a02;
+            mat[7] = a12;
+            return mat;
+        }
+
+        dest[0] = mat[0];
+        dest[1] = mat[3];
+        dest[2] = mat[6];
+        dest[3] = mat[1];
+        dest[4] = mat[4];
+        dest[5] = mat[7];
+        dest[6] = mat[2];
+        dest[7] = mat[5];
+        dest[8] = mat[8];
+        return dest;
+    };
+
+    /**
+     * Copies the elements of a mat3 into the upper 3x3 elements of a mat4
+     *
+     * @param {mat3} mat mat3 containing values to copy
+     * @param {mat4} [dest] mat4 receiving copied values
+     *
+     * @returns {mat4} dest if specified, a new mat4 otherwise
+     */
+    mat3.toMat4 = function (mat, dest) {
+        if (!dest) { dest = mat4.create(); }
+
+        dest[15] = 1;
+        dest[14] = 0;
+        dest[13] = 0;
+        dest[12] = 0;
+
+        dest[11] = 0;
+        dest[10] = mat[8];
+        dest[9] = mat[7];
+        dest[8] = mat[6];
+
+        dest[7] = 0;
+        dest[6] = mat[5];
+        dest[5] = mat[4];
+        dest[4] = mat[3];
+
+        dest[3] = 0;
+        dest[2] = mat[2];
+        dest[1] = mat[1];
+        dest[0] = mat[0];
+
+        return dest;
+    };
+
+    /**
+     * Returns a string representation of a mat3
+     *
+     * @param {mat3} mat mat3 to represent as a string
+     *
+     * @param {string} String representation of mat
+     */
+    mat3.str = function (mat) {
+        return '[' + mat[0] + ', ' + mat[1] + ', ' + mat[2] +
+            ', ' + mat[3] + ', ' + mat[4] + ', ' + mat[5] +
+            ', ' + mat[6] + ', ' + mat[7] + ', ' + mat[8] + ']';
+    };
+
+    /**
+     * @class 4x4 Matrix
+     * @name mat4
+     */
+    var mat4 = {};
+
+    /**
+     * Creates a new instance of a mat4 using the default array type
+     * Any javascript array-like object containing at least 16 numeric elements can serve as a mat4
+     *
+     * @param {mat4} [mat] mat4 containing values to initialize with
+     *
+     * @returns {mat4} New mat4
+     */
+    mat4.create = function (mat) {
+        var dest = new MatrixArray(16);
+
+        if (mat) {
+            dest[0] = mat[0];
+            dest[1] = mat[1];
+            dest[2] = mat[2];
+            dest[3] = mat[3];
+            dest[4] = mat[4];
+            dest[5] = mat[5];
+            dest[6] = mat[6];
+            dest[7] = mat[7];
+            dest[8] = mat[8];
+            dest[9] = mat[9];
+            dest[10] = mat[10];
+            dest[11] = mat[11];
+            dest[12] = mat[12];
+            dest[13] = mat[13];
+            dest[14] = mat[14];
+            dest[15] = mat[15];
+        }
+
+        return dest;
+    };
+
+    /**
+     * Creates a new instance of a mat4, initializing it with the given arguments
+     *
+     * @param {number} m00
+     * @param {number} m01
+     * @param {number} m02
+     * @param {number} m03
+     * @param {number} m10
+     * @param {number} m11
+     * @param {number} m12
+     * @param {number} m13
+     * @param {number} m20
+     * @param {number} m21
+     * @param {number} m22
+     * @param {number} m23
+     * @param {number} m30
+     * @param {number} m31
+     * @param {number} m32
+     * @param {number} m33
+
+     * @returns {mat4} New mat4
+     */
+    mat4.createFrom = function (m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {
+        var dest = new MatrixArray(16);
+
+        dest[0] = m00;
+        dest[1] = m01;
+        dest[2] = m02;
+        dest[3] = m03;
+        dest[4] = m10;
+        dest[5] = m11;
+        dest[6] = m12;
+        dest[7] = m13;
+        dest[8] = m20;
+        dest[9] = m21;
+        dest[10] = m22;
+        dest[11] = m23;
+        dest[12] = m30;
+        dest[13] = m31;
+        dest[14] = m32;
+        dest[15] = m33;
+
+        return dest;
+    };
+
+    /**
+     * Copies the values of one mat4 to another
+     *
+     * @param {mat4} mat mat4 containing values to copy
+     * @param {mat4} dest mat4 receiving copied values
+     *
+     * @returns {mat4} dest
+     */
+    mat4.set = function (mat, dest) {
+        dest[0] = mat[0];
+        dest[1] = mat[1];
+        dest[2] = mat[2];
+        dest[3] = mat[3];
+        dest[4] = mat[4];
+        dest[5] = mat[5];
+        dest[6] = mat[6];
+        dest[7] = mat[7];
+        dest[8] = mat[8];
+        dest[9] = mat[9];
+        dest[10] = mat[10];
+        dest[11] = mat[11];
+        dest[12] = mat[12];
+        dest[13] = mat[13];
+        dest[14] = mat[14];
+        dest[15] = mat[15];
+        return dest;
+    };
+
+    /**
+     * Compares two matrices for equality within a certain margin of error
+     *
+     * @param {mat4} a First matrix
+     * @param {mat4} b Second matrix
+     *
+     * @returns {Boolean} True if a is equivalent to b
+     */
+    mat4.equal = function (a, b) {
+        return a === b || (
+            Math.abs(a[0] - b[0]) < FLOAT_EPSILON &&
+            Math.abs(a[1] - b[1]) < FLOAT_EPSILON &&
+            Math.abs(a[2] - b[2]) < FLOAT_EPSILON &&
+            Math.abs(a[3] - b[3]) < FLOAT_EPSILON &&
+            Math.abs(a[4] - b[4]) < FLOAT_EPSILON &&
+            Math.abs(a[5] - b[5]) < FLOAT_EPSILON &&
+            Math.abs(a[6] - b[6]) < FLOAT_EPSILON &&
+            Math.abs(a[7] - b[7]) < FLOAT_EPSILON &&
+            Math.abs(a[8] - b[8]) < FLOAT_EPSILON &&
+            Math.abs(a[9] - b[9]) < FLOAT_EPSILON &&
+            Math.abs(a[10] - b[10]) < FLOAT_EPSILON &&
+            Math.abs(a[11] - b[11]) < FLOAT_EPSILON &&
+            Math.abs(a[12] - b[12]) < FLOAT_EPSILON &&
+            Math.abs(a[13] - b[13]) < FLOAT_EPSILON &&
+            Math.abs(a[14] - b[14]) < FLOAT_EPSILON &&
+            Math.abs(a[15] - b[15]) < FLOAT_EPSILON
+        );
+    };
+
+    /**
+     * Sets a mat4 to an identity matrix
+     *
+     * @param {mat4} dest mat4 to set
+     *
+     * @returns {mat4} dest
+     */
+    mat4.identity = function (dest) {
+        if (!dest) { dest = mat4.create(); }
+        dest[0] = 1;
+        dest[1] = 0;
+        dest[2] = 0;
+        dest[3] = 0;
+        dest[4] = 0;
+        dest[5] = 1;
+        dest[6] = 0;
+        dest[7] = 0;
+        dest[8] = 0;
+        dest[9] = 0;
+        dest[10] = 1;
+        dest[11] = 0;
+        dest[12] = 0;
+        dest[13] = 0;
+        dest[14] = 0;
+        dest[15] = 1;
+        return dest;
+    };
+
+    /**
+     * Transposes a mat4 (flips the values over the diagonal)
+     *
+     * @param {mat4} mat mat4 to transpose
+     * @param {mat4} [dest] mat4 receiving transposed values. If not specified result is written to mat
+     *
+     * @param {mat4} dest is specified, mat otherwise
+     */
+    mat4.transpose = function (mat, dest) {
+        // If we are transposing ourselves we can skip a few steps but have to cache some values
+        if (!dest || mat === dest) {
+            var a01 = mat[1], a02 = mat[2], a03 = mat[3],
+                a12 = mat[6], a13 = mat[7],
+                a23 = mat[11];
+
+            mat[1] = mat[4];
+            mat[2] = mat[8];
+            mat[3] = mat[12];
+            mat[4] = a01;
+            mat[6] = mat[9];
+            mat[7] = mat[13];
+            mat[8] = a02;
+            mat[9] = a12;
+            mat[11] = mat[14];
+            mat[12] = a03;
+            mat[13] = a13;
+            mat[14] = a23;
+            return mat;
+        }
+
+        dest[0] = mat[0];
+        dest[1] = mat[4];
+        dest[2] = mat[8];
+        dest[3] = mat[12];
+        dest[4] = mat[1];
+        dest[5] = mat[5];
+        dest[6] = mat[9];
+        dest[7] = mat[13];
+        dest[8] = mat[2];
+        dest[9] = mat[6];
+        dest[10] = mat[10];
+        dest[11] = mat[14];
+        dest[12] = mat[3];
+        dest[13] = mat[7];
+        dest[14] = mat[11];
+        dest[15] = mat[15];
+        return dest;
+    };
+
+    /**
+     * Calculates the determinant of a mat4
+     *
+     * @param {mat4} mat mat4 to calculate determinant of
+     *
+     * @returns {number} determinant of mat
+     */
+    mat4.determinant = function (mat) {
+        // Cache the matrix values (makes for huge speed increases!)
+        var a00 = mat[0], a01 = mat[1], a02 = mat[2], a03 = mat[3],
+            a10 = mat[4], a11 = mat[5], a12 = mat[6], a13 = mat[7],
+            a20 = mat[8], a21 = mat[9], a22 = mat[10], a23 = mat[11],
+            a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
+
+        return (a30 * a21 * a12 * a03 - a20 * a31 * a12 * a03 - a30 * a11 * a22 * a03 + a10 * a31 * a22 * a03 +
+                a20 * a11 * a32 * a03 - a10 * a21 * a32 * a03 - a30 * a21 * a02 * a13 + a20 * a31 * a02 * a13 +
+                a30 * a01 * a22 * a13 - a00 * a31 * a22 * a13 - a20 * a01 * a32 * a13 + a00 * a21 * a32 * a13 +
+                a30 * a11 * a02 * a23 - a10 * a31 * a02 * a23 - a30 * a01 * a12 * a23 + a00 * a31 * a12 * a23 +
+                a10 * a01 * a32 * a23 - a00 * a11 * a32 * a23 - a20 * a11 * a02 * a33 + a10 * a21 * a02 * a33 +
+                a20 * a01 * a12 * a33 - a00 * a21 * a12 * a33 - a10 * a01 * a22 * a33 + a00 * a11 * a22 * a33);
+    };
+
+    /**
+     * Calculates the inverse matrix of a mat4
+     *
+     * @param {mat4} mat mat4 to calculate inverse of
+     * @param {mat4} [dest] mat4 receiving inverse matrix. If not specified result is written to mat
+     *
+     * @param {mat4} dest is specified, mat otherwise, null if matrix cannot be inverted
+     */
+    mat4.inverse = function (mat, dest) {
+        if (!dest) { dest = mat; }
+
+        // Cache the matrix values (makes for huge speed increases!)
+        var a00 = mat[0], a01 = mat[1], a02 = mat[2], a03 = mat[3],
+            a10 = mat[4], a11 = mat[5], a12 = mat[6], a13 = mat[7],
+            a20 = mat[8], a21 = mat[9], a22 = mat[10], a23 = mat[11],
+            a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15],
+
+            b00 = a00 * a11 - a01 * a10,
+            b01 = a00 * a12 - a02 * a10,
+            b02 = a00 * a13 - a03 * a10,
+            b03 = a01 * a12 - a02 * a11,
+            b04 = a01 * a13 - a03 * a11,
+            b05 = a02 * a13 - a03 * a12,
+            b06 = a20 * a31 - a21 * a30,
+            b07 = a20 * a32 - a22 * a30,
+            b08 = a20 * a33 - a23 * a30,
+            b09 = a21 * a32 - a22 * a31,
+            b10 = a21 * a33 - a23 * a31,
+            b11 = a22 * a33 - a23 * a32,
+
+            d = (b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06),
+            invDet;
+
+            // Calculate the determinant
+            if (!d) { return null; }
+            invDet = 1 / d;
+
+        dest[0] = (a11 * b11 - a12 * b10 + a13 * b09) * invDet;
+        dest[1] = (-a01 * b11 + a02 * b10 - a03 * b09) * invDet;
+        dest[2] = (a31 * b05 - a32 * b04 + a33 * b03) * invDet;
+        dest[3] = (-a21 * b05 + a22 * b04 - a23 * b03) * invDet;
+        dest[4] = (-a10 * b11 + a12 * b08 - a13 * b07) * invDet;
+        dest[5] = (a00 * b11 - a02 * b08 + a03 * b07) * invDet;
+        dest[6] = (-a30 * b05 + a32 * b02 - a33 * b01) * invDet;
+        dest[7] = (a20 * b05 - a22 * b02 + a23 * b01) * invDet;
+        dest[8] = (a10 * b10 - a11 * b08 + a13 * b06) * invDet;
+        dest[9] = (-a00 * b10 + a01 * b08 - a03 * b06) * invDet;
+        dest[10] = (a30 * b04 - a31 * b02 + a33 * b00) * invDet;
+        dest[11] = (-a20 * b04 + a21 * b02 - a23 * b00) * invDet;
+        dest[12] = (-a10 * b09 + a11 * b07 - a12 * b06) * invDet;
+        dest[13] = (a00 * b09 - a01 * b07 + a02 * b06) * invDet;
+        dest[14] = (-a30 * b03 + a31 * b01 - a32 * b00) * invDet;
+        dest[15] = (a20 * b03 - a21 * b01 + a22 * b00) * invDet;
+
+        return dest;
+    };
+
+    /**
+     * Copies the upper 3x3 elements of a mat4 into another mat4
+     *
+     * @param {mat4} mat mat4 containing values to copy
+     * @param {mat4} [dest] mat4 receiving copied values
+     *
+     * @returns {mat4} dest is specified, a new mat4 otherwise
+     */
+    mat4.toRotationMat = function (mat, dest) {
+        if (!dest) { dest = mat4.create(); }
+
+        dest[0] = mat[0];
+        dest[1] = mat[1];
+        dest[2] = mat[2];
+        dest[3] = mat[3];
+        dest[4] = mat[4];
+        dest[5] = mat[5];
+        dest[6] = mat[6];
+        dest[7] = mat[7];
+        dest[8] = mat[8];
+        dest[9] = mat[9];
+        dest[10] = mat[10];
+        dest[11] = mat[11];
+        dest[12] = 0;
+        dest[13] = 0;
+        dest[14] = 0;
+        dest[15] = 1;
+
+        return dest;
+    };
+
+    /**
+     * Copies the upper 3x3 elements of a mat4 into a mat3
+     *
+     * @param {mat4} mat mat4 containing values to copy
+     * @param {mat3} [dest] mat3 receiving copied values
+     *
+     * @returns {mat3} dest is specified, a new mat3 otherwise
+     */
+    mat4.toMat3 = function (mat, dest) {
+        if (!dest) { dest = mat3.create(); }
+
+        dest[0] = mat[0];
+        dest[1] = mat[1];
+        dest[2] = mat[2];
+        dest[3] = mat[4];
+        dest[4] = mat[5];
+        dest[5] = mat[6];
+        dest[6] = mat[8];
+        dest[7] = mat[9];
+        dest[8] = mat[10];
+
+        return dest;
+    };
+
+    /**
+     * Calculates the inverse of the upper 3x3 elements of a mat4 and copies the result into a mat3
+     * The resulting matrix is useful for calculating transformed normals
+     *
+     * Params:
+     * @param {mat4} mat mat4 containing values to invert and copy
+     * @param {mat3} [dest] mat3 receiving values
+     *
+     * @returns {mat3} dest is specified, a new mat3 otherwise, null if the matrix cannot be inverted
+     */
+    mat4.toInverseMat3 = function (mat, dest) {
+        // Cache the matrix values (makes for huge speed increases!)
+        var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+            a10 = mat[4], a11 = mat[5], a12 = mat[6],
+            a20 = mat[8], a21 = mat[9], a22 = mat[10],
+
+            b01 = a22 * a11 - a12 * a21,
+            b11 = -a22 * a10 + a12 * a20,
+            b21 = a21 * a10 - a11 * a20,
+
+            d = a00 * b01 + a01 * b11 + a02 * b21,
+            id;
+
+        if (!d) { return null; }
+        id = 1 / d;
+
+        if (!dest) { dest = mat3.create(); }
+
+        dest[0] = b01 * id;
+        dest[1] = (-a22 * a01 + a02 * a21) * id;
+        dest[2] = (a12 * a01 - a02 * a11) * id;
+        dest[3] = b11 * id;
+        dest[4] = (a22 * a00 - a02 * a20) * id;
+        dest[5] = (-a12 * a00 + a02 * a10) * id;
+        dest[6] = b21 * id;
+        dest[7] = (-a21 * a00 + a01 * a20) * id;
+        dest[8] = (a11 * a00 - a01 * a10) * id;
+
+        return dest;
+    };
+
+    /**
+     * Performs a matrix multiplication
+     *
+     * @param {mat4} mat First operand
+     * @param {mat4} mat2 Second operand
+     * @param {mat4} [dest] mat4 receiving operation result. If not specified result is written to mat
+     *
+     * @returns {mat4} dest if specified, mat otherwise
+     */
+    mat4.multiply = function (mat, mat2, dest) {
+        if (!dest) { dest = mat; }
+
+        // Cache the matrix values (makes for huge speed increases!)
+        var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
+        var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
+        var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
+        var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
+
+        // Cache only the current line of the second matrix
+        var b0  = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];  
+        dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+        dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+        dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+        dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+        b0 = mat2[4];
+        b1 = mat2[5];
+        b2 = mat2[6];
+        b3 = mat2[7];
+        dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+        dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+        dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+        dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+        b0 = mat2[8];
+        b1 = mat2[9];
+        b2 = mat2[10];
+        b3 = mat2[11];
+        dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+        dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+        dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+        dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+        b0 = mat2[12];
+        b1 = mat2[13];
+        b2 = mat2[14];
+        b3 = mat2[15];
+        dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+        dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+        dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+        dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+        return dest;
+    };
+
+    /**
+     * Transforms a vec3 with the given matrix
+     * 4th vector component is implicitly '1'
+     *
+     * @param {mat4} mat mat4 to transform the vector with
+     * @param {vec3} vec vec3 to transform
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    mat4.multiplyVec3 = function (mat, vec, dest) {
+        if (!dest) { dest = vec; }
+
+        var x = vec[0], y = vec[1], z = vec[2];
+
+        dest[0] = mat[0] * x + mat[4] * y + mat[8] * z + mat[12];
+        dest[1] = mat[1] * x + mat[5] * y + mat[9] * z + mat[13];
+        dest[2] = mat[2] * x + mat[6] * y + mat[10] * z + mat[14];
+
+        return dest;
+    };
+
+    /**
+     * Transforms a vec4 with the given matrix
+     *
+     * @param {mat4} mat mat4 to transform the vector with
+     * @param {vec4} vec vec4 to transform
+     * @param {vec4} [dest] vec4 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec4} dest if specified, vec otherwise
+     */
+    mat4.multiplyVec4 = function (mat, vec, dest) {
+        if (!dest) { dest = vec; }
+
+        var x = vec[0], y = vec[1], z = vec[2], w = vec[3];
+
+        dest[0] = mat[0] * x + mat[4] * y + mat[8] * z + mat[12] * w;
+        dest[1] = mat[1] * x + mat[5] * y + mat[9] * z + mat[13] * w;
+        dest[2] = mat[2] * x + mat[6] * y + mat[10] * z + mat[14] * w;
+        dest[3] = mat[3] * x + mat[7] * y + mat[11] * z + mat[15] * w;
+
+        return dest;
+    };
+
+    /**
+     * Translates a matrix by the given vector
+     *
+     * @param {mat4} mat mat4 to translate
+     * @param {vec3} vec vec3 specifying the translation
+     * @param {mat4} [dest] mat4 receiving operation result. If not specified result is written to mat
+     *
+     * @returns {mat4} dest if specified, mat otherwise
+     */
+    mat4.translate = function (mat, vec, dest) {
+        var x = vec[0], y = vec[1], z = vec[2],
+            a00, a01, a02, a03,
+            a10, a11, a12, a13,
+            a20, a21, a22, a23;
+
+        if (!dest || mat === dest) {
+            mat[12] = mat[0] * x + mat[4] * y + mat[8] * z + mat[12];
+            mat[13] = mat[1] * x + mat[5] * y + mat[9] * z + mat[13];
+            mat[14] = mat[2] * x + mat[6] * y + mat[10] * z + mat[14];
+            mat[15] = mat[3] * x + mat[7] * y + mat[11] * z + mat[15];
+            return mat;
+        }
+
+        a00 = mat[0]; a01 = mat[1]; a02 = mat[2]; a03 = mat[3];
+        a10 = mat[4]; a11 = mat[5]; a12 = mat[6]; a13 = mat[7];
+        a20 = mat[8]; a21 = mat[9]; a22 = mat[10]; a23 = mat[11];
+
+        dest[0] = a00; dest[1] = a01; dest[2] = a02; dest[3] = a03;
+        dest[4] = a10; dest[5] = a11; dest[6] = a12; dest[7] = a13;
+        dest[8] = a20; dest[9] = a21; dest[10] = a22; dest[11] = a23;
+
+        dest[12] = a00 * x + a10 * y + a20 * z + mat[12];
+        dest[13] = a01 * x + a11 * y + a21 * z + mat[13];
+        dest[14] = a02 * x + a12 * y + a22 * z + mat[14];
+        dest[15] = a03 * x + a13 * y + a23 * z + mat[15];
+        return dest;
+    };
+
+    /**
+     * Scales a matrix by the given vector
+     *
+     * @param {mat4} mat mat4 to scale
+     * @param {vec3} vec vec3 specifying the scale for each axis
+     * @param {mat4} [dest] mat4 receiving operation result. If not specified result is written to mat
+     *
+     * @param {mat4} dest if specified, mat otherwise
+     */
+    mat4.scale = function (mat, vec, dest) {
+        var x = vec[0], y = vec[1], z = vec[2];
+
+        if (!dest || mat === dest) {
+            mat[0] *= x;
+            mat[1] *= x;
+            mat[2] *= x;
+            mat[3] *= x;
+            mat[4] *= y;
+            mat[5] *= y;
+            mat[6] *= y;
+            mat[7] *= y;
+            mat[8] *= z;
+            mat[9] *= z;
+            mat[10] *= z;
+            mat[11] *= z;
+            return mat;
+        }
+
+        dest[0] = mat[0] * x;
+        dest[1] = mat[1] * x;
+        dest[2] = mat[2] * x;
+        dest[3] = mat[3] * x;
+        dest[4] = mat[4] * y;
+        dest[5] = mat[5] * y;
+        dest[6] = mat[6] * y;
+        dest[7] = mat[7] * y;
+        dest[8] = mat[8] * z;
+        dest[9] = mat[9] * z;
+        dest[10] = mat[10] * z;
+        dest[11] = mat[11] * z;
+        dest[12] = mat[12];
+        dest[13] = mat[13];
+        dest[14] = mat[14];
+        dest[15] = mat[15];
+        return dest;
+    };
+
+    /**
+     * Rotates a matrix by the given angle around the specified axis
+     * If rotating around a primary axis (X,Y,Z) one of the specialized rotation functions should be used instead for performance
+     *
+     * @param {mat4} mat mat4 to rotate
+     * @param {number} angle Angle (in radians) to rotate
+     * @param {vec3} axis vec3 representing the axis to rotate around
+     * @param {mat4} [dest] mat4 receiving operation result. If not specified result is written to mat
+     *
+     * @returns {mat4} dest if specified, mat otherwise
+     */
+    mat4.rotate = function (mat, angle, axis, dest) {
+        var x = axis[0], y = axis[1], z = axis[2],
+            len = Math.sqrt(x * x + y * y + z * z),
+            s, c, t,
+            a00, a01, a02, a03,
+            a10, a11, a12, a13,
+            a20, a21, a22, a23,
+            b00, b01, b02,
+            b10, b11, b12,
+            b20, b21, b22;
+
+        if (!len) { return null; }
+        if (len !== 1) {
+            len = 1 / len;
+            x *= len;
+            y *= len;
+            z *= len;
+        }
+
+        s = Math.sin(angle);
+        c = Math.cos(angle);
+        t = 1 - c;
+
+        a00 = mat[0]; a01 = mat[1]; a02 = mat[2]; a03 = mat[3];
+        a10 = mat[4]; a11 = mat[5]; a12 = mat[6]; a13 = mat[7];
+        a20 = mat[8]; a21 = mat[9]; a22 = mat[10]; a23 = mat[11];
+
+        // Construct the elements of the rotation matrix
+        b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s;
+        b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s;
+        b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c;
+
+        if (!dest) {
+            dest = mat;
+        } else if (mat !== dest) { // If the source and destination differ, copy the unchanged last row
+            dest[12] = mat[12];
+            dest[13] = mat[13];
+            dest[14] = mat[14];
+            dest[15] = mat[15];
+        }
+
+        // Perform rotation-specific matrix multiplication
+        dest[0] = a00 * b00 + a10 * b01 + a20 * b02;
+        dest[1] = a01 * b00 + a11 * b01 + a21 * b02;
+        dest[2] = a02 * b00 + a12 * b01 + a22 * b02;
+        dest[3] = a03 * b00 + a13 * b01 + a23 * b02;
+
+        dest[4] = a00 * b10 + a10 * b11 + a20 * b12;
+        dest[5] = a01 * b10 + a11 * b11 + a21 * b12;
+        dest[6] = a02 * b10 + a12 * b11 + a22 * b12;
+        dest[7] = a03 * b10 + a13 * b11 + a23 * b12;
+
+        dest[8] = a00 * b20 + a10 * b21 + a20 * b22;
+        dest[9] = a01 * b20 + a11 * b21 + a21 * b22;
+        dest[10] = a02 * b20 + a12 * b21 + a22 * b22;
+        dest[11] = a03 * b20 + a13 * b21 + a23 * b22;
+        return dest;
+    };
+
+    /**
+     * Rotates a matrix by the given angle around the X axis
+     *
+     * @param {mat4} mat mat4 to rotate
+     * @param {number} angle Angle (in radians) to rotate
+     * @param {mat4} [dest] mat4 receiving operation result. If not specified result is written to mat
+     *
+     * @returns {mat4} dest if specified, mat otherwise
+     */
+    mat4.rotateX = function (mat, angle, dest) {
+        var s = Math.sin(angle),
+            c = Math.cos(angle),
+            a10 = mat[4],
+            a11 = mat[5],
+            a12 = mat[6],
+            a13 = mat[7],
+            a20 = mat[8],
+            a21 = mat[9],
+            a22 = mat[10],
+            a23 = mat[11];
+
+        if (!dest) {
+            dest = mat;
+        } else if (mat !== dest) { // If the source and destination differ, copy the unchanged rows
+            dest[0] = mat[0];
+            dest[1] = mat[1];
+            dest[2] = mat[2];
+            dest[3] = mat[3];
+
+            dest[12] = mat[12];
+            dest[13] = mat[13];
+            dest[14] = mat[14];
+            dest[15] = mat[15];
+        }
+
+        // Perform axis-specific matrix multiplication
+        dest[4] = a10 * c + a20 * s;
+        dest[5] = a11 * c + a21 * s;
+        dest[6] = a12 * c + a22 * s;
+        dest[7] = a13 * c + a23 * s;
+
+        dest[8] = a10 * -s + a20 * c;
+        dest[9] = a11 * -s + a21 * c;
+        dest[10] = a12 * -s + a22 * c;
+        dest[11] = a13 * -s + a23 * c;
+        return dest;
+    };
+
+    /**
+     * Rotates a matrix by the given angle around the Y axis
+     *
+     * @param {mat4} mat mat4 to rotate
+     * @param {number} angle Angle (in radians) to rotate
+     * @param {mat4} [dest] mat4 receiving operation result. If not specified result is written to mat
+     *
+     * @returns {mat4} dest if specified, mat otherwise
+     */
+    mat4.rotateY = function (mat, angle, dest) {
+        var s = Math.sin(angle),
+            c = Math.cos(angle),
+            a00 = mat[0],
+            a01 = mat[1],
+            a02 = mat[2],
+            a03 = mat[3],
+            a20 = mat[8],
+            a21 = mat[9],
+            a22 = mat[10],
+            a23 = mat[11];
+
+        if (!dest) {
+            dest = mat;
+        } else if (mat !== dest) { // If the source and destination differ, copy the unchanged rows
+            dest[4] = mat[4];
+            dest[5] = mat[5];
+            dest[6] = mat[6];
+            dest[7] = mat[7];
+
+            dest[12] = mat[12];
+            dest[13] = mat[13];
+            dest[14] = mat[14];
+            dest[15] = mat[15];
+        }
+
+        // Perform axis-specific matrix multiplication
+        dest[0] = a00 * c + a20 * -s;
+        dest[1] = a01 * c + a21 * -s;
+        dest[2] = a02 * c + a22 * -s;
+        dest[3] = a03 * c + a23 * -s;
+
+        dest[8] = a00 * s + a20 * c;
+        dest[9] = a01 * s + a21 * c;
+        dest[10] = a02 * s + a22 * c;
+        dest[11] = a03 * s + a23 * c;
+        return dest;
+    };
+
+    /**
+     * Rotates a matrix by the given angle around the Z axis
+     *
+     * @param {mat4} mat mat4 to rotate
+     * @param {number} angle Angle (in radians) to rotate
+     * @param {mat4} [dest] mat4 receiving operation result. If not specified result is written to mat
+     *
+     * @returns {mat4} dest if specified, mat otherwise
+     */
+    mat4.rotateZ = function (mat, angle, dest) {
+        var s = Math.sin(angle),
+            c = Math.cos(angle),
+            a00 = mat[0],
+            a01 = mat[1],
+            a02 = mat[2],
+            a03 = mat[3],
+            a10 = mat[4],
+            a11 = mat[5],
+            a12 = mat[6],
+            a13 = mat[7];
+
+        if (!dest) {
+            dest = mat;
+        } else if (mat !== dest) { // If the source and destination differ, copy the unchanged last row
+            dest[8] = mat[8];
+            dest[9] = mat[9];
+            dest[10] = mat[10];
+            dest[11] = mat[11];
+
+            dest[12] = mat[12];
+            dest[13] = mat[13];
+            dest[14] = mat[14];
+            dest[15] = mat[15];
+        }
+
+        // Perform axis-specific matrix multiplication
+        dest[0] = a00 * c + a10 * s;
+        dest[1] = a01 * c + a11 * s;
+        dest[2] = a02 * c + a12 * s;
+        dest[3] = a03 * c + a13 * s;
+
+        dest[4] = a00 * -s + a10 * c;
+        dest[5] = a01 * -s + a11 * c;
+        dest[6] = a02 * -s + a12 * c;
+        dest[7] = a03 * -s + a13 * c;
+
+        return dest;
+    };
+
+    /**
+     * Generates a frustum matrix with the given bounds
+     *
+     * @param {number} left Left bound of the frustum
+     * @param {number} right Right bound of the frustum
+     * @param {number} bottom Bottom bound of the frustum
+     * @param {number} top Top bound of the frustum
+     * @param {number} near Near bound of the frustum
+     * @param {number} far Far bound of the frustum
+     * @param {mat4} [dest] mat4 frustum matrix will be written into
+     *
+     * @returns {mat4} dest if specified, a new mat4 otherwise
+     */
+    mat4.frustum = function (left, right, bottom, top, near, far, dest) {
+        if (!dest) { dest = mat4.create(); }
+        var rl = (right - left),
+            tb = (top - bottom),
+            fn = (far - near);
+        dest[0] = (near * 2) / rl;
+        dest[1] = 0;
+        dest[2] = 0;
+        dest[3] = 0;
+        dest[4] = 0;
+        dest[5] = (near * 2) / tb;
+        dest[6] = 0;
+        dest[7] = 0;
+        dest[8] = (right + left) / rl;
+        dest[9] = (top + bottom) / tb;
+        dest[10] = -(far + near) / fn;
+        dest[11] = -1;
+        dest[12] = 0;
+        dest[13] = 0;
+        dest[14] = -(far * near * 2) / fn;
+        dest[15] = 0;
+        return dest;
+    };
+
+    /**
+     * Generates a perspective projection matrix with the given bounds
+     *
+     * @param {number} fovy Vertical field of view
+     * @param {number} aspect Aspect ratio. typically viewport width/height
+     * @param {number} near Near bound of the frustum
+     * @param {number} far Far bound of the frustum
+     * @param {mat4} [dest] mat4 frustum matrix will be written into
+     *
+     * @returns {mat4} dest if specified, a new mat4 otherwise
+     */
+    mat4.perspective = function (fovy, aspect, near, far, dest) {
+        var top = near * Math.tan(fovy * Math.PI / 360.0),
+            right = top * aspect;
+        return mat4.frustum(-right, right, -top, top, near, far, dest);
+    };
+
+    /**
+     * Generates a orthogonal projection matrix with the given bounds
+     *
+     * @param {number} left Left bound of the frustum
+     * @param {number} right Right bound of the frustum
+     * @param {number} bottom Bottom bound of the frustum
+     * @param {number} top Top bound of the frustum
+     * @param {number} near Near bound of the frustum
+     * @param {number} far Far bound of the frustum
+     * @param {mat4} [dest] mat4 frustum matrix will be written into
+     *
+     * @returns {mat4} dest if specified, a new mat4 otherwise
+     */
+    mat4.ortho = function (left, right, bottom, top, near, far, dest) {
+        if (!dest) { dest = mat4.create(); }
+        var rl = (right - left),
+            tb = (top - bottom),
+            fn = (far - near);
+        dest[0] = 2 / rl;
+        dest[1] = 0;
+        dest[2] = 0;
+        dest[3] = 0;
+        dest[4] = 0;
+        dest[5] = 2 / tb;
+        dest[6] = 0;
+        dest[7] = 0;
+        dest[8] = 0;
+        dest[9] = 0;
+        dest[10] = -2 / fn;
+        dest[11] = 0;
+        dest[12] = -(left + right) / rl;
+        dest[13] = -(top + bottom) / tb;
+        dest[14] = -(far + near) / fn;
+        dest[15] = 1;
+        return dest;
+    };
+
+    /**
+     * Generates a look-at matrix with the given eye position, focal point, and up axis
+     *
+     * @param {vec3} eye Position of the viewer
+     * @param {vec3} center Point the viewer is looking at
+     * @param {vec3} up vec3 pointing "up"
+     * @param {mat4} [dest] mat4 frustum matrix will be written into
+     *
+     * @returns {mat4} dest if specified, a new mat4 otherwise
+     */
+    mat4.lookAt = function (eye, center, up, dest) {
+        if (!dest) { dest = mat4.create(); }
+
+        var x0, x1, x2, y0, y1, y2, z0, z1, z2, len,
+            eyex = eye[0],
+            eyey = eye[1],
+            eyez = eye[2],
+            upx = up[0],
+            upy = up[1],
+            upz = up[2],
+            centerx = center[0],
+            centery = center[1],
+            centerz = center[2];
+
+        if (eyex === centerx && eyey === centery && eyez === centerz) {
+            return mat4.identity(dest);
+        }
+
+        //vec3.direction(eye, center, z);
+        z0 = eyex - centerx;
+        z1 = eyey - centery;
+        z2 = eyez - centerz;
+
+        // normalize (no check needed for 0 because of early return)
+        len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);
+        z0 *= len;
+        z1 *= len;
+        z2 *= len;
+
+        //vec3.normalize(vec3.cross(up, z, x));
+        x0 = upy * z2 - upz * z1;
+        x1 = upz * z0 - upx * z2;
+        x2 = upx * z1 - upy * z0;
+        len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);
+        if (!len) {
+            x0 = 0;
+            x1 = 0;
+            x2 = 0;
+        } else {
+            len = 1 / len;
+            x0 *= len;
+            x1 *= len;
+            x2 *= len;
+        }
+
+        //vec3.normalize(vec3.cross(z, x, y));
+        y0 = z1 * x2 - z2 * x1;
+        y1 = z2 * x0 - z0 * x2;
+        y2 = z0 * x1 - z1 * x0;
+
+        len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);
+        if (!len) {
+            y0 = 0;
+            y1 = 0;
+            y2 = 0;
+        } else {
+            len = 1 / len;
+            y0 *= len;
+            y1 *= len;
+            y2 *= len;
+        }
+
+        dest[0] = x0;
+        dest[1] = y0;
+        dest[2] = z0;
+        dest[3] = 0;
+        dest[4] = x1;
+        dest[5] = y1;
+        dest[6] = z1;
+        dest[7] = 0;
+        dest[8] = x2;
+        dest[9] = y2;
+        dest[10] = z2;
+        dest[11] = 0;
+        dest[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);
+        dest[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);
+        dest[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);
+        dest[15] = 1;
+
+        return dest;
+    };
+
+    /**
+     * Creates a matrix from a quaternion rotation and vector translation
+     * This is equivalent to (but much faster than):
+     *
+     *     mat4.identity(dest);
+     *     mat4.translate(dest, vec);
+     *     var quatMat = mat4.create();
+     *     quat4.toMat4(quat, quatMat);
+     *     mat4.multiply(dest, quatMat);
+     *
+     * @param {quat4} quat Rotation quaternion
+     * @param {vec3} vec Translation vector
+     * @param {mat4} [dest] mat4 receiving operation result. If not specified result is written to a new mat4
+     *
+     * @returns {mat4} dest if specified, a new mat4 otherwise
+     */
+    mat4.fromRotationTranslation = function (quat, vec, dest) {
+        if (!dest) { dest = mat4.create(); }
+
+        // Quaternion math
+        var x = quat[0], y = quat[1], z = quat[2], w = quat[3],
+            x2 = x + x,
+            y2 = y + y,
+            z2 = z + z,
+
+            xx = x * x2,
+            xy = x * y2,
+            xz = x * z2,
+            yy = y * y2,
+            yz = y * z2,
+            zz = z * z2,
+            wx = w * x2,
+            wy = w * y2,
+            wz = w * z2;
+
+        dest[0] = 1 - (yy + zz);
+        dest[1] = xy + wz;
+        dest[2] = xz - wy;
+        dest[3] = 0;
+        dest[4] = xy - wz;
+        dest[5] = 1 - (xx + zz);
+        dest[6] = yz + wx;
+        dest[7] = 0;
+        dest[8] = xz + wy;
+        dest[9] = yz - wx;
+        dest[10] = 1 - (xx + yy);
+        dest[11] = 0;
+        dest[12] = vec[0];
+        dest[13] = vec[1];
+        dest[14] = vec[2];
+        dest[15] = 1;
+        
+        return dest;
+    };
+
+    /**
+     * Returns a string representation of a mat4
+     *
+     * @param {mat4} mat mat4 to represent as a string
+     *
+     * @returns {string} String representation of mat
+     */
+    mat4.str = function (mat) {
+        return '[' + mat[0] + ', ' + mat[1] + ', ' + mat[2] + ', ' + mat[3] +
+            ', ' + mat[4] + ', ' + mat[5] + ', ' + mat[6] + ', ' + mat[7] +
+            ', ' + mat[8] + ', ' + mat[9] + ', ' + mat[10] + ', ' + mat[11] +
+            ', ' + mat[12] + ', ' + mat[13] + ', ' + mat[14] + ', ' + mat[15] + ']';
+    };
+
+    /**
+     * @class Quaternion
+     * @name quat4
+     */
+    var quat4 = {};
+
+    /**
+     * Creates a new instance of a quat4 using the default array type
+     * Any javascript array containing at least 4 numeric elements can serve as a quat4
+     *
+     * @param {quat4} [quat] quat4 containing values to initialize with
+     *
+     * @returns {quat4} New quat4
+     */
+    quat4.create = function (quat) {
+        var dest = new MatrixArray(4);
+
+        if (quat) {
+            dest[0] = quat[0];
+            dest[1] = quat[1];
+            dest[2] = quat[2];
+            dest[3] = quat[3];
+        } else {
+            dest[0] = dest[1] = dest[2] = dest[3] = 0;
+        }
+
+        return dest;
+    };
+
+    /**
+     * Creates a new instance of a quat4, initializing it with the given arguments
+     *
+     * @param {number} x X value
+     * @param {number} y Y value
+     * @param {number} z Z value
+     * @param {number} w W value
+
+     * @returns {quat4} New quat4
+     */
+    quat4.createFrom = function (x, y, z, w) {
+        var dest = new MatrixArray(4);
+
+        dest[0] = x;
+        dest[1] = y;
+        dest[2] = z;
+        dest[3] = w;
+
+        return dest;
+    };
+
+    /**
+     * Copies the values of one quat4 to another
+     *
+     * @param {quat4} quat quat4 containing values to copy
+     * @param {quat4} dest quat4 receiving copied values
+     *
+     * @returns {quat4} dest
+     */
+    quat4.set = function (quat, dest) {
+        dest[0] = quat[0];
+        dest[1] = quat[1];
+        dest[2] = quat[2];
+        dest[3] = quat[3];
+
+        return dest;
+    };
+
+    /**
+     * Compares two quaternions for equality within a certain margin of error
+     *
+     * @param {quat4} a First vector
+     * @param {quat4} b Second vector
+     *
+     * @returns {Boolean} True if a is equivalent to b
+     */
+    quat4.equal = function (a, b) {
+        return a === b || (
+            Math.abs(a[0] - b[0]) < FLOAT_EPSILON &&
+            Math.abs(a[1] - b[1]) < FLOAT_EPSILON &&
+            Math.abs(a[2] - b[2]) < FLOAT_EPSILON &&
+            Math.abs(a[3] - b[3]) < FLOAT_EPSILON
+        );
+    };
+
+    /**
+     * Creates a new identity Quat4
+     *
+     * @param {quat4} [dest] quat4 receiving copied values
+     *
+     * @returns {quat4} dest is specified, new quat4 otherwise
+     */
+    quat4.identity = function (dest) {
+        if (!dest) { dest = quat4.create(); }
+        dest[0] = 0;
+        dest[1] = 0;
+        dest[2] = 0;
+        dest[3] = 1;
+        return dest;
+    };
+
+    var identityQuat4 = quat4.identity();
+
+    /**
+     * Calculates the W component of a quat4 from the X, Y, and Z components.
+     * Assumes that quaternion is 1 unit in length.
+     * Any existing W component will be ignored.
+     *
+     * @param {quat4} quat quat4 to calculate W component of
+     * @param {quat4} [dest] quat4 receiving calculated values. If not specified result is written to quat
+     *
+     * @returns {quat4} dest if specified, quat otherwise
+     */
+    quat4.calculateW = function (quat, dest) {
+        var x = quat[0], y = quat[1], z = quat[2];
+
+        if (!dest || quat === dest) {
+            quat[3] = -Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));
+            return quat;
+        }
+        dest[0] = x;
+        dest[1] = y;
+        dest[2] = z;
+        dest[3] = -Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));
+        return dest;
+    };
+
+    /**
+     * Calculates the dot product of two quaternions
+     *
+     * @param {quat4} quat First operand
+     * @param {quat4} quat2 Second operand
+     *
+     * @return {number} Dot product of quat and quat2
+     */
+    quat4.dot = function(quat, quat2){
+        return quat[0]*quat2[0] + quat[1]*quat2[1] + quat[2]*quat2[2] + quat[3]*quat2[3];
+    };
+
+    /**
+     * Calculates the inverse of a quat4
+     *
+     * @param {quat4} quat quat4 to calculate inverse of
+     * @param {quat4} [dest] quat4 receiving inverse values. If not specified result is written to quat
+     *
+     * @returns {quat4} dest if specified, quat otherwise
+     */
+    quat4.inverse = function(quat, dest) {
+        var q0 = quat[0], q1 = quat[1], q2 = quat[2], q3 = quat[3],
+            dot = q0*q0 + q1*q1 + q2*q2 + q3*q3,
+            invDot = dot ? 1.0/dot : 0;
+        
+        // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0
+        
+        if(!dest || quat === dest) {
+            quat[0] *= -invDot;
+            quat[1] *= -invDot;
+            quat[2] *= -invDot;
+            quat[3] *= invDot;
+            return quat;
+        }
+        dest[0] = -quat[0]*invDot;
+        dest[1] = -quat[1]*invDot;
+        dest[2] = -quat[2]*invDot;
+        dest[3] = quat[3]*invDot;
+        return dest;
+    };
+
+
+    /**
+     * Calculates the conjugate of a quat4
+     * If the quaternion is normalized, this function is faster than quat4.inverse and produces the same result.
+     *
+     * @param {quat4} quat quat4 to calculate conjugate of
+     * @param {quat4} [dest] quat4 receiving conjugate values. If not specified result is written to quat
+     *
+     * @returns {quat4} dest if specified, quat otherwise
+     */
+    quat4.conjugate = function (quat, dest) {
+        if (!dest || quat === dest) {
+            quat[0] *= -1;
+            quat[1] *= -1;
+            quat[2] *= -1;
+            return quat;
+        }
+        dest[0] = -quat[0];
+        dest[1] = -quat[1];
+        dest[2] = -quat[2];
+        dest[3] = quat[3];
+        return dest;
+    };
+
+    /**
+     * Calculates the length of a quat4
+     *
+     * Params:
+     * @param {quat4} quat quat4 to calculate length of
+     *
+     * @returns Length of quat
+     */
+    quat4.length = function (quat) {
+        var x = quat[0], y = quat[1], z = quat[2], w = quat[3];
+        return Math.sqrt(x * x + y * y + z * z + w * w);
+    };
+
+    /**
+     * Generates a unit quaternion of the same direction as the provided quat4
+     * If quaternion length is 0, returns [0, 0, 0, 0]
+     *
+     * @param {quat4} quat quat4 to normalize
+     * @param {quat4} [dest] quat4 receiving operation result. If not specified result is written to quat
+     *
+     * @returns {quat4} dest if specified, quat otherwise
+     */
+    quat4.normalize = function (quat, dest) {
+        if (!dest) { dest = quat; }
+
+        var x = quat[0], y = quat[1], z = quat[2], w = quat[3],
+            len = Math.sqrt(x * x + y * y + z * z + w * w);
+        if (len === 0) {
+            dest[0] = 0;
+            dest[1] = 0;
+            dest[2] = 0;
+            dest[3] = 0;
+            return dest;
+        }
+        len = 1 / len;
+        dest[0] = x * len;
+        dest[1] = y * len;
+        dest[2] = z * len;
+        dest[3] = w * len;
+
+        return dest;
+    };
+
+    /**
+     * Performs quaternion addition
+     *
+     * @param {quat4} quat First operand
+     * @param {quat4} quat2 Second operand
+     * @param {quat4} [dest] quat4 receiving operation result. If not specified result is written to quat
+     *
+     * @returns {quat4} dest if specified, quat otherwise
+     */
+    quat4.add = function (quat, quat2, dest) {
+        if(!dest || quat === dest) {
+            quat[0] += quat2[0];
+            quat[1] += quat2[1];
+            quat[2] += quat2[2];
+            quat[3] += quat2[3];
+            return quat;
+        }
+        dest[0] = quat[0]+quat2[0];
+        dest[1] = quat[1]+quat2[1];
+        dest[2] = quat[2]+quat2[2];
+        dest[3] = quat[3]+quat2[3];
+        return dest;
+    };
+
+    /**
+     * Performs a quaternion multiplication
+     *
+     * @param {quat4} quat First operand
+     * @param {quat4} quat2 Second operand
+     * @param {quat4} [dest] quat4 receiving operation result. If not specified result is written to quat
+     *
+     * @returns {quat4} dest if specified, quat otherwise
+     */
+    quat4.multiply = function (quat, quat2, dest) {
+        if (!dest) { dest = quat; }
+
+        var qax = quat[0], qay = quat[1], qaz = quat[2], qaw = quat[3],
+            qbx = quat2[0], qby = quat2[1], qbz = quat2[2], qbw = quat2[3];
+
+        dest[0] = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
+        dest[1] = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
+        dest[2] = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
+        dest[3] = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
+
+        return dest;
+    };
+
+    /**
+     * Transforms a vec3 with the given quaternion
+     *
+     * @param {quat4} quat quat4 to transform the vector with
+     * @param {vec3} vec vec3 to transform
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns dest if specified, vec otherwise
+     */
+    quat4.multiplyVec3 = function (quat, vec, dest) {
+        if (!dest) { dest = vec; }
+
+        var x = vec[0], y = vec[1], z = vec[2],
+            qx = quat[0], qy = quat[1], qz = quat[2], qw = quat[3],
+
+            // calculate quat * vec
+            ix = qw * x + qy * z - qz * y,
+            iy = qw * y + qz * x - qx * z,
+            iz = qw * z + qx * y - qy * x,
+            iw = -qx * x - qy * y - qz * z;
+
+        // calculate result * inverse quat
+        dest[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;
+        dest[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;
+        dest[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;
+
+        return dest;
+    };
+
+    /**
+     * Multiplies the components of a quaternion by a scalar value
+     *
+     * @param {quat4} quat to scale
+     * @param {number} val Value to scale by
+     * @param {quat4} [dest] quat4 receiving operation result. If not specified result is written to quat
+     *
+     * @returns {quat4} dest if specified, quat otherwise
+     */
+    quat4.scale = function (quat, val, dest) {
+        if(!dest || quat === dest) {
+            quat[0] *= val;
+            quat[1] *= val;
+            quat[2] *= val;
+            quat[3] *= val;
+            return quat;
+        }
+        dest[0] = quat[0]*val;
+        dest[1] = quat[1]*val;
+        dest[2] = quat[2]*val;
+        dest[3] = quat[3]*val;
+        return dest;
+    };
+
+    /**
+     * Calculates a 3x3 matrix from the given quat4
+     *
+     * @param {quat4} quat quat4 to create matrix from
+     * @param {mat3} [dest] mat3 receiving operation result
+     *
+     * @returns {mat3} dest if specified, a new mat3 otherwise
+     */
+    quat4.toMat3 = function (quat, dest) {
+        if (!dest) { dest = mat3.create(); }
+
+        var x = quat[0], y = quat[1], z = quat[2], w = quat[3],
+            x2 = x + x,
+            y2 = y + y,
+            z2 = z + z,
+
+            xx = x * x2,
+            xy = x * y2,
+            xz = x * z2,
+            yy = y * y2,
+            yz = y * z2,
+            zz = z * z2,
+            wx = w * x2,
+            wy = w * y2,
+            wz = w * z2;
+
+        dest[0] = 1 - (yy + zz);
+        dest[1] = xy + wz;
+        dest[2] = xz - wy;
+
+        dest[3] = xy - wz;
+        dest[4] = 1 - (xx + zz);
+        dest[5] = yz + wx;
+
+        dest[6] = xz + wy;
+        dest[7] = yz - wx;
+        dest[8] = 1 - (xx + yy);
+
+        return dest;
+    };
+
+    /**
+     * Calculates a 4x4 matrix from the given quat4
+     *
+     * @param {quat4} quat quat4 to create matrix from
+     * @param {mat4} [dest] mat4 receiving operation result
+     *
+     * @returns {mat4} dest if specified, a new mat4 otherwise
+     */
+    quat4.toMat4 = function (quat, dest) {
+        if (!dest) { dest = mat4.create(); }
+
+        var x = quat[0], y = quat[1], z = quat[2], w = quat[3],
+            x2 = x + x,
+            y2 = y + y,
+            z2 = z + z,
+
+            xx = x * x2,
+            xy = x * y2,
+            xz = x * z2,
+            yy = y * y2,
+            yz = y * z2,
+            zz = z * z2,
+            wx = w * x2,
+            wy = w * y2,
+            wz = w * z2;
+
+        dest[0] = 1 - (yy + zz);
+        dest[1] = xy + wz;
+        dest[2] = xz - wy;
+        dest[3] = 0;
+
+        dest[4] = xy - wz;
+        dest[5] = 1 - (xx + zz);
+        dest[6] = yz + wx;
+        dest[7] = 0;
+
+        dest[8] = xz + wy;
+        dest[9] = yz - wx;
+        dest[10] = 1 - (xx + yy);
+        dest[11] = 0;
+
+        dest[12] = 0;
+        dest[13] = 0;
+        dest[14] = 0;
+        dest[15] = 1;
+
+        return dest;
+    };
+
+    /**
+     * Performs a spherical linear interpolation between two quat4
+     *
+     * @param {quat4} quat First quaternion
+     * @param {quat4} quat2 Second quaternion
+     * @param {number} slerp Interpolation amount between the two inputs
+     * @param {quat4} [dest] quat4 receiving operation result. If not specified result is written to quat
+     *
+     * @returns {quat4} dest if specified, quat otherwise
+     */
+    quat4.slerp = function (quat, quat2, slerp, dest) {
+        if (!dest) { dest = quat; }
+
+        var cosHalfTheta = quat[0] * quat2[0] + quat[1] * quat2[1] + quat[2] * quat2[2] + quat[3] * quat2[3],
+            halfTheta,
+            sinHalfTheta,
+            ratioA,
+            ratioB;
+
+        if (Math.abs(cosHalfTheta) >= 1.0) {
+            if (dest !== quat) {
+                dest[0] = quat[0];
+                dest[1] = quat[1];
+                dest[2] = quat[2];
+                dest[3] = quat[3];
+            }
+            return dest;
+        }
+
+        halfTheta = Math.acos(cosHalfTheta);
+        sinHalfTheta = Math.sqrt(1.0 - cosHalfTheta * cosHalfTheta);
+
+        if (Math.abs(sinHalfTheta) < 0.001) {
+            dest[0] = (quat[0] * 0.5 + quat2[0] * 0.5);
+            dest[1] = (quat[1] * 0.5 + quat2[1] * 0.5);
+            dest[2] = (quat[2] * 0.5 + quat2[2] * 0.5);
+            dest[3] = (quat[3] * 0.5 + quat2[3] * 0.5);
+            return dest;
+        }
+
+        ratioA = Math.sin((1 - slerp) * halfTheta) / sinHalfTheta;
+        ratioB = Math.sin(slerp * halfTheta) / sinHalfTheta;
+
+        dest[0] = (quat[0] * ratioA + quat2[0] * ratioB);
+        dest[1] = (quat[1] * ratioA + quat2[1] * ratioB);
+        dest[2] = (quat[2] * ratioA + quat2[2] * ratioB);
+        dest[3] = (quat[3] * ratioA + quat2[3] * ratioB);
+
+        return dest;
+    };
+
+    /**
+     * Creates a quaternion from the given 3x3 rotation matrix.
+     * If dest is omitted, a new quaternion will be created.
+     *
+     * @param {mat3}  mat    the rotation matrix
+     * @param {quat4} [dest] an optional receiving quaternion
+     *
+     * @returns {quat4} the quaternion constructed from the rotation matrix
+     *
+     */
+    quat4.fromRotationMatrix = function(mat, dest) {
+        if (!dest) dest = quat4.create();
+        
+        // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes
+        // article "Quaternion Calculus and Fast Animation".
+
+        var fTrace = mat[0] + mat[4] + mat[8];
+        var fRoot;
+
+        if ( fTrace > 0.0 ) {
+            // |w| > 1/2, may as well choose w > 1/2
+            fRoot = Math.sqrt(fTrace + 1.0);  // 2w
+            dest[3] = 0.5 * fRoot;
+            fRoot = 0.5/fRoot;  // 1/(4w)
+            dest[0] = (mat[7]-mat[5])*fRoot;
+            dest[1] = (mat[2]-mat[6])*fRoot;
+            dest[2] = (mat[3]-mat[1])*fRoot;
+        } else {
+            // |w| <= 1/2
+            var s_iNext = quat4.fromRotationMatrix.s_iNext = quat4.fromRotationMatrix.s_iNext || [1,2,0];
+            var i = 0;
+            if ( mat[4] > mat[0] )
+              i = 1;
+            if ( mat[8] > mat[i*3+i] )
+              i = 2;
+            var j = s_iNext[i];
+            var k = s_iNext[j];
+            
+            fRoot = Math.sqrt(mat[i*3+i]-mat[j*3+j]-mat[k*3+k] + 1.0);
+            dest[i] = 0.5 * fRoot;
+            fRoot = 0.5 / fRoot;
+            dest[3] = (mat[k*3+j] - mat[j*3+k]) * fRoot;
+            dest[j] = (mat[j*3+i] + mat[i*3+j]) * fRoot;
+            dest[k] = (mat[k*3+i] + mat[i*3+k]) * fRoot;
+        }
+        
+        return dest;
+    };
+
+    /**
+     * Alias. See the description for quat4.fromRotationMatrix().
+     */
+    mat3.toQuat4 = quat4.fromRotationMatrix;
+
+    (function() {
+        var mat = mat3.create();
+        
+        /**
+         * Creates a quaternion from the 3 given vectors. They must be perpendicular
+         * to one another and represent the X, Y and Z axes.
+         *
+         * If dest is omitted, a new quat4 will be created.
+         *
+         * Example: The default OpenGL orientation has a view vector [0, 0, -1],
+         * right vector [1, 0, 0], and up vector [0, 1, 0]. A quaternion representing
+         * this orientation could be constructed with:
+         *
+         *   quat = quat4.fromAxes([0, 0, -1], [1, 0, 0], [0, 1, 0], quat4.create());
+         *
+         * @param {vec3}  view   the view vector, or direction the object is pointing in
+         * @param {vec3}  right  the right vector, or direction to the "right" of the object
+         * @param {vec3}  up     the up vector, or direction towards the object's "up"
+         * @param {quat4} [dest] an optional receiving quat4
+         *
+         * @returns {quat4} dest
+         **/
+        quat4.fromAxes = function(view, right, up, dest) {
+            mat[0] = right[0];
+            mat[3] = right[1];
+            mat[6] = right[2];
+
+            mat[1] = up[0];
+            mat[4] = up[1];
+            mat[7] = up[2];
+
+            mat[2] = view[0];
+            mat[5] = view[1];
+            mat[8] = view[2];
+
+            return quat4.fromRotationMatrix(mat, dest);
+        };
+    })();
+
+    /**
+     * Sets a quat4 to the Identity and returns it.
+     *
+     * @param {quat4} [dest] quat4 to set. If omitted, a
+     * new quat4 will be created.
+     *
+     * @returns {quat4} dest
+     */
+    quat4.identity = function(dest) {
+        if (!dest) dest = quat4.create();
+        dest[0] = 0;
+        dest[1] = 0;
+        dest[2] = 0;
+        dest[3] = 1;
+        return dest;
+    };
+
+    /**
+     * Sets a quat4 from the given angle and rotation axis,
+     * then returns it. If dest is not given, a new quat4 is created.
+     *
+     * @param {Number} angle  the angle in radians
+     * @param {vec3}   axis   the axis around which to rotate
+     * @param {quat4}  [dest] the optional quat4 to store the result
+     *
+     * @returns {quat4} dest
+     **/
+    quat4.fromAngleAxis = function(angle, axis, dest) {
+        // The quaternion representing the rotation is
+        //   q = cos(A/2)+sin(A/2)*(x*i+y*j+z*k)
+        if (!dest) dest = quat4.create();
+        
+        var half = angle * 0.5;
+        var s = Math.sin(half);
+        dest[3] = Math.cos(half);
+        dest[0] = s * axis[0];
+        dest[1] = s * axis[1];
+        dest[2] = s * axis[2];
+        
+        return dest;
+    };
+
+    /**
+     * Stores the angle and axis in a vec4, where the XYZ components represent
+     * the axis and the W (4th) component is the angle in radians.
+     *
+     * If dest is not given, src will be modified in place and returned, after
+     * which it should not be considered not a quaternion (just an axis and angle).
+     *
+     * @param {quat4} quat   the quaternion whose angle and axis to store
+     * @param {vec4}  [dest] the optional vec4 to receive the data
+     *
+     * @returns {vec4} dest
+     */
+    quat4.toAngleAxis = function(src, dest) {
+        if (!dest) dest = src;
+        // The quaternion representing the rotation is
+        //   q = cos(A/2)+sin(A/2)*(x*i+y*j+z*k)
+
+        var sqrlen = src[0]*src[0]+src[1]*src[1]+src[2]*src[2];
+        if (sqrlen > 0)
+        {
+            dest[3] = 2 * Math.acos(src[3]);
+            var invlen = glMath.invsqrt(sqrlen);
+            dest[0] = src[0]*invlen;
+            dest[1] = src[1]*invlen;
+            dest[2] = src[2]*invlen;
+        } else {
+            // angle is 0 (mod 2*pi), so any axis will do
+            dest[3] = 0;
+            dest[0] = 1;
+            dest[1] = 0;
+            dest[2] = 0;
+        }
+        
+        return dest;
+    };
+
+    /**
+     * Returns a string representation of a quaternion
+     *
+     * @param {quat4} quat quat4 to represent as a string
+     *
+     * @returns {string} String representation of quat
+     */
+    quat4.str = function (quat) {
+        return '[' + quat[0] + ', ' + quat[1] + ', ' + quat[2] + ', ' + quat[3] + ']';
+    };
+    
+    /**
+     * @class 2 Dimensional Vector
+     * @name vec2
+     */
+    var vec2 = {};
+     
+    /**
+     * Creates a new vec2, initializing it from vec if vec
+     * is given.
+     *
+     * @param {vec2} [vec] the vector's initial contents
+     * @returns {vec2} a new 2D vector
+     */
+    vec2.create = function(vec) {
+        var dest = new MatrixArray(2);
+
+        if (vec) {
+            dest[0] = vec[0];
+            dest[1] = vec[1];
+        } else {
+            dest[0] = 0;
+            dest[1] = 0;
+        }
+        return dest;
+    };
+
+    /**
+     * Creates a new instance of a vec2, initializing it with the given arguments
+     *
+     * @param {number} x X value
+     * @param {number} y Y value
+
+     * @returns {vec2} New vec2
+     */
+    vec2.createFrom = function (x, y) {
+        var dest = new MatrixArray(2);
+
+        dest[0] = x;
+        dest[1] = y;
+
+        return dest;
+    };
+    
+    /**
+     * Adds the vec2's together. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecB.
+     *
+     * @param {vec2} vecA the first operand
+     * @param {vec2} vecB the second operand
+     * @param {vec2} [dest] the optional receiving vector
+     * @returns {vec2} dest
+     */
+    vec2.add = function(vecA, vecB, dest) {
+        if (!dest) dest = vecB;
+        dest[0] = vecA[0] + vecB[0];
+        dest[1] = vecA[1] + vecB[1];
+        return dest;
+    };
+    
+    /**
+     * Subtracts vecB from vecA. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecB.
+     *
+     * @param {vec2} vecA the first operand
+     * @param {vec2} vecB the second operand
+     * @param {vec2} [dest] the optional receiving vector
+     * @returns {vec2} dest
+     */
+    vec2.subtract = function(vecA, vecB, dest) {
+        if (!dest) dest = vecB;
+        dest[0] = vecA[0] - vecB[0];
+        dest[1] = vecA[1] - vecB[1];
+        return dest;
+    };
+    
+    /**
+     * Multiplies vecA with vecB. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecB.
+     *
+     * @param {vec2} vecA the first operand
+     * @param {vec2} vecB the second operand
+     * @param {vec2} [dest] the optional receiving vector
+     * @returns {vec2} dest
+     */
+    vec2.multiply = function(vecA, vecB, dest) {
+        if (!dest) dest = vecB;
+        dest[0] = vecA[0] * vecB[0];
+        dest[1] = vecA[1] * vecB[1];
+        return dest;
+    };
+    
+    /**
+     * Divides vecA by vecB. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecB.
+     *
+     * @param {vec2} vecA the first operand
+     * @param {vec2} vecB the second operand
+     * @param {vec2} [dest] the optional receiving vector
+     * @returns {vec2} dest
+     */
+    vec2.divide = function(vecA, vecB, dest) {
+        if (!dest) dest = vecB;
+        dest[0] = vecA[0] / vecB[0];
+        dest[1] = vecA[1] / vecB[1];
+        return dest;
+    };
+    
+    /**
+     * Scales vecA by some scalar number. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecA.
+     *
+     * This is the same as multiplying each component of vecA
+     * by the given scalar.
+     *
+     * @param {vec2}   vecA the vector to be scaled
+     * @param {Number} scalar the amount to scale the vector by
+     * @param {vec2}   [dest] the optional receiving vector
+     * @returns {vec2} dest
+     */
+    vec2.scale = function(vecA, scalar, dest) {
+        if (!dest) dest = vecA;
+        dest[0] = vecA[0] * scalar;
+        dest[1] = vecA[1] * scalar;
+        return dest;
+    };
+
+    /**
+     * Calculates the euclidian distance between two vec2
+     *
+     * Params:
+     * @param {vec2} vecA First vector
+     * @param {vec2} vecB Second vector
+     *
+     * @returns {number} Distance between vecA and vecB
+     */
+    vec2.dist = function (vecA, vecB) {
+        var x = vecB[0] - vecA[0],
+            y = vecB[1] - vecA[1];
+        return Math.sqrt(x*x + y*y);
+    };
+
+    /**
+     * Copies the values of one vec2 to another
+     *
+     * @param {vec2} vec vec2 containing values to copy
+     * @param {vec2} dest vec2 receiving copied values
+     *
+     * @returns {vec2} dest
+     */
+    vec2.set = function (vec, dest) {
+        dest[0] = vec[0];
+        dest[1] = vec[1];
+        return dest;
+    };
+
+    /**
+     * Compares two vectors for equality within a certain margin of error
+     *
+     * @param {vec2} a First vector
+     * @param {vec2} b Second vector
+     *
+     * @returns {Boolean} True if a is equivalent to b
+     */
+    vec2.equal = function (a, b) {
+        return a === b || (
+            Math.abs(a[0] - b[0]) < FLOAT_EPSILON &&
+            Math.abs(a[1] - b[1]) < FLOAT_EPSILON
+        );
+    };
+
+    /**
+     * Negates the components of a vec2
+     *
+     * @param {vec2} vec vec2 to negate
+     * @param {vec2} [dest] vec2 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec2} dest if specified, vec otherwise
+     */
+    vec2.negate = function (vec, dest) {
+        if (!dest) { dest = vec; }
+        dest[0] = -vec[0];
+        dest[1] = -vec[1];
+        return dest;
+    };
+
+    /**
+     * Normlize a vec2
+     *
+     * @param {vec2} vec vec2 to normalize
+     * @param {vec2} [dest] vec2 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec2} dest if specified, vec otherwise
+     */
+    vec2.normalize = function (vec, dest) {
+        if (!dest) { dest = vec; }
+        var mag = vec[0] * vec[0] + vec[1] * vec[1];
+        if (mag > 0) {
+            mag = Math.sqrt(mag);
+            dest[0] = vec[0] / mag;
+            dest[1] = vec[1] / mag;
+        } else {
+            dest[0] = dest[1] = 0;
+        }
+        return dest;
+    };
+
+    /**
+     * Computes the cross product of two vec2's. Note that the cross product must by definition
+     * produce a 3D vector. If a dest vector is given, it will contain the resultant 3D vector.
+     * Otherwise, a scalar number will be returned, representing the vector's Z coordinate, since
+     * its X and Y must always equal 0.
+     *
+     * Examples:
+     *    var crossResult = vec3.create();
+     *    vec2.cross([1, 2], [3, 4], crossResult);
+     *    //=> [0, 0, -2]
+     *
+     *    vec2.cross([1, 2], [3, 4]);
+     *    //=> -2
+     *
+     * See http://stackoverflow.com/questions/243945/calculating-a-2d-vectors-cross-product
+     * for some interesting facts.
+     *
+     * @param {vec2} vecA left operand
+     * @param {vec2} vecB right operand
+     * @param {vec2} [dest] optional vec2 receiving result. If not specified a scalar is returned
+     *
+     */
+    vec2.cross = function (vecA, vecB, dest) {
+        var z = vecA[0] * vecB[1] - vecA[1] * vecB[0];
+        if (!dest) return z;
+        dest[0] = dest[1] = 0;
+        dest[2] = z;
+        return dest;
+    };
+    
+    /**
+     * Caclulates the length of a vec2
+     *
+     * @param {vec2} vec vec2 to calculate length of
+     *
+     * @returns {Number} Length of vec
+     */
+    vec2.length = function (vec) {
+      var x = vec[0], y = vec[1];
+      return Math.sqrt(x * x + y * y);
+    };
+
+    /**
+     * Caclulates the squared length of a vec2
+     *
+     * @param {vec2} vec vec2 to calculate squared length of
+     *
+     * @returns {Number} Squared Length of vec
+     */
+    vec2.squaredLength = function (vec) {
+      var x = vec[0], y = vec[1];
+      return x * x + y * y;
+    };
+
+    /**
+     * Caclulates the dot product of two vec2s
+     *
+     * @param {vec2} vecA First operand
+     * @param {vec2} vecB Second operand
+     *
+     * @returns {Number} Dot product of vecA and vecB
+     */
+    vec2.dot = function (vecA, vecB) {
+        return vecA[0] * vecB[0] + vecA[1] * vecB[1];
+    };
+    
+    /**
+     * Generates a 2D unit vector pointing from one vector to another
+     *
+     * @param {vec2} vecA Origin vec2
+     * @param {vec2} vecB vec2 to point to
+     * @param {vec2} [dest] vec2 receiving operation result. If not specified result is written to vecA
+     *
+     * @returns {vec2} dest if specified, vecA otherwise
+     */
+    vec2.direction = function (vecA, vecB, dest) {
+        if (!dest) { dest = vecA; }
+
+        var x = vecA[0] - vecB[0],
+            y = vecA[1] - vecB[1],
+            len = x * x + y * y;
+
+        if (!len) {
+            dest[0] = 0;
+            dest[1] = 0;
+            dest[2] = 0;
+            return dest;
+        }
+
+        len = 1 / Math.sqrt(len);
+        dest[0] = x * len;
+        dest[1] = y * len;
+        return dest;
+    };
+
+    /**
+     * Performs a linear interpolation between two vec2
+     *
+     * @param {vec2} vecA First vector
+     * @param {vec2} vecB Second vector
+     * @param {Number} lerp Interpolation amount between the two inputs
+     * @param {vec2} [dest] vec2 receiving operation result. If not specified result is written to vecA
+     *
+     * @returns {vec2} dest if specified, vecA otherwise
+     */
+    vec2.lerp = function (vecA, vecB, lerp, dest) {
+        if (!dest) { dest = vecA; }
+        dest[0] = vecA[0] + lerp * (vecB[0] - vecA[0]);
+        dest[1] = vecA[1] + lerp * (vecB[1] - vecA[1]);
+        return dest;
+    };
+
+    /**
+     * Returns a string representation of a vector
+     *
+     * @param {vec2} vec Vector to represent as a string
+     *
+     * @returns {String} String representation of vec
+     */
+    vec2.str = function (vec) {
+        return '[' + vec[0] + ', ' + vec[1] + ']';
+    };
+    
+    /**
+     * @class 2x2 Matrix
+     * @name mat2
+     */
+    var mat2 = {};
+    
+    /**
+     * Creates a new 2x2 matrix. If src is given, the new matrix
+     * is initialized to those values.
+     *
+     * @param {mat2} [src] the seed values for the new matrix, if any
+     * @returns {mat2} a new matrix
+     */
+    mat2.create = function(src) {
+        var dest = new MatrixArray(4);
+        
+        if (src) {
+            dest[0] = src[0];
+            dest[1] = src[1];
+            dest[2] = src[2];
+            dest[3] = src[3];
+        } else {
+            dest[0] = dest[1] = dest[2] = dest[3] = 0;
+        }
+        return dest;
+    };
+
+    /**
+     * Creates a new instance of a mat2, initializing it with the given arguments
+     *
+     * @param {number} m00
+     * @param {number} m01
+     * @param {number} m10
+     * @param {number} m11
+
+     * @returns {mat2} New mat2
+     */
+    mat2.createFrom = function (m00, m01, m10, m11) {
+        var dest = new MatrixArray(4);
+
+        dest[0] = m00;
+        dest[1] = m01;
+        dest[2] = m10;
+        dest[3] = m11;
+
+        return dest;
+    };
+    
+    /**
+     * Copies the values of one mat2 to another
+     *
+     * @param {mat2} mat mat2 containing values to copy
+     * @param {mat2} dest mat2 receiving copied values
+     *
+     * @returns {mat2} dest
+     */
+    mat2.set = function (mat, dest) {
+        dest[0] = mat[0];
+        dest[1] = mat[1];
+        dest[2] = mat[2];
+        dest[3] = mat[3];
+        return dest;
+    };
+
+    /**
+     * Compares two matrices for equality within a certain margin of error
+     *
+     * @param {mat2} a First matrix
+     * @param {mat2} b Second matrix
+     *
+     * @returns {Boolean} True if a is equivalent to b
+     */
+    mat2.equal = function (a, b) {
+        return a === b || (
+            Math.abs(a[0] - b[0]) < FLOAT_EPSILON &&
+            Math.abs(a[1] - b[1]) < FLOAT_EPSILON &&
+            Math.abs(a[2] - b[2]) < FLOAT_EPSILON &&
+            Math.abs(a[3] - b[3]) < FLOAT_EPSILON
+        );
+    };
+
+    /**
+     * Sets a mat2 to an identity matrix
+     *
+     * @param {mat2} [dest] mat2 to set. If omitted a new one will be created.
+     *
+     * @returns {mat2} dest
+     */
+    mat2.identity = function (dest) {
+        if (!dest) { dest = mat2.create(); }
+        dest[0] = 1;
+        dest[1] = 0;
+        dest[2] = 0;
+        dest[3] = 1;
+        return dest;
+    };
+
+    /**
+     * Transposes a mat2 (flips the values over the diagonal)
+     *
+     * @param {mat2} mat mat2 to transpose
+     * @param {mat2} [dest] mat2 receiving transposed values. If not specified result is written to mat
+     *
+     * @param {mat2} dest if specified, mat otherwise
+     */
+    mat2.transpose = function (mat, dest) {
+        // If we are transposing ourselves we can skip a few steps but have to cache some values
+        if (!dest || mat === dest) {
+            var a00 = mat[1];
+            mat[1] = mat[2];
+            mat[2] = a00;
+            return mat;
+        }
+        
+        dest[0] = mat[0];
+        dest[1] = mat[2];
+        dest[2] = mat[1];
+        dest[3] = mat[3];
+        return dest;
+    };
+
+    /**
+     * Calculates the determinant of a mat2
+     *
+     * @param {mat2} mat mat2 to calculate determinant of
+     *
+     * @returns {Number} determinant of mat
+     */
+    mat2.determinant = function (mat) {
+      return mat[0] * mat[3] - mat[2] * mat[1];
+    };
+    
+    /**
+     * Calculates the inverse matrix of a mat2
+     *
+     * @param {mat2} mat mat2 to calculate inverse of
+     * @param {mat2} [dest] mat2 receiving inverse matrix. If not specified result is written to mat
+     *
+     * @param {mat2} dest is specified, mat otherwise, null if matrix cannot be inverted
+     */
+    mat2.inverse = function (mat, dest) {
+        if (!dest) { dest = mat; }
+        var a0 = mat[0], a1 = mat[1], a2 = mat[2], a3 = mat[3];
+        var det = a0 * a3 - a2 * a1;
+        if (!det) return null;
+        
+        det = 1.0 / det;
+        dest[0] =  a3 * det;
+        dest[1] = -a1 * det;
+        dest[2] = -a2 * det;
+        dest[3] =  a0 * det;
+        return dest;
+    };
+    
+    /**
+     * Performs a matrix multiplication
+     *
+     * @param {mat2} matA First operand
+     * @param {mat2} matB Second operand
+     * @param {mat2} [dest] mat2 receiving operation result. If not specified result is written to matA
+     *
+     * @returns {mat2} dest if specified, matA otherwise
+     */
+    mat2.multiply = function (matA, matB, dest) {
+        if (!dest) { dest = matA; }
+        var a11 = matA[0],
+            a12 = matA[1],
+            a21 = matA[2],
+            a22 = matA[3];
+        dest[0] = a11 * matB[0] + a12 * matB[2];
+        dest[1] = a11 * matB[1] + a12 * matB[3];
+        dest[2] = a21 * matB[0] + a22 * matB[2];
+        dest[3] = a21 * matB[1] + a22 * matB[3];
+        return dest;
+    };
+
+    /**
+     * Rotates a 2x2 matrix by an angle
+     *
+     * @param {mat2}   mat   The matrix to rotate
+     * @param {Number} angle The angle in radians
+     * @param {mat2} [dest]  Optional mat2 receiving the result. If omitted mat will be used.
+     *
+     * @returns {mat2} dest if specified, mat otherwise
+     */
+    mat2.rotate = function (mat, angle, dest) {
+        if (!dest) { dest = mat; }
+        var a11 = mat[0],
+            a12 = mat[1],
+            a21 = mat[2],
+            a22 = mat[3],
+            s = Math.sin(angle),
+            c = Math.cos(angle);
+        dest[0] = a11 *  c + a12 * s;
+        dest[1] = a11 * -s + a12 * c;
+        dest[2] = a21 *  c + a22 * s;
+        dest[3] = a21 * -s + a22 * c;
+        return dest;
+    };
+
+    /**
+     * Multiplies the vec2 by the given 2x2 matrix
+     *
+     * @param {mat2} matrix the 2x2 matrix to multiply against
+     * @param {vec2} vec    the vector to multiply
+     * @param {vec2} [dest] an optional receiving vector. If not given, vec is used.
+     *
+     * @returns {vec2} The multiplication result
+     **/
+    mat2.multiplyVec2 = function(matrix, vec, dest) {
+      if (!dest) dest = vec;
+      var x = vec[0], y = vec[1];
+      dest[0] = x * matrix[0] + y * matrix[1];
+      dest[1] = x * matrix[2] + y * matrix[3];
+      return dest;
+    };
+    
+    /**
+     * Scales the mat2 by the dimensions in the given vec2
+     *
+     * @param {mat2} matrix the 2x2 matrix to scale
+     * @param {vec2} vec    the vector containing the dimensions to scale by
+     * @param {vec2} [dest] an optional receiving mat2. If not given, matrix is used.
+     *
+     * @returns {mat2} dest if specified, matrix otherwise
+     **/
+    mat2.scale = function(matrix, vec, dest) {
+      if (!dest) { dest = matrix; }
+      var a11 = matrix[0],
+          a12 = matrix[1],
+          a21 = matrix[2],
+          a22 = matrix[3],
+          b11 = vec[0],
+          b22 = vec[1];
+      dest[0] = a11 * b11;
+      dest[1] = a12 * b22;
+      dest[2] = a21 * b11;
+      dest[3] = a22 * b22;
+      return dest;
+    };
+
+    /**
+     * Returns a string representation of a mat2
+     *
+     * @param {mat2} mat mat2 to represent as a string
+     *
+     * @param {String} String representation of mat
+     */
+    mat2.str = function (mat) {
+        return '[' + mat[0] + ', ' + mat[1] + ', ' + mat[2] + ', ' + mat[3] + ']';
+    };
+    
+    /**
+     * @class 4 Dimensional Vector
+     * @name vec4
+     */
+    var vec4 = {};
+     
+    /**
+     * Creates a new vec4, initializing it from vec if vec
+     * is given.
+     *
+     * @param {vec4} [vec] the vector's initial contents
+     * @returns {vec4} a new 2D vector
+     */
+    vec4.create = function(vec) {
+        var dest = new MatrixArray(4);
+        
+        if (vec) {
+            dest[0] = vec[0];
+            dest[1] = vec[1];
+            dest[2] = vec[2];
+            dest[3] = vec[3];
+        } else {
+            dest[0] = 0;
+            dest[1] = 0;
+            dest[2] = 0;
+            dest[3] = 0;
+        }
+        return dest;
+    };
+
+    /**
+     * Creates a new instance of a vec4, initializing it with the given arguments
+     *
+     * @param {number} x X value
+     * @param {number} y Y value
+     * @param {number} z Z value
+     * @param {number} w W value
+
+     * @returns {vec4} New vec4
+     */
+    vec4.createFrom = function (x, y, z, w) {
+        var dest = new MatrixArray(4);
+
+        dest[0] = x;
+        dest[1] = y;
+        dest[2] = z;
+        dest[3] = w;
+
+        return dest;
+    };
+    
+    /**
+     * Adds the vec4's together. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecB.
+     *
+     * @param {vec4} vecA the first operand
+     * @param {vec4} vecB the second operand
+     * @param {vec4} [dest] the optional receiving vector
+     * @returns {vec4} dest
+     */
+    vec4.add = function(vecA, vecB, dest) {
+      if (!dest) dest = vecB;
+      dest[0] = vecA[0] + vecB[0];
+      dest[1] = vecA[1] + vecB[1];
+      dest[2] = vecA[2] + vecB[2];
+      dest[3] = vecA[3] + vecB[3];
+      return dest;
+    };
+    
+    /**
+     * Subtracts vecB from vecA. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecB.
+     *
+     * @param {vec4} vecA the first operand
+     * @param {vec4} vecB the second operand
+     * @param {vec4} [dest] the optional receiving vector
+     * @returns {vec4} dest
+     */
+    vec4.subtract = function(vecA, vecB, dest) {
+      if (!dest) dest = vecB;
+      dest[0] = vecA[0] - vecB[0];
+      dest[1] = vecA[1] - vecB[1];
+      dest[2] = vecA[2] - vecB[2];
+      dest[3] = vecA[3] - vecB[3];
+      return dest;
+    };
+    
+    /**
+     * Multiplies vecA with vecB. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecB.
+     *
+     * @param {vec4} vecA the first operand
+     * @param {vec4} vecB the second operand
+     * @param {vec4} [dest] the optional receiving vector
+     * @returns {vec4} dest
+     */
+    vec4.multiply = function(vecA, vecB, dest) {
+      if (!dest) dest = vecB;
+      dest[0] = vecA[0] * vecB[0];
+      dest[1] = vecA[1] * vecB[1];
+      dest[2] = vecA[2] * vecB[2];
+      dest[3] = vecA[3] * vecB[3];
+      return dest;
+    };
+    
+    /**
+     * Divides vecA by vecB. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecB.
+     *
+     * @param {vec4} vecA the first operand
+     * @param {vec4} vecB the second operand
+     * @param {vec4} [dest] the optional receiving vector
+     * @returns {vec4} dest
+     */
+    vec4.divide = function(vecA, vecB, dest) {
+      if (!dest) dest = vecB;
+      dest[0] = vecA[0] / vecB[0];
+      dest[1] = vecA[1] / vecB[1];
+      dest[2] = vecA[2] / vecB[2];
+      dest[3] = vecA[3] / vecB[3];
+      return dest;
+    };
+    
+    /**
+     * Scales vecA by some scalar number. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecA.
+     *
+     * This is the same as multiplying each component of vecA
+     * by the given scalar.
+     *
+     * @param {vec4}   vecA the vector to be scaled
+     * @param {Number} scalar the amount to scale the vector by
+     * @param {vec4}   [dest] the optional receiving vector
+     * @returns {vec4} dest
+     */
+    vec4.scale = function(vecA, scalar, dest) {
+      if (!dest) dest = vecA;
+      dest[0] = vecA[0] * scalar;
+      dest[1] = vecA[1] * scalar;
+      dest[2] = vecA[2] * scalar;
+      dest[3] = vecA[3] * scalar;
+      return dest;
+    };
+
+    /**
+     * Copies the values of one vec4 to another
+     *
+     * @param {vec4} vec vec4 containing values to copy
+     * @param {vec4} dest vec4 receiving copied values
+     *
+     * @returns {vec4} dest
+     */
+    vec4.set = function (vec, dest) {
+        dest[0] = vec[0];
+        dest[1] = vec[1];
+        dest[2] = vec[2];
+        dest[3] = vec[3];
+        return dest;
+    };
+
+    /**
+     * Compares two vectors for equality within a certain margin of error
+     *
+     * @param {vec4} a First vector
+     * @param {vec4} b Second vector
+     *
+     * @returns {Boolean} True if a is equivalent to b
+     */
+    vec4.equal = function (a, b) {
+        return a === b || (
+            Math.abs(a[0] - b[0]) < FLOAT_EPSILON &&
+            Math.abs(a[1] - b[1]) < FLOAT_EPSILON &&
+            Math.abs(a[2] - b[2]) < FLOAT_EPSILON &&
+            Math.abs(a[3] - b[3]) < FLOAT_EPSILON
+        );
+    };
+
+    /**
+     * Negates the components of a vec4
+     *
+     * @param {vec4} vec vec4 to negate
+     * @param {vec4} [dest] vec4 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec4} dest if specified, vec otherwise
+     */
+    vec4.negate = function (vec, dest) {
+        if (!dest) { dest = vec; }
+        dest[0] = -vec[0];
+        dest[1] = -vec[1];
+        dest[2] = -vec[2];
+        dest[3] = -vec[3];
+        return dest;
+    };
+
+    /**
+     * Caclulates the length of a vec2
+     *
+     * @param {vec2} vec vec2 to calculate length of
+     *
+     * @returns {Number} Length of vec
+     */
+    vec4.length = function (vec) {
+      var x = vec[0], y = vec[1], z = vec[2], w = vec[3];
+      return Math.sqrt(x * x + y * y + z * z + w * w);
+    };
+
+    /**
+     * Caclulates the squared length of a vec4
+     *
+     * @param {vec4} vec vec4 to calculate squared length of
+     *
+     * @returns {Number} Squared Length of vec
+     */
+    vec4.squaredLength = function (vec) {
+      var x = vec[0], y = vec[1], z = vec[2], w = vec[3];
+      return x * x + y * y + z * z + w * w;
+    };
+
+    /**
+     * Performs a linear interpolation between two vec4
+     *
+     * @param {vec4} vecA First vector
+     * @param {vec4} vecB Second vector
+     * @param {Number} lerp Interpolation amount between the two inputs
+     * @param {vec4} [dest] vec4 receiving operation result. If not specified result is written to vecA
+     *
+     * @returns {vec4} dest if specified, vecA otherwise
+     */
+    vec4.lerp = function (vecA, vecB, lerp, dest) {
+        if (!dest) { dest = vecA; }
+        dest[0] = vecA[0] + lerp * (vecB[0] - vecA[0]);
+        dest[1] = vecA[1] + lerp * (vecB[1] - vecA[1]);
+        dest[2] = vecA[2] + lerp * (vecB[2] - vecA[2]);
+        dest[3] = vecA[3] + lerp * (vecB[3] - vecA[3]);
+        return dest;
+    };
+
+    /**
+     * Returns a string representation of a vector
+     *
+     * @param {vec4} vec Vector to represent as a string
+     *
+     * @returns {String} String representation of vec
+     */
+    vec4.str = function (vec) {
+        return '[' + vec[0] + ', ' + vec[1] + ', ' + vec[2] + ', ' + vec[3] + ']';
+    };
+
+    /*
+     * Exports
+     */
+
+    if(root) {
+        root.glMatrixArrayType = MatrixArray;
+        root.MatrixArray = MatrixArray;
+        root.setMatrixArrayType = setMatrixArrayType;
+        root.determineMatrixArrayType = determineMatrixArrayType;
+        root.glMath = glMath;
+        root.vec2 = vec2;
+        root.vec3 = vec3;
+        root.vec4 = vec4;
+        root.mat2 = mat2;
+        root.mat3 = mat3;
+        root.mat4 = mat4;
+        root.quat4 = quat4;
+    }
+
+    return {
+        glMatrixArrayType: MatrixArray,
+        MatrixArray: MatrixArray,
+        setMatrixArrayType: setMatrixArrayType,
+        determineMatrixArrayType: determineMatrixArrayType,
+        glMath: glMath,
+        vec2: vec2,
+        vec3: vec3,
+        vec4: vec4,
+        mat2: mat2,
+        mat3: mat3,
+        mat4: mat4,
+        quat4: quat4
+    };
+}));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/libs/globalize.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/libs/globalize.js
new file mode 100644
index 0000000..edb22ad
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/libs/globalize.js
@@ -0,0 +1,1582 @@
+/*!
+ * 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" ];
+};
+
+window.Globalize = Globalize;
+
+if ( typeof define === "function" ) {
+	define( "globalize/globalize", [], function () { return Globalize; } );
+}
+
+}( window ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/libs/jquery.easing.1.3.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/libs/jquery.easing.1.3.js
new file mode 100644
index 0000000..b4cfff5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/libs/jquery.easing.1.3.js
@@ -0,0 +1,219 @@
+/*
+ * 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. 
+ *
+*/
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: jQuery Easing
+//>>label: jQuery Easing
+//>>group: Core
+
+define( [ 
+	"jquery"
+	], function( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+// 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. 
+ *
+ */
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/libs/jquery.mobile.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/libs/jquery.mobile.js
new file mode 100644
index 0000000..7194a89
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/libs/jquery.mobile.js
@@ -0,0 +1,9631 @@
+/*
+* jQuery Mobile Framework Git Build: SHA1: 4e0055a4eaa6c052f6ff1f6869a6473cd14c00fc <> Date: Mon Jul 15 15:58:34 2013 +0900
+* http://jquerymobile.com
+*
+* Copyright 2012 jQuery Foundation and other contributors
+* Released under the MIT license.
+* http://jquery.org/license
+*
+*/
+
+
+(function ( root, doc, factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		// AMD. Register as an anonymous module.
+		define( [ "jquery" ], function ( $ ) {
+			factory( $, root, doc );
+			return $.mobile;
+		});
+	} else {
+		// Browser globals
+		factory( root.jQuery, root, doc );
+	}
+}( this, document, function ( jQuery, window, document, undefined ) {
+(function( $, window, undefined ) {
+
+	var nsNormalizeDict = {};
+
+	// jQuery.mobile configurable options
+	$.mobile = $.extend( {}, {
+
+		// Version of the jQuery Mobile Framework
+		version: "1.2.0",
+
+		// 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",
+
+		// Class used for "focus" form element state, from CSS framework
+		focusClass: "ui-focus",
+
+		// 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: "fade",
+
+		// Set maximum window width for transitions to apply - 'false' for no limit
+		maxTransitionWidth: false,
+
+		// Minimum scroll distance that will be remembered when returning to a page
+		minScrollBack: 250,
+
+		// DEPRECATED: the following property is no longer in use, but defined until 2.0 to prevent conflicts
+		touchOverflowEnabled: false,
+
+		// Set default dialog transition - 'none' for no transitions
+		defaultDialogTransition: "pop",
+
+		// Error response message - appears when an Ajax page request fails
+		pageLoadErrorMessage: "Error Loading Page",
+
+		// For error messages, which theme does the box uses?
+		pageLoadErrorMessageTheme: "e",
+
+		// replace calls to window.history.back with phonegaps navigation helper
+		// where it is provided on the window object
+		phonegapNavigationEnabled: false,
+
+		//automatically initialize the DOM when it's ready
+		autoInitializePage: true,
+
+		pushStateEnabled: true,
+
+		// allows users to opt in to ignoring content by marking a parent element as
+		// data-ignored
+		ignoreContentEnabled: false,
+
+		// turn of binding to the native orientationchange due to android orientation behavior
+		orientationChangeEnabled: true,
+
+		buttonMarkup: {
+			hoverDelay: 200
+		},
+
+		// define the window and the document objects
+		$window: $( window ),
+		$document: $( document ),
+
+		getAttrFixed : function( e, key ) {
+			var value = e.getAttribute( key );
+
+			return value === "true" ? true :
+				value === "false" ? false :
+				value === null ? undefined : value;
+		},
+
+		// 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 );
+				$.mobile.$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 ) );
+		},
+
+		// 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.
+		getInheritedTheme: function( el, defaultTheme ) {
+			var e = el[ 0 ],
+				ltr = "",
+				re = /ui-(bar|body|overlay)-([a-z])\b/,
+				c, m;
+
+			while ( e ) {
+				c = e.className || "";
+				if ( c && ( 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";
+		},
+
+		// TODO the following $ and $.fn extensions can/probably should be moved into jquery.mobile.core.helpers
+		//
+		// Find the closest javascript page element to gather settings data jsperf test
+		// http://jsperf.com/single-complex-selector-vs-many-complex-selectors/edit
+		// possibly naive, but it shows that the parsing overhead for *just* the page selector vs
+		// the page and dialog selector is negligable. This could probably be speed up by
+		// doing a similar parent node traversal to the one found in the inherited theme code above
+		closestPageData: function( $target ) {
+			return $target
+				.closest( ':jqmData(role="page"), :jqmData(role="dialog")' )
+				.data( "page" );
+		},
+
+		enhanceable: function( $set ) {
+			return this.haveParents( $set, "enhance" );
+		},
+
+		hijackable: function( $set ) {
+			return this.haveParents( $set, "ajax" );
+		},
+
+		haveParents: function( $set, attr ) {
+			if ( !$.mobile.ignoreContentEnabled ) {
+				return $set;
+			}
+
+			var count = $set.length,
+				$newSet = $(),
+				e, $element, excluded;
+
+			for ( var i = 0; i < count; i++ ) {
+				$element = $set.eq( i );
+				excluded = false;
+				e = $set[ i ];
+
+				while ( e ) {
+					var c = e.getAttribute ? e.getAttribute( "data-" + $.mobile.ns + attr ) : "";
+
+					if ( c === "false" ) {
+						excluded = true;
+						break;
+					}
+
+					e = e.parentNode;
+				}
+
+				if ( !excluded ) {
+					$newSet = $newSet.add( $element );
+				}
+			}
+
+			return $newSet;
+		},
+
+		getScreenHeight: function() {
+			// Native innerHeight returns more accurate value for this across platforms,
+			// jQuery version is here as a normalized fallback for platforms like Symbian
+			return window.innerHeight || $.mobile.$window.height();
+		}
+	}, $.mobile );
+
+	// 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" ) {
+			if ( prop ) {
+				prop = $.mobile.nsNormalize( prop );
+			}
+
+			// undefined is permitted as an explicit input for the second param
+			// in this case it returns the value and does not set it to undefined
+			if( arguments.length < 2 || value === undefined ){
+				result = this.data( prop );
+			} else {
+				result = this.data( 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();
+	};
+
+	// fluent helper function for the mobile namespaced equivalent
+	$.fn.jqmEnhanceable = function() {
+		return $.mobile.enhanceable( this );
+	};
+
+	$.fn.jqmHijackable = function() {
+		return $.mobile.hijackable( this );
+	};
+
+	// 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;
+	};
+
+	$.extend({
+		creatorDict: {},
+
+		delegateSelfInitWithSingleSelector: function( target, useKeepNative ) {
+			if ( typeof target !== 'function' ) {
+				return false;
+			}
+			var selector = target.prototype.options.initSelector;
+			var selectorRE = /:jqmData\(role='[A-z\-]+'\)$/;
+			if ( selectorRE.test(selector) ) {
+				var firstIdx = selector.indexOf( "'" ) + 1;
+				var lastIdx = selector.lastIndexOf( "'" );
+				var key = selector.substring( firstIdx, lastIdx );
+				if ( !$.creatorDict.hasOwnProperty( key ) ) {
+					$.creatorDict[key] = {};
+					$.creatorDict[key].target = target;
+					if ( useKeepNative === true ) {
+						$.creatorDict[key].useKeepNative = useKeepNative;
+					}
+					return true;
+				}
+			}
+			return false;
+		}
+	});
+
+	//auto self-init widgets
+	$( document ).bind( "pagecreate create", function( e ) {
+		var selector = "*[data-" + $.mobile.ns + "role]";
+		$( selector, e.target ).each( function () {
+			var dataRoleValue = this.getAttribute( "data-role" ),
+				matchedObj = $.creatorDict[dataRoleValue];
+			if ( matchedObj ) {
+				matchedObj.target.prototype.enhance( this, matchedObj.useKeepNative );
+			}
+		});
+	});
+})( jQuery, this );
+
+
+/*!
+ * jQuery UI Widget v1.9.0-beta.1
+ *
+ * Copyright 2012, https://github.com/jquery/jquery-ui/blob/1.9.0-beta.1/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 ) {
+
+var uuid = 0,
+	slice = Array.prototype.slice,
+	_cleanData = $.cleanData;
+$.cleanData = function( elems ) {
+	for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+		try {
+			$( elem ).triggerHandler( "remove" );
+		// http://bugs.jquery.com/ticket/8235
+		} catch( e ) {}
+	}
+	_cleanData( elems );
+};
+
+$.widget = function( name, base, prototype ) {
+	var fullName, existingConstructor, constructor, basePrototype,
+		namespace = name.split( "." )[ 0 ];
+
+	name = name.split( "." )[ 1 ];
+	fullName = namespace + "-" + name;
+
+	if ( !prototype ) {
+		prototype = base;
+		base = $.Widget;
+	}
+
+	// create selector for plugin
+	$.expr[ ":" ][ fullName ] = function( elem ) {
+		return !!$.data( elem, fullName );
+	};
+
+	$[ namespace ] = $[ namespace ] || {};
+	existingConstructor = $[ namespace ][ name ];
+	constructor = $[ namespace ][ name ] = function( options, element ) {
+		// allow instantiation without "new" keyword
+		if ( !this._createWidget ) {
+			return new constructor( options, element );
+		}
+
+		// allow instantiation without initializing for simple inheritance
+		// must use "new" keyword (the code above always passes args)
+		if ( arguments.length ) {
+			this._createWidget( options, element );
+		}
+	};
+	// extend with the existing constructor to carry over any static properties
+	$.extend( constructor, existingConstructor, {
+		version: prototype.version,
+		// copy the object used to create the prototype in case we need to
+		// redefine the widget later
+		_proto: $.extend( {}, prototype ),
+		// track widgets that inherit from this widget in case this widget is
+		// redefined after a widget inherits from it
+		_childConstructors: []
+	});
+
+	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
+	basePrototype.options = $.widget.extend( {}, basePrototype.options );
+	$.each( prototype, function( prop, value ) {
+		if ( $.isFunction( value ) ) {
+			prototype[ prop ] = (function() {
+				var _super = function() {
+						return base.prototype[ prop ].apply( this, arguments );
+					},
+					_superApply = function( args ) {
+						return base.prototype[ prop ].apply( this, args );
+					};
+				return function() {
+					var __super = this._super,
+						__superApply = this._superApply,
+						returnValue;
+
+					this._super = _super;
+					this._superApply = _superApply;
+
+					returnValue = value.apply( this, arguments );
+
+					this._super = __super;
+					this._superApply = __superApply;
+
+					return returnValue;
+				};
+			})();
+		}
+	});
+	constructor.prototype = $.widget.extend( basePrototype, {
+		// TODO: remove support for widgetEventPrefix
+		// always use the name + a colon as the prefix, e.g., draggable:start
+		// don't prefix for widgets that aren't DOM-based
+		widgetEventPrefix: name
+	}, prototype, {
+		constructor: constructor,
+		namespace: namespace,
+		widgetName: name,
+		// TODO remove widgetBaseClass, see #8155
+		widgetBaseClass: fullName,
+		widgetFullName: fullName
+	});
+
+	// If this widget is being redefined then we need to find all widgets that
+	// are inheriting from it and redefine all of them so that they inherit from
+	// the new version of this widget. We're essentially trying to replace one
+	// level in the prototype chain.
+	if ( existingConstructor ) {
+		$.each( existingConstructor._childConstructors, function( i, child ) {
+			var childPrototype = child.prototype;
+
+			// redefine the child widget using the same prototype that was
+			// originally used, but inherit from the new version of the base
+			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
+		});
+		// remove the list of existing child constructors from the old constructor
+		// so the old child constructors can be garbage collected
+		delete existingConstructor._childConstructors;
+	} else {
+		base._childConstructors.push( constructor );
+	}
+
+	$.widget.bridge( name, constructor );
+};
+
+$.widget.extend = function( target ) {
+	var input = slice.call( arguments, 1 ),
+		inputIndex = 0,
+		inputLength = input.length,
+		key,
+		value;
+	for ( ; inputIndex < inputLength; inputIndex++ ) {
+		for ( key in input[ inputIndex ] ) {
+			value = input[ inputIndex ][ key ];
+			if (input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
+				target[ key ] = $.isPlainObject( value ) ? $.widget.extend( {}, target[ key ], value ) : value;
+			}
+		}
+	}
+	return target;
+};
+
+$.widget.bridge = function( name, object ) {
+	var fullName = object.prototype.widgetFullName;
+	$.fn[ name ] = function( options ) {
+		var isMethodCall = typeof options === "string",
+			args = slice.call( arguments, 1 ),
+			returnValue = this;
+
+		// allow multiple hashes to be passed on init
+		options = !isMethodCall && args.length ?
+			$.widget.extend.apply( null, [ options ].concat(args) ) :
+			options;
+
+		if ( isMethodCall ) {
+			this.each(function() {
+				var methodValue,
+					instance = $.data( this, fullName );
+				if ( !instance ) {
+					return $.error( "cannot call methods on " + name + " prior to initialization; " +
+						"attempted to call method '" + options + "'" );
+				}
+				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
+					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
+				}
+				methodValue = instance[ options ].apply( instance, args );
+				if ( methodValue !== instance && methodValue !== undefined ) {
+					returnValue = methodValue && methodValue.jquery ?
+						returnValue.pushStack( methodValue.get() ) :
+						methodValue;
+					return false;
+				}
+			});
+		} else {
+			this.each(function() {
+				var instance = $.data( this, fullName );
+				if ( instance ) {
+					instance.option( options || {} )._init();
+				} else {
+					new object( options, this );
+				}
+			});
+		}
+
+		return returnValue;
+	};
+};
+
+$.Widget = function( options, element ) {};
+$.Widget._childConstructors = [];
+
+$.Widget.prototype = {
+	widgetName: "widget",
+	widgetEventPrefix: "",
+	defaultElement: "<div>",
+	options: {
+		disabled: false,
+
+		// callbacks
+		create: null
+	},
+	_createWidget: function( options, element ) {
+		element = $( element || this.defaultElement || this )[ 0 ];
+		this.element = $( element );
+		this.uuid = uuid++;
+		this.eventNamespace = "." + this.widgetName + this.uuid;
+		this.options = $.widget.extend( {},
+			this.options,
+			this._getCreateOptions(),
+			options );
+
+		this.bindings = $();
+		this.hoverable = $();
+		this.focusable = $();
+
+		if ( element !== this ) {
+			// 1.9 BC for #7810
+			// TODO remove dual storage
+			$.data( element, this.widgetName, this );
+			$.data( element, this.widgetFullName, this );
+			this._on({ remove: "destroy" });
+			this.document = $( element.style ?
+				// element within the document
+				element.ownerDocument :
+				// element is window or document
+				element.document || element );
+			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
+		}
+
+		this._create();
+		this._trigger( "create", null, this._getCreateEventData() );
+		this._init();
+	},
+	_getCreateOptions: $.noop,
+	_getCreateEventData: $.noop,
+	_create: $.noop,
+	_init: $.noop,
+
+	destroy: function() {
+		this._destroy();
+		// we can probably remove the unbind calls in 2.0
+		// all event bindings should go through this._on()
+		this.element
+			.unbind( this.eventNamespace )
+			// 1.9 BC for #7810
+			// TODO remove dual storage
+			.removeData( this.widgetName )
+			.removeData( this.widgetFullName )
+			// support: jquery <1.6.3
+			// http://bugs.jquery.com/ticket/9413
+			.removeData( $.camelCase( this.widgetFullName ) );
+		this.widget()
+			.unbind( this.eventNamespace )
+			.removeAttr( "aria-disabled" )
+			.removeClass(
+				this.widgetFullName + "-disabled " +
+				"ui-state-disabled" );
+
+		// clean up events and states
+		this.bindings.unbind( this.eventNamespace );
+		this.hoverable.removeClass( "ui-state-hover" );
+		this.focusable.removeClass( "ui-state-focus" );
+	},
+	_destroy: $.noop,
+
+	widget: function() {
+		return this.element;
+	},
+
+	option: function( key, value ) {
+		var options = key,
+			parts,
+			curOption,
+			i;
+
+		if ( arguments.length === 0 ) {
+			// don't return a reference to the internal hash
+			return $.widget.extend( {}, this.options );
+		}
+
+		if ( typeof key === "string" ) {
+			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
+			options = {};
+			parts = key.split( "." );
+			key = parts.shift();
+			if ( parts.length ) {
+				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
+				for ( i = 0; i < parts.length - 1; i++ ) {
+					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
+					curOption = curOption[ parts[ i ] ];
+				}
+				key = parts.pop();
+				if ( value === undefined ) {
+					return curOption[ key ] === undefined ? null : curOption[ key ];
+				}
+				curOption[ key ] = value;
+			} else {
+				if ( value === undefined ) {
+					return this.options[ key ] === undefined ? null : this.options[ key ];
+				}
+				options[ key ] = value;
+			}
+		}
+
+		this._setOptions( options );
+
+		return this;
+	},
+	_setOptions: function( options ) {
+		var key;
+
+		for ( key in options ) {
+			this._setOption( key, options[ key ] );
+		}
+
+		return this;
+	},
+	_setOption: function( key, value ) {
+		this.options[ key ] = value;
+
+		if ( key === "disabled" ) {
+			this.widget()
+				.toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
+				.attr( "aria-disabled", value );
+			this.hoverable.removeClass( "ui-state-hover" );
+			this.focusable.removeClass( "ui-state-focus" );
+		}
+
+		return this;
+	},
+
+	enable: function() {
+		return this._setOption( "disabled", false );
+	},
+	disable: function() {
+		return this._setOption( "disabled", true );
+	},
+
+	_on: function( element, handlers ) {
+		// no element argument, shuffle and use this.element
+		if ( !handlers ) {
+			handlers = element;
+			element = this.element;
+		} else {
+			// accept selectors, DOM elements
+			element = $( element );
+			this.bindings = this.bindings.add( element );
+		}
+
+		var instance = this;
+		$.each( handlers, function( event, handler ) {
+			function handlerProxy() {
+				// allow widgets to customize the disabled handling
+				// - disabled as an array instead of boolean
+				// - disabled class as method for disabling individual parts
+				if ( instance.options.disabled === true ||
+						$( this ).hasClass( "ui-state-disabled" ) ) {
+					return;
+				}
+				return ( typeof handler === "string" ? instance[ handler ] : handler )
+					.apply( instance, arguments );
+			}
+
+			// copy the guid so direct unbinding works
+			if ( typeof handler !== "string" ) {
+				handlerProxy.guid = handler.guid =
+					handler.guid || handlerProxy.guid || $.guid++;
+			}
+
+			var match = event.match( /^(\w+)\s*(.*)$/ ),
+				eventName = match[1] + instance.eventNamespace,
+				selector = match[2];
+			if ( selector ) {
+				instance.widget().delegate( selector, eventName, handlerProxy );
+			} else {
+				element.bind( eventName, handlerProxy );
+			}
+		});
+	},
+
+	_off: function( element, eventName ) {
+		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
+		element.unbind( eventName ).undelegate( eventName );
+	},
+
+	_delay: function( handler, delay ) {
+		function handlerProxy() {
+			return ( typeof handler === "string" ? instance[ handler ] : handler )
+				.apply( instance, arguments );
+		}
+		var instance = this;
+		return setTimeout( handlerProxy, delay || 0 );
+	},
+
+	_hoverable: function( element ) {
+		this.hoverable = this.hoverable.add( element );
+		this._on( element, {
+			mouseenter: function( event ) {
+				$( event.currentTarget ).addClass( "ui-state-hover" );
+			},
+			mouseleave: function( event ) {
+				$( event.currentTarget ).removeClass( "ui-state-hover" );
+			}
+		});
+	},
+
+	_focusable: function( element ) {
+		this.focusable = this.focusable.add( element );
+		this._on( element, {
+			focusin: function( event ) {
+				$( event.currentTarget ).addClass( "ui-state-focus" );
+			},
+			focusout: function( event ) {
+				$( event.currentTarget ).removeClass( "ui-state-focus" );
+			}
+		});
+	},
+
+	_trigger: function( type, event, data ) {
+		var prop, orig,
+			callback = this.options[ type ];
+
+		data = data || {};
+		event = $.Event( event );
+		event.type = ( type === this.widgetEventPrefix ?
+			type :
+			this.widgetEventPrefix + type ).toLowerCase();
+		// the original event may come from any element
+		// so we need to reset the target on the new event
+		event.target = this.element[ 0 ];
+
+		// copy original event properties over to the new event
+		orig = event.originalEvent;
+		if ( orig ) {
+			for ( prop in orig ) {
+				if ( !( prop in event ) ) {
+					event[ prop ] = orig[ prop ];
+				}
+			}
+		}
+
+		this.element.trigger( event, data );
+		return !( $.isFunction( callback ) &&
+			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
+			event.isDefaultPrevented() );
+	}
+};
+
+$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
+	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
+		if ( typeof options === "string" ) {
+			options = { effect: options };
+		}
+		var hasOptions,
+			effectName = !options ?
+				method :
+				options === true || typeof options === "number" ?
+					defaultEffect :
+					options.effect || defaultEffect;
+		options = options || {};
+		if ( typeof options === "number" ) {
+			options = { duration: options };
+		}
+		hasOptions = !$.isEmptyObject( options );
+		options.complete = callback;
+		if ( options.delay ) {
+			element.delay( options.delay );
+		}
+		if ( hasOptions && $.effects && ( $.effects.effect[ effectName ] || $.uiBackCompat !== false && $.effects[ effectName ] ) ) {
+			element[ method ]( options );
+		} else if ( effectName !== method && element[ effectName ] ) {
+			element[ effectName ]( options.duration, options.easing, callback );
+		} else {
+			element.queue(function( next ) {
+				$( this )[ method ]();
+				if ( callback ) {
+					callback.call( element[ 0 ] );
+				}
+				next();
+			});
+		}
+	};
+});
+
+// DEPRECATED
+if ( $.uiBackCompat !== false ) {
+	$.Widget.prototype._getCreateOptions = function() {
+		return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
+	};
+}
+
+})( jQuery );
+(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, useKeepNative ) {
+		this.enhance( $( this.options.initSelector, $( target )), useKeepNative );
+	},
+
+	enhance: function( targets, useKeepNative ) {
+		var page, keepNative, $widgetElements = $( targets ), self = this;
+
+		// if ignoreContentEnabled is set to true the framework should
+		// only enhance the selected elements when they do NOT have a
+		// parent with the data-namespace-ignore attribute
+		$widgetElements = $.mobile.enhanceable( $widgetElements );
+
+		if ( useKeepNative && $widgetElements.length ) {
+			// 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
+			page = $.mobile.closestPageData( $widgetElements );
+			keepNative = ( page && page.keepNativeSelector()) || "";
+
+			$widgetElements = $widgetElements.not( keepNative );
+		}
+
+		$widgetElements[ this.widgetName ]();
+	},
+
+	raise: function( msg ) {
+		throw "Widget [" + this.widgetName + "]: " + msg;
+	}
+});
+
+})( jQuery );
+
+
+(function( $, window ) {
+	// DEPRECATED
+	// NOTE global mobile object settings
+	$.extend( $.mobile, {
+		// DEPRECATED Should the text be visble in the loading message?
+		loadingMessageTextVisible: undefined,
+
+		// DEPRECATED When the text is visible, what theme does the loading box use?
+		loadingMessageTheme: undefined,
+
+		// DEPRECATED default message setting
+		loadingMessage: undefined,
+
+		// DEPRECATED
+		// Turn on/off page loading message. Theme doubles as an object argument
+		// with the following shape: { theme: '', text: '', html: '', textVisible: '' }
+		// NOTE that the $.mobile.loading* settings and params past the first are deprecated
+		showPageLoadingMsg: function( theme, msgText, textonly ) {
+			$.mobile.loading( 'show', theme, msgText, textonly );
+		},
+
+		// DEPRECATED
+		hidePageLoadingMsg: function() {
+			$.mobile.loading( 'hide' );
+		},
+
+		loading: function() {
+			this.loaderWidget.loader.apply( this.loaderWidget, arguments );
+		}
+	});
+
+	// TODO move loader class down into the widget settings
+	var loaderClass = "ui-loader", $html = $( "html" ), $window = $.mobile.$window;
+
+	$.widget( "mobile.loader", {
+		// NOTE if the global config settings are defined they will override these
+		//      options
+		options: {
+			// the theme for the loading message
+			theme: "a",
+
+			// whether the text in the loading message is shown
+			textVisible: false,
+
+			// custom html for the inner content of the loading message
+			html: "",
+
+			// the text to be displayed when the popup is shown
+			text: "loading"
+		},
+
+		defaultHtml: "<div class='" + loaderClass + "'>" +
+			"<span class='ui-icon ui-icon-loading'></span>" +
+			"<h1></h1>" +
+			"</div>",
+
+		// For non-fixed supportin browsers. Position at y center (if scrollTop supported), above the activeBtn (if defined), or just 100px from top
+		fakeFixLoader: function() {
+			var activeBtn = $( "." + $.mobile.activeBtnClass ).first();
+
+			this.element
+				.css({
+					top: $.support.scrollTop && $window.scrollTop() + $window.height() / 2 ||
+						activeBtn.length && activeBtn.offset().top || 100
+				});
+		},
+
+		// check position of loader to see if it appears to be "fixed" to center
+		// if not, use abs positioning
+		checkLoaderPosition: function() {
+			var offset = this.element.offset(),
+				scrollTop = $window.scrollTop(),
+				screenHeight = $.mobile.getScreenHeight();
+
+			if ( offset.top < scrollTop || ( offset.top - scrollTop ) > screenHeight ) {
+				this.element.addClass( "ui-loader-fakefix" );
+				this.fakeFixLoader();
+				$window
+					.unbind( "scroll", this.checkLoaderPosition )
+					.bind( "scroll", this.fakeFixLoader );
+			}
+		},
+
+		resetHtml: function() {
+			this.element.html( $( this.defaultHtml ).html() );
+		},
+
+		// Turn on/off page loading message. Theme doubles as an object argument
+		// with the following shape: { theme: '', text: '', html: '', textVisible: '' }
+		// NOTE that the $.mobile.loading* settings and params past the first are deprecated
+		// TODO sweet jesus we need to break some of this out
+		show: function( theme, msgText, textonly ) {
+			var textVisible, message, $header, loadSettings;
+
+			this.resetHtml();
+
+			// use the prototype options so that people can set them globally at
+			// mobile init. Consistency, it's what's for dinner
+			if ( $.type(theme) === "object" ) {
+				loadSettings = $.extend( {}, this.options, theme );
+
+				// prefer object property from the param then the old theme setting
+				theme = loadSettings.theme || $.mobile.loadingMessageTheme;
+			} else {
+				loadSettings = this.options;
+
+				// here we prefer the them value passed as a string argument, then
+				// we prefer the global option because we can't use undefined default
+				// prototype options, then the prototype option
+				theme = theme || $.mobile.loadingMessageTheme || loadSettings.theme;
+			}
+
+			// set the message text, prefer the param, then the settings object
+			// then loading message
+			message = msgText || $.mobile.loadingMessage || loadSettings.text;
+
+			// prepare the dom
+			$html.addClass( "ui-loading" );
+
+			if ( $.mobile.loadingMessage !== false || loadSettings.html ) {
+				// boolean values require a bit more work :P, supports object properties
+				// and old settings
+				if ( $.mobile.loadingMessageTextVisible !== undefined ) {
+					textVisible = $.mobile.loadingMessageTextVisible;
+				} else {
+					textVisible = loadSettings.textVisible;
+				}
+
+				// add the proper css given the options (theme, text, etc)
+				// Force text visibility if the second argument was supplied, or
+				// if the text was explicitly set in the object args
+				this.element.attr("class", loaderClass +
+					" ui-corner-all ui-body-" + theme +
+					" ui-loader-" + ( textVisible || msgText || theme.text ? "verbose" : "default" ) +
+					( loadSettings.textonly || textonly ? " ui-loader-textonly" : "" ) );
+
+				// TODO verify that jquery.fn.html is ok to use in both cases here
+				//      this might be overly defensive in preventing unknowing xss
+				// if the html attribute is defined on the loading settings, use that
+				// otherwise use the fallbacks from above
+				if ( loadSettings.html ) {
+					this.element.html( loadSettings.html );
+				} else {
+					this.element.find( "h1" ).text( message );
+				}
+
+				// attach the loader to the DOM
+				this.element.appendTo( $.mobile.pageContainer );
+
+				// check that the loader is visible
+				this.checkLoaderPosition();
+
+				// on scroll check the loader position
+				$window.bind( "scroll", $.proxy( this.checkLoaderPosition, this ) );
+			}
+		},
+
+		hide: function() {
+			$html.removeClass( "ui-loading" );
+
+			if ( $.mobile.loadingMessage ) {
+				this.element.removeClass( "ui-loader-fakefix" );
+			}
+
+			$.mobile.$window.unbind( "scroll", $.proxy( this.fakeFixLoader, this) );
+			$.mobile.$window.unbind( "scroll", $.proxy( this.checkLoaderPosition, this ) );
+		}
+	});
+
+	$window.bind( 'pagecontainercreate', function() {
+		$.mobile.loaderWidget = $.mobile.loaderWidget || $( $.mobile.loader.prototype.defaultHtml ).loader();
+	});
+})(jQuery, this);
+
+
+
+// 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( " " ),
+	mouseHookProps = $.event.mouseHooks ? $.event.mouseHooks.props : [],
+	mouseEventProps = $.event.props.concat( mouseHookProps ),
+	activeDocHandlers = {},
+	resetTimerID = 0,
+	startX = 0,
+	startY = 0,
+	didScroll = false,
+	clickBlockList = [],
+	blockMouseTriggers = false,
+	blockTouchTriggers = false,
+	eventCaptureSupported = "addEventListener" in document,
+	$document = $.mobile.$document,
+	nextTouchID = 1,
+	lastTouchID = 0, threshold;
+
+$.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, len;
+
+	event = $.Event( event );
+	event.type = eventType;
+
+	oe = event.originalEvent;
+	props = $.event.props;
+
+	// addresses separation of $.event.props in to $.event.mouseHook.props and Issue 3280
+	// https://github.com/jquery/jquery-mobile/issues/3280
+	if ( t.search( /^(mouse|click)/ ) > -1 ) {
+		props = mouseEventProps;
+	}
+
+	// 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 ( ( $.support.touch === true ) && ( touchID === undefined ) ) {
+		return;
+	}
+
+	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,
+		flags = getVirtualBindingFlags( event.target );
+
+		didScroll = didScroll ||
+			( Math.abs( t.pageX - startX ) > moveThreshold ||
+				Math.abs( t.pageY - startY ) > moveThreshold );
+
+
+	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,
+				target: event.target,
+				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 && target === o.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 );
+
+
+	// 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;
+	})( jQuery );
+(function( $, undefined ) {
+
+var $window = $.mobile.$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'></div>" ),
+		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);
+
+(function( $, undefined ) {
+
+// 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;
+		}
+	}
+}
+
+var fakeBody = $( "<body>" ).prependTo( "html" ),
+	fbCSS = fakeBody[ 0 ].style,
+	vendors = [ "Webkit", "Moz", "O" ],
+	webos = "palmGetResource" in window, //only used to rule out scrollTop
+	opera = window.opera,
+	operamini = window.operamini && ({}).toString.call( window.operamini ) === "[object OperaMini]",
+	bb = window.blackberry && !propExists( "-webkit-transform" ); //only used to rule out box shadow, as it's filled opaque on BB 5 and lower
+
+
+function validStyle( prop, value, check_vend ) {
+	var div = document.createElement( 'div' ),
+		uc = function( txt ) {
+			return txt.charAt( 0 ).toUpperCase() + txt.substr( 1 );
+		},
+		vend_pref = function( vend ) {
+			return  "-" + vend.charAt( 0 ).toLowerCase() + vend.substr( 1 ) + "-";
+		},
+		check_style = function( vend ) {
+			var vend_prop = vend_pref( vend ) + prop + ": " + value + ";",
+				uc_vend = uc( vend ),
+				propStyle = uc_vend + uc( prop );
+
+			div.setAttribute( "style", vend_prop );
+
+			if ( !!div.style[ propStyle ] ) {
+				ret = true;
+			}
+		},
+		check_vends = check_vend ? [ check_vend ] : vendors,
+		ret;
+
+	for( var i = 0; i < check_vends.length; i++ ) {
+		check_style( check_vends[i] );
+	}
+	return !!ret;
+}
+
+// Thanks to Modernizr src for this test idea. `perspective` check is limited to Moz to prevent a false positive for 3D transforms on Android.
+function transform3dTest() {
+	var prop = "transform-3d";
+	return validStyle( 'perspective', '10px', 'moz' ) || $.mobile.media( "(-" + vendors.join( "-" + prop + "),(-" ) + "-" + prop + "),(" + prop + ")" );
+}
+
+// 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;
+}
+
+// Thanks Modernizr
+function cssPointerEventsTest() {
+	var element = document.createElement( 'x' ),
+		documentElement = document.documentElement,
+		getComputedStyle = window.getComputedStyle,
+		supports;
+
+	if ( !( 'pointerEvents' in element.style ) ) {
+		return false;
+	}
+
+	element.style.pointerEvents = 'auto';
+	element.style.pointerEvents = 'x';
+	documentElement.appendChild( element );
+	supports = getComputedStyle &&
+	getComputedStyle( element, '' ).pointerEvents === 'auto';
+	documentElement.removeChild( element );
+	return !!supports;
+}
+
+function boundingRect() {
+	var div = document.createElement( "div" );
+	return typeof div.getBoundingClientRect !== "undefined";
+}
+
+// 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
+$.extend( $.mobile, { browser: {} } );
+$.mobile.browser.ie = (function() {
+	var v = 3,
+		div = document.createElement( "div" ),
+		a = div.all || [];
+
+	do {
+		div.innerHTML = "<!--[if gt IE " + ( ++v ) + "]><br><![endif]-->";
+	} while( a[0] );
+
+	return v > 4 ? v : !v;
+})();
+
+
+$.extend( $.support, {
+	cssTransitions: "WebKitTransitionEvent" in window || validStyle( 'transition', 'height 100ms linear' ) && !opera,
+	pushState: "pushState" in history && "replaceState" in history,
+	mediaquery: $.mobile.media( "only all" ),
+	cssPseudoElement: !!propExists( "content" ),
+	touchOverflow: !!propExists( "overflowScrolling" ),
+	cssTransform3d: transform3dTest(),
+	boxShadow: !!propExists( "boxShadow" ) && !bb,
+	scrollTop: ( "pageXOffset" in window || "scrollTop" in document.documentElement || "scrollTop" in fakeBody[ 0 ] ) && !webos && !operamini,
+	dynamicBaseTag: baseTagTest(),
+	cssPointerEvents: cssPointerEventsTest(),
+	boundingRect: boundingRect()
+});
+
+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]/ );
+})();
+
+// Support conditions that must be met in order to proceed
+// default enhanced qualifications are media query support OR IE 7+
+
+$.mobile.gradeA = function() {
+	return ( $.support.mediaquery || $.mobile.browser.ie && $.mobile.browser.ie >= 7 ) && ( $.support.boundingRect || $.fn.jquery.match(/1\.[0-7+]\.[0-9+]?/) !== null );
+};
+
+$.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 );
+
+	(function( $, undefined ) {
+		var support = {
+			touch: "ontouchend" in document
+		};
+
+		$.mobile = $.mobile || {};
+		$.mobile.support = $.mobile.support || {};
+		$.extend( $.support, support );
+		$.extend( $.mobile.support, support );
+	}( jQuery ));
+
+
+(function( $, window, undefined ) {
+	// add new event shortcuts
+	$.each( ( "touchstart touchmove touchend " +
+		"tap taphold " +
+		"swipe swipeleft swiperight " +
+		"scrollstart scrollstop" ).split( " " ), function( i, name ) {
+
+		$.fn[ name ] = function( fn ) {
+			return fn ? this.bind( name, fn ) : this.trigger( name );
+		};
+
+		// jQuery < 1.8
+		if ( $.attrFn ) {
+			$.attrFn[ name ] = true;
+		}
+	});
+
+	var supportTouch = $.mobile.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 = {
+		tapholdThreshold: 750,
+
+		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 );
+					$.mobile.$document.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( "vmouseup", clearTapTimer )
+					.bind( "vclick", clickHandler );
+				$.mobile.$document.bind( "vmousecancel", clearTapHandlers );
+
+				timer = setTimeout( function() {
+					triggerCustomEvent( thisObject, "taphold", $.Event( "taphold", { target: origTarget } ) );
+				}, $.event.special.tap.tapholdThreshold );
+			});
+		}
+	};
+
+	// also handles swipeleft, swiperight
+	$.event.special.swipe = {
+		scrollSupressionThreshold: 30, // 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;
+					});
+			});
+		}
+	};
+	$.each({
+		scrollstop: "scrollstart",
+		taphold: "tap",
+		swipeleft: "swipe",
+		swiperight: "swipe"
+	}, function( event, sourceEvent ) {
+
+		$.event.special[ event ] = {
+			setup: function() {
+				$( this ).bind( sourceEvent, $.noop );
+			}
+		};
+	});
+
+})( jQuery, this );
+
+	(function( $, undefined ) {
+		$.extend( $.support, {
+			orientation: "orientation" in window && "onorientationchange" in window
+		});
+	}( jQuery ));
+
+
+(function( $, window ) {
+	var win = $.mobile.$window,
+		event_name = "orientationchange",
+		special_event,
+		get_orientation,
+		last_orientation,
+		initial_orientation_is_landscape,
+		initial_orientation_is_default,
+		portrait_map = { "0": true, "180": true };
+
+	// It seems that some device/browser vendors use window.orientation values 0 and 180 to
+	// denote the "default" orientation. For iOS devices, and most other smart-phones tested,
+	// the default orientation is always "portrait", but in some Android and RIM based tablets,
+	// the default orientation is "landscape". The following code attempts to use the window
+	// dimensions to figure out what the current orientation is, and then makes adjustments
+	// to the to the portrait_map if necessary, so that we can properly decode the
+	// window.orientation value whenever get_orientation() is called.
+	//
+	// Note that we used to use a media query to figure out what the orientation the browser
+	// thinks it is in:
+	//
+	//     initial_orientation_is_landscape = $.mobile.media("all and (orientation: landscape)");
+	//
+	// but there was an iPhone/iPod Touch bug beginning with iOS 4.2, up through iOS 5.1,
+	// where the browser *ALWAYS* applied the landscape media query. This bug does not
+	// happen on iPad.
+
+	if ( $.support.orientation ) {
+
+		// Check the window width and height to figure out what the current orientation
+		// of the device is at this moment. Note that we've initialized the portrait map
+		// values to 0 and 180, *AND* we purposely check for landscape so that if we guess
+		// wrong, , we default to the assumption that portrait is the default orientation.
+		// We use a threshold check below because on some platforms like iOS, the iPhone
+		// form-factor can report a larger width than height if the user turns on the
+		// developer console. The actual threshold value is somewhat arbitrary, we just
+		// need to make sure it is large enough to exclude the developer console case.
+
+		var ww = window.innerWidth || $.mobile.$window.width(),
+			wh = window.innerHeight || $.mobile.$window.height(),
+			landscape_threshold = 50;
+
+		initial_orientation_is_landscape = ww > wh && ( ww - wh ) > landscape_threshold;
+
+
+		// Now check to see if the current window.orientation is 0 or 180.
+		initial_orientation_is_default = portrait_map[ window.orientation ];
+
+		// If the initial orientation is landscape, but window.orientation reports 0 or 180, *OR*
+		// if the initial orientation is portrait, but window.orientation reports 90 or -90, we
+		// need to flip our portrait_map values because landscape is the default orientation for
+		// this device/browser.
+		if ( ( initial_orientation_is_landscape && initial_orientation_is_default ) || ( !initial_orientation_is_landscape && !initial_orientation_is_default ) ) {
+			portrait_map = { "-90": true, "90": true };
+		}
+	}
+
+	$.event.special.orientationchange = $.extend( {}, $.event.special.orientationchange, {
+		setup: function() {
+			// If the event is supported natively, return false so that jQuery
+			// will bind to the event using DOM methods.
+			if ( $.support.orientation && 
+				$.event.special.orientationchange.disabled === false ) {
+				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 && !$.event.special.orientationchange.disabled ) {
+				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( event_name );
+		}
+	}
+
+	// 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 = portrait_map[ window.orientation ];
+		} else {
+			isPortrait = elem && elem.clientWidth / elem.clientHeight < 1.1;
+		}
+
+		return isPortrait ? "portrait" : "landscape";
+	};
+
+	$.fn[ event_name ] = function( fn ) {
+		return fn ? this.bind( event_name, fn ) : this.trigger( event_name );
+	};
+
+	// jQuery < 1.8
+	if ( $.attrFn ) {
+		$.attrFn[ event_name ] = true;
+	}
+
+}( 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 ) {
+  // 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);
+(function( $, undefined ) {
+
+$.widget( "mobile.page", $.mobile.widget, {
+	options: {
+		theme: "c",
+		domCache: false,
+		keepNativeDefault: ":jqmData(role='none'), :jqmData(role='nojs')"
+	},
+
+	_create: function() {
+		
+		var self = this;
+		
+		// if false is returned by the callbacks do not create the page
+		if ( self._trigger( "beforecreate" ) === false ) {
+			return false;
+		}
+
+		self.element
+			.addClass( "ui-page ui-body-" + self.options.theme )
+			.bind( "pagebeforehide", function() {
+				self.removeContainerBackground();
+			} )
+			.bind( "pagebeforeshow", function() {
+				self.setContainerBackground();
+			} );
+
+	},
+	
+	refresh: function() {
+		$( this.element ).children( ".ui-content" ).trigger("updatelayout", ["external"]);
+	},
+
+	/* GUI Builder only : redesign page when user drag&drop header, footer */
+	setToolbar: function () {
+		$( this.element ).trigger( "pagebeforeshow" );
+	},
+
+	removeContainerBackground: function() {
+		$.mobile.pageContainer.removeClass( "ui-overlay-" + $.mobile.getInheritedTheme( this.element.parent() ) );
+	},
+	
+	// set the page container background to the page theme
+	setContainerBackground: function( theme ) {
+		if ( this.options.theme ) {
+			$.mobile.pageContainer.addClass( "ui-overlay-" + ( theme || this.options.theme ) );
+		}
+	},
+
+	addBackBtn : function ( target ) {
+		var $dest = $( ".ui-page-active .ui-footer" );
+
+		if ( target == "header" ) {
+			$dest = $( ".ui-page-active .ui-header" );
+		}
+		backBtn = $( "<a href='#' class='ui-btn-back' data-" + $.mobile.ns + "rel='back'></a>" )
+			.buttonMarkup( {icon: "header-back-btn", theme : "s"} );
+		if ( !$dest.find( ".ui-btn-back").length ) {
+			backBtn.prependTo( $dest );
+		}
+	},
+
+	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 );
+
+
+(function( $, window, undefined ) {
+
+var createHandler = function( sequential ) {
+
+	// Default to sequential
+	if ( sequential === undefined ) {
+		sequential = true;
+	}
+
+	return function( name, reverse, $to, $from ) {
+
+		var deferred = new $.Deferred(),
+			reverseClass = reverse ? " reverse" : "",
+			active	= $.mobile.urlHistory.getActive(),
+			toScroll = active.lastScroll || $.mobile.defaultHomeScroll,
+			screenHeight = $.mobile.getScreenHeight(),
+			maxTransitionOverride = $.mobile.maxTransitionWidth !== false && $.mobile.$window.width() > $.mobile.maxTransitionWidth,
+			none = !$.support.cssTransitions || maxTransitionOverride || !name || name === "none" || Math.max( $.mobile.$window.scrollTop(), toScroll ) > $.mobile.getMaxScrollForTransition(),
+			toPreClass = " ui-page-pre-in",
+			toggleViewportClass = function() {
+				$.mobile.pageContainer.toggleClass( "ui-mobile-viewport-transitioning viewport-" + name );
+			},
+			scrollPage = function() {
+				// Prevent blinking on page scrolling in Tizen/Android devices.
+				// Don't scoll window, when current scroll top(scrollTop()) is already at toScroll,
+				// or when current scroll top is 0 and toScroll is same to defaultHomeScroll
+				// (which means the top position of page). In these case, page scrolling is not needed.
+				var st = $.mobile.$window.scrollTop();
+				if( st === toScroll || ( $.mobile.defaultHomeScroll === toScroll && st == 0 ) ) {
+					return;
+				}
+
+				// By using scrollTo instead of silentScroll, we can keep things better in order
+				// Just to be precautios, disable scrollstart listening like silentScroll would
+				$.event.special.scrollstart.enabled = false;
+
+				window.scrollTo( 0, toScroll );
+
+				// reenable scrollstart listening like silentScroll would
+				setTimeout( function() {
+					$.event.special.scrollstart.enabled = true;
+				}, 150 );
+			},
+			cleanFrom = function() {
+				$from
+					.removeClass( $.mobile.activePageClass + " out in reverse " + name )
+					.height( "" );
+			},
+			startOut = function() {
+				// if it's not sequential, call the doneOut transition to start the TO page animating in simultaneously
+				if ( !sequential ) {
+					doneOut();
+				}
+				else {
+					$from.animationComplete( doneOut );
+				}
+
+				// Set the from page's height and start it transitioning out
+				// Note: setting an explicit height helps eliminate tiling in the transitions
+				$from
+					.height( screenHeight + $.mobile.$window.scrollTop() )
+					.addClass( name + " out" + reverseClass );
+			},
+
+			doneOut = function() {
+
+				if ( $from && sequential ) {
+					cleanFrom();
+				}
+
+				startIn();
+			},
+
+			startIn = function() {
+
+				// Prevent flickering in phonegap container: see comments at #4024 regarding iOS
+				$to.css( "z-index", -10 );
+
+				$to.addClass( $.mobile.activePageClass + toPreClass );
+
+				// Send focus to page as it is now display: block
+				$.mobile.focusPage( $to );
+
+				// Set to page height
+				$to.height( screenHeight + toScroll );
+
+				scrollPage();
+
+				// Restores visibility of the new page: added together with $to.css( "z-index", -10 );
+				$to.css( "z-index", "" );
+
+				if ( !none ) {
+					$to.animationComplete( doneIn );
+				}
+
+				$to
+					.removeClass( toPreClass )
+					.addClass( name + " in" + reverseClass );
+
+				if ( none ) {
+					setTimeout( doneIn, 0 );
+				}
+
+			},
+
+			doneIn = function() {
+
+				if ( !sequential ) {
+
+					if ( $from ) {
+						cleanFrom();
+					}
+				}
+
+				$to
+					.removeClass( "out in reverse " + name )
+					.height( "" );
+
+				toggleViewportClass();
+
+				// In some browsers (iOS5), 3D transitions block the ability to scroll to the desired location during transition
+				// This ensures we jump to that spot after the fact, if we aren't there already.
+				if ( $.mobile.$window.scrollTop() !== toScroll ) {
+					scrollPage();
+				}
+
+				deferred.resolve( name, reverse, $to, $from, true );
+			};
+
+		toggleViewportClass();
+
+		if ( $from && !none ) {
+			startOut();
+		}
+		else {
+			doneOut();
+		}
+
+		return deferred.promise();
+	};
+};
+
+// generate the handlers from the above
+var sequentialHandler = createHandler(),
+	simultaneousHandler = createHandler( false ),
+	defaultGetMaxScrollForTransition = function() {
+		return $.mobile.getScreenHeight() * 3;
+	};
+
+// Make our transition handler the public default.
+$.mobile.defaultTransitionHandler = sequentialHandler;
+
+//transition handler dictionary for 3rd party transitions
+$.mobile.transitionHandlers = {
+	"default": $.mobile.defaultTransitionHandler,
+	"sequential": sequentialHandler,
+	"simultaneous": simultaneousHandler
+};
+
+$.mobile.transitionFallbacks = {};
+
+// If transition is defined, check if css 3D transforms are supported, and if not, if a fallback is specified
+$.mobile._maybeDegradeTransition = function( transition ) {
+		if ( transition && !$.support.cssTransform3d && $.mobile.transitionFallbacks[ transition ] ) {
+			transition = $.mobile.transitionFallbacks[ transition ];
+		}
+
+		return transition;
+};
+
+// Set the getMaxScrollForTransition to default if no implementation was set by user
+$.mobile.getMaxScrollForTransition = $.mobile.getMaxScrollForTransition || defaultGetMaxScrollForTransition;
+})( jQuery, this );
+
+(function( $, undefined ) {
+
+	//define vars for interal use
+	var $window = $.mobile.$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]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,
+
+			// Abstraction to address xss (Issue #4787) by removing the authority in
+			// browsers that auto	decode it. All references to location.href should be
+			// replaced with a call to this method so that it can be dealt with properly here
+			getLocation: function( url ) {
+				var uri = url ? this.parseUrl( url ) : location,
+					hash = this.parseUrl( url || location.href ).hash;
+
+				// mimic the browser with an empty string when the hash is empty
+				hash = hash === "#" ? "" : hash;
+
+				// Make sure to parse the url or the location object for the hash because using location.hash
+				// is autodecoded in firefox, the rest of the url should be from the object (location unless
+				// we're testing) to avoid the inclusion of the authority
+				return uri.protocol + "//" + uri.host + uri.pathname + uri.search + hash;
+			},
+
+			parseLocation: function() {
+				return this.parseUrl( this.getLocation() );
+			},
+
+			//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;
+				}
+
+				if ( absUrl === undefined ) {
+					absUrl = documentBase;
+				}
+
+				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, "" ).split( dialogHashKey )[0];
+				}
+
+				return window.decodeURIComponent(absUrl);
+			},
+
+			//get path from current hash, or from a file path
+			get: function( newPath ) {
+				if ( newPath === undefined ) {
+					newPath = path.parseLocation().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, "" ) );
+			},
+
+			isHashValid: function( hash ) {
+				return ( /^#[^#]+$/ ).test( hash );
+			},
+
+			//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 );
+			},
+
+
+			// 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.
+			isPermittedCrossDomainRequest: function( docUrl, reqUrl ) {
+				return $.mobile.allowCrossDomainPages &&
+					docUrl.protocol === "file:" &&
+					reqUrl.search( /^https?:/ ) !== -1;
+			}
+		},
+
+		//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 is 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 ( decodeURIComponent( opts.currentUrl ) === decodeURIComponent( 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.parseLocation(),
+
+		//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 ),
+
+		getScreenHeight = $.mobile.getScreenHeight;
+
+		//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 */
+
+	// NOTE Issue #4950 Android phonegap doesn't navigate back properly
+	//      when a full page refresh has taken place. It appears that hashchange
+	//      and replacestate history alterations work fine but we need to support
+	//      both forms of history traversal in our code that uses backward history
+	//      movement
+	$.mobile.back = function() {
+		var nav = window.navigator;
+
+		// if the setting is on and the navigator object is
+		// available use the phonegap navigation capability
+		if( this.phonegapNavigationEnabled &&
+			nav &&
+			nav.app &&
+			nav.app.backHistory ){
+			nav.app.backHistory();
+		} else {
+			window.history.back();
+		}
+	};
+
+	//direct focus to the page title, or otherwise first focusable element
+	$.mobile.focusPage = function ( page ) {
+		var autofocus = page.find( "[autofocus]" ),
+			pageTitle = page.find( ".ui-title:eq(0)" );
+
+		if ( autofocus.length ) {
+			autofocus.focus();
+			return;
+		}
+
+		if ( pageTitle.length ) {
+			pageTitle.focus();
+		} else{
+			page.focus();
+		}
+	};
+
+	//remove active classes after page transition or error
+	function removeActiveLinkClass( forceRemoval ) {
+		if ( !!$activeClickedLink && ( !$activeClickedLink.closest( "." + $.mobile.activePageClass ).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,
+		setLastScroll, delayedSetLastScroll;
+
+	setLastScroll = function() {
+		// 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 = $window.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 );
+	};
+
+	// 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() {
+
+			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
+			$window.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
+			$window.bind( "scrollstop", delayedSetLastScroll );
+		});
+	});
+
+	// bind to scrollstop for the first page as "pagechange" won't be fired in that case
+	$window.bind( "scrollstop", delayedSetLastScroll );
+
+	// No-op implementation of transition degradation
+	$.mobile._maybeDegradeTransition = $.mobile._maybeDegradeTransition || function( transition ) {
+		return transition;
+	};
+
+	//function for transitioning between two existing pages
+	function transitionPages( toPage, fromPage, transition, reverse ) {
+
+		if ( fromPage ) {
+			//trigger before show/hide events
+			fromPage.data( "page" )._trigger( "beforehide", null, { nextPage: toPage } );
+		}
+
+		toPage.data( "page" )._trigger( "beforeshow", null, { prevPage: fromPage || $( "" ) } );
+
+		//clear page loader
+		$.mobile.hidePageLoadingMsg();
+
+		transition = $.mobile._maybeDegradeTransition( transition );
+
+		//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 || "default" ] || $.mobile.defaultTransitionHandler,
+			promise = th( transition, reverse, toPage, fromPage );
+
+		promise.done(function() {
+
+			//trigger show/hide events
+			if ( fromPage ) {
+				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 || $( "" ) } );
+
+			setTimeout( function () {
+				$.mobile.removeEventBlocker();
+			}, 0 );
+		});
+
+		return promise;
+	}
+
+	//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 animationend', 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;
+
+
+
+	//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.
+		// NOTE do _not_ use the :jqmData psuedo selector because parenthesis
+		//      are a valid url char and it breaks on the first occurence
+		page = settings.pageContainer.children( "[data-" + $.mobile.ns +"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 )
+				.jqmData( "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();
+			}
+		}
+
+		// 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 );
+				//if we are reloading the page make sure we update the base if its not a prefetch
+				if( base && ( !options || !options.prefetch ) ){
+					base.set(url);
+				}
+				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();
+				};
+		}
+
+		// Reset base to the default document base.
+		// only reset if we are not prefetching
+		if ( base && ( typeof options === "undefined" || typeof options.prefetch === "undefined" ) ) {
+			base.reset();
+		}
+
+		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( $( "<div>" + RegExp.$1 + "</div>" ).text() );
+					}
+
+					//dont update the base tag if we are prefetching
+					if ( base && ( typeof options === "undefined" || typeof options.prefetch === "undefined" ) ) {
+						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( "[data-" + $.mobile.ns +"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
+						$.mobile.showPageLoadingMsg( $.mobile.pageLoadErrorMessageTheme, $.mobile.pageLoadErrorMessage, true );
+
+						// hide after delay
+						setTimeout( $.mobile.hidePageLoadingMsg, 1500 );
+					}
+
+					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" || $.mobile.getAttrFixed( toPage [0], "data-" + $.mobile.ns + "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 );
+
+			// Even if there is no page change to be done, we should keep the urlHistory in sync with the hash changes
+			if ( settings.fromHashChange ) {
+				urlHistory.directHashChange({
+					currentUrl:	url,
+					isBack:		function() {},
+					isForward:	function() {}
+				});
+			}
+
+			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 delegate() 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 ) {}
+
+		// Record whether we are at a place in history where a dialog used to be - if so, do not add a new history entry and do not change the hash either
+		var alreadyThere = false;
+
+		// 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
+
+			// If we are at a place in history that once belonged to a dialog, reuse
+			// this state without adding to urlHistory and without modifying the hash.
+			// However, if a dialog is already displayed at this point, and we're
+			// about to display another dialog, then we must add another hash and
+			// history entry on top so that one may navigate back to the original dialog
+			if ( active.url.indexOf( dialogHashKey ) > -1 && !$.mobile.activePage.is( ".ui-dialog" ) ) {
+				settings.changeHash = false;
+				alreadyThere = true;
+			}
+
+			// Normally, we tack on a dialog hash key, but if this is the location of a stale dialog,
+			// we reuse the URL from the entry
+			url = ( active.url || "" ) + ( alreadyThere ? "" : dialogHashKey );
+
+			// tack on another dialogHashKey if this is the same as the initial hash
+			// this makes sure that a history entry is created for this dialog
+			if ( urlHistory.activeIndex === 0 && url === urlHistory.initialDst ) {
+				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 ) {
+			// Overwrite the current entry if it's a leftover from a dialog
+			if ( alreadyThere ) {
+				urlHistory.activeIndex = Math.max( 0, urlHistory.activeIndex - 1 );
+			}
+			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( name, reverse, $to, $from, alreadyFocused ) {
+				removeActiveLinkClass();
+
+				//if there's a duplicateCachedPage, remove it from the DOM now that it's hidden
+				if ( settings.duplicateCachedPage ) {
+					settings.duplicateCachedPage.remove();
+				}
+
+				// Send focus to the newly shown page. Moved from promise .done binding in transitionPages
+				// itself to avoid ie bug that reports offsetWidth as > 0 (core check for visibility)
+				// despite visibility: hidden addresses issue #2965
+				// https://github.com/jquery/jquery-mobile/issues/2965
+				if ( !alreadyFocused ) {
+					$.mobile.focusPage( toPage );
+				}
+
+				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 deferred is resolved in the init file
+	$.mobile.navreadyDeferred = $.Deferred();
+	$.mobile.navreadyDeferred.done(function() {
+		//bind to form submit events, handle with Ajax
+		$.mobile.$document.delegate( "form", "submit", function( event ) {
+			var $this = $( this );
+
+			if ( !$.mobile.ajaxEnabled ||
+					// test that the form is, itself, ajax false
+					$this.is( ":jqmData(ajax='false')" ) ||
+					// test that $.mobile.ignoreContentEnabled is set and
+					// the form or one of it's parents is ajax=false
+					!$this.jqmHijackable().length ) {
+				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 ) );
+
+			if ( ( path.isExternal( url ) && !path.isPermittedCrossDomainRequest( documentUrl, url ) ) || target ) {
+				return;
+			}
+
+			$.mobile.changePage(
+				url,
+				{
+					type:		type && type.length && type.toLowerCase() || "get",
+					data:		$this.serialize(),
+					transition:	$.mobile.getAttrFixed( $this [0], "data-" + $.mobile.ns + "transition" ),
+					reverse:	$.mobile.getAttrFixed( $this [0], "data-" + $.mobile.ns + "direction" ) === "reverse",
+					reloadPage:	true
+				}
+			);
+			event.preventDefault();
+		});
+
+		//add active state on vclick
+		$.mobile.$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 the which attr
+			if ( event.which > 1 || !$.mobile.linkBindingEnabled ) {
+				return;
+			}
+
+			var link = findClosestLink( event.target );
+
+			// split from the previous return logic to avoid find closest where possible
+			// TODO teach $.mobile.hijackable to operate on raw dom elements so the link wrapping
+			// can be avoided
+			if ( !$( link ).jqmHijackable().length ) {
+				return;
+			}
+
+			if ( link ) {
+				if ( path.parseUrl( link.getAttribute( "href" ) || "#" ).hash !== "#" ) {
+					removeActiveLinkClass( true );
+					$activeClickedLink = $( link ).closest( ".ui-btn" ).not( ".ui-disabled" );
+					$activeClickedLink.addClass( $.mobile.activeBtnClass );
+				}
+			}
+		});
+
+		// click routing - direct to HTTP or Ajax, accordingly
+		$.mobile.$document.bind( "click", function( event ) {
+			if ( !$.mobile.linkBindingEnabled ) {
+				return;
+			}
+
+			var link = findClosestLink( event.target ), $link = $( link ), httpCleanup;
+
+			// If there is no link associated with the click or its not a left
+			// click we want to ignore the click
+			// TODO teach $.mobile.hijackable to operate on raw dom elements so the link wrapping
+			// can be avoided
+			if ( !link || event.which > 1 || !$link.jqmHijackable().length ) {
+				return;
+			}
+
+			//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')" ) ) {
+				$.mobile.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.
+
+				//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 ) && !path.isPermittedCrossDomainRequest( documentUrl, href ) );
+
+			if ( isExternal ) {
+				httpCleanup();
+				//use default click handling
+				return;
+			}
+
+			//use ajax
+			var transition = $.mobile.getAttrFixed( $link [0], "data-" + $.mobile.ns + "transition" ),
+				reverse =  $.mobile.getAttrFixed( $link [0], "data-" + $.mobile.ns + "direction" ) === "reverse" ||
+							// deprecated - remove by 1.0
+							 $.mobile.getAttrFixed( $link [0], "data-" + $.mobile.ns + "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, link: $link } );
+			event.preventDefault();
+		});
+
+		//prefetch pages when anchors with data-prefetch are encountered
+		$.mobile.$document.delegate( ".ui-page", "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" ),prefetch: true } );
+				}
+			});
+		});
+
+		$.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,
+
+				// "navigate" event fired to allow others to take advantage of the more robust hashchange handling
+				navEvent = new $.Event( "navigate" ),
+
+				// 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 ( 0 === urlHistory.stack.length ) {
+				urlHistory.initialDst = to;
+			}
+
+			// We should probably fire the "navigate" event from those places that make calls to _handleHashChange,
+			// and have _handleHashChange hook into the "navigate" event instead of triggering it here
+			$.mobile.pageContainer.trigger( navEvent );
+			if ( navEvent.isDefaultPrevented() ) {
+				return;
+			}
+
+			//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 && urlHistory.initialDst !== to ) {
+
+				// 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() { $.mobile.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;
+
+				// If we're about to go to an initial URL that contains a reference to a non-existent
+				// internal page, go to the first page instead. We know that the initial hash refers to a
+				// non-existent page, because the initial hash did not end up in the initial urlHistory entry
+				if ( to === path.makeUrlAbsolute( '#' + urlHistory.initialDst, documentBase ) &&
+					urlHistory.stack.length && urlHistory.stack[0].url !== urlHistory.initialDst.replace( dialogHashKey, "" ) ) {
+					to = $.mobile.firstPage;
+				}
+				$.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 ) {
+			// Firefox auto-escapes the location.hash as for v13 but
+			// leaves the href untouched
+			$.mobile._handleHashChange( path.parseLocation().hash );
+		});
+
+	});//navreadyDeferred done callback
+
+})( jQuery );
+
+(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 = $.mobile.$window,
+		url = $.mobile.path.parseLocation(),
+		mobileinitDeferred = $.Deferred(),
+		domreadyDeferred = $.Deferred();
+
+	$.mobile.$document.ready( $.proxy( domreadyDeferred, "resolve" ) );
+
+	$.mobile.$document.one( "mobileinit", $.proxy( mobileinitDeferred, "resolve" ) );
+
+	$.extend( pushStateHandler, {
+		// TODO move to a path helper, this is rather common functionality
+		initialFilePath: (function() {
+			return url.pathname + url.search;
+		})(),
+
+		hashChangeTimeout: 200,
+
+		hashChangeEnableTimer: undefined,
+
+		initialHref: url.hrefNoHash,
+
+		state: function() {
+			return {
+				// firefox auto decodes the url when using location.hash but not href
+				hash: $.mobile.path.parseLocation().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,
+				// firefox auto decodes the url when using location.hash but not href
+				hash = $.mobile.path.parseLocation().hash,
+				isPath = $.mobile.path.isPath( hash ),
+				resolutionUrl = isPath ? $.mobile.path.getLocation() : $.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 $.mobile.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,
+				fromHash, toHash, hashChanged;
+
+			// if there's no state its not a popstate we care about, eg chrome's initial popstate
+			if ( poppedState ) {
+				// if we get two pop states in under this.hashChangeTimeout
+				// make sure to clear any timer set for the previous change
+				clearTimeout( self.hashChangeEnableTimer );
+
+				// make sure to enable hash handling for the the _handleHashChange call
+				self.nextHashChangePrevented( false );
+
+				// change the page based on the hash in the popped state
+				$.mobile._handleHashChange( poppedState.hash );
+
+				// prevent any hashchange in the next self.hashChangeTimeout
+				self.nextHashChangePrevented( true );
+
+				// re-enable hash change handling after swallowing a possible hash
+				// change event that comes on all popstates courtesy of browsers like Android
+				self.hashChangeEnableTimer = setTimeout( function() {
+					self.nextHashChangePrevented( false );
+				}, self.hashChangeTimeout );
+			}
+		},
+
+		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, $.mobile.path.getLocation() );
+			}
+		}
+	});
+
+	// We need to init when "mobileinit", "domready", and "navready" have all happened
+	$.when( domreadyDeferred, mobileinitDeferred, $.mobile.navreadyDeferred ).done(function() {
+		if ( $.mobile.pushStateEnabled && $.support.pushState ) {
+			pushStateHandler.init();
+		}
+	});
+})( jQuery, this );
+
+/*
+* fallback transition for flip in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.flip = "fade";
+
+})( jQuery, this );
+/*
+* fallback transition for flow in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.flow = "fade";
+
+})( jQuery, this );
+/*
+* fallback transition for pop in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.pop = "fade";
+
+})( jQuery, this );
+/*
+* fallback transition for slide in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+// Use the simultaneous transitions handler for slide transitions
+$.mobile.transitionHandlers.slide = $.mobile.transitionHandlers.simultaneous;
+
+// Set the slide transitions's fallback to "fade"
+$.mobile.transitionFallbacks.slide = "fade";
+
+})( jQuery, this );
+/*
+* fallback transition for slidedown in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.slidedown = "fade";
+
+})( jQuery, this );
+/*
+* fallback transition for slidefade in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+// Set the slide transitions's fallback to "fade"
+$.mobile.transitionFallbacks.slidefade = "fade";
+
+})( jQuery, this );
+/*
+* fallback transition for slideup in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.slideup = "fade";
+
+})( jQuery, this );
+/*
+* fallback transition for turn in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.turn = "fade";
+
+})( jQuery, this );
+
+(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
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+
+	var page = $.mobile.closestPageData( $( e.target ) ), 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 );
+
+(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>" ),
+			dialogWrap = $( "<div/>", {
+					"role" : "dialog",
+					"class" : "ui-dialog-contain ui-corner-all ui-overlay-shadow"
+				});
+
+		$el.addClass( "ui-dialog ui-overlay-" + this.options.overlayTheme );
+
+		// Class the markup for dialog styling
+		// Set aria role
+		$el
+			.wrapInner( dialogWrap )
+			.children()
+				.find( ":jqmData(role='header')" )
+					.prepend( headerCloseButton )
+				.end()
+				.children( ':first-child')
+					.addClass( "ui-corner-top" )
+				.end()
+				.children( ":last-child" )
+					.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
+		//
+		// Use click rather than vclick in order to prevent the possibility of unintentionally
+		// reopening the dialog if the dialog opening item was directly under the close button.
+		headerCloseButton.bind( "click", 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 && !$.mobile.getAttrFixed( $target[0], "data-" + $.mobile.ns + "transition" ) ) {
+
+				active = $.mobile.urlHistory.getActive() || {};
+
+				$target.attr( "data-" + $.mobile.ns + "transition", ( active.transition || $.mobile.defaultDialogTransition ) )
+					.attr( "data-" + $.mobile.ns + "direction", "reverse" );
+			}
+		})
+		.bind( "pagehide", function( e, ui ) {
+			$( this ).find( "." + $.mobile.activeBtnClass ).not( ".ui-slider-bg" ).removeClass( $.mobile.activeBtnClass );
+		})
+		// Override the theme set by the page plugin on pageshow
+		.bind( "pagebeforeshow", function() {
+			self._isCloseable = true;
+			if ( self.options.overlayTheme ) {
+				self.element
+					.page( "removeContainerBackground" )
+					.page( "setContainerBackground", self.options.overlayTheme );
+			}
+		});
+	},
+
+	// Close method goes back in history
+	close: function() {
+		var dst;
+
+		if ( this._isCloseable ) {
+			this._isCloseable = false;
+			if ( $.mobile.hashListeningEnabled ) {
+				$.mobile.back();
+			} else {
+				dst = $.mobile.urlHistory.getPrev().url;
+				if ( !$.mobile.path.isPath( dst ) ) {
+					dst = $.mobile.path.makeUrlAbsolute( "#" + dst );
+				}
+
+				$.mobile.changePage( dst, { changeHash: false, fromHashChange: true } );
+			}
+		}
+	}
+});
+
+//auto self-init widgets
+$.mobile.$document.delegate( $.mobile.dialog.prototype.options.initSelector, "pagecreate", function() {
+	$.mobile.dialog.prototype.enhance( this );
+});
+
+})( jQuery, this );
+
+(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;
+
+// NOTE bind used to force this binding to run before the buttonMarkup binding
+//      which expects .ui-footer top be applied in its gigantic selector
+// TODO remove the buttonMarkup giant selector and move it to the various modules
+//      on which it depends
+$.mobile.$document.bind( "pagecreate", function( e ) {
+	var $page = $( e.target ),
+		o = $page.data( "page" ).options,
+		prefix = "data-"+$.mobile.ns,
+		pageRole = $page[0].getAttribute( prefix + "role" ) || undefined,
+		pageTheme = o.theme;
+
+	$( ":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')", $page )
+		.jqmEnhanceable()
+		.each(function() {
+
+		var $this = $( this ),
+			role = $this[0].getAttribute( prefix + "role" ) || undefined,
+			theme = $this[0].getAttribute( prefix + "theme" ) || undefined,
+			contentTheme = theme || o.contentTheme || ( pageRole === "dialog" && pageTheme ),
+			$headeranchors,
+			leftbtn,
+			rightbtn,
+			$dest = $page.find( ".ui-footer" ),
+			backBtn;
+
+		$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" );
+
+			if ( role === "header") {
+				// Right,left buttons
+				$headeranchors	= $this.children( "a, div.naviframe-button, a.naviframe-button, button" );
+				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;
+
+				$( $headeranchors.get().reverse() ).each( function ( i ) {
+					$( this ).addClass( "ui-btn-right-" + i );
+				});
+			}
+
+			// Auto-add back btn on pages beyond first view
+			if ( o.addBackBtn &&
+				( role === "footer" || role === "header" ) &&
+				$page[0].getAttribute( prefix + "url" ) !== $.mobile.path.stripHash( location.hash ) &&
+				!leftbtn ) {
+
+				if ( o.addBackBtn == "header" ) {
+					$dest = $page.find( ".ui-header" );
+				} else {
+					$dest = $page.find( ".ui-footer" );
+				}
+
+				if ( !$dest.find( ".ui-btn-back" ).length ) {
+					backBtn = $( "<a href='javascript:void(0);' class='ui-btn-back' data-" + $.mobile.ns + "rel='back'></a>" )
+						// // If theme is provided, override default inheritance
+						.buttonMarkup( { icon: "header-back-btn", theme: o.backBtnTheme || thisTheme } );
+
+					backBtn.find( ".ui-btn-text" ).text( o.backBtnText );
+					backBtn.appendTo( $dest );
+				}
+			}
+
+			// 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({
+					"role": "heading",
+					"aria-level": "1",
+					"aria-label": "title",
+					"tabindex": "0"
+				});
+
+			$( ".ui-title-text-sub" ).attr( { "tabindex": "0", "aria-label": "subtitle" } );
+
+		} else if ( role === "content" ) {
+			if ( contentTheme ) {
+				$this.addClass( "ui-body-" + ( contentTheme ) );
+			}
+
+			// Add ARIA role
+			$this.attr( "role", "main" );
+		}
+	});
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+// filter function removes whitespace between label and form element so we can use inline-block (nodeType 3 = text)
+$.fn.fieldcontain = function( options ) {
+	return this
+		.addClass( "ui-field-contain ui-body ui-br" )
+		.contents().filter( function() {
+			return ( this.nodeType === 3 && !/\S/.test( this.nodeValue ) );
+		}).remove();
+};
+
+//auto self-init widgets
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$( ":jqmData(role='fieldcontain')", e.target ).jqmEnhanceable().fieldcontain();
+});
+
+})( jQuery );
+
+(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";
+					$this.addClass( "ui-grid-duo" );
+				}
+			}
+			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(" + iterator + "n+3)" ).addClass( "ui-block-c" );
+		}
+		if ( iterator > 3 ) {
+			$kids.filter( ":nth-child(" + iterator + "n+4)" ).addClass( "ui-block-d" );
+		}
+		if ( iterator > 4 ) {
+			$kids.filter( ":nth-child(" + iterator + "n+5)" ).addClass( "ui-block-e" );
+		}
+	});
+};
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$( ":jqmData(role='nojs')", e.target ).addClass( "ui-nojs" );
+	
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.fn.buttonMarkup = function( options ) {
+	var $workingSet = this,
+		prefix = "data-" + $.mobile.ns,
+		mapToDataAttr = function( key, value ) {
+			e.setAttribute( "data-" + $.mobile.ns + key, value );
+			el.jqmData( key, value );
+		};
+
+	// Enforce options to be of type string
+	options = ( options && ( $.type( options ) === "object" ) )? options : {};
+	for ( var i = 0; i < $workingSet.length; i++ ) {
+		var el = $workingSet.eq( i ),
+			e = el[ 0 ],
+			o = $.extend( {}, $.fn.buttonMarkup.defaults, {
+				icon:       options.icon       !== undefined ? options.icon       : $.mobile.getAttrFixed( e, prefix + "icon" ),
+				iconpos:    options.iconpos    !== undefined ? options.iconpos    : $.mobile.getAttrFixed( e, prefix + "iconpos" ),
+				theme:      options.theme      !== undefined ? options.theme      : $.mobile.getAttrFixed( e, prefix + "theme" ) || $.mobile.getInheritedTheme( el, $.fn.buttonMarkup.defaults["theme"] ),
+				inline:     options.inline     !== undefined ? options.inline     : $.mobile.getAttrFixed( e, prefix + "inline" ),
+				shadow:     options.shadow     !== undefined ? options.shadow     : $.mobile.getAttrFixed( e, prefix + "shadow" ),
+				corners:    options.corners    !== undefined ? options.corners    : $.mobile.getAttrFixed( e, prefix + "corners" ),
+				iconshadow: options.iconshadow !== undefined ? options.iconshadow : $.mobile.getAttrFixed( e, prefix + "iconshadow" ),
+				mini:       options.mini       !== undefined ? options.mini       : $.mobile.getAttrFixed( e, prefix + "mini" )
+			}, options ),
+
+			// Classes Defined
+			innerClass = "ui-btn-inner",
+			textClass = "ui-btn-text",
+			buttonClass, iconClass,
+			// Button inner markup
+			buttonInner,
+			buttonText,
+			buttonIcon,
+			buttonElements;
+
+		for ( key in o ) {
+			e.setAttribute ( prefix + key, o[ key ])
+		}
+
+		if ( $.mobile.getAttrFixed( e, prefix + "rel" ) === "popup" && el.attr( "href" ) ) {
+			e.setAttribute( "aria-haspopup", true );
+			e.setAttribute( "aria-owns", e.getAttribute( "href" ) );
+		}
+
+		if ( e.tagName !== "LI" && e.tagName !== "LABEL" ) {
+			e.setAttribute( "role", "button" );
+			e.setAttribute( "tabindex", "0" );
+		}
+
+		// Check if this element is already enhanced
+		buttonElements = $.data( ( ( e.tagName === "INPUT" || e.tagName === "BUTTON" ) ? e.parentNode : e ), "buttonElements" );
+
+		if ( buttonElements ) {
+			e = buttonElements.outer;
+			el = $( e );
+			buttonInner = buttonElements.inner;
+			buttonText = buttonElements.text;
+			// We will recreate this icon below
+			$( buttonElements.icon ).remove();
+			buttonElements.icon = null;
+		}
+		else {
+			buttonInner = document.createElement( o.wrapperEls );
+			buttonText = document.createElement( o.wrapperEls );
+		}
+		buttonIcon = o.icon ? document.createElement( "span" ) : null;
+
+		if ( attachEvents && !buttonElements ) {
+			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;
+		buttonClass += o.shadow ? " ui-shadow" : "";
+		buttonClass += o.corners ? " ui-btn-corner-all" : "";
+
+		// To distinguish real buttons
+		if(  $.mobile.getAttrFixed( e, prefix + "role" ) == "button" || e.tagName == "BUTTON" || e.tagName == "DIV" ){
+			buttonClass += " ui-btn-box-" + o.theme;
+		}
+
+		/* TIZEN style markup */
+		var buttonStyle =  $.mobile.getAttrFixed( e, prefix + "style" );
+
+		if ( buttonStyle == "circle" && !($(el).text().length > 0) ) {
+			/* 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";
+		} else if ( buttonStyle == "round" || ( buttonStyle == "circle" && $(el).text().length > 0 ) ) {
+			buttonClass += " ui-btn-round";
+		}
+		if ( o.icon ) {
+			if ( $(el).text().length > 0 ) {
+
+				switch ( o.iconpos ) {
+				case "right" :
+				case "left" :
+				case "top" :
+				case "bottom" :
+					textClass += " ui-btn-text-padding-" + o.iconpos;
+					break;
+				default:
+					textClass += " ui-btn-text-padding-left";
+					break;
+				}
+
+				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";
+
+				if ( e.tagName !== "LABEL" ) {
+					$( el ).text( o.icon.replace( "naviframe-", "" ) );
+				}
+			}
+		} else {
+			if ( $(el).text().length > 0 ) {
+				innerClass += " ui-btn-hastxt";
+			} else if ( buttonStyle == "circle" ){
+				buttonClass += " ui-btn-round";
+			}
+		}
+		if ( o.mini !== undefined ) {
+			// Used to control styling in headers/footers, where buttons default to `mini` style.
+			buttonClass += o.mini === true ? " ui-mini" : " ui-fullsize";
+		}
+
+		if ( o.inline !== undefined ) {
+			// Used to control styling in headers/footers, where buttons default to `inline` style.
+			buttonClass += o.inline === true ? " ui-btn-inline" : " ui-btn-block";
+		}
+
+		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() );
+			}
+		}
+
+		innerClass += o.corners ? " ui-btn-corner-all" : "";
+
+		if ( o.iconpos && o.iconpos === "notext" && !el.attr( "title" ) ) {
+			el.attr( "title", el.getEncodedText() );
+		}
+
+		if ( buttonElements ) {
+			el.removeClass( buttonElements.bcls || "" );
+		}
+		el.removeClass( "ui-link" ).addClass( buttonClass );
+
+		buttonInner.className = innerClass;
+
+		buttonText.className = textClass;
+		if ( !buttonElements ) {
+			buttonInner.appendChild( buttonText );
+		}
+		if ( buttonIcon ) {
+			buttonIcon.className = iconClass;
+			if ( !( buttonElements && buttonElements.icon ) ) {
+				buttonIcon.innerHTML = "&#160;";
+				buttonInner.appendChild( buttonIcon );
+			}
+		}
+
+		while ( e.firstChild && !buttonElements ) {
+			buttonText.appendChild( e.firstChild );
+		}
+
+		if ( !buttonElements ) {
+			e.appendChild( buttonInner );
+		}
+
+		// Assign a structure containing the elements of this button to the elements of this button. This
+		// will allow us to recognize this as an already-enhanced button in future calls to buttonMarkup().
+		buttonElements = {
+			bcls  : buttonClass,
+			outer : e,
+			inner : buttonInner,
+			text  : buttonText,
+			icon  : buttonIcon
+		};
+
+		$.data( e,           'buttonElements', buttonElements );
+		$.data( buttonInner, 'buttonElements', buttonElements );
+		$.data( buttonText,  'buttonElements', buttonElements );
+		if ( buttonIcon ) {
+			$.data( buttonIcon, 'buttonElements', buttonElements );
+		}
+	}
+
+	return this;
+};
+
+$.fn.buttonMarkup.defaults = {
+	theme: "c",
+	corners: true,
+	shadow: true,
+	iconshadow: true,
+	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 + ' ' );
+        if ( cname && cname.indexOf( "ui-btn " ) > -1 && cname.indexOf( "ui-disabled " ) < 0 ) {
+            break;
+        }
+
+        element = element.parentNode;
+    }
+
+    return element;
+}
+
+var attachEvents = function() {
+	var hoverDelay = $.mobile.buttonMarkup.hoverDelay, hov, foc;
+
+	$.mobile.$document.bind( {
+		"vmousedown vmousecancel vmouseup vmouseover vmouseout focus blur scrollstart touchend touchcancel": function( event ) {
+			var theme,
+				$btn = $( closestEnabledButton( event.target ) ),
+				isTouchEvent = event.originalEvent && /^touch/.test( event.originalEvent.type ),
+				evt = event.type;
+
+			if ( $btn.length ) {
+				theme = $btn.attr( "data-" + $.mobile.ns + "theme" );
+
+				if ( evt === "vmousedown" ) {
+					if ( isTouchEvent ) {
+						// Use a short delay to determine if the user is scrolling before highlighting
+						hov = setTimeout( function() {
+							$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-down-" + theme );
+						}, hoverDelay );
+					} else {
+						$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-down-" + theme );
+					}
+				} else if ( evt === "vmousecancel" || evt === "vmouseup" || evt === "touchend" || evt === "touchcancel" ) {
+					$btn.removeClass( "ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme );
+				} else if ( evt === "vmouseover" || evt === "focus" ) {
+					if ( isTouchEvent ) {
+						// Use a short delay to determine if the user is scrolling before highlighting
+						foc = setTimeout( function() {
+							$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-hover-" + theme );
+						}, hoverDelay );
+					} else {
+						$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-hover-" + theme );
+					}
+				} else if ( evt === "vmouseout" || evt === "blur" || evt === "scrollstart" ) {
+					$btn.removeClass( "ui-btn-hover-" + theme  + " ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme );
+					if ( hov ) {
+						clearTimeout( hov );
+					}
+					if ( foc ) {
+						clearTimeout( foc );
+					}
+				}
+			}
+		},
+		"focusin focus": function( event ) {
+			$( closestEnabledButton( event.target ) ).addClass( $.mobile.focusClass );
+		},
+		"focusout blur": function( event ) {
+			$( closestEnabledButton( event.target ) ).removeClass( $.mobile.focusClass );
+		}
+	});
+
+	attachEvents = null;
+};
+
+//links in bars, or those with  data-role become buttons
+//auto self-init widgets
+$.mobile.$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 )
+		.jqmEnhanceable()
+		.not( "button, input, .ui-btn, :jqmData(role='none'), :jqmData(role='nojs')" )
+		.buttonMarkup();
+});
+
+})( jQuery );
+
+
+(function( $, undefined ) {
+
+$.widget( "mobile.collapsible", $.mobile.widget, {
+	options: {
+		expandCueText: " Expandable list, tap to open list",
+		collapseCueText: " Expandable list, tap to close list",
+		collapsed: true,
+		heading: "h1,h2,h3,h4,h5,h6,legend",
+		theme: null,
+		contentTheme: null,
+		inset: true,
+		mini: false,
+		initSelector: ":jqmData(role='collapsible')"
+	},
+	_create: function() {
+
+		var $el = this.element,
+			o = this.options,
+			collapsible = $el.addClass( "ui-collapsible" ),
+			collapsibleHeading = $el.children( o.heading ).first(),
+			collapsedIcon = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "collapsed-icon" ) || o.collapsedIcon,
+			expandedIcon = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "expanded-icon" ) || o.expandedIcon,
+			collapsibleContent = collapsible.wrapInner( "<div class='ui-collapsible-content'></div>" ).children( ".ui-collapsible-content" ),
+			collapsibleSet = $el.closest( ":jqmData(role='collapsible-set')" ).addClass( "ui-collapsible-set" );
+
+		// 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 = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "theme" ) || $.mobile.getInheritedTheme( collapsibleSet, "c" );
+			}
+			// Inherit the content-theme from collapsible-set
+			if ( !o.contentTheme ) {
+				o.contentTheme = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "content-theme" );
+			}
+
+			// Get the preference for collapsed icon in the set
+			if ( !o.collapsedIcon ) {
+				o.collapsedIcon = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "collapsed-icon" );
+			}
+			// Get the preference for expanded icon in the set
+			if ( !o.expandedIcon ) {
+				o.expandedIcon = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "expanded-icon" );
+			}
+			// Gets the preference icon position in the set
+			if ( !o.iconPos ) {
+				o.iconPos = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "iconpos" );
+			}
+			// Inherit the preference for inset from collapsible-set or set the default value to ensure equalty within a set
+			if ( $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "inset" ) !== undefined ) {
+				o.inset = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "inset" );
+			} else {
+				o.inset = true;
+			}
+			// Gets the preference for mini in the set
+			if ( !o.mini ) {
+				o.mini = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "mini" );
+			}
+		} else {
+			// get inherited theme if not a set and no theme has been set
+			if ( !o.theme ) {
+				o.theme = $.mobile.getInheritedTheme( $el, "c" );
+			}
+		}
+		
+		if ( !!o.inset ) {
+			collapsible.addClass( "ui-collapsible-inset" );
+		}
+		
+		collapsibleContent.addClass( ( o.contentTheme ) ? ( "ui-body-" + o.contentTheme ) : "");
+
+		collapsedIcon = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "collapsed-icon" ) || o.collapsedIcon || "plus";
+		expandedIcon = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "expanded-icon" ) || o.expandedIcon || "minus";
+
+		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: $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "iconpos" ) || o.iconPos || "left",
+					icon: collapsedIcon,
+					mini: o.mini,
+					theme: o.theme
+				})
+				.attr( "role", "");
+
+		if ( !!o.inset ) {				
+			collapsibleHeading
+				.find( "a" ).first().add( ".ui-btn-inner", $el )
+					.addClass( "ui-corner-top ui-corner-bottom" );
+		}
+
+		//events
+		collapsible
+			.bind( "expand collapse", function( event ) {
+				if ( !event.isDefaultPrevented() ) {
+					var $this = $( this ),
+						isCollapse = ( event.type === "collapse" ),
+						contentTheme = o.contentTheme;
+
+					event.preventDefault();
+
+					// Custom event callback
+					if ( o.customEventHandler ) { o.customEventHandler.call( this, isCollapse ) };
+
+					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-" + expandedIcon, !isCollapse )
+							// logic or cause same icon for expanded/collapsed state would remove the ui-icon-class
+							.toggleClass( "ui-icon-" + collapsedIcon, ( isCollapse || expandedIcon === collapsedIcon ) )
+						.end()
+						.find( "a" ).first().removeClass( $.mobile.activeBtnClass );
+
+					$this.toggleClass( "ui-collapsible-collapsed", isCollapse );
+					collapsibleContent.toggleClass( "ui-collapsible-content-collapsed", isCollapse ).attr( "aria-hidden", isCollapse );
+					collapsibleContent.children( "li" ).not( "ui-collapsible-content" ).attr( "tabindex", isCollapse ? "" : "0" );
+
+					if ( contentTheme && !!o.inset && ( !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( "tap", function() {
+				collapsibleHeading.find( "a" ).first().addClass( $.mobile.activeBtnClass );
+			})
+			.bind( "vmousecancel", function() {
+				collapsibleHeading.find( "a" ).first().removeClass( $.mobile.activeBtnClass );
+			})
+			.bind( "click", function( event ) {
+
+				var type = collapsibleHeading.is( ".ui-collapsible-heading-collapsed" ) ? "expand" : "collapse";
+
+				collapsible.trigger( type );
+
+				event.preventDefault();
+				event.stopPropagation();
+			});
+	}
+});
+
+//delegate auto self-init widgets
+$.delegateSelfInitWithSingleSelector( $.mobile.collapsible );
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.widget( "mobile.collapsibleset", $.mobile.widget, {
+	options: {
+		initSelector: ":jqmData(role='collapsible-set')"
+	},
+	_create: function() {
+		var $el = this.element.addClass( "ui-collapsible-set" ),
+			o = this.options;
+
+		// Inherit the theme from collapsible-set
+		if ( !o.theme ) {
+			o.theme = $.mobile.getInheritedTheme( $el, "c" );
+		}
+		// Inherit the content-theme from collapsible-set
+		if ( !o.contentTheme ) {
+			o.contentTheme = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "content-theme" );
+		}
+
+		if ( $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "inset" ) !== undefined ) {
+			o.inset = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "inset" );
+		}
+		o.inset = o.inset !== undefined ? o.inset : true;
+
+		// Initialize the collapsible set if it's not already initialized
+		if ( !$el.jqmData( "collapsiblebound" ) ) {
+			$el
+				.jqmData( "collapsiblebound", true )
+				.bind( "expand collapse", function( event ) {
+					var isCollapse = ( event.type === "collapse" ),
+						collapsible = $( event.target ).closest( ".ui-collapsible" ),
+						widget = collapsible.data( "collapsible" );
+					if ( collapsible.jqmData( "collapsible-last" ) && !!o.inset ) {
+						collapsible.find( ".ui-collapsible-heading" ).first()
+							.find( "a" ).first()
+							.toggleClass( "ui-corner-bottom", isCollapse )
+							.find( ".ui-btn-inner" )
+							.toggleClass( "ui-corner-bottom", isCollapse );
+						collapsible.find( ".ui-collapsible-content" ).toggleClass( "ui-corner-bottom", !isCollapse );
+					}
+				})
+				.bind( "expand", function( event ) {
+					var closestCollapsible = $( event.target )
+						.closest( ".ui-collapsible" );
+					if ( closestCollapsible.parent().is( ":jqmData(role='collapsible-set')" ) ) {
+						closestCollapsible
+							.siblings( ".ui-collapsible" )
+							.trigger( "collapse" );
+					}
+				});
+		}
+	},
+
+	_init: function() {
+		var $el = this.element,
+			collapsiblesInSet = $el.children( ":jqmData(role='collapsible')" ),
+			expanded = collapsiblesInSet.filter( ":jqmData(collapsed='false')" );
+		this.refresh();
+
+		// Because the corners are handled by the collapsible itself and the default state is collapsed
+		// That was causing https://github.com/jquery/jquery-mobile/issues/4116
+		expanded.trigger( "expand" );
+	},
+
+	refresh: function() {
+		var $el = this.element,
+			o = this.options,
+			collapsiblesInSet = $el.children( ":jqmData(role='collapsible')" );
+
+		$.mobile.collapsible.prototype.enhance( collapsiblesInSet.not( ".ui-collapsible" ) );
+
+		// clean up borders
+		if ( !!o.inset ) {
+			collapsiblesInSet.each(function() {
+				$( this ).jqmRemoveData( "collapsible-last" )
+					.find( ".ui-collapsible-heading" )
+					.find( "a" ).first()
+					.removeClass( "ui-corner-top ui-corner-bottom" )
+					.find( ".ui-btn-inner" )
+					.removeClass( "ui-corner-top ui-corner-bottom" );
+			});
+
+			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" );
+		}
+	}
+});
+
+//delegate auto self-init widgets
+$.delegateSelfInitWithSingleSelector( $.mobile.collapsibleset );
+
+})( jQuery );
+
+(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 ui-mini" )
+			.attr( "role", "navigation" )
+			.find( "ul" )
+			.jqmEnhanceable()
+			.grid({ grid: this.options.grid });
+
+		$navbtns.buttonMarkup({
+			corners:	false,
+			shadow:		false,
+			inline:     true,
+			iconpos:	iconpos
+		});
+
+		$navbar.delegate( "a", "vclick", function( event ) {
+			if ( !$(event.target).hasClass( "ui-disabled" ) ) {
+				$navbtns.removeClass( $.mobile.activeBtnClass );
+				$( this ).addClass( $.mobile.activeBtnClass );
+			}
+		});
+
+		// Buttons in the navbar with ui-state-persist class should regain their active state before page show
+		$navbar.closest( ".ui-page" ).bind( "pagebeforeshow", function() {
+			$navbtns.filter( ".ui-state-persist" ).addClass( $.mobile.activeBtnClass );
+		});
+	}
+});
+
+//delegate auto self-init widgets
+$.delegateSelfInitWithSingleSelector( $.mobile.navbar );
+
+})( jQuery );
+
+(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,
+			listviewClasses = "";
+
+		listviewClasses += t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : "";
+
+		// create listview markup
+		t.element.addClass(function( i, orig ) {
+			return orig + " ui-listview " + listviewClasses;
+		});
+
+		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;
+
+		$li = this.element.children( "li" );
+		// At create time and when autodividers calls refresh the li are not visible yet so we need to rely on .ui-screen-hidden
+		$visibleli = create || $li.filter( ":visible" ).length === 0 ? $li.not( ".ui-screen-hidden" ) : $li.filter( ":visible" );
+
+		// ui-li-last is used for setting border-bottom on the last li		
+		$li.filter( ".ui-li-last" ).removeClass( "ui-li-last" );
+					
+		if ( this.options.inset ) {
+			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 ui-li-last" );
+
+			$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" );
+		} else {
+			$visibleli.last().addClass( "ui-li-last" );
+		}
+		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" ).attr( {
+					"role" : "",
+					"aria-label" : "icon"
+				});
+				$( this._findFirstElementByTagName( img[ 0 ].parentNode, "parentNode", "li", "LI" ) ).addClass( img.is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" );
+			}
+		}
+	},
+
+	_addCheckboxRadioClasses: function( containers )
+	{
+		var i, inputAttr, len = containers.length;
+		for ( i = 0; i < len; i++ ) {
+			inputAttr = $( containers[ i ] ).find( "input" );
+			if ( inputAttr.attr( "type" ) == "checkbox" ) {
+				$( containers[ i ] ).addClass( "ui-li-has-checkbox" );
+			} else if ( inputAttr.attr( "type" ) == "radio" ) {
+				$( containers[ i ] ).addClass( "ui-li-has-radio" );
+			}
+		}
+	},
+
+	_addRightBtnClasses: function( containers )
+	{
+		var i, btnAttr, len = containers.length;
+		for ( i = 0; i < len; i++ ) {
+			btnAttr = $( containers[ i ] ).find( ":jqmData(role='button'),input[type='button'],select:jqmData(role='slider')" );
+			if ( btnAttr.length ) {
+				if ( btnAttr.jqmData( "style" ) == "circle" )  {
+					$( containers[ i ] ).addClass( "ui-li-has-right-circle-btn" );
+				} else {
+					$( containers[ i ] ).addClass( "ui-li-has-right-btn" );
+				}
+			}
+		}
+	},
+
+	refresh: function( create ) {
+		this.parentPage = this.element.closest( ".ui-page" );
+		this._createSubPages();
+
+		var o = this.options,
+			$list = this.element,
+			self = this,
+			dividertheme = $.mobile.getAttrFixed( $list[0], "data-" + $.mobile.ns + "dividertheme" ) || o.dividerTheme,
+			listsplittheme =  $.mobile.getAttrFixed( $list[0], "data-" + $.mobile.ns + "splittheme" ),
+			listspliticon = $.mobile.getAttrFixed( $list[0], "data-" + $.mobile.ns + "spliticon" ),
+			li = this._getChildrenByTagName( $list[ 0 ], "li", "LI" ),
+			ol = !!$.nodeName( $list[ 0 ], "ol" ),
+			jsCount = !$.support.cssPseudoElement,
+			start = $list.attr( "start" ),
+			itemClassDict = {},
+			item, itemClass, itemTheme,
+			a, last, splittheme, counter, startCount, newStartCount, countParent, icon, imgParents, img, linkIcon;
+
+		if ( ol && jsCount ) {
+			$list.find( ".ui-li-dec" ).remove();
+		}
+
+		if ( ol ) {	
+			// Check if a start attribute has been set while taking a value of 0 into account
+			if ( start || start === 0 ) {
+				if ( !jsCount ) {
+					startCount = parseFloat( start ) - 1;
+					$list.css( "counter-reset", "listnumbering " + startCount );
+				} else {
+					counter = parseFloat( start );
+				}
+			} else if ( jsCount ) {
+					counter = 1;
+			}	
+		}
+
+		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 = $.mobile.getAttrFixed( item[0], "data-" + $.mobile.ns + "theme" ) || o.theme;
+				a = this._getChildrenByTagName( item[ 0 ], "a", "A" ).attr( {
+					"role": "",
+					"tabindex": "0"
+				});
+				var isDivider = ( $.mobile.getAttrFixed( item[0], "data-" + $.mobile.ns + "role" ) === "list-divider" );
+
+				if ( item.hasClass( "ui-li-has-checkbox" ) || item.hasClass( "ui-li-has-radio" ) ) {
+					item.on( "vclick", function ( e ) {
+						var targetItem = $( e.target );
+						var checkboxradio = targetItem.find( ".ui-checkbox" );
+						if ( !checkboxradio.length ) {
+							checkboxradio = targetItem.find( ".ui-radio" );
+						}
+
+						if ( checkboxradio.length ) {
+							checkboxradio.children( "label" ).trigger( "vclick" );
+						}
+					});
+				}
+
+				if ( a.length && !isDivider ) {
+					icon = $.mobile.getAttrFixed( item[0], "data-" + $.mobile.ns + "icon" );
+
+					/* Remove auto populated right-arrow button. */
+					if ( icon === undefined ) {
+						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().removeClass( "ui-link" ).addClass( "ui-link-inherit" );
+
+					if ( a.length > 1 ) {
+						itemClass += " ui-li-has-alt";
+
+						last = a.last();
+						splittheme = listsplittheme || $.mobile.getAttrFixed( last[0], "data-" + $.mobile.ns + "theme" ) || o.splitTheme;
+						linkIcon = $.mobile.getAttrFixed( last[0], "data-" + $.mobile.ns + "icon" );
+
+						last.appendTo( item )
+							.attr( "title", last.getEncodedText() )
+							.addClass( "ui-li-link-alt" )
+							.empty()
+							.buttonMarkup({
+								shadow: false,
+								corners: false,
+								theme: itemTheme,
+								icon: false,
+								iconpos: "notext"
+							})
+							.find( ".ui-btn-inner" )
+								.append(
+									$( document.createElement( "span" ) ).buttonMarkup({
+										shadow: true,
+										corners: true,
+										theme: splittheme,
+										iconpos: "notext",
+										// link icon overrides list item icon overrides ul element overrides options
+										icon: linkIcon || icon || listspliticon || o.splitIcon
+									})
+								);
+					}
+				} else if ( isDivider ) {
+
+					itemClass += " ui-li-divider ui-bar-" + dividertheme;
+					item.attr( { "role": "heading", "tabindex": "0" } );
+
+					if ( ol ) {	
+						//reset counter when a divider heading is encountered
+						if ( start || start === 0 ) {
+							if ( !jsCount ) {
+								newStartCount = parseFloat( start ) - 1;
+								item.css( "counter-reset", "listnumbering " + newStartCount );
+							} else {
+								counter = parseFloat( start );
+							}
+						} else if ( jsCount ) {
+								counter = 1;
+						}	
+					}
+				
+				} else {
+					itemClass += " ui-li-static ui-btn-up-" + itemTheme;
+					item.attr( "tabindex", "0" );
+				}
+			}
+
+			if ( ol && jsCount && itemClass.indexOf( "ui-li-divider" ) < 0 ) {
+				countParent = itemClass.indexOf( "ui-li-static" ) > 0 ? 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-" + ( $.mobile.getAttrFixed( $list[0], "data-" + $.mobile.ns + "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._addCheckboxRadioClasses( li );
+		this._addCheckboxRadioClasses( $list.find( ".ui-link-inherit" ) );
+
+		this._addRightBtnClasses( li );
+		this._addRightBtnClasses( $list.find( ".ui-link-inherit" ) );
+
+		this._refreshCorners( create );
+
+    // autodividers binds to this to redraw dividers after the listview refresh
+		this._trigger( "afterrefresh" );
+	},
+
+	//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(),
+				nodeElsFull = $( list.prevAll().toArray().reverse() ),
+				nodeEls = nodeElsFull.length ? nodeElsFull : $( "<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 = $.mobile.getAttrFixed( list[0], "data-" + $.mobile.ns + "theme" ) || o.theme,
+				countTheme = $.mobile.getAttrFixed( list[0], "data-" + $.mobile.ns + "counttheme" ) || $.mobile.getAttrFixed( parentList[0], "data-" + $.mobile.ns + "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,
+					prEvent = new $.Event( "pageremove" );
+
+				if ( ui.nextPage ) {
+					npURL = nextPage.jqmData( "url" );
+					if ( npURL.indexOf( parentUrl + "&" + $.mobile.subPageUrlKey ) !== 0 ) {
+						self.childPages().remove();
+						parentPage.trigger( prEvent );
+						if ( !prEvent.isDefaultPrevented() ) {
+							parentPage.removeWithDependents();
+						}
+					}
+				}
+			};
+
+			// unbind the original page remove and replace with our specialized version
+			parentPage
+				.unbind( "pagehide.remove" )
+				.bind( "pagehide.remove", newRemove);
+		}
+	},
+
+	addItem : function( listitem , idx ) {
+		var $item = $(listitem),
+			$li,
+			_self = this;
+
+		$li = _self.element.children( 'li' );
+		$item.css( { 'opacity' : 0,
+					 'display' : 'none' } );
+		if( $li.length == 0
+			|| $li.length <= idx)
+		{
+			$( _self.element ).append( $item );
+		} else {
+			$( $li.get( idx ) ).before( $item );
+		}
+		$(_self.element).trigger("create")
+			.listview( 'refresh' );
+
+		$item.css( 'min-height' , '0px' );
+
+		$item.slideDown( 'fast' , function( ){
+			$item.addClass("addli");
+			$item.css( { 'opacity' : 1 } );
+		} );
+	},
+
+	removeItem : function( idx ) {
+		var $item,
+			$li,
+			_self = this;
+
+		$li = _self.element.children( 'li' );
+		if( $li.length <= 0 ||
+			$li.length < idx ) {
+			return ;
+		}
+		$item = $( $li.get( idx ) );
+		$item.addClass("removeli");
+		$item.slideUp('normal',
+			function( ) {
+			$(this).remove();
+		});
+	},
+
+	// 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 + "')" );
+	}
+});
+
+//delegate auto self-init widgets
+$.delegateSelfInitWithSingleSelector( $.mobile.listview );
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.mobile.listview.prototype.options.autodividers = false;
+$.mobile.listview.prototype.options.autodividersSelector = function( elt ) {
+	// look for the text in the given element
+	var text = elt.text() || null;
+
+	if ( !text ) {
+		return null;
+	}
+
+	// create the text for the divider (first uppercased letter)
+	text = text.trim().slice( 0, 1 ).toUpperCase();
+
+	return text;
+};
+
+$.mobile.$document.delegate( "ul,ol", "listviewcreate", function() {
+
+	var list = $( this ),
+			listview = list.data( "listview" );
+
+	if ( !listview || !listview.options.autodividers ) {
+		return;
+	}
+
+	var replaceDividers = function () {
+		list.find( "li:jqmData(role='list-divider')" ).remove();
+
+		var lis = list.find( 'li' ),
+			lastDividerText = null, li, dividerText;
+
+		for ( var i = 0; i < lis.length ; i++ ) {
+			li = lis[i];
+			dividerText = listview.options.autodividersSelector( $( li ) );
+
+			if ( dividerText && lastDividerText !== dividerText ) {
+				var divider = document.createElement( 'li' );
+				divider.appendChild( document.createTextNode( dividerText ) );
+				divider.setAttribute( 'data-' + $.mobile.ns + 'role', 'list-divider' );
+				li.parentNode.insertBefore( divider, li );
+			}
+
+			lastDividerText = dividerText;
+		}
+	};
+
+	var afterListviewRefresh = function () {
+		list.unbind( 'listviewafterrefresh', afterListviewRefresh );
+		replaceDividers();
+		listview.refresh();
+		list.bind( 'listviewafterrefresh', afterListviewRefresh );
+	};
+
+	afterListviewRefresh();
+});
+
+})( 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,
+			inheritAttr = function( input, dataAttr ) {
+				return input.jqmData( dataAttr ) || input.closest( "form, fieldset" ).jqmData( dataAttr );
+			},
+			// NOTE: Windows Phone could not find the label through a selector
+			// filter works though.
+			parentLabel = $( input ).closest( "label" ),
+			label = parentLabel.length ? parentLabel : ( input[0].id ? $( input ).closest( "form, fieldset, :jqmData(role='page'), :jqmData(role='dialog')" ).find( "label" ).filter( "[for='" + input[0].id + "']" ) : [ ] ),
+			inputtype = input[0].type,
+			mini = inheritAttr( input, "mini" ),
+			checkedState = inputtype + "-on",
+			uncheckedState = inputtype + "-off",
+			icon = input.parents( ":jqmData(type='horizontal')" ).length ? undefined : uncheckedState,
+			iconpos = inheritAttr( input, "iconpos" ),
+			activeBtn = icon ? "" : " " + $.mobile.activeBtnClass,
+			checkedClass = "ui-" + checkedState + activeBtn,
+			uncheckedClass = "ui-" + uncheckedState,
+			checkedicon = "ui-icon-" + checkedState,
+			uncheckedicon = "ui-icon-" + uncheckedState,
+			ariaCheckedAttr = "";
+
+		if ( inputtype !== "checkbox" && inputtype !== "radio" ) {
+			return;
+		}
+
+		ariaCheckedAttr = ( inputtype === "checkbox" ) ? "aria-checked" : "aria-selected";
+
+		// Support fake label
+		if ( label.length == 0 ) {
+			label = $( "<label for='" + input[ 0 ].id  +
+				"'></label>" );
+		}
+
+		// Expose for other methods
+		$.extend( this, {
+			label: label,
+			inputtype: inputtype,
+			checkedClass: checkedClass,
+			uncheckedClass: uncheckedClass,
+			checkedicon: checkedicon,
+			uncheckedicon: uncheckedicon,
+			ariaCheckedAttr : ariaCheckedAttr
+		});
+
+		// If there's no selected theme check the data attr
+		if ( !this.options.theme ) {
+			this.options.theme = $.mobile.getInheritedTheme( this.element, "c" );
+		}
+
+		label.buttonMarkup({
+			theme: this.options.theme,
+			icon: icon,
+			shadow: false,
+			mini: mini,
+			iconpos: iconpos
+		});
+
+		// Wrap the input + label in a div
+		var wrapper = document.createElement('div');
+		wrapper.className = 'ui-' + inputtype;
+		wrapper.setAttribute( "role", inputtype );
+
+		if ( input.hasClass( "favorite" ) ) {
+			wrapper.className += ' favorite';
+		}
+
+		input.add( label ).wrapAll( wrapper );
+
+		label.bind({
+			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( $.mobile.focusClass );
+				},
+
+				blur: function() {
+					label.removeClass( $.mobile.focusClass );
+				}
+			});
+
+		this.refresh();
+	},
+
+	_cacheVals: function() {
+		this._getInputSet().each(function() {
+			$( this ).jqmData( "cacheVal", this.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'), :jqmData(role='dialog')" )
+			.find( "input[name='" + this.element[0].name + "'][type='" + this.inputtype + "']" );
+	},
+
+	_updateAll: function() {
+		var self = this;
+
+		this._getInputSet().each(function() {
+			var $this = $( this );
+
+			if ( this.checked || self.inputtype === "checkbox" ) {
+				$this.trigger( "change" );
+			}
+			$this.focus();
+		})
+		.checkboxradio( "refresh" );
+	},
+
+	refresh: function() {
+		var input = this.element[0],
+			label = this.label,
+			wrapper = input.parentNode,
+			icon = label.find( ".ui-icon" );
+
+		if ( input.checked ) {
+			label.addClass( this.checkedClass ).removeClass( this.uncheckedClass );
+			icon.addClass( this.checkedicon ).removeClass( this.uncheckedicon );
+			wrapper.setAttribute( this.ariaCheckedAttr, true );
+		} else {
+			label.removeClass( this.checkedClass ).addClass( this.uncheckedClass );
+			icon.removeClass( this.checkedicon ).addClass( this.uncheckedicon );
+			wrapper.setAttribute( this.ariaCheckedAttr, false );
+		}
+
+		if ( input.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
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$.mobile.checkboxradio.prototype.enhanceWithin( e.target, true );
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.widget( "mobile.button", $.mobile.widget, {
+	options: {
+		theme: null,
+		icon: null,
+		iconpos: null,
+		corners: true,
+		shadow: true,
+		iconshadow: true,
+		initSelector: "button, [type='button'], [type='submit'], [type='reset']"
+	},
+	_create: function() {
+		var $el = this.element,
+			$button,
+			o = this.options,
+			type,
+			name,
+			inline = o.inline ||  $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "inline" ),
+			mini = o.mini || $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "mini" ),
+			classes = "",
+			$buttonPlaceholder;
+
+		// if this is a link, check if it's been enhanced and, if not, use the right function
+		if ( $el[ 0 ].tagName === "A" ) {
+			if ( !$el.hasClass( "ui-btn" ) ) {
+				$el.buttonMarkup();
+			}
+
+			return;
+		}
+
+		// get the inherited theme
+		// TODO centralize for all widgets
+		if ( !this.options.theme ) {
+			this.options.theme = $.mobile.getInheritedTheme( this.element, "c" );
+		}
+
+		// TODO: Post 1.1--once we have time to test thoroughly--any classes manually applied to the original element should be carried over to the enhanced element, with an `-enhanced` suffix. See https://github.com/jquery/jquery-mobile/issues/3577
+		/* if ( $el[0].className.length ) {
+			classes = $el[0].className;
+		} */
+		if ( !!~$el[0].className.indexOf( "ui-btn-left" ) ) {
+			classes = "ui-btn-left";
+		}
+
+		if (  !!~$el[0].className.indexOf( "ui-btn-right" ) ) {
+			classes = "ui-btn-right";
+		}
+
+		if (  $el.attr( "type" ) === "submit" || $el.attr( "type" ) === "reset" ) {
+			classes ? classes += " ui-submit" :  classes = "ui-submit";
+		}
+		$( "label[for='" + $el.attr( "id" ) + "']" ).addClass( "ui-submit" );
+
+		// Add ARIA role
+		this.button = $( "<div></div>" )
+			[ $el.html() ? "html" : "text" ]( $el.html() || $el.val() )
+			.insertBefore( $el )
+			.buttonMarkup({
+				theme: o.theme,
+				icon: o.icon,
+				iconpos: o.iconpos,
+				inline: inline,
+				corners: o.corners,
+				shadow: o.shadow,
+				iconshadow: o.iconshadow,
+				mini: mini
+			})
+			.addClass( classes )
+			.append( $el.addClass( "ui-btn-hidden" ) );
+
+        $button = this.button;
+		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
+						$.mobile.$document.one( "submit", function() {
+							$buttonPlaceholder.remove();
+
+							// reset the local var so that the hidden input
+							// will be re-added on subsequent clicks
+							$buttonPlaceholder = undefined;
+						});
+					}
+				});
+		}
+
+		$el.bind({
+			focus: function() {
+				$button.addClass( $.mobile.focusClass );
+			},
+
+			blur: function() {
+				$button.removeClass( $.mobile.focusClass );
+			}
+		});
+
+		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();
+		}
+
+		// Grab the button's text element from its implementation-independent data item
+		$( this.button.data( 'buttonElements' ).text )[ $el.html() ? "html" : "text" ]( $el.html() || $el.val() );
+	}
+});
+
+//auto self-init widgets
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$.mobile.button.prototype.enhanceWithin( e.target, true );
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.fn.controlgroup = function( options ) {
+	function flipClasses( els, flCorners  ) {
+		els.removeClass( "ui-btn-corner-all ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-controlgroup-last ui-shadow" )
+			.eq( 0 ).addClass( flCorners[ 0 ] )
+			.end()
+			.last().addClass( flCorners[ 1 ] ).addClass( "ui-controlgroup-last" );
+	}
+
+	return this.each(function() {
+		var $el = $( this ),
+			o = $.extend({
+						direction:  $.mobile.getAttrFixed( $el[0], "data-"+ $.mobile.ns + "type" ) || "vertical",
+						shadow: false,
+						excludeInvisible: true,
+						mini: $.mobile.getAttrFixed( $el[0], "data-"+ $.mobile.ns + "mini" )
+					}, options ),
+			grouplegend = $el.children( "legend" ),
+			groupheading = $el.children( ".ui-controlgroup-label" ),
+			groupcontrols = $el.children( ".ui-controlgroup-controls" ),
+			flCorners = o.direction === "horizontal" ? [ "ui-corner-left", "ui-corner-right" ] : [ "ui-corner-top", "ui-corner-bottom" ],
+			type = $el.find( "input" ).first().attr( "type" );
+
+		// First unwrap the controls if the controlgroup was already enhanced
+		if ( groupcontrols.length ) {
+			groupcontrols.contents().unwrap();
+		}
+		$el.wrapInner( "<div class='ui-controlgroup-controls'></div>" );
+
+		if ( grouplegend.length ) {
+			// Replace legend with more stylable replacement div
+			$( "<div role='heading' class='ui-controlgroup-label'>" + grouplegend.html() + "</div>" ).insertBefore( $el.children( 0 ) );
+			grouplegend.remove();
+		} else if ( groupheading.length ) {
+			// Just move the heading if the controlgroup was already enhanced
+			$el.prepend( groupheading );
+		}
+
+		$el.addClass( "ui-corner-all ui-controlgroup ui-controlgroup-" + o.direction );
+
+		flipClasses( $el.find( ".ui-btn" + ( o.excludeInvisible ? ":visible" : "" ) ).not( '.ui-slider-handle' ), flCorners );
+		flipClasses( $el.find( ".ui-btn-inner" ), flCorners );
+
+		if ( o.shadow ) {
+			$el.addClass( "ui-shadow" );
+		}
+
+		if ( o.mini ) {
+			$el.addClass( "ui-mini" );
+		}
+
+	});
+};
+
+// The pagecreate handler for controlgroup is in jquery.mobile.init because of the soft-dependency on the wrapped widgets
+
+})(jQuery);
+
+(function( $, undefined ) {
+
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+
+	//links within content areas, tests included with page
+	$( e.target )
+		.find( "a" )
+		.jqmEnhanceable()
+		.not( ".ui-btn, .ui-link-inherit, :jqmData(role='none'), :jqmData(role='nojs')" )
+		.addClass( "ui-link" );
+
+});
+
+})( jQuery );
+
+
+(function( $, undefined ) {
+
+	function fitSegmentInsideSegment( winSize, segSize, offset, desired ) {
+		var ret = desired;
+
+		if ( winSize < segSize ) {
+			// Center segment if it's bigger than the window
+			ret = offset + ( winSize - segSize ) / 2;
+		} else {
+			// Otherwise center it at the desired coordinate while keeping it completely inside the window
+			ret = Math.min( Math.max( offset, desired - segSize / 2 ), offset + winSize - segSize );
+		}
+
+		return ret;
+	}
+
+	function windowCoords() {
+		var $win = $.mobile.$window;
+
+		return {
+			x: $win.scrollLeft(),
+			y: $win.scrollTop(),
+			cx: ( window.innerWidth || $win.width() ),
+			cy: ( window.innerHeight || $win.height() )
+		};
+	}
+
+	$.widget( "mobile.popup", $.mobile.widget, {
+		options: {
+			theme: null,
+			overlayTheme: null,
+			shadow: true,
+			corners: true,
+			transition: "pop",
+			positionTo: "origin",
+			tolerance: null,
+			initSelector: ":jqmData(role='popup')",
+			closeLinkSelector: "a:jqmData(rel='back')",
+			closeLinkEvents: "click.popup",
+			navigateEvents: "navigate.popup",
+			closeEvents: "navigate.popup pagebeforechange.popup",
+			isHardwarePopup: false,
+			// NOTE Windows Phone 7 has a scroll position caching issue that
+			//      requires us to disable popup history management by default
+			//      https://github.com/jquery/jquery-mobile/issues/4784
+			//
+			// NOTE this option is modified in _create!
+			history: false
+		},
+
+		_eatEventAndClose: function( e ) {
+			e.preventDefault();
+			e.stopImmediatePropagation();
+			this.close();
+			return false;
+		},
+
+		// Make sure the screen size is increased beyond the page height if the popup's causes the document to increase in height
+		_resizeScreen: function() {
+			var popupHeight = this._ui.container.outerHeight( true );
+
+			this._ui.screen.removeAttr( "style" );
+			if ( popupHeight > this._ui.screen.height() ) {
+				this._ui.screen.height( popupHeight );
+			}
+		},
+
+		_handleWindowKeyUp: function( e ) {
+			if ( this._isOpen && e.keyCode === $.mobile.keyCode.ESCAPE ) {
+				return this._eatEventAndClose( e );
+			}
+		},
+
+		_maybeRefreshTimeout: function() {
+			var winCoords = windowCoords();
+
+			if ( this._resizeData ) {
+				if ( winCoords.x === this._resizeData.winCoords.x &&
+					winCoords.y === this._resizeData.winCoords.y &&
+					winCoords.cx === this._resizeData.winCoords.cx &&
+					winCoords.cy === this._resizeData.winCoords.cy ) {
+					// timeout not refreshed
+					return false;
+				} else {
+					// clear existing timeout - it will be refreshed below
+					clearTimeout( this._resizeData.timeoutId );
+				}
+			}
+
+			this._resizeData = {
+				timeoutId: setTimeout( $.proxy( this, "_resizeTimeout" ), 200 ),
+				winCoords: winCoords
+			};
+
+			return true;
+		},
+
+		_resizeTimeout: function() {
+			if ( !this._maybeRefreshTimeout() && this.positionTo === "window" && this._isOpen ) {
+				// effectively rapid-open the popup while leaving the screen intact
+				this._trigger( "beforeposition" );
+				this._ui.container
+					.removeClass( "ui-selectmenu-hidden" )
+					.offset( this._placementCoords( this._desiredCoords( undefined, undefined, "window" ) ) );
+
+				this._resizeScreen();
+				this._resizeData = null;
+				this._orientationchangeInProgress = false;
+			}
+		},
+
+		_handleWindowResize: function( e ) {
+			if ( this._isOpen ) {
+				// Context popup close when Window resize event
+				if( this.positionTo !== "window" ) {
+					this.close();
+					return false;
+				}
+				this._maybeRefreshTimeout();
+			}
+		},
+
+		_handleWindowOrientationchange: function( e ) {
+
+			if ( !this._orientationchangeInProgress ) {
+				// effectively rapid-close the popup while leaving the screen intact
+				this._ui.container
+					.addClass( "ui-selectmenu-hidden" )
+					.removeAttr( "style" );
+
+				this._orientationchangeInProgress = true;
+			}
+		},
+
+		_create: function() {
+			var ui = {
+					screen: $( "<div class='ui-screen-hidden ui-popup-screen'></div>" ),
+					placeholder: $( "<div style='display: none;'><!-- placeholder --></div>" ),
+					container: $( "<div class='ui-popup-container ui-selectmenu-hidden'></div>" ),
+					arrow : $("<div class='ui-arrow'></div>")
+				},
+				thisPage = this.element.closest( ".ui-page" ),
+				myId = this.element.attr( "id" ),
+				self = this;
+
+			// We need to adjust the history option to be false if there's no AJAX nav.
+			// We can't do it in the option declarations because those are run before
+			// it is determined whether there shall be AJAX nav.
+			this.options.history = this.options.history && $.mobile.ajaxEnabled && $.mobile.hashListeningEnabled;
+
+			if ( thisPage.length === 0 ) {
+				thisPage = $( "body" );
+			}
+
+			// define the container for navigation event bindings
+			// TODO this would be nice at the the mobile widget level
+			this.options.container = this.options.container || $.mobile.pageContainer;
+
+			// Apply the proto
+			thisPage.append( ui.screen );
+			ui.container.insertAfter( ui.screen );
+			// Leave a placeholder where the element used to be
+			ui.placeholder.insertAfter( this.element );
+			if ( myId ) {
+				ui.screen.attr( "id", myId + "-screen" );
+				ui.container.attr( "id", myId + "-popup" );
+				ui.placeholder.html( "<!-- placeholder for " + myId + " -->" );
+			}
+			ui.container.append( this.element );
+			ui.container.append( ui.arrow );
+			// Add class to popup element
+			this.element.addClass( "ui-popup" );
+
+			// Define instance variables
+			$.extend( this, {
+				_page: thisPage,
+				_ui: ui,
+				_fallbackTransition: "",
+				_currentTransition: false,
+				_prereqs: null,
+				_isOpen: false,
+				_tolerance: null,
+				_resizeData: null,
+				_orientationchangeInProgress: false,
+				_globalHandlers: [
+					{
+						src: $.mobile.$window,
+						handler: {
+							orientationchange: $.proxy( this, "_handleWindowOrientationchange" ),
+							resize: $.proxy( this, "_handleWindowResize" ),
+							keyup: $.proxy( this, "_handleWindowKeyUp" )
+						}
+					}
+				]
+			});
+
+			$.each( this.options, function( key, value ) {
+				// Cause initial options to be applied by their handler by temporarily setting the option to undefined
+				// - the handler then sets it to the initial value
+				self.options[ key ] = undefined;
+				self._setOption( key, value, true );
+			});
+
+			ui.screen.bind( "vclick", $.proxy( this, "_eatEventAndClose" ) );
+
+			$.each( this._globalHandlers, function( idx, value ) {
+				value.src.bind( value.handler );
+			});
+		},
+
+		_applyTheme: function( dst, theme, prefix ) {
+			var classes = ( dst.attr( "class" ) || "").split( " " ),
+				alreadyAdded = true,
+				currentTheme = null,
+				matches,
+				themeStr = String( theme );
+
+			while ( classes.length > 0 ) {
+				currentTheme = classes.pop();
+				matches = ( new RegExp( "^ui-" + prefix + "-([a-z])$" ) ).exec( currentTheme );
+				if ( matches && matches.length > 1 ) {
+					currentTheme = matches[ 1 ];
+					break;
+				} else {
+					currentTheme = null;
+				}
+			}
+
+			if ( theme !== currentTheme ) {
+				dst.removeClass( "ui-" + prefix + "-" + currentTheme );
+				if ( ! ( theme === null || theme === "none" ) ) {
+					dst.addClass( "ui-" + prefix + "-" + themeStr );
+				}
+			}
+		},
+
+		_setTheme: function( value ) {
+			this._applyTheme( this.element, value, "body" );
+		},
+
+		_setOverlayTheme: function( value ) {
+			this._applyTheme( this._ui.screen, value, "overlay" );
+
+			if ( this._isOpen ) {
+				this._ui.screen.addClass( "in" );
+			}
+		},
+
+		_setShadow: function( value ) {
+			this.element.toggleClass( "ui-overlay-shadow", value );
+		},
+
+		_setCorners: function( value ) {
+			this.element.toggleClass( "ui-corner-all", value );
+		},
+
+		_applyTransition: function( value ) {
+			this._ui.container.removeClass( this._fallbackTransition );
+			if ( value && value !== "none" ) {
+				this._fallbackTransition = $.mobile._maybeDegradeTransition( value );
+				this._ui.container.addClass( this._fallbackTransition );
+			}
+		},
+
+		_setTransition: function( value ) {
+			if ( !this._currentTransition ) {
+				this._applyTransition( value );
+			}
+		},
+
+		_setTolerance: function( value ) {
+			var tol = { t: 5, r: 5, b: 5, l: 5 };
+
+			if ( value ) {
+				var ar = String( value ).split( "," );
+
+				$.each( ar, function( idx, val ) { ar[ idx ] = parseInt( val, 10 ); } );
+
+				switch( ar.length ) {
+					// All values are to be the same
+					case 1:
+						if ( !isNaN( ar[ 0 ] ) ) {
+							tol.t = tol.r = tol.b = tol.l = ar[ 0 ];
+						}
+						break;
+
+					// The first value denotes top/bottom tolerance, and the second value denotes left/right tolerance
+					case 2:
+						if ( !isNaN( ar[ 0 ] ) ) {
+							tol.t = tol.b = ar[ 0 ];
+						}
+						if ( !isNaN( ar[ 1 ] ) ) {
+							tol.l = tol.r = ar[ 1 ];
+						}
+						break;
+
+					// The array contains values in the order top, right, bottom, left
+					case 4:
+						if ( !isNaN( ar[ 0 ] ) ) {
+							tol.t = ar[ 0 ];
+						}
+						if ( !isNaN( ar[ 1 ] ) ) {
+							tol.r = ar[ 1 ];
+						}
+						if ( !isNaN( ar[ 2 ] ) ) {
+							tol.b = ar[ 2 ];
+						}
+						if ( !isNaN( ar[ 3 ] ) ) {
+							tol.l = ar[ 3 ];
+						}
+						break;
+
+					default:
+						break;
+				}
+			}
+
+			this._tolerance = tol;
+		},
+
+		_setOption: function( key, value ) {
+			var exclusions, setter = "_set" + key.charAt( 0 ).toUpperCase() + key.slice( 1 );
+
+			if ( this[ setter ] !== undefined ) {
+				this[ setter ]( value );
+			}
+
+			// TODO REMOVE FOR 1.2.1 by moving them out to a default options object
+			exclusions = [
+				"initSelector",
+				"closeLinkSelector",
+				"closeLinkEvents",
+				"navigateEvents",
+				"closeEvents",
+				"history",
+				"container"
+			];
+
+			$.mobile.widget.prototype._setOption.apply( this, arguments );
+			if ( $.inArray( key, exclusions ) === -1 ) {
+				// Record the option change in the options and in the DOM data-* attributes
+				this.element.attr( "data-" + ( $.mobile.ns || "" ) + ( key.replace( /([A-Z])/, "-$1" ).toLowerCase() ), value );
+			}
+		},
+
+		// Try and center the overlay over the given coordinates
+		_placementCoords: function( desired ) {
+			// rectangle within which the popup must fit
+			var
+				winCoords = windowCoords(),
+				rc = {
+					x: this._tolerance.l,
+					y: winCoords.y + this._tolerance.t,
+					cx: winCoords.cx - this._tolerance.l - this._tolerance.r,
+					cy: winCoords.cy - this._tolerance.t - this._tolerance.b
+				},
+				menuSize, ret,
+				linkOffset = $(this.link).offset(),
+				positionOffsets = [],
+				correctionValue = [0,0],
+				arrayIdx;
+
+			// Clamp the width of the menu before grabbing its size
+			this._ui.container.css( "max-width", rc.cx );
+			menuSize = {
+				cx: this._ui.container.outerWidth( true ),
+				cy: this._ui.container.outerHeight( true )
+			};
+
+			// Center the menu over the desired coordinates, while not going outside
+			// the window tolerances. This will center wrt. the window if the popup is too large.
+			ret = {
+				x: fitSegmentInsideSegment( rc.cx, menuSize.cx, rc.x, desired.x ),
+				y: fitSegmentInsideSegment( rc.cy, menuSize.cy, rc.y, desired.y )
+			};
+
+			// Make sure the top of the menu is visible
+			ret.y = Math.max( 0, ret.y );
+
+			// If the height of the menu is smaller than the height of the document
+			// align the bottom with the bottom of the document
+
+			// fix for $( document ).height() bug in core 1.7.2.
+			var docEl = document.documentElement, docBody = document.body,
+				docHeight = Math.max( docEl.clientHeight, docBody.scrollHeight, docBody.offsetHeight, docEl.scrollHeight, docEl.offsetHeight );
+
+			ret.y -= Math.min( ret.y, Math.max( 0, ret.y + menuSize.cy - docHeight ) );
+
+			if ( this.positionTo !== "origin" ) {
+				return { left: ret.x, top: ret.y , arrowleft: 0 , arrowtop: 0};
+			} else if( this.options.isHardwarePopup )  {
+				return { left: this._tolerance.l, top: $(window).height() - menuSize.cy - this._tolerance.b, arrowleft: 0 , arrowtop: 0 };
+			}
+
+			positionOffsets = [ linkOffset.left,
+								linkOffset.top,
+								docEl.clientHeight - ( linkOffset.top + $(this.link).height() ),
+								docEl.clientWidth - ( linkOffset.left + $(this.link).width() )];
+			arrayIdx = positionOffsets.indexOf(Math.max.apply(window,positionOffsets));
+
+			switch( arrayIdx )
+			{
+				case 0:
+					correctionValue = [ -$(this.link).width() , 0];
+					arrowtop = ( linkOffset.top - ret.y  ) + ( $(this.link).height() / 2 ) - parseInt( $(this._ui.arrow).css("border-width") ) ;
+					arrowleft = menuSize.cx;
+					$(this._ui.arrow).attr( "class", "" )
+									.addClass( "ui-arrow left" )
+					break;
+				case 1:
+					correctionValue = [ 0 , -(ret.y + menuSize.cy - linkOffset.top)];
+					arrowtop = menuSize.cy - 2;
+					arrowleft = (linkOffset.left - ret.x + correctionValue[0]) + ( $(this.link).width() / 2 ) - parseInt( $(this._ui.arrow).css("border-width") ) / 2;
+					$(this._ui.arrow).attr( "class", "" )
+									.addClass( "ui-arrow bottom" );
+					break;
+				case 2:
+					correctionValue = [ 0 , ( linkOffset.top + $(this.link).height() - ret.y ) ];
+					arrowtop = - parseInt( $(this._ui.arrow).css("border-width") ) * 2 + 1;
+					arrowleft = (linkOffset.left - ret.x + correctionValue[0]) + ( $(this.link).width() / 2 ) - parseInt( $(this._ui.arrow).css("border-width") ) / 2;
+					$(this._ui.arrow).attr( "class", "" )
+									.addClass("ui-arrow top");
+					break;
+				case 3:
+					correctionValue = [ ( menuSize.cx < $(this.link).width() ) ? ( $(this.link).width() / 2 ) + ( menuSize.cx / 2) : $(this.link).width() , 0];
+					arrowtop = ( linkOffset.top - ret.y  ) + ( $(this.link).height() / 2 ) - parseInt( $(this._ui.arrow).css("border-width") ) ;
+					arrowleft = - parseInt( $(this._ui.arrow).css("border-width") ) * 2;
+					$(this._ui.arrow).attr( "class", "" )
+									.addClass("ui-arrow right");
+					break;
+			}
+
+			return { left: ret.x + correctionValue[0], top: ret.y + correctionValue[1] , arrowleft: arrowleft , arrowtop: arrowtop };
+		},
+
+		_createPrereqs: function( screenPrereq, containerPrereq, whenDone ) {
+			var self = this, prereqs;
+
+			// It is important to maintain both the local variable prereqs and self._prereqs. The local variable remains in
+			// the closure of the functions which call the callbacks passed in. The comparison between the local variable and
+			// self._prereqs is necessary, because once a function has been passed to .animationComplete() it will be called
+			// next time an animation completes, even if that's not the animation whose end the function was supposed to catch
+			// (for example, if an abort happens during the opening animation, the .animationComplete handler is not called for
+			// that animation anymore, but the handler remains attached, so it is called the next time the popup is opened
+			// - making it stale. Comparing the local variable prereqs to the widget-level variable self._prereqs ensures that
+			// callbacks triggered by a stale .animationComplete will be ignored.
+
+			prereqs = {
+				screen: $.Deferred(),
+				container: $.Deferred()
+			};
+
+			prereqs.screen.then( function() {
+				if ( prereqs === self._prereqs ) {
+					screenPrereq();
+				}
+			});
+
+			prereqs.container.then( function() {
+				if ( prereqs === self._prereqs ) {
+					containerPrereq();
+				}
+			});
+
+			$.when( prereqs.screen, prereqs.container ).done( function() {
+				if ( prereqs === self._prereqs ) {
+					self._prereqs = null;
+					whenDone();
+				}
+			});
+
+			self._prereqs = prereqs;
+		},
+
+		_animate: function( args ) {
+			// NOTE before removing the default animation of the screen
+			//      this had an animate callback that would relove the deferred
+			//      now the deferred is resolved immediately
+			// TODO remove the dependency on the screen deferred
+			this._ui.screen
+				.removeClass( args.classToRemove )
+				.addClass( args.screenClassToAdd );
+
+			args.prereqs.screen.resolve();
+
+			if ( args.transition && args.transition !== "none" ) {
+				if ( args.applyTransition ) {
+					this._applyTransition( args.transition );
+				}
+				this._ui.container
+					.animationComplete( $.proxy( args.prereqs.container, "resolve" ) )
+					.addClass( args.containerClassToAdd )
+					.removeClass( args.classToRemove );
+			} else {
+				this._ui.container.removeClass( args.classToRemove );
+				args.prereqs.container.resolve();
+			}
+		},
+
+		// The desired coordinates passed in will be returned untouched if no reference element can be identified via
+		// desiredPosition.positionTo. Nevertheless, this function ensures that its return value always contains valid
+		// x and y coordinates by specifying the center middle of the window if the coordinates are absent.
+		_desiredCoords: function( x, y, positionTo ) {
+			var dst = null, offset, winCoords = windowCoords();
+
+			self.positionTo = positionTo;
+
+			// Establish which element will serve as the reference
+			if ( positionTo && positionTo !== "origin" ) {
+				if ( positionTo === "window" ) {
+					x = winCoords.cx / 2 + winCoords.x;
+					y = winCoords.cy / 2 + winCoords.y;
+				} else {
+					try {
+						dst = $( positionTo );
+					} catch( e ) {
+						dst = null;
+					}
+					if ( dst ) {
+						dst.filter( ":visible" );
+						if ( dst.length === 0 ) {
+							dst = null;
+						}
+					}
+				}
+			}
+
+			// If an element was found, center over it
+			if ( dst ) {
+				offset = dst.offset();
+				x = offset.left + dst.outerWidth() / 2;
+				y = offset.top + dst.outerHeight() / 2;
+			}
+
+			// Make sure x and y are valid numbers - center over the window
+			if ( $.type( x ) !== "number" || isNaN( x ) ) {
+				x = winCoords.cx / 2 + winCoords.x;
+			}
+			if ( $.type( y ) !== "number" || isNaN( y ) ) {
+				y = winCoords.cy / 2 + winCoords.y;
+			}
+
+			return { x: x, y: y };
+		},
+
+		_reposition: function() {
+			var self = this,
+					coords;
+
+			if( self._isOpen
+				&& self.link
+				&& self.positionTo !== "window") {
+					coords = self._placementCoords( self._desiredCoords( $(self.link).offset().left + $(self.link).outerWidth() /2 , $(self.link).offset().top + $(self.link).outerHeight() /2 , self.positionTo || self.options.positionTo || "origin" ) );
+					self._ui.container
+						.offset( { top : coords.top } );
+			}
+		},
+
+		_openPrereqsComplete: function() {
+			var self = this;
+
+			self._ui.container.addClass( "ui-popup-active" );
+			self._isOpen = true;
+			self._resizeScreen();
+
+			// Android appears to trigger the animation complete before the popup
+			// is visible. Allowing the stack to unwind before applying focus prevents
+			// the "blue flash" of element focus in android 4.0
+			setTimeout(function(){
+				self._ui.container.attr( "tabindex", "0" ).focus();
+				self._trigger( "afteropen" );
+				self._reposition();
+			});
+		},
+
+		_open: function( options ) {
+			var coords, transition,
+				androidBlacklist = ( function() {
+					var w = window,
+						ua = navigator.userAgent,
+						// Rendering engine is Webkit, and capture major version
+						wkmatch = ua.match( /AppleWebKit\/([0-9\.]+)/ ),
+						wkversion = !!wkmatch && wkmatch[ 1 ],
+						androidmatch = ua.match( /Android (\d+(?:\.\d+))/ ),
+						andversion = !!androidmatch && androidmatch[ 1 ],
+						chromematch = ua.indexOf( "Chrome" ) > -1;
+
+					// Platform is Android, WebKit version is greater than 534.13 ( Android 3.2.1 ) and not Chrome.
+					if( androidmatch !== null && andversion === "4.0" && wkversion && wkversion > 534.13 && !chromematch ) {
+						return true;
+					}
+					return false;
+				}());
+
+			// Make sure options is defined
+			options = ( options || {} );
+
+			// Copy out the transition, because we may be overwriting it later and we don't want to pass that change back to the caller
+			transition = options.transition || this.options.transition;
+
+			// Give applications a chance to modify the contents of the container before it appears
+			this._trigger( "beforeposition" );
+
+			coords = this._placementCoords( this._desiredCoords( options.x, options.y, options.positionTo || this.options.positionTo || "origin" ) );
+
+			// Count down to triggering "popupafteropen" - we have two prerequisites:
+			// 1. The popup window animation completes (container())
+			// 2. The screen opacity animation completes (screen())
+			this._createPrereqs(
+				$.noop,
+				$.noop,
+				$.proxy( this, "_openPrereqsComplete" ) );
+
+			if ( transition ) {
+				this._currentTransition = transition;
+				this._applyTransition( transition );
+			} else {
+				transition = this.options.transition;
+			}
+
+			if ( !this.options.theme ) {
+				this._setTheme( this._page.jqmData( "theme" ) || $.mobile.getInheritedTheme( this._page, "c" ) );
+			}
+
+			this._ui.screen.removeClass( "ui-screen-hidden" );
+
+			this._ui.container
+				.removeClass( "ui-selectmenu-hidden" )
+				.offset( coords );
+			this._ui.arrow.css( { top : coords.arrowtop, left : coords.arrowleft } );
+			if ( this.options.overlayTheme && androidBlacklist ) {
+				/* TODO:
+				The native browser on Android 4.0.X ("Ice Cream Sandwich") suffers from an issue where the popup overlay appears to be z-indexed
+				above the popup itself when certain other styles exist on the same page -- namely, any element set to `position: fixed` and certain
+				types of input. These issues are reminiscent of previously uncovered bugs in older versions of Android's native browser:
+				https://github.com/scottjehl/Device-Bugs/issues/3
+
+				This fix closes the following bugs ( I use "closes" with reluctance, and stress that this issue should be revisited as soon as possible ):
+
+				https://github.com/jquery/jquery-mobile/issues/4816
+				https://github.com/jquery/jquery-mobile/issues/4844
+				https://github.com/jquery/jquery-mobile/issues/4874
+				*/
+
+				// TODO sort out why this._page isn't working
+				this.element.closest( ".ui-page" ).addClass( "ui-popup-open" );
+			}
+			this._animate({
+				additionalCondition: true,
+				transition: transition,
+				classToRemove: "",
+				screenClassToAdd: "in",
+				containerClassToAdd: "in",
+				applyTransition: false,
+				prereqs: this._prereqs
+			});
+		},
+
+		_closePrereqScreen: function() {
+			this._ui.screen
+				.removeClass( "out" )
+				.addClass( "ui-screen-hidden" );
+		},
+
+		_closePrereqContainer: function() {
+			this._ui.container
+				.removeClass( "reverse out" )
+				.addClass( "ui-selectmenu-hidden" )
+				.removeAttr( "style" );
+		},
+
+		_closePrereqsDone: function() {
+			var self = this, opts = self.options;
+
+			self._ui.container.removeAttr( "tabindex" );
+
+			// remove nav bindings if they are still present
+			opts.container.unbind( opts.closeEvents );
+
+			// unbind click handlers added when history is disabled
+			self.element.undelegate( opts.closeLinkSelector, opts.closeLinkEvents );
+
+			// remove the global mutex for popups
+			$.mobile.popup.active = undefined;
+
+			// alert users that the popup is closed
+			self._trigger( "afterclose" );
+		},
+
+		_close: function( immediate ) {
+			this._ui.container.removeClass( "ui-popup-active" );
+			this._page.removeClass( "ui-popup-open" );
+
+			this._isOpen = false;
+
+			// IME hide when popup is closed
+			this.element.find("input").blur();
+
+			// Count down to triggering "popupafterclose" - we have two prerequisites:
+			// 1. The popup window reverse animation completes (container())
+			// 2. The screen opacity animation completes (screen())
+			this._createPrereqs(
+				$.proxy( this, "_closePrereqScreen" ),
+				$.proxy( this, "_closePrereqContainer" ),
+				$.proxy( this, "_closePrereqsDone" ) );
+
+			this._animate( {
+				additionalCondition: this._ui.screen.hasClass( "in" ),
+				transition: ( immediate ? "none" : ( this._currentTransition || this.options.transition ) ),
+				classToRemove: "in",
+				screenClassToAdd: "out",
+				containerClassToAdd: "reverse out",
+				applyTransition: true,
+				prereqs: this._prereqs
+			});
+		},
+
+		_destroy: function() {
+			var self = this;
+
+			// hide and remove bindings
+			self._close();
+
+			// Put the element back to where the placeholder was and remove the "ui-popup" class
+			self._setTheme( "none" );
+			self.element
+				.insertAfter( self._ui.placeholder )
+				.removeClass( "ui-popup ui-overlay-shadow ui-corner-all" );
+			self._ui.screen.remove();
+			self._ui.container.remove();
+			self._ui.placeholder.remove();
+
+			// Unbind handlers that were bound to elements outside self.element (the window, in self case)
+			// window history back is call "_destroy method"
+			// if this method is called, all kind of window resize event has been unbind
+			/*
+			$.each( self._globalHandlers, function( idx, oneSrc ) {
+				$.each( oneSrc.handler, function( eventType, handler ) {
+					oneSrc.src.unbind( eventType, handler );
+				});
+			});
+			*/
+		},
+
+		_closePopup: function( e, data ) {
+			var parsedDst, toUrl;
+
+			if ( e.type === "pagebeforechange" && data ) {
+				if ( typeof data.toPage === "string" ) {
+					parsedDst = data.toPage;
+				} else {
+				parsedDst = data.toPage.jqmData( "url" );
+				}
+				parsedDst = $.mobile.path.parseUrl( parsedDst );
+				toUrl = parsedDst.pathname + parsedDst.search + parsedDst.hash;
+
+				if ( this._myUrl !== toUrl ) {
+					this.options.container.unbind( this.options.closeEvents );
+					this._close( true );
+				} else {
+					this._close();
+				}
+				return;	// skip normal close
+			}
+
+			this._close();
+		},
+
+		// any navigation event after a popup is opened should close the popup
+		// NOTE the pagebeforechange is bound to catch navigation events that don't
+		//      alter the url (eg, dialogs from popups)
+		_bindContainerClose: function() {
+			var self = this;
+
+			self.options.container
+				.one( self.options.closeEvents, $.proxy( self, "_closePopup" ) );
+		},
+
+		// TODO no clear deliniation of what should be here and
+		// what should be in _open. Seems to be "visual" vs "history" for now
+		open: function( options ) {
+			var self = this, opts = this.options, url, hashkey, activePage, currentIsDialog, hasHash, urlHistory;
+			// self.link = ( $(event.target).attr('data-role') === 'button') ? event.target : $(event.target).closest('[data-role="button"]')[0];
+			// make sure open is idempotent
+			if( $.mobile.popup.active ) {
+				return;
+			}
+			// set the global popup mutex
+			$.mobile.popup.active = this;
+			if( !options ) {
+				options = [];
+			}
+
+			if ( !options.link ) {
+				if ( !event ) {
+					self.positionTo = "window";
+				} else {
+					self.link = ( $(event.target).closest('a')[0] || $(event.target).closest('div')[0] );
+				}
+			} else {
+				self.link = options.link;
+			}
+			if ( event ) {
+				self.positionTo = ( options != null && options.positionTo != null ) ? options.positionTo : "origin";
+			}
+
+			if ( $(self.link).jqmData("position-to") !== "window"
+					&& self.positionTo !== "window" ) {
+
+				$(self.element).addClass("ui-ctxpopup");
+				$(self._ui.container).removeClass("ui-popup-container")
+					.addClass("ui-ctxpopup-container");
+
+				if( self.positionTo !== "origin" ) {
+					$(self._ui.arrow).hide();
+				} else {
+					$(self._ui.arrow).show();
+				}
+			} else {
+				$(self._ui.arrow).hide();
+				// apply opacity back screen
+				this._setOverlayTheme( "dim" );
+			}
+			if( !options.x
+				&& self.positionTo === "origin"
+				&& self.link ) {
+				options.x = $(self.link).offset().left + $(self.link).outerWidth() / 2;
+			}
+			if( !options.y
+				&& self.positionTo === "origin" 
+				&& self.link ) {
+				options.y = $(self.link).offset().top + $(self.link).outerHeight() / 2;
+			}
+
+			// Hadeware key style popup
+			if( $(self.element).hasClass( "ui-ctxpopup-optionmenu" ) ){
+				self.options.isHardwarePopup = true;
+				$( self._ui.arrow).hide();
+			}
+
+			// if history alteration is disabled close on navigate events
+			// and leave the url as is
+			if( !( opts.history ) ) {
+				self._open( options );
+				self._bindContainerClose();
+
+				// When histoy is disabled we have to grab the data-rel
+				// back link clicks so we can close the popup instead of
+				// relying on history to do it for us
+				self.element
+					.delegate( opts.closeLinkSelector, opts.closeLinkEvents, function( e ) {
+						self._close();
+
+						// NOTE prevent the browser and navigation handlers from
+						// working with the link's rel=back. This may cause
+						// issues for developers expecting the event to bubble
+						return false;
+					});
+
+				return;
+			}
+
+			// cache some values for min/readability
+			hashkey = $.mobile.dialogHashKey;
+			activePage = $.mobile.activePage;
+			currentIsDialog = activePage.is( ".ui-dialog" );
+			// Set active page url
+			this._myUrl = url = urlHistory.getActive().url;
+			//
+			url = $.mobile.urlHistory.getActive().url;
+			hasHash = ( url.indexOf( hashkey ) > -1 ) && !currentIsDialog;
+			urlHistory = $.mobile.urlHistory;
+
+			if ( hasHash ) {
+				self._open( options );
+				self._bindContainerClose();
+				return;
+			}
+
+			// if the current url has no dialog hash key proceed as normal
+			// otherwise, if the page is a dialog simply tack on the hash key
+			if ( url.indexOf( hashkey ) === -1 && !currentIsDialog ){
+				url = url + hashkey;
+			} else {
+				url = $.mobile.path.parseLocation().hash + hashkey;
+			}
+
+			// Tack on an extra hashkey if this is the first page and we've just reconstructed the initial hash
+			if ( urlHistory.activeIndex === 0 && url === urlHistory.initialDst ) {
+				url += hashkey;
+			}
+
+			// swallow the the initial navigation event, and bind for the next
+			opts.container.one( opts.navigateEvents, function( e ) {
+				e.preventDefault();
+				self._open( options );
+				self._bindContainerClose();
+			});
+
+			urlHistory.ignoreNextHashChange = currentIsDialog;
+
+			// Gotta love methods with 1mm args :(
+			urlHistory.addNew( url, undefined, undefined, undefined, "dialog" );
+
+			// set the new url with (or without) the new dialog hash key
+			$.mobile.path.set( url );
+		},
+
+		close: function() {
+			// make sure close is idempotent
+			if( !$.mobile.popup.active ){
+				return;
+			}
+
+			if( this.options.history ) {
+				$.mobile.back();
+			} else {
+				this._close();
+			}
+		}
+	});
+
+
+	// TODO this can be moved inside the widget
+	$.mobile.popup.handleLink = function( $link ) {
+		var closestPage = $link.closest( ":jqmData(role='page')" ),
+			scope = ( ( closestPage.length === 0 ) ? $( "body" ) : closestPage ),
+			// NOTE make sure to get only the hash, ie7 (wp7) return the absolute href
+			//      in this case ruining the element selection
+			popup = $( $.mobile.path.parseUrl($link.attr( "href" )).hash, scope[0] ),
+			offset;
+
+		if ( popup.data( "popup" ) ) {
+			offset = $link.offset();
+			popup.popup( "open", {
+				x: offset.left + $link.outerWidth() / 2,
+				y: offset.top + $link.outerHeight() / 2,
+				transition: $.mobile.getAttrFixed( $link[0], "data-" + $.mobile.ns + "transition" ),
+				positionTo: $.mobile.getAttrFixed( $link[0], "data-" + $.mobile.ns + "position-to" ),
+				link: $link
+			});
+		}
+
+		//remove after delay
+		setTimeout( function() {
+			$link.removeClass( $.mobile.activeBtnClass );
+		}, 300 );
+	};
+
+	// TODO move inside _create
+	$.mobile.$document.bind( "pagebeforechange", function( e, data ) {
+		if ( data.options.role === "popup" ) {
+			$.mobile.popup.handleLink( data.options.link );
+			e.preventDefault();
+		}
+	});
+
+	//delegate self-init widgets
+	$.delegateSelfInitWithSingleSelector( $.mobile.popup, true );
+
+})( jQuery );
+
+(function( $ ) {
+	var	meta = $( "meta[name=viewport]" ),
+		initialContent = meta.attr( "content" ),
+		disabledZoom = initialContent + ",maximum-scale=1, user-scalable=no",
+		enabledZoom = initialContent + ",maximum-scale=10, user-scalable=yes",
+		disabledInitially = /(user-scalable[\s]*=[\s]*no)|(maximum-scale[\s]*=[\s]*1)[$,\s]/.test( initialContent );
+
+	$.mobile.zoom = $.extend( {}, {
+		enabled: !disabledInitially,
+		locked: false,
+		disable: function( lock ) {
+			if ( !disabledInitially && !$.mobile.zoom.locked ) {
+				meta.attr( "content", disabledZoom );
+				$.mobile.zoom.enabled = false;
+				$.mobile.zoom.locked = lock || false;
+			}
+		},
+		enable: function( unlock ) {
+			if ( !disabledInitially && ( !$.mobile.zoom.locked || unlock === true ) ) {
+				meta.attr( "content", enabledZoom );
+				$.mobile.zoom.enabled = true;
+				$.mobile.zoom.locked = false;
+			}
+		},
+		restore: function() {
+			if ( !disabledInitially ) {
+				meta.attr( "content", initialContent );
+				$.mobile.zoom.enabled = true;
+			}
+		}
+	});
+
+}( jQuery ));
+
+(function( $, undefined ) {
+
+$.widget( "mobile.textinput", $.mobile.widget, {
+	options: {
+		theme: null,
+		// This option defaults to true on iOS devices.
+		preventFocusZoom: /iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( "AppleWebKit" ) > -1,
+		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])",
+		disabled: false
+	},
+
+	_create: function() {
+
+		var self = this,
+			input = this.element,
+			o = this.options,
+			theme = o.theme || $.mobile.getInheritedTheme( this.element, "c" ),
+			themeclass  = " ui-body-" + theme,
+			mini = $.mobile.getAttrFixed( input[0], "data-" + $.mobile.ns + "mini" ) === true,
+			miniclass = mini ? " ui-mini" : "",
+			focusedEl, clearbtn;
+
+		function toggleClear() {
+			setTimeout( function() {
+				clearbtn.toggleClass( "ui-input-clear-hidden", !input.val() );
+			}, 0 );
+		}
+
+		$( "label[for='" + input.attr( "id" ) + "']" ).addClass( "ui-input-text" );
+
+		focusedEl = input.addClass("ui-input-text ui-body-"+ theme );
+
+		switch ( input.attr( "type" ) ) {
+			case "text":
+			case "password":
+			case "number":
+			case "email":
+			case "url":
+			case "tel":
+				input.attr( { "role" : "textbox", "aria-label" : "Keyboard opened" } );
+				break;
+			default:
+				if ( input.prop( "tagName" ).toLowerCase() === "textarea" ) {
+					input.attr( { "role" : "textbox", "aria-label" : "Keyboard opened" } );
+				}
+		}
+
+		// 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.focus(function() {
+				focusedEl.addClass( $.mobile.focusClass );
+			})
+			.blur(function() {
+				focusedEl.removeClass( $.mobile.focusClass );
+			})
+			// In many situations, iOS will zoom into the select upon tap, this prevents that from happening
+			.bind( "focus", function() {
+				if ( o.preventFocusZoom ) {
+					$.mobile.zoom.disable( true );
+				}
+			})
+			.bind( "blur", function() {
+				if ( o.preventFocusZoom ) {
+					$.mobile.zoom.enable( true );
+				}
+			});
+
+		// Autogrow
+		if ( input.is( "textarea" ) ) {
+			var extraLineHeight = 15,
+				keyupTimeoutBuffer = 100,
+				keyupTimeout;
+
+			this._keyup = function() {
+				var scrollHeight = input[ 0 ].scrollHeight,
+					clientHeight = input[ 0 ].clientHeight;
+
+				if ( clientHeight < scrollHeight && window.innerHeight / 2 > scrollHeight ) {
+					input.height(scrollHeight + extraLineHeight);
+				}
+			};
+
+			input.keyup(function() {
+				clearTimeout( keyupTimeout );
+				keyupTimeout = setTimeout( self._keyup, keyupTimeoutBuffer );
+			});
+
+			// binding to pagechange here ensures that for pages loaded via
+			// ajax the height is recalculated without user input
+			this._on( $.mobile.$document, {"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
+				this._on( $.mobile.$window, {"load": "_keyup"});
+			}
+		}
+		if ( input.attr( "disabled" ) ) {
+			this.disable();
+		}
+	},
+
+	disable: function() {
+		var $el;
+		if ( this.element.attr( "disabled", true ) ) {
+			$el = this.element;
+		} else {
+			return;
+		}
+		$el.addClass( "ui-disabled" );
+		return this._setOption( "disabled", true );
+	},
+
+	enable: function() {
+		var $el;
+
+		// TODO using more than one line of code is acceptable ;)
+		if ( this.element.attr( "disabled", false ) ) {
+			$el = this.element;
+		} else {
+			return;
+		}
+		$el.removeClass( "ui-disabled" );
+		return this._setOption( "disabled", false );
+	}
+});
+
+//auto self-init widgets
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$.mobile.textinput.prototype.enhanceWithin( e.target, true );
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.mobile.listview.prototype.options.filter = false;
+$.mobile.listview.prototype.options.filterPlaceholder = "";
+$.mobile.listview.prototype.options.filterTheme = "c";
+// TODO rename callback/deprecate and default to the item itself as the first argument
+var defaultFilterCallback = function( text, searchValue, item ) {
+		return text.toString().toLowerCase().indexOf( searchValue ) === -1;
+	};
+
+$.mobile.listview.prototype.options.filterCallback = defaultFilterCallback;
+
+$.mobile.$document.delegate( ":jqmData(role='listview')", "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,
+				// Check if a custom filter callback applies
+				isCustomFilterCallback = listview.options.filterCallback !== defaultFilterCallback;
+
+			listview._trigger( "beforefilter", "beforefilter", { input: this } );
+
+			// Change val as lastval for next execution
+			$this.jqmData( "lastval" , val );
+			if ( isCustomFilterCallback || val.length < lastval.length || val.indexOf( lastval ) !== 0 ) {
+
+				// Custom filter callback applies or 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 =  $.mobile.getAttrFixed( item[0], "data-" + $.mobile.ns + "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, item ) ) {
+
+						//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 ( listview.options.inset ) {
+		wrapper.addClass( "ui-listview-filter-inset" );
+	}
+
+	wrapper.bind( "submit", function() {
+		return false;
+	})
+	.insertBefore( list );
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.widget( "mobile.slider", $.mobile.widget, {
+	widgetEventPrefix: "slide",
+
+	options: {
+		theme: null,
+		trackTheme: null,
+		disabled: false,
+		initSelector: "input[type='range'], :jqmData(type='range'), :jqmData(role='slider')",
+		mini: false
+	},
+
+	_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" ),
+
+			$label = $( "[for='" + controlID + "']" ),
+
+			labelID = $label.attr( "id" ) || controlID + "-label",
+
+			label = $label.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 ),
+
+			inlineClass = ( this.options.inline || $.mobile.getAttrFixed( control[0], "data-" + $.mobile.ns + "inline" ) === true ) ? " ui-slider-inline" : "",
+
+			miniClass = ( this.options.mini || $.mobile.getAttrFixed( control[0], "data-" + $.mobile.ns + "min" ) ) ? " ui-slider-mini" : "",
+
+
+			domHandle = document.createElement( 'a' ),
+			handle = $( domHandle ),
+			domSlider = document.createElement( 'div' ),
+			slider = $( domSlider ),
+
+			valuebg = $.mobile.getAttrFixed( control[0], "data-" + $.mobile.ns + "highlight" ) !== false && cType !== "select" ? (function() {
+				var bg = document.createElement('div');
+				bg.className = 'ui-slider-bg ' + $.mobile.activeBtnClass + ' ui-btn-corner-all';
+				return $( bg ).prependTo( slider );
+			})() : false,
+
+			options;
+
+		this._type = cType;
+
+		domHandle.setAttribute( 'href', "#" );
+		domSlider.setAttribute('role','application');
+		domSlider.className = ['ui-slider ',selectClass," ui-btn-down-",trackTheme,' ui-btn-corner-all', inlineClass, miniClass].join( "" );
+		domHandle.className = 'ui-slider-handle';
+		domSlider.appendChild( domHandle );
+		if ( $( control ).find( "option" ).length && $( control ).find( "option" ).text() === "" ) {
+			$( domSlider ).addClass( "ui-toggle-switch" );
+		}
+		if( val() === "1" ) {
+			$( domHandle ).addClass( "ui-toggle-on" );
+		} else {
+			$( domHandle ).addClass( "ui-toggle-off" );
+		}
+		handle.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
+				});
+
+		$.extend( this, {
+			slider: slider,
+			handle: handle,
+			valuebg: valuebg,
+			dragging: false,
+			beforeStart: null,
+			userModified: false,
+			mouseMoved: false
+		});
+
+		if ( cType === "select" ) {
+			var wrapper = document.createElement('div');
+			wrapper.className = 'ui-slider-inneroffset';
+
+			for ( var j = 0,length = domSlider.childNodes.length;j < length;j++ ) {
+				wrapper.appendChild( domSlider.childNodes[j] );
+			}
+
+			domSlider.appendChild( wrapper );
+
+			// 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" );
+
+			for ( var i = 0, optionsCount = options.length; i < optionsCount; i++ ) {
+				var side = !i ? "b" : "a",
+					sliderTheme = !i ? " ui-btn-down-" + trackTheme : ( " " + $.mobile.activeBtnClass ),
+					sliderLabel = document.createElement( 'div' ),
+					sliderImg = document.createElement( 'span' );
+
+				sliderImg.className = ['ui-slider-label ui-slider-label-',side,sliderTheme," ui-btn-corner-all"].join( "" );
+				sliderImg.setAttribute('role','img');
+				sliderImg.appendChild( document.createTextNode( options[i].innerHTML ) );
+				$( sliderImg ).html() ? $( sliderImg ).html( $( sliderImg ).text() ) : $( sliderImg ).html();
+				$(sliderImg).prependTo( slider );
+			}
+
+			self._labels = $( ".ui-slider-label", slider );
+
+		}
+
+		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 );
+			});
+
+		this._preventDocumentDrag = function( event ) {
+			// NOTE: we don't do this in refresh because we still want to
+			//       support programmatic alteration of disabled inputs
+			var et = $(event.target);
+			if ( self.dragging && !self.options.disabled && ( ( et.parents( ".ui-slider" ).is( ".ui-toggle-switch" ) && et.parents( ".ui-slider-handle" ).is( ".ui-btn-hover-s" ) ) || ( !$( self.element ).siblings( ".ui-slider" ).is( ".ui-toggle-switch"))) ) {
+
+				// 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;
+			}
+		}
+
+		this._on( $.mobile.$document, { "vmousemove": this._preventDocumentDrag });
+
+		// it appears the clicking the up and down buttons in chrome on
+		// range/number inputs doesn't trigger a change until the field is
+		// blurred. Here we check thif the value has changed and refresh
+		control.bind( "vmouseup", $.proxy( self._checkedRefresh, self));
+
+		slider.bind( "vmousedown", function( event ) {
+			// NOTE: we don't do this in refresh because we still want to
+			//       support programmatic alteration of disabled inputs
+			if ( self.options.disabled ) {
+				return false;
+			}
+
+			self.dragging = true;
+			self.userModified = false;
+			self.mouseMoved = false;
+
+			if ( cType === "select" ) {
+				self.beforeStart = control[0].selectedIndex;
+			}
+
+			self.refresh( event );
+			self._trigger( "start" );
+			return false;
+		})
+		.bind( "vclick", false );
+
+		this._sliderMouseUp = 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;
+				self._trigger( "stop" );
+				return false;
+			}
+		};
+
+		this._on( slider.add( document ), { "vmouseup": this._sliderMouseUp });
+		slider.insertAfter( control );
+
+		// Only add focus class to toggle switch, sliders get it automatically from ui-btn
+		if ( cType === 'select' ) {
+			this.handle.bind({
+				focus: function() {
+					slider.addClass( $.mobile.focusClass );
+				},
+
+				blur: function() {
+					slider.removeClass( $.mobile.focusClass );
+				}
+			});
+		}
+
+		this.handle.bind({
+			// NOTE force focus on handle
+			vmousedown: function() {
+				$( this ).focus();
+			},
+
+			vclick: false,
+
+			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 );
+	},
+
+	_checkedRefresh: function() {
+		if( this.value != this._value() ){
+			this.refresh( this._value() );
+		}
+	},
+
+	_value: function() {
+		return  this._type === "input" ?
+			parseFloat( this.element.val() ) : this.element[0].selectedIndex;
+	},
+
+	refresh: function( val, isfromControl, preventInputUpdate ) {
+
+		// NOTE: we don't return here because we want to support programmatic
+		//       alteration of the input value, which should still update the slider
+		if ( this.options.disabled || this.element.attr('disabled')) {
+			this.disable();
+		}
+
+		// set the stored value for comparison later
+		this.value = this._value();
+
+		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,
+			step = ( cType === "input" && parseFloat( control.attr( "step" ) ) > 0 ) ? parseFloat( control.attr( "step" ) ) : 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() || 0 ) : 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 = ( percent / 100 ) * ( max - min ) + min;
+
+		//from jQuery UI slider, the following source will round to the nearest step
+		var valModStep = ( newval - min ) % step;
+		var alignValue = newval - valModStep;
+
+		if ( Math.abs( valModStep ) * 2 >= step ) {
+			alignValue += ( valModStep > 0 ) ? step : ( -step );
+		}
+		// Since JavaScript has problems with large floats, round
+		// the final value to 5 digits after the decimal point (see jQueryUI: #4124)
+		newval = parseFloat( alignValue.toFixed(5) );
+
+		if ( newval < min ) {
+			newval = min;
+		}
+
+		if ( newval > max ) {
+			newval = max;
+		}
+
+		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: cType === "input" ? newval : control.find( "option" ).eq( newval ).getEncodedText()
+			});
+
+		if( percent === 100 && this.handle.hasClass( "ui-slider-handle-snapping" ) ) {
+			this.handle.removeClass( "ui-toggle-off" );
+			this.handle.addClass( "ui-toggle-on" );
+		} else if ( percent === 0 && this.handle.hasClass( "ui-slider-handle-snapping" ) ) {
+			this.handle.removeClass( "ui-toggle-on" );
+			this.handle.addClass( "ui-toggle-off" );
+		}
+
+		if ( this.valuebg ) {
+			this.valuebg.css( "width", percent + "%" );
+		}
+
+		// drag the label widths
+		if ( this._labels ) {
+			var handlePercent = this.handle.width() / this.slider.width() * 100,
+				aPercent = percent && handlePercent + ( 100 - handlePercent ) * percent / 100,
+				bPercent = percent === 100 ? 0 : Math.min( handlePercent + 100 - aPercent, 100 );
+
+			this._labels.each(function() {
+				var ab = $( this ).is( ".ui-slider-label-a" );
+				$( this ).width( ( ab ? aPercent : bPercent  ) + "%" );
+			});
+		}
+
+		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
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$.mobile.slider.prototype.enhanceWithin( e.target, true );
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.widget( "mobile.selectmenu", $.mobile.widget, {
+	options: {
+		theme: null,
+		disabled: false,
+		icon: "arrow-d",
+		iconpos: "right",
+		inline: false,
+		corners: true,
+		shadow: true,
+		iconshadow: true,
+		overlayTheme: "a",
+		hidePlaceholderMenuItems: true,
+		closeText: "Close",
+		nativeMenu: true,
+		// This option defaults to true on iOS devices.
+		preventFocusZoom: /iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( "AppleWebKit" ) > -1,
+		initSelector: "select:not( :jqmData(role='slider') )",
+		mini: false
+	},
+
+	_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() {
+		var classes = "";
+		// TODO: Post 1.1--once we have time to test thoroughly--any classes manually applied to the original element should be carried over to the enhanced element, with an `-enhanced` suffix. See https://github.com/jquery/jquery-mobile/issues/3577
+		/* if ( $el[0].className.length ) {
+			classes = $el[0].className;
+		} */
+		if ( !!~this.element[0].className.indexOf( "ui-btn-left" ) ) {
+			classes =  " ui-btn-left";
+		}
+
+		if (  !!~this.element[0].className.indexOf( "ui-btn-right" ) ) {
+			classes = " ui-btn-right";
+		}
+
+		this.select = this.element.wrap( "<div class='ui-select" + classes + "'>" );
+		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,
+
+			inline = options.inline ||  $.mobile.getAttrFixed( this.select[0], "data-" + $.mobile.ns + "inline" ),
+			mini = options.mini || $.mobile.getAttrFixed( this.select[0], "data-" + $.mobile.ns + "mini" ),
+			iconpos = options.icon ? ( options.iconpos || $.mobile.getAttrFixed( this.select[0], "data-" + $.mobile.ns + "iconpos" ) ) : false,
+
+			// 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
+				.insertBefore( this.select )
+				.buttonMarkup( {
+					theme: options.theme,
+					icon: options.icon,
+					iconpos: iconpos,
+					inline: inline,
+					corners: options.corners,
+					shadow: options.shadow,
+					iconshadow: options.iconshadow,
+					mini: mini
+				});
+
+		this.setButtonText();
+
+		// TIZEN fix: The TIZEN buttonMarkup patch adds 'ui-btn-icon-only' class to the ui-btn-inner.
+		// It makes the text not to be shown, so the class must be removed. (Like JQM)
+		button.children('.ui-btn-inner').removeClass('ui-btn-icon-only');
+
+		// 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 ) {
+			button.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", function() {
+				self.button.addClass( $.mobile.focusClass );
+			})
+			.bind( "blur", function() {
+				self.button.removeClass( $.mobile.focusClass );
+			})
+			.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 );
+			});
+
+		// In many situations, iOS will zoom into the select upon tap, this prevents that from happening
+		self.button.bind( "vmousedown", function() {
+			if ( self.options.preventFocusZoom ) {
+				$.mobile.zoom.disable( true );
+			}
+		}).bind( "mouseup", function() {
+			if ( self.options.preventFocusZoom ) {
+				setTimeout(function() {
+					$.mobile.zoom.enable( true );
+				}, 0);
+			}
+		});
+	},
+
+	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(),
+			text = this.placeholder,
+			span = $( document.createElement( "span" ) );
+
+		this.button.find( ".ui-btn-text" ).html(function() {
+			if ( selected.length ) {
+				text = selected.map(function() {
+					return $( this ).text();
+				}).get().join( ", " );
+			} else {
+				text = self.placeholder;
+			}
+
+			// TODO possibly aggregate multiple select option classes
+			return span.text( text )
+				.addClass( self.select.attr( "class" ) )
+				.addClass( selected.attr( "class" ) );
+		});
+	},
+
+	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
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$.mobile.selectmenu.prototype.enhanceWithin( e.target, true );
+});
+})( 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" ),
+			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>" ),
+
+			listbox =  $( "<div>", { "class": "ui-selectmenu" } ).insertAfter( widget.select ).popup( { theme: "a" } ),
+
+			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 ),
+
+			menuPageContent,
+			menuPageClose,
+			headerClose;
+
+		if ( widget.isMultiple ) {
+			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();
+		}
+
+		$.extend( widget, {
+			select: widget.select,
+			selectID: selectID,
+			buttonId: buttonId,
+			menuId: menuId,
+			thisPage: thisPage,
+			menuPage: menuPage,
+			label: label,
+			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" )
+					.bind( "focusin", function( e ) {
+						$( e.target )
+							.attr( "tabindex", "0" )
+							.trigger( "vmouseover" );
+
+					})
+					.bind( "focusout", function( e ) {
+						$( e.target )
+							.attr( "tabindex", "-1" )
+							.trigger( "vmouseout" );
+					})
+					.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 - otherwise focus clicked item
+						// We need to grab the clicked item the hard way, because the list may have been rebuilt
+						if ( self.isMultiple ) {
+							self.list.find( "li:not(.ui-li-divider)" ).eq( newIndex )
+								.addClass( "ui-btn-down-" + widget.options.theme ).find( "a" ).first().focus();
+						}
+						else {
+							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().not( ".ui-selectmenu-placeholder" );
+
+							if ( prev.is( ".ui-li-divider" ) ) {
+								prev = prev.prev();
+							}
+
+							// if there's a previous option, focus it
+							if ( prev.length ) {
+								target
+									.blur()
+									.attr( "tabindex", "-1" );
+
+								prev.addClass( "ui-btn-down-" + widget.options.theme ).find( "a" ).first().focus();
+							}
+
+							return false;
+							// down or right arrow keys
+						case 40:
+							next = li.next();
+
+							if ( next.is( ".ui-li-divider" ) ) {
+								next = next.next();
+							}
+
+							// if there's a next option, focus it
+							if ( next.length ) {
+								target
+									.blur()
+									.attr( "tabindex", "-1" );
+
+								next.addClass( "ui-btn-down-" + widget.options.theme ).find( "a" ).first().focus();
+							}
+
+							return false;
+							// If enter or space is pressed, trigger click
+						case 13:
+						case 32:
+							target.trigger( "click" );
+
+							return false;
+						}
+					});
+
+				// 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 the popup
+				self.listbox.bind( "popupafterclose", function( event ) {
+					self.close();
+				});
+
+				// Close button on small overlays
+				if ( self.isMultiple ) {
+					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();
+			},
+
+			selected: function() {
+				return this._selectOptions().filter( ":selected:not( :jqmData(placeholder='true') )" );
+			},
+
+			refresh: function( forceRebuild , foo ) {
+				var self = this,
+				select = this.element,
+				isMultiple = this.isMultiple,
+				indicies;
+
+				if (  forceRebuild || this._isRebuildRequired() ) {
+					self._buildList();
+				}
+
+				indicies = this.selectedIndices();
+
+				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 {
+								if ( item.is( ".ui-selectmenu-placeholder" ) ) {
+									item.next().addClass( $.mobile.activeBtnClass );
+								} 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
+					$.mobile.back();
+				} else {
+					self.listbox.popup( "close" );
+					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,
+					$window = $.mobile.$window,
+					selfListParent = self.list.parent(),
+					menuHeight = selfListParent.outerHeight(),
+					menuWidth = selfListParent.outerWidth(),
+					activePage = $( "." + $.mobile.activePageClass ),
+					scrollTop = $window.scrollTop(),
+					btnOffset = self.button.offset().top,
+					screenHeight = $window.height(),
+					screenWidth = $window.width();
+
+				//add active class to button
+				self.button.addClass( $.mobile.activeBtnClass );
+
+				//remove after delay
+				setTimeout( function() {
+					self.button.removeClass( $.mobile.activeBtnClass );
+				}, 300);
+
+				function focusMenuItem() {
+					var selector = self.list.find( "." + $.mobile.activeBtnClass + " a" );
+					if ( selector.length === 0 ) {
+						selector = self.list.find( "li.ui-btn:not( :jqmData(placeholder='true') ) a" );
+					}
+					selector.first().focus().closest( "li" ).addClass( "ui-btn-down-" + widget.options.theme );
+				}
+
+				if ( menuHeight > screenHeight - 80 || !$.support.scrollTop ) {
+
+					self.menuPage.appendTo( $.mobile.pageContainer ).page();
+					self.menuPageContent = menuPage.find( ".ui-content" );
+					self.menuPageClose = menuPage.find( ".ui-header a" );
+
+					// 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() {
+						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.listbox
+						.one( "popupafteropen", focusMenuItem )
+						.popup( "open", {
+							x: self.button.offset().left + self.button.outerWidth() / 2,
+							y: self.button.offset().top + self.button.outerHeight() / 2
+						});
+
+					// 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,
+					needPlaceholder = true,
+					optgroups = [],
+					lis = [],
+					dataIcon = self.isMultiple ? "checkbox-off" : "false";
+
+				self.list.empty().filter( ".ui-listview" ).listview( "destroy" );
+
+				var $options = self.select.find( "option" ),
+					numOptions = $options.length,
+					select = this.select[ 0 ],
+					dataPrefix = 'data-' + $.mobile.ns,
+					dataIndexAttr = dataPrefix + 'option-index',
+					dataIconAttr = dataPrefix + 'icon',
+					dataRoleAttr = dataPrefix + 'role',
+					dataPlaceholderAttr = dataPrefix + 'placeholder',
+					fragment = document.createDocumentFragment(),
+					isPlaceholderItem = false,
+					optGroup;
+
+				for (var i = 0; i < numOptions;i++, isPlaceholderItem = false) {
+					var option = $options[i],
+						$option = $( option ),
+						parent = option.parentNode,
+						text = $option.text(),
+						anchor  = document.createElement( 'a' ),
+						classes = [];
+
+					anchor.setAttribute( 'href', '#' );
+					anchor.appendChild( document.createTextNode( text ) );
+
+					// Are we inside an optgroup?
+					if ( parent !== select && parent.nodeName.toLowerCase() === "optgroup" ) {
+						var optLabel = parent.getAttribute( 'label' );
+						if ( optLabel !== optGroup ) {
+							var divider = document.createElement( 'li' );
+							divider.setAttribute( dataRoleAttr, 'list-divider' );
+							divider.setAttribute( 'role', 'option' );
+							divider.setAttribute( 'tabindex', '-1' );
+							divider.appendChild( document.createTextNode( optLabel ) );
+							fragment.appendChild( divider );
+							optGroup = optLabel;
+						}
+					}
+
+					if ( needPlaceholder && ( !option.getAttribute( "value" ) || text.length === 0 || $option.jqmData( "placeholder" ) ) ) {
+						needPlaceholder = false;
+						isPlaceholderItem = true;
+
+						// If we have identified a placeholder, mark it retroactively in the select as well
+						option.setAttribute( dataPlaceholderAttr, true );
+						if ( o.hidePlaceholderMenuItems ) {
+							classes.push( "ui-selectmenu-placeholder" );
+						}
+						if (!placeholder) {
+							placeholder = self.placeholder = text;
+						}
+					}
+
+					var item = document.createElement('li');
+					if ( option.disabled ) {
+						classes.push( "ui-disabled" );
+						item.setAttribute('aria-disabled',true);
+					}
+					item.setAttribute( dataIndexAttr,i );
+					item.setAttribute( dataIconAttr, dataIcon );
+					if ( isPlaceholderItem ) {
+						item.setAttribute( dataPlaceholderAttr, true );
+					}
+					item.className = classes.join( " " );
+					item.setAttribute( 'role', 'option' );
+					anchor.setAttribute( 'tabindex', '-1' );
+					item.appendChild( anchor );
+					fragment.appendChild( item );
+				}
+
+				self.list[0].appendChild( fragment );
+
+				// 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
+				});
+			}
+		});
+	};
+
+	// issue #3894 - core doesn't trigger events on disabled delegates
+	$.mobile.$document.bind( "selectmenubeforecreate", function( event ) {
+		var selectmenuWidget = $( event.target ).data( "selectmenu" );
+
+		if ( !selectmenuWidget.options.nativeMenu &&
+				selectmenuWidget.element.parents( ":jqmData(role='popup')" ).length === 0 ) {
+			extendSelect( selectmenuWidget );
+		}
+	});
+})( jQuery );
+
+(function( $, undefined ) {
+
+
+	$.widget( "mobile.fixedtoolbar", $.mobile.widget, {
+		options: {
+			visibleOnPageShow: true,
+			disablePageZoom: true,
+			transition: "slide", //can be none, fade, slide (slide maps to slideup or slidedown)
+			fullscreen: false,
+			tapToggle: true,
+			tapToggleBlacklist: "a, button, input, select, textarea, .ui-header-fixed, .ui-footer-fixed, .ui-popup",
+			hideDuringFocus: "input, textarea, select",
+			updatePagePadding: true,
+			trackPersistentToolbars: true,
+
+			// Browser detection! Weeee, here we go...
+			// Unfortunately, position:fixed is costly, not to mention probably impossible, to feature-detect accurately.
+			// Some tests exist, but they currently return false results in critical devices and browsers, which could lead to a broken experience.
+			// Testing fixed positioning is also pretty obtrusive to page load, requiring injected elements and scrolling the window
+			// The following function serves to rule out some popular browsers with known fixed-positioning issues
+			// This is a plugin option like any other, so feel free to improve or overwrite it
+			supportBlacklist: function() {
+				var w = window,
+					ua = navigator.userAgent,
+					platform = navigator.platform,
+					// Rendering engine is Webkit, and capture major version
+					wkmatch = ua.match( /AppleWebKit\/([0-9]+)/ ),
+					wkversion = !!wkmatch && wkmatch[ 1 ],
+					ffmatch = ua.match( /Fennec\/([0-9]+)/ ),
+					ffversion = !!ffmatch && ffmatch[ 1 ],
+					operammobilematch = ua.match( /Opera Mobi\/([0-9]+)/ ),
+					omversion = !!operammobilematch && operammobilematch[ 1 ];
+
+				if(
+					// iOS 4.3 and older : Platform is iPhone/Pad/Touch and Webkit version is less than 534 (ios5)
+					( ( platform.indexOf( "iPhone" ) > -1 || platform.indexOf( "iPad" ) > -1  || platform.indexOf( "iPod" ) > -1 ) && wkversion && wkversion < 534 ) ||
+					// Opera Mini
+					( w.operamini && ({}).toString.call( w.operamini ) === "[object OperaMini]" ) ||
+					( operammobilematch && omversion < 7458 )	||
+					//Android lte 2.1: Platform is Android and Webkit version is less than 533 (Android 2.2)
+					( ua.indexOf( "Android" ) > -1 && wkversion && wkversion < 533 ) ||
+					// Firefox Mobile before 6.0 -
+					( ffversion && ffversion < 6 ) ||
+					// WebOS less than 3
+					( "palmGetResource" in window && wkversion && wkversion < 534 )	||
+					// MeeGo
+					( ua.indexOf( "MeeGo" ) > -1 && ua.indexOf( "NokiaBrowser/8.5.0" ) > -1 ) ) {
+					return true;
+				}
+
+				return false;
+			},
+			initSelector: ":jqmData(position='dummy')"
+		},
+
+		_create: function() {
+
+			var self = this,
+				o = self.options,
+				$el = self.element,
+				tbtype = $el.is( ":jqmData(role='header')" ) ? "header" : "footer",
+				$page = $el.closest( ".ui-page" );
+
+			// Feature detecting support for
+			if ( o.supportBlacklist() ) {
+				self.destroy();
+				return;
+			}
+
+			$el.addClass( "ui-"+ tbtype +"-fixed" );
+
+			// "fullscreen" overlay positioning
+			if ( o.fullscreen ) {
+				$el.addClass( "ui-"+ tbtype +"-fullscreen" );
+				$page.addClass( "ui-page-" + tbtype + "-fullscreen" );
+			}
+			// If not fullscreen, add class to page to set top or bottom padding
+			else{
+				$page.addClass( "ui-page-" + tbtype + "-fixed" );
+			}
+
+			self._addTransitionClass();
+			self._bindPageEvents();
+			self._bindToggleHandlers();
+		},
+
+		_addTransitionClass: function() {
+			var tclass = this.options.transition;
+
+			if ( tclass && tclass !== "none" ) {
+				// use appropriate slide for header or footer
+				if ( tclass === "slide" ) {
+					tclass = this.element.is( ".ui-header" ) ? "slidedown" : "slideup";
+				}
+
+				this.element.addClass( tclass );
+			}
+		},
+
+		_bindPageEvents: function() {
+			var self = this,
+				o = self.options,
+				$el = self.element;
+
+			//page event bindings
+			// Fixed toolbars require page zoom to be disabled, otherwise usability issues crop up
+			// This method is meant to disable zoom while a fixed-positioned toolbar page is visible
+			$el.closest( ".ui-page" )
+				.bind( "pagebeforeshow", function() {
+					if ( o.disablePageZoom ) {
+						$.mobile.zoom.disable( true );
+					}
+					if ( !o.visibleOnPageShow ) {
+						self.hide( true );
+					}
+				} )
+				.bind( "webkitAnimationStart animationstart updatelayout", function() {
+					var thisPage = this;
+					if ( o.updatePagePadding ) {
+						self.updatePagePadding( thisPage );
+					}
+				})
+				.bind( "pageshow", function() {
+					var thisPage = this;
+					self.updatePagePadding( thisPage );
+					if ( o.updatePagePadding ) {
+						$.mobile.$window.bind( "throttledresize." + self.widgetName, function() {
+							self.updatePagePadding( thisPage );
+						});
+					}
+				})
+				.bind( "pagebeforehide", function( e, ui ) {
+					if ( o.disablePageZoom ) {
+						$.mobile.zoom.enable( true );
+					}
+					if ( o.updatePagePadding ) {
+						$.mobile.$window.unbind( "throttledresize." + self.widgetName );
+					}
+
+					if ( o.trackPersistentToolbars ) {
+						var thisFooter = $( ".ui-footer-fixed:jqmData(id)", this ),
+							thisHeader = $( ".ui-header-fixed:jqmData(id)", this ),
+							nextFooter = thisFooter.length && ui.nextPage && $( ".ui-footer-fixed:jqmData(id='" + thisFooter.jqmData( "id" ) + "')", ui.nextPage ) || $(),
+							nextHeader = thisHeader.length && ui.nextPage && $( ".ui-header-fixed:jqmData(id='" + thisHeader.jqmData( "id" ) + "')", ui.nextPage ) || $();
+
+							if ( nextFooter.length || nextHeader.length ) {
+
+								nextFooter.add( nextHeader ).appendTo( $.mobile.pageContainer );
+
+								ui.nextPage.one( "pageshow", function() {
+									nextFooter.add( nextHeader ).appendTo( this );
+								});
+							}
+					}
+				});
+		},
+
+		_visible: true,
+
+		// This will set the content element's top or bottom padding equal to the toolbar's height
+		updatePagePadding: function( tbPage ) {
+			var $el = this.element,
+				header = $el.is( ".ui-header" );
+
+			// This behavior only applies to "fixed", not "fullscreen"
+			if ( this.options.fullscreen ) { return; }
+
+			tbPage = tbPage || $el.closest( ".ui-page" );
+			$( tbPage ).css( "padding-" + ( header ? "top" : "bottom" ), $el.outerHeight() );
+		},
+
+		_useTransition: function( notransition ) {
+			var $win = $.mobile.$window,
+				$el = this.element,
+				scroll = $win.scrollTop(),
+				elHeight = $el.height(),
+				pHeight = $el.closest( ".ui-page" ).height(),
+				viewportHeight = $.mobile.getScreenHeight(),
+				tbtype = $el.is( ":jqmData(role='header')" ) ? "header" : "footer";
+
+			return !notransition &&
+				( this.options.transition && this.options.transition !== "none" &&
+				(
+					( tbtype === "header" && !this.options.fullscreen && scroll > elHeight ) ||
+					( tbtype === "footer" && !this.options.fullscreen && scroll + viewportHeight < pHeight - elHeight )
+				) || this.options.fullscreen
+				);
+		},
+
+		show: function( notransition ) {
+			var hideClass = "ui-fixed-hidden",
+				$el = this.element;
+
+			if ( this._useTransition( notransition ) ) {
+				$el
+					.removeClass( "out " + hideClass )
+					.addClass( "in" );
+			}
+			else {
+				$el.removeClass( hideClass );
+			}
+			this._visible = true;
+		},
+
+		hide: function( notransition ) {
+			var hideClass = "ui-fixed-hidden",
+				$el = this.element,
+				// if it's a slide transition, our new transitions need the reverse class as well to slide outward
+				outclass = "out" + ( this.options.transition === "slide" ? " reverse" : "" );
+
+			if( this._useTransition( notransition ) ) {
+				$el
+					.addClass( outclass )
+					.removeClass( "in" )
+					.animationComplete(function() {
+						$el.addClass( hideClass ).removeClass( outclass );
+					});
+			}
+			else {
+				$el.addClass( hideClass ).removeClass( outclass );
+			}
+			this._visible = false;
+		},
+
+		toggle: function() {
+			this[ this._visible ? "hide" : "show" ]();
+		},
+
+		_bindToggleHandlers: function() {
+			var self = this,
+				o = self.options,
+				$el = self.element;
+
+			// tap toggle
+			$el.closest( ".ui-page" )
+				.bind( "vclick", function( e ) {
+					if ( o.tapToggle && !$( e.target ).closest( o.tapToggleBlacklist ).length ) {
+						self.toggle();
+					}
+				})
+				.bind( "focusin focusout", function( e ) {
+					if ( screen.width < 500 && $( e.target ).is( o.hideDuringFocus ) && !$( e.target ).closest( ".ui-header-fixed, .ui-footer-fixed" ).length ) {
+						self[ ( e.type === "focusin" && self._visible ) ? "hide" : "show" ]();
+					}
+				});
+		},
+
+		destroy: function() {
+			this.element.removeClass( "ui-header-fixed ui-footer-fixed ui-header-fullscreen ui-footer-fullscreen in out fade slidedown slideup ui-fixed-hidden" );
+			this.element.closest( ".ui-page" ).removeClass( "ui-page-header-fixed ui-page-footer-fixed ui-page-header-fullscreen ui-page-footer-fullscreen" );
+		}
+
+	});
+
+	//auto self-init widgets
+	$.mobile.$document
+		.bind( "pagecreate create", function( e ) {
+
+			// DEPRECATED in 1.1: support for data-fullscreen=true|false on the page element.
+			// This line ensures it still works, but we recommend moving the attribute to the toolbars themselves.
+			if ( $( e.target ).jqmData( "fullscreen" ) ) {
+				$( $.mobile.fixedtoolbar.prototype.options.initSelector, e.target ).not( ":jqmData(fullscreen)" ).jqmData( "fullscreen", true );
+			}
+
+			$.mobile.fixedtoolbar.prototype.enhanceWithin( e.target );
+		});
+
+})( jQuery );
+
+(function( $, window ) {
+
+	// This fix addresses an iOS bug, so return early if the UA claims it's something else.
+	if ( !(/iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( "AppleWebKit" ) > -1 ) ) {
+		return;
+	}
+
+  var zoom = $.mobile.zoom,
+		evt, x, y, z, aig;
+
+  function checkTilt( e ) {
+		evt = e.originalEvent;
+		aig = evt.accelerationIncludingGravity;
+
+		x = Math.abs( aig.x );
+		y = Math.abs( aig.y );
+		z = Math.abs( aig.z );
+
+		// If portrait orientation and in one of the danger zones
+    if ( !window.orientation && ( x > 7 || ( ( z > 6 && y < 8 || z < 8 && y > 6 ) && x > 5 ) ) ) {
+			if ( zoom.enabled ) {
+				zoom.disable();
+			}
+    }	else if ( !zoom.enabled ) {
+			zoom.enable();
+    }
+  }
+
+  $.mobile.$window
+		.bind( "orientationchange.iosorientationfix", zoom.enable )
+		.bind( "devicemotion.iosorientationfix", checkTilt );
+
+}( jQuery, this ));
+
+(function( $, window, undefined ) {
+	var	$html = $( "html" ),
+			$head = $( "head" ),
+			$window = $.mobile.$window;
+
+	//remove initial build class (only present on first pageshow)
+	function hideRenderingClass() {
+		$html.removeClass( "ui-mobile-rendering" );
+	}
+
+	// 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" );
+
+	// This is a fallback. If anything goes wrong (JS errors, etc), or events don't fire,
+	// this ensures the rendering class is removed after 5 seconds, so content is visible and accessible
+	setTimeout( hideRenderingClass, 5000 );
+
+	$.extend( $.mobile, {
+		addEventBlocker: function () {
+			$html.addClass( "ui-blocker" );
+			$html.bind( "touchstart touchend vclick mousedown mouseup click", function () {
+				return false;
+			} );
+		},
+
+		removeEventBlocker: function () {
+			$html.removeClass( "ui-blocker" );
+			$html.unbind( "touchstart touchend vclick mousedown mouseup click" );
+		},
+
+		// find and enhance the pages in the dom and transition to the first page.
+		initializePage: function() {
+			// find present pages
+			var $pages = $( ":jqmData(role='page'), :jqmData(role='dialog')" ),
+				hash = $.mobile.path.parseLocation().hash.replace("#", ""),
+				hashPage = document.getElementById( hash );
+
+			// 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.each(function() {
+				var $this = $( this );
+
+				// unless the data url is already set set it to the pathname
+				if ( !$this[0].getAttribute( "data-" + $.mobile.ns + "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 = $.mobile.firstPage.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();
+			$.mobile.addEventBlocker();
+
+			//remove initial build class (only present on first pageshow)
+			hideRenderingClass();
+
+			// if hashchange listening is disabled, there's no hash deeplink,
+			// the hash is not valid (contains more than one # or does not start with #)
+			// or there is no page with that hash, change to the first page in the DOM
+			// Remember, however, that the hash can also be a path!
+			if ( ! ( $.mobile.hashListeningEnabled &&
+				$.mobile.path.isHashValid( location.hash ) &&
+				( $( hashPage ).is( ':jqmData(role="page")' ) ||
+					$.mobile.path.isPath( hash ) ||
+					hash === $.mobile.dialogHashKey ) ) ) {
+
+				// Store the initial destination
+				if ( $.mobile.path.isHashValid( location.hash ) ) {
+					$.mobile.urlHistory.initialDst = hash.replace( "#", "" );
+				}
+				$.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 ] );
+			}
+		}
+	});
+
+	// initialize events now, after mobileinit has occurred
+	$.mobile.navreadyDeferred.resolve();
+
+	// 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 || $.mobile.$window.scrollTop() === 1 ) ? 0 : 1;
+
+
+		// TODO: Implement a proper registration mechanism with dependency handling in order to not have exceptions like the one below
+		//auto self-init widgets for those widgets that have a soft dependency on others
+		if ( $.fn.controlgroup ) {
+			$.mobile.$document.bind( "pagecreate create", function( e ) {
+				$( ":jqmData(role='controlgroup')", e.target )
+					.jqmEnhanceable()
+					.controlgroup({ excludeInvisible: false });
+			});
+		}
+
+		//dom-ready inits
+		if ( $.mobile.autoInitializePage ) {
+			$.mobile.initializePage();
+		}
+
+		// window load event
+		// hide iOS browser chrome on load
+		$window.load( $.mobile.silentScroll );
+
+		if ( !$.support.cssPointerEvents ) {
+			// IE and Opera don't support CSS pointer-events: none that we use to disable link-based buttons
+			// by adding the 'ui-disabled' class to them. Using a JavaScript workaround for those browser.
+			// https://github.com/jquery/jquery-mobile/issues/3558
+
+			$.mobile.$document.delegate( ".ui-disabled", "vclick",
+				function( e ) {
+					e.preventDefault();
+					e.stopImmediatePropagation();
+				}
+			);
+		}
+	});
+}( jQuery, this ));
+
+}));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/libs/jquery.tmpl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/libs/jquery.tmpl.js
new file mode 100644
index 0000000..fa4f269
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/libs/jquery.tmpl.js
@@ -0,0 +1,500 @@
+/*!
+ * 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
+ */
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: jQuery Templates Plugin
+//>>label: jQuery Templates Plugin
+//>>group: Libs
+
+define( [ 
+	"jquery" 
+	], function( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+(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 );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+});
+//>>excludeEnd("jqmBuildExclude");
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/util/ensurens.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/util/ensurens.js
new file mode 100644
index 0000000..e0efda4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/util/ensurens.js
@@ -0,0 +1,65 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Make namespace for modules
+//>>label: Ensurens
+//>>group: Tizen:Utilities
+
+define( [ 
+	], function ( ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/*
+ *
+ * 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 (window) {
+		window.ensureNS = (function () {
+		var internalCache = {};
+		return function ensureNS (ns) { // name just for debugging purposes
+			var nsArr = ns.split(".").reverse(),
+				nsSoFar = "",
+				buffer = "",
+				leaf = "",
+				l = nsArr.length;
+			while(--l >= 0) {
+				leaf = nsArr[l];
+				nsSoFar = nsSoFar + (nsSoFar.length > 0 ? "." : "") + leaf;
+				if (!internalCache[nsSoFar]) {
+					internalCache[nsSoFar] = true;
+					buffer += "!window." + nsSoFar + ' && (window.' + nsSoFar + " = {});\n";
+				}
+			}
+			buffer.length && (new Function(buffer))();
+		};
+	})();
+})(this);
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/util/range.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/util/range.js
new file mode 100644
index 0000000..ec8c624
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/util/range.js
@@ -0,0 +1,69 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Makes array with given range
+//>>label: Range
+//>>group: Tizen:Utilities
+
+define( [ 
+	], function ( ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/*
+ * 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;
+}
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/components/imageloader.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/components/imageloader.js
new file mode 100644
index 0000000..96e2701
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/components/imageloader.js
@@ -0,0 +1,181 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Tizen image loader component for gallery3d
+//>>label: Image loader
+//>>group: Tizen:Widgets:Components
+
+define( [ 
+	], function ( ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+ * 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: Hyunsook Park <hyunsook.park@samsung.com>
+ *			Wonseop Kim <wonseop.kim@samsung.com>
+*/
+
+( function ( $, window, document, undefined ) {
+	var _canvas = document.createElement( 'canvas' ),
+		_context = _canvas.getContext( '2d' );
+
+	function fileSystemErrorMessage( e ) {
+		var FileError = window.FileError,
+			msg = '';
+		switch ( e.code ) {
+		case FileError.QUOTA_EXCEEDED_ERR:
+			msg = 'QUOTA_EXCEEDED_ERR';
+			break;
+		case FileError.NOT_FOUND_ERR:
+			msg = 'NOT_FOUND_ERR';
+			break;
+		case FileError.SECURITY_ERR:
+			msg = 'SECURITY_ERR';
+			break;
+		case FileError.INVALID_MODIFICATION_ERR:
+			msg = 'INVALID_MODIFICATION_ERR';
+			break;
+		case FileError.INVALID_STATE_ERR:
+			msg = 'INVALID_STATE_ERR';
+			break;
+		default:
+			msg = 'Unknown Error';
+			break;
+		}
+		return msg;
+	}
+
+	function getInternalURLFromURL( url ) {
+		var internalURL = url.replace( /\//gi, "_" );
+		return internalURL;
+	}
+
+	function resize( imagewidth, imageheight, thumbwidth, thumbheight, fit ) {
+		var w = 0, h = 0, x = 0, y = 0,
+			widthratio = imagewidth / thumbwidth,
+			heightratio = imageheight / thumbheight,
+			maxratio = Math.max( widthratio, heightratio );
+
+		if ( fit ) {
+			w = thumbwidth;
+			h = thumbheight;
+		} else {
+			if ( maxratio > 1 ) {
+				w = imagewidth / maxratio;
+				h = imageheight / maxratio;
+			} else {
+				w = imagewidth;
+				h = imageheight;
+			}
+			x = ( thumbwidth - w ) / 2;
+			y = ( thumbheight - h ) / 2;
+		}
+
+		return { w: w, h: h, x: x, y: y };
+	}
+
+	function getThumbnail( img, thumbwidth, thumbheight, fit ) {
+		var dimensions, url;
+		_canvas.width = thumbwidth;
+		_canvas.height = thumbheight;
+		dimensions = resize( img.width, img.height, thumbwidth, thumbheight, fit );
+		_context.fillStyle = "#000000";
+		_context.fillRect ( 0, 0, thumbwidth, thumbheight );
+		_context.drawImage( img, dimensions.x, dimensions.y, dimensions.w, dimensions.h );
+		url = _canvas.toDataURL();
+		return url;
+	}
+
+	$.imageloader = {
+		_grantedBytes: 1024 * 1024,
+		getThumbnail: function ( url, _callback ) {
+			var internalURL, canvasDataURI;
+			function errorHandler( e ) {
+				var msg = fileSystemErrorMessage( e );
+				if ( _callback ) {
+					_callback( ( msg === "NOT_FOUND_ERR" ) ? msg : null );
+				}
+			}
+
+			internalURL = getInternalURLFromURL( url );
+			try {
+				canvasDataURI = localStorage.getItem( internalURL );
+				if ( _callback ) {
+					_callback( ( canvasDataURI === null ) ? "NOT_FOUND_ERR" : canvasDataURI );
+				}
+			} catch ( e ) {
+				if ( _callback ) {
+					_callback( ( e.type === "non_object_property_load" ) ? "NOT_FOUND_ERR" : null );
+				}
+			}
+		},
+
+		setThumbnail: function ( url, _callback, thumbWidth, thumbHeight, fit ) {
+			var image, internalURL, canvasDataURI;
+			function errorHandler( e ) {
+				var msg = fileSystemErrorMessage( e );
+				if ( _callback ) {
+					_callback( ( msg === "NOT_FOUND_ERR" ) ? msg : null );
+				}
+			}
+
+			thumbWidth = thumbWidth || 128;
+			thumbHeight = thumbHeight || 128;
+			fit = fit || true;
+			image = new Image();
+			image.onload = function () {
+				internalURL = getInternalURLFromURL( url );
+				canvasDataURI = getThumbnail( this, thumbWidth, thumbHeight, fit );
+				try {
+					localStorage.setItem( internalURL, canvasDataURI );
+					if ( _callback ) {
+						_callback( canvasDataURI );
+					}
+				} catch ( e ) {
+					if ( _callback ) {
+						_callback( ( e.type === "non_object_property_load" ) ? "NOT_FOUND_ERR" : null );
+					}
+				}
+			};
+			image.src = url;
+		},
+
+		removeThumbnail: function ( url ) {
+			var internalURL;
+			function errorHandler( e ) {
+				fileSystemErrorMessage( e );
+			}
+
+			internalURL = getInternalURLFromURL( url );
+			try {
+				localStorage.removeItem( internalURL );
+			} catch ( e ) {
+				throw e;
+			}
+		}
+	};
+
+} ( jQuery, window, document ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/components/motionpath.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/components/motionpath.js
new file mode 100644
index 0000000..9cbbaaf
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/components/motionpath.js
@@ -0,0 +1,291 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Tizen motion path component for gallery3d
+//>>label: Motion path
+//>>group: Tizen:Widgets:Components
+
+define( [ 
+	], function ( ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+ * 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: Hyunsook Park <hyunsook.park@samsung.com>
+ *			Wonseop Kim <wonseop.kim@samsung.com>
+*/
+
+( function ( $, window, undefined ) {
+	var HALF_PI = Math.PI / 2,
+		DEFAULT_STEP = 0.001,
+		MotionPath = {},
+		vec3 = window.vec3,
+		arcLength3d = function ( p0, p1 ) {
+			var d = [ p1[0] - p0[0], p1[1] - p0[1], p1[2] - p0[2] ],
+				value = Math.sqrt( d[0] * d[0] + d[1] * d[1] + d[2] * d[2] );
+			return value;
+		};
+
+	MotionPath.base = function () {};
+	MotionPath.base.prototype = {
+		points: [],
+		step: DEFAULT_STEP,
+		length: 0,
+		levels: [],
+		init: function ( data ) {},
+		calculateLevel: function ( maxLevel ) {},
+		calculateTotalLength: function () {},
+		getPosition: function ( percent ) {},
+		getPercent: function ( start, interval ) {},
+		getAngle: function ( percent ) {}
+	};
+
+	MotionPath.bezier2d = function () {};
+	MotionPath.bezier2d.prototype = $.extend( true, {}, MotionPath.base.prototype, {
+		init: function ( data ) {
+			this.points = data.points;
+			this.step = data.step || DEFAULT_STEP;
+			this.length = this.calculateTotalLength();
+			this.levels = this.calculateLevel( data.maxLevel ) || [];
+		},
+
+		calculateLevel: function ( maxLevel ) {
+			var totalLength = this.length,
+				interval = totalLength / maxLevel,
+				levels = [],
+				i;
+
+			if ( !maxLevel ) {
+				return null;
+			}
+
+			for ( i = 0; i < maxLevel; i += 1 ) {
+				levels[maxLevel - i] = this.getPercent( 0, interval * i );
+			}
+
+			return levels;
+		},
+
+		calculateTotalLength: function () {
+			var step = this.step,
+				current = this.getPosition( 0 ),
+				last = current,
+				length = 0,
+				percent;
+			for ( percent = step; percent <= 1; percent += step ) {
+				current = this.getPosition( percent );
+				length += arcLength3d( last, current );
+				last = current;
+			}
+			return length;
+		},
+
+		getPosition: function ( percent ) {
+			var points = this.points,
+				getValue = function ( p1, c1, c2, p2, t ) {
+					return Math.pow(1 - t, 3) * p1 +
+						3 * t * Math.pow( 1 - t, 2 ) * c1 +
+						3 * Math.pow( t, 2 ) * ( 1 - t ) * c2 +
+						Math.pow( t, 3 ) * p2;
+				},
+				result = [
+					getValue( points[0][0], points[1][0], points[2][0], points[3][0], percent ),
+					getValue( points[0][2], points[1][2], points[2][2], points[3][2], percent )
+				];
+			return [ result[0], 0, result[1] ];
+		},
+
+		getPercent: function ( start, interval ) {
+			var step = this.step,
+				current = this.getPosition( start = start || 0 ),
+				last = current,
+				targetLength = start + interval,
+				length = 0,
+				percent;
+
+			for ( percent = start + step; percent <= 1; percent += step ) {
+				current = this.getPosition( percent );
+				length += arcLength3d( last, current );
+				if ( length >= targetLength ) {
+					return percent;
+				}
+				last = current;
+			}
+			return 1;
+		},
+
+		getAngle: function ( percent ) {
+			var points = this.points,
+				getTangent = function ( p1, c1, c2, p2, t ) {
+					return 3 * t * t * ( -p1 + 3 * c1 - 3 * c2 + p2 ) + 6 * t * ( p1 - 2 * c1 + c2 ) + 3 * ( -p1 + c1 );
+				},
+				tx = getTangent( points[0][0], points[1][0], points[2][0], points[3][0], percent ),
+				ty = getTangent( points[0][2], points[1][2], points[2][2], points[3][2], percent );
+			return Math.atan2( tx, ty ) - HALF_PI;
+		}
+
+	} );
+
+	// clamped cubic B-spline curve
+	// http://web.mit.edu/hyperbook/Patrikalakis-Maekawa-Cho/node17.html
+	// http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/B-spline/bspline-curve-coef.html
+	MotionPath.bspline = function () {};
+	MotionPath.bspline.prototype = $.extend( true, {}, MotionPath.base.prototype, {
+		_degree: 3,
+		_numberOfControls : 0,
+		_knotVectors: [],
+		_numberOfKnots: 0,
+
+		init: function ( data ) {
+			this.points = data.points;
+			this.step = data.step || DEFAULT_STEP;
+			this._numberOfPoints = this.points.length - 1;
+			this._numberOfKnots = this._numberOfPoints + this._degree + 1;
+
+			var deltaKnot = 1 / ( this._numberOfKnots - ( 2 * this._degree ) ),
+				v = deltaKnot,
+				i = 0;
+
+			while ( i <= this._numberOfKnots ) {
+				if ( i <= this._degree ) {
+					this._knotVectors.push( 0 );
+				} else if ( i < this._numberOfKnots - this._degree + 1 ) {
+					this._knotVectors.push( v );
+					v += deltaKnot;
+				} else {
+					this._knotVectors.push( 1 );
+				}
+				i += 1;
+			}
+
+			this.length = this.calculateTotalLength();
+			this.levels = this.calculateLevel( data.maxLevel ) || [];
+		},
+
+		_Np: function ( percent, i, degree ) {
+			var knots = this._knotVectors,
+				A = 0,
+				B = 0,
+				denominator = 0,
+				N0 = function ( percent, i ) {
+					return ( ( knots[i] <= percent && percent < knots[i + 1] ) ? 1 : 0 );
+				};
+
+			if ( degree === 1 ) {
+				A = N0( percent, i );
+				B = N0( percent, i + 1 );
+			} else {
+				A = this._Np( percent, i, degree - 1 );
+				B = this._Np( percent, i + 1, degree - 1 );
+			}
+
+			denominator = knots[i + degree] - knots[i];
+			A *= ( denominator !== 0 ) ? ( ( percent - knots[i] ) / denominator ) : 0;
+			denominator = knots[i + degree + 1] - knots[i + 1];
+			B *= ( denominator !== 0 ) ? ( ( knots[i + degree + 1] - percent ) / denominator ) : 0;
+
+			return A + B;
+		},
+
+		calculateLevel: function ( maxLevel ) {
+			var totalLength = this.length,
+				interval = totalLength / maxLevel,
+				levels = [],
+				i;
+
+			if ( !maxLevel ) {
+				return null;
+			}
+
+			for ( i = 0; i < maxLevel; i += 1 ) {
+				levels[maxLevel - i] = this.getPercent( 0, interval * i );
+			}
+			return levels;
+		},
+
+		calculateTotalLength: function () {
+			var step = this.step,
+				current = this.getPosition( 0 ),
+				last = current,
+				length = 0,
+				percent;
+			for ( percent = step; percent <= 1; percent += step ) {
+				current = this.getPosition( percent );
+				length += arcLength3d( last, current );
+				last = current;
+			}
+			return length;
+		},
+
+		getPosition: function ( percent ) {
+			var result = [], i, j, sum;
+			percent = percent.toFixed( 4 );
+			for ( j = 0; j < 3; j += 1 ) {
+				sum = 0;
+				for ( i = 0; i <= this._numberOfPoints; i += 1 ) {
+					sum += this.points[i][j] * this._Np( percent, i, this._degree );
+				}
+				result[j] = sum;
+			}
+
+			return result;
+		},
+
+		getPercent: function ( start, interval ) {
+			var step = this.step,
+				current = this.getPosition( start = start || 0 ),
+				last = current,
+				targetLength = start + interval,
+				length = 0,
+				percent;
+
+			for ( percent = start + step; percent <= 1; percent += step ) {
+				current = this.getPosition( percent );
+				length += arcLength3d( last, current );
+				if ( length >= targetLength ) {
+					return percent;
+				}
+				last = current;
+			}
+			return 1;
+		},
+
+		getAngle: function ( percent ) {
+			var prev = this.getPosition( percent ),
+				next = this.getPosition( percent + 0.001 ),
+				dir = vec3.normalize( vec3.direction( prev, next ) ),
+				cosValue = vec3.dot( dir, [1, 0, 0] );
+
+			return Math.acos( cosValue ) + Math.PI;
+		}
+	} );
+
+	$.motionpath = function ( type, data ) {
+		var object = new MotionPath[type]();
+		object.init( data );
+		return object;
+	};
+} ( jQuery, window ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/components/webgl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/components/webgl.js
new file mode 100644
index 0000000..00ab3d8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/components/webgl.js
@@ -0,0 +1,127 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Tizen WebGL component for gallery3d
+//>>label: WebGL
+//>>group: Tizen:Widgets:Lib
+
+define( [ 
+	], function ( ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+ * 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: Hyunsook Park <hyunsook.park@samsung.com>
+ *			Wonseop Kim <wonseop.kim@samsung.com>
+*/
+
+( function ( $, undefined ) {
+	$.webgl = {};
+
+	$.webgl.shader = {
+		_vertexShader: null,
+		_fragmentShader: null,
+
+		deleteShaders: function ( gl ) {
+			gl.deleteShader( this._vertexShader );
+			gl.deleteShader( this._fragmentShader );
+		},
+
+		addShaderProgram : function ( gl, vs, fs, isFile ) {
+			var shaderProgram,
+				vertexShaderSource = {},
+				fragmentShaderSource = {};
+
+			if ( isFile ) {
+				vertexShaderSource = this.loadShaderFile( vs );
+				fragmentShaderSource = this.loadShaderFile( fs );
+			} else {
+				vertexShaderSource.source = vs;
+				fragmentShaderSource.source = fs;
+			}
+
+			this._vertexShader = this.getShader( gl, gl.VERTEX_SHADER, vertexShaderSource );
+			this._fragmentShader = this.getShader( gl, gl.FRAGMENT_SHADER, fragmentShaderSource );
+
+			shaderProgram = gl.createProgram();
+			gl.attachShader( shaderProgram, this._vertexShader);
+			gl.attachShader( shaderProgram, this._fragmentShader);
+			gl.linkProgram( shaderProgram );
+
+			if ( !gl.getProgramParameter( shaderProgram, gl.LINK_STATUS ) ) {
+				window.alert( "Could not initialize Shaders!" );
+			}
+			return shaderProgram;
+		},
+
+		loadShaderFile : function ( path ) {
+			var cache = null;
+			$.ajax({
+				async : false,
+				url : path,
+				success : function ( result ) {
+					cache = {
+						source: result
+					};
+				}
+			});
+			return cache;
+		},
+
+		getShader: function ( gl, type, script ) {
+			var shader;
+
+			if ( !gl || !type || !script ) {
+				return null;
+			}
+
+			shader = gl.createShader( type );
+
+			gl.shaderSource( shader, script.source );
+			gl.compileShader( shader );
+
+			if ( !gl.getShaderParameter( shader, gl.COMPILE_STATUS ) ) {
+				window.alert( gl.getShaderInfoLog( shader ) );
+				gl.deleteShader( shader );
+				return null;
+			}
+			return shader;
+		}
+	};
+
+	$.webgl.buffer = {
+		attribBufferData: function ( gl, attribArray ) {
+			var attribBuffer = gl.createBuffer();
+
+			gl.bindBuffer( gl.ARRAY_BUFFER, attribBuffer );
+			gl.bufferData( gl.ARRAY_BUFFER, attribArray, gl.STATIC_DRAW );
+			gl.bindBuffer( gl.ARRAY_BUFFER, null );
+
+			return attribBuffer;
+		}
+	};
+
+} ( jQuery ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.button.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.button.js
new file mode 100644
index 0000000..9bb5c7d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.button.js
@@ -0,0 +1,35 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Tizen button
+//>>label: Button
+//>>group: Tizen:Widgets
+define( [
+	"jqm/widgets/forms/button"
+	], function ( ) {
+} );
+//>>excludeEnd("jqmBuildExclude");
+
+/**
+	@class Button
+	The button widget shows a control on the screen that you can use to generate an action event when it is pressed and released. This widget is coded with standard HTML anchor and input elements and then enhanced by jQueryMobile to make it more attractive and usable on a mobile device. Buttons can be used in Tizen as described in the jQueryMobile documentation for buttons.
+
+	To add a button widget to the application, use the following code
+
+		<div data-role="button" data-inline="true">Text Button Test</div>
+		<div data-role="button" data-inline="true" data-icon="plus" data-style="circle"></div>
+		<div data-role="button" data-inline="true" data-icon="plus" data-style="nobg"></div>
+
+	The button can define callbacks for events as described in the jQueryMobile documentation for button events.<br/>
+	You can use methods with the button as described in the jQueryMobile documentation for button methods.
+*/
+
+/**
+	@property {String} data-style
+	Defines the button style. <br/> The default value is box. If the value is set to circle, a circle-shaped button is created. If the value is set to nobg, a button is created without a background.
+
+*/
+/**
+	@property {String} data-icon
+	Defines an icon for a button. Tizen supports 12 icon styles: reveal, closed, opened, info, rename, call, warning, plus, minus, cancel, send, and favorite.
+
+*/
+
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.checkbox.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.checkbox.js
new file mode 100644
index 0000000..48a88f4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.checkbox.js
@@ -0,0 +1,31 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Checkbox widget
+//>>label: Checkbox
+//>>group: Tizen:Widgets
+define( [
+	"jqm/widgets/forms/checkboxradio"
+	], function ( ) {
+} );
+//>>excludeEnd("jqmBuildExclude");
+
+/**
+	@class Checkbox
+	The check box widget shows a list of options on the screen where one or more can be selected. Check boxes can be used in Tizen as described in the jQueryMobile documentation for check boxes.<br/> To add a check box widget to the application, use the following code:
+
+		<input type="checkbox" name="mycheck" id="check-test" class="favorite" />
+		<label for="check-test">Favorite</label>
+		<input type="checkbox" name="check-favorite" id="check-test2" checked="checked" disabled="disabled" class="favorite" />
+		<label for="check-test2">Favorite Checked, Disabled</label>
+
+	The check box can define callbacks for events as described in the jQueryMobile documentation for check box events.
+	You can use methods with the check box as described in the jQueryMobile documentation for check box methods.
+
+*/
+/**
+	@property {String} class
+	Defines the check box style. <br/> The default value is check. If the value is set to favorite, a star-shaped check box is created.
+*/
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.circularview.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.circularview.js
new file mode 100644
index 0000000..b39fab8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.circularview.js
@@ -0,0 +1,530 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Container widget showing children circulary
+//>>label: Circularview
+//>>group: Tizen:Widgets
+
+define( [ 
+	"jquery",
+	"jqm/jquery.mobile.widget",
+	'../jquery.mobile.tizen.scrollview',
+	'libs/jquery.easing.1.3'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+ * 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({
+			"-ms-transform": v,
+			"-o-transform": v,
+			"-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 Date.now();
+	}
+
+	$.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 () {
+			var self = this;
+
+			this._items = $( this.element ).jqmData('list');
+			this._$clip = $( this.element ).addClass( "ui-scrollview-clip" );
+			this._$clip.wrapInner( '<div class="ui-scrollview-view"></div>' );
+			this._$view = $('.ui-scrollview-view', this._$clip );
+			this._$list = $( 'ul', this._$clip );
+
+			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;
+
+			this._timerCB = function () { self._handleMomentumScroll(); };
+
+			this.refresh();
+
+			this._addBehaviors();
+		},
+
+		reflow: function () {
+			var xy = this.getScrollPosition();
+			this.refresh();
+			this.scrollTo( xy.x, xy.y );
+		},
+
+		refresh: function () {
+			var itemsPerView;
+
+			this._$clip.width( $(window).width() );
+			this._clipWidth = this._$clip.width();
+			this._$list.empty();
+			this._$list.append(this._items[0]);
+			this._itemWidth = $(this._items[0]).outerWidth();
+			$(this._items[0]).detach();
+
+			itemsPerView = this._clipWidth / this._itemWidth;
+			itemsPerView = Math.ceil( itemsPerView * 10 ) / 10;
+			this._itemsPerView = parseInt( itemsPerView, 10 );
+			while ( this._itemsPerView + 1 > this._items.length ) {
+				$.merge( this._items, $(this._items).clone() );
+			}
+			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, duration ) {
+			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 * 1.5 );
+					this.scrollTo( newX + this._itemWidth, 0 );
+					this.scrollTo( newX, 0, duration );
+					return;
+				}
+			}
+		},
+
+		scrollTo: function ( x, y, duration ) {
+			this._stopMScroll();
+			if ( !duration ) {
+				this._setScrollPosition( x, y );
+				this._rx = x;
+				return;
+			}
+
+			var self = this,
+				start = getCurrentTime(),
+				efunc = $.easing.easeOutQuad,
+				sx = this._rx,
+				sy = 0,
+				dx = x - sx,
+				dy = 0,
+				tfunc,
+				elapsed,
+				ec;
+
+			this._rx = x;
+
+			tfunc = function () {
+				elapsed = getCurrentTime() - start;
+				if ( elapsed >= duration ) {
+					self._timerID = 0;
+					self._setScrollPosition( x, y );
+					self._$clip.trigger("scrollend");
+				} 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
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.datetimepicker.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.datetimepicker.js
new file mode 100644
index 0000000..7328a11
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.datetimepicker.js
@@ -0,0 +1,877 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Shows date and time, and make them able to be changed by user
+//>>label: Datetime picker
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	"libs/globalize",
+	'./jquery.mobile.tizen.widgetex',
+	'./jquery.mobile.tizen.popupwindow.ctxpopup',
+	], function ( jQuery, Globalize) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/*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'
+ *	value: pre-set value. only accepts ISO date string. e.g) "2012-05-04", "2012-05-04T01:02:03+09:00" 
+ *	data-date: any date/time string "new Date()" accepts.
+ *
+ * Options:
+ *	type: 'date', 'datetime', 'time'
+ *	format: see data-format in HTML Attributes.
+ *	value: see value in HTML Attributes.
+ *	date: preset value as JavaScript Date Object representation.
+ *
+ * APIs:
+ *	value( datestring )
+ *		: Set date/time to 'datestring'.
+ *	value()
+ *		: Get current selected date/time as W3C DTF style string.
+ *	getValue() - replaced with 'value()'
+ *		: same as value()
+ *	setValue( datestring ) - replaced with 'value(datestring)'
+ *		: same as value( datestring )
+ *	changeTypeFormat( type, format ) - deprecated
+ *		: Change Type and Format options. use datetimepicker( "option", "format" ) instead
+ *
+ * Events:
+ *	date-changed: Raised when date/time was changed. Date-changed event will be deprecated
+ *
+ * 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("change", function() {
+ *			// your code
+ *    });
+ */
+
+/**
+	@class DateTimePicker
+	The picker widgets show a control that you can use to enter date and time values. <br/> To add a date time picker widget to the application, use the following code:
+
+			<li class="ui-li-dialogue ui-datetime">
+				<div class="ui-datetime-text-main">
+					<input type="datetime" data-format="MMM dd yyyy hh:mm:ss" name="demo-date" id="demo-date" />
+				</div>
+				<div class="ui-li-text-sub">Date/Time Picker
+					<span id="selected-date1"><em>(select a date first)</em></span>
+				</div>
+			</li>
+*/
+
+
+( function ( $, window, undefined ) {
+	$.widget( "tizen.datetimepicker", $.tizen.widgetex, {
+
+		options: {
+			type: null, // date, time, datetime applicable
+			format: null,
+			date: null,
+			initSelector: "input[type='date'], input[type='datetime'], input[type='time'], :jqmData(role='datetimepicker')"
+		},
+
+		container : null,
+
+		_calendar: function () {
+			return Globalize.culture().calendars.standard;
+		},
+
+		_value: {
+			attr: "data-" + ( $.mobile.ns || "" ) + "date",
+			signal: "date-changed"
+		},
+
+		_daysInMonth: [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ],
+
+		_isLeapYear: function ( year ) {
+			return year % 4 ? 0 : ( year % 100 ? 1 : ( year % 400 ? 0 : 1 ) );
+		},
+
+		_makeTwoDigits: function ( val ) {
+			var ret = val.toString(10);
+			if ( val < 10 ) {
+				ret = "0" + ret;
+			}
+			return ret;
+		},
+
+		_setType: function ( type ) {
+			//datetime, date, time
+			switch (type) {
+			case 'datetime':
+			case 'date':
+			case 'time':
+				this.options.type = type;
+				break;
+			default:
+				this.options.type = 'datetime';
+				break;
+			}
+
+			this.element.attr( "data-" + ( $.mobile.ns ? $.mobile.ns + "-" : "" ) + "type", this.options.type );
+			return this.options.type;
+		},
+
+		_setFormat: function ( format ) {
+			if ( this.options.format != format ) {
+				this.options.format = format;
+			} else {
+				return;
+			}
+
+			this.ui.children().remove();
+
+			var token = this._parsePattern( format ),
+				div = document.createElement('div'),
+				pat,
+				tpl,
+				tpl2,
+				period,
+				btn,
+				obj = this;
+
+			while ( token.length > 0 ) {
+				pat = token.shift();
+				tpl = '<span class="ui-btn-picker ui-datefield-%1"' +
+					'data-role="button" data-inline="true" data-pat="' + pat + '">%2</span>';
+				tpl2= '<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') );
+					break;
+				case 'mm': //00 01 ... 59
+				case 'm': //0 1 2 ... 59
+					if ( this.options.type == 'date' ) {
+						$(div).append( tpl.replace('%1', 'month') );
+					} else {
+						$(div).append( tpl.replace('%1', 'min') );
+					}
+					break;
+				case 'ss':
+				case 's':
+					$(div).append( tpl.replace('%1', 'sec') );
+					break;
+				case 'd': // day of month 5
+				case 'dd': // day of month(leading zero) 05
+					$(div).append( tpl.replace('%1', 'day') );
+					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') );
+					break;
+				case 'yy':	// year two digit
+				case 'yyyy': // year four digit
+					$(div).append( tpl.replace('%1', 'year') );
+					break;
+				case 't': //AM / PM indicator(first letter) A, P
+					// add button
+				case 'tt': //AM / PM indicator AM/PM
+					// add button
+					btn = '<a href="#" class="ui-datefield-period"' +
+						' data-role="button" data-inline="true">period</a>';
+					$(div).append( btn );
+					break;
+				case 'g':
+				case 'gg':
+					$(div).append( tpl.replace('%1', 'era').replace('%2', this._calendar().eras.name) );
+					break;
+				case '\t':
+					$(div).append( tpl2.replace('%1', 'tab')
+							.replace('%2', "<div class='ui-divider-1st'>&nbsp;</div>" +
+								"<div class='ui-divider-2nd'>&nbsp;</div>") );
+					break;
+				default : // string or any non-clickable object
+					$(div).append( tpl2.replace('%1', 'seperator').replace('%2', pat.split(/[\-\/]/).join("") ) );
+					break;
+				}
+			}
+
+			this.ui.append( div );
+			if ( this.options.date ) {
+				this._setDate( this.options.date );
+			}
+
+			this.ui.find('.ui-btn-picker').buttonMarkup();
+			this.ui.find('.ui-datefield-period').buttonMarkup().bind( 'vclick', function ( e ) {
+				obj._switchAmPm( obj );
+				return false;
+			});
+
+			this.element.attr( "data-" + ( $.mobile.ns ? $.mobile.ns + "-" : "" ) + "format", this.options.format );
+			return this.options.format;
+		},
+
+		_setDate: function ( newdate ) {
+			if ( typeof ( newdate ) == "string" ) {
+				newdate = new Date( newdate );
+			}
+
+			var fields = $('span,a', this.ui),
+				type,
+				fn,
+				$field,
+				btn,
+				i;
+
+			function getMonth() {
+				return newdate.getMonth() + 1;
+			}
+
+			for ( i = 0; i < fields.length; i++ ) {
+				$field = $(fields[i]);
+				type = $field.attr("class").match(/ui-datefield-([\w]*)/);
+				if ( !type ) {
+					type = "";
+				}
+				switch ( type[1] ) {
+				case 'hour':
+					fn = newdate.getHours;
+					break;
+				case 'min':
+					fn = newdate.getMinutes;
+					break;
+				case 'sec':
+					fn = newdate.getSeconds;
+					break;
+				case 'year':
+					fn = newdate.getFullYear;
+					break;
+				case 'month':
+					fn = getMonth;
+					break;
+				case 'day':
+					fn = newdate.getDate;
+					break;
+				case 'period':
+					fn = newdate.getHours() < 12 ? this._calendar().AM[0] : this._calendar().PM[0];
+					btn = $field.find( '.ui-btn-text' );
+					if ( btn.length == 0 ) {
+						$field.text(fn);
+					} else if ( btn.text() != fn ) {
+						btn.text( fn );
+					}
+					fn = null;
+					break;
+				default:
+					fn = null;
+					break;
+				}
+				if ( fn ) {
+					this._updateField( $field, fn.call( newdate ) );
+				}
+			}
+
+			this.options.date = newdate;
+
+			this._setValue( newdate );
+
+			this.element.attr( "data-" + ( $.mobile.ns ? $.mobile.ns + "-" : "" ) + "date", this.options.date );
+			return this.options.date;
+		},
+
+		destroy: function () {
+			if ( this.ui ) {
+				this.ui.remove();
+			}
+
+			if ( this.element ) {
+				this.element.show();
+			}
+		},
+
+		value: function ( val ) {
+			function timeStr( t, obj ) {
+				return obj._makeTwoDigits( t.getHours() ) + ':' +
+					obj._makeTwoDigits( t.getMinutes() ) + ':' +
+					obj._makeTwoDigits( t.getSeconds() );
+			}
+
+			function dateStr( d, obj ) {
+				return ( ( d.getFullYear() % 10000 ) + 10000 ).toString().substr(1) + '-' +
+					obj._makeTwoDigits( d.getMonth() + 1 ) + '-' +
+					obj._makeTwoDigits( d.getDate() );
+			}
+
+			var rvalue = null;
+			if ( val ) {
+				rvalue = this._setDate( val );
+			} else {
+				switch ( this.options.type ) {
+				case 'time':
+					rvalue = timeStr( this.options.date, this );
+					break;
+				case 'date':
+					rvalue = dateStr( this.options.date, this );
+					break;
+				default:
+					rvalue = dateStr( this.options.date, this ) + 'T' + timeStr( this.options.date, this );
+					break;
+				}
+			}
+			return rvalue;
+		},
+
+		setValue: function ( newdate ) {
+			console.warn( "setValue was deprecated. use datetimepicker('option', 'date', value) instead." );
+			return this.value( newdate );
+		},
+
+		/**
+		 * return W3C DTF string
+		 */
+		getValue: function () {
+			console.warn("getValue() was deprecated. use datetimepicker('value') instead.");
+			return this.value();
+		},
+
+		_updateField: function ( target, value ) {
+			if ( !target || target.length == 0 ) {
+				return;
+			}
+
+			if ( value == 0 ) {
+				value = "0";
+			}
+
+			var pat = target.jqmData( 'pat' ),
+				hour,
+				text,
+				self = this;
+
+			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;
+					}
+				}
+				hour = this._makeTwoDigits( hour );
+				text = hour;
+				break;
+			case 'm':
+			case 'M':
+			case 'd':
+			case 's':
+				text = value;
+				break;
+			case 'mm':
+			case 'dd':
+			case 'MM':
+			case 'ss':
+				text = this._makeTwoDigits( value );
+				break;
+			case 'MMM':
+				text = this._calendar().months.namesAbbr[ value - 1];
+				break;
+			case 'MMMM':
+				text = this._calendar().months.names[ value - 1 ];
+				break;
+			case 'yy':
+				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;
+				}
+				text = value;
+				break;
+			}
+
+			// to avoid reflow where its value isn't out-dated
+			if ( target.text() != text ) {
+				if ( target.hasClass("ui-datefield-selected") ) {
+					target.addClass("out");
+					this._new_value = text;
+
+					target.animationComplete( function () {
+						target.text( self._new_value);
+						target.addClass("in")
+							.removeClass("out");
+
+						target.animationComplete( function () {
+							target.removeClass("in").
+								removeClass("ui-datefield-selected");
+						});
+					});
+				} else {
+					target.text( text );
+				}
+			}
+		},
+
+		_switchAmPm: function ( obj ) {
+			if ( this._calendar().AM != null ) {
+				var date = new Date( this.options.date ),
+					text,
+					change = 1000 * 60 * 60 * 12;
+				if ( date.getHours() > 11 ) {
+					change = -change;
+				}
+				date.setTime( date.getTime() + change );
+				this._setDate( date );
+			}
+		},
+
+		_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]*\'$|[\w\W]/g,
+				matches,
+				i;
+
+			matches = pattern.match( regex );
+
+			for ( i = 0; i < matches.length; i++ ) {
+				if ( matches[i].charAt(0) == "'" ) {
+					matches[i] = matches[i].substr( 1, matches[i].length - 2 );
+				}
+			}
+
+			return matches;
+		},
+
+		changeTypeFormat: function ( type, format ) {
+			console.warn('changeTypeFormat() was deprecated. use datetimepicker("option", "type"|"format", value) instead');
+			if ( type ) {
+				this._setType( type );
+			}
+
+			if ( format ) {
+				this._setFormat( format );
+			}
+		},
+
+		_create: function () {
+			var obj = this;
+
+			if ( this.element.is( "input" ) ) {
+				( function ( obj ) {
+					var type, value, format;
+
+					type = obj.element.get(0).getAttribute( "type" );
+					obj.options.type = type;
+
+					value = obj.element.get(0).getAttribute( "value" );
+					if ( value ) {
+						obj.options.date = new Date( value );
+					}
+				}( this ) );
+			}
+
+			if ( !this.options.format ) {
+				switch ( this.options.type ) {
+				case 'datetime':
+					this.options.format = this._calendar().patterns.d + "\t" + this._calendar().patterns.t;
+					break;
+				case 'date':
+					this.options.format = this._calendar().patterns.d;
+					break;
+				case 'time':
+					this.options.format = this._calendar().patterns.t;
+					break;
+				}
+			}
+
+			if ( !this.options.date ) {
+				this.options.date = new Date();
+			}
+
+			this.element.hide();
+			this.ui = $('<div class="ui-datefield"></div>');
+			$(this.element).after( this.ui );
+
+			this._popup_open = false;
+			this.ui.bind('vclick', function ( e ) {
+				obj._showDataSelector( obj, this, e.target );
+			});
+
+			$.extend( this, {
+				_globalHandlers: [
+					{
+						src: $( window ),
+						handler: {
+							orientationchange: $.proxy( this, "_orientationHandler" )
+						}
+					}
+				]
+			});
+
+			$.each( this._globalHandlers, function( idx, value ) {
+				value.src.bind( value.handler );
+			});
+		},
+		_orientationHandler: function() {
+			var self = this;
+			if( self._popup_open ) {
+				self._popup_open = false;
+				self.container.popupwindow( 'close' );
+			}
+			return false;
+		},
+		_populateDataSelector: function ( field, pat ) {
+			var values,
+				numItems,
+				current,
+				data,
+				range = window.range,
+				local,
+				yearlb,
+				yearhb,
+				day;
+
+			switch ( field ) {
+			case 'hour':
+				if ( pat == 'H' || pat == 'HH' ) {
+					// twentyfour
+					values = range( 0, 23 );
+					data = range( 0, 23 );
+					current = this.options.date.getHours();
+				} else {
+					values = range( 1, 12 );
+					current = this.options.date.getHours() - 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( this._makeTwoDigits );
+				}
+				numItems = values.length;
+				break;
+			case 'min':
+			case 'sec':
+				values = range( 0, 59 );
+				if ( pat.length == 2 ) {
+					values = values.map( this._makeTwoDigits );
+				}
+				data = range( 0, 59 );
+				current = ( field == 'min' ? this.options.date.getMinutes() : this.options.date.getSeconds() );
+				numItems = values.length;
+				break;
+			case 'year':
+				yearlb = 1900;
+				yearhb = 2100;
+				data = range( yearlb, yearhb );
+				current = this.options.date.getFullYear() - 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( this._makeTwoDigits );
+					break;
+				case 3:
+					values = this._calendar().months.namesAbbr.slice();
+					break;
+				case 4:
+					values = this._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 = this.options.date.getMonth();
+				numItems = values.length;
+				break;
+			case 'day':
+				day = this._daysInMonth[ this.options.date.getMonth() ];
+				if ( day == 28 ) {
+					day += this._isLeapYear( this.options.date.getFullYear() );
+				}
+				values = range( 1, day );
+				if ( pat.length == 2 ) {
+					values = values.map( this._makeTwoDigits );
+				}
+				data = range( 1, day );
+				current = this.options.date.getDate() - 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 ? attr.match(/ui-datefield-([\w]*)/) : undefined,
+				pat,
+				data,
+				values,
+				numItems,
+				current,
+				valuesData,
+				html,
+				datans,
+				$ul,
+				$div,
+				$ctx,
+				$li,
+				i,
+				newLeft = 10,
+				self = this;
+
+			if ( !attr ) {
+				return;
+			}
+			if ( !field ) {
+				return;
+			}
+			if ( this._popup_open ) {
+				return;
+			}
+
+			target.not('.ui-datefield-seperator').addClass('ui-datefield-selected');
+
+			pat = target.jqmData('pat');
+			data = obj._populateDataSelector.call( obj, field[1], pat );
+
+			values = data.values;
+			numItems = data.numItems;
+			current = data.current;
+			valuesData = data.data;
+
+			if ( values ) {
+				datans = "data-" + ($.mobile.ns ? ($.mobile.ns + '-') : "") + 'val="';
+				for ( i = 0; i < values.length; i++ ) {
+					html += '<li><a class="ui-link" ' + datans + valuesData[i] + '">' + values[i] + '</a></li>';
+				}
+
+				$ul = $("<ul></ul>");
+				$div = $('<div class="ui-datetimepicker-selector" data-transition="fade" data-fade="false"></div>');
+				$div.append( $ul ).appendTo( ui );
+				$ctx = $div.ctxpopup();
+				$ctx.parents('.ui-popupwindow').addClass('ui-datetimepicker');
+				$li = $(html);
+				$( $li[current] ).addClass("current");
+				$div.jqmData( "list", $li );
+				$div.circularview();
+				if( !obj._reflow ) {
+					obj._reflow = function() {
+						$div.circularview( "reflow" );
+						$div.circularview( 'centerTo', '.current', 0 );
+					}
+					$(window).bind( "resize" , obj._reflow );
+				}
+				if( !obj._close ) {
+					obj._close = function() {
+						$div.trigger( "popupafterclose" );
+					}
+					$(window).bind( "navigate", obj._close );
+				}
+				$ctx.popupwindow( 'open',
+						target.offset().left + ( target.width() / 2 ) - window.pageXOffset ,
+						target.offset().top + target.height() - window.pageYOffset, target.width(), target.height() );
+
+				this.container = $ctx;
+				this._popup_open = true;
+
+				$div.bind('popupafterclose', function ( e ) {
+					if ( obj._reflow ) {
+						$(window).unbind( "resize", obj._reflow );
+						obj._reflow = null;
+					}
+
+					if ( obj._close ) {
+						$(window).unbind( "navigate", obj._close );
+						obj._close = null;
+					}
+
+					if ( !( target.hasClass("in") || target.hasClass("out") ) ) {
+						target.removeClass("ui-datefield-selected");
+					}
+
+					$div.unbind( 'popupafterclose' );
+					$ul.unbind( 'vclick' );
+					$(obj).unbind( 'update' );
+					$ctx.popupwindow( 'destroy' );
+					$div.remove();
+
+					self._popup_open = false;
+				});
+
+				$(obj).bind( 'update', function ( e, val ) {
+					var date = new Date( this.options.date ),
+						month,
+						date_calibration = function () {
+							date.setDate( 1 );
+							date.setDate( date.getDate() - 1 );
+						};
+
+					switch ( field[1] ) {
+					case 'min':
+						date.setMinutes( val );
+						break;
+					case 'hour':
+						date.setHours( val );
+						break;
+					case 'sec':
+						date.setSeconds( val );
+						break;
+					case 'year':
+						month = date.getMonth();
+						date.setFullYear( val );
+
+						if ( date.getMonth() != month ) {
+							date_calibration();
+						}
+						break;
+					case 'month':
+						date.setMonth( val - 1 );
+
+						if ( date.getMonth() == val ) {
+							date_calibration();
+						}
+						break;
+					case 'day':
+						date.setDate( val );
+						break;
+					}
+
+					obj._setDate( date );
+
+					$ctx.popupwindow( 'close' );
+				});
+
+				$ul.bind( 'click', 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
+					}
+				});
+
+				$div.circularview( 'centerTo', '.current', 500 );
+				$div.bind( 'scrollend' , function ( e ) {
+					if ( !obj._reflow ) {
+						obj._reflow = function () {
+							$div.circularview("reflow");
+						};
+						$(window).bind("resize", obj._reflow);
+					}
+				});
+			}
+			return ui;
+		}
+
+	});
+
+	$(document).bind("pagecreate create", function ( e ) {
+		$($.tizen.datetimepicker.prototype.options.initSelector, e.target)
+			.not(":jqmData(role='none'), :jqmData(role='nojs')")
+			.datetimepicker();
+	});
+
+} ( jQuery, this ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.extendablelist.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.extendablelist.js
new file mode 100644
index 0000000..ff9b927
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.extendablelist.js
@@ -0,0 +1,681 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Listview which can be extended more and more
+//>>label: Extendable list
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	'../jquery.mobile.tizen.scrollview',
+	'libs/jquery.tmpl'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/****************************************************************************
+ * 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 ( {
+ *				itemData: function ( idx ) { return json_obj; },
+ *				numItemData: number or function () { return number; },
+ *				cacheItemData: function ( minIdx, maxIdx ) {}
+ *				} )
+ *			: Create a extendable list widget. At this moment, _create method is called.
+ *			args : A collection of options
+ *				itemData: A function that returns JSON object for given index. Mandatory.
+ *				numItemData: Total number of itemData. Mandatory.
+ *				cacheItemData: Extendable list will ask itemData between minIdx and maxIdx.
+ *				    Developers can implement this function for preparing data.
+ *				    Optional.
+ *
+ *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">
+ *		</ul>
+ *
+ */
+
+/**
+	@class Extendablelist
+	In the Web environment, it is challenging to display a large amount of data in a list, such as displaying a contact list of over 1000 list items. It takes time to display the entire list in HTML and the DOM manipulation is complex.
+	The extendable list widget is used to display a list of unlimited data elements on the screen for better performance. The list is extended if you click the button at the bottom of the list to load more data elements. Extendable lists are based on the jQuery.template plugin as described in the jQuery documentation for jQuery.template plugin.<br/>
+	To add a extendable list widget to the application, use the following code:
+
+			<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">
+			</ul>
+*/
+/**
+	@property {String} data-role
+	Creates the extendable list view. The value must be set to extendablelist. Only the &lt;ul&gt; element, which a id attribute defined, supports this option. Also, the elLoadSuccess class attribute must be defined in the &lt;ul&gt; element to ensure that loading data from the database is complete.
+*/
+/**
+	@property {String} data-template
+	Specifies the jQuery.template element ID. The jQuery.template must be defined. The template style can use rem units to support scalability. For using the button at the bottom of the list to load more data elements, there must be list view template with the button. The attribute ID must be tmp_load_more.
+*/
+/**
+	@property {Integer} data-extenditems
+	Defines the number of data elements to be extended at a time.
+*/
+( 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( "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" );
+			$( this ).addClass( "ui-btn-up-s" );
+			$( this ).removeClass( "ui-btn-down-s" );
+		},
+
+		_pushData: function ( template ) {
+			var o = this.options,
+				t = this,
+				i = 0,
+				myTemplate = $( "#" + template ),
+				loadMoreItems = ( o.extenditems > t._numItemData - t._lastIndex ? t._numItemData - t.lastIndex : o.extenditems ),
+				htmlData;
+
+			for (i = 0; i < loadMoreItems; i++ ) {
+				htmlData = myTemplate.tmpl( t._itemData( i ) );
+				$( o.id ).append( $( htmlData ).attr( 'id', 'li_' + i ) );
+
+				/* Add style */
+				$( o.id + ">" + o.childSelector )
+					.addClass( "ui-btn-up-s" )
+					.bind( "mouseup", t._stylerMouseUp )
+					.bind( "mousedown", t._stylerMouseDown )
+					.bind( "mouseover", t._stylerMouseOver )
+					.bind( "mouseout", t._stylerMouseOut );
+
+				t._lastIndex += 1;
+			}
+
+			/* After push data, re-style extendable list widget */
+			$( o.id ).trigger( "create" );
+		},
+
+		_loadmore: function ( event ) {
+			var t = event.data,	// <li> element
+				o = t.options,
+				i = 0,
+				myTemplate = $( "#" + o.template ),
+				loadMoreItems = ( o.extenditems > t._numItemData - t._lastIndex ? t._numItemData - t._lastIndex : 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( t._itemData( t._lastIndex ) );
+				$( o.id ).append( $( htmlData ).attr( 'id', 'li_' + t._lastIndex ) );
+				t._lastIndex += 1;
+			}
+
+			/* Append "Load more" message on the last of list */
+			if ( t._numItemData > t._lastIndex ) {
+				myTemplate = $( "#" + o.loadmore );
+				more_items_to_load = t._numItemData - t._lastIndex;
+				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 } );
+				// Button minimum height(37px)
+				$( o.id ).append( $( htmlData ).attr( 'id', "load_more_message" ).css( 'min-height' , "37px") );
+			}
+
+			$( o.id ).trigger( "create" );
+			$( o.id ).extendablelist( "refresh" );
+		},
+
+		recreate: function ( newArray ) {
+			this._create( {
+				itemData: function ( idx ) { return newArray[ idx ]; },
+				numItemData: newArray.length
+			} );
+		},
+
+		_initList: function (args ) {
+			var t = this,
+				o = this.options,
+				myTemplate,
+				more_items_to_load,
+				num_next_load_items,
+				htmlData;
+
+			/* Make Gen list by template */
+			if ( t._lastIndex <= 0 ) {
+				t._pushData( o.template );
+
+				/* Append "Load more" message on the last of list */
+				if ( t._numItemData > t._lastIndex ) {
+					myTemplate = $( "#" + o.loadmore );
+					more_items_to_load = t._numItemData - t._lastIndex;
+					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 } );
+					// Button minimum height(37px)
+					$( o.id ).append( $( htmlData ).attr( 'id', "load_more_message" ).css( 'min-height' , "37px") );
+
+					$( "#load_more_message" ).live( "click", t, 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.apply( this, arguments );
+		},
+
+		_create: function ( args ) {
+			var t = this,
+				o = this.options,
+				$el = this.element,
+				dbtable_name;
+
+
+			t.destroy();
+
+			$.extend(this, {
+				_itemData: function ( idx ) { return null; },
+				_numItemData: 0,
+				_cacheItemData: function ( minIdx, maxIdx ) { },
+				_lastIndex: 0
+			});
+
+
+			// 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;
+			}
+
+			if ( args ) {
+				if ( !t._loadData( args ) ) {
+					return;
+				}
+			} else {
+				// Legacy support: dbtable
+				console.warn("WARNING: The data interface of extendable list is changed. \nOld data interface(data-dbtable) is still supported, but will be removed in next version. \nPlease fix your code soon!");
+
+				if ( $( o.id ).hasClass( "elLoadSuccess" ) ) {
+					dbtable_name = $el.jqmData('dbtable');
+					o.dbtable = window[ dbtable_name ];
+					if ( !(o.dbtable) ) {
+						o.dbtable = { };
+					}
+					t._itemData = function ( idx ) {
+						return o.dbtable[ idx ];
+					};
+					t._numItemData = o.dbtable.length;
+
+				} else {
+					console.warn("No elLoadSuccess class");
+					return;
+				}
+			}
+
+			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";
+				}
+			}
+			t._initList( args );
+		},
+
+		_loadData : function ( args ) {
+			var self = this;
+
+			if ( args.itemData && typeof args.itemData == 'function'  ) {
+				self._itemData = args.itemData;
+			} else {
+				return false;
+			}
+			if ( args.numItemData ) {
+				if ( typeof args.numItemData == 'function' ) {
+					self._numItemData = args.numItemData( );
+				} else if ( typeof args.numItemData == 'number' ) {
+					self._numItemData = args.numItemData;
+				} else {
+					return false;
+				}
+			} else {
+				return false;
+			}
+			return true;
+		},
+
+
+		destroy : function () {
+			var o = this.options,
+				eOTAL_ITEMS = 0,
+				last_index = 0;
+
+			$( o.id ).empty();
+
+			$( "#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" );
+			}
+			this.element.trigger( "updatelayout" );
+		},
+
+		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 ));
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.fastscroll.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.fastscroll.js
new file mode 100644
index 0000000..939cac0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.fastscroll.js
@@ -0,0 +1,633 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Shows list index and scroll to the index directly
+//>>label: Fastscroll
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	'../jquery.mobile.tizen.scrollview'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/*
+ * 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>
+ *		 Yonghwi Park <yonghwi0324.park@samsung.com>
+ */
+
+// fastscroll 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-fastscroll="true" to a listview
+// (a <ul> or <ol> element inside a page). Alternatively, call
+// fastscroll() 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.
+
+/**
+	@class fastscroll
+	The shortcut scroll widget shows a shortcut list that is bound to its parent scroll bar and respective list view. This widget is displayed as a text pop-up representing shortcuts to different list dividers in the list view. If you select a shortcut text from the shortcut scroll, the parent list view is moved to the location representing the selected shortcut.
+
+	To add a shortcut scroll widget to the application, use the following code:
+
+		<div class="content" data-role="content" data-scroll="y">
+			<ul id="contacts" data-role="listview" data-fastscroll="true">
+				<li>Anton</li>
+			</ul>
+		</div>
+
+	For the shortcut scroll widget to be visible, the parent list view must have multiple list dividers.
+*/
+
+/**
+	@property {Boolean}  data-fastscroll
+	When set to true, creates a shortcut scroll using the HTML unordered list (&lt;ul&gt;) element.
+*/
+/**
+	@method fastscroll
+	The shortcut scroll is created for the closest list view with the ui-scrollview-clip class.
+*/
+/**
+	@method indexString
+	The indexString method is used to get (if no value is defined) or set the string to present the index.
+
+		<div class="content" data-role="content" data-scroll="y">
+			ul id="contacts" data-role="listview" data-fastscroll="true">
+				<li data-role="list-divider">A</li>
+				<li>Anton</li>
+			</ul>
+		</div>
+
+		$(".selector").fastscroll( "indexString" [, indexAlphabet] );
+*/
+(function ( $, undefined ) {
+
+	$.widget( "tizen.fastscroll", $.mobile.widget, {
+		options: {
+			initSelector: ":jqmData(fastscroll)"
+		},
+
+		_primaryLanguage: null,
+		_secondLanguage: null,
+		_dividerMap: {},
+		_charSet: null,
+
+		_create: function () {
+			var $el = this.element,
+				self = this,
+				$popup,
+				page = $el.closest( ':jqmData(role="page")' ),
+				jumpToDivider;
+
+			this.scrollview = $el.addClass( 'ui-fastscroll-target' ).closest( '.ui-scrollview-clip' );
+			this.shortcutsContainer = $( '<div class="ui-fastscroll" aria-label="Fast scroll bar, double tap to fast scroll mode" tabindex="0"/>' );
+			this.shortcutsList = $( '<ul aria-hidden="true"></ul>' );
+
+			// popup for the hovering character
+			this.scrollview.append($( '<div class="ui-fastscroll-popup"></div>' ) );
+			$popup = this.scrollview.find( '.ui-fastscroll-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();
+
+			this.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();
+			};
+
+			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();
+
+					self.shortcutsContainer.addClass( "ui-fastscroll-hover" );
+
+					// 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;
+					}
+
+					if ( e.target.tagName.toLowerCase() === "span" ) {
+						coords.x += $( e.target ).parent().offset().left - shortcutsListOffset.left;
+						coords.y += $( e.target ).parent().offset().top  - shortcutsListOffset.top;
+					}
+
+					self.shortcutsList.find( 'li' ).each( function () {
+						var listItem = $( this );
+						$( listItem )
+							.removeClass( "ui-fastscroll-hover" )
+							.removeClass( "ui-fastscroll-hover-down" );
+					});
+					// 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 ) ),
+							unit,
+							baseTop,
+							baseBottom,
+							omitSet,
+							i;
+
+						if ( coords.x >= l && coords.x <= r && coords.y >= t && coords.y <= b ) {
+							if ( listItem.text() !== "." ) {
+								self._hitItem( listItem );
+							} else {
+								omitSet = listItem.data( "omitSet" );
+								unit = ( b - t ) / omitSet.length;
+								for ( i = 0; i < omitSet.length; i++ ) {
+									baseTop = t + ( i * unit );
+									baseBottom = baseTop + unit;
+									if ( coords.y >= baseTop && coords.y <= baseBottom ) {
+										self._hitOmitItem( listItem, omitSet.charAt( i ) );
+									}
+								}
+							}
+							return false;
+						}
+						return true;
+					} );
+
+					e.preventDefault();
+					e.stopPropagation();
+				} )
+				// bind mouseout of the fastscroll container to remove popup
+				.bind( 'touchend mouseup vmouseup vmouseout', function () {
+					$popup.hide();
+					$( ".ui-fastscroll-hover" ).removeClass( "ui-fastscroll-hover" );
+					$( ".ui-fastscroll-hover-first-item" ).removeClass( "ui-fastscroll-hover-first-item" );
+					$( ".ui-fastscroll-hover-down" ).removeClass( "ui-fastscroll-hover-down" );
+					self.shortcutsContainer.removeClass( "ui-fastscroll-hover" );
+				} );
+
+			if ( page && !( page.is( ':visible' ) ) ) {
+				page.bind( 'pageshow', function () { self.refresh(); } );
+			} else {
+				self.refresh();
+			}
+
+			// refresh the list when dividers are filtered out
+			$el.bind( 'updatelayout', function () {
+				self.refresh();
+			} );
+		},
+
+		_findClosestDivider: function ( targetChar ) {
+			var i,
+				dividerMap = this._dividerMap,
+				charSet = this._charSet,
+				charSetLen = charSet.length,
+				targetIdx = charSet.indexOf( targetChar ),
+				lastDivider,
+				subDivider = null;
+
+			for ( i = 0; i < targetIdx; ++i ) {
+				lastDivider = dividerMap[ charSet.charAt( i ) ];
+				if ( lastDivider !== undefined ) {
+					subDivider = lastDivider;
+				}
+			}
+			if ( !subDivider ) {
+				for ( ++i; i < charSetLen; ++i ) {
+					lastDivider = dividerMap[ charSet.charAt( i ) ];
+					if ( lastDivider !== undefined ) {
+						subDivider = lastDivider;
+						break;
+					}
+				}
+			}
+			return subDivider;
+		},
+
+		_hitOmitItem: function ( listItem, text ) {
+			var $popup = this.scrollview.find( '.ui-fastscroll-popup' ),
+				divider;
+
+			divider = this._dividerMap[ text ] || this._findClosestDivider( text );
+			if ( typeof divider !== "undefined" ) {
+				this.jumpToDivider( $( divider ) );
+			}
+
+			$popup.text( text ).show();
+
+			$( listItem ).addClass( "ui-fastscroll-hover" );
+			if ( listItem.index() === 0 ) {
+				$( listItem ).addClass( "ui-fastscroll-hover-first-item" );
+			}
+			$( listItem ).siblings().eq( listItem.index() ).addClass( "ui-fastscroll-hover-down" );
+		},
+
+		_hitItem: function ( listItem  ) {
+			var $popup = this.scrollview.find( '.ui-fastscroll-popup' ),
+				text = listItem.text(),
+				divider;
+
+			if ( text === "#" ) {
+				divider = this._dividerMap.number;
+			} else {
+				divider = this._dividerMap[ text ] || this._findClosestDivider( text );
+			}
+
+			if ( typeof divider !== "undefined" ) {
+				this.jumpToDivider( $( divider ) );
+			}
+
+			$popup.text( text ).show();
+
+			$( listItem ).addClass( "ui-fastscroll-hover" );
+			if ( listItem.index() === 0 ) {
+				$( listItem ).addClass( "ui-fastscroll-hover-first-item" );
+			}
+			$( listItem ).siblings().eq( listItem.index() ).addClass( "ui-fastscroll-hover-down" );
+		},
+
+		_focusItem: function ( listItem ) {
+			var self = this,
+				$popup = self.scrollview.find( '.ui-fastscroll-popup' );
+
+			listItem.focusin( function ( e ) {
+				self.shortcutsList.attr( "aria-hidden", false );
+				self._hitItem( listItem );
+			}).focusout( function ( e ) {
+				self.shortcutsList.attr( "aria-hidden", true );
+				$popup.hide();
+				$( ".ui-fastscroll-hover" ).removeClass( "ui-fastscroll-hover" );
+				$( ".ui-fastscroll-hover-first-item" ).removeClass( "ui-fastscroll-hover-first-item" );
+				$( ".ui-fastscroll-hover-down" ).removeClass( "ui-fastscroll-hover-down" );
+			});
+		},
+
+		_contentHeight: function () {
+			var self = this,
+				$content = $( '.ui-scrollview-clip' ),
+				header = null,
+				footer = null,
+				paddingValue = 0,
+				clipSize = $( window ).height();
+
+			if ( $content.hasClass( "ui-content" ) ) {
+				paddingValue = parseInt( $content.css( "padding-top" ), 10 );
+				clipSize = clipSize - ( paddingValue || 0 );
+				paddingValue = parseInt( $content.css( "padding-bottom" ), 10 );
+				clipSize = clipSize - ( paddingValue || 0 );
+				header = $content.siblings( ".ui-header:visible" );
+				footer = $content.siblings( ".ui-footer:visible" );
+
+				if ( header ) {
+					if ( header.outerHeight( true ) === null ) {
+						clipSize = clipSize - ( $( ".ui-header" ).outerHeight() || 0 );
+					} else {
+						clipSize = clipSize - header.outerHeight( true );
+					}
+				}
+				if ( footer ) {
+					clipSize = clipSize - footer.outerHeight( true );
+				}
+			} else {
+				clipSize = $content.height();
+			}
+			return clipSize;
+		},
+
+		_omit: function ( numOfItems, maxNumOfItems ) {
+			var maxGroupNum = parseInt( ( maxNumOfItems - 1 ) / 2, 10 ),
+				numOfExtraItems = numOfItems - maxNumOfItems,
+				groupPos = [],
+				omitInfo = [],
+				groupPosLength,
+				group,
+				size,
+				i;
+
+			if ( ( maxNumOfItems < 3 ) || ( numOfItems <= maxNumOfItems ) ) {
+				return;
+			}
+
+			if ( numOfExtraItems >= maxGroupNum ) {
+				size = 2;
+				group = 1;
+				groupPosLength = maxGroupNum;
+			} else {
+				size = maxNumOfItems / ( numOfExtraItems + 1 );
+				group = size;
+				groupPosLength = numOfExtraItems;
+			}
+
+			for ( i = 0; i < groupPosLength; i++ ) {
+				groupPos.push( parseInt( group, 10 ) );
+				group += size;
+			}
+
+			for ( i = 0; i < maxNumOfItems; i++ ) {
+				omitInfo.push( 1 );
+			}
+
+			for ( i = 0; i < numOfExtraItems; i++ ) {
+				omitInfo[ groupPos[ i % maxGroupNum ] ]++;
+			}
+
+			return omitInfo;
+		},
+
+		_createDividerMap: function () {
+			var primaryCharacterSet = this._primaryLanguage ? this._primaryLanguage.replace( /,/g, "" ) : null,
+				secondCharacterSet = this._secondLanguage ? this._secondLanguage.replace( /,/g, "" ) : null,
+				numberSet = "0123456789",
+				dividers = this.element.find( '.ui-li-divider' ),
+				map = {},
+				matchToDivider,
+				makeCharacterSet,
+				indexChar,
+				i;
+
+			matchToDivider = function ( index, divider ) {
+				if ( $( divider ).text() === indexChar ) {
+					map[ indexChar ] = divider;
+				}
+			};
+
+			makeCharacterSet = function ( index, divider ) {
+				primaryCharacterSet += $( divider ).text();
+			};
+
+			if ( primaryCharacterSet === null ) {
+				primaryCharacterSet = "";
+				dividers.each( makeCharacterSet );
+			}
+
+			for ( i = 0; i < primaryCharacterSet.length; i++ ) {
+				indexChar = primaryCharacterSet.charAt( i );
+				dividers.each( matchToDivider );
+			}
+
+			if ( secondCharacterSet !== null ) {
+				for ( i = 0; i < secondCharacterSet.length; i++ ) {
+					indexChar = secondCharacterSet.charAt( i );
+					dividers.each( matchToDivider );
+				}
+			}
+
+			dividers.each( function ( index, divider ) {
+				if ( numberSet.search( $( divider ).text() ) !== -1  ) {
+					map.number = divider;
+					return false;
+				}
+			});
+
+			this._dividerMap = map;
+			this._charSet = primaryCharacterSet + secondCharacterSet;
+		},
+
+		indexString: function ( indexAlphabet ) {
+			var self = this,
+				characterSet = [];
+
+			if ( typeof indexAlphabet === "undefined" ) {
+				return self._primaryLanguage + ":" + self._secondLanguage;
+			}
+
+			characterSet = indexAlphabet.split( ":" );
+			self._primaryLanguage = characterSet[ 0 ];
+			if ( characterSet.length === 2 ) {
+				self._secondLanguage = characterSet[ 1 ];
+			}
+		},
+
+		refresh: function () {
+			var self = this,
+				primaryCharacterSet = self._primaryLanguage ? self._primaryLanguage.replace( /,/g, "" ) : null,
+				secondCharacterSet = self._secondLanguage ? self._secondLanguage.replace( /,/g, "" ) : null,
+				contentHeight = self._contentHeight(),
+				shapItem = $( '<li tabindex="0" aria-label="double to move Number list"><span aria-hidden="true">#</span><span aria-label="Number"/></li>' ),
+				$popup = this.scrollview.find( '.ui-fastscroll-popup' ),
+				omitIndex = 0,
+				makeCharacterSet,
+				makeOmitSet,
+				itemHandler,
+				containerHeight,
+				shortcutsItems,
+				shortcutItem,
+				shortcutsTop,
+				minClipHeight,
+				maxNumOfItems,
+				numOfItems,
+				minHeight,
+				omitInfo,
+				dividers,
+				listItems,
+				emptySize,
+				correction,
+				indexChar,
+				lastIndex,
+				seconds,
+				height,
+				size,
+				i;
+
+			makeCharacterSet = function ( index, divider ) {
+				primaryCharacterSet += $( divider ).text();
+			};
+
+			makeOmitSet = function ( index, length ) {
+				var count,
+					omitSet = "";
+
+				for ( count = 0; count < length; count++ ) {
+					omitSet += primaryCharacterSet[ index + count ];
+				}
+
+				return omitSet;
+			};
+
+			self._createDividerMap();
+
+			self.shortcutsList.find( 'li' ).remove();
+
+			// get all the dividers from the list and turn them into shortcuts
+			dividers = self.element.find( '.ui-li-divider' );
+
+			// get all the list items
+			listItems = self.element.find('li').not('.ui-li-divider');
+
+			// only use visible dividers
+			dividers = dividers.filter( ':visible' );
+			listItems = listItems.filter( ':visible' );
+
+			if ( dividers.length < 2 ) {
+				self.shortcutsList.hide();
+				return;
+			}
+
+			self.shortcutsList.show();
+			self.lastListItem = listItems.last();
+			self.shortcutsList.append( shapItem );
+			self._focusItem( shapItem );
+
+			if ( primaryCharacterSet === null ) {
+				primaryCharacterSet = "";
+				dividers.each( makeCharacterSet );
+			}
+
+			minHeight = shapItem.outerHeight( true );
+			maxNumOfItems = parseInt( contentHeight / minHeight - 1, 10 );
+			numOfItems = primaryCharacterSet.length;
+
+			maxNumOfItems = secondCharacterSet ? maxNumOfItems - 2 : maxNumOfItems;
+
+			if ( maxNumOfItems < 3 ) {
+				shapItem.remove();
+				return;
+			}
+
+			omitInfo = self._omit( numOfItems, maxNumOfItems );
+
+			for ( i = 0; i < primaryCharacterSet.length; i++ ) {
+				indexChar = primaryCharacterSet.charAt( i );
+				shortcutItem = $( '<li tabindex="0" aria-label="double to move ' + indexChar + ' list">' + indexChar + '</li>' );
+
+				self._focusItem( shortcutItem );
+
+				if ( typeof omitInfo !== "undefined" && omitInfo[ omitIndex ] > 1 ) {
+					shortcutItem = $( '<li>.</li>' );
+					shortcutItem.data( "omitSet",  makeOmitSet( i, omitInfo[ omitIndex ] ) );
+					i += omitInfo[ omitIndex ] - 1;
+				}
+
+				self.shortcutsList.append( shortcutItem );
+				omitIndex++;
+			}
+
+			if ( secondCharacterSet !== null ) {
+				lastIndex = secondCharacterSet.length - 1;
+				seconds = [];
+
+				seconds.push( secondCharacterSet.charAt( 0 ) );
+				seconds.push( secondCharacterSet.charAt( lastIndex ) );
+
+				for ( i = 0; i < seconds.length; i++ ) {
+					indexChar = seconds[ i ];
+					shortcutItem = $( '<li tabindex="0" aria-label="double to move ' + indexChar + ' list">' + indexChar + '</li>' );
+
+					self._focusItem( shortcutItem );
+					shortcutItem.bind( 'vclick', itemHandler );
+					self.shortcutsList.append( shortcutItem );
+				}
+			}
+
+			containerHeight = self.shortcutsContainer.outerHeight( true );
+			emptySize = contentHeight - containerHeight;
+			shortcutsItems = self.shortcutsList.children();
+			size = parseInt( emptySize / shortcutsItems.length, 10 );
+			correction = emptySize - ( shortcutsItems.length * size );
+
+			if ( emptySize > 0 ) {
+				shortcutsItems.each( function ( index, item ) {
+					height = $( item ).height() + size;
+					if ( correction !== 0 ) {
+						height += 1;
+						correction -= 1;
+					}
+					$( item ).css( {
+						height: height,
+						lineHeight: height + "px"
+					} );
+				} );
+			}
+
+			// position the shortcut flush with the top of the first list divider
+			shortcutsTop = dividers.first().position().top;
+			self.shortcutsContainer.css( 'top', shortcutsTop );
+
+			// make the scrollview clip tall enough to show the whole of the shortcutslist
+			minClipHeight = shortcutsTop + self.shortcutsContainer.outerHeight() + 'px';
+			self.scrollview.css( 'min-height', minClipHeight );
+
+			$popup.text( "M" ) // Popup size is determined based on "M".
+				.width( $popup.height() )
+				.css( { marginLeft: -( $popup.outerWidth() / 2 ),
+					marginTop: -( $popup.outerHeight() / 2 ) } );
+		}
+	} );
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.fastscroll.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.fastscroll();
+	} );
+
+	$( window ).bind( "resize orientationchange", function ( e ) {
+		$( ".ui-page-active .ui-fastscroll-target" ).fastscroll( "refresh" );
+	} );
+} ( jQuery ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.gallery.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.gallery.js
new file mode 100644
index 0000000..08afe90
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.gallery.js
@@ -0,0 +1,828 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Shows images one by one, and moves them by flicking
+//>>label: Gallery
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	"jqm/jquery.mobile.widget"
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+ * 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>
+ */
+
+/*
+ * Gallery widget
+ *
+ * HTML Attributes
+ *
+ *  data-role: set to 'gallery'
+ *  data-index: start index
+ *  data-vertical-align: set to top or middle or bottom.
+ *
+ * APIs
+ *
+ *  add(file): add the image (parameter: url of iamge)
+ *  remove(index): remove the image (parameter: index of image)
+ *  refresh(index): refresh the widget, should be called after add or remove. (parameter: start index)
+ *  empty: remove all of images from the gallery
+ *  length: get length of images
+ *  value(index): get or set current index of gallery (parameter: index of image)
+ *
+ * Events
+ *
+ *  N/A
+ *
+ * Example
+ *
+ * <div data-role="gallery" id="gallery" data-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>
+ *
+ *
+ * $('#gallery-add').bind('vmouseup', function ( e ) {
+ *	$('#gallery').gallery('add', '9.jpg');
+ *	$('#gallery').gallery('add', '10.jpg');
+ *	$('#gallery').gallery('refresh');
+ * });
+ *
+ * $('#gallery-del').bind('vmouseup', function ( e ) {
+ *	$('#gallery').gallery('remove');
+ * });
+ *
+ */
+
+ /**
+	@class Gallery
+	The gallery widget shows images in a gallery on the screen. <br/><br/> To add an gallery widget to the application, use the following code:
+
+		<div data-role="gallery" id="gallery" data-vertical-align="middle" data-index="3">
+			<img src="01.jpg">
+			<img src="02.jpg">
+			<img src="03.jpg">
+			<img src="04.jpg">
+			<img src="05.jpg">
+		</div>
+*/
+/**
+	@property {Integer} data-index
+	Defines the index number of the first image in the gallery.
+	<br/>The default value is 0.
+*/
+/**
+	@property {String} data-vertical-align
+	Defines the image alignment. The alignment options are top, middle, and bottom.
+	<br/>The default value is top.
+*/
+/**
+	@method add
+	The add method is used to add an image to the gallery. The image_file attribute defines the image file URL.
+
+		<div id="gallery" data-role="gallery" data-vertical-align="middle"></div>
+		$("#gallery").gallery('add', [image_file]);
+*/
+/**
+	@method remove
+	The remove method is used to delete an image from the gallery. The image_index attribute defines the index of the image to be deleted. If not set removes current image.
+
+		<div id="gallery" data-role="gallery" data-vertical-align="middle"></div>
+		$("#gallery").gallery('remove', [image_index]);
+*/
+/**
+	@method refresh
+	The refresh method is used to refresh the gallery. This method must be called after adding images to the gallery.
+
+		<div id="gallery" data-role="gallery" data-vertical-align="middle"></div>
+		$("#gallery").gallery('refresh');
+*/
+/**
+	@method empty
+	The empty method is used to remove all of images from the gallery.
+
+		<div id="gallery" data-role="gallery" data-vertical-align="middle"></div>
+		$("#gallery").gallery('empty');
+*/
+/**
+	@method length
+	The length method is used to get length of images.
+
+		<div id="gallery" data-role="gallery" data-vertical-align="middle"></div>
+		length = $("#gallery").gallery('length');
+*/
+/**
+	@method value
+	The value method is used to get or set current index of gallery. The image_index attribute defines the index of the image to be set. If not get current index.
+
+		<div id="gallery" data-role="gallery" data-vertical-align="middle"></div>
+		value = $("#gallery").gallery('value');
+		$("#gallery").gallery('value', [image_index]);
+*/
+(function ( $, window, undefined ) {
+	$.widget( "tizen.gallery", $.mobile.widget, {
+		options: {
+			flicking: false,
+			duration: 500
+		},
+
+		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,
+		orientationEventFire: false,
+
+		_resize: function ( index ) {
+			var img = this.images[index],
+				width = this.images[index].width(),
+				height = this.images[index].height(),
+				margin = 0,
+				ratio,
+				img_max_width = this.max_width - margin,
+				img_max_height = this.max_height - margin;
+
+			ratio = height / width;
+
+			if( img_max_width == 0 && isNaN( img_max_height ) ) {
+				/*
+				Exception : When image max width and height has incorrect value.
+				This exception is occured when this.max_width value is 0 and this.max_height value is NaN when page transition like rotation.
+				This exception affect that image width and height values are 0.
+				*/
+				img.width( width );
+				img.height( width * ratio );
+			} else {
+				if ( width > img_max_width ) {
+					img.width( img_max_width );
+					img.height( img_max_width * ratio );
+				}
+
+				height = img.height();
+
+				if ( height > img_max_height ) {
+					img.height( img_max_height );
+					img.width( img_max_height / ratio );
+				}
+			}
+		},
+
+		_align: function ( index, obj ) {
+			var img = this.images[index],
+				img_top = 0;
+
+			if ( !obj ) {
+				return;
+			}
+			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' );
+		},
+
+		_attach: function ( index, obj ) {
+			var self = this,
+				processing = function () {
+					self._resize( index );
+					self._align( index, obj );
+
+				},
+				loading = function () {
+					if ( self.images[index] === undefined ) {
+						return;
+					}
+
+					if ( !self.images[index].height() ) {
+						setTimeout( loading, 10 );
+						return;
+					}
+
+					processing();
+				};
+
+			if ( !obj ) {
+				return;
+			}
+			if ( !obj.length ) {
+				return;
+			}
+			if ( index < 0 ) {
+				return;
+			}
+			if ( !this.images.length ) {
+				return;
+			}
+			if ( index >= this.images.length ) {
+				return;
+			}
+
+			obj.css( "display", "block" );
+			obj.css( "visibility", "hidden" );
+			obj.append( this.images[index] );
+			loading();
+		},
+
+		_detach: function ( index, obj ) {
+			if ( !obj ) {
+				return;
+			}
+			if ( !obj.length ) {
+				return;
+			}
+			if ( index < 0 ) {
+				return;
+			}
+			if ( index >= this.images.length ) {
+				return;
+			}
+
+			obj.css( "display", "none" );
+			this.images[index].removeAttr("style");
+			this.images[index].detach();
+		},
+
+		_detach_all: function () {
+			var i;
+
+			for ( i = 0; i < this.images.length; i++ ) {
+				this.images[i].detach();
+			}
+		},
+
+		_drag: function ( _x ) {
+			var delta,
+				coord_x;
+
+			if ( !this.dragging ) {
+				return;
+			}
+
+			if ( this.options.flicking === 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._moveLeft( this.cur_img , coord_x + 'px' );
+			if ( this.next_img.length ) {
+				this._moveLeft( this.next_img ,  coord_x + this.window_width + 'px' );
+			}
+			if ( this.prev_img.length ) {
+				this._moveLeft( this.prev_img ,  coord_x - this.window_width + 'px' );
+			}
+		},
+
+		_move: function ( _x ) {
+			var delta = this.org_x - _x,
+				flip = 0,
+				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 ) {
+				drag_time = Date.now() - 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._moveLeft( this.next_img ,  this.window_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._moveLeft( this.prev_img , -this.window_width + 'px' );
+						this._attach( this.index - 1, this.prev_img );
+					}
+
+					this.direction = -1;
+				}
+			}
+
+			sec = this.options.duration;
+			self = this;
+
+			this.moving = true;
+
+			setTimeout( function () {
+				self.moving = false;
+			}, sec - 25 );
+
+			this._moveLeft( this.cur_img, 0 + 'px', sec );
+			if ( this.next_img.length ) {
+				this._moveLeft( this.next_img, this.window_width + 'px', sec );
+			}
+			if ( this.prev_img.length ) {
+				this._moveLeft( this.prev_img, -this.window_width + 'px', 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;
+
+				self.org_time = Date.now();
+			} );
+
+			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' );
+		},
+		_setTranslateposition : function ( $ele, value ) {
+			var translate,
+				cssArray = null,
+				self = this;
+
+			if ( $.support.cssTransform3d ) {
+				translate = "translate3d(" + value + ", 0px, 0px)";
+			} else {
+				translate = "translate(" + value + ", 0px)";
+			}
+			cssArray = {"-moz-transform": translate,
+					"-webkit-transform": translate,
+					"-ms-transform": translate,
+					"-o-transform": translate,
+					"transform": translate};
+
+			$ele.css(cssArray);
+			return $ele;
+		},
+		_hidePrevNext : function() {
+			var self = this;
+
+			if( self.next_img ) {
+				self.next_img.css( "visibility", "hidden" );
+			}
+			if( self.prev_img ) {
+				self.prev_img.css( "visibility", "hidden" );
+			}
+
+		},
+		_hideCur : function() {
+			var self = this;
+			if( self.cur_img ) {
+				self.cur_img.css( "visibility", "hidden" );
+			}
+		},
+		_moveLeft : function ( $ele , value , duration ) {
+			var translate,
+				transition = "",
+				cssArray = null,
+				self = this;
+
+			if ( $.support.cssTransform3d ) {
+				translate = "translate3d(" + value + ", 0px, 0px)";
+			} else {
+				translate = "translate(" + value + ", 0px)";
+			}
+			if( duration !== undefined ) {
+				transition =  "-webkit-transform " + (duration / 1000)+ "s ease";
+			}
+			cssArray = {"-moz-transform": translate,
+					"-webkit-transform": translate,
+					"-ms-transform": translate,
+					"-o-transform": translate,
+					"transform": translate};
+			if( transition !== "" ) {
+				cssArray["-webkit-transition"] = transition ;
+				if( value == "0px" ) {
+					$ele.one( 'webkitTransitionEnd', self._hidePrevNext );
+				} else {
+					$ele.one( 'webkitTransitionEnd', self._hideCur );
+				}
+			}
+			if( value == "0px" ) {
+				$ele.css( "visibility", "visible" );
+			}
+
+			$ele.css(cssArray);
+			return $ele;
+		},
+		_show: function () {
+			/* resizing */
+			this.window_width = $( window ).width();
+			this.max_width = this._get_width();
+			this.max_height = this._get_height();
+			this.container.css( 'height', this.max_height );
+
+			this.cur_img = $( 'div' ).find( '.ui-gallery-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 );
+
+			this.cur_img.css( 'visibility', 'visible' );
+			if ( this.prev_img.length ) {
+				this._setTranslateposition( this.prev_img, -this.window_width + 'px');
+			}
+
+			this._moveLeft( this.cur_img, '0px');
+			if ( this.next_img.length ) {
+				this._setTranslateposition( this.next_img, this.window_width + 'px' );
+			}
+		},
+
+		show: function () {
+			if ( !this.images.length ) {
+				return;
+			}
+
+			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_width: function () {
+			return $( this.element ).width();
+		},
+
+		_get_height: function () {
+			var $page = $( this.element ).parentsUntil( 'ui-page' ),
+				$content = $page.children( '.ui-content' ),
+				header_h = $page.children( '.ui-header' ).outerHeight() || 0,
+				footer_h = $page.children( '.ui-footer' ).outerHeight() || 0,
+				padding = parseFloat( $content.css( 'padding-top' ) )
+					+ parseFloat( $content.css( 'padding-bottom' ) ),
+				content_h = $( window ).height() - header_h - footer_h - padding;
+
+			return content_h;
+		},
+
+		_create: function () {
+			var temp_img,
+				self = this,
+				index,
+				i = 0;
+
+			$( this.element ).wrapInner( '<div class="ui-gallery"></div>' );
+			$( this.element ).find( 'img' ).wrap( '<div class="ui-gallery-bg"></div>' );
+
+			this.container = $( this.element ).find('.ui-gallery');
+
+			temp_img = $( 'div' ).find( '.ui-gallery-bg:first' );
+
+			while ( temp_img.length ) {
+				this.images[i] = temp_img.find( 'img' );
+				temp_img = temp_img.next();
+				i++;
+			}
+
+			this._detach_all();
+
+			index = parseInt( $( this.element ).jqmData( 'index' ), 10 );
+			if ( !index ) {
+				index = 0;
+			}
+			if ( index < 0 ) {
+				index = 0;
+			}
+			if ( index >= this.images.length ) {
+				index = this.images.length - 1;
+			}
+
+			this.index = index;
+
+			this.align_type = $( this.element ).jqmData( 'vertical-align' );
+
+			$.extend( this, {
+				_globalHandlers: [
+					{
+						src: $( window ),
+						handler: {
+							orientationchange: $.proxy( this, "_orientationHandler" ),
+							resize: $.proxy( this, "_resizeHandler" )
+						}
+					}
+				]
+			});
+
+			$.each( this._globalHandlers, function( idx, value ) {
+				value.src.bind( value.handler );
+			});
+		},
+
+		_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-gallery-bg"></div>' );
+				temp_img = $( '<img src="' + image_file + '"></div>' );
+
+				bg_html.append( temp_img );
+				this.container.append( bg_html );
+				this.images.push( temp_img );
+			}
+
+			this._detach_all();
+		},
+		_resizeHandler: function() {
+			var self = this;
+			if( self.orientationEventFire ) {
+				self.refresh();
+				$( event.target ).trigger( "galleryorientationchanged", this );
+				self.orientationEventFire = false;
+			}
+		},
+		_orientationHandler: function() {
+			var self = this;
+			self.refresh();
+			self.orientationEventFire = true;
+		},
+		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();
+
+			return this.index;
+		},
+
+		add: function ( file ) {
+			this.images_hold.push( file );
+		},
+
+		remove: function ( index ) {
+			var temp_img;
+
+			if ( index === undefined ) {
+				index = this.index;
+			}
+
+			if ( index < 0 || index >= this.images.length ) {
+				return;
+			}
+
+			if ( 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._moveLeft( this.prev_img, -this.window_width + 'px' );
+						this._attach( 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._moveLeft( this.next_img, this.window_width + 'px' );
+						this._attach( index + 2, this.next_img );
+					}
+				}
+				this._moveLeft( this.cur_img, '0px', this.options.duration );
+
+			} else if ( index == this.index - 1 ) {
+				temp_img = this.prev_img;
+				this.prev_img = this.prev_img.prev();
+				if ( this.prev_img.length ) {
+					this._moveLeft( this.prev_img, -this.window_width + 'px' );
+					this._attach( index - 1, this.prev_img );
+				}
+				this.index--;
+
+			} else if ( index == this.index + 1 ) {
+				temp_img = this.next_img;
+				this.next_img = this.next_img.next();
+				if ( this.next_img.length ) {
+					this._moveLeft( this.next_img, this.window_width + 'px' );
+					this._attach( index + 1, this.next_img );
+				}
+
+			} else {
+				temp_img = $( 'div' ).find( '.ui-gallery-bg:eq(' + index + ')' );
+			}
+
+			this.images.splice( index, 1 );
+			temp_img.detach();
+		},
+
+		empty: function () {
+			this.images.splice( 0, this.images.length );
+			this.container.find('.ui-gallery-bg').detach();
+		},
+
+		length: function () {
+			return this.images.length;
+		},
+
+		value: function ( index ) {
+			if ( index === undefined ) {
+				return this.index;
+			}
+
+			this.refresh( index );
+		},
+
+		unbind: function() {
+			$.each( this._globalHandlers, function( idx, value ) {
+				value.src.unbind( value.handler );
+			});
+		},
+
+		destory: function() {
+			this.unbind();
+		}
+
+	}); /* End of widget */
+
+	// auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( e.target ).find( ":jqmData(role='gallery')" ).gallery();
+	});
+
+	$( document ).bind( "pageshow", function ( e ) {
+		$( e.target ).find( ":jqmData(role='gallery')" ).gallery( 'show' );
+	});
+
+	$( document ).bind( "pagebeforehide", function ( e ) {
+		$( e.target ).find( ":jqmData(role='gallery')" ).gallery( 'hide' );
+	} );
+
+	$( document ).bind( "pageremove", function ( e ) {
+		//unbind resize and orientationchange events
+		$( e.target ).find( ":jqmData(role='gallery')" ).gallery( 'unbind' );
+	});
+
+}( jQuery, this ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.gallery3d.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.gallery3d.js
new file mode 100644
index 0000000..cded9f4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.gallery3d.js
@@ -0,0 +1,1503 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: 3D photo gallery widget.
+//>>label: Gallery3d
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	"jqm/jquery.mobile.widget",
+	'libs/jquery.easing.1.3',
+	"libs/gl-matrix",
+	"./components/imageloader",
+	"./components/motionpath",
+	"./components/webgl"
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+	Flora License
+
+	Version 1.1, April, 2013
+
+	http://floralicense.org/license/
+
+	TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+	1. Definitions.
+
+	"License" shall mean the terms and conditions for use, reproduction,
+	and distribution as defined by Sections 1 through 9 of this document.
+
+	"Licensor" shall mean the copyright owner or entity authorized by
+	the copyright owner that is granting the License.
+
+	"Legal Entity" shall mean the union of the acting entity and
+	all other entities that control, are controlled by, or are
+	under common control with that entity. For the purposes of
+	this definition, "control" means (i) the power, direct or indirect,
+	to cause the direction or management of such entity,
+	whether by contract or otherwise, or (ii) ownership of fifty percent (50%)
+	or more of the outstanding shares, or (iii) beneficial ownership of
+	such entity.
+
+	"You" (or "Your") shall mean an individual or Legal Entity
+	exercising permissions granted by this License.
+
+	"Source" form shall mean the preferred form for making modifications,
+	including but not limited to software source code, documentation source,
+	and configuration files.
+
+	"Object" form shall mean any form resulting from mechanical
+	transformation or translation of a Source form, including but
+	not limited to compiled object code, generated documentation,
+	and conversions to other media types.
+
+	"Work" shall mean the work of authorship, whether in Source or Object form,
+	made available under the License, as indicated by a copyright notice
+	that is included in or attached to the work (an example is provided
+	in the Appendix below).
+
+	"Derivative Works" shall mean any work, whether in Source or Object form,
+	that is based on (or derived from) the Work and for which the editorial
+	revisions, annotations, elaborations, or other modifications represent,
+	as a whole, an original work of authorship. For the purposes of this License,
+	Derivative Works shall not include works that remain separable from,
+	or merely link (or bind by name) to the interfaces of, the Work and
+	Derivative Works thereof.
+
+	"Contribution" shall mean any work of authorship, including the original
+	version of the Work and any modifications or additions to that Work or
+	Derivative Works thereof, that is intentionally submitted to Licensor
+	for inclusion in the Work by the copyright owner or by an individual or
+	Legal Entity authorized to submit on behalf of the copyright owner.
+	For the purposes of this definition, "submitted" means any form of
+	electronic, verbal, or written communication sent to the Licensor or
+	its representatives, including but not limited to communication on
+	electronic mailing lists, source code control systems, and issue
+	tracking systems that are managed by, or on behalf of, the Licensor
+	for the purpose of discussing and improving the Work, but excluding
+	communication that is conspicuously marked or otherwise designated
+	in writing by the copyright owner as "Not a Contribution."
+
+	"Contributor" shall mean Licensor and any individual or Legal Entity
+	on behalf of whom a Contribution has been received by Licensor and
+	subsequently incorporated within the Work.
+
+	"Tizen Certified Platform" shall mean a software platform that complies
+	with the standards set forth in the Tizen Compliance Specification
+	and passes the Tizen Compliance Tests as defined from time to time
+	by the Tizen Technical Steering Group and certified by the Tizen
+	Association or its designated agent.
+
+	2. Grant of Copyright License.  Subject to the terms and conditions of
+	this License, each Contributor hereby grants to You a perpetual,
+	worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+	copyright license to reproduce, prepare Derivative Works of,
+	publicly display, publicly perform, sublicense, and distribute the
+	Work and such Derivative Works in Source or Object form.
+
+	3. Grant of Patent License.  Subject to the terms and conditions of
+	this License, each Contributor hereby grants to You a perpetual,
+	worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+	(except as stated in this section) patent license to make, have made,
+	use, offer to sell, sell, import, and otherwise transfer the Work
+	solely as incorporated into a Tizen Certified Platform, where such
+	license applies only to those patent claims licensable by such
+	Contributor that are necessarily infringed by their Contribution(s)
+	alone or by combination of their Contribution(s) with the Work solely
+	as incorporated into a Tizen Certified Platform to which such
+	Contribution(s) was submitted. If You institute patent litigation
+	against any entity (including a cross-claim or counterclaim
+	in a lawsuit) alleging that the Work or a Contribution incorporated
+	within the Work constitutes direct or contributory patent infringement,
+	then any patent licenses granted to You under this License for that
+	Work shall terminate as of the date such litigation is filed.
+
+	4. Redistribution.  You may reproduce and distribute copies of the
+	Work or Derivative Works thereof pursuant to the copyright license
+	above, in any medium, with or without modifications, and in Source or
+	Object form, provided that You meet the following conditions:
+
+	  1. You must give any other recipients of the Work or Derivative Works
+		 a copy of this License; and
+	  2. You must cause any modified files to carry prominent notices stating
+		 that You changed the files; and
+	  3. You must retain, in the Source form of any Derivative Works that
+		 You distribute, all copyright, patent, trademark, and attribution
+		 notices from the Source form of the Work, excluding those notices
+		 that do not pertain to any part of the Derivative Works; and
+	  4. If the Work includes a "NOTICE" text file as part of its distribution,
+		 then any Derivative Works that You distribute must include a readable
+		 copy of the attribution notices contained within such NOTICE file,
+		 excluding those notices that do not pertain to any part of
+		 the Derivative Works, in at least one of the following places:
+		 within a NOTICE text file distributed as part of the Derivative Works;
+		 within the Source form or documentation, if provided along with the
+		 Derivative Works; or, within a display generated by the Derivative Works,
+		 if and wherever such third-party notices normally appear.
+		 The contents of the NOTICE file are for informational purposes only
+		 and do not modify the License.
+
+	You may add Your own attribution notices within Derivative Works
+	that You distribute, alongside or as an addendum to the NOTICE text
+	from the Work, provided that such additional attribution notices
+	cannot be construed as modifying the License. You may add Your own
+	copyright statement to Your modifications and may provide additional or
+	different license terms and conditions for use, reproduction, or
+	distribution of Your modifications, or for any such Derivative Works
+	as a whole, provided Your use, reproduction, and distribution of
+	the Work otherwise complies with the conditions stated in this License.
+
+	5. Submission of Contributions. Unless You explicitly state otherwise,
+	any Contribution intentionally submitted for inclusion in the Work
+	by You to the Licensor shall be under the terms and conditions of
+	this License, without any additional terms or conditions.
+	Notwithstanding the above, nothing herein shall supersede or modify
+	the terms of any separate license agreement you may have executed
+	with Licensor regarding such Contributions.
+
+	6. Trademarks.  This License does not grant permission to use the trade
+	names, trademarks, service marks, or product names of the Licensor,
+	except as required for reasonable and customary use in describing the
+	origin of the Work and reproducing the content of the NOTICE file.
+
+	7. Disclaimer of Warranty. Unless required by applicable law or
+	agreed to in writing, Licensor provides the Work (and each
+	Contributor provides its Contributions) on an "AS IS" BASIS,
+	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+	implied, including, without limitation, any warranties or conditions
+	of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+	PARTICULAR PURPOSE. You are solely responsible for determining the
+	appropriateness of using or redistributing the Work and assume any
+	risks associated with Your exercise of permissions under this License.
+
+	8. Limitation of Liability. In no event and under no legal theory,
+	whether in tort (including negligence), contract, or otherwise,
+	unless required by applicable law (such as deliberate and grossly
+	negligent acts) or agreed to in writing, shall any Contributor be
+	liable to You for damages, including any direct, indirect, special,
+	incidental, or consequential damages of any character arising as a
+	result of this License or out of the use or inability to use the
+	Work (including but not limited to damages for loss of goodwill,
+	work stoppage, computer failure or malfunction, or any and all
+	other commercial damages or losses), even if such Contributor
+	has been advised of the possibility of such damages.
+
+	9. Accepting Warranty or Additional Liability. While redistributing
+	the Work or Derivative Works thereof, You may choose to offer,
+	and charge a fee for, acceptance of support, warranty, indemnity,
+	or other liability obligations and/or rights consistent with this
+	License. However, in accepting such obligations, You may act only
+	on Your own behalf and on Your sole responsibility, not on behalf
+	of any other Contributor, and only if You agree to indemnify,
+	defend, and hold each Contributor harmless for any liability
+	incurred by, or claims asserted against, such Contributor by reason
+	of your accepting any such warranty or additional liability.
+
+	END OF TERMS AND CONDITIONS
+
+	APPENDIX: How to apply the Flora License to your work
+
+	To apply the Flora License to your work, attach the following
+	boilerplate notice, with the fields enclosed by brackets "[]"
+	replaced with your own identifying information. (Don't include
+	the brackets!) The text should be enclosed in the appropriate
+	comment syntax for the file format. We also recommend that a
+	file or class name and description of purpose be included on the
+	same "printed page" as the copyright notice for easier
+	identification within third-party archives.
+
+	   Copyright [yyyy] [name of copyright owner]
+
+	   Licensed under the Flora License, Version 1.1 (the "License");
+	   you may not use this file except in compliance with the License.
+	   You may obtain a copy of the License at
+
+		   http://floralicense.org/license/
+
+	   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.
+
+
+ * Authors: Hyunsook Park <hyunsook.park@samsung.com>
+ *			Wonseop Kim <wonseop.kim@samsung.com>
+ */
+
+/**
+ *	The gallery3d widget displays images along a curved path on a 3-dimensional coordinate system.
+ *	To improve performance, the size of image(s) displayed on the screen should be a square(under
+ *	128X128 pixel) as possible. But if a user can't resize the images, this widget supports an image
+ *	resizing feature and he/she can use it with "data-thumbnail-cache" option. ("data-thumbnail-cache"
+ *	option resizes the gallery images under 128x128 pixels and stores the images on a local storage.
+ *	So when a gallery3D widget is re-launched, the widget reuse the storage and a user can improve
+ *	launching time. A browser or web runtime engine should support "Web Storage" feature to use that
+ *	option.)
+ *
+ *	HTML Attributes:
+ *
+ *		data-thumbnail-cache : Determines whether to cache and resize images.
+ *
+ *	APIs:
+ *
+ *		next ( void )
+ *			: This method moves each image forward one by one.
+ *		prev ( void )
+ *			: This method moves each image backward one by one.
+ *		select ( [number] )
+ *			: When the "select" method is called with an argument, the method selects the image of given index.
+ *			If the method is called with no argument, it will return the Javascript object having "src"
+ *			attribute having the selected image's URL.
+ *		add ( object or string [, number] )
+ *			This method adds an image to Gallery3D widget.
+ *			If the second argument isn't inputted, the image is added at the 0th position.
+ *		remove ( [number] )
+ *			: This method deletes an image from Gallery3d widget.
+ *			The argument defines the index of the image to be deleted.
+ *			If an argument isn't inputted, it removes current image.
+ *		clearThumbnailCache ( void )
+ *			: This method clears the cache data of all images when thumbnailCache option is set as 'true'.
+ *		refresh ( void )
+ *			: This method updates and redraws current widget.
+ *		empty ( void )
+ *			: This method removes all of images from Gallery3D widget.
+ *		length ( void )
+ *			: This method gets the number of images.
+ *
+ *	Events:
+ *
+ *		select : Triggered when an image is selected.
+ *
+ *	Examples:
+ *
+ *		<script>
+ *			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+ *				$( "#gallery3d" ).gallery3d( "add", "01.jpg" );
+ *			});
+ *		</script>
+ *		<div id="gallery3d" data-role="gallery3d"></div>
+ */
+
+/**
+	@class Gallery3D
+	The gallery3d widget displays images along a curved path on a 3-dimensional coordinate system.
+	<br/><br/>To add an gallery3d widget to the application, use the following code:
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", "01.jpg" );
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@property {Boolean} data-thumbnail-cache
+	Determines whether to cache and resize images.
+	To improve performance, the size of image(s) displayed on the screen should be a square (under 128X128 pixels).
+	"data-thumbnail-cache" option resizes the gallery images under 128x128 pixels and stores the images on a local storage.
+	So when a gallery3D widget is re-launched, the widget reuses the storage and the launching time can be improved.
+	A browser or web runtime engine must support "Web Storage" feature to use this option.
+*/
+/**
+	@event select
+	Triggered when an image is selected.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } );
+			}).on( "select", function ( event, data, index ) {
+				// Handle the select event
+				var urlOfImage = data.src, indexOfImage = index;
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@method next
+	This method moves each image forward one by one.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } )
+					.gallery3d( "next" );
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@method prev
+	This method moves each image backward one by one.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } )
+					.gallery3d( "prev" );
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@method select
+	When the "select" method is called with an argument, the method selects the image of given index.
+	If the method is called with no argument, it will return the Javascript object having "src" attribute having the selected image's URL.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } );
+				var selectedImage = $("#gallery3d"). gallery3d( "select" );
+				// selectedImage = { src: "3.jpg" };
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@method add
+	This method adds an image to Gallery3D widget.
+	The first argument is a Javascript object having a "src" attribute or a string of image's path.
+	The second argument is an index of images.
+	If second argument isn't inputted, the image is added at the 0th position.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", "2.jpg", 1 );
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@method remove
+	This method deletes an image from Gallery3d widget.
+	The argument defines the index of the image to be deleted.
+	If an argument isn't inputted, it removes current image.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } );
+
+				$( "#gallery3d" ).gallery3d( "remove" );
+				$( "#gallery3d" ).gallery3d( "remove", 1 );
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@method clearThumbnailCache
+	This method clears the cache data of all images when thumbnailCache option is set as 'true'
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } );
+
+				$( "#gallery3d" ).gallery3d( "clearThumbnailCache" );
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d" data-thumbnail-cache="true"></div>
+*/
+/**
+	@method refresh
+	This method updates and redraws current widget.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } );
+
+				$( "#gallery3d" ).gallery3d( "refresh" );
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@method empty
+	This method removes all of images from Gallery3D widget.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } );
+
+				$( "#gallery3d" ).gallery3d( "empty" );
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@method length
+	This method gets the number of images.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } );
+
+				var imagesLength = $( "#gallery3d" ).gallery3d( "length" );
+				// imagesLength = 3;
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+
+( function ( $, document, window, undefined ) {
+	function Node() {
+		this.vertices = [
+			-1.0, -1.0, 0.0,
+			1.0, -1.0, 0.0,
+			1.0,  1.0, 0.0,
+			-1.0,  1.0, 0.0
+		];
+		this.textureCoords = [
+			1.0, 0.0,
+			0.0, 0.0,
+			0.0, 1.0,
+			1.0, 1.0
+		];
+		this.normalVectors = [
+			0.0, 0.0, 1.0,
+			0.0, 0.0, 1.0,
+			0.0, 0.0, 1.0,
+			0.0, 0.0, 1.0
+		];
+		this.texture = null;
+		this.textureBuffer = null;
+		this.textureBufferItemSize = 0;
+		this.mashOrder = [];
+		this.mvMatrix = null;
+		this.level = -1;
+		this.targetLevel = 0;
+		this.drawable = false;
+		this.image = null;
+		this.imageID = 0;
+	}
+
+	var isPreInitailization  = false,
+		glMatrix = {},
+		VERTEX_SHADER,
+		FRAGMENT_SHADER,
+		GlArray32,
+		GlArray16,
+		preInitialize = function () {
+			if ( isPreInitailization ) {
+				return;
+			}
+
+			window.initGlMatrix( glMatrix );
+
+			VERTEX_SHADER = [
+				"attribute vec3 aVertexPosition;",
+				"attribute vec2 aTextureCoord;",
+				"attribute vec3 aVertexNormal;",
+				"uniform mat4 uMoveMatrix;",
+				"uniform mat4 uPerspectiveMatrix;",
+				"uniform mat3 nNormalMatrix;",
+				"uniform vec3 uAmbientColor;",
+				"uniform vec3 uLightDirection;",
+				"uniform vec3 uDirectionColor;",
+				"uniform vec3 uLightDirection_first;",
+				"uniform vec3 uLightDirection_second;",
+				"varying vec2 vTextureCoord;",
+				"varying vec3 vLightWeight;",
+				"varying vec4 vFogWeight;",
+
+				"void main(void) {",
+				"	vec4 v_Position = uMoveMatrix * vec4(aVertexPosition, 1.0);",
+				"	gl_Position = uPerspectiveMatrix * v_Position;",
+				"	vTextureCoord = aTextureCoord;",
+				"	float fog = 1.0 - ((gl_Position.z + 1.5) / 60.0);",
+				"	vFogWeight = clamp( vec4( fog, fog, fog, 1.0), 0.6, 1.0);",
+				"	vec3 transNormalVector = nNormalMatrix * aVertexNormal;",
+
+				"	float vLightWeightFirst = 0.0;",
+				"	float vLightWeightSecond = max( dot(transNormalVector, uLightDirection_second), 0.0 );",
+
+				"	vLightWeight = uAmbientColor + uDirectionColor * vLightWeightSecond;",
+				"}"
+			].join( "\n" );
+
+			FRAGMENT_SHADER = [
+				"precision mediump float;",
+				"varying vec2 vTextureCoord;",
+				"varying vec3 vLightWeight;",
+				"uniform sampler2D uSampler;",
+				"varying vec4 vFogWeight;",
+
+				"void main(void) {",
+				"	vec4 TextureColor;",
+				"	if ( vTextureCoord.s <= 0.01 || vTextureCoord.s >= 0.99 || vTextureCoord.t <= 0.01 || vTextureCoord.t >= 0.99 ) {",
+				"		TextureColor = vec4(1.0, 1.0, 1.0, 0.5);",
+				"	} else {",
+				"		TextureColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));",
+				"	}",
+				"	TextureColor *= vFogWeight;",
+				"	gl_FragColor = vec4(TextureColor.rgb * vLightWeight, TextureColor.a);",
+				"}"
+			].join( "\n" );
+
+			GlArray32 = ( typeof window.Float32Array !== "undefined" ?
+					window.Float32Array :
+						( typeof window.WebGLFloatArray !== "undefined" ? window.WebGLFloatArray : Array ) );
+
+			GlArray16 = ( typeof window.Uint16Array !== "undefined" ? window.Uint16Array : Array );
+
+			isPreInitailization = true;
+		},
+		degreeToRadian = function ( degree ) {
+			return degree * Math.PI / 180;
+		},
+		getContext3D = function ( canvas ) {
+			var gl, i,
+				contextNames = [ "experimental-webgl", "webkit-3d", "webgl", "moz-webgl" ];
+
+			for ( i = 0; i < contextNames.length; i += 1 ) {
+				try {
+					gl = canvas.getContext( contextNames[i] );
+					if ( gl ) {
+						break;
+					}
+				} catch ( e ) {
+					$( canvas ).html( "Unfortunately, there's a WebGL compatibility problem. </br> You may want to check your system settings." );
+					return;
+				}
+			}
+			return gl;
+		},
+		requestAnimationFrame = function ( callback ) {
+			var id = window.setTimeout( callback, 1000 / 60 );
+			return id;
+		},
+		cancelAnimationFrame = function ( id ) {
+			window.clearTimeout( id );
+		};
+
+	$.widget( "tizen.gallery3d", $.mobile.widget, {
+		options: {
+			thumbnailCache:	false
+		},
+
+		_MAX_ITEM_COUNT: 28,
+		_ANIMATION_END: 999,
+		_DURATION_DEFAULT: 300,
+		_DURATION_FIRST: 1600,
+		_VIEWPORT_WIDTH: 1024,
+		_VIEWPORT_HEIGHT: 456,
+		_DIRECTION_LEFT: -1,
+		_DIRECTION_RIGHT: +1,
+
+		_gl: null,
+		_shaderProgram : null,
+		_positionBuffer : null,
+		_textureCoordBuffer : null,
+		_normalVectorBuffer : null,
+		_nodes: null,
+		_pMatrix : null,
+		_animationID: 0,
+		_dragInterval : 0,
+		_startTime : 0,
+		_sumTime : 0,
+		_lightsPositionStack : [
+			[0.0, 0.0, -1.0],	// back
+			[-0.2, 0.0, 0.7]	// front
+		],
+		_path: null,
+		_swipeThresholdOfBasetimeGap: ( $.support.touch ? 30 : 70 ),
+		_swipeThresholdOfSensitivity: ( $.support.touch ? 2.0 : 10.0 ),
+		_canvas: null,
+		_imageList: [],
+		_maxDrawLength: 0,
+		_firstImageNumber: 0,
+		_lastImageNumber: 0,
+		_operationQueue: [],
+
+		_create: function () {
+			var self = this,
+				view = self.element,
+				option = self.options;
+
+			preInitialize();
+
+			self._canvas = $( "<canvas class='ui-gallery3d-canvas'></canvas>" );
+
+			view.addClass( "ui-gallery3d" ).append( self._canvas );
+			self._addBehavier();
+
+			self._dragInterval = 1000 / 30;	// 30fps
+
+			$.each( self.options, function ( key, value ) {
+				self.options[ key ] = undefined;
+				self._setOption( key, value );
+			});
+		},
+
+		destroy: function () {
+			this._final();
+			$.mobile.widget.prototype.destroy.call( this );
+		},
+
+		_setOption: function ( key, value ) {
+			switch ( key ) {
+			case "thumbnailCache" :
+				if ( typeof value === "string" ) {
+					value = ( value === "true" ) ? true : false;
+				} else {
+					value = !!value;
+				}
+				this._reset();
+				break;
+			}
+
+			$.mobile.widget.prototype._setOption.call( this, key, value );
+		},
+
+		_init: function ( canvas ) {
+			var self = this,
+				pathPoints = [
+					[40, 0, -48],
+					[-12, 0, -40],	// contorl Point of Point1
+					[24, 0, -9],		// contorl Point of Point2
+					[-5, 0, -5]
+				],
+				i;
+
+			canvas = canvas || self._canvas;
+
+			if ( !canvas ) {
+				return;
+			}
+
+			self._gl = self._gl || self._initGL( canvas[0] );
+			if ( !self._gl ) {
+				return;
+			}
+
+			if ( !self._imageList ) {
+				return;
+			}
+
+			self._shaderProgram = self._shaderProgram || self._initShader( self._gl );
+			if ( !self._shaderProgram ) {
+				return;
+			}
+
+			if ( self._imageList.length > self._MAX_ITEM_COUNT ) {
+				self._firstImageNumber = self._imageList.length - 1;
+				self._lastImageNumber = self._MAX_ITEM_COUNT - 1;
+			}
+
+			self._nodes = self._initBuffers( self._gl, self._shaderProgram );
+
+			self._initTextures( self._gl, self._nodes );
+
+			self._path = $.motionpath( "bezier2d", {
+				points: pathPoints,
+				maxLevel: self._MAX_ITEM_COUNT
+			} );
+
+			for ( i = 0; i < self._nodes.length; i += 1 ) {
+				self._path.levels[i] = self._path.levels[i + 1] || 0;
+				self._nodes[i].level = i;
+			}
+
+			this._setPosition( self._ANIMATION_END, this._DIRECTION_RIGHT );
+
+			while ( this._operationQueue.length ) {
+				this._setPosition( self._ANIMATION_END, this._operationQueue.shift() );
+			}
+		},
+
+		_final: function ( canvas ) {
+			var self = this,
+				gl = self._gl;
+
+			if ( !gl ) {
+				return;
+			}
+
+			self._stop();
+
+			canvas = canvas || self._canvas;
+
+			$( self._nodes ).each( function ( i ) {
+				var node = self._nodes[i];
+				gl.deleteTexture( node.texture );
+				node.texture = null;
+			});
+			self._nodes = null;
+
+			gl.deleteBuffer( self._positionBuffer );
+			self._positionBuffer = null;
+			gl.deleteBuffer( self._textureCoordBuffer );
+			self._textureCoordBuffer = null;
+			gl.deleteBuffer( self._normalVectorBuffer );
+			self._normalVectorBuffer = null;
+
+			$.webgl.shader.deleteShaders( gl );
+			gl.deleteProgram( self._shaderProgram );
+			self._shaderProgram = null;
+
+			self._gl = gl = null;
+		},
+
+		_addBehavier : function () {
+			var self = this,
+				view = self.element,
+				canvas = self._canvas,
+				touchStartEvt = ( $.support.touch ? "touchstart" : "mousedown" ),
+				touchMoveEvt = ( $.support.touch ? "touchmove" : "mousemove" ) + ".gallery3d",
+				touchEndEvt = ( $.support.touch ? "touchend" : "mouseup" ) + ".gallery3d",
+				$document = $( document );
+
+			canvas.on( "webglcontextlost", function ( e ) {
+				e.preventDefault();
+			}).on( "webglcontextrestored", function ( e ) {
+				self._init();
+			}).on( touchStartEvt, function ( e ) {
+				var i = 0,
+					startX = 0,
+					deltaMaxSteps = 20,
+					deltas = [ deltaMaxSteps ],
+					deltaTimes = [ deltaMaxSteps ],
+					deltaIndex = 0,
+					dragValue = 0,
+					dragDirection = false,
+					prevTime = 0;
+
+				e.preventDefault();
+				e.stopPropagation();
+
+				if ( self._imageList.length <= 1 ) {
+					return;
+				}
+
+				self._stop();
+
+				startX =  $.support.touch ? e.originalEvent.changedTouches[0].pageX : e.pageX;
+				prevTime = $.now();
+
+				for ( i = 0; i < deltaMaxSteps; i += 1 ) {
+					deltas[i] = startX;
+					deltaTimes[i] = $.now();
+				}
+
+				deltaIndex += 1;
+
+				view.on( touchMoveEvt, function ( e ) {
+					var x, dx, interval;
+
+					e.preventDefault();
+					e.stopPropagation();
+
+					x =  $.support.touch ? e.originalEvent.changedTouches[0].pageX : e.pageX;
+					dx = startX - x;
+
+					deltas[deltaIndex] = x;
+					deltaTimes[deltaIndex] = $.now();
+					interval = deltaTimes[deltaIndex] - prevTime;
+
+					deltaIndex = ( deltaIndex + 1 ) % deltaMaxSteps;
+
+					// Validation of drag
+					if ( Math.abs( dx ) >= 10 && interval >= self._dragInterval ) {
+						if ( dragDirection !== ( ( dx < 0 ) ? self._DIRECTION_RIGHT : self._DIRECTION_LEFT ) ) {
+							dragValue = 0;
+							dragDirection = ( dx < 0 ) ? self._DIRECTION_RIGHT : self._DIRECTION_LEFT;
+						}
+
+						dragValue += Math.abs( dx ) / 100;
+						if ( dragValue >= 1 ) {
+							self._setPosition( self._ANIMATION_END, dragDirection );
+							dragValue = 0;
+						} else {
+							self._setPosition( dragValue, dragDirection );
+						}
+						self._drawScene();
+						startX = x;
+						prevTime = $.now();
+					}
+				}).on( touchEndEvt, function ( e ) {
+					var baseTime = 0,
+						recent = -1,
+						index = 0,
+						previous = 0,
+						baseTimeRatio = 0,
+						fx = 0,
+						lastX = 0,
+						velocityX = 0,
+						dx = 0,
+						isSwipe = true,
+						direction;
+
+					e.preventDefault();
+					e.stopPropagation();
+
+					// Validation of swipe
+					baseTime = $.now() - self._swipeThresholdOfBasetimeGap;
+					lastX = $.support.touch ? e.originalEvent.changedTouches[0].pageX : e.pageX;
+					dx = startX - lastX;
+					startX = 0;
+					for ( i = 0; i < deltaMaxSteps; i += 1 ) {
+						index = ( deltaIndex + i ) % deltaMaxSteps;
+						if ( deltaTimes[index] > baseTime ) {
+							recent = index;
+							break;
+						}
+					}
+					if ( recent < 0 ) {
+						isSwipe = false;
+					}
+
+					if ( isSwipe ) {
+						previous = recent;
+						for ( i = 0; i < deltaMaxSteps; i += 1 ) {
+							previous = ( previous - 1 + deltaMaxSteps ) % deltaMaxSteps;
+							if ( deltaTimes[previous] < deltaTimes[recent] ) {
+								break;
+							}
+						}
+						// too slow or too fast
+						if ( i === deltaMaxSteps || baseTime < deltaTimes[previous] ) {
+							isSwipe = false;
+						}
+					}
+
+					if ( isSwipe ) {
+						baseTimeRatio = ( baseTime - deltaTimes[previous] ) / ( deltaTimes[recent] - deltaTimes[previous] );
+						fx = ( 1.0 - baseTimeRatio ) * deltas[previous] + baseTimeRatio * deltas[recent];
+						if ( Math.abs( fx - lastX ) < self._swipeThresholdOfSensitivity ) {
+							fx = lastX;
+						}
+						velocityX = parseInt( ( lastX - fx ) / ( $.now() - baseTime ), 10 );
+					}
+
+					if ( isSwipe && velocityX ) {
+						direction = ( velocityX < 0 ) ? self._DIRECTION_LEFT : self._DIRECTION_RIGHT;
+						self._run( direction, Math.abs( velocityX ), dragValue );
+					} else if ( dragDirection !== 0 && dragValue ) {
+						self._animate( null, self._DURATION_DEFAULT * ( 1 - dragValue ), dragDirection, 0, dragValue );
+					}
+
+					view.off( ".gallery3d" );
+					$document.off( ".gallery3d" );
+				});
+
+				$document.on( touchMoveEvt + " " + touchEndEvt, function () {
+					view.trigger( touchEndEvt );
+				});
+			});
+		},
+
+		// ----------------------------------------------------------
+		// WebGL
+		// ----------------------------------------------------------
+		_initGL: function ( canvas ) {
+			var self = this,
+				mat4 = glMatrix.mat4,
+				gl;
+
+			gl = getContext3D( canvas );
+			if ( !gl ) {
+				return null;
+			}
+
+			gl.enable( gl.BLEND );
+			gl.blendFunc( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA );
+
+			gl.enable( gl.DEPTH_TEST );
+			gl.depthFunc( gl.LEQUAL );
+
+			canvas.width = self._VIEWPORT_WIDTH;
+			canvas.height = self._VIEWPORT_HEIGHT;
+			gl.viewportWidth = canvas.width;
+			gl.viewportHeight = canvas.height;
+			gl.viewport( 0, 0, gl.viewportWidth, gl.viewportHeight );
+			self._pMatrix = mat4.create();
+			mat4.perspective( 40, gl.viewportWidth / gl.viewportHeight, 0.1, 10000.0, self._pMatrix );
+
+			gl.clearColor( 0.15, 0.15, 0.15, 1.0 );
+			gl.clear( gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT );
+
+			return gl;
+		},
+
+		_initShader : function ( gl ) {
+			var self = this,
+				shaderProgram;
+
+			shaderProgram = $.webgl.shader.addShaderProgram( self._gl, VERTEX_SHADER, FRAGMENT_SHADER );
+			gl.useProgram( shaderProgram );
+
+			shaderProgram.vertexPositionAttr = gl.getAttribLocation( shaderProgram, "aVertexPosition" );
+			gl.enableVertexAttribArray( shaderProgram.vertexPositionAttr );
+
+			shaderProgram.textureCoordAttr = gl.getAttribLocation( shaderProgram, "aTextureCoord" );
+			gl.enableVertexAttribArray( shaderProgram.textureCoordAttr );
+
+			// Set light normal vectors for lighting~
+			shaderProgram.vertexNormalAttr = gl.getAttribLocation( shaderProgram, "aVertexNormal" );
+			gl.enableVertexAttribArray( shaderProgram.vertexNormalAttr );
+
+			shaderProgram.perspectiveMU = gl.getUniformLocation( shaderProgram, "uPerspectiveMatrix");
+			shaderProgram.transformMU = gl.getUniformLocation( shaderProgram, "uMoveMatrix");
+			shaderProgram.sampleUniform = gl.getUniformLocation( shaderProgram, "uSampler");
+
+			// Set light variables~
+			shaderProgram.normalMU = gl.getUniformLocation( shaderProgram, "nNormalMatrix");
+			shaderProgram.ambientColorU = gl.getUniformLocation( shaderProgram, "uAmbientColor");
+			shaderProgram.lightDirU_first = gl.getUniformLocation( shaderProgram, "uLightDirection_first");
+			shaderProgram.lightDirU_second = gl.getUniformLocation( shaderProgram, "uLightDirection_second");
+			shaderProgram.directionColorU = gl.getUniformLocation( shaderProgram, "uDirectionColor");
+
+			return shaderProgram;
+		},
+
+		_initBuffers: function ( gl, shaderProgram ) {
+			var self = this,
+				i = 0,
+				mashBase = 0,
+				vertices = [],
+				textureCoords = [],
+				normalVectors = [],
+				nodes = [],
+				maxDrawLength = self._MAX_ITEM_COUNT;
+
+			for ( i = 0; i < self._imageList.length + 1; i += 1 ) {
+				nodes[i] = new Node();
+				$.merge( vertices, nodes[i].vertices );
+				$.merge( textureCoords, nodes[i].textureCoords );
+				$.merge( normalVectors, nodes[i].normalVectors );
+
+				nodes[i].textureBuffer = gl.createBuffer();
+				gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, nodes[i].textureBuffer );
+				mashBase = i * 4;
+				nodes[i].meshOrder = [
+					mashBase, mashBase + 1, mashBase + 2,
+					mashBase + 2, mashBase + 3, mashBase
+				];
+				gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, new GlArray16( nodes[i].meshOrder ), gl.STATIC_DRAW );
+				gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, null ); // release buffer memory
+				nodes[i].textureBufferItemSize = 6;
+			}
+
+			self._positionBuffer = $.webgl.buffer.attribBufferData( gl, new GlArray32( vertices ) );
+			self._positionBuffer.itemSize = 3;
+
+			self._textureCoordBuffer = $.webgl.buffer.attribBufferData( gl, new GlArray32( textureCoords ) );
+			self._textureCoordBuffer.itemSize = 2;
+
+			self._normalVectorBuffer = $.webgl.buffer.attribBufferData( gl, new GlArray32( normalVectors ) ); // Vertex's normal vector for Direction light
+			self._normalVectorBuffer.itemSize = 3;
+
+			// Ambient light
+			gl.uniform3f( shaderProgram.ambientColorU, 0.1, 0.1, 0.1 );
+			// Direcntion light
+			gl.uniform3f( shaderProgram.directionColorU, 1.0, 1.0, 1.0 );
+
+			return nodes;
+		},
+
+		// ----------------------------------------------------------
+		// Texture
+		// ----------------------------------------------------------
+		_initTextures: function ( gl, nodes ) {
+			var self = this;
+
+			$( nodes ).each( function ( i ) {
+				var node = nodes[i],
+					url;
+
+				if ( !self._imageList[i] ) {
+					return false;
+				}
+
+				url = self._imageList[i].src;
+				node.texture = gl.createTexture();
+				self._loadImage( url, i, i, gl, nodes );
+			});
+		},
+
+		_loadImage: function ( url, i, imageID, gl, nodes ) {
+			var self = this,
+				isMipmap = false,
+				image,
+				node;
+
+			gl = gl || self._gl;
+			nodes = nodes || self._nodes;
+			isMipmap = isMipmap || false;
+			node = nodes[i];
+			node.image = node.image || new Image();
+			node.imageID = imageID;
+
+			$( node.image ).one( "load", function ( e ) {
+				self._bindTexture( gl, node, this, isMipmap );
+
+				if ( !self._animationID ) {
+					self._setPosition( 0, 0 );
+				}
+			});
+
+			if ( self.options.thumbnailCache ) {
+				$.imageloader.getThumbnail( url, function ( result ) {
+					if ( result === "NOT_FOUND_ERR" ) {
+						$.imageloader.setThumbnail( url, function ( result ) {
+							if ( result && result.length > 30 ) {
+								node.image.src = result;
+								isMipmap = true;
+							} else {
+								node.image.src = url;
+							}
+						});
+					} else if ( result && result.length > 30 ) {
+						node.image.src = result;
+						isMipmap = true;
+					} else {
+						node.image.src = url;
+					}
+				});
+			} else {
+				node.image.src = url;
+			}
+		},
+
+		_bindTexture: function ( gl, node, image, isMipmap ) {
+			if ( !node || !node.texture ) {
+				return;
+			}
+
+			gl.pixelStorei( gl.UNPACK_FLIP_Y_WEBGL, true );
+
+			gl.bindTexture( gl.TEXTURE_2D, node.texture );
+			gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image );
+
+			if ( isMipmap ) {
+				gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR );
+				gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST );
+				gl.generateMipmap( gl.TEXTURE_2D );
+			} else {
+				gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR );
+				gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR );
+			}
+
+			gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );
+			gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );
+
+			node.texture.loaded = true;
+
+			// release texture memory
+			gl.bindTexture( gl.TEXTURE_2D, null );
+		},
+
+		// ----------------------------------------------------------
+		// rendering
+		// ----------------------------------------------------------
+		_setPosition: function ( progress, direction ) {
+			var self = this,
+				mat4 = glMatrix.mat4,
+				nodes = self._nodes,
+				imageList = self._imageList,
+				imageListLength = imageList.length,
+				itemCount = self._MAX_ITEM_COUNT,
+				displayLength = ( imageListLength > itemCount ) ? itemCount : imageListLength,
+				nextLevelLenth = 0,
+				i = 0,
+				t = 0,
+				position = 0,
+				angle = 0,
+				current = 0,
+				next = 0,
+				nextLevel = 0,
+				path = self._path,
+				nextImageID = 0;
+
+			nextLevelLenth = ( direction >= 0 ) ? displayLength + 1 : displayLength;
+
+			if ( !nodes[i].level ) {
+				nodes[i].level = displayLength;
+			}
+
+			for ( i = 0; i < displayLength; i += 1 ) {
+				if ( !nodes[i].mvMatrix ) {
+					nodes[i].mvMatrix = mat4.create();
+				}
+
+				if ( direction > 0 && nodes[i].level >= displayLength ) {
+					nodes[i].level = 0;
+				}
+
+				current = path.levels[nodes[i].level];
+				nextLevel = ( nodes[i].level + nextLevelLenth + direction ) % nextLevelLenth;
+				next = path.levels[nextLevel];
+
+				if ( imageListLength > itemCount ) {
+					if ( direction > 0 && nextLevel === 1
+							&& self._firstImageNumber !== nodes[i].imageID ) {
+						self._loadImage( imageList[self._firstImageNumber].src, i, self._firstImageNumber );
+					} else if ( direction < 0 && nextLevel === nextLevelLenth - 1
+							&& self._lastImageNumber !== nodes[i].imageID ) {
+						self._loadImage( imageList[self._lastImageNumber].src, i, self._lastImageNumber );
+					}
+				}
+
+				mat4.identity( nodes[i].mvMatrix );
+				mat4.translate( nodes[i].mvMatrix, [-2.0, -2.0, 1.0] );
+				mat4.rotate( nodes[i].mvMatrix, degreeToRadian( 19 ), [1, 0, 0] );
+
+				t = ( current + ( next - current ) * ( ( progress > 1 ) ? 1 : progress ) );
+
+				if ( progress >= self._ANIMATION_END ) {
+					nodes[i].level = nextLevel || displayLength;
+					t = path.levels[nodes[i].level];
+				}
+
+				if ( ( progress < self._ANIMATION_END )
+						&& ( direction <= 0 && nodes[i].level < 1 ) ) {
+					nodes[i].drawable = false;
+				} else {
+					nodes[i].drawable = true;
+				}
+
+				if ( progress === self._ANIMATION_END && nodes[i].level === 1 ) {
+					self.element.trigger( "select", [imageList[nodes[i].imageID], nodes[i].imageID] );
+				}
+
+				position = path.getPosition( t );
+				angle = path.getAngle( t );
+
+				mat4.translate( nodes[i].mvMatrix, position );
+				mat4.rotate( nodes[i].mvMatrix, angle, [0, 1, 0] );
+			}
+
+			if ( imageListLength > itemCount && progress >= self._ANIMATION_END ) {
+				self._firstImageNumber = ( self._firstImageNumber - direction ) % imageListLength;
+				if ( self._firstImageNumber < 0 ) {
+					self._firstImageNumber = imageListLength - 1;
+				}
+
+				self._lastImageNumber = ( self._lastImageNumber - direction ) % imageListLength;
+				if ( self._lastImageNumber < 0 ) {
+					self._lastImageNumber = imageListLength - 1;
+				}
+			}
+			self._drawScene();
+		},
+
+		_drawScene: function () {
+			if ( !this._gl || !this._shaderProgram ) {
+				return;
+			}
+
+			var self = this,
+				gl = self._gl,
+				shaderProgram = self._shaderProgram,
+				nodes = self._nodes,
+				nodesLength = nodes.length,
+				i;
+
+			gl.clear( gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT );
+
+			gl.bindBuffer( gl.ARRAY_BUFFER, self._positionBuffer );
+			gl.vertexAttribPointer( shaderProgram.vertexPositionAttr, self._positionBuffer.itemSize, gl.FLOAT, false, 0, 0 );
+
+			gl.bindBuffer( gl.ARRAY_BUFFER, self._textureCoordBuffer );
+			gl.vertexAttribPointer( shaderProgram.textureCoordAttr, self._textureCoordBuffer.itemSize, gl.FLOAT, false, 0, 0 );
+
+			gl.bindBuffer( gl.ARRAY_BUFFER, self._normalVectorBuffer );
+			gl.vertexAttribPointer( shaderProgram.vertexNormalAttr, self._normalVectorBuffer.itemSize, gl.FLOAT, false, 0, 0 );
+
+			for ( i = 0; i < nodesLength; i += 1 ) {
+				if ( nodes[i].drawable ) {
+					self._drawElement( self._pMatrix, nodes[i] );
+				}
+			}
+		},
+
+		_drawElement: function ( perspectiveMatrix, targetNode ) {
+			var self = this,
+				gl = self._gl,
+				vec3 = glMatrix.vec3,
+				mat3 = glMatrix.mat3,
+				mat4 = glMatrix.mat4,
+				shaderProgram = self._shaderProgram,
+				moveMatrix = targetNode.mvMatrix,
+				texture = targetNode.texture,
+				meshIndexBuffer = targetNode.textureBuffer,
+				meshIndexBufferItemSize = targetNode.textureBufferItemSize,
+				lightPositions = self._lightsPositionStack,
+				LightDir,
+				normalMatrix;
+
+			if ( !moveMatrix ) {
+				return;
+			}
+
+			gl.activeTexture( gl.TEXTURE0 );
+			if ( texture && texture.loaded ) {
+				gl.bindTexture( gl.TEXTURE_2D, texture );
+			}
+			gl.uniform1i( shaderProgram.sampleUniform, 0 );
+
+			LightDir = vec3.create();
+			vec3.normalize( lightPositions[0], LightDir );
+			vec3.scale( LightDir, -8 );
+			gl.uniform3fv( shaderProgram.lightDirU_first, LightDir );
+
+			vec3.normalize( lightPositions[1], LightDir );
+			vec3.scale( LightDir, -1 );
+			gl.uniform3fv( shaderProgram.lightDirU_second, LightDir );
+			gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, meshIndexBuffer );
+
+			gl.uniformMatrix4fv( shaderProgram.perspectiveMU, false, perspectiveMatrix );
+			gl.uniformMatrix4fv( shaderProgram.transformMU, false, moveMatrix );
+
+			normalMatrix = mat3.create();
+			mat4.toInverseMat3( moveMatrix, normalMatrix );
+			mat3.transpose( normalMatrix );
+			gl.uniformMatrix3fv( shaderProgram.normalMU, false, normalMatrix );
+
+			gl.drawElements( gl.TRIANGLES, meshIndexBufferItemSize, gl.UNSIGNED_SHORT, 0 );
+
+			// release buffer memory
+			gl.bindBuffer( gl.ARRAY_BUFFER, null );
+			gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, null );
+
+			// release texture memory
+			gl.bindTexture( gl.TEXTURE_2D, null );
+		},
+
+		// ----------------------------------------------------------
+		// Animation
+		// ----------------------------------------------------------
+		_animate: function ( easingType, duration, direction, repeatCount, startValue, _removeCount ) {
+			var self = this,
+				timeNow = $.now(),
+				progress,
+				removeCount = 0;
+
+			easingType = easingType || "linear";
+			startValue = startValue || 0;
+			_removeCount = _removeCount || 0;
+
+			if ( self._sumTime >= duration ) {
+				self._setPosition( self._ANIMATION_END, direction );
+				self._stop();
+				return;
+			}
+
+			if ( self._startTime === 0 ) {
+				self._startTime = timeNow;
+			} else {
+				self._sumTime = timeNow - self._startTime;
+				progress = $.easing[ easingType ]( self._sumTime / duration, self._sumTime, startValue, repeatCount + 1, duration );
+				removeCount = parseInt( Math.abs( progress ), 10 );
+
+				if ( _removeCount !== removeCount ) {
+					self._setPosition( self._ANIMATION_END, direction );
+					_removeCount = removeCount;
+
+					if ( ( repeatCount - _removeCount ) >= 0 ) {
+						self._animate( easingType, duration, direction, repeatCount, startValue, _removeCount );
+					} else {
+						self._stop();
+					}
+					return;
+				}
+
+				self._setPosition( progress - _removeCount, direction );
+			}
+
+			self._animationID = requestAnimationFrame( function () {
+				self._animate( easingType, duration, direction, repeatCount, startValue, _removeCount );
+			});
+		},
+
+		_run: function ( direction, repeatCount, startValue ) {
+			var self = this,
+				repeat = repeatCount || 0,
+				duration = self._DURATION_DEFAULT * ( repeat + 1 );
+
+			if ( !self._gl ) {
+				self._operationQueue.push( direction );
+				return;
+			}
+
+			if ( self._imageList.length <= 1 ) {
+				return;
+			}
+
+			startValue = startValue || 0;
+			duration = ( duration >= 0 ) ? duration : 0;
+
+			if ( self._animationID ) {
+				self._setPosition( self._ANIMATION_END, direction );
+				self._stop();
+			}
+
+			self._animate( "easeOutExpo", duration, direction, repeat, startValue );
+		},
+
+		_reset: function () {
+			if ( !this._canvas || !this._gl ) {
+				return;
+			}
+
+			this._final();
+			this._init();
+			this.refresh();
+		},
+
+		_stop: function () {
+			if ( this._animationID ) {
+				cancelAnimationFrame( this._animationID );
+			}
+			this._animationID = 0;
+
+			this._startTime = 0;
+			this._sumTime = 0;
+		},
+
+		next: function () {
+			this._run( this._DIRECTION_LEFT , 0 );
+		},
+
+		prev: function () {
+			this._run( this._DIRECTION_RIGHT, 0 );
+		},
+
+		refresh: function () {
+			var view = this.element,
+				canvas = view.find( "canvas.ui-gallery3d-canvas" );
+
+			if ( canvas.width() !== view.width() ) {
+				canvas.width( view.width() );
+			}
+
+			if ( !this._animationID ) {
+				this._setPosition( 0, 0 );
+			}
+		},
+
+		select: function ( index ) {
+			var nodes = this._nodes,
+				repeat,
+				i,
+				imageID,
+				object = null,
+				target = 0,
+				direction = 0;
+
+			if ( index && this._animationID ) {
+				this._stop();
+			}
+
+			for ( i in nodes ) {
+				if ( nodes[i].level === 1 ) {
+					object = this._imageList[ nodes[i].imageID ];
+					imageID = nodes[i].imageID;
+					break;
+				}
+			}
+
+			if ( !index ) {
+				return object;
+			}
+
+			if ( index < 0 && index >= this._imageList.length ) {
+				return;
+			}
+
+			target = index - imageID;
+			direction = ( target > 0 ) ? this._DIRECTION_LEFT
+				: ( ( target < 0 ) ? this._DIRECTION_RIGHT : 0 );
+			if ( direction ) {
+				this._run( direction, Math.abs( target ) - 1  );
+			}
+		},
+
+		add: function ( item, index ) {
+			if ( !item ) {
+				return;
+			}
+
+			if ( typeof item === "string" ) {
+				item = { "src" : item };
+			}
+
+			index = index || 0;
+			if ( typeof index !== "number" && index < 0
+					&& index >= this._imageList.length ) {
+				return;
+			}
+
+			this._imageList.splice( index, 0, item );
+			if ( this._gl ) {
+				this._reset();
+			}
+		},
+
+		remove: function ( index ) {
+			index = index || 0;
+			if ( typeof index !== "number" && index < 0
+					&& index >= this._imageList.length ) {
+				return;
+			}
+
+			this._imageList.splice( index, 1 );
+			if ( this._gl ) {
+				this._reset();
+			}
+		},
+
+		clearThumbnailCache: function () {
+			if ( !this._nodes || ( this._nodes.length <= 0 ) ) {
+				return;
+			}
+
+			var i, url;
+			for ( i = 0; i < this._imageList.length; i += 1 ) {
+				url = this._imageList[i].src;
+				$.imageloader.removeThumbnail( url );
+			}
+		},
+
+		empty: function () {
+			this._imageList = [];
+			this._reset();
+		},
+
+		length: function () {
+			return this._imageList.length;
+		}
+	});
+
+	$( document ).on( "pagecreate create", function ( e ) {
+		$( ":jqmData(role='gallery3d')" ).gallery3d();
+	}).on( "pagechange", function ( e ) {
+		$( e.target ).find( ".ui-gallery3d" ).gallery3d( "refresh" );
+	});
+
+	$( window ).on( "resize orientationchange", function ( e ) {
+		$( ".ui-page-active" ).find( ".ui-gallery3d" ).gallery3d( "refresh" );
+	});
+
+} ( jQuery, document, window ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.listdivider.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.listdivider.js
new file mode 100644
index 0000000..1ad61cb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.listdivider.js
@@ -0,0 +1,91 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Divider listitem in listview
+//>>label: List divider
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	"jqm/jquery.mobile.widget"
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+* style : normal, check
+* option :
+*    - folded : decide to show divider press effect or not
+*    - line : decide to draw divider line or not
+*/
+/**
+	@class ListDivider
+	The list divider widget is used as a list separator for grouping lists. List dividers can be used in Tizen as described in the jQueryMobile documentation for list dividers.<br/>
+	To add a list divider widget to the application, use the following code:
+
+		<li data-role="list-divider" data-style="check">
+		<form><input type="checkbox" name="c2line-check1" /></form></li>
+
+	The list divider can define callbacks for events as described in the jQueryMobile documentation for list events. <br/> You can use methods with the list divider as described in the jQueryMobile documentation for list methods.
+
+	@since tizen2.0	
+*/
+/**
+	@property {String} data-style
+	Sets the style of the list divider. The style options are dialogue, check, expandable, and checkexpandable.
+*/
+
+(function ( $, undefined ) {
+	$.widget( "tizen.listdivider", $.mobile.widget, {
+		options: {
+			initSelector: ":jqmData(role='list-divider')",
+			folded : false,
+			listDividerLine : true
+		},
+
+		_create: function () {
+
+			var $listdivider = this.element,
+				openStatus = true,
+				expandSrc,
+				listDividerLine = true,
+				style = $listdivider.attr( "data-style" );
+
+			if ( $listdivider.data("line") === false ) {
+				this.options.listDividerLine = false;
+			}
+
+			if ( $listdivider.data("folded") === true ) {
+				this.options.folded = true;
+			}
+
+			if ( style == undefined || style === "normal" || style === "check" ) {
+				if ( this.options.folded ) {
+					$listdivider.buttonMarkup();
+				} else {
+					$listdivider.wrapInner("<span class='ui-btn-text'></span>");
+				}
+
+				if ( this.options.listDividerLine ) {
+					expandSrc = "<span class='ui-divider-normal-line'></span>";
+					if ( this.options.folded ) {
+						$( expandSrc ).appendTo( $listdivider.children( ".ui-btn-inner" ) );
+					} else {
+						$( expandSrc ).appendTo( $listdivider);
+					}
+				}
+			}
+
+			$listdivider.bind( "vclick", function ( event, ui ) {
+			/* need to implement expand/collapse divider */
+			});
+		}
+	});
+
+	//auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.listdivider.prototype.options.initSelector, e.target ).listdivider();
+	});
+}( jQuery ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.multimediaview.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.multimediaview.js
new file mode 100644
index 0000000..229f5fc
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.multimediaview.js
@@ -0,0 +1,787 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Shows multimedia and its controls
+//>>label: Multimedia view
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	'../jquery.mobile.tizen.scrollview'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+ * 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: Yonghwi Park <yonghwi0324.park@samsung.com>
+ *		 Wonseop Kim <wonseop.kim@samsung.com>
+*/
+
+/**
+ *
+ * MultiMediaView is a widget that lets the user view and handle multimedia contents.
+ * Video and audio elements are coded as standard HTML elements and enhanced by the 
+ * MultiMediaview to make them attractive and usable on a mobile device.
+ *
+ * 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-full-screen : Set a status that full-screen when inital start.
+ *				Default value is 'false'.
+ *
+ * APIs:
+ *			width( [number] )
+ *					: Get or set the width of widget.
+ *					The first argument is the width of widget.
+ *					If no first argument is specified, will act as a getter.
+ *			height( [number] )
+ *					: Get or set the height of widget.
+ *					The first argument is the height of widget.
+ *					If no first argument is specified, will act as a getter.
+ *			fullScreen( [boolean] )
+ *					: Get or Set the status of full-screen.
+ *					If no first argument is specified, will act as a getter.
+ *
+ * Events:
+ *
+ *			N/A
+ *
+ * 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>
+ *
+ */
+/**
+	@class MutimediaView
+	The multimedia view widget shows a player control that you can use to view and handle multimedia content. This widget uses the standard HTML video and audio elements, which have been enhanced for use on a mobile device.
+
+	To add a multimedia view widget to the application, use the following code:
+	
+		// Video player control
+		<video data-controls="true" style="width:100%;">
+		<source src="<VIDEO_FILE_URL>" type="video/mp4" /> Your browser does not support the video tag. </video>
+		// Audio player control
+		<audio data-controls="true" style="width:100%;"> <source src="<AUDIO_FILE_URL>" type="audio/mp3" /> Your browser does not support the audio tag.
+		</audio>
+*/
+/**
+	@property {Boolean} data-control
+	Sets the controls for the widget.
+	The default value is true. If the value is set to true, the widget uses its own player controls. If the value is set to false, the widget uses the browser's player controls.
+*/
+/**
+	@property {Boolean} data-full-screen
+	Defines whether the widget opens in the fullscreen view mode.
+	The default value is false.
+*/
+/**
+	@property {String} data-theme
+	Sets the widget theme.
+	If the value is not set, the parent control's theme is used
+*/
+/**
+	@method width
+	The width method is used to get (if no value is defined) or set the multimedia view widget width:
+		<video>
+			 <source src="test.mp4" type="video/mp4" />
+		</video>
+		$(".selector").multimediaview("width", [value]);
+*/
+/**
+	@method height
+	The height method is used to get (if no value is defined) or set the multimedia view widget height:
+		<video>
+			<source src="test.mp4" type="video/mp4" />
+		</video>
+		$(".selector").multimediaview("height", [value]);
+*/
+/**
+	@method fullScreen
+	The fullScreen method is used to get (if no value is defined) or set the full-screen mode of the multimedia view widget. If the value is true, the full-screen mode is used; otherwise the multimedia view widget runs in the normal mode.
+
+		<video>
+			<source src="test.mp4" type="video/mp4" />
+		</video>
+		$(".selector").multimediaview("fullScreen", [value]);
+*/
+( 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],
+				isVideo = ( viewElement.nodeName === "VIDEO" ),
+				option = self.options,
+				parentTheme = $.mobile.getInheritedTheme( view, "s" ),
+				theme = option.theme || parentTheme,
+				width = viewElement.style.getPropertyValue( "width" ) || "",
+				wrap = $( "<div class='ui-multimediaview-wrap ui-multimediaview-" + theme + "'>" ),
+				control = null;
+
+			$.extend( this, {
+				role: null,
+				controlTimer: null,
+				isVolumeHide: true,
+				backupView: null,
+				_reserveVolume: -1,
+				_isVideo: isVideo
+			});
+
+			view.addClass( "ui-multimediaview" );
+			control = self._createControl();
+			control.hide();
+
+			$( ".ui-button", control ).addClass( "ui-shadow ui-btn-corner-all" );
+			$( ".ui-volumecontrol .ui-handle", control ).addClass( "ui-shadow ui-btn-corner-circle" );
+
+			view.wrap( wrap ).after( control );
+
+			if ( isVideo ) {
+				control.addClass( "ui-multimediaview-video" );
+			} else {
+				self.width( width );
+				self.options.fullScreen = false;
+			}
+
+			if ( option.controls && view.attr( "controls" ) ) {
+				view.removeAttr( "controls" );
+			}
+
+			self._addEvent();
+		},
+
+		_resize: function () {
+			this._resizeFullscreen( this.options.fullScreen );
+			this._resizeControl();
+			this._updateSeekBar();
+			this._updateVolumeState();
+		},
+
+		_resizeControl: function () {
+			var self = this,
+				view = self.element,
+				viewElement = view[0],
+				isVideo = self._isVideo,
+				wrap = view.parent( ".ui-multimediaview-wrap" ),
+				control = wrap.find( ".ui-multimediaview-control" ),
+				buttons = control.find( ".ui-button" ),
+				playpauseButton = control.find( ".ui-playpausebutton" ),
+				seekBar = control.find( ".ui-seekbar" ),
+				durationLabel = control.find( ".ui-durationlabel" ),
+				timestampLabel = control.find( ".ui-timestamplabel" ),
+				volumeControl = control.find( ".ui-volumecontrol" ),
+				volumeBar = volumeControl.find( ".ui-volumebar" ),
+				width = ( isVideo ? view.width() : wrap.width() ),
+				height = ( isVideo ? view.height() : control.height() ),
+				offset = view.offset(),
+				controlHeight = control.height(),
+				availableWidth = 0,
+				controlOffset = null;
+
+			if ( control ) {
+				if ( isVideo ) {
+					controlOffset = control.offset();
+					controlOffset.left = offset.left;
+					controlOffset.top = offset.top + height - controlHeight;
+					control.offset( controlOffset );
+				}
+				control.width( width );
+			}
+
+			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" );
+			}
+
+			if ( seekBar.width() < ( volumeBar.width() + timestampLabel.width() + durationLabel.width() ) ) {
+				durationLabel.hide();
+			} else {
+				durationLabel.show();
+			}
+		},
+
+		_resizeFullscreen: function ( isFullscreen ) {
+			if ( !this._isVideo ) {
+				return;
+			}
+
+			var self = this,
+				view = self.element,
+				viewElement = view[0],
+				wrap = view.parent( ".ui-multimediaview-wrap" ),
+				control = wrap.find( ".ui-multimediaview-control" ),
+				fullscreenButton = control.find( ".ui-fullscreenbutton" ),
+				currentPage = $( ".ui-page-active" ),
+				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" ),
+				body = $( "body" )[0],
+				header = currentPage.children( ".ui-header" ),
+				footer = currentPage.children( ".ui-footer" ),
+				docWidth = 0,
+				docHeight = 0;
+
+			if ( isFullscreen ) {
+				if ( !self.backupView ) {
+					self.backupView = {
+						width: viewElement.style.getPropertyValue( "width" ) || "",
+						height: viewElement.style.getPropertyValue( "height" ) || "",
+						position: view.css( "position" ),
+						zindex: view.css( "z-index" ),
+						wrapHeight: wrap[0].style.getPropertyValue( "height" ) || ""
+					};
+				}
+				docWidth = body.clientWidth;
+				docHeight = body.clientHeight - 1;
+
+				header.hide();
+				footer.hide();
+				view.parents().each( function ( e ) {
+					var element = $( this );
+					element.addClass( "ui-fullscreen-parents" )
+						.siblings()
+						.addClass( "ui-multimediaview-siblings-off" );
+				});
+				fullscreenButton.removeClass( "ui-fullscreen-on" ).addClass( "ui-fullscreen-off" );
+
+				wrap.height( docHeight );
+				view.width( docWidth ).height( docHeight );
+			} else {
+				if ( !self.backupView ) {
+					return;
+				}
+
+				header.show();
+				footer.show();
+				view.parents().each( function ( e ) {
+					var element = $( this );
+					element.removeClass( "ui-fullscreen-parents" )
+						.siblings()
+						.removeClass( "ui-multimediaview-siblings-off" );
+				});
+
+				fullscreenButton.removeClass( "ui-fullscreen-off" ).addClass( "ui-fullscreen-on" );
+
+				wrap.css( "height", self.backupView.wrapHeight );
+				view.css( {
+					"width": self.backupView.width,
+					"height": self.backupView.height,
+					"position": self.backupView.position,
+					"z-index": self.backupView.zindex
+				});
+				self.backupView = null;
+
+				$( window ).trigger( "throttledresize" );
+			}
+		},
+
+		_addEvent: function () {
+			var self = this,
+				view = self.element,
+				option = self.options,
+				viewElement = view[0],
+				isVideo = self._isVideo,
+				control = view.parent( ".ui-multimediaview-wrap" ).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-handle" ),
+				fullscreenButton = control.find( ".ui-fullscreenbutton" ),
+				seekBar = control.find( ".ui-seekbar" ),
+				durationBar = seekBar.find( ".ui-duration" ),
+				currenttimeBar = seekBar.find( ".ui-currenttime" ),
+				touchStartEvt = ( $.support.touch ? "touchstart" : "mousedown" ),
+				touchMoveEvt = ( $.support.touch ? "touchmove" : "mousemove" ) + ".multimediaview",
+				touchEndEvt = ( $.support.touch ? "touchend" : "mouseup" ) + ".multimediaview",
+				$document = $( document );
+
+			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.muted && viewElement.volume > 0.1 ) {
+					volumeButton.removeClass( "ui-volume-icon" ).addClass( "ui-mute-icon" );
+					self._reserveVolume = viewElement.volume;
+					viewElement.volume = 0;
+				} else if ( self._reserveVolume !== -1 && !viewElement.muted ) {
+					volumeButton.removeClass( "ui-mute-icon" ).addClass( "ui-volume-icon" );
+					viewElement.volume = self._reserveVolume;
+					self._reserveVolume = -1;
+				} else if ( viewElement.volume < 0.1 ) {
+					volumeButton.removeClass( "ui-volume-icon" ).addClass( "ui-mute-icon" );
+				} else {
+					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( "click.multimediaview", function ( e ) {
+				if ( !self.options.controls ) {
+					return;
+				}
+
+				control.fadeToggle( "fast" );
+				self._resize();
+			}).bind( "multimediaviewinit", function ( e ) {
+				if ( option.controls ) {
+					control.show();
+				}
+				self._resize();
+			});
+
+			$( ".ui-button", control ).bind( touchStartEvt, function () {
+				var button = $( this ).addClass( "ui-button-down" );
+
+				$document.bind( touchMoveEvt, function () {
+					button.trigger( touchEndEvt );
+				});
+			}).bind( touchEndEvt, function () {
+				$( this ).removeClass( "ui-button-down" );
+				$document.unbind( touchMoveEvt );
+			});
+
+			playpauseButton.bind( "click.multimediaview", function () {
+				self._endTimer();
+
+				if ( viewElement.paused ) {
+					viewElement.play();
+				} else {
+					viewElement.pause();
+				}
+
+				if ( isVideo ) {
+					self._startTimer();
+				}
+			});
+
+			fullscreenButton.bind( "click.multimediaview", function ( e ) {
+				e.preventDefault();
+				self.fullScreen( !self.options.fullScreen );
+				self._resize();
+				self._endTimer();
+				e.stopPropagation();
+			});
+
+			seekBar.bind( touchStartEvt, function ( e ) {
+				var x = $.support.touch ? e.originalEvent.changedTouches[0].pageX : e.pageX,
+					duration = viewElement.duration,
+					durationOffset = durationBar.offset(),
+					durationWidth = durationBar.width(),
+					timerate = ( x - durationOffset.left ) / durationWidth,
+					time = duration * timerate;
+
+				if ( !viewElement.played.length ) {
+					return;
+				}
+
+				viewElement.currentTime = time;
+
+				self._endTimer();
+
+				e.preventDefault();
+
+				control.bind( touchMoveEvt, function ( e ) {
+					var x = $.support.touch ? e.originalEvent.changedTouches[0].pageX : e.pageX,
+						timerate = ( x - durationOffset.left ) / durationWidth;
+
+					viewElement.currentTime = duration * timerate;
+
+					e.stopPropagation();
+				}).bind( touchEndEvt, function () {
+					control.unbind( ".multimediaview" );
+					$document.unbind( touchMoveEvt );
+					if ( viewElement.paused ) {
+						viewElement.pause();
+					} else {
+						viewElement.play();
+					}
+					e.stopPropagation();
+				});
+
+				$document.bind( touchMoveEvt, function () {
+					control.trigger( touchEndEvt );
+				});
+			});
+
+			volumeButton.bind( "click.multimediaview", function () {
+				if ( self.isVolumeHide ) {
+					var view = self.element,
+						volume = viewElement.volume;
+
+					self.isVolumeHide = false;
+					volumeControl.fadeIn( "fast", function () {
+						self._updateVolumeState();
+						self._updateSeekBar();
+					});
+					self._resize();
+				} else {
+					self.isVolumeHide = true;
+					volumeControl.fadeOut( "fast", function () {
+						self._resize();
+					});
+				}
+			});
+
+			volumeBar.bind( touchStartEvt, function ( e ) {
+				var baseX = $.support.touch ? e.originalEvent.changedTouches[0].pageX : e.pageX,
+					volumeGuideLeft = volumeGuide.offset().left,
+					volumeGuideWidth = volumeGuide.width(),
+					volumeBase = volumeGuideLeft + volumeGuideWidth,
+					handlerOffset = volumeHandle.offset(),
+					volumerate = ( baseX - volumeGuideLeft ) / volumeGuideWidth,
+					currentVolume = ( baseX - volumeGuideLeft ) / volumeGuideWidth;
+
+				self._endTimer();
+				volumeHandle.addClass( "ui-button-down" );
+				self._setVolume( currentVolume.toFixed( 2 ) );
+
+				e.preventDefault();
+
+				control.bind( touchMoveEvt, function ( e ) {
+					var x = $.support.touch ? e.originalEvent.changedTouches[0].pageX : e.pageX,
+						currentVolume = ( x - volumeGuideLeft );
+					currentVolume = ( currentVolume < 0 ) ? 0 : currentVolume / volumeGuideWidth;
+					self._setVolume( ( currentVolume > 1 ) ? 1 : currentVolume.toFixed( 2 ) );
+
+					e.stopPropagation();
+				}).bind( touchEndEvt, function () {
+					control.unbind( ".multimediaview" );
+					$document.unbind( touchMoveEvt );
+					volumeHandle.removeClass( "ui-button-down" );
+					e.stopPropagation();
+				});
+
+				$document.bind( touchMoveEvt, function () {
+					control.trigger( touchEndEvt );
+				});
+			});
+		},
+
+		_removeEvent: function () {
+			var view = this.element,
+				control = view.parent( ".ui-multimediaview-wrap" ).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-handle" );
+
+			view.unbind( ".multimediaview" );
+			playpauseButton.unbind( ".multimediaview" );
+			fullscreenButton.unbind( ".multimediaview" );
+			seekBar.unbind( ".multimediaview" );
+			volumeBar.unbind( ".multimediaview" );
+			volumeHandle.unbind( ".multimediaview" );
+		},
+
+		_createControl: function () {
+			var view = this.element,
+				viewElement = view[0],
+				control = $( "<span></span>" ).addClass( "ui-multimediaview-control" ),
+				playpauseButton = $( "<span></span>" ).addClass( "ui-playpausebutton ui-button ui-play-icon" ),
+				seekBar = $( "<span></span>" ).addClass( "ui-seekbar ui-multimediaview-bar" ),
+				timestampLabel = $( "<span><p>00:00:00</p></span>" ).addClass( "ui-timestamplabel" ),
+				durationLabel = $( "<span><p>00:00:00</p></span>" ).addClass( "ui-durationlabel" ),
+				volumeButton = $( "<span></span>" ).addClass( "ui-volumebutton ui-button" ),
+				volumeControl = $( "<span></span>" ).addClass( "ui-volumecontrol" ),
+				volumeBar = $( "<div></div>" ).addClass( "ui-volumebar ui-multimediaview-bar" ),
+				volumeGuide = $( "<span></span>" ).addClass( "ui-guide ui-multimediaview-bar-bg" ),
+				volumeValue = $( "<span></span>" ).addClass( "ui-value ui-multimediaview-bar-highlight" ),
+				volumeHandle = $( "<span></span>" ).addClass( "ui-handle" ),
+				fullscreenButton = $( "<span></span>" ).addClass( "ui-fullscreenbutton ui-button" ),
+				durationBar = $( "<span></span>" ).addClass( "ui-duration ui-multimediaview-bar-bg" ),
+				currenttimeBar = $( "<span></span>" ).addClass( "ui-currenttime ui-multimediaview-bar-highlight" );
+
+			seekBar.append( durationBar ).append( currenttimeBar ).append( durationLabel ).append( timestampLabel );
+
+			volumeButton.addClass( viewElement.muted ? "ui-mute-icon" : "ui-volume-icon" );
+			volumeBar.append( volumeGuide ).append( volumeValue ).append( volumeHandle );
+			volumeControl.append( volumeBar );
+
+			control.append( playpauseButton ).append( seekBar ).append( volumeControl ).append( volumeButton );
+
+			if ( this._isVideo ) {
+				$( 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( ".ui-multimediaview-wrap" ).find( ".ui-multimediaview-control" ),
+				volumeControl = control.find( ".ui-volumecontrol" );
+
+			self.controlTimer = setTimeout( function () {
+				self.isVolumeHide = true;
+				self.controlTimer = null;
+				volumeControl.hide();
+				control.fadeOut( "fast" );
+			}, duration );
+		},
+
+		_endTimer: function () {
+			if ( this.controlTimer ) {
+				clearTimeout( this.controlTimer );
+				this.controlTimer = null;
+			}
+		},
+
+		_convertTimeFormat: function ( systime ) {
+			if ( !$.isNumeric( systime ) ) {
+				return "Playback Error";
+			}
+
+			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 view = this.element,
+				viewElement = view[0],
+				duration = viewElement.duration,
+				control = view.parent( ".ui-multimediaview-wrap" ).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 = viewElement.currentTime;
+			}
+			timebarWidth = parseInt( currenttime / duration * durationWidth, 10 );
+			durationBar.offset( durationOffset );
+			currenttimeBar.offset( durationOffset ).width( timebarWidth );
+			timestampLabel.find( "p" ).text( this._convertTimeFormat( currenttime ) );
+		},
+
+		_updateVolumeState: function () {
+			var view = this.element,
+				control = view.parent( ".ui-multimediaview-wrap" ).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-handle" ),
+				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.offset( volumeGuide.offset() ).width( parseInt( volumeGuideWidth * ( volume ), 10 ) );
+		},
+
+		_setVolume: function ( value ) {
+			var viewElement = this.element[0];
+
+			if ( value < 0.0 || value > 1.0 ) {
+				return;
+			}
+
+			viewElement.volume = value;
+		},
+
+		width: function ( value ) {
+			if ( this.options.fullScreen ) {
+				return;
+			}
+
+			var view = this.element,
+				wrap = view.parent( ".ui-multimediaview-wrap" );
+
+			if ( arguments.length === 0 ) {
+				return view.width();
+			}
+
+			if ( !this._isVideo ) {
+				wrap.width( value );
+			}
+
+			view.width( value );
+			this._resize();
+		},
+
+		height: function ( value ) {
+			if ( !this._isVideo || this.options.fullScreen ) {
+				return;
+			}
+
+			var view = this.element;
+
+			if ( arguments.length === 0 ) {
+				return view.height();
+			}
+
+			view.height( value );
+			this._resize();
+		},
+
+		fullScreen: function ( value ) {
+			if ( !this._isVideo ) {
+				return;
+			}
+
+			var view = this.element,
+				option = this.options;
+
+			if ( arguments.length === 0 ) {
+				return option.fullScreen;
+			}
+
+			view.parents( ".ui-scrollview-clip" ).scrollview( "scrollTo", 0, 0 );
+
+			this.options.fullScreen = value;
+
+			this._resize();
+		},
+
+		refresh: function () {
+			this._resize();
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$.tizen.multimediaview.prototype.enhanceWithin( e.target );
+	}).bind( "pagechange", function ( e ) {
+		$( e.target ).find( ".ui-multimediaview" ).each( function () {
+			var view = $( this ),
+				viewElement = view[0];
+
+			if ( viewElement.autoplay ) {
+				viewElement.play();
+			}
+			view.multimediaview( "refresh" );
+		});
+	}).bind( "pagebeforechange", function ( e ) {
+		$( e.target ).find( ".ui-multimediaview" ).each( function () {
+			var view = $( this ),
+				viewElement = view[0],
+				isFullscreen = view.multimediaview( "fullScreen" );
+
+			if ( isFullscreen ) {
+				view.multimediaview( "fullScreen", !isFullscreen );
+			}
+
+			if ( viewElement.played.length !== 0 ) {
+				viewElement.pause();
+			}
+		});
+	});
+
+	$( window ).bind( "resize orientationchange", function ( e ) {
+		$( ".ui-page-active" ).find( ".ui-multimediaview" ).multimediaview( "refresh" );
+	});
+
+} ( jQuery, document, window ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.notification.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.notification.js
new file mode 100644
index 0000000..271abf2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.notification.js
@@ -0,0 +1,381 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Shows notification popup over header/footer
+//>>label: Notification
+//>>group: Tizen:Widgets
+
+define( [
+	'jquery',
+	'../jquery.mobile.tizen.core'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+ * 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-interval: time to showing. If don't set, will show infinitely.
+ *
+ * APIs
+ *
+ *  open(): open the notification.
+ *  close(): close the notification.
+ *  text(text0, text1): set texts or get texts
+ *  icon(src): set the icon (tickernoti only)
+ *
+ * Events
+ *
+ *  N/A
+ *
+ * Examples
+ *
+ * // tickernoti
+ * <div data-role="notification" id="notification" data-type="ticker" data-interval="3000">
+ *	<img src="icon01.png">
+ *	<p>Hello World</p>
+ *	<p>Denis</p>
+ * </div>
+ *
+ * // smallpopup
+ * <div data-role="notification" id="notification" data-type="popup" data-interval="3000">
+ *	<p>Hello World</p>
+ * </div>
+ *
+ */
+
+/**
+	@class Notification
+	The notification widget shows a pop-up window on the screen to provide notifications.
+	To add a notification widget to the application, use the following code:
+
+		<div data-role="page">
+			<div data-role="notification" data-type="smallpopup">
+				<p>text1</p>
+			</div>
+			<div data-role="header"></div>
+			<div data-role="content"></div>
+			<div data-role="footer"></div>
+		</div>
+*/
+/**
+	@property {String} data-type
+	Defines the notification type. The type options are tickernoti and smallpopup. <br/>The default value is smallpopup.
+
+*/
+/**
+	@property {Integer} data-interval
+	Defines the time to showing a notification widget. <br/>The default is infinitely.
+
+*/
+/**
+	@method open
+	The open method is used to open the notification widget:
+
+		<div data-role="notification" data-type="smallpopup" data-interval="3000"></div>
+		$('#notification').notification('open');
+*/
+/**
+	@method close
+	The close method is used to close the notification widget:
+
+		<div data-role="notification" data-type="smallpopup" data-interval="3000"></div>
+		$('#notification').notification('close');
+*/
+/**
+	@method text
+	The text method is used to set or get the notification text:
+
+		<div data-role="notification" data-type="smallpopup" data-interval="3000"></div>
+		// Set notification text
+		$('#notification').notification('text', 'setThisText');
+		// Get notification text
+		texts = $('#notification').notification('text');
+	@since Tizen2.0
+*/
+/**
+	@method icon
+	The setIcon method is used to set the ticker notification icon. The icon can be set only if the notification type is set to tickernoti.
+
+		<div data-role="notification" data-type="ticker" data-interval="3000"></div>
+		$('#notification').notification('icon', './test.png');
+*/
+(function ( $, window ) {
+	$.widget( "tizen.notification", $.mobile.widget, {
+		btn: null,
+		text_bg: [],
+		icon_img: [],
+		interval: null,
+		seconds: null,
+		running: false,
+
+		_get_text: function () {
+			var text = new Array( 2 );
+
+			if ( this.type === 'ticker' ) {
+				text[0] = $( this.text_bg[0] ).text();
+				text[1] = $( this.text_bg[1] ).text();
+			} else {
+				text[0] = $( this.text_bg[0] ).text();
+			}
+
+			return text;
+		},
+
+		_set_text: function ( text0, text1 ) {
+			var _set = function ( elem, text ) {
+				if ( !text ) {
+					return;
+				}
+				elem.text( text );
+			};
+
+			if ( this.type === 'ticker' ) {
+				_set( $( this.text_bg[0] ), text0 );
+				_set( $( this.text_bg[1] ), text1 );
+			} else {
+				_set( $( this.text_bg[0] ), text0 );
+			}
+		},
+
+		text: function ( text0, text1 ) {
+			if ( text0 === undefined && text1 === undefined ) {
+				return this._get_text();
+			}
+
+			this._set_text( text0, text1 );
+		},
+
+		icon: function ( src ) {
+			if ( src === undefined ) {
+				return;
+			}
+
+			this.icon_img.detach();
+			this.icon_img = $( "<img src='" + src + "' class='ui-ticker-icon'>" );
+			$( this.element ).find(".ui-ticker").append( this.icon_img );
+		},
+
+		_refresh: function () {
+			var container = this._get_container();
+
+			$( container ).addClass("fix")
+					.removeClass("show")
+					.removeClass("hide");
+
+			this._set_interval();
+		},
+
+		open: function () {
+			var container = this._get_container();
+
+			if ( this.running ) {
+				this._refresh();
+				return;
+			}
+
+			$( container ).addClass("show")
+					.removeClass("hide")
+					.removeClass("fix");
+
+			this.running = true;
+
+			if ( this.type === 'popup' ) {
+				this._set_position();
+			}
+
+			this._set_interval();
+		},
+
+		close: function () {
+			var container = this._get_container();
+
+			if ( !this.running ) {
+				return;
+			}
+
+			$( container ).addClass("hide")
+					.removeClass("show")
+					.removeClass("fix");
+
+			this.running = false;
+			clearInterval( this.interval );
+		},
+
+		destroy: function () {
+			var container = this._get_container();
+
+			$( container ).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");
+		},
+
+		_set_interval: function () {
+			var self = this;
+
+			clearInterval( this.interval );
+
+			if ( this.seconds !== undefined && this.second !== 0 ) {
+				this.interval = setInterval( function () {
+					self.close();
+				}, this.seconds );
+			}
+		},
+
+		_add_event: function () {
+			var self = this,
+				container = this._get_container();
+
+			if ( this.type === 'ticker' ) {
+				container.find(".ui-ticker-btn").append( this.btn ).trigger("create");
+
+				this.btn.bind( "vmouseup", function () {
+					self.close();
+				});
+			}
+
+			container.bind( 'vmouseup', function () {
+				self.close();
+			});
+		},
+
+		_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(),
+				$footer = $('.ui-page-active').children('.ui-footer'),
+				footer_h = $footer.outerHeight() || 0;
+
+			container.css( 'bottom', footer_h);
+		},
+
+		_create: function () {
+			var self = this,
+				elem = $( this.element ),
+				i;
+
+			this.btn = $('<div data-role="button" data-inline="true">Close</div>');
+
+			this.seconds = elem.jqmData('interval');
+			this.type = elem.jqmData('type') || 'popup';
+
+			if ( this.type === 'ticker' ) {
+				elem.wrapInner("<div class='ui-ticker'></div>");
+				elem.find(".ui-ticker").append("<div class='ui-ticker-body'></div>" +
+							"<div class='ui-ticker-btn'></div>");
+				this.text_bg = elem.find("p");
+
+				if ( this.text_bg.length < 2 ) {
+					elem.find(".ui-ticker").append("<p></p><p></p>");
+					this.text_bg = elem.find("p");
+				} else if ( this.text_bg.length > 2 ) {
+					for ( i = 2; i < this.text_bg.length; i++ ) {
+						$( this.text_bg[i] ).css( "display", "none" );
+					}
+				}
+
+				$( this.text_bg[0] ).addClass("ui-ticker-text1-bg");
+				$( this.text_bg[1] ).addClass("ui-ticker-text2-bg");
+
+				this.icon_img = elem.find("img");
+
+				if ( this.icon_img.length ) {
+					$( this.icon_img ).addClass("ui-ticker-icon");
+
+					for ( i = 1; i < this.icon_img.length; i++ ) {
+						$( this.icon_img[i] ).css( "display", "none" );
+					}
+				}
+			} else {
+				elem.wrapInner("<div class='ui-smallpopup'></div>");
+				this.text_bg = elem.find("p").addClass("ui-smallpopup-text-bg");
+
+				if ( this.text_bg.length < 1 ) {
+					elem.find(".ui-smallpopup")
+						.append("<p class='ui-smallpopup-text-bg'></p>");
+					this.text_bg = elem.find("p");
+				} else if ( this.text_bg.length > 1 ) {
+					for ( i = 1; i < this.text_bg.length; i++ ) {
+						$( this.text_bg[i] ).css( "display", "none" );
+					}
+				}
+
+				this._set_position();
+			}
+
+			this._add_event();
+
+			$( window ).bind( "resize", function () {
+				if ( !self.running ) {
+					return;
+				}
+
+				self._refresh();
+
+				if ( self.type === 'popup' ) {
+					self._set_position();
+				}
+			});
+		}
+	}); // 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('destroy');
+	});
+}( jQuery, this ));
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.pagelayout.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.pagelayout.js
new file mode 100644
index 0000000..7ccf4cd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.pagelayout.js
@@ -0,0 +1,684 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Set a layout of pages
+//>>label: Pagelayout
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	'../jquery.mobile.tizen.core',
+	'../jquery.mobile.tizen.scrollview',
+	"jqm/widgets/page",
+	"jqm/widgets/page.sections",
+	"jqm/widgets/popup",
+	"jqm/jquery.mobile.zoom"
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+ * 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: Jinhyuk Jun <jinhyuk.jun@samsung.com>
+ */
+
+(function ( $, undefined ) {
+
+	$.widget( "mobile.pagelayout", $.mobile.widget, {
+		options: {
+			visibleOnPageShow: true,
+			disablePageZoom: true,
+			transition: "slide", //can be none, fade, slide (slide maps to slideup or slidedown)
+			fullscreen: false,
+			tapToggle: true,
+			tapToggleBlacklist: "a, input, select, textarea, .ui-header-fixed, .ui-footer-fixed",
+			hideDuringFocus: "input, textarea, select",
+			updatePagePadding: true,
+			// Browser detection! Weeee, here we go...
+			// Unfortunately, position:fixed is costly, not to mention probably impossible, to feature-detect accurately.
+			// Some tests exist, but they currently return false results in critical devices and browsers, which could lead to a broken experience.
+			// Testing fixed positioning is also pretty obtrusive to page load, requiring injected elements and scrolling the window
+			// The following function serves to rule out some popular browsers with known fixed-positioning issues
+			// This is a plugin option like any other, so feel free to improve or overwrite it
+			supportBlacklist: function () {
+				var w = window,
+					ua = navigator.userAgent,
+					platform = navigator.platform,
+					// Rendering engine is Webkit, and capture major version
+					wkmatch = ua.match( /AppleWebKit\/([0-9]+)/ ),
+					wkversion = !!wkmatch && wkmatch[ 1 ],
+					ffmatch = ua.match( /Fennec\/([0-9]+)/ ),
+					ffversion = !!ffmatch && ffmatch[ 1 ],
+					operammobilematch = ua.match( /Opera Mobi\/([0-9]+)/ ),
+					omversion = !!operammobilematch && operammobilematch[ 1 ];
+
+				if (
+					// iOS 4.3 and older : Platform is iPhone/Pad/Touch and Webkit version is less than 534 (ios5)
+					( ( platform.indexOf( "iPhone" ) > -1 || platform.indexOf( "iPad" ) > -1  || platform.indexOf( "iPod" ) > -1 ) && wkversion && wkversion < 534 ) ||
+						// Opera Mini
+						( w.operamini && ({}).toString.call( w.operamini ) === "[object OperaMini]" ) ||
+						( operammobilematch && omversion < 7458 ) ||
+						//Android lte 2.1: Platform is Android and Webkit version is less than 533 (Android 2.2)
+						( ua.indexOf( "Android" ) > -1 && wkversion && wkversion < 533 ) ||
+						// Firefox Mobile before 6.0 -
+						( ffversion && ffversion < 6 ) ||
+						// WebOS less than 3
+						( window.palmGetResource !== undefined && wkversion && wkversion < 534 ) ||
+						// MeeGo
+						( ua.indexOf( "MeeGo" ) > -1 && ua.indexOf( "NokiaBrowser/8.5.0" ) > -1 )
+				) {
+					return true;
+				}
+
+				return false;
+			},
+			initSelector: ":jqmData(role='content')"
+		},
+
+		_create: function () {
+
+			var self = this,
+				o = self.options,
+				$el = self.element;
+
+			// Feature detecting support for
+			if ( o.supportBlacklist() ) {
+				self.destroy();
+				return;
+			}
+
+			self._addFixedClass();
+			self._addTransitionClass();
+			self._bindPageEvents();
+
+			// only content
+			self._bindContentControlEvents();
+
+			// Store back-button, to show again
+			self._backBtnQueue = [];
+		},
+
+		/* add minimum fixed css style to bar(header/footer) and content
+		*  it need to update when core source modified(jquery.mobile.page.section.js)
+		*  modified from core source cuz initSelector different */
+		_addFixedClass: function () {
+			var self = this,
+				o = self.options,
+				$el = self.element,
+				$elHeader = $el.siblings( ":jqmData(role='header')" ),
+				$elFooter = $el.siblings( ":jqmData(role='footer')" ),
+				$elPage = $el.closest(".ui-page");
+
+			$elHeader.addClass( "ui-header-fixed" );
+			$elFooter.addClass( "ui-footer-fixed" );
+
+			// "fullscreen" overlay positioning
+			if ( o.fullscreen ) {
+				$elHeader.addClass( "ui-header-fullscreen" );
+				$elFooter.addClass( "ui-footer-fullscreen" );
+				$elPage
+					.addClass( "ui-page-header-fullscreen" )
+					.addClass( "ui-page-footer-fullscreen" );
+			} else {
+			// If not fullscreen, add class to page to set top or bottom padding
+				$elPage.addClass( "ui-page-header-fixed" )
+					.addClass( "ui-page-footer-fixed" );
+			}
+		},
+
+		/* original core source(jquery.mobile.fixedToolbar.js)
+		* never changed */
+		_addTransitionClass: function () {
+			var tclass = this.options.transition;
+
+			if ( tclass && tclass !== "none" ) {
+				// use appropriate slide for header or footer
+				if ( tclass === "slide" ) {
+					tclass = this.element.is( ".ui-header" ) ? "slidedown" : "slideup";
+				}
+
+				this.element.addClass( tclass );
+			}
+		},
+
+
+		/* Set default page positon
+		* 1. add title style to header
+		* 2. Set default header/footer position */
+		setHeaderFooter: function ( thisPage ) {
+			var $elPage = $( thisPage ),
+				$elHeader = $elPage.find( ":jqmData(role='header')" ).length ? $elPage.find( ":jqmData(role='header')") : $elPage.siblings( ":jqmData(role='header')"),
+				$elContent = $elPage.find( ".ui-content" ),
+				$elFooter = $elPage.find( ":jqmData(role='footer')" ),
+				$elFooterGroup = $elFooter.find( ":jqmData(role='fieldcontain')" ),
+				$elFooterControlGroup = $elFooter.find( ".ui-controlgroup" );
+
+			// divide content mode scrollview and non-scrollview
+			if ( !$elPage.is( ".ui-dialog" ) ) {
+				if ( $elHeader.jqmData("position") == "fixed" || ( $.support.scrollview && $.tizen.frameworkData.theme.match(/tizen/) ) ) {
+					$elHeader
+						.css( "position", "fixed" )
+						.css( "top", "0px" );
+				} else if ( !$.support.scrollview && $elHeader.jqmData("position") != "fixed" ) {
+					$elHeader.css( "position", "relative" );
+				}
+			}
+
+			/* set Title style */
+			if ( $elHeader.find("span.ui-title-text-sub").length ) {
+				$elHeader.addClass( "ui-title-multiline");
+			}
+
+			if ( $elFooterGroup.find( "div" ).is( ".ui-controlgroup-label" ) ) {
+				$elFooterGroup.find( "div.ui-controlgroup-label" ).remove();
+			}
+
+			if ( $elFooterControlGroup.length ) {
+				var anchorPer = 100 / $elFooterControlGroup.find( "a" ).length;
+				$elFooterControlGroup.find( "a" ).each( function ( i ) {
+					$elFooterControlGroup.find( "a" ).eq( i ).width( anchorPer + "%" );
+				});
+			}
+		},
+
+		_bindPageEvents: function () {
+			var self = this,
+				o = self.options,
+				$el = self.element,
+				$elCurrentFooter;
+
+			//page event bindings
+			// Fixed toolbars require page zoom to be disabled, otherwise usability issues crop up
+			// This method is meant to disable zoom while a fixed-positioned toolbar page is visible
+			$el.closest( ".ui-page" )
+				.bind( "pagebeforeshow", function ( event ) {
+					var thisPage = this;
+					if ( o.disablePageZoom ) {
+						$.mobile.zoom.disable( true );
+					}
+					if ( !o.visibleOnPageShow ) {
+						self.hide( true );
+					}
+					self.setHeaderFooter( thisPage );
+					self._setContentMinHeight( thisPage );
+					self._updateHeaderArea( thisPage );
+					self._updateFooterArea( thisPage );
+				} )
+				.bind( "webkitAnimationStart animationstart updatelayout", function ( e, data ) {
+					var thisPage = this;
+					if ( o.updatePagePadding ) {
+						self.updatePagePadding(thisPage);
+						self.updatePageLayout( thisPage, data);
+					}
+				})
+
+				.bind( "pageshow", function ( event ) {
+					var thisPage = this;
+					self._setContentMinHeight( thisPage );
+					self.updatePagePadding( thisPage );
+					self._updateHeaderArea( thisPage );
+					self._updateFooterArea( thisPage );
+
+					// check device api : HW key existance
+					// TODO: remove these functions, because the HW key is mandatory.
+					if ( false ) {
+						self._bindHWkeyOnSWBtn();
+						self._setHWKeyLayout( thisPage );
+					}
+					self._setHWKeySupport( thisPage );
+					//self._setMenuPopupLayout( thisPage );
+
+					if ( o.updatePagePadding ) {
+						$( window ).bind( "throttledresize." + self.widgetName, function () {
+							self.updatePagePadding(thisPage);
+							self.updatePageLayout( thisPage, true);
+							self._updateHeaderArea( thisPage );
+							self._updateFooterArea( thisPage );
+							self._setContentMinHeight( thisPage );
+						});
+					}
+				})
+
+				.bind( "pagebeforehide", function ( e, ui ) {
+					self._unsetHWKeySupport( );
+					if ( o.disablePageZoom ) {
+						$.mobile.zoom.enable( true );
+					}
+					if ( o.updatePagePadding ) {
+						$( window ).unbind( "throttledresize." + self.widgetName );
+					}
+				});
+
+			window.addEventListener( "softkeyboardchange", function ( e ) {
+				var $elDownBtn = $( "<div class='ui-btn-footer-down'></div>" ),
+					$elPage = $( ".ui-page-active" ),
+					backBtn,
+					backBtnPosition = "footer";
+				// N_SE-42987 : If self._backBtnQueue.length has value is not 0, this means .ui-btn-back button is still hidden.
+				//		So, condition that check self._backBtnQueue value add.
+				if ( $elPage.data( "addBackBtn" ) || self._backBtnQueue.length ) {
+					$elPage.data( "addBackBtn" ) == "header" ? backBtnPosition = "header" : backBtnPosition = "footer";
+
+					if ( e.state == "on" ) {
+						if ( !$elPage.find( ".ui-" + backBtnPosition + " .ui-btn-footer-down" ).length ) {
+							$elDownBtn.buttonMarkup( { icon: "down" } ).appendTo( $elPage.find( ".ui-" + backBtnPosition ) );
+						}
+
+						// N_SE-32900: If an app moves a page when the pop is shown, the .ui-page-active page
+						//             is changed.
+						//             In this case, the '.ui-page-active .ui-btn-back' selector indicates a
+						//             new page's one, and the old page's .ui-btn-back button is still hidden.
+						//             So, the current back button is remembered to be shown at the
+						//             softkeyboardchange.off event.
+						if ( true ) {
+							backBtn = $( ".ui-page-active .ui-btn-back" );
+							backBtn.hide();
+							self._backBtnQueue.push( backBtn );	// Store hidden backBtn
+						}
+					} else if ( e.state == "off" ) {
+						if ( true ) {
+							self._backBtnQueue.forEach( function ( b ) {
+								b.show();	// Show each backBtn,
+							} );
+							self._backBtnQueue.length = 0;	// and clear queue.
+						}
+						$( ".ui-btn-footer-down" ).remove();
+					}
+				}
+			});
+		},
+
+		_bindContentControlEvents: function () {
+			var self = this,
+				o = self.options,
+				$el = self.element;
+
+			$el.closest( ".ui-page" )
+				.bind( "pagebeforeshow", function ( event ) {
+
+				});
+		},
+
+		_HWKeyHandler: function ( ev ) {
+			var $openedpopup = $.mobile.popup.active,
+				$page,
+				$focused;
+			// NOTE: The 'tizenhwkey' event is passed only document -> window objects.
+			//       Other DOM elements does not receive 'tizenhwkey' event.
+
+			// menu key
+			if( ev.originalEvent.keyName == "menu" ) {
+				// Blur focused element to turn off SIP(IME)
+				$page = $( ev.data ); 	// page object, passed by _setHWKeySupport()
+				$focused = $page.find( ".ui-focus" );
+				if( $focused[0] ) {	// Focused element is found
+					$focused.blur();
+					// NOTE: If a popup is opened and focused element exists in it,
+					//       do not close that popup.
+					//       'false' is returned here, hence popup close routine is not run.
+					return false;
+				}
+				// Close opened popup
+				if( $openedpopup ) {
+					$openedpopup.close();
+					return false;
+				}
+			}
+			// back key
+			else if( ev.originalEvent.keyName == "back" ) {
+				// Close opened popup
+				if( $openedpopup ) {
+					$openedpopup.close();
+					return false;
+				}
+			}
+			return true;	// Otherwise, propagate tizenhwkey event to window object
+		},
+
+		_setHWKeySupport: function( thisPage ) {
+			$( document ).on( "tizenhwkey", thisPage, this._HWKeyHandler );
+		},
+
+		_unsetHWKeySupport: function () {
+			$( document ).off( "tizenhwkey", this._HWKeyHandler );
+		},
+
+		_bindHWkeyOnSWBtn: function () {
+			// if HW key not exist
+			// return true
+			// else
+			$( document ).on( "tizenhwkey", function( e ) {
+				var openedpopup = $.mobile.popup.active,
+					$elPage = $( ".ui-page-active" ),
+					$elFooter = $elPage.find( ":jqmData(role='footer')" ),
+					$elMoreKey = $elFooter.children(":jqmData(icon='naviframe-more')"),
+					morePopup;
+
+				if ( $( ".ui-page-active .ui-footer" ).hasClass( "ui-footer-force-btn-show" ) ) {
+					return true;
+				}
+
+				if ( e.originalEvent.keyName === "back" ) {
+					// need to change back button
+					if( openedpopup ) {
+						openedpopup.close();
+						return false;
+					}
+					//Click trigger
+					 $( ".ui-page-active .ui-footer .ui-btn-back" ).trigger( "click" );
+					return false;
+				} else if ( e.originalEvent.keyName === "menu" ) {
+					// if more button was clicked, all kinds of popups will be closed
+					if ( openedpopup ) {
+						openedpopup.close();
+						return false;
+					}
+
+					// need to change more key trigger
+					if ( $elMoreKey.get(0) ) {
+						$elMoreKey.trigger( "click" );
+					}
+					return false;
+				}
+			} );
+
+		},
+
+		_setContentMinHeight : function ( thisPage ) {
+			var $elPage = $( thisPage ),
+				$elHeader = $elPage.find( ":jqmData(role='header')" ),
+				$elFooter = $elPage.find( ":jqmData(role='footer')" ),
+				$elContent = $elPage.find( ":jqmData(role='content')" ),
+				footerHeight,
+				resultMinHeight,
+				dpr = 1,
+				layoutInnerHeight = window.innerHeight;
+
+			if ( !$.support.scrollview || ($.support.scrollview && $elContent.jqmData("scroll") === "none") ) {
+					dpr = window.outerWidth / window.innerWidth;
+					layoutInnerHeight = Math.floor( window.outerHeight / dpr );
+			} else {
+				layoutInnerHeight = window.innerHeight;
+			}
+
+			if ( $elFooter.css( "display" ) === "none" ) {
+				footerHeight = 0;
+			} else {
+				footerHeight = $elFooter.height();
+			}
+			resultMinHeight = layoutInnerHeight - $elHeader.height() - footerHeight;
+
+			if ( $.support.scrollview && $elContent.jqmData("scroll") !== "none" ) {
+				$elContent.css( "min-height", resultMinHeight - parseFloat( $elContent.css("padding-top") ) - parseFloat( $elContent.css("padding-bottom") ) + "px" );
+				$elContent.children( ".ui-scrollview-view" ).css( "min-height", $elContent.css( "min-height" ) );
+			}
+		},
+
+		_updateHeaderArea : function ( thisPage ) {
+			var $elPage = $( thisPage ),
+				$elHeader = $elPage.find( ":jqmData(role='header')" ).length ? $elPage.find( ":jqmData(role='header')") : $elPage.siblings( ":jqmData(role='header')"),
+				$headerBtn = $elHeader.children("a,[data-"+$.mobile.ns+"role=button]"),
+				headerBtnWidth = $headerBtn.width() + parseInt( $headerBtn.css("padding-left") ) + parseInt( $headerBtn.css("padding-right") ),
+				headerBtnNum = $headerBtn.length,
+				$headerSrc = $elHeader.children("img"),
+				headerSrcNum = $headerSrc.length,
+				headerSrcWidth = $headerSrc.width() + parseInt( $headerSrc.css("margin-left") ),
+				h1width;
+
+			if ( !$elPage.is( ".ui-dialog" ) ) {
+				h1width = window.innerWidth - parseInt( $elHeader.find( "h1" ).css( "margin-left" ), 10 ) * 2 - headerBtnWidth * headerBtnNum - headerSrcWidth * headerSrcNum;
+				$elHeader.find( "h1" ).css( "width", h1width );
+				$elHeader.find( '.ui-title-text-sub' ).css( "width", h1width );
+			}
+			/* add half width for default space between text and button, and img tag area is too narrow, so multiply three for img width*/
+		},
+
+		_updateFooterArea : function ( thisPage ) {
+			var $elPage = $( thisPage ),
+				$elFooter = $elPage.find( ".ui-footer" ),
+				$elMoreKey = $elFooter.children( ":jqmData(icon='naviframe-more')" ),
+				$elBackKey = $elFooter.children( ".ui-btn-back, .ui-btn-footer-down" ),
+				footerBtn = $elFooter.children( "div.ui-btn, a.ui-btn" ),
+				btnLength = footerBtn.length,
+				btnWidth = window.innerWidth,
+				realBtnIndex = 0,
+				idx, moreWidth = 0;
+
+			if ( !btnLength ) {
+				return;
+			}
+
+			if ( $elMoreKey.length ) {
+				moreWidth = $elMoreKey.width();
+				btnWidth -= moreWidth;
+			}
+
+			if ( $elBackKey.length ) {
+				btnWidth -= $elBackKey.width();
+				$elBackKey.addClass( "ui-footer-btn-border" );
+			}
+
+			btnWidth /= btnLength - $elMoreKey.length - $elBackKey.length;
+
+			for ( idx = 0; idx < btnLength; idx++ ) {
+				if ( footerBtn.eq( idx ).hasClass( "ui-btn-back" ) ) {
+					continue;
+				}
+				if ( footerBtn.eq( idx ).is( ":jqmData(icon='naviframe-more')" ) ){
+					continue;
+				}
+				footerBtn.eq( idx )
+					.addClass( "ui-footer-btn-border" )
+					.width( btnWidth )
+					.css( "position", "absolute" )
+					.css( "left", realBtnIndex * btnWidth + moreWidth );
+				realBtnIndex++;
+			}
+			$elFooter.find( ".ui-footer-btn-border" ).eq( 0 ).removeClass( "ui-footer-btn-border" );
+		},
+
+		_setHWKeyLayout : function ( thisPage ) {
+			var $elPage = $( thisPage ),
+				$elFooter = $elPage.find( ":jqmData(role='footer')" ),
+				$elBackKey = $elFooter.children( ".ui-btn-back" ),
+				$elMoreKey = $elFooter.children(":jqmData(icon='naviframe-more')"),
+				$elTabBar = $elFooter.children( ".ui-tabbar" ),
+				$elControlGroup = $elFooter.children( ".ui-controlgroup" );
+				//cntMore = 0,
+			
+				// Check HW Key option
+			if ( $elFooter.hasClass("ui-footer-force-btn-show") ) {
+				return true;
+			}
+
+			/*
+			if ( $elMoreKey.length ) {
+				cntMore = $elMoreKey.length + 1;
+			} else {
+				cntMore = 0;
+			}
+
+			// need to add device api to check HW key exist
+			// Case 1 : footer - BackKey/MoreKey/Button - hide BackKey/MoreKey
+			if ( $elFooter.children().length - $elBackKey.length - cntMore > 0 ) {
+				$elBackKey.hide();
+				$elMoreKey.hide();
+			// Case 2 : footer - BackKey/MoreKey - more, back hide depend on OSP
+			} else {
+				$elBackKey.hide();
+				$elMoreKey.hide();
+			}
+			*/
+
+			if( $elMoreKey ) {
+				$elMoreKey.hide();
+			}
+			if( $elBackKey ) {
+				$elBackKey.hide();
+			}
+			if( $elTabBar ) {
+				$elTabBar.removeClass( "ui-tabbar-margin-more ui-tabbar-margin-back" );
+			}
+			if ( $elControlGroup ) {
+				$elControlGroup.removeClass( "ui-controlgroup-padding-more ui-controlgroup-padding-back" );
+			}
+			// Case 3 : no footer - do nothing
+
+			return true;
+		},
+		_setMenuPopupLayout: function ( thisPage ) {
+			var $page = $( thisPage ),
+				$footer = $page.find( ":jqmData(role='footer')" ),
+				moreKey = $page.find( ":jqmData(icon='naviframe-more')" )[0],
+				//cntMore = 0,
+				$morePopup;
+
+			if( moreKey && moreKey.hash ) {	// moreKey.hash = #morePopupID (from <a href="">)
+				$morePopup =  $( moreKey.hash );
+				$morePopup.addClass ( "ui-ctxpopup-optionmenu" );
+			}
+		 },
+
+		_visible: true,
+
+		// This will set the content element's top or bottom padding equal to the toolbar's height
+		updatePagePadding: function ( tbPage ) {
+			var $el = this.element,
+				header = $el.siblings( ".ui-header" ).length,
+				footer = $el.siblings( ".ui-footer" ).length;
+
+			// This behavior only applies to "fixed", not "fullscreen"
+			if ( this.options.fullscreen ) {
+				return;
+			}
+
+			tbPage = tbPage || $el.closest( ".ui-page" );
+
+			if ( $el.siblings( ".ui-header" ).jqmData("position") == "fixed" || ($.support.scrollview && $el.jqmData("scroll") !== "none" )) {
+				$( tbPage ).css( "padding-top", ( header ? $el.siblings( ".ui-header" ).outerHeight() : 0 ) );
+			}
+			$( tbPage ).css( "padding-bottom", (( footer && $el.siblings( ".ui-footer" ).css( "display" ) !== "none" ) ? $el.siblings( ".ui-footer" ).outerHeight() : 0 ) );
+		},
+
+		/* 1. Calculate and update content height   */
+		updatePageLayout: function ( thisPage, receiveType ) {
+			var $elFooter,
+				$elPage = $( thisPage ),
+				$elHeader = $elPage.find( ":jqmData(role='header')" ),
+				$elContent = $elPage.find( ":jqmData(role='content')" ),
+				resultContentHeight = 0,
+				resultFooterHeight = 0,
+				resultHeaderHeight = 0,
+				layoutInnerHeight = window.innerHeight,
+				dpr = 1;
+
+			if ( $elPage.length ) {
+				$elFooter = $elPage.find( ":jqmData(role='footer')" );
+			} else {
+				$elFooter = $( document ).find( ":jqmData(role='footer')" ).eq( 0 );
+			}
+
+			// calculate footer height
+			resultFooterHeight = ( $elFooter.css( "display" ) == "none" || $elFooter.length == 0 ) ? 0 : $elFooter.height();
+			resultHeaderHeight = ( $elHeader.css( "display" ) == "none" || $elHeader.length == 0 ) ? 0 : $elHeader.height();
+
+			if (resultFooterHeight != 0 ) {
+				$elFooter.css( "bottom", 0 );
+			}
+
+			if ( !$.support.scrollview || ($.support.scrollview && $elContent.jqmData("scroll") === "none") ) {
+				dpr = window.outerWidth / window.innerWidth;
+				layoutInnerHeight = Math.floor( window.outerHeight / dpr );
+			} else {
+				//#N_SE-43092: window.innerHeight returns incorrect size
+				layoutInnerHeight = $.mobile.$window.height();
+			}
+
+			resultContentHeight = layoutInnerHeight - resultFooterHeight - resultHeaderHeight;
+
+			if ( $.support.scrollview && $elContent.jqmData("scroll") !== "none" ) {
+				$elContent.height( resultContentHeight -
+						parseFloat( $elContent.css("padding-top") ) -
+						parseFloat( $elContent.css("padding-bottom") ) );
+			}
+
+			// External call page( "refresh") - in case title changed
+			if ( receiveType ) {
+				$elPage
+					.css( "min-height", resultContentHeight )
+					.css( "padding-top", resultHeaderHeight )
+					.css( "padding-bottom", resultFooterHeight );
+			}
+		},
+
+		show: function ( notransition ) {
+			/* blank function: deprecated */
+		},
+
+		hide: function ( notransition ) {
+			/* blank function: deprecated */
+		},
+
+		toggle: function () {
+			this[ this._visible ? "hide" : "show" ]();
+		},
+
+		destroy: function () {
+			this.element.removeClass( "ui-header-fixed ui-footer-fixed ui-header-fullscreen ui-footer-fullscreen in out fade slidedown slideup ui-fixed-hidden" );
+			this.element.closest( ".ui-page" ).removeClass( "ui-page-header-fixed ui-page-footer-fixed ui-page-header-fullscreen ui-page-footer-fullscreen" );
+		},
+
+		refresh: function () {
+			var $elPage = $( ".ui-page-active" );
+			this.setHeaderFooter( $elPage );
+			this._updateHeaderArea( $elPage );
+		}
+	});
+
+	//auto self-init widgets
+	$( document )
+		.bind( "pagecreate create", function ( e ) {
+			// DEPRECATED in 1.1: support for data-fullscreen=true|false on the page element.
+			// This line ensures it still works, but we recommend moving the attribute to the toolbars themselves.
+			if ( $( e.target ).jqmData( "fullscreen" ) ) {
+				$( $.mobile.pagelayout.prototype.options.initSelector, e.target ).not( ":jqmData(fullscreen)" ).jqmData( "fullscreen", true );
+			}
+			$.mobile.pagelayout.prototype.enhanceWithin( e.target );
+		})
+		.bind( "pagebeforeshow", function ( event, ui ) {
+			var footer_filter = $( event.target ).find( ":jqmData(role='footer')" ),
+				controlgroup_filter = footer_filter.find( ":jqmData(role='controlgroup')" ),
+				$elFooterMore = controlgroup_filter.siblings( ":jqmData(icon='naviframe-more')" ),
+				$elFooterBack = controlgroup_filter.siblings( ".ui-btn-back" );
+
+			if ( $elFooterMore.length ) {
+				controlgroup_filter.addClass( "ui-controlgroup-padding-more" );
+			}
+			if ( $elFooterBack.length ) {
+				controlgroup_filter.addClass( "ui-controlgroup-padding-back" );
+			}
+		});
+
+}( jQuery ));
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.popupwindow.ctxpopup.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.popupwindow.ctxpopup.js
new file mode 100644
index 0000000..3619d8a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.popupwindow.ctxpopup.js
@@ -0,0 +1,341 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Shows popup at any place in the page content, with various styles
+//>>label: Context popup
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	'../jquery.mobile.tizen.core',
+	'./jquery.mobile.tizen.popupwindow',
+	'./jquery.mobile.tizen.triangle'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/*
+ * 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>
+ *			Hyunjung Kim <hjnim.kim@samsung.com>
+ */
+
+/*
+ * % ContextPopup widget do not use anymore(will be deprecated, internal use only)
+ */
+// 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.
+
+/**
+	class ContextPopup
+		The context pop-up widget shows a list of options and automatically optimizes its size within the screen. This widget is intended for a small list of options for a larger list, use the List widget. <br/>The context pop-up widget requires a target button, which must be clicked to open the context pop-up. In the default application theme, an arrow pointer is displayed at the top-left corner of the context pop-up widget when it is opened.<br/><br/> To add a context pop-up widget to the application, use the following code:
+
+			// Target button
+			<a href="#pop_3_icons" id="btn_3_icons" data-role="button" data-inline="true" data-rel="popupwindow">3 Icons</a>
+			// Context pop-up
+				<div class="horizontal" id="pop_3_icons" data-role="popupwindow" data-show-arrow="true">
+				<ul>
+					<li class="icon">
+						<a href="#" data-role="button" data-icon="call"></a>
+					</li>
+					<li class="icon">
+						<a href="#" data-role="button" data-icon="favorite"></a>
+					</li>
+					<li class="text">
+						<a href="#">Function</a>
+					</li>
+				</ul>
+			</div>
+	The context pop-up can define callbacks for events as described in the [jQueryMobile documentation for pop-up events.][1]
+	You can use methods with the context pop-up as described in the [jQueryMobile documentation for pop-up methods.][2]
+	[1]: http://jquerymobile.com/demos/1.2.0-alpha.1/docs/pages/popup/events.html
+	[2]: http://jquerymobile.com/demos/1.2.0-alpha.1/docs/pages/popup/methods.html
+
+	@deprecated 2.0 verisons
+*/
+
+(function ( $, undefined ) {
+	$.widget( "tizen.ctxpopup", $.tizen.widgetex, {
+		options: $.extend( {}, $.tizen.popupwindow.prototype.options, {
+			initSelector: ":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>" ].join("")
+,			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 () {
+			console.warn("ctxpopup() was deprecated. use popup() instead.");
+			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,
+				finalposition,
+				ret;
+			if (isHorizontal) {
+				orig.x = 0;
+			} else {
+				orig.y = 0;
+			}
+			if (arrow == 'b' && self._target_height) {
+				orig.y -= self._target_height;
+			}
+			if (arrow == 'r' && self._target_width) {
+				orig.x -= self._target_width;
+			}
+			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
+			finalposition = {
+				"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 - finalposition.x ) + Math.abs( y - finalposition.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 );
+			this.element.parents( ".ui-popupwindow" ).addClass( "ui-arrow-" + minDiffIdx );
+			return coords[minDiffIdx].actual;
+		}
+
+		return orig_placementCoords.call( this, x, y, cx, cy );
+	};
+
+	$.tizen.popupwindow.prototype.open = function ( x, y, target_width, target_height ) {
+		var ctxpopup = this.element.data( "ctxpopup" );
+
+		this._target_width = target_width;
+		this._target_height = target_height;
+
+		if ( ctxpopup ) {
+			this._setFade( false );
+			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, true );
+	};
+
+	//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 ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.popupwindow.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.popupwindow.js
new file mode 100644
index 0000000..8f39ab6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.popupwindow.js
@@ -0,0 +1,569 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Shows popup on the page
+//>>label: Popup
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	'../jquery.mobile.tizen.core',
+	'./jquery.mobile.tizen.widgetex'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/*
+ * 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>
+ *			Hyunjung Kim <hjnim.kim@samsung.com>
+ */
+
+/*
+ * % Popupwindow widget do not use anymore(will be deprecated, internal use only)
+ *
+ *
+ * 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:
+ *	popupbeforeposition: triggered after a popup has completed preparations for opening, but has not yet opened
+ *	popupafteropen: triggered after a popup has completely opened
+ *	popupafterclose triggered when a popup has completely closed
+*/
+
+/**
+	class Popupwindow
+	The pop-up widget shows a list of items in a pop-up window in the middle of the screen. It automatically optimizes the pop-up window size within the screen.
+	To add a pop-up widget to the application, use the following code:
+
+		// Basic pop-up
+		<div id="center_info" data-role="popup" data-style="center_info">
+			<div data-role="text">
+				<p>
+				Pop-up dialog box, a child window that blocks user interaction in the parent window
+				</p>
+			</div>
+		</div>
+		// Pop-up with a title and button
+		<div id="center_title_1btn" data-role="popup" data-style="center_title_1btn">
+			<p data-role="title">
+				Pop-up title
+			</p>
+			<p data-role="text">
+				Pop-up dialog box
+			</p>
+		<div data-role="button-bg">
+			<input type="button" value="Text Button" />
+		</div>
+		</div>
+
+	The pop-up can define callbacks for events as described in the jQueryMobile documentation for pop-up events. <br/>You can use methods with the pop-up as described in the jQueryMobile documentation for pop-up methods.
+
+	@deprecated 2.0 verisons
+*/
+
+/**
+	@property {String} data-style
+	Defines the pop-up window style.
+	The following styles are available:
+
+	center_info: basic pop-up message
+	center_title: pop-up message with a title
+	center_basic_1btn: pop-up message with 1 button
+	center_basic_2btn: pop-up message with 2 horizontal buttons
+	center_title_1btn: pop-up message with a title and 1 button
+	center_title_2btn: pop-up message with a title and 2 horizontal buttons
+	center_title_3btn: pop-up message with a title and 3 horizontal buttons
+	center_button_vertical: pop-up message with vertical buttons
+	center_checkbox: pop-up message with a check box
+	center_liststyle_1btn>: pop-up message with a list and 1 button
+	center_liststyle_2btn: pop-up message with a list and 2 horizontal buttons
+	center_liststyle_3btn: pop-up message with a list and 3 horizontal buttons
+*/
+
+(function ( $, undefined ) {
+	$.widget( "tizen.popupwindow", $.tizen.widgetex, {
+		options: {
+			theme: null,
+			overlayTheme: "s",
+			style: "custom",
+			disabled: false,
+			shadow: true,
+			corners: true,
+			fade: false,
+			opacity: 0.7,
+			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>" ].join("")
+,			ui: {
+				screen: "#popupwindow-screen",
+				container: "#popupwindow-container"
+			}
+		},
+
+		_setStyle: function () {
+			var popup = this.element,
+				style = popup.attr( 'data-style' );
+
+			if ( style ) {
+				this.options.style = style;
+			}
+
+			popup.addClass( this.options.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')" )
+					.addClass( "popup-scroller-bg" );
+			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>" );
+		},
+
+		_create: function () {
+			console.warn("popupwindow() was deprecated. use popup() instead.");
+			var thisPage = this.element.closest(":jqmData(role='page')"),
+				self = this;
+
+			if ( thisPage.length === 0 ) {
+				thisPage = $("body");
+			}
+
+			this._ui.placeholder =
+					$( "<div><!-- placeholder for " + this.element.attr("id") + " --></div>" )
+					.css("display", "none")
+					.insertBefore( this.element );
+
+			thisPage.append( this._ui.screen );
+			this._ui.container.insertAfter( this._ui.screen );
+			this._ui.container.append( this.element );
+
+			this._setStyle();
+
+			this._isOpen = false;
+
+			this._ui.screen.bind( "vclick", function ( e ) {
+				self.close();
+				return false;
+			} );
+
+			this.element.bind( "vclick", function ( e ) {
+				if ( $( e.target ).is("ui-btn-ctxpopup-close") ) {
+					self.close();
+				}
+			} );
+		},
+
+		destroy: function () {
+			this.element.insertBefore( this._ui.placeholder );
+
+			this._ui.placeholder.remove();
+			this._ui.container.remove();
+			this._ui.screen.remove();
+			this.element.triggerHandler("destroyed");
+			$.Widget.prototype.destroy.call( this );
+		},
+
+		_placementCoords: function ( x, y, cw, ch ) {
+			var screenHeight = $( window ).height(),
+				screenWidth = $( window ).width(),
+				halfheight = ch / 2,
+				maxwidth = parseFloat( this._ui.container.css( "max-width" ) ),
+				roomtop = y,
+				roombot = screenHeight - y,
+				newtop,
+				newleft;
+
+			if ( roomtop > ch / 2 && roombot > ch / 2 ) {
+				newtop = y - halfheight;
+			} else {
+				newtop = roomtop > roombot ? screenHeight - ch - 30 : 30;
+			}
+
+			if ( cw < maxwidth ) {
+				newleft = ( screenWidth - cw ) / 2;
+			} else {
+				newleft = x - cw / 2;
+
+				if ( newleft < 10 ) {
+					newleft = 10;
+				} else if ( ( newleft + cw ) > screenWidth ) {
+					newleft = screenWidth - cw - 10;
+				}
+			}
+
+			return { x : newleft, y : newtop };
+		},
+
+		_setPosition: function ( x_where, y_where ) {
+			var x = ( undefined === x_where ? $( window ).width()  / 2 : x_where ),
+				y = ( undefined === y_where ? $( window ).height() / 2 : y_where ),
+				coords,
+				ctxpopup = this.element.data("ctxpopup"),
+				popupWidth,
+				menuHeight,
+				menuWidth,
+				screenHeight,
+				screenWidth,
+				roomtop,
+				roombot,
+				halfheight,
+				maxwidth,
+				newtop,
+				newleft;
+
+			if ( !ctxpopup ) {
+				popupWidth = $( window ).width() * this.options.widthRatio;
+				this._ui.container.css( "width", popupWidth );
+
+				if ( this._ui.container.outerWidth() > $( window ).width() ) {
+					this._ui.container.css( {"max-width" : $( window ).width() - 30} );
+				}
+			}
+
+			coords = this._placementCoords( x, y,
+					this._ui.container.outerWidth(),
+					this._ui.container.outerHeight() );
+
+			menuHeight = this._ui.container.innerHeight();
+			menuWidth = this._ui.container.innerWidth();
+			screenHeight = $( window ).height();
+			screenWidth = $( window ).width();
+			roomtop = y;
+			roombot = screenHeight - y;
+			halfheight = menuHeight / 2;
+			maxwidth = parseFloat( this._ui.container.css( "max-width" ) );
+			newtop = ( screenHeight - menuHeight ) / 2;
+
+			if ( !maxwidth || menuWidth < maxwidth ) {
+				newleft = ( screenWidth - menuWidth ) / 2;
+			} else {
+				newleft = x - menuWidth / 2;
+
+				if ( newleft < 30 ) {
+					newleft = 30;
+				} else if ( ( newleft + menuWidth ) > screenWidth ) {
+					newleft = screenWidth - menuWidth - 30;
+				}
+			}
+
+			if ( ctxpopup ) {
+				newtop = coords.y;
+				newleft = coords.x;
+			}
+
+			this._ui.container.css({
+				top: newtop,
+				left: newleft
+			});
+
+			this._ui.screen.css( "height", screenHeight );
+		},
+		open: function ( x_where, y_where, backgroundclose ) {
+			var self = this,
+				zIndexMax = 0;
+
+			if ( this._isOpen || this.options.disabled ) {
+				return;
+			}
+
+			$( 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.css( "height", $( window ).height() );
+
+			if ( backgroundclose ) {
+				this._ui.screen.css( "opacity", 0 )
+						.removeClass("ui-screen-hidden");
+			} else {
+				this._ui.removeClass("ui-screen-hidden");
+
+				if ( this.options.fade ) {
+					this._ui.screen.animate( {opacity: this.options.opacity}, "fast" );
+				} else {
+					this._ui.screen.css( {opacity: this.options.opacity} );
+				}
+			}
+
+			this._setPosition( x_where, y_where );
+
+			this.element.trigger("popupbeforeposition");
+
+			this._ui.container
+				.removeClass("ui-selectmenu-hidden")
+				.addClass("in")
+				.animationComplete( function () {
+					self.element.trigger("popupafteropen");
+				} );
+
+			this._isOpen = true;
+
+			if ( !this._reflow ) {
+				this._reflow = function () {
+					if ( !self._isOpen ) {
+						return;
+					}
+
+					self._setPosition( x_where, y_where );
+				};
+
+				$( window ).bind( "resize", this._reflow );
+			}
+		},
+
+		close: function () {
+			if ( !this._isOpen ) {
+				return;
+			}
+
+			if ( this._reflow ) {
+				$( window ).unbind( "resize", this._reflow );
+				this._reflow = null;
+			}
+
+			var self = this,
+				hideScreen = function () {
+					self._ui.screen.addClass("ui-screen-hidden");
+					self._isOpen = false;
+				};
+
+			this._ui.container.removeClass("in").addClass("reverse out");
+
+			if ( this.options.transition === "none" ) {
+				this._ui.container
+					.addClass("ui-selectmenu-hidden")
+					.removeAttr("style");
+				this.element.trigger("popupafterclose");
+			} else {
+				this._ui.container.animationComplete( function () {
+					self._ui.container
+						.removeClass("reverse out")
+						.addClass("ui-selectmenu-hidden")
+						.removeAttr("style");
+					self.element.trigger("popupafterclose");
+				} );
+			}
+
+			if ( this.options.fade ) {
+				this._ui.screen.animate( {opacity: 0}, "fast", hideScreen );
+			} else {
+				hideScreen();
+			}
+		},
+
+		_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 );
+			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();
+			}
+		}
+	});
+
+	$.tizen.popupwindow.bindPopupToButton = function ( btn, popup ) {
+		if ( btn.length === 0 || popup.length === 0 ) {
+			return;
+		}
+
+		var btnVClickHandler = function ( e ) {
+			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 );
+
+			return false;
+		};
+
+		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 ));
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.progress.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.progress.js
new file mode 100644
index 0000000..3ef742f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.progress.js
@@ -0,0 +1,217 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Shows progressbar or progress circle
+//>>label: Progress
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	'../jquery.mobile.tizen.core'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+ * 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>
+ *	Author: Koeun Choi <koeun.choi@samsung.com>
+ */
+
+/*
+ * Progress widget
+ *
+ * HTML Attributes
+ *
+ *  data-role: set to 'progress'.
+ *  data-style: 'circle' or 'pending'.
+ *
+ * APIs
+ *
+ *  show(): show the progress.
+ *  hide(): hide the progress.
+ *  running(boolean): start or stop the running.
+ *
+ * Events
+ *
+ *  N/A
+ *
+ * Examples
+ *
+ * <li data-role="list-divider">Progress Pending</li>
+ * <li>
+ *	<div data-role="progress" data-style="pending" id="pending"></div>
+ * </li>
+ * <li data-role="list-divider">Progress ~ing</li>
+ * <li>
+ *	<div data-role="progress" data-style="circle" id="progress"></div>Loading..
+ * </li>
+ *
+ * $("#pending").progress( "running", true );
+ * $("#progress").progress( "running", true );
+ *
+ */
+
+/**
+	@class Progress
+	The progress widget shows that an operation is in progress. <br/>To add a progress widget to the application, use the following code:
+
+		<div data-role="progress" data-style="circle"></div>
+*/
+/**
+	@property {String} data-style
+	Sets the style of the progress widget. The style options are pending (pending progress style) and circle (circular progress status style).
+*/
+/**
+	@method running
+	The running method is used to set the current running state of the pending or circular progress widget:
+
+		<div id="foo" data-role="progress" data-style="pending"></div>
+		$("#foo").progress("running", true);
+*/
+/**
+	@method show
+	The show method is used to show the pending or circular progress widget:
+
+		<div id="foo" data-role="progress" data-style="pending"></div>
+		$("#foo").progress("show");
+*/
+/**
+	@method hide
+	The show method is used to hide the pending or circular progress widget:
+
+		<div id="foo" data-role="progress" data-style="pending"></div>
+		$("#foo").progress("hide");
+*/
+
+(function ( $, window, undefined ) {
+	$.widget( "tizen.progress", $.mobile.widget, {
+		options: {
+			style: "circle",
+			running: false
+		},
+
+		show: function () {
+			$( this.element ).show();
+		},
+
+		hide: function () {
+			$( this.element ).hide();
+		},
+
+		_start: function () {
+			if ( !this.init ) {
+				$( this.element ).append( this.html );
+				this.init = true;
+			}
+
+			this.show();
+
+			$( this.element )
+				.find( ".ui-progress-" + this.options.style )
+				.addClass( this.runningClass );
+		},
+
+		_stop: function () {
+			$( this.element )
+				.find( ".ui-progress-" + this.options.style )
+				.removeClass( this.runningClass );
+		},
+
+		running: function ( running ) {
+			if ( running === undefined ) {
+				return this.options.running;
+			}
+
+			this._setOption( "running", running );
+		},
+
+		_setOption: function ( key, value ) {
+			if ( key === "running" ) {
+				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._start();
+			} else {
+				this._stop();
+			}
+		},
+
+		_create: function () {
+			var self = this,
+				element = this.element,
+				style = element.jqmData( "style" ),
+				_html,
+				runningClass;
+
+			if ( style ) {
+				this.options.style = style;
+			} else {
+				style = this.options.style;
+			}
+
+			if ( style == "circle" ) {
+				$( this.element ).addClass("ui-progress-container-circle");
+
+				_html =	'<div class="ui-progress-circle"></div>';
+			} else if ( style === "pending" ) {
+				$( this.element ).addClass("ui-progressbar");
+
+				_html = '<div class="ui-progressbar-bg">' +
+						'<div class="ui-progress-pending"></div>' +
+					'</div>';
+			}
+
+			this.html = $( _html );
+
+			runningClass = "ui-progress-" + style + "-running";
+
+			$.extend( this, {
+				init: false,
+				runningClass: runningClass
+			} );
+
+			if ( style === "pending" ) {
+				$( this.element ).append( this.html );
+				this.init = true;
+			}
+
+			this._refresh();
+		}
+	} ); /* End of widget */
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( e.target ).find( ":jqmData(role='progress')" ).progress();
+	} );
+}( jQuery, this ));
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.progressbar.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.progressbar.js
new file mode 100644
index 0000000..f5863cf
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.progressbar.js
@@ -0,0 +1,155 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Shows progressbar
+//>>label: Progressbar
+//>>group: Tizen:Widgets
+
+define( [
+	'jquery',
+	'../jquery.mobile.tizen.core'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/*
+ * jQuery UI Progressbar @VERSION
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Licensed under the MIT license.
+ * 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 */
+
+
+/**
+	@class ProgressBar
+	The progress bar widget shows a control that indicates the progress percentage of an on-going operation. This widget can be scaled to fit inside a parent container.
+
+	To add a progress bar widget to the application, use the following code:
+
+		<div id="foo" data-role="progressbar"</div>
+*/
+/**
+	@event change
+	The progress bar can define a callback for the change event, which is fired when the progress value is changed:
+		<div id="foo" data-role="progressbar"></div>
+		$("#foo").bind("change", function (ev, val) {
+			Console.log("Value is changed to " + val);
+		});
+*/
+/**
+	@method value
+	You can use the value method with the pickers to set or get the current default progress bar value:
+
+		<div id="foo" data-role="progressbar"></div>
+		var oldVal = $("#foo").progressbar("value");
+		$("#foo").progressbar("value", 50);
+*/
+
+(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.valueDiv.wrap("<div class='ui-progressbar-bg'></div>");
+
+			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.element.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.element.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 ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.scrollview.handler.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.scrollview.handler.js
new file mode 100644
index 0000000..6a8201a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.scrollview.handler.js
@@ -0,0 +1,349 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Shows a scroll-handler with a scrollview
+//>>label: Scrollview Handler
+//>>group: Tizen:Widgets
+
+define( [
+	'jquery',
+	'../jquery.mobile.tizen.core',
+	'../jquery.mobile.tizen.scrollview'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+ * 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 a widget helping a user to scroll a window or panel.
+ * It is different from the scrollview feature in that the handler has a fixed size
+ * and disappears when a scroll size is smaller than a parent window's size.
+ * If the handler widget is activated, a scroll bar on the screen will be deactivated.
+ * The handler widget supports scrolling up and down and indicates the position of the scrolled window.
+ *
+ * HTML Attributes:
+ *
+ *		data-handler : This attribute is indicating that whether enable.
+ *						If you want to use, you will set 'true'.
+ *		data-handler-theme : Set the widget theme ( optional )
+ *
+ * APIs:
+ *
+ *		enableHandler ( boolean )
+ *			: Get or set the use of handler widget.
+ *			If the value is "true", it will be run handler widget.
+ *			If the value is "false", it will be not run handler widget.
+ *			If no value is specified, will act as a getter.
+ *
+ * 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="#">Adam Kinkaid</a></li>
+ *					...
+ *			</ul>
+ *		</div>
+ */
+
+/**
+	@class handler
+	The handler widget enables the user to vertically scroll through a page or panel using a fixed-size handle. The widget indicates the position of the scrolled window, and only appears on the screen if the parent page or panel's scroll size is larger than the screen size. <br/> To add a handler widget to the application, use the following code:
+
+		<div data-role="content" data-scroll="y" data-handler="true">
+			<ul data-role="listview">
+				<li data-role="list-divider">A</li>
+				<li><a href="#">Adam Kinkaid</a></li>
+					...
+			</ul>
+		</div>
+	
+	You can use the enableHandler method with the handler widget to get (if no value is defined) or set the handler usage status. If the [enable] value is true, the handler is enabled; otherwise the handler is not used.
+
+		$("#.selector").scrollview("enableHandler", [enable]);
+*/
+/**
+	@property {Boolean} data-handler
+	Enables the handler widget. The value must be set to true.
+*/
+/**
+	@property {String} data-handler-theme
+	Sets the handler widget theme.
+*/
+( function ( $, document, undefined ) {
+	// The options of handler in scrollview
+	$.tizen.scrollview.prototype.options.handler = false;
+	$.tizen.scrollview.prototype.options.handlerTheme = "s";
+
+	var originSetOption = $.tizen.scrollview.prototype._setOption,
+		createHandler = function ( target ) {
+			var $view = target,
+				prefix = "<div class=\"ui-handler ui-handler-direction-",
+				suffix = "\"><div class=\"ui-handler-track\"><div class=\"ui-handler-handle\"><div class=\"ui-handler-thumb\"></div></div></div></div>",
+				scrollview = $view.data( "scrollview" ),
+				options = scrollview.options,
+				direction = options.direction,
+				parentTheme = $.mobile.getInheritedTheme( scrollview, "s" ),
+				theme = options.theme || parentTheme,
+				isHorizontal = ( scrollview.options.direction === "x" ),
+				_$view = scrollview._$view,
+				_$clip = scrollview._$clip,
+				scrollbar = $view.find( ".ui-scrollbar" ),
+				handler = null,
+				handlerHandle = null,
+				viewLength = 0,
+				clipLength = 0,
+				handlerHeight = 0,
+				handlerMargin = 0,
+				trackLength = 0,
+				moveTimer,
+				isTouchable = $.support.touch,
+				dragStartEvt = ( isTouchable ? "touchstart" : "mousedown" ) + ".handler",
+				dragMoveEvt = ( isTouchable ? "touchmove" : "mousemove" ) + ".handler",
+				dragStopEvt = ( isTouchable ? "touchend" : "mouseup" ) + ".handler",
+				dragLeaveEvt = ( isTouchable ? " touchleave" : " mouseleave" ) + ".handler",
+				calculateLength = function () {
+					clipLength = ( isHorizontal ? _$clip.width() : _$clip.height() );
+					viewLength = ( isHorizontal ? _$view.width() : _$view.height() ) - clipLength;
+					trackLength = clipLength - handlerHeight - handlerMargin * 2;
+				},
+				setHanderPostion = function ( scrollPos ) {
+					var handlerPos = Math.round( ( isHorizontal ? scrollPos.x : scrollPos.y ) / viewLength * trackLength );
+					handlerHandle[0].style[ ( isHorizontal ? "left" : "top" ) ] = handlerPos + "px";
+				},
+				stopHandlerScroll = function () {
+					$( document ).unbind( ".handler" );
+					$view.moveData = null;
+					_$view.trigger( "scrollstop" );
+				};
+
+			if ( $view.find( ".ui-handler-handle" ).length !== 0 || typeof direction !== "string" ) {
+				return;
+			}
+
+			handler = $( [ prefix, direction, suffix ].join( "" ) ).appendTo( $view.addClass( " ui-handler-" + theme ) );
+			handlerHandle = $view.find( ".ui-handler-handle" ).attr( {
+				"tabindex" : "0",
+				"aria-label" : ( isHorizontal ? "Horizontal handler, double tap and move to scroll" : "Verticalhandler, double tap and move to scroll" )
+			}).hide();
+			handlerHeight = ( isHorizontal ? handlerHandle.width() : handlerHandle.height() );
+			handlerMargin = ( isHorizontal ? parseInt( handler.css( "right" ), 10 ) : parseInt( handler.css( "bottom" ), 10 ) );
+
+			$.extend( $view, {
+				moveData : null
+			});
+
+			// handler drag
+			handlerHandle.bind( dragStartEvt, {
+				e : handlerHandle[0]
+			}, function ( event ) {
+				scrollview._stopMScroll();
+
+				var target = event.data.e,
+					t = ( isTouchable ? event.originalEvent.targetTouches[0] : event );
+
+				target.style.opacity = 1.0;
+
+				$view.moveData = {
+					target : target,
+					X : parseInt( target.style.left, 10 ) || 0,
+					Y : parseInt( target.style.top, 10 ) || 0,
+					pX : t.pageX,
+					pY : t.pageY
+				};
+				calculateLength();
+
+				_$view.trigger( "scrollstart" );
+
+				if ( !isTouchable ) {
+					event.preventDefault();
+				}
+
+				$( document ).bind( dragMoveEvt, function ( event ) {
+					var moveData = $view.moveData,
+						target = moveData.target,
+						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 );
+
+					if ( isHorizontal ) {
+						scrollview._setScrollPosition( scrollPos, 0 );
+						target.style.left = handlePos + "px";
+					} else {
+						scrollview._setScrollPosition( 0, scrollPos );
+						target.style.top = handlePos + "px";
+					}
+
+					event.preventDefault();
+				}).bind( dragStopEvt + dragLeaveEvt, function ( event ) {
+					stopHandlerScroll();
+				});
+			});
+
+			_$view.bind( dragStopEvt, function ( event ) {
+				stopHandlerScroll();
+			});
+
+			$view.bind( "scrollstart", function ( event ) {
+				if ( !scrollview.enableHandler() ) {
+					return;
+				}
+
+				calculateLength();
+
+				if ( viewLength < 0 || clipLength < handlerHeight ) {
+					if ( scrollbar.is( ":hidden" ) ) {
+						scrollbar.show();
+					}
+					return;
+				}
+
+				if ( scrollbar.is( ":visible" ) ) {
+					scrollbar.hide();
+				}
+
+				if ( moveTimer ) {
+					clearInterval( moveTimer );
+					moveTimer = undefined;
+				}
+
+				handler.addClass( "ui-handler-visible" );
+				handlerHandle.stop( true, true )
+							.fadeIn();
+			}).bind( "scrollupdate", function ( event, data ) {
+				if ( !scrollview.enableHandler() || viewLength < 0 || clipLength < handlerHeight ) {
+					return;
+				}
+
+				setHanderPostion( scrollview.getScrollPosition() );
+			}).bind( "scrollstop", function ( event ) {
+				if ( !scrollview.enableHandler() || viewLength < 0 || clipLength < handlerHeight ) {
+					return;
+				}
+
+				moveTimer = setInterval( function () {
+					setHanderPostion( scrollview.getScrollPosition() );
+					if ( !scrollview._gesture_timer ) {
+						clearInterval( moveTimer );
+						moveTimer = undefined;
+					}
+				}, 10 );
+
+				if ( scrollview._handlerTimer ) {
+					clearTimeout( scrollview._handlerTimer );
+					scrollview._handlerTimer = 0;
+				}
+				scrollview._handlerTimer = setTimeout( function () {
+					if ( scrollview._timerID === 0 && $view.moveData === null ) {
+						handlerHandle.stop( true, true )
+							.css( "opacity", 1.0 )
+							.fadeOut( function () {
+								handler.removeClass( "ui-handler-visible" );
+							});
+						scrollview._handlerTimer = 0;
+					}
+				}, 1000 );
+			}).bind( "mousewheel", function ( event ) {
+				handler.removeClass( "ui-handler-visible" );
+				setHanderPostion( scrollview.getScrollPosition() );
+			});
+		};
+
+	$.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 ) {
+				if ( $view.find( ".ui-handler" ).length === 0 ) {
+					createHandler( $view );
+				}
+
+				$view.find( ".ui-scrollbar" ).hide();
+				$view.find( ".ui-handler" ).show();
+			} else {
+				$view.find( ".ui-handler" ).removeClass( "ui-handler-visible" ).hide();
+				$view.find( ".ui-scrollbar" ).show();
+			}
+		},
+
+		_setHandlerTheme: function ( handlerTheme ) {
+			if ( !handlerTheme ) {
+				return;
+			}
+
+			var oldClass = "ui-handler-" + this.options.handlerTheme,
+				newClass = "ui-handler-" + handlerTheme;
+
+			this.element.removeClass( oldClass ).addClass( newClass );
+			this.options.handlerTheme = handlerTheme;
+		},
+
+		_setOption: function ( key, value ) {
+			switch ( key ) {
+			case "handler":
+				this.enableHandler( value );
+				break;
+			case "handlerTheme":
+				this._setHandlerTheme( value );
+				break;
+			default:
+				originSetOption.call( this, key, value );
+			}
+		},
+
+		_handlerTimer : 0
+	});
+
+	$( document ).delegate( ":jqmData(scroll)", "scrollviewcreate", function () {
+		var widget = $( this );
+		if ( widget.attr( "data-" + $.mobile.ns + "scroll" ) === "none"
+				|| widget.attr( "data-" + $.mobile.ns + "handler" ) !== "true" ) {
+			return;
+		}
+		widget.scrollview( "enableHandler", "true" );
+	});
+} ( jQuery, document ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.searchbar.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.searchbar.js
new file mode 100644
index 0000000..1981a19
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.searchbar.js
@@ -0,0 +1,324 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Shows searchbar, for text search
+//>>label: Searchbar
+//>>group: Tizen:Widgets
+
+define( [
+	'jquery',
+	'../jquery.mobile.tizen.core',
+	'./jquery.mobile.tizen.pagelayout'
+], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+ * 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
+* Licensed under the MIT license.
+* 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 cancel button in searchbar
+ *		<div data-role="header" data-position ="fixed" >
+ *			<h1>Searchbar</h1>
+ *			<input type="search" data-cancel-btn=true name="" id="" value=""  />
+ *		</div>
+ *
+ *	How to make icon in front of searchbar
+ *		<div data-role="header" data-position ="fixed" >
+ *			<h1>Searchbar</h1>
+ *			<input type="search" data-icon="call" name="" id="" value=""  />
+ *		</div>
+*/
+
+/**
+	@class SearchBar
+	The search bar widget is used to search for page content. This widget can be placed in the header, option header, or page content.
+
+	To add a search bar widget to the application, use the following code:
+
+		<label for="search-basic">Search Input:</label>
+		<input type="search" name="search" id="searc-basic" value="" data-mini="true" />
+
+	Tizen supports many search bar options as described in the jQueryMobile documentation for search bar options.
+	The search bar can define callbacks for events as described in the jQueryMobile documentation for search bar events.
+	You can use methods with the search bar as described in the jQueryMobile documentation for search bar methods.
+*/
+
+(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,
+				cancelbtn,
+				defaultText,
+				defaultTextClass,
+				trimedText,
+				newClassName,
+				newStyle,
+				newDiv,
+				searchimage,
+				inputedText,
+				useCancelBtn = false,
+				frontIcon = false;
+
+			$( "label[for='" + input.attr( "id" ) + "']" ).addClass( "ui-input-text" );
+
+			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();
+
+			if ( $( this.element ).data( "cancel-btn" ) === true ) {
+				useCancelBtn = true;
+				focusedEl.addClass( "ui-input-search-default" );
+			}
+			if ( $( this.element ).data( "icon" ) != undefined ) {
+				frontIcon = true;
+				focusedEl.addClass( "ui-search-bar-icon" );
+			}
+
+			clearbtn = $( "<a href='#' class='ui-input-clear' title='clear text'>clear text</a>" );
+
+			clearbtn.on( "click", function (event) {
+					if ( input.attr( "disabled" ) == "disabled" ) {
+						return false;
+					}
+					input
+						.val( "" )
+						.trigger('change')
+						.focus();
+					event.preventDefault();
+				})
+				.appendTo( focusedEl )
+				.buttonMarkup({
+					icon: "deleteSearch",
+					iconpos: "notext",
+					corners: true,
+					shadow: true
+				});
+
+			/* temporarily delete 06.28 Heeju Joo */
+			/*function toggleClear() {
+				setTimeout(function () {
+					clearbtn.toggleClass( "ui-input-clear-hidden", !input.val()
+				}, 0);
+			}*/
+
+
+			function showCancel() {
+				focusedEl
+					.addClass( "ui-input-search-default" )
+					.removeClass( "ui-input-search-wide" );
+				cancelbtn
+					.addClass( "ui-btn-cancel-show" )
+					.removeClass( "ui-btn-cancel-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" );
+			}
+
+			function makeFrontIcon() {
+				var IconStyle = $( input ).jqmData( "icon" ),
+					frontIcon = $( "<div data-role='button' data-style='circle'></div>" );
+
+				frontIcon
+					.appendTo( focusedEl.parent() )
+					.buttonMarkup( {
+						icon: IconStyle,
+						iconpos: "notext",
+						corners: true,
+						shadow: true
+					} );
+				frontIcon.addClass( "ui-btn-search-front-icon" );
+			}
+			/* temporarily delete - 06.28 Heeju Joo */
+			/*toggleClear();
+
+			input.bind( 'paste cut keyup focus change blur', toggleClear );
+			*/
+
+			/* N_SE-43150 when input get event "focus", it show clearbtn */
+			input.bind( "focus", function() {
+				clearbtn.css("display", "inline-block");
+			});
+			//SLP --start search bar with cancel button
+			focusedEl.wrapAll( "<div class='input-search-bar'></div>" );
+			searchimage = $("<div class='ui-image-search'></div>").appendTo( focusedEl );
+
+			if ( frontIcon ) {
+				makeFrontIcon();
+			}
+
+			if ( useCancelBtn ) {
+				cancelbtn = $( "<div data-role='button' class='ui-input-cancel' title='clear text'>Cancel</div>" )
+					.bind('click', function ( event ) {
+						if ( input.attr( "disabled" ) == "disabled" ) {
+							return false;
+						}
+						event.preventDefault();
+						event.stopPropagation();
+
+						input
+							.val( "" )
+							.trigger('change')
+							.blur();
+
+						if ( useCancelBtn ) {
+							hideCancel();
+						}
+					} )
+					.appendTo( focusedEl.parent() )
+					.buttonMarkup( {
+						iconpos: "cancel",
+						corners: true,
+						shadow: true
+					} );
+			}
+
+			// Input Focused
+			input
+				.focus( function () {
+					if ( input.attr( "disabled" ) == "disabled" ) {
+						return false;
+					}
+					if ( useCancelBtn ) {
+						showCancel();
+					}
+					focusedEl.addClass( $.mobile.focusClass );
+				})
+				.blur(function () {
+					focusedEl.removeClass( $.mobile.focusClass );
+				});
+
+			// 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" );
+						}
+					} );
+			}
+
+			if ( !input.attr("placeholder") ) {
+				input.attr( "placeholder", "Search" );
+			}
+		},
+
+		disable: function () {
+			this.element.attr( "disabled", true );
+			this.element.parent().addClass( "ui-disabled" );
+			$( this.element ).blur();
+			this.element.parent().parent().find(".ui-input-cancel").addClass( "ui-disabled" );
+		},
+
+		enable: function () {
+			this.element.attr( "disabled", false );
+			this.element.parent().removeClass( "ui-disabled" );
+			this.element.parent().parent().find(".ui-input-cancel").removeClass( "ui-disabled" );
+			$( this.element ).focus();
+		}
+	} );
+
+	//auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$.tizen.searchbar.prototype.enhanceWithin( e.target );
+	} );
+
+}( jQuery ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.slider.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.slider.js
new file mode 100644
index 0000000..1e961cf
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.slider.js
@@ -0,0 +1,480 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Shows slider bar to input number by dragging
+//>>label: Slider
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	'../jquery.mobile.tizen.core'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/*
+ * 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'
+ *     popup: boolean; controls whether the popup is displayed or not
+ *                   specify if the popup is enabled using the 'data-popup' attribute
+ *                   set from javascript using .tizenslider('option','popup',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-popup='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','popup',false);
+ *
+ *     // from buttons
+ *     $('#popupEnabler').bind('vclick', function() {
+ *         $('#mySlider').tizenslider('option','popup',true);
+ *     });
+ *     $('#popupDisabler').bind('vclick', function() {
+ *         $('#mySlider').tizenslider('option','popup',false);
+ *     });
+ */
+
+/**
+	@class Slider
+	The slider widget shows a control on the screen that you can use to change values by dragging a handle on a horizontal scale. Sliders can be used in Tizen as described in the jQueryMobile documentation for sliders.
+
+	To add a slider widget to the application, use the following code:
+
+		<input data-popup='false' type="range" name="slider" value="5" min="0" max="10" data-icon="text" data-text-left="Min" data-text-right="Max" />
+
+	The slider can define callbacks for events as described in the jQueryMobile documentation for slider events.
+	You can use methods with the slider as described in the jQueryMobile documentation for slider methods.
+*/
+/**
+	@property {String} data-icon
+	Defines the icon style for the slider ends. The icon options are bright, volume, and text.
+	The default value is text.
+*/
+/**
+	@property {Boolean} data-popup
+	Enables or disables a pop-up showing the current value while the handle is dragged.
+	The default value is true.
+*/
+/**
+	@property {String} data-text-left
+	Defines the text displayed on the left side of the slider.
+	The data-icon option must be set to text.
+*/
+/**
+	@property {String} data-text-right
+	Defines the text displayed on the right side of the slider.
+	The data-icon option must be set to text.
+*/
+
+(function ($, window, undefined) {
+	$.widget("tizen.tizenslider", $.mobile.widget, {
+		options: {
+			popup: true
+		},
+
+		popup: null,
+		handle: null,
+		handleText: null,
+
+		_create: function () {
+			this.currentValue = null;
+			this.popupVisible = false;
+
+			var self = this,
+				inputElement = $( this.element ),
+				slider,
+				popupEnabledAttr,
+				icon,
+				text_right,
+				text_left,
+				text_length,
+				elem_left,
+				elem_right,
+				margin_left,
+				margin_right,
+				_closePopup;
+
+			// apply jqm slider
+			inputElement.slider();
+
+			// hide the slider input element proper
+			inputElement.hide();
+
+			self.popup = $('<div class="ui-slider-popup"></div>');
+
+			// set the popup according to the html attribute
+			popupEnabledAttr = inputElement.jqmData('popup');
+			if ( popupEnabledAttr !== undefined ) {
+				self.options.popup = ( popupEnabledAttr == true );
+			}
+
+			// get the actual slider added by jqm
+			slider = inputElement.next('.ui-slider');
+
+			icon = inputElement.attr('data-icon');
+
+			// wrap the background
+			slider.wrap('<div class="ui-slider-container"></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':
+				elem_left = $('<div class="ui-slider-left-' + icon + '"></div>');
+				elem_right = $('<div class="ui-slider-right-' + icon + '"></div>');
+
+				slider.before( elem_left );
+				slider.after( elem_right );
+
+				margin_left = elem_left.width() + 16;
+				margin_right = elem_right.width() + 16;
+				break;
+
+			case 'text':
+				text_left = ( inputElement.attr('data-text-left') === undefined ) ? '' :
+						inputElement.attr('data-text-left').substring( 0, 3 );
+				text_right = ( inputElement.attr('data-text-right') === undefined ) ? '' :
+						inputElement.attr('data-text-right').substring( 0, 3 );
+
+				text_length = Math.max( text_left.length, text_right.length ) + 1;
+
+				margin_left = text_length + "rem";
+				margin_right = text_length + "rem";
+
+				elem_left = $('<div class="ui-slider-left-text" style="left:' +
+					-( text_length ) + 'rem; width:' + text_length + 'rem;">' +
+					'<span style="position:relative;top:0.4em;">' +
+					text_left +
+					'</span></div>');
+				elem_right = $('<div class="ui-slider-right-text" style="right:' +
+					-( text_length ) + 'rem; width:' + text_length + 'rem;">' +
+					'<span style="position:relative;top:0.4em;">' +
+					text_right +
+					'</span></div>');
+
+				slider.before( elem_left );
+				slider.after( elem_right );
+				break;
+			}
+
+			if ( icon ) {
+				slider.parent('.ui-slider-container').css({
+					"margin-left": margin_left,
+					"margin-right": margin_right
+				});
+			}
+
+			// add a popup element (hidden initially)
+			slider.parents(".ui-page").append( self.popup );
+			self.popup.hide();
+
+			// get the element where value can be displayed
+			self.handleText = slider.find('.ui-btn-text');
+
+			// set initial value
+			self.updateSlider();
+
+			_closePopup = function () {
+				slider.trigger( 'vmouseup' );
+			};
+
+			// bind to changes in the slider's value to update handle text
+			this.element.on('change', function () {
+				// 2013.05.31 heeju.joo
+				// for "refresh" method, (ex. $("input").val(5).slider("refresh"))
+				// conditional statement has been added ( DCM-1735 )
+				// if this function just call two functions like else statement,
+				// popup and handle displayed in the wrong position because when the variable popupVisible is false, updateSlider() does not call popupPosition().
+				if ( !self.popupVisible ) {
+					// it is trick to cheat self.updateSlider()
+					self.popupVisible = true;
+					// updateSlider make the position of handle right
+					self.updateSlider();
+					// for other method, popupVisible variable need to have original value.
+					self.popupVisible = false;
+				} else {
+					self.updateSlider();
+					self.showPopup();
+					$.mobile.$document.on( 'vmouseup.slider', _closePopup );
+				}
+			});
+
+			this.element.on( 'slidestart', function ( event ) {
+				self.updateSlider();
+				self.showPopup();
+				$.mobile.$document.on( 'vmouseup.slider', _closePopup );
+			});
+
+			// bind clicks on the handle to show the popup
+			self.handle.on('vmousedown', function () {
+				self.handle.addClass( "ui-slider-handle-press" );
+				self.showPopup();
+				$.mobile.$document.on( 'vmouseup.slider', _closePopup );
+			});
+
+			slider.on( 'vmousedown', function () {
+				self.updateSlider();
+				self.handle.addClass( "ui-slider-handle-press" );
+				self.showPopup();
+				$.mobile.$document.on( 'vmouseup.slider', _closePopup );
+			}).on( 'vmouseup', function () {
+				self.hidePopup();
+				self.handle.removeClass( "ui-slider-handle-press" );
+				$.mobile.$document.off('vmouseup.slider');
+			});
+
+			$.extend( this, {
+				_globalHandler: [
+					{
+						src: $( window ),
+						handler: {
+							orientationchange: _closePopup,
+						}
+					}
+				]
+			});
+
+			$.each( this._globalHandler, function ( idx, value ) {
+				value.src.bind( value.handler );
+			});
+
+		},
+
+		// 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.height()
+			});
+		},
+
+		// show value on the handle and in popup
+		updateSlider: function () {
+			var font_size,
+				font_length,
+				font_top,
+				padding_size,
+				newValue,
+				get_value_length = function ( v ) {
+					var val = Math.abs( v ),
+						len;
+
+					if ( val > 999 ) {
+						len = 4;
+					} else if ( val > 99 ) {
+						len = 3;
+					} else if ( val > 9 ) {
+						len = 2;
+					} else {
+						len = 1;
+					}
+
+					if ( v < 0 ) {
+						len++;
+					}
+
+					return len;
+				};
+
+			// 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');
+
+			newValue = parseInt(this.element.val(), 10);
+
+			font_length = get_value_length( newValue );
+
+			if ( this.popupVisible ) {
+				this.positionPopup();
+
+				switch ( font_length ) {
+				case 1:
+				case 2:
+					font_size = '1.5rem';
+					padding_size = '0.15rem';
+					break;
+				case 3:
+					font_size = '1rem';
+					padding_size = '0.5rem';
+					break;
+				default:
+					font_size = '0.8rem';
+					padding_size = '0.5rem';
+					break;
+				}
+
+				this.popup.css({
+					"font-size": font_size,
+					"padding-top": padding_size
+				});
+			}
+
+			if ( newValue === this.currentValue ) {
+				return;
+			}
+
+			switch ( font_length ) {
+			case 1:
+				font_size = '0.95rem';
+				font_top = '0';
+				break;
+			case 2:
+				font_size = '0.85rem';
+				font_top = '-0.01rem';
+				break;
+			case 3:
+				font_size = '0.65rem';
+				font_top = '-0.1rem';
+				break;
+			default:
+				font_size = '0.45rem';
+				font_top = '-0.15rem';
+				break;
+			}
+
+			if ( font_size != this.handleText.css('font-size') ) {
+				this.handleText.css({
+					'font-size': font_size,
+					'top': font_top,
+					'position': 'relative'
+				});
+			}
+
+			this.currentValue = newValue;
+			this.handleText.text( newValue );
+			this.popup.html( newValue );
+
+			this.element.trigger( 'update', newValue );
+		},
+
+		// show the popup
+		showPopup: function () {
+			if ( !this.options.popup || this.popupVisible ) {
+				return;
+			}
+
+			this.popup.show();
+			this.popupVisible = true;
+		},
+
+		// hide the popup
+		hidePopup: function () {
+			if ( !this.options.popup || !this.popupVisible ) {
+				return;
+			}
+
+			this.popup.hide();
+			this.popupVisible = false;
+		},
+
+		_setOption: function (key, value) {
+			var needToChange = ( value !== this.options[key] );
+
+			if ( !needToChange ) {
+				return;
+			}
+
+			switch ( key ) {
+			case 'popup':
+				this.options.popup = value;
+
+				if ( this.options.popup) {
+					this.updateSlider();
+				} else {
+					this.hidePopup();
+				}
+
+				break;
+			}
+		}
+	});
+
+	// stop jqm from initialising sliders
+	$( document ).on( "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 ).on( "pagecreate create", function ( e ) {
+		var jqmSliderInitSelector = $.data( window, "jqmSliderInitSelector" );
+		$( e.target ).find(jqmSliderInitSelector).each(function () {
+			var $this = $( this );
+			if ( $this.is("select") ) {
+				$this.slider();
+			} else {
+				$this.tizenslider();
+			}
+		});
+	});
+
+}( jQuery, this ));
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.splitview.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.splitview.js
new file mode 100644
index 0000000..9a3d62e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.splitview.js
@@ -0,0 +1,998 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Show different HTML contents at the same time on each divided pane.
+//>>label: Split view
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	'../jquery.mobile.tizen.scrollview'
+	], function ( ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+ * 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: Sanghee Lee <sang-hee.lee@samsung.com>
+*/
+
+/**
+ *  Splitview is a widget which can show different HTML contents at the same time on each divided pane.
+ *  A user can place Splitview controls on JQuery Mobile's Content area and arrange two panes on the widget.
+ *  And HTML fragments or another Splitview also can be placed on the pane.
+ *  The number of panes inside of Splitview is restricted as two.
+ *  If a user define only one pane in Splitview, a empty pane will be added automatically,
+ *  on the other hand, if 3 or more panes are defined in Splitview, the panes after two will be ignored and removed from the DOM tree.
+ *  The HTML fragments of a pane should be composed of elements describing a part of Web page (e.g. <div>...</div>).
+ *  Also widgets can be included in the HTML fragments.
+ *
+ *  HTML Attributes:
+ *
+ *      data-fixed : The resizing mode of panes - fixed and flexible mode.
+ *              If the value is true, the panes' sizes will be fixed, or if not, it will be flexible. (Default : false)
+ *      data-divider-vertical : The direction of dividers.
+ *              If the value is true, the panes will be placed in horizontal direction,
+ *              or if not, it will be placed in vertical direction. (Default : "true")
+ *      data-ratio : The ratio of two panes' widths or heights. (Default : [ 1/2, 1/2 ]
+ *
+ *  APIs:
+ *
+ *      pane ( id [ , element ] )
+ *          : This method replaces child contents of a pane indicated by id attribute with contents of inputted element.
+ *            If second argument is not specified, it will act as a getter method.
+ *            The string of id has to be started with "#" which means "id" of CSS selectors.
+ *      maximize ( id )
+ *          : This method maximizes a pane's size indicated by id.
+ *            The string of id has to be started with "#" which means "id" of CSS selectors.
+ *      restore ()
+ *          : This method restores all panes' sizes to the ratio prior to maximization.
+ *
+ *  Examples:
+ *
+ *      <div data-role="splitview" data-fixed="false" data-divider-vertical="true" data-ratio="0.5, 0.5">
+ *          <div class="ui-pane">pane0</div>
+ *          <div class="ui-pane">pane1</div>
+ *      </div>
+ *
+ */
+
+
+/**
+	@class Splitview
+	Splitview widget enables a user to place and arrange several panes. Each divided pane can show repective HTML contents.
+
+	To add a Splitview widget to the application, use the following code:
+
+		<div data-role="splitview" data-fixed="false" data-divider-vertical="true" data-ratio="0.5, 0.5">
+			<div class="ui-pane">pane0</div>
+			<div class="ui-pane">pane1</div>
+		</div>
+*/
+
+/**
+	@property {Boolean} data-fixed
+	The resizing mode of panes - fixed and flexible mode.
+*/
+
+/**
+	@property {Boolean} data-divider-vertical
+	The direction of dividers - horizontal or vertical.
+ */
+
+/**
+	@property {Array} data-ratio
+	The ratio of two panes' widths or heights.
+*/
+
+/**
+	@method pane
+	This method replaces child contents of a pane indicated by id attribute with contents of inputted element.
+	If second argument is not specified, it will act as a getter method.
+
+		<div data-role="splitview">
+			<div class="ui-pane" id="pane0">pane0</div>
+			<div class="ui-pane" id="pane1">pane1</div>
+		</div>
+		$(".selector").splitview("pane", id, element);
+*/
+
+/**
+	@method maximize
+	This method maximizes a pane's size indicated by id.
+
+		<div data-role="splitview">
+			<div class="ui-pane" id="pane0">pane0</div>
+			<div class="ui-pane" id="pane1">pane1</div>
+		</div>
+		$(".selector").splitview("maximize", id);
+*/
+
+/**
+	@method restore
+	This method restores all panes' sizes to the ratio prior to maximization.
+
+		<div data-role="splitview">
+			<div class="ui-pane" id="pane0">pane0</div>
+			<div class="ui-pane" id="pane1">pane1</div>
+		</div>
+		$(".selector").splitview("restore");
+*/
+
+( function ( $, window, document, undefined ) {
+	$.widget( "tizen.splitview", $.mobile.widget, {
+		options : {
+			fixed : false,
+			dividerVertical : true,
+			ratio : [],
+			initSelector : ":jqmData(role='splitview')"
+		},
+
+		_create : function () {
+			var self = this,
+				$el = self.element,
+				opt = self.options,
+				$panes = $el.children( ".ui-pane" ),
+				panesLength = $panes.length,
+				spliters = [],
+				spliterBars = [],
+				ratioAttr = this.element.attr( "data-ratio" ),
+				containerSize = [ 0, 0 ],
+				resizeTimer = null,
+				i = 0;
+
+			if ( panesLength !== 2 ) {
+				if ( panesLength < 2 ) {
+					for ( i = panesLength ; i < 2 ; ++i ) {
+						self._addEmptyPanes();
+					}
+				} else {
+					$panes.slice( 2 ).remove();
+				}
+
+				$panes = $el.children( ".ui-pane" );
+				panesLength = $panes.length;
+			}
+
+			spliters[ 0 ] = $( "<a href='#' class='ui-spliter' aria-label='Drag scroll, double tap and move to adjust split area'></a>" ).insertAfter( $panes[ 0 ] );
+			spliterBars[ 0 ] = $( "<div class='ui-spliter-bar'></div>" ).appendTo( spliters[ 0 ] );
+			$( "<div class='ui-spliter-handle'></div>" ).appendTo( spliterBars[ 0 ] );
+
+			$.extend( this, {
+				moveTarget : null,
+				moveData : {},
+				spliters : spliters,
+				spliterBars : spliterBars,
+				panes : $panes,
+				containerSize : containerSize,
+				touchStatus : false,
+				minPaneWidth : 50,
+				savedRatio : []
+			});
+
+			self._bindTouchEvents();
+			self._convertRatio( ratioAttr, $panes.length );
+
+			$el.addClass( "ui-splitview ui-direction-" + self._direction( opt.dividerVertical ) );
+
+			self._refresh();
+
+			$( window ).unbind( ".splitview" )
+				.bind( "pagechange.splitview resize.splitview", function ( event ) {
+					$( ".ui-page-active .ui-splitview" ).each( function () {
+						$( this ).data( "splitview" )._refresh();
+					});
+				});
+		},
+
+		_addEmptyPanes : function () {
+			var self = this,
+				$el = self.element,
+				opt = self.options,
+				$panes = $el.children( ".ui-pane" ),
+				scrollAttribute = ( $.support.scrollview ) ? "data-scroll='y'" : "",
+				pane = $( "<div class='ui-pane' " + scrollAttribute + "></div>" );
+
+			if ( scrollAttribute.length ) {
+				pane.scrollview( { direction: "y" } );
+			}
+
+			if ( !$panes.length ) {
+				$el.append( pane );
+			} else {
+				$panes.last().after( pane );
+			}
+		},
+
+		_direction : function ( isHorizontal ) {
+			return isHorizontal ? "horizontal" : "vertical";
+		},
+
+		_isStyleSpecified : function ( cssString ) {
+			return ( typeof cssString !== "undefined" && cssString.length );
+		},
+
+		_getContainerSize : function ( widthString, heightString ) {
+			var self = this,
+				$el = self.element,
+				widthSpecified = self._isStyleSpecified( widthString ),
+				heightSpecified = self._isStyleSpecified( heightString );
+
+			self.containerSize[ 0 ] = ( widthSpecified ) ? $el.outerWidth( true ) : self._parentWidth();
+			self.containerSize[ 1 ] = ( heightSpecified ) ? $el.outerHeight( true ) : self._parentHeight();
+
+			if ( !self.containerSize[ 0 ] || !self.containerSize[ 1 ] ) {
+				return false;
+			}
+
+			return true;
+		},
+
+		_parentWidth : function () {
+			var $parent = this.element.parent();
+
+			if ( !$parent && typeof $parent === "undefined" && !$parent.length ) {
+				return $( window ).width();
+			}
+
+			return $parent.width();
+		},
+
+		_parentHeight : function () {
+			var $parent = this.element.parent(),
+				heightString = "",
+				heightSpecified = false,
+				parentHeight = 0;
+
+			while ( $parent && typeof $parent !== "undefined" && $parent.length ) {
+				if ( typeof $parent[ 0 ].style !== "undefined" ) {
+					heightString = $parent[ 0 ].style.height;
+					heightSpecified = ( typeof heightString !== "undefined" && heightString.length );
+					if ( heightSpecified ) {
+						parentHeight = $parent.height();
+						break;
+					}
+				}
+
+				$parent = $parent.parent();
+			}
+
+			if ( !heightSpecified ) {
+				parentHeight = $(window).height();
+			}
+
+			return parentHeight;
+		},
+
+		_convertRatio : function ( ratioParam, panesLength ) {
+			var self = this,
+				ratio = [],
+				loop = 0,
+				type = typeof ratioParam,
+				ratioArray = null,
+				i;
+
+			for ( i = 0; i < panesLength; ++i ) {
+				ratio.push( 0 );
+			}
+
+			switch ( type ) {
+			case "number":
+				if ( panesLength ) {
+					ratio[ 0 ] = ratioParam;
+				}
+				break;
+
+			case "string":
+				ratioArray = ratioParam.split( "," );
+				loop = Math.min( ratioArray.length, panesLength );
+				for ( i = 0; i < loop; ++i ) {
+					ratio[ i ] = parseFloat( ratioArray[ i ] );
+				}
+				break;
+
+			case "object":
+				if ( !$.isArray( ratioParam ) ) {
+					break;
+				}
+
+				loop = Math.min( ratioParam.length, panesLength );
+				for ( i = 0; i < loop; ++i ) {
+					type = typeof ratioParam[ i ];
+					ratio[ i ] = ( type === "string" ) ? parseFloat( ratioParam[ i ] ) :
+								( type === "number" ) ? ratioParam[ i ] : 0;
+				}
+				break;
+			}
+
+			self.options.ratio = ratio;
+			self._adjustRatio( panesLength );
+		},
+
+		_adjustRatio : function ( panesLength ) {
+			var self = this,
+				ratio = self.options.ratio,
+				sum = 0,
+				remain = 0,
+				value = 0,
+				subValue = 0,
+				subRemain = 0,
+				i;
+
+			if ( !panesLength ) {
+				self.options.ratio = [];
+				return;
+			}
+
+			for ( i in ratio ) {
+				sum += ratio[ i ];
+			}
+
+			if ( sum !== 1 ) {
+				remain = 1 - sum;
+				value = remain / panesLength;
+
+				for ( i in ratio ) {
+					if ( value >= 0 ) {
+						ratio[ i ] += value;
+						remain = Math.max( 0, remain - value );
+					} else {
+						subRemain += value;
+						subValue = Math.max( subRemain, ratio[ i ] * -1 );
+						ratio[ i ] = Math.max( 0, ratio[ i ] + subValue );
+						remain = Math.min( 0, remain - subValue );
+						subRemain -= subValue;
+					}
+				}
+
+				if ( remain ) {
+					if ( remain > 0 ) {
+						ratio[ ratio.length - 1 ] += remain;
+					} else {
+						for ( i = ratio.length - 1; i >= 0; --i ) {
+							subValue = Math.max( remain, ratio[ i ] * -1 );
+							ratio[ i ] = Math.max( 0, ratio[ i ] + subValue );
+							remain = Math.min( 0, remain - subValue );
+							if ( !remain ) {
+								break;
+							}
+						}
+					}
+				}
+
+				self.options.ratio = ratio;
+			}
+		},
+
+		_setOption : function ( key, value ) {
+			var self = this,
+				orgValue = self.options[ key ];
+
+			if ( orgValue === value ) {
+				return;
+			}
+
+			$.Widget.prototype._setOption.apply( this, arguments );
+
+			switch ( key ) {
+			case "fixed":
+				self._fixed( value );
+				break;
+
+			case "dividerVertical":
+				self._dividerVertical( value );
+				break;
+
+			case "ratio":
+				self._ratio( value );
+				break;
+			}
+		},
+
+		_subtractDiffWidth : function ( width, diff ) {
+			var self = this;
+
+			if ( width <= self.minPaneWidth ) {
+				return {
+					width: width,
+					diff: diff
+				};
+			}
+
+			width += diff;
+			if ( width >= self.minPaneWidth ) {
+				return {
+					width: width,
+					diff: 0
+				};
+			}
+
+			return {
+				width: self.minPaneWidth,
+				diff: width - self.minPaneWidth
+			};
+		},
+
+		_initRatio : function ( fromFirstPane, panes, isHorizontal, availableWidth ) {
+			var self = this,
+				sum = 0,
+				widths = [],
+				diff = 0,
+				panesLength = panes.length,
+				ret,
+				i;
+
+			panes.each( function ( i ) {
+				var pane = $( this );
+				widths.push( isHorizontal ? pane.width() : pane.height() );
+				sum += widths[ i ];
+			});
+
+			diff = availableWidth - sum;
+			if ( !diff ) {
+				return widths;
+			}
+
+			if ( diff > 0 ) {
+				widths[ fromFirstPane ? 0 : panesLength - 1 ] += diff;
+			} else {
+				if ( fromFirstPane ) {
+					for ( i = 0; i < panesLength; ++i ) {
+						ret = self._subtractDiffWidth( widths[ i ], diff );
+						widths[ i ] = ret.width;
+						diff = ret.diff;
+						if ( !diff ) {
+							break;
+						}
+					}
+				} else {
+					for ( i = panesLength - 1; i >= 0; --i ) {
+						diff = self._subtractDiffWidth( widths[ i ], diff );
+						widths[ i ] = ret.width;
+						diff = ret.diff;
+						if ( !diff ) {
+							break;
+						}
+					}
+				}
+			}
+
+			sum = 0;
+			for ( i in widths ) {
+				sum += widths[ i ];
+			}
+
+			for ( i in self.options.ratio ) {
+				self.options.ratio[ i ] = widths[ i ] / sum;
+			}
+
+			return widths;
+		},
+
+		_horizontalBoundary : function () {
+			var self = this,
+				$el = self.element;
+
+			return $el.outerWidth( true ) - $el.width();
+		},
+
+		_verticalBoundary : function () {
+			var self = this,
+				$el = self.element;
+
+			return $el.outerHeight( true ) - $el.height();
+		},
+
+		_boundary : function ( type ) {
+			var self = this,
+				$el = self.element,
+				computedStyle = window.getComputedStyle( $el[ 0 ], null ),
+				margin = parseFloat( computedStyle[ "margin" + type ] ),
+				border = parseFloat( computedStyle[ "border" + type + "Width" ] ),
+				padding = parseFloat( computedStyle[ "padding" + type ] );
+
+			return {
+				margin: margin,
+				border: border,
+				padding: padding
+			};
+		},
+
+		_layout : function ( initRatio, fromFirstPane ) {
+			var self = this,
+				$el = self.element,
+				opt = self.options,
+				isHorizontal = opt.dividerVertical,
+				$panes = self.panes,
+				spliters = self.spliters,
+				spliterBars = self.spliterBars,
+				spliterBar = self.spliterBars.length ? $( spliterBars[ 0 ] ) : null,
+				spliterWidth = !spliterBar ? 0 :
+								isHorizontal ? spliterBar.outerWidth() :
+												spliterBar.outerHeight(),
+				spliterBarMargin = !spliterBar ? 0 :
+									isHorizontal ?
+										spliterBar.outerWidth( true ) - spliterBar.outerWidth() :
+										spliterBar.outerHeight( true ) - spliterBar.outerHeight(),
+				panesLength = $panes.length,
+				currentAvailable = 0,
+				spliterSize = spliterWidth * ( panesLength - 1 ),
+				parentWidth = self.containerSize[ 0 ],
+				parentHeight = self.containerSize[ 1 ],
+				width = parentWidth - self._horizontalBoundary(),
+				height = parentHeight - self._verticalBoundary(),
+				innerSize = isHorizontal ? height : width,
+				availableWidth = isHorizontal ? width - spliterSize :
+												height - spliterSize,
+				initializedWidth = [],
+				widthSum = 0,
+				childSplitview = null;
+
+			initRatio = !!initRatio;
+			fromFirstPane = !!fromFirstPane;
+
+			$el.css( {
+				"min-width" : width,
+				"min-height" : height
+			});
+
+			if ( initRatio ) {
+				initializedWidth = self._initRatio( fromFirstPane, $panes, isHorizontal, availableWidth );
+			}
+
+			currentAvailable = availableWidth;
+			$panes.each( function ( i ) {
+				var $pane = $( this ),
+					paneWidth = initRatio ? initializedWidth[ i ] :
+										Math.floor( availableWidth * self.options.ratio[i] ),
+					prevPane = ( ( i ) ? $panes.eq( i - 1 ) : null ),
+					posValue = 0,
+					widthValue = 0,
+					heightValue = 0,
+					boundary = 0;
+
+				currentAvailable -= paneWidth;
+				if ( i === ( panesLength - 1 ) ) {
+					if ( self.touchStatus ) {
+						paneWidth = self.moveData.nextPaneWidth = availableWidth - ( self.moveData.targetPos + spliterWidth );
+					} else {
+						paneWidth = Math.max( Math.min( paneWidth, self.minPaneWidth ), paneWidth + currentAvailable );
+					}
+				}
+
+				widthSum += paneWidth;
+
+				if ( !prevPane ) {
+					boundary = self._boundary( isHorizontal ? "Left" : "Top" );
+					posValue = boundary.padding;
+				} else {
+					posValue = parseInt( prevPane.css( isHorizontal ? "left" : "top" ), 10 );
+					posValue += isHorizontal ? prevPane.width() : prevPane.height();
+					posValue += spliterWidth;
+				}
+
+				widthValue = isHorizontal ? paneWidth : innerSize;
+				heightValue = isHorizontal ? innerSize : paneWidth;
+
+				$pane.css( {
+					"width" : widthValue ,
+					"height" : heightValue
+				} );
+
+				$pane.css( ( isHorizontal ? "left" : "top" ), posValue );
+			});
+
+			$panes.each( function ( i ) {
+				var $pane = $( this ),
+					paneWidth = isHorizontal ? $pane.width() : $pane.height();
+
+				self.options.ratio[ i ] = paneWidth / widthSum;
+			});
+
+			$.each( spliters, function ( i ) {
+				var spliter = $( this ),
+					prevPane = $panes.eq( i ),
+					bar = spliter.children( ".ui-spliter-bar" ),
+					handle = bar.children( ".ui-spliter-handle" ),
+					posValue = 0;
+
+				if ( isHorizontal ) {
+					posValue = parseInt( prevPane.css( "left" ), 10 ) + prevPane.width() - spliterBarMargin;
+					spliter.outerHeight( innerSize ).css( "left", posValue );
+				} else {
+					posValue = parseInt( prevPane.css( "top" ), 10 ) + prevPane.height() - spliterBarMargin;
+					spliter.outerWidth( innerSize ).css( "top", posValue );
+				}
+
+				if ( bar.length ) {
+					bar[ isHorizontal ? "outerHeight" : "outerWidth" ]( innerSize );
+				}
+				if ( handle.length ) {
+					handle.css( isHorizontal ? "top" : "left", ( innerSize - spliterWidth ) / 2 );
+				}
+			});
+
+			childSplitview = $el.find( ".ui-splitview:first" );
+			if ( !childSplitview.length ) {
+				return;
+			}
+
+			childSplitview = childSplitview.data( "splitview" );
+			if ( childSplitview ) {
+				childSplitview._refresh();
+			}
+		},
+
+		_bindTouchEvents : function () {
+			var self = this,
+				$el = self.element,
+				$panes = self.panes,
+				spliters = self.spliters;
+
+			$.each( spliters, function ( i ) {
+				var spliter = $( this );
+				self._bindSpliterTouchEvents.call( self, spliter );
+			});
+		},
+
+		_bindSpliterTouchEvents : function ( spliter ) {
+			var self = this,
+				$el = self.element,
+				opt = self.options,
+				touchStartEvt = ( $.support.touch ? "touchstart" : "mousedown" ),
+				touchMoveEvt = ( $.support.touch ? "touchmove" : "mousemove" ) + ".splitview",
+				touchEndEvt = ( $.support.touch ? "touchend" : "mouseup" ) + ".splitview";
+
+			spliter.bind( touchStartEvt, { e : spliter }, function ( event ) {
+				if ( self.options.fixed ) {
+					return;
+				}
+
+				var realEvent = $.support.touch ? event.originalEvent.changedTouches[0] : event,
+					targetSpliter = event.data.e,
+					prevPane = targetSpliter.prev(),
+					nextPane = targetSpliter.next(),
+					splitviewInPrev = prevPane.find( ".ui-splitview:first" ),
+					splitviewInNext = nextPane.find( ".ui-splitview:first" ),
+					isHorizontal = opt.dividerVertical,
+					spliterWidth = isHorizontal ?
+									$( self.spliterBars[0] ).outerWidth() :
+									$( self.spliterBars[0] ).outerHeight();
+
+				self.moveTarget = targetSpliter;
+				self.moveData = {
+					spliterWidth : spliterWidth || 0,
+					prevPane : prevPane,
+					nextPane : nextPane,
+					splitviewInPrev : splitviewInPrev,
+					splitviewInNext : splitviewInNext,
+					prevPanePos : parseInt( prevPane.css( isHorizontal ? "left" : "top" ), 10 ) || 0,
+					prevPaneWidth : parseInt( prevPane.css( isHorizontal ? "width" : "height" ), 10 ) || 0,
+					nextPanePos : parseInt( nextPane.css( isHorizontal ? "left" : "top" ), 10 ) || 0,
+					nextPaneWidth : parseInt( nextPane.css( isHorizontal ? "width" : "height" ), 10 ) || 0,
+					targetPos : parseInt( targetSpliter.css( isHorizontal ? "left" : "top" ), 10 ) || 0,
+					pagePos : isHorizontal ? realEvent.pageX : realEvent.pageY
+				};
+
+				targetSpliter.addClass( "ui-spliter-active" );
+
+				$el.bind( touchMoveEvt, function ( event ) {
+					if ( !self.touchStatus ) {
+						return;
+					}
+					event.stopPropagation();
+					self._drag( $.support.touch ? event.originalEvent.changedTouches[0] : event );
+				}).bind( touchEndEvt, function ( event ) {
+					event.stopPropagation();
+					self._stop( $.support.touch ? event.originalEvent.changedTouches[0] : event );
+					self.touchStatus = false;
+					$el.unbind( ".splitview" );
+					$( document ).unbind( ".splitview" );
+				});
+
+				$( document ).bind( touchMoveEvt + " " + touchEndEvt, function () {
+					$el.trigger( touchEndEvt );
+				});
+
+				event.preventDefault();
+				self.touchStatus = true;
+			});
+		},
+
+		_drag : function ( e ) {
+			if ( !this.moveData || typeof this.moveData === "undefined" ) {
+				return;
+			}
+
+			var self = this,
+				$el = self.element,
+				opt = self.options,
+				isHorizontal = opt.dividerVertical,
+				moveData = self.moveData,
+				moveTarget = self.moveTarget,
+				prevPane = moveData.prevPane,
+				nextPane = moveData.nextPane,
+				splitviewInPrev = moveData.splitviewInPrev,
+				splitviewInNext = moveData.splitviewInNext,
+				spliterWidth = moveData.spliterWidth,
+				movement = null,
+				targetPos = null,
+				nextPanePos = null,
+				prevPaneWidth = null,
+				nextPaneWidth = null,
+				pagePos = isHorizontal ? e.pageX : e.pageY,
+				splitview = null;
+
+			movement = pagePos - moveData.pagePos;
+			if ( movement > 0 ) {
+				movement = Math.min( Math.max( moveData.nextPaneWidth - self.minPaneWidth, 0 ), movement );
+			} else {
+				movement = Math.max( Math.max( moveData.prevPaneWidth - self.minPaneWidth, 0 ) * -1, movement );
+			}
+
+			nextPanePos = moveData.nextPanePos + movement;
+			prevPaneWidth = Math.max( moveData.prevPaneWidth + movement, 0 );
+			nextPaneWidth = Math.max( moveData.nextPaneWidth - movement, 0 );
+			targetPos = moveData.targetPos + movement;
+
+			moveTarget.css( isHorizontal ? { left : targetPos } : { top : targetPos } );
+			prevPane.css( isHorizontal ? { width : prevPaneWidth } : { height : prevPaneWidth } );
+			nextPane.css( isHorizontal ? { width : nextPaneWidth, left : nextPanePos } :
+											{ height : nextPaneWidth, top : nextPanePos } );
+
+			if ( splitviewInPrev.length ) {
+				splitview = splitviewInPrev.data( "splitview" );
+				splitview._refresh( true, false );
+			}
+
+			if ( splitviewInNext.length ) {
+				splitview = splitviewInNext.data( "splitview" );
+				splitview._refresh( true, true );
+			}
+		},
+
+		_stop : function ( e ) {
+			if ( !this.moveData || !this.moveTarget ) {
+				return;
+			}
+
+			var self = this,
+				$el = self.element,
+				opt = self.options,
+				$panes = self.panes,
+				panesLength = $panes.length,
+				isHorizontal = opt.dividerVertical,
+				moveData = self.moveData,
+				moveTarget = self.moveTarget,
+				prevPane = moveData.prevPane,
+				nextPane = moveData.nextPane,
+				splitviewInPrev = moveData.splitviewInPrev,
+				splitviewInNext = moveData.splitviewInNext,
+				spliterWidth = moveData.spliterWidth,
+				spliterSize = spliterWidth * ( panesLength - 1 ),
+				movement = null,
+				targetPos = null,
+				nextPanePos = null,
+				prevPaneWidth = null,
+				nextPaneWidth = null,
+				displayStyle = $el.css( "display" ),
+				parentWidth = self.containerSize[ 0 ],
+				parentHeight = self.containerSize[ 1 ],
+				width = parentWidth - self._horizontalBoundary(),
+				height = parentHeight - self._verticalBoundary(),
+				availableWidth = isHorizontal ?
+									( width - spliterSize ) :
+									( height - spliterSize ),
+				sum = 0;
+
+			moveTarget.removeClass( "ui-spliter-active" );
+
+			// ratio calculation
+			$panes.each( function ( i ) {
+				var $pane = $( this ),
+					paneWidth = isHorizontal ? $pane.width() : $pane.height();
+
+				sum += paneWidth;
+			});
+
+			$panes.each( function ( i ) {
+				var $pane = $( this ),
+					paneWidth = isHorizontal ? $pane.width() : $pane.height();
+
+				self.options.ratio[ i ] = paneWidth / sum;
+			});
+
+			self.moveData = null;
+		},
+
+		_fixed : function ( isFix ) {
+			var self = this,
+				spliters = self.spliters;
+
+			$.each( spliters, function ( i ) {
+				var $spliter = $( this );
+
+				if ( isFix ) {
+					$spliter.addClass( "ui-fixed" );
+				} else {
+					$spliter.removeClass( "ui-fixed" );
+				}
+			});
+
+			self._layout();
+		},
+
+		_dividerVertical : function ( isDividerVertical ) {
+			var self = this,
+				$el = self.element,
+				isHorizontal = isDividerVertical,
+				$panes = null,
+				$spliters = null,
+				$bar = null,
+				$handle = null;
+
+			$panes = $el.children( ".ui-pane" );
+			$spliters = $el.children( ".ui-spliter" );
+			$bar = $spliters.children( ".ui-spliter-bar" );
+			$handle = $bar.children( ".ui-spliter-handle" );
+
+			$el.removeClass( "ui-direction-vertical" );
+			$el.removeClass( "ui-direction-horizontal" );
+			$el.addClass( "ui-splitview ui-direction-" + self._direction( isHorizontal ) );
+
+			$panes.css( {
+				"left" : "",
+				"top" : "",
+				"width" : "",
+				"height" : ""
+			});
+
+			$spliters.css( {
+				"left" : "",
+				"top" : "",
+				"width" : "",
+				"height" : ""
+			});
+
+			$bar.css( {
+				"width" : "",
+				"height" : ""
+			});
+
+			$handle.css( {
+				"left" : "",
+				"top" : ""
+			});
+
+			if ( self._getContainerSize( $el[ 0 ].style.width, $el[ 0 ].style.height ) ) {
+				self._layout();
+			}
+		},
+
+		_ratio : function ( ratioParam ) {
+			var self = this,
+				$el = self.element,
+				$panes = $el.children( ".ui-pane" ),
+				panesLength = $panes.length;
+
+			self._convertRatio( ratioParam, panesLength );
+			self._layout();
+		},
+
+		_refresh : function ( initRatio, fromFirstPane ) {
+			var self = this,
+				$el = self.element;
+
+			initRatio = !!initRatio;
+			fromFirstPane = !!fromFirstPane;
+
+			if ( self._getContainerSize( $el[ 0 ].style.width, $el[ 0 ].style.height ) ) {
+				self._layout( initRatio, fromFirstPane );
+			}
+		},
+
+		pane : function ( id, element ) {
+			if ( typeof id !== "string" ) {
+				return null;
+			}
+
+			var self = this,
+				$el = self.element,
+				$targetPane = $el.children( id ),
+				$targetView = null,
+				elementParent = null;
+
+			if ( !$targetPane.hasClass( "ui-pane" ) ) {
+				return null;
+			}
+
+			// getter
+			if ( !element ) {
+				return $targetPane.contents();
+			}
+
+			// setter
+			if ( $targetPane.hasClass( "ui-scrollview-clip" ) ) {
+				$targetPane.scrollview( "scrollTo", 0, 0, 0 );
+
+				$targetView = $targetPane.children( ".ui-scrollview-view" );
+				if ( !$targetView.length ) {
+					return null;
+				}
+			} else {
+				$targetView = $targetPane;
+			}
+
+			elementParent = element.parent();
+			if ( elementParent.length && elementParent[ 0 ] === $targetView[ 0 ] ) {
+				return;
+			}
+
+			$targetView.empty().append( element ).trigger( "create" );
+			$targetView.fadeIn( 'fast' );
+		},
+
+		maximize : function ( id ) {
+			if ( typeof id !== "string" ) {
+				return;
+			}
+
+			var self = this,
+				$el = self.element,
+				$panes = self.panes,
+				$targetPane = $el.children( id );
+
+			if ( !$targetPane.hasClass( "ui-pane" ) ) {
+				return;
+			}
+
+			self.savedRatio = self.options.ratio.slice();
+
+			self.options.ratio = [];
+			$panes.each( function ( i ) {
+				self.options.ratio.push( ( this === $targetPane[ 0 ] ) ? 1 : 0 );
+			});
+
+			self._layout();
+		},
+
+		restore : function () {
+			var self = this;
+
+			if ( !self.savedRatio.length ) {
+				return;
+			}
+
+			self.options.ratio = self.savedRatio.slice();
+			self._adjustRatio( self.panes.length );
+
+			self._layout();
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$.tizen.splitview.prototype.enhanceWithin( e.target );
+	});
+} ( jQuery, window, document ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.swipe.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.swipe.js
new file mode 100644
index 0000000..90dc1b5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.swipe.js
@@ -0,0 +1,350 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Shows background listitem by swiping left/right on a listitem
+//>>label: Swipe list
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	'../jquery.mobile.tizen.core',
+	"jqm/jquery.mobile.widget"
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/*
+ * 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>
+ *          Hyunjung Kim <hjnim.kim@samsung.com>
+ */
+
+// Widget which turns a html element into a "swipe":
+// 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 swipe
+// also moves the cover back to the left.
+//
+// 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.
+//
+// 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.
+//
+
+/**
+	@class Swipe
+	The swipe widget shows a view on the screen where the items can be swiped vertically to show a menu.
+	To add a swipe widget to the application, use the following code:
+
+		<ul data-role="listview">
+			<li data-role="swipe">
+				<div data-role="swipe-cover">
+					<div data-role="button" data-inline="true">OK</div>
+					<div data-role="button" data-inline="true">Cancel</div>
+				</div>
+				<div data-role="swipe-item-cover">
+					<p>This is a swipe item cover.<br>
+						This will be swiped out when swipe event comes.</p>
+				</div>
+			</li>
+		</ul>
+
+	You can use methods with the swipe as described in the jQueryMobile documentation for view methods.
+*/
+/**
+	@property {String} data-role
+	Creates a swipe using the HTML unordered view (&gt;ul&lt;) element.
+	The default value is swipe.
+
+	Creates a swipe item cover using an HTML $gt;div$lt; element. This cover can be swiped to show the content beneath it.
+	The default value is swipe-item-cover.
+*/
+/**
+	@method open
+	uncover swipe item
+*/
+/**
+	@method close
+	cover swipe item
+*/
+/**
+	@method opened
+	return coveritem status( coverd or uncovred )
+*/
+/**
+	@event animationstart
+	The swipe can define a callback for the animationstart event, which is fired after a item is swipe and the swipe animation is start:
+*/
+/**
+	@event animationend
+	The swipe can define a callback for the animationend event, which is fired after a item is swiped and the swipe animation is complete:
+
+		<ul data-role="listview">
+		<li data-role="swipe">
+				<div data-role="swipe-cover">
+					<div data-role="button" data-inline="true">OK</div>
+					<div data-role="button" data-inline="true">Cancel</div>
+				</div>
+				<div data-role="swipe-item-cover" id="foo">
+				<p>This is a swipe item cover.<br>
+						This will be swiped out when swipe event comes.</p>
+				</div>
+			</li>
+		</ul>
+		$("#foo").bind("animationend", function (ev)
+		{
+			Console.log("Swipe cover's animation is complete.");
+		});
+*/
+(function ($) {
+
+	$.widget("tizen.swipe", $.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') ||
+				's';
+
+			this.options.theme = theme;
+			this._isopen = false;
+			this.refresh();
+		},
+
+		refresh: function () {
+			this._cleanupDom();
+
+			var self = this,
+				defaultCoverTheme,
+				covers,
+				coverTheme,
+				item,
+				itemHasThemeClass;
+
+			defaultCoverTheme = 'ui-body-' + this.options.theme;
+
+			if ( !this.element.parent().hasClass('ui-listview') ) {
+				this.element.parent().listview();
+			}
+			this.element.addClass('ui-swipe');
+
+			// get the item covers
+			covers = this.element.find(':jqmData(role="swipe-item-cover")');
+			item = this.element.find(':jqmData(role="swipe-item")');
+
+			this._covers = covers;
+			this._item = item;
+			item.addClass('ui-swipe-item');
+			coverTheme = defaultCoverTheme;
+			itemHasThemeClass = item.parent().attr('class')
+					.match(/ui\-body\-[a-z]|ui\-bar\-[a-z]/);
+
+			covers.each( function () {
+				var cover = $( this );
+
+				if ( itemHasThemeClass ) {
+					coverTheme = itemHasThemeClass[0];
+				}
+
+				cover.addClass('ui-swipe-item-cover');
+				cover.addClass( coverTheme );
+
+				if ( cover.has('.ui-swipe-item-cover-inner').length === 0 ) {
+					cover.wrapInner( $('<span/>').addClass('ui-swipe-item-cover-inner') );
+				}
+
+				if ( !( cover.data('animateRight') && cover.data('animateLeft') ) ) {
+					cover.data('animateRight', function () {
+						self._animateCover( cover, 110, item );
+					});
+
+					cover.data('animateLeft', function () {
+						self._animateCover( cover, 0, item );
+					});
+				}
+
+				// bind to synthetic events
+				item.bind( 'swipeleft', cover.data('animateLeft') );
+				cover.bind( 'swiperight', cover.data('animateRight') );
+				item.find( '.ui-btn' ).bind( 'vclick', cover.data('animateLeft') );
+			} );
+
+		},
+
+		_cleanupDom: function () {
+			var self = this,
+				defaultCoverTheme,
+				cover,
+				coverTheme = defaultCoverTheme,
+				item,
+				itemClass,
+				itemHasThemeClass,
+				text,
+				wrapper;
+
+			defaultCoverTheme = 'ui-body-' + this.options.theme;
+
+			this.element.removeClass('ui-swipe');
+
+			// get the item covers
+			cover = this.element.find(':jqmData(role="swipe-item-cover")');
+			item = this.element.find(':jqmData(role="swipe-item")');
+
+			item.removeClass('ui-swipe-item');
+			cover.removeClass('ui-swipe-item-cover');
+
+			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-swipe-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, item ) {
+			var self = this,
+				animationOptions = {
+					easing: 'linear',
+					duration: 'normal',
+					queue: true,
+					complete: function () {
+						cover.trigger('animationend');
+					}
+				};
+
+			$( this.element.parent() )
+				.find(":jqmData(role='swipe')")
+				.each(
+					function () {
+						if ( this !== self.element.get(0) &&
+								$( this ).swipe("opened") ) {
+							$( this ).swipe("close");
+						}
+					}
+				);
+
+			if ( leftPercentage == 110 ) {
+				this._isopen = true;
+			} else {
+				this._isopen = false;
+			}
+
+			cover.stop();
+			cover.clearQueue();
+			cover.trigger('animationstart');
+			cover.clearQueue().animate( { left: leftPercentage + '%' }, animationOptions );
+			if ( leftPercentage == 0 ) {
+				item.clearQueue().animate({ opacity: 0 }, "slow");
+			} else {
+				item.clearQueue().animate({ opacity: 1 }, "slow");
+			}
+
+		},
+
+		destroy: function () {
+			this._cleanupDom();
+		},
+
+		open: function () {
+			var self = this;
+
+			$( self._covers ).each( function () {
+				var cover = $( this );
+				self._animateCover( cover, 110, self._item);
+			} );
+		},
+
+		opened: function () {
+			return this._isopen;
+		},
+
+		close: function () {
+			var self = this;
+
+			$( self._covers ).each( function () {
+				var cover = $( this );
+				self._animateCover( cover, 0, self._item);
+			} );
+		}
+
+	});
+
+	$( document ).bind("pagecreate", function ( e ) {
+		$( e.target ).find(":jqmData(role='swipe')").swipe();
+	});
+
+}( jQuery ));
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.tabbar.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.tabbar.js
new file mode 100644
index 0000000..13adcb2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.tabbar.js
@@ -0,0 +1,287 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Shows buttons divided automatically on the header
+//>>label: Tabbar
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery', 
+	'../jquery.mobile.tizen.core',
+	'./jquery.mobile.tizen.pagelayout'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+ * 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 : "tabbar" plugin
+ * Copyright (c) jQuery Project
+ * Licensed under the MIT license.
+ * http://jquery.org/license
+ * Authors: Jinhyuk Jun <jinhyuk.jun@samsung.com>
+*/
+
+/**
+ *  Tabbar can be created using data-role = "tabbar" inside footer 
+ *  Framework determine which tabbar will display with tabbar attribute
+ *
+ * Examples:
+ *         
+ *     HTML markup for creating tabbar: ( 2 ~ 5 li item available )
+ *     icon can be changed data-icon attribute (customized icon need)
+ *         <div data-role="footer" data-position ="fixed">
+ *              <div data-role="tabbar">
+ *                     <ul>
+ *                            <li><a href="#" class="ui-btn-active">Menu</a></li>
+ *                            <li><a href="#">Save</a></li>
+ *                            <li><a href="#">Share</a></li>
+ *                     </ul>
+ *             </div>
+ *      </div>
+*/
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.tabbar", $.mobile.widget, {
+		options: {
+			iconpos: "top",
+			grid: null,
+			defaultList : 4,
+			initSelector: ":jqmData(role='tabbar')"
+		},
+
+		_create: function () {
+
+			var $tabbar = this.element,
+				$tabbtns,
+				textpos,
+				iconpos,
+				theme = $.mobile.listview.prototype.options.theme,	/* Get current theme */
+				ww = window.innerWidth || $( window ).width(),
+				wh = window.innerHeight || $( window ).height(),
+				tabbarDividerLeft = "<div class='ui-tabbar-divider ui-tabbar-divider-left'></div>",
+				tabbarDividerRight = "<div class='ui-tabbar-divider ui-tabbar-divider-right'></div>",
+				isLandscape;
+
+			isLandscape = ww > wh && ( ww - wh );
+
+			if ( isLandscape ) {
+				$tabbar.removeClass( "ui-portrait-tabbar" ).addClass( "ui-landscape-tabbar" );
+			} else {
+				$tabbar.removeClass( "ui-landscape-tabbar" ).addClass( "ui-portrait-tabbar" );
+			}
+
+			if ( $tabbar.find( "a" ).length ) {
+				$tabbtns = $tabbar.find( "a" );
+				iconpos = $tabbtns.filter( ":jqmData(icon)" ).length ? this.options.iconpos : undefined;
+				textpos = $tabbtns.html().length ? true : false;
+			}
+
+			if ( $tabbar.parents( ".ui-header" ).length && $tabbar.parents( ".ui-scrollview-view" ).length ) {
+				$tabbar.find( "li" ).addClass( "tabbar-scroll-li" );
+				$tabbar.find( "ul" ).addClass( "tabbar-scroll-ul" );
+
+				/* add shadow divider */
+				$( tabbarDividerLeft ).appendTo( $tabbar.parents( ".ui-scrollview-clip" ) );
+				$( tabbarDividerRight ).appendTo( $tabbar.parents( ".ui-scrollview-clip" ) );
+
+				$( ".ui-tabbar-divider-left" ).hide();
+				$( ".ui-tabbar-divider-right" ).hide();
+
+				/* add width calculation*/
+				if ( $tabbar.parents( ".ui-scrollview-view" ).data("default-list") ) {
+					this.options.defaultList = $tabbar.parents( ".ui-scrollview-view" ).data( "default-list" );
+				}
+				$tabbar.find( "li" ).css( "width", window.innerWidth / this.options.defaultList + "px" );
+			} else {
+				if ( $tabbar.find( "ul" ).children().length ) {
+					$tabbar.addClass( "ui-navbar" )
+						.find( "ul" )
+						.grid( { grid: this.options.grid } );
+				}
+			}
+
+			if ( $tabbar.parents( ".ui-footer" ).length  ) {
+				$tabbar.find( "li" ).addClass( "ui-tab-btn-style" );
+			}
+
+			/* title tabbar */
+			if ( $tabbar.siblings( ".ui-title" ).length ) {
+				$tabbar.parents( ".ui-header" ).addClass( "ui-title-tabbar" );
+			}
+
+			if ( !iconpos ) {
+				$tabbar.addClass( "ui-tabbar-noicons" );
+			}
+			if ( !textpos ) {
+				$tabbar.addClass( "ui-tabbar-notext" );
+			}
+			if ( textpos && iconpos ) {
+				$tabbar.parents( ".ui-header" ).addClass( "ui-title-tabbar-multiline" );
+			}
+
+			if ( $tabbar.find( "a" ).length ) {
+				$tabbtns.buttonMarkup({
+					corners:	false,
+					shadow:		false,
+					iconpos:	iconpos
+				});
+			}
+
+			if ( $tabbar.find( ".ui-state-persist" ).length ) {
+				$tabbar.addClass( "ui-tabbar-persist" );
+			}
+
+			$tabbar.delegate( "a", "vclick", function ( event ) {
+                                if ( $tabbtns.parents( "ul" ).is( ".tabbar-scroll-ul" ) ) {
+                                        $tabbtns.removeClass( "ui-tabbar-active" );
+                                        $( event.target ).parents( "a" ).addClass( "ui-tabbar-active" );
+
+                                } else {
+					$tabbtns.not( ".ui-state-persist" ).removeClass( $.mobile.activeBtnClass );
+					$( this ).addClass( $.mobile.activeBtnClass );
+				}
+			});
+
+			$tabbar.addClass( "ui-tabbar");
+
+			$( document ).bind( "pagebeforeshow", function ( event, ui ) {
+				var footer_filter = $( event.target ).find( ":jqmData(role='footer')" ),
+					tabbar_filter = footer_filter.find( ":jqmData(role='tabbar')" ),
+					$elFooterMore = tabbar_filter.siblings( ":jqmData(icon='naviframe-more')" ),
+					$elFooterBack = tabbar_filter.siblings( ".ui-btn-back" );
+
+				footer_filter
+					.css( "position", "fixed" )
+					.css( "bottom", 0 )
+					.css( "height", tabbar_filter.height() );
+				if ( $elFooterMore.length ) {
+					tabbar_filter.addClass( "ui-tabbar-margin-more" );
+				}
+				if ( $elFooterBack.length ) {
+					tabbar_filter.addClass( "ui-tabbar-margin-back" );
+				}
+			});
+
+			$tabbar.bind( "touchstart vmousedown", function ( e ) {
+				var $tabbarScroll = $( e.target ).parents( ".ui-scrollview-view" );
+				if ( $tabbarScroll.offset() ) {
+					if ( $tabbarScroll.offset().left < 0 ) {
+						$( ".ui-tabbar-divider-left" ).show();
+					} else {
+						$( ".ui-tabbar-divider-left" ).hide();
+					}
+					if ( ( $tabbarScroll.width() - $tabbarScroll.parents( ".ui-scrollview-clip" ).width() ) ==  Math.abs( $tabbarScroll.offset().left ) ) {
+						$( ".ui-tabbar-divider-right" ).hide();
+					} else {
+						$( ".ui-tabbar-divider-right" ).show();
+					}
+				}
+			});
+
+			this._bindTabbarEvents();
+			this._initTabbarAnimation();
+		},
+
+		_initTabbarAnimation: function () {
+			var isScrollingStart = false,
+				isScrollingEnd = false;
+			$( document ).bind( "scrollstart.tabbar", function ( e ) {
+				if ( $( e.target ).find( ".ui-tabbar" ).length ) {
+					isScrollingStart = true;
+					isScrollingEnd = false;
+				}
+			});
+
+			$( document ).bind( "scrollstop.tabbar", function ( e ) {
+				var $tabbarScrollview = $( e.target ),
+					$elTabbar = $( e.target ).find( ".ui-tabbar" ),
+					$elTabbarLI = $( e.target ).find( ".ui-tabbar li" ),
+					$minElement = $elTabbarLI.eq( 0 ),
+					minElementIndexVal,
+					minElementIndex = -1;
+
+				isScrollingEnd = true;
+				if ( $elTabbar.length && isScrollingStart == true ) {
+					minElementIndexVal = Math.abs( $elTabbarLI.eq( 0 ).offset().left );
+					$elTabbarLI.each( function ( i ) {
+						var offset	= $elTabbarLI.eq( i ).offset();
+
+						if ( Math.abs( offset.left ) < minElementIndexVal ) {
+							minElementIndexVal = Math.abs( offset.left );
+							minElementIndex = i;
+							$minElement = $elTabbarLI.eq( i );
+						}
+					});
+
+					if ( $tabbarScrollview.length && isScrollingStart == isScrollingEnd && minElementIndex != -1) {
+						isScrollingStart = false;
+						$tabbarScrollview.scrollview( "scrollTo", -( window.innerWidth / $elTabbar.data( "defaultList" ) * minElementIndex ) , 0, 357);
+					}
+				}
+
+				$( ".ui-tabbar-divider-left" ).hide();
+				$( ".ui-tabbar-divider-right" ).hide();
+			});
+		},
+
+		_bindTabbarEvents: function () {
+			var $tabbar = this.element;
+
+			$( window ).bind( "orientationchange", function ( e, ui ) {
+				var ww = window.innerWidth || $( window ).width(),
+					wh = window.innerHeight || $( window ).height(),
+					isLandscape = ww > wh && ( ww - wh );
+
+				if ( isLandscape ) {
+					$tabbar.removeClass( "ui-portrait-tabbar" ).addClass( "ui-landscape-tabbar" );
+				} else {
+					$tabbar.removeClass( "ui-landscape-tabbar" ).addClass( "ui-portrait-tabbar" );
+				}
+			});
+		},
+
+		_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.tabbar.prototype.options.initSelector, e.target ).tabbar();
+	});
+}( jQuery ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.tokentextarea.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.tokentextarea.js
new file mode 100644
index 0000000..483cc20
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.tokentextarea.js
@@ -0,0 +1,813 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Make words to selectable tokens
+//>>label: Token textarea
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	'../jquery.mobile.tizen.core'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+ * 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>
+ *				Minkyeong Kim <minkyeong.kim@samsung.com>
+*/
+
+/**
+ *	The TokenTextArea widget changes a text item to a button. It can be comprised of a number of button widgets. 
+ *	When a user types text and the text gets a specific event to change from a text to a button, 
+ *	the input text is changed to a TokenTextArea widget.
+ *	A user can add the TokenTextArea widget to a contact list, email list, or another list.
+ *	The typical use of this widget is composing a number of contacts or phone numbers in a specific area of the screen.
+ *
+ *	HTML Attributes:
+ *
+ *		data-link : Represents the id of the page or the URL of other HTML file.
+ *				The page contains data for the user, for example, an address book.
+ *				If the value is null, anchor button doesn't work. (Default : null)
+ *		data-label:	Provide a label for a user-guide. (Default : 'To : ')
+ *		data-description : This attribute is managing message format.
+ *				This message is displayed when widget status was changed to 'focusout'. (Default : '+ {0}')
+ *
+ *	APIs:
+ *
+ *		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 no argument exists, gets a string of the selected block.
+ *			If any button isn't selected on a token text area widget, this method returns "null" value.
+ *			When a user call this method with an argument which is a number type,
+ *			this method selects the button which is matched with the argument.
+ *		add ( text, [number] )
+ *			:  If second argument does not exist, will insert to a new button at last position.
+ *			Insert a new button at indexed position. The position is decided by the second argument.
+ *			"index of position" means that the position of inserting a new button is decided by the second argument on "add" method.
+ *			For example, if a user call the method like this "add("Tizen", 2)",
+ *			new button labed "Tizen" will be inserted on the third position.
+ *		remove ( [number] )
+ *			: If no argument exists, all buttons are removed.
+ *			Remove a button at indexed position.
+ *			The position is decided by the second argument. (index: 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 )
+ *			: Changes the focus status to 'focus out'.
+ *			The status is not able to manage a widget.
+ *			All buttons that contained in the widget are removed and
+ *			summarized message is displayed.
+ *		destroy ( void )
+ *			: Remove all of the new DOM elements for the current widget that you created.
+ *
+ *	Events:
+ *
+ *		select : Occur when a button is selected.
+ *		add : Occur when new button is inserted. (@since Tizen 2.1 deprecated, You can still use this event. But not recommended.)
+ *		remove : Occur when a button is removed. (@since Tizen 2.1 deprecated, You can still use this event. But not recommended.)
+ *
+ *	Examples:
+ *
+ *		<div data-role="tokentextarea" data-label="To : " data-link="#pageId" data-description="+ {0}">
+ *		</div>
+ *
+ */
+
+
+/**
+	@class TokenTextArea
+	The TokenTextArea widget enables the user to enter text and convert it to a button. Each button that is created from entered text as a result of a change event forms a token text area widget. This widget is useful in composing an e-mail or SMS message to a group of addresses, each of which is a clickable item for more actions, such as copying, editing, or removing the address.
+
+	To add a token text area widget to the application, use the following code:
+
+		<div data-role="tokentextarea" data-label="To : " data-link="#pageId">
+		</div>
+*/
+
+/**
+	@property {String} data-label
+	Sets a label as a guide for the user.
+	For example, while composing an e-mail message, the 'To : ' label is a guide for the user to enter e-mail addresses.
+
+		<div data-role="tokentextarea" data-label="To : ">
+		</div>
+*/
+
+/**
+	@property {String} data-decription
+	Manages the message format.
+	The message is displayed when the widget status changes to focus out
+
+		<div data-role="tokentextarea" data-description=" + {0}">
+		</div>
+ */
+/**
+	@property {String} data-link
+	Sets the ID of the page or the URL of other HTML file to which the button links.
+	If the data-link is set with the URL of other HTML file, the 'dom-cache' option of both page - a page containing a Tokentextarea and a page in the target HTML file - must be set as 'true'.
+
+		<div data-role="tokentextarea" data-link="#pageId">
+		</div>
+
+		<div data-role="tokentextarea" data-link="fileName.html" data-dom-cache="true">
+		</div>
+*/
+/**
+	@event select
+	The select event is fired when a token text area widget button is selected:
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").on("select", function(event, ui)
+		{
+			// Handle the select event
+		});	
+*/
+/**
+	@event add (@since Tizen 2.1 deprecated, You can still use this event. But not recommended.)
+	The add event is fired when a token text area widget button is created:
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").on("add", function(event, ui)
+		{
+			// Handle the add event
+		});
+*/
+/**
+	@event remove (@since Tizen 2.1 deprecated, You can still use this event. But not recommended.)
+	The remove event is fired when a token text area widget button is removed:
+	Restriction : "remove" event works under only "bind" event handling.
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").bind("remove", function(event, ui)
+		{
+			// Handle the remove event
+		});
+*/
+/**
+	@method destroy
+	The destroy method is used to remove in the current widget all the new DOM elements that you have created.
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").tokentextarea("destroy");
+
+	@since Tizen2.0
+*/
+/**
+	@method inputText
+	The inputText method is used to manage the widget input box text. If no parameter is set, the method gets the input box text. If a parameter is set, the parameter text is set in the input box.
+	
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").tokentextarea("inputText", [text]);
+*/
+/**
+	@method select
+	The select method is used to select a token text area widget button based on its index value. If no index value is defined, the method returns the string of the selected block. If there are no buttons present in the widget, the method returns null.
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").tokentextarea("select", [index]);
+*/
+/**
+	@method add
+	The add method is used to add a new token text area widget button with the specified label text at the specified index position. If the index parameter is not defined, the widget button is added at the bottom of the list. For example, the $(".selector").tokentextarea("add", "Tizen", 2) method call creates a new widget button labeled 'Tizen' at the third position in the widget.
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").tokentextarea("add", [text], [index]);
+*/
+/**
+	@method remove
+	The remove method is used to remove a token text area widget button at the specified index position. If the parameter is not defined, all the widget buttons are removed.
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").tokentextarea("remove", [index]);
+*/
+/**
+	@method length
+	The length method is used to retrieve the number of buttons in the token text area widget:
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").tokentextarea("length");
+*/
+/**
+	@method focusIn
+	The focusIn method is used to set the focus status to "focus in". This focus state enables the user to add or remove buttons in the token text area widget.
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").tokentextarea("focusIn");
+*/
+/**
+	@method focusOut
+	The focusOut method is used to set the focus status to "focus out". In this focus state, the user cannot manage the buttons in the widget, all the buttons are removed, and a message is displayed.
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").tokentextarea("focusOut");
+*/
+( function ( $, window, document, undefined ) {
+	$.widget( "tizen.tokentextarea", $.mobile.widget, {
+		_focusStatus : null,
+		_items : null,
+		_viewWidth : 0,
+		_reservedWidth : 0,
+		_currentWidth : 0,
+		_fontSize : 0,
+		_anchorWidth : 0,
+		_labelWidth : 0,
+		_marginWidth : 0,
+		options : {
+			label : "To : ",
+			link : null,
+			description : "+ {0}"
+		},
+
+		_create : function () {
+			var self = this,
+				$view = this.element,
+				role = $view.jqmData( "role" ),
+				option = this.options,
+				className = "ui-tokentextarea-link",
+				inputbox = $( document.createElement( "input" ) ),
+				labeltag = $( document.createElement( "span" ) ),
+				moreBlock = $( document.createElement( "a" ) );
+
+			$view.hide().empty().addClass( "ui-" + role );
+
+			// create a label tag.
+			$( labeltag ).text( option.label ).addClass( "ui-tokentextarea-label" ).attr( "tabindex", 0 );
+			$view.append( labeltag );
+
+			// create a input tag
+			$( inputbox ).addClass( "ui-tokentextarea-input ui-tokentextarea-input-visible ui-input-text ui-body-s" ).attr( "role", "textbox" );
+			$view.append( inputbox );
+
+			// create a anchor tag.
+			if ( option.link === null || $.trim( option.link ).length < 1 || $( option.link ).length === 0 ) {
+				className += "-dim";
+			}
+			$( moreBlock ).attr( "data-role", "button" )
+				.buttonMarkup( {
+					inline: true,
+					icon: "plus",
+					style: "circle"
+				})
+				.attr( { "href" : $.trim( option.link ), "tabindex" : 0 } )
+				.addClass( "ui-tokentextarea-link-base" )
+				.addClass( className )
+				.find( "span.ui-btn-text" )
+				.text( "Add recipient" );
+
+			// append default htmlelements to main widget.
+			$view.append( moreBlock );
+
+			// bind a event
+			this._bindEvents();
+			self._focusStatus = "init";
+			// display widget
+			$view.show();
+
+			// 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;
+			self._modifyInputBoxWidth();
+		},
+
+		// bind events
+		_bindEvents : function () {
+			var self = this,
+				$view = self.element,
+				option = self.options,
+				inputbox = $view.find( ".ui-tokentextarea-input" ),
+				moreBlock = $view.find( ".ui-tokentextarea-link-base" );
+
+			// delegate a event to HTMLDivElement(each block).
+			$view.delegate( "div", "click", function ( event ) {
+				if ( $( this ).hasClass( "ui-tokentextarea-sblock" ) ) {
+					// If block is selected, it will be removed.
+					self._removeTextBlock();
+				}
+
+				var lockBlock = $view.find( "div.ui-tokentextarea-sblock" );
+				if ( typeof lockBlock !== "undefined" ) {
+					lockBlock.removeClass( "ui-tokentextarea-sblock" ).addClass( "ui-tokentextarea-block" );
+				}
+				$( this ).removeClass( "ui-tokentextarea-block" ).addClass( "ui-tokentextarea-sblock" );
+				$view.trigger( "select" );
+			});
+
+			inputbox.bind( "keyup", function ( event ) {
+				// 8  : backspace
+				// 13 : Enter
+				// 186 : semi-colon
+				// 188 : comma
+				var keyValue = event.keyCode,
+					valueString = $( inputbox ).val(),
+					valueStrings = [],
+					index,
+					isSeparator = false;
+
+				if ( keyValue === 8 ) {
+					if ( valueString.length === 0 ) {
+						self._validateTargetBlock();
+					}
+				} else if ( keyValue === 13 || keyValue === 186 || keyValue === 188 ) {
+					if ( valueString.length !== 0 ) {
+						// split content by separators(',', ';')
+						valueStrings = valueString.split ( /[,;]/ );
+						for ( index = 0; index < valueStrings.length; index++ ) {
+							if ( valueStrings[index].length !== 0 && valueStrings[index].replace( /\s/g, "" ).length !== 0 ) {
+								self._addTextBlock( valueStrings[index] );
+							}
+						}
+					}
+					inputbox.val( "" );
+					isSeparator = true;
+				} else {
+					self._unlockTextBlock();
+				}
+
+				return !isSeparator;
+			});
+
+			moreBlock.click( function () {
+				if ( $( moreBlock ).hasClass( "ui-tokentextarea-link-dim" ) ) {
+					return;
+				}
+
+				$( inputbox ).removeClass( "ui-tokentextarea-input-visible" ).addClass( "ui-tokentextarea-input-invisible" );
+
+				$.mobile.changePage( option.link, {
+					transition: "slide",
+					reverse: false,
+					changeHash: false
+				});
+			});
+
+			$( document ).bind( "pagechange.mbe", function ( event ) {
+				if ( $view.innerWidth() === 0 ) {
+					return ;
+				}
+				self.refresh();
+				$( inputbox ).removeClass( "ui-tokentextarea-input-invisible" ).addClass( "ui-tokentextarea-input-visible" );
+			});
+
+			$view.bind( "click", function ( event ) {
+				if ( self._focusStatus === "focusOut" ) {
+					self.focusIn();
+				}
+			});
+		},
+
+		// create a textbutton and append this button to parent layer.
+		// @param arg1 : string
+		// @param arg2 : index
+		_addTextBlock : function ( messages, blockIndex ) {
+			if ( arguments.length === 0 ) {
+				return;
+			}
+
+			if ( !messages ) {
+				return ;
+			}
+
+			var self = this,
+				$view = self.element,
+				content = messages,
+				index = blockIndex,
+				blocks = null,
+				textBlock = null;
+
+			if ( self._viewWidth === 0 ) {
+				self._viewWidth = $view.innerWidth();
+			}
+
+			// Create a new text HTMLDivElement.
+			textBlock = $( document.createElement( 'div' ) );
+
+			textBlock.text( content ).addClass( "ui-tokentextarea-block" ).attr( { "aria-label" : "double tap to edit", "tabindex" : 0 } );
+			textBlock.css( {'visibility': 'hidden'} );
+
+			blocks = $view.find( "div" );
+			if ( index !== null && index <= blocks.length ) {
+				$( blocks[index] ).before( textBlock );
+			} else {
+				$view.find( ".ui-tokentextarea-input" ).before( textBlock );
+			}
+
+			textBlock = self._ellipsisTextBlock( textBlock );
+			textBlock.css( {'visibility': 'visible'} );
+
+			self._modifyInputBoxWidth();
+
+			textBlock.hide();
+			textBlock.fadeIn( "fast", function () {
+				self._currentWidth += self._calcBlockWidth( textBlock );
+				$view.trigger( "add" );
+			});
+		},
+
+		_removeTextBlock : function () {
+			var self = this,
+				$view = this.element,
+				lockBlock = $view.find( "div.ui-tokentextarea-sblock" ),
+				_temp = null,
+				_dummy = function () {};
+
+			if ( lockBlock !== null && lockBlock.length > 0 ) {
+				self._currentWidth -= self._calcBlockWidth( lockBlock );
+
+				lockBlock.fadeOut( "fast", function () {
+					lockBlock.remove();
+					self._modifyInputBoxWidth();
+				});
+
+				this._eventRemoveCall = true;
+				if ( $view[0].remove ) {
+					_temp = $view[0].remove;
+					$view[0].remove = _dummy;
+				}
+				$view.triggerHandler( "remove" );
+				if ( _temp) {
+					$view[0].remove = _temp;
+				}
+				this._eventRemoveCall = false;
+			} else {
+				$view.find( "div:last" ).removeClass( "ui-tokentextarea-block" ).addClass( "ui-tokentextarea-sblock" );
+			}
+		},
+
+		_calcBlockWidth : function ( block ) {
+			return $( block ).outerWidth( true );
+		},
+
+		_unlockTextBlock : function () {
+			var $view = this.element,
+				lockBlock = $view.find( "div.ui-tokentextarea-sblock" );
+			if ( lockBlock ) {
+				lockBlock.removeClass( "ui-tokentextarea-sblock" ).addClass( "ui-tokentextarea-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-tokentextarea-sblock" ) ) {
+				self._removeTextBlock();
+			} else {
+				tmpBlock = $view.find( "div.ui-tokentextarea-sblock" );
+				tmpBlock.removeClass( "ui-tokentextarea-sblock" ).addClass( "ui-tokentextarea-block" );
+				lastBlock.removeClass( "ui-tokentextarea-block" ).addClass( "ui-tokentextarea-sblock" );
+			}
+		},
+
+		_ellipsisTextBlock : function ( textBlock ) {
+			var self = this,
+				$view = self.element,
+				maxWidth = self._viewWidth / 2;
+
+			if ( self._calcBlockWidth( textBlock ) > maxWidth ) {
+				$( textBlock ).width( maxWidth - self._marginWidth );
+			}
+
+			return textBlock;
+		},
+
+		_modifyInputBoxWidth : function () {
+			var self = this,
+				$view = self.element,
+				margin = 0,
+				labelWidth = 0,
+				anchorWidth = 0,
+				inputBoxWidth = 0,
+				blocks = $view.find( "div" ),
+				blockWidth = 0,
+				index = 0,
+				inputBoxMargin = 10,
+				inputBox = $view.find( ".ui-tokentextarea-input" );
+
+			if ( $view.width() === 0 ) {
+				return;
+			}
+
+			if ( self._labelWidth === 0 ) {
+				self._labelWidth = $view.find( ".ui-tokentextarea-label" ).outerWidth( true );
+				self._anchorWidth = $view.find( ".ui-tokentextarea-link-base" ).outerWidth( true );
+				self._marginWidth = parseInt( ( $( inputBox ).css( "margin-left" ) ), 10 );
+				self._marginWidth += parseInt( ( $( inputBox ).css( "margin-right" ) ), 10 );
+				self._viewWidth = $view.innerWidth();
+			}
+
+			margin = self._marginWidth;
+			labelWidth = self._labelWidth;
+			anchorWidth = self._anchorWidth;
+			inputBoxWidth = self._viewWidth - labelWidth;
+
+			for ( index = 0; index < blocks.length; index += 1 ) {
+				blockWidth = self._calcBlockWidth( blocks[index] );
+
+				if ( blockWidth >= inputBoxWidth + anchorWidth ) {
+					if ( blockWidth >= inputBoxWidth ) {
+						inputBoxWidth = self._viewWidth - blockWidth;
+					} else {
+						inputBoxWidth = self._viewWidth;
+					}
+				} else {
+					if ( blockWidth > inputBoxWidth ) {
+						inputBoxWidth = self._viewWidth - blockWidth;
+					} else {
+						inputBoxWidth -= blockWidth;
+					}
+				}
+			}
+
+			inputBoxWidth -= margin;
+			if ( inputBoxWidth < anchorWidth * 2 ) {
+				inputBoxWidth = self._viewWidth - margin;
+			}
+			$( inputBox ).width( inputBoxWidth - anchorWidth - inputBoxMargin );
+		},
+
+		_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;
+		},
+
+		_resizeBlocks : function () {
+			var self = this,
+				$view = self.element,
+				blocks = $view.find( "div" ),
+				index = 0;
+
+			for ( index = 0 ; index < blocks.length ; index += 1 ) {
+				$( blocks[index] ).css( "width", "auto" );
+				blocks[index] = self._ellipsisTextBlock( blocks[index] );
+			}
+		},
+
+		//---------------------------------------------------- //
+		//					Public Method   //
+		//----------------------------------------------------//
+		//
+		// Focus In Event
+		//
+		focusIn : function () {
+			if ( this._focusStatus === "focusIn" ) {
+				return;
+			}
+
+			var $view = this.element;
+
+			$view.find( ".ui-tokentextarea-label" ).attr( "tabindex", 0 ).show();
+			$view.find( ".ui-tokentextarea-desclabel" ).remove();
+			$view.find( "div.ui-tokentextarea-sblock" ).removeClass( "ui-tokentextarea-sblock" ).addClass( "ui-tokentextarea-block" );
+			$view.find( "div" ).attr( { "aria-label" : "double tap to edit", "tabindex" : 0 } ).show();
+			$view.find( ".ui-tokentextarea-input" ).removeClass( "ui-tokentextarea-input-invisible" ).addClass( "ui-tokentextarea-input-visible" ).attr( "tabindex", 0 );
+			$view.find( "a" ).attr( "tabindex", 0 ).show();
+
+			// change focus state.
+			this._modifyInputBoxWidth();
+			this._focusStatus = "focusIn";
+			$view.removeClass( "ui-tokentextarea-focusout" ).addClass( "ui-tokentextarea-focusin" ).removeAttr( "tabindex" );
+			$view.find( ".ui-tokentextarea-input" ).focus();
+		},
+
+		focusOut : function () {
+			if ( this._focusStatus === "focusOut" ) {
+				return;
+			}
+
+			var self = this,
+				$view = self.element,
+				tempBlock = null,
+				stateBlock = null,
+				numBlock = null,
+				statement = "",
+				index = 0,
+				lastIndex = 10,
+				label = $view.find( ".ui-tokentextarea-label" ),
+				more = $view.find( "span" ),
+				blocks = $view.find( "div" ),
+				currentWidth = $view.outerWidth( true ) - more.outerWidth( true ) - label.outerWidth( true ),
+				blockWidth = 0;
+
+			label.removeAttr( "tabindex" );
+			$view.find( ".ui-tokentextarea-input" ).removeClass( "ui-tokentextarea-input-visible" ).addClass( "ui-tokentextarea-input-invisible" ).removeAttr( "tabindex" );
+			$view.find( "a" ).removeAttr( "tabindex" ).hide();
+			blocks.removeAttr( "aria-label" ).removeAttr( "tabindex" ).hide();
+
+			currentWidth = currentWidth - self._reservedWidth;
+
+			for ( index = 0; index < blocks.length; index++ ) {
+				blockWidth = $( blocks[index] ).outerWidth( true );
+				if ( currentWidth - blockWidth <= 0 ) {
+					lastIndex = index - 1;
+					break;
+				}
+
+				$( blocks[index] ).show();
+				currentWidth -= blockWidth;
+			}
+
+			if ( lastIndex !== blocks.length ) {
+				statement = self._stringFormat( self.options.description, blocks.length - lastIndex - 1 );
+				tempBlock = $( document.createElement( 'span' ) );
+				tempBlock.addClass( "ui-tokentextarea-desclabel" ).attr( { "aria-label" : "more, double tap to edit", "tabindex" : "-1" } );
+				stateBlock = $( document.createElement( 'span' ) ).text( statement ).attr( "aria-hidden", "true" );
+				numBlock = $( document.createElement( 'span' ) ).text( blocks.length - lastIndex - 1 ).attr( "aria-label", "and" ).css( "visibility", "hidden" );
+				tempBlock.append( stateBlock );
+				tempBlock.append( numBlock );
+				$( blocks[lastIndex] ).after( tempBlock );
+			}
+
+			// update focus state
+			this._focusStatus = "focusOut";
+			$view.removeClass( "ui-tokentextarea-focusin" ).addClass( "ui-tokentextarea-focusout" ).attr( "tabindex", 0 );
+		},
+
+		inputText : function ( message ) {
+			var $view = this.element;
+
+			if ( arguments.length === 0 ) {
+				return $view.find( ".ui-tokentextarea-input" ).val();
+			}
+			$view.find( ".ui-tokentextarea-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-tokentextarea-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-tokentextarea-block" ).addClass( "ui-tokentextarea-sblock" );
+				$view.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,
+				_temp = null,
+				_dummy = function () {};
+
+			if ( this._focusStatus === "focusOut" ) {
+				return;
+			}
+
+			if ( arguments.length === 0 ) {
+				blocks.fadeOut( "fast", function () {
+					blocks.remove();
+					self._modifyInputBoxWidth();
+					self._trigger( "clear" );
+				});
+			} else if ( !isNaN( position ) ) {
+				// remove selected button
+				index = ( ( position < blocks.length ) ? position : ( blocks.length - 1 ) );
+
+				$( blocks[index] ).fadeOut( "fast", function () {
+					$( blocks[index] ).remove();
+					self._modifyInputBoxWidth();
+				});
+
+				this._eventRemoveCall = true;
+				if ( $view[0].remove ) {
+					_temp = $view[0].remove;
+					$view[0].remove = _dummy;
+				}
+				$view.triggerHandler( "remove" );
+				if ( _temp) {
+					$view[0].remove = _temp;
+				}
+				this._eventRemoveCall = false;
+			}
+		},
+
+		length : function () {
+			return this.element.find( "div" ).length;
+		},
+
+		refresh : function () {
+			var self = this,
+				viewWidth = this.element.innerWidth();
+
+			if ( viewWidth && self._viewWidth !== viewWidth ) {
+				self._viewWidth = viewWidth;
+			}
+			self._resizeBlocks();
+			self._modifyInputBoxWidth();
+		},
+
+		destroy : function () {
+			var $view = this.element,
+				_temp = null,
+				_dummy = function () {};
+
+			if ( this._eventRemoveCall ) {
+				return;
+			}
+
+			$view.find( ".ui-tokentextarea-label" ).remove();
+			$view.find( "div" ).undelegate( "click" ).remove();
+			$view.find( "a" ).remove();
+			$view.find( ".ui-tokentextarea-input" ).unbind( "keyup" ).remove();
+
+			this._eventRemoveCall = true;
+			if ( $view[0].remove ) {
+				_temp = $view[0].remove;
+				$view[0].remove = _dummy;
+			}
+			$view.remove();
+			if ( _temp) {
+				$view[0].remove = _temp;
+			}
+			this._eventRemoveCall = false;
+
+			this._trigger( "destroy" );
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function () {
+		$( ":jqmData(role='tokentextarea')" ).tokentextarea();
+	});
+
+	$( window ).bind( "resize", function () {
+		$( ":jqmData(role='tokentextarea')" ).tokentextarea( "refresh" );
+	});
+} ( jQuery, window, document ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.triangle.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.triangle.js
new file mode 100644
index 0000000..38c5cea
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.triangle.js
@@ -0,0 +1,121 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Shows triangle, used by context popup
+//>>label: Triangle
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	'../jquery.mobile.tizen.core',
+	'./jquery.mobile.tizen.widgetex'
+	], function ( ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/*
+ * 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) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.virtualgrid.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.virtualgrid.js
new file mode 100644
index 0000000..6d133d6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.virtualgrid.js
@@ -0,0 +1,1748 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Shows grid swapping its contents automatically
+//>>label: Virtual grid
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	"libs/jquery.tmpl",
+	'libs/jquery.easing.1.3',
+	'../jquery.mobile.tizen.core',
+	'../jquery.mobile.tizen.scrollview' ], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+ * 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>
+ *			Youmin Ha <youmin.ha@samsung.com>
+*/
+
+/**
+ * In the web environment, it is challenging to display a large amount of data in a grid.
+ * When an application needs to show, for example, image gallery with over 1,000 images,
+ * the same enormous data must be inserted into a HTML document.
+ * It takes a long time to display the data and manipulating DOM is complex.
+ * The virtual grid widget supports storing unlimited data without performance issues
+ * by reusing a limited number of grid elements.
+ * The virtual grid widget is based on the jQuery.template plug-in 
+ * For more information, see jQuery.template.
+ *
+ * HTML Attributes:
+ *
+ *		data-role:  virtualgrid
+ *		data-template :	Has the ID of the jQuery.template element.
+ *						jQuery.template for a virtual grid must be defined.
+ *						Style for template would use rem unit to support scalability.
+ *		data-direction : This option define the direction of the scroll.
+ *						You must choose one of the 'x' and 'y' (Default : y)
+ *		data-rotation : This option defines whether or not the circulation of the data.
+ *						If option is 'true' and scroll is reached the last data,
+ *						Widget will present the first data on the screen.
+ *						If option is ‘false’, Widget will operate like a scrollview.
+ *
+ *		ID : <DIV> element that has "data-role=virtualgrid" must have ID attribute.
+ *
+ * APIs:
+ *
+ *		create ( {
+ *				itemData: function ( idx ) { return json_obj; },
+ *				numItemData: number or function () { return number; },
+ *				cacheItemData: function ( minIdx, maxIdx ) {}
+ *				} )
+ *			: Create VirtualGrid widget. At this moment, _create method is called.
+ *			args : A collection of options
+ *				itemData: A function that returns JSON object for given index. Mandatory.
+ *				numItemData: Total number of itemData. Mandatory.
+ *				cacheItemData: Virtuallist will ask itemData between minIdx and maxIdx.
+ *				Developers can implement this function for preparing data.
+ *				Optional.
+ *
+ *		centerTo ( selector )
+ *			: Center the particular item with the class name on the VirtualGrid's display area.;
+ *			i.e., this method selects an item in the data elements of grid using the class name and
+ *			moves the data elements inside the widget to display the row containing the selected item
+ *			in the middle of the screen.
+ *			If multiple items are matched with the class name, the first matched item will be selected.
+ *			This method is only available when "data-rotation" attribute is "true".
+ *
+ *		resize ()
+ *			: Rearrange items to fit a new widget size.
+ *
+ * Events:
+ *		scrollstart : : This event triggers when a user begin to move the scroll on VirtualGrid.
+ *		scrollupdate : : This event triggers while a user moves the scroll on VirtualGrid.
+ *		scrollstop : This event triggers when a user stop the scroll on VirtualGrid.
+ *		select : This event triggers when a cell is selected.
+ *
+ * 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-template="tizen-demo-namecard" >
+ *			</div>
+ *
+ */
+
+// most of following codes are derived from jquery.mobile.scrollview.js
+
+/**
+	@class VirtualGrid
+	In the Web environment, it is challenging to display large amount of data in a list, such as displaying a contact list of over 1000 list items. It takes time to display the entire list in HTML and the DOM manipulation is complex.
+
+	The virtual grid widget is used to display a list of unlimited data elements on the screen for better performance. This widget displays the data in the grid format by reusing the existing grid control space. Virtual grids are based on the jQuery.template plugin as described in the jQuery documentation for jQuery.template plugin.
+
+	To add a virtual grid widget to the application, use the following code:
+
+		<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>
+				</div>
+			</div>
+		</script>
+		<div id="virtualgrid-demo" data-role="virtualgrid" data-template="tizen-demo-namecard">
+		</div>
+*/
+/**
+	@property {String} data-template
+	Specifies the jQuery.template element ID.
+	The jQuery.template must be defined. The template style can use rem units to support scalability.
+*/
+/**
+	@property {String} data-direction
+	Defines the scroll direction. The direction options are x (horizontal) and y (vertical).
+	The default value is y.
+*/
+/**
+	@property {Boolean} data-rotation
+	Defines whether the data elements are displayed from the beginning of the list again once the end of file is reached.
+	The default value is false.
+*/
+/**
+	@event scrollstart
+	The scrollstart event is fired when the user starts scrolling through the grid:
+
+		<div data-role="virtualgrid" data-scroll="y" data-template="tizen-demo-namecard"></div>
+		$(".selector").on("scrollstart", function(event, ui)
+		{
+		// Handle the scrollstart event
+		});
+*/
+/**
+	@event scrollupdate
+	The scrollupdate event is fired when the user moves the scroll bar in the grid:
+
+		<div data-role="virtualgrid" data-scroll="y" data-template="tizen-demo-namecard"></div>
+		$(".selector").on("scrollupdate", function(event, ui)
+		{
+		// Handle the scrollupdate event
+		});
+*/
+/**
+	@event scrollstop
+	The scrollstop event is fired when the user stops scrolling:
+
+		<div data-role="virtualgrid" data-scroll="y" data-template="tizen-demo-namecard"></div>
+		$(".selector").on("scrollstop", function(event, ui)
+		{
+		// Handle the scrollstop event
+		});
+*/
+/**
+	@event select
+	The select event is fired when a virtual grid cell is selected:
+
+		<div data-role="virtualgrid" data-scroll="y" data-template="tizen-demo-namecard"></div>
+		$(".selector").on("select", function(event, ui)
+		{
+		// Handle the select event
+		});
+*/
+/**
+	@method create
+	@param {function} itemData(index)
+	@param {Number} numItemData
+	@param {function} cacheItemData(minIndex, maxIndex)
+	The create method is used to call the jQuery _create method. In the method parameters:
+
+	function itemData(index) returns the JSON object matched with the given index. The index value is between 0 and numItemData-1.<br/>
+	number numItemData or function numItemData() defines or returns a static number of items.<br/>
+	function cacheItemData(minIndex, maxIndex) prepares the JSON data. This method is called before calling the itemData() method with index values between minIndex and maxIndex.<br/>
+
+		<div data-role="virtualgrid" data-scroll="y" data-template="tizen-demo-namecard"></div>
+			function itemData(idx)
+			{
+				return DATA[idx];
+			}
+			function cacheItemData(minIdx, maxIdx)
+			{
+			// Prepare JSON data between minIdx and maxIdx
+			}
+			var numItemData = DATA.length;
+			$(".selector").virtualgrid("create",
+			{
+				itemData, numItemData, cacheItemData
+			});
+*/
+/**
+	@method centerTo
+	The centerTo method is used to center the particular item with the class name on the VirtualGrid's display area. If multiple items are matched with the class name, the first matched item will be selected. This method is only available when "data-rotation" attribute is "true".
+
+		<div data-role="virtualgrid" data-scroll="y" data-rotation="true" data-template="tizen-demo-namecard"></div>
+		$(".selector").virtualgrid("centerTo", selector);
+*/
+/**
+	@method resize
+	The resize method is used to rearrange items to fit a new widget size. :
+
+		<div data-role="virtualgrid" data-scroll="y" data-template="tizen-demo-namecard"></div>
+		$(".selector").virtualgrid("resize");
+
+	@since Tizen2.0
+*/
+
+( function ( $, window, document, undefined ) {
+
+	function circularNum ( num, total ) {
+		var n = num % total;
+		if ( n < 0 ) {
+			n = total + n;
+		}
+		return n;
+	}
+
+	function MomentumTracker ( options ) {
+		this.options = $.extend( {}, options );
+		this.easing = "easeOutQuad";
+		this.reset();
+	}
+
+	var tstates = {
+			scrolling : 0,
+			done : 1
+		},
+		_OVERFLOW_DIR_NONE = 0,		/* ENUM */
+		_OVERFLOW_DIR_UP = 1,		/* ENUM */
+		_OVERFLOW_DIR_DOWN = -1,	/* ENUM */
+		imgTagSrcAttrRE = /src\s*=\s*[\"\'][\w\/.]+.[A-z]+[\"\']/;
+
+	function getCurrentTime () {
+		return Date.now();
+	}
+
+	$.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 / 2 );
+			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.virtualgrid", jQuery.mobile.widget, {
+		options : {
+			// virtualgrid option
+			template : "",
+			direction : "y",
+			rotation : false
+		},
+
+		create : function () {
+			this._create.apply( this, arguments );
+		},
+
+		_create : function ( args ) {
+			$.extend( this, {
+				// view
+				_$view : null,
+				_$clip : null,
+				_$rows : null,
+				_tracker : null,
+				_viewSize : 0,
+				_clipSize : 0,
+				_cellSize : undefined,
+				_currentItemCount : 0,
+				_itemCount : 1,
+				_inheritedSize : null,
+
+				// timer
+				_timerInterval : 0,
+				_timerID : 0,
+				_timerCB : null,
+				_lastMove : null,
+
+				// Data
+				_itemData : function ( idx ) { return null; },
+				_numItemData : 0,
+				_cacheItemData : function ( minIdx, maxIdx ) { },
+				_totalRowCnt : 0,
+				_templateText : null,
+				_maxViewSize : 0,
+				_modifyViewPos : 0,
+				_maxSizeExceptClip : 0,
+				_maxSize : 0,
+
+				// axis - ( true : x , false : y )
+				_direction : false,
+				_didDrag : true,
+				_reservedPos : 0,
+				_scalableSize : 0,
+				_eventPos : 0,
+				_nextPos : 0,
+				_movePos : 0,
+				_lastY : 0,
+				_speedY : 0,
+				_lastX : 0,
+				_speedX : 0,
+				_rowsPerView : 0,
+				_fragment : null,
+
+				_filterRatio : 0.9,
+
+				_overflowStartPos : 0,
+				_overflowDir : 0,
+				_overflowMaxDragDist : 100
+			});
+
+			var self = this,
+				$dom = $( self.element ),
+				opts = self.options,
+				$item = null;
+
+			// itemData
+			// If mandatory options are not given, Do nothing.
+			if ( !args ) {
+				return ;
+			}
+
+			if ( !self._loadData( args ) ) {
+				return;
+			}
+
+			// make a fragment.
+			self._fragment = document.createDocumentFragment();
+
+			// read defined properties(width and height) from dom element.
+			self._inheritedSize = self._getinheritedSize( self.element );
+
+			// set a scroll direction.
+			self._direction = opts.direction === 'x' ? true : false;
+
+			// make view layer
+			self._$clip = $dom.addClass( "ui-scrollview-clip" ).addClass( "ui-virtualgrid-view" );
+			$item = $( document.createElement( "div" ) ).addClass( "ui-scrollview-view" );
+			self._clipSize =  self._calculateClipSize();
+			self._$clip.append( $item );
+			self._$view = $item;
+			self._$clip.css( "overflow", "hidden" );
+			self._$view.css( "overflow", "hidden" );
+
+			// inherit from scrollview widget.
+			self._scrollView = $.tizen.scrollview.prototype;
+			self._initScrollView();
+
+			// create tracker.
+			self._createTracker();
+			self._makePositioned( self._$clip );
+			self._timerInterval = 1000 / self.options.fps;
+
+			self._timerID = 0;
+			self._timerCB = function () {
+				self._handleMomentumScroll();
+			};
+			$dom.closest( ".ui-content" ).addClass( "ui-virtualgrid-content" ).css( "overflow", "hidden" );
+
+			// add event handler.
+			self._addBehaviors();
+
+			self._currentItemCount = 0;
+			self._createOverflowArea();
+			self._createScrollBar();
+			self.refresh();
+		},
+
+		// The argument is checked for compliance with the specified format.
+		// @param args   : Object
+		// @return boolean
+		_loadData : function ( args ) {
+			var self = this;
+
+			if ( args.itemData && typeof args.itemData == 'function'  ) {
+				self._itemData = args.itemData;
+			} else {
+				return false;
+			}
+			if ( args.numItemData ) {
+				if ( typeof args.numItemData == 'function' ) {
+					self._numItemData = args.numItemData( );
+				} else if ( typeof args.numItemData == 'number' ) {
+					self._numItemData = args.numItemData;
+				} else {
+					return false;
+				}
+			} else {
+				return false;
+			}
+			self._getObjectNames( self._itemData( 0 ) );
+			return true;
+		},
+
+		// Make up the first screen.
+		_initLayout: function () {
+			var self = this,
+				opts = self.options,
+				i,
+				$row;
+
+			for ( i = -1; i < self._rowsPerView + 1; i += 1 ) {
+				$row = self._$rows[ circularNum( i, self._$rows.length ) ];
+				self._$view.append( $row );
+			}
+			self._setElementTransform( -self._cellSize );
+
+			self._replaceRow( self._$view[0].firstChild, self._totalRowCnt - 1 );
+			if ( opts.rotation && self._rowsPerView >= self._totalRowCnt ) {
+				self._replaceRow( self._$view[0].lastChild, 0 );
+			}
+			self._setViewSize();
+		},
+
+		_setViewSize : function () {
+			var self = this,
+				height = 0,
+				width = 0;
+
+			if ( self._direction ) {
+				width = self._cellSize * ( self._rowsPerView + 2 );
+				width = parseInt( width, 10 ) + 1;
+				self._$view.width( width );
+				self._viewSize = self._$view.width();
+			} else {
+				self._$view.height( self._cellSize * ( self._rowsPerView + 2 ) );
+				self._$clip.height( self._clipSize );
+				self._viewSize = self._$view.height();
+			}
+		},
+
+		_getViewWidth : function () {
+			var self = this;
+			return self._maxSize;
+		},
+
+		_getViewHeight : function () {
+			var self = this;
+			return self._maxSize;
+		},
+
+		refresh : function () {
+			var self = this,
+				opts = self.options,
+				width = 0,
+				height = 0,
+				$template = null;
+
+			$template = $( "#" + opts.template );
+			if ( !$template ) {
+				return ;
+			}
+			self._templateText = self._insertAriaAttrToTmpl( $template.text() );
+
+			width = self._calculateClipWidth();
+			height = self._calculateClipHeight();
+			self._$view.width( width ).height( height );
+			self._$clip.width( width ).height( height );
+
+			self._clipSize = self._calculateClipSize();
+			self._calculateColumnSize();
+			self._initPageProperty();
+			self._setScrollBarSize();
+		},
+
+		_initPageProperty : function () {
+			var self = this,
+				rowsPerView = 0,
+				$child,
+				columnCount = 0,
+				totalRowCnt = 0,
+				attributeName = self._direction ? "width" : "height";
+
+			columnCount = self._calculateColumnCount();
+
+			totalRowCnt = parseInt( self._numItemData / columnCount, 10 );
+			self._totalRowCnt = self._numItemData % columnCount === 0 ? totalRowCnt : totalRowCnt + 1;
+			self._itemCount = columnCount;
+
+			if ( self._cellSize <= 0 ) {
+				return ;
+			}
+
+			rowsPerView = self._clipSize / self._cellSize;
+			rowsPerView = Math.ceil( rowsPerView );
+			self._rowsPerView = parseInt( rowsPerView, 10 );
+
+			$child = $( self._makeRows( rowsPerView + 2 ) );
+			self._$view.append( $child.children() );
+			self._$view.children().css( attributeName, self._cellSize + "px" );
+			self._$rows = self._$view.children().detach();
+
+			self._reservedPos = -self._cellSize;
+			self._scalableSize = -self._cellSize;
+
+			self._initLayout();
+
+			self._blockScroll = self._rowsPerView > self._totalRowCnt;
+			self._maxSizeExceptClip = ( self._totalRowCnt - self._rowsPerView ) * self._cellSize;
+			self._maxSize = self._totalRowCnt * self._cellSize;
+			self._maxViewSize = ( self._rowsPerView ) * self._cellSize;
+			self._modifyViewPos = -self._cellSize;
+			if ( self._clipSize < self._maxViewSize ) {
+				self._modifyViewPos = ( -self._cellSize ) + ( self._clipSize - self._maxViewSize );
+			}
+		},
+
+		_getinheritedSize : function ( elem ) {
+			var $target = $( elem ),
+				height,
+				width,
+				NODETYPE = { ELEMENT_NODE : 1, TEXT_NODE : 3 },
+				ret = {
+					isDefinedWidth : false,
+					isDefinedHeight : false,
+					width : 0,
+					height : 0
+				};
+
+			while ( $target[0].nodeType === NODETYPE.ELEMENT_NODE && ( ret.isDefinedWidth === false || ret.isHeightDefined === false ) ) {
+				height = $target[0].style.height;
+				width = $target[0].style.width;
+
+				if ( ret.isDefinedHeight === false && height !== "" ) {
+					// Size was defined
+					ret.isDefinedHeight = true;
+					ret.height = parseInt( height, 10 );
+				}
+
+				if ( ret.isDefinedWidth === false && width !== "" ) {
+					// Size was defined
+					ret.isDefinedWidth = true;
+					ret.width = parseInt( width, 10 );
+				}
+				$target = $target.parent();
+				if ( $target.hasClass( "ui-content" ) ) {
+					break;
+				}
+			}
+			return ret;
+		},
+
+		_resize : function () {
+			var self = this,
+				ret = null,
+				rowsPerView = 0,
+				itemCount = 0,
+				totalRowCnt = 0,
+				diffRowCnt = 0,
+				clipSize = 0,
+				prevcnt = 0,
+				clipPosition = 0,
+				rowsLength = 0,
+				row = null,
+				size = 0;
+
+			if ( self._direction ) {
+				size = self._calculateClipHeight();
+				self._$view.height( size );
+				self._$clip.height( size );
+			} else {
+				size = self._calculateClipWidth();
+				self._$view.width( size );
+				self._$clip.width( size );
+			}
+
+			itemCount = self._calculateColumnCount();
+			if ( itemCount != self._itemCount ) {
+				totalRowCnt = parseInt( self._numItemData / itemCount, 10 );
+				self._totalRowCnt = self._numItemData % itemCount === 0 ? totalRowCnt : totalRowCnt + 1;
+				prevcnt = self._itemCount;
+				self._itemCount = itemCount;
+				clipPosition = self._getClipPosition();
+				self._$view.hide();
+
+				diffRowCnt = self._replaceRows( itemCount, prevcnt, self._totalRowCnt, clipPosition );
+				self._maxSizeExceptClip = ( self._totalRowCnt - self._rowsPerView ) * self._cellSize;
+				self._maxSize = self._totalRowCnt * self._cellSize;
+				self._scalableSize += ( -diffRowCnt ) * self._cellSize;
+				self._reservedPos  += ( -diffRowCnt ) * self._cellSize;
+				self._setScrollBarSize();
+				self._setScrollBarPosition( diffRowCnt );
+
+				self._$view.show();
+			}
+
+			clipSize = self._calculateClipSize();
+			if ( clipSize !== self._clipSize ) {
+				rowsPerView = clipSize / self._cellSize;
+				rowsPerView = parseInt( Math.ceil( rowsPerView ), 10 );
+
+				if ( rowsPerView > self._rowsPerView ) {
+					// increase row.
+					self._increaseRow( rowsPerView - self._rowsPerView );
+				} else if ( rowsPerView < self._rowsPerView ) {
+					// decrease row.
+					self._decreaseRow( self._rowsPerView - rowsPerView );
+				}
+				self._$rows = self._$view.children();
+				self._$rows.sort( function ( a, b ) {
+					return a.getAttribute( "row-index" ) - b.getAttribute( "row-index" );
+				});
+
+				self._rowsPerView = rowsPerView;
+				self._clipSize = clipSize;
+				self._blockScroll = self._rowsPerView > self._totalRowCnt;
+				self._maxSizeExceptClip = ( self._totalRowCnt - self._rowsPerView ) * self._cellSize;
+				self._maxSize = self._totalRowCnt * self._cellSize;
+				self._maxViewSize = ( self._rowsPerView ) * self._cellSize;
+				if ( self._clipSize < self._maxViewSize ) {
+					self._modifyViewPos = ( -self._cellSize ) + ( self._clipSize - self._maxViewSize );
+				}
+				if ( self._direction ) {
+					self._$clip.width( self._clipSize );
+				} else {
+					self._$clip.height( self._clipSize );
+				}
+				self._setScrollBarSize();
+				self._setScrollBarPosition( 0 );
+				self._setViewSize();
+			}
+		},
+
+		resize : function () {
+			var self = this,
+				height = 0,
+				$virtualgrid = $( ".ui-virtualgrid-view" );
+
+			self._inheritedSize = self._getinheritedSize( self.element );
+
+			if ( $virtualgrid.length !== 0 ) {
+				self._resize();
+			}
+		},
+
+		_initScrollView : function () {
+			var self = this,
+				oldDirection = self.options.direction;
+			$.extend( self.options, self._scrollView.options );
+			self.options.direction = oldDirection;
+			self.options.moveThreshold = 10;
+			self.options.showScrollBars = false;
+			self._getScrollHierarchy = self._scrollView._getScrollHierarchy;
+			self._makePositioned =  self._scrollView._makePositioned;
+			self._set_scrollbar_size = self._scrollView._set_scrollbar_size;
+			self._setStyleTransform = self._scrollView._setElementTransform;
+			self._hideOverflowIndicator = self._scrollView._hideOverflowIndicator;
+			self._showOverflowIndicator = self._scrollView._showOverflowIndicator;
+			self._setGestureScroll = self._scrollView._setGestureScroll;
+		},
+
+		_createTracker : function () {
+			var self = this;
+
+			self._tracker = new MomentumTracker( self.options );
+			if ( self._direction ) {
+				self._hTracker = self._tracker;
+				self._$clip.width( self._clipSize );
+			} else {
+				self._vTracker = self._tracker;
+				self._$clip.height( self._clipSize );
+			}
+		},
+
+		//----------------------------------------------------//
+		//		Overflow effect
+		//----------------------------------------------------//
+		_createOverflowArea : function () {
+			var self = this,
+				prefix = "<div class=\"ui-virtualgrid-overflow-indicator-",
+				suffixTop = "-top\"></div>",
+				suffixBottom = "-bottom\"></div>";
+
+			if ( self.options.rotation ) {
+				return;
+			}
+
+			if ( self._direction ) {
+				self._overflowTop = $( prefix + "x" + suffixTop );
+				self._overflowBottom = $( prefix + "x" + suffixBottom );
+			} else {
+				self._overflowTop = $( prefix + "y" + suffixTop );
+				self._overflowBottom = $( prefix + "y" + suffixBottom );
+			}
+
+			self._$clip.append( self._overflowTop );
+			self._$clip.append( self._overflowBottom );
+			self._overflowDisplayed = false;
+		},
+
+		_hideVGOverflowIndicator : function () {
+			if ( this._overflowDisplayed === false ) {
+				return;
+			}
+
+			this._overflowTop.animate( { opacity: 0 }, 300 );
+			this._overflowBottom.animate( { opacity: 0 }, 300 );
+			this._overflowDisplayed = false;
+		},
+
+		//----------------------------------------------------//
+		//		Scrollbar		//
+		//----------------------------------------------------//
+		_createScrollBar : function () {
+			var self = this,
+				prefix = "<div class=\"ui-scrollbar ui-scrollbar-",
+				suffix = "\"><div class=\"ui-scrollbar-track\"><div class=\"ui-scrollbar-thumb\"></div></div></div>";
+
+			if ( self.options.rotation ) {
+				return ;
+			}
+
+			if ( self._direction ) {
+				self._$clip.append( prefix + "x" + suffix );
+				self._hScrollBar = self._$clip.children( ".ui-scrollbar-x" );
+				self._hScrollBar.find( ".ui-scrollbar-thumb" ).addClass( "ui-scrollbar-thumb-x" );
+			} else {
+				self._$clip.append( prefix + "y" + suffix );
+				self._vScrollBar = self._$clip.children( ".ui-scrollbar-y" );
+				self._vScrollBar.find( ".ui-scrollbar-thumb" ).addClass( "ui-scrollbar-thumb-y" );
+			}
+		},
+
+		_setScrollBarSize: function () {
+			var self = this,
+				scrollBarSize = 0,
+				currentSize = 0,
+				$scrollBar,
+				attrName,
+				className;
+
+			if ( self.options.rotation ) {
+				return ;
+			}
+
+			scrollBarSize = parseInt( self._maxViewSize / self._clipSize, 10 );
+			if ( self._direction ) {
+				$scrollBar = self._hScrollBar.find( ".ui-scrollbar-thumb" );
+				attrName = "width";
+				currentSize = $scrollBar.width();
+				className = "ui-scrollbar-thumb-x";
+				self._hScrollBar.css( "width", self._clipSize );
+			} else {
+				$scrollBar = self._vScrollBar.find( ".ui-scrollbar-thumb" );
+				attrName = "height";
+				className = "ui-scrollbar-thumb-y";
+				currentSize = $scrollBar.height();
+				self._vScrollBar.css( "height", self._clipSize );
+			}
+
+			if ( scrollBarSize > currentSize ) {
+				$scrollBar.removeClass( className );
+				$scrollBar.css( attrName, scrollBarSize );
+			} else {
+				scrollBarSize = currentSize;
+			}
+
+			self._itemScrollSize = parseFloat( ( self._clipSize - scrollBarSize ) / ( self._totalRowCnt - self._rowsPerView ) );
+			self._itemScrollSize = Math.round( self._itemScrollSize * 100 ) / 100;
+		},
+
+		_setScrollBarPosition : function ( di, duration ) {
+			var self = this,
+				$sbt = null,
+				x = "0px",
+				y = "0px",
+				translate;
+
+			if ( self.options.rotation ) {
+				return ;
+			}
+
+			self._currentItemCount = self._currentItemCount + di;
+			if ( self._vScrollBar ) {
+				$sbt = self._vScrollBar.find( ".ui-scrollbar-thumb" );
+				y = ( self._currentItemCount * self._itemScrollSize ) + "px";
+			} else {
+				$sbt = self._hScrollBar.find( ".ui-scrollbar-thumb" );
+				x = ( self._currentItemCount * self._itemScrollSize ) + "px";
+			}
+			self._setStyleTransform( $sbt, x, y, duration );
+		},
+
+		_hideScrollBars : function () {
+			var self = this,
+				vclass = "ui-scrollbar-visible";
+
+			if ( self.options.rotation ) {
+				return ;
+			}
+
+			if ( self._vScrollBar ) {
+				self._vScrollBar.removeClass( vclass );
+			} else {
+				self._hScrollBar.removeClass( vclass );
+			}
+		},
+
+		_showScrollBars : function () {
+			var self = this,
+				vclass = "ui-scrollbar-visible";
+
+			if ( self.options.rotation ) {
+				return ;
+			}
+
+			if ( self._vScrollBar ) {
+				self._vScrollBar.addClass( vclass );
+			} else {
+				self._hScrollBar.addClass( vclass );
+			}
+		},
+
+		//----------------------------------------------------//
+		//		scroll process		//
+		//----------------------------------------------------//
+		centerTo : function ( selector ) {
+			var self = this,
+				row = null,
+				targetItem = null,
+				targetRowIndex = -1,
+				rowsLength = self._$rows.length,
+				newPosition,
+				i;
+
+			if ( !self.options.rotation ) {
+				return;
+			}
+
+			for ( i = 0; i < rowsLength; ++i ) {
+				row = $( self._$rows[ i ] );
+				targetItem = row.children( "." + selector );
+				if ( targetItem.length ) {
+					targetRowIndex = parseInt( row.attr( "row-index" ), 10 );
+					break;
+				}
+			}
+
+			if ( targetRowIndex === -1 ) {
+				targetRowIndex = self._getTargetRowIndex( selector );
+				if ( targetRowIndex === -1 ) {
+					return;
+				}
+			}
+
+			newPosition = -( targetRowIndex * self._cellSize - ( self._clipSize - self._cellSize ) / 2 );
+			if ( self._direction ) {
+				self.scrollTo( newPosition, 0 );
+			} else {
+				self.scrollTo( 0, newPosition );
+			}
+		},
+
+		_getTargetRowIndex: function ( selector ) {
+			var self = this,
+				dataCount = self._numItemData,
+				itemCount = self._itemCount,
+				attrName = self._direction ? "top" : "left",
+				html = "",
+				targetRowIndex = self._totalRowCnt,
+				i;
+
+			for ( i = 0; i < dataCount; ++i ) {
+				html = self._makeHtmlData( i, i % itemCount, attrName );
+				if ( self._hasClassItem( html, selector ) ) {
+					targetRowIndex = parseInt( i / itemCount, 10 );
+					break;
+				}
+			}
+
+			if ( targetRowIndex === self._totalRowCnt ) {
+				return -1;
+			}
+
+			return targetRowIndex;
+		},
+
+		_hasClassItem: function ( html, selector ) {
+			var self = this,
+				classString = self._getItemClass( html );
+
+			if ( classString.indexOf( selector ) === -1 ) {
+				return false;
+			}
+
+			if ( classString.indexOf( "virtualgrid-item" ) === -1 ) {
+				return false;
+			}
+
+			return true;
+		},
+
+		_getItemClass: function ( html ) {
+			var classIndex = html.indexOf( "class" ),
+				classBeginIndex = Math.min( html.indexOf( "\"", classIndex ), html.indexOf( "'", classIndex ) ),
+				classEndIndex = Math.min( html.indexOf( "\"", classBeginIndex + 1 ), html.indexOf( "'", classBeginIndex + 1 ) );
+
+			return html.slice( classBeginIndex + 1, classEndIndex );
+		},
+
+		scrollTo: function ( x, y, duration ) {
+			var self = this;
+			if ( self._direction ) {
+				x -= self._cellSize;
+				self._sx = self._reservedPos;
+				self._reservedPos = x;
+			} else {
+				y -= self._cellSize;
+				self._sy = self._reservedPos;
+				self._reservedPos = y;
+			}
+			self._scrollView.scrollTo.apply( this, [ x, y, duration ] );
+		},
+
+		getScrollPosition: function () {
+			if ( this.direction ) {
+				return { x: -this._ry, y: 0 };
+			}
+			return { x: 0, y: -this._ry };
+		},
+
+		_setScrollPosition: function ( x, y ) {
+			var self = this,
+				sy = self._scalableSize,
+				distance = self._direction ? x : y,
+				dy = distance - sy,
+				di = parseInt( dy / self._cellSize, 10 ),
+				i = 0,
+				idx = 0,
+				replaceStartIdx = 0,
+				realRowCount = self._rowsPerView + 2,
+				rawView = self._$view[0];
+
+			if ( self._blockScroll ) {
+				if ( dy > 0 && distance >= -self._cellSize && self._scalableSize >= -self._cellSize ) {
+					self._overflowDir = _OVERFLOW_DIR_UP;
+				}
+				if ( dy < 0 && self._scalableSize <= -( self._maxSizeExceptClip + self._cellSize ) ) {
+					self._overflowDir = _OVERFLOW_DIR_DOWN;
+				}
+				return;
+			}
+
+			if ( ! self.options.rotation ) {
+				if ( dy > 0 && distance >= -self._cellSize && self._scalableSize >= -self._cellSize ) {
+					// top
+					self._stopMScroll();
+					self._scalableSize = -self._cellSize;
+					self._setElementTransform( -self._cellSize );
+					if ( self._overflowDir === _OVERFLOW_DIR_NONE ) {
+						self._overflowDir = _OVERFLOW_DIR_UP;
+					}
+					return;
+				}
+				if ( dy < 0 && self._scalableSize <= -( self._maxSizeExceptClip + self._cellSize ) ) {
+					// bottom
+					self._stopMScroll();
+					self._scalableSize = -( self._maxSizeExceptClip + self._cellSize );
+					self._setElementTransform( self._modifyViewPos );
+					if ( self._overflowDir === _OVERFLOW_DIR_NONE ) {
+						self._overflowDir = _OVERFLOW_DIR_DOWN;
+					}
+					return;
+				}
+			}
+
+			replaceStartIdx = ( Math.abs( di ) < realRowCount ) ? 0 : ( di > 0 ) ? di - realRowCount : di + realRowCount;
+			if ( di > 0 ) { // scroll up
+				for ( i = replaceStartIdx; i < di; ++i ) {
+					idx = -parseInt( ( sy / self._cellSize ) + i + 3, 10 );
+					self._replaceRow( rawView.lastChild, circularNum( idx, self._totalRowCnt ) );
+					rawView.insertBefore( rawView.lastChild, rawView.firstChild );
+				}
+			} else if ( di < 0 ) { // scroll down
+				for ( i = replaceStartIdx; i > di; --i ) {
+					idx = self._rowsPerView - parseInt( ( sy / self._cellSize ) + i, 10 );
+					self._replaceRow( rawView.firstChild, circularNum( idx, self._totalRowCnt ) );
+					rawView.insertBefore( rawView.firstChild, rawView.lastChild.nextSibling );
+				}
+			}
+			self._setScrollBarPosition( -di );
+			self._scalableSize += di * self._cellSize;
+			self._setElementTransform( distance - self._scalableSize - self._cellSize );
+		},
+
+		_setElementTransform : function ( value ) {
+			var self = this,
+				x = 0,
+				y = 0;
+
+			if ( self._direction ) {
+				x = value + "px";
+			} else {
+				y = value + "px";
+			}
+			self._setStyleTransform( self._$view, x, y );
+		},
+
+		//----------------------------------------------------//
+		//		Event handler		//
+		//----------------------------------------------------//
+		_handleMomentumScroll: function () {
+			var self = this,
+				opts = self.options,
+				keepGoing = false,
+				v = this._$view,
+				x = 0,
+				y = 0,
+				t = self._tracker;
+
+			if ( t ) {
+				t.update();
+				if ( self._direction ) {
+					x = t.getPosition();
+				} else {
+					y = t.getPosition();
+				}
+				keepGoing = !t.done();
+			}
+
+			self._setScrollPosition( x, y );
+			if ( !opts.rotation ) {
+				keepGoing = !t.done();
+				self._reservedPos = self._direction ? x : y;
+				// bottom
+				self._reservedPos = self._reservedPos <= (-(self._maxSizeExceptClip - self._modifyViewPos)) ? ( - ( self._maxSizeExceptClip + self._cellSize) ) : self._reservedPos;
+				// top
+				self._reservedPos = self._reservedPos > -self._cellSize ? -self._cellSize : self._reservedPos;
+			} else {
+				self._reservedPos = self._direction ? x : y;
+			}
+			self._$clip.trigger( self.options.updateEventName, [ { x: x, y: y } ] );
+
+			if ( keepGoing ) {
+				self._timerID = setTimeout( self._timerCB, self._timerInterval );
+			} else {
+				self._stopMScroll();
+			}
+		},
+
+		_startMScroll: function ( speedX, speedY ) {
+			var self = this;
+			if ( self._direction ) {
+				self._sx = self._reservedPos;
+			} else {
+				self._sy = self._reservedPos;
+			}
+			self._scrollView._startMScroll.apply( self, [ speedX, speedY ] );
+		},
+
+		_stopMScroll: function () {
+			this._scrollView._stopMScroll.apply( this );
+		},
+
+		_enableTracking: function () {
+			var self = this;
+			self._$view.bind( self._dragMoveEvt, self._dragMoveCB );
+			self._$view.bind( self._dragStopEvt, self._dragStopCB );
+			self._scrollView._enableTracking.apply( self );
+		},
+
+		_disableTracking: function () {
+			var self = this;
+			self._$view.unbind( self._dragMoveEvt, self._dragMoveCB );
+			self._$view.unbind( self._dragStopEvt, self._dragStopCB );
+			self._scrollView._disableTracking.apply( self );
+		},
+
+		_handleDragStart: function ( e, ex, ey ) {
+			var self = this;
+			self._scrollView._handleDragStart.apply( this, [ e, ex, ey ] );
+			self._eventPos = self._direction ? ex : ey;
+			self._nextPos = self._reservedPos;
+		},
+
+		_handleDragMove: function ( e, ex, ey ) {
+			var self = this,
+				dx = ex - self._lastX,
+				dy = ey - self._lastY,
+				x = 0,
+				y = 0,
+				diffFromStartPos = 0,
+				diffFromLastPos = 0,
+				opacity = 0,
+				overflowPos = 0,
+				overFlowTarget = null;
+
+			self._lastMove = getCurrentTime();
+			self._speedX = dx;
+			self._speedY = dy;
+
+			self._didDrag = true;
+
+			self._lastX = ex;
+			self._lastY = ey;
+
+			if ( self._direction ) {
+				self._movePos = ex - self._eventPos;
+				x = self._nextPos + self._movePos;
+				overflowPos = ex;
+			} else {
+				self._movePos = ey - self._eventPos;
+				y = self._nextPos + self._movePos;
+				overflowPos = ey;
+			}
+			self._showScrollBars();
+			self._setScrollPosition( x, y );
+			if ( self._overflowDir !== _OVERFLOW_DIR_NONE ) {
+				overFlowTarget = ( self._overflowDir === _OVERFLOW_DIR_UP ) ? self._overflowTop : self._overflowBottom;
+				if ( !self._overflowDisplayed ) {
+					self._overflowDisplayed = true;
+					self._overflowStartPos = overflowPos;
+				}
+				diffFromStartPos = ( overflowPos - self._overflowStartPos ) * self._overflowDir;
+				opacity = ( diffFromStartPos < 0 ) ?
+							0 : ( diffFromStartPos > self._overflowMaxDragDist ) ?
+								1 : ( diffFromStartPos / self._overflowMaxDragDist );
+				overFlowTarget.css( "opacity", opacity );
+			}
+
+			return false;
+		},
+
+		_handleDragStop: function ( e ) {
+			var self = this;
+
+			self._reservedPos = self._movePos ? self._nextPos + self._movePos : self._reservedPos;
+			self._scrollView._handleDragStop.apply( this, [ e ] );
+			if ( self._overflowDir !== _OVERFLOW_DIR_NONE ) {
+				self._overflowDir = _OVERFLOW_DIR_NONE;
+				self._hideVGOverflowIndicator();
+			}
+			return self._didDrag ? false : undefined;
+		},
+
+		_addBehaviors: function () {
+			var self = this;
+
+			// scroll event handler.
+			if ( self.options.eventType === "mouse" ) {
+				self._dragStartEvt = "mousedown";
+				self._dragStartCB = function ( e ) {
+					return self._handleDragStart( e, e.clientX, e.clientY );
+				};
+
+				self._dragMoveEvt = "mousemove";
+				self._dragMoveCB = function ( e ) {
+					return self._handleDragMove( e, e.clientX, e.clientY );
+				};
+
+				self._dragStopEvt = "mouseup";
+				self._dragStopCB = function ( e ) {
+					return self._handleDragStop( e, e.clientX, e.clientY );
+				};
+
+				self._$view.bind( "vclick", function ( e ) {
+					return !self._didDrag;
+				} );
+			} else { //touch
+				self._dragStartEvt = "touchstart";
+				self._dragStartCB = function ( e ) {
+					var t = e.originalEvent.targetTouches[0];
+					return self._handleDragStart( e, t.pageX, t.pageY );
+				};
+
+				self._dragMoveEvt = "touchmove";
+				self._dragMoveCB = function ( e ) {
+					var t = e.originalEvent.targetTouches[0];
+					return self._handleDragMove( e, t.pageX, t.pageY );
+				};
+
+				self._dragStopEvt = "touchend";
+				self._dragStopCB = function ( e ) {
+					return self._handleDragStop( e );
+				};
+			}
+			self._$view.bind( self._dragStartEvt, self._dragStartCB );
+
+			// other events.
+			self._$view.delegate( ".virtualgrid-item", "click", function ( event ) {
+				var $selectedItem = $( this );
+				$selectedItem.trigger( "select", this );
+			} );
+
+			$( window ).bind( "resize", function ( e ) {
+				var height = 0,
+					$virtualgrid = $( ".ui-virtualgrid-view" );
+				if ( $virtualgrid.length !== 0 ) {
+					self._resize();
+				}
+			} );
+
+			$( document ).one( "pageshow", function ( event ) {
+				var $page = $( self.element ).parents( ".ui-page" ),
+					$header = $page.find( ":jqmData(role='header')" ),
+					$footer = $page.find( ":jqmData(role='footer')" ),
+					$content = $page.find( ":jqmData(role='content')" ),
+					footerHeight = $footer ? $footer.height() : 0,
+					headerHeight = $header ? $header.height() : 0;
+
+				if ( $page && $content ) {
+					$content.height( window.innerHeight - headerHeight - footerHeight ).css( "overflow", "hidden" );
+					$content.addClass( "ui-virtualgrid-content" );
+				}
+			} );
+		},
+
+		//----------------------------------------------------//
+		//		Calculate size about dom element.		//
+		//----------------------------------------------------//
+		_calculateClipSize : function () {
+			var self = this,
+				clipSize = 0;
+
+			if ( self._direction ) {
+				clipSize = self._calculateClipWidth();
+			} else {
+				clipSize = self._calculateClipHeight();
+			}
+			return clipSize;
+		},
+
+		_calculateClipWidth : function () {
+			var self = this,
+				$parent = self._$clip.parent(),
+				paddingValue = 0,
+				clipSize = $( window ).width();
+
+			if ( self._inheritedSize.isDefinedWidth ) {
+				return self._inheritedSize.width;
+			}
+
+			if ( $parent.hasClass( "ui-content" ) ) {
+				paddingValue = parseInt( $parent.css( "padding-left" ), 10 );
+				clipSize = clipSize - ( paddingValue || 0 );
+				paddingValue = parseInt( $parent.css( "padding-right" ), 10 );
+				clipSize = clipSize - ( paddingValue || 0 );
+			} else {
+				clipSize = self._$clip.width();
+			}
+			return clipSize;
+		},
+
+		_calculateClipHeight : function () {
+			var self = this,
+				$parent = self._$clip.parent(),
+				header = null,
+				footer = null,
+				paddingValue = 0,
+				clipSize = $( window ).height();
+
+			if ( self._inheritedSize.isDefinedHeight ) {
+				return self._inheritedSize.height;
+			}
+
+			if ( !$parent.hasClass( "ui-content" ) ) {
+				$parent = $parent.hasClass( "ui-scrollview-view" ) ? $parent.parent() : null;
+			}
+
+			if ( $parent && $parent.length ) {
+				paddingValue = parseInt( $parent.css( "padding-top" ), 10 );
+				clipSize = clipSize - ( paddingValue || 0 );
+				paddingValue = parseInt( $parent.css( "padding-bottom" ), 10 );
+				clipSize = clipSize - ( paddingValue || 0 );
+				header = $parent.siblings( ".ui-header" );
+				footer = $parent.siblings( ".ui-footer" );
+
+				if ( header ) {
+					if ( header.outerHeight( true ) === null ) {
+						clipSize = clipSize - ( $( ".ui-header" ).outerHeight() || 0 );
+					} else {
+						clipSize = clipSize - header.outerHeight( true );
+					}
+				}
+				if ( footer ) {
+					clipSize = clipSize - footer.outerHeight( true );
+				}
+			} else {
+				clipSize = self._$clip.height();
+			}
+			return clipSize;
+		},
+
+		_calculateColumnSize : function () {
+			var self = this,
+				$tempBlock,
+				$cell;
+
+			$tempBlock = $( self._makeRows( 1 ) );
+			self._$view.append( $tempBlock.children().first() );
+			if ( self._direction ) {
+				// x-axis
+				self._viewSize = self._$view.width();
+				$cell = self._$view.children().first().children().first();
+				self._cellSize = $cell.outerWidth( true );
+				self._cellOtherSize = $cell.outerHeight( true );
+			} else {
+				// y-axis
+				self._viewSize = self._$view.height();
+				$cell = self._$view.children().first().children().first();
+				self._cellSize = $cell.outerHeight( true );
+				self._cellOtherSize = $cell.outerWidth( true );
+			}
+			$tempBlock.remove();
+			self._$view.children().remove();
+		},
+
+		_calculateColumnCount : function ( ) {
+			var self = this,
+				$view = self._$clip,
+				viewSize = self._direction ? $view.innerHeight() : $view.innerWidth(),
+				itemCount = 0 ;
+
+			if ( self._direction ) {
+				viewSize = viewSize - ( parseInt( $view.css( "padding-top" ), 10 ) + parseInt( $view.css( "padding-bottom" ), 10 ) );
+			} else {
+				viewSize = viewSize - ( parseInt( $view.css( "padding-left" ), 10 ) + parseInt( $view.css( "padding-right" ), 10 ) );
+			}
+
+			itemCount = parseInt( ( viewSize / self._cellOtherSize ), 10 );
+			return itemCount > 0 ? itemCount : 1 ;
+		},
+
+		// Read the position of clip form property ('webkit-transform').
+		// @return : number - position of clip.
+		_getClipPosition : function () {
+			var self = this,
+				matrix = null,
+				contents = null,
+				result = -self._cellSize,
+				$scrollview = self._$view.closest( ".ui-scrollview-view" );
+
+			if ( $scrollview ) {
+				matrix = $scrollview.css( "-webkit-transform" );
+				contents = matrix.substr( 7 );
+				contents = contents.substr( 0, contents.length - 1 );
+				contents = contents.split( ', ' );
+				result =  Math.abs( contents [5] );
+			}
+			return result;
+		},
+
+		//----------------------------------------------------//
+		//		DOM Element handle		//
+		//----------------------------------------------------//
+		_makeRows : function ( count ) {
+			var self = this,
+				index = 0,
+				row = null,
+				wrapper = null;
+
+			wrapper = self._createElement( "div" );
+			wrapper.setAttribute( "class", "ui-scrollview-view" );
+			for ( index = 0; index < count ; index += 1 ) {
+				row = self._makeRow( index );
+				if ( self._direction ) {
+					row.style.top = 0;
+					row.style.left = index * self._cellSize;
+				}
+				wrapper.appendChild( row );
+			}
+			return wrapper;
+		},
+
+		// make a single row block
+		_makeRow : function ( rowIndex ) {
+			var self = this,
+				index = rowIndex * self._itemCount,
+				colIndex = 0,
+				blockClassName = self._direction ? "ui-virtualgrid-wrapblock-x" : "ui-virtualgrid-wrapblock-y",
+				wrapBlock = self._createElement( "div" ),
+				strWrapInner = "",
+				attrName = self._direction ? "top" : "left";
+
+			for ( colIndex = 0; colIndex < self._itemCount; colIndex++ ) {
+				strWrapInner += self._makeHtmlData( index, colIndex, attrName );
+				index += 1;
+			}
+			wrapBlock.innerHTML = strWrapInner;
+			wrapBlock.setAttribute( "class", blockClassName );
+			wrapBlock.setAttribute( "row-index", String( rowIndex ) );
+			self._fragment.appendChild( wrapBlock );
+			return wrapBlock;
+		},
+
+		_makeHtmlData : function ( dataIndex, colIndex, attrName ) {
+			var self = this,
+				htmlStr = "",
+				itemData = null;
+
+			itemData = self._itemData( dataIndex );
+			if ( itemData ) {
+				htmlStr = self._getConvertedTmplStr( itemData );
+				htmlStr = self._insertPosToTmplStr( htmlStr, attrName, ( colIndex * self._cellOtherSize ) );
+			}
+
+			return htmlStr;
+		},
+
+		_insertPosToTmplStr : function ( tmplStr, attrName, posVal ) {
+			var tagCloseIdx = tmplStr.indexOf( '>' ),
+				classIdx = -1,
+				firstPart,
+				lastPart,
+				result,
+				found = false,
+				targetIdx = 0,
+				firstPartLen,
+				i = 0;
+
+			if ( tagCloseIdx === -1 ) {
+				return;
+			}
+
+			firstPart = tmplStr.slice( 0, tagCloseIdx );
+			lastPart = tmplStr.slice( tagCloseIdx, tmplStr.length );
+
+			classIdx = firstPart.indexOf( 'class' );
+
+			if ( classIdx !== -1 ) {
+				firstPartLen = firstPart.length;
+				for ( i = classIdx + 6; i < firstPartLen; i++ ) {
+					if ( firstPart.charAt( i ) === "\"" || firstPart.charAt( i ) === "\'" ) {
+						if ( found === false ) {
+							found = true;
+						} else {
+							targetIdx = i;
+							break;
+						}
+					}
+				}
+				result = firstPart.slice( 0, targetIdx ) + " virtualgrid-item" + firstPart.slice( targetIdx, firstPartLen ) + lastPart;
+			} else {
+				result = firstPart + " class=\"virtualgrid-item\"" + lastPart;
+			}
+
+			if ( !isNaN( posVal ) ) {
+				result = result.replace( '>', " style=\"" + attrName + ": " + String( posVal ) + "px\">");
+			}
+
+			return result;
+		},
+
+		_increaseRow : function ( num ) {
+			var self = this,
+				rotation = self.options.rotation,
+				totalRowCnt = self._totalRowCnt,
+				rowView = self._$view[ 0 ],
+				firstRow = null,
+				lastRow = rowView.lastChild,
+				row = null,
+				headRowIndex = 0,
+				tailRowIndex = 0,
+				i;
+
+			if ( !lastRow ) {
+				return;
+			}
+
+			tailRowIndex = parseInt( lastRow.getAttribute( "row-index" ), 10 );
+			if ( !rotation ) {
+				firstRow = rowView.firstChild;
+				headRowIndex = parseInt( firstRow.getAttribute( "row-index" ), 10 );
+			}
+
+			for ( i = 0 ; i < num ; ++i ) {
+				if ( tailRowIndex >= totalRowCnt - 1 && !rotation ) {
+					if ( headRowIndex == 0 ) {
+						break;
+					}
+
+					row = self._makeRow( --headRowIndex );
+					rowView.insertBefore( row, firstRow );
+					firstRow = row;
+				} else {
+					row = self._makeRow( circularNum( ++tailRowIndex, totalRowCnt ) );
+					rowView.appendChild( row );
+				}
+
+				if ( self._direction ) {
+					$( row ).width( self._cellSize );
+				} else {
+					$( row ).height( self._cellSize );
+				}
+			}
+		},
+
+		_decreaseRow : function ( num ) {
+			var self = this,
+				rowView = self._$view[ 0 ],
+				i;
+
+			for ( i = 0 ; i < num ; ++i ) {
+				rowView.removeChild( rowView.lastChild );
+			}
+		},
+
+		_replaceRows : function ( curCnt, prevCnt, maxCnt, clipPosition ) {
+			var self = this,
+				$rows = self._$view.children(),
+				prevRowIndex = 0,
+				rowIndex = 0,
+				diffRowCnt = 0,
+				targetCnt = 1,
+				filterCondition = ( self._filterRatio * self._cellSize ) + self._cellSize,
+				idx = 0;
+
+			if ( filterCondition < clipPosition ) {
+				targetCnt += 1;
+			}
+
+			prevRowIndex = parseInt( $( $rows[targetCnt] ).attr( "row-index" ), 10 );
+			if ( prevRowIndex === 0 ) {
+				// only top.
+				rowIndex = maxCnt - targetCnt;
+			} else {
+				rowIndex = Math.round( ( prevRowIndex * prevCnt ) / curCnt );
+				if ( rowIndex + self._rowsPerView >= maxCnt ) {
+					// only bottom.
+					rowIndex = maxCnt - self._rowsPerView;
+				}
+				diffRowCnt = prevRowIndex - rowIndex;
+				rowIndex -= targetCnt;
+			}
+
+			for ( idx = 0 ; idx < $rows.length ; idx += 1 ) {
+				self._replaceRow( $rows[idx], circularNum( rowIndex, self._totalRowCnt ) );
+				rowIndex++;
+			}
+			return -diffRowCnt;
+		},
+
+		_replaceRow : function ( block, index ) {
+			var self = this,
+				tempBlocks = null;
+
+			while ( block.hasChildNodes() ) {
+				block.removeChild( block.lastChild );
+			}
+
+			tempBlocks = self._makeRow( index );
+			while ( tempBlocks.children.length ) {
+				block.appendChild( tempBlocks.children[0] );
+			}
+			block.setAttribute( "row-index", tempBlocks.getAttribute( "row-index" ) );
+			tempBlocks.parentNode.removeChild( tempBlocks );
+		},
+
+		_createElement : function ( tag ) {
+			var element = document.createElement( tag );
+
+			this._fragment.appendChild( element );
+			return element;
+		},
+
+		_getObjectNames : function ( obj ) {
+			var properties = [],
+				name = "";
+
+			for ( name in obj ) {
+				properties.push( name );
+			}
+			this._properties = properties;
+		},
+
+		_getConvertedTmplStr : function ( data ) {
+			var self = this,
+				dataProperties = self._properties,
+				i = 0,
+				plainMsg,
+				ret = "";
+
+			if ( !data ) {
+				return ;
+			}
+
+			plainMsg = self._templateText;
+			for ( i = 0; i < dataProperties.length; i++ ) {
+				plainMsg = self._strReplace( plainMsg, "${" + dataProperties[ i ] + "}" , data[ dataProperties[ i ] ] );
+			}
+			plainMsg = self._changeImgSrcAriaAttrFromTmpl( plainMsg );
+
+			return plainMsg;
+		},
+
+		_changeImgSrcAriaAttrFromTmpl : function ( plainMsg ) {
+			var self = this,
+				ret = "",
+				targetTagIdx,
+				beforeTargetTag = "",
+				afterTargetTag = "",
+				imgFileName,
+				imgSrcSlashIdx,
+				temp,
+				srcRegExpResult;
+
+			temp = plainMsg;
+			targetTagIdx = temp.indexOf( "$ARIA-IMG-SRC-ALT$" );
+			while ( targetTagIdx !== -1 ) {
+				imgFileName = "";
+				beforeTargetTag = beforeTargetTag + temp.slice( 0, targetTagIdx + 19 );
+				afterTargetTag = temp.slice( targetTagIdx + 19, temp.length );
+				srcRegExpResult = afterTargetTag.match( imgTagSrcAttrRE );
+				if ( srcRegExpResult ) {
+					imgSrcSlashIdx = srcRegExpResult[0].lastIndexOf( "/" );
+					if ( imgSrcSlashIdx !== -1 ) {
+						imgFileName = srcRegExpResult[0].slice( imgSrcSlashIdx + 1, -1 );
+					}
+				}
+				beforeTargetTag = beforeTargetTag.replace( "$ARIA-IMG-SRC-ALT$", imgFileName );
+				temp = afterTargetTag;
+				targetTagIdx = temp.indexOf( "$ARIA-IMG-SRC-ALT$" );
+				ret = beforeTargetTag + afterTargetTag;
+			}
+
+			if ( ret === "" ) {
+				ret = plainMsg;
+			}
+
+			return ret;
+		},
+
+		_insertAriaAttrToTmpl : function ( plainMsg ) {
+			var ret = "",
+				targetTagIdx,
+				beforeTargetTag = "",
+				afterTargetTag = "",
+				temp;
+
+			temp = plainMsg.replace( "<div", "<div tabindex=\"0\" aria-selected=\"true\"" );
+			targetTagIdx = temp.indexOf( "<img" );
+			if ( targetTagIdx !== -1 ) {
+				while ( targetTagIdx !== -1 ) {
+					beforeTargetTag = beforeTargetTag + temp.slice( 0, targetTagIdx + 4 );
+					afterTargetTag = temp.slice( targetTagIdx + 4, temp.length );
+					beforeTargetTag = beforeTargetTag + " role=\"img\" alt=\"$ARIA-IMG-SRC-ALT$\"";
+					temp = afterTargetTag;
+					targetTagIdx = temp.indexOf( "<img" );
+					ret = beforeTargetTag + afterTargetTag;
+				}
+				temp = ret;
+				targetTagIdx = temp.indexOf( "<span" );
+				beforeTargetTag = "";
+				while ( targetTagIdx !== -1 ) {
+					beforeTargetTag = beforeTargetTag + temp.slice( 0, targetTagIdx + 5 );
+					afterTargetTag = temp.slice( targetTagIdx + 5, temp.length );
+					beforeTargetTag = beforeTargetTag + " aria-hidden=\"true\" tabindex=\"-1\"";
+					temp = afterTargetTag;
+					targetTagIdx = temp.indexOf( "<span" );
+					ret = beforeTargetTag + afterTargetTag;
+				}
+			}
+
+			if ( ret === "" ) {
+				ret = plainMsg;
+			}
+
+			return ret;
+		},
+
+		_strReplace : function ( plainMsg, stringToFind, stringToReplace ) {
+			var temp = plainMsg,
+				index = plainMsg.indexOf( stringToFind );
+			while ( index !== -1 ) {
+				temp = temp.replace( stringToFind, stringToReplace );
+				index = temp.indexOf( stringToFind );
+			}
+			return temp;
+		}
+
+	} );
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( ":jqmData(role='virtualgrid')" ).virtualgrid();
+	} );
+} ( jQuery, window, document ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.virtuallistview.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.virtuallistview.js
new file mode 100644
index 0000000..d0bc8c7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.virtuallistview.js
@@ -0,0 +1,1010 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Shows listview swapping its contents automatically
+//>>label: Virtual listview
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	'../jquery.mobile.tizen.core',
+	'../jquery.mobile.tizen.scrollview'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/* ***************************************************************************
+ * 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>
+ *	        Youmin Ha <youmin.ha@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-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.
+ *
+ * * APIs:
+ *
+ *		create ( {
+ *				itemData: function ( idx ) { return json_obj; },
+ *				numItemData: number or function () { return number; },
+ *				cacheItemData: function ( minIdx, maxIdx ) {}
+ *				} )
+ *			: Create a virtuallist widget. At this moment, _create method is called.
+ *			args : A collection of options
+ *				itemData: A function that returns JSON object for given index. Mandatory.
+ *				numItemData: Total number of itemData. Mandatory.
+ *				cacheItemData: Virtuallist will ask itemData between minIdx and maxIdx.
+ *				               Developers can implement this function for preparing data.
+ *				               Optional.
+ *
+ * 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>
+ *
+ */
+
+/**
+	@class VirtualList
+	In the Web environment, it is challenging to display a large amount of data in a list, such as displaying a contact list of over 1000 list items. It takes time to display the entire list in HTML and the DOM manipulation is complex.
+
+	The virtual list widget is used to display a list of unlimited data elements on the screen for better performance. This widget provides easy access to databases to retrieve and display data. Virtual lists are based on the jQuery.template plugin as described in the jQuery documentation for jQuery.template plugin.
+
+	To add a virtual list widget to the application, use the following code:
+
+		<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="vlist" data-role="virtuallistview" data-template="tmp-3-2-7" data-dbtable="JSON_DATA" data-row="100"></ul>
+*/
+/**
+	@property {String} data-role
+	Creates the virtual list view. The value must be set to virtuallistview.
+	Only the &gt;ul&lt; element, which a id attribute defined, supports this option. Also, the vlLoadSuccess class attribute must be defined in the &gt;ul&lt; element to ensure that loading data from the database is complete.
+*/
+/**
+	@property {String} data-template
+	Defines the jQuery.template element ID.
+	The jQuery.template must be defined. The template style can use rem units to support scalability.
+*/
+/**
+	@property {Number} data-row
+	Defines the number of virtual list child elements.
+	The minimum value is 20 and the default value is 100. As the value gets higher, the loading time increases while the system performance improves. So you need to pick a value that provides the best performance without excessive loading time.
+*/
+/**
+	@method create
+	@param {function} itemData(index)
+	: function itemData(index) returns the JSON object matched with the given index. The index value is between 0 and numItemData-1.
+	@param {Number} numItemData
+	: number numItemData or function numItemData() defines or returns a static number of items.
+	@param {function} cacheItemData(minIndex, maxIndex)
+	: function cacheItemData(minIndex, maxIndex) prepares the JSON data. This method is called before calling the itemData() method with index values between minIndex and maxIndex.
+*/
+
+(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 */
+		_NO_SCROLL = 0,					/* ENUM */
+		_SCROLL_DOWN = 1,				/* ENUM */
+		_SCROLL_UP = -1;					/* ENUM */
+
+	$.widget( "tizen.virtuallistview", $.mobile.widget, {
+		options: {
+			theme: "s",
+			countTheme: "s",
+			headerTheme: "s",
+			dividerTheme: "s",
+			splitIcon: "arrow-r",
+			splitTheme: "s",
+			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: 30,
+			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" );
+			$( this ).addClass( "ui-btn-up-s" );
+			$( this ).removeClass( "ui-btn-down-s" );
+		},
+
+		// ?
+		// this		virtuallistview object
+		// @param[in]	template	template name(string)
+		_pushData: function ( template ) {
+			var o = this.options,
+				i,
+				myTemplate = $( "#" + template ),	// Get template object
+				// NOTE: o.row = # of rows handled at once. Default value is 100.
+				lastIndex = ( o.row > this._numItemData ? this._numItemData : o.row ),	// last index of handled data
+				htmlData;
+
+			for ( i = 0; i < lastIndex; i++ ) {
+				htmlData = myTemplate.tmpl( this._itemData( i ) );	// Make rows with template,
+				$( o.id ).append( $( htmlData ).attr( 'id', o.itemIDPrefix + i ) );	// and append it to the vlist object
+			}
+
+			// After pushing data re-style virtuallist widget
+			$( o.id ).trigger( "create" );
+		},
+
+		// Set children <li> elements' position
+		//
+		// this: virtuallist element
+		// event: virtuallistview.options
+		//		TODO: Why this arg name is 'event'? Not resonable.
+		//		(this function is not called with event element as args!)
+		_reposition: function ( event ) {
+			var o,
+				t = this,
+				padding,
+				margin;
+
+			if ( event.data ) {
+				o = event.data;
+			} else {
+				o = event;
+			}
+			if ( $( o.id + o.childSelector ).size() > 0 ) { // $("#vlistid li")
+				// first child's top position
+				// NOTE: the first element may not be '0'!!!
+				t._title_h = $( o.id + o.childSelector + ':first' ).position().top;
+				// first child's outer height (TODO: reuse selected items)
+				t._line_h = $( o.id + o.childSelector + ':first' ).outerHeight();
+
+				// container(vlist element)'s innerwidth
+				t._container_w = $( o.id ).innerWidth();
+
+				// get sum of container's left/right padding
+				padding = parseInt( $( o.id + o.childSelector ).css( "padding-left" ), 10 )
+					+ parseInt( $( o.id + o.childSelector ).css( "padding-right" ), 10 );
+
+				// Add CSS to all <li> elements
+				//	* absolute position
+				//	* btn-up
+				//	* mouse up/down/over/out styles
+				$( 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 );
+			}
+
+			// Set absolute top/left position of each <li>
+			$( o.id + ">" + o.childSelector ).each( function ( index ) {
+				margin = parseInt( $( this ).css( "margin-left" ), 10 )
+					+ parseInt( $( this ).css( "margin-right" ), 10 );
+
+				$( this ).css( "top", t._title_h + t._line_h * index + 'px' )
+					.css( "width", t._container_w - padding - margin );
+			} );
+
+			// Set Max Listview Height
+			$( o.id ).height( t._numItemData * t._line_h );
+		},
+
+		// Resize each listitem's width
+		_resize: function ( event ) {
+			var o,	// 'ul'
+				t = this,
+				li,
+				padding,
+				margin;
+
+			if ( event.data ) {
+				o = event.data;
+			} else {
+				o = event;
+			}
+			li = $( o ).children( o.childSelector )
+
+			t._container_w = $( o ).width();
+
+			padding = parseInt( li.css( "padding-left" ), 10 )
+				+ parseInt( li.css( "padding-right" ), 10 );
+
+			li.each( function ( index, obj ) {
+				margin = parseInt( $( this ).css( "margin-left" ), 10 )
+					+ parseInt( $( this ).css( "margin-right" ), 10 );
+				$( this ).css( "width", t._container_w - padding - margin );
+			} );
+		},
+
+		// New scrollmove function supporting scrollTo
+		_scrollmove: function ( ev ) {
+			var t = ev.data,	// vlist (JQM object)
+				o = t.options,	// options
+				prevTopBufLen = t._num_top_items,	// Previous(remembered) top buf length
+				timerInterval = 100,
+				i,
+				_scrollView,
+				_normalScroll;
+
+			_scrollView = {
+				viewTop: function ( ) {
+					var sv = $( o.id ).parentsUntil( ".ui-page" ).find( ".ui-scrollview-view" ),
+						svTrans = sv.css( "-webkit-transform" ),
+						svTransVal = "0,0,0,0,0,0";
+					if ( svTrans ) {
+						svTransVal = svTrans.replace( /matrix\s*\((.*)\)/, "$1" );	// matrix(a,c,b,d,tx,ty)
+					}
+					return - parseInt( svTransVal.split(',')[5], 10 );
+				}
+			};
+			_normalScroll = {
+				viewTop: function ( ) {
+					return $( window ).scrollTop( );	// TODO: - _line_h?
+				}
+			};
+			// Get current view top position
+			function viewTop ( ) {
+				return o.scrollview ? _scrollView.viewTop() : _normalScroll.viewTop();
+			}
+			// log function for debug
+			function log ( msg ) {
+				var debug = false;
+				if ( debug ) {
+					console.log( ">>virtualllist: " + msg );
+				}
+			}
+
+			// Timer interval function
+			// @param[in]	vl	virtuallist object (JQM object)
+			function timerMove ( vl, undefined ) {
+				var cy,				// current y position
+					cti,		// current top idx
+					cbi,		// current bottom idx
+					oti = vl._first_index,	// old top idx
+					obi = vl._last_index,	// old botton idx
+					dti,			// delta of top idx
+					fromIdx,
+					toIdx,	// index range to be moved
+					delta,			// moveItem delta
+					rowLen = vl.options.row,	// max. # of items handled at once
+					bufSize,		// top/bottom buffer size. unit: # of items
+					i;
+
+				// subroutine: Move itemContents in i2 into i1
+				function moveItemContents( vl, i1, i2 ) {
+					// TODO: Find a efficient way to replace data!
+					// Assumption: i1 and i2 has same children.
+					var NODETYPE = { ELEMENT_NODE: 1, TEXT_NODE: 3 },
+						c1,	// child item 1 (old)
+						c2,	// child item 2 (new)
+						newText,
+						newImg,
+						i;
+
+					$( i1 ).find( ".ui-li-text-main", ".ui-li-text-sub", ".ui-li-text-sub2", "ui-btn-text" ).each( function ( index ) {
+						c1 = $( this );
+						newText = $( i2 ).find( ".ui-li-text-main", ".ui-li-text-sub", "ui-btn-text" ).eq( index ).text();
+
+						$( c1 ).contents().filter( function () {
+							return ( this.nodeType == NODETYPE.TEXT_NODE );
+						} ).get( 0 ).data = newText;
+					} );
+
+					$( i1 ).find( "img" ).each( function ( imgIdx ) {
+						var c1 = $( this );
+						newImg = $( i2 ).find( "img" ).eq( imgIdx ).attr( "src" );
+
+						$( c1 ).attr( "src", newImg );
+					} );
+
+					$( i1 ).removeData( );	// Clear old data
+				}
+
+				// subroutine: Move item
+				function moveItem( vl, fromIdx, toIdx ) {
+					var itemData,	// data from itemData()
+						item,		// item element
+						newItem,	// new item element
+						tmpl;		// template
+
+					log( ">> move item: " + fromIdx + " --> " + toIdx );
+
+					// Find current item
+					item = $( '#' + vl.options.itemIDPrefix + fromIdx );	// TODO: refactor ID generation!
+					if ( ! item || ! item.length ) {
+						return false;
+					}
+
+					// Get new item
+					tmpl = $( "#" + vl.options.template );
+					if ( tmpl ) {
+						newItem = tmpl.tmpl( vl._itemData( toIdx ) );
+
+						// TODO: Consider touch block while moving?
+
+						// Move item contents
+						moveItemContents( vl, item, newItem );
+
+						// clean up temporary item
+						newItem.remove();
+					}
+
+					// Move position, and set id
+					item.css( 'top', toIdx * vl._line_h )
+						.attr( 'id' , vl.options.itemIDPrefix + toIdx );	// TODO: refactor ID generation!
+
+					// TODO: Apply jqmdata? check following old code;
+					// $( oldItem ).removeData( );	// Clear old data
+					// if (key) { $( oldItem ).data( key, $( newItem ).data( key ) ); }
+
+					return true;
+				}
+
+
+				// Get current view position
+				cy = viewTop();
+
+				// Calculate bufSize: rowLen / 3
+				// NOTE: Assumption: total row length = visible items * 3 (upper+visible+lower)
+				bufSize = Math.ceil( rowLen / 3 );
+
+				// Calculate current top/bottom index (to be applied)
+				// top index = current position / line height
+				cti = Math.floor( cy / vl._line_h ) - bufSize;	// TODO: consider buffer!
+				cbi = cti + rowLen - 1;
+
+				if ( cti < 0 ) {		// Top boundary check
+					cbi += ( - cti );
+					cti = 0;
+				} else if ( cbi > ( vl._numItemData - 1 ) ) {		// Bottom boundary check
+					cti -= ( cbi - ( vl._numItemData - 1 ) );
+					cbi = ( vl._numItemData - 1 );
+				}
+
+				// Calculate dti
+				dti = cti - oti;
+				log( "cy=" + cy + ", oti=" + oti + ", obi=" + obi + ", cti=" + cti + ", cbi=" + cbi + ", dti=" + dti );
+
+				// switch: dti = 0 --> timer stop condition: delta=0 or scrollstop event comes. END.
+				if ( 0 == dti ) {
+					// Check timer runtime
+					vl.timerStillCount += 1;
+					if ( vl.timerStillCount < 12 ) {	// check count ( TODO: test and adjust )
+						log("dti=0 " + vl.timerStillCount + " times");
+						vl.timerMoveID = setTimeout( timerMove, timerInterval, vl );	// run once more
+						return;
+					}
+
+					log("dti=0 " + vl.timerStillCount + " times. End timer.");
+					vl.timerStillCount = 0;
+					// Stop timer
+					if ( vl.timerMoveID ) {
+						clearTimeout( vl.timerMoveID );
+						vl.timerMoveID = null;
+					}
+				} else {
+					// switch: dti >= # of max elements --> total replace.
+					vl.timerStillCount = 0;		// Reset still counter
+
+					if ( Math.abs( dti ) >= rowLen ) {
+						fromIdx = oti;
+						toIdx = obi;
+						delta = dti;
+						log( ">>> WHOLE CHANGE! delta=" + delta );
+					} else {
+						// switch: dti < # of max elements --> move t2b or b2t until new top/bottom idx is covered
+						if ( dti > 0 ) {
+							fromIdx = oti;
+							toIdx = oti + dti - 1;
+							delta = rowLen;
+						} else {
+							fromIdx = obi + dti + 1;	// dti < 0
+							toIdx = obi;
+							delta = -rowLen;
+						}
+						log( ">>> partial change. delta=" + delta );
+					}
+
+					// Move items
+					for ( i = fromIdx; i <= toIdx; i++ ) {
+						moveItem( vl, i, i + delta );		// Change data and position
+					}
+
+					// Store current top/bottom idx into vl
+					vl._first_index = cti;
+					vl._last_index = cbi;
+
+					// Register timer to check again
+					vl.timerMoveID = setTimeout( timerMove, timerInterval, vl );
+				}
+				return;	// End of function
+			}
+
+			// ==== function start ====
+
+			t.timerStillCount = 0;	// Count do-nothing time.	For behavior tuning.
+
+			// If a timer function is alive, clear it
+			if ( t.timerMoveID ) {
+				clearTimeout( t.timerMoveID );
+				t.timerMoveID = null;
+			}
+			// run TimerMove()
+			timerMove( t );
+		},
+
+		_recreate: function ( newArray ) {
+			var t = this,
+				o = this.options;
+
+			$( o.id ).empty();
+
+			t._numItemData = newArray.length;
+			t._direction = _NO_SCROLL;
+			t._first_index = 0;
+			t._last_index = o.row - 1;
+
+			t._pushData( o.template );
+
+			if (o.childSelector == " ul" ) {
+				$( o.id + " ul" ).swipelist();
+			}
+
+			$( o.id ).virtuallistview();
+
+			t.refresh( true );
+
+			t._reposition( o );
+		},
+
+		// Init virtuallistview
+		// this		virtuallistview object
+		_initList: function () {
+			var t = this,
+				o = this.options;
+
+			/* After AJAX loading success */
+
+			// Put initial <li> elements
+			t._pushData( o.template );
+
+			// find a parent page, and run _reposition() at 'pageshow' event
+			// TODO: Consider replace parentsUntil().parent() to parent('.ui-page') ???
+			$( o.id ).parentsUntil( ".ui-page" ).parent().one( "pageshow", function () {
+				setTimeout( function () {
+					t._reposition( o );
+				}, 0);
+			});
+
+			// Bind _scrollmove() at 'scrollstart.virtuallist' event
+			$( document ).bind( "scrollstart.virtuallist scrollstop.vrituallist", t, t._scrollmove );
+
+			// Bind _resize()
+			$( window ).on( "throttledresize", $( o.id ), t._resize );
+
+			// when ul is a childselector, assume that this is also a swipelist,
+			// and run swipelist constructor
+			if ( o.childSelector == " ul" ) {
+				$( o.id + " ul" ).swipelist();
+			}
+
+			t.refresh( true );
+		},
+
+		create: function () {
+			var o = this.options;
+
+			/* external API for AJAX callback */
+			this._create.apply( this, arguments );
+
+			// TODO: remove this line? _initList() calls reposition...
+			this._reposition( o );
+		},
+
+		_create: function ( args ) {
+			// Extend instance variables
+			$.extend( this, {
+				_itemData : function ( idx ) { return null; },
+				_numItemData : 0,
+				_cacheItemData : function ( minIdx, maxIdx ) { },
+				_title_h : 0,
+				_container_w : 0,
+				_minimum_row : 100,
+				_direction : _NO_SCROLL,
+				_first_index : 0,
+				_last_index : 0,
+				_num_top_items : 0	// By scroll move, number of hidden elements.
+			} );
+
+			// local variables
+			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,
+				dbtable_name,
+				dbtable;
+
+
+			// Add CSS classes to $el (=virtuallistview)
+			$el.addClass( function ( i, orig ) {
+				return orig + " ui-listview ui-virtual-list-container" + ( t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : "" );
+			});
+
+			// keep the vlist's ID
+			o.itemIDPrefix = $el.attr( "id" ) + '_';
+			o.id = "#" + $el.attr( "id" );
+
+			// when page hides, empty all child elements
+			$( o.id ).bind( "pagehide", function ( e ) {
+				$( o.id ).empty();
+			});
+
+			// Find if scrollview is used
+			if ( $( ".ui-scrollview-clip" ).size() > 0 ) {
+				o.scrollview = true;
+			} else {
+				o.scrollview = false;
+			}
+
+			// Calculate page buffer size
+			if ( $el.data( "row" ) ) {
+				o.row = $el.data( "row" );
+
+				if ( o.row < t._minimum_row ) {
+					o.row = t._minimum_row;
+				}
+
+				o.page_buf = parseInt( ( o.row / 2 ), 10 );
+			}
+
+			// Get arguments
+			if ( args ) {
+				if ( args.itemData && typeof args.itemData == 'function'  ) {
+					t._itemData = args.itemData;
+				} else {
+					return;
+				}
+				if ( args.numItemData ) {
+					if ( typeof args.numItemData == 'function' ) {
+						t._numItemData = args.numItemData( );
+					} else if ( typeof args.numItemData == 'number' ) {
+						t._numItemData = args.numItemData;
+					} else {
+						return;
+					}
+				} else {
+					return;
+				}
+			} else {	// No option is given
+				// Legacy support: dbtable
+				console.warn( "WARNING: The data interface of virtuallist is changed. \nOld data interface(data-dbtable) is still supported, but will be removed in next version. \nPlease fix your code soon!" );
+
+				/* After DB Load complete, Init Vritual list */
+				if ( $( o.id ).hasClass( "vlLoadSuccess" ) ) {
+					dbtable_name = $el.jqmData('dbtable');
+					dbtable = window[ dbtable_name ];
+
+					$( o.id ).empty();
+
+					if ( !dbtable ) {
+						dbtable = { };
+					}
+
+					t._itemData = function ( idx ) {
+						return dbtable[ idx ];
+					};
+					t._numItemData = dbtable.length;
+				} else {
+					return;	// Do nothing
+				}
+			}
+
+			// Get template data
+			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
+			// NOTE: Unnecessary?
+			if ( $el.data( "dbkey" ) ) {
+				o.dbkey = $el.data( "dbkey" );
+			}
+
+			t._first_index = 0;			// initial top idx of <li> element.
+			t._last_index = o.row - 1;		// initial bottom idx of <li> element.
+			t._initList();	// NOTE: Called at here only!
+		},
+
+		destroy : function () {
+			var o = this.options;
+
+			$( document ).unbind( "scrollstop" );
+
+			$( window ).off( "throttledresize", this._resize );
+
+			$( o.id ).empty();
+
+			if ( this.timerMoveID ) {
+				clearTimeout( this.timerMoveID );
+				this.timerMoveID = null;
+			}
+		},
+
+		_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" );
+			}
+			this.element.trigger( "updatelayout" );
+		},
+
+		// this		virtuallistview object
+		refresh: function ( create ) {
+			this.parentPage = this.element.closest( ".ui-page" );
+			// Make sub page, and move the virtuallist into it...
+			// NOTE: check this subroutine.
+			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;
+
+			// TODO: ?
+			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 , "-");
+		},
+
+		// ?
+		// this		virtuallistview object
+		_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 ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.widgetex.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.widgetex.js
new file mode 100644
index 0000000..da61b19
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/jquery.mobile.tizen.widgetex.js
@@ -0,0 +1,376 @@
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+//>>description: Widget class extending functionality of jQueryMobile widget class
+//>>label: Widget extension
+//>>group: Tizen:Widgets
+
+define( [ 
+	'jquery',
+	'../jquery.mobile.tizen.core'
+	], function ( jQuery ) {
+
+//>>excludeEnd("jqmBuildExclude");
+
+/*
+ *
+ * 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,
+			source,
+			noSource = false,
+			htmlProto,
+			protoPath;
+
+		if ( ar.length == 2 ) {
+			namespace = ar[0];
+			widgetName = ar[1];
+
+			// If htmlProto is defined
+			if ( $[namespace][widgetName].prototype._htmlProto !== undefined ) {
+				// If no source is defined, use the widget name
+				source = $[namespace][widgetName].prototype._htmlProto.source;
+				if ( source === undefined ) {
+					source = widgetName;
+					noSource = true;
+				}
+
+				// Load the HTML prototype via AJAX if not defined inline
+				if ( typeof source === "string" ) {
+					if ( noSource ) {	// use external htmlproto file
+						// Establish the path for the proto file
+						widget = source;
+						protoPath = getProtoPath();
+
+						// Make the AJAX call
+						$.ajax( {
+							url: protoPath + "/" + widget + ".prototype.html",
+							async: false,
+							dataType: "html"
+						}).success( function (data, textStatus, jqXHR ) {
+							source = $( "<div></div>" ).html(data).jqmData( "tizen.widgetex.ajax.fail", false );
+						} );
+
+						// Assign the HTML proto to the widget prototype
+						source  = $( "<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 );
+
+					} else {
+						// inline definition (string)
+						source = $( source ).jqmData( "tizen.widgetex.ajax.fail", false );
+					}
+
+				} else {
+					// inline definition (object)
+					// AJAX loading has trivially succeeded, since there was no AJAX loading at all
+					source.jqmData( "tizen.widgetex.ajax.fail", false );
+				}
+				htmlProto = source;
+				$[namespace][widgetName].prototype._htmlProto.source = 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 ) );
+
+//>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude);
+} );
+//>>excludeEnd("jqmBuildExclude");
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/less/ctxpopup.less b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/less/ctxpopup.less
new file mode 100644
index 0000000..def9e09
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/less/ctxpopup.less
@@ -0,0 +1,21 @@
+.ui-ctxpopup {
+    display: table;
+
+    .ui-ctxpopup-row {
+        display: table-row;
+
+        .ui-ctxpopup-cell {
+            display: table-cell;
+        }
+    }
+}
+/* 
+ * The settings in this file are part of the theme. They are not part of the structure of ctxpopup.
+ * In the default theme, ui-body-* has a border width of 1px. So, to make the triangles cross this border, we set them in
+ * by 1px.
+ */
+.ui-ctxpopup-row {
+	.ui-triangle-top { top: 1px; }
+	.ui-triangle-left { left: 1px; }
+	.ui-triangle-right { right: 1px; }
+	.ui-triangle-bottom { bottom: 1px; }
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/less/popupwindow.less b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/less/popupwindow.less
new file mode 100644
index 0000000..ebbd635
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/less/popupwindow.less
@@ -0,0 +1,17 @@
+.ui-popupwindow-padding {
+    padding: 6px;
+}
+
+.ui-popupwindow {
+    display: inline-block;
+    position: absolute;
+    padding: 0;
+    z-index: 100 !important;
+}
+
+.ui-popupwindow-screen {
+    background: #000000;
+    opacity: 0;
+    box-sizing: border-box;
+    -moz-box-sizing: border-box;
+}
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/less/triangle.less b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/less/triangle.less
new file mode 100644
index 0000000..baa4e5d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/less/triangle.less
@@ -0,0 +1,64 @@
+@triangle-size: 10px;
+
+.ui-triangle-container {
+    position: relative;
+
+    .ui-triangle {
+        position: absolute;
+        border-style: solid;
+        border-color: transparent;
+        border-width: @triangle-size;
+    }
+
+    .ui-triangle-top {
+        top: 0px;
+        border-top-width: 0px;
+        border-left-color: transparent;
+        border-right-color: transparent;
+        margin-left: -@triangle-size;
+    }
+
+    .ui-triangle-bottom {
+        bottom: 0px;
+        border-bottom-width: 0px;
+        border-left-color: transparent;
+        border-right-color: transparent;
+        margin-left: -@triangle-size;
+    }
+
+    .ui-triangle-left {
+        left: 0px;
+        margin-top: -@triangle-size;
+        border-left-width: 0px;
+        border-left-color: transparent;
+        border-right-color: transparent;
+    }
+
+    .ui-triangle-right {
+        right: 0px;
+        margin-top: -@triangle-size;
+        border-right-width: 0px;
+        border-left-color: transparent;
+        border-right-color: transparent;
+    }
+}
+
+.ui-triangle-container-top {
+    height: @triangle-size;
+    top: 0px;
+    margin-top: -@triangle-size;
+}
+
+.ui-triangle-container-bottom {
+    height: @triangle-size;
+    bottom: 0px;
+    margin-bottom: -@triangle-size;
+}
+
+.ui-triangle-container-left {
+    width: @triangle-size;
+}
+
+.ui-triangle-container-right {
+    width: @triangle-size;
+}
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/proto-html/ctxpopup.prototype.html b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/proto-html/ctxpopup.prototype.html
new file mode 100644
index 0000000..a494376
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/proto-html/ctxpopup.prototype.html
@@ -0,0 +1,9 @@
+<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>
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/proto-html/popupwindow.prototype.html b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/proto-html/popupwindow.prototype.html
new file mode 100644
index 0000000..580dbaa
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/modules/widgets/proto-html/popupwindow.prototype.html
@@ -0,0 +1,4 @@
+<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>
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/tizen-web-ui-fw-libs.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/tizen-web-ui-fw-libs.js
new file mode 100644
index 0000000..af31d2c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/tizen-web-ui-fw-libs.js
@@ -0,0 +1,15367 @@
+/*
+ * 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. 
+ *
+ */
+/*!
+ * 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 );
+
+/*
+* jQuery Mobile Framework Git Build: SHA1: 4e0055a4eaa6c052f6ff1f6869a6473cd14c00fc <> Date: Mon Jul 15 15:58:34 2013 +0900
+* http://jquerymobile.com
+*
+* Copyright 2012 jQuery Foundation and other contributors
+* Released under the MIT license.
+* http://jquery.org/license
+*
+*/
+
+
+(function ( root, doc, factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		// AMD. Register as an anonymous module.
+		define( [ "jquery" ], function ( $ ) {
+			factory( $, root, doc );
+			return $.mobile;
+		});
+	} else {
+		// Browser globals
+		factory( root.jQuery, root, doc );
+	}
+}( this, document, function ( jQuery, window, document, undefined ) {
+(function( $, window, undefined ) {
+
+	var nsNormalizeDict = {};
+
+	// jQuery.mobile configurable options
+	$.mobile = $.extend( {}, {
+
+		// Version of the jQuery Mobile Framework
+		version: "1.2.0",
+
+		// 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",
+
+		// Class used for "focus" form element state, from CSS framework
+		focusClass: "ui-focus",
+
+		// 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: "fade",
+
+		// Set maximum window width for transitions to apply - 'false' for no limit
+		maxTransitionWidth: false,
+
+		// Minimum scroll distance that will be remembered when returning to a page
+		minScrollBack: 250,
+
+		// DEPRECATED: the following property is no longer in use, but defined until 2.0 to prevent conflicts
+		touchOverflowEnabled: false,
+
+		// Set default dialog transition - 'none' for no transitions
+		defaultDialogTransition: "pop",
+
+		// Error response message - appears when an Ajax page request fails
+		pageLoadErrorMessage: "Error Loading Page",
+
+		// For error messages, which theme does the box uses?
+		pageLoadErrorMessageTheme: "e",
+
+		// replace calls to window.history.back with phonegaps navigation helper
+		// where it is provided on the window object
+		phonegapNavigationEnabled: false,
+
+		//automatically initialize the DOM when it's ready
+		autoInitializePage: true,
+
+		pushStateEnabled: true,
+
+		// allows users to opt in to ignoring content by marking a parent element as
+		// data-ignored
+		ignoreContentEnabled: false,
+
+		// turn of binding to the native orientationchange due to android orientation behavior
+		orientationChangeEnabled: true,
+
+		buttonMarkup: {
+			hoverDelay: 200
+		},
+
+		// define the window and the document objects
+		$window: $( window ),
+		$document: $( document ),
+
+		getAttrFixed : function( e, key ) {
+			var value = e.getAttribute( key );
+
+			return value === "true" ? true :
+				value === "false" ? false :
+				value === null ? undefined : value;
+		},
+
+		// 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 );
+				$.mobile.$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 ) );
+		},
+
+		// 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.
+		getInheritedTheme: function( el, defaultTheme ) {
+			var e = el[ 0 ],
+				ltr = "",
+				re = /ui-(bar|body|overlay)-([a-z])\b/,
+				c, m;
+
+			while ( e ) {
+				c = e.className || "";
+				if ( c && ( 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";
+		},
+
+		// TODO the following $ and $.fn extensions can/probably should be moved into jquery.mobile.core.helpers
+		//
+		// Find the closest javascript page element to gather settings data jsperf test
+		// http://jsperf.com/single-complex-selector-vs-many-complex-selectors/edit
+		// possibly naive, but it shows that the parsing overhead for *just* the page selector vs
+		// the page and dialog selector is negligable. This could probably be speed up by
+		// doing a similar parent node traversal to the one found in the inherited theme code above
+		closestPageData: function( $target ) {
+			return $target
+				.closest( ':jqmData(role="page"), :jqmData(role="dialog")' )
+				.data( "page" );
+		},
+
+		enhanceable: function( $set ) {
+			return this.haveParents( $set, "enhance" );
+		},
+
+		hijackable: function( $set ) {
+			return this.haveParents( $set, "ajax" );
+		},
+
+		haveParents: function( $set, attr ) {
+			if ( !$.mobile.ignoreContentEnabled ) {
+				return $set;
+			}
+
+			var count = $set.length,
+				$newSet = $(),
+				e, $element, excluded;
+
+			for ( var i = 0; i < count; i++ ) {
+				$element = $set.eq( i );
+				excluded = false;
+				e = $set[ i ];
+
+				while ( e ) {
+					var c = e.getAttribute ? e.getAttribute( "data-" + $.mobile.ns + attr ) : "";
+
+					if ( c === "false" ) {
+						excluded = true;
+						break;
+					}
+
+					e = e.parentNode;
+				}
+
+				if ( !excluded ) {
+					$newSet = $newSet.add( $element );
+				}
+			}
+
+			return $newSet;
+		},
+
+		getScreenHeight: function() {
+			// Native innerHeight returns more accurate value for this across platforms,
+			// jQuery version is here as a normalized fallback for platforms like Symbian
+			return window.innerHeight || $.mobile.$window.height();
+		}
+	}, $.mobile );
+
+	// 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" ) {
+			if ( prop ) {
+				prop = $.mobile.nsNormalize( prop );
+			}
+
+			// undefined is permitted as an explicit input for the second param
+			// in this case it returns the value and does not set it to undefined
+			if( arguments.length < 2 || value === undefined ){
+				result = this.data( prop );
+			} else {
+				result = this.data( 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();
+	};
+
+	// fluent helper function for the mobile namespaced equivalent
+	$.fn.jqmEnhanceable = function() {
+		return $.mobile.enhanceable( this );
+	};
+
+	$.fn.jqmHijackable = function() {
+		return $.mobile.hijackable( this );
+	};
+
+	// 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;
+	};
+
+	$.extend({
+		creatorDict: {},
+
+		delegateSelfInitWithSingleSelector: function( target, useKeepNative ) {
+			if ( typeof target !== 'function' ) {
+				return false;
+			}
+			var selector = target.prototype.options.initSelector;
+			var selectorRE = /:jqmData\(role='[A-z\-]+'\)$/;
+			if ( selectorRE.test(selector) ) {
+				var firstIdx = selector.indexOf( "'" ) + 1;
+				var lastIdx = selector.lastIndexOf( "'" );
+				var key = selector.substring( firstIdx, lastIdx );
+				if ( !$.creatorDict.hasOwnProperty( key ) ) {
+					$.creatorDict[key] = {};
+					$.creatorDict[key].target = target;
+					if ( useKeepNative === true ) {
+						$.creatorDict[key].useKeepNative = useKeepNative;
+					}
+					return true;
+				}
+			}
+			return false;
+		}
+	});
+
+	//auto self-init widgets
+	$( document ).bind( "pagecreate create", function( e ) {
+		var selector = "*[data-" + $.mobile.ns + "role]";
+		$( selector, e.target ).each( function () {
+			var dataRoleValue = this.getAttribute( "data-role" ),
+				matchedObj = $.creatorDict[dataRoleValue];
+			if ( matchedObj ) {
+				matchedObj.target.prototype.enhance( this, matchedObj.useKeepNative );
+			}
+		});
+	});
+})( jQuery, this );
+
+
+/*!
+ * jQuery UI Widget v1.9.0-beta.1
+ *
+ * Copyright 2012, https://github.com/jquery/jquery-ui/blob/1.9.0-beta.1/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 ) {
+
+var uuid = 0,
+	slice = Array.prototype.slice,
+	_cleanData = $.cleanData;
+$.cleanData = function( elems ) {
+	for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+		try {
+			$( elem ).triggerHandler( "remove" );
+		// http://bugs.jquery.com/ticket/8235
+		} catch( e ) {}
+	}
+	_cleanData( elems );
+};
+
+$.widget = function( name, base, prototype ) {
+	var fullName, existingConstructor, constructor, basePrototype,
+		namespace = name.split( "." )[ 0 ];
+
+	name = name.split( "." )[ 1 ];
+	fullName = namespace + "-" + name;
+
+	if ( !prototype ) {
+		prototype = base;
+		base = $.Widget;
+	}
+
+	// create selector for plugin
+	$.expr[ ":" ][ fullName ] = function( elem ) {
+		return !!$.data( elem, fullName );
+	};
+
+	$[ namespace ] = $[ namespace ] || {};
+	existingConstructor = $[ namespace ][ name ];
+	constructor = $[ namespace ][ name ] = function( options, element ) {
+		// allow instantiation without "new" keyword
+		if ( !this._createWidget ) {
+			return new constructor( options, element );
+		}
+
+		// allow instantiation without initializing for simple inheritance
+		// must use "new" keyword (the code above always passes args)
+		if ( arguments.length ) {
+			this._createWidget( options, element );
+		}
+	};
+	// extend with the existing constructor to carry over any static properties
+	$.extend( constructor, existingConstructor, {
+		version: prototype.version,
+		// copy the object used to create the prototype in case we need to
+		// redefine the widget later
+		_proto: $.extend( {}, prototype ),
+		// track widgets that inherit from this widget in case this widget is
+		// redefined after a widget inherits from it
+		_childConstructors: []
+	});
+
+	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
+	basePrototype.options = $.widget.extend( {}, basePrototype.options );
+	$.each( prototype, function( prop, value ) {
+		if ( $.isFunction( value ) ) {
+			prototype[ prop ] = (function() {
+				var _super = function() {
+						return base.prototype[ prop ].apply( this, arguments );
+					},
+					_superApply = function( args ) {
+						return base.prototype[ prop ].apply( this, args );
+					};
+				return function() {
+					var __super = this._super,
+						__superApply = this._superApply,
+						returnValue;
+
+					this._super = _super;
+					this._superApply = _superApply;
+
+					returnValue = value.apply( this, arguments );
+
+					this._super = __super;
+					this._superApply = __superApply;
+
+					return returnValue;
+				};
+			})();
+		}
+	});
+	constructor.prototype = $.widget.extend( basePrototype, {
+		// TODO: remove support for widgetEventPrefix
+		// always use the name + a colon as the prefix, e.g., draggable:start
+		// don't prefix for widgets that aren't DOM-based
+		widgetEventPrefix: name
+	}, prototype, {
+		constructor: constructor,
+		namespace: namespace,
+		widgetName: name,
+		// TODO remove widgetBaseClass, see #8155
+		widgetBaseClass: fullName,
+		widgetFullName: fullName
+	});
+
+	// If this widget is being redefined then we need to find all widgets that
+	// are inheriting from it and redefine all of them so that they inherit from
+	// the new version of this widget. We're essentially trying to replace one
+	// level in the prototype chain.
+	if ( existingConstructor ) {
+		$.each( existingConstructor._childConstructors, function( i, child ) {
+			var childPrototype = child.prototype;
+
+			// redefine the child widget using the same prototype that was
+			// originally used, but inherit from the new version of the base
+			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
+		});
+		// remove the list of existing child constructors from the old constructor
+		// so the old child constructors can be garbage collected
+		delete existingConstructor._childConstructors;
+	} else {
+		base._childConstructors.push( constructor );
+	}
+
+	$.widget.bridge( name, constructor );
+};
+
+$.widget.extend = function( target ) {
+	var input = slice.call( arguments, 1 ),
+		inputIndex = 0,
+		inputLength = input.length,
+		key,
+		value;
+	for ( ; inputIndex < inputLength; inputIndex++ ) {
+		for ( key in input[ inputIndex ] ) {
+			value = input[ inputIndex ][ key ];
+			if (input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
+				target[ key ] = $.isPlainObject( value ) ? $.widget.extend( {}, target[ key ], value ) : value;
+			}
+		}
+	}
+	return target;
+};
+
+$.widget.bridge = function( name, object ) {
+	var fullName = object.prototype.widgetFullName;
+	$.fn[ name ] = function( options ) {
+		var isMethodCall = typeof options === "string",
+			args = slice.call( arguments, 1 ),
+			returnValue = this;
+
+		// allow multiple hashes to be passed on init
+		options = !isMethodCall && args.length ?
+			$.widget.extend.apply( null, [ options ].concat(args) ) :
+			options;
+
+		if ( isMethodCall ) {
+			this.each(function() {
+				var methodValue,
+					instance = $.data( this, fullName );
+				if ( !instance ) {
+					return $.error( "cannot call methods on " + name + " prior to initialization; " +
+						"attempted to call method '" + options + "'" );
+				}
+				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
+					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
+				}
+				methodValue = instance[ options ].apply( instance, args );
+				if ( methodValue !== instance && methodValue !== undefined ) {
+					returnValue = methodValue && methodValue.jquery ?
+						returnValue.pushStack( methodValue.get() ) :
+						methodValue;
+					return false;
+				}
+			});
+		} else {
+			this.each(function() {
+				var instance = $.data( this, fullName );
+				if ( instance ) {
+					instance.option( options || {} )._init();
+				} else {
+					new object( options, this );
+				}
+			});
+		}
+
+		return returnValue;
+	};
+};
+
+$.Widget = function( options, element ) {};
+$.Widget._childConstructors = [];
+
+$.Widget.prototype = {
+	widgetName: "widget",
+	widgetEventPrefix: "",
+	defaultElement: "<div>",
+	options: {
+		disabled: false,
+
+		// callbacks
+		create: null
+	},
+	_createWidget: function( options, element ) {
+		element = $( element || this.defaultElement || this )[ 0 ];
+		this.element = $( element );
+		this.uuid = uuid++;
+		this.eventNamespace = "." + this.widgetName + this.uuid;
+		this.options = $.widget.extend( {},
+			this.options,
+			this._getCreateOptions(),
+			options );
+
+		this.bindings = $();
+		this.hoverable = $();
+		this.focusable = $();
+
+		if ( element !== this ) {
+			// 1.9 BC for #7810
+			// TODO remove dual storage
+			$.data( element, this.widgetName, this );
+			$.data( element, this.widgetFullName, this );
+			this._on({ remove: "destroy" });
+			this.document = $( element.style ?
+				// element within the document
+				element.ownerDocument :
+				// element is window or document
+				element.document || element );
+			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
+		}
+
+		this._create();
+		this._trigger( "create", null, this._getCreateEventData() );
+		this._init();
+	},
+	_getCreateOptions: $.noop,
+	_getCreateEventData: $.noop,
+	_create: $.noop,
+	_init: $.noop,
+
+	destroy: function() {
+		this._destroy();
+		// we can probably remove the unbind calls in 2.0
+		// all event bindings should go through this._on()
+		this.element
+			.unbind( this.eventNamespace )
+			// 1.9 BC for #7810
+			// TODO remove dual storage
+			.removeData( this.widgetName )
+			.removeData( this.widgetFullName )
+			// support: jquery <1.6.3
+			// http://bugs.jquery.com/ticket/9413
+			.removeData( $.camelCase( this.widgetFullName ) );
+		this.widget()
+			.unbind( this.eventNamespace )
+			.removeAttr( "aria-disabled" )
+			.removeClass(
+				this.widgetFullName + "-disabled " +
+				"ui-state-disabled" );
+
+		// clean up events and states
+		this.bindings.unbind( this.eventNamespace );
+		this.hoverable.removeClass( "ui-state-hover" );
+		this.focusable.removeClass( "ui-state-focus" );
+	},
+	_destroy: $.noop,
+
+	widget: function() {
+		return this.element;
+	},
+
+	option: function( key, value ) {
+		var options = key,
+			parts,
+			curOption,
+			i;
+
+		if ( arguments.length === 0 ) {
+			// don't return a reference to the internal hash
+			return $.widget.extend( {}, this.options );
+		}
+
+		if ( typeof key === "string" ) {
+			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
+			options = {};
+			parts = key.split( "." );
+			key = parts.shift();
+			if ( parts.length ) {
+				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
+				for ( i = 0; i < parts.length - 1; i++ ) {
+					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
+					curOption = curOption[ parts[ i ] ];
+				}
+				key = parts.pop();
+				if ( value === undefined ) {
+					return curOption[ key ] === undefined ? null : curOption[ key ];
+				}
+				curOption[ key ] = value;
+			} else {
+				if ( value === undefined ) {
+					return this.options[ key ] === undefined ? null : this.options[ key ];
+				}
+				options[ key ] = value;
+			}
+		}
+
+		this._setOptions( options );
+
+		return this;
+	},
+	_setOptions: function( options ) {
+		var key;
+
+		for ( key in options ) {
+			this._setOption( key, options[ key ] );
+		}
+
+		return this;
+	},
+	_setOption: function( key, value ) {
+		this.options[ key ] = value;
+
+		if ( key === "disabled" ) {
+			this.widget()
+				.toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
+				.attr( "aria-disabled", value );
+			this.hoverable.removeClass( "ui-state-hover" );
+			this.focusable.removeClass( "ui-state-focus" );
+		}
+
+		return this;
+	},
+
+	enable: function() {
+		return this._setOption( "disabled", false );
+	},
+	disable: function() {
+		return this._setOption( "disabled", true );
+	},
+
+	_on: function( element, handlers ) {
+		// no element argument, shuffle and use this.element
+		if ( !handlers ) {
+			handlers = element;
+			element = this.element;
+		} else {
+			// accept selectors, DOM elements
+			element = $( element );
+			this.bindings = this.bindings.add( element );
+		}
+
+		var instance = this;
+		$.each( handlers, function( event, handler ) {
+			function handlerProxy() {
+				// allow widgets to customize the disabled handling
+				// - disabled as an array instead of boolean
+				// - disabled class as method for disabling individual parts
+				if ( instance.options.disabled === true ||
+						$( this ).hasClass( "ui-state-disabled" ) ) {
+					return;
+				}
+				return ( typeof handler === "string" ? instance[ handler ] : handler )
+					.apply( instance, arguments );
+			}
+
+			// copy the guid so direct unbinding works
+			if ( typeof handler !== "string" ) {
+				handlerProxy.guid = handler.guid =
+					handler.guid || handlerProxy.guid || $.guid++;
+			}
+
+			var match = event.match( /^(\w+)\s*(.*)$/ ),
+				eventName = match[1] + instance.eventNamespace,
+				selector = match[2];
+			if ( selector ) {
+				instance.widget().delegate( selector, eventName, handlerProxy );
+			} else {
+				element.bind( eventName, handlerProxy );
+			}
+		});
+	},
+
+	_off: function( element, eventName ) {
+		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
+		element.unbind( eventName ).undelegate( eventName );
+	},
+
+	_delay: function( handler, delay ) {
+		function handlerProxy() {
+			return ( typeof handler === "string" ? instance[ handler ] : handler )
+				.apply( instance, arguments );
+		}
+		var instance = this;
+		return setTimeout( handlerProxy, delay || 0 );
+	},
+
+	_hoverable: function( element ) {
+		this.hoverable = this.hoverable.add( element );
+		this._on( element, {
+			mouseenter: function( event ) {
+				$( event.currentTarget ).addClass( "ui-state-hover" );
+			},
+			mouseleave: function( event ) {
+				$( event.currentTarget ).removeClass( "ui-state-hover" );
+			}
+		});
+	},
+
+	_focusable: function( element ) {
+		this.focusable = this.focusable.add( element );
+		this._on( element, {
+			focusin: function( event ) {
+				$( event.currentTarget ).addClass( "ui-state-focus" );
+			},
+			focusout: function( event ) {
+				$( event.currentTarget ).removeClass( "ui-state-focus" );
+			}
+		});
+	},
+
+	_trigger: function( type, event, data ) {
+		var prop, orig,
+			callback = this.options[ type ];
+
+		data = data || {};
+		event = $.Event( event );
+		event.type = ( type === this.widgetEventPrefix ?
+			type :
+			this.widgetEventPrefix + type ).toLowerCase();
+		// the original event may come from any element
+		// so we need to reset the target on the new event
+		event.target = this.element[ 0 ];
+
+		// copy original event properties over to the new event
+		orig = event.originalEvent;
+		if ( orig ) {
+			for ( prop in orig ) {
+				if ( !( prop in event ) ) {
+					event[ prop ] = orig[ prop ];
+				}
+			}
+		}
+
+		this.element.trigger( event, data );
+		return !( $.isFunction( callback ) &&
+			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
+			event.isDefaultPrevented() );
+	}
+};
+
+$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
+	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
+		if ( typeof options === "string" ) {
+			options = { effect: options };
+		}
+		var hasOptions,
+			effectName = !options ?
+				method :
+				options === true || typeof options === "number" ?
+					defaultEffect :
+					options.effect || defaultEffect;
+		options = options || {};
+		if ( typeof options === "number" ) {
+			options = { duration: options };
+		}
+		hasOptions = !$.isEmptyObject( options );
+		options.complete = callback;
+		if ( options.delay ) {
+			element.delay( options.delay );
+		}
+		if ( hasOptions && $.effects && ( $.effects.effect[ effectName ] || $.uiBackCompat !== false && $.effects[ effectName ] ) ) {
+			element[ method ]( options );
+		} else if ( effectName !== method && element[ effectName ] ) {
+			element[ effectName ]( options.duration, options.easing, callback );
+		} else {
+			element.queue(function( next ) {
+				$( this )[ method ]();
+				if ( callback ) {
+					callback.call( element[ 0 ] );
+				}
+				next();
+			});
+		}
+	};
+});
+
+// DEPRECATED
+if ( $.uiBackCompat !== false ) {
+	$.Widget.prototype._getCreateOptions = function() {
+		return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
+	};
+}
+
+})( jQuery );
+(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, useKeepNative ) {
+		this.enhance( $( this.options.initSelector, $( target )), useKeepNative );
+	},
+
+	enhance: function( targets, useKeepNative ) {
+		var page, keepNative, $widgetElements = $( targets ), self = this;
+
+		// if ignoreContentEnabled is set to true the framework should
+		// only enhance the selected elements when they do NOT have a
+		// parent with the data-namespace-ignore attribute
+		$widgetElements = $.mobile.enhanceable( $widgetElements );
+
+		if ( useKeepNative && $widgetElements.length ) {
+			// 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
+			page = $.mobile.closestPageData( $widgetElements );
+			keepNative = ( page && page.keepNativeSelector()) || "";
+
+			$widgetElements = $widgetElements.not( keepNative );
+		}
+
+		$widgetElements[ this.widgetName ]();
+	},
+
+	raise: function( msg ) {
+		throw "Widget [" + this.widgetName + "]: " + msg;
+	}
+});
+
+})( jQuery );
+
+
+(function( $, window ) {
+	// DEPRECATED
+	// NOTE global mobile object settings
+	$.extend( $.mobile, {
+		// DEPRECATED Should the text be visble in the loading message?
+		loadingMessageTextVisible: undefined,
+
+		// DEPRECATED When the text is visible, what theme does the loading box use?
+		loadingMessageTheme: undefined,
+
+		// DEPRECATED default message setting
+		loadingMessage: undefined,
+
+		// DEPRECATED
+		// Turn on/off page loading message. Theme doubles as an object argument
+		// with the following shape: { theme: '', text: '', html: '', textVisible: '' }
+		// NOTE that the $.mobile.loading* settings and params past the first are deprecated
+		showPageLoadingMsg: function( theme, msgText, textonly ) {
+			$.mobile.loading( 'show', theme, msgText, textonly );
+		},
+
+		// DEPRECATED
+		hidePageLoadingMsg: function() {
+			$.mobile.loading( 'hide' );
+		},
+
+		loading: function() {
+			this.loaderWidget.loader.apply( this.loaderWidget, arguments );
+		}
+	});
+
+	// TODO move loader class down into the widget settings
+	var loaderClass = "ui-loader", $html = $( "html" ), $window = $.mobile.$window;
+
+	$.widget( "mobile.loader", {
+		// NOTE if the global config settings are defined they will override these
+		//      options
+		options: {
+			// the theme for the loading message
+			theme: "a",
+
+			// whether the text in the loading message is shown
+			textVisible: false,
+
+			// custom html for the inner content of the loading message
+			html: "",
+
+			// the text to be displayed when the popup is shown
+			text: "loading"
+		},
+
+		defaultHtml: "<div class='" + loaderClass + "'>" +
+			"<span class='ui-icon ui-icon-loading'></span>" +
+			"<h1></h1>" +
+			"</div>",
+
+		// For non-fixed supportin browsers. Position at y center (if scrollTop supported), above the activeBtn (if defined), or just 100px from top
+		fakeFixLoader: function() {
+			var activeBtn = $( "." + $.mobile.activeBtnClass ).first();
+
+			this.element
+				.css({
+					top: $.support.scrollTop && $window.scrollTop() + $window.height() / 2 ||
+						activeBtn.length && activeBtn.offset().top || 100
+				});
+		},
+
+		// check position of loader to see if it appears to be "fixed" to center
+		// if not, use abs positioning
+		checkLoaderPosition: function() {
+			var offset = this.element.offset(),
+				scrollTop = $window.scrollTop(),
+				screenHeight = $.mobile.getScreenHeight();
+
+			if ( offset.top < scrollTop || ( offset.top - scrollTop ) > screenHeight ) {
+				this.element.addClass( "ui-loader-fakefix" );
+				this.fakeFixLoader();
+				$window
+					.unbind( "scroll", this.checkLoaderPosition )
+					.bind( "scroll", this.fakeFixLoader );
+			}
+		},
+
+		resetHtml: function() {
+			this.element.html( $( this.defaultHtml ).html() );
+		},
+
+		// Turn on/off page loading message. Theme doubles as an object argument
+		// with the following shape: { theme: '', text: '', html: '', textVisible: '' }
+		// NOTE that the $.mobile.loading* settings and params past the first are deprecated
+		// TODO sweet jesus we need to break some of this out
+		show: function( theme, msgText, textonly ) {
+			var textVisible, message, $header, loadSettings;
+
+			this.resetHtml();
+
+			// use the prototype options so that people can set them globally at
+			// mobile init. Consistency, it's what's for dinner
+			if ( $.type(theme) === "object" ) {
+				loadSettings = $.extend( {}, this.options, theme );
+
+				// prefer object property from the param then the old theme setting
+				theme = loadSettings.theme || $.mobile.loadingMessageTheme;
+			} else {
+				loadSettings = this.options;
+
+				// here we prefer the them value passed as a string argument, then
+				// we prefer the global option because we can't use undefined default
+				// prototype options, then the prototype option
+				theme = theme || $.mobile.loadingMessageTheme || loadSettings.theme;
+			}
+
+			// set the message text, prefer the param, then the settings object
+			// then loading message
+			message = msgText || $.mobile.loadingMessage || loadSettings.text;
+
+			// prepare the dom
+			$html.addClass( "ui-loading" );
+
+			if ( $.mobile.loadingMessage !== false || loadSettings.html ) {
+				// boolean values require a bit more work :P, supports object properties
+				// and old settings
+				if ( $.mobile.loadingMessageTextVisible !== undefined ) {
+					textVisible = $.mobile.loadingMessageTextVisible;
+				} else {
+					textVisible = loadSettings.textVisible;
+				}
+
+				// add the proper css given the options (theme, text, etc)
+				// Force text visibility if the second argument was supplied, or
+				// if the text was explicitly set in the object args
+				this.element.attr("class", loaderClass +
+					" ui-corner-all ui-body-" + theme +
+					" ui-loader-" + ( textVisible || msgText || theme.text ? "verbose" : "default" ) +
+					( loadSettings.textonly || textonly ? " ui-loader-textonly" : "" ) );
+
+				// TODO verify that jquery.fn.html is ok to use in both cases here
+				//      this might be overly defensive in preventing unknowing xss
+				// if the html attribute is defined on the loading settings, use that
+				// otherwise use the fallbacks from above
+				if ( loadSettings.html ) {
+					this.element.html( loadSettings.html );
+				} else {
+					this.element.find( "h1" ).text( message );
+				}
+
+				// attach the loader to the DOM
+				this.element.appendTo( $.mobile.pageContainer );
+
+				// check that the loader is visible
+				this.checkLoaderPosition();
+
+				// on scroll check the loader position
+				$window.bind( "scroll", $.proxy( this.checkLoaderPosition, this ) );
+			}
+		},
+
+		hide: function() {
+			$html.removeClass( "ui-loading" );
+
+			if ( $.mobile.loadingMessage ) {
+				this.element.removeClass( "ui-loader-fakefix" );
+			}
+
+			$.mobile.$window.unbind( "scroll", $.proxy( this.fakeFixLoader, this) );
+			$.mobile.$window.unbind( "scroll", $.proxy( this.checkLoaderPosition, this ) );
+		}
+	});
+
+	$window.bind( 'pagecontainercreate', function() {
+		$.mobile.loaderWidget = $.mobile.loaderWidget || $( $.mobile.loader.prototype.defaultHtml ).loader();
+	});
+})(jQuery, this);
+
+
+
+// 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( " " ),
+	mouseHookProps = $.event.mouseHooks ? $.event.mouseHooks.props : [],
+	mouseEventProps = $.event.props.concat( mouseHookProps ),
+	activeDocHandlers = {},
+	resetTimerID = 0,
+	startX = 0,
+	startY = 0,
+	didScroll = false,
+	clickBlockList = [],
+	blockMouseTriggers = false,
+	blockTouchTriggers = false,
+	eventCaptureSupported = "addEventListener" in document,
+	$document = $.mobile.$document,
+	nextTouchID = 1,
+	lastTouchID = 0, threshold;
+
+$.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, len;
+
+	event = $.Event( event );
+	event.type = eventType;
+
+	oe = event.originalEvent;
+	props = $.event.props;
+
+	// addresses separation of $.event.props in to $.event.mouseHook.props and Issue 3280
+	// https://github.com/jquery/jquery-mobile/issues/3280
+	if ( t.search( /^(mouse|click)/ ) > -1 ) {
+		props = mouseEventProps;
+	}
+
+	// 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 ( ( $.support.touch === true ) && ( touchID === undefined ) ) {
+		return;
+	}
+
+	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,
+		flags = getVirtualBindingFlags( event.target );
+
+		didScroll = didScroll ||
+			( Math.abs( t.pageX - startX ) > moveThreshold ||
+				Math.abs( t.pageY - startY ) > moveThreshold );
+
+
+	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,
+				target: event.target,
+				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 && target === o.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 );
+
+
+	// 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;
+	})( jQuery );
+(function( $, undefined ) {
+
+var $window = $.mobile.$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'></div>" ),
+		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);
+
+(function( $, undefined ) {
+
+// 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;
+		}
+	}
+}
+
+var fakeBody = $( "<body>" ).prependTo( "html" ),
+	fbCSS = fakeBody[ 0 ].style,
+	vendors = [ "Webkit", "Moz", "O" ],
+	webos = "palmGetResource" in window, //only used to rule out scrollTop
+	opera = window.opera,
+	operamini = window.operamini && ({}).toString.call( window.operamini ) === "[object OperaMini]",
+	bb = window.blackberry && !propExists( "-webkit-transform" ); //only used to rule out box shadow, as it's filled opaque on BB 5 and lower
+
+
+function validStyle( prop, value, check_vend ) {
+	var div = document.createElement( 'div' ),
+		uc = function( txt ) {
+			return txt.charAt( 0 ).toUpperCase() + txt.substr( 1 );
+		},
+		vend_pref = function( vend ) {
+			return  "-" + vend.charAt( 0 ).toLowerCase() + vend.substr( 1 ) + "-";
+		},
+		check_style = function( vend ) {
+			var vend_prop = vend_pref( vend ) + prop + ": " + value + ";",
+				uc_vend = uc( vend ),
+				propStyle = uc_vend + uc( prop );
+
+			div.setAttribute( "style", vend_prop );
+
+			if ( !!div.style[ propStyle ] ) {
+				ret = true;
+			}
+		},
+		check_vends = check_vend ? [ check_vend ] : vendors,
+		ret;
+
+	for( var i = 0; i < check_vends.length; i++ ) {
+		check_style( check_vends[i] );
+	}
+	return !!ret;
+}
+
+// Thanks to Modernizr src for this test idea. `perspective` check is limited to Moz to prevent a false positive for 3D transforms on Android.
+function transform3dTest() {
+	var prop = "transform-3d";
+	return validStyle( 'perspective', '10px', 'moz' ) || $.mobile.media( "(-" + vendors.join( "-" + prop + "),(-" ) + "-" + prop + "),(" + prop + ")" );
+}
+
+// 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;
+}
+
+// Thanks Modernizr
+function cssPointerEventsTest() {
+	var element = document.createElement( 'x' ),
+		documentElement = document.documentElement,
+		getComputedStyle = window.getComputedStyle,
+		supports;
+
+	if ( !( 'pointerEvents' in element.style ) ) {
+		return false;
+	}
+
+	element.style.pointerEvents = 'auto';
+	element.style.pointerEvents = 'x';
+	documentElement.appendChild( element );
+	supports = getComputedStyle &&
+	getComputedStyle( element, '' ).pointerEvents === 'auto';
+	documentElement.removeChild( element );
+	return !!supports;
+}
+
+function boundingRect() {
+	var div = document.createElement( "div" );
+	return typeof div.getBoundingClientRect !== "undefined";
+}
+
+// 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
+$.extend( $.mobile, { browser: {} } );
+$.mobile.browser.ie = (function() {
+	var v = 3,
+		div = document.createElement( "div" ),
+		a = div.all || [];
+
+	do {
+		div.innerHTML = "<!--[if gt IE " + ( ++v ) + "]><br><![endif]-->";
+	} while( a[0] );
+
+	return v > 4 ? v : !v;
+})();
+
+
+$.extend( $.support, {
+	cssTransitions: "WebKitTransitionEvent" in window || validStyle( 'transition', 'height 100ms linear' ) && !opera,
+	pushState: "pushState" in history && "replaceState" in history,
+	mediaquery: $.mobile.media( "only all" ),
+	cssPseudoElement: !!propExists( "content" ),
+	touchOverflow: !!propExists( "overflowScrolling" ),
+	cssTransform3d: transform3dTest(),
+	boxShadow: !!propExists( "boxShadow" ) && !bb,
+	scrollTop: ( "pageXOffset" in window || "scrollTop" in document.documentElement || "scrollTop" in fakeBody[ 0 ] ) && !webos && !operamini,
+	dynamicBaseTag: baseTagTest(),
+	cssPointerEvents: cssPointerEventsTest(),
+	boundingRect: boundingRect()
+});
+
+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]/ );
+})();
+
+// Support conditions that must be met in order to proceed
+// default enhanced qualifications are media query support OR IE 7+
+
+$.mobile.gradeA = function() {
+	return ( $.support.mediaquery || $.mobile.browser.ie && $.mobile.browser.ie >= 7 ) && ( $.support.boundingRect || $.fn.jquery.match(/1\.[0-7+]\.[0-9+]?/) !== null );
+};
+
+$.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 );
+
+	(function( $, undefined ) {
+		var support = {
+			touch: "ontouchend" in document
+		};
+
+		$.mobile = $.mobile || {};
+		$.mobile.support = $.mobile.support || {};
+		$.extend( $.support, support );
+		$.extend( $.mobile.support, support );
+	}( jQuery ));
+
+
+(function( $, window, undefined ) {
+	// add new event shortcuts
+	$.each( ( "touchstart touchmove touchend " +
+		"tap taphold " +
+		"swipe swipeleft swiperight " +
+		"scrollstart scrollstop" ).split( " " ), function( i, name ) {
+
+		$.fn[ name ] = function( fn ) {
+			return fn ? this.bind( name, fn ) : this.trigger( name );
+		};
+
+		// jQuery < 1.8
+		if ( $.attrFn ) {
+			$.attrFn[ name ] = true;
+		}
+	});
+
+	var supportTouch = $.mobile.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 = {
+		tapholdThreshold: 750,
+
+		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 );
+					$.mobile.$document.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( "vmouseup", clearTapTimer )
+					.bind( "vclick", clickHandler );
+				$.mobile.$document.bind( "vmousecancel", clearTapHandlers );
+
+				timer = setTimeout( function() {
+					triggerCustomEvent( thisObject, "taphold", $.Event( "taphold", { target: origTarget } ) );
+				}, $.event.special.tap.tapholdThreshold );
+			});
+		}
+	};
+
+	// also handles swipeleft, swiperight
+	$.event.special.swipe = {
+		scrollSupressionThreshold: 30, // 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;
+					});
+			});
+		}
+	};
+	$.each({
+		scrollstop: "scrollstart",
+		taphold: "tap",
+		swipeleft: "swipe",
+		swiperight: "swipe"
+	}, function( event, sourceEvent ) {
+
+		$.event.special[ event ] = {
+			setup: function() {
+				$( this ).bind( sourceEvent, $.noop );
+			}
+		};
+	});
+
+})( jQuery, this );
+
+	(function( $, undefined ) {
+		$.extend( $.support, {
+			orientation: "orientation" in window && "onorientationchange" in window
+		});
+	}( jQuery ));
+
+
+(function( $, window ) {
+	var win = $.mobile.$window,
+		event_name = "orientationchange",
+		special_event,
+		get_orientation,
+		last_orientation,
+		initial_orientation_is_landscape,
+		initial_orientation_is_default,
+		portrait_map = { "0": true, "180": true };
+
+	// It seems that some device/browser vendors use window.orientation values 0 and 180 to
+	// denote the "default" orientation. For iOS devices, and most other smart-phones tested,
+	// the default orientation is always "portrait", but in some Android and RIM based tablets,
+	// the default orientation is "landscape". The following code attempts to use the window
+	// dimensions to figure out what the current orientation is, and then makes adjustments
+	// to the to the portrait_map if necessary, so that we can properly decode the
+	// window.orientation value whenever get_orientation() is called.
+	//
+	// Note that we used to use a media query to figure out what the orientation the browser
+	// thinks it is in:
+	//
+	//     initial_orientation_is_landscape = $.mobile.media("all and (orientation: landscape)");
+	//
+	// but there was an iPhone/iPod Touch bug beginning with iOS 4.2, up through iOS 5.1,
+	// where the browser *ALWAYS* applied the landscape media query. This bug does not
+	// happen on iPad.
+
+	if ( $.support.orientation ) {
+
+		// Check the window width and height to figure out what the current orientation
+		// of the device is at this moment. Note that we've initialized the portrait map
+		// values to 0 and 180, *AND* we purposely check for landscape so that if we guess
+		// wrong, , we default to the assumption that portrait is the default orientation.
+		// We use a threshold check below because on some platforms like iOS, the iPhone
+		// form-factor can report a larger width than height if the user turns on the
+		// developer console. The actual threshold value is somewhat arbitrary, we just
+		// need to make sure it is large enough to exclude the developer console case.
+
+		var ww = window.innerWidth || $.mobile.$window.width(),
+			wh = window.innerHeight || $.mobile.$window.height(),
+			landscape_threshold = 50;
+
+		initial_orientation_is_landscape = ww > wh && ( ww - wh ) > landscape_threshold;
+
+
+		// Now check to see if the current window.orientation is 0 or 180.
+		initial_orientation_is_default = portrait_map[ window.orientation ];
+
+		// If the initial orientation is landscape, but window.orientation reports 0 or 180, *OR*
+		// if the initial orientation is portrait, but window.orientation reports 90 or -90, we
+		// need to flip our portrait_map values because landscape is the default orientation for
+		// this device/browser.
+		if ( ( initial_orientation_is_landscape && initial_orientation_is_default ) || ( !initial_orientation_is_landscape && !initial_orientation_is_default ) ) {
+			portrait_map = { "-90": true, "90": true };
+		}
+	}
+
+	$.event.special.orientationchange = $.extend( {}, $.event.special.orientationchange, {
+		setup: function() {
+			// If the event is supported natively, return false so that jQuery
+			// will bind to the event using DOM methods.
+			if ( $.support.orientation && 
+				$.event.special.orientationchange.disabled === false ) {
+				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 && !$.event.special.orientationchange.disabled ) {
+				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( event_name );
+		}
+	}
+
+	// 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 = portrait_map[ window.orientation ];
+		} else {
+			isPortrait = elem && elem.clientWidth / elem.clientHeight < 1.1;
+		}
+
+		return isPortrait ? "portrait" : "landscape";
+	};
+
+	$.fn[ event_name ] = function( fn ) {
+		return fn ? this.bind( event_name, fn ) : this.trigger( event_name );
+	};
+
+	// jQuery < 1.8
+	if ( $.attrFn ) {
+		$.attrFn[ event_name ] = true;
+	}
+
+}( 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 ) {
+  // 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);
+(function( $, undefined ) {
+
+$.widget( "mobile.page", $.mobile.widget, {
+	options: {
+		theme: "c",
+		domCache: false,
+		keepNativeDefault: ":jqmData(role='none'), :jqmData(role='nojs')"
+	},
+
+	_create: function() {
+		
+		var self = this;
+		
+		// if false is returned by the callbacks do not create the page
+		if ( self._trigger( "beforecreate" ) === false ) {
+			return false;
+		}
+
+		self.element
+			.addClass( "ui-page ui-body-" + self.options.theme )
+			.bind( "pagebeforehide", function() {
+				self.removeContainerBackground();
+			} )
+			.bind( "pagebeforeshow", function() {
+				self.setContainerBackground();
+			} );
+
+	},
+	
+	refresh: function() {
+		$( this.element ).children( ".ui-content" ).trigger("updatelayout", ["external"]);
+	},
+
+	/* GUI Builder only : redesign page when user drag&drop header, footer */
+	setToolbar: function () {
+		$( this.element ).trigger( "pagebeforeshow" );
+	},
+
+	removeContainerBackground: function() {
+		$.mobile.pageContainer.removeClass( "ui-overlay-" + $.mobile.getInheritedTheme( this.element.parent() ) );
+	},
+	
+	// set the page container background to the page theme
+	setContainerBackground: function( theme ) {
+		if ( this.options.theme ) {
+			$.mobile.pageContainer.addClass( "ui-overlay-" + ( theme || this.options.theme ) );
+		}
+	},
+
+	addBackBtn : function ( target ) {
+		var $dest = $( ".ui-page-active .ui-footer" );
+
+		if ( target == "header" ) {
+			$dest = $( ".ui-page-active .ui-header" );
+		}
+		backBtn = $( "<a href='#' class='ui-btn-back' data-" + $.mobile.ns + "rel='back'></a>" )
+			.buttonMarkup( {icon: "header-back-btn", theme : "s"} );
+		if ( !$dest.find( ".ui-btn-back").length ) {
+			backBtn.prependTo( $dest );
+		}
+	},
+
+	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 );
+
+
+(function( $, window, undefined ) {
+
+var createHandler = function( sequential ) {
+
+	// Default to sequential
+	if ( sequential === undefined ) {
+		sequential = true;
+	}
+
+	return function( name, reverse, $to, $from ) {
+
+		var deferred = new $.Deferred(),
+			reverseClass = reverse ? " reverse" : "",
+			active	= $.mobile.urlHistory.getActive(),
+			toScroll = active.lastScroll || $.mobile.defaultHomeScroll,
+			screenHeight = $.mobile.getScreenHeight(),
+			maxTransitionOverride = $.mobile.maxTransitionWidth !== false && $.mobile.$window.width() > $.mobile.maxTransitionWidth,
+			none = !$.support.cssTransitions || maxTransitionOverride || !name || name === "none" || Math.max( $.mobile.$window.scrollTop(), toScroll ) > $.mobile.getMaxScrollForTransition(),
+			toPreClass = " ui-page-pre-in",
+			toggleViewportClass = function() {
+				$.mobile.pageContainer.toggleClass( "ui-mobile-viewport-transitioning viewport-" + name );
+			},
+			scrollPage = function() {
+				// Prevent blinking on page scrolling in Tizen/Android devices.
+				// Don't scoll window, when current scroll top(scrollTop()) is already at toScroll,
+				// or when current scroll top is 0 and toScroll is same to defaultHomeScroll
+				// (which means the top position of page). In these case, page scrolling is not needed.
+				var st = $.mobile.$window.scrollTop();
+				if( st === toScroll || ( $.mobile.defaultHomeScroll === toScroll && st == 0 ) ) {
+					return;
+				}
+
+				// By using scrollTo instead of silentScroll, we can keep things better in order
+				// Just to be precautios, disable scrollstart listening like silentScroll would
+				$.event.special.scrollstart.enabled = false;
+
+				window.scrollTo( 0, toScroll );
+
+				// reenable scrollstart listening like silentScroll would
+				setTimeout( function() {
+					$.event.special.scrollstart.enabled = true;
+				}, 150 );
+			},
+			cleanFrom = function() {
+				$from
+					.removeClass( $.mobile.activePageClass + " out in reverse " + name )
+					.height( "" );
+			},
+			startOut = function() {
+				// if it's not sequential, call the doneOut transition to start the TO page animating in simultaneously
+				if ( !sequential ) {
+					doneOut();
+				}
+				else {
+					$from.animationComplete( doneOut );
+				}
+
+				// Set the from page's height and start it transitioning out
+				// Note: setting an explicit height helps eliminate tiling in the transitions
+				$from
+					.height( screenHeight + $.mobile.$window.scrollTop() )
+					.addClass( name + " out" + reverseClass );
+			},
+
+			doneOut = function() {
+
+				if ( $from && sequential ) {
+					cleanFrom();
+				}
+
+				startIn();
+			},
+
+			startIn = function() {
+
+				// Prevent flickering in phonegap container: see comments at #4024 regarding iOS
+				$to.css( "z-index", -10 );
+
+				$to.addClass( $.mobile.activePageClass + toPreClass );
+
+				// Send focus to page as it is now display: block
+				$.mobile.focusPage( $to );
+
+				// Set to page height
+				$to.height( screenHeight + toScroll );
+
+				scrollPage();
+
+				// Restores visibility of the new page: added together with $to.css( "z-index", -10 );
+				$to.css( "z-index", "" );
+
+				if ( !none ) {
+					$to.animationComplete( doneIn );
+				}
+
+				$to
+					.removeClass( toPreClass )
+					.addClass( name + " in" + reverseClass );
+
+				if ( none ) {
+					setTimeout( doneIn, 0 );
+				}
+
+			},
+
+			doneIn = function() {
+
+				if ( !sequential ) {
+
+					if ( $from ) {
+						cleanFrom();
+					}
+				}
+
+				$to
+					.removeClass( "out in reverse " + name )
+					.height( "" );
+
+				toggleViewportClass();
+
+				// In some browsers (iOS5), 3D transitions block the ability to scroll to the desired location during transition
+				// This ensures we jump to that spot after the fact, if we aren't there already.
+				if ( $.mobile.$window.scrollTop() !== toScroll ) {
+					scrollPage();
+				}
+
+				deferred.resolve( name, reverse, $to, $from, true );
+			};
+
+		toggleViewportClass();
+
+		if ( $from && !none ) {
+			startOut();
+		}
+		else {
+			doneOut();
+		}
+
+		return deferred.promise();
+	};
+};
+
+// generate the handlers from the above
+var sequentialHandler = createHandler(),
+	simultaneousHandler = createHandler( false ),
+	defaultGetMaxScrollForTransition = function() {
+		return $.mobile.getScreenHeight() * 3;
+	};
+
+// Make our transition handler the public default.
+$.mobile.defaultTransitionHandler = sequentialHandler;
+
+//transition handler dictionary for 3rd party transitions
+$.mobile.transitionHandlers = {
+	"default": $.mobile.defaultTransitionHandler,
+	"sequential": sequentialHandler,
+	"simultaneous": simultaneousHandler
+};
+
+$.mobile.transitionFallbacks = {};
+
+// If transition is defined, check if css 3D transforms are supported, and if not, if a fallback is specified
+$.mobile._maybeDegradeTransition = function( transition ) {
+		if ( transition && !$.support.cssTransform3d && $.mobile.transitionFallbacks[ transition ] ) {
+			transition = $.mobile.transitionFallbacks[ transition ];
+		}
+
+		return transition;
+};
+
+// Set the getMaxScrollForTransition to default if no implementation was set by user
+$.mobile.getMaxScrollForTransition = $.mobile.getMaxScrollForTransition || defaultGetMaxScrollForTransition;
+})( jQuery, this );
+
+(function( $, undefined ) {
+
+	//define vars for interal use
+	var $window = $.mobile.$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]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,
+
+			// Abstraction to address xss (Issue #4787) by removing the authority in
+			// browsers that auto	decode it. All references to location.href should be
+			// replaced with a call to this method so that it can be dealt with properly here
+			getLocation: function( url ) {
+				var uri = url ? this.parseUrl( url ) : location,
+					hash = this.parseUrl( url || location.href ).hash;
+
+				// mimic the browser with an empty string when the hash is empty
+				hash = hash === "#" ? "" : hash;
+
+				// Make sure to parse the url or the location object for the hash because using location.hash
+				// is autodecoded in firefox, the rest of the url should be from the object (location unless
+				// we're testing) to avoid the inclusion of the authority
+				return uri.protocol + "//" + uri.host + uri.pathname + uri.search + hash;
+			},
+
+			parseLocation: function() {
+				return this.parseUrl( this.getLocation() );
+			},
+
+			//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;
+				}
+
+				if ( absUrl === undefined ) {
+					absUrl = documentBase;
+				}
+
+				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, "" ).split( dialogHashKey )[0];
+				}
+
+				return window.decodeURIComponent(absUrl);
+			},
+
+			//get path from current hash, or from a file path
+			get: function( newPath ) {
+				if ( newPath === undefined ) {
+					newPath = path.parseLocation().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, "" ) );
+			},
+
+			isHashValid: function( hash ) {
+				return ( /^#[^#]+$/ ).test( hash );
+			},
+
+			//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 );
+			},
+
+
+			// 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.
+			isPermittedCrossDomainRequest: function( docUrl, reqUrl ) {
+				return $.mobile.allowCrossDomainPages &&
+					docUrl.protocol === "file:" &&
+					reqUrl.search( /^https?:/ ) !== -1;
+			}
+		},
+
+		//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 is 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 ( decodeURIComponent( opts.currentUrl ) === decodeURIComponent( 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.parseLocation(),
+
+		//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 ),
+
+		getScreenHeight = $.mobile.getScreenHeight;
+
+		//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 */
+
+	// NOTE Issue #4950 Android phonegap doesn't navigate back properly
+	//      when a full page refresh has taken place. It appears that hashchange
+	//      and replacestate history alterations work fine but we need to support
+	//      both forms of history traversal in our code that uses backward history
+	//      movement
+	$.mobile.back = function() {
+		var nav = window.navigator;
+
+		// if the setting is on and the navigator object is
+		// available use the phonegap navigation capability
+		if( this.phonegapNavigationEnabled &&
+			nav &&
+			nav.app &&
+			nav.app.backHistory ){
+			nav.app.backHistory();
+		} else {
+			window.history.back();
+		}
+	};
+
+	//direct focus to the page title, or otherwise first focusable element
+	$.mobile.focusPage = function ( page ) {
+		var autofocus = page.find( "[autofocus]" ),
+			pageTitle = page.find( ".ui-title:eq(0)" );
+
+		if ( autofocus.length ) {
+			autofocus.focus();
+			return;
+		}
+
+		if ( pageTitle.length ) {
+			pageTitle.focus();
+		} else{
+			page.focus();
+		}
+	};
+
+	//remove active classes after page transition or error
+	function removeActiveLinkClass( forceRemoval ) {
+		if ( !!$activeClickedLink && ( !$activeClickedLink.closest( "." + $.mobile.activePageClass ).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,
+		setLastScroll, delayedSetLastScroll;
+
+	setLastScroll = function() {
+		// 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 = $window.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 );
+	};
+
+	// 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() {
+
+			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
+			$window.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
+			$window.bind( "scrollstop", delayedSetLastScroll );
+		});
+	});
+
+	// bind to scrollstop for the first page as "pagechange" won't be fired in that case
+	$window.bind( "scrollstop", delayedSetLastScroll );
+
+	// No-op implementation of transition degradation
+	$.mobile._maybeDegradeTransition = $.mobile._maybeDegradeTransition || function( transition ) {
+		return transition;
+	};
+
+	//function for transitioning between two existing pages
+	function transitionPages( toPage, fromPage, transition, reverse ) {
+
+		if ( fromPage ) {
+			//trigger before show/hide events
+			fromPage.data( "page" )._trigger( "beforehide", null, { nextPage: toPage } );
+		}
+
+		toPage.data( "page" )._trigger( "beforeshow", null, { prevPage: fromPage || $( "" ) } );
+
+		//clear page loader
+		$.mobile.hidePageLoadingMsg();
+
+		transition = $.mobile._maybeDegradeTransition( transition );
+
+		//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 || "default" ] || $.mobile.defaultTransitionHandler,
+			promise = th( transition, reverse, toPage, fromPage );
+
+		promise.done(function() {
+
+			//trigger show/hide events
+			if ( fromPage ) {
+				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 || $( "" ) } );
+
+			setTimeout( function () {
+				$.mobile.removeEventBlocker();
+			}, 0 );
+		});
+
+		return promise;
+	}
+
+	//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 animationend', 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;
+
+
+
+	//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.
+		// NOTE do _not_ use the :jqmData psuedo selector because parenthesis
+		//      are a valid url char and it breaks on the first occurence
+		page = settings.pageContainer.children( "[data-" + $.mobile.ns +"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 )
+				.jqmData( "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();
+			}
+		}
+
+		// 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 );
+				//if we are reloading the page make sure we update the base if its not a prefetch
+				if( base && ( !options || !options.prefetch ) ){
+					base.set(url);
+				}
+				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();
+				};
+		}
+
+		// Reset base to the default document base.
+		// only reset if we are not prefetching
+		if ( base && ( typeof options === "undefined" || typeof options.prefetch === "undefined" ) ) {
+			base.reset();
+		}
+
+		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( $( "<div>" + RegExp.$1 + "</div>" ).text() );
+					}
+
+					//dont update the base tag if we are prefetching
+					if ( base && ( typeof options === "undefined" || typeof options.prefetch === "undefined" ) ) {
+						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( "[data-" + $.mobile.ns +"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
+						$.mobile.showPageLoadingMsg( $.mobile.pageLoadErrorMessageTheme, $.mobile.pageLoadErrorMessage, true );
+
+						// hide after delay
+						setTimeout( $.mobile.hidePageLoadingMsg, 1500 );
+					}
+
+					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" || $.mobile.getAttrFixed( toPage [0], "data-" + $.mobile.ns + "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 );
+
+			// Even if there is no page change to be done, we should keep the urlHistory in sync with the hash changes
+			if ( settings.fromHashChange ) {
+				urlHistory.directHashChange({
+					currentUrl:	url,
+					isBack:		function() {},
+					isForward:	function() {}
+				});
+			}
+
+			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 delegate() 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 ) {}
+
+		// Record whether we are at a place in history where a dialog used to be - if so, do not add a new history entry and do not change the hash either
+		var alreadyThere = false;
+
+		// 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
+
+			// If we are at a place in history that once belonged to a dialog, reuse
+			// this state without adding to urlHistory and without modifying the hash.
+			// However, if a dialog is already displayed at this point, and we're
+			// about to display another dialog, then we must add another hash and
+			// history entry on top so that one may navigate back to the original dialog
+			if ( active.url.indexOf( dialogHashKey ) > -1 && !$.mobile.activePage.is( ".ui-dialog" ) ) {
+				settings.changeHash = false;
+				alreadyThere = true;
+			}
+
+			// Normally, we tack on a dialog hash key, but if this is the location of a stale dialog,
+			// we reuse the URL from the entry
+			url = ( active.url || "" ) + ( alreadyThere ? "" : dialogHashKey );
+
+			// tack on another dialogHashKey if this is the same as the initial hash
+			// this makes sure that a history entry is created for this dialog
+			if ( urlHistory.activeIndex === 0 && url === urlHistory.initialDst ) {
+				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 ) {
+			// Overwrite the current entry if it's a leftover from a dialog
+			if ( alreadyThere ) {
+				urlHistory.activeIndex = Math.max( 0, urlHistory.activeIndex - 1 );
+			}
+			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( name, reverse, $to, $from, alreadyFocused ) {
+				removeActiveLinkClass();
+
+				//if there's a duplicateCachedPage, remove it from the DOM now that it's hidden
+				if ( settings.duplicateCachedPage ) {
+					settings.duplicateCachedPage.remove();
+				}
+
+				// Send focus to the newly shown page. Moved from promise .done binding in transitionPages
+				// itself to avoid ie bug that reports offsetWidth as > 0 (core check for visibility)
+				// despite visibility: hidden addresses issue #2965
+				// https://github.com/jquery/jquery-mobile/issues/2965
+				if ( !alreadyFocused ) {
+					$.mobile.focusPage( toPage );
+				}
+
+				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 deferred is resolved in the init file
+	$.mobile.navreadyDeferred = $.Deferred();
+	$.mobile.navreadyDeferred.done(function() {
+		//bind to form submit events, handle with Ajax
+		$.mobile.$document.delegate( "form", "submit", function( event ) {
+			var $this = $( this );
+
+			if ( !$.mobile.ajaxEnabled ||
+					// test that the form is, itself, ajax false
+					$this.is( ":jqmData(ajax='false')" ) ||
+					// test that $.mobile.ignoreContentEnabled is set and
+					// the form or one of it's parents is ajax=false
+					!$this.jqmHijackable().length ) {
+				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 ) );
+
+			if ( ( path.isExternal( url ) && !path.isPermittedCrossDomainRequest( documentUrl, url ) ) || target ) {
+				return;
+			}
+
+			$.mobile.changePage(
+				url,
+				{
+					type:		type && type.length && type.toLowerCase() || "get",
+					data:		$this.serialize(),
+					transition:	$.mobile.getAttrFixed( $this [0], "data-" + $.mobile.ns + "transition" ),
+					reverse:	$.mobile.getAttrFixed( $this [0], "data-" + $.mobile.ns + "direction" ) === "reverse",
+					reloadPage:	true
+				}
+			);
+			event.preventDefault();
+		});
+
+		//add active state on vclick
+		$.mobile.$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 the which attr
+			if ( event.which > 1 || !$.mobile.linkBindingEnabled ) {
+				return;
+			}
+
+			var link = findClosestLink( event.target );
+
+			// split from the previous return logic to avoid find closest where possible
+			// TODO teach $.mobile.hijackable to operate on raw dom elements so the link wrapping
+			// can be avoided
+			if ( !$( link ).jqmHijackable().length ) {
+				return;
+			}
+
+			if ( link ) {
+				if ( path.parseUrl( link.getAttribute( "href" ) || "#" ).hash !== "#" ) {
+					removeActiveLinkClass( true );
+					$activeClickedLink = $( link ).closest( ".ui-btn" ).not( ".ui-disabled" );
+					$activeClickedLink.addClass( $.mobile.activeBtnClass );
+				}
+			}
+		});
+
+		// click routing - direct to HTTP or Ajax, accordingly
+		$.mobile.$document.bind( "click", function( event ) {
+			if ( !$.mobile.linkBindingEnabled ) {
+				return;
+			}
+
+			var link = findClosestLink( event.target ), $link = $( link ), httpCleanup;
+
+			// If there is no link associated with the click or its not a left
+			// click we want to ignore the click
+			// TODO teach $.mobile.hijackable to operate on raw dom elements so the link wrapping
+			// can be avoided
+			if ( !link || event.which > 1 || !$link.jqmHijackable().length ) {
+				return;
+			}
+
+			//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')" ) ) {
+				$.mobile.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.
+
+				//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 ) && !path.isPermittedCrossDomainRequest( documentUrl, href ) );
+
+			if ( isExternal ) {
+				httpCleanup();
+				//use default click handling
+				return;
+			}
+
+			//use ajax
+			var transition = $.mobile.getAttrFixed( $link [0], "data-" + $.mobile.ns + "transition" ),
+				reverse =  $.mobile.getAttrFixed( $link [0], "data-" + $.mobile.ns + "direction" ) === "reverse" ||
+							// deprecated - remove by 1.0
+							 $.mobile.getAttrFixed( $link [0], "data-" + $.mobile.ns + "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, link: $link } );
+			event.preventDefault();
+		});
+
+		//prefetch pages when anchors with data-prefetch are encountered
+		$.mobile.$document.delegate( ".ui-page", "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" ),prefetch: true } );
+				}
+			});
+		});
+
+		$.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,
+
+				// "navigate" event fired to allow others to take advantage of the more robust hashchange handling
+				navEvent = new $.Event( "navigate" ),
+
+				// 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 ( 0 === urlHistory.stack.length ) {
+				urlHistory.initialDst = to;
+			}
+
+			// We should probably fire the "navigate" event from those places that make calls to _handleHashChange,
+			// and have _handleHashChange hook into the "navigate" event instead of triggering it here
+			$.mobile.pageContainer.trigger( navEvent );
+			if ( navEvent.isDefaultPrevented() ) {
+				return;
+			}
+
+			//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 && urlHistory.initialDst !== to ) {
+
+				// 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() { $.mobile.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;
+
+				// If we're about to go to an initial URL that contains a reference to a non-existent
+				// internal page, go to the first page instead. We know that the initial hash refers to a
+				// non-existent page, because the initial hash did not end up in the initial urlHistory entry
+				if ( to === path.makeUrlAbsolute( '#' + urlHistory.initialDst, documentBase ) &&
+					urlHistory.stack.length && urlHistory.stack[0].url !== urlHistory.initialDst.replace( dialogHashKey, "" ) ) {
+					to = $.mobile.firstPage;
+				}
+				$.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 ) {
+			// Firefox auto-escapes the location.hash as for v13 but
+			// leaves the href untouched
+			$.mobile._handleHashChange( path.parseLocation().hash );
+		});
+
+	});//navreadyDeferred done callback
+
+})( jQuery );
+
+(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 = $.mobile.$window,
+		url = $.mobile.path.parseLocation(),
+		mobileinitDeferred = $.Deferred(),
+		domreadyDeferred = $.Deferred();
+
+	$.mobile.$document.ready( $.proxy( domreadyDeferred, "resolve" ) );
+
+	$.mobile.$document.one( "mobileinit", $.proxy( mobileinitDeferred, "resolve" ) );
+
+	$.extend( pushStateHandler, {
+		// TODO move to a path helper, this is rather common functionality
+		initialFilePath: (function() {
+			return url.pathname + url.search;
+		})(),
+
+		hashChangeTimeout: 200,
+
+		hashChangeEnableTimer: undefined,
+
+		initialHref: url.hrefNoHash,
+
+		state: function() {
+			return {
+				// firefox auto decodes the url when using location.hash but not href
+				hash: $.mobile.path.parseLocation().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,
+				// firefox auto decodes the url when using location.hash but not href
+				hash = $.mobile.path.parseLocation().hash,
+				isPath = $.mobile.path.isPath( hash ),
+				resolutionUrl = isPath ? $.mobile.path.getLocation() : $.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 $.mobile.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,
+				fromHash, toHash, hashChanged;
+
+			// if there's no state its not a popstate we care about, eg chrome's initial popstate
+			if ( poppedState ) {
+				// if we get two pop states in under this.hashChangeTimeout
+				// make sure to clear any timer set for the previous change
+				clearTimeout( self.hashChangeEnableTimer );
+
+				// make sure to enable hash handling for the the _handleHashChange call
+				self.nextHashChangePrevented( false );
+
+				// change the page based on the hash in the popped state
+				$.mobile._handleHashChange( poppedState.hash );
+
+				// prevent any hashchange in the next self.hashChangeTimeout
+				self.nextHashChangePrevented( true );
+
+				// re-enable hash change handling after swallowing a possible hash
+				// change event that comes on all popstates courtesy of browsers like Android
+				self.hashChangeEnableTimer = setTimeout( function() {
+					self.nextHashChangePrevented( false );
+				}, self.hashChangeTimeout );
+			}
+		},
+
+		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, $.mobile.path.getLocation() );
+			}
+		}
+	});
+
+	// We need to init when "mobileinit", "domready", and "navready" have all happened
+	$.when( domreadyDeferred, mobileinitDeferred, $.mobile.navreadyDeferred ).done(function() {
+		if ( $.mobile.pushStateEnabled && $.support.pushState ) {
+			pushStateHandler.init();
+		}
+	});
+})( jQuery, this );
+
+/*
+* fallback transition for flip in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.flip = "fade";
+
+})( jQuery, this );
+/*
+* fallback transition for flow in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.flow = "fade";
+
+})( jQuery, this );
+/*
+* fallback transition for pop in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.pop = "fade";
+
+})( jQuery, this );
+/*
+* fallback transition for slide in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+// Use the simultaneous transitions handler for slide transitions
+$.mobile.transitionHandlers.slide = $.mobile.transitionHandlers.simultaneous;
+
+// Set the slide transitions's fallback to "fade"
+$.mobile.transitionFallbacks.slide = "fade";
+
+})( jQuery, this );
+/*
+* fallback transition for slidedown in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.slidedown = "fade";
+
+})( jQuery, this );
+/*
+* fallback transition for slidefade in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+// Set the slide transitions's fallback to "fade"
+$.mobile.transitionFallbacks.slidefade = "fade";
+
+})( jQuery, this );
+/*
+* fallback transition for slideup in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.slideup = "fade";
+
+})( jQuery, this );
+/*
+* fallback transition for turn in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.turn = "fade";
+
+})( jQuery, this );
+
+(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
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+
+	var page = $.mobile.closestPageData( $( e.target ) ), 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 );
+
+(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>" ),
+			dialogWrap = $( "<div/>", {
+					"role" : "dialog",
+					"class" : "ui-dialog-contain ui-corner-all ui-overlay-shadow"
+				});
+
+		$el.addClass( "ui-dialog ui-overlay-" + this.options.overlayTheme );
+
+		// Class the markup for dialog styling
+		// Set aria role
+		$el
+			.wrapInner( dialogWrap )
+			.children()
+				.find( ":jqmData(role='header')" )
+					.prepend( headerCloseButton )
+				.end()
+				.children( ':first-child')
+					.addClass( "ui-corner-top" )
+				.end()
+				.children( ":last-child" )
+					.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
+		//
+		// Use click rather than vclick in order to prevent the possibility of unintentionally
+		// reopening the dialog if the dialog opening item was directly under the close button.
+		headerCloseButton.bind( "click", 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 && !$.mobile.getAttrFixed( $target[0], "data-" + $.mobile.ns + "transition" ) ) {
+
+				active = $.mobile.urlHistory.getActive() || {};
+
+				$target.attr( "data-" + $.mobile.ns + "transition", ( active.transition || $.mobile.defaultDialogTransition ) )
+					.attr( "data-" + $.mobile.ns + "direction", "reverse" );
+			}
+		})
+		.bind( "pagehide", function( e, ui ) {
+			$( this ).find( "." + $.mobile.activeBtnClass ).not( ".ui-slider-bg" ).removeClass( $.mobile.activeBtnClass );
+		})
+		// Override the theme set by the page plugin on pageshow
+		.bind( "pagebeforeshow", function() {
+			self._isCloseable = true;
+			if ( self.options.overlayTheme ) {
+				self.element
+					.page( "removeContainerBackground" )
+					.page( "setContainerBackground", self.options.overlayTheme );
+			}
+		});
+	},
+
+	// Close method goes back in history
+	close: function() {
+		var dst;
+
+		if ( this._isCloseable ) {
+			this._isCloseable = false;
+			if ( $.mobile.hashListeningEnabled ) {
+				$.mobile.back();
+			} else {
+				dst = $.mobile.urlHistory.getPrev().url;
+				if ( !$.mobile.path.isPath( dst ) ) {
+					dst = $.mobile.path.makeUrlAbsolute( "#" + dst );
+				}
+
+				$.mobile.changePage( dst, { changeHash: false, fromHashChange: true } );
+			}
+		}
+	}
+});
+
+//auto self-init widgets
+$.mobile.$document.delegate( $.mobile.dialog.prototype.options.initSelector, "pagecreate", function() {
+	$.mobile.dialog.prototype.enhance( this );
+});
+
+})( jQuery, this );
+
+(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;
+
+// NOTE bind used to force this binding to run before the buttonMarkup binding
+//      which expects .ui-footer top be applied in its gigantic selector
+// TODO remove the buttonMarkup giant selector and move it to the various modules
+//      on which it depends
+$.mobile.$document.bind( "pagecreate", function( e ) {
+	var $page = $( e.target ),
+		o = $page.data( "page" ).options,
+		prefix = "data-"+$.mobile.ns,
+		pageRole = $page[0].getAttribute( prefix + "role" ) || undefined,
+		pageTheme = o.theme;
+
+	$( ":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')", $page )
+		.jqmEnhanceable()
+		.each(function() {
+
+		var $this = $( this ),
+			role = $this[0].getAttribute( prefix + "role" ) || undefined,
+			theme = $this[0].getAttribute( prefix + "theme" ) || undefined,
+			contentTheme = theme || o.contentTheme || ( pageRole === "dialog" && pageTheme ),
+			$headeranchors,
+			leftbtn,
+			rightbtn,
+			$dest = $page.find( ".ui-footer" ),
+			backBtn;
+
+		$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" );
+
+			if ( role === "header") {
+				// Right,left buttons
+				$headeranchors	= $this.children( "a, div.naviframe-button, a.naviframe-button, button" );
+				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;
+
+				$( $headeranchors.get().reverse() ).each( function ( i ) {
+					$( this ).addClass( "ui-btn-right-" + i );
+				});
+			}
+
+			// Auto-add back btn on pages beyond first view
+			if ( o.addBackBtn &&
+				( role === "footer" || role === "header" ) &&
+				$page[0].getAttribute( prefix + "url" ) !== $.mobile.path.stripHash( location.hash ) &&
+				!leftbtn ) {
+
+				if ( o.addBackBtn == "header" ) {
+					$dest = $page.find( ".ui-header" );
+				} else {
+					$dest = $page.find( ".ui-footer" );
+				}
+
+				if ( !$dest.find( ".ui-btn-back" ).length ) {
+					backBtn = $( "<a href='javascript:void(0);' class='ui-btn-back' data-" + $.mobile.ns + "rel='back'></a>" )
+						// // If theme is provided, override default inheritance
+						.buttonMarkup( { icon: "header-back-btn", theme: o.backBtnTheme || thisTheme } );
+
+					backBtn.find( ".ui-btn-text" ).text( o.backBtnText );
+					backBtn.appendTo( $dest );
+				}
+			}
+
+			// 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({
+					"role": "heading",
+					"aria-level": "1",
+					"aria-label": "title",
+					"tabindex": "0"
+				});
+
+			$( ".ui-title-text-sub" ).attr( { "tabindex": "0", "aria-label": "subtitle" } );
+
+		} else if ( role === "content" ) {
+			if ( contentTheme ) {
+				$this.addClass( "ui-body-" + ( contentTheme ) );
+			}
+
+			// Add ARIA role
+			$this.attr( "role", "main" );
+		}
+	});
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+// filter function removes whitespace between label and form element so we can use inline-block (nodeType 3 = text)
+$.fn.fieldcontain = function( options ) {
+	return this
+		.addClass( "ui-field-contain ui-body ui-br" )
+		.contents().filter( function() {
+			return ( this.nodeType === 3 && !/\S/.test( this.nodeValue ) );
+		}).remove();
+};
+
+//auto self-init widgets
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$( ":jqmData(role='fieldcontain')", e.target ).jqmEnhanceable().fieldcontain();
+});
+
+})( jQuery );
+
+(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";
+					$this.addClass( "ui-grid-duo" );
+				}
+			}
+			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(" + iterator + "n+3)" ).addClass( "ui-block-c" );
+		}
+		if ( iterator > 3 ) {
+			$kids.filter( ":nth-child(" + iterator + "n+4)" ).addClass( "ui-block-d" );
+		}
+		if ( iterator > 4 ) {
+			$kids.filter( ":nth-child(" + iterator + "n+5)" ).addClass( "ui-block-e" );
+		}
+	});
+};
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$( ":jqmData(role='nojs')", e.target ).addClass( "ui-nojs" );
+	
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.fn.buttonMarkup = function( options ) {
+	var $workingSet = this,
+		prefix = "data-" + $.mobile.ns,
+		mapToDataAttr = function( key, value ) {
+			e.setAttribute( "data-" + $.mobile.ns + key, value );
+			el.jqmData( key, value );
+		};
+
+	// Enforce options to be of type string
+	options = ( options && ( $.type( options ) === "object" ) )? options : {};
+	for ( var i = 0; i < $workingSet.length; i++ ) {
+		var el = $workingSet.eq( i ),
+			e = el[ 0 ],
+			o = $.extend( {}, $.fn.buttonMarkup.defaults, {
+				icon:       options.icon       !== undefined ? options.icon       : $.mobile.getAttrFixed( e, prefix + "icon" ),
+				iconpos:    options.iconpos    !== undefined ? options.iconpos    : $.mobile.getAttrFixed( e, prefix + "iconpos" ),
+				theme:      options.theme      !== undefined ? options.theme      : $.mobile.getAttrFixed( e, prefix + "theme" ) || $.mobile.getInheritedTheme( el, $.fn.buttonMarkup.defaults["theme"] ),
+				inline:     options.inline     !== undefined ? options.inline     : $.mobile.getAttrFixed( e, prefix + "inline" ),
+				shadow:     options.shadow     !== undefined ? options.shadow     : $.mobile.getAttrFixed( e, prefix + "shadow" ),
+				corners:    options.corners    !== undefined ? options.corners    : $.mobile.getAttrFixed( e, prefix + "corners" ),
+				iconshadow: options.iconshadow !== undefined ? options.iconshadow : $.mobile.getAttrFixed( e, prefix + "iconshadow" ),
+				mini:       options.mini       !== undefined ? options.mini       : $.mobile.getAttrFixed( e, prefix + "mini" )
+			}, options ),
+
+			// Classes Defined
+			innerClass = "ui-btn-inner",
+			textClass = "ui-btn-text",
+			buttonClass, iconClass,
+			// Button inner markup
+			buttonInner,
+			buttonText,
+			buttonIcon,
+			buttonElements;
+
+		for ( key in o ) {
+			e.setAttribute ( prefix + key, o[ key ])
+		}
+
+		if ( $.mobile.getAttrFixed( e, prefix + "rel" ) === "popup" && el.attr( "href" ) ) {
+			e.setAttribute( "aria-haspopup", true );
+			e.setAttribute( "aria-owns", e.getAttribute( "href" ) );
+		}
+
+		if ( e.tagName !== "LI" && e.tagName !== "LABEL" ) {
+			e.setAttribute( "role", "button" );
+			e.setAttribute( "tabindex", "0" );
+		}
+
+		// Check if this element is already enhanced
+		buttonElements = $.data( ( ( e.tagName === "INPUT" || e.tagName === "BUTTON" ) ? e.parentNode : e ), "buttonElements" );
+
+		if ( buttonElements ) {
+			e = buttonElements.outer;
+			el = $( e );
+			buttonInner = buttonElements.inner;
+			buttonText = buttonElements.text;
+			// We will recreate this icon below
+			$( buttonElements.icon ).remove();
+			buttonElements.icon = null;
+		}
+		else {
+			buttonInner = document.createElement( o.wrapperEls );
+			buttonText = document.createElement( o.wrapperEls );
+		}
+		buttonIcon = o.icon ? document.createElement( "span" ) : null;
+
+		if ( attachEvents && !buttonElements ) {
+			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;
+		buttonClass += o.shadow ? " ui-shadow" : "";
+		buttonClass += o.corners ? " ui-btn-corner-all" : "";
+
+		// To distinguish real buttons
+		if(  $.mobile.getAttrFixed( e, prefix + "role" ) == "button" || e.tagName == "BUTTON" || e.tagName == "DIV" ){
+			buttonClass += " ui-btn-box-" + o.theme;
+		}
+
+		/* TIZEN style markup */
+		var buttonStyle =  $.mobile.getAttrFixed( e, prefix + "style" );
+
+		if ( buttonStyle == "circle" && !($(el).text().length > 0) ) {
+			/* 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";
+		} else if ( buttonStyle == "round" || ( buttonStyle == "circle" && $(el).text().length > 0 ) ) {
+			buttonClass += " ui-btn-round";
+		}
+		if ( o.icon ) {
+			if ( $(el).text().length > 0 ) {
+
+				switch ( o.iconpos ) {
+				case "right" :
+				case "left" :
+				case "top" :
+				case "bottom" :
+					textClass += " ui-btn-text-padding-" + o.iconpos;
+					break;
+				default:
+					textClass += " ui-btn-text-padding-left";
+					break;
+				}
+
+				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";
+
+				if ( e.tagName !== "LABEL" ) {
+					$( el ).text( o.icon.replace( "naviframe-", "" ) );
+				}
+			}
+		} else {
+			if ( $(el).text().length > 0 ) {
+				innerClass += " ui-btn-hastxt";
+			} else if ( buttonStyle == "circle" ){
+				buttonClass += " ui-btn-round";
+			}
+		}
+		if ( o.mini !== undefined ) {
+			// Used to control styling in headers/footers, where buttons default to `mini` style.
+			buttonClass += o.mini === true ? " ui-mini" : " ui-fullsize";
+		}
+
+		if ( o.inline !== undefined ) {
+			// Used to control styling in headers/footers, where buttons default to `inline` style.
+			buttonClass += o.inline === true ? " ui-btn-inline" : " ui-btn-block";
+		}
+
+		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() );
+			}
+		}
+
+		innerClass += o.corners ? " ui-btn-corner-all" : "";
+
+		if ( o.iconpos && o.iconpos === "notext" && !el.attr( "title" ) ) {
+			el.attr( "title", el.getEncodedText() );
+		}
+
+		if ( buttonElements ) {
+			el.removeClass( buttonElements.bcls || "" );
+		}
+		el.removeClass( "ui-link" ).addClass( buttonClass );
+
+		buttonInner.className = innerClass;
+
+		buttonText.className = textClass;
+		if ( !buttonElements ) {
+			buttonInner.appendChild( buttonText );
+		}
+		if ( buttonIcon ) {
+			buttonIcon.className = iconClass;
+			if ( !( buttonElements && buttonElements.icon ) ) {
+				buttonIcon.innerHTML = "&#160;";
+				buttonInner.appendChild( buttonIcon );
+			}
+		}
+
+		while ( e.firstChild && !buttonElements ) {
+			buttonText.appendChild( e.firstChild );
+		}
+
+		if ( !buttonElements ) {
+			e.appendChild( buttonInner );
+		}
+
+		// Assign a structure containing the elements of this button to the elements of this button. This
+		// will allow us to recognize this as an already-enhanced button in future calls to buttonMarkup().
+		buttonElements = {
+			bcls  : buttonClass,
+			outer : e,
+			inner : buttonInner,
+			text  : buttonText,
+			icon  : buttonIcon
+		};
+
+		$.data( e,           'buttonElements', buttonElements );
+		$.data( buttonInner, 'buttonElements', buttonElements );
+		$.data( buttonText,  'buttonElements', buttonElements );
+		if ( buttonIcon ) {
+			$.data( buttonIcon, 'buttonElements', buttonElements );
+		}
+	}
+
+	return this;
+};
+
+$.fn.buttonMarkup.defaults = {
+	theme: "c",
+	corners: true,
+	shadow: true,
+	iconshadow: true,
+	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 + ' ' );
+        if ( cname && cname.indexOf( "ui-btn " ) > -1 && cname.indexOf( "ui-disabled " ) < 0 ) {
+            break;
+        }
+
+        element = element.parentNode;
+    }
+
+    return element;
+}
+
+var attachEvents = function() {
+	var hoverDelay = $.mobile.buttonMarkup.hoverDelay, hov, foc;
+
+	$.mobile.$document.bind( {
+		"vmousedown vmousecancel vmouseup vmouseover vmouseout focus blur scrollstart touchend touchcancel": function( event ) {
+			var theme,
+				$btn = $( closestEnabledButton( event.target ) ),
+				isTouchEvent = event.originalEvent && /^touch/.test( event.originalEvent.type ),
+				evt = event.type;
+
+			if ( $btn.length ) {
+				theme = $btn.attr( "data-" + $.mobile.ns + "theme" );
+
+				if ( evt === "vmousedown" ) {
+					if ( isTouchEvent ) {
+						// Use a short delay to determine if the user is scrolling before highlighting
+						hov = setTimeout( function() {
+							$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-down-" + theme );
+						}, hoverDelay );
+					} else {
+						$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-down-" + theme );
+					}
+				} else if ( evt === "vmousecancel" || evt === "vmouseup" || evt === "touchend" || evt === "touchcancel" ) {
+					$btn.removeClass( "ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme );
+				} else if ( evt === "vmouseover" || evt === "focus" ) {
+					if ( isTouchEvent ) {
+						// Use a short delay to determine if the user is scrolling before highlighting
+						foc = setTimeout( function() {
+							$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-hover-" + theme );
+						}, hoverDelay );
+					} else {
+						$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-hover-" + theme );
+					}
+				} else if ( evt === "vmouseout" || evt === "blur" || evt === "scrollstart" ) {
+					$btn.removeClass( "ui-btn-hover-" + theme  + " ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme );
+					if ( hov ) {
+						clearTimeout( hov );
+					}
+					if ( foc ) {
+						clearTimeout( foc );
+					}
+				}
+			}
+		},
+		"focusin focus": function( event ) {
+			$( closestEnabledButton( event.target ) ).addClass( $.mobile.focusClass );
+		},
+		"focusout blur": function( event ) {
+			$( closestEnabledButton( event.target ) ).removeClass( $.mobile.focusClass );
+		}
+	});
+
+	attachEvents = null;
+};
+
+//links in bars, or those with  data-role become buttons
+//auto self-init widgets
+$.mobile.$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 )
+		.jqmEnhanceable()
+		.not( "button, input, .ui-btn, :jqmData(role='none'), :jqmData(role='nojs')" )
+		.buttonMarkup();
+});
+
+})( jQuery );
+
+
+(function( $, undefined ) {
+
+$.widget( "mobile.collapsible", $.mobile.widget, {
+	options: {
+		expandCueText: " Expandable list, tap to open list",
+		collapseCueText: " Expandable list, tap to close list",
+		collapsed: true,
+		heading: "h1,h2,h3,h4,h5,h6,legend",
+		theme: null,
+		contentTheme: null,
+		inset: true,
+		mini: false,
+		initSelector: ":jqmData(role='collapsible')"
+	},
+	_create: function() {
+
+		var $el = this.element,
+			o = this.options,
+			collapsible = $el.addClass( "ui-collapsible" ),
+			collapsibleHeading = $el.children( o.heading ).first(),
+			collapsedIcon = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "collapsed-icon" ) || o.collapsedIcon,
+			expandedIcon = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "expanded-icon" ) || o.expandedIcon,
+			collapsibleContent = collapsible.wrapInner( "<div class='ui-collapsible-content'></div>" ).children( ".ui-collapsible-content" ),
+			collapsibleSet = $el.closest( ":jqmData(role='collapsible-set')" ).addClass( "ui-collapsible-set" );
+
+		// 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 = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "theme" ) || $.mobile.getInheritedTheme( collapsibleSet, "c" );
+			}
+			// Inherit the content-theme from collapsible-set
+			if ( !o.contentTheme ) {
+				o.contentTheme = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "content-theme" );
+			}
+
+			// Get the preference for collapsed icon in the set
+			if ( !o.collapsedIcon ) {
+				o.collapsedIcon = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "collapsed-icon" );
+			}
+			// Get the preference for expanded icon in the set
+			if ( !o.expandedIcon ) {
+				o.expandedIcon = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "expanded-icon" );
+			}
+			// Gets the preference icon position in the set
+			if ( !o.iconPos ) {
+				o.iconPos = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "iconpos" );
+			}
+			// Inherit the preference for inset from collapsible-set or set the default value to ensure equalty within a set
+			if ( $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "inset" ) !== undefined ) {
+				o.inset = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "inset" );
+			} else {
+				o.inset = true;
+			}
+			// Gets the preference for mini in the set
+			if ( !o.mini ) {
+				o.mini = $.mobile.getAttrFixed( collapsibleSet[0], "data-" + $.mobile.ns + "mini" );
+			}
+		} else {
+			// get inherited theme if not a set and no theme has been set
+			if ( !o.theme ) {
+				o.theme = $.mobile.getInheritedTheme( $el, "c" );
+			}
+		}
+		
+		if ( !!o.inset ) {
+			collapsible.addClass( "ui-collapsible-inset" );
+		}
+		
+		collapsibleContent.addClass( ( o.contentTheme ) ? ( "ui-body-" + o.contentTheme ) : "");
+
+		collapsedIcon = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "collapsed-icon" ) || o.collapsedIcon || "plus";
+		expandedIcon = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "expanded-icon" ) || o.expandedIcon || "minus";
+
+		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: $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "iconpos" ) || o.iconPos || "left",
+					icon: collapsedIcon,
+					mini: o.mini,
+					theme: o.theme
+				})
+				.attr( "role", "");
+
+		if ( !!o.inset ) {				
+			collapsibleHeading
+				.find( "a" ).first().add( ".ui-btn-inner", $el )
+					.addClass( "ui-corner-top ui-corner-bottom" );
+		}
+
+		//events
+		collapsible
+			.bind( "expand collapse", function( event ) {
+				if ( !event.isDefaultPrevented() ) {
+					var $this = $( this ),
+						isCollapse = ( event.type === "collapse" ),
+						contentTheme = o.contentTheme;
+
+					event.preventDefault();
+
+					// Custom event callback
+					if ( o.customEventHandler ) { o.customEventHandler.call( this, isCollapse ) };
+
+					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-" + expandedIcon, !isCollapse )
+							// logic or cause same icon for expanded/collapsed state would remove the ui-icon-class
+							.toggleClass( "ui-icon-" + collapsedIcon, ( isCollapse || expandedIcon === collapsedIcon ) )
+						.end()
+						.find( "a" ).first().removeClass( $.mobile.activeBtnClass );
+
+					$this.toggleClass( "ui-collapsible-collapsed", isCollapse );
+					collapsibleContent.toggleClass( "ui-collapsible-content-collapsed", isCollapse ).attr( "aria-hidden", isCollapse );
+					collapsibleContent.children( "li" ).not( "ui-collapsible-content" ).attr( "tabindex", isCollapse ? "" : "0" );
+
+					if ( contentTheme && !!o.inset && ( !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( "tap", function() {
+				collapsibleHeading.find( "a" ).first().addClass( $.mobile.activeBtnClass );
+			})
+			.bind( "vmousecancel", function() {
+				collapsibleHeading.find( "a" ).first().removeClass( $.mobile.activeBtnClass );
+			})
+			.bind( "click", function( event ) {
+
+				var type = collapsibleHeading.is( ".ui-collapsible-heading-collapsed" ) ? "expand" : "collapse";
+
+				collapsible.trigger( type );
+
+				event.preventDefault();
+				event.stopPropagation();
+			});
+	}
+});
+
+//delegate auto self-init widgets
+$.delegateSelfInitWithSingleSelector( $.mobile.collapsible );
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.widget( "mobile.collapsibleset", $.mobile.widget, {
+	options: {
+		initSelector: ":jqmData(role='collapsible-set')"
+	},
+	_create: function() {
+		var $el = this.element.addClass( "ui-collapsible-set" ),
+			o = this.options;
+
+		// Inherit the theme from collapsible-set
+		if ( !o.theme ) {
+			o.theme = $.mobile.getInheritedTheme( $el, "c" );
+		}
+		// Inherit the content-theme from collapsible-set
+		if ( !o.contentTheme ) {
+			o.contentTheme = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "content-theme" );
+		}
+
+		if ( $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "inset" ) !== undefined ) {
+			o.inset = $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "inset" );
+		}
+		o.inset = o.inset !== undefined ? o.inset : true;
+
+		// Initialize the collapsible set if it's not already initialized
+		if ( !$el.jqmData( "collapsiblebound" ) ) {
+			$el
+				.jqmData( "collapsiblebound", true )
+				.bind( "expand collapse", function( event ) {
+					var isCollapse = ( event.type === "collapse" ),
+						collapsible = $( event.target ).closest( ".ui-collapsible" ),
+						widget = collapsible.data( "collapsible" );
+					if ( collapsible.jqmData( "collapsible-last" ) && !!o.inset ) {
+						collapsible.find( ".ui-collapsible-heading" ).first()
+							.find( "a" ).first()
+							.toggleClass( "ui-corner-bottom", isCollapse )
+							.find( ".ui-btn-inner" )
+							.toggleClass( "ui-corner-bottom", isCollapse );
+						collapsible.find( ".ui-collapsible-content" ).toggleClass( "ui-corner-bottom", !isCollapse );
+					}
+				})
+				.bind( "expand", function( event ) {
+					var closestCollapsible = $( event.target )
+						.closest( ".ui-collapsible" );
+					if ( closestCollapsible.parent().is( ":jqmData(role='collapsible-set')" ) ) {
+						closestCollapsible
+							.siblings( ".ui-collapsible" )
+							.trigger( "collapse" );
+					}
+				});
+		}
+	},
+
+	_init: function() {
+		var $el = this.element,
+			collapsiblesInSet = $el.children( ":jqmData(role='collapsible')" ),
+			expanded = collapsiblesInSet.filter( ":jqmData(collapsed='false')" );
+		this.refresh();
+
+		// Because the corners are handled by the collapsible itself and the default state is collapsed
+		// That was causing https://github.com/jquery/jquery-mobile/issues/4116
+		expanded.trigger( "expand" );
+	},
+
+	refresh: function() {
+		var $el = this.element,
+			o = this.options,
+			collapsiblesInSet = $el.children( ":jqmData(role='collapsible')" );
+
+		$.mobile.collapsible.prototype.enhance( collapsiblesInSet.not( ".ui-collapsible" ) );
+
+		// clean up borders
+		if ( !!o.inset ) {
+			collapsiblesInSet.each(function() {
+				$( this ).jqmRemoveData( "collapsible-last" )
+					.find( ".ui-collapsible-heading" )
+					.find( "a" ).first()
+					.removeClass( "ui-corner-top ui-corner-bottom" )
+					.find( ".ui-btn-inner" )
+					.removeClass( "ui-corner-top ui-corner-bottom" );
+			});
+
+			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" );
+		}
+	}
+});
+
+//delegate auto self-init widgets
+$.delegateSelfInitWithSingleSelector( $.mobile.collapsibleset );
+
+})( jQuery );
+
+(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 ui-mini" )
+			.attr( "role", "navigation" )
+			.find( "ul" )
+			.jqmEnhanceable()
+			.grid({ grid: this.options.grid });
+
+		$navbtns.buttonMarkup({
+			corners:	false,
+			shadow:		false,
+			inline:     true,
+			iconpos:	iconpos
+		});
+
+		$navbar.delegate( "a", "vclick", function( event ) {
+			if ( !$(event.target).hasClass( "ui-disabled" ) ) {
+				$navbtns.removeClass( $.mobile.activeBtnClass );
+				$( this ).addClass( $.mobile.activeBtnClass );
+			}
+		});
+
+		// Buttons in the navbar with ui-state-persist class should regain their active state before page show
+		$navbar.closest( ".ui-page" ).bind( "pagebeforeshow", function() {
+			$navbtns.filter( ".ui-state-persist" ).addClass( $.mobile.activeBtnClass );
+		});
+	}
+});
+
+//delegate auto self-init widgets
+$.delegateSelfInitWithSingleSelector( $.mobile.navbar );
+
+})( jQuery );
+
+(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,
+			listviewClasses = "";
+
+		listviewClasses += t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : "";
+
+		// create listview markup
+		t.element.addClass(function( i, orig ) {
+			return orig + " ui-listview " + listviewClasses;
+		});
+
+		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;
+
+		$li = this.element.children( "li" );
+		// At create time and when autodividers calls refresh the li are not visible yet so we need to rely on .ui-screen-hidden
+		$visibleli = create || $li.filter( ":visible" ).length === 0 ? $li.not( ".ui-screen-hidden" ) : $li.filter( ":visible" );
+
+		// ui-li-last is used for setting border-bottom on the last li		
+		$li.filter( ".ui-li-last" ).removeClass( "ui-li-last" );
+					
+		if ( this.options.inset ) {
+			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 ui-li-last" );
+
+			$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" );
+		} else {
+			$visibleli.last().addClass( "ui-li-last" );
+		}
+		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" ).attr( {
+					"role" : "",
+					"aria-label" : "icon"
+				});
+				$( this._findFirstElementByTagName( img[ 0 ].parentNode, "parentNode", "li", "LI" ) ).addClass( img.is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" );
+			}
+		}
+	},
+
+	_addCheckboxRadioClasses: function( containers )
+	{
+		var i, inputAttr, len = containers.length;
+		for ( i = 0; i < len; i++ ) {
+			inputAttr = $( containers[ i ] ).find( "input" );
+			if ( inputAttr.attr( "type" ) == "checkbox" ) {
+				$( containers[ i ] ).addClass( "ui-li-has-checkbox" );
+			} else if ( inputAttr.attr( "type" ) == "radio" ) {
+				$( containers[ i ] ).addClass( "ui-li-has-radio" );
+			}
+		}
+	},
+
+	_addRightBtnClasses: function( containers )
+	{
+		var i, btnAttr, len = containers.length;
+		for ( i = 0; i < len; i++ ) {
+			btnAttr = $( containers[ i ] ).find( ":jqmData(role='button'),input[type='button'],select:jqmData(role='slider')" );
+			if ( btnAttr.length ) {
+				if ( btnAttr.jqmData( "style" ) == "circle" )  {
+					$( containers[ i ] ).addClass( "ui-li-has-right-circle-btn" );
+				} else {
+					$( containers[ i ] ).addClass( "ui-li-has-right-btn" );
+				}
+			}
+		}
+	},
+
+	refresh: function( create ) {
+		this.parentPage = this.element.closest( ".ui-page" );
+		this._createSubPages();
+
+		var o = this.options,
+			$list = this.element,
+			self = this,
+			dividertheme = $.mobile.getAttrFixed( $list[0], "data-" + $.mobile.ns + "dividertheme" ) || o.dividerTheme,
+			listsplittheme =  $.mobile.getAttrFixed( $list[0], "data-" + $.mobile.ns + "splittheme" ),
+			listspliticon = $.mobile.getAttrFixed( $list[0], "data-" + $.mobile.ns + "spliticon" ),
+			li = this._getChildrenByTagName( $list[ 0 ], "li", "LI" ),
+			ol = !!$.nodeName( $list[ 0 ], "ol" ),
+			jsCount = !$.support.cssPseudoElement,
+			start = $list.attr( "start" ),
+			itemClassDict = {},
+			item, itemClass, itemTheme,
+			a, last, splittheme, counter, startCount, newStartCount, countParent, icon, imgParents, img, linkIcon;
+
+		if ( ol && jsCount ) {
+			$list.find( ".ui-li-dec" ).remove();
+		}
+
+		if ( ol ) {	
+			// Check if a start attribute has been set while taking a value of 0 into account
+			if ( start || start === 0 ) {
+				if ( !jsCount ) {
+					startCount = parseFloat( start ) - 1;
+					$list.css( "counter-reset", "listnumbering " + startCount );
+				} else {
+					counter = parseFloat( start );
+				}
+			} else if ( jsCount ) {
+					counter = 1;
+			}	
+		}
+
+		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 = $.mobile.getAttrFixed( item[0], "data-" + $.mobile.ns + "theme" ) || o.theme;
+				a = this._getChildrenByTagName( item[ 0 ], "a", "A" ).attr( {
+					"role": "",
+					"tabindex": "0"
+				});
+				var isDivider = ( $.mobile.getAttrFixed( item[0], "data-" + $.mobile.ns + "role" ) === "list-divider" );
+
+				if ( item.hasClass( "ui-li-has-checkbox" ) || item.hasClass( "ui-li-has-radio" ) ) {
+					item.on( "vclick", function ( e ) {
+						var targetItem = $( e.target );
+						var checkboxradio = targetItem.find( ".ui-checkbox" );
+						if ( !checkboxradio.length ) {
+							checkboxradio = targetItem.find( ".ui-radio" );
+						}
+
+						if ( checkboxradio.length ) {
+							checkboxradio.children( "label" ).trigger( "vclick" );
+						}
+					});
+				}
+
+				if ( a.length && !isDivider ) {
+					icon = $.mobile.getAttrFixed( item[0], "data-" + $.mobile.ns + "icon" );
+
+					/* Remove auto populated right-arrow button. */
+					if ( icon === undefined ) {
+						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().removeClass( "ui-link" ).addClass( "ui-link-inherit" );
+
+					if ( a.length > 1 ) {
+						itemClass += " ui-li-has-alt";
+
+						last = a.last();
+						splittheme = listsplittheme || $.mobile.getAttrFixed( last[0], "data-" + $.mobile.ns + "theme" ) || o.splitTheme;
+						linkIcon = $.mobile.getAttrFixed( last[0], "data-" + $.mobile.ns + "icon" );
+
+						last.appendTo( item )
+							.attr( "title", last.getEncodedText() )
+							.addClass( "ui-li-link-alt" )
+							.empty()
+							.buttonMarkup({
+								shadow: false,
+								corners: false,
+								theme: itemTheme,
+								icon: false,
+								iconpos: "notext"
+							})
+							.find( ".ui-btn-inner" )
+								.append(
+									$( document.createElement( "span" ) ).buttonMarkup({
+										shadow: true,
+										corners: true,
+										theme: splittheme,
+										iconpos: "notext",
+										// link icon overrides list item icon overrides ul element overrides options
+										icon: linkIcon || icon || listspliticon || o.splitIcon
+									})
+								);
+					}
+				} else if ( isDivider ) {
+
+					itemClass += " ui-li-divider ui-bar-" + dividertheme;
+					item.attr( { "role": "heading", "tabindex": "0" } );
+
+					if ( ol ) {	
+						//reset counter when a divider heading is encountered
+						if ( start || start === 0 ) {
+							if ( !jsCount ) {
+								newStartCount = parseFloat( start ) - 1;
+								item.css( "counter-reset", "listnumbering " + newStartCount );
+							} else {
+								counter = parseFloat( start );
+							}
+						} else if ( jsCount ) {
+								counter = 1;
+						}	
+					}
+				
+				} else {
+					itemClass += " ui-li-static ui-btn-up-" + itemTheme;
+					item.attr( "tabindex", "0" );
+				}
+			}
+
+			if ( ol && jsCount && itemClass.indexOf( "ui-li-divider" ) < 0 ) {
+				countParent = itemClass.indexOf( "ui-li-static" ) > 0 ? 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-" + ( $.mobile.getAttrFixed( $list[0], "data-" + $.mobile.ns + "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._addCheckboxRadioClasses( li );
+		this._addCheckboxRadioClasses( $list.find( ".ui-link-inherit" ) );
+
+		this._addRightBtnClasses( li );
+		this._addRightBtnClasses( $list.find( ".ui-link-inherit" ) );
+
+		this._refreshCorners( create );
+
+    // autodividers binds to this to redraw dividers after the listview refresh
+		this._trigger( "afterrefresh" );
+	},
+
+	//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(),
+				nodeElsFull = $( list.prevAll().toArray().reverse() ),
+				nodeEls = nodeElsFull.length ? nodeElsFull : $( "<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 = $.mobile.getAttrFixed( list[0], "data-" + $.mobile.ns + "theme" ) || o.theme,
+				countTheme = $.mobile.getAttrFixed( list[0], "data-" + $.mobile.ns + "counttheme" ) || $.mobile.getAttrFixed( parentList[0], "data-" + $.mobile.ns + "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,
+					prEvent = new $.Event( "pageremove" );
+
+				if ( ui.nextPage ) {
+					npURL = nextPage.jqmData( "url" );
+					if ( npURL.indexOf( parentUrl + "&" + $.mobile.subPageUrlKey ) !== 0 ) {
+						self.childPages().remove();
+						parentPage.trigger( prEvent );
+						if ( !prEvent.isDefaultPrevented() ) {
+							parentPage.removeWithDependents();
+						}
+					}
+				}
+			};
+
+			// unbind the original page remove and replace with our specialized version
+			parentPage
+				.unbind( "pagehide.remove" )
+				.bind( "pagehide.remove", newRemove);
+		}
+	},
+
+	addItem : function( listitem , idx ) {
+		var $item = $(listitem),
+			$li,
+			_self = this;
+
+		$li = _self.element.children( 'li' );
+		$item.css( { 'opacity' : 0,
+					 'display' : 'none' } );
+		if( $li.length == 0
+			|| $li.length <= idx)
+		{
+			$( _self.element ).append( $item );
+		} else {
+			$( $li.get( idx ) ).before( $item );
+		}
+		$(_self.element).trigger("create")
+			.listview( 'refresh' );
+
+		$item.css( 'min-height' , '0px' );
+
+		$item.slideDown( 'fast' , function( ){
+			$item.addClass("addli");
+			$item.css( { 'opacity' : 1 } );
+		} );
+	},
+
+	removeItem : function( idx ) {
+		var $item,
+			$li,
+			_self = this;
+
+		$li = _self.element.children( 'li' );
+		if( $li.length <= 0 ||
+			$li.length < idx ) {
+			return ;
+		}
+		$item = $( $li.get( idx ) );
+		$item.addClass("removeli");
+		$item.slideUp('normal',
+			function( ) {
+			$(this).remove();
+		});
+	},
+
+	// 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 + "')" );
+	}
+});
+
+//delegate auto self-init widgets
+$.delegateSelfInitWithSingleSelector( $.mobile.listview );
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.mobile.listview.prototype.options.autodividers = false;
+$.mobile.listview.prototype.options.autodividersSelector = function( elt ) {
+	// look for the text in the given element
+	var text = elt.text() || null;
+
+	if ( !text ) {
+		return null;
+	}
+
+	// create the text for the divider (first uppercased letter)
+	text = text.trim().slice( 0, 1 ).toUpperCase();
+
+	return text;
+};
+
+$.mobile.$document.delegate( "ul,ol", "listviewcreate", function() {
+
+	var list = $( this ),
+			listview = list.data( "listview" );
+
+	if ( !listview || !listview.options.autodividers ) {
+		return;
+	}
+
+	var replaceDividers = function () {
+		list.find( "li:jqmData(role='list-divider')" ).remove();
+
+		var lis = list.find( 'li' ),
+			lastDividerText = null, li, dividerText;
+
+		for ( var i = 0; i < lis.length ; i++ ) {
+			li = lis[i];
+			dividerText = listview.options.autodividersSelector( $( li ) );
+
+			if ( dividerText && lastDividerText !== dividerText ) {
+				var divider = document.createElement( 'li' );
+				divider.appendChild( document.createTextNode( dividerText ) );
+				divider.setAttribute( 'data-' + $.mobile.ns + 'role', 'list-divider' );
+				li.parentNode.insertBefore( divider, li );
+			}
+
+			lastDividerText = dividerText;
+		}
+	};
+
+	var afterListviewRefresh = function () {
+		list.unbind( 'listviewafterrefresh', afterListviewRefresh );
+		replaceDividers();
+		listview.refresh();
+		list.bind( 'listviewafterrefresh', afterListviewRefresh );
+	};
+
+	afterListviewRefresh();
+});
+
+})( 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,
+			inheritAttr = function( input, dataAttr ) {
+				return input.jqmData( dataAttr ) || input.closest( "form, fieldset" ).jqmData( dataAttr );
+			},
+			// NOTE: Windows Phone could not find the label through a selector
+			// filter works though.
+			parentLabel = $( input ).closest( "label" ),
+			label = parentLabel.length ? parentLabel : ( input[0].id ? $( input ).closest( "form, fieldset, :jqmData(role='page'), :jqmData(role='dialog')" ).find( "label" ).filter( "[for='" + input[0].id + "']" ) : [ ] ),
+			inputtype = input[0].type,
+			mini = inheritAttr( input, "mini" ),
+			checkedState = inputtype + "-on",
+			uncheckedState = inputtype + "-off",
+			icon = input.parents( ":jqmData(type='horizontal')" ).length ? undefined : uncheckedState,
+			iconpos = inheritAttr( input, "iconpos" ),
+			activeBtn = icon ? "" : " " + $.mobile.activeBtnClass,
+			checkedClass = "ui-" + checkedState + activeBtn,
+			uncheckedClass = "ui-" + uncheckedState,
+			checkedicon = "ui-icon-" + checkedState,
+			uncheckedicon = "ui-icon-" + uncheckedState,
+			ariaCheckedAttr = "";
+
+		if ( inputtype !== "checkbox" && inputtype !== "radio" ) {
+			return;
+		}
+
+		ariaCheckedAttr = ( inputtype === "checkbox" ) ? "aria-checked" : "aria-selected";
+
+		// Support fake label
+		if ( label.length == 0 ) {
+			label = $( "<label for='" + input[ 0 ].id  +
+				"'></label>" );
+		}
+
+		// Expose for other methods
+		$.extend( this, {
+			label: label,
+			inputtype: inputtype,
+			checkedClass: checkedClass,
+			uncheckedClass: uncheckedClass,
+			checkedicon: checkedicon,
+			uncheckedicon: uncheckedicon,
+			ariaCheckedAttr : ariaCheckedAttr
+		});
+
+		// If there's no selected theme check the data attr
+		if ( !this.options.theme ) {
+			this.options.theme = $.mobile.getInheritedTheme( this.element, "c" );
+		}
+
+		label.buttonMarkup({
+			theme: this.options.theme,
+			icon: icon,
+			shadow: false,
+			mini: mini,
+			iconpos: iconpos
+		});
+
+		// Wrap the input + label in a div
+		var wrapper = document.createElement('div');
+		wrapper.className = 'ui-' + inputtype;
+		wrapper.setAttribute( "role", inputtype );
+
+		if ( input.hasClass( "favorite" ) ) {
+			wrapper.className += ' favorite';
+		}
+
+		input.add( label ).wrapAll( wrapper );
+
+		label.bind({
+			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( $.mobile.focusClass );
+				},
+
+				blur: function() {
+					label.removeClass( $.mobile.focusClass );
+				}
+			});
+
+		this.refresh();
+	},
+
+	_cacheVals: function() {
+		this._getInputSet().each(function() {
+			$( this ).jqmData( "cacheVal", this.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'), :jqmData(role='dialog')" )
+			.find( "input[name='" + this.element[0].name + "'][type='" + this.inputtype + "']" );
+	},
+
+	_updateAll: function() {
+		var self = this;
+
+		this._getInputSet().each(function() {
+			var $this = $( this );
+
+			if ( this.checked || self.inputtype === "checkbox" ) {
+				$this.trigger( "change" );
+			}
+			$this.focus();
+		})
+		.checkboxradio( "refresh" );
+	},
+
+	refresh: function() {
+		var input = this.element[0],
+			label = this.label,
+			wrapper = input.parentNode,
+			icon = label.find( ".ui-icon" );
+
+		if ( input.checked ) {
+			label.addClass( this.checkedClass ).removeClass( this.uncheckedClass );
+			icon.addClass( this.checkedicon ).removeClass( this.uncheckedicon );
+			wrapper.setAttribute( this.ariaCheckedAttr, true );
+		} else {
+			label.removeClass( this.checkedClass ).addClass( this.uncheckedClass );
+			icon.removeClass( this.checkedicon ).addClass( this.uncheckedicon );
+			wrapper.setAttribute( this.ariaCheckedAttr, false );
+		}
+
+		if ( input.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
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$.mobile.checkboxradio.prototype.enhanceWithin( e.target, true );
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.widget( "mobile.button", $.mobile.widget, {
+	options: {
+		theme: null,
+		icon: null,
+		iconpos: null,
+		corners: true,
+		shadow: true,
+		iconshadow: true,
+		initSelector: "button, [type='button'], [type='submit'], [type='reset']"
+	},
+	_create: function() {
+		var $el = this.element,
+			$button,
+			o = this.options,
+			type,
+			name,
+			inline = o.inline ||  $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "inline" ),
+			mini = o.mini || $.mobile.getAttrFixed( $el[0], "data-" + $.mobile.ns + "mini" ),
+			classes = "",
+			$buttonPlaceholder;
+
+		// if this is a link, check if it's been enhanced and, if not, use the right function
+		if ( $el[ 0 ].tagName === "A" ) {
+			if ( !$el.hasClass( "ui-btn" ) ) {
+				$el.buttonMarkup();
+			}
+
+			return;
+		}
+
+		// get the inherited theme
+		// TODO centralize for all widgets
+		if ( !this.options.theme ) {
+			this.options.theme = $.mobile.getInheritedTheme( this.element, "c" );
+		}
+
+		// TODO: Post 1.1--once we have time to test thoroughly--any classes manually applied to the original element should be carried over to the enhanced element, with an `-enhanced` suffix. See https://github.com/jquery/jquery-mobile/issues/3577
+		/* if ( $el[0].className.length ) {
+			classes = $el[0].className;
+		} */
+		if ( !!~$el[0].className.indexOf( "ui-btn-left" ) ) {
+			classes = "ui-btn-left";
+		}
+
+		if (  !!~$el[0].className.indexOf( "ui-btn-right" ) ) {
+			classes = "ui-btn-right";
+		}
+
+		if (  $el.attr( "type" ) === "submit" || $el.attr( "type" ) === "reset" ) {
+			classes ? classes += " ui-submit" :  classes = "ui-submit";
+		}
+		$( "label[for='" + $el.attr( "id" ) + "']" ).addClass( "ui-submit" );
+
+		// Add ARIA role
+		this.button = $( "<div></div>" )
+			[ $el.html() ? "html" : "text" ]( $el.html() || $el.val() )
+			.insertBefore( $el )
+			.buttonMarkup({
+				theme: o.theme,
+				icon: o.icon,
+				iconpos: o.iconpos,
+				inline: inline,
+				corners: o.corners,
+				shadow: o.shadow,
+				iconshadow: o.iconshadow,
+				mini: mini
+			})
+			.addClass( classes )
+			.append( $el.addClass( "ui-btn-hidden" ) );
+
+        $button = this.button;
+		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
+						$.mobile.$document.one( "submit", function() {
+							$buttonPlaceholder.remove();
+
+							// reset the local var so that the hidden input
+							// will be re-added on subsequent clicks
+							$buttonPlaceholder = undefined;
+						});
+					}
+				});
+		}
+
+		$el.bind({
+			focus: function() {
+				$button.addClass( $.mobile.focusClass );
+			},
+
+			blur: function() {
+				$button.removeClass( $.mobile.focusClass );
+			}
+		});
+
+		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();
+		}
+
+		// Grab the button's text element from its implementation-independent data item
+		$( this.button.data( 'buttonElements' ).text )[ $el.html() ? "html" : "text" ]( $el.html() || $el.val() );
+	}
+});
+
+//auto self-init widgets
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$.mobile.button.prototype.enhanceWithin( e.target, true );
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.fn.controlgroup = function( options ) {
+	function flipClasses( els, flCorners  ) {
+		els.removeClass( "ui-btn-corner-all ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-controlgroup-last ui-shadow" )
+			.eq( 0 ).addClass( flCorners[ 0 ] )
+			.end()
+			.last().addClass( flCorners[ 1 ] ).addClass( "ui-controlgroup-last" );
+	}
+
+	return this.each(function() {
+		var $el = $( this ),
+			o = $.extend({
+						direction:  $.mobile.getAttrFixed( $el[0], "data-"+ $.mobile.ns + "type" ) || "vertical",
+						shadow: false,
+						excludeInvisible: true,
+						mini: $.mobile.getAttrFixed( $el[0], "data-"+ $.mobile.ns + "mini" )
+					}, options ),
+			grouplegend = $el.children( "legend" ),
+			groupheading = $el.children( ".ui-controlgroup-label" ),
+			groupcontrols = $el.children( ".ui-controlgroup-controls" ),
+			flCorners = o.direction === "horizontal" ? [ "ui-corner-left", "ui-corner-right" ] : [ "ui-corner-top", "ui-corner-bottom" ],
+			type = $el.find( "input" ).first().attr( "type" );
+
+		// First unwrap the controls if the controlgroup was already enhanced
+		if ( groupcontrols.length ) {
+			groupcontrols.contents().unwrap();
+		}
+		$el.wrapInner( "<div class='ui-controlgroup-controls'></div>" );
+
+		if ( grouplegend.length ) {
+			// Replace legend with more stylable replacement div
+			$( "<div role='heading' class='ui-controlgroup-label'>" + grouplegend.html() + "</div>" ).insertBefore( $el.children( 0 ) );
+			grouplegend.remove();
+		} else if ( groupheading.length ) {
+			// Just move the heading if the controlgroup was already enhanced
+			$el.prepend( groupheading );
+		}
+
+		$el.addClass( "ui-corner-all ui-controlgroup ui-controlgroup-" + o.direction );
+
+		flipClasses( $el.find( ".ui-btn" + ( o.excludeInvisible ? ":visible" : "" ) ).not( '.ui-slider-handle' ), flCorners );
+		flipClasses( $el.find( ".ui-btn-inner" ), flCorners );
+
+		if ( o.shadow ) {
+			$el.addClass( "ui-shadow" );
+		}
+
+		if ( o.mini ) {
+			$el.addClass( "ui-mini" );
+		}
+
+	});
+};
+
+// The pagecreate handler for controlgroup is in jquery.mobile.init because of the soft-dependency on the wrapped widgets
+
+})(jQuery);
+
+(function( $, undefined ) {
+
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+
+	//links within content areas, tests included with page
+	$( e.target )
+		.find( "a" )
+		.jqmEnhanceable()
+		.not( ".ui-btn, .ui-link-inherit, :jqmData(role='none'), :jqmData(role='nojs')" )
+		.addClass( "ui-link" );
+
+});
+
+})( jQuery );
+
+
+(function( $, undefined ) {
+
+	function fitSegmentInsideSegment( winSize, segSize, offset, desired ) {
+		var ret = desired;
+
+		if ( winSize < segSize ) {
+			// Center segment if it's bigger than the window
+			ret = offset + ( winSize - segSize ) / 2;
+		} else {
+			// Otherwise center it at the desired coordinate while keeping it completely inside the window
+			ret = Math.min( Math.max( offset, desired - segSize / 2 ), offset + winSize - segSize );
+		}
+
+		return ret;
+	}
+
+	function windowCoords() {
+		var $win = $.mobile.$window;
+
+		return {
+			x: $win.scrollLeft(),
+			y: $win.scrollTop(),
+			cx: ( window.innerWidth || $win.width() ),
+			cy: ( window.innerHeight || $win.height() )
+		};
+	}
+
+	$.widget( "mobile.popup", $.mobile.widget, {
+		options: {
+			theme: null,
+			overlayTheme: null,
+			shadow: true,
+			corners: true,
+			transition: "pop",
+			positionTo: "origin",
+			tolerance: null,
+			initSelector: ":jqmData(role='popup')",
+			closeLinkSelector: "a:jqmData(rel='back')",
+			closeLinkEvents: "click.popup",
+			navigateEvents: "navigate.popup",
+			closeEvents: "navigate.popup pagebeforechange.popup",
+			isHardwarePopup: false,
+			// NOTE Windows Phone 7 has a scroll position caching issue that
+			//      requires us to disable popup history management by default
+			//      https://github.com/jquery/jquery-mobile/issues/4784
+			//
+			// NOTE this option is modified in _create!
+			history: false
+		},
+
+		_eatEventAndClose: function( e ) {
+			e.preventDefault();
+			e.stopImmediatePropagation();
+			this.close();
+			return false;
+		},
+
+		// Make sure the screen size is increased beyond the page height if the popup's causes the document to increase in height
+		_resizeScreen: function() {
+			var popupHeight = this._ui.container.outerHeight( true );
+
+			this._ui.screen.removeAttr( "style" );
+			if ( popupHeight > this._ui.screen.height() ) {
+				this._ui.screen.height( popupHeight );
+			}
+		},
+
+		_handleWindowKeyUp: function( e ) {
+			if ( this._isOpen && e.keyCode === $.mobile.keyCode.ESCAPE ) {
+				return this._eatEventAndClose( e );
+			}
+		},
+
+		_maybeRefreshTimeout: function() {
+			var winCoords = windowCoords();
+
+			if ( this._resizeData ) {
+				if ( winCoords.x === this._resizeData.winCoords.x &&
+					winCoords.y === this._resizeData.winCoords.y &&
+					winCoords.cx === this._resizeData.winCoords.cx &&
+					winCoords.cy === this._resizeData.winCoords.cy ) {
+					// timeout not refreshed
+					return false;
+				} else {
+					// clear existing timeout - it will be refreshed below
+					clearTimeout( this._resizeData.timeoutId );
+				}
+			}
+
+			this._resizeData = {
+				timeoutId: setTimeout( $.proxy( this, "_resizeTimeout" ), 200 ),
+				winCoords: winCoords
+			};
+
+			return true;
+		},
+
+		_resizeTimeout: function() {
+			if ( !this._maybeRefreshTimeout() && this.positionTo === "window" && this._isOpen ) {
+				// effectively rapid-open the popup while leaving the screen intact
+				this._trigger( "beforeposition" );
+				this._ui.container
+					.removeClass( "ui-selectmenu-hidden" )
+					.offset( this._placementCoords( this._desiredCoords( undefined, undefined, "window" ) ) );
+
+				this._resizeScreen();
+				this._resizeData = null;
+				this._orientationchangeInProgress = false;
+			}
+		},
+
+		_handleWindowResize: function( e ) {
+			if ( this._isOpen ) {
+				// Context popup close when Window resize event
+				if( this.positionTo !== "window" ) {
+					this.close();
+					return false;
+				}
+				this._maybeRefreshTimeout();
+			}
+		},
+
+		_handleWindowOrientationchange: function( e ) {
+
+			if ( !this._orientationchangeInProgress ) {
+				// effectively rapid-close the popup while leaving the screen intact
+				this._ui.container
+					.addClass( "ui-selectmenu-hidden" )
+					.removeAttr( "style" );
+
+				this._orientationchangeInProgress = true;
+			}
+		},
+
+		_create: function() {
+			var ui = {
+					screen: $( "<div class='ui-screen-hidden ui-popup-screen'></div>" ),
+					placeholder: $( "<div style='display: none;'><!-- placeholder --></div>" ),
+					container: $( "<div class='ui-popup-container ui-selectmenu-hidden'></div>" ),
+					arrow : $("<div class='ui-arrow'></div>")
+				},
+				thisPage = this.element.closest( ".ui-page" ),
+				myId = this.element.attr( "id" ),
+				self = this;
+
+			// We need to adjust the history option to be false if there's no AJAX nav.
+			// We can't do it in the option declarations because those are run before
+			// it is determined whether there shall be AJAX nav.
+			this.options.history = this.options.history && $.mobile.ajaxEnabled && $.mobile.hashListeningEnabled;
+
+			if ( thisPage.length === 0 ) {
+				thisPage = $( "body" );
+			}
+
+			// define the container for navigation event bindings
+			// TODO this would be nice at the the mobile widget level
+			this.options.container = this.options.container || $.mobile.pageContainer;
+
+			// Apply the proto
+			thisPage.append( ui.screen );
+			ui.container.insertAfter( ui.screen );
+			// Leave a placeholder where the element used to be
+			ui.placeholder.insertAfter( this.element );
+			if ( myId ) {
+				ui.screen.attr( "id", myId + "-screen" );
+				ui.container.attr( "id", myId + "-popup" );
+				ui.placeholder.html( "<!-- placeholder for " + myId + " -->" );
+			}
+			ui.container.append( this.element );
+			ui.container.append( ui.arrow );
+			// Add class to popup element
+			this.element.addClass( "ui-popup" );
+
+			// Define instance variables
+			$.extend( this, {
+				_page: thisPage,
+				_ui: ui,
+				_fallbackTransition: "",
+				_currentTransition: false,
+				_prereqs: null,
+				_isOpen: false,
+				_tolerance: null,
+				_resizeData: null,
+				_orientationchangeInProgress: false,
+				_globalHandlers: [
+					{
+						src: $.mobile.$window,
+						handler: {
+							orientationchange: $.proxy( this, "_handleWindowOrientationchange" ),
+							resize: $.proxy( this, "_handleWindowResize" ),
+							keyup: $.proxy( this, "_handleWindowKeyUp" )
+						}
+					}
+				]
+			});
+
+			$.each( this.options, function( key, value ) {
+				// Cause initial options to be applied by their handler by temporarily setting the option to undefined
+				// - the handler then sets it to the initial value
+				self.options[ key ] = undefined;
+				self._setOption( key, value, true );
+			});
+
+			ui.screen.bind( "vclick", $.proxy( this, "_eatEventAndClose" ) );
+
+			$.each( this._globalHandlers, function( idx, value ) {
+				value.src.bind( value.handler );
+			});
+		},
+
+		_applyTheme: function( dst, theme, prefix ) {
+			var classes = ( dst.attr( "class" ) || "").split( " " ),
+				alreadyAdded = true,
+				currentTheme = null,
+				matches,
+				themeStr = String( theme );
+
+			while ( classes.length > 0 ) {
+				currentTheme = classes.pop();
+				matches = ( new RegExp( "^ui-" + prefix + "-([a-z])$" ) ).exec( currentTheme );
+				if ( matches && matches.length > 1 ) {
+					currentTheme = matches[ 1 ];
+					break;
+				} else {
+					currentTheme = null;
+				}
+			}
+
+			if ( theme !== currentTheme ) {
+				dst.removeClass( "ui-" + prefix + "-" + currentTheme );
+				if ( ! ( theme === null || theme === "none" ) ) {
+					dst.addClass( "ui-" + prefix + "-" + themeStr );
+				}
+			}
+		},
+
+		_setTheme: function( value ) {
+			this._applyTheme( this.element, value, "body" );
+		},
+
+		_setOverlayTheme: function( value ) {
+			this._applyTheme( this._ui.screen, value, "overlay" );
+
+			if ( this._isOpen ) {
+				this._ui.screen.addClass( "in" );
+			}
+		},
+
+		_setShadow: function( value ) {
+			this.element.toggleClass( "ui-overlay-shadow", value );
+		},
+
+		_setCorners: function( value ) {
+			this.element.toggleClass( "ui-corner-all", value );
+		},
+
+		_applyTransition: function( value ) {
+			this._ui.container.removeClass( this._fallbackTransition );
+			if ( value && value !== "none" ) {
+				this._fallbackTransition = $.mobile._maybeDegradeTransition( value );
+				this._ui.container.addClass( this._fallbackTransition );
+			}
+		},
+
+		_setTransition: function( value ) {
+			if ( !this._currentTransition ) {
+				this._applyTransition( value );
+			}
+		},
+
+		_setTolerance: function( value ) {
+			var tol = { t: 5, r: 5, b: 5, l: 5 };
+
+			if ( value ) {
+				var ar = String( value ).split( "," );
+
+				$.each( ar, function( idx, val ) { ar[ idx ] = parseInt( val, 10 ); } );
+
+				switch( ar.length ) {
+					// All values are to be the same
+					case 1:
+						if ( !isNaN( ar[ 0 ] ) ) {
+							tol.t = tol.r = tol.b = tol.l = ar[ 0 ];
+						}
+						break;
+
+					// The first value denotes top/bottom tolerance, and the second value denotes left/right tolerance
+					case 2:
+						if ( !isNaN( ar[ 0 ] ) ) {
+							tol.t = tol.b = ar[ 0 ];
+						}
+						if ( !isNaN( ar[ 1 ] ) ) {
+							tol.l = tol.r = ar[ 1 ];
+						}
+						break;
+
+					// The array contains values in the order top, right, bottom, left
+					case 4:
+						if ( !isNaN( ar[ 0 ] ) ) {
+							tol.t = ar[ 0 ];
+						}
+						if ( !isNaN( ar[ 1 ] ) ) {
+							tol.r = ar[ 1 ];
+						}
+						if ( !isNaN( ar[ 2 ] ) ) {
+							tol.b = ar[ 2 ];
+						}
+						if ( !isNaN( ar[ 3 ] ) ) {
+							tol.l = ar[ 3 ];
+						}
+						break;
+
+					default:
+						break;
+				}
+			}
+
+			this._tolerance = tol;
+		},
+
+		_setOption: function( key, value ) {
+			var exclusions, setter = "_set" + key.charAt( 0 ).toUpperCase() + key.slice( 1 );
+
+			if ( this[ setter ] !== undefined ) {
+				this[ setter ]( value );
+			}
+
+			// TODO REMOVE FOR 1.2.1 by moving them out to a default options object
+			exclusions = [
+				"initSelector",
+				"closeLinkSelector",
+				"closeLinkEvents",
+				"navigateEvents",
+				"closeEvents",
+				"history",
+				"container"
+			];
+
+			$.mobile.widget.prototype._setOption.apply( this, arguments );
+			if ( $.inArray( key, exclusions ) === -1 ) {
+				// Record the option change in the options and in the DOM data-* attributes
+				this.element.attr( "data-" + ( $.mobile.ns || "" ) + ( key.replace( /([A-Z])/, "-$1" ).toLowerCase() ), value );
+			}
+		},
+
+		// Try and center the overlay over the given coordinates
+		_placementCoords: function( desired ) {
+			// rectangle within which the popup must fit
+			var
+				winCoords = windowCoords(),
+				rc = {
+					x: this._tolerance.l,
+					y: winCoords.y + this._tolerance.t,
+					cx: winCoords.cx - this._tolerance.l - this._tolerance.r,
+					cy: winCoords.cy - this._tolerance.t - this._tolerance.b
+				},
+				menuSize, ret,
+				linkOffset = $(this.link).offset(),
+				positionOffsets = [],
+				correctionValue = [0,0],
+				arrayIdx;
+
+			// Clamp the width of the menu before grabbing its size
+			this._ui.container.css( "max-width", rc.cx );
+			menuSize = {
+				cx: this._ui.container.outerWidth( true ),
+				cy: this._ui.container.outerHeight( true )
+			};
+
+			// Center the menu over the desired coordinates, while not going outside
+			// the window tolerances. This will center wrt. the window if the popup is too large.
+			ret = {
+				x: fitSegmentInsideSegment( rc.cx, menuSize.cx, rc.x, desired.x ),
+				y: fitSegmentInsideSegment( rc.cy, menuSize.cy, rc.y, desired.y )
+			};
+
+			// Make sure the top of the menu is visible
+			ret.y = Math.max( 0, ret.y );
+
+			// If the height of the menu is smaller than the height of the document
+			// align the bottom with the bottom of the document
+
+			// fix for $( document ).height() bug in core 1.7.2.
+			var docEl = document.documentElement, docBody = document.body,
+				docHeight = Math.max( docEl.clientHeight, docBody.scrollHeight, docBody.offsetHeight, docEl.scrollHeight, docEl.offsetHeight );
+
+			ret.y -= Math.min( ret.y, Math.max( 0, ret.y + menuSize.cy - docHeight ) );
+
+			if ( this.positionTo !== "origin" ) {
+				return { left: ret.x, top: ret.y , arrowleft: 0 , arrowtop: 0};
+			} else if( this.options.isHardwarePopup )  {
+				return { left: this._tolerance.l, top: $(window).height() - menuSize.cy - this._tolerance.b, arrowleft: 0 , arrowtop: 0 };
+			}
+
+			positionOffsets = [ linkOffset.left,
+								linkOffset.top,
+								docEl.clientHeight - ( linkOffset.top + $(this.link).height() ),
+								docEl.clientWidth - ( linkOffset.left + $(this.link).width() )];
+			arrayIdx = positionOffsets.indexOf(Math.max.apply(window,positionOffsets));
+
+			switch( arrayIdx )
+			{
+				case 0:
+					correctionValue = [ -$(this.link).width() , 0];
+					arrowtop = ( linkOffset.top - ret.y  ) + ( $(this.link).height() / 2 ) - parseInt( $(this._ui.arrow).css("border-width") ) ;
+					arrowleft = menuSize.cx;
+					$(this._ui.arrow).attr( "class", "" )
+									.addClass( "ui-arrow left" )
+					break;
+				case 1:
+					correctionValue = [ 0 , -(ret.y + menuSize.cy - linkOffset.top)];
+					arrowtop = menuSize.cy - 2;
+					arrowleft = (linkOffset.left - ret.x + correctionValue[0]) + ( $(this.link).width() / 2 ) - parseInt( $(this._ui.arrow).css("border-width") ) / 2;
+					$(this._ui.arrow).attr( "class", "" )
+									.addClass( "ui-arrow bottom" );
+					break;
+				case 2:
+					correctionValue = [ 0 , ( linkOffset.top + $(this.link).height() - ret.y ) ];
+					arrowtop = - parseInt( $(this._ui.arrow).css("border-width") ) * 2 + 1;
+					arrowleft = (linkOffset.left - ret.x + correctionValue[0]) + ( $(this.link).width() / 2 ) - parseInt( $(this._ui.arrow).css("border-width") ) / 2;
+					$(this._ui.arrow).attr( "class", "" )
+									.addClass("ui-arrow top");
+					break;
+				case 3:
+					correctionValue = [ ( menuSize.cx < $(this.link).width() ) ? ( $(this.link).width() / 2 ) + ( menuSize.cx / 2) : $(this.link).width() , 0];
+					arrowtop = ( linkOffset.top - ret.y  ) + ( $(this.link).height() / 2 ) - parseInt( $(this._ui.arrow).css("border-width") ) ;
+					arrowleft = - parseInt( $(this._ui.arrow).css("border-width") ) * 2;
+					$(this._ui.arrow).attr( "class", "" )
+									.addClass("ui-arrow right");
+					break;
+			}
+
+			return { left: ret.x + correctionValue[0], top: ret.y + correctionValue[1] , arrowleft: arrowleft , arrowtop: arrowtop };
+		},
+
+		_createPrereqs: function( screenPrereq, containerPrereq, whenDone ) {
+			var self = this, prereqs;
+
+			// It is important to maintain both the local variable prereqs and self._prereqs. The local variable remains in
+			// the closure of the functions which call the callbacks passed in. The comparison between the local variable and
+			// self._prereqs is necessary, because once a function has been passed to .animationComplete() it will be called
+			// next time an animation completes, even if that's not the animation whose end the function was supposed to catch
+			// (for example, if an abort happens during the opening animation, the .animationComplete handler is not called for
+			// that animation anymore, but the handler remains attached, so it is called the next time the popup is opened
+			// - making it stale. Comparing the local variable prereqs to the widget-level variable self._prereqs ensures that
+			// callbacks triggered by a stale .animationComplete will be ignored.
+
+			prereqs = {
+				screen: $.Deferred(),
+				container: $.Deferred()
+			};
+
+			prereqs.screen.then( function() {
+				if ( prereqs === self._prereqs ) {
+					screenPrereq();
+				}
+			});
+
+			prereqs.container.then( function() {
+				if ( prereqs === self._prereqs ) {
+					containerPrereq();
+				}
+			});
+
+			$.when( prereqs.screen, prereqs.container ).done( function() {
+				if ( prereqs === self._prereqs ) {
+					self._prereqs = null;
+					whenDone();
+				}
+			});
+
+			self._prereqs = prereqs;
+		},
+
+		_animate: function( args ) {
+			// NOTE before removing the default animation of the screen
+			//      this had an animate callback that would relove the deferred
+			//      now the deferred is resolved immediately
+			// TODO remove the dependency on the screen deferred
+			this._ui.screen
+				.removeClass( args.classToRemove )
+				.addClass( args.screenClassToAdd );
+
+			args.prereqs.screen.resolve();
+
+			if ( args.transition && args.transition !== "none" ) {
+				if ( args.applyTransition ) {
+					this._applyTransition( args.transition );
+				}
+				this._ui.container
+					.animationComplete( $.proxy( args.prereqs.container, "resolve" ) )
+					.addClass( args.containerClassToAdd )
+					.removeClass( args.classToRemove );
+			} else {
+				this._ui.container.removeClass( args.classToRemove );
+				args.prereqs.container.resolve();
+			}
+		},
+
+		// The desired coordinates passed in will be returned untouched if no reference element can be identified via
+		// desiredPosition.positionTo. Nevertheless, this function ensures that its return value always contains valid
+		// x and y coordinates by specifying the center middle of the window if the coordinates are absent.
+		_desiredCoords: function( x, y, positionTo ) {
+			var dst = null, offset, winCoords = windowCoords();
+
+			self.positionTo = positionTo;
+
+			// Establish which element will serve as the reference
+			if ( positionTo && positionTo !== "origin" ) {
+				if ( positionTo === "window" ) {
+					x = winCoords.cx / 2 + winCoords.x;
+					y = winCoords.cy / 2 + winCoords.y;
+				} else {
+					try {
+						dst = $( positionTo );
+					} catch( e ) {
+						dst = null;
+					}
+					if ( dst ) {
+						dst.filter( ":visible" );
+						if ( dst.length === 0 ) {
+							dst = null;
+						}
+					}
+				}
+			}
+
+			// If an element was found, center over it
+			if ( dst ) {
+				offset = dst.offset();
+				x = offset.left + dst.outerWidth() / 2;
+				y = offset.top + dst.outerHeight() / 2;
+			}
+
+			// Make sure x and y are valid numbers - center over the window
+			if ( $.type( x ) !== "number" || isNaN( x ) ) {
+				x = winCoords.cx / 2 + winCoords.x;
+			}
+			if ( $.type( y ) !== "number" || isNaN( y ) ) {
+				y = winCoords.cy / 2 + winCoords.y;
+			}
+
+			return { x: x, y: y };
+		},
+
+		_reposition: function() {
+			var self = this,
+					coords;
+
+			if( self._isOpen
+				&& self.link
+				&& self.positionTo !== "window") {
+					coords = self._placementCoords( self._desiredCoords( $(self.link).offset().left + $(self.link).outerWidth() /2 , $(self.link).offset().top + $(self.link).outerHeight() /2 , self.positionTo || self.options.positionTo || "origin" ) );
+					self._ui.container
+						.offset( { top : coords.top } );
+			}
+		},
+
+		_openPrereqsComplete: function() {
+			var self = this;
+
+			self._ui.container.addClass( "ui-popup-active" );
+			self._isOpen = true;
+			self._resizeScreen();
+
+			// Android appears to trigger the animation complete before the popup
+			// is visible. Allowing the stack to unwind before applying focus prevents
+			// the "blue flash" of element focus in android 4.0
+			setTimeout(function(){
+				self._ui.container.attr( "tabindex", "0" ).focus();
+				self._trigger( "afteropen" );
+				self._reposition();
+			});
+		},
+
+		_open: function( options ) {
+			var coords, transition,
+				androidBlacklist = ( function() {
+					var w = window,
+						ua = navigator.userAgent,
+						// Rendering engine is Webkit, and capture major version
+						wkmatch = ua.match( /AppleWebKit\/([0-9\.]+)/ ),
+						wkversion = !!wkmatch && wkmatch[ 1 ],
+						androidmatch = ua.match( /Android (\d+(?:\.\d+))/ ),
+						andversion = !!androidmatch && androidmatch[ 1 ],
+						chromematch = ua.indexOf( "Chrome" ) > -1;
+
+					// Platform is Android, WebKit version is greater than 534.13 ( Android 3.2.1 ) and not Chrome.
+					if( androidmatch !== null && andversion === "4.0" && wkversion && wkversion > 534.13 && !chromematch ) {
+						return true;
+					}
+					return false;
+				}());
+
+			// Make sure options is defined
+			options = ( options || {} );
+
+			// Copy out the transition, because we may be overwriting it later and we don't want to pass that change back to the caller
+			transition = options.transition || this.options.transition;
+
+			// Give applications a chance to modify the contents of the container before it appears
+			this._trigger( "beforeposition" );
+
+			coords = this._placementCoords( this._desiredCoords( options.x, options.y, options.positionTo || this.options.positionTo || "origin" ) );
+
+			// Count down to triggering "popupafteropen" - we have two prerequisites:
+			// 1. The popup window animation completes (container())
+			// 2. The screen opacity animation completes (screen())
+			this._createPrereqs(
+				$.noop,
+				$.noop,
+				$.proxy( this, "_openPrereqsComplete" ) );
+
+			if ( transition ) {
+				this._currentTransition = transition;
+				this._applyTransition( transition );
+			} else {
+				transition = this.options.transition;
+			}
+
+			if ( !this.options.theme ) {
+				this._setTheme( this._page.jqmData( "theme" ) || $.mobile.getInheritedTheme( this._page, "c" ) );
+			}
+
+			this._ui.screen.removeClass( "ui-screen-hidden" );
+
+			this._ui.container
+				.removeClass( "ui-selectmenu-hidden" )
+				.offset( coords );
+			this._ui.arrow.css( { top : coords.arrowtop, left : coords.arrowleft } );
+			if ( this.options.overlayTheme && androidBlacklist ) {
+				/* TODO:
+				The native browser on Android 4.0.X ("Ice Cream Sandwich") suffers from an issue where the popup overlay appears to be z-indexed
+				above the popup itself when certain other styles exist on the same page -- namely, any element set to `position: fixed` and certain
+				types of input. These issues are reminiscent of previously uncovered bugs in older versions of Android's native browser:
+				https://github.com/scottjehl/Device-Bugs/issues/3
+
+				This fix closes the following bugs ( I use "closes" with reluctance, and stress that this issue should be revisited as soon as possible ):
+
+				https://github.com/jquery/jquery-mobile/issues/4816
+				https://github.com/jquery/jquery-mobile/issues/4844
+				https://github.com/jquery/jquery-mobile/issues/4874
+				*/
+
+				// TODO sort out why this._page isn't working
+				this.element.closest( ".ui-page" ).addClass( "ui-popup-open" );
+			}
+			this._animate({
+				additionalCondition: true,
+				transition: transition,
+				classToRemove: "",
+				screenClassToAdd: "in",
+				containerClassToAdd: "in",
+				applyTransition: false,
+				prereqs: this._prereqs
+			});
+		},
+
+		_closePrereqScreen: function() {
+			this._ui.screen
+				.removeClass( "out" )
+				.addClass( "ui-screen-hidden" );
+		},
+
+		_closePrereqContainer: function() {
+			this._ui.container
+				.removeClass( "reverse out" )
+				.addClass( "ui-selectmenu-hidden" )
+				.removeAttr( "style" );
+		},
+
+		_closePrereqsDone: function() {
+			var self = this, opts = self.options;
+
+			self._ui.container.removeAttr( "tabindex" );
+
+			// remove nav bindings if they are still present
+			opts.container.unbind( opts.closeEvents );
+
+			// unbind click handlers added when history is disabled
+			self.element.undelegate( opts.closeLinkSelector, opts.closeLinkEvents );
+
+			// remove the global mutex for popups
+			$.mobile.popup.active = undefined;
+
+			// alert users that the popup is closed
+			self._trigger( "afterclose" );
+		},
+
+		_close: function( immediate ) {
+			this._ui.container.removeClass( "ui-popup-active" );
+			this._page.removeClass( "ui-popup-open" );
+
+			this._isOpen = false;
+
+			// IME hide when popup is closed
+			this.element.find("input").blur();
+
+			// Count down to triggering "popupafterclose" - we have two prerequisites:
+			// 1. The popup window reverse animation completes (container())
+			// 2. The screen opacity animation completes (screen())
+			this._createPrereqs(
+				$.proxy( this, "_closePrereqScreen" ),
+				$.proxy( this, "_closePrereqContainer" ),
+				$.proxy( this, "_closePrereqsDone" ) );
+
+			this._animate( {
+				additionalCondition: this._ui.screen.hasClass( "in" ),
+				transition: ( immediate ? "none" : ( this._currentTransition || this.options.transition ) ),
+				classToRemove: "in",
+				screenClassToAdd: "out",
+				containerClassToAdd: "reverse out",
+				applyTransition: true,
+				prereqs: this._prereqs
+			});
+		},
+
+		_destroy: function() {
+			var self = this;
+
+			// hide and remove bindings
+			self._close();
+
+			// Put the element back to where the placeholder was and remove the "ui-popup" class
+			self._setTheme( "none" );
+			self.element
+				.insertAfter( self._ui.placeholder )
+				.removeClass( "ui-popup ui-overlay-shadow ui-corner-all" );
+			self._ui.screen.remove();
+			self._ui.container.remove();
+			self._ui.placeholder.remove();
+
+			// Unbind handlers that were bound to elements outside self.element (the window, in self case)
+			// window history back is call "_destroy method"
+			// if this method is called, all kind of window resize event has been unbind
+			/*
+			$.each( self._globalHandlers, function( idx, oneSrc ) {
+				$.each( oneSrc.handler, function( eventType, handler ) {
+					oneSrc.src.unbind( eventType, handler );
+				});
+			});
+			*/
+		},
+
+		_closePopup: function( e, data ) {
+			var parsedDst, toUrl;
+
+			if ( e.type === "pagebeforechange" && data ) {
+				if ( typeof data.toPage === "string" ) {
+					parsedDst = data.toPage;
+				} else {
+				parsedDst = data.toPage.jqmData( "url" );
+				}
+				parsedDst = $.mobile.path.parseUrl( parsedDst );
+				toUrl = parsedDst.pathname + parsedDst.search + parsedDst.hash;
+
+				if ( this._myUrl !== toUrl ) {
+					this.options.container.unbind( this.options.closeEvents );
+					this._close( true );
+				} else {
+					this._close();
+				}
+				return;	// skip normal close
+			}
+
+			this._close();
+		},
+
+		// any navigation event after a popup is opened should close the popup
+		// NOTE the pagebeforechange is bound to catch navigation events that don't
+		//      alter the url (eg, dialogs from popups)
+		_bindContainerClose: function() {
+			var self = this;
+
+			self.options.container
+				.one( self.options.closeEvents, $.proxy( self, "_closePopup" ) );
+		},
+
+		// TODO no clear deliniation of what should be here and
+		// what should be in _open. Seems to be "visual" vs "history" for now
+		open: function( options ) {
+			var self = this, opts = this.options, url, hashkey, activePage, currentIsDialog, hasHash, urlHistory;
+			// self.link = ( $(event.target).attr('data-role') === 'button') ? event.target : $(event.target).closest('[data-role="button"]')[0];
+			// make sure open is idempotent
+			if( $.mobile.popup.active ) {
+				return;
+			}
+			// set the global popup mutex
+			$.mobile.popup.active = this;
+			if( !options ) {
+				options = [];
+			}
+
+			if ( !options.link ) {
+				if ( !event ) {
+					self.positionTo = "window";
+				} else {
+					self.link = ( $(event.target).closest('a')[0] || $(event.target).closest('div')[0] );
+				}
+			} else {
+				self.link = options.link;
+			}
+			if ( event ) {
+				self.positionTo = ( options != null && options.positionTo != null ) ? options.positionTo : "origin";
+			}
+
+			if ( $(self.link).jqmData("position-to") !== "window"
+					&& self.positionTo !== "window" ) {
+
+				$(self.element).addClass("ui-ctxpopup");
+				$(self._ui.container).removeClass("ui-popup-container")
+					.addClass("ui-ctxpopup-container");
+
+				if( self.positionTo !== "origin" ) {
+					$(self._ui.arrow).hide();
+				} else {
+					$(self._ui.arrow).show();
+				}
+			} else {
+				$(self._ui.arrow).hide();
+				// apply opacity back screen
+				this._setOverlayTheme( "dim" );
+			}
+			if( !options.x
+				&& self.positionTo === "origin"
+				&& self.link ) {
+				options.x = $(self.link).offset().left + $(self.link).outerWidth() / 2;
+			}
+			if( !options.y
+				&& self.positionTo === "origin" 
+				&& self.link ) {
+				options.y = $(self.link).offset().top + $(self.link).outerHeight() / 2;
+			}
+
+			// Hadeware key style popup
+			if( $(self.element).hasClass( "ui-ctxpopup-optionmenu" ) ){
+				self.options.isHardwarePopup = true;
+				$( self._ui.arrow).hide();
+			}
+
+			// if history alteration is disabled close on navigate events
+			// and leave the url as is
+			if( !( opts.history ) ) {
+				self._open( options );
+				self._bindContainerClose();
+
+				// When histoy is disabled we have to grab the data-rel
+				// back link clicks so we can close the popup instead of
+				// relying on history to do it for us
+				self.element
+					.delegate( opts.closeLinkSelector, opts.closeLinkEvents, function( e ) {
+						self._close();
+
+						// NOTE prevent the browser and navigation handlers from
+						// working with the link's rel=back. This may cause
+						// issues for developers expecting the event to bubble
+						return false;
+					});
+
+				return;
+			}
+
+			// cache some values for min/readability
+			hashkey = $.mobile.dialogHashKey;
+			activePage = $.mobile.activePage;
+			currentIsDialog = activePage.is( ".ui-dialog" );
+			// Set active page url
+			this._myUrl = url = urlHistory.getActive().url;
+			//
+			url = $.mobile.urlHistory.getActive().url;
+			hasHash = ( url.indexOf( hashkey ) > -1 ) && !currentIsDialog;
+			urlHistory = $.mobile.urlHistory;
+
+			if ( hasHash ) {
+				self._open( options );
+				self._bindContainerClose();
+				return;
+			}
+
+			// if the current url has no dialog hash key proceed as normal
+			// otherwise, if the page is a dialog simply tack on the hash key
+			if ( url.indexOf( hashkey ) === -1 && !currentIsDialog ){
+				url = url + hashkey;
+			} else {
+				url = $.mobile.path.parseLocation().hash + hashkey;
+			}
+
+			// Tack on an extra hashkey if this is the first page and we've just reconstructed the initial hash
+			if ( urlHistory.activeIndex === 0 && url === urlHistory.initialDst ) {
+				url += hashkey;
+			}
+
+			// swallow the the initial navigation event, and bind for the next
+			opts.container.one( opts.navigateEvents, function( e ) {
+				e.preventDefault();
+				self._open( options );
+				self._bindContainerClose();
+			});
+
+			urlHistory.ignoreNextHashChange = currentIsDialog;
+
+			// Gotta love methods with 1mm args :(
+			urlHistory.addNew( url, undefined, undefined, undefined, "dialog" );
+
+			// set the new url with (or without) the new dialog hash key
+			$.mobile.path.set( url );
+		},
+
+		close: function() {
+			// make sure close is idempotent
+			if( !$.mobile.popup.active ){
+				return;
+			}
+
+			if( this.options.history ) {
+				$.mobile.back();
+			} else {
+				this._close();
+			}
+		}
+	});
+
+
+	// TODO this can be moved inside the widget
+	$.mobile.popup.handleLink = function( $link ) {
+		var closestPage = $link.closest( ":jqmData(role='page')" ),
+			scope = ( ( closestPage.length === 0 ) ? $( "body" ) : closestPage ),
+			// NOTE make sure to get only the hash, ie7 (wp7) return the absolute href
+			//      in this case ruining the element selection
+			popup = $( $.mobile.path.parseUrl($link.attr( "href" )).hash, scope[0] ),
+			offset;
+
+		if ( popup.data( "popup" ) ) {
+			offset = $link.offset();
+			popup.popup( "open", {
+				x: offset.left + $link.outerWidth() / 2,
+				y: offset.top + $link.outerHeight() / 2,
+				transition: $.mobile.getAttrFixed( $link[0], "data-" + $.mobile.ns + "transition" ),
+				positionTo: $.mobile.getAttrFixed( $link[0], "data-" + $.mobile.ns + "position-to" ),
+				link: $link
+			});
+		}
+
+		//remove after delay
+		setTimeout( function() {
+			$link.removeClass( $.mobile.activeBtnClass );
+		}, 300 );
+	};
+
+	// TODO move inside _create
+	$.mobile.$document.bind( "pagebeforechange", function( e, data ) {
+		if ( data.options.role === "popup" ) {
+			$.mobile.popup.handleLink( data.options.link );
+			e.preventDefault();
+		}
+	});
+
+	//delegate self-init widgets
+	$.delegateSelfInitWithSingleSelector( $.mobile.popup, true );
+
+})( jQuery );
+
+(function( $ ) {
+	var	meta = $( "meta[name=viewport]" ),
+		initialContent = meta.attr( "content" ),
+		disabledZoom = initialContent + ",maximum-scale=1, user-scalable=no",
+		enabledZoom = initialContent + ",maximum-scale=10, user-scalable=yes",
+		disabledInitially = /(user-scalable[\s]*=[\s]*no)|(maximum-scale[\s]*=[\s]*1)[$,\s]/.test( initialContent );
+
+	$.mobile.zoom = $.extend( {}, {
+		enabled: !disabledInitially,
+		locked: false,
+		disable: function( lock ) {
+			if ( !disabledInitially && !$.mobile.zoom.locked ) {
+				meta.attr( "content", disabledZoom );
+				$.mobile.zoom.enabled = false;
+				$.mobile.zoom.locked = lock || false;
+			}
+		},
+		enable: function( unlock ) {
+			if ( !disabledInitially && ( !$.mobile.zoom.locked || unlock === true ) ) {
+				meta.attr( "content", enabledZoom );
+				$.mobile.zoom.enabled = true;
+				$.mobile.zoom.locked = false;
+			}
+		},
+		restore: function() {
+			if ( !disabledInitially ) {
+				meta.attr( "content", initialContent );
+				$.mobile.zoom.enabled = true;
+			}
+		}
+	});
+
+}( jQuery ));
+
+(function( $, undefined ) {
+
+$.widget( "mobile.textinput", $.mobile.widget, {
+	options: {
+		theme: null,
+		// This option defaults to true on iOS devices.
+		preventFocusZoom: /iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( "AppleWebKit" ) > -1,
+		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])",
+		disabled: false
+	},
+
+	_create: function() {
+
+		var self = this,
+			input = this.element,
+			o = this.options,
+			theme = o.theme || $.mobile.getInheritedTheme( this.element, "c" ),
+			themeclass  = " ui-body-" + theme,
+			mini = $.mobile.getAttrFixed( input[0], "data-" + $.mobile.ns + "mini" ) === true,
+			miniclass = mini ? " ui-mini" : "",
+			focusedEl, clearbtn;
+
+		function toggleClear() {
+			setTimeout( function() {
+				clearbtn.toggleClass( "ui-input-clear-hidden", !input.val() );
+			}, 0 );
+		}
+
+		$( "label[for='" + input.attr( "id" ) + "']" ).addClass( "ui-input-text" );
+
+		focusedEl = input.addClass("ui-input-text ui-body-"+ theme );
+
+		switch ( input.attr( "type" ) ) {
+			case "text":
+			case "password":
+			case "number":
+			case "email":
+			case "url":
+			case "tel":
+				input.attr( { "role" : "textbox", "aria-label" : "Keyboard opened" } );
+				break;
+			default:
+				if ( input.prop( "tagName" ).toLowerCase() === "textarea" ) {
+					input.attr( { "role" : "textbox", "aria-label" : "Keyboard opened" } );
+				}
+		}
+
+		// 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.focus(function() {
+				focusedEl.addClass( $.mobile.focusClass );
+			})
+			.blur(function() {
+				focusedEl.removeClass( $.mobile.focusClass );
+			})
+			// In many situations, iOS will zoom into the select upon tap, this prevents that from happening
+			.bind( "focus", function() {
+				if ( o.preventFocusZoom ) {
+					$.mobile.zoom.disable( true );
+				}
+			})
+			.bind( "blur", function() {
+				if ( o.preventFocusZoom ) {
+					$.mobile.zoom.enable( true );
+				}
+			});
+
+		// Autogrow
+		if ( input.is( "textarea" ) ) {
+			var extraLineHeight = 15,
+				keyupTimeoutBuffer = 100,
+				keyupTimeout;
+
+			this._keyup = function() {
+				var scrollHeight = input[ 0 ].scrollHeight,
+					clientHeight = input[ 0 ].clientHeight;
+
+				if ( clientHeight < scrollHeight && window.innerHeight / 2 > scrollHeight ) {
+					input.height(scrollHeight + extraLineHeight);
+				}
+			};
+
+			input.keyup(function() {
+				clearTimeout( keyupTimeout );
+				keyupTimeout = setTimeout( self._keyup, keyupTimeoutBuffer );
+			});
+
+			// binding to pagechange here ensures that for pages loaded via
+			// ajax the height is recalculated without user input
+			this._on( $.mobile.$document, {"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
+				this._on( $.mobile.$window, {"load": "_keyup"});
+			}
+		}
+		if ( input.attr( "disabled" ) ) {
+			this.disable();
+		}
+	},
+
+	disable: function() {
+		var $el;
+		if ( this.element.attr( "disabled", true ) ) {
+			$el = this.element;
+		} else {
+			return;
+		}
+		$el.addClass( "ui-disabled" );
+		return this._setOption( "disabled", true );
+	},
+
+	enable: function() {
+		var $el;
+
+		// TODO using more than one line of code is acceptable ;)
+		if ( this.element.attr( "disabled", false ) ) {
+			$el = this.element;
+		} else {
+			return;
+		}
+		$el.removeClass( "ui-disabled" );
+		return this._setOption( "disabled", false );
+	}
+});
+
+//auto self-init widgets
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$.mobile.textinput.prototype.enhanceWithin( e.target, true );
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.mobile.listview.prototype.options.filter = false;
+$.mobile.listview.prototype.options.filterPlaceholder = "";
+$.mobile.listview.prototype.options.filterTheme = "c";
+// TODO rename callback/deprecate and default to the item itself as the first argument
+var defaultFilterCallback = function( text, searchValue, item ) {
+		return text.toString().toLowerCase().indexOf( searchValue ) === -1;
+	};
+
+$.mobile.listview.prototype.options.filterCallback = defaultFilterCallback;
+
+$.mobile.$document.delegate( ":jqmData(role='listview')", "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,
+				// Check if a custom filter callback applies
+				isCustomFilterCallback = listview.options.filterCallback !== defaultFilterCallback;
+
+			listview._trigger( "beforefilter", "beforefilter", { input: this } );
+
+			// Change val as lastval for next execution
+			$this.jqmData( "lastval" , val );
+			if ( isCustomFilterCallback || val.length < lastval.length || val.indexOf( lastval ) !== 0 ) {
+
+				// Custom filter callback applies or 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 =  $.mobile.getAttrFixed( item[0], "data-" + $.mobile.ns + "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, item ) ) {
+
+						//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 ( listview.options.inset ) {
+		wrapper.addClass( "ui-listview-filter-inset" );
+	}
+
+	wrapper.bind( "submit", function() {
+		return false;
+	})
+	.insertBefore( list );
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.widget( "mobile.slider", $.mobile.widget, {
+	widgetEventPrefix: "slide",
+
+	options: {
+		theme: null,
+		trackTheme: null,
+		disabled: false,
+		initSelector: "input[type='range'], :jqmData(type='range'), :jqmData(role='slider')",
+		mini: false
+	},
+
+	_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" ),
+
+			$label = $( "[for='" + controlID + "']" ),
+
+			labelID = $label.attr( "id" ) || controlID + "-label",
+
+			label = $label.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 ),
+
+			inlineClass = ( this.options.inline || $.mobile.getAttrFixed( control[0], "data-" + $.mobile.ns + "inline" ) === true ) ? " ui-slider-inline" : "",
+
+			miniClass = ( this.options.mini || $.mobile.getAttrFixed( control[0], "data-" + $.mobile.ns + "min" ) ) ? " ui-slider-mini" : "",
+
+
+			domHandle = document.createElement( 'a' ),
+			handle = $( domHandle ),
+			domSlider = document.createElement( 'div' ),
+			slider = $( domSlider ),
+
+			valuebg = $.mobile.getAttrFixed( control[0], "data-" + $.mobile.ns + "highlight" ) !== false && cType !== "select" ? (function() {
+				var bg = document.createElement('div');
+				bg.className = 'ui-slider-bg ' + $.mobile.activeBtnClass + ' ui-btn-corner-all';
+				return $( bg ).prependTo( slider );
+			})() : false,
+
+			options;
+
+		this._type = cType;
+
+		domHandle.setAttribute( 'href', "#" );
+		domSlider.setAttribute('role','application');
+		domSlider.className = ['ui-slider ',selectClass," ui-btn-down-",trackTheme,' ui-btn-corner-all', inlineClass, miniClass].join( "" );
+		domHandle.className = 'ui-slider-handle';
+		domSlider.appendChild( domHandle );
+		if ( $( control ).find( "option" ).length && $( control ).find( "option" ).text() === "" ) {
+			$( domSlider ).addClass( "ui-toggle-switch" );
+		}
+		if( val() === "1" ) {
+			$( domHandle ).addClass( "ui-toggle-on" );
+		} else {
+			$( domHandle ).addClass( "ui-toggle-off" );
+		}
+		handle.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
+				});
+
+		$.extend( this, {
+			slider: slider,
+			handle: handle,
+			valuebg: valuebg,
+			dragging: false,
+			beforeStart: null,
+			userModified: false,
+			mouseMoved: false
+		});
+
+		if ( cType === "select" ) {
+			var wrapper = document.createElement('div');
+			wrapper.className = 'ui-slider-inneroffset';
+
+			for ( var j = 0,length = domSlider.childNodes.length;j < length;j++ ) {
+				wrapper.appendChild( domSlider.childNodes[j] );
+			}
+
+			domSlider.appendChild( wrapper );
+
+			// 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" );
+
+			for ( var i = 0, optionsCount = options.length; i < optionsCount; i++ ) {
+				var side = !i ? "b" : "a",
+					sliderTheme = !i ? " ui-btn-down-" + trackTheme : ( " " + $.mobile.activeBtnClass ),
+					sliderLabel = document.createElement( 'div' ),
+					sliderImg = document.createElement( 'span' );
+
+				sliderImg.className = ['ui-slider-label ui-slider-label-',side,sliderTheme," ui-btn-corner-all"].join( "" );
+				sliderImg.setAttribute('role','img');
+				sliderImg.appendChild( document.createTextNode( options[i].innerHTML ) );
+				$( sliderImg ).html() ? $( sliderImg ).html( $( sliderImg ).text() ) : $( sliderImg ).html();
+				$(sliderImg).prependTo( slider );
+			}
+
+			self._labels = $( ".ui-slider-label", slider );
+
+		}
+
+		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 );
+			});
+
+		this._preventDocumentDrag = function( event ) {
+			// NOTE: we don't do this in refresh because we still want to
+			//       support programmatic alteration of disabled inputs
+			var et = $(event.target);
+			if ( self.dragging && !self.options.disabled && ( ( et.parents( ".ui-slider" ).is( ".ui-toggle-switch" ) && et.parents( ".ui-slider-handle" ).is( ".ui-btn-hover-s" ) ) || ( !$( self.element ).siblings( ".ui-slider" ).is( ".ui-toggle-switch"))) ) {
+
+				// 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;
+			}
+		}
+
+		this._on( $.mobile.$document, { "vmousemove": this._preventDocumentDrag });
+
+		// it appears the clicking the up and down buttons in chrome on
+		// range/number inputs doesn't trigger a change until the field is
+		// blurred. Here we check thif the value has changed and refresh
+		control.bind( "vmouseup", $.proxy( self._checkedRefresh, self));
+
+		slider.bind( "vmousedown", function( event ) {
+			// NOTE: we don't do this in refresh because we still want to
+			//       support programmatic alteration of disabled inputs
+			if ( self.options.disabled ) {
+				return false;
+			}
+
+			self.dragging = true;
+			self.userModified = false;
+			self.mouseMoved = false;
+
+			if ( cType === "select" ) {
+				self.beforeStart = control[0].selectedIndex;
+			}
+
+			self.refresh( event );
+			self._trigger( "start" );
+			return false;
+		})
+		.bind( "vclick", false );
+
+		this._sliderMouseUp = 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;
+				self._trigger( "stop" );
+				return false;
+			}
+		};
+
+		this._on( slider.add( document ), { "vmouseup": this._sliderMouseUp });
+		slider.insertAfter( control );
+
+		// Only add focus class to toggle switch, sliders get it automatically from ui-btn
+		if ( cType === 'select' ) {
+			this.handle.bind({
+				focus: function() {
+					slider.addClass( $.mobile.focusClass );
+				},
+
+				blur: function() {
+					slider.removeClass( $.mobile.focusClass );
+				}
+			});
+		}
+
+		this.handle.bind({
+			// NOTE force focus on handle
+			vmousedown: function() {
+				$( this ).focus();
+			},
+
+			vclick: false,
+
+			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 );
+	},
+
+	_checkedRefresh: function() {
+		if( this.value != this._value() ){
+			this.refresh( this._value() );
+		}
+	},
+
+	_value: function() {
+		return  this._type === "input" ?
+			parseFloat( this.element.val() ) : this.element[0].selectedIndex;
+	},
+
+	refresh: function( val, isfromControl, preventInputUpdate ) {
+
+		// NOTE: we don't return here because we want to support programmatic
+		//       alteration of the input value, which should still update the slider
+		if ( this.options.disabled || this.element.attr('disabled')) {
+			this.disable();
+		}
+
+		// set the stored value for comparison later
+		this.value = this._value();
+
+		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,
+			step = ( cType === "input" && parseFloat( control.attr( "step" ) ) > 0 ) ? parseFloat( control.attr( "step" ) ) : 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() || 0 ) : 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 = ( percent / 100 ) * ( max - min ) + min;
+
+		//from jQuery UI slider, the following source will round to the nearest step
+		var valModStep = ( newval - min ) % step;
+		var alignValue = newval - valModStep;
+
+		if ( Math.abs( valModStep ) * 2 >= step ) {
+			alignValue += ( valModStep > 0 ) ? step : ( -step );
+		}
+		// Since JavaScript has problems with large floats, round
+		// the final value to 5 digits after the decimal point (see jQueryUI: #4124)
+		newval = parseFloat( alignValue.toFixed(5) );
+
+		if ( newval < min ) {
+			newval = min;
+		}
+
+		if ( newval > max ) {
+			newval = max;
+		}
+
+		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: cType === "input" ? newval : control.find( "option" ).eq( newval ).getEncodedText()
+			});
+
+		if( percent === 100 && this.handle.hasClass( "ui-slider-handle-snapping" ) ) {
+			this.handle.removeClass( "ui-toggle-off" );
+			this.handle.addClass( "ui-toggle-on" );
+		} else if ( percent === 0 && this.handle.hasClass( "ui-slider-handle-snapping" ) ) {
+			this.handle.removeClass( "ui-toggle-on" );
+			this.handle.addClass( "ui-toggle-off" );
+		}
+
+		if ( this.valuebg ) {
+			this.valuebg.css( "width", percent + "%" );
+		}
+
+		// drag the label widths
+		if ( this._labels ) {
+			var handlePercent = this.handle.width() / this.slider.width() * 100,
+				aPercent = percent && handlePercent + ( 100 - handlePercent ) * percent / 100,
+				bPercent = percent === 100 ? 0 : Math.min( handlePercent + 100 - aPercent, 100 );
+
+			this._labels.each(function() {
+				var ab = $( this ).is( ".ui-slider-label-a" );
+				$( this ).width( ( ab ? aPercent : bPercent  ) + "%" );
+			});
+		}
+
+		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
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$.mobile.slider.prototype.enhanceWithin( e.target, true );
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.widget( "mobile.selectmenu", $.mobile.widget, {
+	options: {
+		theme: null,
+		disabled: false,
+		icon: "arrow-d",
+		iconpos: "right",
+		inline: false,
+		corners: true,
+		shadow: true,
+		iconshadow: true,
+		overlayTheme: "a",
+		hidePlaceholderMenuItems: true,
+		closeText: "Close",
+		nativeMenu: true,
+		// This option defaults to true on iOS devices.
+		preventFocusZoom: /iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( "AppleWebKit" ) > -1,
+		initSelector: "select:not( :jqmData(role='slider') )",
+		mini: false
+	},
+
+	_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() {
+		var classes = "";
+		// TODO: Post 1.1--once we have time to test thoroughly--any classes manually applied to the original element should be carried over to the enhanced element, with an `-enhanced` suffix. See https://github.com/jquery/jquery-mobile/issues/3577
+		/* if ( $el[0].className.length ) {
+			classes = $el[0].className;
+		} */
+		if ( !!~this.element[0].className.indexOf( "ui-btn-left" ) ) {
+			classes =  " ui-btn-left";
+		}
+
+		if (  !!~this.element[0].className.indexOf( "ui-btn-right" ) ) {
+			classes = " ui-btn-right";
+		}
+
+		this.select = this.element.wrap( "<div class='ui-select" + classes + "'>" );
+		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,
+
+			inline = options.inline ||  $.mobile.getAttrFixed( this.select[0], "data-" + $.mobile.ns + "inline" ),
+			mini = options.mini || $.mobile.getAttrFixed( this.select[0], "data-" + $.mobile.ns + "mini" ),
+			iconpos = options.icon ? ( options.iconpos || $.mobile.getAttrFixed( this.select[0], "data-" + $.mobile.ns + "iconpos" ) ) : false,
+
+			// 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
+				.insertBefore( this.select )
+				.buttonMarkup( {
+					theme: options.theme,
+					icon: options.icon,
+					iconpos: iconpos,
+					inline: inline,
+					corners: options.corners,
+					shadow: options.shadow,
+					iconshadow: options.iconshadow,
+					mini: mini
+				});
+
+		this.setButtonText();
+
+		// TIZEN fix: The TIZEN buttonMarkup patch adds 'ui-btn-icon-only' class to the ui-btn-inner.
+		// It makes the text not to be shown, so the class must be removed. (Like JQM)
+		button.children('.ui-btn-inner').removeClass('ui-btn-icon-only');
+
+		// 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 ) {
+			button.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", function() {
+				self.button.addClass( $.mobile.focusClass );
+			})
+			.bind( "blur", function() {
+				self.button.removeClass( $.mobile.focusClass );
+			})
+			.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 );
+			});
+
+		// In many situations, iOS will zoom into the select upon tap, this prevents that from happening
+		self.button.bind( "vmousedown", function() {
+			if ( self.options.preventFocusZoom ) {
+				$.mobile.zoom.disable( true );
+			}
+		}).bind( "mouseup", function() {
+			if ( self.options.preventFocusZoom ) {
+				setTimeout(function() {
+					$.mobile.zoom.enable( true );
+				}, 0);
+			}
+		});
+	},
+
+	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(),
+			text = this.placeholder,
+			span = $( document.createElement( "span" ) );
+
+		this.button.find( ".ui-btn-text" ).html(function() {
+			if ( selected.length ) {
+				text = selected.map(function() {
+					return $( this ).text();
+				}).get().join( ", " );
+			} else {
+				text = self.placeholder;
+			}
+
+			// TODO possibly aggregate multiple select option classes
+			return span.text( text )
+				.addClass( self.select.attr( "class" ) )
+				.addClass( selected.attr( "class" ) );
+		});
+	},
+
+	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
+$.mobile.$document.bind( "pagecreate create", function( e ) {
+	$.mobile.selectmenu.prototype.enhanceWithin( e.target, true );
+});
+})( 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" ),
+			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>" ),
+
+			listbox =  $( "<div>", { "class": "ui-selectmenu" } ).insertAfter( widget.select ).popup( { theme: "a" } ),
+
+			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 ),
+
+			menuPageContent,
+			menuPageClose,
+			headerClose;
+
+		if ( widget.isMultiple ) {
+			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();
+		}
+
+		$.extend( widget, {
+			select: widget.select,
+			selectID: selectID,
+			buttonId: buttonId,
+			menuId: menuId,
+			thisPage: thisPage,
+			menuPage: menuPage,
+			label: label,
+			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" )
+					.bind( "focusin", function( e ) {
+						$( e.target )
+							.attr( "tabindex", "0" )
+							.trigger( "vmouseover" );
+
+					})
+					.bind( "focusout", function( e ) {
+						$( e.target )
+							.attr( "tabindex", "-1" )
+							.trigger( "vmouseout" );
+					})
+					.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 - otherwise focus clicked item
+						// We need to grab the clicked item the hard way, because the list may have been rebuilt
+						if ( self.isMultiple ) {
+							self.list.find( "li:not(.ui-li-divider)" ).eq( newIndex )
+								.addClass( "ui-btn-down-" + widget.options.theme ).find( "a" ).first().focus();
+						}
+						else {
+							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().not( ".ui-selectmenu-placeholder" );
+
+							if ( prev.is( ".ui-li-divider" ) ) {
+								prev = prev.prev();
+							}
+
+							// if there's a previous option, focus it
+							if ( prev.length ) {
+								target
+									.blur()
+									.attr( "tabindex", "-1" );
+
+								prev.addClass( "ui-btn-down-" + widget.options.theme ).find( "a" ).first().focus();
+							}
+
+							return false;
+							// down or right arrow keys
+						case 40:
+							next = li.next();
+
+							if ( next.is( ".ui-li-divider" ) ) {
+								next = next.next();
+							}
+
+							// if there's a next option, focus it
+							if ( next.length ) {
+								target
+									.blur()
+									.attr( "tabindex", "-1" );
+
+								next.addClass( "ui-btn-down-" + widget.options.theme ).find( "a" ).first().focus();
+							}
+
+							return false;
+							// If enter or space is pressed, trigger click
+						case 13:
+						case 32:
+							target.trigger( "click" );
+
+							return false;
+						}
+					});
+
+				// 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 the popup
+				self.listbox.bind( "popupafterclose", function( event ) {
+					self.close();
+				});
+
+				// Close button on small overlays
+				if ( self.isMultiple ) {
+					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();
+			},
+
+			selected: function() {
+				return this._selectOptions().filter( ":selected:not( :jqmData(placeholder='true') )" );
+			},
+
+			refresh: function( forceRebuild , foo ) {
+				var self = this,
+				select = this.element,
+				isMultiple = this.isMultiple,
+				indicies;
+
+				if (  forceRebuild || this._isRebuildRequired() ) {
+					self._buildList();
+				}
+
+				indicies = this.selectedIndices();
+
+				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 {
+								if ( item.is( ".ui-selectmenu-placeholder" ) ) {
+									item.next().addClass( $.mobile.activeBtnClass );
+								} 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
+					$.mobile.back();
+				} else {
+					self.listbox.popup( "close" );
+					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,
+					$window = $.mobile.$window,
+					selfListParent = self.list.parent(),
+					menuHeight = selfListParent.outerHeight(),
+					menuWidth = selfListParent.outerWidth(),
+					activePage = $( "." + $.mobile.activePageClass ),
+					scrollTop = $window.scrollTop(),
+					btnOffset = self.button.offset().top,
+					screenHeight = $window.height(),
+					screenWidth = $window.width();
+
+				//add active class to button
+				self.button.addClass( $.mobile.activeBtnClass );
+
+				//remove after delay
+				setTimeout( function() {
+					self.button.removeClass( $.mobile.activeBtnClass );
+				}, 300);
+
+				function focusMenuItem() {
+					var selector = self.list.find( "." + $.mobile.activeBtnClass + " a" );
+					if ( selector.length === 0 ) {
+						selector = self.list.find( "li.ui-btn:not( :jqmData(placeholder='true') ) a" );
+					}
+					selector.first().focus().closest( "li" ).addClass( "ui-btn-down-" + widget.options.theme );
+				}
+
+				if ( menuHeight > screenHeight - 80 || !$.support.scrollTop ) {
+
+					self.menuPage.appendTo( $.mobile.pageContainer ).page();
+					self.menuPageContent = menuPage.find( ".ui-content" );
+					self.menuPageClose = menuPage.find( ".ui-header a" );
+
+					// 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() {
+						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.listbox
+						.one( "popupafteropen", focusMenuItem )
+						.popup( "open", {
+							x: self.button.offset().left + self.button.outerWidth() / 2,
+							y: self.button.offset().top + self.button.outerHeight() / 2
+						});
+
+					// 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,
+					needPlaceholder = true,
+					optgroups = [],
+					lis = [],
+					dataIcon = self.isMultiple ? "checkbox-off" : "false";
+
+				self.list.empty().filter( ".ui-listview" ).listview( "destroy" );
+
+				var $options = self.select.find( "option" ),
+					numOptions = $options.length,
+					select = this.select[ 0 ],
+					dataPrefix = 'data-' + $.mobile.ns,
+					dataIndexAttr = dataPrefix + 'option-index',
+					dataIconAttr = dataPrefix + 'icon',
+					dataRoleAttr = dataPrefix + 'role',
+					dataPlaceholderAttr = dataPrefix + 'placeholder',
+					fragment = document.createDocumentFragment(),
+					isPlaceholderItem = false,
+					optGroup;
+
+				for (var i = 0; i < numOptions;i++, isPlaceholderItem = false) {
+					var option = $options[i],
+						$option = $( option ),
+						parent = option.parentNode,
+						text = $option.text(),
+						anchor  = document.createElement( 'a' ),
+						classes = [];
+
+					anchor.setAttribute( 'href', '#' );
+					anchor.appendChild( document.createTextNode( text ) );
+
+					// Are we inside an optgroup?
+					if ( parent !== select && parent.nodeName.toLowerCase() === "optgroup" ) {
+						var optLabel = parent.getAttribute( 'label' );
+						if ( optLabel !== optGroup ) {
+							var divider = document.createElement( 'li' );
+							divider.setAttribute( dataRoleAttr, 'list-divider' );
+							divider.setAttribute( 'role', 'option' );
+							divider.setAttribute( 'tabindex', '-1' );
+							divider.appendChild( document.createTextNode( optLabel ) );
+							fragment.appendChild( divider );
+							optGroup = optLabel;
+						}
+					}
+
+					if ( needPlaceholder && ( !option.getAttribute( "value" ) || text.length === 0 || $option.jqmData( "placeholder" ) ) ) {
+						needPlaceholder = false;
+						isPlaceholderItem = true;
+
+						// If we have identified a placeholder, mark it retroactively in the select as well
+						option.setAttribute( dataPlaceholderAttr, true );
+						if ( o.hidePlaceholderMenuItems ) {
+							classes.push( "ui-selectmenu-placeholder" );
+						}
+						if (!placeholder) {
+							placeholder = self.placeholder = text;
+						}
+					}
+
+					var item = document.createElement('li');
+					if ( option.disabled ) {
+						classes.push( "ui-disabled" );
+						item.setAttribute('aria-disabled',true);
+					}
+					item.setAttribute( dataIndexAttr,i );
+					item.setAttribute( dataIconAttr, dataIcon );
+					if ( isPlaceholderItem ) {
+						item.setAttribute( dataPlaceholderAttr, true );
+					}
+					item.className = classes.join( " " );
+					item.setAttribute( 'role', 'option' );
+					anchor.setAttribute( 'tabindex', '-1' );
+					item.appendChild( anchor );
+					fragment.appendChild( item );
+				}
+
+				self.list[0].appendChild( fragment );
+
+				// 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
+				});
+			}
+		});
+	};
+
+	// issue #3894 - core doesn't trigger events on disabled delegates
+	$.mobile.$document.bind( "selectmenubeforecreate", function( event ) {
+		var selectmenuWidget = $( event.target ).data( "selectmenu" );
+
+		if ( !selectmenuWidget.options.nativeMenu &&
+				selectmenuWidget.element.parents( ":jqmData(role='popup')" ).length === 0 ) {
+			extendSelect( selectmenuWidget );
+		}
+	});
+})( jQuery );
+
+(function( $, undefined ) {
+
+
+	$.widget( "mobile.fixedtoolbar", $.mobile.widget, {
+		options: {
+			visibleOnPageShow: true,
+			disablePageZoom: true,
+			transition: "slide", //can be none, fade, slide (slide maps to slideup or slidedown)
+			fullscreen: false,
+			tapToggle: true,
+			tapToggleBlacklist: "a, button, input, select, textarea, .ui-header-fixed, .ui-footer-fixed, .ui-popup",
+			hideDuringFocus: "input, textarea, select",
+			updatePagePadding: true,
+			trackPersistentToolbars: true,
+
+			// Browser detection! Weeee, here we go...
+			// Unfortunately, position:fixed is costly, not to mention probably impossible, to feature-detect accurately.
+			// Some tests exist, but they currently return false results in critical devices and browsers, which could lead to a broken experience.
+			// Testing fixed positioning is also pretty obtrusive to page load, requiring injected elements and scrolling the window
+			// The following function serves to rule out some popular browsers with known fixed-positioning issues
+			// This is a plugin option like any other, so feel free to improve or overwrite it
+			supportBlacklist: function() {
+				var w = window,
+					ua = navigator.userAgent,
+					platform = navigator.platform,
+					// Rendering engine is Webkit, and capture major version
+					wkmatch = ua.match( /AppleWebKit\/([0-9]+)/ ),
+					wkversion = !!wkmatch && wkmatch[ 1 ],
+					ffmatch = ua.match( /Fennec\/([0-9]+)/ ),
+					ffversion = !!ffmatch && ffmatch[ 1 ],
+					operammobilematch = ua.match( /Opera Mobi\/([0-9]+)/ ),
+					omversion = !!operammobilematch && operammobilematch[ 1 ];
+
+				if(
+					// iOS 4.3 and older : Platform is iPhone/Pad/Touch and Webkit version is less than 534 (ios5)
+					( ( platform.indexOf( "iPhone" ) > -1 || platform.indexOf( "iPad" ) > -1  || platform.indexOf( "iPod" ) > -1 ) && wkversion && wkversion < 534 ) ||
+					// Opera Mini
+					( w.operamini && ({}).toString.call( w.operamini ) === "[object OperaMini]" ) ||
+					( operammobilematch && omversion < 7458 )	||
+					//Android lte 2.1: Platform is Android and Webkit version is less than 533 (Android 2.2)
+					( ua.indexOf( "Android" ) > -1 && wkversion && wkversion < 533 ) ||
+					// Firefox Mobile before 6.0 -
+					( ffversion && ffversion < 6 ) ||
+					// WebOS less than 3
+					( "palmGetResource" in window && wkversion && wkversion < 534 )	||
+					// MeeGo
+					( ua.indexOf( "MeeGo" ) > -1 && ua.indexOf( "NokiaBrowser/8.5.0" ) > -1 ) ) {
+					return true;
+				}
+
+				return false;
+			},
+			initSelector: ":jqmData(position='dummy')"
+		},
+
+		_create: function() {
+
+			var self = this,
+				o = self.options,
+				$el = self.element,
+				tbtype = $el.is( ":jqmData(role='header')" ) ? "header" : "footer",
+				$page = $el.closest( ".ui-page" );
+
+			// Feature detecting support for
+			if ( o.supportBlacklist() ) {
+				self.destroy();
+				return;
+			}
+
+			$el.addClass( "ui-"+ tbtype +"-fixed" );
+
+			// "fullscreen" overlay positioning
+			if ( o.fullscreen ) {
+				$el.addClass( "ui-"+ tbtype +"-fullscreen" );
+				$page.addClass( "ui-page-" + tbtype + "-fullscreen" );
+			}
+			// If not fullscreen, add class to page to set top or bottom padding
+			else{
+				$page.addClass( "ui-page-" + tbtype + "-fixed" );
+			}
+
+			self._addTransitionClass();
+			self._bindPageEvents();
+			self._bindToggleHandlers();
+		},
+
+		_addTransitionClass: function() {
+			var tclass = this.options.transition;
+
+			if ( tclass && tclass !== "none" ) {
+				// use appropriate slide for header or footer
+				if ( tclass === "slide" ) {
+					tclass = this.element.is( ".ui-header" ) ? "slidedown" : "slideup";
+				}
+
+				this.element.addClass( tclass );
+			}
+		},
+
+		_bindPageEvents: function() {
+			var self = this,
+				o = self.options,
+				$el = self.element;
+
+			//page event bindings
+			// Fixed toolbars require page zoom to be disabled, otherwise usability issues crop up
+			// This method is meant to disable zoom while a fixed-positioned toolbar page is visible
+			$el.closest( ".ui-page" )
+				.bind( "pagebeforeshow", function() {
+					if ( o.disablePageZoom ) {
+						$.mobile.zoom.disable( true );
+					}
+					if ( !o.visibleOnPageShow ) {
+						self.hide( true );
+					}
+				} )
+				.bind( "webkitAnimationStart animationstart updatelayout", function() {
+					var thisPage = this;
+					if ( o.updatePagePadding ) {
+						self.updatePagePadding( thisPage );
+					}
+				})
+				.bind( "pageshow", function() {
+					var thisPage = this;
+					self.updatePagePadding( thisPage );
+					if ( o.updatePagePadding ) {
+						$.mobile.$window.bind( "throttledresize." + self.widgetName, function() {
+							self.updatePagePadding( thisPage );
+						});
+					}
+				})
+				.bind( "pagebeforehide", function( e, ui ) {
+					if ( o.disablePageZoom ) {
+						$.mobile.zoom.enable( true );
+					}
+					if ( o.updatePagePadding ) {
+						$.mobile.$window.unbind( "throttledresize." + self.widgetName );
+					}
+
+					if ( o.trackPersistentToolbars ) {
+						var thisFooter = $( ".ui-footer-fixed:jqmData(id)", this ),
+							thisHeader = $( ".ui-header-fixed:jqmData(id)", this ),
+							nextFooter = thisFooter.length && ui.nextPage && $( ".ui-footer-fixed:jqmData(id='" + thisFooter.jqmData( "id" ) + "')", ui.nextPage ) || $(),
+							nextHeader = thisHeader.length && ui.nextPage && $( ".ui-header-fixed:jqmData(id='" + thisHeader.jqmData( "id" ) + "')", ui.nextPage ) || $();
+
+							if ( nextFooter.length || nextHeader.length ) {
+
+								nextFooter.add( nextHeader ).appendTo( $.mobile.pageContainer );
+
+								ui.nextPage.one( "pageshow", function() {
+									nextFooter.add( nextHeader ).appendTo( this );
+								});
+							}
+					}
+				});
+		},
+
+		_visible: true,
+
+		// This will set the content element's top or bottom padding equal to the toolbar's height
+		updatePagePadding: function( tbPage ) {
+			var $el = this.element,
+				header = $el.is( ".ui-header" );
+
+			// This behavior only applies to "fixed", not "fullscreen"
+			if ( this.options.fullscreen ) { return; }
+
+			tbPage = tbPage || $el.closest( ".ui-page" );
+			$( tbPage ).css( "padding-" + ( header ? "top" : "bottom" ), $el.outerHeight() );
+		},
+
+		_useTransition: function( notransition ) {
+			var $win = $.mobile.$window,
+				$el = this.element,
+				scroll = $win.scrollTop(),
+				elHeight = $el.height(),
+				pHeight = $el.closest( ".ui-page" ).height(),
+				viewportHeight = $.mobile.getScreenHeight(),
+				tbtype = $el.is( ":jqmData(role='header')" ) ? "header" : "footer";
+
+			return !notransition &&
+				( this.options.transition && this.options.transition !== "none" &&
+				(
+					( tbtype === "header" && !this.options.fullscreen && scroll > elHeight ) ||
+					( tbtype === "footer" && !this.options.fullscreen && scroll + viewportHeight < pHeight - elHeight )
+				) || this.options.fullscreen
+				);
+		},
+
+		show: function( notransition ) {
+			var hideClass = "ui-fixed-hidden",
+				$el = this.element;
+
+			if ( this._useTransition( notransition ) ) {
+				$el
+					.removeClass( "out " + hideClass )
+					.addClass( "in" );
+			}
+			else {
+				$el.removeClass( hideClass );
+			}
+			this._visible = true;
+		},
+
+		hide: function( notransition ) {
+			var hideClass = "ui-fixed-hidden",
+				$el = this.element,
+				// if it's a slide transition, our new transitions need the reverse class as well to slide outward
+				outclass = "out" + ( this.options.transition === "slide" ? " reverse" : "" );
+
+			if( this._useTransition( notransition ) ) {
+				$el
+					.addClass( outclass )
+					.removeClass( "in" )
+					.animationComplete(function() {
+						$el.addClass( hideClass ).removeClass( outclass );
+					});
+			}
+			else {
+				$el.addClass( hideClass ).removeClass( outclass );
+			}
+			this._visible = false;
+		},
+
+		toggle: function() {
+			this[ this._visible ? "hide" : "show" ]();
+		},
+
+		_bindToggleHandlers: function() {
+			var self = this,
+				o = self.options,
+				$el = self.element;
+
+			// tap toggle
+			$el.closest( ".ui-page" )
+				.bind( "vclick", function( e ) {
+					if ( o.tapToggle && !$( e.target ).closest( o.tapToggleBlacklist ).length ) {
+						self.toggle();
+					}
+				})
+				.bind( "focusin focusout", function( e ) {
+					if ( screen.width < 500 && $( e.target ).is( o.hideDuringFocus ) && !$( e.target ).closest( ".ui-header-fixed, .ui-footer-fixed" ).length ) {
+						self[ ( e.type === "focusin" && self._visible ) ? "hide" : "show" ]();
+					}
+				});
+		},
+
+		destroy: function() {
+			this.element.removeClass( "ui-header-fixed ui-footer-fixed ui-header-fullscreen ui-footer-fullscreen in out fade slidedown slideup ui-fixed-hidden" );
+			this.element.closest( ".ui-page" ).removeClass( "ui-page-header-fixed ui-page-footer-fixed ui-page-header-fullscreen ui-page-footer-fullscreen" );
+		}
+
+	});
+
+	//auto self-init widgets
+	$.mobile.$document
+		.bind( "pagecreate create", function( e ) {
+
+			// DEPRECATED in 1.1: support for data-fullscreen=true|false on the page element.
+			// This line ensures it still works, but we recommend moving the attribute to the toolbars themselves.
+			if ( $( e.target ).jqmData( "fullscreen" ) ) {
+				$( $.mobile.fixedtoolbar.prototype.options.initSelector, e.target ).not( ":jqmData(fullscreen)" ).jqmData( "fullscreen", true );
+			}
+
+			$.mobile.fixedtoolbar.prototype.enhanceWithin( e.target );
+		});
+
+})( jQuery );
+
+(function( $, window ) {
+
+	// This fix addresses an iOS bug, so return early if the UA claims it's something else.
+	if ( !(/iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( "AppleWebKit" ) > -1 ) ) {
+		return;
+	}
+
+  var zoom = $.mobile.zoom,
+		evt, x, y, z, aig;
+
+  function checkTilt( e ) {
+		evt = e.originalEvent;
+		aig = evt.accelerationIncludingGravity;
+
+		x = Math.abs( aig.x );
+		y = Math.abs( aig.y );
+		z = Math.abs( aig.z );
+
+		// If portrait orientation and in one of the danger zones
+    if ( !window.orientation && ( x > 7 || ( ( z > 6 && y < 8 || z < 8 && y > 6 ) && x > 5 ) ) ) {
+			if ( zoom.enabled ) {
+				zoom.disable();
+			}
+    }	else if ( !zoom.enabled ) {
+			zoom.enable();
+    }
+  }
+
+  $.mobile.$window
+		.bind( "orientationchange.iosorientationfix", zoom.enable )
+		.bind( "devicemotion.iosorientationfix", checkTilt );
+
+}( jQuery, this ));
+
+(function( $, window, undefined ) {
+	var	$html = $( "html" ),
+			$head = $( "head" ),
+			$window = $.mobile.$window;
+
+	//remove initial build class (only present on first pageshow)
+	function hideRenderingClass() {
+		$html.removeClass( "ui-mobile-rendering" );
+	}
+
+	// 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" );
+
+	// This is a fallback. If anything goes wrong (JS errors, etc), or events don't fire,
+	// this ensures the rendering class is removed after 5 seconds, so content is visible and accessible
+	setTimeout( hideRenderingClass, 5000 );
+
+	$.extend( $.mobile, {
+		addEventBlocker: function () {
+			$html.addClass( "ui-blocker" );
+			$html.bind( "touchstart touchend vclick mousedown mouseup click", function () {
+				return false;
+			} );
+		},
+
+		removeEventBlocker: function () {
+			$html.removeClass( "ui-blocker" );
+			$html.unbind( "touchstart touchend vclick mousedown mouseup click" );
+		},
+
+		// find and enhance the pages in the dom and transition to the first page.
+		initializePage: function() {
+			// find present pages
+			var $pages = $( ":jqmData(role='page'), :jqmData(role='dialog')" ),
+				hash = $.mobile.path.parseLocation().hash.replace("#", ""),
+				hashPage = document.getElementById( hash );
+
+			// 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.each(function() {
+				var $this = $( this );
+
+				// unless the data url is already set set it to the pathname
+				if ( !$this[0].getAttribute( "data-" + $.mobile.ns + "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 = $.mobile.firstPage.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();
+			$.mobile.addEventBlocker();
+
+			//remove initial build class (only present on first pageshow)
+			hideRenderingClass();
+
+			// if hashchange listening is disabled, there's no hash deeplink,
+			// the hash is not valid (contains more than one # or does not start with #)
+			// or there is no page with that hash, change to the first page in the DOM
+			// Remember, however, that the hash can also be a path!
+			if ( ! ( $.mobile.hashListeningEnabled &&
+				$.mobile.path.isHashValid( location.hash ) &&
+				( $( hashPage ).is( ':jqmData(role="page")' ) ||
+					$.mobile.path.isPath( hash ) ||
+					hash === $.mobile.dialogHashKey ) ) ) {
+
+				// Store the initial destination
+				if ( $.mobile.path.isHashValid( location.hash ) ) {
+					$.mobile.urlHistory.initialDst = hash.replace( "#", "" );
+				}
+				$.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 ] );
+			}
+		}
+	});
+
+	// initialize events now, after mobileinit has occurred
+	$.mobile.navreadyDeferred.resolve();
+
+	// 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 || $.mobile.$window.scrollTop() === 1 ) ? 0 : 1;
+
+
+		// TODO: Implement a proper registration mechanism with dependency handling in order to not have exceptions like the one below
+		//auto self-init widgets for those widgets that have a soft dependency on others
+		if ( $.fn.controlgroup ) {
+			$.mobile.$document.bind( "pagecreate create", function( e ) {
+				$( ":jqmData(role='controlgroup')", e.target )
+					.jqmEnhanceable()
+					.controlgroup({ excludeInvisible: false });
+			});
+		}
+
+		//dom-ready inits
+		if ( $.mobile.autoInitializePage ) {
+			$.mobile.initializePage();
+		}
+
+		// window load event
+		// hide iOS browser chrome on load
+		$window.load( $.mobile.silentScroll );
+
+		if ( !$.support.cssPointerEvents ) {
+			// IE and Opera don't support CSS pointer-events: none that we use to disable link-based buttons
+			// by adding the 'ui-disabled' class to them. Using a JavaScript workaround for those browser.
+			// https://github.com/jquery/jquery-mobile/issues/3558
+
+			$.mobile.$document.delegate( ".ui-disabled", "vclick",
+				function( e ) {
+					e.preventDefault();
+					e.stopImmediatePropagation();
+				}
+			);
+		}
+	});
+}( jQuery, this ));
+
+}));
+
+/*!
+ * 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" ];
+};
+
+window.Globalize = Globalize;
+
+if ( typeof define === "function" ) {
+	define( "globalize/globalize", [], function () { return Globalize; } );
+}
+
+}( window ));
+
+/**
+ * @fileoverview gl-matrix - High performance matrix and vector operations for WebGL
+ * @author Brandon Jones
+ * @author Colin MacKenzie IV
+ * @version 1.3.7
+ */
+
+/*
+ * Copyright (c) 2012 Brandon Jones, Colin MacKenzie IV
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ *    1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ *
+ *    2. Altered source versions must be plainly marked as such, and must not
+ *    be misrepresented as being the original software.
+ *
+ *    3. This notice may not be removed or altered from any source
+ *    distribution.
+ */
+
+// Updated to use a modification of the "returnExportsGlobal" pattern from https://github.com/umdjs/umd
+
+(function (root, factory) {
+    if (typeof exports === 'object') {
+        // Node. Does not work with strict CommonJS, but
+        // only CommonJS-like enviroments that support module.exports,
+        // like Node.
+        module.exports = factory(global);
+    } else if (typeof define === 'function' && define.amd) {
+        // AMD. Register as an anonymous module.
+        define([], function () {
+            return factory(root);
+        });
+    } else {
+        // Specific initialization for TIZEN Web UI Framework
+        root.initGlMatrix = function ( targetRoot ) {
+            factory( targetRoot || root );
+        };
+    }
+}(this, function (root) {
+    "use strict";
+
+    // Tweak to your liking
+    var FLOAT_EPSILON = 0.000001;
+
+    var glMath = {};
+    (function() {
+        if (typeof(Float32Array) != 'undefined') {
+            var y = new Float32Array(1);
+            var i = new Int32Array(y.buffer);
+
+            /**
+             * Fast way to calculate the inverse square root,
+             * see http://jsperf.com/inverse-square-root/5
+             *
+             * If typed arrays are not available, a slower
+             * implementation will be used.
+             *
+             * @param {Number} number the number
+             * @returns {Number} Inverse square root
+             */
+            glMath.invsqrt = function(number) {
+              var x2 = number * 0.5;
+              y[0] = number;
+              var threehalfs = 1.5;
+
+              i[0] = 0x5f3759df - (i[0] >> 1);
+
+              var number2 = y[0];
+
+              return number2 * (threehalfs - (x2 * number2 * number2));
+            };
+        } else {
+            glMath.invsqrt = function(number) { return 1.0 / Math.sqrt(number); };
+        }
+    })();
+
+    /**
+     * @class System-specific optimal array type
+     * @name MatrixArray
+     */
+    var MatrixArray = null;
+    
+    // explicitly sets and returns the type of array to use within glMatrix
+    function setMatrixArrayType(type) {
+        MatrixArray = type;
+        return MatrixArray;
+    }
+
+    // auto-detects and returns the best type of array to use within glMatrix, falling
+    // back to Array if typed arrays are unsupported
+    function determineMatrixArrayType() {
+        MatrixArray = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
+        return MatrixArray;
+    }
+    
+    determineMatrixArrayType();
+
+    /**
+     * @class 3 Dimensional Vector
+     * @name vec3
+     */
+    var vec3 = {};
+     
+    /**
+     * Creates a new instance of a vec3 using the default array type
+     * Any javascript array-like objects containing at least 3 numeric elements can serve as a vec3
+     *
+     * @param {vec3} [vec] vec3 containing values to initialize with
+     *
+     * @returns {vec3} New vec3
+     */
+    vec3.create = function (vec) {
+        var dest = new MatrixArray(3);
+
+        if (vec) {
+            dest[0] = vec[0];
+            dest[1] = vec[1];
+            dest[2] = vec[2];
+        } else {
+            dest[0] = dest[1] = dest[2] = 0;
+        }
+
+        return dest;
+    };
+
+    /**
+     * Creates a new instance of a vec3, initializing it with the given arguments
+     *
+     * @param {number} x X value
+     * @param {number} y Y value
+     * @param {number} z Z value
+
+     * @returns {vec3} New vec3
+     */
+    vec3.createFrom = function (x, y, z) {
+        var dest = new MatrixArray(3);
+
+        dest[0] = x;
+        dest[1] = y;
+        dest[2] = z;
+
+        return dest;
+    };
+
+    /**
+     * Copies the values of one vec3 to another
+     *
+     * @param {vec3} vec vec3 containing values to copy
+     * @param {vec3} dest vec3 receiving copied values
+     *
+     * @returns {vec3} dest
+     */
+    vec3.set = function (vec, dest) {
+        dest[0] = vec[0];
+        dest[1] = vec[1];
+        dest[2] = vec[2];
+
+        return dest;
+    };
+
+    /**
+     * Compares two vectors for equality within a certain margin of error
+     *
+     * @param {vec3} a First vector
+     * @param {vec3} b Second vector
+     *
+     * @returns {Boolean} True if a is equivalent to b
+     */
+    vec3.equal = function (a, b) {
+        return a === b || (
+            Math.abs(a[0] - b[0]) < FLOAT_EPSILON &&
+            Math.abs(a[1] - b[1]) < FLOAT_EPSILON &&
+            Math.abs(a[2] - b[2]) < FLOAT_EPSILON
+        );
+    };
+
+    /**
+     * Performs a vector addition
+     *
+     * @param {vec3} vec First operand
+     * @param {vec3} vec2 Second operand
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.add = function (vec, vec2, dest) {
+        if (!dest || vec === dest) {
+            vec[0] += vec2[0];
+            vec[1] += vec2[1];
+            vec[2] += vec2[2];
+            return vec;
+        }
+
+        dest[0] = vec[0] + vec2[0];
+        dest[1] = vec[1] + vec2[1];
+        dest[2] = vec[2] + vec2[2];
+        return dest;
+    };
+
+    /**
+     * Performs a vector subtraction
+     *
+     * @param {vec3} vec First operand
+     * @param {vec3} vec2 Second operand
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.subtract = function (vec, vec2, dest) {
+        if (!dest || vec === dest) {
+            vec[0] -= vec2[0];
+            vec[1] -= vec2[1];
+            vec[2] -= vec2[2];
+            return vec;
+        }
+
+        dest[0] = vec[0] - vec2[0];
+        dest[1] = vec[1] - vec2[1];
+        dest[2] = vec[2] - vec2[2];
+        return dest;
+    };
+
+    /**
+     * Performs a vector multiplication
+     *
+     * @param {vec3} vec First operand
+     * @param {vec3} vec2 Second operand
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.multiply = function (vec, vec2, dest) {
+        if (!dest || vec === dest) {
+            vec[0] *= vec2[0];
+            vec[1] *= vec2[1];
+            vec[2] *= vec2[2];
+            return vec;
+        }
+
+        dest[0] = vec[0] * vec2[0];
+        dest[1] = vec[1] * vec2[1];
+        dest[2] = vec[2] * vec2[2];
+        return dest;
+    };
+
+    /**
+     * Negates the components of a vec3
+     *
+     * @param {vec3} vec vec3 to negate
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.negate = function (vec, dest) {
+        if (!dest) { dest = vec; }
+
+        dest[0] = -vec[0];
+        dest[1] = -vec[1];
+        dest[2] = -vec[2];
+        return dest;
+    };
+
+    /**
+     * Multiplies the components of a vec3 by a scalar value
+     *
+     * @param {vec3} vec vec3 to scale
+     * @param {number} val Value to scale by
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.scale = function (vec, val, dest) {
+        if (!dest || vec === dest) {
+            vec[0] *= val;
+            vec[1] *= val;
+            vec[2] *= val;
+            return vec;
+        }
+
+        dest[0] = vec[0] * val;
+        dest[1] = vec[1] * val;
+        dest[2] = vec[2] * val;
+        return dest;
+    };
+
+    /**
+     * Generates a unit vector of the same direction as the provided vec3
+     * If vector length is 0, returns [0, 0, 0]
+     *
+     * @param {vec3} vec vec3 to normalize
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.normalize = function (vec, dest) {
+        if (!dest) { dest = vec; }
+
+        var x = vec[0], y = vec[1], z = vec[2],
+            len = Math.sqrt(x * x + y * y + z * z);
+
+        if (!len) {
+            dest[0] = 0;
+            dest[1] = 0;
+            dest[2] = 0;
+            return dest;
+        } else if (len === 1) {
+            dest[0] = x;
+            dest[1] = y;
+            dest[2] = z;
+            return dest;
+        }
+
+        len = 1 / len;
+        dest[0] = x * len;
+        dest[1] = y * len;
+        dest[2] = z * len;
+        return dest;
+    };
+
+    /**
+     * Generates the cross product of two vec3s
+     *
+     * @param {vec3} vec First operand
+     * @param {vec3} vec2 Second operand
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.cross = function (vec, vec2, dest) {
+        if (!dest) { dest = vec; }
+
+        var x = vec[0], y = vec[1], z = vec[2],
+            x2 = vec2[0], y2 = vec2[1], z2 = vec2[2];
+
+        dest[0] = y * z2 - z * y2;
+        dest[1] = z * x2 - x * z2;
+        dest[2] = x * y2 - y * x2;
+        return dest;
+    };
+
+    /**
+     * Caclulates the length of a vec3
+     *
+     * @param {vec3} vec vec3 to calculate length of
+     *
+     * @returns {number} Length of vec
+     */
+    vec3.length = function (vec) {
+        var x = vec[0], y = vec[1], z = vec[2];
+        return Math.sqrt(x * x + y * y + z * z);
+    };
+
+    /**
+     * Caclulates the squared length of a vec3
+     *
+     * @param {vec3} vec vec3 to calculate squared length of
+     *
+     * @returns {number} Squared Length of vec
+     */
+    vec3.squaredLength = function (vec) {
+        var x = vec[0], y = vec[1], z = vec[2];
+        return x * x + y * y + z * z;
+    };
+
+    /**
+     * Caclulates the dot product of two vec3s
+     *
+     * @param {vec3} vec First operand
+     * @param {vec3} vec2 Second operand
+     *
+     * @returns {number} Dot product of vec and vec2
+     */
+    vec3.dot = function (vec, vec2) {
+        return vec[0] * vec2[0] + vec[1] * vec2[1] + vec[2] * vec2[2];
+    };
+
+    /**
+     * Generates a unit vector pointing from one vector to another
+     *
+     * @param {vec3} vec Origin vec3
+     * @param {vec3} vec2 vec3 to point to
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.direction = function (vec, vec2, dest) {
+        if (!dest) { dest = vec; }
+
+        var x = vec[0] - vec2[0],
+            y = vec[1] - vec2[1],
+            z = vec[2] - vec2[2],
+            len = Math.sqrt(x * x + y * y + z * z);
+
+        if (!len) {
+            dest[0] = 0;
+            dest[1] = 0;
+            dest[2] = 0;
+            return dest;
+        }
+
+        len = 1 / len;
+        dest[0] = x * len;
+        dest[1] = y * len;
+        dest[2] = z * len;
+        return dest;
+    };
+
+    /**
+     * Performs a linear interpolation between two vec3
+     *
+     * @param {vec3} vec First vector
+     * @param {vec3} vec2 Second vector
+     * @param {number} lerp Interpolation amount between the two inputs
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.lerp = function (vec, vec2, lerp, dest) {
+        if (!dest) { dest = vec; }
+
+        dest[0] = vec[0] + lerp * (vec2[0] - vec[0]);
+        dest[1] = vec[1] + lerp * (vec2[1] - vec[1]);
+        dest[2] = vec[2] + lerp * (vec2[2] - vec[2]);
+
+        return dest;
+    };
+
+    /**
+     * Calculates the euclidian distance between two vec3
+     *
+     * Params:
+     * @param {vec3} vec First vector
+     * @param {vec3} vec2 Second vector
+     *
+     * @returns {number} Distance between vec and vec2
+     */
+    vec3.dist = function (vec, vec2) {
+        var x = vec2[0] - vec[0],
+            y = vec2[1] - vec[1],
+            z = vec2[2] - vec[2];
+            
+        return Math.sqrt(x*x + y*y + z*z);
+    };
+
+    // Pre-allocated to prevent unecessary garbage collection
+    var unprojectMat = null;
+    var unprojectVec = new MatrixArray(4);
+    /**
+     * Projects the specified vec3 from screen space into object space
+     * Based on the <a href="http://webcvs.freedesktop.org/mesa/Mesa/src/glu/mesa/project.c?revision=1.4&view=markup">Mesa gluUnProject implementation</a>
+     *
+     * @param {vec3} vec Screen-space vector to project
+     * @param {mat4} view View matrix
+     * @param {mat4} proj Projection matrix
+     * @param {vec4} viewport Viewport as given to gl.viewport [x, y, width, height]
+     * @param {vec3} [dest] vec3 receiving unprojected result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    vec3.unproject = function (vec, view, proj, viewport, dest) {
+        if (!dest) { dest = vec; }
+
+        if(!unprojectMat) {
+            unprojectMat = mat4.create();
+        }
+
+        var m = unprojectMat;
+        var v = unprojectVec;
+        
+        v[0] = (vec[0] - viewport[0]) * 2.0 / viewport[2] - 1.0;
+        v[1] = (vec[1] - viewport[1]) * 2.0 / viewport[3] - 1.0;
+        v[2] = 2.0 * vec[2] - 1.0;
+        v[3] = 1.0;
+        
+        mat4.multiply(proj, view, m);
+        if(!mat4.inverse(m)) { return null; }
+        
+        mat4.multiplyVec4(m, v);
+        if(v[3] === 0.0) { return null; }
+
+        dest[0] = v[0] / v[3];
+        dest[1] = v[1] / v[3];
+        dest[2] = v[2] / v[3];
+        
+        return dest;
+    };
+
+    var xUnitVec3 = vec3.createFrom(1,0,0);
+    var yUnitVec3 = vec3.createFrom(0,1,0);
+    var zUnitVec3 = vec3.createFrom(0,0,1);
+
+    var tmpvec3 = vec3.create();
+    /**
+     * Generates a quaternion of rotation between two given normalized vectors
+     *
+     * @param {vec3} a Normalized source vector
+     * @param {vec3} b Normalized target vector
+     * @param {quat4} [dest] quat4 receiving operation result.
+     *
+     * @returns {quat4} dest if specified, a new quat4 otherwise
+     */
+    vec3.rotationTo = function (a, b, dest) {
+        if (!dest) { dest = quat4.create(); }
+        
+        var d = vec3.dot(a, b);
+        var axis = tmpvec3;
+        if (d >= 1.0) {
+            quat4.set(identityQuat4, dest);
+        } else if (d < (0.000001 - 1.0)) {
+            vec3.cross(xUnitVec3, a, axis);
+            if (vec3.length(axis) < 0.000001)
+                vec3.cross(yUnitVec3, a, axis);
+            if (vec3.length(axis) < 0.000001)
+                vec3.cross(zUnitVec3, a, axis);
+            vec3.normalize(axis);
+            quat4.fromAngleAxis(Math.PI, axis, dest);
+        } else {
+            var s = Math.sqrt((1.0 + d) * 2.0);
+            var sInv = 1.0 / s;
+            vec3.cross(a, b, axis);
+            dest[0] = axis[0] * sInv;
+            dest[1] = axis[1] * sInv;
+            dest[2] = axis[2] * sInv;
+            dest[3] = s * 0.5;
+            quat4.normalize(dest);
+        }
+        if (dest[3] > 1.0) dest[3] = 1.0;
+        else if (dest[3] < -1.0) dest[3] = -1.0;
+        return dest;
+    };
+
+    /**
+     * Returns a string representation of a vector
+     *
+     * @param {vec3} vec Vector to represent as a string
+     *
+     * @returns {string} String representation of vec
+     */
+    vec3.str = function (vec) {
+        return '[' + vec[0] + ', ' + vec[1] + ', ' + vec[2] + ']';
+    };
+
+    /**
+     * @class 3x3 Matrix
+     * @name mat3
+     */
+    var mat3 = {};
+
+    /**
+     * Creates a new instance of a mat3 using the default array type
+     * Any javascript array-like object containing at least 9 numeric elements can serve as a mat3
+     *
+     * @param {mat3} [mat] mat3 containing values to initialize with
+     *
+     * @returns {mat3} New mat3
+     */
+    mat3.create = function (mat) {
+        var dest = new MatrixArray(9);
+
+        if (mat) {
+            dest[0] = mat[0];
+            dest[1] = mat[1];
+            dest[2] = mat[2];
+            dest[3] = mat[3];
+            dest[4] = mat[4];
+            dest[5] = mat[5];
+            dest[6] = mat[6];
+            dest[7] = mat[7];
+            dest[8] = mat[8];
+        } else {
+            dest[0] = dest[1] =
+            dest[2] = dest[3] =
+            dest[4] = dest[5] =
+            dest[6] = dest[7] =
+            dest[8] = 0;
+        }
+
+        return dest;
+    };
+
+    /**
+     * Creates a new instance of a mat3, initializing it with the given arguments
+     *
+     * @param {number} m00
+     * @param {number} m01
+     * @param {number} m02
+     * @param {number} m10
+     * @param {number} m11
+     * @param {number} m12
+     * @param {number} m20
+     * @param {number} m21
+     * @param {number} m22
+
+     * @returns {mat3} New mat3
+     */
+    mat3.createFrom = function (m00, m01, m02, m10, m11, m12, m20, m21, m22) {
+        var dest = new MatrixArray(9);
+
+        dest[0] = m00;
+        dest[1] = m01;
+        dest[2] = m02;
+        dest[3] = m10;
+        dest[4] = m11;
+        dest[5] = m12;
+        dest[6] = m20;
+        dest[7] = m21;
+        dest[8] = m22;
+
+        return dest;
+    };
+
+    /**
+     * Calculates the determinant of a mat3
+     *
+     * @param {mat3} mat mat3 to calculate determinant of
+     *
+     * @returns {Number} determinant of mat
+     */
+    mat3.determinant = function (mat) {
+        var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+            a10 = mat[3], a11 = mat[4], a12 = mat[5],
+            a20 = mat[6], a21 = mat[7], a22 = mat[8];
+
+        return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);
+    };
+
+    /**
+     * Calculates the inverse matrix of a mat3
+     *
+     * @param {mat3} mat mat3 to calculate inverse of
+     * @param {mat3} [dest] mat3 receiving inverse matrix. If not specified result is written to mat
+     *
+     * @param {mat3} dest is specified, mat otherwise, null if matrix cannot be inverted
+     */
+    mat3.inverse = function (mat, dest) {
+        var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+            a10 = mat[3], a11 = mat[4], a12 = mat[5],
+            a20 = mat[6], a21 = mat[7], a22 = mat[8],
+
+            b01 = a22 * a11 - a12 * a21,
+            b11 = -a22 * a10 + a12 * a20,
+            b21 = a21 * a10 - a11 * a20,
+
+            d = a00 * b01 + a01 * b11 + a02 * b21,
+            id;
+
+        if (!d) { return null; }
+        id = 1 / d;
+
+        if (!dest) { dest = mat3.create(); }
+
+        dest[0] = b01 * id;
+        dest[1] = (-a22 * a01 + a02 * a21) * id;
+        dest[2] = (a12 * a01 - a02 * a11) * id;
+        dest[3] = b11 * id;
+        dest[4] = (a22 * a00 - a02 * a20) * id;
+        dest[5] = (-a12 * a00 + a02 * a10) * id;
+        dest[6] = b21 * id;
+        dest[7] = (-a21 * a00 + a01 * a20) * id;
+        dest[8] = (a11 * a00 - a01 * a10) * id;
+        return dest;
+    };
+    
+    /**
+     * Performs a matrix multiplication
+     *
+     * @param {mat3} mat First operand
+     * @param {mat3} mat2 Second operand
+     * @param {mat3} [dest] mat3 receiving operation result. If not specified result is written to mat
+     *
+     * @returns {mat3} dest if specified, mat otherwise
+     */
+    mat3.multiply = function (mat, mat2, dest) {
+        if (!dest) { dest = mat; }
+        
+
+        // Cache the matrix values (makes for huge speed increases!)
+        var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+            a10 = mat[3], a11 = mat[4], a12 = mat[5],
+            a20 = mat[6], a21 = mat[7], a22 = mat[8],
+
+            b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
+            b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
+            b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
+
+        dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
+        dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
+        dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
+
+        dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
+        dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
+        dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
+
+        dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
+        dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
+        dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
+
+        return dest;
+    };
+
+    /**
+     * Transforms the vec2 according to the given mat3.
+     *
+     * @param {mat3} matrix mat3 to multiply against
+     * @param {vec2} vec    the vector to multiply
+     * @param {vec2} [dest] an optional receiving vector. If not given, vec is used.
+     *
+     * @returns {vec2} The multiplication result
+     **/
+    mat3.multiplyVec2 = function(matrix, vec, dest) {
+      if (!dest) dest = vec;
+      var x = vec[0], y = vec[1];
+      dest[0] = x * matrix[0] + y * matrix[3] + matrix[6];
+      dest[1] = x * matrix[1] + y * matrix[4] + matrix[7];
+      return dest;
+    };
+
+    /**
+     * Transforms the vec3 according to the given mat3
+     *
+     * @param {mat3} matrix mat3 to multiply against
+     * @param {vec3} vec    the vector to multiply
+     * @param {vec3} [dest] an optional receiving vector. If not given, vec is used.
+     *
+     * @returns {vec3} The multiplication result
+     **/
+    mat3.multiplyVec3 = function(matrix, vec, dest) {
+      if (!dest) dest = vec;
+      var x = vec[0], y = vec[1], z = vec[2];
+      dest[0] = x * matrix[0] + y * matrix[3] + z * matrix[6];
+      dest[1] = x * matrix[1] + y * matrix[4] + z * matrix[7];
+      dest[2] = x * matrix[2] + y * matrix[5] + z * matrix[8];
+      
+      return dest;
+    };
+
+    /**
+     * Copies the values of one mat3 to another
+     *
+     * @param {mat3} mat mat3 containing values to copy
+     * @param {mat3} dest mat3 receiving copied values
+     *
+     * @returns {mat3} dest
+     */
+    mat3.set = function (mat, dest) {
+        dest[0] = mat[0];
+        dest[1] = mat[1];
+        dest[2] = mat[2];
+        dest[3] = mat[3];
+        dest[4] = mat[4];
+        dest[5] = mat[5];
+        dest[6] = mat[6];
+        dest[7] = mat[7];
+        dest[8] = mat[8];
+        return dest;
+    };
+
+    /**
+     * Compares two matrices for equality within a certain margin of error
+     *
+     * @param {mat3} a First matrix
+     * @param {mat3} b Second matrix
+     *
+     * @returns {Boolean} True if a is equivalent to b
+     */
+    mat3.equal = function (a, b) {
+        return a === b || (
+            Math.abs(a[0] - b[0]) < FLOAT_EPSILON &&
+            Math.abs(a[1] - b[1]) < FLOAT_EPSILON &&
+            Math.abs(a[2] - b[2]) < FLOAT_EPSILON &&
+            Math.abs(a[3] - b[3]) < FLOAT_EPSILON &&
+            Math.abs(a[4] - b[4]) < FLOAT_EPSILON &&
+            Math.abs(a[5] - b[5]) < FLOAT_EPSILON &&
+            Math.abs(a[6] - b[6]) < FLOAT_EPSILON &&
+            Math.abs(a[7] - b[7]) < FLOAT_EPSILON &&
+            Math.abs(a[8] - b[8]) < FLOAT_EPSILON
+        );
+    };
+
+    /**
+     * Sets a mat3 to an identity matrix
+     *
+     * @param {mat3} dest mat3 to set
+     *
+     * @returns dest if specified, otherwise a new mat3
+     */
+    mat3.identity = function (dest) {
+        if (!dest) { dest = mat3.create(); }
+        dest[0] = 1;
+        dest[1] = 0;
+        dest[2] = 0;
+        dest[3] = 0;
+        dest[4] = 1;
+        dest[5] = 0;
+        dest[6] = 0;
+        dest[7] = 0;
+        dest[8] = 1;
+        return dest;
+    };
+
+    /**
+     * Transposes a mat3 (flips the values over the diagonal)
+     *
+     * Params:
+     * @param {mat3} mat mat3 to transpose
+     * @param {mat3} [dest] mat3 receiving transposed values. If not specified result is written to mat
+     *
+     * @returns {mat3} dest is specified, mat otherwise
+     */
+    mat3.transpose = function (mat, dest) {
+        // If we are transposing ourselves we can skip a few steps but have to cache some values
+        if (!dest || mat === dest) {
+            var a01 = mat[1], a02 = mat[2],
+                a12 = mat[5];
+
+            mat[1] = mat[3];
+            mat[2] = mat[6];
+            mat[3] = a01;
+            mat[5] = mat[7];
+            mat[6] = a02;
+            mat[7] = a12;
+            return mat;
+        }
+
+        dest[0] = mat[0];
+        dest[1] = mat[3];
+        dest[2] = mat[6];
+        dest[3] = mat[1];
+        dest[4] = mat[4];
+        dest[5] = mat[7];
+        dest[6] = mat[2];
+        dest[7] = mat[5];
+        dest[8] = mat[8];
+        return dest;
+    };
+
+    /**
+     * Copies the elements of a mat3 into the upper 3x3 elements of a mat4
+     *
+     * @param {mat3} mat mat3 containing values to copy
+     * @param {mat4} [dest] mat4 receiving copied values
+     *
+     * @returns {mat4} dest if specified, a new mat4 otherwise
+     */
+    mat3.toMat4 = function (mat, dest) {
+        if (!dest) { dest = mat4.create(); }
+
+        dest[15] = 1;
+        dest[14] = 0;
+        dest[13] = 0;
+        dest[12] = 0;
+
+        dest[11] = 0;
+        dest[10] = mat[8];
+        dest[9] = mat[7];
+        dest[8] = mat[6];
+
+        dest[7] = 0;
+        dest[6] = mat[5];
+        dest[5] = mat[4];
+        dest[4] = mat[3];
+
+        dest[3] = 0;
+        dest[2] = mat[2];
+        dest[1] = mat[1];
+        dest[0] = mat[0];
+
+        return dest;
+    };
+
+    /**
+     * Returns a string representation of a mat3
+     *
+     * @param {mat3} mat mat3 to represent as a string
+     *
+     * @param {string} String representation of mat
+     */
+    mat3.str = function (mat) {
+        return '[' + mat[0] + ', ' + mat[1] + ', ' + mat[2] +
+            ', ' + mat[3] + ', ' + mat[4] + ', ' + mat[5] +
+            ', ' + mat[6] + ', ' + mat[7] + ', ' + mat[8] + ']';
+    };
+
+    /**
+     * @class 4x4 Matrix
+     * @name mat4
+     */
+    var mat4 = {};
+
+    /**
+     * Creates a new instance of a mat4 using the default array type
+     * Any javascript array-like object containing at least 16 numeric elements can serve as a mat4
+     *
+     * @param {mat4} [mat] mat4 containing values to initialize with
+     *
+     * @returns {mat4} New mat4
+     */
+    mat4.create = function (mat) {
+        var dest = new MatrixArray(16);
+
+        if (mat) {
+            dest[0] = mat[0];
+            dest[1] = mat[1];
+            dest[2] = mat[2];
+            dest[3] = mat[3];
+            dest[4] = mat[4];
+            dest[5] = mat[5];
+            dest[6] = mat[6];
+            dest[7] = mat[7];
+            dest[8] = mat[8];
+            dest[9] = mat[9];
+            dest[10] = mat[10];
+            dest[11] = mat[11];
+            dest[12] = mat[12];
+            dest[13] = mat[13];
+            dest[14] = mat[14];
+            dest[15] = mat[15];
+        }
+
+        return dest;
+    };
+
+    /**
+     * Creates a new instance of a mat4, initializing it with the given arguments
+     *
+     * @param {number} m00
+     * @param {number} m01
+     * @param {number} m02
+     * @param {number} m03
+     * @param {number} m10
+     * @param {number} m11
+     * @param {number} m12
+     * @param {number} m13
+     * @param {number} m20
+     * @param {number} m21
+     * @param {number} m22
+     * @param {number} m23
+     * @param {number} m30
+     * @param {number} m31
+     * @param {number} m32
+     * @param {number} m33
+
+     * @returns {mat4} New mat4
+     */
+    mat4.createFrom = function (m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {
+        var dest = new MatrixArray(16);
+
+        dest[0] = m00;
+        dest[1] = m01;
+        dest[2] = m02;
+        dest[3] = m03;
+        dest[4] = m10;
+        dest[5] = m11;
+        dest[6] = m12;
+        dest[7] = m13;
+        dest[8] = m20;
+        dest[9] = m21;
+        dest[10] = m22;
+        dest[11] = m23;
+        dest[12] = m30;
+        dest[13] = m31;
+        dest[14] = m32;
+        dest[15] = m33;
+
+        return dest;
+    };
+
+    /**
+     * Copies the values of one mat4 to another
+     *
+     * @param {mat4} mat mat4 containing values to copy
+     * @param {mat4} dest mat4 receiving copied values
+     *
+     * @returns {mat4} dest
+     */
+    mat4.set = function (mat, dest) {
+        dest[0] = mat[0];
+        dest[1] = mat[1];
+        dest[2] = mat[2];
+        dest[3] = mat[3];
+        dest[4] = mat[4];
+        dest[5] = mat[5];
+        dest[6] = mat[6];
+        dest[7] = mat[7];
+        dest[8] = mat[8];
+        dest[9] = mat[9];
+        dest[10] = mat[10];
+        dest[11] = mat[11];
+        dest[12] = mat[12];
+        dest[13] = mat[13];
+        dest[14] = mat[14];
+        dest[15] = mat[15];
+        return dest;
+    };
+
+    /**
+     * Compares two matrices for equality within a certain margin of error
+     *
+     * @param {mat4} a First matrix
+     * @param {mat4} b Second matrix
+     *
+     * @returns {Boolean} True if a is equivalent to b
+     */
+    mat4.equal = function (a, b) {
+        return a === b || (
+            Math.abs(a[0] - b[0]) < FLOAT_EPSILON &&
+            Math.abs(a[1] - b[1]) < FLOAT_EPSILON &&
+            Math.abs(a[2] - b[2]) < FLOAT_EPSILON &&
+            Math.abs(a[3] - b[3]) < FLOAT_EPSILON &&
+            Math.abs(a[4] - b[4]) < FLOAT_EPSILON &&
+            Math.abs(a[5] - b[5]) < FLOAT_EPSILON &&
+            Math.abs(a[6] - b[6]) < FLOAT_EPSILON &&
+            Math.abs(a[7] - b[7]) < FLOAT_EPSILON &&
+            Math.abs(a[8] - b[8]) < FLOAT_EPSILON &&
+            Math.abs(a[9] - b[9]) < FLOAT_EPSILON &&
+            Math.abs(a[10] - b[10]) < FLOAT_EPSILON &&
+            Math.abs(a[11] - b[11]) < FLOAT_EPSILON &&
+            Math.abs(a[12] - b[12]) < FLOAT_EPSILON &&
+            Math.abs(a[13] - b[13]) < FLOAT_EPSILON &&
+            Math.abs(a[14] - b[14]) < FLOAT_EPSILON &&
+            Math.abs(a[15] - b[15]) < FLOAT_EPSILON
+        );
+    };
+
+    /**
+     * Sets a mat4 to an identity matrix
+     *
+     * @param {mat4} dest mat4 to set
+     *
+     * @returns {mat4} dest
+     */
+    mat4.identity = function (dest) {
+        if (!dest) { dest = mat4.create(); }
+        dest[0] = 1;
+        dest[1] = 0;
+        dest[2] = 0;
+        dest[3] = 0;
+        dest[4] = 0;
+        dest[5] = 1;
+        dest[6] = 0;
+        dest[7] = 0;
+        dest[8] = 0;
+        dest[9] = 0;
+        dest[10] = 1;
+        dest[11] = 0;
+        dest[12] = 0;
+        dest[13] = 0;
+        dest[14] = 0;
+        dest[15] = 1;
+        return dest;
+    };
+
+    /**
+     * Transposes a mat4 (flips the values over the diagonal)
+     *
+     * @param {mat4} mat mat4 to transpose
+     * @param {mat4} [dest] mat4 receiving transposed values. If not specified result is written to mat
+     *
+     * @param {mat4} dest is specified, mat otherwise
+     */
+    mat4.transpose = function (mat, dest) {
+        // If we are transposing ourselves we can skip a few steps but have to cache some values
+        if (!dest || mat === dest) {
+            var a01 = mat[1], a02 = mat[2], a03 = mat[3],
+                a12 = mat[6], a13 = mat[7],
+                a23 = mat[11];
+
+            mat[1] = mat[4];
+            mat[2] = mat[8];
+            mat[3] = mat[12];
+            mat[4] = a01;
+            mat[6] = mat[9];
+            mat[7] = mat[13];
+            mat[8] = a02;
+            mat[9] = a12;
+            mat[11] = mat[14];
+            mat[12] = a03;
+            mat[13] = a13;
+            mat[14] = a23;
+            return mat;
+        }
+
+        dest[0] = mat[0];
+        dest[1] = mat[4];
+        dest[2] = mat[8];
+        dest[3] = mat[12];
+        dest[4] = mat[1];
+        dest[5] = mat[5];
+        dest[6] = mat[9];
+        dest[7] = mat[13];
+        dest[8] = mat[2];
+        dest[9] = mat[6];
+        dest[10] = mat[10];
+        dest[11] = mat[14];
+        dest[12] = mat[3];
+        dest[13] = mat[7];
+        dest[14] = mat[11];
+        dest[15] = mat[15];
+        return dest;
+    };
+
+    /**
+     * Calculates the determinant of a mat4
+     *
+     * @param {mat4} mat mat4 to calculate determinant of
+     *
+     * @returns {number} determinant of mat
+     */
+    mat4.determinant = function (mat) {
+        // Cache the matrix values (makes for huge speed increases!)
+        var a00 = mat[0], a01 = mat[1], a02 = mat[2], a03 = mat[3],
+            a10 = mat[4], a11 = mat[5], a12 = mat[6], a13 = mat[7],
+            a20 = mat[8], a21 = mat[9], a22 = mat[10], a23 = mat[11],
+            a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
+
+        return (a30 * a21 * a12 * a03 - a20 * a31 * a12 * a03 - a30 * a11 * a22 * a03 + a10 * a31 * a22 * a03 +
+                a20 * a11 * a32 * a03 - a10 * a21 * a32 * a03 - a30 * a21 * a02 * a13 + a20 * a31 * a02 * a13 +
+                a30 * a01 * a22 * a13 - a00 * a31 * a22 * a13 - a20 * a01 * a32 * a13 + a00 * a21 * a32 * a13 +
+                a30 * a11 * a02 * a23 - a10 * a31 * a02 * a23 - a30 * a01 * a12 * a23 + a00 * a31 * a12 * a23 +
+                a10 * a01 * a32 * a23 - a00 * a11 * a32 * a23 - a20 * a11 * a02 * a33 + a10 * a21 * a02 * a33 +
+                a20 * a01 * a12 * a33 - a00 * a21 * a12 * a33 - a10 * a01 * a22 * a33 + a00 * a11 * a22 * a33);
+    };
+
+    /**
+     * Calculates the inverse matrix of a mat4
+     *
+     * @param {mat4} mat mat4 to calculate inverse of
+     * @param {mat4} [dest] mat4 receiving inverse matrix. If not specified result is written to mat
+     *
+     * @param {mat4} dest is specified, mat otherwise, null if matrix cannot be inverted
+     */
+    mat4.inverse = function (mat, dest) {
+        if (!dest) { dest = mat; }
+
+        // Cache the matrix values (makes for huge speed increases!)
+        var a00 = mat[0], a01 = mat[1], a02 = mat[2], a03 = mat[3],
+            a10 = mat[4], a11 = mat[5], a12 = mat[6], a13 = mat[7],
+            a20 = mat[8], a21 = mat[9], a22 = mat[10], a23 = mat[11],
+            a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15],
+
+            b00 = a00 * a11 - a01 * a10,
+            b01 = a00 * a12 - a02 * a10,
+            b02 = a00 * a13 - a03 * a10,
+            b03 = a01 * a12 - a02 * a11,
+            b04 = a01 * a13 - a03 * a11,
+            b05 = a02 * a13 - a03 * a12,
+            b06 = a20 * a31 - a21 * a30,
+            b07 = a20 * a32 - a22 * a30,
+            b08 = a20 * a33 - a23 * a30,
+            b09 = a21 * a32 - a22 * a31,
+            b10 = a21 * a33 - a23 * a31,
+            b11 = a22 * a33 - a23 * a32,
+
+            d = (b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06),
+            invDet;
+
+            // Calculate the determinant
+            if (!d) { return null; }
+            invDet = 1 / d;
+
+        dest[0] = (a11 * b11 - a12 * b10 + a13 * b09) * invDet;
+        dest[1] = (-a01 * b11 + a02 * b10 - a03 * b09) * invDet;
+        dest[2] = (a31 * b05 - a32 * b04 + a33 * b03) * invDet;
+        dest[3] = (-a21 * b05 + a22 * b04 - a23 * b03) * invDet;
+        dest[4] = (-a10 * b11 + a12 * b08 - a13 * b07) * invDet;
+        dest[5] = (a00 * b11 - a02 * b08 + a03 * b07) * invDet;
+        dest[6] = (-a30 * b05 + a32 * b02 - a33 * b01) * invDet;
+        dest[7] = (a20 * b05 - a22 * b02 + a23 * b01) * invDet;
+        dest[8] = (a10 * b10 - a11 * b08 + a13 * b06) * invDet;
+        dest[9] = (-a00 * b10 + a01 * b08 - a03 * b06) * invDet;
+        dest[10] = (a30 * b04 - a31 * b02 + a33 * b00) * invDet;
+        dest[11] = (-a20 * b04 + a21 * b02 - a23 * b00) * invDet;
+        dest[12] = (-a10 * b09 + a11 * b07 - a12 * b06) * invDet;
+        dest[13] = (a00 * b09 - a01 * b07 + a02 * b06) * invDet;
+        dest[14] = (-a30 * b03 + a31 * b01 - a32 * b00) * invDet;
+        dest[15] = (a20 * b03 - a21 * b01 + a22 * b00) * invDet;
+
+        return dest;
+    };
+
+    /**
+     * Copies the upper 3x3 elements of a mat4 into another mat4
+     *
+     * @param {mat4} mat mat4 containing values to copy
+     * @param {mat4} [dest] mat4 receiving copied values
+     *
+     * @returns {mat4} dest is specified, a new mat4 otherwise
+     */
+    mat4.toRotationMat = function (mat, dest) {
+        if (!dest) { dest = mat4.create(); }
+
+        dest[0] = mat[0];
+        dest[1] = mat[1];
+        dest[2] = mat[2];
+        dest[3] = mat[3];
+        dest[4] = mat[4];
+        dest[5] = mat[5];
+        dest[6] = mat[6];
+        dest[7] = mat[7];
+        dest[8] = mat[8];
+        dest[9] = mat[9];
+        dest[10] = mat[10];
+        dest[11] = mat[11];
+        dest[12] = 0;
+        dest[13] = 0;
+        dest[14] = 0;
+        dest[15] = 1;
+
+        return dest;
+    };
+
+    /**
+     * Copies the upper 3x3 elements of a mat4 into a mat3
+     *
+     * @param {mat4} mat mat4 containing values to copy
+     * @param {mat3} [dest] mat3 receiving copied values
+     *
+     * @returns {mat3} dest is specified, a new mat3 otherwise
+     */
+    mat4.toMat3 = function (mat, dest) {
+        if (!dest) { dest = mat3.create(); }
+
+        dest[0] = mat[0];
+        dest[1] = mat[1];
+        dest[2] = mat[2];
+        dest[3] = mat[4];
+        dest[4] = mat[5];
+        dest[5] = mat[6];
+        dest[6] = mat[8];
+        dest[7] = mat[9];
+        dest[8] = mat[10];
+
+        return dest;
+    };
+
+    /**
+     * Calculates the inverse of the upper 3x3 elements of a mat4 and copies the result into a mat3
+     * The resulting matrix is useful for calculating transformed normals
+     *
+     * Params:
+     * @param {mat4} mat mat4 containing values to invert and copy
+     * @param {mat3} [dest] mat3 receiving values
+     *
+     * @returns {mat3} dest is specified, a new mat3 otherwise, null if the matrix cannot be inverted
+     */
+    mat4.toInverseMat3 = function (mat, dest) {
+        // Cache the matrix values (makes for huge speed increases!)
+        var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+            a10 = mat[4], a11 = mat[5], a12 = mat[6],
+            a20 = mat[8], a21 = mat[9], a22 = mat[10],
+
+            b01 = a22 * a11 - a12 * a21,
+            b11 = -a22 * a10 + a12 * a20,
+            b21 = a21 * a10 - a11 * a20,
+
+            d = a00 * b01 + a01 * b11 + a02 * b21,
+            id;
+
+        if (!d) { return null; }
+        id = 1 / d;
+
+        if (!dest) { dest = mat3.create(); }
+
+        dest[0] = b01 * id;
+        dest[1] = (-a22 * a01 + a02 * a21) * id;
+        dest[2] = (a12 * a01 - a02 * a11) * id;
+        dest[3] = b11 * id;
+        dest[4] = (a22 * a00 - a02 * a20) * id;
+        dest[5] = (-a12 * a00 + a02 * a10) * id;
+        dest[6] = b21 * id;
+        dest[7] = (-a21 * a00 + a01 * a20) * id;
+        dest[8] = (a11 * a00 - a01 * a10) * id;
+
+        return dest;
+    };
+
+    /**
+     * Performs a matrix multiplication
+     *
+     * @param {mat4} mat First operand
+     * @param {mat4} mat2 Second operand
+     * @param {mat4} [dest] mat4 receiving operation result. If not specified result is written to mat
+     *
+     * @returns {mat4} dest if specified, mat otherwise
+     */
+    mat4.multiply = function (mat, mat2, dest) {
+        if (!dest) { dest = mat; }
+
+        // Cache the matrix values (makes for huge speed increases!)
+        var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
+        var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
+        var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
+        var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
+
+        // Cache only the current line of the second matrix
+        var b0  = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];  
+        dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+        dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+        dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+        dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+        b0 = mat2[4];
+        b1 = mat2[5];
+        b2 = mat2[6];
+        b3 = mat2[7];
+        dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+        dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+        dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+        dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+        b0 = mat2[8];
+        b1 = mat2[9];
+        b2 = mat2[10];
+        b3 = mat2[11];
+        dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+        dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+        dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+        dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+        b0 = mat2[12];
+        b1 = mat2[13];
+        b2 = mat2[14];
+        b3 = mat2[15];
+        dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+        dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+        dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+        dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+        return dest;
+    };
+
+    /**
+     * Transforms a vec3 with the given matrix
+     * 4th vector component is implicitly '1'
+     *
+     * @param {mat4} mat mat4 to transform the vector with
+     * @param {vec3} vec vec3 to transform
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec3} dest if specified, vec otherwise
+     */
+    mat4.multiplyVec3 = function (mat, vec, dest) {
+        if (!dest) { dest = vec; }
+
+        var x = vec[0], y = vec[1], z = vec[2];
+
+        dest[0] = mat[0] * x + mat[4] * y + mat[8] * z + mat[12];
+        dest[1] = mat[1] * x + mat[5] * y + mat[9] * z + mat[13];
+        dest[2] = mat[2] * x + mat[6] * y + mat[10] * z + mat[14];
+
+        return dest;
+    };
+
+    /**
+     * Transforms a vec4 with the given matrix
+     *
+     * @param {mat4} mat mat4 to transform the vector with
+     * @param {vec4} vec vec4 to transform
+     * @param {vec4} [dest] vec4 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec4} dest if specified, vec otherwise
+     */
+    mat4.multiplyVec4 = function (mat, vec, dest) {
+        if (!dest) { dest = vec; }
+
+        var x = vec[0], y = vec[1], z = vec[2], w = vec[3];
+
+        dest[0] = mat[0] * x + mat[4] * y + mat[8] * z + mat[12] * w;
+        dest[1] = mat[1] * x + mat[5] * y + mat[9] * z + mat[13] * w;
+        dest[2] = mat[2] * x + mat[6] * y + mat[10] * z + mat[14] * w;
+        dest[3] = mat[3] * x + mat[7] * y + mat[11] * z + mat[15] * w;
+
+        return dest;
+    };
+
+    /**
+     * Translates a matrix by the given vector
+     *
+     * @param {mat4} mat mat4 to translate
+     * @param {vec3} vec vec3 specifying the translation
+     * @param {mat4} [dest] mat4 receiving operation result. If not specified result is written to mat
+     *
+     * @returns {mat4} dest if specified, mat otherwise
+     */
+    mat4.translate = function (mat, vec, dest) {
+        var x = vec[0], y = vec[1], z = vec[2],
+            a00, a01, a02, a03,
+            a10, a11, a12, a13,
+            a20, a21, a22, a23;
+
+        if (!dest || mat === dest) {
+            mat[12] = mat[0] * x + mat[4] * y + mat[8] * z + mat[12];
+            mat[13] = mat[1] * x + mat[5] * y + mat[9] * z + mat[13];
+            mat[14] = mat[2] * x + mat[6] * y + mat[10] * z + mat[14];
+            mat[15] = mat[3] * x + mat[7] * y + mat[11] * z + mat[15];
+            return mat;
+        }
+
+        a00 = mat[0]; a01 = mat[1]; a02 = mat[2]; a03 = mat[3];
+        a10 = mat[4]; a11 = mat[5]; a12 = mat[6]; a13 = mat[7];
+        a20 = mat[8]; a21 = mat[9]; a22 = mat[10]; a23 = mat[11];
+
+        dest[0] = a00; dest[1] = a01; dest[2] = a02; dest[3] = a03;
+        dest[4] = a10; dest[5] = a11; dest[6] = a12; dest[7] = a13;
+        dest[8] = a20; dest[9] = a21; dest[10] = a22; dest[11] = a23;
+
+        dest[12] = a00 * x + a10 * y + a20 * z + mat[12];
+        dest[13] = a01 * x + a11 * y + a21 * z + mat[13];
+        dest[14] = a02 * x + a12 * y + a22 * z + mat[14];
+        dest[15] = a03 * x + a13 * y + a23 * z + mat[15];
+        return dest;
+    };
+
+    /**
+     * Scales a matrix by the given vector
+     *
+     * @param {mat4} mat mat4 to scale
+     * @param {vec3} vec vec3 specifying the scale for each axis
+     * @param {mat4} [dest] mat4 receiving operation result. If not specified result is written to mat
+     *
+     * @param {mat4} dest if specified, mat otherwise
+     */
+    mat4.scale = function (mat, vec, dest) {
+        var x = vec[0], y = vec[1], z = vec[2];
+
+        if (!dest || mat === dest) {
+            mat[0] *= x;
+            mat[1] *= x;
+            mat[2] *= x;
+            mat[3] *= x;
+            mat[4] *= y;
+            mat[5] *= y;
+            mat[6] *= y;
+            mat[7] *= y;
+            mat[8] *= z;
+            mat[9] *= z;
+            mat[10] *= z;
+            mat[11] *= z;
+            return mat;
+        }
+
+        dest[0] = mat[0] * x;
+        dest[1] = mat[1] * x;
+        dest[2] = mat[2] * x;
+        dest[3] = mat[3] * x;
+        dest[4] = mat[4] * y;
+        dest[5] = mat[5] * y;
+        dest[6] = mat[6] * y;
+        dest[7] = mat[7] * y;
+        dest[8] = mat[8] * z;
+        dest[9] = mat[9] * z;
+        dest[10] = mat[10] * z;
+        dest[11] = mat[11] * z;
+        dest[12] = mat[12];
+        dest[13] = mat[13];
+        dest[14] = mat[14];
+        dest[15] = mat[15];
+        return dest;
+    };
+
+    /**
+     * Rotates a matrix by the given angle around the specified axis
+     * If rotating around a primary axis (X,Y,Z) one of the specialized rotation functions should be used instead for performance
+     *
+     * @param {mat4} mat mat4 to rotate
+     * @param {number} angle Angle (in radians) to rotate
+     * @param {vec3} axis vec3 representing the axis to rotate around
+     * @param {mat4} [dest] mat4 receiving operation result. If not specified result is written to mat
+     *
+     * @returns {mat4} dest if specified, mat otherwise
+     */
+    mat4.rotate = function (mat, angle, axis, dest) {
+        var x = axis[0], y = axis[1], z = axis[2],
+            len = Math.sqrt(x * x + y * y + z * z),
+            s, c, t,
+            a00, a01, a02, a03,
+            a10, a11, a12, a13,
+            a20, a21, a22, a23,
+            b00, b01, b02,
+            b10, b11, b12,
+            b20, b21, b22;
+
+        if (!len) { return null; }
+        if (len !== 1) {
+            len = 1 / len;
+            x *= len;
+            y *= len;
+            z *= len;
+        }
+
+        s = Math.sin(angle);
+        c = Math.cos(angle);
+        t = 1 - c;
+
+        a00 = mat[0]; a01 = mat[1]; a02 = mat[2]; a03 = mat[3];
+        a10 = mat[4]; a11 = mat[5]; a12 = mat[6]; a13 = mat[7];
+        a20 = mat[8]; a21 = mat[9]; a22 = mat[10]; a23 = mat[11];
+
+        // Construct the elements of the rotation matrix
+        b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s;
+        b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s;
+        b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c;
+
+        if (!dest) {
+            dest = mat;
+        } else if (mat !== dest) { // If the source and destination differ, copy the unchanged last row
+            dest[12] = mat[12];
+            dest[13] = mat[13];
+            dest[14] = mat[14];
+            dest[15] = mat[15];
+        }
+
+        // Perform rotation-specific matrix multiplication
+        dest[0] = a00 * b00 + a10 * b01 + a20 * b02;
+        dest[1] = a01 * b00 + a11 * b01 + a21 * b02;
+        dest[2] = a02 * b00 + a12 * b01 + a22 * b02;
+        dest[3] = a03 * b00 + a13 * b01 + a23 * b02;
+
+        dest[4] = a00 * b10 + a10 * b11 + a20 * b12;
+        dest[5] = a01 * b10 + a11 * b11 + a21 * b12;
+        dest[6] = a02 * b10 + a12 * b11 + a22 * b12;
+        dest[7] = a03 * b10 + a13 * b11 + a23 * b12;
+
+        dest[8] = a00 * b20 + a10 * b21 + a20 * b22;
+        dest[9] = a01 * b20 + a11 * b21 + a21 * b22;
+        dest[10] = a02 * b20 + a12 * b21 + a22 * b22;
+        dest[11] = a03 * b20 + a13 * b21 + a23 * b22;
+        return dest;
+    };
+
+    /**
+     * Rotates a matrix by the given angle around the X axis
+     *
+     * @param {mat4} mat mat4 to rotate
+     * @param {number} angle Angle (in radians) to rotate
+     * @param {mat4} [dest] mat4 receiving operation result. If not specified result is written to mat
+     *
+     * @returns {mat4} dest if specified, mat otherwise
+     */
+    mat4.rotateX = function (mat, angle, dest) {
+        var s = Math.sin(angle),
+            c = Math.cos(angle),
+            a10 = mat[4],
+            a11 = mat[5],
+            a12 = mat[6],
+            a13 = mat[7],
+            a20 = mat[8],
+            a21 = mat[9],
+            a22 = mat[10],
+            a23 = mat[11];
+
+        if (!dest) {
+            dest = mat;
+        } else if (mat !== dest) { // If the source and destination differ, copy the unchanged rows
+            dest[0] = mat[0];
+            dest[1] = mat[1];
+            dest[2] = mat[2];
+            dest[3] = mat[3];
+
+            dest[12] = mat[12];
+            dest[13] = mat[13];
+            dest[14] = mat[14];
+            dest[15] = mat[15];
+        }
+
+        // Perform axis-specific matrix multiplication
+        dest[4] = a10 * c + a20 * s;
+        dest[5] = a11 * c + a21 * s;
+        dest[6] = a12 * c + a22 * s;
+        dest[7] = a13 * c + a23 * s;
+
+        dest[8] = a10 * -s + a20 * c;
+        dest[9] = a11 * -s + a21 * c;
+        dest[10] = a12 * -s + a22 * c;
+        dest[11] = a13 * -s + a23 * c;
+        return dest;
+    };
+
+    /**
+     * Rotates a matrix by the given angle around the Y axis
+     *
+     * @param {mat4} mat mat4 to rotate
+     * @param {number} angle Angle (in radians) to rotate
+     * @param {mat4} [dest] mat4 receiving operation result. If not specified result is written to mat
+     *
+     * @returns {mat4} dest if specified, mat otherwise
+     */
+    mat4.rotateY = function (mat, angle, dest) {
+        var s = Math.sin(angle),
+            c = Math.cos(angle),
+            a00 = mat[0],
+            a01 = mat[1],
+            a02 = mat[2],
+            a03 = mat[3],
+            a20 = mat[8],
+            a21 = mat[9],
+            a22 = mat[10],
+            a23 = mat[11];
+
+        if (!dest) {
+            dest = mat;
+        } else if (mat !== dest) { // If the source and destination differ, copy the unchanged rows
+            dest[4] = mat[4];
+            dest[5] = mat[5];
+            dest[6] = mat[6];
+            dest[7] = mat[7];
+
+            dest[12] = mat[12];
+            dest[13] = mat[13];
+            dest[14] = mat[14];
+            dest[15] = mat[15];
+        }
+
+        // Perform axis-specific matrix multiplication
+        dest[0] = a00 * c + a20 * -s;
+        dest[1] = a01 * c + a21 * -s;
+        dest[2] = a02 * c + a22 * -s;
+        dest[3] = a03 * c + a23 * -s;
+
+        dest[8] = a00 * s + a20 * c;
+        dest[9] = a01 * s + a21 * c;
+        dest[10] = a02 * s + a22 * c;
+        dest[11] = a03 * s + a23 * c;
+        return dest;
+    };
+
+    /**
+     * Rotates a matrix by the given angle around the Z axis
+     *
+     * @param {mat4} mat mat4 to rotate
+     * @param {number} angle Angle (in radians) to rotate
+     * @param {mat4} [dest] mat4 receiving operation result. If not specified result is written to mat
+     *
+     * @returns {mat4} dest if specified, mat otherwise
+     */
+    mat4.rotateZ = function (mat, angle, dest) {
+        var s = Math.sin(angle),
+            c = Math.cos(angle),
+            a00 = mat[0],
+            a01 = mat[1],
+            a02 = mat[2],
+            a03 = mat[3],
+            a10 = mat[4],
+            a11 = mat[5],
+            a12 = mat[6],
+            a13 = mat[7];
+
+        if (!dest) {
+            dest = mat;
+        } else if (mat !== dest) { // If the source and destination differ, copy the unchanged last row
+            dest[8] = mat[8];
+            dest[9] = mat[9];
+            dest[10] = mat[10];
+            dest[11] = mat[11];
+
+            dest[12] = mat[12];
+            dest[13] = mat[13];
+            dest[14] = mat[14];
+            dest[15] = mat[15];
+        }
+
+        // Perform axis-specific matrix multiplication
+        dest[0] = a00 * c + a10 * s;
+        dest[1] = a01 * c + a11 * s;
+        dest[2] = a02 * c + a12 * s;
+        dest[3] = a03 * c + a13 * s;
+
+        dest[4] = a00 * -s + a10 * c;
+        dest[5] = a01 * -s + a11 * c;
+        dest[6] = a02 * -s + a12 * c;
+        dest[7] = a03 * -s + a13 * c;
+
+        return dest;
+    };
+
+    /**
+     * Generates a frustum matrix with the given bounds
+     *
+     * @param {number} left Left bound of the frustum
+     * @param {number} right Right bound of the frustum
+     * @param {number} bottom Bottom bound of the frustum
+     * @param {number} top Top bound of the frustum
+     * @param {number} near Near bound of the frustum
+     * @param {number} far Far bound of the frustum
+     * @param {mat4} [dest] mat4 frustum matrix will be written into
+     *
+     * @returns {mat4} dest if specified, a new mat4 otherwise
+     */
+    mat4.frustum = function (left, right, bottom, top, near, far, dest) {
+        if (!dest) { dest = mat4.create(); }
+        var rl = (right - left),
+            tb = (top - bottom),
+            fn = (far - near);
+        dest[0] = (near * 2) / rl;
+        dest[1] = 0;
+        dest[2] = 0;
+        dest[3] = 0;
+        dest[4] = 0;
+        dest[5] = (near * 2) / tb;
+        dest[6] = 0;
+        dest[7] = 0;
+        dest[8] = (right + left) / rl;
+        dest[9] = (top + bottom) / tb;
+        dest[10] = -(far + near) / fn;
+        dest[11] = -1;
+        dest[12] = 0;
+        dest[13] = 0;
+        dest[14] = -(far * near * 2) / fn;
+        dest[15] = 0;
+        return dest;
+    };
+
+    /**
+     * Generates a perspective projection matrix with the given bounds
+     *
+     * @param {number} fovy Vertical field of view
+     * @param {number} aspect Aspect ratio. typically viewport width/height
+     * @param {number} near Near bound of the frustum
+     * @param {number} far Far bound of the frustum
+     * @param {mat4} [dest] mat4 frustum matrix will be written into
+     *
+     * @returns {mat4} dest if specified, a new mat4 otherwise
+     */
+    mat4.perspective = function (fovy, aspect, near, far, dest) {
+        var top = near * Math.tan(fovy * Math.PI / 360.0),
+            right = top * aspect;
+        return mat4.frustum(-right, right, -top, top, near, far, dest);
+    };
+
+    /**
+     * Generates a orthogonal projection matrix with the given bounds
+     *
+     * @param {number} left Left bound of the frustum
+     * @param {number} right Right bound of the frustum
+     * @param {number} bottom Bottom bound of the frustum
+     * @param {number} top Top bound of the frustum
+     * @param {number} near Near bound of the frustum
+     * @param {number} far Far bound of the frustum
+     * @param {mat4} [dest] mat4 frustum matrix will be written into
+     *
+     * @returns {mat4} dest if specified, a new mat4 otherwise
+     */
+    mat4.ortho = function (left, right, bottom, top, near, far, dest) {
+        if (!dest) { dest = mat4.create(); }
+        var rl = (right - left),
+            tb = (top - bottom),
+            fn = (far - near);
+        dest[0] = 2 / rl;
+        dest[1] = 0;
+        dest[2] = 0;
+        dest[3] = 0;
+        dest[4] = 0;
+        dest[5] = 2 / tb;
+        dest[6] = 0;
+        dest[7] = 0;
+        dest[8] = 0;
+        dest[9] = 0;
+        dest[10] = -2 / fn;
+        dest[11] = 0;
+        dest[12] = -(left + right) / rl;
+        dest[13] = -(top + bottom) / tb;
+        dest[14] = -(far + near) / fn;
+        dest[15] = 1;
+        return dest;
+    };
+
+    /**
+     * Generates a look-at matrix with the given eye position, focal point, and up axis
+     *
+     * @param {vec3} eye Position of the viewer
+     * @param {vec3} center Point the viewer is looking at
+     * @param {vec3} up vec3 pointing "up"
+     * @param {mat4} [dest] mat4 frustum matrix will be written into
+     *
+     * @returns {mat4} dest if specified, a new mat4 otherwise
+     */
+    mat4.lookAt = function (eye, center, up, dest) {
+        if (!dest) { dest = mat4.create(); }
+
+        var x0, x1, x2, y0, y1, y2, z0, z1, z2, len,
+            eyex = eye[0],
+            eyey = eye[1],
+            eyez = eye[2],
+            upx = up[0],
+            upy = up[1],
+            upz = up[2],
+            centerx = center[0],
+            centery = center[1],
+            centerz = center[2];
+
+        if (eyex === centerx && eyey === centery && eyez === centerz) {
+            return mat4.identity(dest);
+        }
+
+        //vec3.direction(eye, center, z);
+        z0 = eyex - centerx;
+        z1 = eyey - centery;
+        z2 = eyez - centerz;
+
+        // normalize (no check needed for 0 because of early return)
+        len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);
+        z0 *= len;
+        z1 *= len;
+        z2 *= len;
+
+        //vec3.normalize(vec3.cross(up, z, x));
+        x0 = upy * z2 - upz * z1;
+        x1 = upz * z0 - upx * z2;
+        x2 = upx * z1 - upy * z0;
+        len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);
+        if (!len) {
+            x0 = 0;
+            x1 = 0;
+            x2 = 0;
+        } else {
+            len = 1 / len;
+            x0 *= len;
+            x1 *= len;
+            x2 *= len;
+        }
+
+        //vec3.normalize(vec3.cross(z, x, y));
+        y0 = z1 * x2 - z2 * x1;
+        y1 = z2 * x0 - z0 * x2;
+        y2 = z0 * x1 - z1 * x0;
+
+        len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);
+        if (!len) {
+            y0 = 0;
+            y1 = 0;
+            y2 = 0;
+        } else {
+            len = 1 / len;
+            y0 *= len;
+            y1 *= len;
+            y2 *= len;
+        }
+
+        dest[0] = x0;
+        dest[1] = y0;
+        dest[2] = z0;
+        dest[3] = 0;
+        dest[4] = x1;
+        dest[5] = y1;
+        dest[6] = z1;
+        dest[7] = 0;
+        dest[8] = x2;
+        dest[9] = y2;
+        dest[10] = z2;
+        dest[11] = 0;
+        dest[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);
+        dest[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);
+        dest[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);
+        dest[15] = 1;
+
+        return dest;
+    };
+
+    /**
+     * Creates a matrix from a quaternion rotation and vector translation
+     * This is equivalent to (but much faster than):
+     *
+     *     mat4.identity(dest);
+     *     mat4.translate(dest, vec);
+     *     var quatMat = mat4.create();
+     *     quat4.toMat4(quat, quatMat);
+     *     mat4.multiply(dest, quatMat);
+     *
+     * @param {quat4} quat Rotation quaternion
+     * @param {vec3} vec Translation vector
+     * @param {mat4} [dest] mat4 receiving operation result. If not specified result is written to a new mat4
+     *
+     * @returns {mat4} dest if specified, a new mat4 otherwise
+     */
+    mat4.fromRotationTranslation = function (quat, vec, dest) {
+        if (!dest) { dest = mat4.create(); }
+
+        // Quaternion math
+        var x = quat[0], y = quat[1], z = quat[2], w = quat[3],
+            x2 = x + x,
+            y2 = y + y,
+            z2 = z + z,
+
+            xx = x * x2,
+            xy = x * y2,
+            xz = x * z2,
+            yy = y * y2,
+            yz = y * z2,
+            zz = z * z2,
+            wx = w * x2,
+            wy = w * y2,
+            wz = w * z2;
+
+        dest[0] = 1 - (yy + zz);
+        dest[1] = xy + wz;
+        dest[2] = xz - wy;
+        dest[3] = 0;
+        dest[4] = xy - wz;
+        dest[5] = 1 - (xx + zz);
+        dest[6] = yz + wx;
+        dest[7] = 0;
+        dest[8] = xz + wy;
+        dest[9] = yz - wx;
+        dest[10] = 1 - (xx + yy);
+        dest[11] = 0;
+        dest[12] = vec[0];
+        dest[13] = vec[1];
+        dest[14] = vec[2];
+        dest[15] = 1;
+        
+        return dest;
+    };
+
+    /**
+     * Returns a string representation of a mat4
+     *
+     * @param {mat4} mat mat4 to represent as a string
+     *
+     * @returns {string} String representation of mat
+     */
+    mat4.str = function (mat) {
+        return '[' + mat[0] + ', ' + mat[1] + ', ' + mat[2] + ', ' + mat[3] +
+            ', ' + mat[4] + ', ' + mat[5] + ', ' + mat[6] + ', ' + mat[7] +
+            ', ' + mat[8] + ', ' + mat[9] + ', ' + mat[10] + ', ' + mat[11] +
+            ', ' + mat[12] + ', ' + mat[13] + ', ' + mat[14] + ', ' + mat[15] + ']';
+    };
+
+    /**
+     * @class Quaternion
+     * @name quat4
+     */
+    var quat4 = {};
+
+    /**
+     * Creates a new instance of a quat4 using the default array type
+     * Any javascript array containing at least 4 numeric elements can serve as a quat4
+     *
+     * @param {quat4} [quat] quat4 containing values to initialize with
+     *
+     * @returns {quat4} New quat4
+     */
+    quat4.create = function (quat) {
+        var dest = new MatrixArray(4);
+
+        if (quat) {
+            dest[0] = quat[0];
+            dest[1] = quat[1];
+            dest[2] = quat[2];
+            dest[3] = quat[3];
+        } else {
+            dest[0] = dest[1] = dest[2] = dest[3] = 0;
+        }
+
+        return dest;
+    };
+
+    /**
+     * Creates a new instance of a quat4, initializing it with the given arguments
+     *
+     * @param {number} x X value
+     * @param {number} y Y value
+     * @param {number} z Z value
+     * @param {number} w W value
+
+     * @returns {quat4} New quat4
+     */
+    quat4.createFrom = function (x, y, z, w) {
+        var dest = new MatrixArray(4);
+
+        dest[0] = x;
+        dest[1] = y;
+        dest[2] = z;
+        dest[3] = w;
+
+        return dest;
+    };
+
+    /**
+     * Copies the values of one quat4 to another
+     *
+     * @param {quat4} quat quat4 containing values to copy
+     * @param {quat4} dest quat4 receiving copied values
+     *
+     * @returns {quat4} dest
+     */
+    quat4.set = function (quat, dest) {
+        dest[0] = quat[0];
+        dest[1] = quat[1];
+        dest[2] = quat[2];
+        dest[3] = quat[3];
+
+        return dest;
+    };
+
+    /**
+     * Compares two quaternions for equality within a certain margin of error
+     *
+     * @param {quat4} a First vector
+     * @param {quat4} b Second vector
+     *
+     * @returns {Boolean} True if a is equivalent to b
+     */
+    quat4.equal = function (a, b) {
+        return a === b || (
+            Math.abs(a[0] - b[0]) < FLOAT_EPSILON &&
+            Math.abs(a[1] - b[1]) < FLOAT_EPSILON &&
+            Math.abs(a[2] - b[2]) < FLOAT_EPSILON &&
+            Math.abs(a[3] - b[3]) < FLOAT_EPSILON
+        );
+    };
+
+    /**
+     * Creates a new identity Quat4
+     *
+     * @param {quat4} [dest] quat4 receiving copied values
+     *
+     * @returns {quat4} dest is specified, new quat4 otherwise
+     */
+    quat4.identity = function (dest) {
+        if (!dest) { dest = quat4.create(); }
+        dest[0] = 0;
+        dest[1] = 0;
+        dest[2] = 0;
+        dest[3] = 1;
+        return dest;
+    };
+
+    var identityQuat4 = quat4.identity();
+
+    /**
+     * Calculates the W component of a quat4 from the X, Y, and Z components.
+     * Assumes that quaternion is 1 unit in length.
+     * Any existing W component will be ignored.
+     *
+     * @param {quat4} quat quat4 to calculate W component of
+     * @param {quat4} [dest] quat4 receiving calculated values. If not specified result is written to quat
+     *
+     * @returns {quat4} dest if specified, quat otherwise
+     */
+    quat4.calculateW = function (quat, dest) {
+        var x = quat[0], y = quat[1], z = quat[2];
+
+        if (!dest || quat === dest) {
+            quat[3] = -Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));
+            return quat;
+        }
+        dest[0] = x;
+        dest[1] = y;
+        dest[2] = z;
+        dest[3] = -Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));
+        return dest;
+    };
+
+    /**
+     * Calculates the dot product of two quaternions
+     *
+     * @param {quat4} quat First operand
+     * @param {quat4} quat2 Second operand
+     *
+     * @return {number} Dot product of quat and quat2
+     */
+    quat4.dot = function(quat, quat2){
+        return quat[0]*quat2[0] + quat[1]*quat2[1] + quat[2]*quat2[2] + quat[3]*quat2[3];
+    };
+
+    /**
+     * Calculates the inverse of a quat4
+     *
+     * @param {quat4} quat quat4 to calculate inverse of
+     * @param {quat4} [dest] quat4 receiving inverse values. If not specified result is written to quat
+     *
+     * @returns {quat4} dest if specified, quat otherwise
+     */
+    quat4.inverse = function(quat, dest) {
+        var q0 = quat[0], q1 = quat[1], q2 = quat[2], q3 = quat[3],
+            dot = q0*q0 + q1*q1 + q2*q2 + q3*q3,
+            invDot = dot ? 1.0/dot : 0;
+        
+        // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0
+        
+        if(!dest || quat === dest) {
+            quat[0] *= -invDot;
+            quat[1] *= -invDot;
+            quat[2] *= -invDot;
+            quat[3] *= invDot;
+            return quat;
+        }
+        dest[0] = -quat[0]*invDot;
+        dest[1] = -quat[1]*invDot;
+        dest[2] = -quat[2]*invDot;
+        dest[3] = quat[3]*invDot;
+        return dest;
+    };
+
+
+    /**
+     * Calculates the conjugate of a quat4
+     * If the quaternion is normalized, this function is faster than quat4.inverse and produces the same result.
+     *
+     * @param {quat4} quat quat4 to calculate conjugate of
+     * @param {quat4} [dest] quat4 receiving conjugate values. If not specified result is written to quat
+     *
+     * @returns {quat4} dest if specified, quat otherwise
+     */
+    quat4.conjugate = function (quat, dest) {
+        if (!dest || quat === dest) {
+            quat[0] *= -1;
+            quat[1] *= -1;
+            quat[2] *= -1;
+            return quat;
+        }
+        dest[0] = -quat[0];
+        dest[1] = -quat[1];
+        dest[2] = -quat[2];
+        dest[3] = quat[3];
+        return dest;
+    };
+
+    /**
+     * Calculates the length of a quat4
+     *
+     * Params:
+     * @param {quat4} quat quat4 to calculate length of
+     *
+     * @returns Length of quat
+     */
+    quat4.length = function (quat) {
+        var x = quat[0], y = quat[1], z = quat[2], w = quat[3];
+        return Math.sqrt(x * x + y * y + z * z + w * w);
+    };
+
+    /**
+     * Generates a unit quaternion of the same direction as the provided quat4
+     * If quaternion length is 0, returns [0, 0, 0, 0]
+     *
+     * @param {quat4} quat quat4 to normalize
+     * @param {quat4} [dest] quat4 receiving operation result. If not specified result is written to quat
+     *
+     * @returns {quat4} dest if specified, quat otherwise
+     */
+    quat4.normalize = function (quat, dest) {
+        if (!dest) { dest = quat; }
+
+        var x = quat[0], y = quat[1], z = quat[2], w = quat[3],
+            len = Math.sqrt(x * x + y * y + z * z + w * w);
+        if (len === 0) {
+            dest[0] = 0;
+            dest[1] = 0;
+            dest[2] = 0;
+            dest[3] = 0;
+            return dest;
+        }
+        len = 1 / len;
+        dest[0] = x * len;
+        dest[1] = y * len;
+        dest[2] = z * len;
+        dest[3] = w * len;
+
+        return dest;
+    };
+
+    /**
+     * Performs quaternion addition
+     *
+     * @param {quat4} quat First operand
+     * @param {quat4} quat2 Second operand
+     * @param {quat4} [dest] quat4 receiving operation result. If not specified result is written to quat
+     *
+     * @returns {quat4} dest if specified, quat otherwise
+     */
+    quat4.add = function (quat, quat2, dest) {
+        if(!dest || quat === dest) {
+            quat[0] += quat2[0];
+            quat[1] += quat2[1];
+            quat[2] += quat2[2];
+            quat[3] += quat2[3];
+            return quat;
+        }
+        dest[0] = quat[0]+quat2[0];
+        dest[1] = quat[1]+quat2[1];
+        dest[2] = quat[2]+quat2[2];
+        dest[3] = quat[3]+quat2[3];
+        return dest;
+    };
+
+    /**
+     * Performs a quaternion multiplication
+     *
+     * @param {quat4} quat First operand
+     * @param {quat4} quat2 Second operand
+     * @param {quat4} [dest] quat4 receiving operation result. If not specified result is written to quat
+     *
+     * @returns {quat4} dest if specified, quat otherwise
+     */
+    quat4.multiply = function (quat, quat2, dest) {
+        if (!dest) { dest = quat; }
+
+        var qax = quat[0], qay = quat[1], qaz = quat[2], qaw = quat[3],
+            qbx = quat2[0], qby = quat2[1], qbz = quat2[2], qbw = quat2[3];
+
+        dest[0] = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
+        dest[1] = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
+        dest[2] = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
+        dest[3] = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
+
+        return dest;
+    };
+
+    /**
+     * Transforms a vec3 with the given quaternion
+     *
+     * @param {quat4} quat quat4 to transform the vector with
+     * @param {vec3} vec vec3 to transform
+     * @param {vec3} [dest] vec3 receiving operation result. If not specified result is written to vec
+     *
+     * @returns dest if specified, vec otherwise
+     */
+    quat4.multiplyVec3 = function (quat, vec, dest) {
+        if (!dest) { dest = vec; }
+
+        var x = vec[0], y = vec[1], z = vec[2],
+            qx = quat[0], qy = quat[1], qz = quat[2], qw = quat[3],
+
+            // calculate quat * vec
+            ix = qw * x + qy * z - qz * y,
+            iy = qw * y + qz * x - qx * z,
+            iz = qw * z + qx * y - qy * x,
+            iw = -qx * x - qy * y - qz * z;
+
+        // calculate result * inverse quat
+        dest[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;
+        dest[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;
+        dest[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;
+
+        return dest;
+    };
+
+    /**
+     * Multiplies the components of a quaternion by a scalar value
+     *
+     * @param {quat4} quat to scale
+     * @param {number} val Value to scale by
+     * @param {quat4} [dest] quat4 receiving operation result. If not specified result is written to quat
+     *
+     * @returns {quat4} dest if specified, quat otherwise
+     */
+    quat4.scale = function (quat, val, dest) {
+        if(!dest || quat === dest) {
+            quat[0] *= val;
+            quat[1] *= val;
+            quat[2] *= val;
+            quat[3] *= val;
+            return quat;
+        }
+        dest[0] = quat[0]*val;
+        dest[1] = quat[1]*val;
+        dest[2] = quat[2]*val;
+        dest[3] = quat[3]*val;
+        return dest;
+    };
+
+    /**
+     * Calculates a 3x3 matrix from the given quat4
+     *
+     * @param {quat4} quat quat4 to create matrix from
+     * @param {mat3} [dest] mat3 receiving operation result
+     *
+     * @returns {mat3} dest if specified, a new mat3 otherwise
+     */
+    quat4.toMat3 = function (quat, dest) {
+        if (!dest) { dest = mat3.create(); }
+
+        var x = quat[0], y = quat[1], z = quat[2], w = quat[3],
+            x2 = x + x,
+            y2 = y + y,
+            z2 = z + z,
+
+            xx = x * x2,
+            xy = x * y2,
+            xz = x * z2,
+            yy = y * y2,
+            yz = y * z2,
+            zz = z * z2,
+            wx = w * x2,
+            wy = w * y2,
+            wz = w * z2;
+
+        dest[0] = 1 - (yy + zz);
+        dest[1] = xy + wz;
+        dest[2] = xz - wy;
+
+        dest[3] = xy - wz;
+        dest[4] = 1 - (xx + zz);
+        dest[5] = yz + wx;
+
+        dest[6] = xz + wy;
+        dest[7] = yz - wx;
+        dest[8] = 1 - (xx + yy);
+
+        return dest;
+    };
+
+    /**
+     * Calculates a 4x4 matrix from the given quat4
+     *
+     * @param {quat4} quat quat4 to create matrix from
+     * @param {mat4} [dest] mat4 receiving operation result
+     *
+     * @returns {mat4} dest if specified, a new mat4 otherwise
+     */
+    quat4.toMat4 = function (quat, dest) {
+        if (!dest) { dest = mat4.create(); }
+
+        var x = quat[0], y = quat[1], z = quat[2], w = quat[3],
+            x2 = x + x,
+            y2 = y + y,
+            z2 = z + z,
+
+            xx = x * x2,
+            xy = x * y2,
+            xz = x * z2,
+            yy = y * y2,
+            yz = y * z2,
+            zz = z * z2,
+            wx = w * x2,
+            wy = w * y2,
+            wz = w * z2;
+
+        dest[0] = 1 - (yy + zz);
+        dest[1] = xy + wz;
+        dest[2] = xz - wy;
+        dest[3] = 0;
+
+        dest[4] = xy - wz;
+        dest[5] = 1 - (xx + zz);
+        dest[6] = yz + wx;
+        dest[7] = 0;
+
+        dest[8] = xz + wy;
+        dest[9] = yz - wx;
+        dest[10] = 1 - (xx + yy);
+        dest[11] = 0;
+
+        dest[12] = 0;
+        dest[13] = 0;
+        dest[14] = 0;
+        dest[15] = 1;
+
+        return dest;
+    };
+
+    /**
+     * Performs a spherical linear interpolation between two quat4
+     *
+     * @param {quat4} quat First quaternion
+     * @param {quat4} quat2 Second quaternion
+     * @param {number} slerp Interpolation amount between the two inputs
+     * @param {quat4} [dest] quat4 receiving operation result. If not specified result is written to quat
+     *
+     * @returns {quat4} dest if specified, quat otherwise
+     */
+    quat4.slerp = function (quat, quat2, slerp, dest) {
+        if (!dest) { dest = quat; }
+
+        var cosHalfTheta = quat[0] * quat2[0] + quat[1] * quat2[1] + quat[2] * quat2[2] + quat[3] * quat2[3],
+            halfTheta,
+            sinHalfTheta,
+            ratioA,
+            ratioB;
+
+        if (Math.abs(cosHalfTheta) >= 1.0) {
+            if (dest !== quat) {
+                dest[0] = quat[0];
+                dest[1] = quat[1];
+                dest[2] = quat[2];
+                dest[3] = quat[3];
+            }
+            return dest;
+        }
+
+        halfTheta = Math.acos(cosHalfTheta);
+        sinHalfTheta = Math.sqrt(1.0 - cosHalfTheta * cosHalfTheta);
+
+        if (Math.abs(sinHalfTheta) < 0.001) {
+            dest[0] = (quat[0] * 0.5 + quat2[0] * 0.5);
+            dest[1] = (quat[1] * 0.5 + quat2[1] * 0.5);
+            dest[2] = (quat[2] * 0.5 + quat2[2] * 0.5);
+            dest[3] = (quat[3] * 0.5 + quat2[3] * 0.5);
+            return dest;
+        }
+
+        ratioA = Math.sin((1 - slerp) * halfTheta) / sinHalfTheta;
+        ratioB = Math.sin(slerp * halfTheta) / sinHalfTheta;
+
+        dest[0] = (quat[0] * ratioA + quat2[0] * ratioB);
+        dest[1] = (quat[1] * ratioA + quat2[1] * ratioB);
+        dest[2] = (quat[2] * ratioA + quat2[2] * ratioB);
+        dest[3] = (quat[3] * ratioA + quat2[3] * ratioB);
+
+        return dest;
+    };
+
+    /**
+     * Creates a quaternion from the given 3x3 rotation matrix.
+     * If dest is omitted, a new quaternion will be created.
+     *
+     * @param {mat3}  mat    the rotation matrix
+     * @param {quat4} [dest] an optional receiving quaternion
+     *
+     * @returns {quat4} the quaternion constructed from the rotation matrix
+     *
+     */
+    quat4.fromRotationMatrix = function(mat, dest) {
+        if (!dest) dest = quat4.create();
+        
+        // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes
+        // article "Quaternion Calculus and Fast Animation".
+
+        var fTrace = mat[0] + mat[4] + mat[8];
+        var fRoot;
+
+        if ( fTrace > 0.0 ) {
+            // |w| > 1/2, may as well choose w > 1/2
+            fRoot = Math.sqrt(fTrace + 1.0);  // 2w
+            dest[3] = 0.5 * fRoot;
+            fRoot = 0.5/fRoot;  // 1/(4w)
+            dest[0] = (mat[7]-mat[5])*fRoot;
+            dest[1] = (mat[2]-mat[6])*fRoot;
+            dest[2] = (mat[3]-mat[1])*fRoot;
+        } else {
+            // |w| <= 1/2
+            var s_iNext = quat4.fromRotationMatrix.s_iNext = quat4.fromRotationMatrix.s_iNext || [1,2,0];
+            var i = 0;
+            if ( mat[4] > mat[0] )
+              i = 1;
+            if ( mat[8] > mat[i*3+i] )
+              i = 2;
+            var j = s_iNext[i];
+            var k = s_iNext[j];
+            
+            fRoot = Math.sqrt(mat[i*3+i]-mat[j*3+j]-mat[k*3+k] + 1.0);
+            dest[i] = 0.5 * fRoot;
+            fRoot = 0.5 / fRoot;
+            dest[3] = (mat[k*3+j] - mat[j*3+k]) * fRoot;
+            dest[j] = (mat[j*3+i] + mat[i*3+j]) * fRoot;
+            dest[k] = (mat[k*3+i] + mat[i*3+k]) * fRoot;
+        }
+        
+        return dest;
+    };
+
+    /**
+     * Alias. See the description for quat4.fromRotationMatrix().
+     */
+    mat3.toQuat4 = quat4.fromRotationMatrix;
+
+    (function() {
+        var mat = mat3.create();
+        
+        /**
+         * Creates a quaternion from the 3 given vectors. They must be perpendicular
+         * to one another and represent the X, Y and Z axes.
+         *
+         * If dest is omitted, a new quat4 will be created.
+         *
+         * Example: The default OpenGL orientation has a view vector [0, 0, -1],
+         * right vector [1, 0, 0], and up vector [0, 1, 0]. A quaternion representing
+         * this orientation could be constructed with:
+         *
+         *   quat = quat4.fromAxes([0, 0, -1], [1, 0, 0], [0, 1, 0], quat4.create());
+         *
+         * @param {vec3}  view   the view vector, or direction the object is pointing in
+         * @param {vec3}  right  the right vector, or direction to the "right" of the object
+         * @param {vec3}  up     the up vector, or direction towards the object's "up"
+         * @param {quat4} [dest] an optional receiving quat4
+         *
+         * @returns {quat4} dest
+         **/
+        quat4.fromAxes = function(view, right, up, dest) {
+            mat[0] = right[0];
+            mat[3] = right[1];
+            mat[6] = right[2];
+
+            mat[1] = up[0];
+            mat[4] = up[1];
+            mat[7] = up[2];
+
+            mat[2] = view[0];
+            mat[5] = view[1];
+            mat[8] = view[2];
+
+            return quat4.fromRotationMatrix(mat, dest);
+        };
+    })();
+
+    /**
+     * Sets a quat4 to the Identity and returns it.
+     *
+     * @param {quat4} [dest] quat4 to set. If omitted, a
+     * new quat4 will be created.
+     *
+     * @returns {quat4} dest
+     */
+    quat4.identity = function(dest) {
+        if (!dest) dest = quat4.create();
+        dest[0] = 0;
+        dest[1] = 0;
+        dest[2] = 0;
+        dest[3] = 1;
+        return dest;
+    };
+
+    /**
+     * Sets a quat4 from the given angle and rotation axis,
+     * then returns it. If dest is not given, a new quat4 is created.
+     *
+     * @param {Number} angle  the angle in radians
+     * @param {vec3}   axis   the axis around which to rotate
+     * @param {quat4}  [dest] the optional quat4 to store the result
+     *
+     * @returns {quat4} dest
+     **/
+    quat4.fromAngleAxis = function(angle, axis, dest) {
+        // The quaternion representing the rotation is
+        //   q = cos(A/2)+sin(A/2)*(x*i+y*j+z*k)
+        if (!dest) dest = quat4.create();
+        
+        var half = angle * 0.5;
+        var s = Math.sin(half);
+        dest[3] = Math.cos(half);
+        dest[0] = s * axis[0];
+        dest[1] = s * axis[1];
+        dest[2] = s * axis[2];
+        
+        return dest;
+    };
+
+    /**
+     * Stores the angle and axis in a vec4, where the XYZ components represent
+     * the axis and the W (4th) component is the angle in radians.
+     *
+     * If dest is not given, src will be modified in place and returned, after
+     * which it should not be considered not a quaternion (just an axis and angle).
+     *
+     * @param {quat4} quat   the quaternion whose angle and axis to store
+     * @param {vec4}  [dest] the optional vec4 to receive the data
+     *
+     * @returns {vec4} dest
+     */
+    quat4.toAngleAxis = function(src, dest) {
+        if (!dest) dest = src;
+        // The quaternion representing the rotation is
+        //   q = cos(A/2)+sin(A/2)*(x*i+y*j+z*k)
+
+        var sqrlen = src[0]*src[0]+src[1]*src[1]+src[2]*src[2];
+        if (sqrlen > 0)
+        {
+            dest[3] = 2 * Math.acos(src[3]);
+            var invlen = glMath.invsqrt(sqrlen);
+            dest[0] = src[0]*invlen;
+            dest[1] = src[1]*invlen;
+            dest[2] = src[2]*invlen;
+        } else {
+            // angle is 0 (mod 2*pi), so any axis will do
+            dest[3] = 0;
+            dest[0] = 1;
+            dest[1] = 0;
+            dest[2] = 0;
+        }
+        
+        return dest;
+    };
+
+    /**
+     * Returns a string representation of a quaternion
+     *
+     * @param {quat4} quat quat4 to represent as a string
+     *
+     * @returns {string} String representation of quat
+     */
+    quat4.str = function (quat) {
+        return '[' + quat[0] + ', ' + quat[1] + ', ' + quat[2] + ', ' + quat[3] + ']';
+    };
+    
+    /**
+     * @class 2 Dimensional Vector
+     * @name vec2
+     */
+    var vec2 = {};
+     
+    /**
+     * Creates a new vec2, initializing it from vec if vec
+     * is given.
+     *
+     * @param {vec2} [vec] the vector's initial contents
+     * @returns {vec2} a new 2D vector
+     */
+    vec2.create = function(vec) {
+        var dest = new MatrixArray(2);
+
+        if (vec) {
+            dest[0] = vec[0];
+            dest[1] = vec[1];
+        } else {
+            dest[0] = 0;
+            dest[1] = 0;
+        }
+        return dest;
+    };
+
+    /**
+     * Creates a new instance of a vec2, initializing it with the given arguments
+     *
+     * @param {number} x X value
+     * @param {number} y Y value
+
+     * @returns {vec2} New vec2
+     */
+    vec2.createFrom = function (x, y) {
+        var dest = new MatrixArray(2);
+
+        dest[0] = x;
+        dest[1] = y;
+
+        return dest;
+    };
+    
+    /**
+     * Adds the vec2's together. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecB.
+     *
+     * @param {vec2} vecA the first operand
+     * @param {vec2} vecB the second operand
+     * @param {vec2} [dest] the optional receiving vector
+     * @returns {vec2} dest
+     */
+    vec2.add = function(vecA, vecB, dest) {
+        if (!dest) dest = vecB;
+        dest[0] = vecA[0] + vecB[0];
+        dest[1] = vecA[1] + vecB[1];
+        return dest;
+    };
+    
+    /**
+     * Subtracts vecB from vecA. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecB.
+     *
+     * @param {vec2} vecA the first operand
+     * @param {vec2} vecB the second operand
+     * @param {vec2} [dest] the optional receiving vector
+     * @returns {vec2} dest
+     */
+    vec2.subtract = function(vecA, vecB, dest) {
+        if (!dest) dest = vecB;
+        dest[0] = vecA[0] - vecB[0];
+        dest[1] = vecA[1] - vecB[1];
+        return dest;
+    };
+    
+    /**
+     * Multiplies vecA with vecB. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecB.
+     *
+     * @param {vec2} vecA the first operand
+     * @param {vec2} vecB the second operand
+     * @param {vec2} [dest] the optional receiving vector
+     * @returns {vec2} dest
+     */
+    vec2.multiply = function(vecA, vecB, dest) {
+        if (!dest) dest = vecB;
+        dest[0] = vecA[0] * vecB[0];
+        dest[1] = vecA[1] * vecB[1];
+        return dest;
+    };
+    
+    /**
+     * Divides vecA by vecB. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecB.
+     *
+     * @param {vec2} vecA the first operand
+     * @param {vec2} vecB the second operand
+     * @param {vec2} [dest] the optional receiving vector
+     * @returns {vec2} dest
+     */
+    vec2.divide = function(vecA, vecB, dest) {
+        if (!dest) dest = vecB;
+        dest[0] = vecA[0] / vecB[0];
+        dest[1] = vecA[1] / vecB[1];
+        return dest;
+    };
+    
+    /**
+     * Scales vecA by some scalar number. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecA.
+     *
+     * This is the same as multiplying each component of vecA
+     * by the given scalar.
+     *
+     * @param {vec2}   vecA the vector to be scaled
+     * @param {Number} scalar the amount to scale the vector by
+     * @param {vec2}   [dest] the optional receiving vector
+     * @returns {vec2} dest
+     */
+    vec2.scale = function(vecA, scalar, dest) {
+        if (!dest) dest = vecA;
+        dest[0] = vecA[0] * scalar;
+        dest[1] = vecA[1] * scalar;
+        return dest;
+    };
+
+    /**
+     * Calculates the euclidian distance between two vec2
+     *
+     * Params:
+     * @param {vec2} vecA First vector
+     * @param {vec2} vecB Second vector
+     *
+     * @returns {number} Distance between vecA and vecB
+     */
+    vec2.dist = function (vecA, vecB) {
+        var x = vecB[0] - vecA[0],
+            y = vecB[1] - vecA[1];
+        return Math.sqrt(x*x + y*y);
+    };
+
+    /**
+     * Copies the values of one vec2 to another
+     *
+     * @param {vec2} vec vec2 containing values to copy
+     * @param {vec2} dest vec2 receiving copied values
+     *
+     * @returns {vec2} dest
+     */
+    vec2.set = function (vec, dest) {
+        dest[0] = vec[0];
+        dest[1] = vec[1];
+        return dest;
+    };
+
+    /**
+     * Compares two vectors for equality within a certain margin of error
+     *
+     * @param {vec2} a First vector
+     * @param {vec2} b Second vector
+     *
+     * @returns {Boolean} True if a is equivalent to b
+     */
+    vec2.equal = function (a, b) {
+        return a === b || (
+            Math.abs(a[0] - b[0]) < FLOAT_EPSILON &&
+            Math.abs(a[1] - b[1]) < FLOAT_EPSILON
+        );
+    };
+
+    /**
+     * Negates the components of a vec2
+     *
+     * @param {vec2} vec vec2 to negate
+     * @param {vec2} [dest] vec2 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec2} dest if specified, vec otherwise
+     */
+    vec2.negate = function (vec, dest) {
+        if (!dest) { dest = vec; }
+        dest[0] = -vec[0];
+        dest[1] = -vec[1];
+        return dest;
+    };
+
+    /**
+     * Normlize a vec2
+     *
+     * @param {vec2} vec vec2 to normalize
+     * @param {vec2} [dest] vec2 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec2} dest if specified, vec otherwise
+     */
+    vec2.normalize = function (vec, dest) {
+        if (!dest) { dest = vec; }
+        var mag = vec[0] * vec[0] + vec[1] * vec[1];
+        if (mag > 0) {
+            mag = Math.sqrt(mag);
+            dest[0] = vec[0] / mag;
+            dest[1] = vec[1] / mag;
+        } else {
+            dest[0] = dest[1] = 0;
+        }
+        return dest;
+    };
+
+    /**
+     * Computes the cross product of two vec2's. Note that the cross product must by definition
+     * produce a 3D vector. If a dest vector is given, it will contain the resultant 3D vector.
+     * Otherwise, a scalar number will be returned, representing the vector's Z coordinate, since
+     * its X and Y must always equal 0.
+     *
+     * Examples:
+     *    var crossResult = vec3.create();
+     *    vec2.cross([1, 2], [3, 4], crossResult);
+     *    //=> [0, 0, -2]
+     *
+     *    vec2.cross([1, 2], [3, 4]);
+     *    //=> -2
+     *
+     * See http://stackoverflow.com/questions/243945/calculating-a-2d-vectors-cross-product
+     * for some interesting facts.
+     *
+     * @param {vec2} vecA left operand
+     * @param {vec2} vecB right operand
+     * @param {vec2} [dest] optional vec2 receiving result. If not specified a scalar is returned
+     *
+     */
+    vec2.cross = function (vecA, vecB, dest) {
+        var z = vecA[0] * vecB[1] - vecA[1] * vecB[0];
+        if (!dest) return z;
+        dest[0] = dest[1] = 0;
+        dest[2] = z;
+        return dest;
+    };
+    
+    /**
+     * Caclulates the length of a vec2
+     *
+     * @param {vec2} vec vec2 to calculate length of
+     *
+     * @returns {Number} Length of vec
+     */
+    vec2.length = function (vec) {
+      var x = vec[0], y = vec[1];
+      return Math.sqrt(x * x + y * y);
+    };
+
+    /**
+     * Caclulates the squared length of a vec2
+     *
+     * @param {vec2} vec vec2 to calculate squared length of
+     *
+     * @returns {Number} Squared Length of vec
+     */
+    vec2.squaredLength = function (vec) {
+      var x = vec[0], y = vec[1];
+      return x * x + y * y;
+    };
+
+    /**
+     * Caclulates the dot product of two vec2s
+     *
+     * @param {vec2} vecA First operand
+     * @param {vec2} vecB Second operand
+     *
+     * @returns {Number} Dot product of vecA and vecB
+     */
+    vec2.dot = function (vecA, vecB) {
+        return vecA[0] * vecB[0] + vecA[1] * vecB[1];
+    };
+    
+    /**
+     * Generates a 2D unit vector pointing from one vector to another
+     *
+     * @param {vec2} vecA Origin vec2
+     * @param {vec2} vecB vec2 to point to
+     * @param {vec2} [dest] vec2 receiving operation result. If not specified result is written to vecA
+     *
+     * @returns {vec2} dest if specified, vecA otherwise
+     */
+    vec2.direction = function (vecA, vecB, dest) {
+        if (!dest) { dest = vecA; }
+
+        var x = vecA[0] - vecB[0],
+            y = vecA[1] - vecB[1],
+            len = x * x + y * y;
+
+        if (!len) {
+            dest[0] = 0;
+            dest[1] = 0;
+            dest[2] = 0;
+            return dest;
+        }
+
+        len = 1 / Math.sqrt(len);
+        dest[0] = x * len;
+        dest[1] = y * len;
+        return dest;
+    };
+
+    /**
+     * Performs a linear interpolation between two vec2
+     *
+     * @param {vec2} vecA First vector
+     * @param {vec2} vecB Second vector
+     * @param {Number} lerp Interpolation amount between the two inputs
+     * @param {vec2} [dest] vec2 receiving operation result. If not specified result is written to vecA
+     *
+     * @returns {vec2} dest if specified, vecA otherwise
+     */
+    vec2.lerp = function (vecA, vecB, lerp, dest) {
+        if (!dest) { dest = vecA; }
+        dest[0] = vecA[0] + lerp * (vecB[0] - vecA[0]);
+        dest[1] = vecA[1] + lerp * (vecB[1] - vecA[1]);
+        return dest;
+    };
+
+    /**
+     * Returns a string representation of a vector
+     *
+     * @param {vec2} vec Vector to represent as a string
+     *
+     * @returns {String} String representation of vec
+     */
+    vec2.str = function (vec) {
+        return '[' + vec[0] + ', ' + vec[1] + ']';
+    };
+    
+    /**
+     * @class 2x2 Matrix
+     * @name mat2
+     */
+    var mat2 = {};
+    
+    /**
+     * Creates a new 2x2 matrix. If src is given, the new matrix
+     * is initialized to those values.
+     *
+     * @param {mat2} [src] the seed values for the new matrix, if any
+     * @returns {mat2} a new matrix
+     */
+    mat2.create = function(src) {
+        var dest = new MatrixArray(4);
+        
+        if (src) {
+            dest[0] = src[0];
+            dest[1] = src[1];
+            dest[2] = src[2];
+            dest[3] = src[3];
+        } else {
+            dest[0] = dest[1] = dest[2] = dest[3] = 0;
+        }
+        return dest;
+    };
+
+    /**
+     * Creates a new instance of a mat2, initializing it with the given arguments
+     *
+     * @param {number} m00
+     * @param {number} m01
+     * @param {number} m10
+     * @param {number} m11
+
+     * @returns {mat2} New mat2
+     */
+    mat2.createFrom = function (m00, m01, m10, m11) {
+        var dest = new MatrixArray(4);
+
+        dest[0] = m00;
+        dest[1] = m01;
+        dest[2] = m10;
+        dest[3] = m11;
+
+        return dest;
+    };
+    
+    /**
+     * Copies the values of one mat2 to another
+     *
+     * @param {mat2} mat mat2 containing values to copy
+     * @param {mat2} dest mat2 receiving copied values
+     *
+     * @returns {mat2} dest
+     */
+    mat2.set = function (mat, dest) {
+        dest[0] = mat[0];
+        dest[1] = mat[1];
+        dest[2] = mat[2];
+        dest[3] = mat[3];
+        return dest;
+    };
+
+    /**
+     * Compares two matrices for equality within a certain margin of error
+     *
+     * @param {mat2} a First matrix
+     * @param {mat2} b Second matrix
+     *
+     * @returns {Boolean} True if a is equivalent to b
+     */
+    mat2.equal = function (a, b) {
+        return a === b || (
+            Math.abs(a[0] - b[0]) < FLOAT_EPSILON &&
+            Math.abs(a[1] - b[1]) < FLOAT_EPSILON &&
+            Math.abs(a[2] - b[2]) < FLOAT_EPSILON &&
+            Math.abs(a[3] - b[3]) < FLOAT_EPSILON
+        );
+    };
+
+    /**
+     * Sets a mat2 to an identity matrix
+     *
+     * @param {mat2} [dest] mat2 to set. If omitted a new one will be created.
+     *
+     * @returns {mat2} dest
+     */
+    mat2.identity = function (dest) {
+        if (!dest) { dest = mat2.create(); }
+        dest[0] = 1;
+        dest[1] = 0;
+        dest[2] = 0;
+        dest[3] = 1;
+        return dest;
+    };
+
+    /**
+     * Transposes a mat2 (flips the values over the diagonal)
+     *
+     * @param {mat2} mat mat2 to transpose
+     * @param {mat2} [dest] mat2 receiving transposed values. If not specified result is written to mat
+     *
+     * @param {mat2} dest if specified, mat otherwise
+     */
+    mat2.transpose = function (mat, dest) {
+        // If we are transposing ourselves we can skip a few steps but have to cache some values
+        if (!dest || mat === dest) {
+            var a00 = mat[1];
+            mat[1] = mat[2];
+            mat[2] = a00;
+            return mat;
+        }
+        
+        dest[0] = mat[0];
+        dest[1] = mat[2];
+        dest[2] = mat[1];
+        dest[3] = mat[3];
+        return dest;
+    };
+
+    /**
+     * Calculates the determinant of a mat2
+     *
+     * @param {mat2} mat mat2 to calculate determinant of
+     *
+     * @returns {Number} determinant of mat
+     */
+    mat2.determinant = function (mat) {
+      return mat[0] * mat[3] - mat[2] * mat[1];
+    };
+    
+    /**
+     * Calculates the inverse matrix of a mat2
+     *
+     * @param {mat2} mat mat2 to calculate inverse of
+     * @param {mat2} [dest] mat2 receiving inverse matrix. If not specified result is written to mat
+     *
+     * @param {mat2} dest is specified, mat otherwise, null if matrix cannot be inverted
+     */
+    mat2.inverse = function (mat, dest) {
+        if (!dest) { dest = mat; }
+        var a0 = mat[0], a1 = mat[1], a2 = mat[2], a3 = mat[3];
+        var det = a0 * a3 - a2 * a1;
+        if (!det) return null;
+        
+        det = 1.0 / det;
+        dest[0] =  a3 * det;
+        dest[1] = -a1 * det;
+        dest[2] = -a2 * det;
+        dest[3] =  a0 * det;
+        return dest;
+    };
+    
+    /**
+     * Performs a matrix multiplication
+     *
+     * @param {mat2} matA First operand
+     * @param {mat2} matB Second operand
+     * @param {mat2} [dest] mat2 receiving operation result. If not specified result is written to matA
+     *
+     * @returns {mat2} dest if specified, matA otherwise
+     */
+    mat2.multiply = function (matA, matB, dest) {
+        if (!dest) { dest = matA; }
+        var a11 = matA[0],
+            a12 = matA[1],
+            a21 = matA[2],
+            a22 = matA[3];
+        dest[0] = a11 * matB[0] + a12 * matB[2];
+        dest[1] = a11 * matB[1] + a12 * matB[3];
+        dest[2] = a21 * matB[0] + a22 * matB[2];
+        dest[3] = a21 * matB[1] + a22 * matB[3];
+        return dest;
+    };
+
+    /**
+     * Rotates a 2x2 matrix by an angle
+     *
+     * @param {mat2}   mat   The matrix to rotate
+     * @param {Number} angle The angle in radians
+     * @param {mat2} [dest]  Optional mat2 receiving the result. If omitted mat will be used.
+     *
+     * @returns {mat2} dest if specified, mat otherwise
+     */
+    mat2.rotate = function (mat, angle, dest) {
+        if (!dest) { dest = mat; }
+        var a11 = mat[0],
+            a12 = mat[1],
+            a21 = mat[2],
+            a22 = mat[3],
+            s = Math.sin(angle),
+            c = Math.cos(angle);
+        dest[0] = a11 *  c + a12 * s;
+        dest[1] = a11 * -s + a12 * c;
+        dest[2] = a21 *  c + a22 * s;
+        dest[3] = a21 * -s + a22 * c;
+        return dest;
+    };
+
+    /**
+     * Multiplies the vec2 by the given 2x2 matrix
+     *
+     * @param {mat2} matrix the 2x2 matrix to multiply against
+     * @param {vec2} vec    the vector to multiply
+     * @param {vec2} [dest] an optional receiving vector. If not given, vec is used.
+     *
+     * @returns {vec2} The multiplication result
+     **/
+    mat2.multiplyVec2 = function(matrix, vec, dest) {
+      if (!dest) dest = vec;
+      var x = vec[0], y = vec[1];
+      dest[0] = x * matrix[0] + y * matrix[1];
+      dest[1] = x * matrix[2] + y * matrix[3];
+      return dest;
+    };
+    
+    /**
+     * Scales the mat2 by the dimensions in the given vec2
+     *
+     * @param {mat2} matrix the 2x2 matrix to scale
+     * @param {vec2} vec    the vector containing the dimensions to scale by
+     * @param {vec2} [dest] an optional receiving mat2. If not given, matrix is used.
+     *
+     * @returns {mat2} dest if specified, matrix otherwise
+     **/
+    mat2.scale = function(matrix, vec, dest) {
+      if (!dest) { dest = matrix; }
+      var a11 = matrix[0],
+          a12 = matrix[1],
+          a21 = matrix[2],
+          a22 = matrix[3],
+          b11 = vec[0],
+          b22 = vec[1];
+      dest[0] = a11 * b11;
+      dest[1] = a12 * b22;
+      dest[2] = a21 * b11;
+      dest[3] = a22 * b22;
+      return dest;
+    };
+
+    /**
+     * Returns a string representation of a mat2
+     *
+     * @param {mat2} mat mat2 to represent as a string
+     *
+     * @param {String} String representation of mat
+     */
+    mat2.str = function (mat) {
+        return '[' + mat[0] + ', ' + mat[1] + ', ' + mat[2] + ', ' + mat[3] + ']';
+    };
+    
+    /**
+     * @class 4 Dimensional Vector
+     * @name vec4
+     */
+    var vec4 = {};
+     
+    /**
+     * Creates a new vec4, initializing it from vec if vec
+     * is given.
+     *
+     * @param {vec4} [vec] the vector's initial contents
+     * @returns {vec4} a new 2D vector
+     */
+    vec4.create = function(vec) {
+        var dest = new MatrixArray(4);
+        
+        if (vec) {
+            dest[0] = vec[0];
+            dest[1] = vec[1];
+            dest[2] = vec[2];
+            dest[3] = vec[3];
+        } else {
+            dest[0] = 0;
+            dest[1] = 0;
+            dest[2] = 0;
+            dest[3] = 0;
+        }
+        return dest;
+    };
+
+    /**
+     * Creates a new instance of a vec4, initializing it with the given arguments
+     *
+     * @param {number} x X value
+     * @param {number} y Y value
+     * @param {number} z Z value
+     * @param {number} w W value
+
+     * @returns {vec4} New vec4
+     */
+    vec4.createFrom = function (x, y, z, w) {
+        var dest = new MatrixArray(4);
+
+        dest[0] = x;
+        dest[1] = y;
+        dest[2] = z;
+        dest[3] = w;
+
+        return dest;
+    };
+    
+    /**
+     * Adds the vec4's together. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecB.
+     *
+     * @param {vec4} vecA the first operand
+     * @param {vec4} vecB the second operand
+     * @param {vec4} [dest] the optional receiving vector
+     * @returns {vec4} dest
+     */
+    vec4.add = function(vecA, vecB, dest) {
+      if (!dest) dest = vecB;
+      dest[0] = vecA[0] + vecB[0];
+      dest[1] = vecA[1] + vecB[1];
+      dest[2] = vecA[2] + vecB[2];
+      dest[3] = vecA[3] + vecB[3];
+      return dest;
+    };
+    
+    /**
+     * Subtracts vecB from vecA. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecB.
+     *
+     * @param {vec4} vecA the first operand
+     * @param {vec4} vecB the second operand
+     * @param {vec4} [dest] the optional receiving vector
+     * @returns {vec4} dest
+     */
+    vec4.subtract = function(vecA, vecB, dest) {
+      if (!dest) dest = vecB;
+      dest[0] = vecA[0] - vecB[0];
+      dest[1] = vecA[1] - vecB[1];
+      dest[2] = vecA[2] - vecB[2];
+      dest[3] = vecA[3] - vecB[3];
+      return dest;
+    };
+    
+    /**
+     * Multiplies vecA with vecB. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecB.
+     *
+     * @param {vec4} vecA the first operand
+     * @param {vec4} vecB the second operand
+     * @param {vec4} [dest] the optional receiving vector
+     * @returns {vec4} dest
+     */
+    vec4.multiply = function(vecA, vecB, dest) {
+      if (!dest) dest = vecB;
+      dest[0] = vecA[0] * vecB[0];
+      dest[1] = vecA[1] * vecB[1];
+      dest[2] = vecA[2] * vecB[2];
+      dest[3] = vecA[3] * vecB[3];
+      return dest;
+    };
+    
+    /**
+     * Divides vecA by vecB. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecB.
+     *
+     * @param {vec4} vecA the first operand
+     * @param {vec4} vecB the second operand
+     * @param {vec4} [dest] the optional receiving vector
+     * @returns {vec4} dest
+     */
+    vec4.divide = function(vecA, vecB, dest) {
+      if (!dest) dest = vecB;
+      dest[0] = vecA[0] / vecB[0];
+      dest[1] = vecA[1] / vecB[1];
+      dest[2] = vecA[2] / vecB[2];
+      dest[3] = vecA[3] / vecB[3];
+      return dest;
+    };
+    
+    /**
+     * Scales vecA by some scalar number. If dest is given, the result
+     * is stored there. Otherwise, the result is stored in vecA.
+     *
+     * This is the same as multiplying each component of vecA
+     * by the given scalar.
+     *
+     * @param {vec4}   vecA the vector to be scaled
+     * @param {Number} scalar the amount to scale the vector by
+     * @param {vec4}   [dest] the optional receiving vector
+     * @returns {vec4} dest
+     */
+    vec4.scale = function(vecA, scalar, dest) {
+      if (!dest) dest = vecA;
+      dest[0] = vecA[0] * scalar;
+      dest[1] = vecA[1] * scalar;
+      dest[2] = vecA[2] * scalar;
+      dest[3] = vecA[3] * scalar;
+      return dest;
+    };
+
+    /**
+     * Copies the values of one vec4 to another
+     *
+     * @param {vec4} vec vec4 containing values to copy
+     * @param {vec4} dest vec4 receiving copied values
+     *
+     * @returns {vec4} dest
+     */
+    vec4.set = function (vec, dest) {
+        dest[0] = vec[0];
+        dest[1] = vec[1];
+        dest[2] = vec[2];
+        dest[3] = vec[3];
+        return dest;
+    };
+
+    /**
+     * Compares two vectors for equality within a certain margin of error
+     *
+     * @param {vec4} a First vector
+     * @param {vec4} b Second vector
+     *
+     * @returns {Boolean} True if a is equivalent to b
+     */
+    vec4.equal = function (a, b) {
+        return a === b || (
+            Math.abs(a[0] - b[0]) < FLOAT_EPSILON &&
+            Math.abs(a[1] - b[1]) < FLOAT_EPSILON &&
+            Math.abs(a[2] - b[2]) < FLOAT_EPSILON &&
+            Math.abs(a[3] - b[3]) < FLOAT_EPSILON
+        );
+    };
+
+    /**
+     * Negates the components of a vec4
+     *
+     * @param {vec4} vec vec4 to negate
+     * @param {vec4} [dest] vec4 receiving operation result. If not specified result is written to vec
+     *
+     * @returns {vec4} dest if specified, vec otherwise
+     */
+    vec4.negate = function (vec, dest) {
+        if (!dest) { dest = vec; }
+        dest[0] = -vec[0];
+        dest[1] = -vec[1];
+        dest[2] = -vec[2];
+        dest[3] = -vec[3];
+        return dest;
+    };
+
+    /**
+     * Caclulates the length of a vec2
+     *
+     * @param {vec2} vec vec2 to calculate length of
+     *
+     * @returns {Number} Length of vec
+     */
+    vec4.length = function (vec) {
+      var x = vec[0], y = vec[1], z = vec[2], w = vec[3];
+      return Math.sqrt(x * x + y * y + z * z + w * w);
+    };
+
+    /**
+     * Caclulates the squared length of a vec4
+     *
+     * @param {vec4} vec vec4 to calculate squared length of
+     *
+     * @returns {Number} Squared Length of vec
+     */
+    vec4.squaredLength = function (vec) {
+      var x = vec[0], y = vec[1], z = vec[2], w = vec[3];
+      return x * x + y * y + z * z + w * w;
+    };
+
+    /**
+     * Performs a linear interpolation between two vec4
+     *
+     * @param {vec4} vecA First vector
+     * @param {vec4} vecB Second vector
+     * @param {Number} lerp Interpolation amount between the two inputs
+     * @param {vec4} [dest] vec4 receiving operation result. If not specified result is written to vecA
+     *
+     * @returns {vec4} dest if specified, vecA otherwise
+     */
+    vec4.lerp = function (vecA, vecB, lerp, dest) {
+        if (!dest) { dest = vecA; }
+        dest[0] = vecA[0] + lerp * (vecB[0] - vecA[0]);
+        dest[1] = vecA[1] + lerp * (vecB[1] - vecA[1]);
+        dest[2] = vecA[2] + lerp * (vecB[2] - vecA[2]);
+        dest[3] = vecA[3] + lerp * (vecB[3] - vecA[3]);
+        return dest;
+    };
+
+    /**
+     * Returns a string representation of a vector
+     *
+     * @param {vec4} vec Vector to represent as a string
+     *
+     * @returns {String} String representation of vec
+     */
+    vec4.str = function (vec) {
+        return '[' + vec[0] + ', ' + vec[1] + ', ' + vec[2] + ', ' + vec[3] + ']';
+    };
+
+    /*
+     * Exports
+     */
+
+    if(root) {
+        root.glMatrixArrayType = MatrixArray;
+        root.MatrixArray = MatrixArray;
+        root.setMatrixArrayType = setMatrixArrayType;
+        root.determineMatrixArrayType = determineMatrixArrayType;
+        root.glMath = glMath;
+        root.vec2 = vec2;
+        root.vec3 = vec3;
+        root.vec4 = vec4;
+        root.mat2 = mat2;
+        root.mat3 = mat3;
+        root.mat4 = mat4;
+        root.quat4 = quat4;
+    }
+
+    return {
+        glMatrixArrayType: MatrixArray,
+        MatrixArray: MatrixArray,
+        setMatrixArrayType: setMatrixArrayType,
+        determineMatrixArrayType: determineMatrixArrayType,
+        glMath: glMath,
+        vec2: vec2,
+        vec3: vec3,
+        vec4: vec4,
+        mat2: mat2,
+        mat3: mat3,
+        mat4: mat4,
+        quat4: quat4
+    };
+}));
+
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/tizen-web-ui-fw.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/tizen-web-ui-fw.js
new file mode 100644
index 0000000..c726d09
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/js/tizen-web-ui-fw.js
@@ -0,0 +1,18826 @@
+
+/*
+* jQuery Mobile Framework : scrollview plugin
+* Copyright (c) 2010 Adobe Systems Incorporated - Kin Blas (jblas@adobe.com)
+* Licensed under the MIT (MIT-LICENSE.txt) license.
+* 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 ) {
+
+	/**
+	 * Resizes page content height according to footer
+	 * header elements, and page padding
+	 * @param {HTMLElement|jQuery} page
+	 */
+	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) );
+	}
+
+	/**
+	 * MomentumTracker - helper class to ease momentum
+	 * movement calculations
+	 * @class
+	 * @param {Object} options
+	 */
+	function MomentumTracker( options ) {
+		this.options = $.extend( {}, options );
+		this.easing = "easeOutQuad";
+		this.reset();
+	}
+
+	/**
+	 * Scroll states dictionary
+	 * @type {Object}
+	 */
+	var tstates = {
+		scrolling: 0,
+		overshot:  1,
+		snapback:  2,
+		done:      3
+	};
+
+	/**
+	 * Returns current time in miliseconds
+	 * @return {number}
+	 */
+	function getCurrentTime() {
+		return Date.now();
+	};
+
+	function bitwiseAbs( e ) {
+		return ( e ^ (e>>31)) - (e>>31);
+	}
+
+	jQuery.widget( "tizen.scrollview", jQuery.mobile.widget, {
+		/**
+		 * Default options
+		 * @type {Object}
+		 */
+		options: {
+			/**
+			 * Direction of scroll, can be:
+			 * "x" for horizontal scroll
+			 * "y" for vertical scroll
+			 * null for horizontal and vertical scroll
+			 * @type {string|null}
+			 */
+			direction:         null,  // "x", "y", or null for both.
+
+			/**
+			 * Internal timer inteval
+			 * @type {number}
+			 */
+			timerInterval:     10,
+
+			/**
+			 * Duration of the scrolling animation in miliseconds
+			 * @type {number}
+			 */
+			scrollDuration:    1000,
+
+			/**
+			 * Duration of the overshoot animation in miliseconds
+			 * @type {number}
+			 */
+			overshootDuration: 250,
+
+			/**
+			 * Duration of snapback animation in miliseconds
+			 * @type {number}
+			 */
+			snapbackDuration:  500,
+
+			/**
+			 * Scroll detection threshold
+			 * @type {number}
+			 */
+			moveThreshold:     10,
+
+			/**
+			 * Maximal time between mouse movements while scrolling
+			 * @type {number}
+			 */
+			moveIntervalThreshold:     150,
+
+			/**
+			 * Scroll method type, can be "translate" or "position"
+			 * @type {string}
+			 */
+			scrollMethod:      "translate",
+
+			/**
+			 * The event fired when started scrolling
+			 * @type {string}
+			 */
+			startEventName:    "scrollstart",
+
+			/**
+			 * The event fired on each scroll update (movement)
+			 * @type {string}
+			 */
+			updateEventName:   "scrollupdate",
+
+			/**
+			 * The event fired after scroll stopped
+			 * @type {string}
+			 */
+			stopEventName:     "scrollstop",
+
+			/**
+			 * Determines the event group for detecting scroll
+			 * if $.support.touch has truthy value the group
+			 * that starts scroll will be touch events, otherwise
+			 * mouse events will be used
+			 * @type {string}
+			 */
+			eventType:         $.support.touch ? "touch" : "mouse",
+
+			/**
+			 * Determines if we should show the scrollbars
+			 * @type {boolean}
+			 */
+			showScrollBars:    true,
+
+			/**
+			 * Determines if overshoot animation is enabled
+			 * @type {boolean}
+			 */
+			overshootEnable:   false,
+
+			/**
+			 * Determines if we enable the window scroll
+			 * @type {boolean}
+			 */
+			outerScrollEnable: false,
+
+			/**
+			 * Determines if the overflow animation is enabled
+			 * @type {boolean}
+			 */
+			overflowEnable:    true,
+
+			/**
+			 * Determines if we allow scroll jumps
+			 * @type {boolean}
+			 */
+			scrollJump:        false
+		},
+
+		/**
+		 * Returns view height
+		 * @private
+		 * @return {number}
+		 */
+		_getViewHeight: function () {
+			return this._$view.height();
+		},
+
+		/**
+		 * Returns view width
+		 * @private
+		 * @return {number}
+		 */
+		_getViewWidth: function () {
+			return this._$view.width();
+		},
+
+		/**
+		 * Changes specified elements position to relative if
+		 * previous position state was static
+		 * @private
+		 * @param {jQuery} $ele
+		 */
+		_makePositioned: function ( $ele ) {
+			if ( $ele.css("position") === "static" ) {
+				$ele.css( "position", "relative" );
+			}
+		},
+
+		/**
+		 * Creates scrollview widget,
+		 * binds events and initiaties timers
+		 * @private
+		 */
+		_create: function () {
+			var direction,
+				self = this;
+
+			this._$clip = $( this.element ).addClass("ui-scrollview-clip");
+
+			if ( this._$clip.children(".ui-scrollview-view").length ) {
+				this._$view = this._$clip.children(".ui-scrollview-view");
+			} else {
+				this._$view = this._$clip.wrapInner("<div></div>").children()
+							.addClass("ui-scrollview-view");
+			}
+
+			if ( this.options.scrollMethod === "translate" ) {
+				if ( this._$view.css("transform") === undefined ) {
+					this.options.scrollMethod = "position";
+				}
+			}
+
+			this._$clip.css( "overflow", "hidden" );
+			this._makePositioned( this._$clip );
+
+			this._makePositioned( this._$view );
+			this._$view.css( { left: 0, top: 0 } );
+
+			this._view_height = this._getViewHeight();
+
+			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 = this.options.timerInterval;
+			this._timerID = 0;
+
+			this._timerCB = function () {
+				self._handleMomentumScroll();
+			};
+
+			this._add_event();
+			this._add_scrollbar();
+			this._add_scroll_jump();
+			this._add_overflow_indicator();
+			this._moveInterval = 10; /* Add Interval */
+			this._clipHeight = 0;
+		},
+
+		/**
+		 * Starts momentum scroll after user stopped
+		 * scrolling
+		 * @private
+		 * @param {number} speedX Horizontal speed
+		 * @param {number} speedY Vertical speed
+		 */
+		_startMScroll: function ( speedX, speedY ) {
+			var keepGoing = false,
+				duration = this.options.scrollDuration,
+				ht = this._hTracker,
+				vt = this._vTracker,
+				c,
+				v;
+
+			this._$clip.trigger( this.options.startEventName );
+
+			if ( ht ) {
+				c = this._$clip.width();
+				v = this._getViewWidth();
+
+				if ( (( this._sx === 0 && speedX > 0 ) ||
+					( this._sx === -(v - c) && speedX < 0 )) &&
+						v > c ) {
+					return;
+				}
+
+				ht.start( this._sx, speedX,
+					duration, (v > c) ? -(v - c) : 0, 0 );
+				keepGoing = !ht.done();
+			}
+
+			if ( vt ) {
+				c = this._$clip.height();
+				v = this._getViewHeight();
+
+				if ( (( this._sy === 0 && speedY > 0 ) ||
+					( this._sy === -(v - c) && speedY < 0 )) &&
+						v > c ) {
+					return;
+				}
+
+				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();
+			}
+		},
+
+		/**
+		 * Ends momentum scroll
+		 * @private
+		 */
+		_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();
+			this._hideOverflowIndicator();
+		},
+
+		/**
+		 * Updates scroll while in momentum scroll mode
+		 * @private
+		 */
+		_handleMomentumScroll: function () {
+			var keepGoing = false,
+				x = 0,
+				y = 0,
+				scroll_height = 0,
+				self = this,
+				vt = this._vTracker,
+				ht = this._hTracker;
+
+			if ( this._outerScrolling ) {
+				return;
+			}
+
+			if ( vt ) {
+				vt.update( this.options.overshootEnable );
+				y = vt.getPosition();
+				keepGoing = !vt.done();
+
+				if ( vt.getRemained() > this.options.overshootDuration ) {
+					scroll_height = this._getViewHeight() - this._$clip.height();
+
+					if ( !vt.isAvail() ) {
+						if ( this._speedY > 0 ) {
+							this._outerScroll( vt.getRemained() / 3, scroll_height );
+						} else {
+							this._outerScroll( y - vt.getRemained() / 3, scroll_height );
+						}
+					} else if ( vt.isMin() ) {
+						this._outerScroll( y - vt.getRemained() / 3, scroll_height );
+
+					} else if ( vt.isMax() ) {
+						this._outerScroll( vt.getRemained() / 3, scroll_height );
+					}
+				}
+			}
+
+			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();
+			}
+		},
+
+		/**
+		 * Sets css translate transformation for element
+		 * @param {jQuery} $ele
+		 * @param {number} x
+		 * @param {number} y
+		 * @param {number} duration
+		 */
+		_setElementTransform: function ( $ele, x, y, duration ) {
+			var translate,
+				transition;
+
+			if ( !duration || duration === undefined ) {
+				transition = "none";
+			} else {
+				transition =  "-webkit-transform " + duration / 1000 + "s ease-out";
+			}
+
+			if ( $.support.cssTransform3d ) {
+				translate = "translate3d(" + x + "," + y + ", 0px)";
+			} else {
+				translate = "translate(" + x + "," + y + ")";
+			}
+
+			$ele.css({
+				"-moz-transform": translate,
+				"-webkit-transform": translate,
+				"-ms-transform": translate,
+				"-o-transform": translate,
+				"transform": translate,
+				"-webkit-transition": transition
+			});
+		},
+
+		/**
+		 * Applies scroll end effect according to direction
+		 * @param {string} dir Direction, can be "in" or "out"
+		 */
+		_setEndEffect: function ( dir ) {
+			var scroll_height = this._getViewHeight() - this._$clip.height();
+
+			if ( this._softkeyboard ) {
+				if ( this._effect_dir ) {
+					this._outerScroll( -scroll_height - this._softkeyboardHeight,
+							scroll_height );
+				} else {
+					this._outerScroll( this._softkeyboardHeight, scroll_height );
+				}
+				return;
+			}
+
+			if ( dir === "in" ) {
+				if ( this._endEffect ) {
+					return;
+				}
+
+				this._endEffect = true;
+				this._setOverflowIndicator( this._effect_dir );
+				this._showOverflowIndicator();
+			} else if ( dir === "out" ) {
+				if ( !this._endEffect ) {
+					return;
+				}
+
+				this._endEffect = false;
+			} else {
+				this._endEffect = false;
+				this._setOverflowIndicator();
+				this._showOverflowIndicator();
+			}
+		},
+
+		/**
+		 * Calibrates scroll position and scroll end effect
+		 * @private
+		 * @param {number} x
+		 * @param {number} y
+		 */
+		_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,
+				scroll_width = 0,
+				vh,
+				ch;
+
+			if ( dirLock !== "y" && this._hTracker ) {
+				scroll_width = $v.width() - $c.width();
+
+				if ( x >= 0 ) {
+					this._sx = 0;
+				} else if ( x < -scroll_width ) {
+					this._sx = -scroll_width;
+				} else {
+					this._sx = x;
+				}
+
+				if ( scroll_width < 0 ) {
+					this._sx = 0;
+				}
+			}
+
+			if ( dirLock !== "x" && this._vTracker ) {
+				vh = this._getViewHeight();
+				ch = $c.height();
+				/*
+				When used changePage() function, this._getViewHeight() value set 0.
+				So scroll_height has incorrect value and showed indicator incorrectly.
+				Below condition is exception handling that avoid this situation.
+				*/
+				if ( vh != 0 && ch > 0 ) {
+					scroll_height = vh - ch;
+				}
+
+				if ( y > 0 ) {
+					this._sy = 0;
+
+					this._effect_dir = 0;
+					this._setEndEffect( "in" );
+				} else if ( y < -scroll_height ) {
+					this._sy = -scroll_height;
+
+					this._effect_dir = 1;
+					this._setEndEffect( "in" );
+				} else {
+					if ( this._endEffect && this._sy !== y ) {
+						this._setEndEffect();
+					}
+
+					this._sy = y;
+				}
+
+				if ( scroll_height < 0 ) {
+					this._sy = 0;
+				}
+			}
+		},
+
+		/**
+		 * Moves scroll to specified position
+		 * @private
+		 * @param {number} x
+		 * @param {number} y
+		 * @param {number} duration
+		 */
+		_setScrollPosition: function ( x, y, duration ) {
+			var $v = this._$view,
+				sm = this.options.scrollMethod,
+				$vsb = this._$vScrollBar,
+				$hsb = this._$hScrollBar,
+				$sbt;
+
+			this._setCalibration( x, y );
+
+			x = this._sx;
+			y = this._sy;
+
+			if ( sm === "translate" ) {
+				this._setElementTransform( $v, x + "px", y + "px", duration );
+			} else {
+				$v.css( {left: x + "px", top: y + "px"} );
+			}
+
+			if ( $vsb ) {
+				$sbt = $vsb.find(".ui-scrollbar-thumb");
+
+				if ( sm === "translate" ) {
+					if ( bitwiseAbs( this._moveInterval - bitwiseAbs(y)) > 20 ) {
+						/* update scrollbar every 20(clientY) move*/
+						/* Add Interval */
+						this._setElementTransform( $sbt, "0px",
+							-y / this._getViewHeight() * this._clipHeight + "px",
+							duration );
+					}
+				} else {
+					$sbt.css( "top", -y / this._getViewHeight() * 100 + "%" );
+				}
+			}
+
+			if ( $hsb ) {
+				$sbt = $hsb.find(".ui-scrollbar-thumb");
+
+				if ( sm === "translate" ) {
+					this._setElementTransform( $sbt,
+						-x / $v.outerWidth() * $sbt.parent().width() + "px", "0px",
+						duration);
+				} else {
+					$sbt.css("left", -x / $v.width() * 100 + "%");
+				}
+			}
+		},
+
+		/**
+		 * Handles window scrolling
+		 * @private
+		 * @param {number} y
+		 * @param {number} scroll_height
+		 */
+		_outerScroll: function ( y, scroll_height ) {
+			var self = this,
+				top = $( window ).scrollTop() - window.screenTop,
+				sy = 0,
+				duration = this.options.snapbackDuration,
+				start = getCurrentTime(),
+				tfunc;
+
+			if ( !this.options.outerScrollEnable ) {
+				return;
+			}
+
+			if ( this._$clip.jqmData("scroll") !== "y" ) {
+				return;
+			}
+
+			if ( this._outerScrolling ) {
+				return;
+			}
+
+			if ( y > 0 ) {
+				sy = ( window.screenTop ? window.screenTop : -y );
+			} else if ( y < -scroll_height ) {
+				sy = -y - scroll_height;
+			} else {
+				return;
+			}
+
+			tfunc = function () {
+				var elapsed = getCurrentTime() - start;
+
+				if ( elapsed >= duration ) {
+					window.scrollTo( 0, top + sy );
+					self._outerScrolling = undefined;
+
+					self._stopMScroll();
+				} else {
+					ec = $.easing.easeOutQuad( elapsed / duration,
+							elapsed, 0, 1, duration );
+
+					window.scrollTo( 0, top + ( sy * ec ) );
+					self._outerScrolling = setTimeout( tfunc, self._timerInterval );
+				}
+			};
+			this._outerScrolling = setTimeout( tfunc, self._timerInterval );
+		},
+
+		/**
+		 * Scrolls to specified position with easeOutQuad calculations
+		 * @private
+		 * @param {number} x
+		 * @param {number} y
+		 * @param {number} duration
+		 */
+		_scrollTo: function ( x, y, duration ) {
+			var self = this,
+				start = getCurrentTime(),
+				efunc = $.easing.easeOutQuad,
+				sx = this._sx,
+				sy = this._sy,
+				dx = x - sx,
+				dy = y - sy,
+				tfunc;
+
+			x = -x;
+			y = -y;
+
+			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 );
+		},
+
+		/**
+		 * Scrolls to specified position
+		 * If scroll method is css translation or duration is a
+		 * falsy value, the position is changed via translation,
+		 * otherwise it's animated to that position
+		 * @param {number} x
+		 * @param {number} y
+		 * @param {number} duration
+		 */
+		scrollTo: function ( x, y, duration ) {
+			this._stopMScroll();
+			this._didDrag = false;
+
+			if ( !duration || this.options.scrollMethod === "translate" ) {
+				this._setScrollPosition( x, y, duration );
+			} else {
+				this._scrollTo( x, y, duration );
+			}
+		},
+
+		/**
+		 * Centers scroll to view the specified child element
+		 * @param {Element|jQuery} target
+		 */
+		centerToElement: function ( element ) {
+			var $clip = this._$clip,
+				$view = this._$view,
+				$element = element.get ? element : $( element ),
+				delta = ( $clip.height() / 2 ) - ( element.height() / 2 ),
+				elementPosition = element.position().top;
+
+			element.parentsUntil( $view ).each( function () {
+				var $parent = $( this );
+				elementPosition += ( $parent.position().top + parseFloat( $parent.css( "marginTop" ) ) + parseFloat( $parent.css( "paddingTop" ) ) );
+			});
+
+			this.scrollTo( this._sx, -( elementPosition - delta ) );
+		},
+
+		/**
+		 * Checks if the specified child element is visible
+		 * and centers the scroll on it if it's not visible
+		 * @param {Element|jQuery}
+		 */
+		ensureElementIsVisible: function ( element ) {
+			var $element = element.get ? element : $( element ),
+				$clip = this._$clip,
+				clipHeight = $clip.height(),
+				clipTop = $clip.offset().top,
+				clipBottom = clipTop + clipHeight,
+				elementHeight = $element.height(),
+				elementTop = $element.offset().top,
+				elementBottom = elementTop + elementHeight,
+				elementFits = clipHeight > elementHeight,
+				$anchor,
+				anchorPosition = 0,
+				findPositionAnchor = function ( input ) {
+					var $label,
+						id = input.attr( "id" );
+					if ( input.is( ":input" ) && id ) {
+						$label = input.siblings( "label[for=" + id + "]" );
+						if ( $label.length > 0 ) {
+							return $label.eq( 0 );
+						}
+					}
+					return input;
+				};
+
+			switch( true ) {
+				case elementFits && clipTop < elementTop && clipBottom > elementBottom: // element fits in view is inside clip area
+					// pass, element position is ok
+					break;
+				case elementFits && clipTop < elementTop && clipBottom < elementBottom: // element fits in view but its visible only at top
+				case elementFits && clipTop > elementTop && clipBottom > elementBottom: // element fits in view but its visible only at bottom
+				case elementFits: // element fits in view but is not visible
+					this.centerToElement(element);
+					break;
+				case clipTop < elementTop && clipBottom < elementBottom: // element visible only at top
+				case clipTop > elementTop && clipBottom > elementBottom: // element visible only at bottom
+					// pass, we cant do anything, if we move the scroll
+					// the user could lost view of something he scrolled to
+					break;
+				default: // element is not visible
+					$anchor = findPositionAnchor( $element );
+					anchorPosition = $anchor.position().top + parseFloat( $anchor.css("marginTop" ) );
+					$anchor.parentsUntil($view).each(function () {
+						var $p = $( this );
+						anchorPosition += ( $p.position().top + parseFloat( $p.css("marginTop" ) ) );
+					});
+					this.scrollTo( self._sx, -anchorPosition );
+					break;
+			}
+		},
+
+		/**
+		 * Returns current scroll position {x,y}
+		 * @return {Object}
+		 */
+		getScrollPosition: function () {
+			return { x: -this._sx, y: -this._sy };
+		},
+
+		/**
+		 * Skipps dragging
+		 * @param {Boolean}
+		 */
+		skipDragging: function ( value ) {
+			this._skip_dragging = value;
+		},
+
+		/**
+		 * Returns scroll hierarchy in an array of elements
+		 * @private
+		 * @return {Array}
+		 */
+		_getScrollHierarchy: function () {
+			var svh = [],
+				d;
+
+			this._$clip.parents( ".ui-scrollview-clip").each( function () {
+				d = $( this ).jqmData("scrollview");
+				if ( d ) {
+					svh.unshift( d );
+				}
+			} );
+			return svh;
+		},
+
+		/**
+		 * Returns ancestor for specified direction
+		 * @private
+		 * @param {string} dir
+		 */
+		_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;
+		},
+
+		/**
+		 * Handles dragstart event
+		 * @private
+		 * @param {Event} e
+		 * @param {number} ex Event x position
+		 * @param {number} ey Event y position
+		 */
+		_handleDragStart: function ( e, ex, ey ) {
+			this._stopMScroll();
+
+			this._didDrag = false;
+			this._skip_dragging = false;
+			this._clipHeight = this._$clip.height();
+			var target = $( e.target ),
+				self = this,
+				$c = this._$clip,
+				svdir = this.options.direction;
+
+			/* should prevent the default behavior when click the button */
+			this._is_button = target.is( '.ui-btn' ) ||
+					target.is( '.ui-btn-text' ) ||
+					target.is( '.ui-btn-inner' ) ||
+					target.is( '.ui-btn-inner .ui-icon' );
+
+			/* should prevent the default behavior when click the slider */
+			if ( target.parents('.ui-slider').length || target.is('.ui-slider') ) {
+				this._skip_dragging = true;
+				return;
+			}
+
+			if ( target.is('textarea') ) {
+				target.bind( "scroll", function () {
+					self._skip_dragging = true;
+					target.unbind("scroll");
+				});
+			}
+
+			/*
+			 * We need to prevent the default behavior to
+			 * suppress accidental selection of text, etc.
+			 */
+			this._is_inputbox = target.is(':input') ||
+					target.parents(':input').length > 0;
+
+			if ( this._is_inputbox ) {
+				target.one( "resize.scrollview", function () {
+					if ( ey > $c.height() ) {
+						self.scrollTo( -ex, self._sy - ey + $c.height(),
+							self.options.snapbackDuration );
+					}
+				});
+			}
+
+			if ( this.options.eventType === "mouse" && !this._is_inputbox && !this._is_button ) {
+				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 = "";
+
+			this._lastMove = 0;
+			this._enableTracking();
+
+			this._set_scrollbar_size();
+		},
+
+		/**
+		 * Propagates dragging
+		 * @private
+		 * @param {jQuery} sv
+		 * @param {Event} e
+		 * @param {number} ex
+		 * @param {number} ey
+		 * @param {string} dir
+		 */
+		_propagateDragMove: function ( sv, e, ex, ey, dir ) {
+			this._hideScrollBars();
+			this._hideOverflowIndicator();
+			this._disableTracking();
+			sv._handleDragStart( e, ex, ey );
+			sv._directionLock = dir;
+			sv._didDrag = this._didDrag;
+		},
+
+		/**
+		 * Handles drag event
+		 * @private
+		 * @param {Event}
+		 * @param {number} ex
+		 * @param {number} ey
+		 * @return {boolean|undefined}
+		 */
+		_handleDragMove: function ( e, ex, ey ) {
+			this._moveInterval = ey;
+			if ( this._skip_dragging ) {
+				return;
+			}
+
+			if ( !this._dragging ) {
+				return;
+			}
+
+			if ( !this._is_inputbox && !this._is_button ) {
+				e.preventDefault();
+			}
+
+			var mt = this.options.moveThreshold,
+				dx = ex - this._lastX,
+				dy = ey - this._lastY,
+				svdir = this.options.direction,
+				dir = null,
+				x,
+				y,
+				sv,
+				scope,
+				newX,
+				newY,
+				dirLock;
+
+			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 || (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;
+
+				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 ) {
+				if ( Math.abs( this._startY - ey ) < mt && dirLock !== "xy" && this._didDrag === false ) {
+					return;
+				}
+
+				y = this._sy;
+				this._speedY = dy;
+				newY = y + dy;
+
+				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;
+			}
+
+			this._lastX = ex;
+			this._lastY = ey;
+
+			this._setScrollPosition( newX, newY );
+
+			if ( this._didDrag === false ) {
+				this._didDrag = true;
+				this._showScrollBars();
+				this._showOverflowIndicator();
+
+				this._$clip.parents(".ui-scrollview-clip").each( function () {
+					$( this ).scrollview( "skipDragging", true );
+				} );
+			}
+		},
+
+		/**
+		 * Handles drag stop event, and returns drag status
+		 * @param {Event} e
+		 * @return {Boolean|undefined}
+		 */
+		_handleDragStop: function ( e ) {
+			var self = this;
+
+			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 ( sx || sy ) {
+				if ( !this._setGestureScroll( sx, sy ) ) {
+					this._startMScroll( sx, sy );
+				}
+			} else {
+				this._hideScrollBars();
+				this._hideOverflowIndicator();
+			}
+
+			this._disableTracking();
+
+			if ( this._endEffect ) {
+				setTimeout( function () {
+					self._setEndEffect( "out" );
+					self._hideScrollBars();
+					self._hideOverflowIndicator();
+				}, 300 );
+			}
+
+			return !this._didDrag;
+		},
+
+		/**
+		 * Detects gestures and sets proper gesture direction
+		 * @private
+		 * @param {number} sx
+		 * @param {number} sy
+		 * @return {boolean}
+		 */
+		_setGestureScroll: function ( sx, sy ) {
+			var self = this,
+				reset = function () {
+					clearTimeout( self._gesture_timer );
+					self._gesture_dir = 0;
+					self._gesture_timer = undefined;
+				},
+				direction = {
+					top: 0,
+					bottom: 1,
+					left: 2,
+					right: 3
+				};
+
+			if ( !sy && !sx ) {
+				return false;
+			}
+
+			if ( Math.abs( sx ) > Math.abs( sy ) ) {
+				dir = sx > 0 ? direction.left : direction.right;
+			} else {
+				dir = sy > 0 ? direction.top : direction.bottom;
+			}
+
+			if ( !this._gesture_timer ) {
+				this._gesture_dir = dir;
+
+				this._gesture_timer = setTimeout( function () {
+					reset();
+				}, 1000 );
+
+				return false;
+			}
+
+			if ( this._gesture_dir !== dir ) {
+				reset();
+				return false;
+			}
+
+			return false;
+		},
+
+		/**
+		 * Enables dragging
+		 * @private
+		 */
+		_enableTracking: function () {
+			this._dragging = true;
+		},
+
+		/**
+		 * Disables dragging
+		 * @private
+		 */
+		_disableTracking: function () {
+			this._dragging = false;
+		},
+
+		/**
+		 * Shows scrollbars
+		 * When interval is specified, the scrollbars will be
+		 * hidden after the specified time in miliseconds
+		 * @private
+		 * @param {number} [interval]
+		 */
+		_showScrollBars: function ( interval ) {
+			var vclass = "ui-scrollbar-visible",
+				self = this;
+
+			if ( !this.options.showScrollBars ) {
+				return;
+			}
+			if ( this._scrollbar_showed ) {
+				return;
+			}
+
+			if ( this._$vScrollBar ) {
+				this._$vScrollBar.addClass( vclass );
+			}
+			if ( this._$hScrollBar ) {
+				this._$hScrollBar.addClass( vclass );
+			}
+
+			this._scrollbar_showed = true;
+
+			if ( interval ) {
+				setTimeout( function () {
+					self._hideScrollBars();
+				}, interval );
+			}
+		},
+
+		/**
+		 * Hides scrollbars
+		 * @private
+		 */
+		_hideScrollBars: function () {
+			var vclass = "ui-scrollbar-visible";
+
+			if ( !this.options.showScrollBars ) {
+				return;
+			}
+			if ( !this._scrollbar_showed ) {
+				return;
+			}
+
+			if ( this._$vScrollBar ) {
+				this._$vScrollBar.removeClass( vclass );
+			}
+			if ( this._$hScrollBar ) {
+				this._$hScrollBar.removeClass( vclass );
+			}
+
+			this._scrollbar_showed = false;
+		},
+
+		/**
+		 * Sets opacities for the oveflow indicator
+		 * according to specified direction. The direction
+		 * is optional. Specify 1 for top, 0 for bottom, and
+		 * a falsy value for both
+		 * @private
+		 * @param {number} [dir] 0
+		 */
+		_setOverflowIndicator: function ( dir ) {
+			if ( dir === 1 ) {
+				this._display_indicator_top = "none";
+				this._display_indicator_bottom = "block";
+			} else if ( dir === 0 ) {
+				this._display_indicator_top = "block";
+				this._display_indicator_bottom = "none";
+			} else {
+				this._display_indicator_top = "block";
+				this._display_indicator_bottom = "block";
+			}
+		},
+
+		/**
+		 * Display overflow indicator
+		 * @private
+		 */
+		_showOverflowIndicator: function () {
+			if ( !$( this.element ).is( ".ui-content" ) ) {
+				return true;
+			}
+
+			if ( !this.options.overflowEnable || !this._overflowAvail || this._softkeyboard ) {
+				return;
+			}
+
+			this._overflow_top.css( "display", this._display_indicator_top );
+			this._overflow_bottom.css( "display", this._display_indicator_bottom );
+
+			this._overflow_showed = true;
+		},
+
+		/**
+		 * Hide overflow indicator
+		 * @private
+		 */
+		_hideOverflowIndicator: function () {
+			if ( !this.options.overflowEnable || !this._overflowAvail || this._softkeyboard ) {
+				return;
+			}
+
+			if ( this._overflow_showed === false ) {
+				return;
+			}
+
+			this._overflow_top.css( "display", "none" );
+			this._overflow_bottom.css( "display", "none" );
+
+			this._overflow_showed = false;
+			this._setOverflowIndicator();
+		},
+
+		/**
+		 * Bind events
+		 * @private
+		 * @return {boolean|undefined}
+		 */
+		_add_event: function () {
+			var self = this,
+				$c = this._$clip,
+				$v = this._$view;
+
+			if ( this.options.eventType === "mouse" ) {
+				this._dragEvt = "mousedown mousemove mouseup click mousewheel";
+
+				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;
+
+					case "mousewheel":
+						var old = self.getScrollPosition();
+						self.scrollTo( -old.x,
+							-(old.y - e.originalEvent.wheelDelta) );
+						break;
+					}
+				};
+			} else {
+				this._dragEvt = "touchstart touchmove touchend";
+				var _in_progress = false;
+				this._dragCB = function ( e ) {
+					var touches = e.originalEvent.touches;
+
+					switch ( e.type ) {
+					case "touchstart":
+						if ( touches.length != 1 || _in_progress ) {
+							return;
+						}
+
+						_in_progress = true;
+
+						return self._handleDragStart( e,
+								touches[0].pageX, touches[0].pageY );
+
+					case "touchmove":
+						if ( !_in_progress || touches.length != 1) {
+							return;
+						}
+
+						return self._handleDragMove( e,
+								touches[0].pageX, touches[0].pageY );
+
+					case "touchend":
+						if ( !_in_progress ) {
+							return;
+						}
+
+						_in_progress = false;
+
+						if ( touches.length != 0 ) {
+							return;
+						}
+
+						return self._handleDragStop( e );
+					}
+				};
+			};
+
+			$v.bind( this._dragEvt, this._dragCB );
+
+			// N_SE-35696 / N_SE-35800
+			var clipScrollDelta = 0,
+				clipScrollLast = 0;
+			$c.on( "scroll", function () {
+				var clipScrollTop = $c.scrollTop(),
+					currentPositon = self.getScrollPosition(),
+					inputs;
+
+				clipScrollDelta = clipScrollTop - clipScrollLast;
+				clipScrollLast = clipScrollTop;
+
+				if ( clipScrollDelta > 0 ) {
+					inputs = $v.find( ":input.ui-focus" );
+					$c.scrollTop( 0 );
+					if ( inputs.length ) {
+						// CHECK WHERE WE ARE IN THE INPUTS
+						clipScrollDelta = 0;
+					}
+					self.scrollTo( -currentPositon.x, -( currentPositon.y + clipScrollDelta ) );
+				}
+			} );
+
+			$v.bind( "keydown", function ( e ) {
+				var $focusedElement;
+
+				if ( e.keyCode == 9 ) {
+					return false;
+				}
+
+				$focusedElement = $c.find( ".ui-focus" );
+				if ( !$focusedElement.length ) {
+					return;
+				}
+				self.ensureElementIsVisible( $focusedElement );
+
+				return;
+			});
+
+			$v.bind( "keyup", function ( e ) {
+				var $input;
+
+				if ( e.keyCode !== 9 ) {
+					return;
+				}
+
+				/* Tab Key */
+				$input = $( this ).find( ":input.ui-focus" ).eq( 0 );
+				if ( !$input ) {
+					return;
+				}
+				self.ensureElementIsVisible( $input );
+				$input.focus();
+
+				return false;
+			});
+
+			$c.bind( "updatelayout", function ( e ) {
+				var sy,
+					vh,
+					view_h = self._getViewHeight();
+
+				if ( !$c.height() || !view_h ) {
+					self.scrollTo( 0, 0, 0 );
+					return;
+				}
+
+				sy = $c.height() - view_h;
+				vh = view_h - self._view_height;
+
+				self._view_height = view_h;
+
+				if ( vh == 0 || vh > $c.height() / 2 ) {
+					return;
+				}
+
+				if ( sy > 0 ) {
+					self.scrollTo( 0, 0, 0 );
+				} else if ( self._sy - sy <= -vh ) {
+					self.scrollTo( 0, self._sy,
+						self.options.snapbackDuration );
+				} else if ( self._sy - sy <= vh + self.options.moveThreshold ) {
+					self.scrollTo( 0, sy,
+						self.options.snapbackDuration );
+				}
+			});
+
+			$( window ).bind( "resize", function ( e ) {
+				var focused,
+					view_h = self._getViewHeight();
+
+				if ( $(".ui-page-active").get(0) !== $c.closest(".ui-page").get(0) ) {
+					return;
+				}
+
+				if ( !$c.height() || !view_h ) {
+					return;
+				}
+
+				focused = $c.find(".ui-focus");
+
+				if ( focused ) {
+					focused.trigger("resize.scrollview");
+				}
+
+				/* calibration - after triggered throttledresize */
+				setTimeout( function () {
+					var view_w = $v.outerWidth(),
+						cw = $c.outerWidth(),
+						scroll_x,
+						scroll_y;
+					if ( self._sy < $c.height() - self._getViewHeight() ) {
+						scroll_y = $c.height() - self._getViewHeight();
+						scroll_x = 0;
+					}
+					if ( self._sx < cw - view_w ) {
+						scroll_x = cw - view_w;
+						scroll_y = scroll_y || 0;
+					}
+					if (scroll_x || scroll_y) {
+						self.scrollTo( scroll_x, scroll_y, self.options.overshootDuration );
+					}
+				}, 260 );
+
+				self._view_height = view_h;
+				self._clipHeight = self._$clip.height();
+			});
+
+			$( window ).bind( "vmouseout", function ( e ) {
+				var drag_stop = false;
+
+				if ( $(".ui-page-active").get(0) !== $c.closest(".ui-page").get(0) ) {
+					return;
+				}
+
+				if ( !self._dragging ) {
+					return;
+				}
+
+				if ( e.pageX < 0 || e.pageX > $( window ).width() ) {
+					drag_stop = true;
+				}
+
+				if ( e.pageY < 0 || e.pageY > $( window ).height() ) {
+					drag_stop = true;
+				}
+
+				if ( drag_stop ) {
+					self._hideScrollBars();
+					self._hideOverflowIndicator();
+					self._disableTracking();
+				}
+			});
+
+			this._softkeyboard = false;
+			this._softkeyboardHeight = 0;
+
+			window.addEventListener( "softkeyboardchange", function ( e ) {
+				if ( $(".ui-page-active").get(0) !== $c.closest(".ui-page").get(0) ) {
+					return;
+				}
+
+				self._softkeyboard = ( e.state === "on" ? true : false );
+				self._softkeyboardHeight = parseInt( e.height ) *
+						( $( window ).width() / window.screen.availWidth );
+			});
+
+			$c.closest(".ui-page")
+				.bind( "pageshow", function ( e ) {
+					self._view_height = self._$view.height();
+
+					/* should be called after pagelayout */
+					setTimeout( function () {
+						self._view_height = self._getViewHeight();
+						self._set_scrollbar_size();
+						self._setScrollPosition( self._sx, self._sy );
+						self._showScrollBars( 2000 );
+					}, 0 );
+				});
+
+			$c.closest(".ui-page").find( ".ui-popup" )
+				.bind( "popupafteropen", function ( e ) {
+					if ( !$( self.element ).parents().is( ".ui-ctxpopup" ) ) {
+						return true;
+					}
+
+                                        setTimeout( function () {
+                                                self._setScrollPosition( self._sx, self._sy );
+						self._showScrollBars( 2000 );
+                                        }, 0 );
+				});
+		},
+
+		/**
+		 * Adds scrollbar elements to DOM
+		 * @private
+		 */
+		_add_scrollbar: function () {
+			var $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.showScrollBars ) {
+				return;
+			}
+
+			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");
+			}
+
+			this._scrollbar_showed = false;
+		},
+
+		/**
+		 * Adds scroll jump button to DOM
+		 * @private
+		 */
+		_add_scroll_jump: function () {
+			var $c = this._$clip,
+				self = this,
+				top_btn,
+				left_btn;
+
+			if ( !this.options.scrollJump ) {
+				return;
+			}
+
+			if ( this._vTracker ) {
+				top_btn = $( '<div class="ui-scroll-jump-top-bg">' +
+						'<div data-role="button" data-inline="true" data-icon="scrolltop" data-style="box"></div></div>' );
+				$c.append( top_btn ).trigger("create");
+
+				top_btn.bind( "vclick", function () {
+					self.scrollTo( 0, 0, self.options.overshootDuration );
+				} );
+			}
+
+			if ( this._hTracker ) {
+				left_btn = $( '<div class="ui-scroll-jump-left-bg">' +
+						'<div data-role="button" data-inline="true" data-icon="scrollleft" data-style="box"></div></div>' );
+				$c.append( left_btn ).trigger("create");
+
+				left_btn.bind( "vclick", function () {
+					self.scrollTo( 0, 0, self.options.overshootDuration );
+				} );
+			}
+		},
+
+		/**
+		 * Adds overflow indicator to DOM
+		 * @private
+		 */
+		_add_overflow_indicator: function () {
+			if ( !this.options.overflowEnable ) {
+				return;
+			}
+
+			this._overflow_top = $( '<div class="ui-overflow-indicator-top"></div>' );
+			this._overflow_bottom = $( '<div class="ui-overflow-indicator-bottom"></div>' );
+
+			this._$clip.append( this._overflow_top );
+			this._$clip.append( this._overflow_bottom );
+
+			this._display_indicator_top = "block";
+			this._display_indicator_bottom = "block";
+			this._overflow_showed = false;
+		},
+
+		/**
+		 * Sets the size of the scrollbars
+		 * @private
+		 */
+		_set_scrollbar_size: function () {
+			var $c = this._$clip,
+				$v = this._$view,
+				cw = 0,
+				vw = 0,
+				ch = 0,
+				vh = 0,
+				thumb;
+
+			if ( !this.options.showScrollBars ) {
+				return;
+			}
+
+			if ( this._hTracker ) {
+				cw = $c.width();
+				vw = $v.width();
+				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 ? "0" :
+							(Math.floor(cw / vw * 100) || 1) + "%") );
+				}
+			}
+
+			if ( this._vTracker ) {
+				ch = $c.height();
+				vh = this._getViewHeight();
+				this._maxY = ch - vh;
+
+				if ( this._maxY > 0 || vh === 0 ) {
+					this._maxY = 0;
+				}
+				if ( ( this._$vScrollBar && vh ) || vh === 0 ) {
+					thumb = this._$vScrollBar.find(".ui-scrollbar-thumb");
+					thumb.css( "height", (ch >= vh ? "0" :
+							(Math.floor(ch / vh * 100) || 1) + "%") );
+
+					this._overflowAvail = !!thumb.height();
+				}
+			}
+		}
+	});
+
+	/**
+	 * Momentum tracker
+	 */
+	$.extend( MomentumTracker.prototype, {
+		/**
+		 * Starts momentum callculations
+		 * @param {number} pos
+		 * @param {number} speed
+		 * @param {number} duration
+		 * @param {number} minPos
+		 * @param {number} maxPos
+		 */
+		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();
+		},
+
+		/**
+		 * Resets momentum tracker calculations and sets
+		 * state to done
+		 */
+		reset: function () {
+			this.state = tstates.done;
+			this.pos = 0;
+			this.speed = 0;
+			this.minPos = 0;
+			this.maxPos = 0;
+			this.duration = 0;
+			this.remained = 0;
+		},
+
+		/**
+		 * Recalculate momentum tracker estimates
+		 * @param {boolean} overshootEnable
+		 * @return {number} position
+		 */
+		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;
+
+			this.remained = 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 ( !overshootEnable ) {
+						this.state = tstates.done;
+					}
+					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;
+		},
+
+		/**
+		 * Checks if momentum state is done
+		 * @return {boolean}
+		 */
+		done: function () {
+			return this.state === tstates.done;
+		},
+
+		/**
+		 * Checks if the position is minimal
+		 * @return {boolean}
+		 */
+		isMin: function () {
+			return this.pos === this.minPos;
+		},
+
+		/**
+		 * Checks if the position is maximal
+		 * @return {boolean}
+		 */
+		isMax: function () {
+			return this.pos === this.maxPos;
+		},
+
+		/**
+		 * Check if momentum tracking is available
+		 * @return {boolean}
+		 */
+		isAvail: function () {
+			return !( this.minPos === this.maxPos );
+		},
+
+		/**
+		 * Returns remaining time
+		 * @return {number}
+		 */
+		getRemained: function () {
+			return this.remained;
+		},
+
+		/**
+		 * Returns current position
+		 * @return {number}
+		 */
+		getPosition: function () {
+			return this.pos;
+		}
+	});
+
+	$( document ).bind( 'pagecreate create', function ( e ) {
+		var $page = $( e.target ),
+			content_scroll = $page.find(".ui-content").jqmData("scroll");
+
+		/* content scroll */
+		if ( $.support.scrollview === undefined ) {
+			$.support.scrollview = true;
+		}
+
+		if ( $.support.scrollview === true && content_scroll === undefined ) {
+			content_scroll = "y";
+		}
+
+		if ( content_scroll !== "y" ) {
+			content_scroll = "none";
+		}
+
+		$page.find(".ui-content").attr( "data-scroll", content_scroll );
+
+		$page.find(":jqmData(scroll)").not(".ui-scrollview-clip").each( function () {
+			if ( $( this ).hasClass("ui-scrolllistview") ) {
+				$( this ).scrolllistview();
+			} else {
+				var st = $( this ).jqmData("scroll"),
+					dir = st && ( st.search(/^[xy]/) !== -1 ) ? st : null,
+					content = $(this).hasClass("ui-content"),
+					opts;
+
+				if ( st === "none" ) {
+					return;
+				}
+
+				opts = {
+					direction: dir || undefined,
+					overflowEnable: content,
+					scrollMethod: $( this ).jqmData("scroll-method") || undefined,
+					scrollJump: $( this ).jqmData("scroll-jump") || undefined
+				};
+
+				$( this ).scrollview( opts );
+			}
+		});
+	});
+
+	$( document ).bind( 'pageshow', function ( e ) {
+		var $page = $( e.target ),
+			scroll = $page.find(".ui-content").jqmData("scroll");
+
+		if ( scroll === "y" ) {
+			resizePageContentHeight( e.target );
+		}
+	});
+
+}( jQuery, window, document ) );
+
+
+
+/* ***************************************************************************
+ * 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>
+ */
+
+/*
+ * Gallery widget
+ *
+ * HTML Attributes
+ *
+ *  data-role: set to 'gallery'
+ *  data-index: start index
+ *  data-vertical-align: set to top or middle or bottom.
+ *
+ * APIs
+ *
+ *  add(file): add the image (parameter: url of iamge)
+ *  remove(index): remove the image (parameter: index of image)
+ *  refresh(index): refresh the widget, should be called after add or remove. (parameter: start index)
+ *  empty: remove all of images from the gallery
+ *  length: get length of images
+ *  value(index): get or set current index of gallery (parameter: index of image)
+ *
+ * Events
+ *
+ *  N/A
+ *
+ * Example
+ *
+ * <div data-role="gallery" id="gallery" data-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>
+ *
+ *
+ * $('#gallery-add').bind('vmouseup', function ( e ) {
+ *	$('#gallery').gallery('add', '9.jpg');
+ *	$('#gallery').gallery('add', '10.jpg');
+ *	$('#gallery').gallery('refresh');
+ * });
+ *
+ * $('#gallery-del').bind('vmouseup', function ( e ) {
+ *	$('#gallery').gallery('remove');
+ * });
+ *
+ */
+
+ /**
+	@class Gallery
+	The gallery widget shows images in a gallery on the screen. <br/><br/> To add an gallery widget to the application, use the following code:
+
+		<div data-role="gallery" id="gallery" data-vertical-align="middle" data-index="3">
+			<img src="01.jpg">
+			<img src="02.jpg">
+			<img src="03.jpg">
+			<img src="04.jpg">
+			<img src="05.jpg">
+		</div>
+*/
+/**
+	@property {Integer} data-index
+	Defines the index number of the first image in the gallery.
+	<br/>The default value is 0.
+*/
+/**
+	@property {String} data-vertical-align
+	Defines the image alignment. The alignment options are top, middle, and bottom.
+	<br/>The default value is top.
+*/
+/**
+	@method add
+	The add method is used to add an image to the gallery. The image_file attribute defines the image file URL.
+
+		<div id="gallery" data-role="gallery" data-vertical-align="middle"></div>
+		$("#gallery").gallery('add', [image_file]);
+*/
+/**
+	@method remove
+	The remove method is used to delete an image from the gallery. The image_index attribute defines the index of the image to be deleted. If not set removes current image.
+
+		<div id="gallery" data-role="gallery" data-vertical-align="middle"></div>
+		$("#gallery").gallery('remove', [image_index]);
+*/
+/**
+	@method refresh
+	The refresh method is used to refresh the gallery. This method must be called after adding images to the gallery.
+
+		<div id="gallery" data-role="gallery" data-vertical-align="middle"></div>
+		$("#gallery").gallery('refresh');
+*/
+/**
+	@method empty
+	The empty method is used to remove all of images from the gallery.
+
+		<div id="gallery" data-role="gallery" data-vertical-align="middle"></div>
+		$("#gallery").gallery('empty');
+*/
+/**
+	@method length
+	The length method is used to get length of images.
+
+		<div id="gallery" data-role="gallery" data-vertical-align="middle"></div>
+		length = $("#gallery").gallery('length');
+*/
+/**
+	@method value
+	The value method is used to get or set current index of gallery. The image_index attribute defines the index of the image to be set. If not get current index.
+
+		<div id="gallery" data-role="gallery" data-vertical-align="middle"></div>
+		value = $("#gallery").gallery('value');
+		$("#gallery").gallery('value', [image_index]);
+*/
+(function ( $, window, undefined ) {
+	$.widget( "tizen.gallery", $.mobile.widget, {
+		options: {
+			flicking: false,
+			duration: 500
+		},
+
+		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,
+		orientationEventFire: false,
+
+		_resize: function ( index ) {
+			var img = this.images[index],
+				width = this.images[index].width(),
+				height = this.images[index].height(),
+				margin = 0,
+				ratio,
+				img_max_width = this.max_width - margin,
+				img_max_height = this.max_height - margin;
+
+			ratio = height / width;
+
+			if( img_max_width == 0 && isNaN( img_max_height ) ) {
+				/*
+				Exception : When image max width and height has incorrect value.
+				This exception is occured when this.max_width value is 0 and this.max_height value is NaN when page transition like rotation.
+				This exception affect that image width and height values are 0.
+				*/
+				img.width( width );
+				img.height( width * ratio );
+			} else {
+				if ( width > img_max_width ) {
+					img.width( img_max_width );
+					img.height( img_max_width * ratio );
+				}
+
+				height = img.height();
+
+				if ( height > img_max_height ) {
+					img.height( img_max_height );
+					img.width( img_max_height / ratio );
+				}
+			}
+		},
+
+		_align: function ( index, obj ) {
+			var img = this.images[index],
+				img_top = 0;
+
+			if ( !obj ) {
+				return;
+			}
+			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' );
+		},
+
+		_attach: function ( index, obj ) {
+			var self = this,
+				processing = function () {
+					self._resize( index );
+					self._align( index, obj );
+
+				},
+				loading = function () {
+					if ( self.images[index] === undefined ) {
+						return;
+					}
+
+					if ( !self.images[index].height() ) {
+						setTimeout( loading, 10 );
+						return;
+					}
+
+					processing();
+				};
+
+			if ( !obj ) {
+				return;
+			}
+			if ( !obj.length ) {
+				return;
+			}
+			if ( index < 0 ) {
+				return;
+			}
+			if ( !this.images.length ) {
+				return;
+			}
+			if ( index >= this.images.length ) {
+				return;
+			}
+
+			obj.css( "display", "block" );
+			obj.css( "visibility", "hidden" );
+			obj.append( this.images[index] );
+			loading();
+		},
+
+		_detach: function ( index, obj ) {
+			if ( !obj ) {
+				return;
+			}
+			if ( !obj.length ) {
+				return;
+			}
+			if ( index < 0 ) {
+				return;
+			}
+			if ( index >= this.images.length ) {
+				return;
+			}
+
+			obj.css( "display", "none" );
+			this.images[index].removeAttr("style");
+			this.images[index].detach();
+		},
+
+		_detach_all: function () {
+			var i;
+
+			for ( i = 0; i < this.images.length; i++ ) {
+				this.images[i].detach();
+			}
+		},
+
+		_drag: function ( _x ) {
+			var delta,
+				coord_x;
+
+			if ( !this.dragging ) {
+				return;
+			}
+
+			if ( this.options.flicking === 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._moveLeft( this.cur_img , coord_x + 'px' );
+			if ( this.next_img.length ) {
+				this._moveLeft( this.next_img ,  coord_x + this.window_width + 'px' );
+			}
+			if ( this.prev_img.length ) {
+				this._moveLeft( this.prev_img ,  coord_x - this.window_width + 'px' );
+			}
+		},
+
+		_move: function ( _x ) {
+			var delta = this.org_x - _x,
+				flip = 0,
+				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 ) {
+				drag_time = Date.now() - 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._moveLeft( this.next_img ,  this.window_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._moveLeft( this.prev_img , -this.window_width + 'px' );
+						this._attach( this.index - 1, this.prev_img );
+					}
+
+					this.direction = -1;
+				}
+			}
+
+			sec = this.options.duration;
+			self = this;
+
+			this.moving = true;
+
+			setTimeout( function () {
+				self.moving = false;
+			}, sec - 25 );
+
+			this._moveLeft( this.cur_img, 0 + 'px', sec );
+			if ( this.next_img.length ) {
+				this._moveLeft( this.next_img, this.window_width + 'px', sec );
+			}
+			if ( this.prev_img.length ) {
+				this._moveLeft( this.prev_img, -this.window_width + 'px', 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;
+
+				self.org_time = Date.now();
+			} );
+
+			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' );
+		},
+		_setTranslateposition : function ( $ele, value ) {
+			var translate,
+				cssArray = null,
+				self = this;
+
+			if ( $.support.cssTransform3d ) {
+				translate = "translate3d(" + value + ", 0px, 0px)";
+			} else {
+				translate = "translate(" + value + ", 0px)";
+			}
+			cssArray = {"-moz-transform": translate,
+					"-webkit-transform": translate,
+					"-ms-transform": translate,
+					"-o-transform": translate,
+					"transform": translate};
+
+			$ele.css(cssArray);
+			return $ele;
+		},
+		_hidePrevNext : function() {
+			var self = this;
+
+			if( self.next_img ) {
+				self.next_img.css( "visibility", "hidden" );
+			}
+			if( self.prev_img ) {
+				self.prev_img.css( "visibility", "hidden" );
+			}
+
+		},
+		_hideCur : function() {
+			var self = this;
+			if( self.cur_img ) {
+				self.cur_img.css( "visibility", "hidden" );
+			}
+		},
+		_moveLeft : function ( $ele , value , duration ) {
+			var translate,
+				transition = "",
+				cssArray = null,
+				self = this;
+
+			if ( $.support.cssTransform3d ) {
+				translate = "translate3d(" + value + ", 0px, 0px)";
+			} else {
+				translate = "translate(" + value + ", 0px)";
+			}
+			if( duration !== undefined ) {
+				transition =  "-webkit-transform " + (duration / 1000)+ "s ease";
+			}
+			cssArray = {"-moz-transform": translate,
+					"-webkit-transform": translate,
+					"-ms-transform": translate,
+					"-o-transform": translate,
+					"transform": translate};
+			if( transition !== "" ) {
+				cssArray["-webkit-transition"] = transition ;
+				if( value == "0px" ) {
+					$ele.one( 'webkitTransitionEnd', self._hidePrevNext );
+				} else {
+					$ele.one( 'webkitTransitionEnd', self._hideCur );
+				}
+			}
+			if( value == "0px" ) {
+				$ele.css( "visibility", "visible" );
+			}
+
+			$ele.css(cssArray);
+			return $ele;
+		},
+		_show: function () {
+			/* resizing */
+			this.window_width = $( window ).width();
+			this.max_width = this._get_width();
+			this.max_height = this._get_height();
+			this.container.css( 'height', this.max_height );
+
+			this.cur_img = $( 'div' ).find( '.ui-gallery-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 );
+
+			this.cur_img.css( 'visibility', 'visible' );
+			if ( this.prev_img.length ) {
+				this._setTranslateposition( this.prev_img, -this.window_width + 'px');
+			}
+
+			this._moveLeft( this.cur_img, '0px');
+			if ( this.next_img.length ) {
+				this._setTranslateposition( this.next_img, this.window_width + 'px' );
+			}
+		},
+
+		show: function () {
+			if ( !this.images.length ) {
+				return;
+			}
+
+			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_width: function () {
+			return $( this.element ).width();
+		},
+
+		_get_height: function () {
+			var $page = $( this.element ).parentsUntil( 'ui-page' ),
+				$content = $page.children( '.ui-content' ),
+				header_h = $page.children( '.ui-header' ).outerHeight() || 0,
+				footer_h = $page.children( '.ui-footer' ).outerHeight() || 0,
+				padding = parseFloat( $content.css( 'padding-top' ) )
+					+ parseFloat( $content.css( 'padding-bottom' ) ),
+				content_h = $( window ).height() - header_h - footer_h - padding;
+
+			return content_h;
+		},
+
+		_create: function () {
+			var temp_img,
+				self = this,
+				index,
+				i = 0;
+
+			$( this.element ).wrapInner( '<div class="ui-gallery"></div>' );
+			$( this.element ).find( 'img' ).wrap( '<div class="ui-gallery-bg"></div>' );
+
+			this.container = $( this.element ).find('.ui-gallery');
+
+			temp_img = $( 'div' ).find( '.ui-gallery-bg:first' );
+
+			while ( temp_img.length ) {
+				this.images[i] = temp_img.find( 'img' );
+				temp_img = temp_img.next();
+				i++;
+			}
+
+			this._detach_all();
+
+			index = parseInt( $( this.element ).jqmData( 'index' ), 10 );
+			if ( !index ) {
+				index = 0;
+			}
+			if ( index < 0 ) {
+				index = 0;
+			}
+			if ( index >= this.images.length ) {
+				index = this.images.length - 1;
+			}
+
+			this.index = index;
+
+			this.align_type = $( this.element ).jqmData( 'vertical-align' );
+
+			$.extend( this, {
+				_globalHandlers: [
+					{
+						src: $( window ),
+						handler: {
+							orientationchange: $.proxy( this, "_orientationHandler" ),
+							resize: $.proxy( this, "_resizeHandler" )
+						}
+					}
+				]
+			});
+
+			$.each( this._globalHandlers, function( idx, value ) {
+				value.src.bind( value.handler );
+			});
+		},
+
+		_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-gallery-bg"></div>' );
+				temp_img = $( '<img src="' + image_file + '"></div>' );
+
+				bg_html.append( temp_img );
+				this.container.append( bg_html );
+				this.images.push( temp_img );
+			}
+
+			this._detach_all();
+		},
+		_resizeHandler: function() {
+			var self = this;
+			if( self.orientationEventFire ) {
+				self.refresh();
+				$( event.target ).trigger( "galleryorientationchanged", this );
+				self.orientationEventFire = false;
+			}
+		},
+		_orientationHandler: function() {
+			var self = this;
+			self.refresh();
+			self.orientationEventFire = true;
+		},
+		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();
+
+			return this.index;
+		},
+
+		add: function ( file ) {
+			this.images_hold.push( file );
+		},
+
+		remove: function ( index ) {
+			var temp_img;
+
+			if ( index === undefined ) {
+				index = this.index;
+			}
+
+			if ( index < 0 || index >= this.images.length ) {
+				return;
+			}
+
+			if ( 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._moveLeft( this.prev_img, -this.window_width + 'px' );
+						this._attach( 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._moveLeft( this.next_img, this.window_width + 'px' );
+						this._attach( index + 2, this.next_img );
+					}
+				}
+				this._moveLeft( this.cur_img, '0px', this.options.duration );
+
+			} else if ( index == this.index - 1 ) {
+				temp_img = this.prev_img;
+				this.prev_img = this.prev_img.prev();
+				if ( this.prev_img.length ) {
+					this._moveLeft( this.prev_img, -this.window_width + 'px' );
+					this._attach( index - 1, this.prev_img );
+				}
+				this.index--;
+
+			} else if ( index == this.index + 1 ) {
+				temp_img = this.next_img;
+				this.next_img = this.next_img.next();
+				if ( this.next_img.length ) {
+					this._moveLeft( this.next_img, this.window_width + 'px' );
+					this._attach( index + 1, this.next_img );
+				}
+
+			} else {
+				temp_img = $( 'div' ).find( '.ui-gallery-bg:eq(' + index + ')' );
+			}
+
+			this.images.splice( index, 1 );
+			temp_img.detach();
+		},
+
+		empty: function () {
+			this.images.splice( 0, this.images.length );
+			this.container.find('.ui-gallery-bg').detach();
+		},
+
+		length: function () {
+			return this.images.length;
+		},
+
+		value: function ( index ) {
+			if ( index === undefined ) {
+				return this.index;
+			}
+
+			this.refresh( index );
+		},
+
+		unbind: function() {
+			$.each( this._globalHandlers, function( idx, value ) {
+				value.src.unbind( value.handler );
+			});
+		},
+
+		destory: function() {
+			this.unbind();
+		}
+
+	}); /* End of widget */
+
+	// auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( e.target ).find( ":jqmData(role='gallery')" ).gallery();
+	});
+
+	$( document ).bind( "pageshow", function ( e ) {
+		$( e.target ).find( ":jqmData(role='gallery')" ).gallery( 'show' );
+	});
+
+	$( document ).bind( "pagebeforehide", function ( e ) {
+		$( e.target ).find( ":jqmData(role='gallery')" ).gallery( 'hide' );
+	} );
+
+	$( document ).bind( "pageremove", function ( e ) {
+		//unbind resize and orientationchange events
+		$( e.target ).find( ":jqmData(role='gallery')" ).gallery( 'unbind' );
+	});
+
+}( jQuery, this ) );
+
+
+
+/* ***************************************************************************
+* style : normal, check
+* option :
+*    - folded : decide to show divider press effect or not
+*    - line : decide to draw divider line or not
+*/
+/**
+	@class ListDivider
+	The list divider widget is used as a list separator for grouping lists. List dividers can be used in Tizen as described in the jQueryMobile documentation for list dividers.<br/>
+	To add a list divider widget to the application, use the following code:
+
+		<li data-role="list-divider" data-style="check">
+		<form><input type="checkbox" name="c2line-check1" /></form></li>
+
+	The list divider can define callbacks for events as described in the jQueryMobile documentation for list events. <br/> You can use methods with the list divider as described in the jQueryMobile documentation for list methods.
+
+	@since tizen2.0	
+*/
+/**
+	@property {String} data-style
+	Sets the style of the list divider. The style options are dialogue, check, expandable, and checkexpandable.
+*/
+
+(function ( $, undefined ) {
+	$.widget( "tizen.listdivider", $.mobile.widget, {
+		options: {
+			initSelector: ":jqmData(role='list-divider')",
+			folded : false,
+			listDividerLine : true
+		},
+
+		_create: function () {
+
+			var $listdivider = this.element,
+				openStatus = true,
+				expandSrc,
+				listDividerLine = true,
+				style = $listdivider.attr( "data-style" );
+
+			if ( $listdivider.data("line") === false ) {
+				this.options.listDividerLine = false;
+			}
+
+			if ( $listdivider.data("folded") === true ) {
+				this.options.folded = true;
+			}
+
+			if ( style == undefined || style === "normal" || style === "check" ) {
+				if ( this.options.folded ) {
+					$listdivider.buttonMarkup();
+				} else {
+					$listdivider.wrapInner("<span class='ui-btn-text'></span>");
+				}
+
+				if ( this.options.listDividerLine ) {
+					expandSrc = "<span class='ui-divider-normal-line'></span>";
+					if ( this.options.folded ) {
+						$( expandSrc ).appendTo( $listdivider.children( ".ui-btn-inner" ) );
+					} else {
+						$( expandSrc ).appendTo( $listdivider);
+					}
+				}
+			}
+
+			$listdivider.bind( "vclick", function ( event, ui ) {
+			/* need to implement expand/collapse divider */
+			});
+		}
+	});
+
+	//auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.listdivider.prototype.options.initSelector, e.target ).listdivider();
+	});
+}( 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: Yonghwi Park <yonghwi0324.park@samsung.com>
+ *		 Wonseop Kim <wonseop.kim@samsung.com>
+*/
+
+/**
+ *
+ * MultiMediaView is a widget that lets the user view and handle multimedia contents.
+ * Video and audio elements are coded as standard HTML elements and enhanced by the 
+ * MultiMediaview to make them attractive and usable on a mobile device.
+ *
+ * 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-full-screen : Set a status that full-screen when inital start.
+ *				Default value is 'false'.
+ *
+ * APIs:
+ *			width( [number] )
+ *					: Get or set the width of widget.
+ *					The first argument is the width of widget.
+ *					If no first argument is specified, will act as a getter.
+ *			height( [number] )
+ *					: Get or set the height of widget.
+ *					The first argument is the height of widget.
+ *					If no first argument is specified, will act as a getter.
+ *			fullScreen( [boolean] )
+ *					: Get or Set the status of full-screen.
+ *					If no first argument is specified, will act as a getter.
+ *
+ * Events:
+ *
+ *			N/A
+ *
+ * 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>
+ *
+ */
+/**
+	@class MutimediaView
+	The multimedia view widget shows a player control that you can use to view and handle multimedia content. This widget uses the standard HTML video and audio elements, which have been enhanced for use on a mobile device.
+
+	To add a multimedia view widget to the application, use the following code:
+	
+		// Video player control
+		<video data-controls="true" style="width:100%;">
+		<source src="<VIDEO_FILE_URL>" type="video/mp4" /> Your browser does not support the video tag. </video>
+		// Audio player control
+		<audio data-controls="true" style="width:100%;"> <source src="<AUDIO_FILE_URL>" type="audio/mp3" /> Your browser does not support the audio tag.
+		</audio>
+*/
+/**
+	@property {Boolean} data-control
+	Sets the controls for the widget.
+	The default value is true. If the value is set to true, the widget uses its own player controls. If the value is set to false, the widget uses the browser's player controls.
+*/
+/**
+	@property {Boolean} data-full-screen
+	Defines whether the widget opens in the fullscreen view mode.
+	The default value is false.
+*/
+/**
+	@property {String} data-theme
+	Sets the widget theme.
+	If the value is not set, the parent control's theme is used
+*/
+/**
+	@method width
+	The width method is used to get (if no value is defined) or set the multimedia view widget width:
+		<video>
+			 <source src="test.mp4" type="video/mp4" />
+		</video>
+		$(".selector").multimediaview("width", [value]);
+*/
+/**
+	@method height
+	The height method is used to get (if no value is defined) or set the multimedia view widget height:
+		<video>
+			<source src="test.mp4" type="video/mp4" />
+		</video>
+		$(".selector").multimediaview("height", [value]);
+*/
+/**
+	@method fullScreen
+	The fullScreen method is used to get (if no value is defined) or set the full-screen mode of the multimedia view widget. If the value is true, the full-screen mode is used; otherwise the multimedia view widget runs in the normal mode.
+
+		<video>
+			<source src="test.mp4" type="video/mp4" />
+		</video>
+		$(".selector").multimediaview("fullScreen", [value]);
+*/
+( 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],
+				isVideo = ( viewElement.nodeName === "VIDEO" ),
+				option = self.options,
+				parentTheme = $.mobile.getInheritedTheme( view, "s" ),
+				theme = option.theme || parentTheme,
+				width = viewElement.style.getPropertyValue( "width" ) || "",
+				wrap = $( "<div class='ui-multimediaview-wrap ui-multimediaview-" + theme + "'>" ),
+				control = null;
+
+			$.extend( this, {
+				role: null,
+				controlTimer: null,
+				isVolumeHide: true,
+				backupView: null,
+				_reserveVolume: -1,
+				_isVideo: isVideo
+			});
+
+			view.addClass( "ui-multimediaview" );
+			control = self._createControl();
+			control.hide();
+
+			$( ".ui-button", control ).addClass( "ui-shadow ui-btn-corner-all" );
+			$( ".ui-volumecontrol .ui-handle", control ).addClass( "ui-shadow ui-btn-corner-circle" );
+
+			view.wrap( wrap ).after( control );
+
+			if ( isVideo ) {
+				control.addClass( "ui-multimediaview-video" );
+			} else {
+				self.width( width );
+				self.options.fullScreen = false;
+			}
+
+			if ( option.controls && view.attr( "controls" ) ) {
+				view.removeAttr( "controls" );
+			}
+
+			self._addEvent();
+		},
+
+		_resize: function () {
+			this._resizeFullscreen( this.options.fullScreen );
+			this._resizeControl();
+			this._updateSeekBar();
+			this._updateVolumeState();
+		},
+
+		_resizeControl: function () {
+			var self = this,
+				view = self.element,
+				viewElement = view[0],
+				isVideo = self._isVideo,
+				wrap = view.parent( ".ui-multimediaview-wrap" ),
+				control = wrap.find( ".ui-multimediaview-control" ),
+				buttons = control.find( ".ui-button" ),
+				playpauseButton = control.find( ".ui-playpausebutton" ),
+				seekBar = control.find( ".ui-seekbar" ),
+				durationLabel = control.find( ".ui-durationlabel" ),
+				timestampLabel = control.find( ".ui-timestamplabel" ),
+				volumeControl = control.find( ".ui-volumecontrol" ),
+				volumeBar = volumeControl.find( ".ui-volumebar" ),
+				width = ( isVideo ? view.width() : wrap.width() ),
+				height = ( isVideo ? view.height() : control.height() ),
+				offset = view.offset(),
+				controlHeight = control.height(),
+				availableWidth = 0,
+				controlOffset = null;
+
+			if ( control ) {
+				if ( isVideo ) {
+					controlOffset = control.offset();
+					controlOffset.left = offset.left;
+					controlOffset.top = offset.top + height - controlHeight;
+					control.offset( controlOffset );
+				}
+				control.width( width );
+			}
+
+			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" );
+			}
+
+			if ( seekBar.width() < ( volumeBar.width() + timestampLabel.width() + durationLabel.width() ) ) {
+				durationLabel.hide();
+			} else {
+				durationLabel.show();
+			}
+		},
+
+		_resizeFullscreen: function ( isFullscreen ) {
+			if ( !this._isVideo ) {
+				return;
+			}
+
+			var self = this,
+				view = self.element,
+				viewElement = view[0],
+				wrap = view.parent( ".ui-multimediaview-wrap" ),
+				control = wrap.find( ".ui-multimediaview-control" ),
+				fullscreenButton = control.find( ".ui-fullscreenbutton" ),
+				currentPage = $( ".ui-page-active" ),
+				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" ),
+				body = $( "body" )[0],
+				header = currentPage.children( ".ui-header" ),
+				footer = currentPage.children( ".ui-footer" ),
+				docWidth = 0,
+				docHeight = 0;
+
+			if ( isFullscreen ) {
+				if ( !self.backupView ) {
+					self.backupView = {
+						width: viewElement.style.getPropertyValue( "width" ) || "",
+						height: viewElement.style.getPropertyValue( "height" ) || "",
+						position: view.css( "position" ),
+						zindex: view.css( "z-index" ),
+						wrapHeight: wrap[0].style.getPropertyValue( "height" ) || ""
+					};
+				}
+				docWidth = body.clientWidth;
+				docHeight = body.clientHeight - 1;
+
+				header.hide();
+				footer.hide();
+				view.parents().each( function ( e ) {
+					var element = $( this );
+					element.addClass( "ui-fullscreen-parents" )
+						.siblings()
+						.addClass( "ui-multimediaview-siblings-off" );
+				});
+				fullscreenButton.removeClass( "ui-fullscreen-on" ).addClass( "ui-fullscreen-off" );
+
+				wrap.height( docHeight );
+				view.width( docWidth ).height( docHeight );
+			} else {
+				if ( !self.backupView ) {
+					return;
+				}
+
+				header.show();
+				footer.show();
+				view.parents().each( function ( e ) {
+					var element = $( this );
+					element.removeClass( "ui-fullscreen-parents" )
+						.siblings()
+						.removeClass( "ui-multimediaview-siblings-off" );
+				});
+
+				fullscreenButton.removeClass( "ui-fullscreen-off" ).addClass( "ui-fullscreen-on" );
+
+				wrap.css( "height", self.backupView.wrapHeight );
+				view.css( {
+					"width": self.backupView.width,
+					"height": self.backupView.height,
+					"position": self.backupView.position,
+					"z-index": self.backupView.zindex
+				});
+				self.backupView = null;
+
+				$( window ).trigger( "throttledresize" );
+			}
+		},
+
+		_addEvent: function () {
+			var self = this,
+				view = self.element,
+				option = self.options,
+				viewElement = view[0],
+				isVideo = self._isVideo,
+				control = view.parent( ".ui-multimediaview-wrap" ).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-handle" ),
+				fullscreenButton = control.find( ".ui-fullscreenbutton" ),
+				seekBar = control.find( ".ui-seekbar" ),
+				durationBar = seekBar.find( ".ui-duration" ),
+				currenttimeBar = seekBar.find( ".ui-currenttime" ),
+				touchStartEvt = ( $.support.touch ? "touchstart" : "mousedown" ),
+				touchMoveEvt = ( $.support.touch ? "touchmove" : "mousemove" ) + ".multimediaview",
+				touchEndEvt = ( $.support.touch ? "touchend" : "mouseup" ) + ".multimediaview",
+				$document = $( document );
+
+			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.muted && viewElement.volume > 0.1 ) {
+					volumeButton.removeClass( "ui-volume-icon" ).addClass( "ui-mute-icon" );
+					self._reserveVolume = viewElement.volume;
+					viewElement.volume = 0;
+				} else if ( self._reserveVolume !== -1 && !viewElement.muted ) {
+					volumeButton.removeClass( "ui-mute-icon" ).addClass( "ui-volume-icon" );
+					viewElement.volume = self._reserveVolume;
+					self._reserveVolume = -1;
+				} else if ( viewElement.volume < 0.1 ) {
+					volumeButton.removeClass( "ui-volume-icon" ).addClass( "ui-mute-icon" );
+				} else {
+					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( "click.multimediaview", function ( e ) {
+				if ( !self.options.controls ) {
+					return;
+				}
+
+				control.fadeToggle( "fast" );
+				self._resize();
+			}).bind( "multimediaviewinit", function ( e ) {
+				if ( option.controls ) {
+					control.show();
+				}
+				self._resize();
+			});
+
+			$( ".ui-button", control ).bind( touchStartEvt, function () {
+				var button = $( this ).addClass( "ui-button-down" );
+
+				$document.bind( touchMoveEvt, function () {
+					button.trigger( touchEndEvt );
+				});
+			}).bind( touchEndEvt, function () {
+				$( this ).removeClass( "ui-button-down" );
+				$document.unbind( touchMoveEvt );
+			});
+
+			playpauseButton.bind( "click.multimediaview", function () {
+				self._endTimer();
+
+				if ( viewElement.paused ) {
+					viewElement.play();
+				} else {
+					viewElement.pause();
+				}
+
+				if ( isVideo ) {
+					self._startTimer();
+				}
+			});
+
+			fullscreenButton.bind( "click.multimediaview", function ( e ) {
+				e.preventDefault();
+				self.fullScreen( !self.options.fullScreen );
+				self._resize();
+				self._endTimer();
+				e.stopPropagation();
+			});
+
+			seekBar.bind( touchStartEvt, function ( e ) {
+				var x = $.support.touch ? e.originalEvent.changedTouches[0].pageX : e.pageX,
+					duration = viewElement.duration,
+					durationOffset = durationBar.offset(),
+					durationWidth = durationBar.width(),
+					timerate = ( x - durationOffset.left ) / durationWidth,
+					time = duration * timerate;
+
+				if ( !viewElement.played.length ) {
+					return;
+				}
+
+				viewElement.currentTime = time;
+
+				self._endTimer();
+
+				e.preventDefault();
+
+				control.bind( touchMoveEvt, function ( e ) {
+					var x = $.support.touch ? e.originalEvent.changedTouches[0].pageX : e.pageX,
+						timerate = ( x - durationOffset.left ) / durationWidth;
+
+					viewElement.currentTime = duration * timerate;
+
+					e.stopPropagation();
+				}).bind( touchEndEvt, function () {
+					control.unbind( ".multimediaview" );
+					$document.unbind( touchMoveEvt );
+					if ( viewElement.paused ) {
+						viewElement.pause();
+					} else {
+						viewElement.play();
+					}
+					e.stopPropagation();
+				});
+
+				$document.bind( touchMoveEvt, function () {
+					control.trigger( touchEndEvt );
+				});
+			});
+
+			volumeButton.bind( "click.multimediaview", function () {
+				if ( self.isVolumeHide ) {
+					var view = self.element,
+						volume = viewElement.volume;
+
+					self.isVolumeHide = false;
+					volumeControl.fadeIn( "fast", function () {
+						self._updateVolumeState();
+						self._updateSeekBar();
+					});
+					self._resize();
+				} else {
+					self.isVolumeHide = true;
+					volumeControl.fadeOut( "fast", function () {
+						self._resize();
+					});
+				}
+			});
+
+			volumeBar.bind( touchStartEvt, function ( e ) {
+				var baseX = $.support.touch ? e.originalEvent.changedTouches[0].pageX : e.pageX,
+					volumeGuideLeft = volumeGuide.offset().left,
+					volumeGuideWidth = volumeGuide.width(),
+					volumeBase = volumeGuideLeft + volumeGuideWidth,
+					handlerOffset = volumeHandle.offset(),
+					volumerate = ( baseX - volumeGuideLeft ) / volumeGuideWidth,
+					currentVolume = ( baseX - volumeGuideLeft ) / volumeGuideWidth;
+
+				self._endTimer();
+				volumeHandle.addClass( "ui-button-down" );
+				self._setVolume( currentVolume.toFixed( 2 ) );
+
+				e.preventDefault();
+
+				control.bind( touchMoveEvt, function ( e ) {
+					var x = $.support.touch ? e.originalEvent.changedTouches[0].pageX : e.pageX,
+						currentVolume = ( x - volumeGuideLeft );
+					currentVolume = ( currentVolume < 0 ) ? 0 : currentVolume / volumeGuideWidth;
+					self._setVolume( ( currentVolume > 1 ) ? 1 : currentVolume.toFixed( 2 ) );
+
+					e.stopPropagation();
+				}).bind( touchEndEvt, function () {
+					control.unbind( ".multimediaview" );
+					$document.unbind( touchMoveEvt );
+					volumeHandle.removeClass( "ui-button-down" );
+					e.stopPropagation();
+				});
+
+				$document.bind( touchMoveEvt, function () {
+					control.trigger( touchEndEvt );
+				});
+			});
+		},
+
+		_removeEvent: function () {
+			var view = this.element,
+				control = view.parent( ".ui-multimediaview-wrap" ).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-handle" );
+
+			view.unbind( ".multimediaview" );
+			playpauseButton.unbind( ".multimediaview" );
+			fullscreenButton.unbind( ".multimediaview" );
+			seekBar.unbind( ".multimediaview" );
+			volumeBar.unbind( ".multimediaview" );
+			volumeHandle.unbind( ".multimediaview" );
+		},
+
+		_createControl: function () {
+			var view = this.element,
+				viewElement = view[0],
+				control = $( "<span></span>" ).addClass( "ui-multimediaview-control" ),
+				playpauseButton = $( "<span></span>" ).addClass( "ui-playpausebutton ui-button ui-play-icon" ),
+				seekBar = $( "<span></span>" ).addClass( "ui-seekbar ui-multimediaview-bar" ),
+				timestampLabel = $( "<span><p>00:00:00</p></span>" ).addClass( "ui-timestamplabel" ),
+				durationLabel = $( "<span><p>00:00:00</p></span>" ).addClass( "ui-durationlabel" ),
+				volumeButton = $( "<span></span>" ).addClass( "ui-volumebutton ui-button" ),
+				volumeControl = $( "<span></span>" ).addClass( "ui-volumecontrol" ),
+				volumeBar = $( "<div></div>" ).addClass( "ui-volumebar ui-multimediaview-bar" ),
+				volumeGuide = $( "<span></span>" ).addClass( "ui-guide ui-multimediaview-bar-bg" ),
+				volumeValue = $( "<span></span>" ).addClass( "ui-value ui-multimediaview-bar-highlight" ),
+				volumeHandle = $( "<span></span>" ).addClass( "ui-handle" ),
+				fullscreenButton = $( "<span></span>" ).addClass( "ui-fullscreenbutton ui-button" ),
+				durationBar = $( "<span></span>" ).addClass( "ui-duration ui-multimediaview-bar-bg" ),
+				currenttimeBar = $( "<span></span>" ).addClass( "ui-currenttime ui-multimediaview-bar-highlight" );
+
+			seekBar.append( durationBar ).append( currenttimeBar ).append( durationLabel ).append( timestampLabel );
+
+			volumeButton.addClass( viewElement.muted ? "ui-mute-icon" : "ui-volume-icon" );
+			volumeBar.append( volumeGuide ).append( volumeValue ).append( volumeHandle );
+			volumeControl.append( volumeBar );
+
+			control.append( playpauseButton ).append( seekBar ).append( volumeControl ).append( volumeButton );
+
+			if ( this._isVideo ) {
+				$( 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( ".ui-multimediaview-wrap" ).find( ".ui-multimediaview-control" ),
+				volumeControl = control.find( ".ui-volumecontrol" );
+
+			self.controlTimer = setTimeout( function () {
+				self.isVolumeHide = true;
+				self.controlTimer = null;
+				volumeControl.hide();
+				control.fadeOut( "fast" );
+			}, duration );
+		},
+
+		_endTimer: function () {
+			if ( this.controlTimer ) {
+				clearTimeout( this.controlTimer );
+				this.controlTimer = null;
+			}
+		},
+
+		_convertTimeFormat: function ( systime ) {
+			if ( !$.isNumeric( systime ) ) {
+				return "Playback Error";
+			}
+
+			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 view = this.element,
+				viewElement = view[0],
+				duration = viewElement.duration,
+				control = view.parent( ".ui-multimediaview-wrap" ).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 = viewElement.currentTime;
+			}
+			timebarWidth = parseInt( currenttime / duration * durationWidth, 10 );
+			durationBar.offset( durationOffset );
+			currenttimeBar.offset( durationOffset ).width( timebarWidth );
+			timestampLabel.find( "p" ).text( this._convertTimeFormat( currenttime ) );
+		},
+
+		_updateVolumeState: function () {
+			var view = this.element,
+				control = view.parent( ".ui-multimediaview-wrap" ).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-handle" ),
+				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.offset( volumeGuide.offset() ).width( parseInt( volumeGuideWidth * ( volume ), 10 ) );
+		},
+
+		_setVolume: function ( value ) {
+			var viewElement = this.element[0];
+
+			if ( value < 0.0 || value > 1.0 ) {
+				return;
+			}
+
+			viewElement.volume = value;
+		},
+
+		width: function ( value ) {
+			if ( this.options.fullScreen ) {
+				return;
+			}
+
+			var view = this.element,
+				wrap = view.parent( ".ui-multimediaview-wrap" );
+
+			if ( arguments.length === 0 ) {
+				return view.width();
+			}
+
+			if ( !this._isVideo ) {
+				wrap.width( value );
+			}
+
+			view.width( value );
+			this._resize();
+		},
+
+		height: function ( value ) {
+			if ( !this._isVideo || this.options.fullScreen ) {
+				return;
+			}
+
+			var view = this.element;
+
+			if ( arguments.length === 0 ) {
+				return view.height();
+			}
+
+			view.height( value );
+			this._resize();
+		},
+
+		fullScreen: function ( value ) {
+			if ( !this._isVideo ) {
+				return;
+			}
+
+			var view = this.element,
+				option = this.options;
+
+			if ( arguments.length === 0 ) {
+				return option.fullScreen;
+			}
+
+			view.parents( ".ui-scrollview-clip" ).scrollview( "scrollTo", 0, 0 );
+
+			this.options.fullScreen = value;
+
+			this._resize();
+		},
+
+		refresh: function () {
+			this._resize();
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$.tizen.multimediaview.prototype.enhanceWithin( e.target );
+	}).bind( "pagechange", function ( e ) {
+		$( e.target ).find( ".ui-multimediaview" ).each( function () {
+			var view = $( this ),
+				viewElement = view[0];
+
+			if ( viewElement.autoplay ) {
+				viewElement.play();
+			}
+			view.multimediaview( "refresh" );
+		});
+	}).bind( "pagebeforechange", function ( e ) {
+		$( e.target ).find( ".ui-multimediaview" ).each( function () {
+			var view = $( this ),
+				viewElement = view[0],
+				isFullscreen = view.multimediaview( "fullScreen" );
+
+			if ( isFullscreen ) {
+				view.multimediaview( "fullScreen", !isFullscreen );
+			}
+
+			if ( viewElement.played.length !== 0 ) {
+				viewElement.pause();
+			}
+		});
+	});
+
+	$( window ).bind( "resize orientationchange", function ( e ) {
+		$( ".ui-page-active" ).find( ".ui-multimediaview" ).multimediaview( "refresh" );
+	});
+
+} ( 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.
+ * ***************************************************************************
+ */
+
+// 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({
+			"-ms-transform": v,
+			"-o-transform": v,
+			"-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 Date.now();
+	}
+
+	$.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 () {
+			var self = this;
+
+			this._items = $( this.element ).jqmData('list');
+			this._$clip = $( this.element ).addClass( "ui-scrollview-clip" );
+			this._$clip.wrapInner( '<div class="ui-scrollview-view"></div>' );
+			this._$view = $('.ui-scrollview-view', this._$clip );
+			this._$list = $( 'ul', this._$clip );
+
+			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;
+
+			this._timerCB = function () { self._handleMomentumScroll(); };
+
+			this.refresh();
+
+			this._addBehaviors();
+		},
+
+		reflow: function () {
+			var xy = this.getScrollPosition();
+			this.refresh();
+			this.scrollTo( xy.x, xy.y );
+		},
+
+		refresh: function () {
+			var itemsPerView;
+
+			this._$clip.width( $(window).width() );
+			this._clipWidth = this._$clip.width();
+			this._$list.empty();
+			this._$list.append(this._items[0]);
+			this._itemWidth = $(this._items[0]).outerWidth();
+			$(this._items[0]).detach();
+
+			itemsPerView = this._clipWidth / this._itemWidth;
+			itemsPerView = Math.ceil( itemsPerView * 10 ) / 10;
+			this._itemsPerView = parseInt( itemsPerView, 10 );
+			while ( this._itemsPerView + 1 > this._items.length ) {
+				$.merge( this._items, $(this._items).clone() );
+			}
+			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, duration ) {
+			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 * 1.5 );
+					this.scrollTo( newX + this._itemWidth, 0 );
+					this.scrollTo( newX, 0, duration );
+					return;
+				}
+			}
+		},
+
+		scrollTo: function ( x, y, duration ) {
+			this._stopMScroll();
+			if ( !duration ) {
+				this._setScrollPosition( x, y );
+				this._rx = x;
+				return;
+			}
+
+			var self = this,
+				start = getCurrentTime(),
+				efunc = $.easing.easeOutQuad,
+				sx = this._rx,
+				sy = 0,
+				dx = x - sx,
+				dy = 0,
+				tfunc,
+				elapsed,
+				ec;
+
+			this._rx = x;
+
+			tfunc = function () {
+				elapsed = getCurrentTime() - start;
+				if ( elapsed >= duration ) {
+					self._timerID = 0;
+					self._setScrollPosition( x, y );
+					self._$clip.trigger("scrollend");
+				} 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
+
+
+
+/*
+ * 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>
+ *		 Yonghwi Park <yonghwi0324.park@samsung.com>
+ */
+
+// fastscroll 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-fastscroll="true" to a listview
+// (a <ul> or <ol> element inside a page). Alternatively, call
+// fastscroll() 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.
+
+/**
+	@class fastscroll
+	The shortcut scroll widget shows a shortcut list that is bound to its parent scroll bar and respective list view. This widget is displayed as a text pop-up representing shortcuts to different list dividers in the list view. If you select a shortcut text from the shortcut scroll, the parent list view is moved to the location representing the selected shortcut.
+
+	To add a shortcut scroll widget to the application, use the following code:
+
+		<div class="content" data-role="content" data-scroll="y">
+			<ul id="contacts" data-role="listview" data-fastscroll="true">
+				<li>Anton</li>
+			</ul>
+		</div>
+
+	For the shortcut scroll widget to be visible, the parent list view must have multiple list dividers.
+*/
+
+/**
+	@property {Boolean}  data-fastscroll
+	When set to true, creates a shortcut scroll using the HTML unordered list (&lt;ul&gt;) element.
+*/
+/**
+	@method fastscroll
+	The shortcut scroll is created for the closest list view with the ui-scrollview-clip class.
+*/
+/**
+	@method indexString
+	The indexString method is used to get (if no value is defined) or set the string to present the index.
+
+		<div class="content" data-role="content" data-scroll="y">
+			ul id="contacts" data-role="listview" data-fastscroll="true">
+				<li data-role="list-divider">A</li>
+				<li>Anton</li>
+			</ul>
+		</div>
+
+		$(".selector").fastscroll( "indexString" [, indexAlphabet] );
+*/
+(function ( $, undefined ) {
+
+	$.widget( "tizen.fastscroll", $.mobile.widget, {
+		options: {
+			initSelector: ":jqmData(fastscroll)"
+		},
+
+		_primaryLanguage: null,
+		_secondLanguage: null,
+		_dividerMap: {},
+		_charSet: null,
+
+		_create: function () {
+			var $el = this.element,
+				self = this,
+				$popup,
+				page = $el.closest( ':jqmData(role="page")' ),
+				jumpToDivider;
+
+			this.scrollview = $el.addClass( 'ui-fastscroll-target' ).closest( '.ui-scrollview-clip' );
+			this.shortcutsContainer = $( '<div class="ui-fastscroll" aria-label="Fast scroll bar, double tap to fast scroll mode" tabindex="0"/>' );
+			this.shortcutsList = $( '<ul aria-hidden="true"></ul>' );
+
+			// popup for the hovering character
+			this.scrollview.append($( '<div class="ui-fastscroll-popup"></div>' ) );
+			$popup = this.scrollview.find( '.ui-fastscroll-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();
+
+			this.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();
+			};
+
+			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();
+
+					self.shortcutsContainer.addClass( "ui-fastscroll-hover" );
+
+					// 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;
+					}
+
+					if ( e.target.tagName.toLowerCase() === "span" ) {
+						coords.x += $( e.target ).parent().offset().left - shortcutsListOffset.left;
+						coords.y += $( e.target ).parent().offset().top  - shortcutsListOffset.top;
+					}
+
+					self.shortcutsList.find( 'li' ).each( function () {
+						var listItem = $( this );
+						$( listItem )
+							.removeClass( "ui-fastscroll-hover" )
+							.removeClass( "ui-fastscroll-hover-down" );
+					});
+					// 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 ) ),
+							unit,
+							baseTop,
+							baseBottom,
+							omitSet,
+							i;
+
+						if ( coords.x >= l && coords.x <= r && coords.y >= t && coords.y <= b ) {
+							if ( listItem.text() !== "." ) {
+								self._hitItem( listItem );
+							} else {
+								omitSet = listItem.data( "omitSet" );
+								unit = ( b - t ) / omitSet.length;
+								for ( i = 0; i < omitSet.length; i++ ) {
+									baseTop = t + ( i * unit );
+									baseBottom = baseTop + unit;
+									if ( coords.y >= baseTop && coords.y <= baseBottom ) {
+										self._hitOmitItem( listItem, omitSet.charAt( i ) );
+									}
+								}
+							}
+							return false;
+						}
+						return true;
+					} );
+
+					e.preventDefault();
+					e.stopPropagation();
+				} )
+				// bind mouseout of the fastscroll container to remove popup
+				.bind( 'touchend mouseup vmouseup vmouseout', function () {
+					$popup.hide();
+					$( ".ui-fastscroll-hover" ).removeClass( "ui-fastscroll-hover" );
+					$( ".ui-fastscroll-hover-first-item" ).removeClass( "ui-fastscroll-hover-first-item" );
+					$( ".ui-fastscroll-hover-down" ).removeClass( "ui-fastscroll-hover-down" );
+					self.shortcutsContainer.removeClass( "ui-fastscroll-hover" );
+				} );
+
+			if ( page && !( page.is( ':visible' ) ) ) {
+				page.bind( 'pageshow', function () { self.refresh(); } );
+			} else {
+				self.refresh();
+			}
+
+			// refresh the list when dividers are filtered out
+			$el.bind( 'updatelayout', function () {
+				self.refresh();
+			} );
+		},
+
+		_findClosestDivider: function ( targetChar ) {
+			var i,
+				dividerMap = this._dividerMap,
+				charSet = this._charSet,
+				charSetLen = charSet.length,
+				targetIdx = charSet.indexOf( targetChar ),
+				lastDivider,
+				subDivider = null;
+
+			for ( i = 0; i < targetIdx; ++i ) {
+				lastDivider = dividerMap[ charSet.charAt( i ) ];
+				if ( lastDivider !== undefined ) {
+					subDivider = lastDivider;
+				}
+			}
+			if ( !subDivider ) {
+				for ( ++i; i < charSetLen; ++i ) {
+					lastDivider = dividerMap[ charSet.charAt( i ) ];
+					if ( lastDivider !== undefined ) {
+						subDivider = lastDivider;
+						break;
+					}
+				}
+			}
+			return subDivider;
+		},
+
+		_hitOmitItem: function ( listItem, text ) {
+			var $popup = this.scrollview.find( '.ui-fastscroll-popup' ),
+				divider;
+
+			divider = this._dividerMap[ text ] || this._findClosestDivider( text );
+			if ( typeof divider !== "undefined" ) {
+				this.jumpToDivider( $( divider ) );
+			}
+
+			$popup.text( text ).show();
+
+			$( listItem ).addClass( "ui-fastscroll-hover" );
+			if ( listItem.index() === 0 ) {
+				$( listItem ).addClass( "ui-fastscroll-hover-first-item" );
+			}
+			$( listItem ).siblings().eq( listItem.index() ).addClass( "ui-fastscroll-hover-down" );
+		},
+
+		_hitItem: function ( listItem  ) {
+			var $popup = this.scrollview.find( '.ui-fastscroll-popup' ),
+				text = listItem.text(),
+				divider;
+
+			if ( text === "#" ) {
+				divider = this._dividerMap.number;
+			} else {
+				divider = this._dividerMap[ text ] || this._findClosestDivider( text );
+			}
+
+			if ( typeof divider !== "undefined" ) {
+				this.jumpToDivider( $( divider ) );
+			}
+
+			$popup.text( text ).show();
+
+			$( listItem ).addClass( "ui-fastscroll-hover" );
+			if ( listItem.index() === 0 ) {
+				$( listItem ).addClass( "ui-fastscroll-hover-first-item" );
+			}
+			$( listItem ).siblings().eq( listItem.index() ).addClass( "ui-fastscroll-hover-down" );
+		},
+
+		_focusItem: function ( listItem ) {
+			var self = this,
+				$popup = self.scrollview.find( '.ui-fastscroll-popup' );
+
+			listItem.focusin( function ( e ) {
+				self.shortcutsList.attr( "aria-hidden", false );
+				self._hitItem( listItem );
+			}).focusout( function ( e ) {
+				self.shortcutsList.attr( "aria-hidden", true );
+				$popup.hide();
+				$( ".ui-fastscroll-hover" ).removeClass( "ui-fastscroll-hover" );
+				$( ".ui-fastscroll-hover-first-item" ).removeClass( "ui-fastscroll-hover-first-item" );
+				$( ".ui-fastscroll-hover-down" ).removeClass( "ui-fastscroll-hover-down" );
+			});
+		},
+
+		_contentHeight: function () {
+			var self = this,
+				$content = $( '.ui-scrollview-clip' ),
+				header = null,
+				footer = null,
+				paddingValue = 0,
+				clipSize = $( window ).height();
+
+			if ( $content.hasClass( "ui-content" ) ) {
+				paddingValue = parseInt( $content.css( "padding-top" ), 10 );
+				clipSize = clipSize - ( paddingValue || 0 );
+				paddingValue = parseInt( $content.css( "padding-bottom" ), 10 );
+				clipSize = clipSize - ( paddingValue || 0 );
+				header = $content.siblings( ".ui-header:visible" );
+				footer = $content.siblings( ".ui-footer:visible" );
+
+				if ( header ) {
+					if ( header.outerHeight( true ) === null ) {
+						clipSize = clipSize - ( $( ".ui-header" ).outerHeight() || 0 );
+					} else {
+						clipSize = clipSize - header.outerHeight( true );
+					}
+				}
+				if ( footer ) {
+					clipSize = clipSize - footer.outerHeight( true );
+				}
+			} else {
+				clipSize = $content.height();
+			}
+			return clipSize;
+		},
+
+		_omit: function ( numOfItems, maxNumOfItems ) {
+			var maxGroupNum = parseInt( ( maxNumOfItems - 1 ) / 2, 10 ),
+				numOfExtraItems = numOfItems - maxNumOfItems,
+				groupPos = [],
+				omitInfo = [],
+				groupPosLength,
+				group,
+				size,
+				i;
+
+			if ( ( maxNumOfItems < 3 ) || ( numOfItems <= maxNumOfItems ) ) {
+				return;
+			}
+
+			if ( numOfExtraItems >= maxGroupNum ) {
+				size = 2;
+				group = 1;
+				groupPosLength = maxGroupNum;
+			} else {
+				size = maxNumOfItems / ( numOfExtraItems + 1 );
+				group = size;
+				groupPosLength = numOfExtraItems;
+			}
+
+			for ( i = 0; i < groupPosLength; i++ ) {
+				groupPos.push( parseInt( group, 10 ) );
+				group += size;
+			}
+
+			for ( i = 0; i < maxNumOfItems; i++ ) {
+				omitInfo.push( 1 );
+			}
+
+			for ( i = 0; i < numOfExtraItems; i++ ) {
+				omitInfo[ groupPos[ i % maxGroupNum ] ]++;
+			}
+
+			return omitInfo;
+		},
+
+		_createDividerMap: function () {
+			var primaryCharacterSet = this._primaryLanguage ? this._primaryLanguage.replace( /,/g, "" ) : null,
+				secondCharacterSet = this._secondLanguage ? this._secondLanguage.replace( /,/g, "" ) : null,
+				numberSet = "0123456789",
+				dividers = this.element.find( '.ui-li-divider' ),
+				map = {},
+				matchToDivider,
+				makeCharacterSet,
+				indexChar,
+				i;
+
+			matchToDivider = function ( index, divider ) {
+				if ( $( divider ).text() === indexChar ) {
+					map[ indexChar ] = divider;
+				}
+			};
+
+			makeCharacterSet = function ( index, divider ) {
+				primaryCharacterSet += $( divider ).text();
+			};
+
+			if ( primaryCharacterSet === null ) {
+				primaryCharacterSet = "";
+				dividers.each( makeCharacterSet );
+			}
+
+			for ( i = 0; i < primaryCharacterSet.length; i++ ) {
+				indexChar = primaryCharacterSet.charAt( i );
+				dividers.each( matchToDivider );
+			}
+
+			if ( secondCharacterSet !== null ) {
+				for ( i = 0; i < secondCharacterSet.length; i++ ) {
+					indexChar = secondCharacterSet.charAt( i );
+					dividers.each( matchToDivider );
+				}
+			}
+
+			dividers.each( function ( index, divider ) {
+				if ( numberSet.search( $( divider ).text() ) !== -1  ) {
+					map.number = divider;
+					return false;
+				}
+			});
+
+			this._dividerMap = map;
+			this._charSet = primaryCharacterSet + secondCharacterSet;
+		},
+
+		indexString: function ( indexAlphabet ) {
+			var self = this,
+				characterSet = [];
+
+			if ( typeof indexAlphabet === "undefined" ) {
+				return self._primaryLanguage + ":" + self._secondLanguage;
+			}
+
+			characterSet = indexAlphabet.split( ":" );
+			self._primaryLanguage = characterSet[ 0 ];
+			if ( characterSet.length === 2 ) {
+				self._secondLanguage = characterSet[ 1 ];
+			}
+		},
+
+		refresh: function () {
+			var self = this,
+				primaryCharacterSet = self._primaryLanguage ? self._primaryLanguage.replace( /,/g, "" ) : null,
+				secondCharacterSet = self._secondLanguage ? self._secondLanguage.replace( /,/g, "" ) : null,
+				contentHeight = self._contentHeight(),
+				shapItem = $( '<li tabindex="0" aria-label="double to move Number list"><span aria-hidden="true">#</span><span aria-label="Number"/></li>' ),
+				$popup = this.scrollview.find( '.ui-fastscroll-popup' ),
+				omitIndex = 0,
+				makeCharacterSet,
+				makeOmitSet,
+				itemHandler,
+				containerHeight,
+				shortcutsItems,
+				shortcutItem,
+				shortcutsTop,
+				minClipHeight,
+				maxNumOfItems,
+				numOfItems,
+				minHeight,
+				omitInfo,
+				dividers,
+				listItems,
+				emptySize,
+				correction,
+				indexChar,
+				lastIndex,
+				seconds,
+				height,
+				size,
+				i;
+
+			makeCharacterSet = function ( index, divider ) {
+				primaryCharacterSet += $( divider ).text();
+			};
+
+			makeOmitSet = function ( index, length ) {
+				var count,
+					omitSet = "";
+
+				for ( count = 0; count < length; count++ ) {
+					omitSet += primaryCharacterSet[ index + count ];
+				}
+
+				return omitSet;
+			};
+
+			self._createDividerMap();
+
+			self.shortcutsList.find( 'li' ).remove();
+
+			// get all the dividers from the list and turn them into shortcuts
+			dividers = self.element.find( '.ui-li-divider' );
+
+			// get all the list items
+			listItems = self.element.find('li').not('.ui-li-divider');
+
+			// only use visible dividers
+			dividers = dividers.filter( ':visible' );
+			listItems = listItems.filter( ':visible' );
+
+			if ( dividers.length < 2 ) {
+				self.shortcutsList.hide();
+				return;
+			}
+
+			self.shortcutsList.show();
+			self.lastListItem = listItems.last();
+			self.shortcutsList.append( shapItem );
+			self._focusItem( shapItem );
+
+			if ( primaryCharacterSet === null ) {
+				primaryCharacterSet = "";
+				dividers.each( makeCharacterSet );
+			}
+
+			minHeight = shapItem.outerHeight( true );
+			maxNumOfItems = parseInt( contentHeight / minHeight - 1, 10 );
+			numOfItems = primaryCharacterSet.length;
+
+			maxNumOfItems = secondCharacterSet ? maxNumOfItems - 2 : maxNumOfItems;
+
+			if ( maxNumOfItems < 3 ) {
+				shapItem.remove();
+				return;
+			}
+
+			omitInfo = self._omit( numOfItems, maxNumOfItems );
+
+			for ( i = 0; i < primaryCharacterSet.length; i++ ) {
+				indexChar = primaryCharacterSet.charAt( i );
+				shortcutItem = $( '<li tabindex="0" aria-label="double to move ' + indexChar + ' list">' + indexChar + '</li>' );
+
+				self._focusItem( shortcutItem );
+
+				if ( typeof omitInfo !== "undefined" && omitInfo[ omitIndex ] > 1 ) {
+					shortcutItem = $( '<li>.</li>' );
+					shortcutItem.data( "omitSet",  makeOmitSet( i, omitInfo[ omitIndex ] ) );
+					i += omitInfo[ omitIndex ] - 1;
+				}
+
+				self.shortcutsList.append( shortcutItem );
+				omitIndex++;
+			}
+
+			if ( secondCharacterSet !== null ) {
+				lastIndex = secondCharacterSet.length - 1;
+				seconds = [];
+
+				seconds.push( secondCharacterSet.charAt( 0 ) );
+				seconds.push( secondCharacterSet.charAt( lastIndex ) );
+
+				for ( i = 0; i < seconds.length; i++ ) {
+					indexChar = seconds[ i ];
+					shortcutItem = $( '<li tabindex="0" aria-label="double to move ' + indexChar + ' list">' + indexChar + '</li>' );
+
+					self._focusItem( shortcutItem );
+					shortcutItem.bind( 'vclick', itemHandler );
+					self.shortcutsList.append( shortcutItem );
+				}
+			}
+
+			containerHeight = self.shortcutsContainer.outerHeight( true );
+			emptySize = contentHeight - containerHeight;
+			shortcutsItems = self.shortcutsList.children();
+			size = parseInt( emptySize / shortcutsItems.length, 10 );
+			correction = emptySize - ( shortcutsItems.length * size );
+
+			if ( emptySize > 0 ) {
+				shortcutsItems.each( function ( index, item ) {
+					height = $( item ).height() + size;
+					if ( correction !== 0 ) {
+						height += 1;
+						correction -= 1;
+					}
+					$( item ).css( {
+						height: height,
+						lineHeight: height + "px"
+					} );
+				} );
+			}
+
+			// position the shortcut flush with the top of the first list divider
+			shortcutsTop = dividers.first().position().top;
+			self.shortcutsContainer.css( 'top', shortcutsTop );
+
+			// make the scrollview clip tall enough to show the whole of the shortcutslist
+			minClipHeight = shortcutsTop + self.shortcutsContainer.outerHeight() + 'px';
+			self.scrollview.css( 'min-height', minClipHeight );
+
+			$popup.text( "M" ) // Popup size is determined based on "M".
+				.width( $popup.height() )
+				.css( { marginLeft: -( $popup.outerWidth() / 2 ),
+					marginTop: -( $popup.outerHeight() / 2 ) } );
+		}
+	} );
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.fastscroll.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.fastscroll();
+	} );
+
+	$( window ).bind( "resize orientationchange", function ( e ) {
+		$( ".ui-page-active .ui-fastscroll-target" ).fastscroll( "refresh" );
+	} );
+} ( 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 (window) {
+		window.ensureNS = (function () {
+		var internalCache = {};
+		return function ensureNS (ns) { // name just for debugging purposes
+			var nsArr = ns.split(".").reverse(),
+				nsSoFar = "",
+				buffer = "",
+				leaf = "",
+				l = nsArr.length;
+			while(--l >= 0) {
+				leaf = nsArr[l];
+				nsSoFar = nsSoFar + (nsSoFar.length > 0 ? "." : "") + leaf;
+				if (!internalCache[nsSoFar]) {
+					internalCache[nsSoFar] = true;
+					buffer += "!window." + nsSoFar + ' && (window.' + nsSoFar + " = {});\n";
+				}
+			}
+			buffer.length && (new Function(buffer))();
+		};
+	})();
+})(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;
+}
+
+
+
+/* ***************************************************************************
+ * 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: Hyunsook Park <hyunsook.park@samsung.com>
+ *			Wonseop Kim <wonseop.kim@samsung.com>
+*/
+
+( function ( $, undefined ) {
+	$.webgl = {};
+
+	$.webgl.shader = {
+		_vertexShader: null,
+		_fragmentShader: null,
+
+		deleteShaders: function ( gl ) {
+			gl.deleteShader( this._vertexShader );
+			gl.deleteShader( this._fragmentShader );
+		},
+
+		addShaderProgram : function ( gl, vs, fs, isFile ) {
+			var shaderProgram,
+				vertexShaderSource = {},
+				fragmentShaderSource = {};
+
+			if ( isFile ) {
+				vertexShaderSource = this.loadShaderFile( vs );
+				fragmentShaderSource = this.loadShaderFile( fs );
+			} else {
+				vertexShaderSource.source = vs;
+				fragmentShaderSource.source = fs;
+			}
+
+			this._vertexShader = this.getShader( gl, gl.VERTEX_SHADER, vertexShaderSource );
+			this._fragmentShader = this.getShader( gl, gl.FRAGMENT_SHADER, fragmentShaderSource );
+
+			shaderProgram = gl.createProgram();
+			gl.attachShader( shaderProgram, this._vertexShader);
+			gl.attachShader( shaderProgram, this._fragmentShader);
+			gl.linkProgram( shaderProgram );
+
+			if ( !gl.getProgramParameter( shaderProgram, gl.LINK_STATUS ) ) {
+				window.alert( "Could not initialize Shaders!" );
+			}
+			return shaderProgram;
+		},
+
+		loadShaderFile : function ( path ) {
+			var cache = null;
+			$.ajax({
+				async : false,
+				url : path,
+				success : function ( result ) {
+					cache = {
+						source: result
+					};
+				}
+			});
+			return cache;
+		},
+
+		getShader: function ( gl, type, script ) {
+			var shader;
+
+			if ( !gl || !type || !script ) {
+				return null;
+			}
+
+			shader = gl.createShader( type );
+
+			gl.shaderSource( shader, script.source );
+			gl.compileShader( shader );
+
+			if ( !gl.getShaderParameter( shader, gl.COMPILE_STATUS ) ) {
+				window.alert( gl.getShaderInfoLog( shader ) );
+				gl.deleteShader( shader );
+				return null;
+			}
+			return shader;
+		}
+	};
+
+	$.webgl.buffer = {
+		attribBufferData: function ( gl, attribArray ) {
+			var attribBuffer = gl.createBuffer();
+
+			gl.bindBuffer( gl.ARRAY_BUFFER, attribBuffer );
+			gl.bufferData( gl.ARRAY_BUFFER, attribArray, gl.STATIC_DRAW );
+			gl.bindBuffer( gl.ARRAY_BUFFER, null );
+
+			return attribBuffer;
+		}
+	};
+
+} ( jQuery ) );
+
+
+/* ***************************************************************************
+	Flora License
+
+	Version 1.1, April, 2013
+
+	http://floralicense.org/license/
+
+	TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+	1. Definitions.
+
+	"License" shall mean the terms and conditions for use, reproduction,
+	and distribution as defined by Sections 1 through 9 of this document.
+
+	"Licensor" shall mean the copyright owner or entity authorized by
+	the copyright owner that is granting the License.
+
+	"Legal Entity" shall mean the union of the acting entity and
+	all other entities that control, are controlled by, or are
+	under common control with that entity. For the purposes of
+	this definition, "control" means (i) the power, direct or indirect,
+	to cause the direction or management of such entity,
+	whether by contract or otherwise, or (ii) ownership of fifty percent (50%)
+	or more of the outstanding shares, or (iii) beneficial ownership of
+	such entity.
+
+	"You" (or "Your") shall mean an individual or Legal Entity
+	exercising permissions granted by this License.
+
+	"Source" form shall mean the preferred form for making modifications,
+	including but not limited to software source code, documentation source,
+	and configuration files.
+
+	"Object" form shall mean any form resulting from mechanical
+	transformation or translation of a Source form, including but
+	not limited to compiled object code, generated documentation,
+	and conversions to other media types.
+
+	"Work" shall mean the work of authorship, whether in Source or Object form,
+	made available under the License, as indicated by a copyright notice
+	that is included in or attached to the work (an example is provided
+	in the Appendix below).
+
+	"Derivative Works" shall mean any work, whether in Source or Object form,
+	that is based on (or derived from) the Work and for which the editorial
+	revisions, annotations, elaborations, or other modifications represent,
+	as a whole, an original work of authorship. For the purposes of this License,
+	Derivative Works shall not include works that remain separable from,
+	or merely link (or bind by name) to the interfaces of, the Work and
+	Derivative Works thereof.
+
+	"Contribution" shall mean any work of authorship, including the original
+	version of the Work and any modifications or additions to that Work or
+	Derivative Works thereof, that is intentionally submitted to Licensor
+	for inclusion in the Work by the copyright owner or by an individual or
+	Legal Entity authorized to submit on behalf of the copyright owner.
+	For the purposes of this definition, "submitted" means any form of
+	electronic, verbal, or written communication sent to the Licensor or
+	its representatives, including but not limited to communication on
+	electronic mailing lists, source code control systems, and issue
+	tracking systems that are managed by, or on behalf of, the Licensor
+	for the purpose of discussing and improving the Work, but excluding
+	communication that is conspicuously marked or otherwise designated
+	in writing by the copyright owner as "Not a Contribution."
+
+	"Contributor" shall mean Licensor and any individual or Legal Entity
+	on behalf of whom a Contribution has been received by Licensor and
+	subsequently incorporated within the Work.
+
+	"Tizen Certified Platform" shall mean a software platform that complies
+	with the standards set forth in the Tizen Compliance Specification
+	and passes the Tizen Compliance Tests as defined from time to time
+	by the Tizen Technical Steering Group and certified by the Tizen
+	Association or its designated agent.
+
+	2. Grant of Copyright License.  Subject to the terms and conditions of
+	this License, each Contributor hereby grants to You a perpetual,
+	worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+	copyright license to reproduce, prepare Derivative Works of,
+	publicly display, publicly perform, sublicense, and distribute the
+	Work and such Derivative Works in Source or Object form.
+
+	3. Grant of Patent License.  Subject to the terms and conditions of
+	this License, each Contributor hereby grants to You a perpetual,
+	worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+	(except as stated in this section) patent license to make, have made,
+	use, offer to sell, sell, import, and otherwise transfer the Work
+	solely as incorporated into a Tizen Certified Platform, where such
+	license applies only to those patent claims licensable by such
+	Contributor that are necessarily infringed by their Contribution(s)
+	alone or by combination of their Contribution(s) with the Work solely
+	as incorporated into a Tizen Certified Platform to which such
+	Contribution(s) was submitted. If You institute patent litigation
+	against any entity (including a cross-claim or counterclaim
+	in a lawsuit) alleging that the Work or a Contribution incorporated
+	within the Work constitutes direct or contributory patent infringement,
+	then any patent licenses granted to You under this License for that
+	Work shall terminate as of the date such litigation is filed.
+
+	4. Redistribution.  You may reproduce and distribute copies of the
+	Work or Derivative Works thereof pursuant to the copyright license
+	above, in any medium, with or without modifications, and in Source or
+	Object form, provided that You meet the following conditions:
+
+	  1. You must give any other recipients of the Work or Derivative Works
+		 a copy of this License; and
+	  2. You must cause any modified files to carry prominent notices stating
+		 that You changed the files; and
+	  3. You must retain, in the Source form of any Derivative Works that
+		 You distribute, all copyright, patent, trademark, and attribution
+		 notices from the Source form of the Work, excluding those notices
+		 that do not pertain to any part of the Derivative Works; and
+	  4. If the Work includes a "NOTICE" text file as part of its distribution,
+		 then any Derivative Works that You distribute must include a readable
+		 copy of the attribution notices contained within such NOTICE file,
+		 excluding those notices that do not pertain to any part of
+		 the Derivative Works, in at least one of the following places:
+		 within a NOTICE text file distributed as part of the Derivative Works;
+		 within the Source form or documentation, if provided along with the
+		 Derivative Works; or, within a display generated by the Derivative Works,
+		 if and wherever such third-party notices normally appear.
+		 The contents of the NOTICE file are for informational purposes only
+		 and do not modify the License.
+
+	You may add Your own attribution notices within Derivative Works
+	that You distribute, alongside or as an addendum to the NOTICE text
+	from the Work, provided that such additional attribution notices
+	cannot be construed as modifying the License. You may add Your own
+	copyright statement to Your modifications and may provide additional or
+	different license terms and conditions for use, reproduction, or
+	distribution of Your modifications, or for any such Derivative Works
+	as a whole, provided Your use, reproduction, and distribution of
+	the Work otherwise complies with the conditions stated in this License.
+
+	5. Submission of Contributions. Unless You explicitly state otherwise,
+	any Contribution intentionally submitted for inclusion in the Work
+	by You to the Licensor shall be under the terms and conditions of
+	this License, without any additional terms or conditions.
+	Notwithstanding the above, nothing herein shall supersede or modify
+	the terms of any separate license agreement you may have executed
+	with Licensor regarding such Contributions.
+
+	6. Trademarks.  This License does not grant permission to use the trade
+	names, trademarks, service marks, or product names of the Licensor,
+	except as required for reasonable and customary use in describing the
+	origin of the Work and reproducing the content of the NOTICE file.
+
+	7. Disclaimer of Warranty. Unless required by applicable law or
+	agreed to in writing, Licensor provides the Work (and each
+	Contributor provides its Contributions) on an "AS IS" BASIS,
+	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+	implied, including, without limitation, any warranties or conditions
+	of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+	PARTICULAR PURPOSE. You are solely responsible for determining the
+	appropriateness of using or redistributing the Work and assume any
+	risks associated with Your exercise of permissions under this License.
+
+	8. Limitation of Liability. In no event and under no legal theory,
+	whether in tort (including negligence), contract, or otherwise,
+	unless required by applicable law (such as deliberate and grossly
+	negligent acts) or agreed to in writing, shall any Contributor be
+	liable to You for damages, including any direct, indirect, special,
+	incidental, or consequential damages of any character arising as a
+	result of this License or out of the use or inability to use the
+	Work (including but not limited to damages for loss of goodwill,
+	work stoppage, computer failure or malfunction, or any and all
+	other commercial damages or losses), even if such Contributor
+	has been advised of the possibility of such damages.
+
+	9. Accepting Warranty or Additional Liability. While redistributing
+	the Work or Derivative Works thereof, You may choose to offer,
+	and charge a fee for, acceptance of support, warranty, indemnity,
+	or other liability obligations and/or rights consistent with this
+	License. However, in accepting such obligations, You may act only
+	on Your own behalf and on Your sole responsibility, not on behalf
+	of any other Contributor, and only if You agree to indemnify,
+	defend, and hold each Contributor harmless for any liability
+	incurred by, or claims asserted against, such Contributor by reason
+	of your accepting any such warranty or additional liability.
+
+	END OF TERMS AND CONDITIONS
+
+	APPENDIX: How to apply the Flora License to your work
+
+	To apply the Flora License to your work, attach the following
+	boilerplate notice, with the fields enclosed by brackets "[]"
+	replaced with your own identifying information. (Don't include
+	the brackets!) The text should be enclosed in the appropriate
+	comment syntax for the file format. We also recommend that a
+	file or class name and description of purpose be included on the
+	same "printed page" as the copyright notice for easier
+	identification within third-party archives.
+
+	   Copyright [yyyy] [name of copyright owner]
+
+	   Licensed under the Flora License, Version 1.1 (the "License");
+	   you may not use this file except in compliance with the License.
+	   You may obtain a copy of the License at
+
+		   http://floralicense.org/license/
+
+	   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.
+
+ *	Author: Minkyu Kang <mk7.kang@samsung.com>
+ */
+
+/*
+ * Pinch Event
+ *
+ * Events
+ *	pinchstart: triggered when start the touched two points
+ *	pinch: triggered when move the touch point after pinchstart event occured
+ *	pinchend: triggered when touchend event after pinchstart event occured
+ *
+ * Parameters
+ *	point: touched points
+ *	ratio: origin point-to-current point ratio for moving distance
+ *
+ *	$("#pinch").bind("pinch", function (e, p) {
+ *		console.log("point[0].x: " + p.point[0].x);
+ *		console.log("point[0].y: " + p.point[0].y);
+ *		console.log("point[1].x: " + p.point[1].x);
+ *		console.log("point[1].y: " + p.point[1].y);
+ *		console.log("ratio: " + p.ratio);
+ *	});
+ *
+ * Options
+ *	$.mobile.pinch.enabled: true or false
+ *	$.mobile.pinch.min: minimum value of ratio
+ *	$.mobile.pinch.max: maximum value of ratio
+ *	$.mobile.pinch.factor: scale factor of ratio
+ *	$.mobile.pinch.threshold: move threshold of ratio
+ *	$.mobile.pinch.interval: interval for pinch event
+ */
+
+
+( function( $, window, undefined ) {
+
+pinch_event = {
+	setup: function () {
+		var thisObject = this,
+			$this = $( thisObject );
+
+		if ( !$.mobile.support.touch ) {
+			return;
+		}
+
+		function getSize( point ) {
+			var x = point[0].x - point[1].x,
+				y = point[0].y - point[1].y;
+
+			return Math.abs( x * y );
+		}
+
+		function getParameter( point, ratio ) {
+			return { point: point, ratio: ratio };
+		}
+
+		$this.bind( "touchstart", function ( event ) {
+			var data = event.originalEvent.touches,
+				origin,
+				last_ratio = 1,
+				processing = false;
+
+			if ( !$.mobile.pinch.enabled ) {
+				return;
+			}
+
+			if ( data.length != 2 ) {
+				return;
+			}
+
+			origin = [
+					{ x: data[0].pageX, y: data[0].pageY },
+					{ x: data[1].pageX, y: data[1].pageY }
+			];
+
+			$( event.target ).trigger( "pinchstart", getParameter( origin, undefined ) );
+
+			function pinchHandler( event ) {
+				var data = event.originalEvent.touches,
+					current,
+					ratio,
+					delta,
+					factor = $( window ).width() / $.mobile.pinch.factor;
+
+				if ( processing ) {
+					return;
+				}
+
+				if ( !origin ) {
+					return;
+				}
+
+				current = [
+						{ x: data[0].pageX, y: data[0].pageY },
+						{ x: data[1].pageX, y: data[1].pageY }
+				];
+
+				delta = Math.sqrt( getSize( current ) / getSize( origin )  ) ;
+				if( delta ) {
+					ratio = delta;
+				}
+
+				if ( ratio < $.mobile.pinch.min ) {
+					ratio = $.mobile.pinch.min;
+				} else if ( ratio > $.mobile.pinch.max ) {
+					ratio = $.mobile.pinch.max;
+				}
+
+				if ( Math.abs( ratio - last_ratio ) < $.mobile.pinch.threshold ) {
+					return;
+				}
+
+				$( event.target ).trigger( "pinch", getParameter( current, ratio ) );
+
+				last_ratio = ratio;
+
+				if ( $.mobile.pinch.interval ) {
+					processing = true;
+
+					setTimeout( function () {
+						processing = false;
+					}, $.mobile.pinch.interval );
+				}
+			}
+
+			$this.bind( "touchmove", pinchHandler )
+				.one( "touchend", function ( event ) {
+					$this.unbind( "touchmove", pinchHandler );
+					$( event.target ).trigger( "pinchend",
+								getParameter( undefined, last_ratio ) );
+
+					origin = undefined;
+					current = undefined;
+					last_ratio = 1;
+					processing = false;
+				});
+		});
+	}
+};
+
+$.event.special["pinch"] = pinch_event;
+
+$.mobile.pinch = {
+	enabled: true,
+	min: 0.1,
+	max: 3,
+	factor: 4,
+	threshold: 0.01,
+	interval: 50
+};
+
+})( 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.
+ * ***************************************************************************
+ *
+ * Authors: Hyunsook Park <hyunsook.park@samsung.com>
+ *			Wonseop Kim <wonseop.kim@samsung.com>
+*/
+
+( function ( $, window, document, undefined ) {
+	var _canvas = document.createElement( 'canvas' ),
+		_context = _canvas.getContext( '2d' );
+
+	function fileSystemErrorMessage( e ) {
+		var FileError = window.FileError,
+			msg = '';
+		switch ( e.code ) {
+		case FileError.QUOTA_EXCEEDED_ERR:
+			msg = 'QUOTA_EXCEEDED_ERR';
+			break;
+		case FileError.NOT_FOUND_ERR:
+			msg = 'NOT_FOUND_ERR';
+			break;
+		case FileError.SECURITY_ERR:
+			msg = 'SECURITY_ERR';
+			break;
+		case FileError.INVALID_MODIFICATION_ERR:
+			msg = 'INVALID_MODIFICATION_ERR';
+			break;
+		case FileError.INVALID_STATE_ERR:
+			msg = 'INVALID_STATE_ERR';
+			break;
+		default:
+			msg = 'Unknown Error';
+			break;
+		}
+		return msg;
+	}
+
+	function getInternalURLFromURL( url ) {
+		var internalURL = url.replace( /\//gi, "_" );
+		return internalURL;
+	}
+
+	function resize( imagewidth, imageheight, thumbwidth, thumbheight, fit ) {
+		var w = 0, h = 0, x = 0, y = 0,
+			widthratio = imagewidth / thumbwidth,
+			heightratio = imageheight / thumbheight,
+			maxratio = Math.max( widthratio, heightratio );
+
+		if ( fit ) {
+			w = thumbwidth;
+			h = thumbheight;
+		} else {
+			if ( maxratio > 1 ) {
+				w = imagewidth / maxratio;
+				h = imageheight / maxratio;
+			} else {
+				w = imagewidth;
+				h = imageheight;
+			}
+			x = ( thumbwidth - w ) / 2;
+			y = ( thumbheight - h ) / 2;
+		}
+
+		return { w: w, h: h, x: x, y: y };
+	}
+
+	function getThumbnail( img, thumbwidth, thumbheight, fit ) {
+		var dimensions, url;
+		_canvas.width = thumbwidth;
+		_canvas.height = thumbheight;
+		dimensions = resize( img.width, img.height, thumbwidth, thumbheight, fit );
+		_context.fillStyle = "#000000";
+		_context.fillRect ( 0, 0, thumbwidth, thumbheight );
+		_context.drawImage( img, dimensions.x, dimensions.y, dimensions.w, dimensions.h );
+		url = _canvas.toDataURL();
+		return url;
+	}
+
+	$.imageloader = {
+		_grantedBytes: 1024 * 1024,
+		getThumbnail: function ( url, _callback ) {
+			var internalURL, canvasDataURI;
+			function errorHandler( e ) {
+				var msg = fileSystemErrorMessage( e );
+				if ( _callback ) {
+					_callback( ( msg === "NOT_FOUND_ERR" ) ? msg : null );
+				}
+			}
+
+			internalURL = getInternalURLFromURL( url );
+			try {
+				canvasDataURI = localStorage.getItem( internalURL );
+				if ( _callback ) {
+					_callback( ( canvasDataURI === null ) ? "NOT_FOUND_ERR" : canvasDataURI );
+				}
+			} catch ( e ) {
+				if ( _callback ) {
+					_callback( ( e.type === "non_object_property_load" ) ? "NOT_FOUND_ERR" : null );
+				}
+			}
+		},
+
+		setThumbnail: function ( url, _callback, thumbWidth, thumbHeight, fit ) {
+			var image, internalURL, canvasDataURI;
+			function errorHandler( e ) {
+				var msg = fileSystemErrorMessage( e );
+				if ( _callback ) {
+					_callback( ( msg === "NOT_FOUND_ERR" ) ? msg : null );
+				}
+			}
+
+			thumbWidth = thumbWidth || 128;
+			thumbHeight = thumbHeight || 128;
+			fit = fit || true;
+			image = new Image();
+			image.onload = function () {
+				internalURL = getInternalURLFromURL( url );
+				canvasDataURI = getThumbnail( this, thumbWidth, thumbHeight, fit );
+				try {
+					localStorage.setItem( internalURL, canvasDataURI );
+					if ( _callback ) {
+						_callback( canvasDataURI );
+					}
+				} catch ( e ) {
+					if ( _callback ) {
+						_callback( ( e.type === "non_object_property_load" ) ? "NOT_FOUND_ERR" : null );
+					}
+				}
+			};
+			image.src = url;
+		},
+
+		removeThumbnail: function ( url ) {
+			var internalURL;
+			function errorHandler( e ) {
+				fileSystemErrorMessage( e );
+			}
+
+			internalURL = getInternalURLFromURL( url );
+			try {
+				localStorage.removeItem( internalURL );
+			} catch ( e ) {
+				throw e;
+			}
+		}
+	};
+
+} ( jQuery, window, document ) );
+
+
+
+/* ***************************************************************************
+ * 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: Sanghee Lee <sang-hee.lee@samsung.com>
+*/
+
+/**
+ *  Splitview is a widget which can show different HTML contents at the same time on each divided pane.
+ *  A user can place Splitview controls on JQuery Mobile's Content area and arrange two panes on the widget.
+ *  And HTML fragments or another Splitview also can be placed on the pane.
+ *  The number of panes inside of Splitview is restricted as two.
+ *  If a user define only one pane in Splitview, a empty pane will be added automatically,
+ *  on the other hand, if 3 or more panes are defined in Splitview, the panes after two will be ignored and removed from the DOM tree.
+ *  The HTML fragments of a pane should be composed of elements describing a part of Web page (e.g. <div>...</div>).
+ *  Also widgets can be included in the HTML fragments.
+ *
+ *  HTML Attributes:
+ *
+ *      data-fixed : The resizing mode of panes - fixed and flexible mode.
+ *              If the value is true, the panes' sizes will be fixed, or if not, it will be flexible. (Default : false)
+ *      data-divider-vertical : The direction of dividers.
+ *              If the value is true, the panes will be placed in horizontal direction,
+ *              or if not, it will be placed in vertical direction. (Default : "true")
+ *      data-ratio : The ratio of two panes' widths or heights. (Default : [ 1/2, 1/2 ]
+ *
+ *  APIs:
+ *
+ *      pane ( id [ , element ] )
+ *          : This method replaces child contents of a pane indicated by id attribute with contents of inputted element.
+ *            If second argument is not specified, it will act as a getter method.
+ *            The string of id has to be started with "#" which means "id" of CSS selectors.
+ *      maximize ( id )
+ *          : This method maximizes a pane's size indicated by id.
+ *            The string of id has to be started with "#" which means "id" of CSS selectors.
+ *      restore ()
+ *          : This method restores all panes' sizes to the ratio prior to maximization.
+ *
+ *  Examples:
+ *
+ *      <div data-role="splitview" data-fixed="false" data-divider-vertical="true" data-ratio="0.5, 0.5">
+ *          <div class="ui-pane">pane0</div>
+ *          <div class="ui-pane">pane1</div>
+ *      </div>
+ *
+ */
+
+
+/**
+	@class Splitview
+	Splitview widget enables a user to place and arrange several panes. Each divided pane can show repective HTML contents.
+
+	To add a Splitview widget to the application, use the following code:
+
+		<div data-role="splitview" data-fixed="false" data-divider-vertical="true" data-ratio="0.5, 0.5">
+			<div class="ui-pane">pane0</div>
+			<div class="ui-pane">pane1</div>
+		</div>
+*/
+
+/**
+	@property {Boolean} data-fixed
+	The resizing mode of panes - fixed and flexible mode.
+*/
+
+/**
+	@property {Boolean} data-divider-vertical
+	The direction of dividers - horizontal or vertical.
+ */
+
+/**
+	@property {Array} data-ratio
+	The ratio of two panes' widths or heights.
+*/
+
+/**
+	@method pane
+	This method replaces child contents of a pane indicated by id attribute with contents of inputted element.
+	If second argument is not specified, it will act as a getter method.
+
+		<div data-role="splitview">
+			<div class="ui-pane" id="pane0">pane0</div>
+			<div class="ui-pane" id="pane1">pane1</div>
+		</div>
+		$(".selector").splitview("pane", id, element);
+*/
+
+/**
+	@method maximize
+	This method maximizes a pane's size indicated by id.
+
+		<div data-role="splitview">
+			<div class="ui-pane" id="pane0">pane0</div>
+			<div class="ui-pane" id="pane1">pane1</div>
+		</div>
+		$(".selector").splitview("maximize", id);
+*/
+
+/**
+	@method restore
+	This method restores all panes' sizes to the ratio prior to maximization.
+
+		<div data-role="splitview">
+			<div class="ui-pane" id="pane0">pane0</div>
+			<div class="ui-pane" id="pane1">pane1</div>
+		</div>
+		$(".selector").splitview("restore");
+*/
+
+( function ( $, window, document, undefined ) {
+	$.widget( "tizen.splitview", $.mobile.widget, {
+		options : {
+			fixed : false,
+			dividerVertical : true,
+			ratio : [],
+			initSelector : ":jqmData(role='splitview')"
+		},
+
+		_create : function () {
+			var self = this,
+				$el = self.element,
+				opt = self.options,
+				$panes = $el.children( ".ui-pane" ),
+				panesLength = $panes.length,
+				spliters = [],
+				spliterBars = [],
+				ratioAttr = this.element.attr( "data-ratio" ),
+				containerSize = [ 0, 0 ],
+				resizeTimer = null,
+				i = 0;
+
+			if ( panesLength !== 2 ) {
+				if ( panesLength < 2 ) {
+					for ( i = panesLength ; i < 2 ; ++i ) {
+						self._addEmptyPanes();
+					}
+				} else {
+					$panes.slice( 2 ).remove();
+				}
+
+				$panes = $el.children( ".ui-pane" );
+				panesLength = $panes.length;
+			}
+
+			spliters[ 0 ] = $( "<a href='#' class='ui-spliter' aria-label='Drag scroll, double tap and move to adjust split area'></a>" ).insertAfter( $panes[ 0 ] );
+			spliterBars[ 0 ] = $( "<div class='ui-spliter-bar'></div>" ).appendTo( spliters[ 0 ] );
+			$( "<div class='ui-spliter-handle'></div>" ).appendTo( spliterBars[ 0 ] );
+
+			$.extend( this, {
+				moveTarget : null,
+				moveData : {},
+				spliters : spliters,
+				spliterBars : spliterBars,
+				panes : $panes,
+				containerSize : containerSize,
+				touchStatus : false,
+				minPaneWidth : 50,
+				savedRatio : []
+			});
+
+			self._bindTouchEvents();
+			self._convertRatio( ratioAttr, $panes.length );
+
+			$el.addClass( "ui-splitview ui-direction-" + self._direction( opt.dividerVertical ) );
+
+			self._refresh();
+
+			$( window ).unbind( ".splitview" )
+				.bind( "pagechange.splitview resize.splitview", function ( event ) {
+					$( ".ui-page-active .ui-splitview" ).each( function () {
+						$( this ).data( "splitview" )._refresh();
+					});
+				});
+		},
+
+		_addEmptyPanes : function () {
+			var self = this,
+				$el = self.element,
+				opt = self.options,
+				$panes = $el.children( ".ui-pane" ),
+				scrollAttribute = ( $.support.scrollview ) ? "data-scroll='y'" : "",
+				pane = $( "<div class='ui-pane' " + scrollAttribute + "></div>" );
+
+			if ( scrollAttribute.length ) {
+				pane.scrollview( { direction: "y" } );
+			}
+
+			if ( !$panes.length ) {
+				$el.append( pane );
+			} else {
+				$panes.last().after( pane );
+			}
+		},
+
+		_direction : function ( isHorizontal ) {
+			return isHorizontal ? "horizontal" : "vertical";
+		},
+
+		_isStyleSpecified : function ( cssString ) {
+			return ( typeof cssString !== "undefined" && cssString.length );
+		},
+
+		_getContainerSize : function ( widthString, heightString ) {
+			var self = this,
+				$el = self.element,
+				widthSpecified = self._isStyleSpecified( widthString ),
+				heightSpecified = self._isStyleSpecified( heightString );
+
+			self.containerSize[ 0 ] = ( widthSpecified ) ? $el.outerWidth( true ) : self._parentWidth();
+			self.containerSize[ 1 ] = ( heightSpecified ) ? $el.outerHeight( true ) : self._parentHeight();
+
+			if ( !self.containerSize[ 0 ] || !self.containerSize[ 1 ] ) {
+				return false;
+			}
+
+			return true;
+		},
+
+		_parentWidth : function () {
+			var $parent = this.element.parent();
+
+			if ( !$parent && typeof $parent === "undefined" && !$parent.length ) {
+				return $( window ).width();
+			}
+
+			return $parent.width();
+		},
+
+		_parentHeight : function () {
+			var $parent = this.element.parent(),
+				heightString = "",
+				heightSpecified = false,
+				parentHeight = 0;
+
+			while ( $parent && typeof $parent !== "undefined" && $parent.length ) {
+				if ( typeof $parent[ 0 ].style !== "undefined" ) {
+					heightString = $parent[ 0 ].style.height;
+					heightSpecified = ( typeof heightString !== "undefined" && heightString.length );
+					if ( heightSpecified ) {
+						parentHeight = $parent.height();
+						break;
+					}
+				}
+
+				$parent = $parent.parent();
+			}
+
+			if ( !heightSpecified ) {
+				parentHeight = $(window).height();
+			}
+
+			return parentHeight;
+		},
+
+		_convertRatio : function ( ratioParam, panesLength ) {
+			var self = this,
+				ratio = [],
+				loop = 0,
+				type = typeof ratioParam,
+				ratioArray = null,
+				i;
+
+			for ( i = 0; i < panesLength; ++i ) {
+				ratio.push( 0 );
+			}
+
+			switch ( type ) {
+			case "number":
+				if ( panesLength ) {
+					ratio[ 0 ] = ratioParam;
+				}
+				break;
+
+			case "string":
+				ratioArray = ratioParam.split( "," );
+				loop = Math.min( ratioArray.length, panesLength );
+				for ( i = 0; i < loop; ++i ) {
+					ratio[ i ] = parseFloat( ratioArray[ i ] );
+				}
+				break;
+
+			case "object":
+				if ( !$.isArray( ratioParam ) ) {
+					break;
+				}
+
+				loop = Math.min( ratioParam.length, panesLength );
+				for ( i = 0; i < loop; ++i ) {
+					type = typeof ratioParam[ i ];
+					ratio[ i ] = ( type === "string" ) ? parseFloat( ratioParam[ i ] ) :
+								( type === "number" ) ? ratioParam[ i ] : 0;
+				}
+				break;
+			}
+
+			self.options.ratio = ratio;
+			self._adjustRatio( panesLength );
+		},
+
+		_adjustRatio : function ( panesLength ) {
+			var self = this,
+				ratio = self.options.ratio,
+				sum = 0,
+				remain = 0,
+				value = 0,
+				subValue = 0,
+				subRemain = 0,
+				i;
+
+			if ( !panesLength ) {
+				self.options.ratio = [];
+				return;
+			}
+
+			for ( i in ratio ) {
+				sum += ratio[ i ];
+			}
+
+			if ( sum !== 1 ) {
+				remain = 1 - sum;
+				value = remain / panesLength;
+
+				for ( i in ratio ) {
+					if ( value >= 0 ) {
+						ratio[ i ] += value;
+						remain = Math.max( 0, remain - value );
+					} else {
+						subRemain += value;
+						subValue = Math.max( subRemain, ratio[ i ] * -1 );
+						ratio[ i ] = Math.max( 0, ratio[ i ] + subValue );
+						remain = Math.min( 0, remain - subValue );
+						subRemain -= subValue;
+					}
+				}
+
+				if ( remain ) {
+					if ( remain > 0 ) {
+						ratio[ ratio.length - 1 ] += remain;
+					} else {
+						for ( i = ratio.length - 1; i >= 0; --i ) {
+							subValue = Math.max( remain, ratio[ i ] * -1 );
+							ratio[ i ] = Math.max( 0, ratio[ i ] + subValue );
+							remain = Math.min( 0, remain - subValue );
+							if ( !remain ) {
+								break;
+							}
+						}
+					}
+				}
+
+				self.options.ratio = ratio;
+			}
+		},
+
+		_setOption : function ( key, value ) {
+			var self = this,
+				orgValue = self.options[ key ];
+
+			if ( orgValue === value ) {
+				return;
+			}
+
+			$.Widget.prototype._setOption.apply( this, arguments );
+
+			switch ( key ) {
+			case "fixed":
+				self._fixed( value );
+				break;
+
+			case "dividerVertical":
+				self._dividerVertical( value );
+				break;
+
+			case "ratio":
+				self._ratio( value );
+				break;
+			}
+		},
+
+		_subtractDiffWidth : function ( width, diff ) {
+			var self = this;
+
+			if ( width <= self.minPaneWidth ) {
+				return {
+					width: width,
+					diff: diff
+				};
+			}
+
+			width += diff;
+			if ( width >= self.minPaneWidth ) {
+				return {
+					width: width,
+					diff: 0
+				};
+			}
+
+			return {
+				width: self.minPaneWidth,
+				diff: width - self.minPaneWidth
+			};
+		},
+
+		_initRatio : function ( fromFirstPane, panes, isHorizontal, availableWidth ) {
+			var self = this,
+				sum = 0,
+				widths = [],
+				diff = 0,
+				panesLength = panes.length,
+				ret,
+				i;
+
+			panes.each( function ( i ) {
+				var pane = $( this );
+				widths.push( isHorizontal ? pane.width() : pane.height() );
+				sum += widths[ i ];
+			});
+
+			diff = availableWidth - sum;
+			if ( !diff ) {
+				return widths;
+			}
+
+			if ( diff > 0 ) {
+				widths[ fromFirstPane ? 0 : panesLength - 1 ] += diff;
+			} else {
+				if ( fromFirstPane ) {
+					for ( i = 0; i < panesLength; ++i ) {
+						ret = self._subtractDiffWidth( widths[ i ], diff );
+						widths[ i ] = ret.width;
+						diff = ret.diff;
+						if ( !diff ) {
+							break;
+						}
+					}
+				} else {
+					for ( i = panesLength - 1; i >= 0; --i ) {
+						diff = self._subtractDiffWidth( widths[ i ], diff );
+						widths[ i ] = ret.width;
+						diff = ret.diff;
+						if ( !diff ) {
+							break;
+						}
+					}
+				}
+			}
+
+			sum = 0;
+			for ( i in widths ) {
+				sum += widths[ i ];
+			}
+
+			for ( i in self.options.ratio ) {
+				self.options.ratio[ i ] = widths[ i ] / sum;
+			}
+
+			return widths;
+		},
+
+		_horizontalBoundary : function () {
+			var self = this,
+				$el = self.element;
+
+			return $el.outerWidth( true ) - $el.width();
+		},
+
+		_verticalBoundary : function () {
+			var self = this,
+				$el = self.element;
+
+			return $el.outerHeight( true ) - $el.height();
+		},
+
+		_boundary : function ( type ) {
+			var self = this,
+				$el = self.element,
+				computedStyle = window.getComputedStyle( $el[ 0 ], null ),
+				margin = parseFloat( computedStyle[ "margin" + type ] ),
+				border = parseFloat( computedStyle[ "border" + type + "Width" ] ),
+				padding = parseFloat( computedStyle[ "padding" + type ] );
+
+			return {
+				margin: margin,
+				border: border,
+				padding: padding
+			};
+		},
+
+		_layout : function ( initRatio, fromFirstPane ) {
+			var self = this,
+				$el = self.element,
+				opt = self.options,
+				isHorizontal = opt.dividerVertical,
+				$panes = self.panes,
+				spliters = self.spliters,
+				spliterBars = self.spliterBars,
+				spliterBar = self.spliterBars.length ? $( spliterBars[ 0 ] ) : null,
+				spliterWidth = !spliterBar ? 0 :
+								isHorizontal ? spliterBar.outerWidth() :
+												spliterBar.outerHeight(),
+				spliterBarMargin = !spliterBar ? 0 :
+									isHorizontal ?
+										spliterBar.outerWidth( true ) - spliterBar.outerWidth() :
+										spliterBar.outerHeight( true ) - spliterBar.outerHeight(),
+				panesLength = $panes.length,
+				currentAvailable = 0,
+				spliterSize = spliterWidth * ( panesLength - 1 ),
+				parentWidth = self.containerSize[ 0 ],
+				parentHeight = self.containerSize[ 1 ],
+				width = parentWidth - self._horizontalBoundary(),
+				height = parentHeight - self._verticalBoundary(),
+				innerSize = isHorizontal ? height : width,
+				availableWidth = isHorizontal ? width - spliterSize :
+												height - spliterSize,
+				initializedWidth = [],
+				widthSum = 0,
+				childSplitview = null;
+
+			initRatio = !!initRatio;
+			fromFirstPane = !!fromFirstPane;
+
+			$el.css( {
+				"min-width" : width,
+				"min-height" : height
+			});
+
+			if ( initRatio ) {
+				initializedWidth = self._initRatio( fromFirstPane, $panes, isHorizontal, availableWidth );
+			}
+
+			currentAvailable = availableWidth;
+			$panes.each( function ( i ) {
+				var $pane = $( this ),
+					paneWidth = initRatio ? initializedWidth[ i ] :
+										Math.floor( availableWidth * self.options.ratio[i] ),
+					prevPane = ( ( i ) ? $panes.eq( i - 1 ) : null ),
+					posValue = 0,
+					widthValue = 0,
+					heightValue = 0,
+					boundary = 0;
+
+				currentAvailable -= paneWidth;
+				if ( i === ( panesLength - 1 ) ) {
+					if ( self.touchStatus ) {
+						paneWidth = self.moveData.nextPaneWidth = availableWidth - ( self.moveData.targetPos + spliterWidth );
+					} else {
+						paneWidth = Math.max( Math.min( paneWidth, self.minPaneWidth ), paneWidth + currentAvailable );
+					}
+				}
+
+				widthSum += paneWidth;
+
+				if ( !prevPane ) {
+					boundary = self._boundary( isHorizontal ? "Left" : "Top" );
+					posValue = boundary.padding;
+				} else {
+					posValue = parseInt( prevPane.css( isHorizontal ? "left" : "top" ), 10 );
+					posValue += isHorizontal ? prevPane.width() : prevPane.height();
+					posValue += spliterWidth;
+				}
+
+				widthValue = isHorizontal ? paneWidth : innerSize;
+				heightValue = isHorizontal ? innerSize : paneWidth;
+
+				$pane.css( {
+					"width" : widthValue ,
+					"height" : heightValue
+				} );
+
+				$pane.css( ( isHorizontal ? "left" : "top" ), posValue );
+			});
+
+			$panes.each( function ( i ) {
+				var $pane = $( this ),
+					paneWidth = isHorizontal ? $pane.width() : $pane.height();
+
+				self.options.ratio[ i ] = paneWidth / widthSum;
+			});
+
+			$.each( spliters, function ( i ) {
+				var spliter = $( this ),
+					prevPane = $panes.eq( i ),
+					bar = spliter.children( ".ui-spliter-bar" ),
+					handle = bar.children( ".ui-spliter-handle" ),
+					posValue = 0;
+
+				if ( isHorizontal ) {
+					posValue = parseInt( prevPane.css( "left" ), 10 ) + prevPane.width() - spliterBarMargin;
+					spliter.outerHeight( innerSize ).css( "left", posValue );
+				} else {
+					posValue = parseInt( prevPane.css( "top" ), 10 ) + prevPane.height() - spliterBarMargin;
+					spliter.outerWidth( innerSize ).css( "top", posValue );
+				}
+
+				if ( bar.length ) {
+					bar[ isHorizontal ? "outerHeight" : "outerWidth" ]( innerSize );
+				}
+				if ( handle.length ) {
+					handle.css( isHorizontal ? "top" : "left", ( innerSize - spliterWidth ) / 2 );
+				}
+			});
+
+			childSplitview = $el.find( ".ui-splitview:first" );
+			if ( !childSplitview.length ) {
+				return;
+			}
+
+			childSplitview = childSplitview.data( "splitview" );
+			if ( childSplitview ) {
+				childSplitview._refresh();
+			}
+		},
+
+		_bindTouchEvents : function () {
+			var self = this,
+				$el = self.element,
+				$panes = self.panes,
+				spliters = self.spliters;
+
+			$.each( spliters, function ( i ) {
+				var spliter = $( this );
+				self._bindSpliterTouchEvents.call( self, spliter );
+			});
+		},
+
+		_bindSpliterTouchEvents : function ( spliter ) {
+			var self = this,
+				$el = self.element,
+				opt = self.options,
+				touchStartEvt = ( $.support.touch ? "touchstart" : "mousedown" ),
+				touchMoveEvt = ( $.support.touch ? "touchmove" : "mousemove" ) + ".splitview",
+				touchEndEvt = ( $.support.touch ? "touchend" : "mouseup" ) + ".splitview";
+
+			spliter.bind( touchStartEvt, { e : spliter }, function ( event ) {
+				if ( self.options.fixed ) {
+					return;
+				}
+
+				var realEvent = $.support.touch ? event.originalEvent.changedTouches[0] : event,
+					targetSpliter = event.data.e,
+					prevPane = targetSpliter.prev(),
+					nextPane = targetSpliter.next(),
+					splitviewInPrev = prevPane.find( ".ui-splitview:first" ),
+					splitviewInNext = nextPane.find( ".ui-splitview:first" ),
+					isHorizontal = opt.dividerVertical,
+					spliterWidth = isHorizontal ?
+									$( self.spliterBars[0] ).outerWidth() :
+									$( self.spliterBars[0] ).outerHeight();
+
+				self.moveTarget = targetSpliter;
+				self.moveData = {
+					spliterWidth : spliterWidth || 0,
+					prevPane : prevPane,
+					nextPane : nextPane,
+					splitviewInPrev : splitviewInPrev,
+					splitviewInNext : splitviewInNext,
+					prevPanePos : parseInt( prevPane.css( isHorizontal ? "left" : "top" ), 10 ) || 0,
+					prevPaneWidth : parseInt( prevPane.css( isHorizontal ? "width" : "height" ), 10 ) || 0,
+					nextPanePos : parseInt( nextPane.css( isHorizontal ? "left" : "top" ), 10 ) || 0,
+					nextPaneWidth : parseInt( nextPane.css( isHorizontal ? "width" : "height" ), 10 ) || 0,
+					targetPos : parseInt( targetSpliter.css( isHorizontal ? "left" : "top" ), 10 ) || 0,
+					pagePos : isHorizontal ? realEvent.pageX : realEvent.pageY
+				};
+
+				targetSpliter.addClass( "ui-spliter-active" );
+
+				$el.bind( touchMoveEvt, function ( event ) {
+					if ( !self.touchStatus ) {
+						return;
+					}
+					event.stopPropagation();
+					self._drag( $.support.touch ? event.originalEvent.changedTouches[0] : event );
+				}).bind( touchEndEvt, function ( event ) {
+					event.stopPropagation();
+					self._stop( $.support.touch ? event.originalEvent.changedTouches[0] : event );
+					self.touchStatus = false;
+					$el.unbind( ".splitview" );
+					$( document ).unbind( ".splitview" );
+				});
+
+				$( document ).bind( touchMoveEvt + " " + touchEndEvt, function () {
+					$el.trigger( touchEndEvt );
+				});
+
+				event.preventDefault();
+				self.touchStatus = true;
+			});
+		},
+
+		_drag : function ( e ) {
+			if ( !this.moveData || typeof this.moveData === "undefined" ) {
+				return;
+			}
+
+			var self = this,
+				$el = self.element,
+				opt = self.options,
+				isHorizontal = opt.dividerVertical,
+				moveData = self.moveData,
+				moveTarget = self.moveTarget,
+				prevPane = moveData.prevPane,
+				nextPane = moveData.nextPane,
+				splitviewInPrev = moveData.splitviewInPrev,
+				splitviewInNext = moveData.splitviewInNext,
+				spliterWidth = moveData.spliterWidth,
+				movement = null,
+				targetPos = null,
+				nextPanePos = null,
+				prevPaneWidth = null,
+				nextPaneWidth = null,
+				pagePos = isHorizontal ? e.pageX : e.pageY,
+				splitview = null;
+
+			movement = pagePos - moveData.pagePos;
+			if ( movement > 0 ) {
+				movement = Math.min( Math.max( moveData.nextPaneWidth - self.minPaneWidth, 0 ), movement );
+			} else {
+				movement = Math.max( Math.max( moveData.prevPaneWidth - self.minPaneWidth, 0 ) * -1, movement );
+			}
+
+			nextPanePos = moveData.nextPanePos + movement;
+			prevPaneWidth = Math.max( moveData.prevPaneWidth + movement, 0 );
+			nextPaneWidth = Math.max( moveData.nextPaneWidth - movement, 0 );
+			targetPos = moveData.targetPos + movement;
+
+			moveTarget.css( isHorizontal ? { left : targetPos } : { top : targetPos } );
+			prevPane.css( isHorizontal ? { width : prevPaneWidth } : { height : prevPaneWidth } );
+			nextPane.css( isHorizontal ? { width : nextPaneWidth, left : nextPanePos } :
+											{ height : nextPaneWidth, top : nextPanePos } );
+
+			if ( splitviewInPrev.length ) {
+				splitview = splitviewInPrev.data( "splitview" );
+				splitview._refresh( true, false );
+			}
+
+			if ( splitviewInNext.length ) {
+				splitview = splitviewInNext.data( "splitview" );
+				splitview._refresh( true, true );
+			}
+		},
+
+		_stop : function ( e ) {
+			if ( !this.moveData || !this.moveTarget ) {
+				return;
+			}
+
+			var self = this,
+				$el = self.element,
+				opt = self.options,
+				$panes = self.panes,
+				panesLength = $panes.length,
+				isHorizontal = opt.dividerVertical,
+				moveData = self.moveData,
+				moveTarget = self.moveTarget,
+				prevPane = moveData.prevPane,
+				nextPane = moveData.nextPane,
+				splitviewInPrev = moveData.splitviewInPrev,
+				splitviewInNext = moveData.splitviewInNext,
+				spliterWidth = moveData.spliterWidth,
+				spliterSize = spliterWidth * ( panesLength - 1 ),
+				movement = null,
+				targetPos = null,
+				nextPanePos = null,
+				prevPaneWidth = null,
+				nextPaneWidth = null,
+				displayStyle = $el.css( "display" ),
+				parentWidth = self.containerSize[ 0 ],
+				parentHeight = self.containerSize[ 1 ],
+				width = parentWidth - self._horizontalBoundary(),
+				height = parentHeight - self._verticalBoundary(),
+				availableWidth = isHorizontal ?
+									( width - spliterSize ) :
+									( height - spliterSize ),
+				sum = 0;
+
+			moveTarget.removeClass( "ui-spliter-active" );
+
+			// ratio calculation
+			$panes.each( function ( i ) {
+				var $pane = $( this ),
+					paneWidth = isHorizontal ? $pane.width() : $pane.height();
+
+				sum += paneWidth;
+			});
+
+			$panes.each( function ( i ) {
+				var $pane = $( this ),
+					paneWidth = isHorizontal ? $pane.width() : $pane.height();
+
+				self.options.ratio[ i ] = paneWidth / sum;
+			});
+
+			self.moveData = null;
+		},
+
+		_fixed : function ( isFix ) {
+			var self = this,
+				spliters = self.spliters;
+
+			$.each( spliters, function ( i ) {
+				var $spliter = $( this );
+
+				if ( isFix ) {
+					$spliter.addClass( "ui-fixed" );
+				} else {
+					$spliter.removeClass( "ui-fixed" );
+				}
+			});
+
+			self._layout();
+		},
+
+		_dividerVertical : function ( isDividerVertical ) {
+			var self = this,
+				$el = self.element,
+				isHorizontal = isDividerVertical,
+				$panes = null,
+				$spliters = null,
+				$bar = null,
+				$handle = null;
+
+			$panes = $el.children( ".ui-pane" );
+			$spliters = $el.children( ".ui-spliter" );
+			$bar = $spliters.children( ".ui-spliter-bar" );
+			$handle = $bar.children( ".ui-spliter-handle" );
+
+			$el.removeClass( "ui-direction-vertical" );
+			$el.removeClass( "ui-direction-horizontal" );
+			$el.addClass( "ui-splitview ui-direction-" + self._direction( isHorizontal ) );
+
+			$panes.css( {
+				"left" : "",
+				"top" : "",
+				"width" : "",
+				"height" : ""
+			});
+
+			$spliters.css( {
+				"left" : "",
+				"top" : "",
+				"width" : "",
+				"height" : ""
+			});
+
+			$bar.css( {
+				"width" : "",
+				"height" : ""
+			});
+
+			$handle.css( {
+				"left" : "",
+				"top" : ""
+			});
+
+			if ( self._getContainerSize( $el[ 0 ].style.width, $el[ 0 ].style.height ) ) {
+				self._layout();
+			}
+		},
+
+		_ratio : function ( ratioParam ) {
+			var self = this,
+				$el = self.element,
+				$panes = $el.children( ".ui-pane" ),
+				panesLength = $panes.length;
+
+			self._convertRatio( ratioParam, panesLength );
+			self._layout();
+		},
+
+		_refresh : function ( initRatio, fromFirstPane ) {
+			var self = this,
+				$el = self.element;
+
+			initRatio = !!initRatio;
+			fromFirstPane = !!fromFirstPane;
+
+			if ( self._getContainerSize( $el[ 0 ].style.width, $el[ 0 ].style.height ) ) {
+				self._layout( initRatio, fromFirstPane );
+			}
+		},
+
+		pane : function ( id, element ) {
+			if ( typeof id !== "string" ) {
+				return null;
+			}
+
+			var self = this,
+				$el = self.element,
+				$targetPane = $el.children( id ),
+				$targetView = null,
+				elementParent = null;
+
+			if ( !$targetPane.hasClass( "ui-pane" ) ) {
+				return null;
+			}
+
+			// getter
+			if ( !element ) {
+				return $targetPane.contents();
+			}
+
+			// setter
+			if ( $targetPane.hasClass( "ui-scrollview-clip" ) ) {
+				$targetPane.scrollview( "scrollTo", 0, 0, 0 );
+
+				$targetView = $targetPane.children( ".ui-scrollview-view" );
+				if ( !$targetView.length ) {
+					return null;
+				}
+			} else {
+				$targetView = $targetPane;
+			}
+
+			elementParent = element.parent();
+			if ( elementParent.length && elementParent[ 0 ] === $targetView[ 0 ] ) {
+				return;
+			}
+
+			$targetView.empty().append( element ).trigger( "create" );
+			$targetView.fadeIn( 'fast' );
+		},
+
+		maximize : function ( id ) {
+			if ( typeof id !== "string" ) {
+				return;
+			}
+
+			var self = this,
+				$el = self.element,
+				$panes = self.panes,
+				$targetPane = $el.children( id );
+
+			if ( !$targetPane.hasClass( "ui-pane" ) ) {
+				return;
+			}
+
+			self.savedRatio = self.options.ratio.slice();
+
+			self.options.ratio = [];
+			$panes.each( function ( i ) {
+				self.options.ratio.push( ( this === $targetPane[ 0 ] ) ? 1 : 0 );
+			});
+
+			self._layout();
+		},
+
+		restore : function () {
+			var self = this;
+
+			if ( !self.savedRatio.length ) {
+				return;
+			}
+
+			self.options.ratio = self.savedRatio.slice();
+			self._adjustRatio( self.panes.length );
+
+			self._layout();
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$.tizen.splitview.prototype.enhanceWithin( e.target );
+	});
+} ( jQuery, window, document ) );
+
+
+
+/**
+	@class Checkbox
+	The check box widget shows a list of options on the screen where one or more can be selected. Check boxes can be used in Tizen as described in the jQueryMobile documentation for check boxes.<br/> To add a check box widget to the application, use the following code:
+
+		<input type="checkbox" name="mycheck" id="check-test" class="favorite" />
+		<label for="check-test">Favorite</label>
+		<input type="checkbox" name="check-favorite" id="check-test2" checked="checked" disabled="disabled" class="favorite" />
+		<label for="check-test2">Favorite Checked, Disabled</label>
+
+	The check box can define callbacks for events as described in the jQueryMobile documentation for check box events.
+	You can use methods with the check box as described in the jQueryMobile documentation for check box methods.
+
+*/
+/**
+	@property {String} class
+	Defines the check box style. <br/> The default value is check. If the value is set to favorite, a star-shaped check box is created.
+*/
+
+
+
+/* ***************************************************************************
+ * 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: Hyunsook Park <hyunsook.park@samsung.com>
+ *			Wonseop Kim <wonseop.kim@samsung.com>
+*/
+
+( function ( $, window, undefined ) {
+	var HALF_PI = Math.PI / 2,
+		DEFAULT_STEP = 0.001,
+		MotionPath = {},
+		vec3 = window.vec3,
+		arcLength3d = function ( p0, p1 ) {
+			var d = [ p1[0] - p0[0], p1[1] - p0[1], p1[2] - p0[2] ],
+				value = Math.sqrt( d[0] * d[0] + d[1] * d[1] + d[2] * d[2] );
+			return value;
+		};
+
+	MotionPath.base = function () {};
+	MotionPath.base.prototype = {
+		points: [],
+		step: DEFAULT_STEP,
+		length: 0,
+		levels: [],
+		init: function ( data ) {},
+		calculateLevel: function ( maxLevel ) {},
+		calculateTotalLength: function () {},
+		getPosition: function ( percent ) {},
+		getPercent: function ( start, interval ) {},
+		getAngle: function ( percent ) {}
+	};
+
+	MotionPath.bezier2d = function () {};
+	MotionPath.bezier2d.prototype = $.extend( true, {}, MotionPath.base.prototype, {
+		init: function ( data ) {
+			this.points = data.points;
+			this.step = data.step || DEFAULT_STEP;
+			this.length = this.calculateTotalLength();
+			this.levels = this.calculateLevel( data.maxLevel ) || [];
+		},
+
+		calculateLevel: function ( maxLevel ) {
+			var totalLength = this.length,
+				interval = totalLength / maxLevel,
+				levels = [],
+				i;
+
+			if ( !maxLevel ) {
+				return null;
+			}
+
+			for ( i = 0; i < maxLevel; i += 1 ) {
+				levels[maxLevel - i] = this.getPercent( 0, interval * i );
+			}
+
+			return levels;
+		},
+
+		calculateTotalLength: function () {
+			var step = this.step,
+				current = this.getPosition( 0 ),
+				last = current,
+				length = 0,
+				percent;
+			for ( percent = step; percent <= 1; percent += step ) {
+				current = this.getPosition( percent );
+				length += arcLength3d( last, current );
+				last = current;
+			}
+			return length;
+		},
+
+		getPosition: function ( percent ) {
+			var points = this.points,
+				getValue = function ( p1, c1, c2, p2, t ) {
+					return Math.pow(1 - t, 3) * p1 +
+						3 * t * Math.pow( 1 - t, 2 ) * c1 +
+						3 * Math.pow( t, 2 ) * ( 1 - t ) * c2 +
+						Math.pow( t, 3 ) * p2;
+				},
+				result = [
+					getValue( points[0][0], points[1][0], points[2][0], points[3][0], percent ),
+					getValue( points[0][2], points[1][2], points[2][2], points[3][2], percent )
+				];
+			return [ result[0], 0, result[1] ];
+		},
+
+		getPercent: function ( start, interval ) {
+			var step = this.step,
+				current = this.getPosition( start = start || 0 ),
+				last = current,
+				targetLength = start + interval,
+				length = 0,
+				percent;
+
+			for ( percent = start + step; percent <= 1; percent += step ) {
+				current = this.getPosition( percent );
+				length += arcLength3d( last, current );
+				if ( length >= targetLength ) {
+					return percent;
+				}
+				last = current;
+			}
+			return 1;
+		},
+
+		getAngle: function ( percent ) {
+			var points = this.points,
+				getTangent = function ( p1, c1, c2, p2, t ) {
+					return 3 * t * t * ( -p1 + 3 * c1 - 3 * c2 + p2 ) + 6 * t * ( p1 - 2 * c1 + c2 ) + 3 * ( -p1 + c1 );
+				},
+				tx = getTangent( points[0][0], points[1][0], points[2][0], points[3][0], percent ),
+				ty = getTangent( points[0][2], points[1][2], points[2][2], points[3][2], percent );
+			return Math.atan2( tx, ty ) - HALF_PI;
+		}
+
+	} );
+
+	// clamped cubic B-spline curve
+	// http://web.mit.edu/hyperbook/Patrikalakis-Maekawa-Cho/node17.html
+	// http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/B-spline/bspline-curve-coef.html
+	MotionPath.bspline = function () {};
+	MotionPath.bspline.prototype = $.extend( true, {}, MotionPath.base.prototype, {
+		_degree: 3,
+		_numberOfControls : 0,
+		_knotVectors: [],
+		_numberOfKnots: 0,
+
+		init: function ( data ) {
+			this.points = data.points;
+			this.step = data.step || DEFAULT_STEP;
+			this._numberOfPoints = this.points.length - 1;
+			this._numberOfKnots = this._numberOfPoints + this._degree + 1;
+
+			var deltaKnot = 1 / ( this._numberOfKnots - ( 2 * this._degree ) ),
+				v = deltaKnot,
+				i = 0;
+
+			while ( i <= this._numberOfKnots ) {
+				if ( i <= this._degree ) {
+					this._knotVectors.push( 0 );
+				} else if ( i < this._numberOfKnots - this._degree + 1 ) {
+					this._knotVectors.push( v );
+					v += deltaKnot;
+				} else {
+					this._knotVectors.push( 1 );
+				}
+				i += 1;
+			}
+
+			this.length = this.calculateTotalLength();
+			this.levels = this.calculateLevel( data.maxLevel ) || [];
+		},
+
+		_Np: function ( percent, i, degree ) {
+			var knots = this._knotVectors,
+				A = 0,
+				B = 0,
+				denominator = 0,
+				N0 = function ( percent, i ) {
+					return ( ( knots[i] <= percent && percent < knots[i + 1] ) ? 1 : 0 );
+				};
+
+			if ( degree === 1 ) {
+				A = N0( percent, i );
+				B = N0( percent, i + 1 );
+			} else {
+				A = this._Np( percent, i, degree - 1 );
+				B = this._Np( percent, i + 1, degree - 1 );
+			}
+
+			denominator = knots[i + degree] - knots[i];
+			A *= ( denominator !== 0 ) ? ( ( percent - knots[i] ) / denominator ) : 0;
+			denominator = knots[i + degree + 1] - knots[i + 1];
+			B *= ( denominator !== 0 ) ? ( ( knots[i + degree + 1] - percent ) / denominator ) : 0;
+
+			return A + B;
+		},
+
+		calculateLevel: function ( maxLevel ) {
+			var totalLength = this.length,
+				interval = totalLength / maxLevel,
+				levels = [],
+				i;
+
+			if ( !maxLevel ) {
+				return null;
+			}
+
+			for ( i = 0; i < maxLevel; i += 1 ) {
+				levels[maxLevel - i] = this.getPercent( 0, interval * i );
+			}
+			return levels;
+		},
+
+		calculateTotalLength: function () {
+			var step = this.step,
+				current = this.getPosition( 0 ),
+				last = current,
+				length = 0,
+				percent;
+			for ( percent = step; percent <= 1; percent += step ) {
+				current = this.getPosition( percent );
+				length += arcLength3d( last, current );
+				last = current;
+			}
+			return length;
+		},
+
+		getPosition: function ( percent ) {
+			var result = [], i, j, sum;
+			percent = percent.toFixed( 4 );
+			for ( j = 0; j < 3; j += 1 ) {
+				sum = 0;
+				for ( i = 0; i <= this._numberOfPoints; i += 1 ) {
+					sum += this.points[i][j] * this._Np( percent, i, this._degree );
+				}
+				result[j] = sum;
+			}
+
+			return result;
+		},
+
+		getPercent: function ( start, interval ) {
+			var step = this.step,
+				current = this.getPosition( start = start || 0 ),
+				last = current,
+				targetLength = start + interval,
+				length = 0,
+				percent;
+
+			for ( percent = start + step; percent <= 1; percent += step ) {
+				current = this.getPosition( percent );
+				length += arcLength3d( last, current );
+				if ( length >= targetLength ) {
+					return percent;
+				}
+				last = current;
+			}
+			return 1;
+		},
+
+		getAngle: function ( percent ) {
+			var prev = this.getPosition( percent ),
+				next = this.getPosition( percent + 0.001 ),
+				dir = vec3.normalize( vec3.direction( prev, next ) ),
+				cosValue = vec3.dot( dir, [1, 0, 0] );
+
+			return Math.acos( cosValue ) + Math.PI;
+		}
+	} );
+
+	$.motionpath = function ( type, data ) {
+		var object = new MotionPath[type]();
+		object.init( data );
+		return object;
+	};
+} ( 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>
+*/
+
+/**
+ *	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 ( {
+ *				itemData: function ( idx ) { return json_obj; },
+ *				numItemData: number or function () { return number; },
+ *				cacheItemData: function ( minIdx, maxIdx ) {}
+ *				} )
+ *			: Create a extendable list widget. At this moment, _create method is called.
+ *			args : A collection of options
+ *				itemData: A function that returns JSON object for given index. Mandatory.
+ *				numItemData: Total number of itemData. Mandatory.
+ *				cacheItemData: Extendable list will ask itemData between minIdx and maxIdx.
+ *				    Developers can implement this function for preparing data.
+ *				    Optional.
+ *
+ *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">
+ *		</ul>
+ *
+ */
+
+/**
+	@class Extendablelist
+	In the Web environment, it is challenging to display a large amount of data in a list, such as displaying a contact list of over 1000 list items. It takes time to display the entire list in HTML and the DOM manipulation is complex.
+	The extendable list widget is used to display a list of unlimited data elements on the screen for better performance. The list is extended if you click the button at the bottom of the list to load more data elements. Extendable lists are based on the jQuery.template plugin as described in the jQuery documentation for jQuery.template plugin.<br/>
+	To add a extendable list widget to the application, use the following code:
+
+			<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">
+			</ul>
+*/
+/**
+	@property {String} data-role
+	Creates the extendable list view. The value must be set to extendablelist. Only the &lt;ul&gt; element, which a id attribute defined, supports this option. Also, the elLoadSuccess class attribute must be defined in the &lt;ul&gt; element to ensure that loading data from the database is complete.
+*/
+/**
+	@property {String} data-template
+	Specifies the jQuery.template element ID. The jQuery.template must be defined. The template style can use rem units to support scalability. For using the button at the bottom of the list to load more data elements, there must be list view template with the button. The attribute ID must be tmp_load_more.
+*/
+/**
+	@property {Integer} data-extenditems
+	Defines the number of data elements to be extended at a time.
+*/
+( 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( "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" );
+			$( this ).addClass( "ui-btn-up-s" );
+			$( this ).removeClass( "ui-btn-down-s" );
+		},
+
+		_pushData: function ( template ) {
+			var o = this.options,
+				t = this,
+				i = 0,
+				myTemplate = $( "#" + template ),
+				loadMoreItems = ( o.extenditems > t._numItemData - t._lastIndex ? t._numItemData - t.lastIndex : o.extenditems ),
+				htmlData;
+
+			for (i = 0; i < loadMoreItems; i++ ) {
+				htmlData = myTemplate.tmpl( t._itemData( i ) );
+				$( o.id ).append( $( htmlData ).attr( 'id', 'li_' + i ) );
+
+				/* Add style */
+				$( o.id + ">" + o.childSelector )
+					.addClass( "ui-btn-up-s" )
+					.bind( "mouseup", t._stylerMouseUp )
+					.bind( "mousedown", t._stylerMouseDown )
+					.bind( "mouseover", t._stylerMouseOver )
+					.bind( "mouseout", t._stylerMouseOut );
+
+				t._lastIndex += 1;
+			}
+
+			/* After push data, re-style extendable list widget */
+			$( o.id ).trigger( "create" );
+		},
+
+		_loadmore: function ( event ) {
+			var t = event.data,	// <li> element
+				o = t.options,
+				i = 0,
+				myTemplate = $( "#" + o.template ),
+				loadMoreItems = ( o.extenditems > t._numItemData - t._lastIndex ? t._numItemData - t._lastIndex : 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( t._itemData( t._lastIndex ) );
+				$( o.id ).append( $( htmlData ).attr( 'id', 'li_' + t._lastIndex ) );
+				t._lastIndex += 1;
+			}
+
+			/* Append "Load more" message on the last of list */
+			if ( t._numItemData > t._lastIndex ) {
+				myTemplate = $( "#" + o.loadmore );
+				more_items_to_load = t._numItemData - t._lastIndex;
+				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 } );
+				// Button minimum height(37px)
+				$( o.id ).append( $( htmlData ).attr( 'id', "load_more_message" ).css( 'min-height' , "37px") );
+			}
+
+			$( o.id ).trigger( "create" );
+			$( o.id ).extendablelist( "refresh" );
+		},
+
+		recreate: function ( newArray ) {
+			this._create( {
+				itemData: function ( idx ) { return newArray[ idx ]; },
+				numItemData: newArray.length
+			} );
+		},
+
+		_initList: function (args ) {
+			var t = this,
+				o = this.options,
+				myTemplate,
+				more_items_to_load,
+				num_next_load_items,
+				htmlData;
+
+			/* Make Gen list by template */
+			if ( t._lastIndex <= 0 ) {
+				t._pushData( o.template );
+
+				/* Append "Load more" message on the last of list */
+				if ( t._numItemData > t._lastIndex ) {
+					myTemplate = $( "#" + o.loadmore );
+					more_items_to_load = t._numItemData - t._lastIndex;
+					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 } );
+					// Button minimum height(37px)
+					$( o.id ).append( $( htmlData ).attr( 'id', "load_more_message" ).css( 'min-height' , "37px") );
+
+					$( "#load_more_message" ).live( "click", t, 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.apply( this, arguments );
+		},
+
+		_create: function ( args ) {
+			var t = this,
+				o = this.options,
+				$el = this.element,
+				dbtable_name;
+
+
+			t.destroy();
+
+			$.extend(this, {
+				_itemData: function ( idx ) { return null; },
+				_numItemData: 0,
+				_cacheItemData: function ( minIdx, maxIdx ) { },
+				_lastIndex: 0
+			});
+
+
+			// 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;
+			}
+
+			if ( args ) {
+				if ( !t._loadData( args ) ) {
+					return;
+				}
+			} else {
+				// Legacy support: dbtable
+				console.warn("WARNING: The data interface of extendable list is changed. \nOld data interface(data-dbtable) is still supported, but will be removed in next version. \nPlease fix your code soon!");
+
+				if ( $( o.id ).hasClass( "elLoadSuccess" ) ) {
+					dbtable_name = $el.jqmData('dbtable');
+					o.dbtable = window[ dbtable_name ];
+					if ( !(o.dbtable) ) {
+						o.dbtable = { };
+					}
+					t._itemData = function ( idx ) {
+						return o.dbtable[ idx ];
+					};
+					t._numItemData = o.dbtable.length;
+
+				} else {
+					console.warn("No elLoadSuccess class");
+					return;
+				}
+			}
+
+			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";
+				}
+			}
+			t._initList( args );
+		},
+
+		_loadData : function ( args ) {
+			var self = this;
+
+			if ( args.itemData && typeof args.itemData == 'function'  ) {
+				self._itemData = args.itemData;
+			} else {
+				return false;
+			}
+			if ( args.numItemData ) {
+				if ( typeof args.numItemData == 'function' ) {
+					self._numItemData = args.numItemData( );
+				} else if ( typeof args.numItemData == 'number' ) {
+					self._numItemData = args.numItemData;
+				} else {
+					return false;
+				}
+			} else {
+				return false;
+			}
+			return true;
+		},
+
+
+		destroy : function () {
+			var o = this.options,
+				eOTAL_ITEMS = 0,
+				last_index = 0;
+
+			$( o.id ).empty();
+
+			$( "#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" );
+			}
+			this.element.trigger( "updatelayout" );
+		},
+
+		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 ));
+
+
+
+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));
+    }
+});
+
+
+
+/*
+ * set TIZEN specific configures
+ */
+
+( function( $, window, undefined ) {
+
+	/* set default transition */
+	$.mobile.defaultPageTransition = "none";
+
+	/* depth transition */
+	$.mobile.transitionHandlers.depth = $.mobile.transitionHandlers.simultaneous;
+	$.mobile.transitionFallbacks.depth = "fade";
+
+	/* Button data-corners default value */
+	$.fn.buttonMarkup.defaults.corners = false;
+
+	/* button hover delay */
+	$.mobile.buttonMarkup.hoverDelay = 0;
+
+})( jQuery, this );
+
+
+
+
+/* ***************************************************************************
+	Flora License
+
+	Version 1.1, April, 2013
+
+	http://floralicense.org/license/
+
+	TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+	1. Definitions.
+
+	"License" shall mean the terms and conditions for use, reproduction,
+	and distribution as defined by Sections 1 through 9 of this document.
+
+	"Licensor" shall mean the copyright owner or entity authorized by
+	the copyright owner that is granting the License.
+
+	"Legal Entity" shall mean the union of the acting entity and
+	all other entities that control, are controlled by, or are
+	under common control with that entity. For the purposes of
+	this definition, "control" means (i) the power, direct or indirect,
+	to cause the direction or management of such entity,
+	whether by contract or otherwise, or (ii) ownership of fifty percent (50%)
+	or more of the outstanding shares, or (iii) beneficial ownership of
+	such entity.
+
+	"You" (or "Your") shall mean an individual or Legal Entity
+	exercising permissions granted by this License.
+
+	"Source" form shall mean the preferred form for making modifications,
+	including but not limited to software source code, documentation source,
+	and configuration files.
+
+	"Object" form shall mean any form resulting from mechanical
+	transformation or translation of a Source form, including but
+	not limited to compiled object code, generated documentation,
+	and conversions to other media types.
+
+	"Work" shall mean the work of authorship, whether in Source or Object form,
+	made available under the License, as indicated by a copyright notice
+	that is included in or attached to the work (an example is provided
+	in the Appendix below).
+
+	"Derivative Works" shall mean any work, whether in Source or Object form,
+	that is based on (or derived from) the Work and for which the editorial
+	revisions, annotations, elaborations, or other modifications represent,
+	as a whole, an original work of authorship. For the purposes of this License,
+	Derivative Works shall not include works that remain separable from,
+	or merely link (or bind by name) to the interfaces of, the Work and
+	Derivative Works thereof.
+
+	"Contribution" shall mean any work of authorship, including the original
+	version of the Work and any modifications or additions to that Work or
+	Derivative Works thereof, that is intentionally submitted to Licensor
+	for inclusion in the Work by the copyright owner or by an individual or
+	Legal Entity authorized to submit on behalf of the copyright owner.
+	For the purposes of this definition, "submitted" means any form of
+	electronic, verbal, or written communication sent to the Licensor or
+	its representatives, including but not limited to communication on
+	electronic mailing lists, source code control systems, and issue
+	tracking systems that are managed by, or on behalf of, the Licensor
+	for the purpose of discussing and improving the Work, but excluding
+	communication that is conspicuously marked or otherwise designated
+	in writing by the copyright owner as "Not a Contribution."
+
+	"Contributor" shall mean Licensor and any individual or Legal Entity
+	on behalf of whom a Contribution has been received by Licensor and
+	subsequently incorporated within the Work.
+
+	"Tizen Certified Platform" shall mean a software platform that complies
+	with the standards set forth in the Tizen Compliance Specification
+	and passes the Tizen Compliance Tests as defined from time to time
+	by the Tizen Technical Steering Group and certified by the Tizen
+	Association or its designated agent.
+
+	2. Grant of Copyright License.  Subject to the terms and conditions of
+	this License, each Contributor hereby grants to You a perpetual,
+	worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+	copyright license to reproduce, prepare Derivative Works of,
+	publicly display, publicly perform, sublicense, and distribute the
+	Work and such Derivative Works in Source or Object form.
+
+	3. Grant of Patent License.  Subject to the terms and conditions of
+	this License, each Contributor hereby grants to You a perpetual,
+	worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+	(except as stated in this section) patent license to make, have made,
+	use, offer to sell, sell, import, and otherwise transfer the Work
+	solely as incorporated into a Tizen Certified Platform, where such
+	license applies only to those patent claims licensable by such
+	Contributor that are necessarily infringed by their Contribution(s)
+	alone or by combination of their Contribution(s) with the Work solely
+	as incorporated into a Tizen Certified Platform to which such
+	Contribution(s) was submitted. If You institute patent litigation
+	against any entity (including a cross-claim or counterclaim
+	in a lawsuit) alleging that the Work or a Contribution incorporated
+	within the Work constitutes direct or contributory patent infringement,
+	then any patent licenses granted to You under this License for that
+	Work shall terminate as of the date such litigation is filed.
+
+	4. Redistribution.  You may reproduce and distribute copies of the
+	Work or Derivative Works thereof pursuant to the copyright license
+	above, in any medium, with or without modifications, and in Source or
+	Object form, provided that You meet the following conditions:
+
+	  1. You must give any other recipients of the Work or Derivative Works
+		 a copy of this License; and
+	  2. You must cause any modified files to carry prominent notices stating
+		 that You changed the files; and
+	  3. You must retain, in the Source form of any Derivative Works that
+		 You distribute, all copyright, patent, trademark, and attribution
+		 notices from the Source form of the Work, excluding those notices
+		 that do not pertain to any part of the Derivative Works; and
+	  4. If the Work includes a "NOTICE" text file as part of its distribution,
+		 then any Derivative Works that You distribute must include a readable
+		 copy of the attribution notices contained within such NOTICE file,
+		 excluding those notices that do not pertain to any part of
+		 the Derivative Works, in at least one of the following places:
+		 within a NOTICE text file distributed as part of the Derivative Works;
+		 within the Source form or documentation, if provided along with the
+		 Derivative Works; or, within a display generated by the Derivative Works,
+		 if and wherever such third-party notices normally appear.
+		 The contents of the NOTICE file are for informational purposes only
+		 and do not modify the License.
+
+	You may add Your own attribution notices within Derivative Works
+	that You distribute, alongside or as an addendum to the NOTICE text
+	from the Work, provided that such additional attribution notices
+	cannot be construed as modifying the License. You may add Your own
+	copyright statement to Your modifications and may provide additional or
+	different license terms and conditions for use, reproduction, or
+	distribution of Your modifications, or for any such Derivative Works
+	as a whole, provided Your use, reproduction, and distribution of
+	the Work otherwise complies with the conditions stated in this License.
+
+	5. Submission of Contributions. Unless You explicitly state otherwise,
+	any Contribution intentionally submitted for inclusion in the Work
+	by You to the Licensor shall be under the terms and conditions of
+	this License, without any additional terms or conditions.
+	Notwithstanding the above, nothing herein shall supersede or modify
+	the terms of any separate license agreement you may have executed
+	with Licensor regarding such Contributions.
+
+	6. Trademarks.  This License does not grant permission to use the trade
+	names, trademarks, service marks, or product names of the Licensor,
+	except as required for reasonable and customary use in describing the
+	origin of the Work and reproducing the content of the NOTICE file.
+
+	7. Disclaimer of Warranty. Unless required by applicable law or
+	agreed to in writing, Licensor provides the Work (and each
+	Contributor provides its Contributions) on an "AS IS" BASIS,
+	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+	implied, including, without limitation, any warranties or conditions
+	of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+	PARTICULAR PURPOSE. You are solely responsible for determining the
+	appropriateness of using or redistributing the Work and assume any
+	risks associated with Your exercise of permissions under this License.
+
+	8. Limitation of Liability. In no event and under no legal theory,
+	whether in tort (including negligence), contract, or otherwise,
+	unless required by applicable law (such as deliberate and grossly
+	negligent acts) or agreed to in writing, shall any Contributor be
+	liable to You for damages, including any direct, indirect, special,
+	incidental, or consequential damages of any character arising as a
+	result of this License or out of the use or inability to use the
+	Work (including but not limited to damages for loss of goodwill,
+	work stoppage, computer failure or malfunction, or any and all
+	other commercial damages or losses), even if such Contributor
+	has been advised of the possibility of such damages.
+
+	9. Accepting Warranty or Additional Liability. While redistributing
+	the Work or Derivative Works thereof, You may choose to offer,
+	and charge a fee for, acceptance of support, warranty, indemnity,
+	or other liability obligations and/or rights consistent with this
+	License. However, in accepting such obligations, You may act only
+	on Your own behalf and on Your sole responsibility, not on behalf
+	of any other Contributor, and only if You agree to indemnify,
+	defend, and hold each Contributor harmless for any liability
+	incurred by, or claims asserted against, such Contributor by reason
+	of your accepting any such warranty or additional liability.
+
+	END OF TERMS AND CONDITIONS
+
+	APPENDIX: How to apply the Flora License to your work
+
+	To apply the Flora License to your work, attach the following
+	boilerplate notice, with the fields enclosed by brackets "[]"
+	replaced with your own identifying information. (Don't include
+	the brackets!) The text should be enclosed in the appropriate
+	comment syntax for the file format. We also recommend that a
+	file or class name and description of purpose be included on the
+	same "printed page" as the copyright notice for easier
+	identification within third-party archives.
+
+	   Copyright [yyyy] [name of copyright owner]
+
+	   Licensed under the Flora License, Version 1.1 (the "License");
+	   you may not use this file except in compliance with the License.
+	   You may obtain a copy of the License at
+
+		   http://floralicense.org/license/
+
+	   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.
+
+
+ * Authors: Hyunsook Park <hyunsook.park@samsung.com>
+ *			Wonseop Kim <wonseop.kim@samsung.com>
+ */
+
+/**
+ *	The gallery3d widget displays images along a curved path on a 3-dimensional coordinate system.
+ *	To improve performance, the size of image(s) displayed on the screen should be a square(under
+ *	128X128 pixel) as possible. But if a user can't resize the images, this widget supports an image
+ *	resizing feature and he/she can use it with "data-thumbnail-cache" option. ("data-thumbnail-cache"
+ *	option resizes the gallery images under 128x128 pixels and stores the images on a local storage.
+ *	So when a gallery3D widget is re-launched, the widget reuse the storage and a user can improve
+ *	launching time. A browser or web runtime engine should support "Web Storage" feature to use that
+ *	option.)
+ *
+ *	HTML Attributes:
+ *
+ *		data-thumbnail-cache : Determines whether to cache and resize images.
+ *
+ *	APIs:
+ *
+ *		next ( void )
+ *			: This method moves each image forward one by one.
+ *		prev ( void )
+ *			: This method moves each image backward one by one.
+ *		select ( [number] )
+ *			: When the "select" method is called with an argument, the method selects the image of given index.
+ *			If the method is called with no argument, it will return the Javascript object having "src"
+ *			attribute having the selected image's URL.
+ *		add ( object or string [, number] )
+ *			This method adds an image to Gallery3D widget.
+ *			If the second argument isn't inputted, the image is added at the 0th position.
+ *		remove ( [number] )
+ *			: This method deletes an image from Gallery3d widget.
+ *			The argument defines the index of the image to be deleted.
+ *			If an argument isn't inputted, it removes current image.
+ *		clearThumbnailCache ( void )
+ *			: This method clears the cache data of all images when thumbnailCache option is set as 'true'.
+ *		refresh ( void )
+ *			: This method updates and redraws current widget.
+ *		empty ( void )
+ *			: This method removes all of images from Gallery3D widget.
+ *		length ( void )
+ *			: This method gets the number of images.
+ *
+ *	Events:
+ *
+ *		select : Triggered when an image is selected.
+ *
+ *	Examples:
+ *
+ *		<script>
+ *			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+ *				$( "#gallery3d" ).gallery3d( "add", "01.jpg" );
+ *			});
+ *		</script>
+ *		<div id="gallery3d" data-role="gallery3d"></div>
+ */
+
+/**
+	@class Gallery3D
+	The gallery3d widget displays images along a curved path on a 3-dimensional coordinate system.
+	<br/><br/>To add an gallery3d widget to the application, use the following code:
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", "01.jpg" );
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@property {Boolean} data-thumbnail-cache
+	Determines whether to cache and resize images.
+	To improve performance, the size of image(s) displayed on the screen should be a square (under 128X128 pixels).
+	"data-thumbnail-cache" option resizes the gallery images under 128x128 pixels and stores the images on a local storage.
+	So when a gallery3D widget is re-launched, the widget reuses the storage and the launching time can be improved.
+	A browser or web runtime engine must support "Web Storage" feature to use this option.
+*/
+/**
+	@event select
+	Triggered when an image is selected.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } );
+			}).on( "select", function ( event, data, index ) {
+				// Handle the select event
+				var urlOfImage = data.src, indexOfImage = index;
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@method next
+	This method moves each image forward one by one.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } )
+					.gallery3d( "next" );
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@method prev
+	This method moves each image backward one by one.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } )
+					.gallery3d( "prev" );
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@method select
+	When the "select" method is called with an argument, the method selects the image of given index.
+	If the method is called with no argument, it will return the Javascript object having "src" attribute having the selected image's URL.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } );
+				var selectedImage = $("#gallery3d"). gallery3d( "select" );
+				// selectedImage = { src: "3.jpg" };
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@method add
+	This method adds an image to Gallery3D widget.
+	The first argument is a Javascript object having a "src" attribute or a string of image's path.
+	The second argument is an index of images.
+	If second argument isn't inputted, the image is added at the 0th position.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", "2.jpg", 1 );
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@method remove
+	This method deletes an image from Gallery3d widget.
+	The argument defines the index of the image to be deleted.
+	If an argument isn't inputted, it removes current image.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } );
+
+				$( "#gallery3d" ).gallery3d( "remove" );
+				$( "#gallery3d" ).gallery3d( "remove", 1 );
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@method clearThumbnailCache
+	This method clears the cache data of all images when thumbnailCache option is set as 'true'
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } );
+
+				$( "#gallery3d" ).gallery3d( "clearThumbnailCache" );
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d" data-thumbnail-cache="true"></div>
+*/
+/**
+	@method refresh
+	This method updates and redraws current widget.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } );
+
+				$( "#gallery3d" ).gallery3d( "refresh" );
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@method empty
+	This method removes all of images from Gallery3D widget.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } );
+
+				$( "#gallery3d" ).gallery3d( "empty" );
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+/**
+	@method length
+	This method gets the number of images.
+
+		<script>
+			$( "#gallery3d" ).on( "gallery3dcreate", function () {
+				$( "#gallery3d" ).gallery3d( "add", { src: "1.jpg" } )
+					.gallery3d( "add", { src: "2.jpg" } )
+					.gallery3d( "add", { src: "3.jpg" } );
+
+				var imagesLength = $( "#gallery3d" ).gallery3d( "length" );
+				// imagesLength = 3;
+			});
+		</script>
+		<div id="gallery3d" data-role="gallery3d"></div>
+*/
+
+( function ( $, document, window, undefined ) {
+	function Node() {
+		this.vertices = [
+			-1.0, -1.0, 0.0,
+			1.0, -1.0, 0.0,
+			1.0,  1.0, 0.0,
+			-1.0,  1.0, 0.0
+		];
+		this.textureCoords = [
+			1.0, 0.0,
+			0.0, 0.0,
+			0.0, 1.0,
+			1.0, 1.0
+		];
+		this.normalVectors = [
+			0.0, 0.0, 1.0,
+			0.0, 0.0, 1.0,
+			0.0, 0.0, 1.0,
+			0.0, 0.0, 1.0
+		];
+		this.texture = null;
+		this.textureBuffer = null;
+		this.textureBufferItemSize = 0;
+		this.mashOrder = [];
+		this.mvMatrix = null;
+		this.level = -1;
+		this.targetLevel = 0;
+		this.drawable = false;
+		this.image = null;
+		this.imageID = 0;
+	}
+
+	var isPreInitailization  = false,
+		glMatrix = {},
+		VERTEX_SHADER,
+		FRAGMENT_SHADER,
+		GlArray32,
+		GlArray16,
+		preInitialize = function () {
+			if ( isPreInitailization ) {
+				return;
+			}
+
+			window.initGlMatrix( glMatrix );
+
+			VERTEX_SHADER = [
+				"attribute vec3 aVertexPosition;",
+				"attribute vec2 aTextureCoord;",
+				"attribute vec3 aVertexNormal;",
+				"uniform mat4 uMoveMatrix;",
+				"uniform mat4 uPerspectiveMatrix;",
+				"uniform mat3 nNormalMatrix;",
+				"uniform vec3 uAmbientColor;",
+				"uniform vec3 uLightDirection;",
+				"uniform vec3 uDirectionColor;",
+				"uniform vec3 uLightDirection_first;",
+				"uniform vec3 uLightDirection_second;",
+				"varying vec2 vTextureCoord;",
+				"varying vec3 vLightWeight;",
+				"varying vec4 vFogWeight;",
+
+				"void main(void) {",
+				"	vec4 v_Position = uMoveMatrix * vec4(aVertexPosition, 1.0);",
+				"	gl_Position = uPerspectiveMatrix * v_Position;",
+				"	vTextureCoord = aTextureCoord;",
+				"	float fog = 1.0 - ((gl_Position.z + 1.5) / 60.0);",
+				"	vFogWeight = clamp( vec4( fog, fog, fog, 1.0), 0.6, 1.0);",
+				"	vec3 transNormalVector = nNormalMatrix * aVertexNormal;",
+
+				"	float vLightWeightFirst = 0.0;",
+				"	float vLightWeightSecond = max( dot(transNormalVector, uLightDirection_second), 0.0 );",
+
+				"	vLightWeight = uAmbientColor + uDirectionColor * vLightWeightSecond;",
+				"}"
+			].join( "\n" );
+
+			FRAGMENT_SHADER = [
+				"precision mediump float;",
+				"varying vec2 vTextureCoord;",
+				"varying vec3 vLightWeight;",
+				"uniform sampler2D uSampler;",
+				"varying vec4 vFogWeight;",
+
+				"void main(void) {",
+				"	vec4 TextureColor;",
+				"	if ( vTextureCoord.s <= 0.01 || vTextureCoord.s >= 0.99 || vTextureCoord.t <= 0.01 || vTextureCoord.t >= 0.99 ) {",
+				"		TextureColor = vec4(1.0, 1.0, 1.0, 0.5);",
+				"	} else {",
+				"		TextureColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));",
+				"	}",
+				"	TextureColor *= vFogWeight;",
+				"	gl_FragColor = vec4(TextureColor.rgb * vLightWeight, TextureColor.a);",
+				"}"
+			].join( "\n" );
+
+			GlArray32 = ( typeof window.Float32Array !== "undefined" ?
+					window.Float32Array :
+						( typeof window.WebGLFloatArray !== "undefined" ? window.WebGLFloatArray : Array ) );
+
+			GlArray16 = ( typeof window.Uint16Array !== "undefined" ? window.Uint16Array : Array );
+
+			isPreInitailization = true;
+		},
+		degreeToRadian = function ( degree ) {
+			return degree * Math.PI / 180;
+		},
+		getContext3D = function ( canvas ) {
+			var gl, i,
+				contextNames = [ "experimental-webgl", "webkit-3d", "webgl", "moz-webgl" ];
+
+			for ( i = 0; i < contextNames.length; i += 1 ) {
+				try {
+					gl = canvas.getContext( contextNames[i] );
+					if ( gl ) {
+						break;
+					}
+				} catch ( e ) {
+					$( canvas ).html( "Unfortunately, there's a WebGL compatibility problem. </br> You may want to check your system settings." );
+					return;
+				}
+			}
+			return gl;
+		},
+		requestAnimationFrame = function ( callback ) {
+			var id = window.setTimeout( callback, 1000 / 60 );
+			return id;
+		},
+		cancelAnimationFrame = function ( id ) {
+			window.clearTimeout( id );
+		};
+
+	$.widget( "tizen.gallery3d", $.mobile.widget, {
+		options: {
+			thumbnailCache:	false
+		},
+
+		_MAX_ITEM_COUNT: 28,
+		_ANIMATION_END: 999,
+		_DURATION_DEFAULT: 300,
+		_DURATION_FIRST: 1600,
+		_VIEWPORT_WIDTH: 1024,
+		_VIEWPORT_HEIGHT: 456,
+		_DIRECTION_LEFT: -1,
+		_DIRECTION_RIGHT: +1,
+
+		_gl: null,
+		_shaderProgram : null,
+		_positionBuffer : null,
+		_textureCoordBuffer : null,
+		_normalVectorBuffer : null,
+		_nodes: null,
+		_pMatrix : null,
+		_animationID: 0,
+		_dragInterval : 0,
+		_startTime : 0,
+		_sumTime : 0,
+		_lightsPositionStack : [
+			[0.0, 0.0, -1.0],	// back
+			[-0.2, 0.0, 0.7]	// front
+		],
+		_path: null,
+		_swipeThresholdOfBasetimeGap: ( $.support.touch ? 30 : 70 ),
+		_swipeThresholdOfSensitivity: ( $.support.touch ? 2.0 : 10.0 ),
+		_canvas: null,
+		_imageList: [],
+		_maxDrawLength: 0,
+		_firstImageNumber: 0,
+		_lastImageNumber: 0,
+		_operationQueue: [],
+
+		_create: function () {
+			var self = this,
+				view = self.element,
+				option = self.options;
+
+			preInitialize();
+
+			self._canvas = $( "<canvas class='ui-gallery3d-canvas'></canvas>" );
+
+			view.addClass( "ui-gallery3d" ).append( self._canvas );
+			self._addBehavier();
+
+			self._dragInterval = 1000 / 30;	// 30fps
+
+			$.each( self.options, function ( key, value ) {
+				self.options[ key ] = undefined;
+				self._setOption( key, value );
+			});
+		},
+
+		destroy: function () {
+			this._final();
+			$.mobile.widget.prototype.destroy.call( this );
+		},
+
+		_setOption: function ( key, value ) {
+			switch ( key ) {
+			case "thumbnailCache" :
+				if ( typeof value === "string" ) {
+					value = ( value === "true" ) ? true : false;
+				} else {
+					value = !!value;
+				}
+				this._reset();
+				break;
+			}
+
+			$.mobile.widget.prototype._setOption.call( this, key, value );
+		},
+
+		_init: function ( canvas ) {
+			var self = this,
+				pathPoints = [
+					[40, 0, -48],
+					[-12, 0, -40],	// contorl Point of Point1
+					[24, 0, -9],		// contorl Point of Point2
+					[-5, 0, -5]
+				],
+				i;
+
+			canvas = canvas || self._canvas;
+
+			if ( !canvas ) {
+				return;
+			}
+
+			self._gl = self._gl || self._initGL( canvas[0] );
+			if ( !self._gl ) {
+				return;
+			}
+
+			if ( !self._imageList ) {
+				return;
+			}
+
+			self._shaderProgram = self._shaderProgram || self._initShader( self._gl );
+			if ( !self._shaderProgram ) {
+				return;
+			}
+
+			if ( self._imageList.length > self._MAX_ITEM_COUNT ) {
+				self._firstImageNumber = self._imageList.length - 1;
+				self._lastImageNumber = self._MAX_ITEM_COUNT - 1;
+			}
+
+			self._nodes = self._initBuffers( self._gl, self._shaderProgram );
+
+			self._initTextures( self._gl, self._nodes );
+
+			self._path = $.motionpath( "bezier2d", {
+				points: pathPoints,
+				maxLevel: self._MAX_ITEM_COUNT
+			} );
+
+			for ( i = 0; i < self._nodes.length; i += 1 ) {
+				self._path.levels[i] = self._path.levels[i + 1] || 0;
+				self._nodes[i].level = i;
+			}
+
+			this._setPosition( self._ANIMATION_END, this._DIRECTION_RIGHT );
+
+			while ( this._operationQueue.length ) {
+				this._setPosition( self._ANIMATION_END, this._operationQueue.shift() );
+			}
+		},
+
+		_final: function ( canvas ) {
+			var self = this,
+				gl = self._gl;
+
+			if ( !gl ) {
+				return;
+			}
+
+			self._stop();
+
+			canvas = canvas || self._canvas;
+
+			$( self._nodes ).each( function ( i ) {
+				var node = self._nodes[i];
+				gl.deleteTexture( node.texture );
+				node.texture = null;
+			});
+			self._nodes = null;
+
+			gl.deleteBuffer( self._positionBuffer );
+			self._positionBuffer = null;
+			gl.deleteBuffer( self._textureCoordBuffer );
+			self._textureCoordBuffer = null;
+			gl.deleteBuffer( self._normalVectorBuffer );
+			self._normalVectorBuffer = null;
+
+			$.webgl.shader.deleteShaders( gl );
+			gl.deleteProgram( self._shaderProgram );
+			self._shaderProgram = null;
+
+			self._gl = gl = null;
+		},
+
+		_addBehavier : function () {
+			var self = this,
+				view = self.element,
+				canvas = self._canvas,
+				touchStartEvt = ( $.support.touch ? "touchstart" : "mousedown" ),
+				touchMoveEvt = ( $.support.touch ? "touchmove" : "mousemove" ) + ".gallery3d",
+				touchEndEvt = ( $.support.touch ? "touchend" : "mouseup" ) + ".gallery3d",
+				$document = $( document );
+
+			canvas.on( "webglcontextlost", function ( e ) {
+				e.preventDefault();
+			}).on( "webglcontextrestored", function ( e ) {
+				self._init();
+			}).on( touchStartEvt, function ( e ) {
+				var i = 0,
+					startX = 0,
+					deltaMaxSteps = 20,
+					deltas = [ deltaMaxSteps ],
+					deltaTimes = [ deltaMaxSteps ],
+					deltaIndex = 0,
+					dragValue = 0,
+					dragDirection = false,
+					prevTime = 0;
+
+				e.preventDefault();
+				e.stopPropagation();
+
+				if ( self._imageList.length <= 1 ) {
+					return;
+				}
+
+				self._stop();
+
+				startX =  $.support.touch ? e.originalEvent.changedTouches[0].pageX : e.pageX;
+				prevTime = $.now();
+
+				for ( i = 0; i < deltaMaxSteps; i += 1 ) {
+					deltas[i] = startX;
+					deltaTimes[i] = $.now();
+				}
+
+				deltaIndex += 1;
+
+				view.on( touchMoveEvt, function ( e ) {
+					var x, dx, interval;
+
+					e.preventDefault();
+					e.stopPropagation();
+
+					x =  $.support.touch ? e.originalEvent.changedTouches[0].pageX : e.pageX;
+					dx = startX - x;
+
+					deltas[deltaIndex] = x;
+					deltaTimes[deltaIndex] = $.now();
+					interval = deltaTimes[deltaIndex] - prevTime;
+
+					deltaIndex = ( deltaIndex + 1 ) % deltaMaxSteps;
+
+					// Validation of drag
+					if ( Math.abs( dx ) >= 10 && interval >= self._dragInterval ) {
+						if ( dragDirection !== ( ( dx < 0 ) ? self._DIRECTION_RIGHT : self._DIRECTION_LEFT ) ) {
+							dragValue = 0;
+							dragDirection = ( dx < 0 ) ? self._DIRECTION_RIGHT : self._DIRECTION_LEFT;
+						}
+
+						dragValue += Math.abs( dx ) / 100;
+						if ( dragValue >= 1 ) {
+							self._setPosition( self._ANIMATION_END, dragDirection );
+							dragValue = 0;
+						} else {
+							self._setPosition( dragValue, dragDirection );
+						}
+						self._drawScene();
+						startX = x;
+						prevTime = $.now();
+					}
+				}).on( touchEndEvt, function ( e ) {
+					var baseTime = 0,
+						recent = -1,
+						index = 0,
+						previous = 0,
+						baseTimeRatio = 0,
+						fx = 0,
+						lastX = 0,
+						velocityX = 0,
+						dx = 0,
+						isSwipe = true,
+						direction;
+
+					e.preventDefault();
+					e.stopPropagation();
+
+					// Validation of swipe
+					baseTime = $.now() - self._swipeThresholdOfBasetimeGap;
+					lastX = $.support.touch ? e.originalEvent.changedTouches[0].pageX : e.pageX;
+					dx = startX - lastX;
+					startX = 0;
+					for ( i = 0; i < deltaMaxSteps; i += 1 ) {
+						index = ( deltaIndex + i ) % deltaMaxSteps;
+						if ( deltaTimes[index] > baseTime ) {
+							recent = index;
+							break;
+						}
+					}
+					if ( recent < 0 ) {
+						isSwipe = false;
+					}
+
+					if ( isSwipe ) {
+						previous = recent;
+						for ( i = 0; i < deltaMaxSteps; i += 1 ) {
+							previous = ( previous - 1 + deltaMaxSteps ) % deltaMaxSteps;
+							if ( deltaTimes[previous] < deltaTimes[recent] ) {
+								break;
+							}
+						}
+						// too slow or too fast
+						if ( i === deltaMaxSteps || baseTime < deltaTimes[previous] ) {
+							isSwipe = false;
+						}
+					}
+
+					if ( isSwipe ) {
+						baseTimeRatio = ( baseTime - deltaTimes[previous] ) / ( deltaTimes[recent] - deltaTimes[previous] );
+						fx = ( 1.0 - baseTimeRatio ) * deltas[previous] + baseTimeRatio * deltas[recent];
+						if ( Math.abs( fx - lastX ) < self._swipeThresholdOfSensitivity ) {
+							fx = lastX;
+						}
+						velocityX = parseInt( ( lastX - fx ) / ( $.now() - baseTime ), 10 );
+					}
+
+					if ( isSwipe && velocityX ) {
+						direction = ( velocityX < 0 ) ? self._DIRECTION_LEFT : self._DIRECTION_RIGHT;
+						self._run( direction, Math.abs( velocityX ), dragValue );
+					} else if ( dragDirection !== 0 && dragValue ) {
+						self._animate( null, self._DURATION_DEFAULT * ( 1 - dragValue ), dragDirection, 0, dragValue );
+					}
+
+					view.off( ".gallery3d" );
+					$document.off( ".gallery3d" );
+				});
+
+				$document.on( touchMoveEvt + " " + touchEndEvt, function () {
+					view.trigger( touchEndEvt );
+				});
+			});
+		},
+
+		// ----------------------------------------------------------
+		// WebGL
+		// ----------------------------------------------------------
+		_initGL: function ( canvas ) {
+			var self = this,
+				mat4 = glMatrix.mat4,
+				gl;
+
+			gl = getContext3D( canvas );
+			if ( !gl ) {
+				return null;
+			}
+
+			gl.enable( gl.BLEND );
+			gl.blendFunc( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA );
+
+			gl.enable( gl.DEPTH_TEST );
+			gl.depthFunc( gl.LEQUAL );
+
+			canvas.width = self._VIEWPORT_WIDTH;
+			canvas.height = self._VIEWPORT_HEIGHT;
+			gl.viewportWidth = canvas.width;
+			gl.viewportHeight = canvas.height;
+			gl.viewport( 0, 0, gl.viewportWidth, gl.viewportHeight );
+			self._pMatrix = mat4.create();
+			mat4.perspective( 40, gl.viewportWidth / gl.viewportHeight, 0.1, 10000.0, self._pMatrix );
+
+			gl.clearColor( 0.15, 0.15, 0.15, 1.0 );
+			gl.clear( gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT );
+
+			return gl;
+		},
+
+		_initShader : function ( gl ) {
+			var self = this,
+				shaderProgram;
+
+			shaderProgram = $.webgl.shader.addShaderProgram( self._gl, VERTEX_SHADER, FRAGMENT_SHADER );
+			gl.useProgram( shaderProgram );
+
+			shaderProgram.vertexPositionAttr = gl.getAttribLocation( shaderProgram, "aVertexPosition" );
+			gl.enableVertexAttribArray( shaderProgram.vertexPositionAttr );
+
+			shaderProgram.textureCoordAttr = gl.getAttribLocation( shaderProgram, "aTextureCoord" );
+			gl.enableVertexAttribArray( shaderProgram.textureCoordAttr );
+
+			// Set light normal vectors for lighting~
+			shaderProgram.vertexNormalAttr = gl.getAttribLocation( shaderProgram, "aVertexNormal" );
+			gl.enableVertexAttribArray( shaderProgram.vertexNormalAttr );
+
+			shaderProgram.perspectiveMU = gl.getUniformLocation( shaderProgram, "uPerspectiveMatrix");
+			shaderProgram.transformMU = gl.getUniformLocation( shaderProgram, "uMoveMatrix");
+			shaderProgram.sampleUniform = gl.getUniformLocation( shaderProgram, "uSampler");
+
+			// Set light variables~
+			shaderProgram.normalMU = gl.getUniformLocation( shaderProgram, "nNormalMatrix");
+			shaderProgram.ambientColorU = gl.getUniformLocation( shaderProgram, "uAmbientColor");
+			shaderProgram.lightDirU_first = gl.getUniformLocation( shaderProgram, "uLightDirection_first");
+			shaderProgram.lightDirU_second = gl.getUniformLocation( shaderProgram, "uLightDirection_second");
+			shaderProgram.directionColorU = gl.getUniformLocation( shaderProgram, "uDirectionColor");
+
+			return shaderProgram;
+		},
+
+		_initBuffers: function ( gl, shaderProgram ) {
+			var self = this,
+				i = 0,
+				mashBase = 0,
+				vertices = [],
+				textureCoords = [],
+				normalVectors = [],
+				nodes = [],
+				maxDrawLength = self._MAX_ITEM_COUNT;
+
+			for ( i = 0; i < self._imageList.length + 1; i += 1 ) {
+				nodes[i] = new Node();
+				$.merge( vertices, nodes[i].vertices );
+				$.merge( textureCoords, nodes[i].textureCoords );
+				$.merge( normalVectors, nodes[i].normalVectors );
+
+				nodes[i].textureBuffer = gl.createBuffer();
+				gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, nodes[i].textureBuffer );
+				mashBase = i * 4;
+				nodes[i].meshOrder = [
+					mashBase, mashBase + 1, mashBase + 2,
+					mashBase + 2, mashBase + 3, mashBase
+				];
+				gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, new GlArray16( nodes[i].meshOrder ), gl.STATIC_DRAW );
+				gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, null ); // release buffer memory
+				nodes[i].textureBufferItemSize = 6;
+			}
+
+			self._positionBuffer = $.webgl.buffer.attribBufferData( gl, new GlArray32( vertices ) );
+			self._positionBuffer.itemSize = 3;
+
+			self._textureCoordBuffer = $.webgl.buffer.attribBufferData( gl, new GlArray32( textureCoords ) );
+			self._textureCoordBuffer.itemSize = 2;
+
+			self._normalVectorBuffer = $.webgl.buffer.attribBufferData( gl, new GlArray32( normalVectors ) ); // Vertex's normal vector for Direction light
+			self._normalVectorBuffer.itemSize = 3;
+
+			// Ambient light
+			gl.uniform3f( shaderProgram.ambientColorU, 0.1, 0.1, 0.1 );
+			// Direcntion light
+			gl.uniform3f( shaderProgram.directionColorU, 1.0, 1.0, 1.0 );
+
+			return nodes;
+		},
+
+		// ----------------------------------------------------------
+		// Texture
+		// ----------------------------------------------------------
+		_initTextures: function ( gl, nodes ) {
+			var self = this;
+
+			$( nodes ).each( function ( i ) {
+				var node = nodes[i],
+					url;
+
+				if ( !self._imageList[i] ) {
+					return false;
+				}
+
+				url = self._imageList[i].src;
+				node.texture = gl.createTexture();
+				self._loadImage( url, i, i, gl, nodes );
+			});
+		},
+
+		_loadImage: function ( url, i, imageID, gl, nodes ) {
+			var self = this,
+				isMipmap = false,
+				image,
+				node;
+
+			gl = gl || self._gl;
+			nodes = nodes || self._nodes;
+			isMipmap = isMipmap || false;
+			node = nodes[i];
+			node.image = node.image || new Image();
+			node.imageID = imageID;
+
+			$( node.image ).one( "load", function ( e ) {
+				self._bindTexture( gl, node, this, isMipmap );
+
+				if ( !self._animationID ) {
+					self._setPosition( 0, 0 );
+				}
+			});
+
+			if ( self.options.thumbnailCache ) {
+				$.imageloader.getThumbnail( url, function ( result ) {
+					if ( result === "NOT_FOUND_ERR" ) {
+						$.imageloader.setThumbnail( url, function ( result ) {
+							if ( result && result.length > 30 ) {
+								node.image.src = result;
+								isMipmap = true;
+							} else {
+								node.image.src = url;
+							}
+						});
+					} else if ( result && result.length > 30 ) {
+						node.image.src = result;
+						isMipmap = true;
+					} else {
+						node.image.src = url;
+					}
+				});
+			} else {
+				node.image.src = url;
+			}
+		},
+
+		_bindTexture: function ( gl, node, image, isMipmap ) {
+			if ( !node || !node.texture ) {
+				return;
+			}
+
+			gl.pixelStorei( gl.UNPACK_FLIP_Y_WEBGL, true );
+
+			gl.bindTexture( gl.TEXTURE_2D, node.texture );
+			gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image );
+
+			if ( isMipmap ) {
+				gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR );
+				gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST );
+				gl.generateMipmap( gl.TEXTURE_2D );
+			} else {
+				gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR );
+				gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR );
+			}
+
+			gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );
+			gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );
+
+			node.texture.loaded = true;
+
+			// release texture memory
+			gl.bindTexture( gl.TEXTURE_2D, null );
+		},
+
+		// ----------------------------------------------------------
+		// rendering
+		// ----------------------------------------------------------
+		_setPosition: function ( progress, direction ) {
+			var self = this,
+				mat4 = glMatrix.mat4,
+				nodes = self._nodes,
+				imageList = self._imageList,
+				imageListLength = imageList.length,
+				itemCount = self._MAX_ITEM_COUNT,
+				displayLength = ( imageListLength > itemCount ) ? itemCount : imageListLength,
+				nextLevelLenth = 0,
+				i = 0,
+				t = 0,
+				position = 0,
+				angle = 0,
+				current = 0,
+				next = 0,
+				nextLevel = 0,
+				path = self._path,
+				nextImageID = 0;
+
+			nextLevelLenth = ( direction >= 0 ) ? displayLength + 1 : displayLength;
+
+			if ( !nodes[i].level ) {
+				nodes[i].level = displayLength;
+			}
+
+			for ( i = 0; i < displayLength; i += 1 ) {
+				if ( !nodes[i].mvMatrix ) {
+					nodes[i].mvMatrix = mat4.create();
+				}
+
+				if ( direction > 0 && nodes[i].level >= displayLength ) {
+					nodes[i].level = 0;
+				}
+
+				current = path.levels[nodes[i].level];
+				nextLevel = ( nodes[i].level + nextLevelLenth + direction ) % nextLevelLenth;
+				next = path.levels[nextLevel];
+
+				if ( imageListLength > itemCount ) {
+					if ( direction > 0 && nextLevel === 1
+							&& self._firstImageNumber !== nodes[i].imageID ) {
+						self._loadImage( imageList[self._firstImageNumber].src, i, self._firstImageNumber );
+					} else if ( direction < 0 && nextLevel === nextLevelLenth - 1
+							&& self._lastImageNumber !== nodes[i].imageID ) {
+						self._loadImage( imageList[self._lastImageNumber].src, i, self._lastImageNumber );
+					}
+				}
+
+				mat4.identity( nodes[i].mvMatrix );
+				mat4.translate( nodes[i].mvMatrix, [-2.0, -2.0, 1.0] );
+				mat4.rotate( nodes[i].mvMatrix, degreeToRadian( 19 ), [1, 0, 0] );
+
+				t = ( current + ( next - current ) * ( ( progress > 1 ) ? 1 : progress ) );
+
+				if ( progress >= self._ANIMATION_END ) {
+					nodes[i].level = nextLevel || displayLength;
+					t = path.levels[nodes[i].level];
+				}
+
+				if ( ( progress < self._ANIMATION_END )
+						&& ( direction <= 0 && nodes[i].level < 1 ) ) {
+					nodes[i].drawable = false;
+				} else {
+					nodes[i].drawable = true;
+				}
+
+				if ( progress === self._ANIMATION_END && nodes[i].level === 1 ) {
+					self.element.trigger( "select", [imageList[nodes[i].imageID], nodes[i].imageID] );
+				}
+
+				position = path.getPosition( t );
+				angle = path.getAngle( t );
+
+				mat4.translate( nodes[i].mvMatrix, position );
+				mat4.rotate( nodes[i].mvMatrix, angle, [0, 1, 0] );
+			}
+
+			if ( imageListLength > itemCount && progress >= self._ANIMATION_END ) {
+				self._firstImageNumber = ( self._firstImageNumber - direction ) % imageListLength;
+				if ( self._firstImageNumber < 0 ) {
+					self._firstImageNumber = imageListLength - 1;
+				}
+
+				self._lastImageNumber = ( self._lastImageNumber - direction ) % imageListLength;
+				if ( self._lastImageNumber < 0 ) {
+					self._lastImageNumber = imageListLength - 1;
+				}
+			}
+			self._drawScene();
+		},
+
+		_drawScene: function () {
+			if ( !this._gl || !this._shaderProgram ) {
+				return;
+			}
+
+			var self = this,
+				gl = self._gl,
+				shaderProgram = self._shaderProgram,
+				nodes = self._nodes,
+				nodesLength = nodes.length,
+				i;
+
+			gl.clear( gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT );
+
+			gl.bindBuffer( gl.ARRAY_BUFFER, self._positionBuffer );
+			gl.vertexAttribPointer( shaderProgram.vertexPositionAttr, self._positionBuffer.itemSize, gl.FLOAT, false, 0, 0 );
+
+			gl.bindBuffer( gl.ARRAY_BUFFER, self._textureCoordBuffer );
+			gl.vertexAttribPointer( shaderProgram.textureCoordAttr, self._textureCoordBuffer.itemSize, gl.FLOAT, false, 0, 0 );
+
+			gl.bindBuffer( gl.ARRAY_BUFFER, self._normalVectorBuffer );
+			gl.vertexAttribPointer( shaderProgram.vertexNormalAttr, self._normalVectorBuffer.itemSize, gl.FLOAT, false, 0, 0 );
+
+			for ( i = 0; i < nodesLength; i += 1 ) {
+				if ( nodes[i].drawable ) {
+					self._drawElement( self._pMatrix, nodes[i] );
+				}
+			}
+		},
+
+		_drawElement: function ( perspectiveMatrix, targetNode ) {
+			var self = this,
+				gl = self._gl,
+				vec3 = glMatrix.vec3,
+				mat3 = glMatrix.mat3,
+				mat4 = glMatrix.mat4,
+				shaderProgram = self._shaderProgram,
+				moveMatrix = targetNode.mvMatrix,
+				texture = targetNode.texture,
+				meshIndexBuffer = targetNode.textureBuffer,
+				meshIndexBufferItemSize = targetNode.textureBufferItemSize,
+				lightPositions = self._lightsPositionStack,
+				LightDir,
+				normalMatrix;
+
+			if ( !moveMatrix ) {
+				return;
+			}
+
+			gl.activeTexture( gl.TEXTURE0 );
+			if ( texture && texture.loaded ) {
+				gl.bindTexture( gl.TEXTURE_2D, texture );
+			}
+			gl.uniform1i( shaderProgram.sampleUniform, 0 );
+
+			LightDir = vec3.create();
+			vec3.normalize( lightPositions[0], LightDir );
+			vec3.scale( LightDir, -8 );
+			gl.uniform3fv( shaderProgram.lightDirU_first, LightDir );
+
+			vec3.normalize( lightPositions[1], LightDir );
+			vec3.scale( LightDir, -1 );
+			gl.uniform3fv( shaderProgram.lightDirU_second, LightDir );
+			gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, meshIndexBuffer );
+
+			gl.uniformMatrix4fv( shaderProgram.perspectiveMU, false, perspectiveMatrix );
+			gl.uniformMatrix4fv( shaderProgram.transformMU, false, moveMatrix );
+
+			normalMatrix = mat3.create();
+			mat4.toInverseMat3( moveMatrix, normalMatrix );
+			mat3.transpose( normalMatrix );
+			gl.uniformMatrix3fv( shaderProgram.normalMU, false, normalMatrix );
+
+			gl.drawElements( gl.TRIANGLES, meshIndexBufferItemSize, gl.UNSIGNED_SHORT, 0 );
+
+			// release buffer memory
+			gl.bindBuffer( gl.ARRAY_BUFFER, null );
+			gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, null );
+
+			// release texture memory
+			gl.bindTexture( gl.TEXTURE_2D, null );
+		},
+
+		// ----------------------------------------------------------
+		// Animation
+		// ----------------------------------------------------------
+		_animate: function ( easingType, duration, direction, repeatCount, startValue, _removeCount ) {
+			var self = this,
+				timeNow = $.now(),
+				progress,
+				removeCount = 0;
+
+			easingType = easingType || "linear";
+			startValue = startValue || 0;
+			_removeCount = _removeCount || 0;
+
+			if ( self._sumTime >= duration ) {
+				self._setPosition( self._ANIMATION_END, direction );
+				self._stop();
+				return;
+			}
+
+			if ( self._startTime === 0 ) {
+				self._startTime = timeNow;
+			} else {
+				self._sumTime = timeNow - self._startTime;
+				progress = $.easing[ easingType ]( self._sumTime / duration, self._sumTime, startValue, repeatCount + 1, duration );
+				removeCount = parseInt( Math.abs( progress ), 10 );
+
+				if ( _removeCount !== removeCount ) {
+					self._setPosition( self._ANIMATION_END, direction );
+					_removeCount = removeCount;
+
+					if ( ( repeatCount - _removeCount ) >= 0 ) {
+						self._animate( easingType, duration, direction, repeatCount, startValue, _removeCount );
+					} else {
+						self._stop();
+					}
+					return;
+				}
+
+				self._setPosition( progress - _removeCount, direction );
+			}
+
+			self._animationID = requestAnimationFrame( function () {
+				self._animate( easingType, duration, direction, repeatCount, startValue, _removeCount );
+			});
+		},
+
+		_run: function ( direction, repeatCount, startValue ) {
+			var self = this,
+				repeat = repeatCount || 0,
+				duration = self._DURATION_DEFAULT * ( repeat + 1 );
+
+			if ( !self._gl ) {
+				self._operationQueue.push( direction );
+				return;
+			}
+
+			if ( self._imageList.length <= 1 ) {
+				return;
+			}
+
+			startValue = startValue || 0;
+			duration = ( duration >= 0 ) ? duration : 0;
+
+			if ( self._animationID ) {
+				self._setPosition( self._ANIMATION_END, direction );
+				self._stop();
+			}
+
+			self._animate( "easeOutExpo", duration, direction, repeat, startValue );
+		},
+
+		_reset: function () {
+			if ( !this._canvas || !this._gl ) {
+				return;
+			}
+
+			this._final();
+			this._init();
+			this.refresh();
+		},
+
+		_stop: function () {
+			if ( this._animationID ) {
+				cancelAnimationFrame( this._animationID );
+			}
+			this._animationID = 0;
+
+			this._startTime = 0;
+			this._sumTime = 0;
+		},
+
+		next: function () {
+			this._run( this._DIRECTION_LEFT , 0 );
+		},
+
+		prev: function () {
+			this._run( this._DIRECTION_RIGHT, 0 );
+		},
+
+		refresh: function () {
+			var view = this.element,
+				canvas = view.find( "canvas.ui-gallery3d-canvas" );
+
+			if ( canvas.width() !== view.width() ) {
+				canvas.width( view.width() );
+			}
+
+			if ( !this._animationID ) {
+				this._setPosition( 0, 0 );
+			}
+		},
+
+		select: function ( index ) {
+			var nodes = this._nodes,
+				repeat,
+				i,
+				imageID,
+				object = null,
+				target = 0,
+				direction = 0;
+
+			if ( index && this._animationID ) {
+				this._stop();
+			}
+
+			for ( i in nodes ) {
+				if ( nodes[i].level === 1 ) {
+					object = this._imageList[ nodes[i].imageID ];
+					imageID = nodes[i].imageID;
+					break;
+				}
+			}
+
+			if ( !index ) {
+				return object;
+			}
+
+			if ( index < 0 && index >= this._imageList.length ) {
+				return;
+			}
+
+			target = index - imageID;
+			direction = ( target > 0 ) ? this._DIRECTION_LEFT
+				: ( ( target < 0 ) ? this._DIRECTION_RIGHT : 0 );
+			if ( direction ) {
+				this._run( direction, Math.abs( target ) - 1  );
+			}
+		},
+
+		add: function ( item, index ) {
+			if ( !item ) {
+				return;
+			}
+
+			if ( typeof item === "string" ) {
+				item = { "src" : item };
+			}
+
+			index = index || 0;
+			if ( typeof index !== "number" && index < 0
+					&& index >= this._imageList.length ) {
+				return;
+			}
+
+			this._imageList.splice( index, 0, item );
+			if ( this._gl ) {
+				this._reset();
+			}
+		},
+
+		remove: function ( index ) {
+			index = index || 0;
+			if ( typeof index !== "number" && index < 0
+					&& index >= this._imageList.length ) {
+				return;
+			}
+
+			this._imageList.splice( index, 1 );
+			if ( this._gl ) {
+				this._reset();
+			}
+		},
+
+		clearThumbnailCache: function () {
+			if ( !this._nodes || ( this._nodes.length <= 0 ) ) {
+				return;
+			}
+
+			var i, url;
+			for ( i = 0; i < this._imageList.length; i += 1 ) {
+				url = this._imageList[i].src;
+				$.imageloader.removeThumbnail( url );
+			}
+		},
+
+		empty: function () {
+			this._imageList = [];
+			this._reset();
+		},
+
+		length: function () {
+			return this._imageList.length;
+		}
+	});
+
+	$( document ).on( "pagecreate create", function ( e ) {
+		$( ":jqmData(role='gallery3d')" ).gallery3d();
+	}).on( "pagechange", function ( e ) {
+		$( e.target ).find( ".ui-gallery3d" ).gallery3d( "refresh" );
+	});
+
+	$( window ).on( "resize orientationchange", function ( e ) {
+		$( ".ui-page-active" ).find( ".ui-gallery3d" ).gallery3d( "refresh" );
+	});
+
+} ( jQuery, document, window ) );
+
+
+
+/**
+	@class Button
+	The button widget shows a control on the screen that you can use to generate an action event when it is pressed and released. This widget is coded with standard HTML anchor and input elements and then enhanced by jQueryMobile to make it more attractive and usable on a mobile device. Buttons can be used in Tizen as described in the jQueryMobile documentation for buttons.
+
+	To add a button widget to the application, use the following code
+
+		<div data-role="button" data-inline="true">Text Button Test</div>
+		<div data-role="button" data-inline="true" data-icon="plus" data-style="circle"></div>
+		<div data-role="button" data-inline="true" data-icon="plus" data-style="nobg"></div>
+
+	The button can define callbacks for events as described in the jQueryMobile documentation for button events.<br/>
+	You can use methods with the button as described in the jQueryMobile documentation for button methods.
+*/
+
+/**
+	@property {String} data-style
+	Defines the button style. <br/> The default value is box. If the value is set to circle, a circle-shaped button is created. If the value is set to nobg, a button is created without a background.
+
+*/
+/**
+	@property {String} data-icon
+	Defines an icon for a button. Tizen supports 12 icon styles: reveal, closed, opened, info, rename, call, warning, plus, minus, cancel, send, and favorite.
+
+*/
+
+
+
+/*
+ * 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, {
+	disableSelection: function (element) {
+		this.enableSelection(
+			$(element).find('*').not( 'input, [type="text"], textarea' ),
+			'none'
+		);
+		return true;
+	},
+
+	enableSelection: function (element, value) {
+		var val;
+		switch ( value ) {
+			case 'text' :
+			case 'auto' :
+			case 'none' :
+				val = value;
+			break;
+			default :
+				val = 'auto';
+			break;
+		}
+		return $(element).css( {
+			'user-select': val,
+			'-moz-user-select': val,
+			'-webkit-user-select': val,
+			'-o-user-select': val,
+			'-ms-transform': val
+		} );
+    },
+
+    disableContextMenu: function(element) {
+	var self = this;
+	$(element).find('*').each( function() {
+		if( ( $(this).get(0).tagName !== 'INPUT' &&
+			$(this).attr("type") !== 'text' ) &&
+			$(this).get(0).tagName !== 'TEXTAREA' ) {
+			self._disableContextMenu( this );
+		}
+	} );
+    },
+
+    _disableContextMenu: function(element) {
+
+	$(element).each( function() {
+		$(this).bind("contextmenu", function( event ) {
+			return false;
+		} );
+	} );
+    },
+
+    enableContextMenu: function(element) {
+	$(element).each( function() {
+		$(this).unbind( "contextmenu" );
+	} );
+    },
+
+    // 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;
+    }
+});
+
+})();
+
+
+
+/* ***************************************************************************
+ * 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: Jinhyuk Jun <jinhyuk.jun@samsung.com>
+ */
+
+(function ( $, undefined ) {
+
+	$.widget( "mobile.pagelayout", $.mobile.widget, {
+		options: {
+			visibleOnPageShow: true,
+			disablePageZoom: true,
+			transition: "slide", //can be none, fade, slide (slide maps to slideup or slidedown)
+			fullscreen: false,
+			tapToggle: true,
+			tapToggleBlacklist: "a, input, select, textarea, .ui-header-fixed, .ui-footer-fixed",
+			hideDuringFocus: "input, textarea, select",
+			updatePagePadding: true,
+			// Browser detection! Weeee, here we go...
+			// Unfortunately, position:fixed is costly, not to mention probably impossible, to feature-detect accurately.
+			// Some tests exist, but they currently return false results in critical devices and browsers, which could lead to a broken experience.
+			// Testing fixed positioning is also pretty obtrusive to page load, requiring injected elements and scrolling the window
+			// The following function serves to rule out some popular browsers with known fixed-positioning issues
+			// This is a plugin option like any other, so feel free to improve or overwrite it
+			supportBlacklist: function () {
+				var w = window,
+					ua = navigator.userAgent,
+					platform = navigator.platform,
+					// Rendering engine is Webkit, and capture major version
+					wkmatch = ua.match( /AppleWebKit\/([0-9]+)/ ),
+					wkversion = !!wkmatch && wkmatch[ 1 ],
+					ffmatch = ua.match( /Fennec\/([0-9]+)/ ),
+					ffversion = !!ffmatch && ffmatch[ 1 ],
+					operammobilematch = ua.match( /Opera Mobi\/([0-9]+)/ ),
+					omversion = !!operammobilematch && operammobilematch[ 1 ];
+
+				if (
+					// iOS 4.3 and older : Platform is iPhone/Pad/Touch and Webkit version is less than 534 (ios5)
+					( ( platform.indexOf( "iPhone" ) > -1 || platform.indexOf( "iPad" ) > -1  || platform.indexOf( "iPod" ) > -1 ) && wkversion && wkversion < 534 ) ||
+						// Opera Mini
+						( w.operamini && ({}).toString.call( w.operamini ) === "[object OperaMini]" ) ||
+						( operammobilematch && omversion < 7458 ) ||
+						//Android lte 2.1: Platform is Android and Webkit version is less than 533 (Android 2.2)
+						( ua.indexOf( "Android" ) > -1 && wkversion && wkversion < 533 ) ||
+						// Firefox Mobile before 6.0 -
+						( ffversion && ffversion < 6 ) ||
+						// WebOS less than 3
+						( window.palmGetResource !== undefined && wkversion && wkversion < 534 ) ||
+						// MeeGo
+						( ua.indexOf( "MeeGo" ) > -1 && ua.indexOf( "NokiaBrowser/8.5.0" ) > -1 )
+				) {
+					return true;
+				}
+
+				return false;
+			},
+			initSelector: ":jqmData(role='content')"
+		},
+
+		_create: function () {
+
+			var self = this,
+				o = self.options,
+				$el = self.element;
+
+			// Feature detecting support for
+			if ( o.supportBlacklist() ) {
+				self.destroy();
+				return;
+			}
+
+			self._addFixedClass();
+			self._addTransitionClass();
+			self._bindPageEvents();
+
+			// only content
+			self._bindContentControlEvents();
+
+			// Store back-button, to show again
+			self._backBtnQueue = [];
+		},
+
+		/* add minimum fixed css style to bar(header/footer) and content
+		*  it need to update when core source modified(jquery.mobile.page.section.js)
+		*  modified from core source cuz initSelector different */
+		_addFixedClass: function () {
+			var self = this,
+				o = self.options,
+				$el = self.element,
+				$elHeader = $el.siblings( ":jqmData(role='header')" ),
+				$elFooter = $el.siblings( ":jqmData(role='footer')" ),
+				$elPage = $el.closest(".ui-page");
+
+			$elHeader.addClass( "ui-header-fixed" );
+			$elFooter.addClass( "ui-footer-fixed" );
+
+			// "fullscreen" overlay positioning
+			if ( o.fullscreen ) {
+				$elHeader.addClass( "ui-header-fullscreen" );
+				$elFooter.addClass( "ui-footer-fullscreen" );
+				$elPage
+					.addClass( "ui-page-header-fullscreen" )
+					.addClass( "ui-page-footer-fullscreen" );
+			} else {
+			// If not fullscreen, add class to page to set top or bottom padding
+				$elPage.addClass( "ui-page-header-fixed" )
+					.addClass( "ui-page-footer-fixed" );
+			}
+		},
+
+		/* original core source(jquery.mobile.fixedToolbar.js)
+		* never changed */
+		_addTransitionClass: function () {
+			var tclass = this.options.transition;
+
+			if ( tclass && tclass !== "none" ) {
+				// use appropriate slide for header or footer
+				if ( tclass === "slide" ) {
+					tclass = this.element.is( ".ui-header" ) ? "slidedown" : "slideup";
+				}
+
+				this.element.addClass( tclass );
+			}
+		},
+
+
+		/* Set default page positon
+		* 1. add title style to header
+		* 2. Set default header/footer position */
+		setHeaderFooter: function ( thisPage ) {
+			var $elPage = $( thisPage ),
+				$elHeader = $elPage.find( ":jqmData(role='header')" ).length ? $elPage.find( ":jqmData(role='header')") : $elPage.siblings( ":jqmData(role='header')"),
+				$elContent = $elPage.find( ".ui-content" ),
+				$elFooter = $elPage.find( ":jqmData(role='footer')" ),
+				$elFooterGroup = $elFooter.find( ":jqmData(role='fieldcontain')" ),
+				$elFooterControlGroup = $elFooter.find( ".ui-controlgroup" );
+
+			// divide content mode scrollview and non-scrollview
+			if ( !$elPage.is( ".ui-dialog" ) ) {
+				if ( $elHeader.jqmData("position") == "fixed" || ( $.support.scrollview && $.tizen.frameworkData.theme.match(/tizen/) ) ) {
+					$elHeader
+						.css( "position", "fixed" )
+						.css( "top", "0px" );
+				} else if ( !$.support.scrollview && $elHeader.jqmData("position") != "fixed" ) {
+					$elHeader.css( "position", "relative" );
+				}
+			}
+
+			/* set Title style */
+			if ( $elHeader.find("span.ui-title-text-sub").length ) {
+				$elHeader.addClass( "ui-title-multiline");
+			}
+
+			if ( $elFooterGroup.find( "div" ).is( ".ui-controlgroup-label" ) ) {
+				$elFooterGroup.find( "div.ui-controlgroup-label" ).remove();
+			}
+
+			if ( $elFooterControlGroup.length ) {
+				var anchorPer = 100 / $elFooterControlGroup.find( "a" ).length;
+				$elFooterControlGroup.find( "a" ).each( function ( i ) {
+					$elFooterControlGroup.find( "a" ).eq( i ).width( anchorPer + "%" );
+				});
+			}
+		},
+
+		_bindPageEvents: function () {
+			var self = this,
+				o = self.options,
+				$el = self.element,
+				$elCurrentFooter;
+
+			//page event bindings
+			// Fixed toolbars require page zoom to be disabled, otherwise usability issues crop up
+			// This method is meant to disable zoom while a fixed-positioned toolbar page is visible
+			$el.closest( ".ui-page" )
+				.bind( "pagebeforeshow", function ( event ) {
+					var thisPage = this;
+					if ( o.disablePageZoom ) {
+						$.mobile.zoom.disable( true );
+					}
+					if ( !o.visibleOnPageShow ) {
+						self.hide( true );
+					}
+					self.setHeaderFooter( thisPage );
+					self._setContentMinHeight( thisPage );
+					self._updateHeaderArea( thisPage );
+					self._updateFooterArea( thisPage );
+				} )
+				.bind( "webkitAnimationStart animationstart updatelayout", function ( e, data ) {
+					var thisPage = this;
+					if ( o.updatePagePadding ) {
+						self.updatePagePadding(thisPage);
+						self.updatePageLayout( thisPage, data);
+					}
+				})
+
+				.bind( "pageshow", function ( event ) {
+					var thisPage = this;
+					self._setContentMinHeight( thisPage );
+					self.updatePagePadding( thisPage );
+					self._updateHeaderArea( thisPage );
+					self._updateFooterArea( thisPage );
+
+					// check device api : HW key existance
+					// TODO: remove these functions, because the HW key is mandatory.
+					if ( false ) {
+						self._bindHWkeyOnSWBtn();
+						self._setHWKeyLayout( thisPage );
+					}
+					self._setHWKeySupport( thisPage );
+					//self._setMenuPopupLayout( thisPage );
+
+					if ( o.updatePagePadding ) {
+						$( window ).bind( "throttledresize." + self.widgetName, function () {
+							self.updatePagePadding(thisPage);
+							self.updatePageLayout( thisPage, true);
+							self._updateHeaderArea( thisPage );
+							self._updateFooterArea( thisPage );
+							self._setContentMinHeight( thisPage );
+						});
+					}
+				})
+
+				.bind( "pagebeforehide", function ( e, ui ) {
+					self._unsetHWKeySupport( );
+					if ( o.disablePageZoom ) {
+						$.mobile.zoom.enable( true );
+					}
+					if ( o.updatePagePadding ) {
+						$( window ).unbind( "throttledresize." + self.widgetName );
+					}
+				});
+
+			window.addEventListener( "softkeyboardchange", function ( e ) {
+				var $elDownBtn = $( "<div class='ui-btn-footer-down'></div>" ),
+					$elPage = $( ".ui-page-active" ),
+					backBtn,
+					backBtnPosition = "footer";
+				// N_SE-42987 : If self._backBtnQueue.length has value is not 0, this means .ui-btn-back button is still hidden.
+				//		So, condition that check self._backBtnQueue value add.
+				if ( $elPage.data( "addBackBtn" ) || self._backBtnQueue.length ) {
+					$elPage.data( "addBackBtn" ) == "header" ? backBtnPosition = "header" : backBtnPosition = "footer";
+
+					if ( e.state == "on" ) {
+						if ( !$elPage.find( ".ui-" + backBtnPosition + " .ui-btn-footer-down" ).length ) {
+							$elDownBtn.buttonMarkup( { icon: "down" } ).appendTo( $elPage.find( ".ui-" + backBtnPosition ) );
+						}
+
+						// N_SE-32900: If an app moves a page when the pop is shown, the .ui-page-active page
+						//             is changed.
+						//             In this case, the '.ui-page-active .ui-btn-back' selector indicates a
+						//             new page's one, and the old page's .ui-btn-back button is still hidden.
+						//             So, the current back button is remembered to be shown at the
+						//             softkeyboardchange.off event.
+						if ( true ) {
+							backBtn = $( ".ui-page-active .ui-btn-back" );
+							backBtn.hide();
+							self._backBtnQueue.push( backBtn );	// Store hidden backBtn
+						}
+					} else if ( e.state == "off" ) {
+						if ( true ) {
+							self._backBtnQueue.forEach( function ( b ) {
+								b.show();	// Show each backBtn,
+							} );
+							self._backBtnQueue.length = 0;	// and clear queue.
+						}
+						$( ".ui-btn-footer-down" ).remove();
+					}
+				}
+			});
+		},
+
+		_bindContentControlEvents: function () {
+			var self = this,
+				o = self.options,
+				$el = self.element;
+
+			$el.closest( ".ui-page" )
+				.bind( "pagebeforeshow", function ( event ) {
+
+				});
+		},
+
+		_HWKeyHandler: function ( ev ) {
+			var $openedpopup = $.mobile.popup.active,
+				$page,
+				$focused;
+			// NOTE: The 'tizenhwkey' event is passed only document -> window objects.
+			//       Other DOM elements does not receive 'tizenhwkey' event.
+
+			// menu key
+			if( ev.originalEvent.keyName == "menu" ) {
+				// Blur focused element to turn off SIP(IME)
+				$page = $( ev.data ); 	// page object, passed by _setHWKeySupport()
+				$focused = $page.find( ".ui-focus" );
+				if( $focused[0] ) {	// Focused element is found
+					$focused.blur();
+					// NOTE: If a popup is opened and focused element exists in it,
+					//       do not close that popup.
+					//       'false' is returned here, hence popup close routine is not run.
+					return false;
+				}
+				// Close opened popup
+				if( $openedpopup ) {
+					$openedpopup.close();
+					return false;
+				}
+			}
+			// back key
+			else if( ev.originalEvent.keyName == "back" ) {
+				// Close opened popup
+				if( $openedpopup ) {
+					$openedpopup.close();
+					return false;
+				}
+			}
+			return true;	// Otherwise, propagate tizenhwkey event to window object
+		},
+
+		_setHWKeySupport: function( thisPage ) {
+			$( document ).on( "tizenhwkey", thisPage, this._HWKeyHandler );
+		},
+
+		_unsetHWKeySupport: function () {
+			$( document ).off( "tizenhwkey", this._HWKeyHandler );
+		},
+
+		_bindHWkeyOnSWBtn: function () {
+			// if HW key not exist
+			// return true
+			// else
+			$( document ).on( "tizenhwkey", function( e ) {
+				var openedpopup = $.mobile.popup.active,
+					$elPage = $( ".ui-page-active" ),
+					$elFooter = $elPage.find( ":jqmData(role='footer')" ),
+					$elMoreKey = $elFooter.children(":jqmData(icon='naviframe-more')"),
+					morePopup;
+
+				if ( $( ".ui-page-active .ui-footer" ).hasClass( "ui-footer-force-btn-show" ) ) {
+					return true;
+				}
+
+				if ( e.originalEvent.keyName === "back" ) {
+					// need to change back button
+					if( openedpopup ) {
+						openedpopup.close();
+						return false;
+					}
+					//Click trigger
+					 $( ".ui-page-active .ui-footer .ui-btn-back" ).trigger( "click" );
+					return false;
+				} else if ( e.originalEvent.keyName === "menu" ) {
+					// if more button was clicked, all kinds of popups will be closed
+					if ( openedpopup ) {
+						openedpopup.close();
+						return false;
+					}
+
+					// need to change more key trigger
+					if ( $elMoreKey.get(0) ) {
+						$elMoreKey.trigger( "click" );
+					}
+					return false;
+				}
+			} );
+
+		},
+
+		_setContentMinHeight : function ( thisPage ) {
+			var $elPage = $( thisPage ),
+				$elHeader = $elPage.find( ":jqmData(role='header')" ),
+				$elFooter = $elPage.find( ":jqmData(role='footer')" ),
+				$elContent = $elPage.find( ":jqmData(role='content')" ),
+				footerHeight,
+				resultMinHeight,
+				dpr = 1,
+				layoutInnerHeight = window.innerHeight;
+
+			if ( !$.support.scrollview || ($.support.scrollview && $elContent.jqmData("scroll") === "none") ) {
+					dpr = window.outerWidth / window.innerWidth;
+					layoutInnerHeight = Math.floor( window.outerHeight / dpr );
+			} else {
+				layoutInnerHeight = window.innerHeight;
+			}
+
+			if ( $elFooter.css( "display" ) === "none" ) {
+				footerHeight = 0;
+			} else {
+				footerHeight = $elFooter.height();
+			}
+			resultMinHeight = layoutInnerHeight - $elHeader.height() - footerHeight;
+
+			if ( $.support.scrollview && $elContent.jqmData("scroll") !== "none" ) {
+				$elContent.css( "min-height", resultMinHeight - parseFloat( $elContent.css("padding-top") ) - parseFloat( $elContent.css("padding-bottom") ) + "px" );
+				$elContent.children( ".ui-scrollview-view" ).css( "min-height", $elContent.css( "min-height" ) );
+			}
+		},
+
+		_updateHeaderArea : function ( thisPage ) {
+			var $elPage = $( thisPage ),
+				$elHeader = $elPage.find( ":jqmData(role='header')" ).length ? $elPage.find( ":jqmData(role='header')") : $elPage.siblings( ":jqmData(role='header')"),
+				$headerBtn = $elHeader.children("a,[data-"+$.mobile.ns+"role=button]"),
+				headerBtnWidth = $headerBtn.width() + parseInt( $headerBtn.css("padding-left") ) + parseInt( $headerBtn.css("padding-right") ),
+				headerBtnNum = $headerBtn.length,
+				$headerSrc = $elHeader.children("img"),
+				headerSrcNum = $headerSrc.length,
+				headerSrcWidth = $headerSrc.width() + parseInt( $headerSrc.css("margin-left") ),
+				h1width;
+
+			if ( !$elPage.is( ".ui-dialog" ) ) {
+				h1width = window.innerWidth - parseInt( $elHeader.find( "h1" ).css( "margin-left" ), 10 ) * 2 - headerBtnWidth * headerBtnNum - headerSrcWidth * headerSrcNum;
+				$elHeader.find( "h1" ).css( "width", h1width );
+				$elHeader.find( '.ui-title-text-sub' ).css( "width", h1width );
+			}
+			/* add half width for default space between text and button, and img tag area is too narrow, so multiply three for img width*/
+		},
+
+		_updateFooterArea : function ( thisPage ) {
+			var $elPage = $( thisPage ),
+				$elFooter = $elPage.find( ".ui-footer" ),
+				$elMoreKey = $elFooter.children( ":jqmData(icon='naviframe-more')" ),
+				$elBackKey = $elFooter.children( ".ui-btn-back, .ui-btn-footer-down" ),
+				footerBtn = $elFooter.children( "div.ui-btn, a.ui-btn" ),
+				btnLength = footerBtn.length,
+				btnWidth = window.innerWidth,
+				realBtnIndex = 0,
+				idx, moreWidth = 0;
+
+			if ( !btnLength ) {
+				return;
+			}
+
+			if ( $elMoreKey.length ) {
+				moreWidth = $elMoreKey.width();
+				btnWidth -= moreWidth;
+			}
+
+			if ( $elBackKey.length ) {
+				btnWidth -= $elBackKey.width();
+				$elBackKey.addClass( "ui-footer-btn-border" );
+			}
+
+			btnWidth /= btnLength - $elMoreKey.length - $elBackKey.length;
+
+			for ( idx = 0; idx < btnLength; idx++ ) {
+				if ( footerBtn.eq( idx ).hasClass( "ui-btn-back" ) ) {
+					continue;
+				}
+				if ( footerBtn.eq( idx ).is( ":jqmData(icon='naviframe-more')" ) ){
+					continue;
+				}
+				footerBtn.eq( idx )
+					.addClass( "ui-footer-btn-border" )
+					.width( btnWidth )
+					.css( "position", "absolute" )
+					.css( "left", realBtnIndex * btnWidth + moreWidth );
+				realBtnIndex++;
+			}
+			$elFooter.find( ".ui-footer-btn-border" ).eq( 0 ).removeClass( "ui-footer-btn-border" );
+		},
+
+		_setHWKeyLayout : function ( thisPage ) {
+			var $elPage = $( thisPage ),
+				$elFooter = $elPage.find( ":jqmData(role='footer')" ),
+				$elBackKey = $elFooter.children( ".ui-btn-back" ),
+				$elMoreKey = $elFooter.children(":jqmData(icon='naviframe-more')"),
+				$elTabBar = $elFooter.children( ".ui-tabbar" ),
+				$elControlGroup = $elFooter.children( ".ui-controlgroup" );
+				//cntMore = 0,
+			
+				// Check HW Key option
+			if ( $elFooter.hasClass("ui-footer-force-btn-show") ) {
+				return true;
+			}
+
+			/*
+			if ( $elMoreKey.length ) {
+				cntMore = $elMoreKey.length + 1;
+			} else {
+				cntMore = 0;
+			}
+
+			// need to add device api to check HW key exist
+			// Case 1 : footer - BackKey/MoreKey/Button - hide BackKey/MoreKey
+			if ( $elFooter.children().length - $elBackKey.length - cntMore > 0 ) {
+				$elBackKey.hide();
+				$elMoreKey.hide();
+			// Case 2 : footer - BackKey/MoreKey - more, back hide depend on OSP
+			} else {
+				$elBackKey.hide();
+				$elMoreKey.hide();
+			}
+			*/
+
+			if( $elMoreKey ) {
+				$elMoreKey.hide();
+			}
+			if( $elBackKey ) {
+				$elBackKey.hide();
+			}
+			if( $elTabBar ) {
+				$elTabBar.removeClass( "ui-tabbar-margin-more ui-tabbar-margin-back" );
+			}
+			if ( $elControlGroup ) {
+				$elControlGroup.removeClass( "ui-controlgroup-padding-more ui-controlgroup-padding-back" );
+			}
+			// Case 3 : no footer - do nothing
+
+			return true;
+		},
+		_setMenuPopupLayout: function ( thisPage ) {
+			var $page = $( thisPage ),
+				$footer = $page.find( ":jqmData(role='footer')" ),
+				moreKey = $page.find( ":jqmData(icon='naviframe-more')" )[0],
+				//cntMore = 0,
+				$morePopup;
+
+			if( moreKey && moreKey.hash ) {	// moreKey.hash = #morePopupID (from <a href="">)
+				$morePopup =  $( moreKey.hash );
+				$morePopup.addClass ( "ui-ctxpopup-optionmenu" );
+			}
+		 },
+
+		_visible: true,
+
+		// This will set the content element's top or bottom padding equal to the toolbar's height
+		updatePagePadding: function ( tbPage ) {
+			var $el = this.element,
+				header = $el.siblings( ".ui-header" ).length,
+				footer = $el.siblings( ".ui-footer" ).length;
+
+			// This behavior only applies to "fixed", not "fullscreen"
+			if ( this.options.fullscreen ) {
+				return;
+			}
+
+			tbPage = tbPage || $el.closest( ".ui-page" );
+
+			if ( $el.siblings( ".ui-header" ).jqmData("position") == "fixed" || ($.support.scrollview && $el.jqmData("scroll") !== "none" )) {
+				$( tbPage ).css( "padding-top", ( header ? $el.siblings( ".ui-header" ).outerHeight() : 0 ) );
+			}
+			$( tbPage ).css( "padding-bottom", (( footer && $el.siblings( ".ui-footer" ).css( "display" ) !== "none" ) ? $el.siblings( ".ui-footer" ).outerHeight() : 0 ) );
+		},
+
+		/* 1. Calculate and update content height   */
+		updatePageLayout: function ( thisPage, receiveType ) {
+			var $elFooter,
+				$elPage = $( thisPage ),
+				$elHeader = $elPage.find( ":jqmData(role='header')" ),
+				$elContent = $elPage.find( ":jqmData(role='content')" ),
+				resultContentHeight = 0,
+				resultFooterHeight = 0,
+				resultHeaderHeight = 0,
+				layoutInnerHeight = window.innerHeight,
+				dpr = 1;
+
+			if ( $elPage.length ) {
+				$elFooter = $elPage.find( ":jqmData(role='footer')" );
+			} else {
+				$elFooter = $( document ).find( ":jqmData(role='footer')" ).eq( 0 );
+			}
+
+			// calculate footer height
+			resultFooterHeight = ( $elFooter.css( "display" ) == "none" || $elFooter.length == 0 ) ? 0 : $elFooter.height();
+			resultHeaderHeight = ( $elHeader.css( "display" ) == "none" || $elHeader.length == 0 ) ? 0 : $elHeader.height();
+
+			if (resultFooterHeight != 0 ) {
+				$elFooter.css( "bottom", 0 );
+			}
+
+			if ( !$.support.scrollview || ($.support.scrollview && $elContent.jqmData("scroll") === "none") ) {
+				dpr = window.outerWidth / window.innerWidth;
+				layoutInnerHeight = Math.floor( window.outerHeight / dpr );
+			} else {
+				//#N_SE-43092: window.innerHeight returns incorrect size
+				layoutInnerHeight = $.mobile.$window.height();
+			}
+
+			resultContentHeight = layoutInnerHeight - resultFooterHeight - resultHeaderHeight;
+
+			if ( $.support.scrollview && $elContent.jqmData("scroll") !== "none" ) {
+				$elContent.height( resultContentHeight -
+						parseFloat( $elContent.css("padding-top") ) -
+						parseFloat( $elContent.css("padding-bottom") ) );
+			}
+
+			// External call page( "refresh") - in case title changed
+			if ( receiveType ) {
+				$elPage
+					.css( "min-height", resultContentHeight )
+					.css( "padding-top", resultHeaderHeight )
+					.css( "padding-bottom", resultFooterHeight );
+			}
+		},
+
+		show: function ( notransition ) {
+			/* blank function: deprecated */
+		},
+
+		hide: function ( notransition ) {
+			/* blank function: deprecated */
+		},
+
+		toggle: function () {
+			this[ this._visible ? "hide" : "show" ]();
+		},
+
+		destroy: function () {
+			this.element.removeClass( "ui-header-fixed ui-footer-fixed ui-header-fullscreen ui-footer-fullscreen in out fade slidedown slideup ui-fixed-hidden" );
+			this.element.closest( ".ui-page" ).removeClass( "ui-page-header-fixed ui-page-footer-fixed ui-page-header-fullscreen ui-page-footer-fullscreen" );
+		},
+
+		refresh: function () {
+			var $elPage = $( ".ui-page-active" );
+			this.setHeaderFooter( $elPage );
+			this._updateHeaderArea( $elPage );
+		}
+	});
+
+	//auto self-init widgets
+	$( document )
+		.bind( "pagecreate create", function ( e ) {
+			// DEPRECATED in 1.1: support for data-fullscreen=true|false on the page element.
+			// This line ensures it still works, but we recommend moving the attribute to the toolbars themselves.
+			if ( $( e.target ).jqmData( "fullscreen" ) ) {
+				$( $.mobile.pagelayout.prototype.options.initSelector, e.target ).not( ":jqmData(fullscreen)" ).jqmData( "fullscreen", true );
+			}
+			$.mobile.pagelayout.prototype.enhanceWithin( e.target );
+		})
+		.bind( "pagebeforeshow", function ( event, ui ) {
+			var footer_filter = $( event.target ).find( ":jqmData(role='footer')" ),
+				controlgroup_filter = footer_filter.find( ":jqmData(role='controlgroup')" ),
+				$elFooterMore = controlgroup_filter.siblings( ":jqmData(icon='naviframe-more')" ),
+				$elFooterBack = controlgroup_filter.siblings( ".ui-btn-back" );
+
+			if ( $elFooterMore.length ) {
+				controlgroup_filter.addClass( "ui-controlgroup-padding-more" );
+			}
+			if ( $elFooterBack.length ) {
+				controlgroup_filter.addClass( "ui-controlgroup-padding-back" );
+			}
+		});
+
+}( 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>
+ *	        Youmin Ha <youmin.ha@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-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.
+ *
+ * * APIs:
+ *
+ *		create ( {
+ *				itemData: function ( idx ) { return json_obj; },
+ *				numItemData: number or function () { return number; },
+ *				cacheItemData: function ( minIdx, maxIdx ) {}
+ *				} )
+ *			: Create a virtuallist widget. At this moment, _create method is called.
+ *			args : A collection of options
+ *				itemData: A function that returns JSON object for given index. Mandatory.
+ *				numItemData: Total number of itemData. Mandatory.
+ *				cacheItemData: Virtuallist will ask itemData between minIdx and maxIdx.
+ *				               Developers can implement this function for preparing data.
+ *				               Optional.
+ *
+ * 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>
+ *
+ */
+
+/**
+	@class VirtualList
+	In the Web environment, it is challenging to display a large amount of data in a list, such as displaying a contact list of over 1000 list items. It takes time to display the entire list in HTML and the DOM manipulation is complex.
+
+	The virtual list widget is used to display a list of unlimited data elements on the screen for better performance. This widget provides easy access to databases to retrieve and display data. Virtual lists are based on the jQuery.template plugin as described in the jQuery documentation for jQuery.template plugin.
+
+	To add a virtual list widget to the application, use the following code:
+
+		<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="vlist" data-role="virtuallistview" data-template="tmp-3-2-7" data-dbtable="JSON_DATA" data-row="100"></ul>
+*/
+/**
+	@property {String} data-role
+	Creates the virtual list view. The value must be set to virtuallistview.
+	Only the &gt;ul&lt; element, which a id attribute defined, supports this option. Also, the vlLoadSuccess class attribute must be defined in the &gt;ul&lt; element to ensure that loading data from the database is complete.
+*/
+/**
+	@property {String} data-template
+	Defines the jQuery.template element ID.
+	The jQuery.template must be defined. The template style can use rem units to support scalability.
+*/
+/**
+	@property {Number} data-row
+	Defines the number of virtual list child elements.
+	The minimum value is 20 and the default value is 100. As the value gets higher, the loading time increases while the system performance improves. So you need to pick a value that provides the best performance without excessive loading time.
+*/
+/**
+	@method create
+	@param {function} itemData(index)
+	: function itemData(index) returns the JSON object matched with the given index. The index value is between 0 and numItemData-1.
+	@param {Number} numItemData
+	: number numItemData or function numItemData() defines or returns a static number of items.
+	@param {function} cacheItemData(minIndex, maxIndex)
+	: function cacheItemData(minIndex, maxIndex) prepares the JSON data. This method is called before calling the itemData() method with index values between minIndex and maxIndex.
+*/
+
+(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 */
+		_NO_SCROLL = 0,					/* ENUM */
+		_SCROLL_DOWN = 1,				/* ENUM */
+		_SCROLL_UP = -1;					/* ENUM */
+
+	$.widget( "tizen.virtuallistview", $.mobile.widget, {
+		options: {
+			theme: "s",
+			countTheme: "s",
+			headerTheme: "s",
+			dividerTheme: "s",
+			splitIcon: "arrow-r",
+			splitTheme: "s",
+			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: 30,
+			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" );
+			$( this ).addClass( "ui-btn-up-s" );
+			$( this ).removeClass( "ui-btn-down-s" );
+		},
+
+		// ?
+		// this		virtuallistview object
+		// @param[in]	template	template name(string)
+		_pushData: function ( template ) {
+			var o = this.options,
+				i,
+				myTemplate = $( "#" + template ),	// Get template object
+				// NOTE: o.row = # of rows handled at once. Default value is 100.
+				lastIndex = ( o.row > this._numItemData ? this._numItemData : o.row ),	// last index of handled data
+				htmlData;
+
+			for ( i = 0; i < lastIndex; i++ ) {
+				htmlData = myTemplate.tmpl( this._itemData( i ) );	// Make rows with template,
+				$( o.id ).append( $( htmlData ).attr( 'id', o.itemIDPrefix + i ) );	// and append it to the vlist object
+			}
+
+			// After pushing data re-style virtuallist widget
+			$( o.id ).trigger( "create" );
+		},
+
+		// Set children <li> elements' position
+		//
+		// this: virtuallist element
+		// event: virtuallistview.options
+		//		TODO: Why this arg name is 'event'? Not resonable.
+		//		(this function is not called with event element as args!)
+		_reposition: function ( event ) {
+			var o,
+				t = this,
+				padding,
+				margin;
+
+			if ( event.data ) {
+				o = event.data;
+			} else {
+				o = event;
+			}
+			if ( $( o.id + o.childSelector ).size() > 0 ) { // $("#vlistid li")
+				// first child's top position
+				// NOTE: the first element may not be '0'!!!
+				t._title_h = $( o.id + o.childSelector + ':first' ).position().top;
+				// first child's outer height (TODO: reuse selected items)
+				t._line_h = $( o.id + o.childSelector + ':first' ).outerHeight();
+
+				// container(vlist element)'s innerwidth
+				t._container_w = $( o.id ).innerWidth();
+
+				// get sum of container's left/right padding
+				padding = parseInt( $( o.id + o.childSelector ).css( "padding-left" ), 10 )
+					+ parseInt( $( o.id + o.childSelector ).css( "padding-right" ), 10 );
+
+				// Add CSS to all <li> elements
+				//	* absolute position
+				//	* btn-up
+				//	* mouse up/down/over/out styles
+				$( 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 );
+			}
+
+			// Set absolute top/left position of each <li>
+			$( o.id + ">" + o.childSelector ).each( function ( index ) {
+				margin = parseInt( $( this ).css( "margin-left" ), 10 )
+					+ parseInt( $( this ).css( "margin-right" ), 10 );
+
+				$( this ).css( "top", t._title_h + t._line_h * index + 'px' )
+					.css( "width", t._container_w - padding - margin );
+			} );
+
+			// Set Max Listview Height
+			$( o.id ).height( t._numItemData * t._line_h );
+		},
+
+		// Resize each listitem's width
+		_resize: function ( event ) {
+			var o,	// 'ul'
+				t = this,
+				li,
+				padding,
+				margin;
+
+			if ( event.data ) {
+				o = event.data;
+			} else {
+				o = event;
+			}
+			li = $( o ).children( o.childSelector )
+
+			t._container_w = $( o ).width();
+
+			padding = parseInt( li.css( "padding-left" ), 10 )
+				+ parseInt( li.css( "padding-right" ), 10 );
+
+			li.each( function ( index, obj ) {
+				margin = parseInt( $( this ).css( "margin-left" ), 10 )
+					+ parseInt( $( this ).css( "margin-right" ), 10 );
+				$( this ).css( "width", t._container_w - padding - margin );
+			} );
+		},
+
+		// New scrollmove function supporting scrollTo
+		_scrollmove: function ( ev ) {
+			var t = ev.data,	// vlist (JQM object)
+				o = t.options,	// options
+				prevTopBufLen = t._num_top_items,	// Previous(remembered) top buf length
+				timerInterval = 100,
+				i,
+				_scrollView,
+				_normalScroll;
+
+			_scrollView = {
+				viewTop: function ( ) {
+					var sv = $( o.id ).parentsUntil( ".ui-page" ).find( ".ui-scrollview-view" ),
+						svTrans = sv.css( "-webkit-transform" ),
+						svTransVal = "0,0,0,0,0,0";
+					if ( svTrans ) {
+						svTransVal = svTrans.replace( /matrix\s*\((.*)\)/, "$1" );	// matrix(a,c,b,d,tx,ty)
+					}
+					return - parseInt( svTransVal.split(',')[5], 10 );
+				}
+			};
+			_normalScroll = {
+				viewTop: function ( ) {
+					return $( window ).scrollTop( );	// TODO: - _line_h?
+				}
+			};
+			// Get current view top position
+			function viewTop ( ) {
+				return o.scrollview ? _scrollView.viewTop() : _normalScroll.viewTop();
+			}
+			// log function for debug
+			function log ( msg ) {
+				var debug = false;
+				if ( debug ) {
+					console.log( ">>virtualllist: " + msg );
+				}
+			}
+
+			// Timer interval function
+			// @param[in]	vl	virtuallist object (JQM object)
+			function timerMove ( vl, undefined ) {
+				var cy,				// current y position
+					cti,		// current top idx
+					cbi,		// current bottom idx
+					oti = vl._first_index,	// old top idx
+					obi = vl._last_index,	// old botton idx
+					dti,			// delta of top idx
+					fromIdx,
+					toIdx,	// index range to be moved
+					delta,			// moveItem delta
+					rowLen = vl.options.row,	// max. # of items handled at once
+					bufSize,		// top/bottom buffer size. unit: # of items
+					i;
+
+				// subroutine: Move itemContents in i2 into i1
+				function moveItemContents( vl, i1, i2 ) {
+					// TODO: Find a efficient way to replace data!
+					// Assumption: i1 and i2 has same children.
+					var NODETYPE = { ELEMENT_NODE: 1, TEXT_NODE: 3 },
+						c1,	// child item 1 (old)
+						c2,	// child item 2 (new)
+						newText,
+						newImg,
+						i;
+
+					$( i1 ).find( ".ui-li-text-main", ".ui-li-text-sub", ".ui-li-text-sub2", "ui-btn-text" ).each( function ( index ) {
+						c1 = $( this );
+						newText = $( i2 ).find( ".ui-li-text-main", ".ui-li-text-sub", "ui-btn-text" ).eq( index ).text();
+
+						$( c1 ).contents().filter( function () {
+							return ( this.nodeType == NODETYPE.TEXT_NODE );
+						} ).get( 0 ).data = newText;
+					} );
+
+					$( i1 ).find( "img" ).each( function ( imgIdx ) {
+						var c1 = $( this );
+						newImg = $( i2 ).find( "img" ).eq( imgIdx ).attr( "src" );
+
+						$( c1 ).attr( "src", newImg );
+					} );
+
+					$( i1 ).removeData( );	// Clear old data
+				}
+
+				// subroutine: Move item
+				function moveItem( vl, fromIdx, toIdx ) {
+					var itemData,	// data from itemData()
+						item,		// item element
+						newItem,	// new item element
+						tmpl;		// template
+
+					log( ">> move item: " + fromIdx + " --> " + toIdx );
+
+					// Find current item
+					item = $( '#' + vl.options.itemIDPrefix + fromIdx );	// TODO: refactor ID generation!
+					if ( ! item || ! item.length ) {
+						return false;
+					}
+
+					// Get new item
+					tmpl = $( "#" + vl.options.template );
+					if ( tmpl ) {
+						newItem = tmpl.tmpl( vl._itemData( toIdx ) );
+
+						// TODO: Consider touch block while moving?
+
+						// Move item contents
+						moveItemContents( vl, item, newItem );
+
+						// clean up temporary item
+						newItem.remove();
+					}
+
+					// Move position, and set id
+					item.css( 'top', toIdx * vl._line_h )
+						.attr( 'id' , vl.options.itemIDPrefix + toIdx );	// TODO: refactor ID generation!
+
+					// TODO: Apply jqmdata? check following old code;
+					// $( oldItem ).removeData( );	// Clear old data
+					// if (key) { $( oldItem ).data( key, $( newItem ).data( key ) ); }
+
+					return true;
+				}
+
+
+				// Get current view position
+				cy = viewTop();
+
+				// Calculate bufSize: rowLen / 3
+				// NOTE: Assumption: total row length = visible items * 3 (upper+visible+lower)
+				bufSize = Math.ceil( rowLen / 3 );
+
+				// Calculate current top/bottom index (to be applied)
+				// top index = current position / line height
+				cti = Math.floor( cy / vl._line_h ) - bufSize;	// TODO: consider buffer!
+				cbi = cti + rowLen - 1;
+
+				if ( cti < 0 ) {		// Top boundary check
+					cbi += ( - cti );
+					cti = 0;
+				} else if ( cbi > ( vl._numItemData - 1 ) ) {		// Bottom boundary check
+					cti -= ( cbi - ( vl._numItemData - 1 ) );
+					cbi = ( vl._numItemData - 1 );
+				}
+
+				// Calculate dti
+				dti = cti - oti;
+				log( "cy=" + cy + ", oti=" + oti + ", obi=" + obi + ", cti=" + cti + ", cbi=" + cbi + ", dti=" + dti );
+
+				// switch: dti = 0 --> timer stop condition: delta=0 or scrollstop event comes. END.
+				if ( 0 == dti ) {
+					// Check timer runtime
+					vl.timerStillCount += 1;
+					if ( vl.timerStillCount < 12 ) {	// check count ( TODO: test and adjust )
+						log("dti=0 " + vl.timerStillCount + " times");
+						vl.timerMoveID = setTimeout( timerMove, timerInterval, vl );	// run once more
+						return;
+					}
+
+					log("dti=0 " + vl.timerStillCount + " times. End timer.");
+					vl.timerStillCount = 0;
+					// Stop timer
+					if ( vl.timerMoveID ) {
+						clearTimeout( vl.timerMoveID );
+						vl.timerMoveID = null;
+					}
+				} else {
+					// switch: dti >= # of max elements --> total replace.
+					vl.timerStillCount = 0;		// Reset still counter
+
+					if ( Math.abs( dti ) >= rowLen ) {
+						fromIdx = oti;
+						toIdx = obi;
+						delta = dti;
+						log( ">>> WHOLE CHANGE! delta=" + delta );
+					} else {
+						// switch: dti < # of max elements --> move t2b or b2t until new top/bottom idx is covered
+						if ( dti > 0 ) {
+							fromIdx = oti;
+							toIdx = oti + dti - 1;
+							delta = rowLen;
+						} else {
+							fromIdx = obi + dti + 1;	// dti < 0
+							toIdx = obi;
+							delta = -rowLen;
+						}
+						log( ">>> partial change. delta=" + delta );
+					}
+
+					// Move items
+					for ( i = fromIdx; i <= toIdx; i++ ) {
+						moveItem( vl, i, i + delta );		// Change data and position
+					}
+
+					// Store current top/bottom idx into vl
+					vl._first_index = cti;
+					vl._last_index = cbi;
+
+					// Register timer to check again
+					vl.timerMoveID = setTimeout( timerMove, timerInterval, vl );
+				}
+				return;	// End of function
+			}
+
+			// ==== function start ====
+
+			t.timerStillCount = 0;	// Count do-nothing time.	For behavior tuning.
+
+			// If a timer function is alive, clear it
+			if ( t.timerMoveID ) {
+				clearTimeout( t.timerMoveID );
+				t.timerMoveID = null;
+			}
+			// run TimerMove()
+			timerMove( t );
+		},
+
+		_recreate: function ( newArray ) {
+			var t = this,
+				o = this.options;
+
+			$( o.id ).empty();
+
+			t._numItemData = newArray.length;
+			t._direction = _NO_SCROLL;
+			t._first_index = 0;
+			t._last_index = o.row - 1;
+
+			t._pushData( o.template );
+
+			if (o.childSelector == " ul" ) {
+				$( o.id + " ul" ).swipelist();
+			}
+
+			$( o.id ).virtuallistview();
+
+			t.refresh( true );
+
+			t._reposition( o );
+		},
+
+		// Init virtuallistview
+		// this		virtuallistview object
+		_initList: function () {
+			var t = this,
+				o = this.options;
+
+			/* After AJAX loading success */
+
+			// Put initial <li> elements
+			t._pushData( o.template );
+
+			// find a parent page, and run _reposition() at 'pageshow' event
+			// TODO: Consider replace parentsUntil().parent() to parent('.ui-page') ???
+			$( o.id ).parentsUntil( ".ui-page" ).parent().one( "pageshow", function () {
+				setTimeout( function () {
+					t._reposition( o );
+				}, 0);
+			});
+
+			// Bind _scrollmove() at 'scrollstart.virtuallist' event
+			$( document ).bind( "scrollstart.virtuallist scrollstop.vrituallist", t, t._scrollmove );
+
+			// Bind _resize()
+			$( window ).on( "throttledresize", $( o.id ), t._resize );
+
+			// when ul is a childselector, assume that this is also a swipelist,
+			// and run swipelist constructor
+			if ( o.childSelector == " ul" ) {
+				$( o.id + " ul" ).swipelist();
+			}
+
+			t.refresh( true );
+		},
+
+		create: function () {
+			var o = this.options;
+
+			/* external API for AJAX callback */
+			this._create.apply( this, arguments );
+
+			// TODO: remove this line? _initList() calls reposition...
+			this._reposition( o );
+		},
+
+		_create: function ( args ) {
+			// Extend instance variables
+			$.extend( this, {
+				_itemData : function ( idx ) { return null; },
+				_numItemData : 0,
+				_cacheItemData : function ( minIdx, maxIdx ) { },
+				_title_h : 0,
+				_container_w : 0,
+				_minimum_row : 100,
+				_direction : _NO_SCROLL,
+				_first_index : 0,
+				_last_index : 0,
+				_num_top_items : 0	// By scroll move, number of hidden elements.
+			} );
+
+			// local variables
+			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,
+				dbtable_name,
+				dbtable;
+
+
+			// Add CSS classes to $el (=virtuallistview)
+			$el.addClass( function ( i, orig ) {
+				return orig + " ui-listview ui-virtual-list-container" + ( t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : "" );
+			});
+
+			// keep the vlist's ID
+			o.itemIDPrefix = $el.attr( "id" ) + '_';
+			o.id = "#" + $el.attr( "id" );
+
+			// when page hides, empty all child elements
+			$( o.id ).bind( "pagehide", function ( e ) {
+				$( o.id ).empty();
+			});
+
+			// Find if scrollview is used
+			if ( $( ".ui-scrollview-clip" ).size() > 0 ) {
+				o.scrollview = true;
+			} else {
+				o.scrollview = false;
+			}
+
+			// Calculate page buffer size
+			if ( $el.data( "row" ) ) {
+				o.row = $el.data( "row" );
+
+				if ( o.row < t._minimum_row ) {
+					o.row = t._minimum_row;
+				}
+
+				o.page_buf = parseInt( ( o.row / 2 ), 10 );
+			}
+
+			// Get arguments
+			if ( args ) {
+				if ( args.itemData && typeof args.itemData == 'function'  ) {
+					t._itemData = args.itemData;
+				} else {
+					return;
+				}
+				if ( args.numItemData ) {
+					if ( typeof args.numItemData == 'function' ) {
+						t._numItemData = args.numItemData( );
+					} else if ( typeof args.numItemData == 'number' ) {
+						t._numItemData = args.numItemData;
+					} else {
+						return;
+					}
+				} else {
+					return;
+				}
+			} else {	// No option is given
+				// Legacy support: dbtable
+				console.warn( "WARNING: The data interface of virtuallist is changed. \nOld data interface(data-dbtable) is still supported, but will be removed in next version. \nPlease fix your code soon!" );
+
+				/* After DB Load complete, Init Vritual list */
+				if ( $( o.id ).hasClass( "vlLoadSuccess" ) ) {
+					dbtable_name = $el.jqmData('dbtable');
+					dbtable = window[ dbtable_name ];
+
+					$( o.id ).empty();
+
+					if ( !dbtable ) {
+						dbtable = { };
+					}
+
+					t._itemData = function ( idx ) {
+						return dbtable[ idx ];
+					};
+					t._numItemData = dbtable.length;
+				} else {
+					return;	// Do nothing
+				}
+			}
+
+			// Get template data
+			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
+			// NOTE: Unnecessary?
+			if ( $el.data( "dbkey" ) ) {
+				o.dbkey = $el.data( "dbkey" );
+			}
+
+			t._first_index = 0;			// initial top idx of <li> element.
+			t._last_index = o.row - 1;		// initial bottom idx of <li> element.
+			t._initList();	// NOTE: Called at here only!
+		},
+
+		destroy : function () {
+			var o = this.options;
+
+			$( document ).unbind( "scrollstop" );
+
+			$( window ).off( "throttledresize", this._resize );
+
+			$( o.id ).empty();
+
+			if ( this.timerMoveID ) {
+				clearTimeout( this.timerMoveID );
+				this.timerMoveID = null;
+			}
+		},
+
+		_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" );
+			}
+			this.element.trigger( "updatelayout" );
+		},
+
+		// this		virtuallistview object
+		refresh: function ( create ) {
+			this.parentPage = this.element.closest( ".ui-page" );
+			// Make sub page, and move the virtuallist into it...
+			// NOTE: check this subroutine.
+			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;
+
+			// TODO: ?
+			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 , "-");
+		},
+
+		// ?
+		// this		virtuallistview object
+		_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 ) );
+
+
+
+/**
+ * @class core
+ * loader.js
+ *
+ * Youmin Ha <youmin.ha@samsung.com>
+ *
+ *
+ */
+/*
+	Web UI scaling concept in Tizen Web UI
+
+Generally, web applications must be designed to be showed acceptable on various size and resolution of screens, and web winsets have to be scaled well.  Tizen Web UI Framework supports various viewport settings, and Tizen Web UI widgets are designed to be scalable on various screen sizes.  In order to make web applications scalable on many devices which have different screen size, it is necessary to understand how mobile web browsers deal with screen resolution, and how Tizen Web UI Framework supports scaling for web applications.
+
+
+* Viewport on mobile web browser
+
+Viewport is an area showing web content on the browser.  Unlike desktop browsers, mobile browsers support logical viewport seting, which means that application can set viewport width/height and zoom level by itself.
+The very important thing that to be remembered is that the viewport resolution in pixel is 'Logical', not physical.  For example, if the viewport width is set to 480 on a mobile device having 720px screen width, the viewport width is considered to 480px logically. All elements put on right side from 480px horizontal position will not be shown on the viewport.
+Most mobile browsers set viewport with given content attribute with <meta name="viewport" content="..."> tag in <head> section in the application source html, whereas desktop browsers ignore the tag.
+Detailed usage of viewport meta tag is found in here: http://www.w3.org/TR/mwabp/#bp-viewport
+
+
+* Viewport setting by application developers
+
+When developers write <meta name="viewport" content="..."> in the <head> section of the web application HTML file, Tizen Web UI Framework does not add another viewport meta tag, nor modify developer-defined viewport.
+
+
+* Automatic viewport setting by Tizen Web UI Framework
+
+If developers do not give a viewport meta tag, Tizen Web UI Framework automatically add a viewport meta tag with default viewport setting.
+
+
+* Portrait/landscape mode
+
+
+* Tizen Web UI widgets scaling
+
+
+ */
+( function ($, Globalize, window, undefined) {
+
+	var tizen = {
+		libFileName : "tizen-web-ui-fw(.custom|.full)?(.min)?.js",
+
+		frameworkData : {
+			rootDir: '/usr/share/tizen-web-ui-fw',
+			version: '0.2',
+			theme: "tizen-black",
+			viewportWidth: "device-width",
+			viewportScale: false,
+
+			defaultFontSize: 22,
+			minified: false,
+			deviceCapa: { inputKeyBack: true, inputKeyMenu: true },
+			debug: false
+		},
+
+		log : {
+			debug : function ( msg ) {
+				if ( tizen.frameworkData.debug ) {
+					console.log( msg );
+				}
+			},
+			warn : function ( msg ) {
+				console.warn( msg );
+			},
+			error : function ( msg ) {
+				console.error( msg );
+			},
+			alert : function ( msg ) {
+				window.alert( msg );
+			}
+		},
+
+		util : {
+
+			loadScriptSync : function ( scriptPath, successCB, errorCB ) {
+				$.ajax( {
+					url: scriptPath,
+					dataType: 'script',
+					async: false,
+					crossDomain: false,
+					success: successCB,
+					error: function ( jqXHR, textStatus, errorThrown ) {
+						if ( errorCB ) {
+							errorCB( jqXHR, textStatus, errorThrown );
+						} else {
+							var ignoreStatusList = [ 404 ],  // 404: not found
+								errmsg = ( 'Error while loading ' + scriptPath + '\n' + jqXHR.status + ':' + jqXHR.statusText );
+							if ( -1 == $.inArray( jqXHR.status, ignoreStatusList ) ) {
+								tizen.log.alert( errmsg );
+							} else {
+								tizen.log.warn( errmsg );
+							}
+						}
+					}
+				} );
+			},
+			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];
+				if ( head ) {
+					$( head ).prepend( elem );
+				}
+			},
+			makeLink : function ( href ) {
+				var cssLink = document.createElement( 'link' );
+				cssLink.setAttribute( 'rel', 'stylesheet' );
+				cssLink.setAttribute( 'href', href );
+				cssLink.setAttribute( 'name', 'tizen-theme' );
+				return cssLink;
+			},
+			load: function ( path ) {
+				var head = document.getElementsByTagName( 'head' )[0],
+					cssLinks = head.getElementsByTagName( 'link' ),
+					idx,
+					l = null;
+				// Find css link element
+				for ( idx = 0; idx < cssLinks.length; idx++ ) {
+					if ( cssLinks[idx].getAttribute( 'rel' ) != "stylesheet" ) {
+						continue;
+					}
+					if ( cssLinks[idx].getAttribute( 'name' ) == "tizen-theme"
+							|| cssLinks[idx].getAttribute( 'href' ) == path ) {
+						l = cssLinks[idx];
+						break;
+					}
+				}
+				if ( l ) {	// Found the link element!
+					if ( l.getAttribute( 'href' ) == path ) {
+						tizen.log.debug( "Theme is already loaded. Skip theme loading in the framework." );
+					} else {
+						l.setAttribute( 'href', path );
+					}
+				} else {
+					this.addElementToHead( this.makeLink( path ) );
+				}
+			}
+		},
+
+		getParams: function ( ) {
+			/* Get data-* params from <script> tag, and set tizen.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;
+/*
+			function getTizenTheme( ) {
+				var t = navigator.theme ? navigator.theme.split( ':' )[0] : null;
+				if ( t ) {
+					t = t.replace('-hd', '');
+					if ( ! t.match( /^tizen-/ ) ) {
+						t = 'tizen-' + t;
+					}
+				}
+				return t;
+			}
+*/
+			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 ).replace( /^file:(\/\/)?/, '' );
+					this.frameworkData.version = elem.getAttribute( 'data-framework-version' )
+						|| tokens[ tokens.length + version_idx ]
+						|| this.frameworkData.version;
+					this.frameworkData.theme = elem.getAttribute( 'data-framework-theme' )
+						//|| getTizenTheme( )
+						|| this.frameworkData.theme;
+					this.frameworkData.viewportWidth = elem.getAttribute( 'data-framework-viewport-width' )
+						|| this.frameworkData.viewportWidth;
+					this.frameworkData.viewportScale =
+						"true" === elem.getAttribute( 'data-framework-viewport-scale' ) ? true
+						: this.frameworkData.viewportScale;
+					this.frameworkData.minified = src.search(/\.min\.js$/) > -1 ? true : false;
+					this.frameworkData.debug = "true" === elem.getAttribute( 'data-framework-debug' ) ? true
+						: this.frameworkData.debug;
+					foundScriptTag = true;
+					break;
+				}
+			}
+			return foundScriptTag;
+		},
+
+		loadTheme: function ( theme ) {
+			var themePath,
+			cssPath,
+			jsPath;
+
+			if ( ! theme ) {
+				theme = tizen.frameworkData.theme;
+			}
+			
+			themePath = tizen.frameworkData.rootDir + '/' + tizen.frameworkData.version + '/themes/' + theme;
+			
+			jsPath = themePath + '/theme.js';
+	
+			if ( tizen.frameworkData.minified ) {
+				cssPath = themePath + '/tizen-web-ui-fw-theme.min.css';
+			} else {
+				cssPath = themePath + '/tizen-web-ui-fw-theme.css';
+			}
+			tizen.css.load( cssPath );
+			tizen.util.loadScriptSync( jsPath );
+		},
+
+		/** Load Globalize culture file, and set default culture.
+		 *  @param[in]  language  (optional) Language code. ex) en-US, en, ko-KR, ko
+		 *                        If language is not given, read language from html 'lang' attribute, 
+		 *                        or from system setting.
+		 *  @param[in]  cultureDic (optional) Dictionary having language code->
+		 */
+		loadGlobalizeCulture: function ( language, cultureDic ) {
+			var self = this,
+				cFPath,
+				lang,
+				mockJSXHR;
+
+			function getLang ( language ) {
+				var 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!
+				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( '-' );
+					}
+				}
+				// NOTE: 'en' to 'en-US', because globalize has no 'en' culture file.
+				lang = lang == 'en' ? 'en-US' : lang;
+				return lang;
+			}
+
+			function getNeutralLang ( lang ) {
+				var neutralLangIdx = lang.lastIndexOf( '-' ),
+					neutralLang;
+				if ( neutralLangIdx != -1 ) {
+					neutralLang = lang.substr( 0, neutralLangIdx );
+				}
+				return neutralLang;
+			}
+
+			function getCultureFilePath ( lang, cFDic ) {
+				var cFPath = null;	// error value
+
+				if ( "string" != typeof lang ) {
+					return null;
+				}
+				if ( cFDic && cFDic[lang] ) {
+					cFPath = cFDic[lang];
+				} else {
+					// Default Globalize culture file path
+					cFPath = [
+						self.frameworkData.rootDir,
+						self.frameworkData.version,
+						'js',
+						'cultures',
+						['globalize.culture.', lang, '.js'].join( '' )
+					].join( '/' );
+				}
+				return cFPath;
+			}
+
+			function printLoadError( cFPath, jqXHR ) {
+				tizen.log.error( "Error " + jqXHR.status + ": " + jqXHR.statusText
+						+ "::Culture file (" + cFPath + ") is failed to load.");
+			}
+
+			function loadCultureFile ( cFPath, errCB ) {
+				function _successCB ( ) {
+					tizen.log.debug( "Culture file (" + cFPath + ") is loaded successfully." );
+				}
+				function _errCB ( jqXHR, textStatus, err ) {
+					if ( errCB ) {
+						errCB( jqXHR, textStatus, err );
+					} else {
+						printLoadError( cFPath, jqXHR );
+					}
+				}
+
+				if ( ! cFPath ) {	// Invalid cFPath -> Regard it as '404 Not Found' error.
+					mockJSXHR = {
+						status: 404,
+						statusText: "Not Found"
+					};
+					_errCB( mockJSXHR, null, null );
+				} else {
+					$.ajax( {
+						url: cFPath,
+						dataType: 'script',
+						cache: true,
+						async: false,
+						success: _successCB,
+						error: _errCB
+					} );
+				}
+			}
+
+			lang = getLang( language );
+			cFPath = getCultureFilePath( lang, cultureDic );
+			loadCultureFile( cFPath,
+				function ( jqXHR, textStatus, err ) {
+					if ( jqXHR.status == 404 ) {
+						// If culture file is not found, try once more with neutral lang.
+						var nLang = getNeutralLang( lang ),
+							ncFPath = getCultureFilePath( nLang, cultureDic );
+						loadCultureFile( ncFPath, null );
+					} else {
+						printLoadError( cFPath, jqXHR );
+					}
+				} );
+
+			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 );
+		},
+		/**
+		 * Load custom globalize culture file
+		 * Find current system language, and load appropriate culture file from given colture file list.
+		 *
+		 * @param[in]	cultureDic	collection of 'language':'culture file path' key-val pair.
+		 * @example
+		 * var myCultures = {
+		 *	"en"    : "culture/en.js",
+		 *	"fr"    : "culture/fr.js",
+		 *	"ko-KR" : "culture/ko-KR.js"
+		 * };
+		 * loadCultomGlobalizeCulture( myCultures );
+		 *
+		 * ex) culture/fr.js
+		 * -------------------------------
+		 * Globalize.addCultureInfo( "fr", {
+		 *   messages: {
+		 *     "hello" : "bonjour",
+		 *     "translate" : "traduire"
+		 *   }
+		 * } );
+		 * -------------------------------
+		 */
+		loadCustomGlobalizeCulture: function ( cultureDic ) {
+			tizen.loadGlobalizeCulture( null, cultureDic );
+		},
+
+		/** Set viewport meta tag for mobile devices.
+		 *
+		 * @param[in]	viewportWidth	viewport width. "device-width" is OK.
+		 */
+		setViewport: function ( viewportWidth ) {
+			var meta = null,
+				head,
+				content;
+
+			// Do nothing if viewport setting code is already in the code.
+			$( "meta[name=viewport]" ).each( function ( ) {
+				meta = this;
+				return;
+			});
+			if ( meta ) {	// Found custom viewport!
+				content = $( meta ).prop( "content" );
+				viewportWidth = content.replace( /.*width=(device-width|\d+)\s*,?.*$/gi, "$1" );
+				tizen.log.debug( "Viewport is set to '" + viewportWidth + "' in a meta tag. Framework skips viewport setting." );
+			} else {
+				// Create a meta tag
+				meta = document.createElement( "meta" );
+				if ( meta ) {
+					meta.name = "viewport";
+					content = "width=" + viewportWidth + ", user-scalable=no";
+					if ( ! isNaN( viewportWidth ) ) {
+						// Fix scale to 1.0, if viewport width is set to fixed value.
+						// NOTE: Works wrong in Tizen browser!
+						//content = [ content, ", initial-scale=1.0, maximum-scale=1.0" ].join( "" );
+					}
+					meta.content = content;
+					tizen.log.debug( content );
+					head = document.getElementsByTagName( 'head' ).item( 0 );
+					head.insertBefore( meta, head.firstChild );
+				}
+			}
+			return viewportWidth;
+		},
+
+		/**	Read body's font-size, scale it, and reset it.
+		 *  param[in]	desired font-size / base font-size.
+		 */
+		scaleBaseFontSize: function ( themeDefaultFontSize, ratio ) {
+			tizen.log.debug( "themedefaultfont size: " + themeDefaultFontSize + ", ratio: " + ratio );
+			var scaledFontSize = Math.max( Math.floor( themeDefaultFontSize * ratio ), 4 );
+
+			$( 'html' ).css( { 'font-size': scaledFontSize + "px" } );
+			tizen.log.debug( 'html:font size is set to ' + scaledFontSize );
+			$( document ).ready( function ( ) {
+				$( '.ui-mobile' ).children( 'body' ).css( { 'font-size': scaledFontSize + "px" } );
+			} );
+		},
+
+		setScaling: function ( ) {
+			var viewportWidth = this.frameworkData.viewportWidth,
+				themeDefaultFontSize = this.frameworkData.defaultFontSize, // comes from theme.js
+				ratio = 1;
+
+			// Keep original font size
+			$( 'body' ).attr( 'data-tizen-theme-default-font-size', themeDefaultFontSize );
+
+			if ( !tizen.util.isMobileBrowser() ) {
+				return;
+			}
+
+			// Legacy support: tizen.frameworkData.viewportScale
+			if ( this.frameworkData.viewportScale == true ) {
+				viewportWidth = "screen-width";
+			}
+
+			// screen-width support
+			if ( "screen-width" == viewportWidth ) {
+				if ( window.self == window.top ) {
+					// Top frame: for target. Use window.outerWidth.
+					viewportWidth = window.outerWidth;
+				} else {
+					// iframe: for web simulator. Use clientWidth.
+					viewportWidth = document.documentElement.clientWidth;
+				}
+			}
+
+			// set viewport meta tag
+			viewportWidth = this.setViewport( viewportWidth );	// If custom viewport setting exists, get viewport width
+
+			if ( viewportWidth == "device-width" ) {
+				// Do nothing!
+			} else {	// fixed width!
+				ratio = parseFloat( viewportWidth / this.frameworkData.defaultViewportWidth );
+				this.scaleBaseFontSize( themeDefaultFontSize, ratio );
+			}
+		}
+	};
+
+	function export2TizenNS ( $, tizen ) {
+		if ( !$.tizen ) {
+			$.tizen = { };
+		}
+
+		$.tizen.frameworkData = tizen.frameworkData;
+		$.tizen.loadCustomGlobalizeCulture = tizen.loadCustomGlobalizeCulture;
+		$.tizen.loadTheme = tizen.loadTheme;
+
+		$.tizen.__tizen__ = tizen;	// for unit-test
+	}
+
+	export2TizenNS( $, tizen );
+
+	tizen.getParams( );
+	tizen.loadTheme( );
+	tizen.setScaling( );	// Run after loadTheme(), for the default font size.
+	tizen.setGlobalize( );
+	// Turn off JQM's auto initialization option.
+	// NOTE: This job must be done before domready.
+	$.mobile.autoInitializePage = false;
+
+	$(document).ready( function ( ) {
+		$.mobile.initializePage( );
+	});
+
+} ( jQuery, Globalize, 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>
+ */
+
+/*
+ * Notification widget
+ *
+ * HTML Attributes
+ *
+ *  data-role: set to 'notification'.
+ *  data-type: 'ticker' or 'popup'.
+ *  data-interval: time to showing. If don't set, will show infinitely.
+ *
+ * APIs
+ *
+ *  open(): open the notification.
+ *  close(): close the notification.
+ *  text(text0, text1): set texts or get texts
+ *  icon(src): set the icon (tickernoti only)
+ *
+ * Events
+ *
+ *  N/A
+ *
+ * Examples
+ *
+ * // tickernoti
+ * <div data-role="notification" id="notification" data-type="ticker" data-interval="3000">
+ *	<img src="icon01.png">
+ *	<p>Hello World</p>
+ *	<p>Denis</p>
+ * </div>
+ *
+ * // smallpopup
+ * <div data-role="notification" id="notification" data-type="popup" data-interval="3000">
+ *	<p>Hello World</p>
+ * </div>
+ *
+ */
+
+/**
+	@class Notification
+	The notification widget shows a pop-up window on the screen to provide notifications.
+	To add a notification widget to the application, use the following code:
+
+		<div data-role="page">
+			<div data-role="notification" data-type="smallpopup">
+				<p>text1</p>
+			</div>
+			<div data-role="header"></div>
+			<div data-role="content"></div>
+			<div data-role="footer"></div>
+		</div>
+*/
+/**
+	@property {String} data-type
+	Defines the notification type. The type options are tickernoti and smallpopup. <br/>The default value is smallpopup.
+
+*/
+/**
+	@property {Integer} data-interval
+	Defines the time to showing a notification widget. <br/>The default is infinitely.
+
+*/
+/**
+	@method open
+	The open method is used to open the notification widget:
+
+		<div data-role="notification" data-type="smallpopup" data-interval="3000"></div>
+		$('#notification').notification('open');
+*/
+/**
+	@method close
+	The close method is used to close the notification widget:
+
+		<div data-role="notification" data-type="smallpopup" data-interval="3000"></div>
+		$('#notification').notification('close');
+*/
+/**
+	@method text
+	The text method is used to set or get the notification text:
+
+		<div data-role="notification" data-type="smallpopup" data-interval="3000"></div>
+		// Set notification text
+		$('#notification').notification('text', 'setThisText');
+		// Get notification text
+		texts = $('#notification').notification('text');
+	@since Tizen2.0
+*/
+/**
+	@method icon
+	The setIcon method is used to set the ticker notification icon. The icon can be set only if the notification type is set to tickernoti.
+
+		<div data-role="notification" data-type="ticker" data-interval="3000"></div>
+		$('#notification').notification('icon', './test.png');
+*/
+(function ( $, window ) {
+	$.widget( "tizen.notification", $.mobile.widget, {
+		btn: null,
+		text_bg: [],
+		icon_img: [],
+		interval: null,
+		seconds: null,
+		running: false,
+
+		_get_text: function () {
+			var text = new Array( 2 );
+
+			if ( this.type === 'ticker' ) {
+				text[0] = $( this.text_bg[0] ).text();
+				text[1] = $( this.text_bg[1] ).text();
+			} else {
+				text[0] = $( this.text_bg[0] ).text();
+			}
+
+			return text;
+		},
+
+		_set_text: function ( text0, text1 ) {
+			var _set = function ( elem, text ) {
+				if ( !text ) {
+					return;
+				}
+				elem.text( text );
+			};
+
+			if ( this.type === 'ticker' ) {
+				_set( $( this.text_bg[0] ), text0 );
+				_set( $( this.text_bg[1] ), text1 );
+			} else {
+				_set( $( this.text_bg[0] ), text0 );
+			}
+		},
+
+		text: function ( text0, text1 ) {
+			if ( text0 === undefined && text1 === undefined ) {
+				return this._get_text();
+			}
+
+			this._set_text( text0, text1 );
+		},
+
+		icon: function ( src ) {
+			if ( src === undefined ) {
+				return;
+			}
+
+			this.icon_img.detach();
+			this.icon_img = $( "<img src='" + src + "' class='ui-ticker-icon'>" );
+			$( this.element ).find(".ui-ticker").append( this.icon_img );
+		},
+
+		_refresh: function () {
+			var container = this._get_container();
+
+			$( container ).addClass("fix")
+					.removeClass("show")
+					.removeClass("hide");
+
+			this._set_interval();
+		},
+
+		open: function () {
+			var container = this._get_container();
+
+			if ( this.running ) {
+				this._refresh();
+				return;
+			}
+
+			$( container ).addClass("show")
+					.removeClass("hide")
+					.removeClass("fix");
+
+			this.running = true;
+
+			if ( this.type === 'popup' ) {
+				this._set_position();
+			}
+
+			this._set_interval();
+		},
+
+		close: function () {
+			var container = this._get_container();
+
+			if ( !this.running ) {
+				return;
+			}
+
+			$( container ).addClass("hide")
+					.removeClass("show")
+					.removeClass("fix");
+
+			this.running = false;
+			clearInterval( this.interval );
+		},
+
+		destroy: function () {
+			var container = this._get_container();
+
+			$( container ).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");
+		},
+
+		_set_interval: function () {
+			var self = this;
+
+			clearInterval( this.interval );
+
+			if ( this.seconds !== undefined && this.second !== 0 ) {
+				this.interval = setInterval( function () {
+					self.close();
+				}, this.seconds );
+			}
+		},
+
+		_add_event: function () {
+			var self = this,
+				container = this._get_container();
+
+			if ( this.type === 'ticker' ) {
+				container.find(".ui-ticker-btn").append( this.btn ).trigger("create");
+
+				this.btn.bind( "vmouseup", function () {
+					self.close();
+				});
+			}
+
+			container.bind( 'vmouseup', function () {
+				self.close();
+			});
+		},
+
+		_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(),
+				$footer = $('.ui-page-active').children('.ui-footer'),
+				footer_h = $footer.outerHeight() || 0;
+
+			container.css( 'bottom', footer_h);
+		},
+
+		_create: function () {
+			var self = this,
+				elem = $( this.element ),
+				i;
+
+			this.btn = $('<div data-role="button" data-inline="true">Close</div>');
+
+			this.seconds = elem.jqmData('interval');
+			this.type = elem.jqmData('type') || 'popup';
+
+			if ( this.type === 'ticker' ) {
+				elem.wrapInner("<div class='ui-ticker'></div>");
+				elem.find(".ui-ticker").append("<div class='ui-ticker-body'></div>" +
+							"<div class='ui-ticker-btn'></div>");
+				this.text_bg = elem.find("p");
+
+				if ( this.text_bg.length < 2 ) {
+					elem.find(".ui-ticker").append("<p></p><p></p>");
+					this.text_bg = elem.find("p");
+				} else if ( this.text_bg.length > 2 ) {
+					for ( i = 2; i < this.text_bg.length; i++ ) {
+						$( this.text_bg[i] ).css( "display", "none" );
+					}
+				}
+
+				$( this.text_bg[0] ).addClass("ui-ticker-text1-bg");
+				$( this.text_bg[1] ).addClass("ui-ticker-text2-bg");
+
+				this.icon_img = elem.find("img");
+
+				if ( this.icon_img.length ) {
+					$( this.icon_img ).addClass("ui-ticker-icon");
+
+					for ( i = 1; i < this.icon_img.length; i++ ) {
+						$( this.icon_img[i] ).css( "display", "none" );
+					}
+				}
+			} else {
+				elem.wrapInner("<div class='ui-smallpopup'></div>");
+				this.text_bg = elem.find("p").addClass("ui-smallpopup-text-bg");
+
+				if ( this.text_bg.length < 1 ) {
+					elem.find(".ui-smallpopup")
+						.append("<p class='ui-smallpopup-text-bg'></p>");
+					this.text_bg = elem.find("p");
+				} else if ( this.text_bg.length > 1 ) {
+					for ( i = 1; i < this.text_bg.length; i++ ) {
+						$( this.text_bg[i] ).css( "display", "none" );
+					}
+				}
+
+				this._set_position();
+			}
+
+			this._add_event();
+
+			$( window ).bind( "resize", function () {
+				if ( !self.running ) {
+					return;
+				}
+
+				self._refresh();
+
+				if ( self.type === 'popup' ) {
+					self._set_position();
+				}
+			});
+		}
+	}); // 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('destroy');
+	});
+}( 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: 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'
+ *     popup: boolean; controls whether the popup is displayed or not
+ *                   specify if the popup is enabled using the 'data-popup' attribute
+ *                   set from javascript using .tizenslider('option','popup',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-popup='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','popup',false);
+ *
+ *     // from buttons
+ *     $('#popupEnabler').bind('vclick', function() {
+ *         $('#mySlider').tizenslider('option','popup',true);
+ *     });
+ *     $('#popupDisabler').bind('vclick', function() {
+ *         $('#mySlider').tizenslider('option','popup',false);
+ *     });
+ */
+
+/**
+	@class Slider
+	The slider widget shows a control on the screen that you can use to change values by dragging a handle on a horizontal scale. Sliders can be used in Tizen as described in the jQueryMobile documentation for sliders.
+
+	To add a slider widget to the application, use the following code:
+
+		<input data-popup='false' type="range" name="slider" value="5" min="0" max="10" data-icon="text" data-text-left="Min" data-text-right="Max" />
+
+	The slider can define callbacks for events as described in the jQueryMobile documentation for slider events.
+	You can use methods with the slider as described in the jQueryMobile documentation for slider methods.
+*/
+/**
+	@property {String} data-icon
+	Defines the icon style for the slider ends. The icon options are bright, volume, and text.
+	The default value is text.
+*/
+/**
+	@property {Boolean} data-popup
+	Enables or disables a pop-up showing the current value while the handle is dragged.
+	The default value is true.
+*/
+/**
+	@property {String} data-text-left
+	Defines the text displayed on the left side of the slider.
+	The data-icon option must be set to text.
+*/
+/**
+	@property {String} data-text-right
+	Defines the text displayed on the right side of the slider.
+	The data-icon option must be set to text.
+*/
+
+(function ($, window, undefined) {
+	$.widget("tizen.tizenslider", $.mobile.widget, {
+		options: {
+			popup: true
+		},
+
+		popup: null,
+		handle: null,
+		handleText: null,
+
+		_create: function () {
+			this.currentValue = null;
+			this.popupVisible = false;
+
+			var self = this,
+				inputElement = $( this.element ),
+				slider,
+				popupEnabledAttr,
+				icon,
+				text_right,
+				text_left,
+				text_length,
+				elem_left,
+				elem_right,
+				margin_left,
+				margin_right,
+				_closePopup;
+
+			// apply jqm slider
+			inputElement.slider();
+
+			// hide the slider input element proper
+			inputElement.hide();
+
+			self.popup = $('<div class="ui-slider-popup"></div>');
+
+			// set the popup according to the html attribute
+			popupEnabledAttr = inputElement.jqmData('popup');
+			if ( popupEnabledAttr !== undefined ) {
+				self.options.popup = ( popupEnabledAttr == true );
+			}
+
+			// get the actual slider added by jqm
+			slider = inputElement.next('.ui-slider');
+
+			icon = inputElement.attr('data-icon');
+
+			// wrap the background
+			slider.wrap('<div class="ui-slider-container"></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':
+				elem_left = $('<div class="ui-slider-left-' + icon + '"></div>');
+				elem_right = $('<div class="ui-slider-right-' + icon + '"></div>');
+
+				slider.before( elem_left );
+				slider.after( elem_right );
+
+				margin_left = elem_left.width() + 16;
+				margin_right = elem_right.width() + 16;
+				break;
+
+			case 'text':
+				text_left = ( inputElement.attr('data-text-left') === undefined ) ? '' :
+						inputElement.attr('data-text-left').substring( 0, 3 );
+				text_right = ( inputElement.attr('data-text-right') === undefined ) ? '' :
+						inputElement.attr('data-text-right').substring( 0, 3 );
+
+				text_length = Math.max( text_left.length, text_right.length ) + 1;
+
+				margin_left = text_length + "rem";
+				margin_right = text_length + "rem";
+
+				elem_left = $('<div class="ui-slider-left-text" style="left:' +
+					-( text_length ) + 'rem; width:' + text_length + 'rem;">' +
+					'<span style="position:relative;top:0.4em;">' +
+					text_left +
+					'</span></div>');
+				elem_right = $('<div class="ui-slider-right-text" style="right:' +
+					-( text_length ) + 'rem; width:' + text_length + 'rem;">' +
+					'<span style="position:relative;top:0.4em;">' +
+					text_right +
+					'</span></div>');
+
+				slider.before( elem_left );
+				slider.after( elem_right );
+				break;
+			}
+
+			if ( icon ) {
+				slider.parent('.ui-slider-container').css({
+					"margin-left": margin_left,
+					"margin-right": margin_right
+				});
+			}
+
+			// add a popup element (hidden initially)
+			slider.parents(".ui-page").append( self.popup );
+			self.popup.hide();
+
+			// get the element where value can be displayed
+			self.handleText = slider.find('.ui-btn-text');
+
+			// set initial value
+			self.updateSlider();
+
+			_closePopup = function () {
+				slider.trigger( 'vmouseup' );
+			};
+
+			// bind to changes in the slider's value to update handle text
+			this.element.on('change', function () {
+				// 2013.05.31 heeju.joo
+				// for "refresh" method, (ex. $("input").val(5).slider("refresh"))
+				// conditional statement has been added ( DCM-1735 )
+				// if this function just call two functions like else statement,
+				// popup and handle displayed in the wrong position because when the variable popupVisible is false, updateSlider() does not call popupPosition().
+				if ( !self.popupVisible ) {
+					// it is trick to cheat self.updateSlider()
+					self.popupVisible = true;
+					// updateSlider make the position of handle right
+					self.updateSlider();
+					// for other method, popupVisible variable need to have original value.
+					self.popupVisible = false;
+				} else {
+					self.updateSlider();
+					self.showPopup();
+					$.mobile.$document.on( 'vmouseup.slider', _closePopup );
+				}
+			});
+
+			this.element.on( 'slidestart', function ( event ) {
+				self.updateSlider();
+				self.showPopup();
+				$.mobile.$document.on( 'vmouseup.slider', _closePopup );
+			});
+
+			// bind clicks on the handle to show the popup
+			self.handle.on('vmousedown', function () {
+				self.handle.addClass( "ui-slider-handle-press" );
+				self.showPopup();
+				$.mobile.$document.on( 'vmouseup.slider', _closePopup );
+			});
+
+			slider.on( 'vmousedown', function () {
+				self.updateSlider();
+				self.handle.addClass( "ui-slider-handle-press" );
+				self.showPopup();
+				$.mobile.$document.on( 'vmouseup.slider', _closePopup );
+			}).on( 'vmouseup', function () {
+				self.hidePopup();
+				self.handle.removeClass( "ui-slider-handle-press" );
+				$.mobile.$document.off('vmouseup.slider');
+			});
+
+			$.extend( this, {
+				_globalHandler: [
+					{
+						src: $( window ),
+						handler: {
+							orientationchange: _closePopup,
+						}
+					}
+				]
+			});
+
+			$.each( this._globalHandler, function ( idx, value ) {
+				value.src.bind( value.handler );
+			});
+
+		},
+
+		// 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.height()
+			});
+		},
+
+		// show value on the handle and in popup
+		updateSlider: function () {
+			var font_size,
+				font_length,
+				font_top,
+				padding_size,
+				newValue,
+				get_value_length = function ( v ) {
+					var val = Math.abs( v ),
+						len;
+
+					if ( val > 999 ) {
+						len = 4;
+					} else if ( val > 99 ) {
+						len = 3;
+					} else if ( val > 9 ) {
+						len = 2;
+					} else {
+						len = 1;
+					}
+
+					if ( v < 0 ) {
+						len++;
+					}
+
+					return len;
+				};
+
+			// 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');
+
+			newValue = parseInt(this.element.val(), 10);
+
+			font_length = get_value_length( newValue );
+
+			if ( this.popupVisible ) {
+				this.positionPopup();
+
+				switch ( font_length ) {
+				case 1:
+				case 2:
+					font_size = '1.5rem';
+					padding_size = '0.15rem';
+					break;
+				case 3:
+					font_size = '1rem';
+					padding_size = '0.5rem';
+					break;
+				default:
+					font_size = '0.8rem';
+					padding_size = '0.5rem';
+					break;
+				}
+
+				this.popup.css({
+					"font-size": font_size,
+					"padding-top": padding_size
+				});
+			}
+
+			if ( newValue === this.currentValue ) {
+				return;
+			}
+
+			switch ( font_length ) {
+			case 1:
+				font_size = '0.95rem';
+				font_top = '0';
+				break;
+			case 2:
+				font_size = '0.85rem';
+				font_top = '-0.01rem';
+				break;
+			case 3:
+				font_size = '0.65rem';
+				font_top = '-0.1rem';
+				break;
+			default:
+				font_size = '0.45rem';
+				font_top = '-0.15rem';
+				break;
+			}
+
+			if ( font_size != this.handleText.css('font-size') ) {
+				this.handleText.css({
+					'font-size': font_size,
+					'top': font_top,
+					'position': 'relative'
+				});
+			}
+
+			this.currentValue = newValue;
+			this.handleText.text( newValue );
+			this.popup.html( newValue );
+
+			this.element.trigger( 'update', newValue );
+		},
+
+		// show the popup
+		showPopup: function () {
+			if ( !this.options.popup || this.popupVisible ) {
+				return;
+			}
+
+			this.popup.show();
+			this.popupVisible = true;
+		},
+
+		// hide the popup
+		hidePopup: function () {
+			if ( !this.options.popup || !this.popupVisible ) {
+				return;
+			}
+
+			this.popup.hide();
+			this.popupVisible = false;
+		},
+
+		_setOption: function (key, value) {
+			var needToChange = ( value !== this.options[key] );
+
+			if ( !needToChange ) {
+				return;
+			}
+
+			switch ( key ) {
+			case 'popup':
+				this.options.popup = value;
+
+				if ( this.options.popup) {
+					this.updateSlider();
+				} else {
+					this.hidePopup();
+				}
+
+				break;
+			}
+		}
+	});
+
+	// stop jqm from initialising sliders
+	$( document ).on( "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 ).on( "pagecreate create", function ( e ) {
+		var jqmSliderInitSelector = $.data( window, "jqmSliderInitSelector" );
+		$( e.target ).find(jqmSliderInitSelector).each(function () {
+			var $this = $( this );
+			if ( $this.is("select") ) {
+				$this.slider();
+			} else {
+				$this.tizenslider();
+			}
+		});
+	});
+
+}( 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.
+ * ***************************************************************************
+ *
+ * Authors: Wonseop Kim ( wonseop.kim@samsung.com )
+*/
+
+/**
+ * "Handler" is a widget helping a user to scroll a window or panel.
+ * It is different from the scrollview feature in that the handler has a fixed size
+ * and disappears when a scroll size is smaller than a parent window's size.
+ * If the handler widget is activated, a scroll bar on the screen will be deactivated.
+ * The handler widget supports scrolling up and down and indicates the position of the scrolled window.
+ *
+ * HTML Attributes:
+ *
+ *		data-handler : This attribute is indicating that whether enable.
+ *						If you want to use, you will set 'true'.
+ *		data-handler-theme : Set the widget theme ( optional )
+ *
+ * APIs:
+ *
+ *		enableHandler ( boolean )
+ *			: Get or set the use of handler widget.
+ *			If the value is "true", it will be run handler widget.
+ *			If the value is "false", it will be not run handler widget.
+ *			If no value is specified, will act as a getter.
+ *
+ * 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="#">Adam Kinkaid</a></li>
+ *					...
+ *			</ul>
+ *		</div>
+ */
+
+/**
+	@class handler
+	The handler widget enables the user to vertically scroll through a page or panel using a fixed-size handle. The widget indicates the position of the scrolled window, and only appears on the screen if the parent page or panel's scroll size is larger than the screen size. <br/> To add a handler widget to the application, use the following code:
+
+		<div data-role="content" data-scroll="y" data-handler="true">
+			<ul data-role="listview">
+				<li data-role="list-divider">A</li>
+				<li><a href="#">Adam Kinkaid</a></li>
+					...
+			</ul>
+		</div>
+	
+	You can use the enableHandler method with the handler widget to get (if no value is defined) or set the handler usage status. If the [enable] value is true, the handler is enabled; otherwise the handler is not used.
+
+		$("#.selector").scrollview("enableHandler", [enable]);
+*/
+/**
+	@property {Boolean} data-handler
+	Enables the handler widget. The value must be set to true.
+*/
+/**
+	@property {String} data-handler-theme
+	Sets the handler widget theme.
+*/
+( function ( $, document, undefined ) {
+	// The options of handler in scrollview
+	$.tizen.scrollview.prototype.options.handler = false;
+	$.tizen.scrollview.prototype.options.handlerTheme = "s";
+
+	var originSetOption = $.tizen.scrollview.prototype._setOption,
+		createHandler = function ( target ) {
+			var $view = target,
+				prefix = "<div class=\"ui-handler ui-handler-direction-",
+				suffix = "\"><div class=\"ui-handler-track\"><div class=\"ui-handler-handle\"><div class=\"ui-handler-thumb\"></div></div></div></div>",
+				scrollview = $view.data( "scrollview" ),
+				options = scrollview.options,
+				direction = options.direction,
+				parentTheme = $.mobile.getInheritedTheme( scrollview, "s" ),
+				theme = options.theme || parentTheme,
+				isHorizontal = ( scrollview.options.direction === "x" ),
+				_$view = scrollview._$view,
+				_$clip = scrollview._$clip,
+				scrollbar = $view.find( ".ui-scrollbar" ),
+				handler = null,
+				handlerHandle = null,
+				viewLength = 0,
+				clipLength = 0,
+				handlerHeight = 0,
+				handlerMargin = 0,
+				trackLength = 0,
+				moveTimer,
+				isTouchable = $.support.touch,
+				dragStartEvt = ( isTouchable ? "touchstart" : "mousedown" ) + ".handler",
+				dragMoveEvt = ( isTouchable ? "touchmove" : "mousemove" ) + ".handler",
+				dragStopEvt = ( isTouchable ? "touchend" : "mouseup" ) + ".handler",
+				dragLeaveEvt = ( isTouchable ? " touchleave" : " mouseleave" ) + ".handler",
+				calculateLength = function () {
+					clipLength = ( isHorizontal ? _$clip.width() : _$clip.height() );
+					viewLength = ( isHorizontal ? _$view.width() : _$view.height() ) - clipLength;
+					trackLength = clipLength - handlerHeight - handlerMargin * 2;
+				},
+				setHanderPostion = function ( scrollPos ) {
+					var handlerPos = Math.round( ( isHorizontal ? scrollPos.x : scrollPos.y ) / viewLength * trackLength );
+					handlerHandle[0].style[ ( isHorizontal ? "left" : "top" ) ] = handlerPos + "px";
+				},
+				stopHandlerScroll = function () {
+					$( document ).unbind( ".handler" );
+					$view.moveData = null;
+					_$view.trigger( "scrollstop" );
+				};
+
+			if ( $view.find( ".ui-handler-handle" ).length !== 0 || typeof direction !== "string" ) {
+				return;
+			}
+
+			handler = $( [ prefix, direction, suffix ].join( "" ) ).appendTo( $view.addClass( " ui-handler-" + theme ) );
+			handlerHandle = $view.find( ".ui-handler-handle" ).attr( {
+				"tabindex" : "0",
+				"aria-label" : ( isHorizontal ? "Horizontal handler, double tap and move to scroll" : "Verticalhandler, double tap and move to scroll" )
+			}).hide();
+			handlerHeight = ( isHorizontal ? handlerHandle.width() : handlerHandle.height() );
+			handlerMargin = ( isHorizontal ? parseInt( handler.css( "right" ), 10 ) : parseInt( handler.css( "bottom" ), 10 ) );
+
+			$.extend( $view, {
+				moveData : null
+			});
+
+			// handler drag
+			handlerHandle.bind( dragStartEvt, {
+				e : handlerHandle[0]
+			}, function ( event ) {
+				scrollview._stopMScroll();
+
+				var target = event.data.e,
+					t = ( isTouchable ? event.originalEvent.targetTouches[0] : event );
+
+				target.style.opacity = 1.0;
+
+				$view.moveData = {
+					target : target,
+					X : parseInt( target.style.left, 10 ) || 0,
+					Y : parseInt( target.style.top, 10 ) || 0,
+					pX : t.pageX,
+					pY : t.pageY
+				};
+				calculateLength();
+
+				_$view.trigger( "scrollstart" );
+
+				if ( !isTouchable ) {
+					event.preventDefault();
+				}
+
+				$( document ).bind( dragMoveEvt, function ( event ) {
+					var moveData = $view.moveData,
+						target = moveData.target,
+						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 );
+
+					if ( isHorizontal ) {
+						scrollview._setScrollPosition( scrollPos, 0 );
+						target.style.left = handlePos + "px";
+					} else {
+						scrollview._setScrollPosition( 0, scrollPos );
+						target.style.top = handlePos + "px";
+					}
+
+					event.preventDefault();
+				}).bind( dragStopEvt + dragLeaveEvt, function ( event ) {
+					stopHandlerScroll();
+				});
+			});
+
+			_$view.bind( dragStopEvt, function ( event ) {
+				stopHandlerScroll();
+			});
+
+			$view.bind( "scrollstart", function ( event ) {
+				if ( !scrollview.enableHandler() ) {
+					return;
+				}
+
+				calculateLength();
+
+				if ( viewLength < 0 || clipLength < handlerHeight ) {
+					if ( scrollbar.is( ":hidden" ) ) {
+						scrollbar.show();
+					}
+					return;
+				}
+
+				if ( scrollbar.is( ":visible" ) ) {
+					scrollbar.hide();
+				}
+
+				if ( moveTimer ) {
+					clearInterval( moveTimer );
+					moveTimer = undefined;
+				}
+
+				handler.addClass( "ui-handler-visible" );
+				handlerHandle.stop( true, true )
+							.fadeIn();
+			}).bind( "scrollupdate", function ( event, data ) {
+				if ( !scrollview.enableHandler() || viewLength < 0 || clipLength < handlerHeight ) {
+					return;
+				}
+
+				setHanderPostion( scrollview.getScrollPosition() );
+			}).bind( "scrollstop", function ( event ) {
+				if ( !scrollview.enableHandler() || viewLength < 0 || clipLength < handlerHeight ) {
+					return;
+				}
+
+				moveTimer = setInterval( function () {
+					setHanderPostion( scrollview.getScrollPosition() );
+					if ( !scrollview._gesture_timer ) {
+						clearInterval( moveTimer );
+						moveTimer = undefined;
+					}
+				}, 10 );
+
+				if ( scrollview._handlerTimer ) {
+					clearTimeout( scrollview._handlerTimer );
+					scrollview._handlerTimer = 0;
+				}
+				scrollview._handlerTimer = setTimeout( function () {
+					if ( scrollview._timerID === 0 && $view.moveData === null ) {
+						handlerHandle.stop( true, true )
+							.css( "opacity", 1.0 )
+							.fadeOut( function () {
+								handler.removeClass( "ui-handler-visible" );
+							});
+						scrollview._handlerTimer = 0;
+					}
+				}, 1000 );
+			}).bind( "mousewheel", function ( event ) {
+				handler.removeClass( "ui-handler-visible" );
+				setHanderPostion( scrollview.getScrollPosition() );
+			});
+		};
+
+	$.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 ) {
+				if ( $view.find( ".ui-handler" ).length === 0 ) {
+					createHandler( $view );
+				}
+
+				$view.find( ".ui-scrollbar" ).hide();
+				$view.find( ".ui-handler" ).show();
+			} else {
+				$view.find( ".ui-handler" ).removeClass( "ui-handler-visible" ).hide();
+				$view.find( ".ui-scrollbar" ).show();
+			}
+		},
+
+		_setHandlerTheme: function ( handlerTheme ) {
+			if ( !handlerTheme ) {
+				return;
+			}
+
+			var oldClass = "ui-handler-" + this.options.handlerTheme,
+				newClass = "ui-handler-" + handlerTheme;
+
+			this.element.removeClass( oldClass ).addClass( newClass );
+			this.options.handlerTheme = handlerTheme;
+		},
+
+		_setOption: function ( key, value ) {
+			switch ( key ) {
+			case "handler":
+				this.enableHandler( value );
+				break;
+			case "handlerTheme":
+				this._setHandlerTheme( value );
+				break;
+			default:
+				originSetOption.call( this, key, value );
+			}
+		},
+
+		_handlerTimer : 0
+	});
+
+	$( document ).delegate( ":jqmData(scroll)", "scrollviewcreate", function () {
+		var widget = $( this );
+		if ( widget.attr( "data-" + $.mobile.ns + "scroll" ) === "none"
+				|| widget.attr( "data-" + $.mobile.ns + "handler" ) !== "true" ) {
+			return;
+		}
+		widget.scrollview( "enableHandler", "true" );
+	});
+} ( jQuery, document ) );
+
+
+
+/* ***************************************************************************
+ * 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>
+ *				Minkyeong Kim <minkyeong.kim@samsung.com>
+*/
+
+/**
+ *	The TokenTextArea widget changes a text item to a button. It can be comprised of a number of button widgets. 
+ *	When a user types text and the text gets a specific event to change from a text to a button, 
+ *	the input text is changed to a TokenTextArea widget.
+ *	A user can add the TokenTextArea widget to a contact list, email list, or another list.
+ *	The typical use of this widget is composing a number of contacts or phone numbers in a specific area of the screen.
+ *
+ *	HTML Attributes:
+ *
+ *		data-link : Represents the id of the page or the URL of other HTML file.
+ *				The page contains data for the user, for example, an address book.
+ *				If the value is null, anchor button doesn't work. (Default : null)
+ *		data-label:	Provide a label for a user-guide. (Default : 'To : ')
+ *		data-description : This attribute is managing message format.
+ *				This message is displayed when widget status was changed to 'focusout'. (Default : '+ {0}')
+ *
+ *	APIs:
+ *
+ *		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 no argument exists, gets a string of the selected block.
+ *			If any button isn't selected on a token text area widget, this method returns "null" value.
+ *			When a user call this method with an argument which is a number type,
+ *			this method selects the button which is matched with the argument.
+ *		add ( text, [number] )
+ *			:  If second argument does not exist, will insert to a new button at last position.
+ *			Insert a new button at indexed position. The position is decided by the second argument.
+ *			"index of position" means that the position of inserting a new button is decided by the second argument on "add" method.
+ *			For example, if a user call the method like this "add("Tizen", 2)",
+ *			new button labed "Tizen" will be inserted on the third position.
+ *		remove ( [number] )
+ *			: If no argument exists, all buttons are removed.
+ *			Remove a button at indexed position.
+ *			The position is decided by the second argument. (index: 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 )
+ *			: Changes the focus status to 'focus out'.
+ *			The status is not able to manage a widget.
+ *			All buttons that contained in the widget are removed and
+ *			summarized message is displayed.
+ *		destroy ( void )
+ *			: Remove all of the new DOM elements for the current widget that you created.
+ *
+ *	Events:
+ *
+ *		select : Occur when a button is selected.
+ *		add : Occur when new button is inserted. (@since Tizen 2.1 deprecated, You can still use this event. But not recommended.)
+ *		remove : Occur when a button is removed. (@since Tizen 2.1 deprecated, You can still use this event. But not recommended.)
+ *
+ *	Examples:
+ *
+ *		<div data-role="tokentextarea" data-label="To : " data-link="#pageId" data-description="+ {0}">
+ *		</div>
+ *
+ */
+
+
+/**
+	@class TokenTextArea
+	The TokenTextArea widget enables the user to enter text and convert it to a button. Each button that is created from entered text as a result of a change event forms a token text area widget. This widget is useful in composing an e-mail or SMS message to a group of addresses, each of which is a clickable item for more actions, such as copying, editing, or removing the address.
+
+	To add a token text area widget to the application, use the following code:
+
+		<div data-role="tokentextarea" data-label="To : " data-link="#pageId">
+		</div>
+*/
+
+/**
+	@property {String} data-label
+	Sets a label as a guide for the user.
+	For example, while composing an e-mail message, the 'To : ' label is a guide for the user to enter e-mail addresses.
+
+		<div data-role="tokentextarea" data-label="To : ">
+		</div>
+*/
+
+/**
+	@property {String} data-decription
+	Manages the message format.
+	The message is displayed when the widget status changes to focus out
+
+		<div data-role="tokentextarea" data-description=" + {0}">
+		</div>
+ */
+/**
+	@property {String} data-link
+	Sets the ID of the page or the URL of other HTML file to which the button links.
+	If the data-link is set with the URL of other HTML file, the 'dom-cache' option of both page - a page containing a Tokentextarea and a page in the target HTML file - must be set as 'true'.
+
+		<div data-role="tokentextarea" data-link="#pageId">
+		</div>
+
+		<div data-role="tokentextarea" data-link="fileName.html" data-dom-cache="true">
+		</div>
+*/
+/**
+	@event select
+	The select event is fired when a token text area widget button is selected:
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").on("select", function(event, ui)
+		{
+			// Handle the select event
+		});	
+*/
+/**
+	@event add (@since Tizen 2.1 deprecated, You can still use this event. But not recommended.)
+	The add event is fired when a token text area widget button is created:
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").on("add", function(event, ui)
+		{
+			// Handle the add event
+		});
+*/
+/**
+	@event remove (@since Tizen 2.1 deprecated, You can still use this event. But not recommended.)
+	The remove event is fired when a token text area widget button is removed:
+	Restriction : "remove" event works under only "bind" event handling.
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").bind("remove", function(event, ui)
+		{
+			// Handle the remove event
+		});
+*/
+/**
+	@method destroy
+	The destroy method is used to remove in the current widget all the new DOM elements that you have created.
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").tokentextarea("destroy");
+
+	@since Tizen2.0
+*/
+/**
+	@method inputText
+	The inputText method is used to manage the widget input box text. If no parameter is set, the method gets the input box text. If a parameter is set, the parameter text is set in the input box.
+	
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").tokentextarea("inputText", [text]);
+*/
+/**
+	@method select
+	The select method is used to select a token text area widget button based on its index value. If no index value is defined, the method returns the string of the selected block. If there are no buttons present in the widget, the method returns null.
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").tokentextarea("select", [index]);
+*/
+/**
+	@method add
+	The add method is used to add a new token text area widget button with the specified label text at the specified index position. If the index parameter is not defined, the widget button is added at the bottom of the list. For example, the $(".selector").tokentextarea("add", "Tizen", 2) method call creates a new widget button labeled 'Tizen' at the third position in the widget.
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").tokentextarea("add", [text], [index]);
+*/
+/**
+	@method remove
+	The remove method is used to remove a token text area widget button at the specified index position. If the parameter is not defined, all the widget buttons are removed.
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").tokentextarea("remove", [index]);
+*/
+/**
+	@method length
+	The length method is used to retrieve the number of buttons in the token text area widget:
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").tokentextarea("length");
+*/
+/**
+	@method focusIn
+	The focusIn method is used to set the focus status to "focus in". This focus state enables the user to add or remove buttons in the token text area widget.
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").tokentextarea("focusIn");
+*/
+/**
+	@method focusOut
+	The focusOut method is used to set the focus status to "focus out". In this focus state, the user cannot manage the buttons in the widget, all the buttons are removed, and a message is displayed.
+
+		<div data-role="tokentextarea">
+		</div>
+		$(".selector").tokentextarea("focusOut");
+*/
+( function ( $, window, document, undefined ) {
+	$.widget( "tizen.tokentextarea", $.mobile.widget, {
+		_focusStatus : null,
+		_items : null,
+		_viewWidth : 0,
+		_reservedWidth : 0,
+		_currentWidth : 0,
+		_fontSize : 0,
+		_anchorWidth : 0,
+		_labelWidth : 0,
+		_marginWidth : 0,
+		options : {
+			label : "To : ",
+			link : null,
+			description : "+ {0}"
+		},
+
+		_create : function () {
+			var self = this,
+				$view = this.element,
+				role = $view.jqmData( "role" ),
+				option = this.options,
+				className = "ui-tokentextarea-link",
+				inputbox = $( document.createElement( "input" ) ),
+				labeltag = $( document.createElement( "span" ) ),
+				moreBlock = $( document.createElement( "a" ) );
+
+			$view.hide().empty().addClass( "ui-" + role );
+
+			// create a label tag.
+			$( labeltag ).text( option.label ).addClass( "ui-tokentextarea-label" ).attr( "tabindex", 0 );
+			$view.append( labeltag );
+
+			// create a input tag
+			$( inputbox ).addClass( "ui-tokentextarea-input ui-tokentextarea-input-visible ui-input-text ui-body-s" ).attr( "role", "textbox" );
+			$view.append( inputbox );
+
+			// create a anchor tag.
+			if ( option.link === null || $.trim( option.link ).length < 1 || $( option.link ).length === 0 ) {
+				className += "-dim";
+			}
+			$( moreBlock ).attr( "data-role", "button" )
+				.buttonMarkup( {
+					inline: true,
+					icon: "plus",
+					style: "circle"
+				})
+				.attr( { "href" : $.trim( option.link ), "tabindex" : 0 } )
+				.addClass( "ui-tokentextarea-link-base" )
+				.addClass( className )
+				.find( "span.ui-btn-text" )
+				.text( "Add recipient" );
+
+			// append default htmlelements to main widget.
+			$view.append( moreBlock );
+
+			// bind a event
+			this._bindEvents();
+			self._focusStatus = "init";
+			// display widget
+			$view.show();
+
+			// 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;
+			self._modifyInputBoxWidth();
+		},
+
+		// bind events
+		_bindEvents : function () {
+			var self = this,
+				$view = self.element,
+				option = self.options,
+				inputbox = $view.find( ".ui-tokentextarea-input" ),
+				moreBlock = $view.find( ".ui-tokentextarea-link-base" );
+
+			// delegate a event to HTMLDivElement(each block).
+			$view.delegate( "div", "click", function ( event ) {
+				if ( $( this ).hasClass( "ui-tokentextarea-sblock" ) ) {
+					// If block is selected, it will be removed.
+					self._removeTextBlock();
+				}
+
+				var lockBlock = $view.find( "div.ui-tokentextarea-sblock" );
+				if ( typeof lockBlock !== "undefined" ) {
+					lockBlock.removeClass( "ui-tokentextarea-sblock" ).addClass( "ui-tokentextarea-block" );
+				}
+				$( this ).removeClass( "ui-tokentextarea-block" ).addClass( "ui-tokentextarea-sblock" );
+				$view.trigger( "select" );
+			});
+
+			inputbox.bind( "keyup", function ( event ) {
+				// 8  : backspace
+				// 13 : Enter
+				// 186 : semi-colon
+				// 188 : comma
+				var keyValue = event.keyCode,
+					valueString = $( inputbox ).val(),
+					valueStrings = [],
+					index,
+					isSeparator = false;
+
+				if ( keyValue === 8 ) {
+					if ( valueString.length === 0 ) {
+						self._validateTargetBlock();
+					}
+				} else if ( keyValue === 13 || keyValue === 186 || keyValue === 188 ) {
+					if ( valueString.length !== 0 ) {
+						// split content by separators(',', ';')
+						valueStrings = valueString.split ( /[,;]/ );
+						for ( index = 0; index < valueStrings.length; index++ ) {
+							if ( valueStrings[index].length !== 0 && valueStrings[index].replace( /\s/g, "" ).length !== 0 ) {
+								self._addTextBlock( valueStrings[index] );
+							}
+						}
+					}
+					inputbox.val( "" );
+					isSeparator = true;
+				} else {
+					self._unlockTextBlock();
+				}
+
+				return !isSeparator;
+			});
+
+			moreBlock.click( function () {
+				if ( $( moreBlock ).hasClass( "ui-tokentextarea-link-dim" ) ) {
+					return;
+				}
+
+				$( inputbox ).removeClass( "ui-tokentextarea-input-visible" ).addClass( "ui-tokentextarea-input-invisible" );
+
+				$.mobile.changePage( option.link, {
+					transition: "slide",
+					reverse: false,
+					changeHash: false
+				});
+			});
+
+			$( document ).bind( "pagechange.mbe", function ( event ) {
+				if ( $view.innerWidth() === 0 ) {
+					return ;
+				}
+				self.refresh();
+				$( inputbox ).removeClass( "ui-tokentextarea-input-invisible" ).addClass( "ui-tokentextarea-input-visible" );
+			});
+
+			$view.bind( "click", function ( event ) {
+				if ( self._focusStatus === "focusOut" ) {
+					self.focusIn();
+				}
+			});
+		},
+
+		// create a textbutton and append this button to parent layer.
+		// @param arg1 : string
+		// @param arg2 : index
+		_addTextBlock : function ( messages, blockIndex ) {
+			if ( arguments.length === 0 ) {
+				return;
+			}
+
+			if ( !messages ) {
+				return ;
+			}
+
+			var self = this,
+				$view = self.element,
+				content = messages,
+				index = blockIndex,
+				blocks = null,
+				textBlock = null;
+
+			if ( self._viewWidth === 0 ) {
+				self._viewWidth = $view.innerWidth();
+			}
+
+			// Create a new text HTMLDivElement.
+			textBlock = $( document.createElement( 'div' ) );
+
+			textBlock.text( content ).addClass( "ui-tokentextarea-block" ).attr( { "aria-label" : "double tap to edit", "tabindex" : 0 } );
+			textBlock.css( {'visibility': 'hidden'} );
+
+			blocks = $view.find( "div" );
+			if ( index !== null && index <= blocks.length ) {
+				$( blocks[index] ).before( textBlock );
+			} else {
+				$view.find( ".ui-tokentextarea-input" ).before( textBlock );
+			}
+
+			textBlock = self._ellipsisTextBlock( textBlock );
+			textBlock.css( {'visibility': 'visible'} );
+
+			self._modifyInputBoxWidth();
+
+			textBlock.hide();
+			textBlock.fadeIn( "fast", function () {
+				self._currentWidth += self._calcBlockWidth( textBlock );
+				$view.trigger( "add" );
+			});
+		},
+
+		_removeTextBlock : function () {
+			var self = this,
+				$view = this.element,
+				lockBlock = $view.find( "div.ui-tokentextarea-sblock" ),
+				_temp = null,
+				_dummy = function () {};
+
+			if ( lockBlock !== null && lockBlock.length > 0 ) {
+				self._currentWidth -= self._calcBlockWidth( lockBlock );
+
+				lockBlock.fadeOut( "fast", function () {
+					lockBlock.remove();
+					self._modifyInputBoxWidth();
+				});
+
+				this._eventRemoveCall = true;
+				if ( $view[0].remove ) {
+					_temp = $view[0].remove;
+					$view[0].remove = _dummy;
+				}
+				$view.triggerHandler( "remove" );
+				if ( _temp) {
+					$view[0].remove = _temp;
+				}
+				this._eventRemoveCall = false;
+			} else {
+				$view.find( "div:last" ).removeClass( "ui-tokentextarea-block" ).addClass( "ui-tokentextarea-sblock" );
+			}
+		},
+
+		_calcBlockWidth : function ( block ) {
+			return $( block ).outerWidth( true );
+		},
+
+		_unlockTextBlock : function () {
+			var $view = this.element,
+				lockBlock = $view.find( "div.ui-tokentextarea-sblock" );
+			if ( lockBlock ) {
+				lockBlock.removeClass( "ui-tokentextarea-sblock" ).addClass( "ui-tokentextarea-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-tokentextarea-sblock" ) ) {
+				self._removeTextBlock();
+			} else {
+				tmpBlock = $view.find( "div.ui-tokentextarea-sblock" );
+				tmpBlock.removeClass( "ui-tokentextarea-sblock" ).addClass( "ui-tokentextarea-block" );
+				lastBlock.removeClass( "ui-tokentextarea-block" ).addClass( "ui-tokentextarea-sblock" );
+			}
+		},
+
+		_ellipsisTextBlock : function ( textBlock ) {
+			var self = this,
+				$view = self.element,
+				maxWidth = self._viewWidth / 2;
+
+			if ( self._calcBlockWidth( textBlock ) > maxWidth ) {
+				$( textBlock ).width( maxWidth - self._marginWidth );
+			}
+
+			return textBlock;
+		},
+
+		_modifyInputBoxWidth : function () {
+			var self = this,
+				$view = self.element,
+				margin = 0,
+				labelWidth = 0,
+				anchorWidth = 0,
+				inputBoxWidth = 0,
+				blocks = $view.find( "div" ),
+				blockWidth = 0,
+				index = 0,
+				inputBoxMargin = 10,
+				inputBox = $view.find( ".ui-tokentextarea-input" );
+
+			if ( $view.width() === 0 ) {
+				return;
+			}
+
+			if ( self._labelWidth === 0 ) {
+				self._labelWidth = $view.find( ".ui-tokentextarea-label" ).outerWidth( true );
+				self._anchorWidth = $view.find( ".ui-tokentextarea-link-base" ).outerWidth( true );
+				self._marginWidth = parseInt( ( $( inputBox ).css( "margin-left" ) ), 10 );
+				self._marginWidth += parseInt( ( $( inputBox ).css( "margin-right" ) ), 10 );
+				self._viewWidth = $view.innerWidth();
+			}
+
+			margin = self._marginWidth;
+			labelWidth = self._labelWidth;
+			anchorWidth = self._anchorWidth;
+			inputBoxWidth = self._viewWidth - labelWidth;
+
+			for ( index = 0; index < blocks.length; index += 1 ) {
+				blockWidth = self._calcBlockWidth( blocks[index] );
+
+				if ( blockWidth >= inputBoxWidth + anchorWidth ) {
+					if ( blockWidth >= inputBoxWidth ) {
+						inputBoxWidth = self._viewWidth - blockWidth;
+					} else {
+						inputBoxWidth = self._viewWidth;
+					}
+				} else {
+					if ( blockWidth > inputBoxWidth ) {
+						inputBoxWidth = self._viewWidth - blockWidth;
+					} else {
+						inputBoxWidth -= blockWidth;
+					}
+				}
+			}
+
+			inputBoxWidth -= margin;
+			if ( inputBoxWidth < anchorWidth * 2 ) {
+				inputBoxWidth = self._viewWidth - margin;
+			}
+			$( inputBox ).width( inputBoxWidth - anchorWidth - inputBoxMargin );
+		},
+
+		_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;
+		},
+
+		_resizeBlocks : function () {
+			var self = this,
+				$view = self.element,
+				blocks = $view.find( "div" ),
+				index = 0;
+
+			for ( index = 0 ; index < blocks.length ; index += 1 ) {
+				$( blocks[index] ).css( "width", "auto" );
+				blocks[index] = self._ellipsisTextBlock( blocks[index] );
+			}
+		},
+
+		//---------------------------------------------------- //
+		//					Public Method   //
+		//----------------------------------------------------//
+		//
+		// Focus In Event
+		//
+		focusIn : function () {
+			if ( this._focusStatus === "focusIn" ) {
+				return;
+			}
+
+			var $view = this.element;
+
+			$view.find( ".ui-tokentextarea-label" ).attr( "tabindex", 0 ).show();
+			$view.find( ".ui-tokentextarea-desclabel" ).remove();
+			$view.find( "div.ui-tokentextarea-sblock" ).removeClass( "ui-tokentextarea-sblock" ).addClass( "ui-tokentextarea-block" );
+			$view.find( "div" ).attr( { "aria-label" : "double tap to edit", "tabindex" : 0 } ).show();
+			$view.find( ".ui-tokentextarea-input" ).removeClass( "ui-tokentextarea-input-invisible" ).addClass( "ui-tokentextarea-input-visible" ).attr( "tabindex", 0 );
+			$view.find( "a" ).attr( "tabindex", 0 ).show();
+
+			// change focus state.
+			this._modifyInputBoxWidth();
+			this._focusStatus = "focusIn";
+			$view.removeClass( "ui-tokentextarea-focusout" ).addClass( "ui-tokentextarea-focusin" ).removeAttr( "tabindex" );
+			$view.find( ".ui-tokentextarea-input" ).focus();
+		},
+
+		focusOut : function () {
+			if ( this._focusStatus === "focusOut" ) {
+				return;
+			}
+
+			var self = this,
+				$view = self.element,
+				tempBlock = null,
+				stateBlock = null,
+				numBlock = null,
+				statement = "",
+				index = 0,
+				lastIndex = 10,
+				label = $view.find( ".ui-tokentextarea-label" ),
+				more = $view.find( "span" ),
+				blocks = $view.find( "div" ),
+				currentWidth = $view.outerWidth( true ) - more.outerWidth( true ) - label.outerWidth( true ),
+				blockWidth = 0;
+
+			label.removeAttr( "tabindex" );
+			$view.find( ".ui-tokentextarea-input" ).removeClass( "ui-tokentextarea-input-visible" ).addClass( "ui-tokentextarea-input-invisible" ).removeAttr( "tabindex" );
+			$view.find( "a" ).removeAttr( "tabindex" ).hide();
+			blocks.removeAttr( "aria-label" ).removeAttr( "tabindex" ).hide();
+
+			currentWidth = currentWidth - self._reservedWidth;
+
+			for ( index = 0; index < blocks.length; index++ ) {
+				blockWidth = $( blocks[index] ).outerWidth( true );
+				if ( currentWidth - blockWidth <= 0 ) {
+					lastIndex = index - 1;
+					break;
+				}
+
+				$( blocks[index] ).show();
+				currentWidth -= blockWidth;
+			}
+
+			if ( lastIndex !== blocks.length ) {
+				statement = self._stringFormat( self.options.description, blocks.length - lastIndex - 1 );
+				tempBlock = $( document.createElement( 'span' ) );
+				tempBlock.addClass( "ui-tokentextarea-desclabel" ).attr( { "aria-label" : "more, double tap to edit", "tabindex" : "-1" } );
+				stateBlock = $( document.createElement( 'span' ) ).text( statement ).attr( "aria-hidden", "true" );
+				numBlock = $( document.createElement( 'span' ) ).text( blocks.length - lastIndex - 1 ).attr( "aria-label", "and" ).css( "visibility", "hidden" );
+				tempBlock.append( stateBlock );
+				tempBlock.append( numBlock );
+				$( blocks[lastIndex] ).after( tempBlock );
+			}
+
+			// update focus state
+			this._focusStatus = "focusOut";
+			$view.removeClass( "ui-tokentextarea-focusin" ).addClass( "ui-tokentextarea-focusout" ).attr( "tabindex", 0 );
+		},
+
+		inputText : function ( message ) {
+			var $view = this.element;
+
+			if ( arguments.length === 0 ) {
+				return $view.find( ".ui-tokentextarea-input" ).val();
+			}
+			$view.find( ".ui-tokentextarea-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-tokentextarea-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-tokentextarea-block" ).addClass( "ui-tokentextarea-sblock" );
+				$view.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,
+				_temp = null,
+				_dummy = function () {};
+
+			if ( this._focusStatus === "focusOut" ) {
+				return;
+			}
+
+			if ( arguments.length === 0 ) {
+				blocks.fadeOut( "fast", function () {
+					blocks.remove();
+					self._modifyInputBoxWidth();
+					self._trigger( "clear" );
+				});
+			} else if ( !isNaN( position ) ) {
+				// remove selected button
+				index = ( ( position < blocks.length ) ? position : ( blocks.length - 1 ) );
+
+				$( blocks[index] ).fadeOut( "fast", function () {
+					$( blocks[index] ).remove();
+					self._modifyInputBoxWidth();
+				});
+
+				this._eventRemoveCall = true;
+				if ( $view[0].remove ) {
+					_temp = $view[0].remove;
+					$view[0].remove = _dummy;
+				}
+				$view.triggerHandler( "remove" );
+				if ( _temp) {
+					$view[0].remove = _temp;
+				}
+				this._eventRemoveCall = false;
+			}
+		},
+
+		length : function () {
+			return this.element.find( "div" ).length;
+		},
+
+		refresh : function () {
+			var self = this,
+				viewWidth = this.element.innerWidth();
+
+			if ( viewWidth && self._viewWidth !== viewWidth ) {
+				self._viewWidth = viewWidth;
+			}
+			self._resizeBlocks();
+			self._modifyInputBoxWidth();
+		},
+
+		destroy : function () {
+			var $view = this.element,
+				_temp = null,
+				_dummy = function () {};
+
+			if ( this._eventRemoveCall ) {
+				return;
+			}
+
+			$view.find( ".ui-tokentextarea-label" ).remove();
+			$view.find( "div" ).undelegate( "click" ).remove();
+			$view.find( "a" ).remove();
+			$view.find( ".ui-tokentextarea-input" ).unbind( "keyup" ).remove();
+
+			this._eventRemoveCall = true;
+			if ( $view[0].remove ) {
+				_temp = $view[0].remove;
+				$view[0].remove = _dummy;
+			}
+			$view.remove();
+			if ( _temp) {
+				$view[0].remove = _temp;
+			}
+			this._eventRemoveCall = false;
+
+			this._trigger( "destroy" );
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function () {
+		$( ":jqmData(role='tokentextarea')" ).tokentextarea();
+	});
+
+	$( window ).bind( "resize", function () {
+		$( ":jqmData(role='tokentextarea')" ).tokentextarea( "refresh" );
+	});
+} ( jQuery, window, document ) );
+
+
+
+/* ***************************************************************************
+ * 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
+* Licensed under the MIT license.
+* 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 cancel button in searchbar
+ *		<div data-role="header" data-position ="fixed" >
+ *			<h1>Searchbar</h1>
+ *			<input type="search" data-cancel-btn=true name="" id="" value=""  />
+ *		</div>
+ *
+ *	How to make icon in front of searchbar
+ *		<div data-role="header" data-position ="fixed" >
+ *			<h1>Searchbar</h1>
+ *			<input type="search" data-icon="call" name="" id="" value=""  />
+ *		</div>
+*/
+
+/**
+	@class SearchBar
+	The search bar widget is used to search for page content. This widget can be placed in the header, option header, or page content.
+
+	To add a search bar widget to the application, use the following code:
+
+		<label for="search-basic">Search Input:</label>
+		<input type="search" name="search" id="searc-basic" value="" data-mini="true" />
+
+	Tizen supports many search bar options as described in the jQueryMobile documentation for search bar options.
+	The search bar can define callbacks for events as described in the jQueryMobile documentation for search bar events.
+	You can use methods with the search bar as described in the jQueryMobile documentation for search bar methods.
+*/
+
+(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,
+				cancelbtn,
+				defaultText,
+				defaultTextClass,
+				trimedText,
+				newClassName,
+				newStyle,
+				newDiv,
+				searchimage,
+				inputedText,
+				useCancelBtn = false,
+				frontIcon = false;
+
+			$( "label[for='" + input.attr( "id" ) + "']" ).addClass( "ui-input-text" );
+
+			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();
+
+			if ( $( this.element ).data( "cancel-btn" ) === true ) {
+				useCancelBtn = true;
+				focusedEl.addClass( "ui-input-search-default" );
+			}
+			if ( $( this.element ).data( "icon" ) != undefined ) {
+				frontIcon = true;
+				focusedEl.addClass( "ui-search-bar-icon" );
+			}
+
+			clearbtn = $( "<a href='#' class='ui-input-clear' title='clear text'>clear text</a>" );
+
+			clearbtn.on( "click", function (event) {
+					if ( input.attr( "disabled" ) == "disabled" ) {
+						return false;
+					}
+					input
+						.val( "" )
+						.trigger('change')
+						.focus();
+					event.preventDefault();
+				})
+				.appendTo( focusedEl )
+				.buttonMarkup({
+					icon: "deleteSearch",
+					iconpos: "notext",
+					corners: true,
+					shadow: true
+				});
+
+			/* temporarily delete 06.28 Heeju Joo */
+			/*function toggleClear() {
+				setTimeout(function () {
+					clearbtn.toggleClass( "ui-input-clear-hidden", !input.val()
+				}, 0);
+			}*/
+
+
+			function showCancel() {
+				focusedEl
+					.addClass( "ui-input-search-default" )
+					.removeClass( "ui-input-search-wide" );
+				cancelbtn
+					.addClass( "ui-btn-cancel-show" )
+					.removeClass( "ui-btn-cancel-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" );
+			}
+
+			function makeFrontIcon() {
+				var IconStyle = $( input ).jqmData( "icon" ),
+					frontIcon = $( "<div data-role='button' data-style='circle'></div>" );
+
+				frontIcon
+					.appendTo( focusedEl.parent() )
+					.buttonMarkup( {
+						icon: IconStyle,
+						iconpos: "notext",
+						corners: true,
+						shadow: true
+					} );
+				frontIcon.addClass( "ui-btn-search-front-icon" );
+			}
+			/* temporarily delete - 06.28 Heeju Joo */
+			/*toggleClear();
+
+			input.bind( 'paste cut keyup focus change blur', toggleClear );
+			*/
+
+			/* N_SE-43150 when input get event "focus", it show clearbtn */
+			input.bind( "focus", function() {
+				clearbtn.css("display", "inline-block");
+			});
+			//SLP --start search bar with cancel button
+			focusedEl.wrapAll( "<div class='input-search-bar'></div>" );
+			searchimage = $("<div class='ui-image-search'></div>").appendTo( focusedEl );
+
+			if ( frontIcon ) {
+				makeFrontIcon();
+			}
+
+			if ( useCancelBtn ) {
+				cancelbtn = $( "<div data-role='button' class='ui-input-cancel' title='clear text'>Cancel</div>" )
+					.bind('click', function ( event ) {
+						if ( input.attr( "disabled" ) == "disabled" ) {
+							return false;
+						}
+						event.preventDefault();
+						event.stopPropagation();
+
+						input
+							.val( "" )
+							.trigger('change')
+							.blur();
+
+						if ( useCancelBtn ) {
+							hideCancel();
+						}
+					} )
+					.appendTo( focusedEl.parent() )
+					.buttonMarkup( {
+						iconpos: "cancel",
+						corners: true,
+						shadow: true
+					} );
+			}
+
+			// Input Focused
+			input
+				.focus( function () {
+					if ( input.attr( "disabled" ) == "disabled" ) {
+						return false;
+					}
+					if ( useCancelBtn ) {
+						showCancel();
+					}
+					focusedEl.addClass( $.mobile.focusClass );
+				})
+				.blur(function () {
+					focusedEl.removeClass( $.mobile.focusClass );
+				});
+
+			// 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" );
+						}
+					} );
+			}
+
+			if ( !input.attr("placeholder") ) {
+				input.attr( "placeholder", "Search" );
+			}
+		},
+
+		disable: function () {
+			this.element.attr( "disabled", true );
+			this.element.parent().addClass( "ui-disabled" );
+			$( this.element ).blur();
+			this.element.parent().parent().find(".ui-input-cancel").addClass( "ui-disabled" );
+		},
+
+		enable: function () {
+			this.element.attr( "disabled", false );
+			this.element.parent().removeClass( "ui-disabled" );
+			this.element.parent().parent().find(".ui-input-cancel").removeClass( "ui-disabled" );
+			$( this.element ).focus();
+		}
+	} );
+
+	//auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$.tizen.searchbar.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.
+ * ***************************************************************************
+ *
+ *	Author: Kangsik Kim <kangsik81.kim@samsung.com>
+ *			Youmin Ha <youmin.ha@samsung.com>
+*/
+
+/**
+ * In the web environment, it is challenging to display a large amount of data in a grid.
+ * When an application needs to show, for example, image gallery with over 1,000 images,
+ * the same enormous data must be inserted into a HTML document.
+ * It takes a long time to display the data and manipulating DOM is complex.
+ * The virtual grid widget supports storing unlimited data without performance issues
+ * by reusing a limited number of grid elements.
+ * The virtual grid widget is based on the jQuery.template plug-in 
+ * For more information, see jQuery.template.
+ *
+ * HTML Attributes:
+ *
+ *		data-role:  virtualgrid
+ *		data-template :	Has the ID of the jQuery.template element.
+ *						jQuery.template for a virtual grid must be defined.
+ *						Style for template would use rem unit to support scalability.
+ *		data-direction : This option define the direction of the scroll.
+ *						You must choose one of the 'x' and 'y' (Default : y)
+ *		data-rotation : This option defines whether or not the circulation of the data.
+ *						If option is 'true' and scroll is reached the last data,
+ *						Widget will present the first data on the screen.
+ *						If option is ‘false’, Widget will operate like a scrollview.
+ *
+ *		ID : <DIV> element that has "data-role=virtualgrid" must have ID attribute.
+ *
+ * APIs:
+ *
+ *		create ( {
+ *				itemData: function ( idx ) { return json_obj; },
+ *				numItemData: number or function () { return number; },
+ *				cacheItemData: function ( minIdx, maxIdx ) {}
+ *				} )
+ *			: Create VirtualGrid widget. At this moment, _create method is called.
+ *			args : A collection of options
+ *				itemData: A function that returns JSON object for given index. Mandatory.
+ *				numItemData: Total number of itemData. Mandatory.
+ *				cacheItemData: Virtuallist will ask itemData between minIdx and maxIdx.
+ *				Developers can implement this function for preparing data.
+ *				Optional.
+ *
+ *		centerTo ( selector )
+ *			: Center the particular item with the class name on the VirtualGrid's display area.;
+ *			i.e., this method selects an item in the data elements of grid using the class name and
+ *			moves the data elements inside the widget to display the row containing the selected item
+ *			in the middle of the screen.
+ *			If multiple items are matched with the class name, the first matched item will be selected.
+ *			This method is only available when "data-rotation" attribute is "true".
+ *
+ *		resize ()
+ *			: Rearrange items to fit a new widget size.
+ *
+ * Events:
+ *		scrollstart : : This event triggers when a user begin to move the scroll on VirtualGrid.
+ *		scrollupdate : : This event triggers while a user moves the scroll on VirtualGrid.
+ *		scrollstop : This event triggers when a user stop the scroll on VirtualGrid.
+ *		select : This event triggers when a cell is selected.
+ *
+ * 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-template="tizen-demo-namecard" >
+ *			</div>
+ *
+ */
+
+// most of following codes are derived from jquery.mobile.scrollview.js
+
+/**
+	@class VirtualGrid
+	In the Web environment, it is challenging to display large amount of data in a list, such as displaying a contact list of over 1000 list items. It takes time to display the entire list in HTML and the DOM manipulation is complex.
+
+	The virtual grid widget is used to display a list of unlimited data elements on the screen for better performance. This widget displays the data in the grid format by reusing the existing grid control space. Virtual grids are based on the jQuery.template plugin as described in the jQuery documentation for jQuery.template plugin.
+
+	To add a virtual grid widget to the application, use the following code:
+
+		<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>
+				</div>
+			</div>
+		</script>
+		<div id="virtualgrid-demo" data-role="virtualgrid" data-template="tizen-demo-namecard">
+		</div>
+*/
+/**
+	@property {String} data-template
+	Specifies the jQuery.template element ID.
+	The jQuery.template must be defined. The template style can use rem units to support scalability.
+*/
+/**
+	@property {String} data-direction
+	Defines the scroll direction. The direction options are x (horizontal) and y (vertical).
+	The default value is y.
+*/
+/**
+	@property {Boolean} data-rotation
+	Defines whether the data elements are displayed from the beginning of the list again once the end of file is reached.
+	The default value is false.
+*/
+/**
+	@event scrollstart
+	The scrollstart event is fired when the user starts scrolling through the grid:
+
+		<div data-role="virtualgrid" data-scroll="y" data-template="tizen-demo-namecard"></div>
+		$(".selector").on("scrollstart", function(event, ui)
+		{
+		// Handle the scrollstart event
+		});
+*/
+/**
+	@event scrollupdate
+	The scrollupdate event is fired when the user moves the scroll bar in the grid:
+
+		<div data-role="virtualgrid" data-scroll="y" data-template="tizen-demo-namecard"></div>
+		$(".selector").on("scrollupdate", function(event, ui)
+		{
+		// Handle the scrollupdate event
+		});
+*/
+/**
+	@event scrollstop
+	The scrollstop event is fired when the user stops scrolling:
+
+		<div data-role="virtualgrid" data-scroll="y" data-template="tizen-demo-namecard"></div>
+		$(".selector").on("scrollstop", function(event, ui)
+		{
+		// Handle the scrollstop event
+		});
+*/
+/**
+	@event select
+	The select event is fired when a virtual grid cell is selected:
+
+		<div data-role="virtualgrid" data-scroll="y" data-template="tizen-demo-namecard"></div>
+		$(".selector").on("select", function(event, ui)
+		{
+		// Handle the select event
+		});
+*/
+/**
+	@method create
+	@param {function} itemData(index)
+	@param {Number} numItemData
+	@param {function} cacheItemData(minIndex, maxIndex)
+	The create method is used to call the jQuery _create method. In the method parameters:
+
+	function itemData(index) returns the JSON object matched with the given index. The index value is between 0 and numItemData-1.<br/>
+	number numItemData or function numItemData() defines or returns a static number of items.<br/>
+	function cacheItemData(minIndex, maxIndex) prepares the JSON data. This method is called before calling the itemData() method with index values between minIndex and maxIndex.<br/>
+
+		<div data-role="virtualgrid" data-scroll="y" data-template="tizen-demo-namecard"></div>
+			function itemData(idx)
+			{
+				return DATA[idx];
+			}
+			function cacheItemData(minIdx, maxIdx)
+			{
+			// Prepare JSON data between minIdx and maxIdx
+			}
+			var numItemData = DATA.length;
+			$(".selector").virtualgrid("create",
+			{
+				itemData, numItemData, cacheItemData
+			});
+*/
+/**
+	@method centerTo
+	The centerTo method is used to center the particular item with the class name on the VirtualGrid's display area. If multiple items are matched with the class name, the first matched item will be selected. This method is only available when "data-rotation" attribute is "true".
+
+		<div data-role="virtualgrid" data-scroll="y" data-rotation="true" data-template="tizen-demo-namecard"></div>
+		$(".selector").virtualgrid("centerTo", selector);
+*/
+/**
+	@method resize
+	The resize method is used to rearrange items to fit a new widget size. :
+
+		<div data-role="virtualgrid" data-scroll="y" data-template="tizen-demo-namecard"></div>
+		$(".selector").virtualgrid("resize");
+
+	@since Tizen2.0
+*/
+
+( function ( $, window, document, undefined ) {
+
+	function circularNum ( num, total ) {
+		var n = num % total;
+		if ( n < 0 ) {
+			n = total + n;
+		}
+		return n;
+	}
+
+	function MomentumTracker ( options ) {
+		this.options = $.extend( {}, options );
+		this.easing = "easeOutQuad";
+		this.reset();
+	}
+
+	var tstates = {
+			scrolling : 0,
+			done : 1
+		},
+		_OVERFLOW_DIR_NONE = 0,		/* ENUM */
+		_OVERFLOW_DIR_UP = 1,		/* ENUM */
+		_OVERFLOW_DIR_DOWN = -1,	/* ENUM */
+		imgTagSrcAttrRE = /src\s*=\s*[\"\'][\w\/.]+.[A-z]+[\"\']/;
+
+	function getCurrentTime () {
+		return Date.now();
+	}
+
+	$.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 / 2 );
+			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.virtualgrid", jQuery.mobile.widget, {
+		options : {
+			// virtualgrid option
+			template : "",
+			direction : "y",
+			rotation : false
+		},
+
+		create : function () {
+			this._create.apply( this, arguments );
+		},
+
+		_create : function ( args ) {
+			$.extend( this, {
+				// view
+				_$view : null,
+				_$clip : null,
+				_$rows : null,
+				_tracker : null,
+				_viewSize : 0,
+				_clipSize : 0,
+				_cellSize : undefined,
+				_currentItemCount : 0,
+				_itemCount : 1,
+				_inheritedSize : null,
+
+				// timer
+				_timerInterval : 0,
+				_timerID : 0,
+				_timerCB : null,
+				_lastMove : null,
+
+				// Data
+				_itemData : function ( idx ) { return null; },
+				_numItemData : 0,
+				_cacheItemData : function ( minIdx, maxIdx ) { },
+				_totalRowCnt : 0,
+				_templateText : null,
+				_maxViewSize : 0,
+				_modifyViewPos : 0,
+				_maxSizeExceptClip : 0,
+				_maxSize : 0,
+
+				// axis - ( true : x , false : y )
+				_direction : false,
+				_didDrag : true,
+				_reservedPos : 0,
+				_scalableSize : 0,
+				_eventPos : 0,
+				_nextPos : 0,
+				_movePos : 0,
+				_lastY : 0,
+				_speedY : 0,
+				_lastX : 0,
+				_speedX : 0,
+				_rowsPerView : 0,
+				_fragment : null,
+
+				_filterRatio : 0.9,
+
+				_overflowStartPos : 0,
+				_overflowDir : 0,
+				_overflowMaxDragDist : 100
+			});
+
+			var self = this,
+				$dom = $( self.element ),
+				opts = self.options,
+				$item = null;
+
+			// itemData
+			// If mandatory options are not given, Do nothing.
+			if ( !args ) {
+				return ;
+			}
+
+			if ( !self._loadData( args ) ) {
+				return;
+			}
+
+			// make a fragment.
+			self._fragment = document.createDocumentFragment();
+
+			// read defined properties(width and height) from dom element.
+			self._inheritedSize = self._getinheritedSize( self.element );
+
+			// set a scroll direction.
+			self._direction = opts.direction === 'x' ? true : false;
+
+			// make view layer
+			self._$clip = $dom.addClass( "ui-scrollview-clip" ).addClass( "ui-virtualgrid-view" );
+			$item = $( document.createElement( "div" ) ).addClass( "ui-scrollview-view" );
+			self._clipSize =  self._calculateClipSize();
+			self._$clip.append( $item );
+			self._$view = $item;
+			self._$clip.css( "overflow", "hidden" );
+			self._$view.css( "overflow", "hidden" );
+
+			// inherit from scrollview widget.
+			self._scrollView = $.tizen.scrollview.prototype;
+			self._initScrollView();
+
+			// create tracker.
+			self._createTracker();
+			self._makePositioned( self._$clip );
+			self._timerInterval = 1000 / self.options.fps;
+
+			self._timerID = 0;
+			self._timerCB = function () {
+				self._handleMomentumScroll();
+			};
+			$dom.closest( ".ui-content" ).addClass( "ui-virtualgrid-content" ).css( "overflow", "hidden" );
+
+			// add event handler.
+			self._addBehaviors();
+
+			self._currentItemCount = 0;
+			self._createOverflowArea();
+			self._createScrollBar();
+			self.refresh();
+		},
+
+		// The argument is checked for compliance with the specified format.
+		// @param args   : Object
+		// @return boolean
+		_loadData : function ( args ) {
+			var self = this;
+
+			if ( args.itemData && typeof args.itemData == 'function'  ) {
+				self._itemData = args.itemData;
+			} else {
+				return false;
+			}
+			if ( args.numItemData ) {
+				if ( typeof args.numItemData == 'function' ) {
+					self._numItemData = args.numItemData( );
+				} else if ( typeof args.numItemData == 'number' ) {
+					self._numItemData = args.numItemData;
+				} else {
+					return false;
+				}
+			} else {
+				return false;
+			}
+			self._getObjectNames( self._itemData( 0 ) );
+			return true;
+		},
+
+		// Make up the first screen.
+		_initLayout: function () {
+			var self = this,
+				opts = self.options,
+				i,
+				$row;
+
+			for ( i = -1; i < self._rowsPerView + 1; i += 1 ) {
+				$row = self._$rows[ circularNum( i, self._$rows.length ) ];
+				self._$view.append( $row );
+			}
+			self._setElementTransform( -self._cellSize );
+
+			self._replaceRow( self._$view[0].firstChild, self._totalRowCnt - 1 );
+			if ( opts.rotation && self._rowsPerView >= self._totalRowCnt ) {
+				self._replaceRow( self._$view[0].lastChild, 0 );
+			}
+			self._setViewSize();
+		},
+
+		_setViewSize : function () {
+			var self = this,
+				height = 0,
+				width = 0;
+
+			if ( self._direction ) {
+				width = self._cellSize * ( self._rowsPerView + 2 );
+				width = parseInt( width, 10 ) + 1;
+				self._$view.width( width );
+				self._viewSize = self._$view.width();
+			} else {
+				self._$view.height( self._cellSize * ( self._rowsPerView + 2 ) );
+				self._$clip.height( self._clipSize );
+				self._viewSize = self._$view.height();
+			}
+		},
+
+		_getViewWidth : function () {
+			var self = this;
+			return self._maxSize;
+		},
+
+		_getViewHeight : function () {
+			var self = this;
+			return self._maxSize;
+		},
+
+		refresh : function () {
+			var self = this,
+				opts = self.options,
+				width = 0,
+				height = 0,
+				$template = null;
+
+			$template = $( "#" + opts.template );
+			if ( !$template ) {
+				return ;
+			}
+			self._templateText = self._insertAriaAttrToTmpl( $template.text() );
+
+			width = self._calculateClipWidth();
+			height = self._calculateClipHeight();
+			self._$view.width( width ).height( height );
+			self._$clip.width( width ).height( height );
+
+			self._clipSize = self._calculateClipSize();
+			self._calculateColumnSize();
+			self._initPageProperty();
+			self._setScrollBarSize();
+		},
+
+		_initPageProperty : function () {
+			var self = this,
+				rowsPerView = 0,
+				$child,
+				columnCount = 0,
+				totalRowCnt = 0,
+				attributeName = self._direction ? "width" : "height";
+
+			columnCount = self._calculateColumnCount();
+
+			totalRowCnt = parseInt( self._numItemData / columnCount, 10 );
+			self._totalRowCnt = self._numItemData % columnCount === 0 ? totalRowCnt : totalRowCnt + 1;
+			self._itemCount = columnCount;
+
+			if ( self._cellSize <= 0 ) {
+				return ;
+			}
+
+			rowsPerView = self._clipSize / self._cellSize;
+			rowsPerView = Math.ceil( rowsPerView );
+			self._rowsPerView = parseInt( rowsPerView, 10 );
+
+			$child = $( self._makeRows( rowsPerView + 2 ) );
+			self._$view.append( $child.children() );
+			self._$view.children().css( attributeName, self._cellSize + "px" );
+			self._$rows = self._$view.children().detach();
+
+			self._reservedPos = -self._cellSize;
+			self._scalableSize = -self._cellSize;
+
+			self._initLayout();
+
+			self._blockScroll = self._rowsPerView > self._totalRowCnt;
+			self._maxSizeExceptClip = ( self._totalRowCnt - self._rowsPerView ) * self._cellSize;
+			self._maxSize = self._totalRowCnt * self._cellSize;
+			self._maxViewSize = ( self._rowsPerView ) * self._cellSize;
+			self._modifyViewPos = -self._cellSize;
+			if ( self._clipSize < self._maxViewSize ) {
+				self._modifyViewPos = ( -self._cellSize ) + ( self._clipSize - self._maxViewSize );
+			}
+		},
+
+		_getinheritedSize : function ( elem ) {
+			var $target = $( elem ),
+				height,
+				width,
+				NODETYPE = { ELEMENT_NODE : 1, TEXT_NODE : 3 },
+				ret = {
+					isDefinedWidth : false,
+					isDefinedHeight : false,
+					width : 0,
+					height : 0
+				};
+
+			while ( $target[0].nodeType === NODETYPE.ELEMENT_NODE && ( ret.isDefinedWidth === false || ret.isHeightDefined === false ) ) {
+				height = $target[0].style.height;
+				width = $target[0].style.width;
+
+				if ( ret.isDefinedHeight === false && height !== "" ) {
+					// Size was defined
+					ret.isDefinedHeight = true;
+					ret.height = parseInt( height, 10 );
+				}
+
+				if ( ret.isDefinedWidth === false && width !== "" ) {
+					// Size was defined
+					ret.isDefinedWidth = true;
+					ret.width = parseInt( width, 10 );
+				}
+				$target = $target.parent();
+				if ( $target.hasClass( "ui-content" ) ) {
+					break;
+				}
+			}
+			return ret;
+		},
+
+		_resize : function () {
+			var self = this,
+				ret = null,
+				rowsPerView = 0,
+				itemCount = 0,
+				totalRowCnt = 0,
+				diffRowCnt = 0,
+				clipSize = 0,
+				prevcnt = 0,
+				clipPosition = 0,
+				rowsLength = 0,
+				row = null,
+				size = 0;
+
+			if ( self._direction ) {
+				size = self._calculateClipHeight();
+				self._$view.height( size );
+				self._$clip.height( size );
+			} else {
+				size = self._calculateClipWidth();
+				self._$view.width( size );
+				self._$clip.width( size );
+			}
+
+			itemCount = self._calculateColumnCount();
+			if ( itemCount != self._itemCount ) {
+				totalRowCnt = parseInt( self._numItemData / itemCount, 10 );
+				self._totalRowCnt = self._numItemData % itemCount === 0 ? totalRowCnt : totalRowCnt + 1;
+				prevcnt = self._itemCount;
+				self._itemCount = itemCount;
+				clipPosition = self._getClipPosition();
+				self._$view.hide();
+
+				diffRowCnt = self._replaceRows( itemCount, prevcnt, self._totalRowCnt, clipPosition );
+				self._maxSizeExceptClip = ( self._totalRowCnt - self._rowsPerView ) * self._cellSize;
+				self._maxSize = self._totalRowCnt * self._cellSize;
+				self._scalableSize += ( -diffRowCnt ) * self._cellSize;
+				self._reservedPos  += ( -diffRowCnt ) * self._cellSize;
+				self._setScrollBarSize();
+				self._setScrollBarPosition( diffRowCnt );
+
+				self._$view.show();
+			}
+
+			clipSize = self._calculateClipSize();
+			if ( clipSize !== self._clipSize ) {
+				rowsPerView = clipSize / self._cellSize;
+				rowsPerView = parseInt( Math.ceil( rowsPerView ), 10 );
+
+				if ( rowsPerView > self._rowsPerView ) {
+					// increase row.
+					self._increaseRow( rowsPerView - self._rowsPerView );
+				} else if ( rowsPerView < self._rowsPerView ) {
+					// decrease row.
+					self._decreaseRow( self._rowsPerView - rowsPerView );
+				}
+				self._$rows = self._$view.children();
+				self._$rows.sort( function ( a, b ) {
+					return a.getAttribute( "row-index" ) - b.getAttribute( "row-index" );
+				});
+
+				self._rowsPerView = rowsPerView;
+				self._clipSize = clipSize;
+				self._blockScroll = self._rowsPerView > self._totalRowCnt;
+				self._maxSizeExceptClip = ( self._totalRowCnt - self._rowsPerView ) * self._cellSize;
+				self._maxSize = self._totalRowCnt * self._cellSize;
+				self._maxViewSize = ( self._rowsPerView ) * self._cellSize;
+				if ( self._clipSize < self._maxViewSize ) {
+					self._modifyViewPos = ( -self._cellSize ) + ( self._clipSize - self._maxViewSize );
+				}
+				if ( self._direction ) {
+					self._$clip.width( self._clipSize );
+				} else {
+					self._$clip.height( self._clipSize );
+				}
+				self._setScrollBarSize();
+				self._setScrollBarPosition( 0 );
+				self._setViewSize();
+			}
+		},
+
+		resize : function () {
+			var self = this,
+				height = 0,
+				$virtualgrid = $( ".ui-virtualgrid-view" );
+
+			self._inheritedSize = self._getinheritedSize( self.element );
+
+			if ( $virtualgrid.length !== 0 ) {
+				self._resize();
+			}
+		},
+
+		_initScrollView : function () {
+			var self = this,
+				oldDirection = self.options.direction;
+			$.extend( self.options, self._scrollView.options );
+			self.options.direction = oldDirection;
+			self.options.moveThreshold = 10;
+			self.options.showScrollBars = false;
+			self._getScrollHierarchy = self._scrollView._getScrollHierarchy;
+			self._makePositioned =  self._scrollView._makePositioned;
+			self._set_scrollbar_size = self._scrollView._set_scrollbar_size;
+			self._setStyleTransform = self._scrollView._setElementTransform;
+			self._hideOverflowIndicator = self._scrollView._hideOverflowIndicator;
+			self._showOverflowIndicator = self._scrollView._showOverflowIndicator;
+			self._setGestureScroll = self._scrollView._setGestureScroll;
+		},
+
+		_createTracker : function () {
+			var self = this;
+
+			self._tracker = new MomentumTracker( self.options );
+			if ( self._direction ) {
+				self._hTracker = self._tracker;
+				self._$clip.width( self._clipSize );
+			} else {
+				self._vTracker = self._tracker;
+				self._$clip.height( self._clipSize );
+			}
+		},
+
+		//----------------------------------------------------//
+		//		Overflow effect
+		//----------------------------------------------------//
+		_createOverflowArea : function () {
+			var self = this,
+				prefix = "<div class=\"ui-virtualgrid-overflow-indicator-",
+				suffixTop = "-top\"></div>",
+				suffixBottom = "-bottom\"></div>";
+
+			if ( self.options.rotation ) {
+				return;
+			}
+
+			if ( self._direction ) {
+				self._overflowTop = $( prefix + "x" + suffixTop );
+				self._overflowBottom = $( prefix + "x" + suffixBottom );
+			} else {
+				self._overflowTop = $( prefix + "y" + suffixTop );
+				self._overflowBottom = $( prefix + "y" + suffixBottom );
+			}
+
+			self._$clip.append( self._overflowTop );
+			self._$clip.append( self._overflowBottom );
+			self._overflowDisplayed = false;
+		},
+
+		_hideVGOverflowIndicator : function () {
+			if ( this._overflowDisplayed === false ) {
+				return;
+			}
+
+			this._overflowTop.animate( { opacity: 0 }, 300 );
+			this._overflowBottom.animate( { opacity: 0 }, 300 );
+			this._overflowDisplayed = false;
+		},
+
+		//----------------------------------------------------//
+		//		Scrollbar		//
+		//----------------------------------------------------//
+		_createScrollBar : function () {
+			var self = this,
+				prefix = "<div class=\"ui-scrollbar ui-scrollbar-",
+				suffix = "\"><div class=\"ui-scrollbar-track\"><div class=\"ui-scrollbar-thumb\"></div></div></div>";
+
+			if ( self.options.rotation ) {
+				return ;
+			}
+
+			if ( self._direction ) {
+				self._$clip.append( prefix + "x" + suffix );
+				self._hScrollBar = self._$clip.children( ".ui-scrollbar-x" );
+				self._hScrollBar.find( ".ui-scrollbar-thumb" ).addClass( "ui-scrollbar-thumb-x" );
+			} else {
+				self._$clip.append( prefix + "y" + suffix );
+				self._vScrollBar = self._$clip.children( ".ui-scrollbar-y" );
+				self._vScrollBar.find( ".ui-scrollbar-thumb" ).addClass( "ui-scrollbar-thumb-y" );
+			}
+		},
+
+		_setScrollBarSize: function () {
+			var self = this,
+				scrollBarSize = 0,
+				currentSize = 0,
+				$scrollBar,
+				attrName,
+				className;
+
+			if ( self.options.rotation ) {
+				return ;
+			}
+
+			scrollBarSize = parseInt( self._maxViewSize / self._clipSize, 10 );
+			if ( self._direction ) {
+				$scrollBar = self._hScrollBar.find( ".ui-scrollbar-thumb" );
+				attrName = "width";
+				currentSize = $scrollBar.width();
+				className = "ui-scrollbar-thumb-x";
+				self._hScrollBar.css( "width", self._clipSize );
+			} else {
+				$scrollBar = self._vScrollBar.find( ".ui-scrollbar-thumb" );
+				attrName = "height";
+				className = "ui-scrollbar-thumb-y";
+				currentSize = $scrollBar.height();
+				self._vScrollBar.css( "height", self._clipSize );
+			}
+
+			if ( scrollBarSize > currentSize ) {
+				$scrollBar.removeClass( className );
+				$scrollBar.css( attrName, scrollBarSize );
+			} else {
+				scrollBarSize = currentSize;
+			}
+
+			self._itemScrollSize = parseFloat( ( self._clipSize - scrollBarSize ) / ( self._totalRowCnt - self._rowsPerView ) );
+			self._itemScrollSize = Math.round( self._itemScrollSize * 100 ) / 100;
+		},
+
+		_setScrollBarPosition : function ( di, duration ) {
+			var self = this,
+				$sbt = null,
+				x = "0px",
+				y = "0px",
+				translate;
+
+			if ( self.options.rotation ) {
+				return ;
+			}
+
+			self._currentItemCount = self._currentItemCount + di;
+			if ( self._vScrollBar ) {
+				$sbt = self._vScrollBar.find( ".ui-scrollbar-thumb" );
+				y = ( self._currentItemCount * self._itemScrollSize ) + "px";
+			} else {
+				$sbt = self._hScrollBar.find( ".ui-scrollbar-thumb" );
+				x = ( self._currentItemCount * self._itemScrollSize ) + "px";
+			}
+			self._setStyleTransform( $sbt, x, y, duration );
+		},
+
+		_hideScrollBars : function () {
+			var self = this,
+				vclass = "ui-scrollbar-visible";
+
+			if ( self.options.rotation ) {
+				return ;
+			}
+
+			if ( self._vScrollBar ) {
+				self._vScrollBar.removeClass( vclass );
+			} else {
+				self._hScrollBar.removeClass( vclass );
+			}
+		},
+
+		_showScrollBars : function () {
+			var self = this,
+				vclass = "ui-scrollbar-visible";
+
+			if ( self.options.rotation ) {
+				return ;
+			}
+
+			if ( self._vScrollBar ) {
+				self._vScrollBar.addClass( vclass );
+			} else {
+				self._hScrollBar.addClass( vclass );
+			}
+		},
+
+		//----------------------------------------------------//
+		//		scroll process		//
+		//----------------------------------------------------//
+		centerTo : function ( selector ) {
+			var self = this,
+				row = null,
+				targetItem = null,
+				targetRowIndex = -1,
+				rowsLength = self._$rows.length,
+				newPosition,
+				i;
+
+			if ( !self.options.rotation ) {
+				return;
+			}
+
+			for ( i = 0; i < rowsLength; ++i ) {
+				row = $( self._$rows[ i ] );
+				targetItem = row.children( "." + selector );
+				if ( targetItem.length ) {
+					targetRowIndex = parseInt( row.attr( "row-index" ), 10 );
+					break;
+				}
+			}
+
+			if ( targetRowIndex === -1 ) {
+				targetRowIndex = self._getTargetRowIndex( selector );
+				if ( targetRowIndex === -1 ) {
+					return;
+				}
+			}
+
+			newPosition = -( targetRowIndex * self._cellSize - ( self._clipSize - self._cellSize ) / 2 );
+			if ( self._direction ) {
+				self.scrollTo( newPosition, 0 );
+			} else {
+				self.scrollTo( 0, newPosition );
+			}
+		},
+
+		_getTargetRowIndex: function ( selector ) {
+			var self = this,
+				dataCount = self._numItemData,
+				itemCount = self._itemCount,
+				attrName = self._direction ? "top" : "left",
+				html = "",
+				targetRowIndex = self._totalRowCnt,
+				i;
+
+			for ( i = 0; i < dataCount; ++i ) {
+				html = self._makeHtmlData( i, i % itemCount, attrName );
+				if ( self._hasClassItem( html, selector ) ) {
+					targetRowIndex = parseInt( i / itemCount, 10 );
+					break;
+				}
+			}
+
+			if ( targetRowIndex === self._totalRowCnt ) {
+				return -1;
+			}
+
+			return targetRowIndex;
+		},
+
+		_hasClassItem: function ( html, selector ) {
+			var self = this,
+				classString = self._getItemClass( html );
+
+			if ( classString.indexOf( selector ) === -1 ) {
+				return false;
+			}
+
+			if ( classString.indexOf( "virtualgrid-item" ) === -1 ) {
+				return false;
+			}
+
+			return true;
+		},
+
+		_getItemClass: function ( html ) {
+			var classIndex = html.indexOf( "class" ),
+				classBeginIndex = Math.min( html.indexOf( "\"", classIndex ), html.indexOf( "'", classIndex ) ),
+				classEndIndex = Math.min( html.indexOf( "\"", classBeginIndex + 1 ), html.indexOf( "'", classBeginIndex + 1 ) );
+
+			return html.slice( classBeginIndex + 1, classEndIndex );
+		},
+
+		scrollTo: function ( x, y, duration ) {
+			var self = this;
+			if ( self._direction ) {
+				x -= self._cellSize;
+				self._sx = self._reservedPos;
+				self._reservedPos = x;
+			} else {
+				y -= self._cellSize;
+				self._sy = self._reservedPos;
+				self._reservedPos = y;
+			}
+			self._scrollView.scrollTo.apply( this, [ x, y, duration ] );
+		},
+
+		getScrollPosition: function () {
+			if ( this.direction ) {
+				return { x: -this._ry, y: 0 };
+			}
+			return { x: 0, y: -this._ry };
+		},
+
+		_setScrollPosition: function ( x, y ) {
+			var self = this,
+				sy = self._scalableSize,
+				distance = self._direction ? x : y,
+				dy = distance - sy,
+				di = parseInt( dy / self._cellSize, 10 ),
+				i = 0,
+				idx = 0,
+				replaceStartIdx = 0,
+				realRowCount = self._rowsPerView + 2,
+				rawView = self._$view[0];
+
+			if ( self._blockScroll ) {
+				if ( dy > 0 && distance >= -self._cellSize && self._scalableSize >= -self._cellSize ) {
+					self._overflowDir = _OVERFLOW_DIR_UP;
+				}
+				if ( dy < 0 && self._scalableSize <= -( self._maxSizeExceptClip + self._cellSize ) ) {
+					self._overflowDir = _OVERFLOW_DIR_DOWN;
+				}
+				return;
+			}
+
+			if ( ! self.options.rotation ) {
+				if ( dy > 0 && distance >= -self._cellSize && self._scalableSize >= -self._cellSize ) {
+					// top
+					self._stopMScroll();
+					self._scalableSize = -self._cellSize;
+					self._setElementTransform( -self._cellSize );
+					if ( self._overflowDir === _OVERFLOW_DIR_NONE ) {
+						self._overflowDir = _OVERFLOW_DIR_UP;
+					}
+					return;
+				}
+				if ( dy < 0 && self._scalableSize <= -( self._maxSizeExceptClip + self._cellSize ) ) {
+					// bottom
+					self._stopMScroll();
+					self._scalableSize = -( self._maxSizeExceptClip + self._cellSize );
+					self._setElementTransform( self._modifyViewPos );
+					if ( self._overflowDir === _OVERFLOW_DIR_NONE ) {
+						self._overflowDir = _OVERFLOW_DIR_DOWN;
+					}
+					return;
+				}
+			}
+
+			replaceStartIdx = ( Math.abs( di ) < realRowCount ) ? 0 : ( di > 0 ) ? di - realRowCount : di + realRowCount;
+			if ( di > 0 ) { // scroll up
+				for ( i = replaceStartIdx; i < di; ++i ) {
+					idx = -parseInt( ( sy / self._cellSize ) + i + 3, 10 );
+					self._replaceRow( rawView.lastChild, circularNum( idx, self._totalRowCnt ) );
+					rawView.insertBefore( rawView.lastChild, rawView.firstChild );
+				}
+			} else if ( di < 0 ) { // scroll down
+				for ( i = replaceStartIdx; i > di; --i ) {
+					idx = self._rowsPerView - parseInt( ( sy / self._cellSize ) + i, 10 );
+					self._replaceRow( rawView.firstChild, circularNum( idx, self._totalRowCnt ) );
+					rawView.insertBefore( rawView.firstChild, rawView.lastChild.nextSibling );
+				}
+			}
+			self._setScrollBarPosition( -di );
+			self._scalableSize += di * self._cellSize;
+			self._setElementTransform( distance - self._scalableSize - self._cellSize );
+		},
+
+		_setElementTransform : function ( value ) {
+			var self = this,
+				x = 0,
+				y = 0;
+
+			if ( self._direction ) {
+				x = value + "px";
+			} else {
+				y = value + "px";
+			}
+			self._setStyleTransform( self._$view, x, y );
+		},
+
+		//----------------------------------------------------//
+		//		Event handler		//
+		//----------------------------------------------------//
+		_handleMomentumScroll: function () {
+			var self = this,
+				opts = self.options,
+				keepGoing = false,
+				v = this._$view,
+				x = 0,
+				y = 0,
+				t = self._tracker;
+
+			if ( t ) {
+				t.update();
+				if ( self._direction ) {
+					x = t.getPosition();
+				} else {
+					y = t.getPosition();
+				}
+				keepGoing = !t.done();
+			}
+
+			self._setScrollPosition( x, y );
+			if ( !opts.rotation ) {
+				keepGoing = !t.done();
+				self._reservedPos = self._direction ? x : y;
+				// bottom
+				self._reservedPos = self._reservedPos <= (-(self._maxSizeExceptClip - self._modifyViewPos)) ? ( - ( self._maxSizeExceptClip + self._cellSize) ) : self._reservedPos;
+				// top
+				self._reservedPos = self._reservedPos > -self._cellSize ? -self._cellSize : self._reservedPos;
+			} else {
+				self._reservedPos = self._direction ? x : y;
+			}
+			self._$clip.trigger( self.options.updateEventName, [ { x: x, y: y } ] );
+
+			if ( keepGoing ) {
+				self._timerID = setTimeout( self._timerCB, self._timerInterval );
+			} else {
+				self._stopMScroll();
+			}
+		},
+
+		_startMScroll: function ( speedX, speedY ) {
+			var self = this;
+			if ( self._direction ) {
+				self._sx = self._reservedPos;
+			} else {
+				self._sy = self._reservedPos;
+			}
+			self._scrollView._startMScroll.apply( self, [ speedX, speedY ] );
+		},
+
+		_stopMScroll: function () {
+			this._scrollView._stopMScroll.apply( this );
+		},
+
+		_enableTracking: function () {
+			var self = this;
+			self._$view.bind( self._dragMoveEvt, self._dragMoveCB );
+			self._$view.bind( self._dragStopEvt, self._dragStopCB );
+			self._scrollView._enableTracking.apply( self );
+		},
+
+		_disableTracking: function () {
+			var self = this;
+			self._$view.unbind( self._dragMoveEvt, self._dragMoveCB );
+			self._$view.unbind( self._dragStopEvt, self._dragStopCB );
+			self._scrollView._disableTracking.apply( self );
+		},
+
+		_handleDragStart: function ( e, ex, ey ) {
+			var self = this;
+			self._scrollView._handleDragStart.apply( this, [ e, ex, ey ] );
+			self._eventPos = self._direction ? ex : ey;
+			self._nextPos = self._reservedPos;
+		},
+
+		_handleDragMove: function ( e, ex, ey ) {
+			var self = this,
+				dx = ex - self._lastX,
+				dy = ey - self._lastY,
+				x = 0,
+				y = 0,
+				diffFromStartPos = 0,
+				diffFromLastPos = 0,
+				opacity = 0,
+				overflowPos = 0,
+				overFlowTarget = null;
+
+			self._lastMove = getCurrentTime();
+			self._speedX = dx;
+			self._speedY = dy;
+
+			self._didDrag = true;
+
+			self._lastX = ex;
+			self._lastY = ey;
+
+			if ( self._direction ) {
+				self._movePos = ex - self._eventPos;
+				x = self._nextPos + self._movePos;
+				overflowPos = ex;
+			} else {
+				self._movePos = ey - self._eventPos;
+				y = self._nextPos + self._movePos;
+				overflowPos = ey;
+			}
+			self._showScrollBars();
+			self._setScrollPosition( x, y );
+			if ( self._overflowDir !== _OVERFLOW_DIR_NONE ) {
+				overFlowTarget = ( self._overflowDir === _OVERFLOW_DIR_UP ) ? self._overflowTop : self._overflowBottom;
+				if ( !self._overflowDisplayed ) {
+					self._overflowDisplayed = true;
+					self._overflowStartPos = overflowPos;
+				}
+				diffFromStartPos = ( overflowPos - self._overflowStartPos ) * self._overflowDir;
+				opacity = ( diffFromStartPos < 0 ) ?
+							0 : ( diffFromStartPos > self._overflowMaxDragDist ) ?
+								1 : ( diffFromStartPos / self._overflowMaxDragDist );
+				overFlowTarget.css( "opacity", opacity );
+			}
+
+			return false;
+		},
+
+		_handleDragStop: function ( e ) {
+			var self = this;
+
+			self._reservedPos = self._movePos ? self._nextPos + self._movePos : self._reservedPos;
+			self._scrollView._handleDragStop.apply( this, [ e ] );
+			if ( self._overflowDir !== _OVERFLOW_DIR_NONE ) {
+				self._overflowDir = _OVERFLOW_DIR_NONE;
+				self._hideVGOverflowIndicator();
+			}
+			return self._didDrag ? false : undefined;
+		},
+
+		_addBehaviors: function () {
+			var self = this;
+
+			// scroll event handler.
+			if ( self.options.eventType === "mouse" ) {
+				self._dragStartEvt = "mousedown";
+				self._dragStartCB = function ( e ) {
+					return self._handleDragStart( e, e.clientX, e.clientY );
+				};
+
+				self._dragMoveEvt = "mousemove";
+				self._dragMoveCB = function ( e ) {
+					return self._handleDragMove( e, e.clientX, e.clientY );
+				};
+
+				self._dragStopEvt = "mouseup";
+				self._dragStopCB = function ( e ) {
+					return self._handleDragStop( e, e.clientX, e.clientY );
+				};
+
+				self._$view.bind( "vclick", function ( e ) {
+					return !self._didDrag;
+				} );
+			} else { //touch
+				self._dragStartEvt = "touchstart";
+				self._dragStartCB = function ( e ) {
+					var t = e.originalEvent.targetTouches[0];
+					return self._handleDragStart( e, t.pageX, t.pageY );
+				};
+
+				self._dragMoveEvt = "touchmove";
+				self._dragMoveCB = function ( e ) {
+					var t = e.originalEvent.targetTouches[0];
+					return self._handleDragMove( e, t.pageX, t.pageY );
+				};
+
+				self._dragStopEvt = "touchend";
+				self._dragStopCB = function ( e ) {
+					return self._handleDragStop( e );
+				};
+			}
+			self._$view.bind( self._dragStartEvt, self._dragStartCB );
+
+			// other events.
+			self._$view.delegate( ".virtualgrid-item", "click", function ( event ) {
+				var $selectedItem = $( this );
+				$selectedItem.trigger( "select", this );
+			} );
+
+			$( window ).bind( "resize", function ( e ) {
+				var height = 0,
+					$virtualgrid = $( ".ui-virtualgrid-view" );
+				if ( $virtualgrid.length !== 0 ) {
+					self._resize();
+				}
+			} );
+
+			$( document ).one( "pageshow", function ( event ) {
+				var $page = $( self.element ).parents( ".ui-page" ),
+					$header = $page.find( ":jqmData(role='header')" ),
+					$footer = $page.find( ":jqmData(role='footer')" ),
+					$content = $page.find( ":jqmData(role='content')" ),
+					footerHeight = $footer ? $footer.height() : 0,
+					headerHeight = $header ? $header.height() : 0;
+
+				if ( $page && $content ) {
+					$content.height( window.innerHeight - headerHeight - footerHeight ).css( "overflow", "hidden" );
+					$content.addClass( "ui-virtualgrid-content" );
+				}
+			} );
+		},
+
+		//----------------------------------------------------//
+		//		Calculate size about dom element.		//
+		//----------------------------------------------------//
+		_calculateClipSize : function () {
+			var self = this,
+				clipSize = 0;
+
+			if ( self._direction ) {
+				clipSize = self._calculateClipWidth();
+			} else {
+				clipSize = self._calculateClipHeight();
+			}
+			return clipSize;
+		},
+
+		_calculateClipWidth : function () {
+			var self = this,
+				$parent = self._$clip.parent(),
+				paddingValue = 0,
+				clipSize = $( window ).width();
+
+			if ( self._inheritedSize.isDefinedWidth ) {
+				return self._inheritedSize.width;
+			}
+
+			if ( $parent.hasClass( "ui-content" ) ) {
+				paddingValue = parseInt( $parent.css( "padding-left" ), 10 );
+				clipSize = clipSize - ( paddingValue || 0 );
+				paddingValue = parseInt( $parent.css( "padding-right" ), 10 );
+				clipSize = clipSize - ( paddingValue || 0 );
+			} else {
+				clipSize = self._$clip.width();
+			}
+			return clipSize;
+		},
+
+		_calculateClipHeight : function () {
+			var self = this,
+				$parent = self._$clip.parent(),
+				header = null,
+				footer = null,
+				paddingValue = 0,
+				clipSize = $( window ).height();
+
+			if ( self._inheritedSize.isDefinedHeight ) {
+				return self._inheritedSize.height;
+			}
+
+			if ( !$parent.hasClass( "ui-content" ) ) {
+				$parent = $parent.hasClass( "ui-scrollview-view" ) ? $parent.parent() : null;
+			}
+
+			if ( $parent && $parent.length ) {
+				paddingValue = parseInt( $parent.css( "padding-top" ), 10 );
+				clipSize = clipSize - ( paddingValue || 0 );
+				paddingValue = parseInt( $parent.css( "padding-bottom" ), 10 );
+				clipSize = clipSize - ( paddingValue || 0 );
+				header = $parent.siblings( ".ui-header" );
+				footer = $parent.siblings( ".ui-footer" );
+
+				if ( header ) {
+					if ( header.outerHeight( true ) === null ) {
+						clipSize = clipSize - ( $( ".ui-header" ).outerHeight() || 0 );
+					} else {
+						clipSize = clipSize - header.outerHeight( true );
+					}
+				}
+				if ( footer ) {
+					clipSize = clipSize - footer.outerHeight( true );
+				}
+			} else {
+				clipSize = self._$clip.height();
+			}
+			return clipSize;
+		},
+
+		_calculateColumnSize : function () {
+			var self = this,
+				$tempBlock,
+				$cell;
+
+			$tempBlock = $( self._makeRows( 1 ) );
+			self._$view.append( $tempBlock.children().first() );
+			if ( self._direction ) {
+				// x-axis
+				self._viewSize = self._$view.width();
+				$cell = self._$view.children().first().children().first();
+				self._cellSize = $cell.outerWidth( true );
+				self._cellOtherSize = $cell.outerHeight( true );
+			} else {
+				// y-axis
+				self._viewSize = self._$view.height();
+				$cell = self._$view.children().first().children().first();
+				self._cellSize = $cell.outerHeight( true );
+				self._cellOtherSize = $cell.outerWidth( true );
+			}
+			$tempBlock.remove();
+			self._$view.children().remove();
+		},
+
+		_calculateColumnCount : function ( ) {
+			var self = this,
+				$view = self._$clip,
+				viewSize = self._direction ? $view.innerHeight() : $view.innerWidth(),
+				itemCount = 0 ;
+
+			if ( self._direction ) {
+				viewSize = viewSize - ( parseInt( $view.css( "padding-top" ), 10 ) + parseInt( $view.css( "padding-bottom" ), 10 ) );
+			} else {
+				viewSize = viewSize - ( parseInt( $view.css( "padding-left" ), 10 ) + parseInt( $view.css( "padding-right" ), 10 ) );
+			}
+
+			itemCount = parseInt( ( viewSize / self._cellOtherSize ), 10 );
+			return itemCount > 0 ? itemCount : 1 ;
+		},
+
+		// Read the position of clip form property ('webkit-transform').
+		// @return : number - position of clip.
+		_getClipPosition : function () {
+			var self = this,
+				matrix = null,
+				contents = null,
+				result = -self._cellSize,
+				$scrollview = self._$view.closest( ".ui-scrollview-view" );
+
+			if ( $scrollview ) {
+				matrix = $scrollview.css( "-webkit-transform" );
+				contents = matrix.substr( 7 );
+				contents = contents.substr( 0, contents.length - 1 );
+				contents = contents.split( ', ' );
+				result =  Math.abs( contents [5] );
+			}
+			return result;
+		},
+
+		//----------------------------------------------------//
+		//		DOM Element handle		//
+		//----------------------------------------------------//
+		_makeRows : function ( count ) {
+			var self = this,
+				index = 0,
+				row = null,
+				wrapper = null;
+
+			wrapper = self._createElement( "div" );
+			wrapper.setAttribute( "class", "ui-scrollview-view" );
+			for ( index = 0; index < count ; index += 1 ) {
+				row = self._makeRow( index );
+				if ( self._direction ) {
+					row.style.top = 0;
+					row.style.left = index * self._cellSize;
+				}
+				wrapper.appendChild( row );
+			}
+			return wrapper;
+		},
+
+		// make a single row block
+		_makeRow : function ( rowIndex ) {
+			var self = this,
+				index = rowIndex * self._itemCount,
+				colIndex = 0,
+				blockClassName = self._direction ? "ui-virtualgrid-wrapblock-x" : "ui-virtualgrid-wrapblock-y",
+				wrapBlock = self._createElement( "div" ),
+				strWrapInner = "",
+				attrName = self._direction ? "top" : "left";
+
+			for ( colIndex = 0; colIndex < self._itemCount; colIndex++ ) {
+				strWrapInner += self._makeHtmlData( index, colIndex, attrName );
+				index += 1;
+			}
+			wrapBlock.innerHTML = strWrapInner;
+			wrapBlock.setAttribute( "class", blockClassName );
+			wrapBlock.setAttribute( "row-index", String( rowIndex ) );
+			self._fragment.appendChild( wrapBlock );
+			return wrapBlock;
+		},
+
+		_makeHtmlData : function ( dataIndex, colIndex, attrName ) {
+			var self = this,
+				htmlStr = "",
+				itemData = null;
+
+			itemData = self._itemData( dataIndex );
+			if ( itemData ) {
+				htmlStr = self._getConvertedTmplStr( itemData );
+				htmlStr = self._insertPosToTmplStr( htmlStr, attrName, ( colIndex * self._cellOtherSize ) );
+			}
+
+			return htmlStr;
+		},
+
+		_insertPosToTmplStr : function ( tmplStr, attrName, posVal ) {
+			var tagCloseIdx = tmplStr.indexOf( '>' ),
+				classIdx = -1,
+				firstPart,
+				lastPart,
+				result,
+				found = false,
+				targetIdx = 0,
+				firstPartLen,
+				i = 0;
+
+			if ( tagCloseIdx === -1 ) {
+				return;
+			}
+
+			firstPart = tmplStr.slice( 0, tagCloseIdx );
+			lastPart = tmplStr.slice( tagCloseIdx, tmplStr.length );
+
+			classIdx = firstPart.indexOf( 'class' );
+
+			if ( classIdx !== -1 ) {
+				firstPartLen = firstPart.length;
+				for ( i = classIdx + 6; i < firstPartLen; i++ ) {
+					if ( firstPart.charAt( i ) === "\"" || firstPart.charAt( i ) === "\'" ) {
+						if ( found === false ) {
+							found = true;
+						} else {
+							targetIdx = i;
+							break;
+						}
+					}
+				}
+				result = firstPart.slice( 0, targetIdx ) + " virtualgrid-item" + firstPart.slice( targetIdx, firstPartLen ) + lastPart;
+			} else {
+				result = firstPart + " class=\"virtualgrid-item\"" + lastPart;
+			}
+
+			if ( !isNaN( posVal ) ) {
+				result = result.replace( '>', " style=\"" + attrName + ": " + String( posVal ) + "px\">");
+			}
+
+			return result;
+		},
+
+		_increaseRow : function ( num ) {
+			var self = this,
+				rotation = self.options.rotation,
+				totalRowCnt = self._totalRowCnt,
+				rowView = self._$view[ 0 ],
+				firstRow = null,
+				lastRow = rowView.lastChild,
+				row = null,
+				headRowIndex = 0,
+				tailRowIndex = 0,
+				i;
+
+			if ( !lastRow ) {
+				return;
+			}
+
+			tailRowIndex = parseInt( lastRow.getAttribute( "row-index" ), 10 );
+			if ( !rotation ) {
+				firstRow = rowView.firstChild;
+				headRowIndex = parseInt( firstRow.getAttribute( "row-index" ), 10 );
+			}
+
+			for ( i = 0 ; i < num ; ++i ) {
+				if ( tailRowIndex >= totalRowCnt - 1 && !rotation ) {
+					if ( headRowIndex == 0 ) {
+						break;
+					}
+
+					row = self._makeRow( --headRowIndex );
+					rowView.insertBefore( row, firstRow );
+					firstRow = row;
+				} else {
+					row = self._makeRow( circularNum( ++tailRowIndex, totalRowCnt ) );
+					rowView.appendChild( row );
+				}
+
+				if ( self._direction ) {
+					$( row ).width( self._cellSize );
+				} else {
+					$( row ).height( self._cellSize );
+				}
+			}
+		},
+
+		_decreaseRow : function ( num ) {
+			var self = this,
+				rowView = self._$view[ 0 ],
+				i;
+
+			for ( i = 0 ; i < num ; ++i ) {
+				rowView.removeChild( rowView.lastChild );
+			}
+		},
+
+		_replaceRows : function ( curCnt, prevCnt, maxCnt, clipPosition ) {
+			var self = this,
+				$rows = self._$view.children(),
+				prevRowIndex = 0,
+				rowIndex = 0,
+				diffRowCnt = 0,
+				targetCnt = 1,
+				filterCondition = ( self._filterRatio * self._cellSize ) + self._cellSize,
+				idx = 0;
+
+			if ( filterCondition < clipPosition ) {
+				targetCnt += 1;
+			}
+
+			prevRowIndex = parseInt( $( $rows[targetCnt] ).attr( "row-index" ), 10 );
+			if ( prevRowIndex === 0 ) {
+				// only top.
+				rowIndex = maxCnt - targetCnt;
+			} else {
+				rowIndex = Math.round( ( prevRowIndex * prevCnt ) / curCnt );
+				if ( rowIndex + self._rowsPerView >= maxCnt ) {
+					// only bottom.
+					rowIndex = maxCnt - self._rowsPerView;
+				}
+				diffRowCnt = prevRowIndex - rowIndex;
+				rowIndex -= targetCnt;
+			}
+
+			for ( idx = 0 ; idx < $rows.length ; idx += 1 ) {
+				self._replaceRow( $rows[idx], circularNum( rowIndex, self._totalRowCnt ) );
+				rowIndex++;
+			}
+			return -diffRowCnt;
+		},
+
+		_replaceRow : function ( block, index ) {
+			var self = this,
+				tempBlocks = null;
+
+			while ( block.hasChildNodes() ) {
+				block.removeChild( block.lastChild );
+			}
+
+			tempBlocks = self._makeRow( index );
+			while ( tempBlocks.children.length ) {
+				block.appendChild( tempBlocks.children[0] );
+			}
+			block.setAttribute( "row-index", tempBlocks.getAttribute( "row-index" ) );
+			tempBlocks.parentNode.removeChild( tempBlocks );
+		},
+
+		_createElement : function ( tag ) {
+			var element = document.createElement( tag );
+
+			this._fragment.appendChild( element );
+			return element;
+		},
+
+		_getObjectNames : function ( obj ) {
+			var properties = [],
+				name = "";
+
+			for ( name in obj ) {
+				properties.push( name );
+			}
+			this._properties = properties;
+		},
+
+		_getConvertedTmplStr : function ( data ) {
+			var self = this,
+				dataProperties = self._properties,
+				i = 0,
+				plainMsg,
+				ret = "";
+
+			if ( !data ) {
+				return ;
+			}
+
+			plainMsg = self._templateText;
+			for ( i = 0; i < dataProperties.length; i++ ) {
+				plainMsg = self._strReplace( plainMsg, "${" + dataProperties[ i ] + "}" , data[ dataProperties[ i ] ] );
+			}
+			plainMsg = self._changeImgSrcAriaAttrFromTmpl( plainMsg );
+
+			return plainMsg;
+		},
+
+		_changeImgSrcAriaAttrFromTmpl : function ( plainMsg ) {
+			var self = this,
+				ret = "",
+				targetTagIdx,
+				beforeTargetTag = "",
+				afterTargetTag = "",
+				imgFileName,
+				imgSrcSlashIdx,
+				temp,
+				srcRegExpResult;
+
+			temp = plainMsg;
+			targetTagIdx = temp.indexOf( "$ARIA-IMG-SRC-ALT$" );
+			while ( targetTagIdx !== -1 ) {
+				imgFileName = "";
+				beforeTargetTag = beforeTargetTag + temp.slice( 0, targetTagIdx + 19 );
+				afterTargetTag = temp.slice( targetTagIdx + 19, temp.length );
+				srcRegExpResult = afterTargetTag.match( imgTagSrcAttrRE );
+				if ( srcRegExpResult ) {
+					imgSrcSlashIdx = srcRegExpResult[0].lastIndexOf( "/" );
+					if ( imgSrcSlashIdx !== -1 ) {
+						imgFileName = srcRegExpResult[0].slice( imgSrcSlashIdx + 1, -1 );
+					}
+				}
+				beforeTargetTag = beforeTargetTag.replace( "$ARIA-IMG-SRC-ALT$", imgFileName );
+				temp = afterTargetTag;
+				targetTagIdx = temp.indexOf( "$ARIA-IMG-SRC-ALT$" );
+				ret = beforeTargetTag + afterTargetTag;
+			}
+
+			if ( ret === "" ) {
+				ret = plainMsg;
+			}
+
+			return ret;
+		},
+
+		_insertAriaAttrToTmpl : function ( plainMsg ) {
+			var ret = "",
+				targetTagIdx,
+				beforeTargetTag = "",
+				afterTargetTag = "",
+				temp;
+
+			temp = plainMsg.replace( "<div", "<div tabindex=\"0\" aria-selected=\"true\"" );
+			targetTagIdx = temp.indexOf( "<img" );
+			if ( targetTagIdx !== -1 ) {
+				while ( targetTagIdx !== -1 ) {
+					beforeTargetTag = beforeTargetTag + temp.slice( 0, targetTagIdx + 4 );
+					afterTargetTag = temp.slice( targetTagIdx + 4, temp.length );
+					beforeTargetTag = beforeTargetTag + " role=\"img\" alt=\"$ARIA-IMG-SRC-ALT$\"";
+					temp = afterTargetTag;
+					targetTagIdx = temp.indexOf( "<img" );
+					ret = beforeTargetTag + afterTargetTag;
+				}
+				temp = ret;
+				targetTagIdx = temp.indexOf( "<span" );
+				beforeTargetTag = "";
+				while ( targetTagIdx !== -1 ) {
+					beforeTargetTag = beforeTargetTag + temp.slice( 0, targetTagIdx + 5 );
+					afterTargetTag = temp.slice( targetTagIdx + 5, temp.length );
+					beforeTargetTag = beforeTargetTag + " aria-hidden=\"true\" tabindex=\"-1\"";
+					temp = afterTargetTag;
+					targetTagIdx = temp.indexOf( "<span" );
+					ret = beforeTargetTag + afterTargetTag;
+				}
+			}
+
+			if ( ret === "" ) {
+				ret = plainMsg;
+			}
+
+			return ret;
+		},
+
+		_strReplace : function ( plainMsg, stringToFind, stringToReplace ) {
+			var temp = plainMsg,
+				index = plainMsg.indexOf( stringToFind );
+			while ( index !== -1 ) {
+				temp = temp.replace( stringToFind, stringToReplace );
+				index = temp.indexOf( stringToFind );
+			}
+			return temp;
+		}
+
+	} );
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( ":jqmData(role='virtualgrid')" ).virtualgrid();
+	} );
+} ( jQuery, window, document ) );
+
+
+
+(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);
+
+
+
+/* ***************************************************************************
+ * 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>
+ *	Author: Koeun Choi <koeun.choi@samsung.com>
+ */
+
+/*
+ * Progress widget
+ *
+ * HTML Attributes
+ *
+ *  data-role: set to 'progress'.
+ *  data-style: 'circle' or 'pending'.
+ *
+ * APIs
+ *
+ *  show(): show the progress.
+ *  hide(): hide the progress.
+ *  running(boolean): start or stop the running.
+ *
+ * Events
+ *
+ *  N/A
+ *
+ * Examples
+ *
+ * <li data-role="list-divider">Progress Pending</li>
+ * <li>
+ *	<div data-role="progress" data-style="pending" id="pending"></div>
+ * </li>
+ * <li data-role="list-divider">Progress ~ing</li>
+ * <li>
+ *	<div data-role="progress" data-style="circle" id="progress"></div>Loading..
+ * </li>
+ *
+ * $("#pending").progress( "running", true );
+ * $("#progress").progress( "running", true );
+ *
+ */
+
+/**
+	@class Progress
+	The progress widget shows that an operation is in progress. <br/>To add a progress widget to the application, use the following code:
+
+		<div data-role="progress" data-style="circle"></div>
+*/
+/**
+	@property {String} data-style
+	Sets the style of the progress widget. The style options are pending (pending progress style) and circle (circular progress status style).
+*/
+/**
+	@method running
+	The running method is used to set the current running state of the pending or circular progress widget:
+
+		<div id="foo" data-role="progress" data-style="pending"></div>
+		$("#foo").progress("running", true);
+*/
+/**
+	@method show
+	The show method is used to show the pending or circular progress widget:
+
+		<div id="foo" data-role="progress" data-style="pending"></div>
+		$("#foo").progress("show");
+*/
+/**
+	@method hide
+	The show method is used to hide the pending or circular progress widget:
+
+		<div id="foo" data-role="progress" data-style="pending"></div>
+		$("#foo").progress("hide");
+*/
+
+(function ( $, window, undefined ) {
+	$.widget( "tizen.progress", $.mobile.widget, {
+		options: {
+			style: "circle",
+			running: false
+		},
+
+		show: function () {
+			$( this.element ).show();
+		},
+
+		hide: function () {
+			$( this.element ).hide();
+		},
+
+		_start: function () {
+			if ( !this.init ) {
+				$( this.element ).append( this.html );
+				this.init = true;
+			}
+
+			this.show();
+
+			$( this.element )
+				.find( ".ui-progress-" + this.options.style )
+				.addClass( this.runningClass );
+		},
+
+		_stop: function () {
+			$( this.element )
+				.find( ".ui-progress-" + this.options.style )
+				.removeClass( this.runningClass );
+		},
+
+		running: function ( running ) {
+			if ( running === undefined ) {
+				return this.options.running;
+			}
+
+			this._setOption( "running", running );
+		},
+
+		_setOption: function ( key, value ) {
+			if ( key === "running" ) {
+				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._start();
+			} else {
+				this._stop();
+			}
+		},
+
+		_create: function () {
+			var self = this,
+				element = this.element,
+				style = element.jqmData( "style" ),
+				_html,
+				runningClass;
+
+			if ( style ) {
+				this.options.style = style;
+			} else {
+				style = this.options.style;
+			}
+
+			if ( style == "circle" ) {
+				$( this.element ).addClass("ui-progress-container-circle");
+
+				_html =	'<div class="ui-progress-circle"></div>';
+			} else if ( style === "pending" ) {
+				$( this.element ).addClass("ui-progressbar");
+
+				_html = '<div class="ui-progressbar-bg">' +
+						'<div class="ui-progress-pending"></div>' +
+					'</div>';
+			}
+
+			this.html = $( _html );
+
+			runningClass = "ui-progress-" + style + "-running";
+
+			$.extend( this, {
+				init: false,
+				runningClass: runningClass
+			} );
+
+			if ( style === "pending" ) {
+				$( this.element ).append( this.html );
+				this.init = true;
+			}
+
+			this._refresh();
+		}
+	} ); /* End of widget */
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( e.target ).find( ":jqmData(role='progress')" ).progress();
+	} );
+}( jQuery, this ));
+
+
+
+/*
+ *
+ * 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,
+			source,
+			noSource = false,
+			htmlProto,
+			protoPath;
+
+		if ( ar.length == 2 ) {
+			namespace = ar[0];
+			widgetName = ar[1];
+
+			// If htmlProto is defined
+			if ( $[namespace][widgetName].prototype._htmlProto !== undefined ) {
+				// If no source is defined, use the widget name
+				source = $[namespace][widgetName].prototype._htmlProto.source;
+				if ( source === undefined ) {
+					source = widgetName;
+					noSource = true;
+				}
+
+				// Load the HTML prototype via AJAX if not defined inline
+				if ( typeof source === "string" ) {
+					if ( noSource ) {	// use external htmlproto file
+						// Establish the path for the proto file
+						widget = source;
+						protoPath = getProtoPath();
+
+						// Make the AJAX call
+						$.ajax( {
+							url: protoPath + "/" + widget + ".prototype.html",
+							async: false,
+							dataType: "html"
+						}).success( function (data, textStatus, jqXHR ) {
+							source = $( "<div></div>" ).html(data).jqmData( "tizen.widgetex.ajax.fail", false );
+						} );
+
+						// Assign the HTML proto to the widget prototype
+						source  = $( "<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 );
+
+					} else {
+						// inline definition (string)
+						source = $( source ).jqmData( "tizen.widgetex.ajax.fail", false );
+					}
+
+				} else {
+					// inline definition (object)
+					// AJAX loading has trivially succeeded, since there was no AJAX loading at all
+					source.jqmData( "tizen.widgetex.ajax.fail", false );
+				}
+				htmlProto = source;
+				$[namespace][widgetName].prototype._htmlProto.source = 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 ) );
+
+
+
+/*
+ * jQuery UI Progressbar @VERSION
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Licensed under the MIT license.
+ * 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 */
+
+
+/**
+	@class ProgressBar
+	The progress bar widget shows a control that indicates the progress percentage of an on-going operation. This widget can be scaled to fit inside a parent container.
+
+	To add a progress bar widget to the application, use the following code:
+
+		<div id="foo" data-role="progressbar"</div>
+*/
+/**
+	@event change
+	The progress bar can define a callback for the change event, which is fired when the progress value is changed:
+		<div id="foo" data-role="progressbar"></div>
+		$("#foo").bind("change", function (ev, val) {
+			Console.log("Value is changed to " + val);
+		});
+*/
+/**
+	@method value
+	You can use the value method with the pickers to set or get the current default progress bar value:
+
+		<div id="foo" data-role="progressbar"></div>
+		var oldVal = $("#foo").progressbar("value");
+		$("#foo").progressbar("value", 50);
+*/
+
+(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.valueDiv.wrap("<div class='ui-progressbar-bg'></div>");
+
+			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.element.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.element.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 ) );
+
+
+
+/*
+ * 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>
+ *          Hyunjung Kim <hjnim.kim@samsung.com>
+ */
+
+// Widget which turns a html element into a "swipe":
+// 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 swipe
+// also moves the cover back to the left.
+//
+// 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.
+//
+// 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.
+//
+
+/**
+	@class Swipe
+	The swipe widget shows a view on the screen where the items can be swiped vertically to show a menu.
+	To add a swipe widget to the application, use the following code:
+
+		<ul data-role="listview">
+			<li data-role="swipe">
+				<div data-role="swipe-cover">
+					<div data-role="button" data-inline="true">OK</div>
+					<div data-role="button" data-inline="true">Cancel</div>
+				</div>
+				<div data-role="swipe-item-cover">
+					<p>This is a swipe item cover.<br>
+						This will be swiped out when swipe event comes.</p>
+				</div>
+			</li>
+		</ul>
+
+	You can use methods with the swipe as described in the jQueryMobile documentation for view methods.
+*/
+/**
+	@property {String} data-role
+	Creates a swipe using the HTML unordered view (&gt;ul&lt;) element.
+	The default value is swipe.
+
+	Creates a swipe item cover using an HTML $gt;div$lt; element. This cover can be swiped to show the content beneath it.
+	The default value is swipe-item-cover.
+*/
+/**
+	@method open
+	uncover swipe item
+*/
+/**
+	@method close
+	cover swipe item
+*/
+/**
+	@method opened
+	return coveritem status( coverd or uncovred )
+*/
+/**
+	@event animationstart
+	The swipe can define a callback for the animationstart event, which is fired after a item is swipe and the swipe animation is start:
+*/
+/**
+	@event animationend
+	The swipe can define a callback for the animationend event, which is fired after a item is swiped and the swipe animation is complete:
+
+		<ul data-role="listview">
+		<li data-role="swipe">
+				<div data-role="swipe-cover">
+					<div data-role="button" data-inline="true">OK</div>
+					<div data-role="button" data-inline="true">Cancel</div>
+				</div>
+				<div data-role="swipe-item-cover" id="foo">
+				<p>This is a swipe item cover.<br>
+						This will be swiped out when swipe event comes.</p>
+				</div>
+			</li>
+		</ul>
+		$("#foo").bind("animationend", function (ev)
+		{
+			Console.log("Swipe cover's animation is complete.");
+		});
+*/
+(function ($) {
+
+	$.widget("tizen.swipe", $.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') ||
+				's';
+
+			this.options.theme = theme;
+			this._isopen = false;
+			this.refresh();
+		},
+
+		refresh: function () {
+			this._cleanupDom();
+
+			var self = this,
+				defaultCoverTheme,
+				covers,
+				coverTheme,
+				item,
+				itemHasThemeClass;
+
+			defaultCoverTheme = 'ui-body-' + this.options.theme;
+
+			if ( !this.element.parent().hasClass('ui-listview') ) {
+				this.element.parent().listview();
+			}
+			this.element.addClass('ui-swipe');
+
+			// get the item covers
+			covers = this.element.find(':jqmData(role="swipe-item-cover")');
+			item = this.element.find(':jqmData(role="swipe-item")');
+
+			this._covers = covers;
+			this._item = item;
+			item.addClass('ui-swipe-item');
+			coverTheme = defaultCoverTheme;
+			itemHasThemeClass = item.parent().attr('class')
+					.match(/ui\-body\-[a-z]|ui\-bar\-[a-z]/);
+
+			covers.each( function () {
+				var cover = $( this );
+
+				if ( itemHasThemeClass ) {
+					coverTheme = itemHasThemeClass[0];
+				}
+
+				cover.addClass('ui-swipe-item-cover');
+				cover.addClass( coverTheme );
+
+				if ( cover.has('.ui-swipe-item-cover-inner').length === 0 ) {
+					cover.wrapInner( $('<span/>').addClass('ui-swipe-item-cover-inner') );
+				}
+
+				if ( !( cover.data('animateRight') && cover.data('animateLeft') ) ) {
+					cover.data('animateRight', function () {
+						self._animateCover( cover, 110, item );
+					});
+
+					cover.data('animateLeft', function () {
+						self._animateCover( cover, 0, item );
+					});
+				}
+
+				// bind to synthetic events
+				item.bind( 'swipeleft', cover.data('animateLeft') );
+				cover.bind( 'swiperight', cover.data('animateRight') );
+				item.find( '.ui-btn' ).bind( 'vclick', cover.data('animateLeft') );
+			} );
+
+		},
+
+		_cleanupDom: function () {
+			var self = this,
+				defaultCoverTheme,
+				cover,
+				coverTheme = defaultCoverTheme,
+				item,
+				itemClass,
+				itemHasThemeClass,
+				text,
+				wrapper;
+
+			defaultCoverTheme = 'ui-body-' + this.options.theme;
+
+			this.element.removeClass('ui-swipe');
+
+			// get the item covers
+			cover = this.element.find(':jqmData(role="swipe-item-cover")');
+			item = this.element.find(':jqmData(role="swipe-item")');
+
+			item.removeClass('ui-swipe-item');
+			cover.removeClass('ui-swipe-item-cover');
+
+			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-swipe-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, item ) {
+			var self = this,
+				animationOptions = {
+					easing: 'linear',
+					duration: 'normal',
+					queue: true,
+					complete: function () {
+						cover.trigger('animationend');
+					}
+				};
+
+			$( this.element.parent() )
+				.find(":jqmData(role='swipe')")
+				.each(
+					function () {
+						if ( this !== self.element.get(0) &&
+								$( this ).swipe("opened") ) {
+							$( this ).swipe("close");
+						}
+					}
+				);
+
+			if ( leftPercentage == 110 ) {
+				this._isopen = true;
+			} else {
+				this._isopen = false;
+			}
+
+			cover.stop();
+			cover.clearQueue();
+			cover.trigger('animationstart');
+			cover.clearQueue().animate( { left: leftPercentage + '%' }, animationOptions );
+			if ( leftPercentage == 0 ) {
+				item.clearQueue().animate({ opacity: 0 }, "slow");
+			} else {
+				item.clearQueue().animate({ opacity: 1 }, "slow");
+			}
+
+		},
+
+		destroy: function () {
+			this._cleanupDom();
+		},
+
+		open: function () {
+			var self = this;
+
+			$( self._covers ).each( function () {
+				var cover = $( this );
+				self._animateCover( cover, 110, self._item);
+			} );
+		},
+
+		opened: function () {
+			return this._isopen;
+		},
+
+		close: function () {
+			var self = this;
+
+			$( self._covers ).each( function () {
+				var cover = $( this );
+				self._animateCover( cover, 0, self._item);
+			} );
+		}
+
+	});
+
+	$( document ).bind("pagecreate", function ( e ) {
+		$( e.target ).find(":jqmData(role='swipe')").swipe();
+	});
+
+}( 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 : "tabbar" plugin
+ * Copyright (c) jQuery Project
+ * Licensed under the MIT license.
+ * http://jquery.org/license
+ * Authors: Jinhyuk Jun <jinhyuk.jun@samsung.com>
+*/
+
+/**
+ *  Tabbar can be created using data-role = "tabbar" inside footer 
+ *  Framework determine which tabbar will display with tabbar attribute
+ *
+ * Examples:
+ *         
+ *     HTML markup for creating tabbar: ( 2 ~ 5 li item available )
+ *     icon can be changed data-icon attribute (customized icon need)
+ *         <div data-role="footer" data-position ="fixed">
+ *              <div data-role="tabbar">
+ *                     <ul>
+ *                            <li><a href="#" class="ui-btn-active">Menu</a></li>
+ *                            <li><a href="#">Save</a></li>
+ *                            <li><a href="#">Share</a></li>
+ *                     </ul>
+ *             </div>
+ *      </div>
+*/
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.tabbar", $.mobile.widget, {
+		options: {
+			iconpos: "top",
+			grid: null,
+			defaultList : 4,
+			initSelector: ":jqmData(role='tabbar')"
+		},
+
+		_create: function () {
+
+			var $tabbar = this.element,
+				$tabbtns,
+				textpos,
+				iconpos,
+				theme = $.mobile.listview.prototype.options.theme,	/* Get current theme */
+				ww = window.innerWidth || $( window ).width(),
+				wh = window.innerHeight || $( window ).height(),
+				tabbarDividerLeft = "<div class='ui-tabbar-divider ui-tabbar-divider-left'></div>",
+				tabbarDividerRight = "<div class='ui-tabbar-divider ui-tabbar-divider-right'></div>",
+				isLandscape;
+
+			isLandscape = ww > wh && ( ww - wh );
+
+			if ( isLandscape ) {
+				$tabbar.removeClass( "ui-portrait-tabbar" ).addClass( "ui-landscape-tabbar" );
+			} else {
+				$tabbar.removeClass( "ui-landscape-tabbar" ).addClass( "ui-portrait-tabbar" );
+			}
+
+			if ( $tabbar.find( "a" ).length ) {
+				$tabbtns = $tabbar.find( "a" );
+				iconpos = $tabbtns.filter( ":jqmData(icon)" ).length ? this.options.iconpos : undefined;
+				textpos = $tabbtns.html().length ? true : false;
+			}
+
+			if ( $tabbar.parents( ".ui-header" ).length && $tabbar.parents( ".ui-scrollview-view" ).length ) {
+				$tabbar.find( "li" ).addClass( "tabbar-scroll-li" );
+				$tabbar.find( "ul" ).addClass( "tabbar-scroll-ul" );
+
+				/* add shadow divider */
+				$( tabbarDividerLeft ).appendTo( $tabbar.parents( ".ui-scrollview-clip" ) );
+				$( tabbarDividerRight ).appendTo( $tabbar.parents( ".ui-scrollview-clip" ) );
+
+				$( ".ui-tabbar-divider-left" ).hide();
+				$( ".ui-tabbar-divider-right" ).hide();
+
+				/* add width calculation*/
+				if ( $tabbar.parents( ".ui-scrollview-view" ).data("default-list") ) {
+					this.options.defaultList = $tabbar.parents( ".ui-scrollview-view" ).data( "default-list" );
+				}
+				$tabbar.find( "li" ).css( "width", window.innerWidth / this.options.defaultList + "px" );
+			} else {
+				if ( $tabbar.find( "ul" ).children().length ) {
+					$tabbar.addClass( "ui-navbar" )
+						.find( "ul" )
+						.grid( { grid: this.options.grid } );
+				}
+			}
+
+			if ( $tabbar.parents( ".ui-footer" ).length  ) {
+				$tabbar.find( "li" ).addClass( "ui-tab-btn-style" );
+			}
+
+			/* title tabbar */
+			if ( $tabbar.siblings( ".ui-title" ).length ) {
+				$tabbar.parents( ".ui-header" ).addClass( "ui-title-tabbar" );
+			}
+
+			if ( !iconpos ) {
+				$tabbar.addClass( "ui-tabbar-noicons" );
+			}
+			if ( !textpos ) {
+				$tabbar.addClass( "ui-tabbar-notext" );
+			}
+			if ( textpos && iconpos ) {
+				$tabbar.parents( ".ui-header" ).addClass( "ui-title-tabbar-multiline" );
+			}
+
+			if ( $tabbar.find( "a" ).length ) {
+				$tabbtns.buttonMarkup({
+					corners:	false,
+					shadow:		false,
+					iconpos:	iconpos
+				});
+			}
+
+			if ( $tabbar.find( ".ui-state-persist" ).length ) {
+				$tabbar.addClass( "ui-tabbar-persist" );
+			}
+
+			$tabbar.delegate( "a", "vclick", function ( event ) {
+                                if ( $tabbtns.parents( "ul" ).is( ".tabbar-scroll-ul" ) ) {
+                                        $tabbtns.removeClass( "ui-tabbar-active" );
+                                        $( event.target ).parents( "a" ).addClass( "ui-tabbar-active" );
+
+                                } else {
+					$tabbtns.not( ".ui-state-persist" ).removeClass( $.mobile.activeBtnClass );
+					$( this ).addClass( $.mobile.activeBtnClass );
+				}
+			});
+
+			$tabbar.addClass( "ui-tabbar");
+
+			$( document ).bind( "pagebeforeshow", function ( event, ui ) {
+				var footer_filter = $( event.target ).find( ":jqmData(role='footer')" ),
+					tabbar_filter = footer_filter.find( ":jqmData(role='tabbar')" ),
+					$elFooterMore = tabbar_filter.siblings( ":jqmData(icon='naviframe-more')" ),
+					$elFooterBack = tabbar_filter.siblings( ".ui-btn-back" );
+
+				footer_filter
+					.css( "position", "fixed" )
+					.css( "bottom", 0 )
+					.css( "height", tabbar_filter.height() );
+				if ( $elFooterMore.length ) {
+					tabbar_filter.addClass( "ui-tabbar-margin-more" );
+				}
+				if ( $elFooterBack.length ) {
+					tabbar_filter.addClass( "ui-tabbar-margin-back" );
+				}
+			});
+
+			$tabbar.bind( "touchstart vmousedown", function ( e ) {
+				var $tabbarScroll = $( e.target ).parents( ".ui-scrollview-view" );
+				if ( $tabbarScroll.offset() ) {
+					if ( $tabbarScroll.offset().left < 0 ) {
+						$( ".ui-tabbar-divider-left" ).show();
+					} else {
+						$( ".ui-tabbar-divider-left" ).hide();
+					}
+					if ( ( $tabbarScroll.width() - $tabbarScroll.parents( ".ui-scrollview-clip" ).width() ) ==  Math.abs( $tabbarScroll.offset().left ) ) {
+						$( ".ui-tabbar-divider-right" ).hide();
+					} else {
+						$( ".ui-tabbar-divider-right" ).show();
+					}
+				}
+			});
+
+			this._bindTabbarEvents();
+			this._initTabbarAnimation();
+		},
+
+		_initTabbarAnimation: function () {
+			var isScrollingStart = false,
+				isScrollingEnd = false;
+			$( document ).bind( "scrollstart.tabbar", function ( e ) {
+				if ( $( e.target ).find( ".ui-tabbar" ).length ) {
+					isScrollingStart = true;
+					isScrollingEnd = false;
+				}
+			});
+
+			$( document ).bind( "scrollstop.tabbar", function ( e ) {
+				var $tabbarScrollview = $( e.target ),
+					$elTabbar = $( e.target ).find( ".ui-tabbar" ),
+					$elTabbarLI = $( e.target ).find( ".ui-tabbar li" ),
+					$minElement = $elTabbarLI.eq( 0 ),
+					minElementIndexVal,
+					minElementIndex = -1;
+
+				isScrollingEnd = true;
+				if ( $elTabbar.length && isScrollingStart == true ) {
+					minElementIndexVal = Math.abs( $elTabbarLI.eq( 0 ).offset().left );
+					$elTabbarLI.each( function ( i ) {
+						var offset	= $elTabbarLI.eq( i ).offset();
+
+						if ( Math.abs( offset.left ) < minElementIndexVal ) {
+							minElementIndexVal = Math.abs( offset.left );
+							minElementIndex = i;
+							$minElement = $elTabbarLI.eq( i );
+						}
+					});
+
+					if ( $tabbarScrollview.length && isScrollingStart == isScrollingEnd && minElementIndex != -1) {
+						isScrollingStart = false;
+						$tabbarScrollview.scrollview( "scrollTo", -( window.innerWidth / $elTabbar.data( "defaultList" ) * minElementIndex ) , 0, 357);
+					}
+				}
+
+				$( ".ui-tabbar-divider-left" ).hide();
+				$( ".ui-tabbar-divider-right" ).hide();
+			});
+		},
+
+		_bindTabbarEvents: function () {
+			var $tabbar = this.element;
+
+			$( window ).bind( "orientationchange", function ( e, ui ) {
+				var ww = window.innerWidth || $( window ).width(),
+					wh = window.innerHeight || $( window ).height(),
+					isLandscape = ww > wh && ( ww - wh );
+
+				if ( isLandscape ) {
+					$tabbar.removeClass( "ui-portrait-tabbar" ).addClass( "ui-landscape-tabbar" );
+				} else {
+					$tabbar.removeClass( "ui-landscape-tabbar" ).addClass( "ui-portrait-tabbar" );
+				}
+			});
+		},
+
+		_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.tabbar.prototype.options.initSelector, e.target ).tabbar();
+	});
+}( 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) );
+
+
+
+/*
+ * 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>
+ *			Hyunjung Kim <hjnim.kim@samsung.com>
+ */
+
+/*
+ * % Popupwindow widget do not use anymore(will be deprecated, internal use only)
+ *
+ *
+ * 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:
+ *	popupbeforeposition: triggered after a popup has completed preparations for opening, but has not yet opened
+ *	popupafteropen: triggered after a popup has completely opened
+ *	popupafterclose triggered when a popup has completely closed
+*/
+
+/**
+	class Popupwindow
+	The pop-up widget shows a list of items in a pop-up window in the middle of the screen. It automatically optimizes the pop-up window size within the screen.
+	To add a pop-up widget to the application, use the following code:
+
+		// Basic pop-up
+		<div id="center_info" data-role="popup" data-style="center_info">
+			<div data-role="text">
+				<p>
+				Pop-up dialog box, a child window that blocks user interaction in the parent window
+				</p>
+			</div>
+		</div>
+		// Pop-up with a title and button
+		<div id="center_title_1btn" data-role="popup" data-style="center_title_1btn">
+			<p data-role="title">
+				Pop-up title
+			</p>
+			<p data-role="text">
+				Pop-up dialog box
+			</p>
+		<div data-role="button-bg">
+			<input type="button" value="Text Button" />
+		</div>
+		</div>
+
+	The pop-up can define callbacks for events as described in the jQueryMobile documentation for pop-up events. <br/>You can use methods with the pop-up as described in the jQueryMobile documentation for pop-up methods.
+
+	@deprecated 2.0 verisons
+*/
+
+/**
+	@property {String} data-style
+	Defines the pop-up window style.
+	The following styles are available:
+
+	center_info: basic pop-up message
+	center_title: pop-up message with a title
+	center_basic_1btn: pop-up message with 1 button
+	center_basic_2btn: pop-up message with 2 horizontal buttons
+	center_title_1btn: pop-up message with a title and 1 button
+	center_title_2btn: pop-up message with a title and 2 horizontal buttons
+	center_title_3btn: pop-up message with a title and 3 horizontal buttons
+	center_button_vertical: pop-up message with vertical buttons
+	center_checkbox: pop-up message with a check box
+	center_liststyle_1btn>: pop-up message with a list and 1 button
+	center_liststyle_2btn: pop-up message with a list and 2 horizontal buttons
+	center_liststyle_3btn: pop-up message with a list and 3 horizontal buttons
+*/
+
+(function ( $, undefined ) {
+	$.widget( "tizen.popupwindow", $.tizen.widgetex, {
+		options: {
+			theme: null,
+			overlayTheme: "s",
+			style: "custom",
+			disabled: false,
+			shadow: true,
+			corners: true,
+			fade: false,
+			opacity: 0.7,
+			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>" ].join("")
+,			ui: {
+				screen: "#popupwindow-screen",
+				container: "#popupwindow-container"
+			}
+		},
+
+		_setStyle: function () {
+			var popup = this.element,
+				style = popup.attr( 'data-style' );
+
+			if ( style ) {
+				this.options.style = style;
+			}
+
+			popup.addClass( this.options.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')" )
+					.addClass( "popup-scroller-bg" );
+			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>" );
+		},
+
+		_create: function () {
+			console.warn("popupwindow() was deprecated. use popup() instead.");
+			var thisPage = this.element.closest(":jqmData(role='page')"),
+				self = this;
+
+			if ( thisPage.length === 0 ) {
+				thisPage = $("body");
+			}
+
+			this._ui.placeholder =
+					$( "<div><!-- placeholder for " + this.element.attr("id") + " --></div>" )
+					.css("display", "none")
+					.insertBefore( this.element );
+
+			thisPage.append( this._ui.screen );
+			this._ui.container.insertAfter( this._ui.screen );
+			this._ui.container.append( this.element );
+
+			this._setStyle();
+
+			this._isOpen = false;
+
+			this._ui.screen.bind( "vclick", function ( e ) {
+				self.close();
+				return false;
+			} );
+
+			this.element.bind( "vclick", function ( e ) {
+				if ( $( e.target ).is("ui-btn-ctxpopup-close") ) {
+					self.close();
+				}
+			} );
+		},
+
+		destroy: function () {
+			this.element.insertBefore( this._ui.placeholder );
+
+			this._ui.placeholder.remove();
+			this._ui.container.remove();
+			this._ui.screen.remove();
+			this.element.triggerHandler("destroyed");
+			$.Widget.prototype.destroy.call( this );
+		},
+
+		_placementCoords: function ( x, y, cw, ch ) {
+			var screenHeight = $( window ).height(),
+				screenWidth = $( window ).width(),
+				halfheight = ch / 2,
+				maxwidth = parseFloat( this._ui.container.css( "max-width" ) ),
+				roomtop = y,
+				roombot = screenHeight - y,
+				newtop,
+				newleft;
+
+			if ( roomtop > ch / 2 && roombot > ch / 2 ) {
+				newtop = y - halfheight;
+			} else {
+				newtop = roomtop > roombot ? screenHeight - ch - 30 : 30;
+			}
+
+			if ( cw < maxwidth ) {
+				newleft = ( screenWidth - cw ) / 2;
+			} else {
+				newleft = x - cw / 2;
+
+				if ( newleft < 10 ) {
+					newleft = 10;
+				} else if ( ( newleft + cw ) > screenWidth ) {
+					newleft = screenWidth - cw - 10;
+				}
+			}
+
+			return { x : newleft, y : newtop };
+		},
+
+		_setPosition: function ( x_where, y_where ) {
+			var x = ( undefined === x_where ? $( window ).width()  / 2 : x_where ),
+				y = ( undefined === y_where ? $( window ).height() / 2 : y_where ),
+				coords,
+				ctxpopup = this.element.data("ctxpopup"),
+				popupWidth,
+				menuHeight,
+				menuWidth,
+				screenHeight,
+				screenWidth,
+				roomtop,
+				roombot,
+				halfheight,
+				maxwidth,
+				newtop,
+				newleft;
+
+			if ( !ctxpopup ) {
+				popupWidth = $( window ).width() * this.options.widthRatio;
+				this._ui.container.css( "width", popupWidth );
+
+				if ( this._ui.container.outerWidth() > $( window ).width() ) {
+					this._ui.container.css( {"max-width" : $( window ).width() - 30} );
+				}
+			}
+
+			coords = this._placementCoords( x, y,
+					this._ui.container.outerWidth(),
+					this._ui.container.outerHeight() );
+
+			menuHeight = this._ui.container.innerHeight();
+			menuWidth = this._ui.container.innerWidth();
+			screenHeight = $( window ).height();
+			screenWidth = $( window ).width();
+			roomtop = y;
+			roombot = screenHeight - y;
+			halfheight = menuHeight / 2;
+			maxwidth = parseFloat( this._ui.container.css( "max-width" ) );
+			newtop = ( screenHeight - menuHeight ) / 2;
+
+			if ( !maxwidth || menuWidth < maxwidth ) {
+				newleft = ( screenWidth - menuWidth ) / 2;
+			} else {
+				newleft = x - menuWidth / 2;
+
+				if ( newleft < 30 ) {
+					newleft = 30;
+				} else if ( ( newleft + menuWidth ) > screenWidth ) {
+					newleft = screenWidth - menuWidth - 30;
+				}
+			}
+
+			if ( ctxpopup ) {
+				newtop = coords.y;
+				newleft = coords.x;
+			}
+
+			this._ui.container.css({
+				top: newtop,
+				left: newleft
+			});
+
+			this._ui.screen.css( "height", screenHeight );
+		},
+		open: function ( x_where, y_where, backgroundclose ) {
+			var self = this,
+				zIndexMax = 0;
+
+			if ( this._isOpen || this.options.disabled ) {
+				return;
+			}
+
+			$( 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.css( "height", $( window ).height() );
+
+			if ( backgroundclose ) {
+				this._ui.screen.css( "opacity", 0 )
+						.removeClass("ui-screen-hidden");
+			} else {
+				this._ui.removeClass("ui-screen-hidden");
+
+				if ( this.options.fade ) {
+					this._ui.screen.animate( {opacity: this.options.opacity}, "fast" );
+				} else {
+					this._ui.screen.css( {opacity: this.options.opacity} );
+				}
+			}
+
+			this._setPosition( x_where, y_where );
+
+			this.element.trigger("popupbeforeposition");
+
+			this._ui.container
+				.removeClass("ui-selectmenu-hidden")
+				.addClass("in")
+				.animationComplete( function () {
+					self.element.trigger("popupafteropen");
+				} );
+
+			this._isOpen = true;
+
+			if ( !this._reflow ) {
+				this._reflow = function () {
+					if ( !self._isOpen ) {
+						return;
+					}
+
+					self._setPosition( x_where, y_where );
+				};
+
+				$( window ).bind( "resize", this._reflow );
+			}
+		},
+
+		close: function () {
+			if ( !this._isOpen ) {
+				return;
+			}
+
+			if ( this._reflow ) {
+				$( window ).unbind( "resize", this._reflow );
+				this._reflow = null;
+			}
+
+			var self = this,
+				hideScreen = function () {
+					self._ui.screen.addClass("ui-screen-hidden");
+					self._isOpen = false;
+				};
+
+			this._ui.container.removeClass("in").addClass("reverse out");
+
+			if ( this.options.transition === "none" ) {
+				this._ui.container
+					.addClass("ui-selectmenu-hidden")
+					.removeAttr("style");
+				this.element.trigger("popupafterclose");
+			} else {
+				this._ui.container.animationComplete( function () {
+					self._ui.container
+						.removeClass("reverse out")
+						.addClass("ui-selectmenu-hidden")
+						.removeAttr("style");
+					self.element.trigger("popupafterclose");
+				} );
+			}
+
+			if ( this.options.fade ) {
+				this._ui.screen.animate( {opacity: 0}, "fast", hideScreen );
+			} else {
+				hideScreen();
+			}
+		},
+
+		_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 );
+			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();
+			}
+		}
+	});
+
+	$.tizen.popupwindow.bindPopupToButton = function ( btn, popup ) {
+		if ( btn.length === 0 || popup.length === 0 ) {
+			return;
+		}
+
+		var btnVClickHandler = function ( e ) {
+			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 );
+
+			return false;
+		};
+
+		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>
+ *			Hyunjung Kim <hjnim.kim@samsung.com>
+ */
+
+/*
+ * % ContextPopup widget do not use anymore(will be deprecated, internal use only)
+ */
+// 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.
+
+/**
+	class ContextPopup
+		The context pop-up widget shows a list of options and automatically optimizes its size within the screen. This widget is intended for a small list of options for a larger list, use the List widget. <br/>The context pop-up widget requires a target button, which must be clicked to open the context pop-up. In the default application theme, an arrow pointer is displayed at the top-left corner of the context pop-up widget when it is opened.<br/><br/> To add a context pop-up widget to the application, use the following code:
+
+			// Target button
+			<a href="#pop_3_icons" id="btn_3_icons" data-role="button" data-inline="true" data-rel="popupwindow">3 Icons</a>
+			// Context pop-up
+				<div class="horizontal" id="pop_3_icons" data-role="popupwindow" data-show-arrow="true">
+				<ul>
+					<li class="icon">
+						<a href="#" data-role="button" data-icon="call"></a>
+					</li>
+					<li class="icon">
+						<a href="#" data-role="button" data-icon="favorite"></a>
+					</li>
+					<li class="text">
+						<a href="#">Function</a>
+					</li>
+				</ul>
+			</div>
+	The context pop-up can define callbacks for events as described in the [jQueryMobile documentation for pop-up events.][1]
+	You can use methods with the context pop-up as described in the [jQueryMobile documentation for pop-up methods.][2]
+	[1]: http://jquerymobile.com/demos/1.2.0-alpha.1/docs/pages/popup/events.html
+	[2]: http://jquerymobile.com/demos/1.2.0-alpha.1/docs/pages/popup/methods.html
+
+	@deprecated 2.0 verisons
+*/
+
+(function ( $, undefined ) {
+	$.widget( "tizen.ctxpopup", $.tizen.widgetex, {
+		options: $.extend( {}, $.tizen.popupwindow.prototype.options, {
+			initSelector: ":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>" ].join("")
+,			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 () {
+			console.warn("ctxpopup() was deprecated. use popup() instead.");
+			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,
+				finalposition,
+				ret;
+			if (isHorizontal) {
+				orig.x = 0;
+			} else {
+				orig.y = 0;
+			}
+			if (arrow == 'b' && self._target_height) {
+				orig.y -= self._target_height;
+			}
+			if (arrow == 'r' && self._target_width) {
+				orig.x -= self._target_width;
+			}
+			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
+			finalposition = {
+				"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 - finalposition.x ) + Math.abs( y - finalposition.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 );
+			this.element.parents( ".ui-popupwindow" ).addClass( "ui-arrow-" + minDiffIdx );
+			return coords[minDiffIdx].actual;
+		}
+
+		return orig_placementCoords.call( this, x, y, cx, cy );
+	};
+
+	$.tizen.popupwindow.prototype.open = function ( x, y, target_width, target_height ) {
+		var ctxpopup = this.element.data( "ctxpopup" );
+
+		this._target_width = target_width;
+		this._target_height = target_height;
+
+		if ( ctxpopup ) {
+			this._setFade( false );
+			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, true );
+	};
+
+	//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 ) );
+
+
+
+/*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'
+ *	value: pre-set value. only accepts ISO date string. e.g) "2012-05-04", "2012-05-04T01:02:03+09:00" 
+ *	data-date: any date/time string "new Date()" accepts.
+ *
+ * Options:
+ *	type: 'date', 'datetime', 'time'
+ *	format: see data-format in HTML Attributes.
+ *	value: see value in HTML Attributes.
+ *	date: preset value as JavaScript Date Object representation.
+ *
+ * APIs:
+ *	value( datestring )
+ *		: Set date/time to 'datestring'.
+ *	value()
+ *		: Get current selected date/time as W3C DTF style string.
+ *	getValue() - replaced with 'value()'
+ *		: same as value()
+ *	setValue( datestring ) - replaced with 'value(datestring)'
+ *		: same as value( datestring )
+ *	changeTypeFormat( type, format ) - deprecated
+ *		: Change Type and Format options. use datetimepicker( "option", "format" ) instead
+ *
+ * Events:
+ *	date-changed: Raised when date/time was changed. Date-changed event will be deprecated
+ *
+ * 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("change", function() {
+ *			// your code
+ *    });
+ */
+
+/**
+	@class DateTimePicker
+	The picker widgets show a control that you can use to enter date and time values. <br/> To add a date time picker widget to the application, use the following code:
+
+			<li class="ui-li-dialogue ui-datetime">
+				<div class="ui-datetime-text-main">
+					<input type="datetime" data-format="MMM dd yyyy hh:mm:ss" name="demo-date" id="demo-date" />
+				</div>
+				<div class="ui-li-text-sub">Date/Time Picker
+					<span id="selected-date1"><em>(select a date first)</em></span>
+				</div>
+			</li>
+*/
+
+
+( function ( $, window, undefined ) {
+	$.widget( "tizen.datetimepicker", $.tizen.widgetex, {
+
+		options: {
+			type: null, // date, time, datetime applicable
+			format: null,
+			date: null,
+			initSelector: "input[type='date'], input[type='datetime'], input[type='time'], :jqmData(role='datetimepicker')"
+		},
+
+		container : null,
+
+		_calendar: function () {
+			return Globalize.culture().calendars.standard;
+		},
+
+		_value: {
+			attr: "data-" + ( $.mobile.ns || "" ) + "date",
+			signal: "date-changed"
+		},
+
+		_daysInMonth: [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ],
+
+		_isLeapYear: function ( year ) {
+			return year % 4 ? 0 : ( year % 100 ? 1 : ( year % 400 ? 0 : 1 ) );
+		},
+
+		_makeTwoDigits: function ( val ) {
+			var ret = val.toString(10);
+			if ( val < 10 ) {
+				ret = "0" + ret;
+			}
+			return ret;
+		},
+
+		_setType: function ( type ) {
+			//datetime, date, time
+			switch (type) {
+			case 'datetime':
+			case 'date':
+			case 'time':
+				this.options.type = type;
+				break;
+			default:
+				this.options.type = 'datetime';
+				break;
+			}
+
+			this.element.attr( "data-" + ( $.mobile.ns ? $.mobile.ns + "-" : "" ) + "type", this.options.type );
+			return this.options.type;
+		},
+
+		_setFormat: function ( format ) {
+			if ( this.options.format != format ) {
+				this.options.format = format;
+			} else {
+				return;
+			}
+
+			this.ui.children().remove();
+
+			var token = this._parsePattern( format ),
+				div = document.createElement('div'),
+				pat,
+				tpl,
+				tpl2,
+				period,
+				btn,
+				obj = this;
+
+			while ( token.length > 0 ) {
+				pat = token.shift();
+				tpl = '<span class="ui-btn-picker ui-datefield-%1"' +
+					'data-role="button" data-inline="true" data-pat="' + pat + '">%2</span>';
+				tpl2= '<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') );
+					break;
+				case 'mm': //00 01 ... 59
+				case 'm': //0 1 2 ... 59
+					if ( this.options.type == 'date' ) {
+						$(div).append( tpl.replace('%1', 'month') );
+					} else {
+						$(div).append( tpl.replace('%1', 'min') );
+					}
+					break;
+				case 'ss':
+				case 's':
+					$(div).append( tpl.replace('%1', 'sec') );
+					break;
+				case 'd': // day of month 5
+				case 'dd': // day of month(leading zero) 05
+					$(div).append( tpl.replace('%1', 'day') );
+					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') );
+					break;
+				case 'yy':	// year two digit
+				case 'yyyy': // year four digit
+					$(div).append( tpl.replace('%1', 'year') );
+					break;
+				case 't': //AM / PM indicator(first letter) A, P
+					// add button
+				case 'tt': //AM / PM indicator AM/PM
+					// add button
+					btn = '<a href="#" class="ui-datefield-period"' +
+						' data-role="button" data-inline="true">period</a>';
+					$(div).append( btn );
+					break;
+				case 'g':
+				case 'gg':
+					$(div).append( tpl.replace('%1', 'era').replace('%2', this._calendar().eras.name) );
+					break;
+				case '\t':
+					$(div).append( tpl2.replace('%1', 'tab')
+							.replace('%2', "<div class='ui-divider-1st'>&nbsp;</div>" +
+								"<div class='ui-divider-2nd'>&nbsp;</div>") );
+					break;
+				default : // string or any non-clickable object
+					$(div).append( tpl2.replace('%1', 'seperator').replace('%2', pat.split(/[\-\/]/).join("") ) );
+					break;
+				}
+			}
+
+			this.ui.append( div );
+			if ( this.options.date ) {
+				this._setDate( this.options.date );
+			}
+
+			this.ui.find('.ui-btn-picker').buttonMarkup();
+			this.ui.find('.ui-datefield-period').buttonMarkup().bind( 'vclick', function ( e ) {
+				obj._switchAmPm( obj );
+				return false;
+			});
+
+			this.element.attr( "data-" + ( $.mobile.ns ? $.mobile.ns + "-" : "" ) + "format", this.options.format );
+			return this.options.format;
+		},
+
+		_setDate: function ( newdate ) {
+			if ( typeof ( newdate ) == "string" ) {
+				newdate = new Date( newdate );
+			}
+
+			var fields = $('span,a', this.ui),
+				type,
+				fn,
+				$field,
+				btn,
+				i;
+
+			function getMonth() {
+				return newdate.getMonth() + 1;
+			}
+
+			for ( i = 0; i < fields.length; i++ ) {
+				$field = $(fields[i]);
+				type = $field.attr("class").match(/ui-datefield-([\w]*)/);
+				if ( !type ) {
+					type = "";
+				}
+				switch ( type[1] ) {
+				case 'hour':
+					fn = newdate.getHours;
+					break;
+				case 'min':
+					fn = newdate.getMinutes;
+					break;
+				case 'sec':
+					fn = newdate.getSeconds;
+					break;
+				case 'year':
+					fn = newdate.getFullYear;
+					break;
+				case 'month':
+					fn = getMonth;
+					break;
+				case 'day':
+					fn = newdate.getDate;
+					break;
+				case 'period':
+					fn = newdate.getHours() < 12 ? this._calendar().AM[0] : this._calendar().PM[0];
+					btn = $field.find( '.ui-btn-text' );
+					if ( btn.length == 0 ) {
+						$field.text(fn);
+					} else if ( btn.text() != fn ) {
+						btn.text( fn );
+					}
+					fn = null;
+					break;
+				default:
+					fn = null;
+					break;
+				}
+				if ( fn ) {
+					this._updateField( $field, fn.call( newdate ) );
+				}
+			}
+
+			this.options.date = newdate;
+
+			this._setValue( newdate );
+
+			this.element.attr( "data-" + ( $.mobile.ns ? $.mobile.ns + "-" : "" ) + "date", this.options.date );
+			return this.options.date;
+		},
+
+		destroy: function () {
+			if ( this.ui ) {
+				this.ui.remove();
+			}
+
+			if ( this.element ) {
+				this.element.show();
+			}
+		},
+
+		value: function ( val ) {
+			function timeStr( t, obj ) {
+				return obj._makeTwoDigits( t.getHours() ) + ':' +
+					obj._makeTwoDigits( t.getMinutes() ) + ':' +
+					obj._makeTwoDigits( t.getSeconds() );
+			}
+
+			function dateStr( d, obj ) {
+				return ( ( d.getFullYear() % 10000 ) + 10000 ).toString().substr(1) + '-' +
+					obj._makeTwoDigits( d.getMonth() + 1 ) + '-' +
+					obj._makeTwoDigits( d.getDate() );
+			}
+
+			var rvalue = null;
+			if ( val ) {
+				rvalue = this._setDate( val );
+			} else {
+				switch ( this.options.type ) {
+				case 'time':
+					rvalue = timeStr( this.options.date, this );
+					break;
+				case 'date':
+					rvalue = dateStr( this.options.date, this );
+					break;
+				default:
+					rvalue = dateStr( this.options.date, this ) + 'T' + timeStr( this.options.date, this );
+					break;
+				}
+			}
+			return rvalue;
+		},
+
+		setValue: function ( newdate ) {
+			console.warn( "setValue was deprecated. use datetimepicker('option', 'date', value) instead." );
+			return this.value( newdate );
+		},
+
+		/**
+		 * return W3C DTF string
+		 */
+		getValue: function () {
+			console.warn("getValue() was deprecated. use datetimepicker('value') instead.");
+			return this.value();
+		},
+
+		_updateField: function ( target, value ) {
+			if ( !target || target.length == 0 ) {
+				return;
+			}
+
+			if ( value == 0 ) {
+				value = "0";
+			}
+
+			var pat = target.jqmData( 'pat' ),
+				hour,
+				text,
+				self = this;
+
+			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;
+					}
+				}
+				hour = this._makeTwoDigits( hour );
+				text = hour;
+				break;
+			case 'm':
+			case 'M':
+			case 'd':
+			case 's':
+				text = value;
+				break;
+			case 'mm':
+			case 'dd':
+			case 'MM':
+			case 'ss':
+				text = this._makeTwoDigits( value );
+				break;
+			case 'MMM':
+				text = this._calendar().months.namesAbbr[ value - 1];
+				break;
+			case 'MMMM':
+				text = this._calendar().months.names[ value - 1 ];
+				break;
+			case 'yy':
+				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;
+				}
+				text = value;
+				break;
+			}
+
+			// to avoid reflow where its value isn't out-dated
+			if ( target.text() != text ) {
+				if ( target.hasClass("ui-datefield-selected") ) {
+					target.addClass("out");
+					this._new_value = text;
+
+					target.animationComplete( function () {
+						target.text( self._new_value);
+						target.addClass("in")
+							.removeClass("out");
+
+						target.animationComplete( function () {
+							target.removeClass("in").
+								removeClass("ui-datefield-selected");
+						});
+					});
+				} else {
+					target.text( text );
+				}
+			}
+		},
+
+		_switchAmPm: function ( obj ) {
+			if ( this._calendar().AM != null ) {
+				var date = new Date( this.options.date ),
+					text,
+					change = 1000 * 60 * 60 * 12;
+				if ( date.getHours() > 11 ) {
+					change = -change;
+				}
+				date.setTime( date.getTime() + change );
+				this._setDate( date );
+			}
+		},
+
+		_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]*\'$|[\w\W]/g,
+				matches,
+				i;
+
+			matches = pattern.match( regex );
+
+			for ( i = 0; i < matches.length; i++ ) {
+				if ( matches[i].charAt(0) == "'" ) {
+					matches[i] = matches[i].substr( 1, matches[i].length - 2 );
+				}
+			}
+
+			return matches;
+		},
+
+		changeTypeFormat: function ( type, format ) {
+			console.warn('changeTypeFormat() was deprecated. use datetimepicker("option", "type"|"format", value) instead');
+			if ( type ) {
+				this._setType( type );
+			}
+
+			if ( format ) {
+				this._setFormat( format );
+			}
+		},
+
+		_create: function () {
+			var obj = this;
+
+			if ( this.element.is( "input" ) ) {
+				( function ( obj ) {
+					var type, value, format;
+
+					type = obj.element.get(0).getAttribute( "type" );
+					obj.options.type = type;
+
+					value = obj.element.get(0).getAttribute( "value" );
+					if ( value ) {
+						obj.options.date = new Date( value );
+					}
+				}( this ) );
+			}
+
+			if ( !this.options.format ) {
+				switch ( this.options.type ) {
+				case 'datetime':
+					this.options.format = this._calendar().patterns.d + "\t" + this._calendar().patterns.t;
+					break;
+				case 'date':
+					this.options.format = this._calendar().patterns.d;
+					break;
+				case 'time':
+					this.options.format = this._calendar().patterns.t;
+					break;
+				}
+			}
+
+			if ( !this.options.date ) {
+				this.options.date = new Date();
+			}
+
+			this.element.hide();
+			this.ui = $('<div class="ui-datefield"></div>');
+			$(this.element).after( this.ui );
+
+			this._popup_open = false;
+			this.ui.bind('vclick', function ( e ) {
+				obj._showDataSelector( obj, this, e.target );
+			});
+
+			$.extend( this, {
+				_globalHandlers: [
+					{
+						src: $( window ),
+						handler: {
+							orientationchange: $.proxy( this, "_orientationHandler" )
+						}
+					}
+				]
+			});
+
+			$.each( this._globalHandlers, function( idx, value ) {
+				value.src.bind( value.handler );
+			});
+		},
+		_orientationHandler: function() {
+			var self = this;
+			if( self._popup_open ) {
+				self._popup_open = false;
+				self.container.popupwindow( 'close' );
+			}
+			return false;
+		},
+		_populateDataSelector: function ( field, pat ) {
+			var values,
+				numItems,
+				current,
+				data,
+				range = window.range,
+				local,
+				yearlb,
+				yearhb,
+				day;
+
+			switch ( field ) {
+			case 'hour':
+				if ( pat == 'H' || pat == 'HH' ) {
+					// twentyfour
+					values = range( 0, 23 );
+					data = range( 0, 23 );
+					current = this.options.date.getHours();
+				} else {
+					values = range( 1, 12 );
+					current = this.options.date.getHours() - 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( this._makeTwoDigits );
+				}
+				numItems = values.length;
+				break;
+			case 'min':
+			case 'sec':
+				values = range( 0, 59 );
+				if ( pat.length == 2 ) {
+					values = values.map( this._makeTwoDigits );
+				}
+				data = range( 0, 59 );
+				current = ( field == 'min' ? this.options.date.getMinutes() : this.options.date.getSeconds() );
+				numItems = values.length;
+				break;
+			case 'year':
+				yearlb = 1900;
+				yearhb = 2100;
+				data = range( yearlb, yearhb );
+				current = this.options.date.getFullYear() - 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( this._makeTwoDigits );
+					break;
+				case 3:
+					values = this._calendar().months.namesAbbr.slice();
+					break;
+				case 4:
+					values = this._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 = this.options.date.getMonth();
+				numItems = values.length;
+				break;
+			case 'day':
+				day = this._daysInMonth[ this.options.date.getMonth() ];
+				if ( day == 28 ) {
+					day += this._isLeapYear( this.options.date.getFullYear() );
+				}
+				values = range( 1, day );
+				if ( pat.length == 2 ) {
+					values = values.map( this._makeTwoDigits );
+				}
+				data = range( 1, day );
+				current = this.options.date.getDate() - 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 ? attr.match(/ui-datefield-([\w]*)/) : undefined,
+				pat,
+				data,
+				values,
+				numItems,
+				current,
+				valuesData,
+				html,
+				datans,
+				$ul,
+				$div,
+				$ctx,
+				$li,
+				i,
+				newLeft = 10,
+				self = this;
+
+			if ( !attr ) {
+				return;
+			}
+			if ( !field ) {
+				return;
+			}
+			if ( this._popup_open ) {
+				return;
+			}
+
+			target.not('.ui-datefield-seperator').addClass('ui-datefield-selected');
+
+			pat = target.jqmData('pat');
+			data = obj._populateDataSelector.call( obj, field[1], pat );
+
+			values = data.values;
+			numItems = data.numItems;
+			current = data.current;
+			valuesData = data.data;
+
+			if ( values ) {
+				datans = "data-" + ($.mobile.ns ? ($.mobile.ns + '-') : "") + 'val="';
+				for ( i = 0; i < values.length; i++ ) {
+					html += '<li><a class="ui-link" ' + datans + valuesData[i] + '">' + values[i] + '</a></li>';
+				}
+
+				$ul = $("<ul></ul>");
+				$div = $('<div class="ui-datetimepicker-selector" data-transition="fade" data-fade="false"></div>');
+				$div.append( $ul ).appendTo( ui );
+				$ctx = $div.ctxpopup();
+				$ctx.parents('.ui-popupwindow').addClass('ui-datetimepicker');
+				$li = $(html);
+				$( $li[current] ).addClass("current");
+				$div.jqmData( "list", $li );
+				$div.circularview();
+				if( !obj._reflow ) {
+					obj._reflow = function() {
+						$div.circularview( "reflow" );
+						$div.circularview( 'centerTo', '.current', 0 );
+					}
+					$(window).bind( "resize" , obj._reflow );
+				}
+				if( !obj._close ) {
+					obj._close = function() {
+						$div.trigger( "popupafterclose" );
+					}
+					$(window).bind( "navigate", obj._close );
+				}
+				$ctx.popupwindow( 'open',
+						target.offset().left + ( target.width() / 2 ) - window.pageXOffset ,
+						target.offset().top + target.height() - window.pageYOffset, target.width(), target.height() );
+
+				this.container = $ctx;
+				this._popup_open = true;
+
+				$div.bind('popupafterclose', function ( e ) {
+					if ( obj._reflow ) {
+						$(window).unbind( "resize", obj._reflow );
+						obj._reflow = null;
+					}
+
+					if ( obj._close ) {
+						$(window).unbind( "navigate", obj._close );
+						obj._close = null;
+					}
+
+					if ( !( target.hasClass("in") || target.hasClass("out") ) ) {
+						target.removeClass("ui-datefield-selected");
+					}
+
+					$div.unbind( 'popupafterclose' );
+					$ul.unbind( 'vclick' );
+					$(obj).unbind( 'update' );
+					$ctx.popupwindow( 'destroy' );
+					$div.remove();
+
+					self._popup_open = false;
+				});
+
+				$(obj).bind( 'update', function ( e, val ) {
+					var date = new Date( this.options.date ),
+						month,
+						date_calibration = function () {
+							date.setDate( 1 );
+							date.setDate( date.getDate() - 1 );
+						};
+
+					switch ( field[1] ) {
+					case 'min':
+						date.setMinutes( val );
+						break;
+					case 'hour':
+						date.setHours( val );
+						break;
+					case 'sec':
+						date.setSeconds( val );
+						break;
+					case 'year':
+						month = date.getMonth();
+						date.setFullYear( val );
+
+						if ( date.getMonth() != month ) {
+							date_calibration();
+						}
+						break;
+					case 'month':
+						date.setMonth( val - 1 );
+
+						if ( date.getMonth() == val ) {
+							date_calibration();
+						}
+						break;
+					case 'day':
+						date.setDate( val );
+						break;
+					}
+
+					obj._setDate( date );
+
+					$ctx.popupwindow( 'close' );
+				});
+
+				$ul.bind( 'click', 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
+					}
+				});
+
+				$div.circularview( 'centerTo', '.current', 500 );
+				$div.bind( 'scrollend' , function ( e ) {
+					if ( !obj._reflow ) {
+						obj._reflow = function () {
+							$div.circularview("reflow");
+						};
+						$(window).bind("resize", obj._reflow);
+					}
+				});
+			}
+			return ui;
+		}
+
+	});
+
+	$(document).bind("pagecreate create", function ( e ) {
+		$($.tizen.datetimepicker.prototype.options.initSelector, e.target)
+			.not(":jqmData(role='none'), :jqmData(role='nojs')")
+			.datetimepicker();
+	});
+
+} ( jQuery, this ) );
+
+
+(function($){$.tizen.frameworkData.pkgVersion="0.2.50";}(jQuery));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_fullscreen_off.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_fullscreen_off.png
new file mode 100644
index 0000000..0ae6360
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_fullscreen_off.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_fullscreen_on.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_fullscreen_on.png
new file mode 100644
index 0000000..0390c0d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_fullscreen_on.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_off.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_off.png
new file mode 100644
index 0000000..2cdbe98
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_off.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_off_handler.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_off_handler.png
new file mode 100755
index 0000000..5a0fd80
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_off_handler.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_on.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_on.png
new file mode 100644
index 0000000..ce76c31
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_on.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_on_handler.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_on_handler.png
new file mode 100755
index 0000000..aeb582d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_on_handler.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_on_off_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_on_off_bg.png
new file mode 100755
index 0000000..8e52220
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_on_off_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_pause.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_pause.png
new file mode 100644
index 0000000..034e700
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_pause.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_play.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_play.png
new file mode 100644
index 0000000..812d5cc
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_play.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_radio_activated.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_radio_activated.png
new file mode 100644
index 0000000..24e8741
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_radio_activated.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_radio_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_radio_bg.png
new file mode 100644
index 0000000..fd590c7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_radio_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_radio_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_radio_press.png
new file mode 100644
index 0000000..11fa3b0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_radio_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_radio_press_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_radio_press_bg.png
new file mode 100644
index 0000000..405592b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_button_radio_press_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_check_activated.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_check_activated.png
new file mode 100644
index 0000000..c2a6b3c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_check_activated.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_check_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_check_bg.png
new file mode 100644
index 0000000..80d1dc9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_check_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_check_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_check_press.png
new file mode 100644
index 0000000..44b86f1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_check_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_check_press_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_check_press_bg.png
new file mode 100644
index 0000000..b268899
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_check_press_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_effect_title_tab_bounce_left.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_effect_title_tab_bounce_left.png
new file mode 100644
index 0000000..5109e64
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_effect_title_tab_bounce_left.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_effect_title_tab_bounce_right.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_effect_title_tab_bounce_right.png
new file mode 100644
index 0000000..973210d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_effect_title_tab_bounce_right.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_grid_overscrolling_bottom.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_grid_overscrolling_bottom.png
new file mode 100644
index 0000000..46bb9b8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_grid_overscrolling_bottom.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_grid_overscrolling_left.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_grid_overscrolling_left.png
new file mode 100644
index 0000000..2fb5ef5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_grid_overscrolling_left.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_grid_overscrolling_right.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_grid_overscrolling_right.png
new file mode 100644
index 0000000..6d08148
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_grid_overscrolling_right.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_grid_overscrolling_top.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_grid_overscrolling_top.png
new file mode 100644
index 0000000..d0ba116
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_grid_overscrolling_top.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_icon_favorite_off.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_icon_favorite_off.png
new file mode 100644
index 0000000..143d98b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_icon_favorite_off.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_icon_favorite_on.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_icon_favorite_on.png
new file mode 100644
index 0000000..d96088f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_icon_favorite_on.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_list_process_01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_list_process_01.png
new file mode 100644
index 0000000..bc8b3f2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_list_process_01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_messagebubble_bg_receive.9.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_messagebubble_bg_receive.9.png
new file mode 100644
index 0000000..d26b30c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_messagebubble_bg_receive.9.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_messagebubble_bg_sent.9.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_messagebubble_bg_sent.9.png
new file mode 100644
index 0000000..fce4a80
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_messagebubble_bg_sent.9.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_messagebubble_date_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_messagebubble_date_bg.png
new file mode 100644
index 0000000..b5e2381
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_messagebubble_date_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_overscrolling_bottom.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_overscrolling_bottom.png
new file mode 100644
index 0000000..2cee976
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_overscrolling_bottom.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_overscrolling_top.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_overscrolling_top.png
new file mode 100644
index 0000000..dd1b91c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_overscrolling_top.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_scroll_bar_handler.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_scroll_bar_handler.png
new file mode 100644
index 0000000..8fd4d4e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_scroll_bar_handler.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_scroll_bar_handler_hor.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_scroll_bar_handler_hor.png
new file mode 100644
index 0000000..7168770
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_scroll_bar_handler_hor.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_splite_handler_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_splite_handler_h.png
new file mode 100644
index 0000000..dfcc1b9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_splite_handler_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_splite_handler_v.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_splite_handler_v.png
new file mode 100644
index 0000000..2ced25b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/00_splite_handler_v.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_field_btn_clear.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_field_btn_clear.png
new file mode 100644
index 0000000..eff4c22
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_field_btn_clear.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_field_btn_clear_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_field_btn_clear_press.png
new file mode 100644
index 0000000..778108e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_field_btn_clear_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_search_icon.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_search_icon.png
new file mode 100644
index 0000000..c634b56
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_search_icon.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_button_brightness_01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_button_brightness_01.png
new file mode 100644
index 0000000..8f9214f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_button_brightness_01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_button_brightness_02.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_button_brightness_02.png
new file mode 100644
index 0000000..0df85e0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_button_brightness_02.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_button_volume_01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_button_volume_01.png
new file mode 100644
index 0000000..1f41023
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_button_volume_01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_button_volume_02.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_button_volume_02.png
new file mode 100644
index 0000000..0f6f7f4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_button_volume_02.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_handle.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_handle.png
new file mode 100644
index 0000000..3a64686
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_handle.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_handle_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_handle_press.png
new file mode 100644
index 0000000..ecb7e42
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_handle_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_popup_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_popup_bg.png
new file mode 100644
index 0000000..ef0a56e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/00_slider_popup_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_back.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_back.png
new file mode 100644
index 0000000..7618371
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_back.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_back_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_back_press.png
new file mode 100644
index 0000000..7618371
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_back_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_call.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_call.png
new file mode 100644
index 0000000..5b837fd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_call.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_call_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_call_press.png
new file mode 100644
index 0000000..5b837fd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_call_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_check.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_check.png
new file mode 100644
index 0000000..8df9a9c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_check.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_check_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_check_press.png
new file mode 100644
index 0000000..8df9a9c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_check_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_cancel.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_cancel.png
new file mode 100644
index 0000000..a5b5639
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_cancel.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_cancel_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_cancel_press.png
new file mode 100644
index 0000000..a5b5639
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_cancel_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_closed.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_closed.png
new file mode 100644
index 0000000..452209d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_closed.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_closed_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_closed_press.png
new file mode 100644
index 0000000..452209d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_closed_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_minus.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_minus.png
new file mode 100644
index 0000000..0f0170f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_minus.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_minus_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_minus_press.png
new file mode 100644
index 0000000..0f0170f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_minus_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_opened.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_opened.png
new file mode 100644
index 0000000..5b5cbd0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_opened.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_opened_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_opened_press.png
new file mode 100644
index 0000000..5b5cbd0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_opened_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_send.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_send.png
new file mode 100644
index 0000000..521b4b2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_send.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_send_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_send_press.png
new file mode 100644
index 0000000..521b4b2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_expand_send_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_gear.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_gear.png
new file mode 100644
index 0000000..8e4b359
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_gear.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_gear_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_gear_press.png
new file mode 100644
index 0000000..8e4b359
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_gear_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_grid.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_grid.png
new file mode 100644
index 0000000..ca6b769
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_grid.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_grid_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_grid_press.png
new file mode 100644
index 0000000..ca6b769
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_grid_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_home.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_home.png
new file mode 100644
index 0000000..1ba3820
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_home.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_home_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_home_press.png
new file mode 100644
index 0000000..1ba3820
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_home_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_info.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_info.png
new file mode 100644
index 0000000..1e5d984
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_info.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_info_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_info_press.png
new file mode 100644
index 0000000..1e5d984
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_info_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_left.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_left.png
new file mode 100644
index 0000000..b4eca6d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_left.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_left_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_left_press.png
new file mode 100644
index 0000000..b4eca6d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_left_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_plus.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_plus.png
new file mode 100644
index 0000000..12cbe29
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_plus.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_plus_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_plus_press.png
new file mode 100644
index 0000000..12cbe29
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_plus_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_refresh.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_refresh.png
new file mode 100644
index 0000000..33ff934
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_refresh.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_refresh_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_refresh_press.png
new file mode 100644
index 0000000..33ff934
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_refresh_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_rename.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_rename.png
new file mode 100644
index 0000000..e3603b8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_rename.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_rename_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_rename_press.png
new file mode 100644
index 0000000..e3603b8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_rename_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_right.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_right.png
new file mode 100644
index 0000000..659ea76
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_right.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_right_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_right_press.png
new file mode 100644
index 0000000..659ea76
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_right_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_search.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_search.png
new file mode 100644
index 0000000..12f4714
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_search.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_search_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_search_press.png
new file mode 100644
index 0000000..12f4714
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_search_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_star.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_star.png
new file mode 100644
index 0000000..f608394
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_star.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_star_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_star_press.png
new file mode 100644
index 0000000..f608394
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_star_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_warning.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_warning.png
new file mode 100644
index 0000000..4a39960
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_warning.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_warning_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_warning_press.png
new file mode 100644
index 0000000..4a39960
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_button_warning_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_icon_jump.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_icon_jump.png
new file mode 100644
index 0000000..3692cbd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_icon_jump.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_icon_jump_left.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_icon_jump_left.png
new file mode 100644
index 0000000..9c299ac
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_icon_jump_left.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_icon_jump_left_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_icon_jump_left_press.png
new file mode 100644
index 0000000..9c299ac
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_icon_jump_left_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_icon_jump_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_icon_jump_press.png
new file mode 100644
index 0000000..3692cbd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/controls/button/00_icon_jump_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_Back.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_Back.png
new file mode 100644
index 0000000..815a343
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_Back.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_Back_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_Back_press.png
new file mode 100644
index 0000000..fcbc346
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_Back_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_SIP_close_press_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_SIP_close_press_web.png
new file mode 100644
index 0000000..5d036a3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_SIP_close_press_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_SIP_close_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_SIP_close_web.png
new file mode 100644
index 0000000..76f10ec
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_SIP_close_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_cancel_press_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_cancel_press_web.png
new file mode 100644
index 0000000..872ad33
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_cancel_press_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_cancel_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_cancel_web.png
new file mode 100644
index 0000000..3c37e96
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_cancel_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_delete_press_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_delete_press_web.png
new file mode 100644
index 0000000..829c8b0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_delete_press_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_delete_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_delete_web.png
new file mode 100644
index 0000000..d105c7b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_delete_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_done_press_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_done_press_web.png
new file mode 100644
index 0000000..b56c0f1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_done_press_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_done_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_done_web.png
new file mode 100644
index 0000000..7b58fc4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_done_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_edit_press_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_edit_press_web.png
new file mode 100644
index 0000000..b52b2b6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_edit_press_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_edit_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_edit_web.png
new file mode 100644
index 0000000..a56d1f6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_edit_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_more.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_more.png
new file mode 100644
index 0000000..95f17c7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_more.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_more_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_more_press.png
new file mode 100644
index 0000000..d4d6951
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_more_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_plus_press_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_plus_press_web.png
new file mode 100644
index 0000000..f15fb71
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_plus_press_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_plus_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_plus_web.png
new file mode 100644
index 0000000..d49406f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_plus_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_search_press_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_search_press_web.png
new file mode 100644
index 0000000..464c5c7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_search_press_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_search_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_search_web.png
new file mode 100644
index 0000000..7788bec
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_search_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_select_all_press_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_select_all_press_web.png
new file mode 100644
index 0000000..32ae22e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_select_all_press_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_select_all_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_select_all_web.png
new file mode 100644
index 0000000..ce4af60
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/images/page/00_icon_select_all_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/theme.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/theme.js
new file mode 100644
index 0000000..c20cf94
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/theme.js
@@ -0,0 +1,82 @@
+(function( $, undefined ) {
+//$.mobile.page.prototype.options.backBtnTheme	= "s";
+
+if ($.mobile.page) {
+// Clear default theme for child elements
+$( function ( o ) {
+	o.headerTheme = "s";
+	o.footerTheme = "s";
+} ( $.mobile.page.prototype.options ) );
+}
+
+if ($.mobile.listview) {
+// clear listview
+( function ( o ) {
+	o.theme = "s";
+	o.countTheme = "s";
+	o.headerTheme = "s";
+	o.dividerTheme = "s";
+	o.splitTheme = "s";
+} ( $.mobile.listview.prototype.options ) );
+}
+
+if ($.mobile.collapsible) {
+// Collapsible
+( function ( o ) {
+	o.heading = o.heading + ',li';		// Add listitem as a heading
+	o.inset = false;
+	o.iconPos = "right";	// Move iconPos to right position
+	o.collapsedIcon = "arrow-u";
+	o.expandedIcon = "arrow-d";
+	o.animation = true;
+	o.customEventHandler = function ( isCollapse ) {
+		var self = this,
+			c = $(self).children('.ui-collapsible-content')[0];
+
+		function _getHeight( el ) {
+			var h = 0,
+				heading = $( el ).children('.ui-collapsible-heading')[0],
+				content = $( el ).children('.ui-collapsible-content')[0];
+
+			h += heading.clientHeight;
+			$( content ).children().each ( function ( idx, _el ) {
+				if ( $( _el ).hasClass( 'ui-collapsible' ) ) {	// recursive call for nested collapsible list
+					h += _getHeight( _el );
+
+				} else {
+					h += _el.clientHeight;
+				}
+			} );
+			return h;
+		}
+
+		if ( isCollapse ) {
+			$( c ).data( 'max-height', _getHeight( self ) );
+		} else {
+			if ( ! $( c ).data( 'max-height' ) ) {
+				$( c ).data( 'max-height', document.body.clientHeight );
+			}
+			$( c ).css( 'max-height', $( c ).data( 'max-height' ) );
+		}
+	};
+} ( $.mobile.collapsible.prototype.options ) );
+}
+
+if ($.mobile.button) {
+//clear button theme
+$.mobile.button.prototype.options.theme = "s";
+$.fn.buttonMarkup.defaults.theme = "s";
+}
+
+if ($.mobile.page) {
+// Default theme swatch
+$.mobile.page.prototype.options.theme = "s";
+}
+
+if ($.tizen.frameworkData) {
+// Original scale of the theme
+$.tizen.frameworkData.defaultViewportWidth = 360;	// Fit to device-width
+$.tizen.frameworkData.defaultFontSize = 22;
+}
+
+})(jQuery);
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/tizen-web-ui-fw-theme.css b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/tizen-web-ui-fw-theme.css
new file mode 100644
index 0000000..33e8b22
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-black/tizen-web-ui-fw-theme.css
@@ -0,0 +1,12260 @@
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/***************************************************************************
+                    Header / Footer
+                    NavigationBar
+***************************************************************************/
+.ui-bar-s {
+  border: none;
+  background: #313f66;
+  /* Header Background */
+
+  color: #fafafa;
+  font-family: Tizen, Helvetica;
+  font-weight: bold;
+  font-size: 1.2727272727272727rem;
+}
+.ui-bar-s .ui-link-inherit {
+  color: #fafafa;
+}
+.ui-bar-s > .ui-btn.ui-btn-back,
+.ui-bar-s > .ui-btn.ui-btn-footer-down {
+  background: transparent;
+  position: absolute;
+  right: 0px;
+}
+.ui-bar-s > .ui-btn.ui-btn-back .ui-icon-header-back-btn,
+.ui-bar-s > .ui-btn.ui-btn-footer-down .ui-icon-header-back-btn {
+  top: 0.36363636363636365rem;
+  left: auto;
+  right: 0.5909090909090909rem;
+  margin-top: 0px;
+}
+.ui-bar-s > .ui-btn.ui-btn-footer-down {
+  border: none;
+  box-shadow: none;
+}
+.ui-bar-s > .ui-btn.ui-btn-footer-down .ui-icon {
+  top: 0.36363636363636365rem;
+  margin-top: 0px;
+}
+/* Header style */
+.ui-header.ui-bar-s {
+  position: fixed;
+  top: 0px;
+  min-height: 2.1818181818181817rem;
+  /* header button position : need to press area more... */
+
+}
+.ui-header.ui-bar-s .ui-title {
+  display: inline-block;
+  color: #fafafa;
+  min-height: 1.1363636363636365rem;
+  max-height: 1.4090909090909092rem;
+  /* temporary UX strange */
+
+  font-size: 1.1363636363636365rem;
+  font-weight: 500;
+  /* tizen font weight tuning */
+
+  text-overflow: ellipsis;
+  text-shadow: 0px 2px rgba(0, 0, 0, 0.75);
+  overflow: hidden;
+  white-space: nowrap;
+  outline: 0 !important;
+  text-align: left;
+  margin: 0.4545454545454546rem 0.5909090909090909rem 0.4090909090909091rem 0.5909090909090909rem;
+  /* text align center tuning */
+
+}
+.ui-header.ui-bar-s > .ui-btn .ui-btn-inner.ui-btn-icon-only,
+.ui-header.ui-bar-s > .naviframe-button.ui-btn .ui-btn-inner.ui-btn-icon-only {
+  -o-box-sizing: border-box;
+  -ms-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  height: 100%;
+}
+.ui-header.ui-bar-s > .ui-btn .ui-btn-inner.ui-btn-icon-only .ui-icon,
+.ui-header.ui-bar-s > .naviframe-button.ui-btn .ui-btn-inner.ui-btn-icon-only .ui-icon {
+  top: 0px;
+  left: 0px;
+}
+.ui-header.ui-bar-s > .naviframe-button.ui-btn .ui-btn-inner .ui-icon {
+  margin-top: 0px;
+}
+.ui-header.ui-bar-s > .ui-btn:not(.ui-btn-icon-notext) .ui-btn-inner.ui-btn-icon-only,
+.ui-header.ui-bar-s > .naviframe-button.ui-btn:not(.ui-btn-icon-notext) .ui-btn-inner.ui-btn-icon-only {
+  padding-left: 0px;
+}
+.ui-header.ui-bar-s > .ui-btn:not(.ui-btn-icon_only),
+.ui-header.ui-bar-s > .naviframe-button.ui-btn:not(.ui-btn-icon_only) {
+  width: 2.8181818181818183rem;
+  height: 2.1818181818181817rem;
+  padding: 0px;
+  top: 0px;
+  border-left-width: 1px;
+  border-left-style: solid;
+  border-left-color: rgba(255, 255, 255, 0.3);
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+}
+.ui-header.ui-bar-s > .ui-btn:not(.ui-btn-icon_only) .ui-btn-inner,
+.ui-header.ui-bar-s > .naviframe-button.ui-btn:not(.ui-btn-icon_only) .ui-btn-inner {
+  padding: 0;
+  padding-top: 0rem;
+  padding-bottom: 0rem;
+  margin-top: 0.5454545454545454rem;
+  margin-bottom: 0.5454545454545454rem;
+}
+.ui-header.ui-bar-s > .ui-btn:not(.ui-btn-icon_only) .ui-btn-inner .ui-btn-text,
+.ui-header.ui-bar-s > .naviframe-button.ui-btn:not(.ui-btn-icon_only) .ui-btn-inner .ui-btn-text {
+  font-size: 0.7272727272727273rem;
+}
+.ui-header.ui-bar-s > .ui-btn:not(.ui-btn-icon_only).ui-btn-down-s,
+.ui-header.ui-bar-s > .naviframe-button.ui-btn:not(.ui-btn-icon_only).ui-btn-down-s {
+  background-color: #2b3aaf;
+}
+.ui-header.ui-bar-s > .ui-btn.ui-btn-back,
+.ui-header.ui-bar-s > .ui-btn.ui-btn-footer-down {
+  right: 0.5909090909090909rem;
+}
+.ui-header.ui-bar-s > .ui-btn.ui-btn-back .ui-icon-header-back-btn,
+.ui-header.ui-bar-s > .ui-btn.ui-btn-footer-down .ui-icon-header-back-btn {
+  left: 0px;
+}
+.ui-header.ui-bar-s img {
+  position: absolute;
+  display: inline-block;
+  height: 1rem;
+  width: 1rem;
+  margin-left: 0.5909090909090909rem;
+  margin-top: 0.5909090909090909rem;
+}
+.ui-header.ui-bar-s .ui-title-text-sub {
+  position: absolute;
+  top: 1.3181818181818181rem;
+  left: 0.5909090909090909rem;
+  font-size: 0.7272727272727273rem;
+  font-weight: 500;
+  text-shadow: 0px 2px rgba(0, 0, 0, 0.75);
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  overflow: hidden;
+}
+.ui-header.ui-bar-s > .ui-btn,
+.ui-header.ui-bar-s > .naviframe-button.ui-btn {
+  position: absolute;
+  top: 0.4090909090909091rem;
+  font-size: 0.8181818181818182rem;
+  margin-top: 0px;
+  height: 1.5454545454545454rem;
+  width: 1.5454545454545454rem;
+  padding-left: 0.5909090909090909rem;
+  padding-right: 0.5909090909090909rem;
+  background: transparent;
+  color: #fafafa;
+}
+.ui-header.ui-bar-s.ui-title-tabbar > .ui-btn {
+  top: 0.36363636363636365rem;
+}
+.ui-header.ui-bar-s > .ui-btn.ui-btn-icon_only,
+.ui-header.ui-bar-s > .naviframe-button.ui-btn.ui-btn-icon_only {
+  top: 0.36363636363636365rem;
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  border-left-width: 1px;
+  border-left-style: solid;
+  border-left-color: rgba(255, 255, 255, 0.3);
+  border-top-left-radius: 0px;
+  border-bottom-left-radius: 0px;
+}
+.ui-header.ui-bar-s .ui-btn-right-0 {
+  right: 0rem;
+}
+.ui-header.ui-bar-s .ui-btn-right-1 {
+  right: 2.6363636363636362rem;
+}
+.ui-header.ui-bar-s > .ui-btn:not(.ui-btn-icon_only):nth-child(2),
+.ui-header.ui-bar-s > .naviframe-button.ui-btn:not(.ui-btn-icon_only):nth-child(2) {
+  right: 0rem;
+}
+.ui-header.ui-bar-s > .ui-btn:not(.ui-btn-icon_only):nth-child(3),
+.ui-header.ui-bar-s > .naviframe-button.ui-btn:not(.ui-btn-icon_only):nth-child(3) {
+  right: 2.8181818181818183rem;
+}
+.ui-header.ui-bar-s > img + h1 {
+  padding-left: 1.3636363636363638rem;
+}
+.ui-header.ui-bar-s > img + h1 + .ui-btn:not(.ui-btn-icon_only):nth-child(3),
+.ui-header.ui-bar-s > img + h1 + .naviframe-button.ui-btn:not(.ui-btn-icon_only):nth-child(3) {
+  right: 0rem;
+}
+.ui-header.ui-bar-s > img + h1 + .ui-btn:not(.ui-btn-icon_only):nth-child(3) + .ui-btn:not(.ui-btn-icon_only),
+.ui-header.ui-bar-s > img + h1 + .naviframe-button.ui-btn:not(.ui-btn-icon_only):nth-child(3) + .naviframe-button.ui-btn:not(.ui-btn-icon_only) {
+  right: 2.8181818181818183rem;
+}
+.ui-header.ui-bar-s > img + h1 + span.ui-title-text-sub + .ui-btn:not(.ui-btn-icon_only):nth-child(4),
+.ui-header.ui-bar-s > img + h1 + span.ui-title-text-sub + .naviframe-button.ui-btn:not(.ui-btn-icon_only):nth-child(4) {
+  right: 0rem;
+}
+.ui-header.ui-bar-s > img + h1 + span.ui-title-text-sub + .ui-btn:not(.ui-btn-icon_only):nth-child(4) + .ui-btn:not(.ui-btn-icon_only),
+.ui-header.ui-bar-s > img + h1 + span.ui-title-text-sub + .naviframe-button.ui-btn:not(.ui-btn-icon_only):nth-child(4) + .naviframe-button.ui-btn:not(.ui-btn-icon_only) {
+  right: 2.8181818181818183rem;
+}
+.ui-header.ui-bar-s > .ui-btn.ui-btn-down-s {
+  background: #313f66;
+  color: #3b73b6;
+}
+.ui-header.ui-bar-s.ui-title-multiline img {
+  margin-top: 0.6818181818181819rem;
+  /* tuning */
+
+}
+.ui-header.ui-bar-s.ui-title-multiline .ui-title {
+  min-height: 1.0909090909090908rem;
+  max-height: 1.0909090909090908rem;
+  /* temporary UX strange */
+
+  font-size: 1rem;
+  margin: 0.18181818181818182rem 0.5909090909090909rem 1rem 0.5909090909090909rem;
+}
+.ui-header.ui-bar-s.ui-title-multiline img + .ui-title + .ui-title-text-sub {
+  left: 1.9090909090909092rem;
+}
+.ui-footer.ui-bar-s {
+  height: 2.2272727272727275rem;
+  text-align: center;
+  bottom: 0px;
+  background: #464c5e;
+}
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-back,
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-footer-down,
+.ui-footer.ui-bar-s > [data-icon="naviframe-more"] {
+  background: transparent;
+}
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-back > .ui-btn-icon-only,
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-footer-down > .ui-btn-icon-only,
+.ui-footer.ui-bar-s > [data-icon="naviframe-more"] > .ui-btn-icon-only {
+  width: 2.5454545454545454rem;
+  height: 2.2272727272727275rem;
+  padding: 0px;
+  -webkit-box-shadow: none /* temp code */
+;
+}
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-back,
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-footer-down {
+  top: 0px;
+}
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-footer-down .ui-icon {
+  left: auto;
+  right: 0.5909090909090909rem;
+}
+.ui-footer.ui-bar-s [data-icon="naviframe-more"] {
+  position: absolute;
+  left: 0rem;
+  top: 0rem;
+  box-shadow: none;
+  border-width: 0px;
+}
+.ui-footer.ui-bar-s [data-icon="naviframe-more"] .ui-icon-naviframe-more {
+  left: 0.5909090909090909rem;
+  top: 0.36363636363636365rem;
+  margin-top: 0px;
+}
+.ui-footer.ui-bar-s [data-icon="naviframe-more"] .ui-btn-inner {
+  border: none;
+  background: transparent;
+  box-shadow: none;
+}
+.ui-footer.ui-bar-s > [data-role="button"] {
+  font-size: 0.9090909090909092rem;
+  font-weight: bold;
+  color: #fafafa;
+  background-image: none;
+  border-width: 0px;
+}
+.ui-footer.ui-bar-s > [data-role="button"] > .ui-btn-inner {
+  padding-top: 0px;
+  padding-bottom: 0px;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] {
+  margin-left: auto;
+  margin-right: auto;
+  margin-top: 0.2272727272727273rem;
+  margin-bottom: 0.2272727272727273rem;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"] {
+  background: transparent;
+  vertical-align: middle;
+  border-style: solid;
+  border-color: rgba(255, 255, 255, 0.3);
+  border-top-width: 0px;
+  border-bottom-width: 0px;
+  border-left-width: 1px;
+  border-right-width: 1px;
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+  border-radius: 0px !important;
+  box-shadow: none;
+  padding: 0px;
+  margin-left: -0.18181818181818182rem;
+  margin-right: -0.2272727272727273rem;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"].ui-btn-hover-s,
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"].ui-btn-up-s {
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"].ui-btn-down-s,
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"] .ui-btn-active-s {
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"].ui-btn-down-s .ui-btn-inner,
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"] .ui-btn-active-s .ui-btn-inner {
+  background: #464c5e;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"].ui-btn-down-s .ui-btn-inner .ui-btn-text,
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"] .ui-btn-active-s .ui-btn-inner .ui-btn-text {
+  color: #fafafa;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"] > .ui-btn-inner {
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+  border: 0px solid;
+  box-shadow: none;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"] .ui-btn-text {
+  vertical-align: middle;
+  font-size: 0.7727272727272727rem;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"].ui-corner-right {
+  border-right-width: 0px;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"].ui-corner-left {
+  border-left-width: 0px;
+}
+.ui-footer.ui-bar-s > [data-role="button"]:not([data-icon="naviframe-more"]) {
+  top: 0px;
+  padding: 0.5454545454545454rem 0px;
+}
+.ui-footer.ui-bar-s > p {
+  margin-top: 0.36363636363636365rem;
+  margin-bottom: 0.36363636363636365rem;
+}
+.ui-footer.ui-bar-s > h1,
+.ui-footer.ui-bar-s h2,
+.ui-footer.ui-bar-s h3,
+.ui-footer.ui-bar-s h4,
+.ui-footer.ui-bar-s h5,
+.ui-footer.ui-bar-s h6 {
+  display: inline-block;
+}
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-box-s {
+  box-shadow: none;
+  bottom: 0px;
+  -o-border-radius: 0em ! important;
+  -ms-border-radius: 0em ! important;
+  -moz-border-radius: 0em ! important;
+  -webkit-border-radius: 0em ! important;
+  border-radius: 0em ! important;
+}
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-box-s .ui-btn-inner {
+  -o-border-radius: 0em ! important;
+  -ms-border-radius: 0em ! important;
+  -moz-border-radius: 0em ! important;
+  -webkit-border-radius: 0em ! important;
+  border-radius: 0em ! important;
+}
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-down-s.ui-btn-box-s:not([data-icon="naviframe-more"]) {
+  background-color: #2a39ac !important;
+}
+.ui-footer.ui-bar-s > .ui-footer-btn-border > .ui-btn-inner {
+  border-left: 2px solid rgba(255, 255, 255, 0.2);
+}
+/***************************************************************************
+                    Content Top calculate
+***************************************************************************/
+.ui-content {
+  position: relative;
+  top: 0;
+}
+/***************************************************************************
+                    Content Top calculate
+***************************************************************************/
+.ui-body-s {
+  border: 1px solid #2a2a2a;
+  background: #000000;
+  color: #fafafa;
+  font-weight: normal;
+  font-family: Tizen, Helvetica;
+}
+.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-box-s {
+  padding: 0.045454545454545456rem;
+}
+.ui-btn.ui-btn-corner-all.ui-btn-box-s .ui-btn-inner {
+  -o-border-radius: 1.2rem;
+  -ms-border-radius: 1.2rem;
+  -moz-border-radius: 1.2rem;
+  -webkit-border-radius: 1.2rem;
+  border-radius: 1.2rem;
+}
+.ui-ctxpopup .ui-btn-box-s.ui-btn-up-s,
+.ui-ctxpopup .ui-btn-box-s.ui-btn-hover-s {
+  background: transparent !important;
+  border: none;
+  box-shadow: none;
+  padding: 0;
+  color: white !important;
+}
+.ui-ctxpopup .ui-btn-box-s.ui-btn-down-s {
+  background: #2b3aaf !important;
+  border: none;
+  box-shadow: none;
+  padding: 0;
+  color: white !important;
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+}
+.ui-ctxpopup .ui-btn-box-s .ui-btn-inner {
+  background: transparent ! important;
+  box-shadow: none;
+  border: none;
+}
+.ui-ctxpopup .ui-btn-down-s {
+  background: #2b3aaf !important;
+}
+.ui-header .ui-btn-box-s,
+.ui-footer .ui-btn-box-s,
+.ui-btn-back.ui-btn-up-s,
+.ui-btn-back.ui-btn-hover-s,
+.ui-btn-back.ui-btn-down-s,
+.ui-btn-footer-down.ui-btn-up-s,
+.ui-btn-footer-down.ui-btn-hover-s,
+.ui-btn-footer-down.ui-btn-down-s,
+.ui-popup-container .ui-btn-box-s {
+  font-weight: normal;
+  -o-border-radius: 0.9 rem;
+  -ms-border-radius: 0.9 rem;
+  -moz-border-radius: 0.9 rem;
+  -webkit-border-radius: 0.9 rem;
+  border-radius: 0.9 rem;
+}
+.ui-btn-box-s.ui-btn-hover-s.ui-btn-corner-circle {
+  -o-border-radius: 1em ! important;
+  -ms-border-radius: 1em ! important;
+  -moz-border-radius: 1em ! important;
+  -webkit-border-radius: 1em ! important;
+  border-radius: 1em ! important;
+}
+.ui-btn-box-s.ui-btn-hover-s.ui-btn-round {
+  -o-border-radius: 1.2em ! important;
+  -ms-border-radius: 1.2em ! important;
+  -moz-border-radius: 1.2em ! important;
+  -webkit-border-radius: 1.2em ! important;
+  border-radius: 1.2em ! important;
+}
+.ui-btn-box-s.ui-btn-down-s .ui-btn-inner {
+  /*        background: @color_button_press;*/
+
+  color: #ffffff;
+}
+.ui-btn-up-s,
+.ui-btn-hover-s,
+.ui-btn-down-s {
+  font-family: Tizen, Helvetica;
+  text-decoration: none;
+}
+/*
+/* 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: #fafafa;
+  cursor: pointer;
+  text-decoration: none;
+  background: #2736a4;
+  outline: none;
+}
+.ui-btn-active a.ui-link-inherit {
+  color: #fafafa;
+}
+/* corner rounding classes
+-----------------------------------------------------------------------------------------------------------*/
+.ui-corner-tl {
+  -moz-border-radius-topleft: 0.3em;
+  -webkit-border-top-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+}
+.ui-corner-tr {
+  -moz-border-radius-topright: 0.3em;
+  -webkit-border-top-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
+.ui-corner-bl {
+  -moz-border-radius-bottomleft: 0.3em;
+  -webkit-border-bottom-left-radius: 0.3em;
+  border-bottom-left-radius: 0.3em;
+}
+.ui-corner-br {
+  -moz-border-radius-bottomright: 0.3em;
+  -webkit-border-bottom-right-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+}
+.ui-corner-top {
+  -moz-border-radius-topleft: 0.3em;
+  -webkit-border-top-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+  -moz-border-radius-topright: 0.3em;
+  -webkit-border-top-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
+.ui-corner-bottom {
+  -moz-border-radius-bottomleft: 0.3em;
+  -webkit-border-bottom-left-radius: 0.3em;
+  border-bottom-left-radius: 0.3em;
+  -moz-border-radius-bottomright: 0.3em;
+  -webkit-border-bottom-right-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+}
+.ui-corner-right {
+  -moz-border-radius-topright: 0.3em;
+  -webkit-border-top-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+  -moz-border-radius-bottomright: 0.3em;
+  -webkit-border-bottom-right-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+}
+.ui-corner-left {
+  -moz-border-radius-topleft: 0.3em;
+  -webkit-border-top-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+  -moz-border-radius-bottomleft: 0.3em;
+  -webkit-border-bottom-left-radius: 0.3em;
+  border-bottom-left-radius: 0.3em;
+}
+.ui-corner-none {
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+}
+/*************************************************************************** 
+                    Icon (Naviframe)
+***************************************************************************/
+.ui-header .ui-btn .ui-btn-icon-only .ui-icon,
+.ui-footer .ui-btn .ui-btn-icon-only .ui-icon {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+}
+.ui-btn-back .ui-btn-inner .ui-icon-header-back-btn,
+.ui-btn-footer-down .ui-btn-inner .ui-icon {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+}
+.ui-btn-up-s {
+  /* less parsing problem : divide css */
+
+  /* FIXME : check ux if it needs to be deprecated... */
+
+}
+.ui-btn-up-s .ui-icon-header-back-btn {
+  background-image: url(images/page/00_icon_Back.png);
+}
+.ui-btn-up-s .ui-icon-naviframe-more {
+  background-image: url(images/page/00_icon_more.png);
+}
+.ui-btn-up-s .ui-icon-down {
+  background-image: url(images/page/00_icon_SIP_close_web.png);
+}
+.ui-btn-up-s .ui-icon-naviframe-cancel {
+  background-image: url(images/page/00_icon_cancel_web.png);
+}
+.ui-btn-up-s .ui-icon-naviframe-edit {
+  background-image: url(images/page/00_icon_edit_web.png);
+}
+.ui-btn-up-s .ui-icon-naviframe-plus {
+  background-image: url(images/page/00_icon_plus_web.png);
+}
+.ui-btn-up-s .ui-icon-naviframe-delete {
+  background-image: url(images/page/00_icon_delete_web.png);
+}
+.ui-btn-up-s .ui-icon-naviframe-done {
+  background-image: url(images/page/00_icon_done_web.png);
+}
+.ui-btn-up-s .ui-icon-naviframe-search {
+  background-image: url(images/page/00_icon_search_web.png);
+}
+.ui-btn-up-s .ui-icon-naviframe-selectall {
+  background-image: url(images/page/00_icon_select_all_web.png);
+}
+
+.ui-btn-hover-s .ui-icon-header-back-btn {
+  background-image: url(images/page/00_icon_Back.png);
+}
+.ui-btn-hover-s .ui-icon-naviframe-more {
+  background-image: url(images/page/00_icon_more.png);
+}
+.ui-btn-hover-s .ui-icon-down {
+  background-image: url(images/page/00_icon_SIP_close_web.png);
+}
+.ui-btn-hover-s .ui-icon-naviframe-cancel {
+  background-image: url(images/page/00_icon_cancel_web.png);
+}
+.ui-btn-hover-s .ui-icon-naviframe-edit {
+  background-image: url(images/page/00_icon_edit_web.png);
+}
+.ui-btn-hover-s .ui-icon-naviframe-plus {
+  background-image: url(images/page/00_icon_plus_web.png);
+}
+.ui-btn-hover-s .ui-icon-naviframe-delete {
+  background-image: url(images/page/00_icon_delete_web.png);
+}
+.ui-btn-hover-s .ui-icon-naviframe-done {
+  background-image: url(images/page/00_icon_done_web.png);
+}
+.ui-btn-hover-s .ui-icon-naviframe-search {
+  background-image: url(images/page/00_icon_search_web.png);
+}
+.ui-btn-hover-s .ui-icon-naviframe-selectall {
+  background-image: url(images/page/00_icon_select_all_web.png);
+}
+
+.ui-btn-down-s .ui-icon-header-back-btn {
+  background-image: url(images/page/00_icon_Back_press.png);
+}
+.ui-btn-down-s .ui-icon-naviframe-more {
+  background-image: url(images/page/00_icon_more_press.png);
+}
+.ui-btn-down-s .ui-icon-down {
+  background-image: url(images/page/00_icon_SIP_close_press_web.png);
+}
+.ui-btn-down-s .ui-icon-naviframe-cancel {
+  background-image: url(images/page/00_icon_cancel_press_web.png);
+}
+.ui-btn-down-s .ui-icon-naviframe-edit {
+  background-image: url(images/page/00_icon_edit_press_web.png);
+}
+.ui-btn-down-s .ui-icon-naviframe-plus {
+  background-image: url(images/page/00_icon_plus_press_web.png);
+}
+.ui-btn-down-s .ui-icon-naviframe-delete {
+  background-image: url(images/page/00_icon_delete_press_web.png);
+}
+.ui-btn-down-s .ui-icon-naviframe-done {
+  background-image: url(images/page/00_icon_done_press_web.png);
+}
+.ui-btn-down-s .ui-icon-naviframe-search {
+  background-image: url(images/page/00_icon_search_press_web.png);
+}
+.ui-btn-down-s .ui-icon-naviframe-selectall {
+  background-image: url(images/page/00_icon_select_all_press_web.png);
+}
+/* Interaction cues
+-----------------------------------------------------------------------------------------------------------*/
+.ui-disabled {
+  filter: alpha(opacity=30);
+  opacity: .3;
+  zoom: 1;
+}
+.ui-disabled,
+.ui-disabled a {
+  cursor: default !important;
+  pointer-events: none;
+}
+/************************************************************************
+			Landscape mode
+************************************************************************/
+@media all and (orientation: landscape) and (device-aspect-ratio: 16/9) {
+  .ui-bar-s > .ui-btn.ui-btn-back .ui-icon-header-back-btn,
+  .ui-bar-s > .ui-btn.ui-btn-footer-down .ui-icon-header-back-btn {
+    top: 0.2272727272727273rem;
+  }
+  .ui-header.ui-bar-s {
+    min-height: 2.0454545454545454rem;
+  }
+  .ui-header.ui-bar-s .ui-title {
+    min-height: 1.1363636363636365rem;
+    max-height: 1.3181818181818181rem;
+    font-size: 1.1363636363636365rem;
+    margin: 0.5454545454545454rem 0.5909090909090909rem 0.18181818181818182rem 0.5909090909090909rem;
+    /* tuning UX guide(title height too large)*/
+  
+  }
+  .ui-header.ui-bar-s > .ui-btn.ui-btn-back,
+  .ui-header.ui-bar-s > .ui-btn.ui-btn-footer-down {
+    right: 0.5909090909090909rem;
+  }
+  .ui-header.ui-bar-s img {
+    margin-top: 0.6363636363636364rem;
+    height: 1.0454545454545454rem;
+    width: 1.0454545454545454rem;
+  }
+  .ui-header.ui-bar-s .ui-title-text-sub {
+    top: 1.1818181818181819rem;
+  }
+  .ui-header.ui-bar-s > .ui-btn,
+  .ui-header.ui-bar-s > .naviframe-button.ui-btn {
+    top: 0.36363636363636365rem;
+    height: 1.5454545454545454rem;
+    width: 1.5454545454545454rem;
+  }
+  .ui-header.ui-bar-s.ui-title-tabbar > .ui-btn {
+    top: 0.36363636363636365rem;
+  }
+  .ui-header.ui-bar-s.ui-title-multiline img {
+    margin-top: 0.5454545454545454rem;
+  }
+  .ui-header.ui-bar-s.ui-title-multiline .ui-title {
+    min-height: 0.9545454545454546rem;
+    max-height: 0.9545454545454546rem;
+    /* temporary UX strange */
+  
+    font-size: 0.8636363636363636rem;
+    margin: 0.2272727272727273rem 0.5909090909090909rem 0.8636363636363636rem 0.5909090909090909rem;
+    display: block;
+  }
+  .ui-header.ui-bar-s.ui-title-multiline .ui-title-text-sub {
+    top: 1.1818181818181819rem;
+    font-size: 0.6363636363636364rem;
+  }
+  .ui-footer.ui-bar-s {
+    height: 1.9090909090909092rem;
+  }
+  .ui-footer.ui-bar-s > .ui-btn.ui-btn-back > .ui-btn-icon-only,
+  .ui-footer.ui-bar-s > .ui-btn.ui-btn-footer-down > .ui-btn-icon-only,
+  .ui-footer.ui-bar-s > [data-icon="naviframe-more"] > .ui-btn-icon-only {
+    width: 2.5454545454545454rem;
+    height: 1.9090909090909092rem;
+  }
+  .ui-footer.ui-bar-s > .ui-btn.ui-btn-back .ui-icon-down,
+  .ui-footer.ui-bar-s > .ui-btn.ui-btn-footer-down .ui-icon-down,
+  .ui-footer.ui-bar-s > [data-icon="naviframe-more"] .ui-icon-down {
+    top: 0.2272727272727273rem;
+  }
+  .ui-footer.ui-bar-s [data-icon="naviframe-more"] .ui-icon-naviframe-more {
+    top: 0.2272727272727273rem;
+  }
+  .ui-footer.ui-bar-s [data-role="controlgroup"] {
+    margin-top: 0.2727272727272727rem;
+    margin-bottom: 0.2727272727272727rem;
+    /* temp value */
+  
+    padding-left: 2.6363636363636362rem;
+    padding-right: 2.6363636363636362rem;
+  }
+  .ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"] {
+    padding: 0px;
+    margin-left: -0.18181818181818182rem;
+    margin-right: -0.2272727272727273rem;
+    top: -0.18181818181818182rem;
+  }
+  .ui-footer.ui-bar-s > [data-role="button"]:not([data-icon="naviframe-more"]) {
+    position: absolute;
+    top: 0px;
+  }
+}
+/*
+* 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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/************************/
+/* some unsets - more probably needed */
+.ui-mobile,
+.ui-mobile body {
+  height: 100%;
+  font-size: 22px;
+}
+@media all and (max-width: 359px) {
+  .ui-mobile,
+  .ui-mobile body {
+    font-size: 19px;
+  }
+}
+.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%;
+  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;
+}
+.ui-mobile,
+.ui-mobile .ui-page {
+  background: #000000;
+  color: #fafafa;
+}
+/* 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 */
+
+  transform: rotateY(0);
+  -ms-transform: rotateY(0);
+  -moz-transform: rotateY(0);
+  -webkit-transform: rotateY(0);
+  -o-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: 1.4545454545454546rem;
+  text-align: center;
+}
+.ui-loader .ui-icon {
+  position: static;
+  display: block;
+  opacity: .9;
+  margin: 0 auto;
+  width: 35px;
+  height: 35px;
+  background-color: transparent;
+}
+.ui-blocker {
+  width: 100%;
+  height: 100%;
+  z-index: 2147483647;
+}
+/*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;
+}
+/* Title button packing order */
+.ui-header .ui-btn-left {
+  top: .4em;
+  float: left;
+}
+.ui-header .ui-btn-right {
+  float: right;
+  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;
+}
+/* Transitions originally inspired by those from jQtouch, nice work, folks */
+.ui-mobile-viewport-transitioning,
+.ui-mobile-viewport-transitioning .ui-page {
+	width: 100%;
+	height: 100%;
+	overflow: hidden;
+}
+
+.in {
+	-ms-animation-timing-function: ease-out;
+        -ms-animation-duration: 350ms;
+	-o-animation-timing-function: ease-out;
+        -o-animation-duration: 350ms;
+	-webkit-animation-timing-function: ease-out;
+	-webkit-animation-duration: 350ms;
+	-moz-animation-timing-function: ease-out;
+	-moz-animation-duration: 350ms;
+}
+
+.out {
+	-ms-animation-timing-function: ease-in;
+        -ms-animation-duration: 225ms;
+        -o-animation-timing-function: ease-in;
+        -o-animation-duration: 225;
+	-webkit-animation-timing-function: ease-in;
+	-webkit-animation-duration: 225ms;
+	-moz-animation-timing-function: ease-in;
+	-moz-animation-duration: 225;
+}
+
+
+/* fade */
+
+@-webkit-keyframes fadein {
+    from { opacity: 0; }
+    to { opacity: 1; }
+}
+
+@-moz-keyframes fadein {
+    from { opacity: 0; }
+    to { opacity: 1; }
+}
+
+@-webkit-keyframes fadeout {
+    from { opacity: 1; }
+    to { opacity: 0; }
+}
+
+@-moz-keyframes fadeout {
+    from { opacity: 1; }
+    to { opacity: 0; }
+}
+
+.fade.out {
+	opacity: 0;
+	-ms-animation-duration: 125ms;
+        -ms-animation-name: fadeout;
+        -o-animation-duration: 125ms;
+        -o-animation-name: fadeout;
+	-webkit-animation-duration: 125ms;
+	-webkit-animation-name: fadeout;
+	-moz-animation-duration: 125ms;
+	-moz-animation-name: fadeout;
+}
+
+.fade.in {
+	opacity: 1;
+	-ms-animation-duration: 225ms;
+        -ms-animation-name: fadein;
+        -o-animation-duration: 225ms;
+        -o-animation-name: fadein;
+	-webkit-animation-duration: 225ms;
+	-webkit-animation-name: fadein;
+	-moz-animation-duration: 225ms;
+	-moz-animation-name: fadein;
+}
+
+
+/* flip */
+
+/* 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 {
+	-ms-perspective: 1000;
+	-o-perspective: 1000;
+	-webkit-perspective: 1000;
+	-moz-perspective: 1000;
+	position: absolute;
+}
+.flip {
+	-webkit-backface-visibility:hidden;
+	-webkit-transform:translate3d(0, 0, 0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */
+	-moz-backface-visibility:hidden;
+	-moz-transform:translate3d(0, 0, 0);
+}
+
+.flip.out {
+	-webkit-transform: rotateY(-90deg) scale(.9);
+	-webkit-animation-name: flipouttoleft;
+	-webkit-animation-duration: 175ms;
+	-moz-transform: rotateY(-90deg) scale(.9);
+	-moz-animation-name: flipouttoleft;
+	-moz-animation-duration: 175ms;
+}
+
+.flip.in {
+	-webkit-animation-name: flipintoright;
+	-webkit-animation-duration: 225ms;
+	-moz-animation-name: flipintoright;
+	-moz-animation-duration: 225ms;
+}
+
+.flip.out.reverse {
+	-webkit-transform: rotateY(90deg) scale(.9);
+	-webkit-animation-name: flipouttoright;
+	-moz-transform: rotateY(90deg) scale(.9);
+	-moz-animation-name: flipouttoright;
+}
+
+.flip.in.reverse {
+	-webkit-animation-name: flipintoleft;
+	-moz-animation-name: flipintoleft;
+}
+
+@-webkit-keyframes flipouttoleft {
+    from { -webkit-transform: rotateY(0); }
+    to { -webkit-transform: rotateY(-90deg) scale(.9); }
+}
+@-moz-keyframes flipouttoleft {
+    from { -moz-transform: rotateY(0); }
+    to { -moz-transform: rotateY(-90deg) scale(.9); }
+}
+@-webkit-keyframes flipouttoright {
+    from { -webkit-transform: rotateY(0) ; }
+    to { -webkit-transform: rotateY(90deg) scale(.9); }
+}
+@-moz-keyframes flipouttoright {
+    from { -moz-transform: rotateY(0); }
+    to { -moz-transform: rotateY(90deg) scale(.9); }
+}
+@-webkit-keyframes flipintoleft {
+    from { -webkit-transform: rotateY(-90deg) scale(.9); }
+    to { -webkit-transform: rotateY(0); }
+}
+@-moz-keyframes flipintoleft {
+    from { -moz-transform: rotateY(-90deg) scale(.9); }
+    to { -moz-transform: rotateY(0); }
+}
+@-webkit-keyframes flipintoright {
+    from { -webkit-transform: rotateY(90deg) scale(.9); }
+    to { -webkit-transform: rotateY(0); }
+}
+@-moz-keyframes flipintoright {
+    from { -moz-transform: rotateY(90deg) scale(.9); }
+    to { -moz-transform: rotateY(0); }
+}
+
+
+/* flow transition */
+
+.flow {
+	-webkit-transform-origin: 50% 30%;
+	-moz-transform-origin: 50% 30%;
+	-webkit-box-shadow: 0 0 20px rgba(0,0,0,.4);
+	-moz-box-shadow: 0 0 20px rgba(0,0,0,.4);
+}
+.ui-dialog.flow {
+	-webkit-transform-origin: none;
+	-moz-transform-origin: none;
+	-webkit-box-shadow: none;
+	-moz-box-shadow: none;
+}
+.flow.out {
+	-webkit-transform: translate3d(-100%, 0, 0) scale(.7);
+	-webkit-animation-name: flowouttoleft;
+	-webkit-animation-timing-function: ease;
+	-webkit-animation-duration: 350ms;
+	-moz-transform: translate3d(-100%, 0, 0) scale(.7);
+	-moz-animation-name: flowouttoleft;
+	-moz-animation-timing-function: ease;
+	-moz-animation-duration: 350ms;
+}
+
+.flow.in {
+	-webkit-transform: translate3d(0, 0, 0) scale(1);
+	-webkit-animation-name: flowinfromright;
+	-webkit-animation-timing-function: ease;
+	-webkit-animation-duration: 350ms;
+	-moz-transform: translate3d(0, 0, 0) scale(1);
+	-moz-animation-name: flowinfromright;
+	-moz-animation-timing-function: ease;
+	-moz-animation-duration: 350ms;
+}
+
+.flow.out.reverse {
+	-webkit-transform: translate3d(100%, 0, 0);
+	-webkit-animation-name: flowouttoright;
+	-moz-transform: translate3d(100%, 0, 0);
+	-moz-animation-name: flowouttoright;
+}
+
+.flow.in.reverse {
+	-webkit-animation-name: flowinfromleft;
+	-moz-animation-name: flowinfromleft;
+}
+
+@-webkit-keyframes flowouttoleft {
+    0% { -webkit-transform: translate3d(0, 0, 0) scale(1); }
+	60%, 70% { -webkit-transform: translate3d(0, 0, 0) scale(.7); }
+    100% { -webkit-transform: translate3d(-100%, 0, 0) scale(.7); }
+}
+@-moz-keyframes flowouttoleft {
+    0% { -moz-transform: translate3d(0, 0, 0) scale(1); }
+	60%, 70% { -moz-transform: translate3d(0, 0, 0) scale(.7); }
+    100% { -moz-transform:  translateX(-100%) scale(.7); }
+}
+
+@-webkit-keyframes flowouttoright {
+    0% { -webkit-transform: translate3d(0, 0, 0) scale(1); }
+	60%, 70% { -webkit-transform: translate3d(0, 0, 0) scale(.7); }
+    100% { -webkit-transform:  translate3d(100%, 0, 0) scale(.7); }
+}
+@-moz-keyframes flowouttoright {
+    0% { -moz-transform: translate3d(0, 0, 0) scale(1); }
+	60%, 70% { -moz-transform: translate3d(0, 0, 0) scale(.7); }
+    100% { -moz-transform:  translate3d(100%, 0, 0) scale(.7); }
+}
+
+@-webkit-keyframes flowinfromleft {
+    0% { -webkit-transform: translate3d(-100%, 0, 0) scale(.7); }
+	30%, 40% { -webkit-transform: translate3d(0, 0, 0) scale(.7); }
+    100% { -webkit-transform: translate3d(0, 0, 0) scale(1); }
+}
+@-moz-keyframes flowinfromleft {
+    0% { -moz-transform: translate3d(-100%, 0, 0) scale(.7); }
+	30%, 40% { -moz-transform: translate3d(0, 0, 0) scale(.7); }
+    100% { -moz-transform: translate3d(0, 0, 0) scale(1); }
+}
+@-webkit-keyframes flowinfromright {
+    0% { -webkit-transform: translate3d(100%, 0, 0) scale(.7); }
+	30%, 40% { -webkit-transform: translate3d(0, 0, 0) scale(.7); }
+    100% { -webkit-transform: translate3d(0, 0, 0) scale(1); }
+}
+@-moz-keyframes flowinfromright {
+    0% { -moz-transform: translate3d(100%, 0, 0) scale(.7); }
+	30%, 40% { -moz-transform: translate3d(0, 0, 0) scale(.7); }
+    100% { -moz-transform: translate3d(0, 0, 0) scale(1); }
+}
+
+
+/* pop */
+
+.pop {
+	-webkit-transform-origin: 50% 50%;
+	-moz-transform-origin: 50% 50%;
+}
+
+.pop.in {
+	-webkit-transform: scale(1);
+	-moz-transform: scale(1);
+    opacity: 1;
+	-webkit-animation-name: popin;
+	-moz-animation-name: popin;
+	-webkit-animation-duration: 350ms;
+	-moz-animation-duration: 350ms;
+}
+
+.pop.out {
+	-webkit-animation-name: fadeout;
+	-moz-animation-name: fadeout;
+	opacity: 0;
+	-webkit-animation-duration: 100ms;
+	-moz-animation-duration: 100ms;
+}
+
+.pop.in.reverse {
+	-webkit-animation-name: fadein;
+	-moz-animation-name: fadein;
+}
+
+.pop.out.reverse {
+	-webkit-transform: scale(.8);
+	-moz-transform: scale(.8);
+	-webkit-animation-name: popout;
+	-moz-animation-name: popout;
+}
+
+@-webkit-keyframes popin {
+    from {
+        -webkit-transform: scale(.8);
+        opacity: 0;
+    }
+    to {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+}
+
+@-moz-keyframes popin {
+    from {
+        -moz-transform: scale(.8);
+        opacity: 0;
+    }
+    to {
+        -moz-transform: scale(1);
+        opacity: 1;
+    }
+}
+
+@-webkit-keyframes popout {
+    from {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+    to {
+        -webkit-transform: scale(.8);
+        opacity: 0;
+    }
+}
+
+@-moz-keyframes popout {
+    from {
+        -moz-transform: scale(1);
+        opacity: 1;
+    }
+    to {
+        -moz-transform: scale(.8);
+        opacity: 0;
+    }
+}
+
+
+/* slide */
+
+/* keyframes for slidein from sides */
+@-webkit-keyframes slideinfromright {
+    from { -webkit-transform: translate3d(100%, 0, 0); }
+    to { -webkit-transform: translate3d(0, 0, 0); }
+}
+@-moz-keyframes slideinfromright {
+    from { -moz-transform: translate3d(100%, 0, 0); }
+    to { -moz-transform: translate3d(0, 0, 0); }
+}
+
+@-webkit-keyframes slideinfromleft {
+    from { -webkit-transform: translate3d(-100%, 0, 0); }
+    to { -webkit-transform: translate3d(0, 0, 0); }
+}
+@-moz-keyframes slideinfromleft {
+    from { -moz-transform: translate3d(-100%, 0, 0); }
+    to { -moz-transform: translate3d(0, 0, 0); }
+}
+
+/* keyframes for slideout to sides */
+@-webkit-keyframes slideouttoleft {
+    from { -webkit-transform: translate3d(0, 0, 0); }
+    to { -webkit-transform: translate3d(-100%, 0, 0); }
+}
+@-moz-keyframes slideouttoleft {
+    from { -moz-transform: translate3d(0, 0, 0); }
+    to { -moz-transform: translate3d(-100%, 0, 0); }
+}
+
+@-webkit-keyframes slideouttoright {
+    from { -webkit-transform: translate3d(0, 0, 0); }
+    to { -webkit-transform: translate3d(100%, 0, 0); }
+}
+@-moz-keyframes slideouttoright {
+    from { -moz-transform: translate3d(0, 0, 0); }
+    to { -moz-transform: translate3d(100%, 0, 0); }
+}
+
+.slide.out, .slide.in {
+	-webkit-animation-timing-function: ease-out;
+	-webkit-animation-duration: 350ms;
+	-moz-animation-timing-function: ease-out;
+	-moz-animation-duration: 350ms;
+}
+.slide.out {
+	-webkit-transform: translate3d(-100%, 0, 0);
+	-webkit-animation-name: slideouttoleft;
+	-moz-transform: translate3d(-100%, 0, 0);
+	-moz-animation-name: slideouttoleft;
+}
+
+.slide.in {
+	-webkit-transform: translate3d(0, 0, 0);
+	-webkit-animation-name: slideinfromright;
+	-moz-transform: translate3d(0, 0, 0);
+	-moz-animation-name: slideinfromright;
+}
+
+.slide.out.reverse {
+	-webkit-transform: translate3d(100%, 0, 0);
+	-webkit-animation-name: slideouttoright;
+	-moz-transform: translate3d(100%, 0, 0);
+	-moz-animation-name: slideouttoright;
+}
+
+.slide.in.reverse {
+	-webkit-transform: translate3d(0, 0, 0);
+	-webkit-animation-name: slideinfromleft;
+	-moz-transform: translate3d(0, 0, 0);
+	-moz-animation-name: slideinfromleft;
+}
+
+/* slide down */
+
+.slidedown.out {
+	-webkit-animation-name: fadeout;
+	-moz-animation-name: fadeout;
+	-webkit-animation-duration: 100ms;
+	-moz-animation-duration: 100ms;
+}
+
+.slidedown.in {
+	-webkit-transform: translate3d(0, 0, 0);
+	-webkit-animation-name: slideinfromtop;
+	-moz-transform: translate3d(0, 0, 0);
+	-moz-animation-name: slideinfromtop;
+	-webkit-animation-duration: 250ms;
+	-moz-animation-duration: 250ms;
+}
+
+.slidedown.in.reverse {
+	-webkit-animation-name: fadein;
+	-moz-animation-name: fadein;
+	-webkit-animation-duration: 150ms;
+	-moz-animation-duration: 150ms;
+}
+
+.slidedown.out.reverse {
+	-webkit-transform: translate3d(0, -100%, 0);
+	-moz-transform: translate3d(0, -100%, 0);
+	-webkit-animation-name: slideouttotop;
+	-moz-animation-name: slideouttotop;
+	-webkit-animation-duration: 200ms;
+	-moz-animation-duration: 200ms;
+}
+
+@-webkit-keyframes slideinfromtop {
+    from { -webkit-transform: translate3d(0, -100%, 0); }
+    to { -webkit-transform: translate3d(0, 0, 0); }
+}
+@-moz-keyframes slideinfromtop {
+    from { -moz-transform: translate3d(0, -100%, 0); }
+    to { -moz-transform: translate3d(0, 0, 0); }
+}
+
+@-webkit-keyframes slideouttotop {
+    from { -webkit-transform: translate3d(0, 0, 0); }
+    to { -webkit-transform: translate3d(0, -100%, 0); }
+}
+@-moz-keyframes slideouttotop {
+    from { -moz-transform: translate3d(0, 0, 0); }
+    to { -moz-transform: translate3d(0, -100%, 0); }
+}
+
+/* slide up */
+
+.slideup.out {
+	-webkit-animation-name: fadeout;
+	-moz-animation-name: fadeout;
+	-webkit-animation-duration: 100ms;
+	-moz-animation-duration: 100ms;
+}
+
+.slideup.in {
+	-webkit-transform: translate3d(0, 0, 0);
+	-webkit-animation-name: slideinfrombottom;
+	-moz-transform: translate3d(0, 0, 0);
+	-moz-animation-name: slideinfrombottom;
+	-webkit-animation-duration: 250ms;
+	-moz-animation-duration: 250ms;
+}
+
+.slideup.in.reverse {
+	-webkit-animation-name: fadein;
+	-moz-animation-name: fadein;
+	-webkit-animation-duration: 150ms;
+	-moz-animation-duration: 150ms;
+}
+
+.slideup.out.reverse {
+	-webkit-transform: translate3d(0, 100%, 0);
+	-moz-transform: translate3d(0, 100%, 0);
+	-webkit-animation-name: slideouttobottom;
+	-moz-animation-name: slideouttobottom;
+	-webkit-animation-duration: 200ms;
+	-moz-animation-duration: 200ms;
+}
+
+@-webkit-keyframes slideinfrombottom {
+    from { -webkit-transform: translate3d(0, 100%, 0); }
+    to { -webkit-transform: translate3d(0, 0, 0); }
+}
+@-moz-keyframes slideinfrombottom {
+    from { -moz-transform: translate3d(0, 100%, 0); }
+    to { -moz-transform: translate3d(0, 0, 0); }
+}
+
+@-webkit-keyframes slideouttobottom {
+    from { -webkit-transform: translate3d(0, 0, 0); }
+    to { -webkit-transform: translate3d(0, 100%, 0); }
+}
+@-moz-keyframes slideouttobottom {
+    from { -moz-transform: translate3d(0, 0, 0); }
+    to { -moz-transform: translate3d(0, 100%, 0); }
+}
+
+/* slide up + fade */
+
+.slideupfade.out {
+	-webkit-animation-name: fadeout;
+	-moz-animation-name: fadeout;
+	-webkit-animation-duration: 100ms;
+	-moz-animation-duration: 100ms;
+}
+
+.slideupfade.in {
+	-webkit-transform: translate3d(0, 0, 0);
+	-webkit-animation-name: slideupfadeinfrombottom;
+	-moz-transform: translate3d(0, 0, 0);
+	-moz-animation-name: slideupfadeinfrombottom;
+	-webkit-animation-duration: 250ms;
+	-moz-animation-duration: 250ms;
+}
+
+.slideupfade.in.reverse {
+	-webkit-animation-name: fadein;
+	-moz-animation-name: fadein;
+	-webkit-animation-duration: 150ms;
+	-moz-animation-duration: 150ms;
+}
+
+.slideupfade.out.reverse {
+	-webkit-transform: translate3d(0, 5%, 0);
+	-moz-transform: translate3d(0, 5%, 0);
+	-webkit-animation-name: slideupfadeouttobottom;
+	-moz-animation-name: slideupfadeouttobottom;
+	-webkit-animation-duration: 200ms;
+	-moz-animation-duration: 200ms;
+}
+
+@-webkit-keyframes slideupfadeinfrombottom {
+    from {
+		opacity: 0;
+		-webkit-transform: translate3d(0, 5%, 0);
+	}
+    to {
+		opacity: 1;
+		-webkit-transform: translate3d(0, 0, 0);
+	}
+}
+@-moz-keyframes slideupfadeinfrombottom {
+    from {
+		opacity: 0;
+		-moz-transform: translate3d(0, 5%, 0);
+	}
+    to {
+		opacity: 1;
+		-moz-transform: translate3d(0, 0, 0);
+	}
+}
+
+@-webkit-keyframes slideupfadeouttobottom {
+    from {
+		opacity: 1;
+		-webkit-transform: translate3d(0, 0, 0);
+	}
+    to {
+		opacity: 0;
+		-webkit-transform: translate3d(0, 5%, 0);
+	}
+}
+@-moz-keyframes slideupfadeouttobottom {
+    from {
+		opacity: 1;
+		-moz-transform: translate3d(0, 0, 0);
+	}
+    to {
+		opacity: 0;
+		-moz-transform: translate3d(0, 5%, 0);
+	}
+}
+
+/* slide down + fade */
+
+.slidedownfade.out {
+	-webkit-animation-name: fadeout;
+	-moz-animation-name: fadeout;
+	-webkit-animation-duration: 100ms;
+	-moz-animation-duration: 100ms;
+}
+
+.slidedownfade.in {
+	-webkit-transform: translate3d(0, 0, 0);
+	-webkit-animation-name: slidedownfadeinfromtop;
+	-moz-transform: translate3d(0, 0, 0);
+	-moz-animation-name: slidedownfadeinfromtop;
+	-webkit-animation-duration: 250ms;
+	-moz-animation-duration: 250ms;
+}
+
+.slidedownfade.in.reverse {
+	-webkit-animation-name: fadein;
+	-moz-animation-name: fadein;
+	-webkit-animation-duration: 150ms;
+	-moz-animation-duration: 150ms;
+}
+
+.slidedownfade.out.reverse {
+	-webkit-transform: translate3d(0, -5%, 0);
+	-moz-transform: translate3d(0, -5%, 0);
+	-webkit-animation-name: slidedownfadeouttotop;
+	-moz-animation-name: slidedownfadeouttotop;
+	-webkit-animation-duration: 200ms;
+	-moz-animation-duration: 200ms;
+}
+
+@-webkit-keyframes slidedownfadeinfromtop {
+    from {
+		opacity: 0;
+		-webkit-transform: translate3d(0, -5%, 0);
+	}
+    to {
+		opacity: 1;
+		-webkit-transform: translate3d(0, 0, 0);
+	}
+}
+@-moz-keyframes slidedownfadeinfromtop {
+    from {
+		opacity: 0;
+		-moz-transform: translate3d(0, -5%, 0);
+	}
+    to {
+		opacity: 1;
+		-moz-transform: translate3d(0, 0, 0);
+	}
+}
+
+@-webkit-keyframes slidedownfadeouttotop {
+    from {
+		opacity: 1;
+		-webkit-transform: translate3d(0, 0, 0);
+	}
+    to {
+		opacity: 0;
+		-webkit-transform: translate3d(0, -5%, 0);
+	}
+}
+@-moz-keyframes slidedownfadeouttotop {
+    from {
+		opacity: 1;
+		-moz-transform: translate3d(0, 0, 0);
+	}
+    to {
+		opacity: 0;
+		-moz-transform: translate3d(0, -5%, 0);
+	}
+}
+
+/* slide fade */
+
+.slidefade.out {
+	-webkit-transform: translate3d(-100%, 0, 0);
+	-webkit-animation-name: slideouttoleft;
+	-moz-transform: translate3d(-100%, 0, 0);
+	-moz-animation-name: slideouttoleft;
+	-webkit-animation-duration: 225ms;
+	-moz-animation-duration: 225ms;
+}
+
+.slidefade.in {
+	-webkit-transform: translate3d(0, 0, 0);
+	-webkit-animation-name: fadein;
+	-moz-transform: translate3d(0, 0, 0);
+	-moz-animation-name: fadein;
+	-webkit-animation-duration: 200ms;
+	-moz-animation-duration: 200ms;
+}
+
+.slidefade.out.reverse {
+	-webkit-transform: translate3d(100%, 0, 0);
+	-webkit-animation-name: slideouttoright;
+	-moz-transform: translate3d(100%, 0, 0);
+	-moz-animation-name: slideouttoright;
+	-webkit-animation-duration: 200ms;
+	-moz-animation-duration: 200ms;
+}
+
+.slidefade.in.reverse {
+	-webkit-transform: translate3d(0, 0, 0);
+	-webkit-animation-name: fadein;
+	-moz-transform: translate3d(0, 0, 0);
+	-moz-animation-name: fadein;
+	-webkit-animation-duration: 200ms;
+	-moz-animation-duration: 200ms;
+}
+
+/* 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-turn {
+	-webkit-perspective: 1000;
+	-moz-perspective: 1000;
+	position: absolute;
+}
+.turn {
+	-webkit-backface-visibility:hidden;
+	-webkit-transform:translate3d(0, 0, 0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */
+	-webkit-transform-origin: 0;
+	-moz-backface-visibility:hidden;
+	-moz-transform:translate3d(0, 0, 0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */
+	-moz-transform-origin: 0;
+}
+
+.turn.out {
+	-webkit-transform: rotateY(-90deg) scale(.9);
+	-webkit-animation-name: flipouttoleft;
+	-moz-transform: rotateY(-90deg) scale(.9);
+	-moz-animation-name: flipouttoleft;
+	-webkit-animation-duration: 125ms;
+	-moz-animation-duration: 125ms;
+}
+
+.turn.in {
+	-webkit-animation-name: flipintoright;
+	-moz-animation-name: flipintoright;
+	-webkit-animation-duration: 250ms;
+	-moz-animation-duration: 250ms;
+}
+
+.turn.out.reverse {
+	-webkit-transform: rotateY(90deg) scale(.9);
+	-webkit-animation-name: flipouttoright;
+	-moz-transform: rotateY(90deg) scale(.9);
+	-moz-animation-name: flipouttoright;
+}
+
+.turn.in.reverse {
+	-webkit-animation-name: flipintoleft;
+	-moz-animation-name: flipintoleft;
+}
+
+@-webkit-keyframes flipouttoleft {
+    from { -webkit-transform: rotateY(0); }
+    to { -webkit-transform: rotateY(-90deg) scale(.9); }
+}
+@-moz-keyframes flipouttoleft {
+    from { -moz-transform: rotateY(0); }
+    to { -moz-transform: rotateY(-90deg) scale(.9); }
+}
+@-webkit-keyframes flipouttoright {
+    from { -webkit-transform: rotateY(0) ; }
+    to { -webkit-transform: rotateY(90deg) scale(.9); }
+}
+@-moz-keyframes flipouttoright {
+    from { -moz-transform: rotateY(0); }
+    to { -moz-transform: rotateY(90deg) scale(.9); }
+}
+@-webkit-keyframes flipintoleft {
+    from { -webkit-transform: rotateY(-90deg) scale(.9); }
+    to { -webkit-transform: rotateY(0); }
+}
+@-moz-keyframes flipintoleft {
+    from { -moz-transform: rotateY(-90deg) scale(.9); }
+    to { -moz-transform: rotateY(0); }
+}
+@-webkit-keyframes flipintoright {
+    from { -webkit-transform: rotateY(90deg) scale(.9); }
+    to { -webkit-transform: rotateY(0); }
+}
+@-moz-keyframes flipintoright {
+    from { -moz-transform: rotateY(90deg) scale(.9); }
+    to { -moz-transform: rotateY(0); }
+}
+
+
+/* depth */
+
+.depth {
+	-webkit-transform-origin: 50% 50%;
+	-moz-transform-origin: 50% 50%;
+}
+
+.depth.out {
+	-webkit-animation-name: depthout;
+	-moz-animation-name: depthout;
+	opacity: 0;
+	-webkit-animation-duration: 250ms;
+	-moz-animation-duration: 250ms;
+	-webkit-animation-timing-function: ease;
+	-moz-animation-timing-function: ease;
+}
+
+.depth.in {
+	-webkit-transform: scale(1);
+	-moz-transform: scale(1);
+	opacity: 1;
+	-webkit-animation-name: depthin;
+	-moz-animation-name: depthin;
+	-webkit-animation-duration: 350ms;
+	-moz-animation-duration: 350ms;
+	-webkit-animation-timing-function: ease;
+	-moz-animation-timing-function: ease;
+}
+
+.depth.in.reverse {
+	-webkit-animation-name: depthinreverse;
+	-moz-animation-name: depthinreverse;
+}
+
+.depth.out.reverse {
+	-webkit-transform: scale(.9);
+	-moz-transform: scale(.9);
+	-webkit-animation-name: depthoutreverse;
+	-moz-animation-name: depthoutreverse;
+}
+
+@-webkit-keyframes depthout {
+    from {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+    to {
+        -webkit-transform: scale(1.1);
+        opacity: 0;
+    }
+}
+
+@-moz-keyframes depthout {
+    from {
+        -moz-transform: scale(1);
+        opacity: 1;
+    }
+    to {
+        -moz-transform: scale(1.1);
+        opacity: 0;
+    }
+}
+
+@-webkit-keyframes depthin {
+    0% {
+        -webkit-transform: scale(.9);
+        opacity: 0;
+    }
+    30% {
+        -webkit-transform: scale(.9);
+        opacity: 0;
+    }
+    100% {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+}
+
+@-moz-keyframes depthin {
+    0% {
+        -moz-transform: scale(.9);
+        opacity: 0;
+    }
+    30% {
+        -moz-transform: scale(.9);
+        opacity: 0;
+    }
+    100% {
+        -moz-transform: scale(1);
+        opacity: 1;
+    }
+}
+
+@-webkit-keyframes depthinreverse {
+    0% {
+        -webkit-transform: scale(1.1);
+        opacity: 0;
+    }
+    30% {
+        -webkit-transform: scale(1.1);
+        opacity: 0;
+    }
+    100% {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+}
+
+@-moz-keyframes depthinreverse {
+    0% {
+        -moz-transform: scale(1.1);
+        opacity: 0;
+    }
+    30% {
+        -moz-transform: scale(1.1);
+        opacity: 0;
+    }
+    100% {
+        -moz-transform: scale(1);
+        opacity: 1;
+    }
+}
+
+@-webkit-keyframes depthoutreverse {
+    from {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+    to {
+        -webkit-transform: scale(.9);
+        opacity: 0;
+    }
+}
+
+@-moz-keyframes depthoutreverse {
+    from {
+        -moz-transform: scale(1);
+        opacity: 1;
+    }
+    to {
+        -moz-transform: scale(.9);
+        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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/* Button colors are defined in config.less
+
+/* Edit button size */
+.ui-btn {
+  display: block;
+  text-align: center;
+  cursor: pointer;
+  position: relative;
+  vertical-align: middle;
+}
+/* wongi_1018 : For button align. */
+.ui-footer .ui-btn.ui-btn-box-s,
+.ui-ticker-btn .ui-btn.ui-btn-box-s {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+.ui-btn.ui-btn-box-s {
+  margin-top: 0.2727272727272727rem;
+  margin-bottom: 0.2727272727272727rem;
+  color: #fafafa;
+  text-shadow: 0px 1px #111214;
+  -o-border-radius: 0.2rem;
+  -ms-border-radius: 0.2rem;
+  -moz-border-radius: 0.2rem;
+  -webkit-border-radius: 0.2rem;
+  border-radius: 0.2rem;
+}
+.ui-btn:focus,
+.ui-btn:active {
+  outline: none;
+}
+.ui-header .ui-btn,
+.ui-bar .ui-btn {
+  display: inline-block;
+  font-size: 0.5909090909090909rem;
+  margin: 0;
+}
+.ui-btn-inline {
+  display: inline-block;
+}
+.ui-btn-inner {
+  padding: 0.2272727272727273rem;
+  display: block;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  position: relative;
+  zoom: 1;
+}
+.ui-btn-icon-notext {
+  width: 1.6363636363636365rem;
+  height: 1.6363636363636365rem;
+}
+.ui-btn-icon-notext .ui-btn-inner {
+  padding: 0.09090909090909091rem 0.045454545454545456rem 0.09090909090909091rem 0.13636363636363635rem;
+}
+.ui-btn-icon-notext .ui-btn-inner .ui-icon {
+  margin-left: -0.7272727272727273rem;
+  margin-top: -0.7272727272727273rem;
+}
+.ui-btn-icon-notext .ui-btn-text {
+  position: absolute;
+  left: -45.409090909090914rem;
+}
+.ui-btn-icon-left .ui-btn-inner {
+  padding-left: 1.5rem;
+}
+.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: 1.2272727272727273rem;
+}
+.ui-btn-icon-right .ui-btn-inner {
+  padding-right: 1.5rem;
+}
+.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: 1.2272727272727273rem;
+}
+.ui-btn-icon-top .ui-btn-inner {
+  padding-top: 1.2272727272727273rem;
+}
+.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: 1.2272727272727273rem;
+}
+.ui-btn-icon-bottom .ui-btn-inner {
+  padding-bottom: 1.5rem;
+}
+.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: 1.2272727272727273rem;
+}
+/*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: 0.2272727272727273rem;
+}
+.ui-btn-icon-circle .ui-icon {
+  left: 0rem;
+}
+/* wongi_1018 : for circle icon center positioning. */
+.ui-btn-icon-right .ui-icon {
+  right: 0.4545454545454546rem;
+}
+.ui-btn-icon-top .ui-icon {
+  top: 0rem;
+  margin-top: 0;
+}
+.ui-btn-icon-bottom .ui-icon {
+  bottom: 0rem;
+}
+.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.18181818181818182rem;
+}
+.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.18181818181818182rem;
+}
+.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.18181818181818182rem;
+}
+/*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.045454545454545456rem;
+  border: none;
+  line-height: 45.409090909090914rem;
+}
+.ui-btn-text {
+  /*padding-left : 80px;*/
+  margin-left: auto;
+  margin-right: auto;
+  padding: 0 1px;
+  /* Webkit width(ellipsis) problem workaround */
+
+}
+.ui-btn .ui-btn-inner.ui-btn-hastxt span.ui-btn-text {
+  font-size: 0.8181818181818182rem;
+}
+.ui-li .ui-btn.ui-btn-icon_only {
+  top: 50%;
+  margin-top: -0.7272727272727273rem;
+}
+.ui-li .ui-btn .ui-btn-inner.ui-btn-hastxt {
+  padding: 0.2em 0.5em;
+}
+.ui-btn-icon-nobg.ui-btn-down-s .ui-btn-inner {
+  background: transparent ! important;
+}
+.ui-btn-box-s.ui-btn-up-s {
+  background: #44464e;
+  background: -webkit-linear-gradient(top, #35393d, #2d3033);
+  background: -moz-linear-gradient(top, #35393d, #2d3033);
+  background: -o-linear-gradient(top, #35393d, #2d3033);
+  background: -ms-linear-gradient(top, #35393d, #2d3033);
+  box-shadow: inset 0px 1px 1px #7a7d86;
+}
+.ui-btn-box-s.ui-btn-up-s[data-icon="alert"],
+.ui-btn-box-s.ui-btn-up-s[data-icon="minus"] {
+  background: #db0000;
+  box-shadow: inset 0px 1px 1px #ffffff;
+}
+.ui-btn-box-s.ui-btn-hover-s {
+  background: #44464e;
+  background: -webkit-linear-gradient(top, #35393d, #2d3033);
+  background: -moz-linear-gradient(top, #35393d, #2d3033);
+  background: -o-linear-gradient(top, #35393d, #2d3033);
+  background: -ms-linear-gradient(top, #35393d, #2d3033);
+  box-shadow: inset 0px 1px 1px #7a7d86;
+}
+.ui-btn-box-s.ui-btn-hover-s[data-icon="alert"],
+.ui-btn-box-s.ui-btn-hover-s[data-icon="minus"] {
+  background: #db0000;
+  box-shadow: inset 0px 1px 1px #ffffff;
+}
+.ui-btn-box-s.ui-btn-down-s {
+  background: #2736a4;
+  box-shadow: inset 0px 1px 1px #7a7d86;
+  text-shadow: none;
+}
+.ui-btn-box-s.ui-btn-down-s[data-icon="alert"],
+.ui-btn-box-s.ui-btn-down-s[data-icon="minus"] {
+  background: #a10808;
+  box-shadow: inset 0px 1px 1px #ffffff;
+  text-shadow: none;
+}
+.ui-btn-corner-all {
+  -o-border-radius: 0.3rem;
+  -ms-border-radius: 0.3rem;
+  -moz-border-radius: 0.3rem;
+  -webkit-border-radius: 0.3rem;
+  border-radius: 0.3rem;
+}
+.ui-header .ui-btn-box-s:not(.ui-input-cancel):not(.ui-btn-search-front-icon),
+.ui-header .ui-btn-box-s:not(.ui-input-cancel):not(.ui-btn-search-front-icon) .ui-btn-inner,
+.ui-header .ui-btn.ui-btn-box-s.ui-btn-down-s:not(.ui-input-cancel):not(.ui-btn-search-front-icon) .ui-btn-inner,
+.ui-btn.ui-btn-back.ui-btn-up-s .ui-btn-inner,
+.ui-btn.ui-btn-back.ui-btn-hover-s .ui-btn-inner,
+.ui-btn.ui-btn-back.ui-btn-down-s .ui-btn-inner,
+.ui-btn.ui-btn-footer-down.ui-btn-up-s > .ui-btn-inner,
+.ui-btn.ui-btn-footer-down.ui-btn-hover-s > .ui-btn-inner,
+.ui-btn.ui-btn-footer-down.ui-btn-down-s > .ui-btn-inner {
+  background: transparent;
+  border: none;
+  box-shadow: none;
+}
+.ui-header .naviframe-button.ui-btn.ui-btn-box-s.ui-btn-down-s {
+  background: #313f66;
+}
+.ui-btn-icon-top .ui-btn-inner.ui-btn-hastxt,
+.ui-li .ui-btn-icon-top .ui-btn-inner.ui-btn-hastxt {
+  padding-top: 2.3636363636363638rem;
+}
+.ui-btn-icon-bottom .ui-btn-inner.ui-btn-hastxt,
+.ui-li .ui-btn-icon-bottom .ui-btn-inner.ui-btn-hastxt {
+  padding-bottom: 2.3636363636363638rem;
+}
+/* wongi_1017 : Icons */
+/* icons sizing */
+.ui-btn .ui-icon {
+  width: 1rem;
+  height: 1rem;
+}
+.ui-btn.ui-btn-edit .ui-icon {
+  width: 3.3636363636363638rem;
+  height: 3.3636363636363638rem;
+}
+/* Padding for Icon with text */
+.ui-btn .ui-btn-text.ui-btn-text-padding-left {
+  padding-left: 0.9090909090909092rem;
+}
+.ui-btn .ui-btn-text.ui-btn-text-padding-right {
+  padding-right: 1.4545454545454546rem;
+}
+.ui-btn .ui-btn-text.ui-btn-text-padding-top {
+  padding-top: 1.4545454545454546rem;
+}
+.ui-icon {
+  background-repeat: no-repeat;
+  vertical-align: middle;
+  background-position: 0% 0%;
+  background-size: 100%;
+}
+.ui-btn-box.s .ui-icon {
+  position: absolute;
+}
+.ui-btn-box-s.ui-btn-icon-left .ui-icon,
+.ui-btn-box-s.ui-btn-icon-right .ui-icon {
+  margin-top: -0.4545454545454546rem;
+  top: 50%;
+}
+.ui-btn-box-s.ui-btn-icon-top .ui-icon,
+.ui-btn-box-s.ui-btn-icon-bottom .ui-icon {
+  margin-left: -0.4545454545454546rem;
+  left: 50%;
+}
+.tizen-icon-common {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+}
+.tizen-smallicon-common {
+  width: 0.9090909090909092rem ! important;
+  height: 0.9090909090909092rem ! important;
+  top: 50% ! important;
+  left: 50% ! important;
+  margin-top: -0.4545454545454546rem ! important;
+  margin-left: -0.4545454545454546rem ! important;
+}
+.ui-icon-bg {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/00_btn_circle_bg_normal.png);
+  z-index: 0;
+}
+.ui-icon-arrow-l {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_left.png);
+}
+.ui-icon-arrow-r {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_right.png);
+}
+.ui-icon-arrow-u {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_opened.png);
+}
+.ui-icon-arrow-d {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_closed.png);
+}
+.ui-icon-delete {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_cancel.png);
+}
+.ui-icon-plus {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_plus.png);
+}
+.ui-icon-minus {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_minus.png);
+}
+.ui-icon-check {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_check.png);
+}
+.ui-icon-gear {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_gear.png);
+}
+.ui-icon-refresh {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_refresh.png);
+}
+.ui-icon-forward {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_send.png);
+}
+.ui-icon-back {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_back.png);
+}
+.ui-icon-grid {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_grid.png);
+}
+.ui-icon-star {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_star.png);
+}
+.ui-icon-alert {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_warning.png);
+}
+.ui-icon-info {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_info.png);
+}
+.ui-icon-home {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_home.png);
+}
+.ui-icon-search {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_search.png);
+}
+.ui-icon-call {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_call.png);
+}
+.ui-icon-rename {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_rename.png);
+}
+.ui-icon-scrolltop {
+  width: 0.9090909090909092rem ! important;
+  height: 0.9090909090909092rem ! important;
+  top: 50% ! important;
+  left: 50% ! important;
+  margin-top: -0.4545454545454546rem ! important;
+  margin-left: -0.4545454545454546rem ! important;
+  background-image: url(images/controls/button/00_icon_jump.png);
+}
+.ui-icon-scrollleft {
+  width: 0.9090909090909092rem ! important;
+  height: 0.9090909090909092rem ! important;
+  top: 50% ! important;
+  left: 50% ! important;
+  margin-top: -0.4545454545454546rem ! important;
+  margin-left: -0.4545454545454546rem ! important;
+  background-image: url(images/controls/button/00_icon_jump_left.png);
+}
+.ui-icon-expandable-divider-opened {
+  width: 1.9090909090909092rem;
+  height: 1.9090909090909092rem;
+  position: absolute;
+  right: 1.2727272727272727rem;
+  top: 0rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-image: url(images/00_indexlist_icon_opened.png);
+}
+.ui-icon-expandable-divider-closed {
+  width: 1.9090909090909092rem;
+  height: 1.9090909090909092rem;
+  position: absolute;
+  right: 1.2727272727272727rem;
+  top: 0rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-image: url(images/00_indexlist_icon_closed.png);
+}
+/* Pressed images */
+.ui-btn-down-s .ui-icon-bg,
+.ui-btn-down-s.ui-tizen-icon-bg {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/00_btn_circle_bg_press.png);
+  z-index: 0;
+}
+.ui-btn-down-s .ui-icon-arrow-l {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_left_press.png);
+}
+.ui-btn-down-s .ui-icon-arrow-r {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_right_press.png);
+}
+.ui-btn-down-s .ui-icon-arrow-u {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_opened_press.png);
+}
+.ui-btn-down-s .ui-icon-arrow-d {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_closed_press.png);
+}
+.ui-btn-down-s .ui-icon-delete {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_cancel_press.png);
+}
+.ui-btn-down-s .ui-icon-plus {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_plus_press.png);
+}
+.ui-btn-down-s .ui-icon-minus {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_minus_press.png);
+}
+.ui-btn-down-s .ui-icon-check {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_check_press.png);
+}
+.ui-btn-down-s .ui-icon-gear {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_gear_press.png);
+}
+.ui-btn-down-s .ui-icon-refresh {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_refresh_press.png);
+}
+.ui-btn-down-s .ui-icon-forward {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_send_press.png);
+}
+.ui-btn-down-s .ui-icon-back {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_back_press.png);
+}
+.ui-btn-down-s .ui-icon-grid {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_grid_press.png);
+}
+.ui-btn-down-s .ui-icon-star {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_star_press.png);
+}
+.ui-btn-down-s .ui-icon-alert {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_warning_press.png);
+}
+.ui-btn-down-s .ui-icon-info {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_info_press.png);
+}
+.ui-btn-down-s .ui-icon-home {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_home_press.png);
+}
+.ui-btn-down-s .ui-icon-search {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_search_press.png);
+}
+.ui-btn-down-s .ui-icon-call {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_call_press.png);
+}
+.ui-btn-down-s .ui-icon-rename {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_rename_press.png);
+}
+.ui-btn-down-s .ui-icon-scrolltop {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_icon_jump_press.png);
+}
+.ui-btn-down-s .ui-icon-scrollleft {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_icon_jump_left_press.png);
+}
+.ui-btn-inner.ui-btn-icon-only {
+  padding: 0.7272727272727273rem 0.7272727272727273rem;
+}
+.ui-btn-icon-only .ui-btn-text {
+  display: none;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+}
+/* No BG button : data-iconbg = "nobg" */
+.ui-btn.ui-btn-icon-nobg {
+  box-shadow: none;
+}
+.ui-btn-corner-circle {
+  -o-border-radius: 1em ! important;
+  -ms-border-radius: 1em ! important;
+  -moz-border-radius: 1em ! important;
+  -webkit-border-radius: 1em ! important;
+  border-radius: 1em ! important;
+}
+.ui-btn-round {
+  -o-border-radius: 1.2em ! important;
+  -ms-border-radius: 1.2em ! important;
+  -moz-border-radius: 1.2em ! important;
+  -webkit-border-radius: 1.2em ! important;
+  border-radius: 1.2em ! important;
+}
+.ui-btn-round .ui-btn-inner {
+  -o-border-radius: 1.2em ! important;
+  -ms-border-radius: 1.2em ! important;
+  -moz-border-radius: 1.2em ! important;
+  -webkit-border-radius: 1.2em ! important;
+  border-radius: 1.2em ! important;
+}
+.ui-btn.ui-btn-icon-nobg,
+.ui-btn .ui-btn-icon-nobg {
+  background: transparent;
+  background-color: transparent;
+  border: none;
+}
+/* Contact Edit Style */
+.ui-btn.ui-btn-edit .ui-btn-text {
+  color: #f9f9f9;
+}
+.ui-btn.ui-btn-edit .ui-btn-inner {
+  background: #c95858;
+  background: -webkit-gradient(linear, left top, left bottom, from(#c95858), to(#a12828));
+  background: -moz_linear-gradient(top, #c95858, #a12828);
+}
+/*
+ * jQuery Mobile Collapsible CSS
+ * for Tizen Web UI
+ */
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-collapsible-inset {
+  margin: .5em 0;
+}
+.ui-collapsible-inset .ui-collapsible-heading {
+  margin: 0;
+}
+.ui-collapsible-inset .ui-collapsible-heading .ui-btn {
+  border-right-width: 1px;
+  border-left-width: 1px;
+}
+.ui-collapsible-collapsed + .ui-collapsible:not(.ui-collapsible-inset) .ui-collapsible-heading .ui-btn {
+  border-top-width: 0;
+}
+.ui-collapsible-set .ui-collapsible:not(.ui-collapsible-inset) .ui-collapsible-heading .ui-btn {
+  border-top-width: 1px;
+}
+.ui-collapsible-heading,
+.ui-collapsible-content > li {
+  position: relative;
+}
+.ui-collapsible-heading {
+  font-size: 1rem;
+  display: block;
+  margin: 0 -15px;
+  padding: 0;
+  position: relative;
+}
+.ui-collapsible-heading .ui-btn {
+  text-align: left;
+  margin: 0;
+  border-left-width: 0;
+  border-right-width: 0;
+}
+.ui-collapsible-heading .ui-btn-text {
+  color: #fafafa;
+}
+.ui-collapsible-heading .ui-btn-inner,
+.ui-collapsible-heading .ui-btn-icon-left .ui-btn-inner {
+  padding-left: 40px;
+}
+.ui-collapsible-heading .ui-btn-icon-right .ui-btn-inner {
+  padding-left: 0px;
+  padding-right: 40px;
+}
+.ui-collapsible-heading .ui-btn-icon-top .ui-btn-inner,
+.ui-collapsible-heading .ui-btn-icon-bottom .ui-btn-inner {
+  padding-right: 40px;
+  text-align: center;
+}
+.ui-collapsible-heading .ui-btn-inner > .ui-icon-arrow-d {
+  -webkit-transition: all 0.33s ease;
+  -moz-transition: all 0.33s ease;
+  -ms-transition: all 0.33s ease;
+  -o-transition: all 0.33s ease;
+  transition: all 0.33s ease;
+  -webkit-transform: rotate(180deg);
+  -moz-transform: rotate(180deg);
+  -ms-transform: rotate(180deg);
+  -o-transform: rotate(180deg);
+  transform: rotate(180deg);
+}
+.ui-collapsible-heading .ui-btn-inner > .ui-icon-arrow-u {
+  background-image: url(images/controls/button/00_button_expand_closed.png);
+  -webkit-transition: all 0.33s ease;
+  -moz-transition: all 0.33s ease;
+  -ms-transition: all 0.33s ease;
+  -o-transition: all 0.33s ease;
+  transition: all 0.33s ease;
+  -webkit-transform: rotate(0deg);
+  -moz-transform: rotate(0deg);
+  -ms-transform: rotate(0deg);
+  -o-transform: rotate(0deg);
+  transform: rotate(0deg);
+}
+.ui-collapsible-heading .ui-btn 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 .ui-btn span.ui-btn .ui-btn-inner {
+  padding: 10px 0;
+}
+.ui-collapsible-heading .ui-btn span.ui-btn .ui-icon {
+  left: 0;
+  margin-top: -10px;
+}
+.ui-collapsible-heading-status {
+  position: absolute;
+  top: -9999px;
+  left: 0px;
+}
+.ui-collapsible-content {
+  display: block;
+  margin: 0 -15px;
+  padding: 0px 15px;
+  border-left-width: 0;
+  border-right-width: 0;
+  border-top: none;
+  background-image: none;
+  /* Overrides ui-body-* */
+
+  visibility: visible;
+  overflow: auto;
+  -webkit-transition: all 0.5s ease;
+  -moz-transition: all 0.5s ease;
+  -ms-transition: all 0.5s ease;
+  -o-transition: all 0.5s ease;
+  transition: all 0.5s ease;
+}
+.ui-collapsible-inset .ui-collapsible-content {
+  margin: 0;
+  border-right-width: 1px;
+  border-left-width: 1px;
+}
+.ui-collapsible-content-collapsed {
+  overflow: hidden;
+  max-height: 0px !important;
+  visibility: hidden;
+}
+.ui-collapsible-set {
+  margin: .5em 0;
+}
+.ui-collapsible-set .ui-collapsible {
+  margin: -1px 0 0;
+}
+.ui-collapsible-set .ui-collapsible:first-child {
+  margin-top: 0;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.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;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-checkbox .ui-btn-inner,
+.ui-radio .ui-btn-inner {
+  white-space: normal;
+}
+.ui-checkbox,
+.ui-radio {
+  position: relative;
+  margin: 0;
+}
+.ui-checkbox .ui-btn-corner-all,
+.ui-radio .ui-btn-corner-all {
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-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 {
+  z-index: 1;
+  margin: 0px;
+  left: 0.4545454545454546rem;
+  position: absolute;
+  outline: 0 !important;
+}
+.ui-checkbox > input,
+.ui-radio > input {
+  display: none;
+}
+.ui-checkbox .ui-btn,
+.ui-radio .ui-btn {
+  z-index: 2;
+  height: 100%;
+  margin: 0;
+  text-align: left;
+}
+.ui-checkbox .ui-btn.ui-btn-icon-left,
+.ui-radio .ui-btn.ui-btn-icon-left {
+  display: inline-block;
+}
+.ui-checkbox .ui-btn.ui-btn-icon-left .ui-btn-inner,
+.ui-radio .ui-btn.ui-btn-icon-left .ui-btn-inner {
+  min-width: 1.8181818181818183rem;
+  display: inline-block;
+  line-height: 1.4545454545454546rem;
+  padding: 0 0.7272727272727273rem 0 0.7272727272727273rem;
+  /* TODO : after button fixed, recheck! */
+
+}
+.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;
+  min-height: 1.4545454545454546rem;
+}
+.ui-checkbox .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text.ui-btn-text-padding-left,
+.ui-radio .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text.ui-btn-text-padding-left {
+  padding-left: 1.0909090909090908rem;
+}
+.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.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  margin-top: -0.7272727272727273rem;
+}
+.ui-checkbox.favorite input {
+  position: absolute;
+  left: -10000px;
+  height: 100%;
+  outline: 0 !important;
+}
+.ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner {
+  display: inline-block;
+  line-height: 1.4545454545454546rem;
+  padding: 0 0 0 0.7272727272727273rem;
+  /* TODO : after button fixed, recheck! */
+
+}
+.ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text {
+  display: inline-block;
+  vertical-align: middle;
+}
+.ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text.ui-btn-text-padding-left {
+  padding-left: 1.0909090909090908rem;
+}
+.ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-icon {
+  position: absolute;
+  top: 50%;
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  margin-top: -0.7272727272727273rem;
+}
+/* put img inside of checkbox(normal, favorite 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.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_check_bg.png);
+}
+.ui-icon-checkbox-on {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_check_activated.png), url(images/00_check_bg.png);
+  background-repeat: no-repeat;
+}
+.ui-btn-down-s > .ui-btn-inner > .ui-icon-checkbox-off {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_check_press.png), url(images/00_check_press_bg.png);
+  background-repeat: no-repeat;
+}
+.ui-btn-down-s > .ui-btn-inner > .ui-icon-checkbox-on {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_check_press.png), url(images/00_check_press_bg.png);
+  background-repeat: no-repeat;
+}
+.favorite .ui-btn .ui-icon-checkbox-off,
+.favorite .ui-btn .ui-icon-checkbox-off-press {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_icon_favorite_off.png);
+}
+.favorite .ui-btn .ui-icon-checkbox-on,
+.favorite .ui-btn .ui-icon-checkbox-on-press {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_icon_favorite_on.png);
+}
+.ui-icon-radio-off {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_button_radio_bg.png);
+}
+.ui-icon-radio-on {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_button_radio_activated.png), url(images/00_button_radio_bg.png);
+}
+.ui-btn-down-s > .ui-btn-inner > .ui-icon-radio-on {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_button_radio_press.png), url(images/00_button_radio_press_bg.png);
+}
+.ui-btn-down-s > .ui-btn-inner > .ui-icon-radio-off {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_button_radio_press.png), url(images/00_button_radio_press_bg.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 {
+	.ui-field-contain { border-width: 0; padding: 0; margin: 0.8em 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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+label.ui-input-text {
+  font-size: 1rem;
+  line-height: 1.2;
+  display: block;
+  font-weight: normal;
+  margin: 0 0 .3em;
+}
+input.ui-input-text,
+textarea.ui-input-text {
+  background: #202432;
+  background-image: none;
+  padding: .4em;
+  line-height: 1.4;
+  font-size: 0.7272727272727273rem;
+  display: block;
+  -ms-border-radius: .1em;
+  -o-border-radius: .1em;
+  -webkit-border-radius: .1em;
+  -moz-border-radius: .1em;
+  border-radius: .1em;
+}
+input.ui-input-text.ui-focus,
+textarea.ui-input-text.ui-focus {
+  border: 1px solid #3a72ff;
+}
+input.ui-input-text {
+  appearance: none;
+  -webkit-appearance: none;
+}
+textarea.ui-input-text {
+  height: 2.272727272727273rem;
+  width: 95%;
+  resize: none;
+  -webkit-transition: height 200ms linear;
+  transition: height 200ms linear;
+  white-space: normal;
+}
+.ui-input-search {
+  position: relative;
+  padding-right: 1.7272727272727273rem;
+  padding-left: 1.7272727272727273rem;
+  border: 1px solid #3f4658;
+  /* temporarily delete 06.28 Heeju Joo*/
+
+  /*.ui-input-clear-hidden { display: none; }*/
+
+}
+.ui-input-search input.ui-input-text {
+  width: 100%;
+  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.6363636363636365rem;
+  height: 1.5rem;
+  display: inline-block;
+}
+.ui-input-search .ui-btn-icon-notext.ui-input-clear .ui-btn-inner {
+  padding: 0.20454545454545456rem 0.36363636363636365rem 0.20454545454545456rem 0.36363636363636365rem;
+}
+.ui-input-search .ui-btn-inner .ui-icon-deleteSearch {
+  margin: 0;
+  width: 1.0227272727272727rem;
+  height: 1.0227272727272727rem;
+}
+.ui-input-search .ui-input-clear {
+  position: absolute;
+  right: 0;
+  top: 0;
+  vertical-align: middle;
+}
+.ui-input-search.ui-focus {
+  border: 1px solid #3a72ff;
+}
+/* search bar */
+.ui-body-s > div > .ui-field-contain > .input-search-bar,
+.ui-body-s > .ui-field-contain > .input-search-bar {
+  margin: -2.1818181818181817rem -0.6818181818181819rem -1.4545454545454546rem -0.6818181818181819rem;
+}
+/* Need to confirm exact concept */
+.input-search-bar {
+  position: relative;
+  background-color: #1d263c;
+  padding: 0.36363636363636365rem;
+  vertical-align: middle;
+}
+.input-search-bar .ui-corner-all {
+  -o-border-radius: 0.3em;
+  -ms-border-radius: 0.3em;
+  -moz-border-radius: 0.3em;
+  -webkit-border-radius: 0.3em;
+  border-radius: 0.3em;
+}
+.input-search-bar .ui-input-search {
+  font-size: 0.7272727272727273rem;
+  display: block;
+  position: relative;
+  background-color: #000000;
+}
+.input-search-bar .ui-input-search .ui-input-text {
+  height: 1.4545454545454546rem;
+  padding: 0px;
+  margin-right: 1.7272727272727273rem;
+}
+.input-search-bar .ui-input-search .ui-input-text::-webkit-input-placeholder {
+  color: #5d6176;
+}
+.input-search-bar .ui-input-search .ui-image-search {
+  position: absolute;
+  top: 0px;
+  left: 0px;
+  width: 1.0227272727272727rem;
+  height: 1.0227272727272727rem;
+  margin-top: 0.20454545454545456rem;
+  margin-left: 0.36363636363636365rem;
+  margin-right: 0.36363636363636365rem;
+}
+.input-search-bar .ui-input-search-default {
+  margin-right: 3.3181818181818183rem;
+  -webkit-transition: all 400ms linear;
+  transition: all 400ms linear;
+}
+.input-search-bar .ui-input-search-wide {
+  margin-right: 0rem;
+  -webkit-transition: all 400ms linear;
+  transition: all 400ms linear;
+}
+.input-search-bar .ui-btn-icon-cancel.ui-input-cancel {
+  display: inline-block;
+  position: absolute;
+  top: 0.36363636363636365rem;
+  right: 0rem;
+  height: 1.5rem;
+  margin-right: 0.36363636363636365rem;
+  box-shadow: 0px 1px 1px #7a7d86 inset, 0px 1px 1px #222222;
+  vertical-align: middle;
+  padding: 0px;
+  border-color: none;
+  width: 3.090909090909091rem;
+  -webkit-transition: all 400ms linear;
+  transition: all 400ms linear;
+}
+.input-search-bar .ui-btn-icon-cancel.ui-input-cancel .ui-btn-inner {
+  padding-top: 0.2727272727272727rem;
+  padding-bottom: 0.2727272727272727rem;
+}
+.input-search-bar .ui-btn-icon-cancel.ui-input-cancel .ui-btn-inner .ui-btn-text {
+  font-size: 0.6818181818181819rem;
+}
+.input-search-bar .ui-btn-icon-cancel.ui-input-cancel.ui-btn-cancel-hide {
+  right: -3.409090909090909rem;
+  visibility: hidden;
+}
+.input-search-bar .ui-btn-icon-cancel.ui-input-cancel.ui-btn-cancel-show {
+  right: 0px;
+  visibility: visible;
+}
+.input-search-bar .ui-search-bar-icon {
+  margin-left: 1.8636363636363638rem;
+}
+.input-search-bar .ui-btn.ui-btn-search-front-icon {
+  position: absolute;
+  top: 0.29545454545454547rem;
+  width: 1.6363636363636365rem;
+  height: 1.6363636363636365rem;
+  padding: 0;
+  -o-border-radius: 0.8636363636363636rem ! important;
+  -ms-border-radius: 0.8636363636363636rem ! important;
+  -moz-border-radius: 0.8636363636363636rem ! important;
+  -webkit-border-radius: 0.8636363636363636rem ! important;
+  border-radius: 0.8636363636363636rem ! important;
+  box-shadow: 0px 1px 1px #7a7d86 inset, 0px 1px 1px #222222;
+}
+.input-search-bar .ui-btn.ui-btn-search-front-icon > .ui-btn-inner.ui-btn-icon-only {
+  width: 1.0227272727272727rem;
+  height: 1.0227272727272727rem;
+  padding: 0.29545454545454547rem 0.3181818181818182rem 0.3181818181818182rem 0.29545454545454547rem;
+  -o-border-radius: 0.8636363636363636rem ! important;
+  -ms-border-radius: 0.8636363636363636rem ! important;
+  -moz-border-radius: 0.8636363636363636rem ! important;
+  -webkit-border-radius: 0.8636363636363636rem ! important;
+  border-radius: 0.8636363636363636rem ! important;
+}
+.input-search-bar .ui-btn.ui-btn-search-front-icon > .ui-btn-inner.ui-btn-icon-only .ui-icon {
+  width: 1.0227272727272727rem;
+  height: 1.0227272727272727rem;
+  margin: 0;
+  background-position: 0 0;
+  background-size: 1.0227272727272727rem 1.0227272727272727rem;
+}
+.ui-header .input-search-bar {
+  border-top: 0.022727272727272728rem solid #3b4562;
+  padding-top: 0.36363636363636365rem;
+  padding-bottom: 0.36363636363636365rem;
+}
+.ui-image-search {
+  background-image: url(images/controls/00_search_icon.png);
+  background-repeat: no-repeat;
+  background-size: 1.0227272727272727rem 1.0227272727272727rem;
+}
+.ui-icon-deleteSearch {
+  background-image: url(images/controls/00_field_btn_clear.png);
+  background-repeat: no-repeat;
+  background-size: 1.0227272727272727rem 1.0227272727272727rem;
+}
+.ui-icon-deleteSearch:active {
+  background-image: url(images/controls/00_field_btn_clear_press.png);
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.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-vertical .ui-controlgroup-controls {
+  display: block;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn {
+  background: #44464e;
+  border-radius: 0;
+  border-color: #000000;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn:first-child {
+  border-top-left-radius: 0.3181818181818182rem;
+  border-top-right-radius: 0.3181818181818182rem;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn:last-child {
+  border-bottom-left-radius: 0.3181818181818182rem;
+  border-bottom-right-radius: 0.3181818181818182rem;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn-hover-s {
+  border-radius: 0 !important;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn-hover-s:first-child {
+  border-top-left-radius: 0.3181818181818182rem !important;
+  border-top-right-radius: 0.3181818181818182rem !important;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn-hover-s:last-child {
+  border-bottom-left-radius: 0.3181818181818182rem !important;
+  border-bottom-right-radius: 0.3181818181818182rem !important;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn-box-s {
+  border-radius: 0;
+  box-shadow: 0;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn-box-s .ui-btn-inner {
+  background: #44464e;
+  display: inline-block;
+  border: none;
+  border-radius: 0;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn-down-s .ui-btn-inner .ui-btn-text,
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"] .ui-btn-active-s .ui-btn-inner .ui-btn-text {
+  color: #fafafa;
+}
+.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-on .ui-btn-inner {
+  background: #000000;
+}
+.ui-controlgroup .ui-radio-on .ui-btn-inner .ui-btn-text {
+  color: #fafafa;
+}
+.ui-controlgroup.ui-controlgroup-padding-more {
+  padding-left: 2.6363636363636362rem;
+}
+.ui-controlgroup.ui-controlgroup-padding-back {
+  padding-right: 2.6363636363636362rem;
+}
+.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.7272727272727273rem;
+  margin-right: 0.7272727272727273rem;
+}
+.ui-controlgroup-horizontal {
+  padding: 0;
+}
+.ui-controlgroup-horizontal .ui-btn {
+  border-radius: 0;
+  display: inline-block;
+  margin-left: -0.18181818181818182rem;
+  margin-right: -0.13636363636363635rem;
+}
+.ui-controlgroup-horizontal .ui-btn:first-child {
+  border-top-left-radius: 0.3181818181818182rem;
+  border-bottom-left-radius: 0.3181818181818182rem;
+}
+.ui-controlgroup-horizontal .ui-btn:last-child {
+  border-top-right-radius: 0.3181818181818182rem;
+  border-bottom-right-radius: 0.3181818181818182rem;
+}
+.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;
+}
+.ui-controlgroup-horizontal [data-role="button"] {
+  box-shadow: none;
+  background: none;
+}
+.ui-controlgroup-horizontal [data-role="button"].ui-btn-down-s .ui-btn-inner .ui-btn-text,
+.ui-controlgroup-horizontal [data-role="button"] .ui-btn-active-s .ui-btn-inner .ui-btn-text {
+  color: #fafafa;
+}
+.ui-controlgroup-horizontal [data-role="button"] > .ui-btn-inner {
+  border: 0px solid;
+  box-shadow: none;
+  padding-top: 0px;
+  padding-bottom: 3px;
+  padding-left: 0.4545454545454546rem;
+  padding-right: 0.4545454545454546rem;
+}
+.ui-controlgroup-horizontal [data-role="button"].ui-btn-hover-s {
+  border-radius: 0 !important;
+}
+.ui-controlgroup-horizontal [data-role="button"].ui-btn-hover-s:first-child {
+  border-top-left-radius: 0.3181818181818182rem !important;
+  border-bottom-left-radius: 0.3181818181818182rem !important;
+}
+.ui-controlgroup-horizontal [data-role="button"].ui-btn-hover-s:last-child {
+  border-top-right-radius: 0.3181818181818182rem !important;
+  border-bottom-right-radius: 0.3181818181818182rem !important;
+}
+.ui-controlgroup-horizontal label {
+  width: 100%;
+}
+.ui-controlgroup-horizontal label > span.ui-btn-inner {
+  padding-top: 0.13636363636363635rem;
+  padding-bottom: 0.13636363636363635rem;
+}
+/*
+* 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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/************************/
+.ui-listview {
+  margin: 0;
+  counter-reset: listnumbering;
+  border-top-color: #404040;
+  /* listview: fonts for li with a link */
+
+}
+.ui-listview li.ui-btn > .ui-btn-hastxt > .ui-btn-text.ui-btn-text-padding-right {
+  padding-right: 0rem;
+}
+.ui-listview .ui-li {
+  border-left-width: 0px;
+  border-right-width: 0px;
+  border-top-width: 0px;
+}
+.ui-listview .ui-li > .ui-btn-inner {
+  border-bottom-width: 1px;
+  border-bottom-style: solid;
+  border-bottom-color: #404040;
+  margin-left: 0.5909090909090909rem;
+  margin-right: 0.5909090909090909rem;
+}
+.ui-listview .ui-li-static {
+  background-color: #000000;
+  border-bottom-width: 1px;
+  border-bottom-style: solid;
+  border-bottom-color: #404040;
+  margin-left: 0.5909090909090909rem;
+  margin-right: 0.5909090909090909rem;
+}
+.ui-listview .ui-li:not(.ui-li-divider):not(.ui-li-static) {
+  min-height: 2.5rem;
+}
+.ui-listview .ui-li.ui-li-has-multiline:not(.ui-li-divider):not(.ui-li-static) {
+  min-height: 2.8181818181818183rem;
+}
+.ui-listview li.ui-btn-up-s,
+.ui-listview li.ui-btn-hover-s {
+  background: none;
+  background-color: #000000;
+  color: #fafafa;
+  box-shadow: none;
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+}
+.ui-listview li.ui-btn-down-s {
+  background: none;
+  background-color: #2b3aaf;
+  color: #fafafa;
+  box-shadow: none;
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+}
+.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 {
+  color: #fafafa;
+}
+.ui-listview li.ui-btn-down-s > .ui-li > .ui-btn-text > a.ui-link-inherit {
+  color: #fafafa;
+}
+.ui-content .ui-listview {
+  margin-left: -0.36363636363636365rem;
+  margin-right: -0.36363636363636365rem;
+  padding-bottom: 1px;
+}
+.ui-content .ui-listview .ui-listview {
+  margin: 0;
+}
+.ui-content .ui-listview-inset {
+  margin: 1em 0;
+}
+.ui-listview,
+.ui-li,
+.ui-collapsible-heading {
+  list-style: none;
+  padding: 0;
+  font-size: 1rem;
+}
+.ui-li,
+.ui-collapsible-heading,
+.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 h3,
+.ui-collapsible-heading h3,
+.ui-collapsible > .ui-collapsible-content h3,
+.ui-listview li h3 {
+  margin-top: 0px;
+  margin-bottom: 0px;
+  font-size: 1rem;
+  font-weight: normal;
+}
+.ui-li form,
+.ui-collapsible-heading form,
+.ui-collapsible > .ui-collapsible-content form,
+.ui-listview li form {
+  display: inline-block;
+}
+.ui-li .ui-btn-text,
+.ui-collapsible-heading .ui-btn-text,
+.ui-collapsible > .ui-collapsible-content .ui-btn-text,
+.ui-listview li .ui-btn-text {
+  position: relative;
+}
+.ui-li .ui-btn-text a.ui-link-inherit,
+.ui-collapsible-heading .ui-btn-text a.ui-link-inherit,
+.ui-collapsible > .ui-collapsible-content .ui-btn-text a.ui-link-inherit,
+.ui-listview li .ui-btn-text a.ui-link-inherit {
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+.ui-li:last-child,
+.ui-collapsible-heading:last-child,
+.ui-collapsible > .ui-collapsible-content:last-child,
+.ui-listview li:last-child,
+.ui-li.ui-field-contain:last-child,
+.ui-collapsible-heading.ui-field-contain:last-child,
+.ui-collapsible > .ui-collapsible-content.ui-field-contain:last-child,
+.ui-listview li.ui-field-contain:last-child {
+  border-bottom-width: 1px;
+}
+.ui-li > .ui-btn-inner,
+.ui-collapsible-heading > .ui-btn-inner,
+.ui-collapsible > .ui-collapsible-content > .ui-btn-inner,
+.ui-listview li > .ui-btn-inner,
+.ui-li.ui-collapsible-heading > .ui-collapsible-heading-toggle,
+.ui-collapsible-heading.ui-collapsible-heading > .ui-collapsible-heading-toggle,
+.ui-collapsible > .ui-collapsible-content.ui-collapsible-heading > .ui-collapsible-heading-toggle,
+.ui-listview li.ui-collapsible-heading > .ui-collapsible-heading-toggle {
+  display: block;
+  position: relative;
+  padding: 0;
+  border-width: 0;
+}
+.ui-li > .ui-btn-inner.ui-btn-hastxt,
+.ui-collapsible-heading > .ui-btn-inner.ui-btn-hastxt,
+.ui-collapsible > .ui-collapsible-content > .ui-btn-inner.ui-btn-hastxt,
+.ui-listview li > .ui-btn-inner.ui-btn-hastxt {
+  padding: 0px 0px;
+}
+.ui-li .ui-btn-inner a.ui-link-inherit,
+.ui-collapsible-heading .ui-btn-inner a.ui-link-inherit,
+.ui-collapsible > .ui-collapsible-content .ui-btn-inner a.ui-link-inherit,
+.ui-listview li .ui-btn-inner a.ui-link-inherit,
+.ui-li .ui-collapsible-heading-toggle > .ui-btn-inner,
+.ui-collapsible-heading .ui-collapsible-heading-toggle > .ui-btn-inner,
+.ui-collapsible > .ui-collapsible-content .ui-collapsible-heading-toggle > .ui-btn-inner,
+.ui-listview li .ui-collapsible-heading-toggle > .ui-btn-inner,
+.ui-li > li,
+.ui-collapsible-heading > li,
+.ui-collapsible > .ui-collapsible-content > li,
+.ui-listview li > li,
+.ui-li.ui-li-static,
+.ui-collapsible-heading.ui-li-static,
+.ui-collapsible > .ui-collapsible-content.ui-li-static,
+.ui-listview li.ui-li-static {
+  padding-top: 0.6818181818181819rem;
+  padding-bottom: 0.6818181818181819rem;
+  display: block;
+  white-space: normal;
+  border-left-width: 0px;
+  border-right-width: 0px;
+}
+.ui-li .ui-btn-inner a.ui-link-inherit,
+.ui-collapsible-heading .ui-btn-inner a.ui-link-inherit,
+.ui-collapsible > .ui-collapsible-content .ui-btn-inner a.ui-link-inherit,
+.ui-listview li .ui-btn-inner a.ui-link-inherit,
+.ui-li .ui-collapsible-heading-toggle,
+.ui-collapsible-heading .ui-collapsible-heading-toggle,
+.ui-collapsible > .ui-collapsible-content .ui-collapsible-heading-toggle,
+.ui-listview li .ui-collapsible-heading-toggle {
+  white-space: normal;
+  overflow: visible !important;
+}
+.ui-li .ui-toggle-switch:last-child,
+.ui-collapsible-heading .ui-toggle-switch:last-child,
+.ui-collapsible > .ui-collapsible-content .ui-toggle-switch:last-child,
+.ui-listview li .ui-toggle-switch:last-child {
+  top: 50%;
+  margin-top: -0.7727272727272727rem;
+  display: inline-block;
+  position: absolute;
+  right: -1px;
+}
+.ui-li [data-role="button"]:last-child,
+.ui-collapsible-heading [data-role="button"]:last-child,
+.ui-collapsible > .ui-collapsible-content [data-role="button"]:last-child,
+.ui-listview li [data-role="button"]:last-child {
+  position: absolute;
+  right: 0px;
+}
+.ui-li .ui-radio:first-child,
+.ui-collapsible-heading .ui-radio:first-child,
+.ui-collapsible > .ui-collapsible-content .ui-radio:first-child,
+.ui-listview li .ui-radio:first-child,
+.ui-li .ui-checkbox:first-child,
+.ui-collapsible-heading .ui-checkbox:first-child,
+.ui-collapsible > .ui-collapsible-content .ui-checkbox:first-child,
+.ui-listview li .ui-checkbox:first-child {
+  position: absolute;
+  top: 50%;
+  margin-top: -0.6818181818181819rem;
+  left: -0.2272727272727273rem;
+  width: 1.3636363636363638rem;
+  height: 1.3636363636363638rem;
+}
+.ui-li .ui-radio:first-child .ui-btn-inner,
+.ui-collapsible-heading .ui-radio:first-child .ui-btn-inner,
+.ui-collapsible > .ui-collapsible-content .ui-radio:first-child .ui-btn-inner,
+.ui-listview li .ui-radio:first-child .ui-btn-inner,
+.ui-li .ui-checkbox:first-child .ui-btn-inner,
+.ui-collapsible-heading .ui-checkbox:first-child .ui-btn-inner,
+.ui-collapsible > .ui-collapsible-content .ui-checkbox:first-child .ui-btn-inner,
+.ui-listview li .ui-checkbox:first-child .ui-btn-inner {
+  line-height: 0.9090909090909092rem;
+  color: transparent;
+}
+.ui-li .ui-radio:first-child .ui-btn-inner .ui-icon,
+.ui-collapsible-heading .ui-radio:first-child .ui-btn-inner .ui-icon,
+.ui-collapsible > .ui-collapsible-content .ui-radio:first-child .ui-btn-inner .ui-icon,
+.ui-listview li .ui-radio:first-child .ui-btn-inner .ui-icon,
+.ui-li .ui-checkbox:first-child .ui-btn-inner .ui-icon,
+.ui-collapsible-heading .ui-checkbox:first-child .ui-btn-inner .ui-icon,
+.ui-collapsible > .ui-collapsible-content .ui-checkbox:first-child .ui-btn-inner .ui-icon,
+.ui-listview li .ui-checkbox:first-child .ui-btn-inner .ui-icon {
+  left: 0.2272727272727273rem;
+}
+.ui-li .ui-radio:first-child label.ui-btn-icon_only,
+.ui-collapsible-heading .ui-radio:first-child label.ui-btn-icon_only,
+.ui-collapsible > .ui-collapsible-content .ui-radio:first-child label.ui-btn-icon_only,
+.ui-listview li .ui-radio:first-child label.ui-btn-icon_only,
+.ui-li .ui-checkbox:first-child label.ui-btn-icon_only,
+.ui-collapsible-heading .ui-checkbox:first-child label.ui-btn-icon_only,
+.ui-collapsible > .ui-collapsible-content .ui-checkbox:first-child label.ui-btn-icon_only,
+.ui-listview li .ui-checkbox:first-child label.ui-btn-icon_only {
+  top: 0px;
+  margin-top: 0px;
+}
+.ui-li img.ui-li-bigicon,
+.ui-collapsible-heading img.ui-li-bigicon,
+.ui-collapsible > .ui-collapsible-content img.ui-li-bigicon,
+.ui-listview li img.ui-li-bigicon {
+  position: absolute;
+  width: 1.6363636363636365rem;
+  height: 1.6363636363636365rem;
+  top: 50%;
+  margin-top: -0.8181818181818182rem;
+}
+.ui-li img.ui-li-bigicon:first-child,
+.ui-collapsible-heading img.ui-li-bigicon:first-child,
+.ui-collapsible > .ui-collapsible-content img.ui-li-bigicon:first-child,
+.ui-listview li img.ui-li-bigicon:first-child {
+  left: 0px;
+}
+.ui-li img.ui-li-bigicon:nth-child(2),
+.ui-collapsible-heading img.ui-li-bigicon:nth-child(2),
+.ui-collapsible > .ui-collapsible-content img.ui-li-bigicon:nth-child(2),
+.ui-listview li img.ui-li-bigicon:nth-child(2) {
+  left: 1.7272727272727273rem;
+}
+.ui-li img.ui-li-bigicon:last-child,
+.ui-collapsible-heading img.ui-li-bigicon:last-child,
+.ui-collapsible > .ui-collapsible-content img.ui-li-bigicon:last-child,
+.ui-listview li img.ui-li-bigicon:last-child {
+  right: 0.7272727272727273rem;
+}
+.ui-li .ui-li-color-bar + img.ui-li-bigicon:nth-child(2),
+.ui-collapsible-heading .ui-li-color-bar + img.ui-li-bigicon:nth-child(2),
+.ui-collapsible > .ui-collapsible-content .ui-li-color-bar + img.ui-li-bigicon:nth-child(2),
+.ui-listview li .ui-li-color-bar + img.ui-li-bigicon:nth-child(2) {
+  left: 0px;
+}
+.ui-li .ui-li-color-bar,
+.ui-collapsible-heading .ui-li-color-bar,
+.ui-collapsible > .ui-collapsible-content .ui-li-color-bar,
+.ui-listview li .ui-li-color-bar {
+  position: absolute;
+  width: 0.13636363636363635rem;
+  height: 100%;
+  top: 0rem;
+  left: -0.5909090909090909rem;
+  background-color: #000000;
+}
+li.ui-li-thumbnail-right img.ui-li-bigicon.ui-li-thumb {
+  left: auto;
+  right: 0px;
+  width: 2.272727272727273rem;
+  height: 2.272727272727273rem;
+  margin-top: -1.1363636363636365rem;
+}
+.ui-li.ui-li-has-multiline .ui-btn-inner a.ui-link-inherit,
+.ui-li.ui-li-has-multiline.ui-li-static {
+  padding-top: 0.3181818181818182rem;
+  padding-bottom: 1.2727272727272727rem;
+}
+.ui-li.ui-li-has-multiline a {
+  white-space: normal;
+  overflow: visible !important;
+  padding-right: 0.7272727272727273rem;
+  /* ellipsis for normal text */
+
+}
+/********************************************/
+/************  Add ellipsis *****************/
+/********************************************/
+.ui-li.ui-li-text-ellipsis .ui-btn-inner a.ui-link-inherit {
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+.ui-li.ui-li-text-ellipsis a {
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+.ui-li.ui-li-text-ellipsis.ui-li-static {
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+/********************************************/
+/*************** Edit Field *****************/
+/********************************************/
+.ui-li > input {
+  border-style: none;
+  border-width: 0px;
+  outline-color: #000000;
+  font-size: 1.0454545454545454rem;
+  line-height: 1;
+  padding-top: 0px;
+  padding-bottom: 0px;
+  color: #202432;
+}
+/********************************************/
+/*************** Divider ********************/
+/********************************************/
+.ui-listview li.ui-li-divider {
+  background: #000000;
+  color: #425790;
+  border-bottom-width: 0px;
+  border-top-width: 0px;
+  cursor: default;
+  counter-reset: listnumbering;
+  font-weight: bold;
+  height: 1.2727272727272727rem;
+  font-size: 0.7272727272727273rem;
+}
+.ui-listview li.ui-li-divider > .ui-btn-inner > .ui-btn-text {
+  font-size: 0.7272727272727273rem;
+}
+.ui-listview li.ui-li-divider:active {
+  background-color: #2b3aaf;
+  color: #fafafa;
+}
+.ui-listview li.ui-li-divider:active .ui-divider-normal-line {
+  background: #fafafa;
+}
+.ui-listview li.ui-li-divider.ui-btn {
+  top: 0px;
+  margin-top: 0rem;
+  border-radius: 0px;
+  font-size: 0.7272727272727273rem;
+}
+.ui-listview li.ui-li-divider.ui-btn .ui-btn-inner.ui-btn-hastxt {
+  height: 100%;
+  padding-left: 0px;
+}
+.ui-listview li.ui-li-divider.ui-btn .ui-btn-inner.ui-btn-hastxt .ui-btn-text {
+  position: absolute;
+  top: 0.2272727272727273rem;
+  height: 0.8181818181818182rem;
+  padding-right: 0.4545454545454546rem;
+}
+.ui-listview li.ui-li-divider:not(.ui-btn) {
+  padding-top: 0.4545454545454546rem;
+}
+.ui-listview li.ui-li-divider:focus {
+  outline: none;
+}
+.ui-listview li.ui-li-divider > .ui-btn-text {
+  position: absolute;
+  top: 0.4545454545454546rem;
+  height: 0.8636363636363636rem;
+  padding-left: 0.5909090909090909rem;
+  padding-right: 0.5909090909090909rem;
+}
+.ui-listview li.ui-li-divider[data-style="dialogue"] {
+  background-color: #000000;
+  height: 1.0454545454545454rem;
+  padding: 0px;
+  padding-top: 0.7272727272727273rem;
+  padding-bottom: 0rem;
+  padding-left: 0.4545454545454546rem;
+  margin-left: 0.18181818181818182rem;
+  margin-right: 0.18181818181818182rem;
+  font-size: 0.7272727272727273rem;
+  font-weight: bold;
+  color: #5d83ff;
+}
+.ui-listview li.ui-li-divider[data-style="check"] {
+  height: 1.7272727272727273rem;
+  padding-top: 0px;
+  padding-bottom: 0px;
+  padding-left: 0px;
+}
+.ui-listview li.ui-li-divider[data-style="check"] label {
+  top: 0px;
+  margin: 0;
+}
+.ui-listview li.ui-li-divider[data-style="check"] label .ui-btn-inner {
+  z-index: 5;
+  position: absolute;
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background: #000000;
+  padding: 0;
+}
+.ui-listview li.ui-li-divider[data-style="check"] .ui-btn-text {
+  padding-left: 1.6818181818181819rem;
+}
+.ui-listview li.ui-li-divider[data-style="check"]:active label .ui-btn-inner {
+  background-color: #2b3aaf;
+}
+.ui-listview li.ui-li-divider .ui-divider-normal-line {
+  display: inline-block;
+  position: absolute;
+  top: 1.3181818181818181rem;
+  width: 100%;
+  height: 0.09090909090909091rem;
+  background: #425790;
+}
+.ui-listview li.ui-li-divider.ui-btn-down-s {
+  background: #425790;
+  color: #000000;
+}
+.ui-listview li.ui-li-divider.ui-btn-down-s .ui-divider-normal-line {
+  background: #000000;
+}
+.ui-listview li.ui-li-divider.ui-btn-down-s label > .ui-btn-inner {
+  background: #425790;
+}
+.ui-listview li.ui-li-divider + li.ui-li-dialogue {
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.ui-divider-expand-div {
+  position: absolute;
+  width: 4.454545454545455rem;
+  height: 1.9090909090909092rem;
+  top: 0.4545454545454546rem;
+  right: 0px;
+  border-left-width: 1px;
+  border-left-style: solid;
+  border-left-color: rgba(0, 0, 0, 0.5);
+}
+.ui-li-has-thumb:not(.ui-li-thumbnail-right) .ui-btn-inner a.ui-link-inherit,
+.ui-li-has-thumb:not(.ui-li-thumbnail-right).ui-li-static {
+  padding-left: 2.272727272727273rem;
+}
+.ui-li-has-thumb:not(.ui-li-thumbnail-right) .ui-li-text-sub {
+  padding-left: 2.0454545454545454rem;
+  padding-right: 0px;
+  /* ellipsis for sub text */
+
+}
+.ui-li-has-checkbox .ui-btn-inner a.ui-link-inherit,
+.ui-li-has-radio .ui-btn-inner a.ui-link-inherit,
+.ui-li-has-checkbox.ui-li-static,
+.ui-li-has-radio.ui-li-static {
+  padding-left: 1.7272727272727273rem;
+}
+.ui-li-has-checkbox .ui-li-text-sub,
+.ui-li-has-radio .ui-li-text-sub {
+  padding-left: 1.7272727272727273rem;
+}
+.ui-li-has-thumb.ui-li-has-checkbox .ui-btn-inner a.ui-link-inherit,
+.ui-li-has-thumb.ui-li-has-radio .ui-btn-inner a.ui-link-inherit,
+.ui-li-has-thumb.ui-li-has-checkbox.ui-li-static,
+.ui-li-has-thumb.ui-li-has-radio.ui-li-static {
+  padding-left: 3.7272727272727275rem;
+}
+.ui-li-has-thumb.ui-li-has-checkbox .ui-li-text-sub,
+.ui-li-has-thumb.ui-li-has-radio .ui-li-text-sub {
+  padding-left: 3.7272727272727275rem;
+}
+.ui-li.ui-li-has-right-circle-btn .ui-btn-inner a {
+  padding-right: 2.1818181818181817rem;
+}
+.ui-li.ui-li-has-right-btn:not(.ui-swipe) .ui-btn-inner a {
+  padding-right: 3.590909090909091rem;
+}
+.ui-li.ui-li-thumbnail-right .ui-btn-inner a {
+  padding-right: 2.3636363636363638rem;
+}
+.ui-li.ui-li-static.ui-li-has-right-circle-btn {
+  padding-right: 2.1818181818181817rem;
+}
+.ui-li.ui-li-static.ui-li-has-right-btn:not(.ui-swipe) {
+  padding-right: 3.590909090909091rem;
+}
+.ui-li.ui-li-static.ui-li-thumbnail-right {
+  padding-right: 2.3636363636363638rem;
+}
+.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-icon .ui-li-text-sub {
+  padding-left: 40px;
+}
+.ui-li-heading {
+  font-size: 16px;
+  font-weight: bold;
+  display: block;
+  margin: .6em 0;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+.ui-li-thumb,
+.ui-li-icon {
+  position: absolute;
+  left: 1px;
+  top: 0;
+  max-height: 3.272727272727273rem;
+  max-width: 3.272727272727273rem;
+}
+.ui-listview * .ui-btn-inner > .ui-btn > .ui-btn-inner {
+  border-top: 0px;
+}
+.ui-li-sub,
+.ui-li-sub-setting {
+  float: right;
+  text-align: right;
+  font-size: 0.7272727272727273rem;
+  margin: .3em 0;
+}
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+/* ~~~~~~~~~~~~~~              NEW   LIST   STYLE                   ~~~~~~~~~ */
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+.ui-li-text-sub {
+  float: right;
+  text-align: right;
+  font-size: 0.7272727272727273rem;
+  font-weight: bold;
+  color: #6e6f76;
+  position: absolute;
+  right: 0px;
+  top: 0.9090909090909092rem;
+  width: 95%;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+.ui-li-text-sub > img {
+  position: relative;
+  width: 1rem;
+  height: 1rem;
+  margin: 0 0.36363636363636365rem 0 0.36363636363636365rem;
+  vertical-align: bottom;
+}
+.ui-li-text-sub2 {
+  float: right;
+  text-align: right;
+  font-size: 0.5454545454545454rem;
+  font-weight: bold;
+  color: #6e6f76;
+  position: absolute;
+  right: 0px;
+  top: 0.5454545454545454rem;
+  width: 60%;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+.ui-li-text-sub2 > img {
+  width: 1rem;
+  height: 1rem;
+  margin: 0 0 0 0.36363636363636365rem;
+}
+/*
+li:not(.ui-li-has-multiline) .ui-li-text-sub {
+	position : absolute;
+	right : 16 * @unit_base;
+	top: 22 * @unit_base;
+	margin-top: 0px;
+}*/
+.ui-li-has-multiline .ui-li-text-sub {
+  position: absolute;
+  text-align: left;
+  right: auto;
+  left: 0px;
+  top: 1.590909090909091rem;
+  margin-top: 0px;
+  width: 90%;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+.ui-li-has-multiline.ui-li-has-right-btn .ui-btn-inner a .ui-li-text-sub {
+  width: 74%;
+}
+.ui-li-has-multiline.ui-li-has-right-btn.ui-li-has-thumb .ui-btn-inner a .ui-li-text-sub {
+  width: 64%;
+}
+.ui-li-has-multiline.ui-li-static.ui-li-has-right-btn .ui-li-text-sub {
+  width: 74%;
+}
+.ui-li-has-multiline.ui-li-static.ui-li-has-right-btn.ui-li-has-thumb .ui-li-text-sub {
+  width: 64%;
+}
+.ui-li-icon-sub-right,
+.ui-li-icon-sub {
+  position: absolute;
+  left: auto;
+  width: 1rem;
+  height: 1rem;
+  margin: 0 0;
+  margin-left: 8px;
+}
+.ui-li-icon-sub-right {
+  right: 0.36363636363636365rem;
+}
+.ui-listview li.ui-li-dialogue {
+  background: #11131b;
+  margin-left: 0.36363636363636365rem;
+  margin-right: 0.36363636363636365rem;
+  padding-left: 0.4545454545454546rem;
+  padding-right: 0.4545454545454546rem;
+  border-style: solid;
+  border-color: rgba(98, 105, 127, 0.3);
+  border-width: 1px;
+  border-top-width: 0px;
+}
+.ui-listview li.ui-li-dialogue > .ui-btn-inner {
+  margin-left: 0px;
+  margin-right: 0px;
+  border-bottom-width: 0px;
+}
+.ui-listview li.ui-li-dialogue:first-child {
+  border-top-width: 1px;
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.ui-listview li.ui-li-dialogue:last-child {
+  border-bottom-left-radius: 3px;
+  border-bottom-right-radius: 3px;
+}
+.ui-listview li.ui-li-dialogue > img {
+  margin-left: 0.2727272727272727rem;
+}
+.ui-listview li.ui-li-dialogue [data-role="button"]:last-child {
+  margin-right: 0.4545454545454546rem;
+}
+.ui-listview li.ui-li-dialogue .ui-link-inherit > .ui-btn {
+  margin-right: 0px;
+}
+.ui-listview li.ui-li-dialogue.ui-li-static .ui-li-text-sub,
+.ui-listview li.ui-li-dialogue.ui-li-static .ui-toggle-switch {
+  right: 0.4545454545454546rem;
+}
+.ui-listview li.ui-li-dialogue.ui-li-static.ui-li-has-checkbox,
+.ui-listview li.ui-li-dialogue.ui-li-static.ui-li-has-radio {
+  padding-left: 2rem;
+}
+.ui-listview li.ui-li-dialogue.ui-li-static .ui-checkbox,
+.ui-listview li.ui-li-dialogue.ui-li-static .ui-radio {
+  left: 0px;
+}
+.ui-listview li.ui-li-dialogue.ui-li-has-multiline.ui-li-static .ui-li-text-sub {
+  padding-left: 0.4545454545454546rem;
+}
+.ui-listview li.ui-li-dialogue.ui-li-has-multiline.ui-li-static .ui-li-text-sub2 {
+  padding-right: 0.4545454545454546rem;
+}
+.ui-listview li.ui-li-dialogue.ui-li-has-multiline.ui-li-static.ui-li-has-checkbox .ui-li-text-sub,
+.ui-listview li.ui-li-dialogue.ui-li-has-multiline.ui-li-static.ui-li-has-radio .ui-li-text-sub {
+  padding-left: 1.9090909090909092rem;
+}
+.ui-listview li.ui-li-divider + .ui-li-dialogue {
+  border-top-width: 1px;
+}
+.ui-listview > li.ui-li-dialogue.ui-btn-hover-up-s:not(.ui-btn-down-s):not(.ui-li-expanded),
+.ui-listview > li.ui-li-dialogue.ui-btn-up-s:not(.ui-li-expanded) {
+  background: #11131b;
+}
+.ui-listview > li.ui-li-dialogue.ui-btn-down-s:not(.ui-li-expanded) {
+  background: #2b3aaf;
+}
+.ui-listview > li.ui-li-dialogue.ui-li-expanded {
+  padding-left: 1.1818181818181819rem;
+  background: #dcdad3;
+}
+.ui-listview > li.ui-li-dialogue.ui-li-divider {
+  height: 1.4545454545454546rem;
+  padding: 0px;
+}
+.ui-listview > li.ui-li-group-title {
+  padding-top: 1.4545454545454546rem;
+}
+.ui-listview > li.ui-li-group-title span {
+  padding-left: 0.7272727272727273rem;
+}
+.ui-listview > li.ui-li-dialogue-divider {
+  padding-top: 0.9090909090909092rem;
+  padding-bottom: 0rem;
+  padding-left: 0.4545454545454546rem;
+  margin-left: 0.18181818181818182rem;
+  margin-right: 0.18181818181818182rem;
+  background: #11131b;
+  font-size: 0.7272727272727273rem;
+  font-weight: bold;
+  color: #5d83ff;
+}
+.ui-listview li.ui-li-dialogue-edit {
+  padding-left: 5.2727272727272725rem;
+  padding-top: 0.5454545454545454rem;
+  padding-bottom: 0.5454545454545454rem;
+}
+.ui-listview li.ui-li-dialogue-edit .ui-edit-title {
+  position: absolute;
+  left: 0.4545454545454546rem;
+  width: 4.136363636363637rem;
+  padding-right: 0.36363636363636365rem;
+  display: inline-block;
+  top: 50%;
+  margin-top: -0.5909090909090909rem;
+  border-right-color: #b9b8b2;
+  border-right-width: 1px;
+  border-right-style: solid;
+}
+.ui-listview li.ui-li-dialogue-edit input {
+  font-size: 1rem;
+  background: transparent;
+  outline-color: transparent;
+  width: 100%;
+  padding-left: 0px;
+  padding-right: 0px;
+  border: none;
+  color: #fafafa;
+}
+.ui-listview > .ui-li.ui-li-dialogue-edit.ui-li-has-right-btn {
+  padding-right: 5rem;
+}
+.ui-listview .ui-li-bubble-receive,
+.ui-listview .ui-li-bubble-left,
+.ui-listview .ui-li-bubble-sent,
+.ui-listview .ui-li-bubble-right,
+.ui-listview .ui-li-bubble-sos {
+  display: inline-block;
+  background-clip: padding-box;
+  max-width: 100%;
+  word-wrap: break-word;
+  font-size: 0.8636363636363636rem;
+}
+.ui-listview .ui-li-bubble-receive p,
+.ui-listview .ui-li-bubble-left p,
+.ui-listview .ui-li-bubble-sent p,
+.ui-listview .ui-li-bubble-right p,
+.ui-listview .ui-li-bubble-sos p,
+.ui-listview .ui-li-bubble-receive span,
+.ui-listview .ui-li-bubble-left span,
+.ui-listview .ui-li-bubble-sent span,
+.ui-listview .ui-li-bubble-right span,
+.ui-listview .ui-li-bubble-sos span {
+  font-size: 0.8636363636363636rem;
+}
+.ui-listview .ui-li-bubble-receive img,
+.ui-listview .ui-li-bubble-left img,
+.ui-listview .ui-li-bubble-sent img,
+.ui-listview .ui-li-bubble-right img,
+.ui-listview .ui-li-bubble-sos img {
+  position: relative;
+  min-width: 7.272727272727273rem;
+  min-height: 7.272727272727273rem;
+}
+.ui-listview .ui-li-bubble-receive:first-child,
+.ui-listview .ui-li-bubble-left:first-child,
+.ui-listview .ui-li-bubble-sent:first-child,
+.ui-listview .ui-li-bubble-right:first-child,
+.ui-listview .ui-li-bubble-sos:first-child {
+  margin-top: 0.6818181818181819rem;
+}
+.ui-listview .ui-li-static.ui-li-bubble-receive,
+.ui-listview .ui-li-static.ui-li-bubble-left {
+  margin-left: 0px;
+  margin-right: 4.545454545454546rem;
+  border-image-source: url(images/00_messagebubble_bg_receive.9.png);
+  border-image-slice: 60 22 19 57 fill;
+  border-image-width: auto;
+  padding: 9px 14px 21px 48px;
+  color: #000000;
+}
+.ui-listview .ui-li-static.ui-li-bubble-receive > .ui-li-bubble-time,
+.ui-listview .ui-li-static.ui-li-bubble-left > .ui-li-bubble-time {
+  margin-left: 0.3181818181818182rem;
+  position: absolute;
+  display: inline-block;
+  bottom: 0.5454545454545454rem;
+  left: 100%;
+  font-size: 0.5rem;
+  text-align: left;
+  color: #6e6f76;
+}
+.ui-listview .ui-li-static.ui-li-bubble-sent,
+.ui-listview .ui-li-static.ui-li-bubble-right {
+  margin-left: 4.545454545454546rem;
+  margin-right: 0px;
+  border-image-source: url(images/00_messagebubble_bg_sent.9.png);
+  border-image-slice: 55 47 20 13 fill;
+  border-image-width: auto;
+  padding: 9px 47px 20px 13px;
+  color: #000000;
+}
+.ui-listview .ui-li-static.ui-li-bubble-sent > .ui-li-bubble-time,
+.ui-listview .ui-li-static.ui-li-bubble-right > .ui-li-bubble-time {
+  margin-right: 0.3181818181818182rem;
+  text-align: right;
+  color: #6e6f76;
+  position: absolute;
+  display: inline-block;
+  bottom: 0.5454545454545454rem;
+  right: 100%;
+  font-size: 0.5rem;
+}
+.ui-listview .ui-li-static.ui-li-bubble-sos {
+  color: #d10000;
+}
+.ui-listview .ui-li-static.ui-li-bubble-sos > .ui-li-bubble-time {
+  color: #d10000;
+}
+.ui-listview .ui-li-static.ui-li-bubble-date {
+  color: #686868;
+  font-style: italic;
+  width: auto;
+  height: 1.0909090909090908rem;
+  background-image: url(images/00_messagebubble_date_bg.png);
+  background-repeat: repeat-x;
+  background-position: center center;
+  font-size: 0.7272727272727273rem;
+  margin: 0.9090909090909092rem 0.2727272727272727rem;
+  border: 0px none red;
+  padding: 0 0;
+  padding-top: 0.5em;
+  margin-left: 23px;
+  margin-right: 23px;
+  text-align: center;
+}
+.ui-listview .ui-li-static.ui-li-bubble-date * {
+  display: inline-block;
+  background-color: #000000;
+  padding-left: 0.5em;
+  padding-right: 0.5em;
+}
+.ui-listview span.ui-li-bubble-time {
+  font-weight: bold;
+  width: 3.181818181818182rem;
+}
+@-webkit-keyframes addliitem {
+  from {
+    -webkit-transform: scale(0.5);
+    -moz-transform: scale(0.5);
+    opacity: 0;
+  }
+  to {
+    -webkit-transform: scale(1);
+    -moz-transform: scale(1);
+    opacity: 1;
+  }
+}
+.addli {
+  -webkit-animation-name: addliitem;
+  -moz-animation-name: addliitem;
+  -webkit-animation-duration: 0.5s;
+  -moz-animation-duration: 0.5s;
+  -webkit-transition-timing-function: linear;
+  -moz-transition-timing-function: linear;
+}
+@-webkit-keyframes removeliitem {
+  from {
+    -webkit-transform: scale(1);
+    -moz-transform: scale(1);
+    opacity: 1;
+  }
+  to {
+    -webkit-transform: scale(0.5);
+    -moz-transform: scale(0.5);
+    opacity: 0;
+  }
+}
+.removeli {
+  -webkit-animation-name: removeliitem;
+  -moz-animation-name: removeliitem;
+  -webkit-animation-duration: 0.5s;
+  -moz-animation-duration: 0.5s;
+  -webkit-transition-timing-function: linear;
+  -moz-transition-timing-function: linear;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-controlgroup .ui-radio > .ui-btn {
+  background: #000000;
+}
+.ui-controlgroup .ui-btn-text {
+  font-size: 0.7727272727272727rem;
+  font-weight: bold;
+  color: #c7c7c7;
+}
+.ui-controlgroup .ui-btn-inner .ui-corner-left .ui-controlgroup-first {
+  -o-border-radius: .3em;
+  -ms-border-radius: .3em;
+  -moz-border-radius: .3em ;
+  -webkit-border-radius: .3em ;
+  border-radius: .3em ;
+}
+.ui-controlgroup .ui-btn-inner .ui-corner-right .ui-controlgroup-last {
+  -o-border-radius: .3em;
+  -ms-border-radius: .3em;
+  -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: #3b7796;
+}
+.ui-controlgroup .ui-radio-off .ui-btn-inner {
+  color: #c7c7c7;
+}
+.ui-controlgroup.ui-controlgroup-horizontal .ui-radio .ui-btn-down-s .ui-btn-inner {
+  background: -webkit-linear-gradient(top, #000000 0%, #202327 100%);
+}
+/*
+* 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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-scrollview-clip {
+  position: relative;
+}
+.ui-scrollview-view {
+  overflow-x: hidden;
+  overflow-y: visible;
+}
+.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.09090909090909091rem;
+  right: 0.09090909090909091rem;
+  bottom: 0.09090909090909091rem;
+  width: 0.36363636363636365rem;
+}
+.ui-scrollbar-x {
+  right: 0.09090909090909091rem;
+  bottom: 0.09090909090909091rem;
+  left: 0.09090909090909091rem;
+  height: 0.36363636363636365rem;
+}
+.ui-scrollbar-track {
+  position: relative;
+  width: 100%;
+  height: 100%;
+}
+.ui-scrollbar-thumb {
+  position: absolute;
+  top: 0;
+  left: 0;
+  background-color: #393b41;
+}
+.ui-scrollbar-y .ui-scrollbar-thumb {
+  width: 0.2272727272727273rem;
+  height: 100%;
+  -o-border-radius: 0.09090909090909091rem;
+  -ms-border-radius: 0.09090909090909091rem;
+  -moz-border-radius: 0.09090909090909091rem;
+  -webkit-border-radius: 0.09090909090909091rem;
+  border-radius: 0.09090909090909091rem;
+  -o-box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.18181818181818182rem #000000;
+  -ms-box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.18181818181818182rem #000000;
+  -moz-box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.18181818181818182rem #000000;
+  -webkit-box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.18181818181818182rem #000000;
+  box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.18181818181818182rem #000000;
+}
+.ui-scrollbar-x .ui-scrollbar-thumb {
+  width: 100%;
+  height: 0.2272727272727273rem;
+  -o-border-radius: 0.09090909090909091rem;
+  -ms-border-radius: 0.09090909090909091rem;
+  -moz-border-radius: 0.09090909090909091rem;
+  -webkit-border-radius: 0.09090909090909091rem;
+  border-radius: 0.09090909090909091rem;
+}
+.ui-scroll-jump-top-bg {
+  position: absolute;
+  top: 0.4090909090909091rem;
+  right: 0.5909090909090909rem;
+  width: 1.6818181818181819rem;
+  height: 1.6818181818181819rem;
+}
+.ui-scroll-jump-left-bg {
+  position: absolute;
+  bottom: 0.4090909090909091rem;
+  left: 0.5909090909090909rem;
+  width: 1.6818181818181819rem;
+  height: 1.6818181818181819rem;
+}
+.ui-overflow-indicator-top {
+  position: absolute;
+  display: none;
+  top: 0;
+  width: 100%;
+  height: 0.8181818181818182rem;
+  opacity: 0.5;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-image: url(images/00_overscrolling_top.png);
+}
+.ui-overflow-indicator-bottom {
+  position: absolute;
+  display: none;
+  bottom: 0;
+  width: 100%;
+  height: 0.8181818181818182rem;
+  opacity: 0.5;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-image: url(images/00_overscrolling_bottom.png);
+}
+/*
+ * 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;
+}
+.ui-content.ui-scrollview-clip > div.ui-scrollview-view {
+  margin: 0;
+  padding-left: 0.36363636363636365rem;
+  padding-right: 0.36363636363636365rem;
+}
+/*
+ * 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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+@-webkit-keyframes ui-datetime-in {
+  from {
+    -webkit-transform: translateY(0.6363636363636364rem) scale(0.9);
+  }
+  to {
+    -webkit-transform: translateY(0) scale(1);
+  }
+}
+@-webkit-keyframes ui-datetime-out {
+  from {
+    opacity: 0.8;
+    -webkit-transform: translateY(0) scale(0.6);
+  }
+  to {
+    opacity: 0;
+    -webkit-transform: translateY(-0.6363636363636364rem) scale(0.6);
+  }
+}
+.ui-datefield {
+  font-size: 0.7727272727272727rem;
+}
+.ui-datefield > div > span {
+  vertical-align: middle;
+  min-width: 1.5681818181818181rem;
+  position: relative ! important;
+  padding: 0;
+}
+.ui-datefield .ui-datefield-seperator,
+.ui-datefield .ui-datefield-tab {
+  display: inline-block;
+  min-width: 0.5rem;
+  text-align: center;
+}
+.ui-datefield .ui-datefield-tab > div {
+  display: inline-block;
+  width: 0.38636363636363635rem;
+  height: 0.9545454545454546rem;
+}
+.ui-datefield .ui-datefield-tab > div.ui-divider-1st {
+  border-right: 1px solid #27282b;
+}
+.ui-datefield .ui-datefield-tab > div.ui-divider-2nd {
+  border-left: 1px solid #404040;
+}
+.ui-datefield .date,
+.ui-datefield .time,
+.ui-datefield .ui-datefield-tab {
+  display: inline-block;
+}
+.ui-datefield .ui-btn-box-s .ui-btn-inner.ui-btn-hastxt {
+  padding: 0;
+}
+.ui-datefield span.ui-datefield-year,
+.ui-datefield span.ui-datefield-month {
+  min-width: 1.9090909090909092rem;
+  /* except right&left padding */
+
+  padding: 0 0.2272727272727273rem;
+}
+.ui-datefield .ui-datefield-selected {
+  display: inline-block;
+}
+.ui-datefield .ui-datefield-selected.in {
+  -ms-animation: ui-datetime-in 0.3s 1 ease;
+  -o-animation: ui-datetime-in 0.3s 1 ease;
+  -moz-animation: ui-datetime-in 0.3s 1 ease;
+  -webkit-animation: ui-datetime-in 0.3s 1 ease;
+}
+.ui-datefield .ui-datefield-selected.out {
+  -ms-animation: ui-datetime-out 0.3s 1 ease;
+  -o-animation: ui-datetime-out 0.3s 1 ease;
+  -moz-animation: ui-datetime-out 0.3s 1 ease;
+  -webkit-animation: ui-datetime-out 0.3s 1 ease;
+}
+@media all and (orientation: landscape) and (device-aspect-ratio: 16/9) {
+  .ui-datefield > div > span {
+    min-width: 3.6136363636363638rem;
+  }
+  .ui-datefield span.ui-datefield-year,
+  .ui-datefield span.ui-datefield-month {
+    min-width: 5.204545454545455rem;
+    /* except right&left padding */
+  
+  }
+}
+.ui-datetime {
+  margin: 0;
+  height: 1.6363636363636365rem;
+}
+.ui-datetime-text-main {
+  position: relative;
+  top: 0 ;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  padding-top: 0.3em;
+}
+.ui-btn-picker {
+  line-height: 1.0909090909090908rem;
+}
+.ui-datefield-period.ui-btn {
+  width: 2.159090909090909rem;
+  line-height: 1.3636363636363638rem;
+  right: auto;
+  position: relative ! important;
+}
+.ui-datetime-text-sub {
+  top: 0.2272727272727273rem ! important;
+  color: #425790 ! important;
+  background: transparent ! important;
+  font-size: 0.7272727272727273rem ! important;
+}
+.ui-datetimepicker-selector ul {
+  padding: 0;
+  display: inline;
+  list-style: none;
+  vertical-align: middle;
+  margin: 0;
+}
+.ui-datetimepicker-selector ul li {
+  font-size: 1rem;
+  float: left;
+  padding: 0.6818181818181819rem 0.18181818181818182rem 0 0.18181818181818182rem;
+  max-width: 5.454545454545455rem;
+  min-width: 2.7272727272727275rem;
+}
+.ui-datetimepicker-selector ul li a.ui-link {
+  text-decoration: none;
+  color: rgba(255, 255, 255, 0.7);
+}
+.ui-datetimepicker-selector ul li a.ui-link:hover {
+  color: rgba(255, 255, 255, 0.7);
+}
+.ui-datetimepicker-selector ul li.current a.ui-link {
+  color: #ffffff;
+}
+.ui-datetimepicker {
+  left: 0 !important;
+  padding: 0;
+}
+.ui-datetimepicker.ui-arrow-t {
+  margin-top: 0.2272727272727273rem;
+}
+.ui-datetimepicker.ui-arrow-b {
+  margin-top: -0.2272727272727273rem;
+}
+.ui-datetimepicker .ui-popupwindow-padding {
+  background: #253296 !important;
+  border-radius: 0 !important;
+  -ms-border-radius: 0 !important;
+  -o-border-radius: 0 !important;
+  -moz-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.409090909090909rem;
+}
+.ui-li-dialogue .ui-datefield {
+  margin-top: 0.4090909090909091rem;
+}
+.ui-li-dialogue .ui-datefield .ui-datefield-seperator,
+.ui-li-dialogue .ui-datefield .ui-datefield-tab {
+  margin-top: -1em;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/* Resource color mapping table
+
+@color_popup_title_bg:	popup_title_bg.png
+@color_popup_text_bg:	popup_bg.png
+@color_popup_button_bg:	popup_button_bg.png
+@color_popup_font:		Popup title & default
+@color_popup_text_font:	Popup text
+
+*/
+.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;
+  color: #f8f6ef;
+  background: #2a2d30;
+}
+.ui-popupwindow .popup-title {
+  width: 100%;
+  height: 100%;
+  font-size: 1.0909090909090908rem;
+  background: #49577b;
+}
+.ui-popupwindow .popup-title p {
+  margin: 0rem 0rem;
+  padding: 0.5909090909090909rem 0rem;
+}
+.ui-popupwindow .popup-text {
+  width: 100%;
+  color: #f9f9f9;
+  font-size: 1.0909090909090908rem;
+  background: #2a2d30;
+}
+.ui-popupwindow .popup-text p {
+  text-align: center;
+  padding: 1rem 0.7272727272727273rem;
+}
+.ui-popupwindow .center_info {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+}
+.ui-popupwindow .center_title {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_basic_1btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_basic_1btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #969a9c;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_basic_1btn .popup-button-bg .ui-btn {
+  width: 18.272727272727273rem;
+  height: 3.3636363636363638rem;
+  margin: auto;
+}
+.ui-popupwindow .center_basic_2btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_basic_2btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #969a9c;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_basic_2btn .popup-button-bg .ui-btn {
+  width: 12.454545454545455rem;
+  height: 3.3636363636363638rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_basic_3btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_basic_3btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #969a9c;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_basic_3btn .popup-button-bg .ui-btn {
+  width: 8.454545454545455rem;
+  height: 3.3636363636363638rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_title_1btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_title_1btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #969a9c;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_title_1btn .popup-button-bg .ui-btn {
+  width: 18.272727272727273rem;
+  height: 3.3636363636363638rem;
+  margin: auto;
+}
+.ui-popupwindow .center_title_2btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_title_2btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #969a9c;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_title_2btn .popup-button-bg .ui-btn {
+  width: 12.454545454545455rem;
+  height: 3.3636363636363638rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_title_3btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_title_3btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #969a9c;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_title_3btn .popup-button-bg .ui-btn {
+  width: 8.454545454545455rem;
+  height: 3.3636363636363638rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_button_vertical {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_button_vertical .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #969a9c;
+  width: 100%;
+  padding-top: 1px;
+  padding-bottom: 0.7272727272727273rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_button_vertical .popup-button-bg .ui-btn {
+  width: 16.181818181818183rem;
+  height: 3.3636363636363638rem;
+  margin-top: 0.7272727272727273rem;
+  margin-bottom: 0rem;
+  margin-left: auto;
+  margin-right: auto;
+}
+.ui-popupwindow .center_checkbox {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_checkbox .popup-check-bg {
+  font-size: 1.0909090909090908rem;
+  background: #2a2d30;
+  width: 100%;
+  padding-top: 0rem;
+  padding-bottom: 1rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_checkbox .popup-check-bg .ui-checkbox .ui-btn {
+  text-align: center;
+  background: #2a2d30;
+  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.8181818181818182rem;
+  background: #969a9c;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_checkbox .popup-button-bg .ui-btn {
+  width: 12.454545454545455rem;
+  height: 3.3636363636363638rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_liststyle_1btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: #f8f6ef;
+  height: 23.272727272727273rem;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #969a9c;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-button-bg .ui-btn {
+  width: 18.272727272727273rem;
+  height: 3.3636363636363638rem;
+  margin: auto;
+}
+.ui-popupwindow .center_liststyle_2btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: #f8f6ef;
+  height: 23.272727272727273rem;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #969a9c;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-button-bg .ui-btn {
+  width: 12.454545454545455rem;
+  height: 3.3636363636363638rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_liststyle_3btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: #f8f6ef;
+  height: 23.272727272727273rem;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #969a9c;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-button-bg .ui-btn {
+  width: 8.454545454545455rem;
+  height: 3.3636363636363638rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_progressbar {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_progressbar .popup-text {
+  font-size: 1.1818181818181819rem;
+  font-color: #999999;
+  background: #2a2d30;
+  width: 100%;
+  height: 3.181818181818182rem;
+}
+.ui-popupwindow .center_progressbar .popup-text p {
+  height: 100%;
+  text-align: center;
+  padding: 1rem 0.7272727272727273rem 0rem 0.7272727272727273rem;
+}
+.ui-popupwindow .center_progressbar .popup-text-bottom-bg {
+  font-size: 1.1818181818181819rem;
+  font-color: #999999;
+  background: #2a2d30;
+  width: 100%;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_progressbar .popup-text-bottom-bg .text-left {
+  width: 40%;
+  height: 2.1818181818181817rem;
+  padding: 0rem 0.7272727272727273rem 0rem 0.7272727272727273rem;
+  text-align: left;
+  display: inline-block;
+}
+.ui-popupwindow .center_progressbar .popup-text-bottom-bg .text-right {
+  width: 40%;
+  height: 2.1818181818181817rem;
+  padding: 0rem 0.7272727272727273rem 0rem 0.7272727272727273rem;
+  text-align: right;
+  display: inline-block;
+}
+.ui-popupwindow .center_progressbar .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #969a9c;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_progressbar .popup-button-bg .ui-btn {
+  width: 18.272727272727273rem;
+  height: 3.3636363636363638rem;
+  margin: auto;
+}
+.ui-popupwindow .center_progressbar .popup-progress-bg {
+  background: #2a2d30;
+  width: 100%;
+  height: 100%;
+}
+.ui-popupwindow .centertext_progressbar {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .centertext_progressbar .popup-text {
+  font-size: 1.1818181818181819rem;
+  font-color: #999999;
+  background: #2a2d30;
+  width: 100%;
+  padding-top: 1rem;
+  padding-bottom: 0.7272727272727273rem;
+}
+.ui-popupwindow .centertext_progressbar .popup-text p {
+  text-align: center;
+}
+.ui-popupwindow .centertext_progressbar .popup-text-bottom-bg {
+  font-size: 1.1818181818181819rem;
+  font-color: #999999;
+  background: #2a2d30;
+  width: 100%;
+  vertical-align: middle;
+}
+.ui-popupwindow .centertext_progressbar .popup-text-bottom-bg .text-left {
+  width: 40%;
+  height: 1.8181818181818183rem;
+  padding: 0.7272727272727273rem 0.7272727272727273rem 1rem 0.7272727272727273rem;
+  text-align: left;
+  display: inline-block;
+}
+.ui-popupwindow .centertext_progressbar .popup-text-bottom-bg .text-right {
+  width: 40%;
+  height: 1.8181818181818183rem;
+  padding: 0.7272727272727273rem 0.7272727272727273rem 1rem 0.7272727272727273rem;
+  text-align: right;
+  display: inline-block;
+}
+.ui-popupwindow .centertext_progressbar .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #969a9c;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .centertext_progressbar .popup-button-bg .ui-btn {
+  width: 18.272727272727273rem;
+  height: 3.3636363636363638rem;
+  margin: auto;
+}
+.ui-popupwindow .centertext_progressbar .popup-progress-bg {
+  background: #2a2d30;
+  width: 100%;
+  height: 100%;
+}
+.ui-popupwindow .ui-btn {
+  background: #eeeeee;
+  background: -webkit-gradient(linear, left top, left bottom, from(#eeeeee), to(#e1e1e1));
+  background: -moz-linear-gradient(top, #eeeeee, #e1e1e1);
+  background: -ms-linear-gradient(top, #eeeeee, #e1e1e1);
+  background: -o-linear-gradient(top, #eeeeee, #e1e1e1);
+  color: #000000;
+}
+.ui-popupwindow .ui-btn.ui-btn-hover-s {
+  background: #5e88a3;
+}
+.ui-popupwindow .ui-btn.ui-btn-down-s {
+  background: #27339f;
+  background: -webkit-gradient(linear, left top, left bottom, from(#27339f), to(#2a39ac));
+  background: -moz-linear-gradient(top, #27339f, #2a39ac);
+  background: -ms-linear-gradient(top, #27339f, #2a39ac);
+  background: -o-linear-gradient(top, #27979f, #2a39ac);
+  color: #fafafa;
+}
+.ui-popupwindow > .ui-volumecontrol {
+  display: table;
+  margin: auto;
+  background: rgba(0, 0, 0, 0.666667);
+  width: 18.90909090909091rem;
+  height: 30.727272727272727rem;
+  padding-top: 1rem;
+}
+.ui-popupwindow > .ui-volumecontrol h1 {
+  font-size: 1.0909090909090908rem;
+  display: table;
+  margin: auto;
+  color: #c0c0c0;
+}
+.ui-popupwindow > .ui-volumecontrol .ui-volumecontrol-icon {
+  display: table;
+  width: 100%;
+  height: 5.818181818181818rem;
+  padding-top: 0.9545454545454546rem;
+  padding-bottom: 0.9545454545454546rem;
+  padding-left: 7.5rem;
+  padding-right: 7.5rem;
+}
+.ui-popupwindow > .ui-volumecontrol .ui-volumecontrol-indicator {
+  display: table;
+  width: 100%;
+  height: 19.09090909090909rem;
+  padding-left: 3.090909090909091rem;
+  padding-right: 3.090909090909091rem;
+}
+.ui-popupwindow > .ui-volumecontrol .ui-corner-all {
+  -o-border-radius: 0.3em !important;
+  -ms-border-radius: 0.3em !important;
+  -moz-border-radius: 0.3em !important;
+  -webkit-border-radius: 0.3em !important;
+  border-radius: 0.3em !important;
+}
+.ui-popupwindow-corner-all {
+  -o-border-radius: 0em !important;
+  -ms-border-radius: 0em !important;
+  -moz-border-radius: 0em !important;
+  -webkit-border-radius: 0em !important;
+  border-radius: 0em !important;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-ctxpopup {
+  display: table;
+}
+.ui-ctxpopup :focus {
+  outline: none;
+}
+.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: #1d263c;
+  border: none;
+  -ms-box-shadow: 0rem 0rem 0.5454545454545454rem rgba(0, 0, 0, 0.6);
+  -o-box-shadow: 0rem 0rem 0.5454545454545454rem rgba(0, 0, 0, 0.6);
+  -moz-box-shadow: 0rem 0rem 0.5454545454545454rem rgba(0, 0, 0, 0.6);
+  -webkit-box-shadow: 0rem 0rem 0.5454545454545454rem rgba(0, 0, 0, 0.6);
+  box-shadow: 0rem 0rem 0.5454545454545454rem rgba(0, 0, 0, 0.6);
+  -o-border-radius: 0.3em;
+  -ms-border-radius: 0.3em;
+  -moz-border-radius: 0.3em;
+  -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: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 {
+  max-width: 28.181818181818183rem;
+  border: none;
+}
+.ui-ctxpopup .ui-listview .ui-li {
+  color: #ffffff;
+  border-bottom-color: #1d263c;
+  border-bottom-width: 1px;
+  border-bottom-style: solid;
+  border-top-color: #626675;
+  border-top-width: 1px;
+  border-top-style: solid;
+  margin-left: 0;
+  margin-right: 0;
+}
+.ui-ctxpopup .ui-listview .ui-li:first-child {
+  border-top-width: 0;
+}
+.ui-ctxpopup .ui-listview .ui-li:last-child {
+  border-bottom-width: 0;
+}
+.ui-ctxpopup .ui-listview .ui-li .ui-btn-inner {
+  margin: 0;
+  padding-left: 0.4545454545454546rem;
+  padding-right: 0.4545454545454546rem;
+}
+.ui-ctxpopup .ui-listview li.ui-btn-up-s > .ui-li > .ui-btn-text > a.ui-link-inherit,
+.ui-ctxpopup .ui-listview li.ui-btn-hover-s > .ui-li > .ui-btn-text > a.ui-link-inherit,
+.ui-ctxpopup .ui-listview li.ui-btn-down-s > .ui-li > .ui-btn-text > a.ui-link-inherit {
+  color: #ffffff;
+}
+.ui-ctxpopup .horizontal {
+  color: #ffffff;
+}
+.ui-ctxpopup .horizontal .icon .ui-btn {
+  padding: 0;
+  background: transparent ! important;
+}
+.ui-ctxpopup .horizontal .icon .ui-btn .ui-btn-icon-only {
+  width: 4.363636363636363rem;
+  height: 2.909090909090909rem;
+  padding: 0;
+}
+.ui-ctxpopup .horizontal .icon .ui-btn .ui-icon {
+  top: 0;
+  height: inherit;
+  width: inherit;
+  margin: 0;
+  background-position: center;
+  -ms-background-size: 2.1818181818181817rem 2.1818181818181817rem;
+  -moz-background-size: 2.1818181818181817rem 2.1818181818181817rem;
+  -o-background-size: 2.1818181818181817rem 2.1818181818181817rem;
+  -webkit-background-size: 2.1818181818181817rem 2.1818181818181817rem;
+  background-size: 2.1818181818181817rem 2.1818181818181817rem;
+}
+.ui-ctxpopup .horizontal .text {
+  padding: 0 0.4545454545454546rem;
+  min-width: 2.1818181818181817rem;
+}
+.ui-ctxpopup .horizontal a.ui-link {
+  color: #ffffff;
+  text-decoration: none;
+}
+.ui-ctxpopup .horizontal ul {
+  padding: 0;
+  display: inline-block;
+  list-style: none;
+  vertical-align: middle;
+  margin: 0;
+}
+.ui-ctxpopup .horizontal li {
+  line-height: 1.4545454545454546rem;
+  min-height: 1.4545454545454546rem;
+  min-width: 2.1818181818181817rem;
+  float: left;
+  display: inline-block;
+  border-right: 1px solid #626675;
+  border-left: 1px solid #626675;
+  text-align: center;
+  border-bottom-width: 0;
+  border-top-width: 0;
+}
+.ui-ctxpopup .horizontal li:first-of-type {
+  border-top-left-radius: 0.3em;
+  border-bottom-left-radius: 0.3em;
+  border-top-right-radius: 0px ! important;
+  border-left: none;
+}
+.ui-ctxpopup .horizontal li:last-of-type {
+  border-top-right-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+  border-bottom-left-radius: 0px ! important;
+  border-right: none;
+}
+.ui-ctxpopup .horizontal .ui-li {
+  border-bottom-width: 0;
+  border-top-width: 0;
+}
+.ui-ctxpopup .horizontal .ui-li:first-child {
+  border-left-width: 0px;
+}
+.ui-ctxpopup .horizontal .ui-li:last-child {
+  border-right-width: 0px;
+}
+.ui-ctxpopup .horizontal li:active,
+.ui-ctxpopup .horizontal td:active {
+  background: #2b3aaf;
+}
+.ui-ctxpopup .button table .ui-btn {
+  margin: 0rem;
+  padding: 0;
+  height: 2.5454545454545454rem;
+  width: 6rem;
+}
+.ui-ctxpopup .ui-scrollbar-thumb {
+  background-color: #47484a;
+  opacity: 0.7;
+  border: 1px solid #000000;
+}
+.ui-arrow {
+  border-style: solid;
+  border-width: 10px;
+  width: 0;
+  height: 0px;
+  position: absolute;
+}
+.ui-arrow.top {
+  border-color: transparent transparent #1d263c transparent;
+}
+.ui-arrow.left {
+  border-color: transparent transparent transparent #1d263c;
+}
+.ui-arrow.right {
+  border-color: transparent #1d263c transparent transparent;
+}
+.ui-arrow.bottom {
+  border-color: #1d263c transparent transparent transparent;
+}
+.ui-ctxpopup-container {
+  z-index: 1200;
+  display: inline-bloack;
+  position: absolute;
+  padding: 0;
+  outline: 0;
+}
+.ui-ctxpopup-container .ui-popup {
+  border: none;
+  background: #1d263c;
+  padding: 3px 2px 2px 2px;
+  -o-border-radius: 0.3em;
+  -ms-border-radius: 0.3em;
+  -moz-border-radius: 0.3em;
+  -webkit-border-radius: 0.3em;
+  border-radius: 0.3em;
+}
+.ui-ctxpopup-container .ui-listview li:first-child {
+  border-top-left-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
+.ui-ctxpopup-container .ui-listview .ui-li .ui-btn-inner {
+  border-width: 0px;
+}
+.poptop {
+  -webkit-transform-origin: 0% 0%;
+  -moz-transform-origin: 0% 0%;
+}
+.poptop.in {
+  -webkit-transform: scale(1);
+  -moz-transform: scale(1);
+  opacity: 1;
+  -webkit-animation-name: scalepopin;
+  -moz-animation-name: scalepopin;
+  -webkit-animation-duration: 350ms;
+  -moz-animation-duration: 350ms;
+}
+.poptop.out {
+  -webkit-animation-name: fadeout;
+  -moz-animation-name: fadeout;
+  opacity: 0;
+  -webkit-animation-duration: 100ms;
+  -moz-animation-duration: 100ms;
+}
+.poptop.in.reverse {
+  -webkit-animation-name: fadein;
+  -moz-animation-name: fadein;
+}
+.poptop.out.reverse {
+  -webkit-transform: scale(0.8);
+  -moz-transform: scale(0.8);
+  -webkit-animation-name: scalepopout;
+  -moz-animation-name: scalepopout;
+}
+@-webkit-keyframes scalepopin {
+  from {
+    -webkit-transform: scale(0.8);
+    opacity: 0;
+  }
+  to {
+    -webkit-transform: scale(1);
+    opacity: 1;
+  }
+}
+.popbottom {
+  -webkit-transform-origin: 0% 100%;
+  -moz-transform-origin: 0% 100%;
+}
+.popbottom.in {
+  -webkit-transform: scale(1);
+  -moz-transform: scale(1);
+  opacity: 1;
+  -webkit-animation-name: scalepopin;
+  -moz-animation-name: scalepopin;
+  -webkit-animation-duration: 350ms;
+  -moz-animation-duration: 350ms;
+}
+.popbottom.out {
+  -webkit-animation-name: fadeout;
+  -moz-animation-name: fadeout;
+  opacity: 0;
+  -webkit-animation-duration: 100ms;
+  -moz-animation-duration: 100ms;
+}
+.popbottom.in.reverse {
+  -webkit-animation-name: fadein;
+  -moz-animation-name: fadein;
+}
+.popbottom.out.reverse {
+  -webkit-transform: scale(0.8);
+  -moz-transform: scale(0.8);
+  -webkit-animation-name: scalepopout;
+  -moz-animation-name: scalepopout;
+}
+@-moz-keyframes scalepopin {
+  from {
+    -moz-transform: scale(0.8);
+    opacity: 0;
+  }
+  to {
+    -moz-transform: scale(1);
+    opacity: 1;
+  }
+}
+@-webkit-keyframes scalepopout {
+  from {
+    -webkit-transform: scale(1);
+    opacity: 1;
+  }
+  to {
+    -webkit-transform: scale(0.8);
+    opacity: 0;
+  }
+}
+@-moz-keyframes scalepopout {
+  from {
+    -moz-transform: scale(1);
+    opacity: 1;
+  }
+  to {
+    -moz-transform: scale(0.8);
+    opacity: 0;
+  }
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+@-webkit-keyframes ui-scale-animation {
+  from {
+    -webkit-transform: scaleX(0);
+  }
+  to {
+    -webkit-transform: scaleX(1);
+  }
+}
+.ui-progressbar-value {
+  min-width: 0.4090909090909091rem;
+  height: 100%;
+  -o-border-radius: 0.2272727272727273rem;
+  -ms-border-radius: 0.2272727272727273rem;
+  -moz-border-radius: 0.2272727272727273rem;
+  -webkit-border-radius: 0.2272727272727273rem;
+  border-radius: 0.2272727272727273rem;
+  box-shadow: 0px 1px 1px #263592 inset, 0px 1px 1px #627fcb;
+  background-color: #415bfe;
+}
+.ui-progressbar-bg {
+  position: relative;
+  overflow: hidden;
+  top: 0.1590909090909091rem;
+  min-width: 0.5454545454545454rem;
+  height: 0.29545454545454547rem;
+  margin-left: 0.13636363636363635rem;
+  margin-right: 0.13636363636363635rem;
+  -o-border-radius: 0.2272727272727273rem;
+  -ms-border-radius: 0.2272727272727273rem;
+  -moz-border-radius: 0.2272727272727273rem;
+  -webkit-border-radius: 0.2272727272727273rem;
+  border-radius: 0.2272727272727273rem;
+  box-shadow: 0px 1px 1px #313138 inset, 0px 1px 1px #74717f;
+  background-color: #334353;
+}
+.ui-progressbar {
+  position: relative;
+  margin-left: 0.8181818181818182rem;
+  margin-right: 0.8181818181818182rem;
+  height: 0.6136363636363636rem;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/* Progress - circle style */
+@-webkit-keyframes ui-rotate-animation {
+  from {
+    -webkit-transform: rotate(0deg);
+  }
+  to {
+    -webkit-transform: rotate(360deg);
+  }
+}
+.ui-progress-container-circle {
+  position: absolute;
+}
+.ui-li .ui-progress-container-circle {
+  top: 22%;
+}
+.ui-progress-circle {
+  position: relative;
+  top: 0;
+  height: 1.4545454545454546rem;
+  width: 1.4545454545454546rem;
+  background: url(images/00_list_process_01.png) no-repeat;
+  -ms-background-size: 1.4545454545454546rem 1.4545454545454546rem;
+  -moz-background-size: 1.4545454545454546rem 1.4545454545454546rem;
+  -o-background-size: 1.4545454545454546rem 1.4545454545454546rem;
+  -webkit-background-size: 1.4545454545454546rem 1.4545454545454546rem;
+  background-size: 1.4545454545454546rem 1.4545454545454546rem;
+}
+.ui-progress-circle-running {
+  -webkit-animation: ui-rotate-animation 1s infinite linear;
+}
+/* Progress - pending style */
+@-webkit-keyframes animate-stripes {
+  0% {
+    background-position: 0 0;
+  }
+  100% {
+    background-position: 2.3636363636363638rem 0;
+  }
+}
+.ui-progress-pending {
+  position: relative;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  padding-top: 0;
+  padding-bottom: 0;
+  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%, #415bfe), color-stop(50%, #415bfe), color-stop(50%, rgba(0, 0, 0, 0)), color-stop(75%, rgba(0, 0, 0, 0)), color-stop(75%, #415bfe));
+  box-shadow: 0 1px 0 #263592 inset;
+  background-color: #334353;
+  -o-border-radius: 0.2272727272727273rem;
+  -ms-border-radius: 0.2272727272727273rem;
+  -moz-border-radius: 0.2272727272727273rem;
+  -webkit-border-radius: 0.2272727272727273rem;
+  border-radius: 0.2272727272727273rem;
+  -ms-background-size: 0.5909090909090909rem 0.5909090909090909rem;
+  -moz-background-size: 0.5909090909090909rem 0.5909090909090909rem;
+  -o-background-size: 0.5909090909090909rem 0.5909090909090909rem;
+  -webkit-background-size: 0.5909090909090909rem 0.5909090909090909rem;
+  background-size: 0.5909090909090909rem 0.5909090909090909rem;
+}
+.ui-progress-pending-running {
+  -webkit-animation: animate-stripes 1s linear infinite;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+label.ui-slider {
+  display: block;
+}
+select.ui-slider-switch {
+  display: none;
+}
+.ui-slider-container {
+  position: relative;
+  vertical-align: middle;
+  height: 0.6136363636363636rem;
+  padding-top: 0.4090909090909091rem;
+  padding-bottom: 0.4090909090909091rem;
+  margin-left: 0.8181818181818182rem;
+  margin-right: 0.8181818181818182rem;
+}
+.ui-li > .ui-slider-container {
+  margin-top: 0;
+  margin-bottom: 0;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+.ui-slider-left-volume,
+.ui-slider-left-bright {
+  position: absolute;
+  vertical-align: middle;
+  top: -0.5rem;
+  left: -2.272727272727273rem;
+  height: 1.6363636363636365rem;
+  width: 1.6363636363636365rem;
+  background: url(images/controls/00_slider_button_brightness_01.png) no-repeat;
+  -ms-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -moz-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -o-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -webkit-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  background-size: 1.6363636363636365rem 1.6363636363636365rem;
+}
+.ui-slider-left-volume {
+  background: url(images/controls/00_slider_button_volume_01.png) no-repeat;
+  -ms-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -moz-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -o-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -webkit-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  background-size: 1.6363636363636365rem 1.6363636363636365rem;
+}
+.ui-slider-right-volume,
+.ui-slider-right-bright {
+  position: absolute;
+  top: -0.5rem;
+  right: -2.272727272727273rem;
+  height: 1.6363636363636365rem;
+  width: 1.6363636363636365rem;
+  vertical-align: middle;
+  background: url(images/controls/00_slider_button_brightness_02.png) no-repeat;
+  -ms-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -moz-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -o-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -webkit-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  background-size: 1.6363636363636365rem 1.6363636363636365rem;
+}
+.ui-slider-right-volume {
+  background: url(images/controls/00_slider_button_volume_02.png) no-repeat;
+  -ms-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -moz-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -o-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -webkit-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  background-size: 1.6363636363636365rem 1.6363636363636365rem;
+}
+.ui-slider-left-text {
+  position: absolute;
+  top: -0.5rem;
+  height: 1.6818181818181819rem;
+  text-align: center;
+  color: #bababa;
+}
+.ui-slider-right-text {
+  position: absolute;
+  top: -0.5rem;
+  height: 1.6818181818181819rem;
+  text-align: center;
+  color: #bababa;
+}
+div.ui-slider:not(.ui-toggle-switch) {
+  position: relative;
+  top: 0.20454545454545456rem;
+  height: 0.29545454545454547rem;
+  margin-left: 0.18181818181818182rem;
+  margin-right: 0.18181818181818182rem;
+  -o-border-radius: 0.4545454545454546rem;
+  -ms-border-radius: 0.4545454545454546rem;
+  -moz-border-radius: 0.4545454545454546rem;
+  -webkit-border-radius: 0.4545454545454546rem;
+  border-radius: 0.4545454545454546rem;
+  -o-box-shadow: 0px 0px 2px #74717f;
+  -ms-box-shadow: 0px 0px 2px #74717f;
+  -moz-box-shadow: 0px 0px 2px #74717f;
+  -webkit-box-shadow: 0px 0px 2px #74717f;
+  box-shadow: 0px 0px 2px #74717f;
+  background-color: #334353;
+}
+div.ui-slider:not(.ui-toggle-switch) .ui-btn {
+  top: -0.75rem;
+  margin-top: 0;
+}
+div.ui-slider:not(.ui-toggle-switch) .ui-btn-inner {
+  padding: 0.3rem 0 0 0;
+}
+div.ui-slider:not(.ui-toggle-switch) .ui-btn-text {
+  color: #fafafa;
+}
+div.ui-slider:not(.ui-toggle-switch) a.ui-slider-handle-press {
+  background-image: url(images/controls/00_slider_handle_press.png);
+}
+div.ui-slider:not(.ui-toggle-switch) a.ui-slider-handle-press .ui-btn-text {
+  color: #fafafa;
+}
+a.ui-slider-handle {
+  position: relative;
+  z-index: 10;
+  width: 1.6363636363636365rem;
+  height: 1.6363636363636365rem;
+  margin-left: -0.8181818181818182rem;
+  color: #fafafa;
+  font-size: 0.95rem;
+  background: url(images/controls/00_slider_handle.png) no-repeat;
+  -ms-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -moz-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -o-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -webkit-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -o-box-shadow: none;
+  -ms-box-shadow: none;
+  -moz-box-shadow: none;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.ui-slider-popup {
+  position: absolute !important;
+  z-index: 1210;
+  width: 2.0454545454545454rem;
+  height: 2.4545454545454546rem;
+  padding-top: 0.1rem;
+  color: #4c5158;
+  text-align: center;
+  font-size: 1.5rem;
+  background: url(images/controls/00_slider_popup_bg.png) no-repeat;
+  -ms-background-size: 2.0454545454545454rem 2.4545454545454546rem;
+  -moz-background-size: 2.0454545454545454rem 2.4545454545454546rem;
+  -o-background-size: 2.0454545454545454rem 2.4545454545454546rem;
+  -webkit-background-size: 2.0454545454545454rem 2.4545454545454546rem;
+  background-size: 2.0454545454545454rem 2.4545454545454546rem;
+}
+.ui-slider-bg {
+  position: absolute;
+  height: 0.29545454545454547rem;
+  width: 0;
+  -o-border-radius: 0.4545454545454546rem;
+  -ms-border-radius: 0.4545454545454546rem;
+  -moz-border-radius: 0.4545454545454546rem;
+  -webkit-border-radius: 0.4545454545454546rem;
+  border-radius: 0.4545454545454546rem;
+  -o-box-shadow: 0px 0px 2px #74717f;
+  -ms-box-shadow: 0px 0px 2px #74717f;
+  -moz-box-shadow: 0px 0px 2px #74717f;
+  -webkit-box-shadow: 0px 0px 2px #74717f;
+  box-shadow: 0px 0px 2px #74717f;
+  background-color: #415bfe;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-gallery {
+  position: relative;
+  width: 100%;
+}
+.ui-gallery-bg {
+  display: none;
+  position: absolute;
+  text-align: center;
+  width: 100%;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/* tickernoti */
+@-webkit-keyframes ui-ticker-show {
+  from {
+    opacity: 0;
+    -webkit-transform: translateY(-2.272727272727273rem);
+    top: -2.272727272727273rem;
+  }
+  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.272727272727273rem);
+    top: -2.272727272727273rem;
+  }
+}
+.ui-ticker {
+  position: fixed;
+  display: none;
+  left: 0;
+  width: 100%;
+  height: 2.272727272727273rem;
+  z-index: 2147483547;
+  background: #222222;
+}
+.ui-ticker.fix {
+  display: block;
+  top: 0;
+}
+.ui-ticker.show {
+  display: block;
+  -ms-animation: ui-ticker-show 0.8s 1 ease;
+  -o-animation: ui-ticker-show 0.8s 1 ease;
+  -moz-animation: ui-ticker-show 0.8s 1 ease;
+  -webkit-animation: ui-ticker-show 0.8s 1 ease;
+  top: 0;
+}
+.ui-ticker.hide {
+  display: block;
+  -o-animation: ui-ticker-hide 0.8s 1 ease;
+  -ms-animation: ui-ticker-hide 0.8s 1 ease;
+  -webkit-animation: ui-ticker-hide 0.8s 1 ease;
+  top: -2.272727272727273rem;
+}
+.ui-ticker-btn {
+  position: relative;
+  margin-top: 0.4545454545454546rem;
+  margin-left: 0.36363636363636365rem;
+  margin-right: 0.36363636363636365rem;
+  vertical-align: middle;
+  float: right;
+}
+.ui-ticker-btn .ui-btn-inner {
+  padding: 0.15rem 0 0 0;
+  height: 1.2727272727272727rem;
+  width: 3.5rem;
+  font-size: 0.81rem;
+}
+.ui-ticker-icon {
+  position: absolute;
+  top: 0;
+  height: 1.4545454545454546rem;
+  width: 1.4545454545454546rem;
+  margin-top: 0.4090909090909091rem;
+  margin-bottom: 0.4090909090909091rem;
+  margin-left: 0.36363636363636365rem;
+  margin-right: 0.36363636363636365rem;
+  vertical-align: middle;
+}
+.ui-ticker-text1-bg {
+  position: absolute;
+  top: 0;
+  height: 0.8181818181818182rem;
+  left: 2.1818181818181817rem;
+  margin-top: 0.36363636363636365rem;
+  font-size: 0.68rem;
+  color: #fafafa;
+}
+.ui-ticker-text2-bg {
+  position: absolute;
+  top: 0;
+  height: 0.7272727272727273rem;
+  left: 2.1818181818181817rem;
+  margin-top: 1.1818181818181819rem;
+  font-size: 0.54rem;
+  color: #ffffff;
+}
+/* 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;
+    left: 0;
+    -webkit-transform: scaleY(1);
+  }
+  to {
+    opacity: 0;
+    left: 0;
+    -webkit-transform: scaleY(0);
+  }
+}
+.ui-smallpopup {
+  position: fixed;
+  display: none;
+  left: 0;
+  width: 100%;
+  z-index: 1100;
+  background: #2b3aaf;
+  vertical-align: middle;
+  font-size: 0.72rem;
+  word-break: break-all;
+}
+.ui-smallpopup.fix {
+  display: block;
+}
+.ui-smallpopup.show {
+  display: block;
+  -moz-animation: ui-smallpopup-show 0.5s 1 ease;
+  -ms-animation: ui-smallpopup-show 0.5s 1 ease;
+  -o-animation: ui-smallpopup-show 0.5s 1 ease;
+  -webkit-animation: ui-smallpopup-show 0.5s 1 ease;
+}
+.ui-smallpopup.hide {
+  display: block;
+  left: -100%;
+  -moz-animation: ui-smallpopup-hide 0.5s 1 ease;
+  -ms-animation: ui-smallpopup-hide 0.5s 1 ease;
+  -o-animation: ui-smallpopup-hide 0.5s 1 ease;
+  -webkit-animation: ui-smallpopup-hide 0.5s 1 ease;
+}
+.ui-smallpopup-text-bg {
+  position: relative;
+  margin-top: 0.18181818181818182rem;
+  margin-bottom: 0.18181818181818182rem;
+  margin-left: 0.36363636363636365rem;
+  margin-right: 0.36363636363636365rem;
+  padding-top: 0.36363636363636365rem;
+  color: #fafafa;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-swipe {
+  padding: 0 !important;
+  list-style-type: none;
+}
+.ui-swipe-item {
+  height: 2.5454545454545454rem;
+  -ms-user-select: none;
+  -o-user-select: none;
+  -moz-user-select: none;
+  -webkit-user-select: none;
+  -user-select: none;
+  opacity: 0;
+  text-align: center;
+  background-color: #17191c;
+  margin-left: -0.5909090909090909rem;
+  margin-right: -0.5909090909090909rem;
+}
+.ui-swipe-item .ui-btn {
+  margin-top: -0.8181818181818182rem ! important;
+  position: relative ! important;
+}
+.ui-swipe-item p {
+  margin: 0;
+}
+.ui-swipe-item-cover {
+  position: absolute;
+  border: none;
+  top: 0%;
+  left: 0%;
+  width: 100%;
+  height: 100%;
+  z-index: 100;
+}
+.ui-swipe-item-cover .ui-swipe-item-cover-inner {
+  position: absolute;
+  padding-top: 0.6818181818181819rem;
+  padding-bottom: 0.6818181818181819rem;
+  padding-left: 0.36363636363636365rem;
+  width: 100%;
+  text-align: left;
+}
+.ui-swipe-item-cover .ui-swipe-item-cover-inner .ui-li-text-sub {
+  position: absolute;
+  padding-right: 0.7272727272727273rem;
+}
+.ui-swipe-item-cover p {
+  margin: 0;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-fastscroll {
+  position: absolute;
+  right: 0;
+  width: 1.0681818181818181rem;
+  -ms-user-select: none;
+  -o-user-select: none;
+  -moz-user-select: none;
+  -webkit-user-select: none;
+  user-select: none;
+  margin: 0;
+  padding-left: 1px;
+  padding-right: 0.045454545454545456rem;
+  opacity: 1;
+  background: -webkit-linear-gradient(left, transparent 1px, #212428 1px, #212428 0.13636363636363635rem, #404040 0.13636363636363635rem, #404040 1.0909090909090908rem, #212428 1.0909090909090908rem, #212428);
+  background-color: #404040;
+}
+.ui-fastscroll ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+.ui-fastscroll li {
+  cursor: pointer;
+  color: #a09f9a;
+  background: #212428;
+  text-align: center;
+  vertical-align: middle;
+  font-size: 0.5909090909090909rem;
+  font-weight: bold;
+  height: 0.5909090909090909rem;
+  border: 0.06818181818181818rem solid transparent;
+  margin-bottom: 1px;
+}
+.ui-fastscroll.ui-fastscroll-hover {
+  background-color: #4f66a7;
+}
+li.ui-fastscroll-hover {
+  position: relative;
+  left: -1px;
+  margin-top: -1px;
+  margin-bottom: 0;
+  padding-top: 1px;
+  padding-bottom: 1px;
+  width: 1rem;
+  color: #5d83ff;
+  border-color: #4f66a7;
+  border-left-width: 0;
+  padding-left: 1px;
+}
+li.ui-fastscroll-hover-first-item {
+  margin-top: 0;
+  padding-top: 0;
+}
+.ui-fastscroll-popup {
+  position: absolute;
+  background: #2b3aaf;
+  color: #ffffff;
+  padding: 0.4545454545454546rem;
+  border: 1px solid #131a4f;
+  border-radius: 2px;
+  text-align: center;
+  font-size: 3.409090909090909rem;
+  font-weight: bold;
+  display: none;
+  box-sizing: border-box;
+  left: 50%;
+  top: 50%;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+div.ui-slider.ui-toggle-switch {
+  position: relative;
+  width: 3.090909090909091rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_button_on_off_bg.png);
+  background-size: 100% 100%;
+}
+div.ui-slider.ui-toggle-switch .ui-slider-label {
+  position: absolute;
+  background-size: 100% 100%;
+  background-repeat: no-repeat;
+  background-color: transparent;
+}
+div.ui-slider.ui-toggle-switch .ui-slider-inneroffset {
+  position: relative;
+  margin-left: 0.8181818181818182rem;
+  margin-right: 1.0454545454545454rem;
+}
+div.ui-slider.ui-toggle-switch a.ui-slider-handle {
+  position: absolute;
+  width: 1.8636363636363638rem;
+  height: 1.4545454545454546rem;
+  -webkit-background-size: 100% 100%;
+  margin-top: 0rem;
+}
+div.ui-slider.ui-toggle-switch a.ui-slider-handle.ui-toggle-on {
+  background-image: url(images/00_button_on_handler.png);
+  padding-right: 0;
+}
+div.ui-slider.ui-toggle-switch a.ui-slider-handle.ui-toggle-off {
+  background-image: url(images/00_button_off_handler.png);
+  padding-right: 0;
+}
+div.ui-slider.ui-toggle-switch a.ui-slider-handle-snapping {
+  -webkit-transition: left 70ms linear;
+}
+.ui-slider-switch:not(.ui-toggle-switch) {
+  width: 4.181818181818182rem;
+}
+div.ui-slider.ui-slider-switch:not(.ui-toggle-switch) {
+  position: relative;
+  margin-top: 0.2272727272727273rem;
+  margin-bottom: 0.2272727272727273rem;
+  height: 1.4545454545454546rem;
+  top: 0;
+  margin: 0.2272727272727273rem;
+  border-radius: 0.6818181818181819rem;
+}
+div.ui-slider.ui-slider-switch:not(.ui-toggle-switch) .ui-slider-inneroffset {
+  position: relative;
+  margin: -1px 0.7272727272727273rem;
+  z-index: 1;
+}
+div.ui-slider.ui-slider-switch:not(.ui-toggle-switch) a.ui-slider-handle {
+  position: absolute;
+  background: #ffffff;
+  background-image: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 50, from(#f9f9f9), to(#323232));
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+  top: 50%;
+  margin: 1px 0 0 -0.6818181818181819rem;
+  border-radius: 0.6818181818181819rem;
+  border: 2px solid gray;
+  width: 1.2727272727272727rem;
+  height: 1.2727272727272727rem;
+}
+div.ui-slider.ui-slider-switch:not(.ui-toggle-switch) a.ui-slider-handle-snapping {
+  -webkit-transition: left 70ms linear;
+}
+div.ui-slider.ui-slider-switch:not(.ui-toggle-switch) span {
+  position: absolute;
+  overflow: hidden;
+  text-align: center;
+  height: 1.4545454545454546rem;
+  font-weight: bold;
+  font-size: 0.7272727272727273rem;
+  border-radius: 0.6818181818181819rem;
+  white-space: nowrap;
+  line-height: 2;
+}
+div.ui-slider.ui-slider-switch:not(.ui-toggle-switch) span.ui-slider-label-a {
+  left: 0px;
+  color: white;
+  z-index: 1;
+  text-indent: -1.5em;
+}
+div.ui-slider.ui-slider-switch:not(.ui-toggle-switch) span.ui-slider-label-b {
+  right: 0px;
+  color: #ffffff;
+  z-index: 0;
+  text-indent: 1.5em;
+}
+.ui-slider-switch .ui-slider-handle .ui-btn-inner {
+  padding: 0;
+}
+.ui-triangle-container {
+  position: relative;
+}
+.ui-triangle-container .ui-triangle {
+  position: absolute;
+  border-style: solid;
+  border-color: transparent;
+  border-width: 10px;
+}
+.ui-triangle-container .ui-triangle-top {
+  top: 0px;
+  border-top-width: 0px;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  margin-left: -10px;
+}
+.ui-triangle-container .ui-triangle-bottom {
+  bottom: 0px;
+  border-bottom-width: 0px;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  margin-left: -10px;
+}
+.ui-triangle-container .ui-triangle-left {
+  left: 0px;
+  margin-top: -10px;
+  border-left-width: 0px;
+  border-left-color: transparent;
+  border-right-color: transparent;
+}
+.ui-triangle-container .ui-triangle-right {
+  right: 0px;
+  margin-top: -10px;
+  border-right-width: 0px;
+  border-left-color: transparent;
+  border-right-color: transparent;
+}
+.ui-triangle-container-top {
+  height: 10px;
+  top: 0px;
+  margin-top: -10px;
+}
+.ui-triangle-container-bottom {
+  height: 10px;
+  bottom: 0px;
+  margin-bottom: -10px;
+}
+.ui-triangle-container-left {
+  width: 10px;
+}
+.ui-triangle-container-right {
+  width: 10px;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-tokentextarea {
+  display: table;
+  outline: none;
+  position: relative;
+  background-color: #1d263c;
+}
+.ui-tokentextarea .ui-tokentextarea-label {
+  display: inline-block;
+  position: relative;
+  margin-left: .3em;
+  margin-right: .3em;
+  padding: .6em 0em;
+  color: #fafafa;
+  font-weight: bold;
+  text-align: center;
+  font-size: 1em;
+}
+.ui-tokentextarea-input {
+  outline: none;
+  position: relative;
+  border: 0 !important;
+  padding: 0 !important;
+  margin: .5em;
+  color: #fafafa;
+  background-color: #1d263c !important;
+  text-align: left;
+  font-size: 1em;
+}
+.ui-tokentextarea-input-visible {
+  display: inline-block !important;
+}
+.ui-tokentextarea-input-invisible {
+  display: none !important;
+}
+.ui-tokentextarea div {
+  display: inline-block;
+  text-align: center;
+  cursor: pointer;
+  position: relative;
+  margin: .3em;
+  padding: .2em .5em;
+  font-size: 1em;
+  text-shadow: 0 2px rgba(0, 0, 0, 0.75);
+  -ms-border-radius: .2em;
+  -o-border-radius: .2em;
+  -webkit-border-radius: .2em;
+  -moz-border-radius: .2em;
+  border-radius: .2em;
+  -o-box-shadow: 0 0.1em 0.1em rgba(0, 0, 0, 0.2);
+  -ms-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);
+  -webkit-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: #fafafa;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+div.ui-tokentextarea-block {
+  background-color: #525767;
+  border: 1px solid #6c7483;
+}
+div.ui-tokentextarea-sblock {
+  background-color: #2b3aaf;
+  border: 1px solid #595e6a;
+}
+.ui-tokentextarea .ui-tokentextarea-desclabel {
+  display: inline-block;
+  outline: none;
+  position: relative;
+  border: 0;
+  color: #fafafa;
+  text-align: left;
+  font-size: 1em;
+}
+.ui-tokentextarea-link-base {
+  position: absolute;
+  right: 0em;
+  bottom: 2px;
+  margin-right: 0.4090909090909091rem;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-handler {
+  position: absolute;
+  overflow: hidden;
+  opacity: 0;
+}
+.ui-handler-visible {
+  opacity: 1;
+}
+.ui-handler-direction-y {
+  top: 0.2272727272727273rem;
+  right: 0rem;
+  bottom: 0.2272727272727273rem;
+  width: 0.8181818181818182rem;
+}
+.ui-handler-direction-x {
+  right: 0.2272727272727273rem;
+  bottom: 0rem;
+  left: 0.2272727272727273rem;
+  height: 0.8181818181818182rem;
+}
+.ui-handler-track {
+  position: relative;
+  width: 100%;
+  height: 100%;
+}
+.ui-handler-handle {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+.ui-handler-direction-x .ui-handler-handle {
+  width: 5.318181818181818rem;
+  height: 0.8181818181818182rem;
+}
+.ui-handler-direction-y .ui-handler-handle {
+  width: 0.8181818181818182rem;
+  height: 5.318181818181818rem;
+}
+.ui-handler-thumb {
+  background-position: center;
+  background-repeat: no-repeat;
+  -o-border-radius: 0.25rem;
+  -ms-border-radius: 0.25rem;
+  -moz-border-radius: 0.25rem;
+  -webkit-border-radius: 0.25rem;
+  border-radius: 0.25rem;
+}
+.ui-handler-direction-y .ui-handler-thumb {
+  width: 0.5227272727272727rem;
+  height: 5.204545454545455rem;
+  -ms-background-size: 0.5227272727272727rem 0.8409090909090909rem;
+  -moz-background-size: 0.5227272727272727rem 0.8409090909090909rem;
+  -o-background-size: 0.5227272727272727rem 0.8409090909090909rem;
+  -webkit-background-size: 0.5227272727272727rem 0.8409090909090909rem;
+  background-size: 0.5227272727272727rem 0.8409090909090909rem;
+}
+.ui-handler-direction-x .ui-handler-thumb {
+  width: 5.204545454545455rem;
+  height: 0.5227272727272727rem;
+  -ms-background-size: 0.8409090909090909rem 0.5227272727272727rem;
+  -moz-background-size: 0.8409090909090909rem 0.5227272727272727rem;
+  -o-background-size: 0.8409090909090909rem 0.5227272727272727rem;
+  -webkit-background-size: 0.8409090909090909rem 0.5227272727272727rem;
+  background-size: 0.8409090909090909rem 0.5227272727272727rem;
+}
+/* S
+-----------------------------------------------------------------------------------------------------------*/
+.ui-handler-s .ui-handler-thumb {
+  background-color: #393b41;
+  -o-box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.09090909090909091rem #000000;
+  -ms-box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.09090909090909091rem #000000;
+  -moz-box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.09090909090909091rem #000000;
+  -webkit-box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.09090909090909091rem #000000;
+  box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.09090909090909091rem #000000;
+}
+.ui-handler-s .ui-handler-direction-y .ui-handler-thumb {
+  background-image: url("images/00_scroll_bar_handler.png");
+}
+.ui-handler-s .ui-handler-direction-x .ui-handler-thumb {
+  background-image: url("images/00_scroll_bar_handler_hor.png");
+}
+/*
+ * 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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-virtualgrid {
+  overflow: hidden;
+  position: absolute;
+}
+.ui-virtualgrid-wrapblock {
+  position: absolute;
+  left: 0;
+}
+.ui-virtualgrid-wrapblock-x {
+  float: left;
+  overflow: hidden;
+}
+.ui-scrollbar-thumb-x {
+  width: 1.5rem !important;
+}
+.ui-scrollbar-thumb-y {
+  height: 1.5rem !important;
+}
+.ui-virtualgrid-overflow-indicator-x-top {
+  position: absolute;
+  display: block;
+  left: 0;
+  top: 0;
+  width: 56%;
+  height: 100%;
+  opacity: 0;
+  background-repeat: no-repeat;
+  -webkit-background-size: 100% 100%;
+  background-image: url(./images/00_grid_overscrolling_left.png);
+  pointer-events: none;
+}
+.ui-virtualgrid-overflow-indicator-x-bottom {
+  position: absolute;
+  display: block;
+  right: 0;
+  bottom: 0;
+  width: 56%;
+  height: 100%;
+  opacity: 0;
+  background-repeat: no-repeat;
+  -webkit-background-size: 100% 100%;
+  background-image: url(./images/00_grid_overscrolling_right.png);
+  pointer-events: none;
+}
+.ui-virtualgrid-overflow-indicator-y-top {
+  position: absolute;
+  display: block;
+  top: 0;
+  width: 100%;
+  height: 32%;
+  opacity: 0;
+  background-repeat: no-repeat;
+  -webkit-background-size: 100% 100%;
+  background-image: url(./images/00_grid_overscrolling_top.png);
+  pointer-events: none;
+}
+.ui-virtualgrid-overflow-indicator-y-bottom {
+  position: absolute;
+  display: block;
+  bottom: 0;
+  width: 100%;
+  height: 32%;
+  opacity: 0;
+  background-repeat: no-repeat;
+  -webkit-background-size: 100% 100%;
+  background-image: url(./images/00_grid_overscrolling_bottom.png);
+  pointer-events: none;
+}
+/*
+ * padding here set to zero - otherwise the list scrolls underneith the top heading and can be seen above it
+ */
+.ui-content.ui-virtualgrid-content {
+  padding: 0;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-multimediaview {
+  background-color: #000000;
+  overflow: hidden;
+}
+.ui-multimediaview-wrap {
+  width: 100%;
+  padding: 0;
+  position: relative;
+  overflow: hidden;
+}
+.ui-multimediaview-siblings-off {
+  display: none !important;
+}
+.ui-multimediaview-control span {
+  display: inline-block;
+}
+.ui-multimediaview-video {
+  position: absolute;
+}
+.ui-multimediaview-control {
+  display: block;
+  z-index: 1002;
+  padding: 0;
+  margin: 0;
+  outline: 0;
+  border: 0;
+  height: 1.9090909090909092rem;
+  text-align: left;
+  overflow: hidden;
+}
+.ui-multimediaview-control span.ui-button {
+  background-position: center center;
+  background-size: 80%;
+  background-repeat: no-repeat;
+  width: 1.6818181818181819rem;
+  height: 1.6818181818181819rem;
+  margin: 0.09090909090909091rem;
+}
+.ui-multimediaview-control .ui-playpausebutton {
+  float: left;
+}
+.ui-multimediaview-control .ui-timestamplabel {
+  text-align: center;
+  float: left;
+}
+.ui-multimediaview-control .ui-timestamplabel p {
+  margin-top: -0.22272727272727275rem;
+  margin-left: 0.09090909090909091rem;
+  padding: 0;
+  text-align: center;
+  font-size: 0.5rem;
+  line-height: 0.6363636363636364rem;
+  text-align: left;
+}
+.ui-multimediaview-control .ui-durationlabel {
+  text-align: center;
+  float: right;
+}
+.ui-multimediaview-control .ui-durationlabel p {
+  margin-top: -0.22272727272727275rem;
+  margin-right: 0.09090909090909091rem;
+  padding: 0;
+  text-align: center;
+  font-size: 0.5rem;
+  line-height: 0.6363636363636364rem;
+  text-align: right;
+}
+.ui-multimediaview-bar {
+  margin-top: 0.22272727272727275rem;
+  float: left;
+}
+.ui-multimediaview-bar-bg {
+  height: 0.29545454545454547rem;
+  border-radius: 1.5em;
+}
+.ui-multimediaview-bar-highlight {
+  height: 0.29545454545454547rem;
+  position: absolute;
+  border-radius: 1.5em;
+}
+.ui-multimediaview-control .ui-seekbar {
+  margin-left: 0.09090909090909091rem;
+}
+.ui-multimediaview-control .ui-seekbar .ui-duration {
+  width: 100%;
+}
+.ui-multimediaview-control .ui-volumecontrol {
+  width: 5rem;
+  height: 100%;
+  float: left;
+}
+.ui-multimediaview-control .ui-volumecontrol .ui-volumebar {
+  margin-left: 0.6818181818181819rem;
+}
+.ui-multimediaview-control .ui-volumecontrol .ui-volumebar .ui-guide {
+  width: 3.8636363636363638rem;
+}
+.ui-multimediaview-control .ui-volumecontrol .ui-volumebar .ui-handle {
+  margin: 0;
+  padding: 0;
+  width: 0.6818181818181819rem;
+  height: 0.6818181818181819rem;
+}
+.ui-fullscreen-parents {
+  padding: 0 !important;
+  margin: 0 !important;
+  width: 100% !important;
+  height: 100% !important;
+  overflow: hidden;
+}
+/* S
+-----------------------------------------------------------------------------------------------------------*/
+.ui-multimediaview-s .ui-multimediaview-video {
+  background-color: rgba(0, 0, 0, 0.8);
+}
+.ui-multimediaview-s .ui-timestamplabel {
+  color: #6890ff;
+}
+.ui-multimediaview-s .ui-durationlabel {
+  color: #6e6f76;
+}
+.ui-multimediaview-s span.ui-button {
+  background-color: #44464e;
+  -o-box-shadow: inset 0px 1px 1px #7a7d86;
+  -ms-box-shadow: inset 0px 1px 1px #7a7d86;
+  -moz-box-shadow: inset 0px 1px 1px #7a7d86;
+  -webkit-box-shadow: inset 0px 1px 1px #7a7d86;
+  box-shadow: inset 0px 1px 1px #7a7d86;
+}
+.ui-multimediaview-s span.ui-button-down {
+  background-color: #2736a4;
+}
+.ui-multimediaview-s span.ui-play-icon {
+  background-image: url(./images/00_button_play.png);
+}
+.ui-multimediaview-s span.ui-pause-icon {
+  background-image: url(./images/00_button_pause.png);
+}
+.ui-multimediaview-s span.ui-volume-icon {
+  background-image: url(./images/controls/00_slider_button_volume_02.png);
+}
+.ui-multimediaview-s span.ui-mute-icon {
+  background-image: url(./images/controls/00_slider_button_volume_01.png);
+}
+.ui-multimediaview-s span.ui-fullscreen-on {
+  background-image: url(./images/00_button_fullscreen_on.png);
+}
+.ui-multimediaview-s span.ui-fullscreen-off {
+  background-image: url(./images/00_button_fullscreen_off.png);
+}
+.ui-multimediaview-s .ui-seekbar .ui-duration {
+  background-color: #555861;
+}
+.ui-multimediaview-s .ui-seekbar .ui-currenttime {
+  background-color: #415bfe;
+  box-shadow: 0px -1px 1px #74717f inset;
+}
+.ui-multimediaview-s .ui-volumebar .ui-guide {
+  background-color: #555861;
+}
+.ui-multimediaview-s .ui-volumebar .ui-value {
+  background-color: #415bfe;
+  box-shadow: 0px -1px 1px #74717f inset;
+}
+.ui-multimediaview-s .ui-volumebar .ui-handle {
+  background-color: #3c4044;
+  -o-box-shadow: inset 0px 1px 1px #7a7d86;
+  -ms-box-shadow: inset 0px 1px 1px #7a7d86;
+  -moz-box-shadow: inset 0px 1px 1px #7a7d86;
+  -webkit-box-shadow: inset 0px 1px 1px #7a7d86;
+  box-shadow: inset 0px 1px 1px #7a7d86;
+}
+.ui-multimediaview-s .ui-volumebar .ui-button-down {
+  background-color: #2736a4;
+  -o-box-shadow: inset 0px -1px 1px #7a7d86;
+  -ms-box-shadow: inset 0px -1px 1px #7a7d86;
+  -moz-box-shadow: inset 0px -1px 1px #7a7d86;
+  -webkit-box-shadow: inset 0px -1px 1px #7a7d86;
+  box-shadow: inset 0px -1px 1px #7a7d86;
+}
+.ui-popup-screen {
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	border: 0;
+	position: absolute;
+	filter: Alpha(Opacity=50);
+	opacity: 0;
+}
+
+.ui-popup-screen-background-hack {
+	background-color: black;
+	filter: Alpha(Opacity=0);
+}
+
+@-webkit-keyframes popup-fadein {
+    from { opacity: 0; }
+    to { opacity: 0.5; }
+}
+
+@-moz-keyframes popup-fadein {
+    from { opacity: 0; }
+    to { opacity: 0.5; }
+}
+
+@-webkit-keyframes popup-fadeout {
+    from { opacity: 0.5; }
+    to { opacity: 0; }
+}
+
+@-moz-keyframes popup-fadeout {
+    from { opacity: 0.5; }
+    to { opacity: 0; }
+}
+
+.ui-popup-screen.fade.in {
+	opacity: 0.5;
+	-webkit-animation-name: popup-fadein;
+	-moz-animation-name: popup-fadein;
+}
+
+.ui-popup-screen.fade.out {
+	opacity: 0;
+	-webkit-animation-name: popup-fadeout;
+	-moz-animation-name: popup-fadeout;
+}
+
+.ui-popup.ui-content,
+.ui-popup .ui-content {
+	overflow: visible;
+}
+
+.ui-popup > img {
+	width: auto;
+	height: auto;
+	max-width: 100%;
+	max-height: 100%;
+	vertical-align: middle;
+}
+.ui-popup iframe {
+	vertical-align: middle;
+}
+
+@media all and (min-width: 450px){
+	.ui-popup .ui-field-contain label.ui-submit,
+	.ui-popup .ui-field-contain .ui-controlgroup-label,
+	.ui-popup .ui-field-contain label.ui-select,
+	.ui-popup .ui-field-contain label.ui-input-text {
+		font-size: 16px; line-height: 1.4; display: block; font-weight: normal; margin: 0 0 .3em;
+	}
+	.ui-popup .ui-field-contain .ui-btn.ui-submit,
+	.ui-popup .ui-field-contain .ui-controlgroup-controls,
+	.ui-popup .ui-field-contain .ui-select,
+	.ui-popup .ui-field-contain input.ui-input-text,
+	.ui-popup .ui-field-contain textarea.ui-input-text,
+	.ui-popup .ui-field-contain .ui-input-search {
+		width: 100%; display: block;
+	}
+}
+
+.ui-popup > .ui-btn-left,
+.ui-popup > .ui-btn-right {
+	position: absolute; 
+	top: -9px;
+	margin: 0;
+	z-index: 1101;
+}
+.ui-popup > .ui-btn-left { left: -9px; }
+.ui-popup > .ui-btn-right { right: -9px; }
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-popup-screen {
+  opacity: 0;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 1200;
+}
+.ui-overlay-dim {
+  background: #000000;
+  opacity: .5;
+}
+.ui-popup-scroller-bg {
+  width: 100%;
+}
+.ui-popup-container {
+  position: absolute;
+  width: 86.12%;
+  z-index: 1201 !important;
+  text-align: center;
+  outline-color: #000000;
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  outline: none;
+  /***** Normal Samples *****/
+
+}
+.ui-popup-container .ui-popup {
+  padding: .5px .5px .5px .5px;
+  background: #1d263c;
+  width: 100%;
+  border: 1px solid #62697f;
+  word-wrap: break-word;
+  -ms-border-radius: .3em;
+  -o-border-radius: .3em;
+  -webkit-border-radius: .3em;
+  -moz-border-radius: .3em;
+  border-radius: .3em;
+}
+.ui-popup-container .ui-popup > .ui-popup-title,
+.ui-popup-container .ui-popup > .ui-popup-button-bg {
+  width: 100%;
+}
+.ui-popup-container .ui-popup-title {
+  width: 100%;
+  height: 1.8181818181818183rem;
+  text-align: left;
+  color: #fafafa;
+  font-size: 1.0909090909090908rem;
+  font-weight: bold;
+  background: #49577b;
+  -ms-border-top-left-radius: .2em;
+  -o-border-top-left-radius: .2em;
+  -webkit-border-top-left-radius: .2em;
+  -moz-border-top-left-radius: .2em;
+  border-top-left-radius: .2em;
+  -ms-border-top-right-radius: .2em;
+  -o-border-top-right-radius: .2em;
+  -webkit-border-top-right-radius: .2em;
+  -moz-border-top-right-radius: .2em;
+  border-top-right-radius: .2em;
+}
+.ui-popup-container .ui-popup-title h1 {
+  font-size: 1.0909090909090908rem;
+  font-weight: bold;
+  color: #fafafa;
+  text-shadow: 0px 2px rgba(0, 0, 0, 0.75);
+  margin: 0px;
+  padding-top: 0.2272727272727273rem;
+  padding-left: 0.7272727272727273rem;
+}
+.ui-popup-container .ui-popup-text {
+  margin-top: 1rem;
+  margin-bottom: 1rem;
+  padding-left: 0.7272727272727273rem;
+  padding-right: 0.7272727272727273rem;
+  color: #f9f9f9;
+  font-size: 0.9090909090909092rem;
+  background: #1d263c;
+  text-align: center;
+}
+.ui-popup-container .ui-popup-text .ui-li .ui-radio label,
+.ui-popup-container .ui-popup-text .ui-li .ui-checkbox label {
+  background: transparent;
+}
+.ui-popup-container .ui-popup-text input {
+  display: inline-block;
+}
+.ui-popup-container .ui-popup-button-bg {
+  background: #969a9c;
+  font-size: 0.8181818181818182rem;
+  font-weight: bold;
+  height: 1.6818181818181819rem;
+  padding-top: 0.4545454545454546rem;
+  padding-bottom: 0.4545454545454546rem;
+  width: 100%;
+  vertical-align: middle;
+  -ms-border-bottom-left-radius: .3em;
+  -o-border-bottom-left-radius: .3em;
+  -webkit-border-bottom-left-radius: .3em;
+  -moz-border-bottom-left-radius: .3em;
+  border-bottom-left-radius: .3em;
+  -ms-border-bottom-right-radius: .3em;
+  -o-border-bottom-right-radius: .3em;
+  -webkit-border-bottom-right-radius: .3em;
+  -moz-border-bottom-right-radius: .3em;
+  border-bottom-right-radius: .3em;
+}
+.ui-popup-container .ui-popup-button-bg > .ui-btn {
+  width: 40%;
+  display: inline-block;
+  margin: auto;
+  height: 1.6818181818181819rem;
+  background: #eeeeee;
+  background: -webkit-gradient(linear, left top, left bottom, from(#eeeeee), to(#e1e1e1));
+  background: -moz-linear-gradient(top, #eeeeee, #e1e1e1);
+  background: -ms-linear-gradient(top, #eeeeee, #e1e1e1);
+  background: -o-linear-gradient(top, #eeeeee, #e1e1e1);
+  color: #000000;
+  border: 1px solid #7d7e82;
+  box-shadow: 1px 1px 2px #131417;
+}
+.ui-popup-container .ui-popup-button-bg > .ui-btn.ui-btn-down-s {
+  background: #27339f;
+  background: -webkit-gradient(linear, left top, left bottom, from(#27339f), to(#2a39ac));
+  background: -moz-linear-gradient(top, #27339f, #2a39ac);
+  background: -ms-linear-gradient(top, #27339f, #2a39ac);
+  background: -o-linear-gradient(top, #27979f, #2a39ac);
+  color: #fafafa;
+}
+.ui-popup-container .ui-popup-button-bg .ui-btn-inner {
+  padding-left: 0.9090909090909092rem;
+  padding-right: 0.9090909090909092rem;
+  margin-top: 0.13636363636363635rem;
+  -ms-border-radius: .2em;
+  -o-border-radius: .2em;
+  -webkit-border-radius: .2em;
+  -moz-border-radius: .2em;
+  border-radius: .2em;
+}
+.ui-popup-container .center_basic_3btn .ui-btn,
+.ui-popup-container .center_title_3btn .ui-btn {
+  max-width: 3.6363636363636367rem;
+  height: 1.6818181818181819rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+  display: inline-block;
+}
+.ui-popup-container .center_button_vertical .ui-popup-button-bg {
+  display: block;
+  height: auto;
+}
+.ui-popup-container .center_button_vertical .ui-popup-button-bg > .ui-btn {
+  display: block;
+  width: 9.090909090909092rem;
+  margin-top: 5px;
+  margin-bottom: 5px;
+}
+.ui-popup-container .center_checkbox .ui-popup-check-bg {
+  font-size: 0.9090909090909092rem;
+  width: 100%;
+  padding-top: 0rem;
+  padding-bottom: 1rem;
+  vertical-align: middle;
+}
+.ui-popup-container .center_checkbox .ui-popup-check-bg .ui-checkbox .ui-btn {
+  text-align: center;
+  border: 0rem;
+}
+.ui-popup-container .center_checkbox .ui-popup-check-bg .ui-checkbox .ui-btn .ui-btn-inner {
+  border: 0rem;
+}
+.ui-popup-container .center_checkbox .ui-popup-button-bg {
+  background: #969a9c;
+}
+.ui-popup-container .center_checkbox .ui-popup-button-bg .ui-btn {
+  min-width: 5.454545454545455rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+}
+.ui-popup-container .center_liststyle_1btn .ui-popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: #f8f6ef;
+  max-height: 11.636363636363637rem;
+}
+.ui-popup-container .center_liststyle_2btn .ui-popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: #f8f6ef;
+  max-height: 11.636363636363637rem;
+}
+.ui-popup-container .center_liststyle_2btn .ui-popup-button-bg .ui-btn {
+  min-width: 5.454545454545455rem;
+}
+.ui-popup-container .center_title_2btn .ui-popup-button-bg .ui-btn {
+  min-width: 5.454545454545455rem;
+}
+.ui-popup-container .center_liststyle_3btn .ui-popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: #f8f6ef;
+  max-height: 11.636363636363637rem;
+}
+.ui-popup-container .center_liststyle_3btn .ui-popup-button-bg .ui-btn {
+  max-width: 3.6363636363636367rem;
+}
+.ui-popup-container .center_progressbar {
+  text-align: center;
+}
+.ui-popup-container .center_progressbar .ui-popup-text {
+  font-size: 1.1818181818181819rem;
+  font-color: #999999;
+  background: #2a2d30;
+  width: 100%;
+  height: 3.181818181818182rem;
+}
+.ui-popup-container .center_progressbar .ui-popup-text p {
+  height: 100%;
+  text-align: center;
+  padding: 1rem 0.7272727272727273rem 0rem 0.7272727272727273rem;
+}
+.ui-popup-container .center_progressbar .ui-popup-text-bottom-bg {
+  font-size: 1.1818181818181819rem;
+  font-color: #999999;
+  background: #2a2d30;
+  width: 100%;
+  vertical-align: middle;
+}
+.ui-popup-container .center_progressbar .ui-popup-text-bottom-bg .text-left {
+  width: 40%;
+  height: 2.1818181818181817rem;
+  padding: 0rem 0.7272727272727273rem 0rem 0.7272727272727273rem;
+  text-align: left;
+  display: inline-block;
+}
+.ui-popup-container .center_progressbar .ui-popup-text-bottom-bg .text-right {
+  width: 40%;
+  height: 2.1818181818181817rem;
+  padding: 0rem 0.7272727272727273rem 0rem 0.7272727272727273rem;
+  text-align: right;
+  display: inline-block;
+}
+.ui-popup-container .center_progressbar .ui-popup-button-bg {
+  background: #969a9c;
+}
+.ui-popup-container .center_progressbar .ui-popup-button-bg .ui-btn {
+  width: 9.136363636363637rem;
+  margin: auto;
+}
+.ui-popup-container .center_progressbar .ui-popup-progress-bg {
+  background: #2a2d30;
+  width: 100%;
+  height: 100%;
+}
+.ui-popup-container .centertext_progressbar {
+  text-align: center;
+}
+.ui-popup-container .centertext_progressbar .ui-popup-text {
+  font-size: 1.1818181818181819rem;
+  font-color: #999999;
+  background: #2a2d30;
+  width: 100%;
+  padding-top: 1rem;
+  padding-bottom: 0.7272727272727273rem;
+}
+.ui-popup-container .centertext_progressbar .ui-popup-text p {
+  text-align: center;
+}
+.ui-popup-container .centertext_progressbar .ui-popup-text-bottom-bg {
+  font-size: 1.1818181818181819rem;
+  font-color: #999999;
+  background: #2a2d30;
+  width: 100%;
+  vertical-align: middle;
+}
+.ui-popup-container .centertext_progressbar .ui-popup-text-bottom-bg .text-left {
+  width: 40%;
+  height: 1.8181818181818183rem;
+  padding: 0.7272727272727273rem 0.7272727272727273rem 1rem 0.7272727272727273rem;
+  text-align: left;
+  display: inline-block;
+}
+.ui-popup-container .centertext_progressbar .ui-popup-text-bottom-bg .text-right {
+  width: 40%;
+  height: 1.8181818181818183rem;
+  padding: 0.7272727272727273rem 0.7272727272727273rem 1rem 0.7272727272727273rem;
+  text-align: right;
+  display: inline-block;
+}
+.ui-popup-container .centertext_progressbar .ui-popup-button-bg {
+  background: #969a9c;
+}
+.ui-popup-container .centertext_progressbar .ui-popup-button-bg .ui-btn {
+  width: 18.272727272727273rem;
+  margin: auto;
+}
+.ui-popup-container .centertext_progressbar .ui-popup-progress-bg {
+  background: #2a2d30;
+  width: 100%;
+  height: 100%;
+}
+/*
+ * Misc. classes for Tizen web ui framework
+ *
+ * All classes in this file has highest priority.
+ */
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/* text-ellipsis
+ * elements using this class needs following constraints;
+ *  - width must not be 'auto'
+ *  - display must be 'block' or 'inline-block'
+ */
+.ui-text-ellipsis {
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/***************************************************************************
+                    Tabbar
+***************************************************************************/
+.ui-tabbar {
+  z-index: 1000;
+}
+
+
+.ui-tabbar a.ui-btn {
+  background: #313f66;
+  color: #f0f0f0;
+  padding-top: 0.5454545454545454rem;
+  padding-bottom: 0.5454545454545454rem;
+}
+.ui-tabbar a.ui-btn .ui-btn-inner {
+  padding-top: 0px;
+  padding-bottom: 0px;
+  border-left: 1px solid;
+  border-color: rgba(255, 255, 255, 0.3);
+  border-radius: 0px;
+  -0-border-radius: 0px;
+  -ms-border-radius: 0px;
+  -webkit-border-radius: 0px;
+}
+.ui-tabbar a.ui-btn .ui-btn-inner:not(.ui-btn-icon-only) .ui-btn-text {
+  display: block;
+  vertical-align: middle;
+  margin-left: 0.2727272727272727rem;
+  margin-right: 0.2727272727272727rem;
+}
+.ui-tabbar a.ui-btn .ui-btn-inner .ui-btn-text {
+  background: #313f66;
+}
+.ui-tabbar a.ui-btn .ui-icon {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+}
+.ui-tabbar a.ui-btn.ui-btn-down-s {
+  background: #3343b2;
+  border-bottom-color: #313f66;
+}
+.ui-tabbar a.ui-btn.ui-btn-down-s .ui-btn-text {
+  background: #3343b2;
+}
+.ui-tabbar .ui-btn-inner {
+  font-size: 0.6818181818181819rem;
+  font-weight: bold;
+}
+.ui-tabbar .ui-btn-inner .ui-icon {
+  top: 0.4545454545454546rem;
+  left: 50%;
+  margin-left: -0.7272727272727273rem;
+}
+.ui-tabbar.ui-tabbar-notext a.ui-btn {
+  padding-top: 0.5rem;
+  padding-bottom: 0.18181818181818182rem;
+}
+.ui-tabbar.ui-tabbar-notext .ui-btn-inner {
+  height: 1.5454545454545454rem;
+}
+.ui-tabbar.ui-tabbar-notext .ui-btn-inner .ui-icon {
+  top: 0px;
+}
+/* title font size when title tabbar */
+.ui-header.ui-bar-s.ui-title-tabbar .ui-title {
+  font-size: 1rem;
+  margin-top: 0.36363636363636365rem;
+  margin-bottom: 0rem;
+}
+.ui-header.ui-bar-s.ui-title-tabbar > img {
+  margin-top: 0.6rem;
+}
+.ui-header.ui-bar-s.ui-title-tabbar .ui-tabbar.ui-tabbar-noicons a.ui-btn {
+  padding-top: 0.2727272727272727rem;
+  padding-bottom: 0.13636363636363635rem;
+}
+.ui-header.ui-bar-s.ui-title-tabbar .ui-tabbar.ui-tabbar-notext a.ui-btn {
+  padding-top: 0.3181818181818182rem;
+  padding-bottom: 0.2272727272727273rem;
+}
+
+
+.ui-header.ui-bar-s .ui-tabbar a.ui-btn {
+  border-bottom-width: 0.2272727272727273rem;
+  border-bottom-color: #313f66;
+  border-bottom-style: solid;
+}
+.ui-header.ui-bar-s .ui-tabbar a.ui-btn.ui-btn-active {
+  border-bottom-color: #5d83ff;
+}
+.ui-header.ui-bar-s .ui-tabbar a.ui-btn.ui-btn-down-s {
+  border-bottom-color: #3343b2;
+}
+.ui-header.ui-bar-s.ui-title-tabbar-multiline .ui-tabbar a.ui-btn {
+  padding-top: 0.3181818181818182rem;
+  padding-bottom: 0.18181818181818182rem;
+}
+.ui-header.ui-bar-s.ui-title-tabbar-multiline .ui-tabbar a.ui-btn .ui-btn-inner {
+  height: 2.2272727272727275rem;
+}
+.ui-header.ui-bar-s.ui-title-tabbar-multiline .ui-tabbar a.ui-btn .ui-btn-inner .ui-btn-text {
+  padding-bottom: 0.045454545454545456rem;
+}
+.ui-header.ui-bar-s.ui-title-tabbar-multiline .ui-tabbar a.ui-btn .ui-btn-inner .ui-icon {
+  top: 0px;
+}
+.ui-header.ui-bar-s li:first-child .ui-btn-inner {
+  border-left-width: 0px;
+}
+.ui-footer.ui-bar-s .ui-tabbar {
+  height: 2.2272727272727275rem;
+  margin-left: auto;
+  margin-right: auto;
+}
+.ui-footer.ui-bar-s .ui-tabbar a.ui-btn {
+  background: #464c5e;
+  padding-top: 0.5454545454545454rem;
+  padding-bottom: 0.5454545454545454rem;
+}
+.ui-footer.ui-bar-s .ui-tabbar a.ui-btn.ui-btn-down-s:not(.ui-btn-icon_only) {
+  background: #2735a3;
+}
+.ui-footer.ui-bar-s .ui-tabbar a.ui-btn.ui-btn-down-s:not(.ui-btn-icon_only) .ui-btn-text {
+  background: #2735a3;
+}
+.ui-footer.ui-bar-s .ui-tabbar .ui-btn-inner {
+  padding-top: 0.09090909090909091rem;
+  padding-bottom: 0.09090909090909091rem;
+}
+.ui-footer.ui-bar-s .ui-tabbar .ui-btn-inner .ui-icon {
+  top: 0px;
+}
+.ui-footer.ui-bar-s .ui-tabbar .ui-btn-inner .ui-btn-text {
+  background: #464c5e;
+}
+.ui-footer.ui-bar-s .ui-tabbar.ui-tabbar-notext a.ui-btn {
+  padding-top: 0.36363636363636365rem;
+  padding-bottom: 0.3181818181818182rem;
+}
+.ui-footer.ui-bar-s .ui-tabbar li:first-child .ui-btn-inner {
+  border-left-width: 0px;
+}
+.ui-footer.ui-bar-s .ui-tabbar.ui-tabbar-margin-back {
+  margin-right: 2.5454545454545454rem;
+}
+.ui-footer.ui-bar-s .ui-tabbar.ui-tabbar-margin-more {
+  margin-left: 2.5454545454545454rem;
+}
+.ui-footer.ui-bar-s .ui-btn-back ~ .ui-tabbar li:last-child .ui-btn-inner {
+  border-right: 1px solid;
+  border-right-color: rgba(255, 255, 255, 0.3);
+}
+.ui-footer.ui-bar-s [data-icon="naviframe-more"] ~ .ui-tabbar li:first-child .ui-btn-inner {
+  border-left: 1px solid;
+  border-left-color: rgba(255, 255, 255, 0.3);
+}
+.ui-tabbar-s.ui-navbar-noicons {
+  font-size: 1rem;
+}
+/* Scrollable tabbar */
+.ui-tabbar .tabbar-scroll-ul {
+  margin-top: 0px;
+  margin-bottom: 0px;
+  padding-left: 0px;
+}
+.ui-tabbar .tabbar-scroll-ul .tabbar-scroll-li {
+  position: relative;
+  display: inline-block;
+  margin-left: -0.36363636363636365rem;
+}
+.ui-tabbar .tabbar-scroll-ul .tabbar-scroll-li a {
+  width: 100%;
+  padding-top: 3px;
+  padding-bottom: 3px;
+  border-bottom-width: 0.2272727272727273rem;
+  border-bottom-style: solid;
+  border-bottom-color: #313f66;
+}
+.ui-tabbar .tabbar-scroll-ul .tabbar-scroll-li a.ui-tabbar-active {
+  border-bottom-color: #5d83ff;
+}
+.ui-tabbar .tabbar-scroll-ul li.tabbar-scroll-li:first-child {
+  margin-left: 0px;
+}
+.ui-tabbar-divider {
+  position: absolute;
+  top: 0px;
+  width: 3.681818181818182rem;
+  height: 1.6363636363636365rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+}
+.ui-tabbar-divider-left {
+  left: 0px;
+  background-image: url(images/00_effect_title_tab_bounce_left.png);
+}
+.ui-tabbar-divider-right {
+  right: 0px;
+  background-image: url(images/00_effect_title_tab_bounce_right.png);
+}
+/************************************************************************
+			Landscape mode
+************************************************************************/
+@media all and (orientation: landscape) and (device-aspect-ratio: 16/9) {
+  .ui-tabbar a.ui-btn {
+    padding-top: 0.6363636363636364rem;
+    padding-bottom: 0.2272727272727273rem;
+  }
+  .ui-tabbar .ui-btn-inner .ui-icon {
+    top: 0.4545454545454546rem;
+  }
+  .ui-tabbar.ui-tabbar-notext a.ui-btn {
+    padding-top: 0.2727272727272727rem;
+    padding-bottom: 0.2272727272727273rem;
+  }
+  .ui-tabbar.ui-tabbar-notext .ui-btn-inner {
+    height: 1.5454545454545454rem;
+  }
+  /* title font size when title tabbar */
+  .ui-header.ui-bar-s.ui-title-tabbar .ui-title {
+    font-size: 0.8636363636363636rem;
+    margin-top: 0.36363636363636365rem;
+  }
+  .ui-header.ui-bar-s.ui-title-tabbar .ui-tabbar.ui-tabbar-noicons a.ui-btn {
+    padding-top: 0.4545454545454546rem;
+    padding-bottom: 0.36363636363636365rem;
+  }
+  .ui-header.ui-bar-s.ui-title-tabbar .ui-tabbar.ui-tabbar-notext a.ui-btn {
+    padding-top: 0.13636363636363635rem;
+    padding-bottom: 0.09090909090909091rem;
+  }
+  .ui-header.ui-bar-s.ui-title-tabbar-multiline .ui-tabbar a.ui-btn {
+    padding-top: 0.18181818181818182rem;
+    padding-bottom: 0.045454545454545456rem;
+  }
+  .ui-header.ui-bar-s.ui-title-tabbar-multiline .ui-tabbar a.ui-btn .ui-btn-inner {
+    height: 2.4545454545454546rem;
+  }
+  .ui-header.ui-bar-s.ui-title-tabbar-multiline .ui-tabbar a.ui-btn .ui-btn-inner .ui-btn-text {
+    line-height: 0.6818181818181819rem;
+  }
+  .ui-footer.ui-bar-s .ui-tabbar {
+    height: 1.9090909090909092rem;
+  }
+  .ui-footer.ui-bar-s .ui-tabbar a.ui-btn {
+    padding-top: 0.5909090909090909rem;
+    padding-bottom: 0.5454545454545454rem;
+  }
+  .ui-footer.ui-bar-s .ui-tabbar.ui-tabbar-notext a.ui-btn {
+    padding-top: 0.18181818181818182rem;
+    padding-bottom: 0.18181818181818182rem;
+  }
+  .ui-tabbar-s.ui-navbar-noicons {
+    font-size: 0.8636363636363636rem;
+  }
+  /* Scrollable tabbar */
+  .ui-tabbar-divider {
+    width: 3.681818181818182rem;
+    height: 2.5rem;
+  }
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                  Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0223 */
+/* W021L1 */
+/* W021L2 */
+/* B0212 */
+/* F011L5 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L15 */
+/* F011L18 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0723 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B044 */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/* B061L5 */
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* Contact button text */
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/* Text Contact style */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-splitview {
+  margin: 0;
+  padding: 0;
+  position: relative;
+  overflow: hidden;
+}
+.ui-splitview .ui-pane {
+  position: absolute;
+  overflow: hidden;
+  border: 0;
+  margin: 0;
+  padding: 0;
+}
+.ui-splitview .ui-pane .ui-listview {
+  margin: 0;
+  padding: 0;
+}
+.ui-splitview .ui-spliter {
+  position: absolute;
+  z-index: 100;
+  display: block;
+  margin: 0;
+  padding: 0;
+}
+.ui-splitview .ui-spliter-bar {
+  background-color: #343739;
+  border-color: #46494e;
+  border-style: solid;
+}
+.ui-splitview .ui-spliter-handle {
+  margin: 0;
+  padding: 0;
+  cursor: move;
+  display: block;
+  text-align: center;
+  cursor: pointer;
+  position: relative;
+  background-position: center center;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+}
+.ui-direction-horizontal > .ui-spliter {
+  width: 1.3636363636363638rem;
+}
+.ui-direction-vertical > .ui-spliter {
+  height: 1.3636363636363638rem;
+}
+.ui-direction-horizontal > .ui-spliter > .ui-spliter-bar {
+  width: 0.25rem;
+  margin: 0 0 0 0.5681818181818182rem;
+  border-width: 0 1px 0 1px;
+}
+.ui-direction-vertical > .ui-spliter > .ui-spliter-bar {
+  height: 0.25rem;
+  margin: 0.5681818181818182rem 0 0 0;
+  border-width: 1px 0 1px 0;
+}
+.ui-spliter-active > .ui-spliter-bar {
+  background-color: #2b3aaf;
+  border-color: #2b3aaf;
+}
+.ui-direction-horizontal > .ui-spliter > .ui-spliter-bar > .ui-spliter-handle {
+  width: 0.20454545454545456rem;
+  height: 0.6136363636363636rem;
+  margin: 0 0.022727272727272728rem 0 0.022727272727272728rem;
+  background-image: url(./images/00_splite_handler_v.png);
+  background-size: 0.20454545454545456rem 0.6136363636363636rem;
+  background-repeat: no-repeat;
+}
+.ui-direction-vertical > .ui-spliter > .ui-spliter-bar > .ui-spliter-handle {
+  width: 0.6136363636363636rem;
+  height: 0.20454545454545456rem;
+  margin: 0.022727272727272728rem 0 0.022727272727272728rem 0;
+  background-image: url(./images/00_splite_handler_h.png);
+  background-size: 0.6136363636363636rem 0.20454545454545456rem;
+  background-repeat: no-repeat;
+}
+.ui-direction-horizontal > .ui-fixed {
+  width: 0;
+}
+.ui-direction-horizontal > .ui-fixed > .ui-spliter-bar {
+  width: 0.11363636363636365rem;
+}
+.ui-direction-vertical > .ui-fixed {
+  height: 0;
+}
+.ui-direction-vertical > .ui-fixed > .ui-spliter-bar {
+  height: 0.11363636363636365rem;
+}
+.ui-fixed .ui-spliter-handle {
+  display: none;
+}
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_fullscreen_off.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_fullscreen_off.png
new file mode 100644
index 0000000..1afb045
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_fullscreen_off.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_fullscreen_on.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_fullscreen_on.png
new file mode 100644
index 0000000..fc1d516
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_fullscreen_on.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_off.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_off.png
new file mode 100644
index 0000000..df99cc7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_off.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_off_handler.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_off_handler.png
new file mode 100755
index 0000000..5a0fd80
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_off_handler.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_on.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_on.png
new file mode 100644
index 0000000..f3f9387
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_on.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_on_handler.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_on_handler.png
new file mode 100755
index 0000000..e6356e6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_on_handler.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_on_off_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_on_off_bg.png
new file mode 100755
index 0000000..3b8b041
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_on_off_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_pause.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_pause.png
new file mode 100644
index 0000000..e32a1fb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_pause.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_play.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_play.png
new file mode 100644
index 0000000..be36511
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_play.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_radio_activated.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_radio_activated.png
new file mode 100644
index 0000000..ea71020
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_radio_activated.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_radio_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_radio_bg.png
new file mode 100644
index 0000000..5ce6a7a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_radio_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_radio_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_radio_press.png
new file mode 100644
index 0000000..47a5f30
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_radio_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_radio_press_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_radio_press_bg.png
new file mode 100644
index 0000000..6be258a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_button_radio_press_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_check_activated.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_check_activated.png
new file mode 100644
index 0000000..a1fe2a8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_check_activated.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_check_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_check_bg.png
new file mode 100644
index 0000000..6f43970
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_check_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_check_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_check_press.png
new file mode 100644
index 0000000..166ab4a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_check_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_check_press_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_check_press_bg.png
new file mode 100644
index 0000000..cda624f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_check_press_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_effect_title_tab_bounce_left.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_effect_title_tab_bounce_left.png
new file mode 100644
index 0000000..7b4f1f0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_effect_title_tab_bounce_left.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_effect_title_tab_bounce_right.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_effect_title_tab_bounce_right.png
new file mode 100644
index 0000000..ee63b70
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_effect_title_tab_bounce_right.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_grid_overscrolling_bottom.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_grid_overscrolling_bottom.png
new file mode 100644
index 0000000..46bb9b8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_grid_overscrolling_bottom.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_grid_overscrolling_left.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_grid_overscrolling_left.png
new file mode 100644
index 0000000..ec4db78
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_grid_overscrolling_left.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_grid_overscrolling_right.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_grid_overscrolling_right.png
new file mode 100644
index 0000000..6d08148
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_grid_overscrolling_right.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_grid_overscrolling_top.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_grid_overscrolling_top.png
new file mode 100644
index 0000000..d0ba116
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_grid_overscrolling_top.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_icon_favorite_off.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_icon_favorite_off.png
new file mode 100644
index 0000000..1305449
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_icon_favorite_off.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_icon_favorite_on.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_icon_favorite_on.png
new file mode 100644
index 0000000..94b2a7e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_icon_favorite_on.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_list_process_01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_list_process_01.png
new file mode 100755
index 0000000..26cff47
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_list_process_01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_messagebubble_bg_receive.9.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_messagebubble_bg_receive.9.png
new file mode 100644
index 0000000..d26b30c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_messagebubble_bg_receive.9.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_messagebubble_bg_sent.9.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_messagebubble_bg_sent.9.png
new file mode 100644
index 0000000..fce4a80
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_messagebubble_bg_sent.9.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_messagebubble_date_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_messagebubble_date_bg.png
new file mode 100644
index 0000000..b5e2381
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_messagebubble_date_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_overscrolling_bottom.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_overscrolling_bottom.png
new file mode 100644
index 0000000..665b62a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_overscrolling_bottom.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_overscrolling_top.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_overscrolling_top.png
new file mode 100644
index 0000000..940f559
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_overscrolling_top.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_scroll_bar_handler.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_scroll_bar_handler.png
new file mode 100644
index 0000000..399413e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_scroll_bar_handler.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_scroll_bar_handler_hor.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_scroll_bar_handler_hor.png
new file mode 100644
index 0000000..dad9669
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_scroll_bar_handler_hor.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_splite_handler_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_splite_handler_h.png
new file mode 100644
index 0000000..48686ba
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_splite_handler_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_splite_handler_v.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_splite_handler_v.png
new file mode 100644
index 0000000..b0e0747
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/00_splite_handler_v.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_field_btn_clear.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_field_btn_clear.png
new file mode 100644
index 0000000..2cd97a9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_field_btn_clear.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_field_btn_clear_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_field_btn_clear_press.png
new file mode 100644
index 0000000..5e62b89
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_field_btn_clear_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_icon_search.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_icon_search.png
new file mode 100644
index 0000000..12c9689
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_icon_search.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_search_icon.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_search_icon.png
new file mode 100644
index 0000000..c634b56
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_search_icon.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_button_brightness_01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_button_brightness_01.png
new file mode 100644
index 0000000..5fbeaf6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_button_brightness_01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_button_brightness_02.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_button_brightness_02.png
new file mode 100644
index 0000000..d8f07a0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_button_brightness_02.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_button_volume_01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_button_volume_01.png
new file mode 100644
index 0000000..1160453
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_button_volume_01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_button_volume_02.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_button_volume_02.png
new file mode 100644
index 0000000..4346870
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_button_volume_02.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_handle.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_handle.png
new file mode 100644
index 0000000..3bfb8fb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_handle.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_handle_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_handle_press.png
new file mode 100644
index 0000000..edb6e97
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_handle_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_popup_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_popup_bg.png
new file mode 100644
index 0000000..a965fe0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/00_slider_popup_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_back.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_back.png
new file mode 100644
index 0000000..fc419fd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_back.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_back_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_back_press.png
new file mode 100644
index 0000000..d8ea50c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_back_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_call.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_call.png
new file mode 100644
index 0000000..9641dcf
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_call.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_call_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_call_press.png
new file mode 100644
index 0000000..68213a2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_call_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_check.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_check.png
new file mode 100644
index 0000000..03334b4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_check.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_check_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_check_press.png
new file mode 100644
index 0000000..7aef39d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_check_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_cancel.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_cancel.png
new file mode 100644
index 0000000..2b0cbb3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_cancel.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_cancel_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_cancel_press.png
new file mode 100644
index 0000000..e2cd2f0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_cancel_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_closed.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_closed.png
new file mode 100644
index 0000000..6412ee8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_closed.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_closed_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_closed_press.png
new file mode 100644
index 0000000..2098db2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_closed_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_minus.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_minus.png
new file mode 100644
index 0000000..100be87
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_minus.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_minus_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_minus_press.png
new file mode 100644
index 0000000..7b11da2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_minus_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_opened.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_opened.png
new file mode 100644
index 0000000..7f5b3d6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_opened.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_opened_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_opened_press.png
new file mode 100644
index 0000000..d539fd0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_opened_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_send.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_send.png
new file mode 100644
index 0000000..8be1a57
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_send.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_send_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_send_press.png
new file mode 100644
index 0000000..fada314
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_expand_send_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_gear.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_gear.png
new file mode 100644
index 0000000..51d4b43
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_gear.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_gear_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_gear_press.png
new file mode 100644
index 0000000..ac976ea
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_gear_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_grid.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_grid.png
new file mode 100644
index 0000000..8d0510b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_grid.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_grid_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_grid_press.png
new file mode 100644
index 0000000..b2eb343
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_grid_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_home.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_home.png
new file mode 100644
index 0000000..f851dc5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_home.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_home_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_home_press.png
new file mode 100644
index 0000000..ba430f1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_home_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_info.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_info.png
new file mode 100644
index 0000000..8259a34
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_info.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_info_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_info_press.png
new file mode 100644
index 0000000..bba8850
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_info_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_left.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_left.png
new file mode 100644
index 0000000..55b6386
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_left.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_left_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_left_press.png
new file mode 100644
index 0000000..67c04fc
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_left_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_plus.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_plus.png
new file mode 100644
index 0000000..4d7aaba
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_plus.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_plus_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_plus_press.png
new file mode 100644
index 0000000..016022d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_plus_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_refresh.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_refresh.png
new file mode 100644
index 0000000..6384283
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_refresh.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_refresh_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_refresh_press.png
new file mode 100644
index 0000000..f83a165
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_refresh_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_rename.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_rename.png
new file mode 100644
index 0000000..0c7b38e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_rename.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_rename_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_rename_press.png
new file mode 100644
index 0000000..c9c514e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_rename_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_right.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_right.png
new file mode 100644
index 0000000..158d6ff
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_right.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_right_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_right_press.png
new file mode 100644
index 0000000..c3613ec
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_right_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_search.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_search.png
new file mode 100644
index 0000000..41aee22
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_search.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_search_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_search_press.png
new file mode 100644
index 0000000..e9e3cee
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_search_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_star.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_star.png
new file mode 100644
index 0000000..cc64af9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_star.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_star_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_star_press.png
new file mode 100644
index 0000000..6d18261
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_star_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_warning.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_warning.png
new file mode 100644
index 0000000..4a39960
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_warning.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_warning_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_warning_press.png
new file mode 100644
index 0000000..16051f3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_button_warning_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_icon_jump.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_icon_jump.png
new file mode 100644
index 0000000..ec8b2ce
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_icon_jump.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_icon_jump_left.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_icon_jump_left.png
new file mode 100644
index 0000000..909d454
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_icon_jump_left.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_icon_jump_left_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_icon_jump_left_press.png
new file mode 100644
index 0000000..031353c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_icon_jump_left_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_icon_jump_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_icon_jump_press.png
new file mode 100644
index 0000000..9f69cba
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/controls/button/00_icon_jump_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_Back.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_Back.png
new file mode 100644
index 0000000..97f7955
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_Back.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_Back_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_Back_press.png
new file mode 100644
index 0000000..4499d20
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_Back_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_SIP_close_press_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_SIP_close_press_web.png
new file mode 100644
index 0000000..323211c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_SIP_close_press_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_SIP_close_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_SIP_close_web.png
new file mode 100644
index 0000000..edd82a7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_SIP_close_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_cancel_press_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_cancel_press_web.png
new file mode 100644
index 0000000..e1506c8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_cancel_press_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_cancel_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_cancel_web.png
new file mode 100644
index 0000000..78b70c8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_cancel_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_delete_press_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_delete_press_web.png
new file mode 100644
index 0000000..29080a9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_delete_press_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_delete_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_delete_web.png
new file mode 100644
index 0000000..a53b455
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_delete_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_done_press_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_done_press_web.png
new file mode 100644
index 0000000..036b1c1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_done_press_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_done_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_done_web.png
new file mode 100644
index 0000000..afc44b4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_done_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_edit_press_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_edit_press_web.png
new file mode 100644
index 0000000..a0e1199
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_edit_press_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_edit_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_edit_web.png
new file mode 100644
index 0000000..8298cbe
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_edit_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_more.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_more.png
new file mode 100644
index 0000000..d148771
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_more.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_more_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_more_press.png
new file mode 100644
index 0000000..5bddca9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_more_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_plus_press_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_plus_press_web.png
new file mode 100644
index 0000000..0a9eb51
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_plus_press_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_plus_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_plus_web.png
new file mode 100644
index 0000000..adc1a73
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_plus_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_search_press_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_search_press_web.png
new file mode 100644
index 0000000..7de4062
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_search_press_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_search_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_search_web.png
new file mode 100644
index 0000000..12c9689
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_search_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_select_all_press_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_select_all_press_web.png
new file mode 100644
index 0000000..ecc5e95
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_select_all_press_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_select_all_web.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_select_all_web.png
new file mode 100644
index 0000000..555bc59
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/images/page/00_icon_select_all_web.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/theme.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/theme.js
new file mode 100644
index 0000000..ff3da79
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/theme.js
@@ -0,0 +1,94 @@
+(function( $, undefined ) {
+//$.mobile.page.prototype.options.backBtnTheme	= "s";
+
+if ($.mobile.page) {
+// Clear default theme for child elements
+$( function ( o ) {
+	o.headerTheme = "s";
+	o.footerTheme = "s";
+} ( $.mobile.page.prototype.options ) );
+}
+
+if ($.mobile.listview) {
+// clear listview
+( function ( o ) {
+	o.theme = "s";
+	o.countTheme = "s";
+	o.headerTheme = "s";
+	o.dividerTheme = "s";
+	o.splitTheme = "s";
+} ( $.mobile.listview.prototype.options ) );
+}
+
+if ($.mobile.collapsible) {
+// Collapsible
+( function ( o ) {
+	o.heading = o.heading + ',li';		// Add listitem as a heading
+	o.inset = false;
+	o.iconPos = "right";	// Move iconPos to right position
+	o.collapsedIcon = "arrow-u";
+	o.expandedIcon = "arrow-d";
+	o.animation = true;
+	o.customEventHandler = function ( isCollapse ) {
+		var self = this,
+			c = $(self).children('.ui-collapsible-content')[0];
+
+		function _getHeight( el ) {
+			var h = 0,
+				heading = $( el ).children('.ui-collapsible-heading')[0],
+				content = $( el ).children('.ui-collapsible-content')[0];
+
+			h += heading.clientHeight;
+			$( content ).children().each ( function ( idx, _el ) {
+				if ( $( _el ).hasClass( 'ui-collapsible' ) ) {	// recursive call for nested collapsible list
+					h += _getHeight( _el );
+
+				} else {
+					h += _el.clientHeight;
+				}
+			} );
+			return h;
+		}
+
+		if ( isCollapse ) {	// collapse!
+			// remember current height
+			$( c ).data( 'max-height', _getHeight( self ) );
+			$( self ).parentsUntil( '.ui-page', '.ui-collapsible' ).each( function( idx, el ) {
+				var content = $( el ).children('.ui-collapsible-content')[0];
+				$( content ).data( 'max-height', _getHeight( el ) );
+			} );
+
+		} else {	// expand!
+			h = $( c ).data( 'max-height' );
+			if ( !h ) {
+				h = document.body.clientHeight;
+				$( c ).data( 'max-height', h );
+			}
+			$( c ).css( 'max-height', h );
+			$( self ).parentsUntil( '.ui-page', '.ui-collapsible' ).each( function( idx, el ) {
+				var content = $( el ).children('.ui-collapsible-content')[0];
+				$( content ).css( 'max-height', _getHeight( el ) );
+			} );
+		}
+	};
+} ( $.mobile.collapsible.prototype.options ) );
+}
+
+if ($.mobile.button) {
+//clear button theme
+$.mobile.button.prototype.options.theme = "s";
+$.fn.buttonMarkup.defaults.theme = "s";
+}
+
+if ($.mobile.page) {
+// Default theme swatch
+$.mobile.page.prototype.options.theme = "s";
+}
+
+if ($.tizen.frameworkData) {
+// Original scale of the theme
+$.tizen.frameworkData.defaultViewportWidth = 360;	// Fit to device-width
+$.tizen.frameworkData.defaultFontSize = 22;
+}
+
+})(jQuery);
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/tizen-web-ui-fw-theme.css b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/tizen-web-ui-fw-theme.css
new file mode 100644
index 0000000..cf462e7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/latest/themes/tizen-white/tizen-web-ui-fw-theme.css
@@ -0,0 +1,12262 @@
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/***************************************************************************
+                    Header / Footer
+                    NavigationBar
+***************************************************************************/
+.ui-bar-s {
+  border: none;
+  background: #edebe4;
+  /* Header Background */
+
+  color: #252525;
+  font-family: Tizen, Helvetica;
+  font-weight: bold;
+  font-size: 1.2727272727272727rem;
+}
+.ui-bar-s .ui-link-inherit {
+  color: #252525;
+}
+.ui-bar-s > .ui-btn.ui-btn-back,
+.ui-bar-s > .ui-btn.ui-btn-footer-down {
+  background: transparent;
+  position: absolute;
+  right: 0px;
+}
+.ui-bar-s > .ui-btn.ui-btn-back .ui-icon-header-back-btn,
+.ui-bar-s > .ui-btn.ui-btn-footer-down .ui-icon-header-back-btn {
+  top: 0.36363636363636365rem;
+  left: auto;
+  right: 0.5909090909090909rem;
+  margin-top: 0px;
+}
+.ui-bar-s > .ui-btn.ui-btn-footer-down {
+  border: none;
+  box-shadow: none;
+}
+.ui-bar-s > .ui-btn.ui-btn-footer-down .ui-icon {
+  top: 0.36363636363636365rem;
+  margin-top: 0px;
+}
+/* Header style */
+.ui-header.ui-bar-s {
+  position: fixed;
+  top: 0px;
+  min-height: 2.1818181818181817rem;
+  /* header button position : need to press area more... */
+
+}
+.ui-header.ui-bar-s .ui-title {
+  display: inline-block;
+  color: #252525;
+  min-height: 1.1363636363636365rem;
+  max-height: 1.4090909090909092rem;
+  /* temporary UX strange */
+
+  font-size: 1.1363636363636365rem;
+  font-weight: 500;
+  /* tizen font weight tuning */
+
+  text-overflow: ellipsis;
+  text-shadow: 0px 2px rgba(250, 250, 250, 0.75);
+  overflow: hidden;
+  white-space: nowrap;
+  outline: 0 !important;
+  text-align: left;
+  margin: 0.4545454545454546rem 0.5909090909090909rem 0.4090909090909091rem 0.5909090909090909rem;
+  /* text align center tuning */
+
+}
+.ui-header.ui-bar-s > .ui-btn .ui-btn-inner.ui-btn-icon-only,
+.ui-header.ui-bar-s > .naviframe-button.ui-btn .ui-btn-inner.ui-btn-icon-only {
+  -o-box-sizing: border-box;
+  -ms-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  height: 100%;
+}
+.ui-header.ui-bar-s > .ui-btn .ui-btn-inner.ui-btn-icon-only .ui-icon,
+.ui-header.ui-bar-s > .naviframe-button.ui-btn .ui-btn-inner.ui-btn-icon-only .ui-icon {
+  top: 0px;
+  left: 0px;
+}
+.ui-header.ui-bar-s > .naviframe-button.ui-btn .ui-btn-inner .ui-icon {
+  margin-top: 0px;
+}
+.ui-header.ui-bar-s > .ui-btn:not(.ui-btn-icon-notext) .ui-btn-inner.ui-btn-icon-only,
+.ui-header.ui-bar-s > .naviframe-button.ui-btn:not(.ui-btn-icon-notext) .ui-btn-inner.ui-btn-icon-only {
+  padding-left: 0px;
+}
+.ui-header.ui-bar-s > .ui-btn:not(.ui-btn-icon_only),
+.ui-header.ui-bar-s > .naviframe-button.ui-btn:not(.ui-btn-icon_only) {
+  width: 2.8181818181818183rem;
+  height: 2.1818181818181817rem;
+  padding: 0px;
+  top: 0px;
+  border-left-width: 1px;
+  border-left-style: solid;
+  border-left-color: #8a8a8a;
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+}
+.ui-header.ui-bar-s > .ui-btn:not(.ui-btn-icon_only) .ui-btn-inner,
+.ui-header.ui-bar-s > .naviframe-button.ui-btn:not(.ui-btn-icon_only) .ui-btn-inner {
+  padding: 0;
+  padding-top: 0rem;
+  padding-bottom: 0rem;
+  margin-top: 0.5454545454545454rem;
+  margin-bottom: 0.5454545454545454rem;
+}
+.ui-header.ui-bar-s > .ui-btn:not(.ui-btn-icon_only) .ui-btn-inner .ui-btn-text,
+.ui-header.ui-bar-s > .naviframe-button.ui-btn:not(.ui-btn-icon_only) .ui-btn-inner .ui-btn-text {
+  font-size: 0.7272727272727273rem;
+}
+.ui-header.ui-bar-s > .ui-btn:not(.ui-btn-icon_only).ui-btn-down-s,
+.ui-header.ui-bar-s > .naviframe-button.ui-btn:not(.ui-btn-icon_only).ui-btn-down-s {
+  background-color: #5787c2;
+}
+.ui-header.ui-bar-s > .ui-btn.ui-btn-back,
+.ui-header.ui-bar-s > .ui-btn.ui-btn-footer-down {
+  right: 0.5909090909090909rem;
+}
+.ui-header.ui-bar-s > .ui-btn.ui-btn-back .ui-icon-header-back-btn,
+.ui-header.ui-bar-s > .ui-btn.ui-btn-footer-down .ui-icon-header-back-btn {
+  left: 0px;
+}
+.ui-header.ui-bar-s img {
+  position: absolute;
+  display: inline-block;
+  height: 1rem;
+  width: 1rem;
+  margin-left: 0.5909090909090909rem;
+  margin-top: 0.5909090909090909rem;
+}
+.ui-header.ui-bar-s .ui-title-text-sub {
+  position: absolute;
+  top: 1.3181818181818181rem;
+  left: 0.5909090909090909rem;
+  font-size: 0.7272727272727273rem;
+  font-weight: 500;
+  text-shadow: 0px 2px rgba(250, 250, 250, 0.75);
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  overflow: hidden;
+}
+.ui-header.ui-bar-s > .ui-btn,
+.ui-header.ui-bar-s > .naviframe-button.ui-btn {
+  position: absolute;
+  top: 0.4090909090909091rem;
+  font-size: 0.8181818181818182rem;
+  margin-top: 0px;
+  height: 1.5454545454545454rem;
+  width: 1.5454545454545454rem;
+  padding-left: 0.5909090909090909rem;
+  padding-right: 0.5909090909090909rem;
+  background: transparent;
+  color: #252525;
+}
+.ui-header.ui-bar-s.ui-title-tabbar > .ui-btn {
+  top: 0.36363636363636365rem;
+}
+.ui-header.ui-bar-s > .ui-btn.ui-btn-icon_only,
+.ui-header.ui-bar-s > .naviframe-button.ui-btn.ui-btn-icon_only {
+  top: 0.36363636363636365rem;
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  border-left-width: 1px;
+  border-left-style: solid;
+  border-left-color: #8a8a8a;
+  border-top-left-radius: 0px;
+  border-bottom-left-radius: 0px;
+}
+.ui-header.ui-bar-s .ui-btn-right-0 {
+  right: 0rem;
+}
+.ui-header.ui-bar-s .ui-btn-right-1 {
+  right: 2.6363636363636362rem;
+}
+.ui-header.ui-bar-s > .ui-btn:not(.ui-btn-icon_only):nth-child(2),
+.ui-header.ui-bar-s > .naviframe-button.ui-btn:not(.ui-btn-icon_only):nth-child(2) {
+  right: 0rem;
+}
+.ui-header.ui-bar-s > .ui-btn:not(.ui-btn-icon_only):nth-child(3),
+.ui-header.ui-bar-s > .naviframe-button.ui-btn:not(.ui-btn-icon_only):nth-child(3) {
+  right: 2.8181818181818183rem;
+}
+.ui-header.ui-bar-s > img + h1 {
+  padding-left: 1.3636363636363638rem;
+}
+.ui-header.ui-bar-s > img + h1 + .ui-btn:not(.ui-btn-icon_only):nth-child(3),
+.ui-header.ui-bar-s > img + h1 + .naviframe-button.ui-btn:not(.ui-btn-icon_only):nth-child(3) {
+  right: 0rem;
+}
+.ui-header.ui-bar-s > img + h1 + .ui-btn:not(.ui-btn-icon_only):nth-child(3) + .ui-btn:not(.ui-btn-icon_only),
+.ui-header.ui-bar-s > img + h1 + .naviframe-button.ui-btn:not(.ui-btn-icon_only):nth-child(3) + .naviframe-button.ui-btn:not(.ui-btn-icon_only) {
+  right: 2.8181818181818183rem;
+}
+.ui-header.ui-bar-s > img + h1 + span.ui-title-text-sub + .ui-btn:not(.ui-btn-icon_only):nth-child(4),
+.ui-header.ui-bar-s > img + h1 + span.ui-title-text-sub + .naviframe-button.ui-btn:not(.ui-btn-icon_only):nth-child(4) {
+  right: 0rem;
+}
+.ui-header.ui-bar-s > img + h1 + span.ui-title-text-sub + .ui-btn:not(.ui-btn-icon_only):nth-child(4) + .ui-btn:not(.ui-btn-icon_only),
+.ui-header.ui-bar-s > img + h1 + span.ui-title-text-sub + .naviframe-button.ui-btn:not(.ui-btn-icon_only):nth-child(4) + .naviframe-button.ui-btn:not(.ui-btn-icon_only) {
+  right: 2.8181818181818183rem;
+}
+.ui-header.ui-bar-s > .ui-btn.ui-btn-down-s {
+  background: rgba(14, 102, 170, 0.1);
+  color: #252525;
+}
+.ui-header.ui-bar-s.ui-title-multiline img {
+  margin-top: 0.6818181818181819rem;
+  /* tuning */
+
+}
+.ui-header.ui-bar-s.ui-title-multiline .ui-title {
+  min-height: 1.0909090909090908rem;
+  max-height: 1.0909090909090908rem;
+  /* temporary UX strange */
+
+  font-size: 1rem;
+  margin: 0.18181818181818182rem 0.5909090909090909rem 1rem 0.5909090909090909rem;
+}
+.ui-header.ui-bar-s.ui-title-multiline img + .ui-title + .ui-title-text-sub {
+  left: 1.9090909090909092rem;
+}
+.ui-footer.ui-bar-s {
+  height: 2.2272727272727275rem;
+  text-align: center;
+  bottom: 0px;
+  background: #dedcd5;
+}
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-back,
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-footer-down,
+.ui-footer.ui-bar-s > [data-icon="naviframe-more"] {
+  background: transparent;
+}
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-back > .ui-btn-icon-only,
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-footer-down > .ui-btn-icon-only,
+.ui-footer.ui-bar-s > [data-icon="naviframe-more"] > .ui-btn-icon-only {
+  width: 2.5454545454545454rem;
+  height: 2.2272727272727275rem;
+  padding: 0px;
+  -webkit-box-shadow: none /* temp code */
+;
+}
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-back,
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-footer-down {
+  top: 0px;
+}
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-footer-down .ui-icon {
+  left: auto;
+  right: 0.5909090909090909rem;
+}
+.ui-footer.ui-bar-s [data-icon="naviframe-more"] {
+  position: absolute;
+  left: 0rem;
+  top: 0rem;
+  box-shadow: none;
+  border-width: 0px;
+}
+.ui-footer.ui-bar-s [data-icon="naviframe-more"] .ui-icon-naviframe-more {
+  left: 0.5909090909090909rem;
+  top: 0.36363636363636365rem;
+  margin-top: 0px;
+}
+.ui-footer.ui-bar-s [data-icon="naviframe-more"] .ui-btn-inner {
+  border: none;
+  background: transparent;
+  box-shadow: none;
+}
+.ui-footer.ui-bar-s > [data-role="button"] {
+  font-size: 0.9090909090909092rem;
+  font-weight: bold;
+  color: #3a3a3a;
+  background-image: none;
+  border-width: 0px;
+}
+.ui-footer.ui-bar-s > [data-role="button"] > .ui-btn-inner {
+  padding-top: 0px;
+  padding-bottom: 0px;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] {
+  margin-left: auto;
+  margin-right: auto;
+  margin-top: 0.2272727272727273rem;
+  margin-bottom: 0.2272727272727273rem;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"] {
+  background: transparent;
+  vertical-align: middle;
+  border-style: solid;
+  border-color: #8a8a8a;
+  border-top-width: 0px;
+  border-bottom-width: 0px;
+  border-left-width: 1px;
+  border-right-width: 1px;
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+  border-radius: 0px !important;
+  box-shadow: none;
+  padding: 0px;
+  margin-left: -0.18181818181818182rem;
+  margin-right: -0.2272727272727273rem;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"].ui-btn-hover-s,
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"].ui-btn-up-s {
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"].ui-btn-down-s,
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"] .ui-btn-active-s {
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"].ui-btn-down-s .ui-btn-inner,
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"] .ui-btn-active-s .ui-btn-inner {
+  background: #dedcd5;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"].ui-btn-down-s .ui-btn-inner .ui-btn-text,
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"] .ui-btn-active-s .ui-btn-inner .ui-btn-text {
+  color: #252525;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"] > .ui-btn-inner {
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+  border: 0px solid;
+  box-shadow: none;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"] .ui-btn-text {
+  vertical-align: middle;
+  font-size: 0.7727272727272727rem;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"].ui-corner-right {
+  border-right-width: 0px;
+}
+.ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"].ui-corner-left {
+  border-left-width: 0px;
+}
+.ui-footer.ui-bar-s > [data-role="button"]:not([data-icon="naviframe-more"]) {
+  top: 0px;
+  padding: 0.5454545454545454rem 0px;
+}
+.ui-footer.ui-bar-s > p {
+  margin-top: 0.36363636363636365rem;
+  margin-bottom: 0.36363636363636365rem;
+}
+.ui-footer.ui-bar-s > h1,
+.ui-footer.ui-bar-s h2,
+.ui-footer.ui-bar-s h3,
+.ui-footer.ui-bar-s h4,
+.ui-footer.ui-bar-s h5,
+.ui-footer.ui-bar-s h6 {
+  display: inline-block;
+}
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-box-s {
+  box-shadow: none;
+  bottom: 0px;
+  -o-border-radius: 0em ! important;
+  -ms-border-radius: 0em ! important;
+  -moz-border-radius: 0em ! important;
+  -webkit-border-radius: 0em ! important;
+  border-radius: 0em ! important;
+}
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-box-s .ui-btn-inner {
+  -o-border-radius: 0em ! important;
+  -ms-border-radius: 0em ! important;
+  -moz-border-radius: 0em ! important;
+  -webkit-border-radius: 0em ! important;
+  border-radius: 0em ! important;
+}
+.ui-footer.ui-bar-s > .ui-btn.ui-btn-down-s.ui-btn-box-s:not([data-icon="naviframe-more"]) {
+  background-color: #0e66aa !important;
+}
+.ui-footer.ui-bar-s > .ui-footer-btn-border > .ui-btn-inner {
+  border-left: 2px solid rgba(138, 138, 138, 0.2);
+}
+/***************************************************************************
+                    Content Top calculate
+***************************************************************************/
+.ui-content {
+  position: relative;
+  top: 0;
+}
+/***************************************************************************
+                    Content Top calculate
+***************************************************************************/
+.ui-body-s {
+  border: 1px solid #2a2a2a;
+  background: #f8f6ef;
+  color: #000000;
+  font-weight: normal;
+  font-family: Tizen, Helvetica;
+}
+.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-box-s {
+  padding: 0.045454545454545456rem;
+}
+.ui-btn.ui-btn-corner-all.ui-btn-box-s .ui-btn-inner {
+  -o-border-radius: 1.2rem;
+  -ms-border-radius: 1.2rem;
+  -moz-border-radius: 1.2rem;
+  -webkit-border-radius: 1.2rem;
+  border-radius: 1.2rem;
+}
+.ui-ctxpopup .ui-btn-box-s.ui-btn-up-s,
+.ui-ctxpopup .ui-btn-box-s.ui-btn-hover-s {
+  background: transparent !important;
+  border: none;
+  box-shadow: none;
+  padding: 0;
+  color: white !important;
+}
+.ui-ctxpopup .ui-btn-box-s.ui-btn-down-s {
+  background: #2a89c2 !important;
+  border: none;
+  box-shadow: none;
+  padding: 0;
+  color: white !important;
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+}
+.ui-ctxpopup .ui-btn-box-s .ui-btn-inner {
+  background: transparent ! important;
+  box-shadow: none;
+  border: none;
+}
+.ui-ctxpopup .ui-btn-down-s {
+  background: #2a89c2 !important;
+}
+.ui-header .ui-btn-box-s,
+.ui-footer .ui-btn-box-s,
+.ui-btn-back.ui-btn-up-s,
+.ui-btn-back.ui-btn-hover-s,
+.ui-btn-back.ui-btn-down-s,
+.ui-btn-footer-down.ui-btn-up-s,
+.ui-btn-footer-down.ui-btn-hover-s,
+.ui-btn-footer-down.ui-btn-down-s,
+.ui-popup-container .ui-btn-box-s {
+  font-weight: normal;
+  -o-border-radius: 0.9 rem;
+  -ms-border-radius: 0.9 rem;
+  -moz-border-radius: 0.9 rem;
+  -webkit-border-radius: 0.9 rem;
+  border-radius: 0.9 rem;
+}
+.ui-btn-box-s.ui-btn-hover-s.ui-btn-corner-circle {
+  -o-border-radius: 1em ! important;
+  -ms-border-radius: 1em ! important;
+  -moz-border-radius: 1em ! important;
+  -webkit-border-radius: 1em ! important;
+  border-radius: 1em ! important;
+}
+.ui-btn-box-s.ui-btn-hover-s.ui-btn-round {
+  -o-border-radius: 1.2em ! important;
+  -ms-border-radius: 1.2em ! important;
+  -moz-border-radius: 1.2em ! important;
+  -webkit-border-radius: 1.2em ! important;
+  border-radius: 1.2em ! important;
+}
+.ui-btn-box-s.ui-btn-down-s .ui-btn-inner {
+  /*	background: @color_button_press;*/
+
+  color: #ffffff;
+}
+.ui-btn-up-s,
+.ui-btn-hover-s,
+.ui-btn-down-s {
+  font-family: Tizen, Helvetica;
+  text-decoration: none;
+}
+/*
+/* 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: #3a3a3a;
+  cursor: pointer;
+  text-decoration: none;
+  background: #007ad8;
+  outline: none;
+}
+.ui-btn-active a.ui-link-inherit {
+  color: #3a3a3a;
+}
+/* corner rounding classes
+-----------------------------------------------------------------------------------------------------------*/
+.ui-corner-tl {
+  -moz-border-radius-topleft: 0.3em;
+  -webkit-border-top-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+}
+.ui-corner-tr {
+  -moz-border-radius-topright: 0.3em;
+  -webkit-border-top-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
+.ui-corner-bl {
+  -moz-border-radius-bottomleft: 0.3em;
+  -webkit-border-bottom-left-radius: 0.3em;
+  border-bottom-left-radius: 0.3em;
+}
+.ui-corner-br {
+  -moz-border-radius-bottomright: 0.3em;
+  -webkit-border-bottom-right-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+}
+.ui-corner-top {
+  -moz-border-radius-topleft: 0.3em;
+  -webkit-border-top-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+  -moz-border-radius-topright: 0.3em;
+  -webkit-border-top-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
+.ui-corner-bottom {
+  -moz-border-radius-bottomleft: 0.3em;
+  -webkit-border-bottom-left-radius: 0.3em;
+  border-bottom-left-radius: 0.3em;
+  -moz-border-radius-bottomright: 0.3em;
+  -webkit-border-bottom-right-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+}
+.ui-corner-right {
+  -moz-border-radius-topright: 0.3em;
+  -webkit-border-top-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+  -moz-border-radius-bottomright: 0.3em;
+  -webkit-border-bottom-right-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+}
+.ui-corner-left {
+  -moz-border-radius-topleft: 0.3em;
+  -webkit-border-top-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+  -moz-border-radius-bottomleft: 0.3em;
+  -webkit-border-bottom-left-radius: 0.3em;
+  border-bottom-left-radius: 0.3em;
+}
+.ui-corner-none {
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+}
+/*************************************************************************** 
+                    Icon (Naviframe)
+***************************************************************************/
+.ui-header .ui-btn .ui-btn-icon-only .ui-icon,
+.ui-footer .ui-btn .ui-btn-icon-only .ui-icon {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+}
+.ui-btn-back .ui-btn-inner .ui-icon-header-back-btn,
+.ui-btn-footer-down .ui-btn-inner .ui-icon {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+}
+.ui-btn-up-s {
+  /* less parsing problem : divide css */
+
+  /* FIXME : check ux if it needs to be deprecated... */
+
+}
+.ui-btn-up-s .ui-icon-header-back-btn {
+  background-image: url(images/page/00_icon_Back.png);
+}
+.ui-btn-up-s .ui-icon-naviframe-more {
+  background-image: url(images/page/00_icon_more.png);
+}
+.ui-btn-up-s .ui-icon-down {
+  background-image: url(images/page/00_icon_SIP_close_web.png);
+}
+.ui-btn-up-s .ui-icon-naviframe-cancel {
+  background-image: url(images/page/00_icon_cancel_web.png);
+}
+.ui-btn-up-s .ui-icon-naviframe-edit {
+  background-image: url(images/page/00_icon_edit_web.png);
+}
+.ui-btn-up-s .ui-icon-naviframe-plus {
+  background-image: url(images/page/00_icon_plus_web.png);
+}
+.ui-btn-up-s .ui-icon-naviframe-delete {
+  background-image: url(images/page/00_icon_delete_web.png);
+}
+.ui-btn-up-s .ui-icon-naviframe-done {
+  background-image: url(images/page/00_icon_done_web.png);
+}
+.ui-btn-up-s .ui-icon-naviframe-search {
+  background-image: url(images/page/00_icon_search_web.png);
+}
+.ui-btn-up-s .ui-icon-naviframe-selectall {
+  background-image: url(images/page/00_icon_select_all_web.png);
+}
+
+.ui-btn-hover-s .ui-icon-header-back-btn {
+  background-image: url(images/page/00_icon_Back.png);
+}
+.ui-btn-hover-s .ui-icon-naviframe-more {
+  background-image: url(images/page/00_icon_more.png);
+}
+.ui-btn-hover-s .ui-icon-down {
+  background-image: url(images/page/00_icon_SIP_close_web.png);
+}
+.ui-btn-hover-s .ui-icon-naviframe-cancel {
+  background-image: url(images/page/00_icon_cancel_web.png);
+}
+.ui-btn-hover-s .ui-icon-naviframe-edit {
+  background-image: url(images/page/00_icon_edit_web.png);
+}
+.ui-btn-hover-s .ui-icon-naviframe-plus {
+  background-image: url(images/page/00_icon_plus_web.png);
+}
+.ui-btn-hover-s .ui-icon-naviframe-delete {
+  background-image: url(images/page/00_icon_delete_web.png);
+}
+.ui-btn-hover-s .ui-icon-naviframe-done {
+  background-image: url(images/page/00_icon_done_web.png);
+}
+.ui-btn-hover-s .ui-icon-naviframe-search {
+  background-image: url(images/page/00_icon_search_web.png);
+}
+.ui-btn-hover-s .ui-icon-naviframe-selectall {
+  background-image: url(images/page/00_icon_select_all_web.png);
+}
+
+.ui-btn-down-s .ui-icon-header-back-btn {
+  background-image: url(images/page/00_icon_Back_press.png);
+}
+.ui-btn-down-s .ui-icon-naviframe-more {
+  background-image: url(images/page/00_icon_more_press.png);
+}
+.ui-btn-down-s .ui-icon-down {
+  background-image: url(images/page/00_icon_SIP_close_press_web.png);
+}
+.ui-btn-down-s .ui-icon-naviframe-cancel {
+  background-image: url(images/page/00_icon_cancel_press_web.png);
+}
+.ui-btn-down-s .ui-icon-naviframe-edit {
+  background-image: url(images/page/00_icon_edit_press_web.png);
+}
+.ui-btn-down-s .ui-icon-naviframe-plus {
+  background-image: url(images/page/00_icon_plus_press_web.png);
+}
+.ui-btn-down-s .ui-icon-naviframe-delete {
+  background-image: url(images/page/00_icon_delete_press_web.png);
+}
+.ui-btn-down-s .ui-icon-naviframe-done {
+  background-image: url(images/page/00_icon_done_press_web.png);
+}
+.ui-btn-down-s .ui-icon-naviframe-search {
+  background-image: url(images/page/00_icon_search_press_web.png);
+}
+.ui-btn-down-s .ui-icon-naviframe-selectall {
+  background-image: url(images/page/00_icon_select_all_press_web.png);
+}
+/* Interaction cues
+-----------------------------------------------------------------------------------------------------------*/
+.ui-disabled {
+  filter: alpha(opacity=30);
+  opacity: .3;
+  zoom: 1;
+}
+.ui-disabled,
+.ui-disabled a {
+  cursor: default !important;
+  pointer-events: none;
+}
+/************************************************************************
+			Landscape mode
+************************************************************************/
+@media all and (orientation: landscape) and (device-aspect-ratio: 16/9) {
+  .ui-bar-s > .ui-btn.ui-btn-back .ui-icon-header-back-btn,
+  .ui-bar-s > .ui-btn.ui-btn-footer-down .ui-icon-header-back-btn {
+    top: 0.2272727272727273rem;
+  }
+  .ui-header.ui-bar-s {
+    min-height: 2.0454545454545454rem;
+  }
+  .ui-header.ui-bar-s .ui-title {
+    min-height: 1.1363636363636365rem;
+    max-height: 1.3181818181818181rem;
+    font-size: 1.1363636363636365rem;
+    margin: 0.5454545454545454rem 0.5909090909090909rem 0.18181818181818182rem 0.5909090909090909rem;
+    /* tuning UX guide(title height too large)*/
+  
+  }
+  .ui-header.ui-bar-s > .ui-btn.ui-btn-back,
+  .ui-header.ui-bar-s > .ui-btn.ui-btn-footer-down {
+    right: 0.5909090909090909rem;
+  }
+  .ui-header.ui-bar-s img {
+    margin-top: 0.6363636363636364rem;
+    height: 1.0454545454545454rem;
+    width: 1.0454545454545454rem;
+  }
+  .ui-header.ui-bar-s .ui-title-text-sub {
+    top: 1.1818181818181819rem;
+  }
+  .ui-header.ui-bar-s > .ui-btn,
+  .ui-header.ui-bar-s > .naviframe-button.ui-btn {
+    top: 0.36363636363636365rem;
+    height: 1.5454545454545454rem;
+    width: 1.5454545454545454rem;
+  }
+  .ui-header.ui-bar-s.ui-title-tabbar > .ui-btn {
+    top: 0.36363636363636365rem;
+  }
+  .ui-header.ui-bar-s.ui-title-multiline img {
+    margin-top: 0.5454545454545454rem;
+  }
+  .ui-header.ui-bar-s.ui-title-multiline .ui-title {
+    min-height: 0.9545454545454546rem;
+    max-height: 0.9545454545454546rem;
+    /* temporary UX strange */
+  
+    font-size: 0.8636363636363636rem;
+    margin: 0.2272727272727273rem 0.5909090909090909rem 0.8636363636363636rem 0.5909090909090909rem;
+    display: block;
+  }
+  .ui-header.ui-bar-s.ui-title-multiline .ui-title-text-sub {
+    top: 1.1818181818181819rem;
+    font-size: 0.6363636363636364rem;
+  }
+  .ui-footer.ui-bar-s {
+    height: 1.9090909090909092rem;
+  }
+  .ui-footer.ui-bar-s > .ui-btn.ui-btn-back > .ui-btn-icon-only,
+  .ui-footer.ui-bar-s > .ui-btn.ui-btn-footer-down > .ui-btn-icon-only,
+  .ui-footer.ui-bar-s > [data-icon="naviframe-more"] > .ui-btn-icon-only {
+    width: 2.5454545454545454rem;
+    height: 1.9090909090909092rem;
+  }
+  .ui-footer.ui-bar-s > .ui-btn.ui-btn-back .ui-icon-down,
+  .ui-footer.ui-bar-s > .ui-btn.ui-btn-footer-down .ui-icon-down,
+  .ui-footer.ui-bar-s > [data-icon="naviframe-more"] .ui-icon-down {
+    top: 0.2272727272727273rem;
+  }
+  .ui-footer.ui-bar-s [data-icon="naviframe-more"] .ui-icon-naviframe-more {
+    top: 0.2272727272727273rem;
+  }
+  .ui-footer.ui-bar-s [data-role="controlgroup"] {
+    margin-top: 0.2727272727272727rem;
+    margin-bottom: 0.2727272727272727rem;
+    /* temp value */
+  
+    padding-left: 2.6363636363636362rem;
+    padding-right: 2.6363636363636362rem;
+  }
+  .ui-footer.ui-bar-s [data-role="controlgroup"] [data-role="button"] {
+    padding: 0px;
+    margin-left: -0.18181818181818182rem;
+    margin-right: -0.2272727272727273rem;
+    top: -0.18181818181818182rem;
+  }
+  .ui-footer.ui-bar-s > [data-role="button"]:not([data-icon="naviframe-more"]) {
+    position: absolute;
+    top: 0px;
+  }
+}
+/*
+* 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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/************************/
+/* some unsets - more probably needed */
+.ui-mobile,
+.ui-mobile body {
+  height: 100%;
+  font-size: 22px;
+}
+@media all and (max-width: 359px) {
+  .ui-mobile,
+  .ui-mobile body {
+    font-size: 19px;
+  }
+}
+.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%;
+  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;
+}
+.ui-mobile,
+.ui-mobile .ui-page {
+  background: #f8f6ef;
+  color: #000000;
+}
+/* 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 */
+
+  transform: rotateY(0);
+  -ms-transform: rotateY(0);
+  -moz-transform: rotateY(0);
+  -webkit-transform: rotateY(0);
+  -o-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: 1.4545454545454546rem;
+  text-align: center;
+}
+.ui-loader .ui-icon {
+  position: static;
+  display: block;
+  opacity: .9;
+  margin: 0 auto;
+  width: 35px;
+  height: 35px;
+  background-color: transparent;
+}
+.ui-blocker {
+  width: 100%;
+  height: 100%;
+  z-index: 2147483647;
+}
+/*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;
+}
+/* Title button packing order */
+.ui-header .ui-btn-left {
+  top: .4em;
+  float: left;
+}
+.ui-header .ui-btn-right {
+  float: right;
+  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;
+}
+/* Transitions originally inspired by those from jQtouch, nice work, folks */
+.ui-mobile-viewport-transitioning,
+.ui-mobile-viewport-transitioning .ui-page {
+	width: 100%;
+	height: 100%;
+	overflow: hidden;
+}
+
+.in {
+	-ms-animation-timing-function: ease-out;
+        -ms-animation-duration: 350ms;
+	-o-animation-timing-function: ease-out;
+        -o-animation-duration: 350ms;
+	-webkit-animation-timing-function: ease-out;
+	-webkit-animation-duration: 350ms;
+	-moz-animation-timing-function: ease-out;
+	-moz-animation-duration: 350ms;
+}
+
+.out {
+	-ms-animation-timing-function: ease-in;
+        -ms-animation-duration: 225ms;
+        -o-animation-timing-function: ease-in;
+        -o-animation-duration: 225;
+	-webkit-animation-timing-function: ease-in;
+	-webkit-animation-duration: 225ms;
+	-moz-animation-timing-function: ease-in;
+	-moz-animation-duration: 225;
+}
+
+
+/* fade */
+
+@-webkit-keyframes fadein {
+    from { opacity: 0; }
+    to { opacity: 1; }
+}
+
+@-moz-keyframes fadein {
+    from { opacity: 0; }
+    to { opacity: 1; }
+}
+
+@-webkit-keyframes fadeout {
+    from { opacity: 1; }
+    to { opacity: 0; }
+}
+
+@-moz-keyframes fadeout {
+    from { opacity: 1; }
+    to { opacity: 0; }
+}
+
+.fade.out {
+	opacity: 0;
+	-ms-animation-duration: 125ms;
+        -ms-animation-name: fadeout;
+        -o-animation-duration: 125ms;
+        -o-animation-name: fadeout;
+	-webkit-animation-duration: 125ms;
+	-webkit-animation-name: fadeout;
+	-moz-animation-duration: 125ms;
+	-moz-animation-name: fadeout;
+}
+
+.fade.in {
+	opacity: 1;
+	-ms-animation-duration: 225ms;
+        -ms-animation-name: fadein;
+        -o-animation-duration: 225ms;
+        -o-animation-name: fadein;
+	-webkit-animation-duration: 225ms;
+	-webkit-animation-name: fadein;
+	-moz-animation-duration: 225ms;
+	-moz-animation-name: fadein;
+}
+
+
+/* flip */
+
+/* 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 {
+	-ms-perspective: 1000;
+	-o-perspective: 1000;
+	-webkit-perspective: 1000;
+	-moz-perspective: 1000;
+	position: absolute;
+}
+.flip {
+	-webkit-backface-visibility:hidden;
+	-webkit-transform:translate3d(0, 0, 0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */
+	-moz-backface-visibility:hidden;
+	-moz-transform:translate3d(0, 0, 0);
+}
+
+.flip.out {
+	-webkit-transform: rotateY(-90deg) scale(.9);
+	-webkit-animation-name: flipouttoleft;
+	-webkit-animation-duration: 175ms;
+	-moz-transform: rotateY(-90deg) scale(.9);
+	-moz-animation-name: flipouttoleft;
+	-moz-animation-duration: 175ms;
+}
+
+.flip.in {
+	-webkit-animation-name: flipintoright;
+	-webkit-animation-duration: 225ms;
+	-moz-animation-name: flipintoright;
+	-moz-animation-duration: 225ms;
+}
+
+.flip.out.reverse {
+	-webkit-transform: rotateY(90deg) scale(.9);
+	-webkit-animation-name: flipouttoright;
+	-moz-transform: rotateY(90deg) scale(.9);
+	-moz-animation-name: flipouttoright;
+}
+
+.flip.in.reverse {
+	-webkit-animation-name: flipintoleft;
+	-moz-animation-name: flipintoleft;
+}
+
+@-webkit-keyframes flipouttoleft {
+    from { -webkit-transform: rotateY(0); }
+    to { -webkit-transform: rotateY(-90deg) scale(.9); }
+}
+@-moz-keyframes flipouttoleft {
+    from { -moz-transform: rotateY(0); }
+    to { -moz-transform: rotateY(-90deg) scale(.9); }
+}
+@-webkit-keyframes flipouttoright {
+    from { -webkit-transform: rotateY(0) ; }
+    to { -webkit-transform: rotateY(90deg) scale(.9); }
+}
+@-moz-keyframes flipouttoright {
+    from { -moz-transform: rotateY(0); }
+    to { -moz-transform: rotateY(90deg) scale(.9); }
+}
+@-webkit-keyframes flipintoleft {
+    from { -webkit-transform: rotateY(-90deg) scale(.9); }
+    to { -webkit-transform: rotateY(0); }
+}
+@-moz-keyframes flipintoleft {
+    from { -moz-transform: rotateY(-90deg) scale(.9); }
+    to { -moz-transform: rotateY(0); }
+}
+@-webkit-keyframes flipintoright {
+    from { -webkit-transform: rotateY(90deg) scale(.9); }
+    to { -webkit-transform: rotateY(0); }
+}
+@-moz-keyframes flipintoright {
+    from { -moz-transform: rotateY(90deg) scale(.9); }
+    to { -moz-transform: rotateY(0); }
+}
+
+
+/* flow transition */
+
+.flow {
+	-webkit-transform-origin: 50% 30%;
+	-moz-transform-origin: 50% 30%;
+	-webkit-box-shadow: 0 0 20px rgba(0,0,0,.4);
+	-moz-box-shadow: 0 0 20px rgba(0,0,0,.4);
+}
+.ui-dialog.flow {
+	-webkit-transform-origin: none;
+	-moz-transform-origin: none;
+	-webkit-box-shadow: none;
+	-moz-box-shadow: none;
+}
+.flow.out {
+	-webkit-transform: translate3d(-100%, 0, 0) scale(.7);
+	-webkit-animation-name: flowouttoleft;
+	-webkit-animation-timing-function: ease;
+	-webkit-animation-duration: 350ms;
+	-moz-transform: translate3d(-100%, 0, 0) scale(.7);
+	-moz-animation-name: flowouttoleft;
+	-moz-animation-timing-function: ease;
+	-moz-animation-duration: 350ms;
+}
+
+.flow.in {
+	-webkit-transform: translate3d(0, 0, 0) scale(1);
+	-webkit-animation-name: flowinfromright;
+	-webkit-animation-timing-function: ease;
+	-webkit-animation-duration: 350ms;
+	-moz-transform: translate3d(0, 0, 0) scale(1);
+	-moz-animation-name: flowinfromright;
+	-moz-animation-timing-function: ease;
+	-moz-animation-duration: 350ms;
+}
+
+.flow.out.reverse {
+	-webkit-transform: translate3d(100%, 0, 0);
+	-webkit-animation-name: flowouttoright;
+	-moz-transform: translate3d(100%, 0, 0);
+	-moz-animation-name: flowouttoright;
+}
+
+.flow.in.reverse {
+	-webkit-animation-name: flowinfromleft;
+	-moz-animation-name: flowinfromleft;
+}
+
+@-webkit-keyframes flowouttoleft {
+    0% { -webkit-transform: translate3d(0, 0, 0) scale(1); }
+	60%, 70% { -webkit-transform: translate3d(0, 0, 0) scale(.7); }
+    100% { -webkit-transform: translate3d(-100%, 0, 0) scale(.7); }
+}
+@-moz-keyframes flowouttoleft {
+    0% { -moz-transform: translate3d(0, 0, 0) scale(1); }
+	60%, 70% { -moz-transform: translate3d(0, 0, 0) scale(.7); }
+    100% { -moz-transform:  translateX(-100%) scale(.7); }
+}
+
+@-webkit-keyframes flowouttoright {
+    0% { -webkit-transform: translate3d(0, 0, 0) scale(1); }
+	60%, 70% { -webkit-transform: translate3d(0, 0, 0) scale(.7); }
+    100% { -webkit-transform:  translate3d(100%, 0, 0) scale(.7); }
+}
+@-moz-keyframes flowouttoright {
+    0% { -moz-transform: translate3d(0, 0, 0) scale(1); }
+	60%, 70% { -moz-transform: translate3d(0, 0, 0) scale(.7); }
+    100% { -moz-transform:  translate3d(100%, 0, 0) scale(.7); }
+}
+
+@-webkit-keyframes flowinfromleft {
+    0% { -webkit-transform: translate3d(-100%, 0, 0) scale(.7); }
+	30%, 40% { -webkit-transform: translate3d(0, 0, 0) scale(.7); }
+    100% { -webkit-transform: translate3d(0, 0, 0) scale(1); }
+}
+@-moz-keyframes flowinfromleft {
+    0% { -moz-transform: translate3d(-100%, 0, 0) scale(.7); }
+	30%, 40% { -moz-transform: translate3d(0, 0, 0) scale(.7); }
+    100% { -moz-transform: translate3d(0, 0, 0) scale(1); }
+}
+@-webkit-keyframes flowinfromright {
+    0% { -webkit-transform: translate3d(100%, 0, 0) scale(.7); }
+	30%, 40% { -webkit-transform: translate3d(0, 0, 0) scale(.7); }
+    100% { -webkit-transform: translate3d(0, 0, 0) scale(1); }
+}
+@-moz-keyframes flowinfromright {
+    0% { -moz-transform: translate3d(100%, 0, 0) scale(.7); }
+	30%, 40% { -moz-transform: translate3d(0, 0, 0) scale(.7); }
+    100% { -moz-transform: translate3d(0, 0, 0) scale(1); }
+}
+
+
+/* pop */
+
+.pop {
+	-webkit-transform-origin: 50% 50%;
+	-moz-transform-origin: 50% 50%;
+}
+
+.pop.in {
+	-webkit-transform: scale(1);
+	-moz-transform: scale(1);
+    opacity: 1;
+	-webkit-animation-name: popin;
+	-moz-animation-name: popin;
+	-webkit-animation-duration: 350ms;
+	-moz-animation-duration: 350ms;
+}
+
+.pop.out {
+	-webkit-animation-name: fadeout;
+	-moz-animation-name: fadeout;
+	opacity: 0;
+	-webkit-animation-duration: 100ms;
+	-moz-animation-duration: 100ms;
+}
+
+.pop.in.reverse {
+	-webkit-animation-name: fadein;
+	-moz-animation-name: fadein;
+}
+
+.pop.out.reverse {
+	-webkit-transform: scale(.8);
+	-moz-transform: scale(.8);
+	-webkit-animation-name: popout;
+	-moz-animation-name: popout;
+}
+
+@-webkit-keyframes popin {
+    from {
+        -webkit-transform: scale(.8);
+        opacity: 0;
+    }
+    to {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+}
+
+@-moz-keyframes popin {
+    from {
+        -moz-transform: scale(.8);
+        opacity: 0;
+    }
+    to {
+        -moz-transform: scale(1);
+        opacity: 1;
+    }
+}
+
+@-webkit-keyframes popout {
+    from {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+    to {
+        -webkit-transform: scale(.8);
+        opacity: 0;
+    }
+}
+
+@-moz-keyframes popout {
+    from {
+        -moz-transform: scale(1);
+        opacity: 1;
+    }
+    to {
+        -moz-transform: scale(.8);
+        opacity: 0;
+    }
+}
+
+
+/* slide */
+
+/* keyframes for slidein from sides */
+@-webkit-keyframes slideinfromright {
+    from { -webkit-transform: translate3d(100%, 0, 0); }
+    to { -webkit-transform: translate3d(0, 0, 0); }
+}
+@-moz-keyframes slideinfromright {
+    from { -moz-transform: translate3d(100%, 0, 0); }
+    to { -moz-transform: translate3d(0, 0, 0); }
+}
+
+@-webkit-keyframes slideinfromleft {
+    from { -webkit-transform: translate3d(-100%, 0, 0); }
+    to { -webkit-transform: translate3d(0, 0, 0); }
+}
+@-moz-keyframes slideinfromleft {
+    from { -moz-transform: translate3d(-100%, 0, 0); }
+    to { -moz-transform: translate3d(0, 0, 0); }
+}
+
+/* keyframes for slideout to sides */
+@-webkit-keyframes slideouttoleft {
+    from { -webkit-transform: translate3d(0, 0, 0); }
+    to { -webkit-transform: translate3d(-100%, 0, 0); }
+}
+@-moz-keyframes slideouttoleft {
+    from { -moz-transform: translate3d(0, 0, 0); }
+    to { -moz-transform: translate3d(-100%, 0, 0); }
+}
+
+@-webkit-keyframes slideouttoright {
+    from { -webkit-transform: translate3d(0, 0, 0); }
+    to { -webkit-transform: translate3d(100%, 0, 0); }
+}
+@-moz-keyframes slideouttoright {
+    from { -moz-transform: translate3d(0, 0, 0); }
+    to { -moz-transform: translate3d(100%, 0, 0); }
+}
+
+.slide.out, .slide.in {
+	-webkit-animation-timing-function: ease-out;
+	-webkit-animation-duration: 350ms;
+	-moz-animation-timing-function: ease-out;
+	-moz-animation-duration: 350ms;
+}
+.slide.out {
+	-webkit-transform: translate3d(-100%, 0, 0);
+	-webkit-animation-name: slideouttoleft;
+	-moz-transform: translate3d(-100%, 0, 0);
+	-moz-animation-name: slideouttoleft;
+}
+
+.slide.in {
+	-webkit-transform: translate3d(0, 0, 0);
+	-webkit-animation-name: slideinfromright;
+	-moz-transform: translate3d(0, 0, 0);
+	-moz-animation-name: slideinfromright;
+}
+
+.slide.out.reverse {
+	-webkit-transform: translate3d(100%, 0, 0);
+	-webkit-animation-name: slideouttoright;
+	-moz-transform: translate3d(100%, 0, 0);
+	-moz-animation-name: slideouttoright;
+}
+
+.slide.in.reverse {
+	-webkit-transform: translate3d(0, 0, 0);
+	-webkit-animation-name: slideinfromleft;
+	-moz-transform: translate3d(0, 0, 0);
+	-moz-animation-name: slideinfromleft;
+}
+
+/* slide down */
+
+.slidedown.out {
+	-webkit-animation-name: fadeout;
+	-moz-animation-name: fadeout;
+	-webkit-animation-duration: 100ms;
+	-moz-animation-duration: 100ms;
+}
+
+.slidedown.in {
+	-webkit-transform: translate3d(0, 0, 0);
+	-webkit-animation-name: slideinfromtop;
+	-moz-transform: translate3d(0, 0, 0);
+	-moz-animation-name: slideinfromtop;
+	-webkit-animation-duration: 250ms;
+	-moz-animation-duration: 250ms;
+}
+
+.slidedown.in.reverse {
+	-webkit-animation-name: fadein;
+	-moz-animation-name: fadein;
+	-webkit-animation-duration: 150ms;
+	-moz-animation-duration: 150ms;
+}
+
+.slidedown.out.reverse {
+	-webkit-transform: translate3d(0, -100%, 0);
+	-moz-transform: translate3d(0, -100%, 0);
+	-webkit-animation-name: slideouttotop;
+	-moz-animation-name: slideouttotop;
+	-webkit-animation-duration: 200ms;
+	-moz-animation-duration: 200ms;
+}
+
+@-webkit-keyframes slideinfromtop {
+    from { -webkit-transform: translate3d(0, -100%, 0); }
+    to { -webkit-transform: translate3d(0, 0, 0); }
+}
+@-moz-keyframes slideinfromtop {
+    from { -moz-transform: translate3d(0, -100%, 0); }
+    to { -moz-transform: translate3d(0, 0, 0); }
+}
+
+@-webkit-keyframes slideouttotop {
+    from { -webkit-transform: translate3d(0, 0, 0); }
+    to { -webkit-transform: translate3d(0, -100%, 0); }
+}
+@-moz-keyframes slideouttotop {
+    from { -moz-transform: translate3d(0, 0, 0); }
+    to { -moz-transform: translate3d(0, -100%, 0); }
+}
+
+/* slide up */
+
+.slideup.out {
+	-webkit-animation-name: fadeout;
+	-moz-animation-name: fadeout;
+	-webkit-animation-duration: 100ms;
+	-moz-animation-duration: 100ms;
+}
+
+.slideup.in {
+	-webkit-transform: translate3d(0, 0, 0);
+	-webkit-animation-name: slideinfrombottom;
+	-moz-transform: translate3d(0, 0, 0);
+	-moz-animation-name: slideinfrombottom;
+	-webkit-animation-duration: 250ms;
+	-moz-animation-duration: 250ms;
+}
+
+.slideup.in.reverse {
+	-webkit-animation-name: fadein;
+	-moz-animation-name: fadein;
+	-webkit-animation-duration: 150ms;
+	-moz-animation-duration: 150ms;
+}
+
+.slideup.out.reverse {
+	-webkit-transform: translate3d(0, 100%, 0);
+	-moz-transform: translate3d(0, 100%, 0);
+	-webkit-animation-name: slideouttobottom;
+	-moz-animation-name: slideouttobottom;
+	-webkit-animation-duration: 200ms;
+	-moz-animation-duration: 200ms;
+}
+
+@-webkit-keyframes slideinfrombottom {
+    from { -webkit-transform: translate3d(0, 100%, 0); }
+    to { -webkit-transform: translate3d(0, 0, 0); }
+}
+@-moz-keyframes slideinfrombottom {
+    from { -moz-transform: translate3d(0, 100%, 0); }
+    to { -moz-transform: translate3d(0, 0, 0); }
+}
+
+@-webkit-keyframes slideouttobottom {
+    from { -webkit-transform: translate3d(0, 0, 0); }
+    to { -webkit-transform: translate3d(0, 100%, 0); }
+}
+@-moz-keyframes slideouttobottom {
+    from { -moz-transform: translate3d(0, 0, 0); }
+    to { -moz-transform: translate3d(0, 100%, 0); }
+}
+
+/* slide up + fade */
+
+.slideupfade.out {
+	-webkit-animation-name: fadeout;
+	-moz-animation-name: fadeout;
+	-webkit-animation-duration: 100ms;
+	-moz-animation-duration: 100ms;
+}
+
+.slideupfade.in {
+	-webkit-transform: translate3d(0, 0, 0);
+	-webkit-animation-name: slideupfadeinfrombottom;
+	-moz-transform: translate3d(0, 0, 0);
+	-moz-animation-name: slideupfadeinfrombottom;
+	-webkit-animation-duration: 250ms;
+	-moz-animation-duration: 250ms;
+}
+
+.slideupfade.in.reverse {
+	-webkit-animation-name: fadein;
+	-moz-animation-name: fadein;
+	-webkit-animation-duration: 150ms;
+	-moz-animation-duration: 150ms;
+}
+
+.slideupfade.out.reverse {
+	-webkit-transform: translate3d(0, 5%, 0);
+	-moz-transform: translate3d(0, 5%, 0);
+	-webkit-animation-name: slideupfadeouttobottom;
+	-moz-animation-name: slideupfadeouttobottom;
+	-webkit-animation-duration: 200ms;
+	-moz-animation-duration: 200ms;
+}
+
+@-webkit-keyframes slideupfadeinfrombottom {
+    from {
+		opacity: 0;
+		-webkit-transform: translate3d(0, 5%, 0);
+	}
+    to {
+		opacity: 1;
+		-webkit-transform: translate3d(0, 0, 0);
+	}
+}
+@-moz-keyframes slideupfadeinfrombottom {
+    from {
+		opacity: 0;
+		-moz-transform: translate3d(0, 5%, 0);
+	}
+    to {
+		opacity: 1;
+		-moz-transform: translate3d(0, 0, 0);
+	}
+}
+
+@-webkit-keyframes slideupfadeouttobottom {
+    from {
+		opacity: 1;
+		-webkit-transform: translate3d(0, 0, 0);
+	}
+    to {
+		opacity: 0;
+		-webkit-transform: translate3d(0, 5%, 0);
+	}
+}
+@-moz-keyframes slideupfadeouttobottom {
+    from {
+		opacity: 1;
+		-moz-transform: translate3d(0, 0, 0);
+	}
+    to {
+		opacity: 0;
+		-moz-transform: translate3d(0, 5%, 0);
+	}
+}
+
+/* slide down + fade */
+
+.slidedownfade.out {
+	-webkit-animation-name: fadeout;
+	-moz-animation-name: fadeout;
+	-webkit-animation-duration: 100ms;
+	-moz-animation-duration: 100ms;
+}
+
+.slidedownfade.in {
+	-webkit-transform: translate3d(0, 0, 0);
+	-webkit-animation-name: slidedownfadeinfromtop;
+	-moz-transform: translate3d(0, 0, 0);
+	-moz-animation-name: slidedownfadeinfromtop;
+	-webkit-animation-duration: 250ms;
+	-moz-animation-duration: 250ms;
+}
+
+.slidedownfade.in.reverse {
+	-webkit-animation-name: fadein;
+	-moz-animation-name: fadein;
+	-webkit-animation-duration: 150ms;
+	-moz-animation-duration: 150ms;
+}
+
+.slidedownfade.out.reverse {
+	-webkit-transform: translate3d(0, -5%, 0);
+	-moz-transform: translate3d(0, -5%, 0);
+	-webkit-animation-name: slidedownfadeouttotop;
+	-moz-animation-name: slidedownfadeouttotop;
+	-webkit-animation-duration: 200ms;
+	-moz-animation-duration: 200ms;
+}
+
+@-webkit-keyframes slidedownfadeinfromtop {
+    from {
+		opacity: 0;
+		-webkit-transform: translate3d(0, -5%, 0);
+	}
+    to {
+		opacity: 1;
+		-webkit-transform: translate3d(0, 0, 0);
+	}
+}
+@-moz-keyframes slidedownfadeinfromtop {
+    from {
+		opacity: 0;
+		-moz-transform: translate3d(0, -5%, 0);
+	}
+    to {
+		opacity: 1;
+		-moz-transform: translate3d(0, 0, 0);
+	}
+}
+
+@-webkit-keyframes slidedownfadeouttotop {
+    from {
+		opacity: 1;
+		-webkit-transform: translate3d(0, 0, 0);
+	}
+    to {
+		opacity: 0;
+		-webkit-transform: translate3d(0, -5%, 0);
+	}
+}
+@-moz-keyframes slidedownfadeouttotop {
+    from {
+		opacity: 1;
+		-moz-transform: translate3d(0, 0, 0);
+	}
+    to {
+		opacity: 0;
+		-moz-transform: translate3d(0, -5%, 0);
+	}
+}
+
+/* slide fade */
+
+.slidefade.out {
+	-webkit-transform: translate3d(-100%, 0, 0);
+	-webkit-animation-name: slideouttoleft;
+	-moz-transform: translate3d(-100%, 0, 0);
+	-moz-animation-name: slideouttoleft;
+	-webkit-animation-duration: 225ms;
+	-moz-animation-duration: 225ms;
+}
+
+.slidefade.in {
+	-webkit-transform: translate3d(0, 0, 0);
+	-webkit-animation-name: fadein;
+	-moz-transform: translate3d(0, 0, 0);
+	-moz-animation-name: fadein;
+	-webkit-animation-duration: 200ms;
+	-moz-animation-duration: 200ms;
+}
+
+.slidefade.out.reverse {
+	-webkit-transform: translate3d(100%, 0, 0);
+	-webkit-animation-name: slideouttoright;
+	-moz-transform: translate3d(100%, 0, 0);
+	-moz-animation-name: slideouttoright;
+	-webkit-animation-duration: 200ms;
+	-moz-animation-duration: 200ms;
+}
+
+.slidefade.in.reverse {
+	-webkit-transform: translate3d(0, 0, 0);
+	-webkit-animation-name: fadein;
+	-moz-transform: translate3d(0, 0, 0);
+	-moz-animation-name: fadein;
+	-webkit-animation-duration: 200ms;
+	-moz-animation-duration: 200ms;
+}
+
+/* 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-turn {
+	-webkit-perspective: 1000;
+	-moz-perspective: 1000;
+	position: absolute;
+}
+.turn {
+	-webkit-backface-visibility:hidden;
+	-webkit-transform:translate3d(0, 0, 0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */
+	-webkit-transform-origin: 0;
+	-moz-backface-visibility:hidden;
+	-moz-transform:translate3d(0, 0, 0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */
+	-moz-transform-origin: 0;
+}
+
+.turn.out {
+	-webkit-transform: rotateY(-90deg) scale(.9);
+	-webkit-animation-name: flipouttoleft;
+	-moz-transform: rotateY(-90deg) scale(.9);
+	-moz-animation-name: flipouttoleft;
+	-webkit-animation-duration: 125ms;
+	-moz-animation-duration: 125ms;
+}
+
+.turn.in {
+	-webkit-animation-name: flipintoright;
+	-moz-animation-name: flipintoright;
+	-webkit-animation-duration: 250ms;
+	-moz-animation-duration: 250ms;
+}
+
+.turn.out.reverse {
+	-webkit-transform: rotateY(90deg) scale(.9);
+	-webkit-animation-name: flipouttoright;
+	-moz-transform: rotateY(90deg) scale(.9);
+	-moz-animation-name: flipouttoright;
+}
+
+.turn.in.reverse {
+	-webkit-animation-name: flipintoleft;
+	-moz-animation-name: flipintoleft;
+}
+
+@-webkit-keyframes flipouttoleft {
+    from { -webkit-transform: rotateY(0); }
+    to { -webkit-transform: rotateY(-90deg) scale(.9); }
+}
+@-moz-keyframes flipouttoleft {
+    from { -moz-transform: rotateY(0); }
+    to { -moz-transform: rotateY(-90deg) scale(.9); }
+}
+@-webkit-keyframes flipouttoright {
+    from { -webkit-transform: rotateY(0) ; }
+    to { -webkit-transform: rotateY(90deg) scale(.9); }
+}
+@-moz-keyframes flipouttoright {
+    from { -moz-transform: rotateY(0); }
+    to { -moz-transform: rotateY(90deg) scale(.9); }
+}
+@-webkit-keyframes flipintoleft {
+    from { -webkit-transform: rotateY(-90deg) scale(.9); }
+    to { -webkit-transform: rotateY(0); }
+}
+@-moz-keyframes flipintoleft {
+    from { -moz-transform: rotateY(-90deg) scale(.9); }
+    to { -moz-transform: rotateY(0); }
+}
+@-webkit-keyframes flipintoright {
+    from { -webkit-transform: rotateY(90deg) scale(.9); }
+    to { -webkit-transform: rotateY(0); }
+}
+@-moz-keyframes flipintoright {
+    from { -moz-transform: rotateY(90deg) scale(.9); }
+    to { -moz-transform: rotateY(0); }
+}
+
+
+/* depth */
+
+.depth {
+	-webkit-transform-origin: 50% 50%;
+	-moz-transform-origin: 50% 50%;
+}
+
+.depth.out {
+	-webkit-animation-name: depthout;
+	-moz-animation-name: depthout;
+	opacity: 0;
+	-webkit-animation-duration: 250ms;
+	-moz-animation-duration: 250ms;
+	-webkit-animation-timing-function: ease;
+	-moz-animation-timing-function: ease;
+}
+
+.depth.in {
+	-webkit-transform: scale(1);
+	-moz-transform: scale(1);
+	opacity: 1;
+	-webkit-animation-name: depthin;
+	-moz-animation-name: depthin;
+	-webkit-animation-duration: 350ms;
+	-moz-animation-duration: 350ms;
+	-webkit-animation-timing-function: ease;
+	-moz-animation-timing-function: ease;
+}
+
+.depth.in.reverse {
+	-webkit-animation-name: depthinreverse;
+	-moz-animation-name: depthinreverse;
+}
+
+.depth.out.reverse {
+	-webkit-transform: scale(.9);
+	-moz-transform: scale(.9);
+	-webkit-animation-name: depthoutreverse;
+	-moz-animation-name: depthoutreverse;
+}
+
+@-webkit-keyframes depthout {
+    from {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+    to {
+        -webkit-transform: scale(1.1);
+        opacity: 0;
+    }
+}
+
+@-moz-keyframes depthout {
+    from {
+        -moz-transform: scale(1);
+        opacity: 1;
+    }
+    to {
+        -moz-transform: scale(1.1);
+        opacity: 0;
+    }
+}
+
+@-webkit-keyframes depthin {
+    0% {
+        -webkit-transform: scale(.9);
+        opacity: 0;
+    }
+    30% {
+        -webkit-transform: scale(.9);
+        opacity: 0;
+    }
+    100% {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+}
+
+@-moz-keyframes depthin {
+    0% {
+        -moz-transform: scale(.9);
+        opacity: 0;
+    }
+    30% {
+        -moz-transform: scale(.9);
+        opacity: 0;
+    }
+    100% {
+        -moz-transform: scale(1);
+        opacity: 1;
+    }
+}
+
+@-webkit-keyframes depthinreverse {
+    0% {
+        -webkit-transform: scale(1.1);
+        opacity: 0;
+    }
+    30% {
+        -webkit-transform: scale(1.1);
+        opacity: 0;
+    }
+    100% {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+}
+
+@-moz-keyframes depthinreverse {
+    0% {
+        -moz-transform: scale(1.1);
+        opacity: 0;
+    }
+    30% {
+        -moz-transform: scale(1.1);
+        opacity: 0;
+    }
+    100% {
+        -moz-transform: scale(1);
+        opacity: 1;
+    }
+}
+
+@-webkit-keyframes depthoutreverse {
+    from {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+    to {
+        -webkit-transform: scale(.9);
+        opacity: 0;
+    }
+}
+
+@-moz-keyframes depthoutreverse {
+    from {
+        -moz-transform: scale(1);
+        opacity: 1;
+    }
+    to {
+        -moz-transform: scale(.9);
+        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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/* Button colors are defined in config.less
+
+/* Edit button size */
+.ui-btn {
+  display: block;
+  text-align: center;
+  cursor: pointer;
+  position: relative;
+  vertical-align: middle;
+}
+/* wongi_1018 : For button align. */
+.ui-footer .ui-btn.ui-btn-box-s,
+.ui-ticker-btn .ui-btn.ui-btn-box-s {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+.ui-btn.ui-btn-box-s {
+  margin-top: 0.2727272727272727rem;
+  margin-bottom: 0.2727272727272727rem;
+  color: #3a3a3a;
+  text-shadow: 0px 1px #ffffff;
+  -o-border-radius: 0.2rem;
+  -ms-border-radius: 0.2rem;
+  -moz-border-radius: 0.2rem;
+  -webkit-border-radius: 0.2rem;
+  border-radius: 0.2rem;
+}
+.ui-btn:focus,
+.ui-btn:active {
+  outline: none;
+}
+.ui-header .ui-btn,
+.ui-bar .ui-btn {
+  display: inline-block;
+  font-size: 0.5909090909090909rem;
+  margin: 0;
+}
+.ui-btn-inline {
+  display: inline-block;
+}
+.ui-btn-inner {
+  padding: 0.2272727272727273rem;
+  display: block;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  position: relative;
+  zoom: 1;
+}
+.ui-btn-icon-notext {
+  width: 1.6363636363636365rem;
+  height: 1.6363636363636365rem;
+}
+.ui-btn-icon-notext .ui-btn-inner {
+  padding: 0.09090909090909091rem 0.045454545454545456rem 0.09090909090909091rem 0.13636363636363635rem;
+}
+.ui-btn-icon-notext .ui-btn-inner .ui-icon {
+  margin-left: -0.7272727272727273rem;
+  margin-top: -0.7272727272727273rem;
+}
+.ui-btn-icon-notext .ui-btn-text {
+  position: absolute;
+  left: -45.409090909090914rem;
+}
+.ui-btn-icon-left .ui-btn-inner {
+  padding-left: 1.5rem;
+}
+.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: 1.2272727272727273rem;
+}
+.ui-btn-icon-right .ui-btn-inner {
+  padding-right: 1.5rem;
+}
+.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: 1.2272727272727273rem;
+}
+.ui-btn-icon-top .ui-btn-inner {
+  padding-top: 1.2272727272727273rem;
+}
+.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: 1.2272727272727273rem;
+}
+.ui-btn-icon-bottom .ui-btn-inner {
+  padding-bottom: 1.5rem;
+}
+.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: 1.2272727272727273rem;
+}
+/*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: 0.2272727272727273rem;
+}
+.ui-btn-icon-circle .ui-icon {
+  left: 0rem;
+}
+/* wongi_1018 : for circle icon center positioning. */
+.ui-btn-icon-right .ui-icon {
+  right: 0.4545454545454546rem;
+}
+.ui-btn-icon-top .ui-icon {
+  top: 0rem;
+  margin-top: 0;
+}
+.ui-btn-icon-bottom .ui-icon {
+  bottom: 0rem;
+}
+.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.18181818181818182rem;
+}
+.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.18181818181818182rem;
+}
+.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.18181818181818182rem;
+}
+/*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.045454545454545456rem;
+  border: none;
+  line-height: 45.409090909090914rem;
+}
+.ui-btn-text {
+  /*padding-left : 80px;*/
+  margin-left: auto;
+  margin-right: auto;
+  padding: 0 1px;
+  /* Webkit width(ellipsis) problem workaround */
+
+}
+.ui-btn .ui-btn-inner.ui-btn-hastxt span.ui-btn-text {
+  font-size: 0.8181818181818182rem;
+}
+.ui-li .ui-btn.ui-btn-icon_only {
+  top: 50%;
+  margin-top: -0.7272727272727273rem;
+}
+.ui-li .ui-btn .ui-btn-inner.ui-btn-hastxt {
+  padding: 0.2em 0.5em;
+}
+.ui-btn-icon-nobg.ui-btn-down-s .ui-btn-inner {
+  background: transparent ! important;
+}
+.ui-btn-box-s.ui-btn-up-s {
+  background: #f7f5ed;
+  background: -webkit-linear-gradient(top, #f7f5ed, #eceae2);
+  background: -moz-linear-gradient(top, #f7f5ed, #eceae2);
+  background: -o-linear-gradient(top, #f7f5ed, #eceae2);
+  background: -ms-linear-gradient(top, #f7f5ed, #eceae2);
+  border: 1px #85837e solid;
+  box-shadow: 0.5px 1px 1px #85837e;
+}
+.ui-btn-box-s.ui-btn-up-s[data-icon="alert"],
+.ui-btn-box-s.ui-btn-up-s[data-icon="minus"] {
+  background: #c12c21;
+  box-shadow: inset 0px 1px 1px #ffffff;
+}
+.ui-btn-box-s.ui-btn-hover-s {
+  background: #f7f5ed;
+  background: -webkit-linear-gradient(top, #f7f5ed, #eceae2);
+  background: -moz-linear-gradient(top, #f7f5ed, #eceae2);
+  background: -o-linear-gradient(top, #f7f5ed, #eceae2);
+  background: -ms-linear-gradient(top, #f7f5ed, #eceae2);
+  border: 1px #85837e solid;
+  box-shadow: 0.5px 1px 1px #85837e;
+}
+.ui-btn-box-s.ui-btn-hover-s[data-icon="alert"],
+.ui-btn-box-s.ui-btn-hover-s[data-icon="minus"] {
+  background: #c12c21;
+  box-shadow: inset 0px 1px 1px #ffffff;
+}
+.ui-btn-box-s.ui-btn-down-s {
+  background: #007ad8;
+  box-shadow: 0.5px 1px 1px #85837e;
+  text-shadow: none;
+}
+.ui-btn-box-s.ui-btn-down-s[data-icon="alert"],
+.ui-btn-box-s.ui-btn-down-s[data-icon="minus"] {
+  background: #c12c21;
+  box-shadow: inset 0px 1px 1px #ffffff;
+  text-shadow: none;
+}
+.ui-btn-corner-all {
+  -o-border-radius: 0.3rem;
+  -ms-border-radius: 0.3rem;
+  -moz-border-radius: 0.3rem;
+  -webkit-border-radius: 0.3rem;
+  border-radius: 0.3rem;
+}
+.ui-header .ui-btn-box-s:not(.ui-input-cancel):not(.ui-btn-search-front-icon),
+.ui-header .ui-btn-box-s:not(.ui-input-cancel):not(.ui-btn-search-front-icon) .ui-btn-inner,
+.ui-header .ui-btn.ui-btn-box-s.ui-btn-down-s:not(.ui-input-cancel):not(.ui-btn-search-front-icon) .ui-btn-inner,
+.ui-btn.ui-btn-back.ui-btn-up-s .ui-btn-inner,
+.ui-btn.ui-btn-back.ui-btn-hover-s .ui-btn-inner,
+.ui-btn.ui-btn-back.ui-btn-down-s .ui-btn-inner,
+.ui-btn.ui-btn-footer-down.ui-btn-up-s > .ui-btn-inner,
+.ui-btn.ui-btn-footer-down.ui-btn-hover-s > .ui-btn-inner,
+.ui-btn.ui-btn-footer-down.ui-btn-down-s > .ui-btn-inner {
+  background: transparent;
+  border: none;
+  box-shadow: none;
+}
+.ui-header .naviframe-button.ui-btn.ui-btn-box-s.ui-btn-down-s {
+  background: rgba(14, 102, 170, 0.1);
+}
+.ui-btn-icon-top .ui-btn-inner.ui-btn-hastxt,
+.ui-li .ui-btn-icon-top .ui-btn-inner.ui-btn-hastxt {
+  padding-top: 2.3636363636363638rem;
+}
+.ui-btn-icon-bottom .ui-btn-inner.ui-btn-hastxt,
+.ui-li .ui-btn-icon-bottom .ui-btn-inner.ui-btn-hastxt {
+  padding-bottom: 2.3636363636363638rem;
+}
+/* wongi_1017 : Icons */
+/* icons sizing */
+.ui-btn .ui-icon {
+  width: 1rem;
+  height: 1rem;
+}
+.ui-btn.ui-btn-edit .ui-icon {
+  width: 3.3636363636363638rem;
+  height: 3.3636363636363638rem;
+}
+/* Padding for Icon with text */
+.ui-btn .ui-btn-text.ui-btn-text-padding-left {
+  padding-left: 0.9090909090909092rem;
+}
+.ui-btn .ui-btn-text.ui-btn-text-padding-right {
+  padding-right: 1.4545454545454546rem;
+}
+.ui-btn .ui-btn-text.ui-btn-text-padding-top {
+  padding-top: 1.4545454545454546rem;
+}
+.ui-icon {
+  background-repeat: no-repeat;
+  vertical-align: middle;
+  background-position: 0% 0%;
+  background-size: 100%;
+}
+.ui-btn-box.s .ui-icon {
+  position: absolute;
+}
+.ui-btn-box-s.ui-btn-icon-left .ui-icon,
+.ui-btn-box-s.ui-btn-icon-right .ui-icon {
+  margin-top: -0.4545454545454546rem;
+  top: 50%;
+}
+.ui-btn-box-s.ui-btn-icon-top .ui-icon,
+.ui-btn-box-s.ui-btn-icon-bottom .ui-icon {
+  margin-left: -0.4545454545454546rem;
+  left: 50%;
+}
+.tizen-icon-common {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+}
+.tizen-smallicon-common {
+  width: 0.9090909090909092rem ! important;
+  height: 0.9090909090909092rem ! important;
+  top: 50% ! important;
+  left: 50% ! important;
+  margin-top: -0.4545454545454546rem ! important;
+  margin-left: -0.4545454545454546rem ! important;
+}
+.ui-icon-bg {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/00_btn_circle_bg_normal.png);
+  z-index: 0;
+}
+.ui-icon-arrow-l {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_left.png);
+}
+.ui-icon-arrow-r {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_right.png);
+}
+.ui-icon-arrow-u {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_opened.png);
+}
+.ui-icon-arrow-d {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_closed.png);
+}
+.ui-icon-delete {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_cancel.png);
+}
+.ui-icon-plus {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_plus.png);
+}
+.ui-icon-minus {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_minus.png);
+}
+.ui-icon-check {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_check.png);
+}
+.ui-icon-gear {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_gear.png);
+}
+.ui-icon-refresh {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_refresh.png);
+}
+.ui-icon-forward {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_send.png);
+}
+.ui-icon-back {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_back.png);
+}
+.ui-icon-grid {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_grid.png);
+}
+.ui-icon-star {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_star.png);
+}
+.ui-icon-alert {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_warning.png);
+}
+.ui-icon-info {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_info.png);
+}
+.ui-icon-home {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_home.png);
+}
+.ui-icon-search {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_search.png);
+}
+.ui-icon-call {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_call.png);
+}
+.ui-icon-rename {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_rename.png);
+}
+.ui-icon-scrolltop {
+  width: 0.9090909090909092rem ! important;
+  height: 0.9090909090909092rem ! important;
+  top: 50% ! important;
+  left: 50% ! important;
+  margin-top: -0.4545454545454546rem ! important;
+  margin-left: -0.4545454545454546rem ! important;
+  background-image: url(images/controls/button/00_icon_jump.png);
+}
+.ui-icon-scrollleft {
+  width: 0.9090909090909092rem ! important;
+  height: 0.9090909090909092rem ! important;
+  top: 50% ! important;
+  left: 50% ! important;
+  margin-top: -0.4545454545454546rem ! important;
+  margin-left: -0.4545454545454546rem ! important;
+  background-image: url(images/controls/button/00_icon_jump_left.png);
+}
+.ui-icon-expandable-divider-opened {
+  width: 1.9090909090909092rem;
+  height: 1.9090909090909092rem;
+  position: absolute;
+  right: 1.2727272727272727rem;
+  top: 0rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-image: url(images/00_indexlist_icon_opened.png);
+}
+.ui-icon-expandable-divider-closed {
+  width: 1.9090909090909092rem;
+  height: 1.9090909090909092rem;
+  position: absolute;
+  right: 1.2727272727272727rem;
+  top: 0rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-image: url(images/00_indexlist_icon_closed.png);
+}
+/* Pressed images */
+.ui-btn-down-s .ui-icon-bg,
+.ui-btn-down-s.ui-tizen-icon-bg {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/00_btn_circle_bg_press.png);
+  z-index: 0;
+}
+.ui-btn-down-s .ui-icon-arrow-l {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_left_press.png);
+}
+.ui-btn-down-s .ui-icon-arrow-r {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_right_press.png);
+}
+.ui-btn-down-s .ui-icon-arrow-u {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_opened_press.png);
+}
+.ui-btn-down-s .ui-icon-arrow-d {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_closed_press.png);
+}
+.ui-btn-down-s .ui-icon-delete {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_cancel_press.png);
+}
+.ui-btn-down-s .ui-icon-plus {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_plus_press.png);
+}
+.ui-btn-down-s .ui-icon-minus {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_minus_press.png);
+}
+.ui-btn-down-s .ui-icon-check {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_check_press.png);
+}
+.ui-btn-down-s .ui-icon-gear {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_gear_press.png);
+}
+.ui-btn-down-s .ui-icon-refresh {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_refresh_press.png);
+}
+.ui-btn-down-s .ui-icon-forward {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_expand_send_press.png);
+}
+.ui-btn-down-s .ui-icon-back {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_back_press.png);
+}
+.ui-btn-down-s .ui-icon-grid {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_grid_press.png);
+}
+.ui-btn-down-s .ui-icon-star {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_star_press.png);
+}
+.ui-btn-down-s .ui-icon-alert {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_warning_press.png);
+}
+.ui-btn-down-s .ui-icon-info {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_info_press.png);
+}
+.ui-btn-down-s .ui-icon-home {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_home_press.png);
+}
+.ui-btn-down-s .ui-icon-search {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_search_press.png);
+}
+.ui-btn-down-s .ui-icon-call {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_call_press.png);
+}
+.ui-btn-down-s .ui-icon-rename {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_button_rename_press.png);
+}
+.ui-btn-down-s .ui-icon-scrolltop {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_icon_jump_press.png);
+}
+.ui-btn-down-s .ui-icon-scrollleft {
+  /* Overlap original property */
+
+  width: 1rem;
+  height: 1rem;
+  background-image: url(images/controls/button/00_icon_jump_left_press.png);
+}
+.ui-btn-inner.ui-btn-icon-only {
+  padding: 0.7272727272727273rem 0.7272727272727273rem;
+}
+.ui-btn-icon-only .ui-btn-text {
+  display: none;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+}
+/* No BG button : data-iconbg = "nobg" */
+.ui-btn.ui-btn-icon-nobg {
+  box-shadow: none;
+}
+.ui-btn-corner-circle {
+  -o-border-radius: 1em ! important;
+  -ms-border-radius: 1em ! important;
+  -moz-border-radius: 1em ! important;
+  -webkit-border-radius: 1em ! important;
+  border-radius: 1em ! important;
+}
+.ui-btn-round {
+  -o-border-radius: 1.2em ! important;
+  -ms-border-radius: 1.2em ! important;
+  -moz-border-radius: 1.2em ! important;
+  -webkit-border-radius: 1.2em ! important;
+  border-radius: 1.2em ! important;
+}
+.ui-btn-round .ui-btn-inner {
+  -o-border-radius: 1.2em ! important;
+  -ms-border-radius: 1.2em ! important;
+  -moz-border-radius: 1.2em ! important;
+  -webkit-border-radius: 1.2em ! important;
+  border-radius: 1.2em ! important;
+}
+.ui-btn.ui-btn-icon-nobg,
+.ui-btn .ui-btn-icon-nobg {
+  background: transparent;
+  background-color: transparent;
+  border: none;
+}
+/* Contact Edit Style */
+.ui-btn.ui-btn-edit .ui-btn-text {
+  color: #f9f9f9;
+}
+.ui-btn.ui-btn-edit .ui-btn-inner {
+  background: #c95858;
+  background: -webkit-gradient(linear, left top, left bottom, from(#c95858), to(#a12828));
+  background: -moz_linear-gradient(top, #c95858, #a12828);
+}
+/*
+ * jQuery Mobile Collapsible CSS
+ * for Tizen Web UI
+ */
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-collapsible-inset {
+  margin: .5em 0;
+}
+.ui-collapsible-inset .ui-collapsible-heading {
+  margin: 0;
+}
+.ui-collapsible-inset .ui-collapsible-heading .ui-btn {
+  border-right-width: 1px;
+  border-left-width: 1px;
+}
+.ui-collapsible-collapsed + .ui-collapsible:not(.ui-collapsible-inset) .ui-collapsible-heading .ui-btn {
+  border-top-width: 0;
+}
+.ui-collapsible-set .ui-collapsible:not(.ui-collapsible-inset) .ui-collapsible-heading .ui-btn {
+  border-top-width: 1px;
+}
+.ui-collapsible-heading,
+.ui-collapsible-content > li {
+  position: relative;
+}
+.ui-collapsible-heading {
+  font-size: 1rem;
+  display: block;
+  margin: 0 -15px;
+  padding: 0;
+  position: relative;
+}
+.ui-collapsible-heading .ui-btn {
+  text-align: left;
+  margin: 0;
+  border-left-width: 0;
+  border-right-width: 0;
+}
+.ui-collapsible-heading .ui-btn-text {
+  color: #000000;
+}
+.ui-collapsible-heading .ui-btn-inner,
+.ui-collapsible-heading .ui-btn-icon-left .ui-btn-inner {
+  padding-left: 40px;
+}
+.ui-collapsible-heading .ui-btn-icon-right .ui-btn-inner {
+  padding-left: 0px;
+  padding-right: 40px;
+}
+.ui-collapsible-heading .ui-btn-icon-top .ui-btn-inner,
+.ui-collapsible-heading .ui-btn-icon-bottom .ui-btn-inner {
+  padding-right: 40px;
+  text-align: center;
+}
+.ui-collapsible-heading .ui-btn-inner > .ui-icon-arrow-d {
+  -webkit-transition: all 0.33s ease;
+  -moz-transition: all 0.33s ease;
+  -ms-transition: all 0.33s ease;
+  -o-transition: all 0.33s ease;
+  transition: all 0.33s ease;
+  -webkit-transform: rotate(180deg);
+  -moz-transform: rotate(180deg);
+  -ms-transform: rotate(180deg);
+  -o-transform: rotate(180deg);
+  transform: rotate(180deg);
+}
+.ui-collapsible-heading .ui-btn-inner > .ui-icon-arrow-u {
+  background-image: url(images/controls/button/00_button_expand_closed.png);
+  -webkit-transition: all 0.33s ease;
+  -moz-transition: all 0.33s ease;
+  -ms-transition: all 0.33s ease;
+  -o-transition: all 0.33s ease;
+  transition: all 0.33s ease;
+  -webkit-transform: rotate(0deg);
+  -moz-transform: rotate(0deg);
+  -ms-transform: rotate(0deg);
+  -o-transform: rotate(0deg);
+  transform: rotate(0deg);
+}
+.ui-collapsible-heading .ui-btn 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 .ui-btn span.ui-btn .ui-btn-inner {
+  padding: 10px 0;
+}
+.ui-collapsible-heading .ui-btn span.ui-btn .ui-icon {
+  left: 0;
+  margin-top: -10px;
+}
+.ui-collapsible-heading-status {
+  position: absolute;
+  top: -9999px;
+  left: 0px;
+}
+.ui-collapsible-content {
+  display: block;
+  margin: 0 -15px;
+  padding: 0px 15px;
+  border-left-width: 0;
+  border-right-width: 0;
+  border-top: none;
+  background-image: none;
+  /* Overrides ui-body-* */
+
+  visibility: visible;
+  overflow: auto;
+  -webkit-transition: all 0.5s ease;
+  -moz-transition: all 0.5s ease;
+  -ms-transition: all 0.5s ease;
+  -o-transition: all 0.5s ease;
+  transition: all 0.5s ease;
+}
+.ui-collapsible-inset .ui-collapsible-content {
+  margin: 0;
+  border-right-width: 1px;
+  border-left-width: 1px;
+}
+.ui-collapsible-content-collapsed {
+  overflow: hidden;
+  max-height: 0px !important;
+  visibility: hidden;
+}
+.ui-collapsible-set {
+  margin: .5em 0;
+}
+.ui-collapsible-set .ui-collapsible {
+  margin: -1px 0 0;
+}
+.ui-collapsible-set .ui-collapsible:first-child {
+  margin-top: 0;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.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;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-checkbox .ui-btn-inner,
+.ui-radio .ui-btn-inner {
+  white-space: normal;
+}
+.ui-checkbox,
+.ui-radio {
+  position: relative;
+  margin: 0;
+}
+.ui-checkbox .ui-btn-corner-all,
+.ui-radio .ui-btn-corner-all {
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-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 {
+  z-index: 1;
+  margin: 0px;
+  left: 0.4545454545454546rem;
+  position: absolute;
+  outline: 0 !important;
+}
+.ui-checkbox > input,
+.ui-radio > input {
+  display: none;
+}
+.ui-checkbox .ui-btn,
+.ui-radio .ui-btn {
+  z-index: 2;
+  height: 100%;
+  margin: 0;
+  text-align: left;
+}
+.ui-checkbox .ui-btn.ui-btn-icon-left,
+.ui-radio .ui-btn.ui-btn-icon-left {
+  display: inline-block;
+}
+.ui-checkbox .ui-btn.ui-btn-icon-left .ui-btn-inner,
+.ui-radio .ui-btn.ui-btn-icon-left .ui-btn-inner {
+  min-width: 1.8181818181818183rem;
+  display: inline-block;
+  line-height: 1.4545454545454546rem;
+  padding: 0 0.7272727272727273rem 0 0.7272727272727273rem;
+  /* TODO : after button fixed, recheck! */
+
+}
+.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;
+  min-height: 1.4545454545454546rem;
+}
+.ui-checkbox .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text.ui-btn-text-padding-left,
+.ui-radio .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text.ui-btn-text-padding-left {
+  padding-left: 1.0909090909090908rem;
+}
+.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.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  margin-top: -0.7272727272727273rem;
+}
+.ui-checkbox.favorite input {
+  position: absolute;
+  left: -10000px;
+  height: 100%;
+  outline: 0 !important;
+}
+.ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner {
+  display: inline-block;
+  line-height: 1.4545454545454546rem;
+  padding: 0 0 0 0.7272727272727273rem;
+  /* TODO : after button fixed, recheck! */
+
+}
+.ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text {
+  display: inline-block;
+  vertical-align: middle;
+}
+.ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text.ui-btn-text-padding-left {
+  padding-left: 1.0909090909090908rem;
+}
+.ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-icon {
+  position: absolute;
+  top: 50%;
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  margin-top: -0.7272727272727273rem;
+}
+/* put img inside of checkbox(normal, favorite 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.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_check_bg.png);
+}
+.ui-icon-checkbox-on {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_check_activated.png), url(images/00_check_bg.png);
+  background-repeat: no-repeat;
+}
+.ui-btn-down-s > .ui-btn-inner > .ui-icon-checkbox-off {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_check_press.png), url(images/00_check_press_bg.png);
+  background-repeat: no-repeat;
+}
+.ui-btn-down-s > .ui-btn-inner > .ui-icon-checkbox-on {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_check_press.png), url(images/00_check_press_bg.png);
+  background-repeat: no-repeat;
+}
+.favorite .ui-btn .ui-icon-checkbox-off,
+.favorite .ui-btn .ui-icon-checkbox-off-press {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_icon_favorite_off.png);
+}
+.favorite .ui-btn .ui-icon-checkbox-on,
+.favorite .ui-btn .ui-icon-checkbox-on-press {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_icon_favorite_on.png);
+}
+.ui-icon-radio-off {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_button_radio_bg.png);
+}
+.ui-icon-radio-on {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_button_radio_activated.png), url(images/00_button_radio_bg.png);
+}
+.ui-btn-down-s > .ui-btn-inner > .ui-icon-radio-on {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_button_radio_press.png), url(images/00_button_radio_press_bg.png);
+}
+.ui-btn-down-s > .ui-btn-inner > .ui-icon-radio-off {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_button_radio_press.png), url(images/00_button_radio_press_bg.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 {
+	.ui-field-contain { border-width: 0; padding: 0; margin: 0.8em 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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+label.ui-input-text {
+  font-size: 1rem;
+  line-height: 1.2;
+  display: block;
+  font-weight: normal;
+  margin: 0 0 .3em;
+}
+input.ui-input-text,
+textarea.ui-input-text {
+  background: #e3e1d9;
+  background-image: none;
+  padding: .4em;
+  line-height: 1.4;
+  font-size: 0.7272727272727273rem;
+  display: block;
+  -ms-border-radius: .1em;
+  -o-border-radius: .1em;
+  -webkit-border-radius: .1em;
+  -moz-border-radius: .1em;
+  border-radius: .1em;
+}
+input.ui-input-text.ui-focus,
+textarea.ui-input-text.ui-focus {
+  border: 1px solid #007bda;
+}
+input.ui-input-text {
+  appearance: none;
+  -webkit-appearance: none;
+}
+textarea.ui-input-text {
+  height: 2.272727272727273rem;
+  width: 95%;
+  resize: none;
+  -webkit-transition: height 200ms linear;
+  transition: height 200ms linear;
+  white-space: normal;
+}
+.ui-input-search {
+  position: relative;
+  padding-right: 1.7272727272727273rem;
+  padding-left: 1.7272727272727273rem;
+  border: 1px solid #626675;
+  /* temporarily delete 06.28 Heeju Joo*/
+
+  /*.ui-input-clear-hidden { display: none; }*/
+
+}
+.ui-input-search input.ui-input-text {
+  width: 100%;
+  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.6363636363636365rem;
+  height: 1.5rem;
+  display: inline-block;
+}
+.ui-input-search .ui-btn-icon-notext.ui-input-clear .ui-btn-inner {
+  padding: 0.20454545454545456rem 0.36363636363636365rem 0.20454545454545456rem 0.36363636363636365rem;
+}
+.ui-input-search .ui-btn-inner .ui-icon-deleteSearch {
+  margin: 0;
+  width: 1.0227272727272727rem;
+  height: 1.0227272727272727rem;
+}
+.ui-input-search .ui-input-clear {
+  position: absolute;
+  right: 0;
+  top: 0;
+  vertical-align: middle;
+}
+.ui-input-search.ui-focus {
+  border: 1px solid #007bda;
+}
+/* search bar */
+.ui-body-s > div > .ui-field-contain > .input-search-bar,
+.ui-body-s > .ui-field-contain > .input-search-bar {
+  margin: -2.1818181818181817rem -0.6818181818181819rem -1.4545454545454546rem -0.6818181818181819rem;
+}
+/* Need to confirm exact concept */
+.input-search-bar {
+  position: relative;
+  background-color: #dedcd5;
+  padding: 0.36363636363636365rem;
+  vertical-align: middle;
+}
+.input-search-bar .ui-corner-all {
+  -o-border-radius: 0.3em;
+  -ms-border-radius: 0.3em;
+  -moz-border-radius: 0.3em;
+  -webkit-border-radius: 0.3em;
+  border-radius: 0.3em;
+}
+.input-search-bar .ui-input-search {
+  font-size: 0.7272727272727273rem;
+  display: block;
+  position: relative;
+  background-color: #fafafa;
+}
+.input-search-bar .ui-input-search .ui-input-text {
+  height: 1.4545454545454546rem;
+  padding: 0px;
+  margin-right: 1.7272727272727273rem;
+}
+.input-search-bar .ui-input-search .ui-input-text::-webkit-input-placeholder {
+  color: #878580;
+}
+.input-search-bar .ui-input-search .ui-image-search {
+  position: absolute;
+  top: 0px;
+  left: 0px;
+  width: 1.0227272727272727rem;
+  height: 1.0227272727272727rem;
+  margin-top: 0.20454545454545456rem;
+  margin-left: 0.36363636363636365rem;
+  margin-right: 0.36363636363636365rem;
+}
+.input-search-bar .ui-input-search-default {
+  margin-right: 3.3181818181818183rem;
+  -webkit-transition: all 400ms linear;
+  transition: all 400ms linear;
+}
+.input-search-bar .ui-input-search-wide {
+  margin-right: 0rem;
+  -webkit-transition: all 400ms linear;
+  transition: all 400ms linear;
+}
+.input-search-bar .ui-btn-icon-cancel.ui-input-cancel {
+  display: inline-block;
+  position: absolute;
+  top: 0.36363636363636365rem;
+  right: 0rem;
+  height: 1.5rem;
+  margin-right: 0.36363636363636365rem;
+  box-shadow: 0px 1px 1px #fafafa inset, 0px 1px 1px #98948e;
+  vertical-align: middle;
+  padding: 0px;
+  border-color: none;
+  width: 3.090909090909091rem;
+  -webkit-transition: all 400ms linear;
+  transition: all 400ms linear;
+}
+.input-search-bar .ui-btn-icon-cancel.ui-input-cancel .ui-btn-inner {
+  padding-top: 0.2727272727272727rem;
+  padding-bottom: 0.2727272727272727rem;
+}
+.input-search-bar .ui-btn-icon-cancel.ui-input-cancel .ui-btn-inner .ui-btn-text {
+  font-size: 0.6818181818181819rem;
+}
+.input-search-bar .ui-btn-icon-cancel.ui-input-cancel.ui-btn-cancel-hide {
+  right: -3.409090909090909rem;
+  visibility: hidden;
+}
+.input-search-bar .ui-btn-icon-cancel.ui-input-cancel.ui-btn-cancel-show {
+  right: 0px;
+  visibility: visible;
+}
+.input-search-bar .ui-search-bar-icon {
+  margin-left: 1.8636363636363638rem;
+}
+.input-search-bar .ui-btn.ui-btn-search-front-icon {
+  position: absolute;
+  top: 0.29545454545454547rem;
+  width: 1.6363636363636365rem;
+  height: 1.6363636363636365rem;
+  padding: 0;
+  -o-border-radius: 0.8636363636363636rem ! important;
+  -ms-border-radius: 0.8636363636363636rem ! important;
+  -moz-border-radius: 0.8636363636363636rem ! important;
+  -webkit-border-radius: 0.8636363636363636rem ! important;
+  border-radius: 0.8636363636363636rem ! important;
+  box-shadow: 0px 1px 1px #fafafa inset, 0px 1px 1px #98948e;
+}
+.input-search-bar .ui-btn.ui-btn-search-front-icon > .ui-btn-inner.ui-btn-icon-only {
+  width: 1.0227272727272727rem;
+  height: 1.0227272727272727rem;
+  padding: 0.29545454545454547rem 0.3181818181818182rem 0.3181818181818182rem 0.29545454545454547rem;
+  -o-border-radius: 0.8636363636363636rem ! important;
+  -ms-border-radius: 0.8636363636363636rem ! important;
+  -moz-border-radius: 0.8636363636363636rem ! important;
+  -webkit-border-radius: 0.8636363636363636rem ! important;
+  border-radius: 0.8636363636363636rem ! important;
+}
+.input-search-bar .ui-btn.ui-btn-search-front-icon > .ui-btn-inner.ui-btn-icon-only .ui-icon {
+  width: 1.0227272727272727rem;
+  height: 1.0227272727272727rem;
+  margin: 0;
+  background-position: 0 0;
+  background-size: 1.0227272727272727rem 1.0227272727272727rem;
+}
+.ui-header .input-search-bar {
+  border-top: 0.022727272727272728rem solid #acaaa3;
+  padding-top: 0.36363636363636365rem;
+  padding-bottom: 0.36363636363636365rem;
+}
+.ui-image-search {
+  background-image: url(images/controls/00_search_icon.png);
+  background-repeat: no-repeat;
+  background-size: 1.0227272727272727rem 1.0227272727272727rem;
+}
+.ui-icon-deleteSearch {
+  background-image: url(images/controls/00_field_btn_clear.png);
+  background-repeat: no-repeat;
+  background-size: 1.0227272727272727rem 1.0227272727272727rem;
+}
+.ui-icon-deleteSearch:active {
+  background-image: url(images/controls/00_field_btn_clear_press.png);
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.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-vertical .ui-controlgroup-controls {
+  display: block;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn {
+  background: #f7f5ed;
+  border-radius: 0;
+  border-color: #c7c5be;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn:first-child {
+  border-top-left-radius: 0.3181818181818182rem;
+  border-top-right-radius: 0.3181818181818182rem;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn:last-child {
+  border-bottom-left-radius: 0.3181818181818182rem;
+  border-bottom-right-radius: 0.3181818181818182rem;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn-hover-s {
+  border-radius: 0 !important;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn-hover-s:first-child {
+  border-top-left-radius: 0.3181818181818182rem !important;
+  border-top-right-radius: 0.3181818181818182rem !important;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn-hover-s:last-child {
+  border-bottom-left-radius: 0.3181818181818182rem !important;
+  border-bottom-right-radius: 0.3181818181818182rem !important;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn-box-s {
+  border-radius: 0;
+  box-shadow: 0;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn-box-s .ui-btn-inner {
+  background: #f7f5ed;
+  display: inline-block;
+  border: none;
+  border-radius: 0;
+}
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"].ui-btn-down-s .ui-btn-inner .ui-btn-text,
+.ui-controlgroup-vertical .ui-controlgroup-controls [data-role="button"] .ui-btn-active-s .ui-btn-inner .ui-btn-text {
+  color: #252525;
+}
+.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-on .ui-btn-inner {
+  background: #f8f6ef;
+}
+.ui-controlgroup .ui-radio-on .ui-btn-inner .ui-btn-text {
+  color: #252525;
+}
+.ui-controlgroup.ui-controlgroup-padding-more {
+  padding-left: 2.6363636363636362rem;
+}
+.ui-controlgroup.ui-controlgroup-padding-back {
+  padding-right: 2.6363636363636362rem;
+}
+.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.7272727272727273rem;
+  margin-right: 0.7272727272727273rem;
+}
+.ui-controlgroup-horizontal {
+  padding: 0;
+}
+.ui-controlgroup-horizontal .ui-btn {
+  border-radius: 0;
+  display: inline-block;
+  margin-left: -0.18181818181818182rem;
+  margin-right: -0.13636363636363635rem;
+}
+.ui-controlgroup-horizontal .ui-btn:first-child {
+  border-top-left-radius: 0.3181818181818182rem;
+  border-bottom-left-radius: 0.3181818181818182rem;
+}
+.ui-controlgroup-horizontal .ui-btn:last-child {
+  border-top-right-radius: 0.3181818181818182rem;
+  border-bottom-right-radius: 0.3181818181818182rem;
+}
+.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;
+}
+.ui-controlgroup-horizontal [data-role="button"] {
+  box-shadow: none;
+  background: none;
+}
+.ui-controlgroup-horizontal [data-role="button"].ui-btn-down-s .ui-btn-inner .ui-btn-text,
+.ui-controlgroup-horizontal [data-role="button"] .ui-btn-active-s .ui-btn-inner .ui-btn-text {
+  color: #252525;
+}
+.ui-controlgroup-horizontal [data-role="button"] > .ui-btn-inner {
+  border: 0px solid;
+  box-shadow: none;
+  padding-top: 0px;
+  padding-bottom: 3px;
+  padding-left: 0.4545454545454546rem;
+  padding-right: 0.4545454545454546rem;
+}
+.ui-controlgroup-horizontal [data-role="button"].ui-btn-hover-s {
+  border-radius: 0 !important;
+}
+.ui-controlgroup-horizontal [data-role="button"].ui-btn-hover-s:first-child {
+  border-top-left-radius: 0.3181818181818182rem !important;
+  border-bottom-left-radius: 0.3181818181818182rem !important;
+}
+.ui-controlgroup-horizontal [data-role="button"].ui-btn-hover-s:last-child {
+  border-top-right-radius: 0.3181818181818182rem !important;
+  border-bottom-right-radius: 0.3181818181818182rem !important;
+}
+.ui-controlgroup-horizontal label {
+  width: 100%;
+}
+.ui-controlgroup-horizontal label > span.ui-btn-inner {
+  padding-top: 0.13636363636363635rem;
+  padding-bottom: 0.13636363636363635rem;
+}
+/*
+* 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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/************************/
+.ui-listview {
+  margin: 0;
+  counter-reset: listnumbering;
+  border-top-color: #d3d1cb;
+  /* listview: fonts for li with a link */
+
+}
+.ui-listview li.ui-btn > .ui-btn-hastxt > .ui-btn-text.ui-btn-text-padding-right {
+  padding-right: 0rem;
+}
+.ui-listview .ui-li {
+  border-left-width: 0px;
+  border-right-width: 0px;
+  border-top-width: 0px;
+}
+.ui-listview .ui-li > .ui-btn-inner {
+  border-bottom-width: 1px;
+  border-bottom-style: solid;
+  border-bottom-color: #d3d1cb;
+  margin-left: 0.5909090909090909rem;
+  margin-right: 0.5909090909090909rem;
+}
+.ui-listview .ui-li-static {
+  background-color: #f8f6ef;
+  border-bottom-width: 1px;
+  border-bottom-style: solid;
+  border-bottom-color: #d3d1cb;
+  margin-left: 0.5909090909090909rem;
+  margin-right: 0.5909090909090909rem;
+}
+.ui-listview .ui-li:not(.ui-li-divider):not(.ui-li-static) {
+  min-height: 2.5rem;
+}
+.ui-listview .ui-li.ui-li-has-multiline:not(.ui-li-divider):not(.ui-li-static) {
+  min-height: 2.8181818181818183rem;
+}
+.ui-listview li.ui-btn-up-s,
+.ui-listview li.ui-btn-hover-s {
+  background: none;
+  background-color: #f8f6ef;
+  color: #000000;
+  box-shadow: none;
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+}
+.ui-listview li.ui-btn-down-s {
+  background: none;
+  background-color: #5787c2;
+  color: #fafafa;
+  box-shadow: none;
+  -o-border-radius: 0;
+  -ms-border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+}
+.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 {
+  color: #000000;
+}
+.ui-listview li.ui-btn-down-s > .ui-li > .ui-btn-text > a.ui-link-inherit {
+  color: #fafafa;
+}
+.ui-content .ui-listview {
+  margin-left: -0.36363636363636365rem;
+  margin-right: -0.36363636363636365rem;
+  padding-bottom: 1px;
+}
+.ui-content .ui-listview .ui-listview {
+  margin: 0;
+}
+.ui-content .ui-listview-inset {
+  margin: 1em 0;
+}
+.ui-listview,
+.ui-li,
+.ui-collapsible-heading {
+  list-style: none;
+  padding: 0;
+  font-size: 1rem;
+}
+.ui-li,
+.ui-collapsible-heading,
+.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 h3,
+.ui-collapsible-heading h3,
+.ui-collapsible > .ui-collapsible-content h3,
+.ui-listview li h3 {
+  margin-top: 0px;
+  margin-bottom: 0px;
+  font-size: 1rem;
+  font-weight: normal;
+}
+.ui-li form,
+.ui-collapsible-heading form,
+.ui-collapsible > .ui-collapsible-content form,
+.ui-listview li form {
+  display: inline-block;
+}
+.ui-li .ui-btn-text,
+.ui-collapsible-heading .ui-btn-text,
+.ui-collapsible > .ui-collapsible-content .ui-btn-text,
+.ui-listview li .ui-btn-text {
+  position: relative;
+}
+.ui-li .ui-btn-text a.ui-link-inherit,
+.ui-collapsible-heading .ui-btn-text a.ui-link-inherit,
+.ui-collapsible > .ui-collapsible-content .ui-btn-text a.ui-link-inherit,
+.ui-listview li .ui-btn-text a.ui-link-inherit {
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+.ui-li:last-child,
+.ui-collapsible-heading:last-child,
+.ui-collapsible > .ui-collapsible-content:last-child,
+.ui-listview li:last-child,
+.ui-li.ui-field-contain:last-child,
+.ui-collapsible-heading.ui-field-contain:last-child,
+.ui-collapsible > .ui-collapsible-content.ui-field-contain:last-child,
+.ui-listview li.ui-field-contain:last-child {
+  border-bottom-width: 1px;
+}
+.ui-li > .ui-btn-inner,
+.ui-collapsible-heading > .ui-btn-inner,
+.ui-collapsible > .ui-collapsible-content > .ui-btn-inner,
+.ui-listview li > .ui-btn-inner,
+.ui-li.ui-collapsible-heading > .ui-collapsible-heading-toggle,
+.ui-collapsible-heading.ui-collapsible-heading > .ui-collapsible-heading-toggle,
+.ui-collapsible > .ui-collapsible-content.ui-collapsible-heading > .ui-collapsible-heading-toggle,
+.ui-listview li.ui-collapsible-heading > .ui-collapsible-heading-toggle {
+  display: block;
+  position: relative;
+  padding: 0;
+  border-width: 0;
+}
+.ui-li > .ui-btn-inner.ui-btn-hastxt,
+.ui-collapsible-heading > .ui-btn-inner.ui-btn-hastxt,
+.ui-collapsible > .ui-collapsible-content > .ui-btn-inner.ui-btn-hastxt,
+.ui-listview li > .ui-btn-inner.ui-btn-hastxt {
+  padding: 0px 0px;
+}
+.ui-li .ui-btn-inner a.ui-link-inherit,
+.ui-collapsible-heading .ui-btn-inner a.ui-link-inherit,
+.ui-collapsible > .ui-collapsible-content .ui-btn-inner a.ui-link-inherit,
+.ui-listview li .ui-btn-inner a.ui-link-inherit,
+.ui-li .ui-collapsible-heading-toggle > .ui-btn-inner,
+.ui-collapsible-heading .ui-collapsible-heading-toggle > .ui-btn-inner,
+.ui-collapsible > .ui-collapsible-content .ui-collapsible-heading-toggle > .ui-btn-inner,
+.ui-listview li .ui-collapsible-heading-toggle > .ui-btn-inner,
+.ui-li > li,
+.ui-collapsible-heading > li,
+.ui-collapsible > .ui-collapsible-content > li,
+.ui-listview li > li,
+.ui-li.ui-li-static,
+.ui-collapsible-heading.ui-li-static,
+.ui-collapsible > .ui-collapsible-content.ui-li-static,
+.ui-listview li.ui-li-static {
+  padding-top: 0.6818181818181819rem;
+  padding-bottom: 0.6818181818181819rem;
+  display: block;
+  white-space: normal;
+  border-left-width: 0px;
+  border-right-width: 0px;
+}
+.ui-li .ui-btn-inner a.ui-link-inherit,
+.ui-collapsible-heading .ui-btn-inner a.ui-link-inherit,
+.ui-collapsible > .ui-collapsible-content .ui-btn-inner a.ui-link-inherit,
+.ui-listview li .ui-btn-inner a.ui-link-inherit,
+.ui-li .ui-collapsible-heading-toggle,
+.ui-collapsible-heading .ui-collapsible-heading-toggle,
+.ui-collapsible > .ui-collapsible-content .ui-collapsible-heading-toggle,
+.ui-listview li .ui-collapsible-heading-toggle {
+  white-space: normal;
+  overflow: visible !important;
+}
+.ui-li .ui-toggle-switch:last-child,
+.ui-collapsible-heading .ui-toggle-switch:last-child,
+.ui-collapsible > .ui-collapsible-content .ui-toggle-switch:last-child,
+.ui-listview li .ui-toggle-switch:last-child {
+  top: 50%;
+  margin-top: -0.7727272727272727rem;
+  display: inline-block;
+  position: absolute;
+  right: -1px;
+}
+.ui-li [data-role="button"]:last-child,
+.ui-collapsible-heading [data-role="button"]:last-child,
+.ui-collapsible > .ui-collapsible-content [data-role="button"]:last-child,
+.ui-listview li [data-role="button"]:last-child {
+  position: absolute;
+  right: 0px;
+}
+.ui-li .ui-radio:first-child,
+.ui-collapsible-heading .ui-radio:first-child,
+.ui-collapsible > .ui-collapsible-content .ui-radio:first-child,
+.ui-listview li .ui-radio:first-child,
+.ui-li .ui-checkbox:first-child,
+.ui-collapsible-heading .ui-checkbox:first-child,
+.ui-collapsible > .ui-collapsible-content .ui-checkbox:first-child,
+.ui-listview li .ui-checkbox:first-child {
+  position: absolute;
+  top: 50%;
+  margin-top: -0.6818181818181819rem;
+  left: -0.2272727272727273rem;
+  width: 1.3636363636363638rem;
+  height: 1.3636363636363638rem;
+}
+.ui-li .ui-radio:first-child .ui-btn-inner,
+.ui-collapsible-heading .ui-radio:first-child .ui-btn-inner,
+.ui-collapsible > .ui-collapsible-content .ui-radio:first-child .ui-btn-inner,
+.ui-listview li .ui-radio:first-child .ui-btn-inner,
+.ui-li .ui-checkbox:first-child .ui-btn-inner,
+.ui-collapsible-heading .ui-checkbox:first-child .ui-btn-inner,
+.ui-collapsible > .ui-collapsible-content .ui-checkbox:first-child .ui-btn-inner,
+.ui-listview li .ui-checkbox:first-child .ui-btn-inner {
+  line-height: 0.9090909090909092rem;
+  color: transparent;
+}
+.ui-li .ui-radio:first-child .ui-btn-inner .ui-icon,
+.ui-collapsible-heading .ui-radio:first-child .ui-btn-inner .ui-icon,
+.ui-collapsible > .ui-collapsible-content .ui-radio:first-child .ui-btn-inner .ui-icon,
+.ui-listview li .ui-radio:first-child .ui-btn-inner .ui-icon,
+.ui-li .ui-checkbox:first-child .ui-btn-inner .ui-icon,
+.ui-collapsible-heading .ui-checkbox:first-child .ui-btn-inner .ui-icon,
+.ui-collapsible > .ui-collapsible-content .ui-checkbox:first-child .ui-btn-inner .ui-icon,
+.ui-listview li .ui-checkbox:first-child .ui-btn-inner .ui-icon {
+  left: 0.2272727272727273rem;
+}
+.ui-li .ui-radio:first-child label.ui-btn-icon_only,
+.ui-collapsible-heading .ui-radio:first-child label.ui-btn-icon_only,
+.ui-collapsible > .ui-collapsible-content .ui-radio:first-child label.ui-btn-icon_only,
+.ui-listview li .ui-radio:first-child label.ui-btn-icon_only,
+.ui-li .ui-checkbox:first-child label.ui-btn-icon_only,
+.ui-collapsible-heading .ui-checkbox:first-child label.ui-btn-icon_only,
+.ui-collapsible > .ui-collapsible-content .ui-checkbox:first-child label.ui-btn-icon_only,
+.ui-listview li .ui-checkbox:first-child label.ui-btn-icon_only {
+  top: 0px;
+  margin-top: 0px;
+}
+.ui-li img.ui-li-bigicon,
+.ui-collapsible-heading img.ui-li-bigicon,
+.ui-collapsible > .ui-collapsible-content img.ui-li-bigicon,
+.ui-listview li img.ui-li-bigicon {
+  position: absolute;
+  width: 1.6363636363636365rem;
+  height: 1.6363636363636365rem;
+  top: 50%;
+  margin-top: -0.8181818181818182rem;
+}
+.ui-li img.ui-li-bigicon:first-child,
+.ui-collapsible-heading img.ui-li-bigicon:first-child,
+.ui-collapsible > .ui-collapsible-content img.ui-li-bigicon:first-child,
+.ui-listview li img.ui-li-bigicon:first-child {
+  left: 0px;
+}
+.ui-li img.ui-li-bigicon:nth-child(2),
+.ui-collapsible-heading img.ui-li-bigicon:nth-child(2),
+.ui-collapsible > .ui-collapsible-content img.ui-li-bigicon:nth-child(2),
+.ui-listview li img.ui-li-bigicon:nth-child(2) {
+  left: 1.7272727272727273rem;
+}
+.ui-li img.ui-li-bigicon:last-child,
+.ui-collapsible-heading img.ui-li-bigicon:last-child,
+.ui-collapsible > .ui-collapsible-content img.ui-li-bigicon:last-child,
+.ui-listview li img.ui-li-bigicon:last-child {
+  right: 0.7272727272727273rem;
+}
+.ui-li .ui-li-color-bar + img.ui-li-bigicon:nth-child(2),
+.ui-collapsible-heading .ui-li-color-bar + img.ui-li-bigicon:nth-child(2),
+.ui-collapsible > .ui-collapsible-content .ui-li-color-bar + img.ui-li-bigicon:nth-child(2),
+.ui-listview li .ui-li-color-bar + img.ui-li-bigicon:nth-child(2) {
+  left: 0px;
+}
+.ui-li .ui-li-color-bar,
+.ui-collapsible-heading .ui-li-color-bar,
+.ui-collapsible > .ui-collapsible-content .ui-li-color-bar,
+.ui-listview li .ui-li-color-bar {
+  position: absolute;
+  width: 0.13636363636363635rem;
+  height: 100%;
+  top: 0rem;
+  left: -0.5909090909090909rem;
+  background-color: #000000;
+}
+li.ui-li-thumbnail-right img.ui-li-bigicon.ui-li-thumb {
+  left: auto;
+  right: 0px;
+  width: 2.272727272727273rem;
+  height: 2.272727272727273rem;
+  margin-top: -1.1363636363636365rem;
+}
+.ui-li.ui-li-has-multiline .ui-btn-inner a.ui-link-inherit,
+.ui-li.ui-li-has-multiline.ui-li-static {
+  padding-top: 0.3181818181818182rem;
+  padding-bottom: 1.2727272727272727rem;
+}
+.ui-li.ui-li-has-multiline a {
+  white-space: normal;
+  overflow: visible !important;
+  padding-right: 0.7272727272727273rem;
+  /* ellipsis for normal text */
+
+}
+/********************************************/
+/************  Add ellipsis *****************/
+/********************************************/
+.ui-li.ui-li-text-ellipsis .ui-btn-inner a.ui-link-inherit {
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+.ui-li.ui-li-text-ellipsis a {
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+.ui-li.ui-li-text-ellipsis.ui-li-static {
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+/********************************************/
+/*************** Edit Field *****************/
+/********************************************/
+.ui-li > input {
+  border-style: none;
+  border-width: 0px;
+  outline-color: #f8f6ef;
+  font-size: 1.0454545454545454rem;
+  line-height: 1;
+  padding-top: 0px;
+  padding-bottom: 0px;
+  color: #e3e1d9;
+}
+/********************************************/
+/*************** Divider ********************/
+/********************************************/
+.ui-listview li.ui-li-divider {
+  background: #f8f6ef;
+  color: #3b73b6;
+  border-bottom-width: 0px;
+  border-top-width: 0px;
+  cursor: default;
+  counter-reset: listnumbering;
+  font-weight: bold;
+  height: 1.2727272727272727rem;
+  font-size: 0.7272727272727273rem;
+}
+.ui-listview li.ui-li-divider > .ui-btn-inner > .ui-btn-text {
+  font-size: 0.7272727272727273rem;
+}
+.ui-listview li.ui-li-divider:active {
+  background-color: #5787c2;
+  color: #fafafa;
+}
+.ui-listview li.ui-li-divider:active .ui-divider-normal-line {
+  background: #fafafa;
+}
+.ui-listview li.ui-li-divider.ui-btn {
+  top: 0px;
+  margin-top: 0rem;
+  border-radius: 0px;
+  font-size: 0.7272727272727273rem;
+}
+.ui-listview li.ui-li-divider.ui-btn .ui-btn-inner.ui-btn-hastxt {
+  height: 100%;
+  padding-left: 0px;
+}
+.ui-listview li.ui-li-divider.ui-btn .ui-btn-inner.ui-btn-hastxt .ui-btn-text {
+  position: absolute;
+  top: 0.2272727272727273rem;
+  height: 0.8181818181818182rem;
+  padding-right: 0.4545454545454546rem;
+}
+.ui-listview li.ui-li-divider:not(.ui-btn) {
+  padding-top: 0.4545454545454546rem;
+}
+.ui-listview li.ui-li-divider:focus {
+  outline: none;
+}
+.ui-listview li.ui-li-divider > .ui-btn-text {
+  position: absolute;
+  top: 0.4545454545454546rem;
+  height: 0.8636363636363636rem;
+  padding-left: 0.5909090909090909rem;
+  padding-right: 0.5909090909090909rem;
+}
+.ui-listview li.ui-li-divider[data-style="dialogue"] {
+  background-color: #f8f6ef;
+  height: 1.0454545454545454rem;
+  padding: 0px;
+  padding-top: 0.7272727272727273rem;
+  padding-bottom: 0rem;
+  padding-left: 0.4545454545454546rem;
+  margin-left: 0.18181818181818182rem;
+  margin-right: 0.18181818181818182rem;
+  font-size: 0.7272727272727273rem;
+  font-weight: bold;
+  color: #3b73b6;
+}
+.ui-listview li.ui-li-divider[data-style="check"] {
+  height: 1.7272727272727273rem;
+  padding-top: 0px;
+  padding-bottom: 0px;
+  padding-left: 0px;
+}
+.ui-listview li.ui-li-divider[data-style="check"] label {
+  top: 0px;
+  margin: 0;
+}
+.ui-listview li.ui-li-divider[data-style="check"] label .ui-btn-inner {
+  z-index: 5;
+  position: absolute;
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background: #f8f6ef;
+  padding: 0;
+}
+.ui-listview li.ui-li-divider[data-style="check"] .ui-btn-text {
+  padding-left: 1.6818181818181819rem;
+}
+.ui-listview li.ui-li-divider[data-style="check"]:active label .ui-btn-inner {
+  background-color: #5787c2;
+}
+.ui-listview li.ui-li-divider .ui-divider-normal-line {
+  display: inline-block;
+  position: absolute;
+  top: 1.3181818181818181rem;
+  width: 100%;
+  height: 0.09090909090909091rem;
+  background: #0e68ad;
+}
+.ui-listview li.ui-li-divider.ui-btn-down-s {
+  background: #3b73b6;
+  color: #f8f6ef;
+}
+.ui-listview li.ui-li-divider.ui-btn-down-s .ui-divider-normal-line {
+  background: #f8f6ef;
+}
+.ui-listview li.ui-li-divider.ui-btn-down-s label > .ui-btn-inner {
+  background: #3b73b6;
+}
+.ui-listview li.ui-li-divider + li.ui-li-dialogue {
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.ui-divider-expand-div {
+  position: absolute;
+  width: 4.454545454545455rem;
+  height: 1.9090909090909092rem;
+  top: 0.4545454545454546rem;
+  right: 0px;
+  border-left-width: 1px;
+  border-left-style: solid;
+  border-left-color: rgba(0, 0, 0, 0.5);
+}
+.ui-li-has-thumb:not(.ui-li-thumbnail-right) .ui-btn-inner a.ui-link-inherit,
+.ui-li-has-thumb:not(.ui-li-thumbnail-right).ui-li-static {
+  padding-left: 2.272727272727273rem;
+}
+.ui-li-has-thumb:not(.ui-li-thumbnail-right) .ui-li-text-sub {
+  padding-left: 2.0454545454545454rem;
+  padding-right: 0px;
+  /* ellipsis for sub text */
+
+}
+.ui-li-has-checkbox .ui-btn-inner a.ui-link-inherit,
+.ui-li-has-radio .ui-btn-inner a.ui-link-inherit,
+.ui-li-has-checkbox.ui-li-static,
+.ui-li-has-radio.ui-li-static {
+  padding-left: 1.7272727272727273rem;
+}
+.ui-li-has-checkbox .ui-li-text-sub,
+.ui-li-has-radio .ui-li-text-sub {
+  padding-left: 1.7272727272727273rem;
+}
+.ui-li-has-thumb.ui-li-has-checkbox .ui-btn-inner a.ui-link-inherit,
+.ui-li-has-thumb.ui-li-has-radio .ui-btn-inner a.ui-link-inherit,
+.ui-li-has-thumb.ui-li-has-checkbox.ui-li-static,
+.ui-li-has-thumb.ui-li-has-radio.ui-li-static {
+  padding-left: 3.7272727272727275rem;
+}
+.ui-li-has-thumb.ui-li-has-checkbox .ui-li-text-sub,
+.ui-li-has-thumb.ui-li-has-radio .ui-li-text-sub {
+  padding-left: 3.7272727272727275rem;
+}
+.ui-li.ui-li-has-right-circle-btn .ui-btn-inner a {
+  padding-right: 2.1818181818181817rem;
+}
+.ui-li.ui-li-has-right-btn:not(.ui-swipe) .ui-btn-inner a {
+  padding-right: 3.590909090909091rem;
+}
+.ui-li.ui-li-thumbnail-right .ui-btn-inner a {
+  padding-right: 2.3636363636363638rem;
+}
+.ui-li.ui-li-static.ui-li-has-right-circle-btn {
+  padding-right: 2.1818181818181817rem;
+}
+.ui-li.ui-li-static.ui-li-has-right-btn:not(.ui-swipe) {
+  padding-right: 3.590909090909091rem;
+}
+.ui-li.ui-li-static.ui-li-thumbnail-right {
+  padding-right: 2.3636363636363638rem;
+}
+.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-icon .ui-li-text-sub {
+  padding-left: 40px;
+}
+.ui-li-heading {
+  font-size: 16px;
+  font-weight: bold;
+  display: block;
+  margin: .6em 0;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+.ui-li-thumb,
+.ui-li-icon {
+  position: absolute;
+  left: 1px;
+  top: 0;
+  max-height: 3.272727272727273rem;
+  max-width: 3.272727272727273rem;
+}
+.ui-listview * .ui-btn-inner > .ui-btn > .ui-btn-inner {
+  border-top: 0px;
+}
+.ui-li-sub,
+.ui-li-sub-setting {
+  float: right;
+  text-align: right;
+  font-size: 0.7272727272727273rem;
+  margin: .3em 0;
+}
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+/* ~~~~~~~~~~~~~~              NEW   LIST   STYLE                   ~~~~~~~~~ */
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+.ui-li-text-sub {
+  float: right;
+  text-align: right;
+  font-size: 0.7272727272727273rem;
+  font-weight: bold;
+  color: #4f4f4f;
+  position: absolute;
+  right: 0px;
+  top: 0.9090909090909092rem;
+  width: 95%;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+.ui-li-text-sub > img {
+  position: relative;
+  width: 1rem;
+  height: 1rem;
+  margin: 0 0.36363636363636365rem 0 0.36363636363636365rem;
+  vertical-align: bottom;
+}
+.ui-li-text-sub2 {
+  float: right;
+  text-align: right;
+  font-size: 0.5454545454545454rem;
+  font-weight: bold;
+  color: #4f4f4f;
+  position: absolute;
+  right: 0px;
+  top: 0.5454545454545454rem;
+  width: 60%;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+.ui-li-text-sub2 > img {
+  width: 1rem;
+  height: 1rem;
+  margin: 0 0 0 0.36363636363636365rem;
+}
+/*
+li:not(.ui-li-has-multiline) .ui-li-text-sub {
+	position : absolute;
+	right : 16 * @unit_base;
+	top: 22 * @unit_base;
+	margin-top: 0px;
+}*/
+.ui-li-has-multiline .ui-li-text-sub {
+  position: absolute;
+  text-align: left;
+  right: auto;
+  left: 0px;
+  top: 1.590909090909091rem;
+  margin-top: 0px;
+  width: 90%;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+.ui-li-has-multiline.ui-li-has-right-btn .ui-btn-inner a .ui-li-text-sub {
+  width: 74%;
+}
+.ui-li-has-multiline.ui-li-has-right-btn.ui-li-has-thumb .ui-btn-inner a .ui-li-text-sub {
+  width: 64%;
+}
+.ui-li-has-multiline.ui-li-static.ui-li-has-right-btn .ui-li-text-sub {
+  width: 74%;
+}
+.ui-li-has-multiline.ui-li-static.ui-li-has-right-btn.ui-li-has-thumb .ui-li-text-sub {
+  width: 64%;
+}
+.ui-li-icon-sub-right,
+.ui-li-icon-sub {
+  position: absolute;
+  left: auto;
+  width: 1rem;
+  height: 1rem;
+  margin: 0 0;
+  margin-left: 8px;
+}
+.ui-li-icon-sub-right {
+  right: 0.36363636363636365rem;
+}
+.ui-listview li.ui-li-dialogue {
+  background: #efede5;
+  margin-left: 0.36363636363636365rem;
+  margin-right: 0.36363636363636365rem;
+  padding-left: 0.4545454545454546rem;
+  padding-right: 0.4545454545454546rem;
+  border-style: solid;
+  border-color: #8e9aa3;
+  border-width: 1px;
+  border-top-width: 0px;
+}
+.ui-listview li.ui-li-dialogue > .ui-btn-inner {
+  margin-left: 0px;
+  margin-right: 0px;
+  border-bottom-width: 0px;
+}
+.ui-listview li.ui-li-dialogue:first-child {
+  border-top-width: 1px;
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.ui-listview li.ui-li-dialogue:last-child {
+  border-bottom-left-radius: 3px;
+  border-bottom-right-radius: 3px;
+}
+.ui-listview li.ui-li-dialogue > img {
+  margin-left: 0.2727272727272727rem;
+}
+.ui-listview li.ui-li-dialogue [data-role="button"]:last-child {
+  margin-right: 0.4545454545454546rem;
+}
+.ui-listview li.ui-li-dialogue .ui-link-inherit > .ui-btn {
+  margin-right: 0px;
+}
+.ui-listview li.ui-li-dialogue.ui-li-static .ui-li-text-sub,
+.ui-listview li.ui-li-dialogue.ui-li-static .ui-toggle-switch {
+  right: 0.4545454545454546rem;
+}
+.ui-listview li.ui-li-dialogue.ui-li-static.ui-li-has-checkbox,
+.ui-listview li.ui-li-dialogue.ui-li-static.ui-li-has-radio {
+  padding-left: 2rem;
+}
+.ui-listview li.ui-li-dialogue.ui-li-static .ui-checkbox,
+.ui-listview li.ui-li-dialogue.ui-li-static .ui-radio {
+  left: 0px;
+}
+.ui-listview li.ui-li-dialogue.ui-li-has-multiline.ui-li-static .ui-li-text-sub {
+  padding-left: 0.4545454545454546rem;
+}
+.ui-listview li.ui-li-dialogue.ui-li-has-multiline.ui-li-static .ui-li-text-sub2 {
+  padding-right: 0.4545454545454546rem;
+}
+.ui-listview li.ui-li-dialogue.ui-li-has-multiline.ui-li-static.ui-li-has-checkbox .ui-li-text-sub,
+.ui-listview li.ui-li-dialogue.ui-li-has-multiline.ui-li-static.ui-li-has-radio .ui-li-text-sub {
+  padding-left: 1.9090909090909092rem;
+}
+.ui-listview li.ui-li-divider + .ui-li-dialogue {
+  border-top-width: 1px;
+}
+.ui-listview > li.ui-li-dialogue.ui-btn-hover-up-s:not(.ui-btn-down-s):not(.ui-li-expanded),
+.ui-listview > li.ui-li-dialogue.ui-btn-up-s:not(.ui-li-expanded) {
+  background: #efede5;
+}
+.ui-listview > li.ui-li-dialogue.ui-btn-down-s:not(.ui-li-expanded) {
+  background: #5787c2;
+}
+.ui-listview > li.ui-li-dialogue.ui-li-expanded {
+  padding-left: 1.1818181818181819rem;
+  background: #dcdad3;
+}
+.ui-listview > li.ui-li-dialogue.ui-li-divider {
+  height: 1.4545454545454546rem;
+  padding: 0px;
+}
+.ui-listview > li.ui-li-group-title {
+  padding-top: 1.4545454545454546rem;
+}
+.ui-listview > li.ui-li-group-title span {
+  padding-left: 0.7272727272727273rem;
+}
+.ui-listview > li.ui-li-dialogue-divider {
+  padding-top: 0.9090909090909092rem;
+  padding-bottom: 0rem;
+  padding-left: 0.4545454545454546rem;
+  margin-left: 0.18181818181818182rem;
+  margin-right: 0.18181818181818182rem;
+  background: #efede5;
+  font-size: 0.7272727272727273rem;
+  font-weight: bold;
+  color: #3b73b6;
+}
+.ui-listview li.ui-li-dialogue-edit {
+  padding-left: 5.2727272727272725rem;
+  padding-top: 0.5454545454545454rem;
+  padding-bottom: 0.5454545454545454rem;
+}
+.ui-listview li.ui-li-dialogue-edit .ui-edit-title {
+  position: absolute;
+  left: 0.4545454545454546rem;
+  width: 4.136363636363637rem;
+  padding-right: 0.36363636363636365rem;
+  display: inline-block;
+  top: 50%;
+  margin-top: -0.5909090909090909rem;
+  border-right-color: #b9b8b2;
+  border-right-width: 1px;
+  border-right-style: solid;
+}
+.ui-listview li.ui-li-dialogue-edit input {
+  font-size: 1rem;
+  background: transparent;
+  outline-color: transparent;
+  width: 100%;
+  padding-left: 0px;
+  padding-right: 0px;
+  border: none;
+  color: #000000;
+}
+.ui-listview > .ui-li.ui-li-dialogue-edit.ui-li-has-right-btn {
+  padding-right: 5rem;
+}
+.ui-listview .ui-li-bubble-receive,
+.ui-listview .ui-li-bubble-left,
+.ui-listview .ui-li-bubble-sent,
+.ui-listview .ui-li-bubble-right,
+.ui-listview .ui-li-bubble-sos {
+  display: inline-block;
+  background-clip: padding-box;
+  max-width: 100%;
+  word-wrap: break-word;
+  font-size: 0.8636363636363636rem;
+}
+.ui-listview .ui-li-bubble-receive p,
+.ui-listview .ui-li-bubble-left p,
+.ui-listview .ui-li-bubble-sent p,
+.ui-listview .ui-li-bubble-right p,
+.ui-listview .ui-li-bubble-sos p,
+.ui-listview .ui-li-bubble-receive span,
+.ui-listview .ui-li-bubble-left span,
+.ui-listview .ui-li-bubble-sent span,
+.ui-listview .ui-li-bubble-right span,
+.ui-listview .ui-li-bubble-sos span {
+  font-size: 0.8636363636363636rem;
+}
+.ui-listview .ui-li-bubble-receive img,
+.ui-listview .ui-li-bubble-left img,
+.ui-listview .ui-li-bubble-sent img,
+.ui-listview .ui-li-bubble-right img,
+.ui-listview .ui-li-bubble-sos img {
+  position: relative;
+  min-width: 7.272727272727273rem;
+  min-height: 7.272727272727273rem;
+}
+.ui-listview .ui-li-bubble-receive:first-child,
+.ui-listview .ui-li-bubble-left:first-child,
+.ui-listview .ui-li-bubble-sent:first-child,
+.ui-listview .ui-li-bubble-right:first-child,
+.ui-listview .ui-li-bubble-sos:first-child {
+  margin-top: 0.6818181818181819rem;
+}
+.ui-listview .ui-li-static.ui-li-bubble-receive,
+.ui-listview .ui-li-static.ui-li-bubble-left {
+  margin-left: 0px;
+  margin-right: 4.545454545454546rem;
+  border-image-source: url(images/00_messagebubble_bg_receive.9.png);
+  border-image-slice: 60 22 19 57 fill;
+  border-image-width: auto;
+  padding: 9px 14px 21px 48px;
+  color: #000000;
+}
+.ui-listview .ui-li-static.ui-li-bubble-receive > .ui-li-bubble-time,
+.ui-listview .ui-li-static.ui-li-bubble-left > .ui-li-bubble-time {
+  margin-left: 0.3181818181818182rem;
+  position: absolute;
+  display: inline-block;
+  bottom: 0.5454545454545454rem;
+  left: 100%;
+  font-size: 0.5rem;
+  text-align: left;
+  color: #8b8b8b;
+}
+.ui-listview .ui-li-static.ui-li-bubble-sent,
+.ui-listview .ui-li-static.ui-li-bubble-right {
+  margin-left: 4.545454545454546rem;
+  margin-right: 0px;
+  border-image-source: url(images/00_messagebubble_bg_sent.9.png);
+  border-image-slice: 55 47 20 13 fill;
+  border-image-width: auto;
+  padding: 9px 47px 20px 13px;
+  color: #000000;
+}
+.ui-listview .ui-li-static.ui-li-bubble-sent > .ui-li-bubble-time,
+.ui-listview .ui-li-static.ui-li-bubble-right > .ui-li-bubble-time {
+  margin-right: 0.3181818181818182rem;
+  text-align: right;
+  color: #8b8b8b;
+  position: absolute;
+  display: inline-block;
+  bottom: 0.5454545454545454rem;
+  right: 100%;
+  font-size: 0.5rem;
+}
+.ui-listview .ui-li-static.ui-li-bubble-sos {
+  color: #e94949;
+}
+.ui-listview .ui-li-static.ui-li-bubble-sos > .ui-li-bubble-time {
+  color: #e94949;
+}
+.ui-listview .ui-li-static.ui-li-bubble-date {
+  color: #686868;
+  font-style: italic;
+  width: auto;
+  height: 1.0909090909090908rem;
+  background-image: url(images/00_messagebubble_date_bg.png);
+  background-repeat: repeat-x;
+  background-position: center center;
+  font-size: 0.7272727272727273rem;
+  margin: 0.9090909090909092rem 0.2727272727272727rem;
+  border: 0px none red;
+  padding: 0 0;
+  padding-top: 0.5em;
+  margin-left: 23px;
+  margin-right: 23px;
+  text-align: center;
+}
+.ui-listview .ui-li-static.ui-li-bubble-date * {
+  display: inline-block;
+  background-color: #f8f6ef;
+  padding-left: 0.5em;
+  padding-right: 0.5em;
+}
+.ui-listview span.ui-li-bubble-time {
+  font-weight: bold;
+  width: 3.181818181818182rem;
+}
+@-webkit-keyframes addliitem {
+  from {
+    -webkit-transform: scale(0.5);
+    -moz-transform: scale(0.5);
+    opacity: 0;
+  }
+  to {
+    -webkit-transform: scale(1);
+    -moz-transform: scale(1);
+    opacity: 1;
+  }
+}
+.addli {
+  -webkit-animation-name: addliitem;
+  -moz-animation-name: addliitem;
+  -webkit-animation-duration: 0.5s;
+  -moz-animation-duration: 0.5s;
+  -webkit-transition-timing-function: linear;
+  -moz-transition-timing-function: linear;
+}
+@-webkit-keyframes removeliitem {
+  from {
+    -webkit-transform: scale(1);
+    -moz-transform: scale(1);
+    opacity: 1;
+  }
+  to {
+    -webkit-transform: scale(0.5);
+    -moz-transform: scale(0.5);
+    opacity: 0;
+  }
+}
+.removeli {
+  -webkit-animation-name: removeliitem;
+  -moz-animation-name: removeliitem;
+  -webkit-animation-duration: 0.5s;
+  -moz-animation-duration: 0.5s;
+  -webkit-transition-timing-function: linear;
+  -moz-transition-timing-function: linear;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-controlgroup .ui-radio > .ui-btn {
+  background: #f8f6ef;
+}
+.ui-controlgroup .ui-btn-text {
+  font-size: 0.7727272727272727rem;
+  font-weight: bold;
+  color: #3a3a3a;
+}
+.ui-controlgroup .ui-btn-inner .ui-corner-left .ui-controlgroup-first {
+  -o-border-radius: .3em;
+  -ms-border-radius: .3em;
+  -moz-border-radius: .3em ;
+  -webkit-border-radius: .3em ;
+  border-radius: .3em ;
+}
+.ui-controlgroup .ui-btn-inner .ui-corner-right .ui-controlgroup-last {
+  -o-border-radius: .3em;
+  -ms-border-radius: .3em;
+  -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: #3b7796;
+}
+.ui-controlgroup .ui-radio-off .ui-btn-inner {
+  color: #3a3a3a;
+}
+.ui-controlgroup.ui-controlgroup-horizontal .ui-radio .ui-btn-down-s .ui-btn-inner {
+  background: #0e66aa;
+}
+/*
+* 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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-scrollview-clip {
+  position: relative;
+}
+.ui-scrollview-view {
+  overflow-x: hidden;
+  overflow-y: visible;
+}
+.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.09090909090909091rem;
+  right: 0.09090909090909091rem;
+  bottom: 0.09090909090909091rem;
+  width: 0.36363636363636365rem;
+}
+.ui-scrollbar-x {
+  right: 0.09090909090909091rem;
+  bottom: 0.09090909090909091rem;
+  left: 0.09090909090909091rem;
+  height: 0.36363636363636365rem;
+}
+.ui-scrollbar-track {
+  position: relative;
+  width: 100%;
+  height: 100%;
+}
+.ui-scrollbar-thumb {
+  position: absolute;
+  top: 0;
+  left: 0;
+  background-color: #c6c4be;
+}
+.ui-scrollbar-y .ui-scrollbar-thumb {
+  width: 0.2272727272727273rem;
+  height: 100%;
+  -o-border-radius: 0.09090909090909091rem;
+  -ms-border-radius: 0.09090909090909091rem;
+  -moz-border-radius: 0.09090909090909091rem;
+  -webkit-border-radius: 0.09090909090909091rem;
+  border-radius: 0.09090909090909091rem;
+  -o-box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.18181818181818182rem #000000;
+  -ms-box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.18181818181818182rem #000000;
+  -moz-box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.18181818181818182rem #000000;
+  -webkit-box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.18181818181818182rem #000000;
+  box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.18181818181818182rem #000000;
+}
+.ui-scrollbar-x .ui-scrollbar-thumb {
+  width: 100%;
+  height: 0.2272727272727273rem;
+  -o-border-radius: 0.09090909090909091rem;
+  -ms-border-radius: 0.09090909090909091rem;
+  -moz-border-radius: 0.09090909090909091rem;
+  -webkit-border-radius: 0.09090909090909091rem;
+  border-radius: 0.09090909090909091rem;
+}
+.ui-scroll-jump-top-bg {
+  position: absolute;
+  top: 0.4090909090909091rem;
+  right: 0.5909090909090909rem;
+  width: 1.6818181818181819rem;
+  height: 1.6818181818181819rem;
+}
+.ui-scroll-jump-left-bg {
+  position: absolute;
+  bottom: 0.4090909090909091rem;
+  left: 0.5909090909090909rem;
+  width: 1.6818181818181819rem;
+  height: 1.6818181818181819rem;
+}
+.ui-overflow-indicator-top {
+  position: absolute;
+  display: none;
+  top: 0;
+  width: 100%;
+  height: 0.8181818181818182rem;
+  opacity: 0.5;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-image: url(images/00_overscrolling_top.png);
+}
+.ui-overflow-indicator-bottom {
+  position: absolute;
+  display: none;
+  bottom: 0;
+  width: 100%;
+  height: 0.8181818181818182rem;
+  opacity: 0.5;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-image: url(images/00_overscrolling_bottom.png);
+}
+/*
+ * 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;
+}
+.ui-content.ui-scrollview-clip > div.ui-scrollview-view {
+  margin: 0;
+  padding-left: 0.36363636363636365rem;
+  padding-right: 0.36363636363636365rem;
+}
+/*
+ * 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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+@-webkit-keyframes ui-datetime-in {
+  from {
+    -webkit-transform: translateY(0.6363636363636364rem) scale(0.9);
+  }
+  to {
+    -webkit-transform: translateY(0) scale(1);
+  }
+}
+@-webkit-keyframes ui-datetime-out {
+  from {
+    opacity: 0.8;
+    -webkit-transform: translateY(0) scale(0.6);
+  }
+  to {
+    opacity: 0;
+    -webkit-transform: translateY(-0.6363636363636364rem) scale(0.6);
+  }
+}
+.ui-datefield {
+  font-size: 0.7727272727272727rem;
+}
+.ui-datefield > div > span {
+  vertical-align: middle;
+  min-width: 1.5681818181818181rem;
+  position: relative ! important;
+  padding: 0;
+}
+.ui-datefield .ui-datefield-seperator,
+.ui-datefield .ui-datefield-tab {
+  display: inline-block;
+  min-width: 0.5rem;
+  text-align: center;
+}
+.ui-datefield .ui-datefield-tab > div {
+  display: inline-block;
+  width: 0.38636363636363635rem;
+  height: 0.9545454545454546rem;
+}
+.ui-datefield .ui-datefield-tab > div.ui-divider-1st {
+  border-right: 1px solid #b9b8b2;
+}
+.ui-datefield .ui-datefield-tab > div.ui-divider-2nd {
+  border-left: 1px solid #ffffff;
+}
+.ui-datefield .date,
+.ui-datefield .time,
+.ui-datefield .ui-datefield-tab {
+  display: inline-block;
+}
+.ui-datefield .ui-btn-box-s .ui-btn-inner.ui-btn-hastxt {
+  padding: 0;
+}
+.ui-datefield span.ui-datefield-year,
+.ui-datefield span.ui-datefield-month {
+  min-width: 1.9090909090909092rem;
+  /* except right&left padding */
+
+  padding: 0 0.2272727272727273rem;
+}
+.ui-datefield .ui-datefield-selected {
+  display: inline-block;
+}
+.ui-datefield .ui-datefield-selected.in {
+  -ms-animation: ui-datetime-in 0.3s 1 ease;
+  -o-animation: ui-datetime-in 0.3s 1 ease;
+  -moz-animation: ui-datetime-in 0.3s 1 ease;
+  -webkit-animation: ui-datetime-in 0.3s 1 ease;
+}
+.ui-datefield .ui-datefield-selected.out {
+  -ms-animation: ui-datetime-out 0.3s 1 ease;
+  -o-animation: ui-datetime-out 0.3s 1 ease;
+  -moz-animation: ui-datetime-out 0.3s 1 ease;
+  -webkit-animation: ui-datetime-out 0.3s 1 ease;
+}
+@media all and (orientation: landscape) and (device-aspect-ratio: 16/9) {
+  .ui-datefield > div > span {
+    min-width: 3.6136363636363638rem;
+  }
+  .ui-datefield span.ui-datefield-year,
+  .ui-datefield span.ui-datefield-month {
+    min-width: 5.204545454545455rem;
+    /* except right&left padding */
+  
+  }
+}
+.ui-datetime {
+  margin: 0;
+  height: 1.6363636363636365rem;
+}
+.ui-datetime-text-main {
+  position: relative;
+  top: 0 ;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  padding-top: 0.3em;
+}
+.ui-btn-picker {
+  line-height: 1.0909090909090908rem;
+}
+.ui-datefield-period.ui-btn {
+  width: 2.159090909090909rem;
+  line-height: 1.3636363636363638rem;
+  right: auto;
+  position: relative ! important;
+}
+.ui-datetime-text-sub {
+  top: 0.2272727272727273rem ! important;
+  color: #3b73b6 ! important;
+  background: transparent ! important;
+  font-size: 0.7272727272727273rem ! important;
+}
+.ui-datetimepicker-selector ul {
+  padding: 0;
+  display: inline;
+  list-style: none;
+  vertical-align: middle;
+  margin: 0;
+}
+.ui-datetimepicker-selector ul li {
+  font-size: 1rem;
+  float: left;
+  padding: 0.6818181818181819rem 0.18181818181818182rem 0 0.18181818181818182rem;
+  max-width: 5.454545454545455rem;
+  min-width: 2.7272727272727275rem;
+}
+.ui-datetimepicker-selector ul li a.ui-link {
+  text-decoration: none;
+  color: rgba(255, 255, 255, 0.7);
+}
+.ui-datetimepicker-selector ul li a.ui-link:hover {
+  color: rgba(255, 255, 255, 0.7);
+}
+.ui-datetimepicker-selector ul li.current a.ui-link {
+  color: #ffffff;
+}
+.ui-datetimepicker {
+  left: 0 !important;
+  padding: 0;
+}
+.ui-datetimepicker.ui-arrow-t {
+  margin-top: 0.2272727272727273rem;
+}
+.ui-datetimepicker.ui-arrow-b {
+  margin-top: -0.2272727272727273rem;
+}
+.ui-datetimepicker .ui-popupwindow-padding {
+  background: #5787c2 !important;
+  border-radius: 0 !important;
+  -ms-border-radius: 0 !important;
+  -o-border-radius: 0 !important;
+  -moz-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.409090909090909rem;
+}
+.ui-li-dialogue .ui-datefield {
+  margin-top: 0.4090909090909091rem;
+}
+.ui-li-dialogue .ui-datefield .ui-datefield-seperator,
+.ui-li-dialogue .ui-datefield .ui-datefield-tab {
+  margin-top: -1em;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/* Resource color mapping table
+
+@color_popup_title_bg:	popup_title_bg.png
+@color_popup_text_bg:	popup_bg.png
+@color_popup_button_bg:	popup_button_bg.png
+@color_popup_font:		Popup title & default
+@color_popup_text_font:	Popup text
+
+*/
+.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;
+  color: #f8f6ef;
+  background: #f8f6ef;
+}
+.ui-popupwindow .popup-title {
+  width: 100%;
+  height: 100%;
+  font-size: 1.0909090909090908rem;
+  background: #dbd9ce;
+}
+.ui-popupwindow .popup-title p {
+  margin: 0rem 0rem;
+  padding: 0.5909090909090909rem 0rem;
+}
+.ui-popupwindow .popup-text {
+  width: 100%;
+  color: #000000;
+  font-size: 1.0909090909090908rem;
+  background: #f8f6ef;
+}
+.ui-popupwindow .popup-text p {
+  text-align: center;
+  padding: 1rem 0.7272727272727273rem;
+}
+.ui-popupwindow .center_info {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+}
+.ui-popupwindow .center_title {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_basic_1btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_basic_1btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #d6d3c9;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_basic_1btn .popup-button-bg .ui-btn {
+  width: 18.272727272727273rem;
+  height: 3.3636363636363638rem;
+  margin: auto;
+}
+.ui-popupwindow .center_basic_2btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_basic_2btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #d6d3c9;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_basic_2btn .popup-button-bg .ui-btn {
+  width: 12.454545454545455rem;
+  height: 3.3636363636363638rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_basic_3btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_basic_3btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #d6d3c9;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_basic_3btn .popup-button-bg .ui-btn {
+  width: 8.454545454545455rem;
+  height: 3.3636363636363638rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_title_1btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_title_1btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #d6d3c9;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_title_1btn .popup-button-bg .ui-btn {
+  width: 18.272727272727273rem;
+  height: 3.3636363636363638rem;
+  margin: auto;
+}
+.ui-popupwindow .center_title_2btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_title_2btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #d6d3c9;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_title_2btn .popup-button-bg .ui-btn {
+  width: 12.454545454545455rem;
+  height: 3.3636363636363638rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_title_3btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_title_3btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #d6d3c9;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_title_3btn .popup-button-bg .ui-btn {
+  width: 8.454545454545455rem;
+  height: 3.3636363636363638rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_button_vertical {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_button_vertical .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #d6d3c9;
+  width: 100%;
+  padding-top: 1px;
+  padding-bottom: 0.7272727272727273rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_button_vertical .popup-button-bg .ui-btn {
+  width: 16.181818181818183rem;
+  height: 3.3636363636363638rem;
+  margin-top: 0.7272727272727273rem;
+  margin-bottom: 0rem;
+  margin-left: auto;
+  margin-right: auto;
+}
+.ui-popupwindow .center_checkbox {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_checkbox .popup-check-bg {
+  font-size: 1.0909090909090908rem;
+  background: #f8f6ef;
+  width: 100%;
+  padding-top: 0rem;
+  padding-bottom: 1rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_checkbox .popup-check-bg .ui-checkbox .ui-btn {
+  text-align: center;
+  background: #f8f6ef;
+  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.8181818181818182rem;
+  background: #d6d3c9;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_checkbox .popup-button-bg .ui-btn {
+  width: 12.454545454545455rem;
+  height: 3.3636363636363638rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_liststyle_1btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: #f8f6ef;
+  height: 23.272727272727273rem;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #d6d3c9;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-button-bg .ui-btn {
+  width: 18.272727272727273rem;
+  height: 3.3636363636363638rem;
+  margin: auto;
+}
+.ui-popupwindow .center_liststyle_2btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: #f8f6ef;
+  height: 23.272727272727273rem;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #d6d3c9;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-button-bg .ui-btn {
+  width: 12.454545454545455rem;
+  height: 3.3636363636363638rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_liststyle_3btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: #f8f6ef;
+  height: 23.272727272727273rem;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #d6d3c9;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-button-bg .ui-btn {
+  width: 8.454545454545455rem;
+  height: 3.3636363636363638rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_progressbar {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_progressbar .popup-text {
+  font-size: 1.1818181818181819rem;
+  font-color: #999999;
+  background: #f8f6ef;
+  width: 100%;
+  height: 3.181818181818182rem;
+}
+.ui-popupwindow .center_progressbar .popup-text p {
+  height: 100%;
+  text-align: center;
+  padding: 1rem 0.7272727272727273rem 0rem 0.7272727272727273rem;
+}
+.ui-popupwindow .center_progressbar .popup-text-bottom-bg {
+  font-size: 1.1818181818181819rem;
+  font-color: #999999;
+  background: #f8f6ef;
+  width: 100%;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_progressbar .popup-text-bottom-bg .text-left {
+  width: 40%;
+  height: 2.1818181818181817rem;
+  padding: 0rem 0.7272727272727273rem 0rem 0.7272727272727273rem;
+  text-align: left;
+  display: inline-block;
+}
+.ui-popupwindow .center_progressbar .popup-text-bottom-bg .text-right {
+  width: 40%;
+  height: 2.1818181818181817rem;
+  padding: 0rem 0.7272727272727273rem 0rem 0.7272727272727273rem;
+  text-align: right;
+  display: inline-block;
+}
+.ui-popupwindow .center_progressbar .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #d6d3c9;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_progressbar .popup-button-bg .ui-btn {
+  width: 18.272727272727273rem;
+  height: 3.3636363636363638rem;
+  margin: auto;
+}
+.ui-popupwindow .center_progressbar .popup-progress-bg {
+  background: #f8f6ef;
+  width: 100%;
+  height: 100%;
+}
+.ui-popupwindow .centertext_progressbar {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .centertext_progressbar .popup-text {
+  font-size: 1.1818181818181819rem;
+  font-color: #999999;
+  background: #f8f6ef;
+  width: 100%;
+  padding-top: 1rem;
+  padding-bottom: 0.7272727272727273rem;
+}
+.ui-popupwindow .centertext_progressbar .popup-text p {
+  text-align: center;
+}
+.ui-popupwindow .centertext_progressbar .popup-text-bottom-bg {
+  font-size: 1.1818181818181819rem;
+  font-color: #999999;
+  background: #f8f6ef;
+  width: 100%;
+  vertical-align: middle;
+}
+.ui-popupwindow .centertext_progressbar .popup-text-bottom-bg .text-left {
+  width: 40%;
+  height: 1.8181818181818183rem;
+  padding: 0.7272727272727273rem 0.7272727272727273rem 1rem 0.7272727272727273rem;
+  text-align: left;
+  display: inline-block;
+}
+.ui-popupwindow .centertext_progressbar .popup-text-bottom-bg .text-right {
+  width: 40%;
+  height: 1.8181818181818183rem;
+  padding: 0.7272727272727273rem 0.7272727272727273rem 1rem 0.7272727272727273rem;
+  text-align: right;
+  display: inline-block;
+}
+.ui-popupwindow .centertext_progressbar .popup-button-bg {
+  font-size: 0.8181818181818182rem;
+  background: #d6d3c9;
+  width: 100%;
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .centertext_progressbar .popup-button-bg .ui-btn {
+  width: 18.272727272727273rem;
+  height: 3.3636363636363638rem;
+  margin: auto;
+}
+.ui-popupwindow .centertext_progressbar .popup-progress-bg {
+  background: #f8f6ef;
+  width: 100%;
+  height: 100%;
+}
+.ui-popupwindow .ui-btn {
+  background: #f7f5ed;
+  background: -webkit-gradient(linear, left top, left bottom, from(#f7f5ed), to(#eceae2));
+  background: -moz-linear-gradient(top, #f7f5ed, #eceae2);
+  background: -ms-linear-gradient(top, #f7f5ed, #eceae2);
+  background: -o-linear-gradient(top, #f7f5ed, #eceae2);
+  color: #3a3a3a;
+}
+.ui-popupwindow .ui-btn.ui-btn-hover-s {
+  background: #f7f5ed;
+}
+.ui-popupwindow .ui-btn.ui-btn-down-s {
+  background: #007ad8;
+  background: -webkit-gradient(linear, left top, left bottom, from(#0066c4), to(#007ad8));
+  background: -moz-linear-gradient(top, #0066c4, #007ad8);
+  background: -ms-linear-gradient(top, #0066c4, #007ad8);
+  background: -o-linear-gradient(top, #0066c4, #007ad8);
+  color: #fafafa;
+}
+.ui-popupwindow > .ui-volumecontrol {
+  display: table;
+  margin: auto;
+  background: rgba(0, 0, 0, 0.666667);
+  width: 18.90909090909091rem;
+  height: 30.727272727272727rem;
+  padding-top: 1rem;
+}
+.ui-popupwindow > .ui-volumecontrol h1 {
+  font-size: 1.0909090909090908rem;
+  display: table;
+  margin: auto;
+  color: #c0c0c0;
+}
+.ui-popupwindow > .ui-volumecontrol .ui-volumecontrol-icon {
+  display: table;
+  width: 100%;
+  height: 5.818181818181818rem;
+  padding-top: 0.9545454545454546rem;
+  padding-bottom: 0.9545454545454546rem;
+  padding-left: 7.5rem;
+  padding-right: 7.5rem;
+}
+.ui-popupwindow > .ui-volumecontrol .ui-volumecontrol-indicator {
+  display: table;
+  width: 100%;
+  height: 19.09090909090909rem;
+  padding-left: 3.090909090909091rem;
+  padding-right: 3.090909090909091rem;
+}
+.ui-popupwindow > .ui-volumecontrol .ui-corner-all {
+  -o-border-radius: 0.3em !important;
+  -ms-border-radius: 0.3em !important;
+  -moz-border-radius: 0.3em !important;
+  -webkit-border-radius: 0.3em !important;
+  border-radius: 0.3em !important;
+}
+.ui-popupwindow-corner-all {
+  -o-border-radius: 0em !important;
+  -ms-border-radius: 0em !important;
+  -moz-border-radius: 0em !important;
+  -webkit-border-radius: 0em !important;
+  border-radius: 0em !important;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-ctxpopup {
+  display: table;
+}
+.ui-ctxpopup :focus {
+  outline: none;
+}
+.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: #444444;
+  border: none;
+  -ms-box-shadow: 0rem 0rem 0.5454545454545454rem rgba(0, 0, 0, 0.6);
+  -o-box-shadow: 0rem 0rem 0.5454545454545454rem rgba(0, 0, 0, 0.6);
+  -moz-box-shadow: 0rem 0rem 0.5454545454545454rem rgba(0, 0, 0, 0.6);
+  -webkit-box-shadow: 0rem 0rem 0.5454545454545454rem rgba(0, 0, 0, 0.6);
+  box-shadow: 0rem 0rem 0.5454545454545454rem rgba(0, 0, 0, 0.6);
+  -o-border-radius: 0.3em;
+  -ms-border-radius: 0.3em;
+  -moz-border-radius: 0.3em;
+  -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: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 {
+  max-width: 28.181818181818183rem;
+  border: none;
+}
+.ui-ctxpopup .ui-listview .ui-li {
+  color: #ffffff;
+  border-bottom-color: #2d2d2d;
+  border-bottom-width: 1px;
+  border-bottom-style: solid;
+  border-top-color: #5b5b5b;
+  border-top-width: 1px;
+  border-top-style: solid;
+  margin-left: 0;
+  margin-right: 0;
+}
+.ui-ctxpopup .ui-listview .ui-li:first-child {
+  border-top-width: 0;
+}
+.ui-ctxpopup .ui-listview .ui-li:last-child {
+  border-bottom-width: 0;
+}
+.ui-ctxpopup .ui-listview .ui-li .ui-btn-inner {
+  margin: 0;
+  padding-left: 0.4545454545454546rem;
+  padding-right: 0.4545454545454546rem;
+}
+.ui-ctxpopup .ui-listview li.ui-btn-up-s > .ui-li > .ui-btn-text > a.ui-link-inherit,
+.ui-ctxpopup .ui-listview li.ui-btn-hover-s > .ui-li > .ui-btn-text > a.ui-link-inherit,
+.ui-ctxpopup .ui-listview li.ui-btn-down-s > .ui-li > .ui-btn-text > a.ui-link-inherit {
+  color: #ffffff;
+}
+.ui-ctxpopup .horizontal {
+  color: #ffffff;
+}
+.ui-ctxpopup .horizontal .icon .ui-btn {
+  padding: 0;
+  background: transparent ! important;
+}
+.ui-ctxpopup .horizontal .icon .ui-btn .ui-btn-icon-only {
+  width: 4.363636363636363rem;
+  height: 2.909090909090909rem;
+  padding: 0;
+}
+.ui-ctxpopup .horizontal .icon .ui-btn .ui-icon {
+  top: 0;
+  height: inherit;
+  width: inherit;
+  margin: 0;
+  background-position: center;
+  -ms-background-size: 2.1818181818181817rem 2.1818181818181817rem;
+  -moz-background-size: 2.1818181818181817rem 2.1818181818181817rem;
+  -o-background-size: 2.1818181818181817rem 2.1818181818181817rem;
+  -webkit-background-size: 2.1818181818181817rem 2.1818181818181817rem;
+  background-size: 2.1818181818181817rem 2.1818181818181817rem;
+}
+.ui-ctxpopup .horizontal .text {
+  padding: 0 0.4545454545454546rem;
+  min-width: 2.1818181818181817rem;
+}
+.ui-ctxpopup .horizontal a.ui-link {
+  color: #ffffff;
+  text-decoration: none;
+}
+.ui-ctxpopup .horizontal ul {
+  padding: 0;
+  display: inline-block;
+  list-style: none;
+  vertical-align: middle;
+  margin: 0;
+}
+.ui-ctxpopup .horizontal li {
+  line-height: 1.4545454545454546rem;
+  min-height: 1.4545454545454546rem;
+  min-width: 2.1818181818181817rem;
+  float: left;
+  display: inline-block;
+  border-right: 1px solid #5b5b5b;
+  border-left: 1px solid #2d2d2d;
+  text-align: center;
+  border-bottom-width: 0;
+  border-top-width: 0;
+}
+.ui-ctxpopup .horizontal li:first-of-type {
+  border-top-left-radius: 0.3em;
+  border-bottom-left-radius: 0.3em;
+  border-top-right-radius: 0px ! important;
+  border-left: none;
+}
+.ui-ctxpopup .horizontal li:last-of-type {
+  border-top-right-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+  border-bottom-left-radius: 0px ! important;
+  border-right: none;
+}
+.ui-ctxpopup .horizontal .ui-li {
+  border-bottom-width: 0;
+  border-top-width: 0;
+}
+.ui-ctxpopup .horizontal .ui-li:first-child {
+  border-left-width: 0px;
+}
+.ui-ctxpopup .horizontal .ui-li:last-child {
+  border-right-width: 0px;
+}
+.ui-ctxpopup .horizontal li:active,
+.ui-ctxpopup .horizontal td:active {
+  background: #2a89c2;
+}
+.ui-ctxpopup .button table .ui-btn {
+  margin: 0rem;
+  padding: 0;
+  height: 2.5454545454545454rem;
+  width: 6rem;
+}
+.ui-ctxpopup .ui-scrollbar-thumb {
+  background-color: #acafb4;
+  opacity: 0.7;
+  border: 1px solid #343434;
+}
+.ui-arrow {
+  border-style: solid;
+  border-width: 10px;
+  width: 0;
+  height: 0px;
+  position: absolute;
+}
+.ui-arrow.top {
+  border-color: transparent transparent #444444 transparent;
+}
+.ui-arrow.left {
+  border-color: transparent transparent transparent #444444;
+}
+.ui-arrow.right {
+  border-color: transparent #444444 transparent transparent;
+}
+.ui-arrow.bottom {
+  border-color: #444444 transparent transparent transparent;
+}
+.ui-ctxpopup-container {
+  z-index: 1200;
+  display: inline-bloack;
+  position: absolute;
+  padding: 0;
+  outline: 0;
+}
+.ui-ctxpopup-container .ui-popup {
+  border: none;
+  background: #444444;
+  padding: 3px 2px 2px 2px;
+  -o-border-radius: 0.3em;
+  -ms-border-radius: 0.3em;
+  -moz-border-radius: 0.3em;
+  -webkit-border-radius: 0.3em;
+  border-radius: 0.3em;
+}
+.ui-ctxpopup-container .ui-listview li:first-child {
+  border-top-left-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
+.ui-ctxpopup-container .ui-listview .ui-li .ui-btn-inner {
+  border-width: 0px;
+}
+.poptop {
+  -webkit-transform-origin: 0% 0%;
+  -moz-transform-origin: 0% 0%;
+}
+.poptop.in {
+  -webkit-transform: scale(1);
+  -moz-transform: scale(1);
+  opacity: 1;
+  -webkit-animation-name: scalepopin;
+  -moz-animation-name: scalepopin;
+  -webkit-animation-duration: 350ms;
+  -moz-animation-duration: 350ms;
+}
+.poptop.out {
+  -webkit-animation-name: fadeout;
+  -moz-animation-name: fadeout;
+  opacity: 0;
+  -webkit-animation-duration: 100ms;
+  -moz-animation-duration: 100ms;
+}
+.poptop.in.reverse {
+  -webkit-animation-name: fadein;
+  -moz-animation-name: fadein;
+}
+.poptop.out.reverse {
+  -webkit-transform: scale(0.8);
+  -moz-transform: scale(0.8);
+  -webkit-animation-name: scalepopout;
+  -moz-animation-name: scalepopout;
+}
+@-webkit-keyframes scalepopin {
+  from {
+    -webkit-transform: scale(0.8);
+    opacity: 0;
+  }
+  to {
+    -webkit-transform: scale(1);
+    opacity: 1;
+  }
+}
+.popbottom {
+  -webkit-transform-origin: 0% 100%;
+  -moz-transform-origin: 0% 100%;
+}
+.popbottom.in {
+  -webkit-transform: scale(1);
+  -moz-transform: scale(1);
+  opacity: 1;
+  -webkit-animation-name: scalepopin;
+  -moz-animation-name: scalepopin;
+  -webkit-animation-duration: 350ms;
+  -moz-animation-duration: 350ms;
+}
+.popbottom.out {
+  -webkit-animation-name: fadeout;
+  -moz-animation-name: fadeout;
+  opacity: 0;
+  -webkit-animation-duration: 100ms;
+  -moz-animation-duration: 100ms;
+}
+.popbottom.in.reverse {
+  -webkit-animation-name: fadein;
+  -moz-animation-name: fadein;
+}
+.popbottom.out.reverse {
+  -webkit-transform: scale(0.8);
+  -moz-transform: scale(0.8);
+  -webkit-animation-name: scalepopout;
+  -moz-animation-name: scalepopout;
+}
+@-moz-keyframes scalepopin {
+  from {
+    -moz-transform: scale(0.8);
+    opacity: 0;
+  }
+  to {
+    -moz-transform: scale(1);
+    opacity: 1;
+  }
+}
+@-webkit-keyframes scalepopout {
+  from {
+    -webkit-transform: scale(1);
+    opacity: 1;
+  }
+  to {
+    -webkit-transform: scale(0.8);
+    opacity: 0;
+  }
+}
+@-moz-keyframes scalepopout {
+  from {
+    -moz-transform: scale(1);
+    opacity: 1;
+  }
+  to {
+    -moz-transform: scale(0.8);
+    opacity: 0;
+  }
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+@-webkit-keyframes ui-scale-animation {
+  from {
+    -webkit-transform: scaleX(0);
+  }
+  to {
+    -webkit-transform: scaleX(1);
+  }
+}
+.ui-progressbar-value {
+  min-width: 0.4090909090909091rem;
+  height: 100%;
+  -o-border-radius: 0.2272727272727273rem;
+  -ms-border-radius: 0.2272727272727273rem;
+  -moz-border-radius: 0.2272727272727273rem;
+  -webkit-border-radius: 0.2272727272727273rem;
+  border-radius: 0.2272727272727273rem;
+  box-shadow: 0px 1px 1px #ebebeb inset, 0px 1px 1px #666666;
+  background-color: #007dde;
+}
+.ui-progressbar-bg {
+  position: relative;
+  overflow: hidden;
+  top: 0.1590909090909091rem;
+  min-width: 0.5454545454545454rem;
+  height: 0.29545454545454547rem;
+  margin-left: 0.13636363636363635rem;
+  margin-right: 0.13636363636363635rem;
+  -o-border-radius: 0.2272727272727273rem;
+  -ms-border-radius: 0.2272727272727273rem;
+  -moz-border-radius: 0.2272727272727273rem;
+  -webkit-border-radius: 0.2272727272727273rem;
+  border-radius: 0.2272727272727273rem;
+  box-shadow: 0px 1px 1px #a4a4a4 inset, 0px 1px 1px #101010;
+  background-color: #c5c5c5;
+}
+.ui-progressbar {
+  position: relative;
+  margin-left: 0.8181818181818182rem;
+  margin-right: 0.8181818181818182rem;
+  height: 0.6136363636363636rem;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/* Progress - circle style */
+@-webkit-keyframes ui-rotate-animation {
+  from {
+    -webkit-transform: rotate(0deg);
+  }
+  to {
+    -webkit-transform: rotate(360deg);
+  }
+}
+.ui-progress-container-circle {
+  position: absolute;
+}
+.ui-li .ui-progress-container-circle {
+  top: 22%;
+}
+.ui-progress-circle {
+  position: relative;
+  top: 0;
+  height: 1.4545454545454546rem;
+  width: 1.4545454545454546rem;
+  background: url(images/00_list_process_01.png) no-repeat;
+  -ms-background-size: 1.4545454545454546rem 1.4545454545454546rem;
+  -moz-background-size: 1.4545454545454546rem 1.4545454545454546rem;
+  -o-background-size: 1.4545454545454546rem 1.4545454545454546rem;
+  -webkit-background-size: 1.4545454545454546rem 1.4545454545454546rem;
+  background-size: 1.4545454545454546rem 1.4545454545454546rem;
+}
+.ui-progress-circle-running {
+  -webkit-animation: ui-rotate-animation 1s infinite linear;
+}
+/* Progress - pending style */
+@-webkit-keyframes animate-stripes {
+  0% {
+    background-position: 0 0;
+  }
+  100% {
+    background-position: 2.3636363636363638rem 0;
+  }
+}
+.ui-progress-pending {
+  position: relative;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  padding-top: 0;
+  padding-bottom: 0;
+  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%, #007dde), color-stop(50%, #007dde), color-stop(50%, rgba(0, 0, 0, 0)), color-stop(75%, rgba(0, 0, 0, 0)), color-stop(75%, #007dde));
+  box-shadow: 0 1px 0 #ebebeb inset;
+  background-color: #c5c5c5;
+  -o-border-radius: 0.2272727272727273rem;
+  -ms-border-radius: 0.2272727272727273rem;
+  -moz-border-radius: 0.2272727272727273rem;
+  -webkit-border-radius: 0.2272727272727273rem;
+  border-radius: 0.2272727272727273rem;
+  -ms-background-size: 0.5909090909090909rem 0.5909090909090909rem;
+  -moz-background-size: 0.5909090909090909rem 0.5909090909090909rem;
+  -o-background-size: 0.5909090909090909rem 0.5909090909090909rem;
+  -webkit-background-size: 0.5909090909090909rem 0.5909090909090909rem;
+  background-size: 0.5909090909090909rem 0.5909090909090909rem;
+}
+.ui-progress-pending-running {
+  -webkit-animation: animate-stripes 1s linear infinite;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+label.ui-slider {
+  display: block;
+}
+select.ui-slider-switch {
+  display: none;
+}
+.ui-slider-container {
+  position: relative;
+  vertical-align: middle;
+  height: 0.6136363636363636rem;
+  padding-top: 0.4090909090909091rem;
+  padding-bottom: 0.4090909090909091rem;
+  margin-left: 0.8181818181818182rem;
+  margin-right: 0.8181818181818182rem;
+}
+.ui-li > .ui-slider-container {
+  margin-top: 0;
+  margin-bottom: 0;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+.ui-slider-left-volume,
+.ui-slider-left-bright {
+  position: absolute;
+  vertical-align: middle;
+  top: -0.5rem;
+  left: -2.272727272727273rem;
+  height: 1.6363636363636365rem;
+  width: 1.6363636363636365rem;
+  background: url(images/controls/00_slider_button_brightness_01.png) no-repeat;
+  -ms-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -moz-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -o-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -webkit-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  background-size: 1.6363636363636365rem 1.6363636363636365rem;
+}
+.ui-slider-left-volume {
+  background: url(images/controls/00_slider_button_volume_01.png) no-repeat;
+  -ms-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -moz-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -o-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -webkit-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  background-size: 1.6363636363636365rem 1.6363636363636365rem;
+}
+.ui-slider-right-volume,
+.ui-slider-right-bright {
+  position: absolute;
+  top: -0.5rem;
+  right: -2.272727272727273rem;
+  height: 1.6363636363636365rem;
+  width: 1.6363636363636365rem;
+  vertical-align: middle;
+  background: url(images/controls/00_slider_button_brightness_02.png) no-repeat;
+  -ms-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -moz-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -o-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -webkit-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  background-size: 1.6363636363636365rem 1.6363636363636365rem;
+}
+.ui-slider-right-volume {
+  background: url(images/controls/00_slider_button_volume_02.png) no-repeat;
+  -ms-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -moz-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -o-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -webkit-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  background-size: 1.6363636363636365rem 1.6363636363636365rem;
+}
+.ui-slider-left-text {
+  position: absolute;
+  top: -0.5rem;
+  height: 1.6818181818181819rem;
+  text-align: center;
+  color: #808080;
+}
+.ui-slider-right-text {
+  position: absolute;
+  top: -0.5rem;
+  height: 1.6818181818181819rem;
+  text-align: center;
+  color: #808080;
+}
+div.ui-slider:not(.ui-toggle-switch) {
+  position: relative;
+  top: 0.20454545454545456rem;
+  height: 0.29545454545454547rem;
+  margin-left: 0.18181818181818182rem;
+  margin-right: 0.18181818181818182rem;
+  -o-border-radius: 0.4545454545454546rem;
+  -ms-border-radius: 0.4545454545454546rem;
+  -moz-border-radius: 0.4545454545454546rem;
+  -webkit-border-radius: 0.4545454545454546rem;
+  border-radius: 0.4545454545454546rem;
+  -o-box-shadow: 0px 0px 2px #686665;
+  -ms-box-shadow: 0px 0px 2px #686665;
+  -moz-box-shadow: 0px 0px 2px #686665;
+  -webkit-box-shadow: 0px 0px 2px #686665;
+  box-shadow: 0px 0px 2px #686665;
+  background-color: #c5c5c5;
+}
+div.ui-slider:not(.ui-toggle-switch) .ui-btn {
+  top: -0.75rem;
+  margin-top: 0;
+}
+div.ui-slider:not(.ui-toggle-switch) .ui-btn-inner {
+  padding: 0.3rem 0 0 0;
+}
+div.ui-slider:not(.ui-toggle-switch) .ui-btn-text {
+  color: #3b73b6;
+}
+div.ui-slider:not(.ui-toggle-switch) a.ui-slider-handle-press {
+  background-image: url(images/controls/00_slider_handle_press.png);
+}
+div.ui-slider:not(.ui-toggle-switch) a.ui-slider-handle-press .ui-btn-text {
+  color: #fafafa;
+}
+a.ui-slider-handle {
+  position: relative;
+  z-index: 10;
+  width: 1.6363636363636365rem;
+  height: 1.6363636363636365rem;
+  margin-left: -0.8181818181818182rem;
+  color: #3b73b6;
+  font-size: 0.95rem;
+  background: url(images/controls/00_slider_handle.png) no-repeat;
+  -ms-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -moz-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -o-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -webkit-background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  background-size: 1.6363636363636365rem 1.6363636363636365rem;
+  -o-box-shadow: none;
+  -ms-box-shadow: none;
+  -moz-box-shadow: none;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.ui-slider-popup {
+  position: absolute !important;
+  z-index: 1210;
+  width: 2.0454545454545454rem;
+  height: 2.4545454545454546rem;
+  padding-top: 0.1rem;
+  color: #fafafa;
+  text-align: center;
+  font-size: 1.5rem;
+  background: url(images/controls/00_slider_popup_bg.png) no-repeat;
+  -ms-background-size: 2.0454545454545454rem 2.4545454545454546rem;
+  -moz-background-size: 2.0454545454545454rem 2.4545454545454546rem;
+  -o-background-size: 2.0454545454545454rem 2.4545454545454546rem;
+  -webkit-background-size: 2.0454545454545454rem 2.4545454545454546rem;
+  background-size: 2.0454545454545454rem 2.4545454545454546rem;
+}
+.ui-slider-bg {
+  position: absolute;
+  height: 0.29545454545454547rem;
+  width: 0;
+  -o-border-radius: 0.4545454545454546rem;
+  -ms-border-radius: 0.4545454545454546rem;
+  -moz-border-radius: 0.4545454545454546rem;
+  -webkit-border-radius: 0.4545454545454546rem;
+  border-radius: 0.4545454545454546rem;
+  -o-box-shadow: 0px 0px 2px #686665;
+  -ms-box-shadow: 0px 0px 2px #686665;
+  -moz-box-shadow: 0px 0px 2px #686665;
+  -webkit-box-shadow: 0px 0px 2px #686665;
+  box-shadow: 0px 0px 2px #686665;
+  background-color: #007dde;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-gallery {
+  position: relative;
+  width: 100%;
+}
+.ui-gallery-bg {
+  display: none;
+  position: absolute;
+  text-align: center;
+  width: 100%;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/* tickernoti */
+@-webkit-keyframes ui-ticker-show {
+  from {
+    opacity: 0;
+    -webkit-transform: translateY(-2.272727272727273rem);
+    top: -2.272727272727273rem;
+  }
+  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.272727272727273rem);
+    top: -2.272727272727273rem;
+  }
+}
+.ui-ticker {
+  position: fixed;
+  display: none;
+  left: 0;
+  width: 100%;
+  height: 2.272727272727273rem;
+  z-index: 2147483547;
+  background: #222222;
+}
+.ui-ticker.fix {
+  display: block;
+  top: 0;
+}
+.ui-ticker.show {
+  display: block;
+  -ms-animation: ui-ticker-show 0.8s 1 ease;
+  -o-animation: ui-ticker-show 0.8s 1 ease;
+  -moz-animation: ui-ticker-show 0.8s 1 ease;
+  -webkit-animation: ui-ticker-show 0.8s 1 ease;
+  top: 0;
+}
+.ui-ticker.hide {
+  display: block;
+  -o-animation: ui-ticker-hide 0.8s 1 ease;
+  -ms-animation: ui-ticker-hide 0.8s 1 ease;
+  -webkit-animation: ui-ticker-hide 0.8s 1 ease;
+  top: -2.272727272727273rem;
+}
+.ui-ticker-btn {
+  position: relative;
+  margin-top: 0.4545454545454546rem;
+  margin-left: 0.36363636363636365rem;
+  margin-right: 0.36363636363636365rem;
+  vertical-align: middle;
+  float: right;
+}
+.ui-ticker-btn .ui-btn-inner {
+  padding: 0.15rem 0 0 0;
+  height: 1.2727272727272727rem;
+  width: 3.5rem;
+  font-size: 0.81rem;
+}
+.ui-ticker-icon {
+  position: absolute;
+  top: 0;
+  height: 1.4545454545454546rem;
+  width: 1.4545454545454546rem;
+  margin-top: 0.4090909090909091rem;
+  margin-bottom: 0.4090909090909091rem;
+  margin-left: 0.36363636363636365rem;
+  margin-right: 0.36363636363636365rem;
+  vertical-align: middle;
+}
+.ui-ticker-text1-bg {
+  position: absolute;
+  top: 0;
+  height: 0.8181818181818182rem;
+  left: 2.1818181818181817rem;
+  margin-top: 0.36363636363636365rem;
+  font-size: 0.68rem;
+  color: #fafafa;
+}
+.ui-ticker-text2-bg {
+  position: absolute;
+  top: 0;
+  height: 0.7272727272727273rem;
+  left: 2.1818181818181817rem;
+  margin-top: 1.1818181818181819rem;
+  font-size: 0.54rem;
+  color: #fafafa;
+}
+/* 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;
+    left: 0;
+    -webkit-transform: scaleY(1);
+  }
+  to {
+    opacity: 0;
+    left: 0;
+    -webkit-transform: scaleY(0);
+  }
+}
+.ui-smallpopup {
+  position: fixed;
+  display: none;
+  left: 0;
+  width: 100%;
+  z-index: 1100;
+  background: -webkit-linear-gradient(top, #f8f6ef 0%, #999999 18%, #444444 20%, #444444 100%);
+  vertical-align: middle;
+  font-size: 0.72rem;
+  word-break: break-all;
+}
+.ui-smallpopup.fix {
+  display: block;
+}
+.ui-smallpopup.show {
+  display: block;
+  -moz-animation: ui-smallpopup-show 0.5s 1 ease;
+  -ms-animation: ui-smallpopup-show 0.5s 1 ease;
+  -o-animation: ui-smallpopup-show 0.5s 1 ease;
+  -webkit-animation: ui-smallpopup-show 0.5s 1 ease;
+}
+.ui-smallpopup.hide {
+  display: block;
+  left: -100%;
+  -moz-animation: ui-smallpopup-hide 0.5s 1 ease;
+  -ms-animation: ui-smallpopup-hide 0.5s 1 ease;
+  -o-animation: ui-smallpopup-hide 0.5s 1 ease;
+  -webkit-animation: ui-smallpopup-hide 0.5s 1 ease;
+}
+.ui-smallpopup-text-bg {
+  position: relative;
+  margin-top: 0.18181818181818182rem;
+  margin-bottom: 0.18181818181818182rem;
+  margin-left: 0.36363636363636365rem;
+  margin-right: 0.36363636363636365rem;
+  padding-top: 0.36363636363636365rem;
+  color: #ffffff;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-swipe {
+  padding: 0 !important;
+  list-style-type: none;
+}
+.ui-swipe-item {
+  height: 2.5454545454545454rem;
+  -ms-user-select: none;
+  -o-user-select: none;
+  -moz-user-select: none;
+  -webkit-user-select: none;
+  -user-select: none;
+  opacity: 0;
+  text-align: center;
+  background-color: #edebe4;
+  margin-left: -0.5909090909090909rem;
+  margin-right: -0.5909090909090909rem;
+}
+.ui-swipe-item .ui-btn {
+  margin-top: -0.8181818181818182rem ! important;
+  position: relative ! important;
+}
+.ui-swipe-item p {
+  margin: 0;
+}
+.ui-swipe-item-cover {
+  position: absolute;
+  border: none;
+  top: 0%;
+  left: 0%;
+  width: 100%;
+  height: 100%;
+  z-index: 100;
+}
+.ui-swipe-item-cover .ui-swipe-item-cover-inner {
+  position: absolute;
+  padding-top: 0.6818181818181819rem;
+  padding-bottom: 0.6818181818181819rem;
+  padding-left: 0.36363636363636365rem;
+  width: 100%;
+  text-align: left;
+}
+.ui-swipe-item-cover .ui-swipe-item-cover-inner .ui-li-text-sub {
+  position: absolute;
+  padding-right: 0.7272727272727273rem;
+}
+.ui-swipe-item-cover p {
+  margin: 0;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-fastscroll {
+  position: absolute;
+  right: 0;
+  width: 1.0681818181818181rem;
+  -ms-user-select: none;
+  -o-user-select: none;
+  -moz-user-select: none;
+  -webkit-user-select: none;
+  user-select: none;
+  margin: 0;
+  padding-left: 1px;
+  padding-right: 0.045454545454545456rem;
+  opacity: 1;
+  background: -webkit-linear-gradient(left, transparent 1px, #f8f6ef 1px, #f8f6ef 0.13636363636363635rem, #e2dfd5 0.13636363636363635rem, #e2dfd5 1.0909090909090908rem, #f8f6ef 1.0909090909090908rem, #f8f6ef);
+  background-color: #d1cfc9;
+}
+.ui-fastscroll ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+.ui-fastscroll li {
+  cursor: pointer;
+  color: #a09f9a;
+  background: #f8f6ef;
+  text-align: center;
+  vertical-align: middle;
+  font-size: 0.5909090909090909rem;
+  font-weight: bold;
+  height: 0.5909090909090909rem;
+  border: 0.06818181818181818rem solid transparent;
+  margin-bottom: 1px;
+}
+.ui-fastscroll.ui-fastscroll-hover {
+  background-color: #3b73b6;
+}
+li.ui-fastscroll-hover {
+  position: relative;
+  left: -1px;
+  margin-top: -1px;
+  margin-bottom: 0;
+  padding-top: 1px;
+  padding-bottom: 1px;
+  width: 1rem;
+  color: #3b73b6;
+  border-color: #3b73b6;
+  border-left-width: 0;
+  padding-left: 1px;
+}
+li.ui-fastscroll-hover-first-item {
+  margin-top: 0;
+  padding-top: 0;
+}
+.ui-fastscroll-popup {
+  position: absolute;
+  background: #3b73b6;
+  color: #ffffff;
+  padding: 0.4545454545454546rem;
+  border: 1px solid #112e51;
+  border-radius: 2px;
+  text-align: center;
+  font-size: 3.409090909090909rem;
+  font-weight: bold;
+  display: none;
+  box-sizing: border-box;
+  left: 50%;
+  top: 50%;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+div.ui-slider.ui-toggle-switch {
+  position: relative;
+  width: 3.090909090909091rem;
+  height: 1.4545454545454546rem;
+  background-image: url(images/00_button_on_off_bg.png);
+  background-size: 100% 100%;
+}
+div.ui-slider.ui-toggle-switch .ui-slider-label {
+  position: absolute;
+  background-size: 100% 100%;
+  background-repeat: no-repeat;
+  background-color: transparent;
+}
+div.ui-slider.ui-toggle-switch .ui-slider-inneroffset {
+  position: relative;
+  margin-left: 0.8181818181818182rem;
+  margin-right: 1.0454545454545454rem;
+}
+div.ui-slider.ui-toggle-switch a.ui-slider-handle {
+  position: absolute;
+  width: 1.8636363636363638rem;
+  height: 1.4545454545454546rem;
+  -webkit-background-size: 100% 100%;
+  margin-top: 0rem;
+}
+div.ui-slider.ui-toggle-switch a.ui-slider-handle.ui-toggle-on {
+  background-image: url(images/00_button_on_handler.png);
+  padding-right: 0;
+}
+div.ui-slider.ui-toggle-switch a.ui-slider-handle.ui-toggle-off {
+  background-image: url(images/00_button_off_handler.png);
+  padding-right: 0;
+}
+div.ui-slider.ui-toggle-switch a.ui-slider-handle-snapping {
+  -webkit-transition: left 70ms linear;
+}
+.ui-slider-switch:not(.ui-toggle-switch) {
+  width: 4.181818181818182rem;
+}
+div.ui-slider.ui-slider-switch:not(.ui-toggle-switch) {
+  position: relative;
+  margin-top: 0.2272727272727273rem;
+  margin-bottom: 0.2272727272727273rem;
+  height: 1.4545454545454546rem;
+  top: 0;
+  margin: 0.2272727272727273rem;
+  border-radius: 0.6818181818181819rem;
+}
+div.ui-slider.ui-slider-switch:not(.ui-toggle-switch) .ui-slider-inneroffset {
+  position: relative;
+  margin: -1px 0.7272727272727273rem;
+  z-index: 1;
+}
+div.ui-slider.ui-slider-switch:not(.ui-toggle-switch) a.ui-slider-handle {
+  position: absolute;
+  background: #ffffff;
+  background-image: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 50, from(#f9f9f9), to(#323232));
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+  top: 50%;
+  margin: 1px 0 0 -0.6818181818181819rem;
+  border-radius: 0.6818181818181819rem;
+  border: 2px solid gray;
+  width: 1.2727272727272727rem;
+  height: 1.2727272727272727rem;
+}
+div.ui-slider.ui-slider-switch:not(.ui-toggle-switch) a.ui-slider-handle-snapping {
+  -webkit-transition: left 70ms linear;
+}
+div.ui-slider.ui-slider-switch:not(.ui-toggle-switch) span {
+  position: absolute;
+  overflow: hidden;
+  text-align: center;
+  height: 1.4545454545454546rem;
+  font-weight: bold;
+  font-size: 0.7272727272727273rem;
+  border-radius: 0.6818181818181819rem;
+  white-space: nowrap;
+  line-height: 2;
+}
+div.ui-slider.ui-slider-switch:not(.ui-toggle-switch) span.ui-slider-label-a {
+  left: 0px;
+  color: white;
+  z-index: 1;
+  text-indent: -1.5em;
+}
+div.ui-slider.ui-slider-switch:not(.ui-toggle-switch) span.ui-slider-label-b {
+  right: 0px;
+  color: #000000;
+  z-index: 0;
+  text-indent: 1.5em;
+}
+.ui-slider-switch .ui-slider-handle .ui-btn-inner {
+  padding: 0;
+}
+.ui-triangle-container {
+  position: relative;
+}
+.ui-triangle-container .ui-triangle {
+  position: absolute;
+  border-style: solid;
+  border-color: transparent;
+  border-width: 10px;
+}
+.ui-triangle-container .ui-triangle-top {
+  top: 0px;
+  border-top-width: 0px;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  margin-left: -10px;
+}
+.ui-triangle-container .ui-triangle-bottom {
+  bottom: 0px;
+  border-bottom-width: 0px;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  margin-left: -10px;
+}
+.ui-triangle-container .ui-triangle-left {
+  left: 0px;
+  margin-top: -10px;
+  border-left-width: 0px;
+  border-left-color: transparent;
+  border-right-color: transparent;
+}
+.ui-triangle-container .ui-triangle-right {
+  right: 0px;
+  margin-top: -10px;
+  border-right-width: 0px;
+  border-left-color: transparent;
+  border-right-color: transparent;
+}
+.ui-triangle-container-top {
+  height: 10px;
+  top: 0px;
+  margin-top: -10px;
+}
+.ui-triangle-container-bottom {
+  height: 10px;
+  bottom: 0px;
+  margin-bottom: -10px;
+}
+.ui-triangle-container-left {
+  width: 10px;
+}
+.ui-triangle-container-right {
+  width: 10px;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-tokentextarea {
+  display: table;
+  outline: none;
+  position: relative;
+  background-color: #f8f6ef;
+}
+.ui-tokentextarea .ui-tokentextarea-label {
+  display: inline-block;
+  position: relative;
+  margin-left: .3em;
+  margin-right: .3em;
+  padding: .6em 0em;
+  color: #666666;
+  font-weight: bold;
+  text-align: center;
+  font-size: 1em;
+}
+.ui-tokentextarea-input {
+  outline: none;
+  position: relative;
+  border: 0 !important;
+  padding: 0 !important;
+  margin: .5em;
+  color: #222222;
+  background-color: #f8f6ef !important;
+  text-align: left;
+  font-size: 1em;
+}
+.ui-tokentextarea-input-visible {
+  display: inline-block !important;
+}
+.ui-tokentextarea-input-invisible {
+  display: none !important;
+}
+.ui-tokentextarea div {
+  display: inline-block;
+  text-align: center;
+  cursor: pointer;
+  position: relative;
+  margin: .3em;
+  padding: .2em .5em;
+  font-size: 1em;
+  text-shadow: 0 2px rgba(0, 0, 0, 0.75);
+  -ms-border-radius: .2em;
+  -o-border-radius: .2em;
+  -webkit-border-radius: .2em;
+  -moz-border-radius: .2em;
+  border-radius: .2em;
+  -o-box-shadow: 0 0.1em 0.1em rgba(0, 0, 0, 0.2);
+  -ms-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);
+  -webkit-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: #ffffff;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+div.ui-tokentextarea-block {
+  background-color: #769dcc;
+  border: 1px solid #6c7483;
+}
+div.ui-tokentextarea-sblock {
+  background-color: #4093f7;
+  border: 1px solid #595e6a;
+}
+.ui-tokentextarea .ui-tokentextarea-desclabel {
+  display: inline-block;
+  outline: none;
+  position: relative;
+  border: 0;
+  color: #666666;
+  text-align: left;
+  font-size: 1em;
+}
+.ui-tokentextarea-link-base {
+  position: absolute;
+  right: 0em;
+  bottom: 2px;
+  margin-right: 0.4090909090909091rem;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-handler {
+  position: absolute;
+  overflow: hidden;
+  opacity: 0;
+}
+.ui-handler-visible {
+  opacity: 1;
+}
+.ui-handler-direction-y {
+  top: 0.2272727272727273rem;
+  right: 0rem;
+  bottom: 0.2272727272727273rem;
+  width: 0.8181818181818182rem;
+}
+.ui-handler-direction-x {
+  right: 0.2272727272727273rem;
+  bottom: 0rem;
+  left: 0.2272727272727273rem;
+  height: 0.8181818181818182rem;
+}
+.ui-handler-track {
+  position: relative;
+  width: 100%;
+  height: 100%;
+}
+.ui-handler-handle {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+.ui-handler-direction-x .ui-handler-handle {
+  width: 5.318181818181818rem;
+  height: 0.8181818181818182rem;
+}
+.ui-handler-direction-y .ui-handler-handle {
+  width: 0.8181818181818182rem;
+  height: 5.318181818181818rem;
+}
+.ui-handler-thumb {
+  background-position: center;
+  background-repeat: no-repeat;
+  -o-border-radius: 0.25rem;
+  -ms-border-radius: 0.25rem;
+  -moz-border-radius: 0.25rem;
+  -webkit-border-radius: 0.25rem;
+  border-radius: 0.25rem;
+}
+.ui-handler-direction-y .ui-handler-thumb {
+  width: 0.5227272727272727rem;
+  height: 5.204545454545455rem;
+  -ms-background-size: 0.5227272727272727rem 0.8409090909090909rem;
+  -moz-background-size: 0.5227272727272727rem 0.8409090909090909rem;
+  -o-background-size: 0.5227272727272727rem 0.8409090909090909rem;
+  -webkit-background-size: 0.5227272727272727rem 0.8409090909090909rem;
+  background-size: 0.5227272727272727rem 0.8409090909090909rem;
+}
+.ui-handler-direction-x .ui-handler-thumb {
+  width: 5.204545454545455rem;
+  height: 0.5227272727272727rem;
+  -ms-background-size: 0.8409090909090909rem 0.5227272727272727rem;
+  -moz-background-size: 0.8409090909090909rem 0.5227272727272727rem;
+  -o-background-size: 0.8409090909090909rem 0.5227272727272727rem;
+  -webkit-background-size: 0.8409090909090909rem 0.5227272727272727rem;
+  background-size: 0.8409090909090909rem 0.5227272727272727rem;
+}
+/* S
+-----------------------------------------------------------------------------------------------------------*/
+.ui-handler-s .ui-handler-thumb {
+  background-color: #c6c4be;
+  -o-box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.09090909090909091rem #000000;
+  -ms-box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.09090909090909091rem #000000;
+  -moz-box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.09090909090909091rem #000000;
+  -webkit-box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.09090909090909091rem #000000;
+  box-shadow: 0.045454545454545456rem 0.045454545454545456rem 0.09090909090909091rem #000000;
+}
+.ui-handler-s .ui-handler-direction-y .ui-handler-thumb {
+  background-image: url("images/00_scroll_bar_handler.png");
+}
+.ui-handler-s .ui-handler-direction-x .ui-handler-thumb {
+  background-image: url("images/00_scroll_bar_handler_hor.png");
+}
+/*
+ * 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
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-virtualgrid {
+  overflow: hidden;
+  position: absolute;
+}
+.ui-virtualgrid-wrapblock {
+  position: absolute;
+  left: 0;
+}
+.ui-virtualgrid-wrapblock-x {
+  float: left;
+  overflow: hidden;
+}
+.ui-scrollbar-thumb-x {
+  width: 1.5rem !important;
+}
+.ui-scrollbar-thumb-y {
+  height: 1.5rem !important;
+}
+.ui-virtualgrid-overflow-indicator-x-top {
+  position: absolute;
+  display: block;
+  left: 0;
+  top: 0;
+  width: 56%;
+  height: 100%;
+  opacity: 0;
+  background-repeat: no-repeat;
+  -webkit-background-size: 100% 100%;
+  background-image: url(./images/00_grid_overscrolling_left.png);
+  pointer-events: none;
+}
+.ui-virtualgrid-overflow-indicator-x-bottom {
+  position: absolute;
+  display: block;
+  right: 0;
+  bottom: 0;
+  width: 56%;
+  height: 100%;
+  opacity: 0;
+  background-repeat: no-repeat;
+  -webkit-background-size: 100% 100%;
+  background-image: url(./images/00_grid_overscrolling_right.png);
+  pointer-events: none;
+}
+.ui-virtualgrid-overflow-indicator-y-top {
+  position: absolute;
+  display: block;
+  top: 0;
+  width: 100%;
+  height: 32%;
+  opacity: 0;
+  background-repeat: no-repeat;
+  -webkit-background-size: 100% 100%;
+  background-image: url(./images/00_grid_overscrolling_top.png);
+  pointer-events: none;
+}
+.ui-virtualgrid-overflow-indicator-y-bottom {
+  position: absolute;
+  display: block;
+  bottom: 0;
+  width: 100%;
+  height: 32%;
+  opacity: 0;
+  background-repeat: no-repeat;
+  -webkit-background-size: 100% 100%;
+  background-image: url(./images/00_grid_overscrolling_bottom.png);
+  pointer-events: none;
+}
+/*
+ * padding here set to zero - otherwise the list scrolls underneith the top heading and can be seen above it
+ */
+.ui-content.ui-virtualgrid-content {
+  padding: 0;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-multimediaview {
+  background-color: #f9f9f9;
+  overflow: hidden;
+}
+.ui-multimediaview-wrap {
+  width: 100%;
+  padding: 0;
+  position: relative;
+  overflow: hidden;
+}
+.ui-multimediaview-siblings-off {
+  display: none !important;
+}
+.ui-multimediaview-control span {
+  display: inline-block;
+}
+.ui-multimediaview-video {
+  position: absolute;
+}
+.ui-multimediaview-control {
+  display: block;
+  z-index: 1002;
+  padding: 0;
+  margin: 0;
+  outline: 0;
+  border: 0;
+  height: 1.9090909090909092rem;
+  text-align: left;
+  overflow: hidden;
+}
+.ui-multimediaview-control span.ui-button {
+  background-position: center center;
+  background-size: 80%;
+  background-repeat: no-repeat;
+  width: 1.6818181818181819rem;
+  height: 1.6818181818181819rem;
+  margin: 0.09090909090909091rem;
+}
+.ui-multimediaview-control .ui-playpausebutton {
+  float: left;
+}
+.ui-multimediaview-control .ui-timestamplabel {
+  text-align: center;
+  float: left;
+}
+.ui-multimediaview-control .ui-timestamplabel p {
+  margin-top: -0.22272727272727275rem;
+  margin-left: 0.09090909090909091rem;
+  padding: 0;
+  text-align: center;
+  font-size: 0.5rem;
+  line-height: 0.6363636363636364rem;
+  text-align: left;
+}
+.ui-multimediaview-control .ui-durationlabel {
+  text-align: center;
+  float: right;
+}
+.ui-multimediaview-control .ui-durationlabel p {
+  margin-top: -0.22272727272727275rem;
+  margin-right: 0.09090909090909091rem;
+  padding: 0;
+  text-align: center;
+  font-size: 0.5rem;
+  line-height: 0.6363636363636364rem;
+  text-align: right;
+}
+.ui-multimediaview-bar {
+  margin-top: 0.22272727272727275rem;
+  float: left;
+}
+.ui-multimediaview-bar-bg {
+  height: 0.29545454545454547rem;
+  border-radius: 1.5em;
+}
+.ui-multimediaview-bar-highlight {
+  height: 0.29545454545454547rem;
+  position: absolute;
+  border-radius: 1.5em;
+}
+.ui-multimediaview-control .ui-seekbar {
+  margin-left: 0.09090909090909091rem;
+}
+.ui-multimediaview-control .ui-seekbar .ui-duration {
+  width: 100%;
+}
+.ui-multimediaview-control .ui-volumecontrol {
+  width: 5rem;
+  height: 100%;
+  float: left;
+}
+.ui-multimediaview-control .ui-volumecontrol .ui-volumebar {
+  margin-left: 0.6818181818181819rem;
+}
+.ui-multimediaview-control .ui-volumecontrol .ui-volumebar .ui-guide {
+  width: 3.8636363636363638rem;
+}
+.ui-multimediaview-control .ui-volumecontrol .ui-volumebar .ui-handle {
+  margin: 0;
+  padding: 0;
+  width: 0.6818181818181819rem;
+  height: 0.6818181818181819rem;
+}
+.ui-fullscreen-parents {
+  padding: 0 !important;
+  margin: 0 !important;
+  width: 100% !important;
+  height: 100% !important;
+  overflow: hidden;
+}
+/* S
+-----------------------------------------------------------------------------------------------------------*/
+.ui-multimediaview-s .ui-multimediaview-video {
+  background-color: rgba(248, 246, 239, 0.5);
+}
+.ui-multimediaview-s .ui-timestamplabel {
+  color: #4a84c9;
+}
+.ui-multimediaview-s .ui-durationlabel {
+  color: #808080;
+}
+.ui-multimediaview-s span.ui-button {
+  background-color: #f7f5ed;
+  -o-box-shadow: 0.5px 1px 1px #85837e;
+  -ms-box-shadow: 0.5px 1px 1px #85837e;
+  -moz-box-shadow: 0.5px 1px 1px #85837e;
+  -webkit-box-shadow: 0.5px 1px 1px #85837e;
+  box-shadow: 0.5px 1px 1px #85837e;
+}
+.ui-multimediaview-s span.ui-button-down {
+  background-color: #007ad8;
+}
+.ui-multimediaview-s span.ui-play-icon {
+  background-image: url(./images/00_button_play.png);
+}
+.ui-multimediaview-s span.ui-pause-icon {
+  background-image: url(./images/00_button_pause.png);
+}
+.ui-multimediaview-s span.ui-volume-icon {
+  background-image: url(./images/controls/00_slider_button_volume_02.png);
+}
+.ui-multimediaview-s span.ui-mute-icon {
+  background-image: url(./images/controls/00_slider_button_volume_01.png);
+}
+.ui-multimediaview-s span.ui-fullscreen-on {
+  background-image: url(./images/00_button_fullscreen_on.png);
+}
+.ui-multimediaview-s span.ui-fullscreen-off {
+  background-image: url(./images/00_button_fullscreen_off.png);
+}
+.ui-multimediaview-s .ui-seekbar .ui-duration {
+  background-color: #cbc8c5;
+}
+.ui-multimediaview-s .ui-seekbar .ui-currenttime {
+  background-color: #4a84c9;
+  box-shadow: 0px -1px 1px #686665 inset;
+}
+.ui-multimediaview-s .ui-volumebar .ui-guide {
+  background-color: #cbc8c5;
+}
+.ui-multimediaview-s .ui-volumebar .ui-value {
+  background-color: #4a84c9;
+  box-shadow: 0px -1px 1px #686665 inset;
+}
+.ui-multimediaview-s .ui-volumebar .ui-handle {
+  background-color: #fafafa;
+  -o-box-shadow: inset 0px -1px 1px #000000;
+  -ms-box-shadow: inset 0px -1px 1px #000000;
+  -moz-box-shadow: inset 0px -1px 1px #000000;
+  -webkit-box-shadow: inset 0px -1px 1px #000000;
+  box-shadow: inset 0px -1px 1px #000000;
+}
+.ui-multimediaview-s .ui-volumebar .ui-button-down {
+  background-color: #007ad8;
+  -o-box-shadow: inset 0px 1px 1px #000000;
+  -ms-box-shadow: inset 0px 1px 1px #000000;
+  -moz-box-shadow: inset 0px 1px 1px #000000;
+  -webkit-box-shadow: inset 0px 1px 1px #000000;
+  box-shadow: inset 0px 1px 1px #000000;
+}
+.ui-popup-screen {
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	border: 0;
+	position: absolute;
+	filter: Alpha(Opacity=50);
+	opacity: 0;
+}
+
+.ui-popup-screen-background-hack {
+	background-color: black;
+	filter: Alpha(Opacity=0);
+}
+
+@-webkit-keyframes popup-fadein {
+    from { opacity: 0; }
+    to { opacity: 0.5; }
+}
+
+@-moz-keyframes popup-fadein {
+    from { opacity: 0; }
+    to { opacity: 0.5; }
+}
+
+@-webkit-keyframes popup-fadeout {
+    from { opacity: 0.5; }
+    to { opacity: 0; }
+}
+
+@-moz-keyframes popup-fadeout {
+    from { opacity: 0.5; }
+    to { opacity: 0; }
+}
+
+.ui-popup-screen.fade.in {
+	opacity: 0.5;
+	-webkit-animation-name: popup-fadein;
+	-moz-animation-name: popup-fadein;
+}
+
+.ui-popup-screen.fade.out {
+	opacity: 0;
+	-webkit-animation-name: popup-fadeout;
+	-moz-animation-name: popup-fadeout;
+}
+
+.ui-popup.ui-content,
+.ui-popup .ui-content {
+	overflow: visible;
+}
+
+.ui-popup > img {
+	width: auto;
+	height: auto;
+	max-width: 100%;
+	max-height: 100%;
+	vertical-align: middle;
+}
+.ui-popup iframe {
+	vertical-align: middle;
+}
+
+@media all and (min-width: 450px){
+	.ui-popup .ui-field-contain label.ui-submit,
+	.ui-popup .ui-field-contain .ui-controlgroup-label,
+	.ui-popup .ui-field-contain label.ui-select,
+	.ui-popup .ui-field-contain label.ui-input-text {
+		font-size: 16px; line-height: 1.4; display: block; font-weight: normal; margin: 0 0 .3em;
+	}
+	.ui-popup .ui-field-contain .ui-btn.ui-submit,
+	.ui-popup .ui-field-contain .ui-controlgroup-controls,
+	.ui-popup .ui-field-contain .ui-select,
+	.ui-popup .ui-field-contain input.ui-input-text,
+	.ui-popup .ui-field-contain textarea.ui-input-text,
+	.ui-popup .ui-field-contain .ui-input-search {
+		width: 100%; display: block;
+	}
+}
+
+.ui-popup > .ui-btn-left,
+.ui-popup > .ui-btn-right {
+	position: absolute; 
+	top: -9px;
+	margin: 0;
+	z-index: 1101;
+}
+.ui-popup > .ui-btn-left { left: -9px; }
+.ui-popup > .ui-btn-right { right: -9px; }
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-popup-screen {
+  opacity: 0;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 1200;
+}
+.ui-overlay-dim {
+  background: #000000;
+  opacity: .5;
+}
+.ui-popup-scroller-bg {
+  width: 100%;
+}
+.ui-popup-container {
+  position: absolute;
+  width: 86.12%;
+  z-index: 1201 !important;
+  text-align: center;
+  outline-color: #f8f6ef;
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -ms-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -o-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -ms-box-align: center;
+  -moz-box-align: center;
+  -o-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -ms-box-pack: center;
+  -moz-box-pack: center;
+  -o-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  outline: none;
+  /***** Normal Samples *****/
+
+}
+.ui-popup-container .ui-popup {
+  padding: .5px .5px .5px .5px;
+  background: #f8f6ef;
+  width: 100%;
+  border: 1px solid #62697f;
+  word-wrap: break-word;
+  -ms-border-radius: .3em;
+  -o-border-radius: .3em;
+  -webkit-border-radius: .3em;
+  -moz-border-radius: .3em;
+  border-radius: .3em;
+}
+.ui-popup-container .ui-popup > .ui-popup-title,
+.ui-popup-container .ui-popup > .ui-popup-button-bg {
+  width: 100%;
+}
+.ui-popup-container .ui-popup-title {
+  width: 100%;
+  height: 1.8181818181818183rem;
+  text-align: left;
+  color: #252525;
+  font-size: 1.0909090909090908rem;
+  font-weight: bold;
+  background: #dbd9ce;
+  -ms-border-top-left-radius: .2em;
+  -o-border-top-left-radius: .2em;
+  -webkit-border-top-left-radius: .2em;
+  -moz-border-top-left-radius: .2em;
+  border-top-left-radius: .2em;
+  -ms-border-top-right-radius: .2em;
+  -o-border-top-right-radius: .2em;
+  -webkit-border-top-right-radius: .2em;
+  -moz-border-top-right-radius: .2em;
+  border-top-right-radius: .2em;
+}
+.ui-popup-container .ui-popup-title h1 {
+  font-size: 1.0909090909090908rem;
+  font-weight: bold;
+  color: #252525;
+  text-shadow: 0px 2px rgba(250, 250, 250, 0.75);
+  margin: 0px;
+  padding-top: 0.2272727272727273rem;
+  padding-left: 0.7272727272727273rem;
+}
+.ui-popup-container .ui-popup-text {
+  margin-top: 1rem;
+  margin-bottom: 1rem;
+  padding-left: 0.7272727272727273rem;
+  padding-right: 0.7272727272727273rem;
+  color: #000000;
+  font-size: 0.9090909090909092rem;
+  background: #f8f6ef;
+  text-align: center;
+}
+.ui-popup-container .ui-popup-text .ui-li .ui-radio label,
+.ui-popup-container .ui-popup-text .ui-li .ui-checkbox label {
+  background: transparent;
+}
+.ui-popup-container .ui-popup-text input {
+  display: inline-block;
+}
+.ui-popup-container .ui-popup-button-bg {
+  background: #d6d3c9;
+  font-size: 0.8181818181818182rem;
+  font-weight: bold;
+  height: 1.6818181818181819rem;
+  padding-top: 0.4545454545454546rem;
+  padding-bottom: 0.4545454545454546rem;
+  width: 100%;
+  vertical-align: middle;
+  -ms-border-bottom-left-radius: .3em;
+  -o-border-bottom-left-radius: .3em;
+  -webkit-border-bottom-left-radius: .3em;
+  -moz-border-bottom-left-radius: .3em;
+  border-bottom-left-radius: .3em;
+  -ms-border-bottom-right-radius: .3em;
+  -o-border-bottom-right-radius: .3em;
+  -webkit-border-bottom-right-radius: .3em;
+  -moz-border-bottom-right-radius: .3em;
+  border-bottom-right-radius: .3em;
+}
+.ui-popup-container .ui-popup-button-bg > .ui-btn {
+  width: 40%;
+  display: inline-block;
+  margin: auto;
+  height: 1.6818181818181819rem;
+  background: #f7f5ed;
+  background: -webkit-gradient(linear, left top, left bottom, from(#f7f5ed), to(#eceae2));
+  background: -moz-linear-gradient(top, #f7f5ed, #eceae2);
+  background: -ms-linear-gradient(top, #f7f5ed, #eceae2);
+  background: -o-linear-gradient(top, #f7f5ed, #eceae2);
+  color: #3a3a3a;
+  border: 1px solid #85837e;
+  box-shadow: 0 0 1px 1px #85837e;
+}
+.ui-popup-container .ui-popup-button-bg > .ui-btn.ui-btn-down-s {
+  background: #007ad8;
+  background: -webkit-gradient(linear, left top, left bottom, from(#0066c4), to(#007ad8));
+  background: -moz-linear-gradient(top, #0066c4, #007ad8);
+  background: -ms-linear-gradient(top, #0066c4, #007ad8);
+  background: -o-linear-gradient(top, #0066c4, #007ad8);
+  color: #fafafa;
+}
+.ui-popup-container .ui-popup-button-bg .ui-btn-inner {
+  padding-left: 0.9090909090909092rem;
+  padding-right: 0.9090909090909092rem;
+  margin-top: 0.13636363636363635rem;
+  -ms-border-radius: .2em;
+  -o-border-radius: .2em;
+  -webkit-border-radius: .2em;
+  -moz-border-radius: .2em;
+  border-radius: .2em;
+}
+.ui-popup-container .center_basic_3btn .ui-btn,
+.ui-popup-container .center_title_3btn .ui-btn {
+  max-width: 3.6363636363636367rem;
+  height: 1.6818181818181819rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+  display: inline-block;
+}
+.ui-popup-container .center_button_vertical .ui-popup-button-bg {
+  display: block;
+  height: auto;
+}
+.ui-popup-container .center_button_vertical .ui-popup-button-bg > .ui-btn {
+  display: block;
+  width: 9.090909090909092rem;
+  margin-top: 5px;
+  margin-bottom: 5px;
+}
+.ui-popup-container .center_checkbox .ui-popup-check-bg {
+  font-size: 0.9090909090909092rem;
+  width: 100%;
+  padding-top: 0rem;
+  padding-bottom: 1rem;
+  vertical-align: middle;
+}
+.ui-popup-container .center_checkbox .ui-popup-check-bg .ui-checkbox .ui-btn {
+  text-align: center;
+  border: 0rem;
+}
+.ui-popup-container .center_checkbox .ui-popup-check-bg .ui-checkbox .ui-btn .ui-btn-inner {
+  border: 0rem;
+}
+.ui-popup-container .center_checkbox .ui-popup-button-bg {
+  background: #d6d3c9;
+}
+.ui-popup-container .center_checkbox .ui-popup-button-bg .ui-btn {
+  min-width: 5.454545454545455rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.2272727272727273rem;
+  margin-right: 0.2272727272727273rem;
+}
+.ui-popup-container .center_liststyle_1btn .ui-popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: #f8f6ef;
+  max-height: 11.636363636363637rem;
+}
+.ui-popup-container .center_liststyle_2btn .ui-popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: #f8f6ef;
+  max-height: 11.636363636363637rem;
+}
+.ui-popup-container .center_liststyle_2btn .ui-popup-button-bg .ui-btn {
+  min-width: 5.454545454545455rem;
+}
+.ui-popup-container .center_title_2btn .ui-popup-button-bg .ui-btn {
+  min-width: 5.454545454545455rem;
+}
+.ui-popup-container .center_liststyle_3btn .ui-popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: #f8f6ef;
+  max-height: 11.636363636363637rem;
+}
+.ui-popup-container .center_liststyle_3btn .ui-popup-button-bg .ui-btn {
+  max-width: 3.6363636363636367rem;
+}
+.ui-popup-container .center_progressbar {
+  text-align: center;
+}
+.ui-popup-container .center_progressbar .ui-popup-text {
+  font-size: 1.1818181818181819rem;
+  font-color: #999999;
+  background: #f8f6ef;
+  width: 100%;
+  height: 3.181818181818182rem;
+}
+.ui-popup-container .center_progressbar .ui-popup-text p {
+  height: 100%;
+  text-align: center;
+  padding: 1rem 0.7272727272727273rem 0rem 0.7272727272727273rem;
+}
+.ui-popup-container .center_progressbar .ui-popup-text-bottom-bg {
+  font-size: 1.1818181818181819rem;
+  font-color: #999999;
+  background: #f8f6ef;
+  width: 100%;
+  vertical-align: middle;
+}
+.ui-popup-container .center_progressbar .ui-popup-text-bottom-bg .text-left {
+  width: 40%;
+  height: 2.1818181818181817rem;
+  padding: 0rem 0.7272727272727273rem 0rem 0.7272727272727273rem;
+  text-align: left;
+  display: inline-block;
+}
+.ui-popup-container .center_progressbar .ui-popup-text-bottom-bg .text-right {
+  width: 40%;
+  height: 2.1818181818181817rem;
+  padding: 0rem 0.7272727272727273rem 0rem 0.7272727272727273rem;
+  text-align: right;
+  display: inline-block;
+}
+.ui-popup-container .center_progressbar .ui-popup-button-bg {
+  background: #d6d3c9;
+}
+.ui-popup-container .center_progressbar .ui-popup-button-bg .ui-btn {
+  width: 9.136363636363637rem;
+  margin: auto;
+}
+.ui-popup-container .center_progressbar .ui-popup-progress-bg {
+  background: #f8f6ef;
+  width: 100%;
+  height: 100%;
+}
+.ui-popup-container .centertext_progressbar {
+  text-align: center;
+}
+.ui-popup-container .centertext_progressbar .ui-popup-text {
+  font-size: 1.1818181818181819rem;
+  font-color: #999999;
+  background: #f8f6ef;
+  width: 100%;
+  padding-top: 1rem;
+  padding-bottom: 0.7272727272727273rem;
+}
+.ui-popup-container .centertext_progressbar .ui-popup-text p {
+  text-align: center;
+}
+.ui-popup-container .centertext_progressbar .ui-popup-text-bottom-bg {
+  font-size: 1.1818181818181819rem;
+  font-color: #999999;
+  background: #f8f6ef;
+  width: 100%;
+  vertical-align: middle;
+}
+.ui-popup-container .centertext_progressbar .ui-popup-text-bottom-bg .text-left {
+  width: 40%;
+  height: 1.8181818181818183rem;
+  padding: 0.7272727272727273rem 0.7272727272727273rem 1rem 0.7272727272727273rem;
+  text-align: left;
+  display: inline-block;
+}
+.ui-popup-container .centertext_progressbar .ui-popup-text-bottom-bg .text-right {
+  width: 40%;
+  height: 1.8181818181818183rem;
+  padding: 0.7272727272727273rem 0.7272727272727273rem 1rem 0.7272727272727273rem;
+  text-align: right;
+  display: inline-block;
+}
+.ui-popup-container .centertext_progressbar .ui-popup-button-bg {
+  background: #d6d3c9;
+}
+.ui-popup-container .centertext_progressbar .ui-popup-button-bg .ui-btn {
+  width: 18.272727272727273rem;
+  margin: auto;
+}
+.ui-popup-container .centertext_progressbar .ui-popup-progress-bg {
+  background: #f8f6ef;
+  width: 100%;
+  height: 100%;
+}
+/*
+ * Misc. classes for Tizen web ui framework
+ *
+ * All classes in this file has highest priority.
+ */
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/* text-ellipsis
+ * elements using this class needs following constraints;
+ *  - width must not be 'auto'
+ *  - display must be 'block' or 'inline-block'
+ */
+.ui-text-ellipsis {
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+/***************************************************************************
+                    Tabbar
+***************************************************************************/
+.ui-tabbar {
+  z-index: 1000;
+}
+
+
+.ui-tabbar a.ui-btn {
+  background: #edebe4;
+  color: #555555;
+  padding-top: 0.5454545454545454rem;
+  padding-bottom: 0.5454545454545454rem;
+}
+.ui-tabbar a.ui-btn .ui-btn-inner {
+  padding-top: 0px;
+  padding-bottom: 0px;
+  border-left: 1px solid;
+  border-color: #8a8a8a;
+  border-radius: 0px;
+  -0-border-radius: 0px;
+  -ms-border-radius: 0px;
+  -webkit-border-radius: 0px;
+}
+.ui-tabbar a.ui-btn .ui-btn-inner:not(.ui-btn-icon-only) .ui-btn-text {
+  display: block;
+  vertical-align: middle;
+  margin-left: 0.2727272727272727rem;
+  margin-right: 0.2727272727272727rem;
+}
+.ui-tabbar a.ui-btn .ui-btn-inner .ui-btn-text {
+  background: #edebe4;
+}
+.ui-tabbar a.ui-btn .ui-icon {
+  width: 1.4545454545454546rem;
+  height: 1.4545454545454546rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+}
+.ui-tabbar a.ui-btn.ui-btn-down-s {
+  background: #3b73b6;
+  border-bottom-color: #edebe4;
+}
+.ui-tabbar a.ui-btn.ui-btn-down-s .ui-btn-text {
+  background: #3b73b6;
+}
+.ui-tabbar .ui-btn-inner {
+  font-size: 0.6818181818181819rem;
+  font-weight: bold;
+}
+.ui-tabbar .ui-btn-inner .ui-icon {
+  top: 0.4545454545454546rem;
+  left: 50%;
+  margin-left: -0.7272727272727273rem;
+}
+.ui-tabbar.ui-tabbar-notext a.ui-btn {
+  padding-top: 0.5rem;
+  padding-bottom: 0.18181818181818182rem;
+}
+.ui-tabbar.ui-tabbar-notext .ui-btn-inner {
+  height: 1.5454545454545454rem;
+}
+.ui-tabbar.ui-tabbar-notext .ui-btn-inner .ui-icon {
+  top: 0px;
+}
+/* title font size when title tabbar */
+.ui-header.ui-bar-s.ui-title-tabbar .ui-title {
+  font-size: 1rem;
+  margin-top: 0.36363636363636365rem;
+  margin-bottom: 0rem;
+}
+.ui-header.ui-bar-s.ui-title-tabbar > img {
+  margin-top: 0.6rem;
+}
+.ui-header.ui-bar-s.ui-title-tabbar .ui-tabbar.ui-tabbar-noicons a.ui-btn {
+  padding-top: 0.2727272727272727rem;
+  padding-bottom: 0.13636363636363635rem;
+}
+.ui-header.ui-bar-s.ui-title-tabbar .ui-tabbar.ui-tabbar-notext a.ui-btn {
+  padding-top: 0.3181818181818182rem;
+  padding-bottom: 0.2272727272727273rem;
+}
+
+
+.ui-header.ui-bar-s .ui-tabbar a.ui-btn {
+  border-bottom-width: 0.2272727272727273rem;
+  border-bottom-color: #edebe4;
+  border-bottom-style: solid;
+}
+.ui-header.ui-bar-s .ui-tabbar a.ui-btn.ui-btn-active {
+  border-bottom-color: #0e66ad;
+}
+.ui-header.ui-bar-s .ui-tabbar a.ui-btn.ui-btn-down-s {
+  border-bottom-color: #3b73b6;
+}
+.ui-header.ui-bar-s.ui-title-tabbar-multiline .ui-tabbar a.ui-btn {
+  padding-top: 0.3181818181818182rem;
+  padding-bottom: 0.18181818181818182rem;
+}
+.ui-header.ui-bar-s.ui-title-tabbar-multiline .ui-tabbar a.ui-btn .ui-btn-inner {
+  height: 2.2272727272727275rem;
+}
+.ui-header.ui-bar-s.ui-title-tabbar-multiline .ui-tabbar a.ui-btn .ui-btn-inner .ui-btn-text {
+  padding-bottom: 0.045454545454545456rem;
+}
+.ui-header.ui-bar-s.ui-title-tabbar-multiline .ui-tabbar a.ui-btn .ui-btn-inner .ui-icon {
+  top: 0px;
+}
+.ui-header.ui-bar-s li:first-child .ui-btn-inner {
+  border-left-width: 0px;
+}
+.ui-footer.ui-bar-s .ui-tabbar {
+  height: 2.2272727272727275rem;
+  margin-left: auto;
+  margin-right: auto;
+}
+.ui-footer.ui-bar-s .ui-tabbar a.ui-btn {
+  background: #dedcd5;
+  padding-top: 0.5454545454545454rem;
+  padding-bottom: 0.5454545454545454rem;
+}
+.ui-footer.ui-bar-s .ui-tabbar a.ui-btn.ui-btn-down-s:not(.ui-btn-icon_only) {
+  background: #0e66aa;
+}
+.ui-footer.ui-bar-s .ui-tabbar a.ui-btn.ui-btn-down-s:not(.ui-btn-icon_only) .ui-btn-text {
+  background: #0e66aa;
+}
+.ui-footer.ui-bar-s .ui-tabbar .ui-btn-inner {
+  padding-top: 0.09090909090909091rem;
+  padding-bottom: 0.09090909090909091rem;
+}
+.ui-footer.ui-bar-s .ui-tabbar .ui-btn-inner .ui-icon {
+  top: 0px;
+}
+.ui-footer.ui-bar-s .ui-tabbar .ui-btn-inner .ui-btn-text {
+  background: #dedcd5;
+}
+.ui-footer.ui-bar-s .ui-tabbar.ui-tabbar-notext a.ui-btn {
+  padding-top: 0.36363636363636365rem;
+  padding-bottom: 0.3181818181818182rem;
+}
+.ui-footer.ui-bar-s .ui-tabbar li:first-child .ui-btn-inner {
+  border-left-width: 0px;
+}
+.ui-footer.ui-bar-s .ui-tabbar.ui-tabbar-margin-back {
+  margin-right: 2.5454545454545454rem;
+}
+.ui-footer.ui-bar-s .ui-tabbar.ui-tabbar-margin-more {
+  margin-left: 2.5454545454545454rem;
+}
+.ui-footer.ui-bar-s .ui-btn-back ~ .ui-tabbar li:last-child .ui-btn-inner {
+  border-right: 1px solid;
+  border-right-color: #8a8a8a;
+}
+.ui-footer.ui-bar-s [data-icon="naviframe-more"] ~ .ui-tabbar li:first-child .ui-btn-inner {
+  border-left: 1px solid;
+  border-left-color: #8a8a8a;
+}
+.ui-tabbar-s.ui-navbar-noicons {
+  font-size: 1rem;
+}
+/* Scrollable tabbar */
+.ui-tabbar .tabbar-scroll-ul {
+  margin-top: 0px;
+  margin-bottom: 0px;
+  padding-left: 0px;
+}
+.ui-tabbar .tabbar-scroll-ul .tabbar-scroll-li {
+  position: relative;
+  display: inline-block;
+  margin-left: -0.36363636363636365rem;
+}
+.ui-tabbar .tabbar-scroll-ul .tabbar-scroll-li a {
+  width: 100%;
+  padding-top: 3px;
+  padding-bottom: 3px;
+  border-bottom-width: 0.2272727272727273rem;
+  border-bottom-style: solid;
+  border-bottom-color: #edebe4;
+}
+.ui-tabbar .tabbar-scroll-ul .tabbar-scroll-li a.ui-tabbar-active {
+  border-bottom-color: #0e66ad;
+}
+.ui-tabbar .tabbar-scroll-ul li.tabbar-scroll-li:first-child {
+  margin-left: 0px;
+}
+.ui-tabbar-divider {
+  position: absolute;
+  top: 0px;
+  width: 3.681818181818182rem;
+  height: 1.6363636363636365rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+}
+.ui-tabbar-divider-left {
+  left: 0px;
+  background-image: url(images/00_effect_title_tab_bounce_left.png);
+}
+.ui-tabbar-divider-right {
+  right: 0px;
+  background-image: url(images/00_effect_title_tab_bounce_right.png);
+}
+/************************************************************************
+			Landscape mode
+************************************************************************/
+@media all and (orientation: landscape) and (device-aspect-ratio: 16/9) {
+  .ui-tabbar a.ui-btn {
+    padding-top: 0.6363636363636364rem;
+    padding-bottom: 0.2272727272727273rem;
+  }
+  .ui-tabbar .ui-btn-inner .ui-icon {
+    top: 0.4545454545454546rem;
+  }
+  .ui-tabbar.ui-tabbar-notext a.ui-btn {
+    padding-top: 0.2727272727272727rem;
+    padding-bottom: 0.2272727272727273rem;
+  }
+  .ui-tabbar.ui-tabbar-notext .ui-btn-inner {
+    height: 1.5454545454545454rem;
+  }
+  /* title font size when title tabbar */
+  .ui-header.ui-bar-s.ui-title-tabbar .ui-title {
+    font-size: 0.8636363636363636rem;
+    margin-top: 0.36363636363636365rem;
+  }
+  .ui-header.ui-bar-s.ui-title-tabbar .ui-tabbar.ui-tabbar-noicons a.ui-btn {
+    padding-top: 0.4545454545454546rem;
+    padding-bottom: 0.36363636363636365rem;
+  }
+  .ui-header.ui-bar-s.ui-title-tabbar .ui-tabbar.ui-tabbar-notext a.ui-btn {
+    padding-top: 0.13636363636363635rem;
+    padding-bottom: 0.09090909090909091rem;
+  }
+  .ui-header.ui-bar-s.ui-title-tabbar-multiline .ui-tabbar a.ui-btn {
+    padding-top: 0.18181818181818182rem;
+    padding-bottom: 0.045454545454545456rem;
+  }
+  .ui-header.ui-bar-s.ui-title-tabbar-multiline .ui-tabbar a.ui-btn .ui-btn-inner {
+    height: 2.4545454545454546rem;
+  }
+  .ui-header.ui-bar-s.ui-title-tabbar-multiline .ui-tabbar a.ui-btn .ui-btn-inner .ui-btn-text {
+    line-height: 0.6818181818181819rem;
+  }
+  .ui-footer.ui-bar-s .ui-tabbar {
+    height: 1.9090909090909092rem;
+  }
+  .ui-footer.ui-bar-s .ui-tabbar a.ui-btn {
+    padding-top: 0.5909090909090909rem;
+    padding-bottom: 0.5454545454545454rem;
+  }
+  .ui-footer.ui-bar-s .ui-tabbar.ui-tabbar-notext a.ui-btn {
+    padding-top: 0.18181818181818182rem;
+    padding-bottom: 0.18181818181818182rem;
+  }
+  .ui-tabbar-s.ui-navbar-noicons {
+    font-size: 0.8636363636363636rem;
+  }
+  /* Scrollable tabbar */
+  .ui-tabbar-divider {
+    width: 3.681818181818182rem;
+    height: 2.5rem;
+  }
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ * 'config.less' in each theme must include this file.
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/***************************************************************************
+                   Body
+***************************************************************************/
+/* B011 : Main Background color */
+/* B012 : Main font color */
+/***************************************************************************
+                   Naviframe
+***************************************************************************/
+/* B042 : title text */
+/* B052L4 : Title text button */
+/* B052L5 : Title text button press */
+/* B052L1P : Title text button press bg */
+/* 00_divider_line.9.png */
+/* B0515L1: Toolbar bg */
+/* B052L4 : Toolbar button normal */
+/* B052L4P : Toolbar button pressed */
+/* B0511P : Navigation bar bg press */
+/***************************************************************************
+                   Tabbar
+***************************************************************************/
+/* B0514P1 : 00_tab_press_ef.9.png */
+/* B052L6P */
+/* B052L6 */
+/***************************************************************************
+                   List
+***************************************************************************/
+/* B0211 */
+/* B041	*/
+/* B0221 */
+/* W021L1 */
+/* W021L2 */
+/* W021L3 */
+/* B0212 */
+/* F011L1 */
+/* W051 */
+/* W051 */
+/* F011L16 */
+/* F011L17 */
+/* F011L15 */
+/***************************************************************************
+                   Fast Scroll
+***************************************************************************/
+/* B0724 : 00_fast_scroll_rollover_bg.9.png */
+/* B0721 : Rollover text */
+/* B0731 : 00_fast_scroll_popup_bg.png */
+/* B0732 : Scroll popup text */
+/***************************************************************************
+                   SearchBar(forms.textinput)
+***************************************************************************/
+/* Search default text */
+/* W301 : 00_search_edit_field_bg.png */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* B061L1 : Popop info */
+/***************************************************************************
+                        Button(connected with other winset)
+***************************************************************************/
+/* F031L1 */
+/* F031L1P */
+
+
+
+
+
+
+
+
+
+/***************************************************************************
+                        contextual popup
+***************************************************************************/
+/* B061L4 : Contextual bg */
+/* B044 : Contextual effect */
+/***************************************************************************
+                   Scrollview
+***************************************************************************/
+/***************************************************************************
+                   Date Time picker
+***************************************************************************/
+/* W0811 : Picker bg */
+/* B0224 : Dialogue group List Line */
+/* B0222 : Line divider */
+/***************************************************************************
+                   SegmentControl
+***************************************************************************/
+/* B052L4 : Title text button */
+/***************************************************************************
+                   Popup
+***************************************************************************/
+/* popup_title_bg.png */
+/* B063L9 : Basic Style_title */
+/* maybe not use only popupwindow*/
+
+
+
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                    Progress
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+
+
+
+/***************************************************************************
+                   tokentextarea
+***************************************************************************/
+/* W0711 : Contact button bg normal */
+/* W0713 : Contact button bg press */
+/***************************************************************************
+                   Splitview
+***************************************************************************/
+/* W131 */
+/* W132 */
+.ui-splitview {
+  margin: 0;
+  padding: 0;
+  position: relative;
+  overflow: hidden;
+}
+.ui-splitview .ui-pane {
+  position: absolute;
+  overflow: hidden;
+  border: 0;
+  margin: 0;
+  padding: 0;
+}
+.ui-splitview .ui-pane .ui-listview {
+  margin: 0;
+  padding: 0;
+}
+.ui-splitview .ui-spliter {
+  position: absolute;
+  z-index: 100;
+  display: block;
+  margin: 0;
+  padding: 0;
+}
+.ui-splitview .ui-spliter-bar {
+  background-color: #959595;
+  border-color: #808080;
+  border-style: solid;
+}
+.ui-splitview .ui-spliter-handle {
+  margin: 0;
+  padding: 0;
+  cursor: move;
+  display: block;
+  text-align: center;
+  cursor: pointer;
+  position: relative;
+  background-position: center center;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+}
+.ui-direction-horizontal > .ui-spliter {
+  width: 1.3636363636363638rem;
+}
+.ui-direction-vertical > .ui-spliter {
+  height: 1.3636363636363638rem;
+}
+.ui-direction-horizontal > .ui-spliter > .ui-spliter-bar {
+  width: 0.25rem;
+  margin: 0 0 0 0.5681818181818182rem;
+  border-width: 0 1px 0 1px;
+}
+.ui-direction-vertical > .ui-spliter > .ui-spliter-bar {
+  height: 0.25rem;
+  margin: 0.5681818181818182rem 0 0 0;
+  border-width: 1px 0 1px 0;
+}
+.ui-spliter-active > .ui-spliter-bar {
+  background-color: #5787c2;
+  border-color: #5787c2;
+}
+.ui-direction-horizontal > .ui-spliter > .ui-spliter-bar > .ui-spliter-handle {
+  width: 0.20454545454545456rem;
+  height: 0.6136363636363636rem;
+  margin: 0 0.022727272727272728rem 0 0.022727272727272728rem;
+  background-image: url(./images/00_splite_handler_v.png);
+  background-size: 0.20454545454545456rem 0.6136363636363636rem;
+  background-repeat: no-repeat;
+}
+.ui-direction-vertical > .ui-spliter > .ui-spliter-bar > .ui-spliter-handle {
+  width: 0.6136363636363636rem;
+  height: 0.20454545454545456rem;
+  margin: 0.022727272727272728rem 0 0.022727272727272728rem 0;
+  background-image: url(./images/00_splite_handler_h.png);
+  background-size: 0.6136363636363636rem 0.20454545454545456rem;
+  background-repeat: no-repeat;
+}
+.ui-direction-horizontal > .ui-fixed {
+  width: 0;
+}
+.ui-direction-horizontal > .ui-fixed > .ui-spliter-bar {
+  width: 0.11363636363636365rem;
+}
+.ui-direction-vertical > .ui-fixed {
+  height: 0;
+}
+.ui-direction-vertical > .ui-fixed > .ui-spliter-bar {
+  height: 0.11363636363636365rem;
+}
+.ui-fixed .ui-spliter-handle {
+  display: none;
+}
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..70865b3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/tizen-app-template.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ 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.
+
+-->
+
+<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>
