OSDN Git Service

Code drop from //branches/cupcake/...@124589
authorThe Android Open Source Project <initial-contribution@android.com>
Thu, 18 Dec 2008 02:05:52 +0000 (18:05 -0800)
committerThe Android Open Source Project <initial-contribution@android.com>
Thu, 18 Dec 2008 02:05:52 +0000 (18:05 -0800)
89 files changed:
AndroidManifest.xml
assets/html/flashtest.html [new file with mode: 0644]
assets/html/plugin.html [new file with mode: 0755]
assets/plugins/gears-0.4.23.0/permissions_dialog.html [deleted file]
assets/plugins/gears-0.4.23.0/settings_dialog.html [deleted file]
assets/plugins/gears-0.4.23.0/shortcuts_dialog.html [deleted file]
assets/plugins/gears-0.5.2.0/dummy [new file with mode: 0644]
assets/plugins/gears.so
res/drawable/dialog_frame.9.png [deleted file]
res/drawable/gears.png [new file with mode: 0644]
res/drawable/gears_back.png [new file with mode: 0755]
res/drawable/gears_button.xml [new file with mode: 0755]
res/drawable/gears_button_default.9.png [new file with mode: 0644]
res/drawable/gears_button_pressed.9.png [new file with mode: 0644]
res/drawable/gears_button_selected.9.png [new file with mode: 0644]
res/drawable/gears_file_audio.png [new file with mode: 0755]
res/drawable/gears_file_image.png [new file with mode: 0755]
res/drawable/gears_file_unknown.png [new file with mode: 0755]
res/drawable/gears_file_video.png [new file with mode: 0755]
res/drawable/gears_folder.png [new file with mode: 0755]
res/drawable/gears_icon_32x32.png [new file with mode: 0644]
res/drawable/gears_icon_48x48.png [new file with mode: 0644]
res/drawable/gears_local_data.png [new file with mode: 0644]
res/drawable/gears_location_data.png [new file with mode: 0644]
res/drawable/ic_browser_done.png [deleted file]
res/drawable/ic_browser_down.png [deleted file]
res/drawable/ic_browser_up.png [deleted file]
res/drawable/ic_btn_close_panel.png [new file with mode: 0644]
res/drawable/ic_btn_find_next.png [new file with mode: 0644]
res/drawable/ic_btn_find_prev.png [new file with mode: 0644]
res/drawable/ic_menu_forward.png [deleted file]
res/drawable/ic_search_browser.png [deleted file]
res/drawable/map.xml [deleted file]
res/drawable/mapfocused.png [deleted file]
res/drawable/mapunfocused.png [deleted file]
res/drawable/urlbar_background.9.png [deleted file]
res/layout-land/gears_dialog.xml [new file with mode: 0644]
res/layout-land/page_info.xml
res/layout/browser_find.xml
res/layout/cache_cleared.xml [deleted file]
res/layout/gears_dialog.xml [new file with mode: 0644]
res/layout/gears_dialog_filepicker.xml [new file with mode: 0644]
res/layout/gears_dialog_filepicker_cell.xml [new file with mode: 0644]
res/layout/gears_dialog_permission.xml [new file with mode: 0644]
res/layout/gears_dialog_settings.xml [new file with mode: 0644]
res/layout/gears_dialog_settings_row.xml [new file with mode: 0644]
res/layout/page_info.xml
res/layout/tabitem.xml
res/menu/bookmarkscontext.xml
res/menu/browser.xml
res/values-cs/strings.xml
res/values-de-rDE/strings.xml [deleted file]
res/values-de/strings.xml [new file with mode: 0644]
res/values-es-rUS/strings.xml [deleted file]
res/values-fr-rFR/strings.xml [deleted file]
res/values-it-rIT/strings.xml [deleted file]
res/values-ja/strings.xml [new file with mode: 0644]
res/values-zh-rTW/strings.xml [deleted file]
res/values/colors.xml
res/values/strings.xml
res/values/styles.xml
res/values/themes.xml [new file with mode: 0644]
res/xml/browser_preferences.xml
res/xml/debug_preferences.xml
src/com/android/browser/AddBookmarkPage.java
src/com/android/browser/BrowserActivity.java
src/com/android/browser/BrowserBookmarksAdapter.java
src/com/android/browser/BrowserBookmarksPage.java
src/com/android/browser/BrowserDownloadAdapter.java
src/com/android/browser/BrowserDownloadPage.java
src/com/android/browser/BrowserHomepagePreference.java [new file with mode: 0644]
src/com/android/browser/BrowserPreferencesPage.java
src/com/android/browser/BrowserProvider.java
src/com/android/browser/BrowserSearchpagePreference.java [new file with mode: 0644]
src/com/android/browser/BrowserSettings.java
src/com/android/browser/FakeWebView.java
src/com/android/browser/FetchUrlMimeType.java [new file with mode: 0644]
src/com/android/browser/FindDialog.java
src/com/android/browser/GearsBaseDialog.java [new file with mode: 0644]
src/com/android/browser/GearsDialog.java
src/com/android/browser/GearsFilePickerDialog.java [new file with mode: 0644]
src/com/android/browser/GearsNativeDialog.java [new file with mode: 0644]
src/com/android/browser/GearsPermissions.java [new file with mode: 0644]
src/com/android/browser/GearsPermissionsDialog.java [new file with mode: 0644]
src/com/android/browser/GearsSettingsDialog.java [new file with mode: 0644]
src/com/android/browser/GearsShortcutDialog.java [new file with mode: 0644]
src/com/android/browser/ImageAdapter.java
src/com/android/browser/ImageGrid.java
src/com/android/browser/TabControl.java

index 6bf400d..762dc69 100644 (file)
     <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.WAKE_LOCK"/>
+    <uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"/>
+    <uses-permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"/>
+
+    <!-- Allows an application to read the user Browser's history and bookmarks. -->
+    <permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"
+        android:permissionGroup="android.permission-group.PERSONAL_INFO"
+        android:label="@string/permlab_readHistoryBookmarks"
+        android:description="@string/permdesc_readHistoryBookmarks"
+        android:protectionLevel="dangerous" />
+
+    <!-- Allows an application to write (but not read) the user Browser's history and bookmarks. -->
+    <permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"
+        android:permissionGroup="android.permission-group.PERSONAL_INFO"
+        android:label="@string/permlab_writeHistoryBookmarks"
+        android:description="@string/permdesc_writeHistoryBookmarks"
+        android:protectionLevel="dangerous" />
 
     <application   android:name="Browser"
                    android:label="Browser"
              (android.test) library. -->
         <uses-library android:name="android.test.runner" />
 
-        <provider android:name="BrowserProvider" android:authorities="browser" android:multiprocess="true" />
+        <provider android:name="BrowserProvider" 
+                  android:authorities="browser" 
+                  android:multiprocess="true" 
+                  android:readPermission="com.android.browser.permission.READ_HISTORY_BOOKMARKS"
+                  android:writePermission="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"/>
         <activity android:name="BrowserActivity" android:label="Browser"
                   android:launchMode="singleTask"
                   android:alwaysRetainTaskState="true"
             </intent-filter>
             <intent-filter>
                 <action android:name="android.intent.action.WEB_SEARCH" />
+                <action android:name="android.intent.action.MEDIA_SEARCH" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
             <intent-filter>
                   android:theme="@android:style/Theme.Dialog">
         </activity>
 
-        <service android:name="GearsDialogService" android:process=":dialog"
+        <activity android:name="GearsNativeDialog"
+                  android:configChanges="orientation|keyboardHidden"
+                  android:theme="@android:style/Theme.Dialog">
+        </activity>
+
+        <service android:name="GearsDialogService"
+                 android:process=":dialog"
                  android:exported="false">
             <intent-filter>
                 <action android:name="com.android.browser.IGearsDialogService" />
diff --git a/assets/html/flashtest.html b/assets/html/flashtest.html
new file mode 100644 (file)
index 0000000..8e1cf48
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+<head>
+<title>Flash test</title>
+</head>
+<body>
+<h1>Flash test</h1>
+This is text above the plugin
+<a href="http://www.google.com">Google</a>
+<br>
+lhs
+<object type="application/x-shockwave-flash" height=120 width=240>
+    <param name="FlashFileName" value="/data/data/com.android.browser/app_plugins/Ball.swf" />
+</object>
+<br>
+
+This is some the text and more text and more text and more text and more text and more text and more text and more text and more text and more text and more text
+</body>
+</html>
diff --git a/assets/html/plugin.html b/assets/html/plugin.html
new file mode 100755 (executable)
index 0000000..f112a4b
--- /dev/null
@@ -0,0 +1,43 @@
+<html>
+<head>
+<title>Plugin test</title>
+</head>
+<body>
+<h1>Plugin test page</h1>
+This is text above the plugin
+<a href="http://www.google.com">Google</a>
+<br>
+lhs
+<object type="application/x-testplugin" height=40 width=64>
+    <param name="DrawingModel" value="Bitmap" />
+</object>
+<object type="application/x-testplugin" height=40 width=64>
+    <param name="DrawingModel" value="Canvas" />
+</object>
+rhs
+<br>
+
+This is some the text and more text and more text and more text and more text and more text and more text and more text and more text and more text and more text
+<ol>
+<li><a href="http://www.google.com">Google</a></li>
+<li><a href="http://www.gmail.com">Gmail</a></li>
+<li><a href="http://maps.google.com/">Google Maps</a></li>
+<li><a href="http://news.google.com">Google News</a></li>
+<li><a href="http://www.yahoo.com">Yahoo!</a></li>
+<li><a href="http://www.yahoomail.com">Yahoo! Mail</a></li>
+<li><a href="http://www.msn.com">MSN</a></li>
+<li><a href="http://www.hotmail.com">Hotmail</a></li>
+<li><a href="http://www.aol.com">AOL</a></li>
+<li><a href="http://mail.aol.com">AOL Mail</a></li>
+<li><a href="http://www.ebay.com">eBay</a></li>
+<li><a href="http://www.ask.com">Ask.com</a></li>
+<li><a href="http://www.amazon.com">Amazon</a></li>
+<li><a href="http://www.myspace.com">MySpace</a></li>
+<li><a href="http://www.nytimes.com">New York Times</a></li>
+<li><a href="http://www.weather.com">Weather Channel</a></li>
+<li><a href="http://www.wikipedia.org/">Wikipedia</a></li>
+<li><a href="http://www.cnet.com">CNET</a></li>
+<li><a href="http://www.apple.com">Apple</a></li>
+</ol>
+</body>
+</html>
diff --git a/assets/plugins/gears-0.4.23.0/permissions_dialog.html b/assets/plugins/gears-0.4.23.0/permissions_dialog.html
deleted file mode 100644 (file)
index a332f78..0000000
+++ /dev/null
@@ -1,2857 +0,0 @@
-<!DOCTYPE html>
-
-<!--
-Copyright 2007, The Android Open Source Project
-
-Redistribution and use in source and binary forms, with or without 
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice, 
-    this list of conditions and the following disclaimer.
- 2. 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.
- 3. Neither the name of Google Inc. nor the names of its contributors may be
-    used to endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
--->
-
-<html>
-<head>
-  <style type="text/css">
-
-
-/*
-Copyright 2007, The Android Open Source Project
-
-Redistribution and use in source and binary forms, with or without 
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice, 
-    this list of conditions and the following disclaimer.
- 2. 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.
- 3. Neither the name of Google Inc. nor the names of its contributors may be
-    used to endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-*/
-
-body, html {
-  background-color:white;
-  padding:0;
-  margin:0;
-  height:100%;
-  overflow:hidden;
-  cursor:default;
-
-  /* 
-    Makes the text unselectable in mozilla. See html_diaog.js for IE
-    implementation.
-  */
-  -moz-user-select:none;
-}
-
-body, td, input, select, button {
-  font-family:arial,sans-serif;
-  font-size:13px;
-}
-
-p {
-  margin:0;
-  margin-bottom:1em;
-}
-
-a {
-  color:blue;
-  text-decoration:underline;
-}
-
-button {
-  /*
-  It would be better to express margins in ems, but it causes layout
-  artifacts (presumably because of rounding errors) when combined with
-  the -moz-border-radius property used in button.css on Firefox 2.
-
-  Also: bizarely, if I try to use the more natural margin-left:10px, I get
-  a bug where the buttons bounce on IE when you hover over them.
-  */
-  position:relative;
-  margin-right:7px;
-  left:7px;
-}
-
-#head {
-  padding:1em;
-}
-
-#foot {
-
-  /*
-  On Android we do not use position:absolute due to some
-  rendering limitations (absolute positioning works, but
-  the automatic resizing of dialog is confused by the
-  variable content and the display is wrong, while if we
-  remove the absolute positioning, #foot is back in the
-  flow and the dialog displays correctly)
-  */
-
-  background:white;
-  bottom:0;
-  width:100%;
-}
-
-#button-row {
-  margin:1em;
-}
-
-.accesskey {
-  text-decoration: underline;
-
-  /* IE CSS extension */
-  accelerator: true;
-}
-
-    #content {
-      margin:0 1em;
-    }
-
-    #yellowbox-right {
-      padding-left:1em;
-      padding-right:1em;
-    }
-
-
-
-    #checkbox-row {
-      margin-top:1em;
-
-      margin-bottom:1em;
-
-    }
-
-    .header-icon {
-      margin-right:0.5em;
-      display:none;
-    }
-
-    #custom-icon {
-      display:none;
-      margin-left:1em;
-    }
-
-    #custom-name {
-      font-weight:bold;
-      font-size:1.1em;
-      display:none;
-    }
-
-    #origin {
-      display:none;
-    }
-
-    #custom-message {
-
-      margin-top:6px;
-
-      display:none;
-    }
-
-    #origin-only {
-      font-weight:bold;
-      font-size:1.1em;
-      display:none;
-    }
-
-    #yellowbox {
-      margin:4px 0 4px 0;
-      border:solid #f1cc1d;
-      border-width:1px 0;
-      background:#faefb8;
-    }
-
-    #yellowbox-inner {
-      /* pseudo-rounded corners */
-      margin:0 -1px;
-      border:solid #f1cc1d;
-      border-width:0 1px;
-
-      padding:1em 0;
-
-    }
-
-    #yellowbox p {
-
-      padding:0 1em;
-
-    }
-
-    #permissions-help {
-      margin:4px;
-      display:none;
-    }
-  </style>
-</head>
-<body>
-  <div id="strings" style="display:none">
-    <div id="string-allow"></div>
-    <div id="string-allow-accesskey"></div>
-    <div id="string-deny"></div>
-    <div id="string-deny-accesskey"></div>
-    <div id="string-cancel"></div>
-    <div id="string-trust-site-accesskey"></div>
-  </div>
-
-  <!--
-  PIE only works with one window, and we are in a modal dialog.
-  Using window.open(this.href) replaces the content of the current dialog,
-  which is annoying when no back button is displayed...
-  The workaround is to embed directly a short explanation text, and
-  hide/show the div container for the help and the settings dialog.
-  -->
-
-  <div id="permissions-help">
-   <h2>Information</h2>
-   <p>
-     <span id="string-description"></span>
-   </p>
-   <ul>
-     <li><span id="string-localserver-desc"></span></li>
-     <li><span id="string-database-desc"></span></li>
-     <li><span id="string-workerpool-desc"></span></li>
-   </ul>
-   <a href="#" onclick="showHelp(false); return false;">Go back</a>
-  </div>
-
-
-  <div id="head">
-    <table width="100%" cellpadding="0" cellspacing="0" border="0">
-      <tr>
-        <td valign="top">
-        <!-- On IE Mobile, we can reliably hide or show div elements.
-        Showing or hiding image elements is like playing the Russian roulette:
-        it is potentially lethal. -->
-        <div id="icon-local-data" class="header-icon">
-
-          <img width="32" height="32" src="data:image/png;base64,
-iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0
-d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABLNJREFUeNrEV1toHFUY/ua2
-9yTYpKEJxIRisJJWY+1L82KtLaYPtRE1IERSFYxVKEqLoH2QPFjxhr5ozUuD
-iIZWkdQgWgu2IsQH26TFeklqAxpzaUjcZJPdzVzX/5zdmb3NdlYM5od/z5mz
-Z/7/O//1jJBKpbCeJGKdSf7g/Y5+Gg+6/Tk1HYJpWbBMExaNeXM+mjRaMAwd
-mqZB13XOTU2VaL6tOlfUZeJdh547s1QEgCl/rLMCPp/AF+bmLNTWpg1z+GiY
-C2QKbOGGnoJumDQ3aZ5eUzUVyUQS8XgciUQcrXf60d1VSc8pApbC98OJ1mjU
-unDivQNFIBgAUq7kLJnEEp8piuJpwr33V2D3rhC3ypmhGzj92Z/0XiAjOkWy
-gfa9Vfj6XIxAmBdo8e4iAM5QsCzLsieAurogWu+q5PPRKwmEw2EC4MvIsJA+
-oEggbsHA6flWuGrKnDhN1r+ygCjKzn5Z9iEYCkLx+QtkSgRCcg/C/wpAkrIA
-JALjJ+WKXAygZBawH0HImloQDOe5HBcwAPZ+keYMtCQpfE0QbJnyzQHklwPJ
-eS7fBaIDRqZ3RMmWIXqWmzSAPIS681wOgGvXLQwOJXgW/DZuOBbIk+ltgXx/
-xVessgFcn9AxNp506oQiK1Q3BC6DahPPAM8YyN0QDvud+ZNdsyVeUzIcvCk4
-FvmKT/J2gSBkAUQqpP+3FxQWov4PL62pgie67ykHQL6Jnnl2cE2UU6PzbLhi
-FofsUpLz6eoXn3K2aW7sZwz3vYPV5SWPM5aWLXtVKkZL05M4/2YvUqYBdWUZ
-c+O/IFBRiV+/+pzqgICxb4aw56VX0bBjp1up8nZBbhCWIi2+gurGJqiRMGJT
-E1igthusjEBPJpFcXiSQf6HB5b1C2fV1m5z59Mys7QIph4vJT6eNz9+AQX3f
-1DUkFxeRiEZhGgYx3RFWNb6nRLEulN2U4Y0MjOhUKpsLiPl3uO9d1GxuptMm
-yPxj2PZQF9oOvUhKa6DRRUSURYwM9POYKDZBkezGDG9mxUTMxqJYFLGTF3/A
-qac6sbowDx/1+ejkH9j/xglsffBRNN/3ADr7BqAEK8gqBqYuX8THjx/gQVkc
-53myhQxr7PbjmQXs5H7yOzO9QM2m9vaWvP/v2NcBi65olmGhqn5TuVnAruJ/
-s94v2oFis1sGqBSApqFRBizx51z6/btzHIDso04YCLkGoYtsg3jBMwhZWu05
-dhzaqgp1OYZITQ2+PHYY186f5e4ZPPI0FibGyToWQtUbsbPnCNp6XvAKQkZx
-4kRZdYCZvL33LZzsuBcbGm+FqSbx7esvU0ZopFhPG5N+2nqe53FRRh1gbyza
-F8YSl1KX/hcIkKl1WKRUlMmk1HJTVoqfPlKzwbva59/5osz8TimemZ3HyOhV
-ProRM78vUoVkLEbxEEftllZsaX+Y8l+l248IJRQpXQeY721OUyLjgiy82Zk5
-jI7+RLnh3jiq6hvQfepspu7HsPvoK3x96/5HcOmTk9z8bI+r/mIXLGSCMAug
-pWUbtm/fwRdGRq+UNGZhgLH42Nf7dlkdX1VVe2HeNj8HSJ9LJb8N15roO/Kj
-46/9eJAAWA6A9f48/0eAAQASLt1W3nvcdQAAAABJRU5ErkJggg==
-           ">
-
-        </div>
-        <div id="icon-locationdata" class="header-icon">
-
-          <img width="32" height="32" src="data:image/png;base64,
-iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsT
-AAALEwEAmpwYAAAAIGNIUk0AAG4nAABzrwAA/oMAAH9bAABMGwAA+PYAADHr
-AAAXyBit77wAAAXuSURBVHja7JdLbFxnFcd/3+M+Zjz2jCe168QTx2lw0rRV
-E4PapGqgXhDRpkhTsUCAqDQLFjyE2kUjsUGGJcomG8tdQOsKNggEKZQuKEhu
-FYqAFjshNLaT+DUO8sw44/G8PHPn3rks5tp1wqNjCMqGTzr6pPOd+53/eX7n
-Ct/3uZdLco/X/wGI3X5wbnggCjwHjACDAXsRmAQunJ1a3vifATg3PJAEJqTW
-Ma/hoQyFMhRCSDzXxXMaBSB1dmr59XbvVLtQPiq18XLv4cO2UyrjN320qdGm
-iRkOEYpGsTs77Xql8oXTfV28tbrx9l0DcG54IKkM8+WDJ5+knFulsraOMlvW
-K9NEmSbaMjE7Ogh3d7NZ2Bg5fX/X9FurG7N3KwnPD544RaNWpriapWfoEI89
-/2ViiQTR/n6GP/9F4oOHkFpjd3XRM3QY4Hw7F+t2rDc7IoNWJExm9jJew+XI
-6U/TMzTEvkePIZWBkAq7K8aVX/4cpU26+qLkFxcHzw0PJD8qH9rxwPHuxADr
-KwtU1gpIrTA6wggpKedyFFbSCKkwQmGUNpCGgTIMuvcPABy/GyE47rl11pfT
-gM/To98mti9B7to1/jjxCpd++mPyC/NEeu/n5Fe+jtIGSptYndG2AOg2ABTK
-uSy1YgVlKMxwB0JKaqUSytAoramXywghMSwTZbTI9zyAwt0AsFjbKCOUQmrF
-n374Gp/40vMcOPEEAoEyDBIff4xmw+Xqb95AahNlWGwWN7Ya1H8dggsIH6kl
-UisKK2nWrl9DCMnBJz/F4BOfRAhJKZuhXiyiDRN8KKws4zb9X5imJXeQCAjT
-tNoDcHZq+RIwid9EaYXSmsraGl6jwcLv3mHh3Ys0XZdyLhtYb5K9NkPDqb89
-ejV7BTAAM9iNwOsSEKZptRUCgBe9hjvpuV7M7ND87dIU2ZkPUJaNYYfIz99A
-22EMu4N8eomVy+9vLFUbo0Bsh0IfaAJ1YBNoAF5bjSjwQqpequA3faTWSG20
-yk4byCDxnEqZxT9c5Oam+9L3F9dvAvftoJ5g7wbsoAuLtp/joKGkiqtZhJQt
-EIFipVtxn5v8NfMV57vjC/nLQC+wJ/BCFOgK9m4gtBX+Xc0DZ6eWX/ObzQvF
-TA6lzaDmDZRhcvMv0xSqtXd+sLj+28DCrXirHa+uH4SgDniA/58MJKlqPl9w
-Nqsoo9V0qut5cos3Sj9KF74XGCV3KPQAN4j7LSADlALe7ieiYOA4v55Ot7xg
-mKzO/JVMzf3JyqZbCaz1A3KBSqB0OaBbQQL6jlP/6CoYH0seC+K4vby16vTm
-m9fxGi5COhTXcxSO9Yc/++DeFEKglfA7Ow0vFJLXXdd785WJqaUAjO849fYm
-ovGx5CiQikRCg5FIqOXPpofve0ilWPvVLEapCyElVXOd/FAfjuMRCmkOHLDZ
-t9eiVHZIpzdBcB74zte+8fpGWyPZ+Fjy1Xg8mjp54lH6+uIBeI+52QVsW7F/
-oIfc3Co/++YbeI7Dx756klwDenstYt2KcEhw9MEwQniUSnUu/j5PJuNMAyN3
-gpD/XHksdeaZEfbu7dnm12p1stlb9PZ2A9AzdB9WpwBb0gjbPP54D6dO9fDI
-w1EKBZd6vQlAJKJ4+nScQw/Yx4HJ8bFk9F96YHws+WqiP5raE49hmsaOXPKp
-1eq4rkckYuPjg+/zwcSfqVYbJD73CH19diALlYqL1mBZYpsHPumVGpls+TZP
-iNst70499dQJpNiqnibQxG04XL06x9GjB9Fa4NME38PbdAAPFZJAE99vfeO6
-HrOzZY4csVCquX2PZbm8936ZG/ONbRDiQ+Xx1LNnPoNpSfC9AEAr6ZaXlihX
-yjz00EHw3QCAuy2zJbeVK+Bx5UqRaJckkZA75FrnF9+tcmPenQZG1PhY8oV4
-fM+3nj1zBtMyArQfut5zG8zMzHHogQFse+f57XJ38iwTFhbr9PfrfzjfnxCs
-Zry+SsVfFeNjySQwcWetb08sWrInHiaTLe+6ZcaiNoWN2r8TeU7c69/zvw8A
-aBuA3Xz76MYAAAAASUVORK5CYII=
-           ">
-
-        </div> 
-          <!-- Some browsers automatically focus the first focusable item. We
-          don't want anything focused, so we add this fake item. -->
-          <a href="#" id="focus-thief"></a>
-        </td>
-        <td width="100%" valign="middle">
-          <div id="local-data" style="display:none">
-            <span id="string-query-data"></span>
-          </div>
-          <div id="location-data" style="display:none">
-            <span id="string-query-location"></span>
-          </div>
-        </td>
-      </tr>
-    </table>
-  </div>
-
-  <div id="content">
-    <div id="yellowbox">
-      <div id="yellowbox-inner">
-        <table width="100%" cellpadding="0" cellspacing="0" border="0">
-          <tr>
-            <td id="yellowbox-left" valign="top">
-              <img id="custom-icon" width="0" height="0" src="blank.gif">
-            </td>
-            <td id="yellowbox-right" width="100%" valign="middle">
-              <div id="custom-name"></div>
-              <div id="origin"></div>
-              <div id="origin-only"></div>
-              <div id="custom-message"></div>
-            </td>
-          </tr>
-        </table>
-      </div>
-    </div>
-
-    <div id="string-location-privacy-statement" style="display:none; padding-top:3px;"></div>
-
-    <p id="checkbox-row" style="display:none">
-      <table width="100%" cellspacing="0" cellpadding="0" border="0">
-        <tr>
-          <td valign="middle">
-            <input type="checkbox" id="unlock" accesskey="T"
-                   onclick="updateAllowButtonEnabledState()">
-          </td>
-          <td valign="middle">
-            <label for="unlock">
-              &nbsp;<span id="string-trust-site"></span>
-            </label>
-          </td>
-        </tr>
-      </table>
-    </p>
-    
-  </div>
-
-  <div id="foot">
-
-    <div id="button-row">
-      <table cellpadding="0" cellspacing="0" border="0">
-        <tr>
-
-
-          <td width="100%" valign="middle">
-
-            <a href="#" onclick="denyAccessPermanently(); return false;">
-
-            <span id="string-never-allow-link"></span></a>
-
-          </td>
-
-
-          <td nowrap="true" align="right" valign="middle">
-            <button id="allow-button" class="custom"
-              onclick="allowAccessPermanently(); return false;"></button
-            ><button id="deny-button" class="custom"
-              onclick="denyAccessTemporarily(); return false;"></button>
-          </td>
-        </tr>
-      </table>
-    </div>
-  </div>
-
-
-</body>
-<!--
-We include all files through m4 as the HTML dialog implementation on
-PocketIE does not support callbacks for loading external JavaScript files.
-TODO: find a better way to include scripts for PIE
--->
-<script>
-/*
-Copyright (c) 2005 JSON.org
-
-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 Software shall be used for Good, not Evil.
-
-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.
-*/
-
-//Array.prototype.______array = '______array';
-
-var JSON = {
-    org: 'http://www.JSON.org',
-    copyright: '(c)2005 JSON.org',
-    license: 'http://www.crockford.com/JSON/license.html',
-
-    stringify: function (arg) {
-        var c, i, l, s = '', v;
-
-        switch (typeof arg) {
-        case 'object':
-            if (arg) {
-                if (arg.constructor == Array.prototype.constructor) {
-                    for (i = 0; i < arg.length; ++i) {
-                        v = this.stringify(arg[i]);
-                        if (s) {
-                            s += ',';
-                        }
-                        s += v;
-                    }
-                    return '[' + s + ']';
-                } else if (typeof arg.toString != 'undefined') {
-                    for (i in arg) {
-                        v = arg[i];
-                        if (typeof v != 'undefined' && typeof v != 'function') {
-                            v = this.stringify(v);
-                            if (s) {
-                                s += ',';
-                            }
-                            s += this.stringify(i) + ':' + v;
-                        }
-                    }
-                    return '{' + s + '}';
-                }
-            }
-            return 'null';
-        case 'number':
-            return isFinite(arg) ? String(arg) : 'null';
-        case 'string':
-            l = arg.length;
-            s = '"';
-            for (i = 0; i < l; i += 1) {
-                c = arg.charAt(i);
-                if (c >= ' ') {
-                    if (c == '\\' || c == '"') {
-                        s += '\\';
-                    }
-                    s += c;
-                } else {
-                    switch (c) {
-                        case '\b':
-                            s += '\\b';
-                            break;
-                        case '\f':
-                            s += '\\f';
-                            break;
-                        case '\n':
-                            s += '\\n';
-                            break;
-                        case '\r':
-                            s += '\\r';
-                            break;
-                        case '\t':
-                            s += '\\t';
-                            break;
-                        default:
-                            c = c.charCodeAt();
-                            s += '\\u00' + Math.floor(c / 16).toString(16) +
-                                (c % 16).toString(16);
-                    }
-                }
-            }
-            return s + '"';
-        case 'boolean':
-            return String(arg);
-        default:
-            return 'null';
-        }
-    },
-    parse: function (text) {
-        var at = 0;
-        var ch = ' ';
-
-        function error(m) {
-            throw {
-                name: 'JSONError',
-                message: m,
-                at: at - 1,
-                text: text
-            };
-        }
-
-        function next() {
-            ch = text.charAt(at);
-            at += 1;
-            return ch;
-        }
-
-        function white() {
-            while (ch) {
-                if (ch <= ' ') {
-                    next();
-                } else if (ch == '/') {
-                    switch (next()) {
-                        case '/':
-                            while (next() && ch != '\n' && ch != '\r') {}
-                            break;
-                        case '*':
-                            next();
-                            for (;;) {
-                                if (ch) {
-                                    if (ch == '*') {
-                                        if (next() == '/') {
-                                            next();
-                                            break;
-                                        }
-                                    } else {
-                                        next();
-                                    }
-                                } else {
-                                    error("Unterminated comment");
-                                }
-                            }
-                            break;
-                        default:
-                            error("Syntax error");
-                    }
-                } else {
-                    break;
-                }
-            }
-        }
-
-        function string() {
-            var i, s = '', t, u;
-
-            if (ch == '"') {
-outer:          while (next()) {
-                    if (ch == '"') {
-                        next();
-                        return s;
-                    } else if (ch == '\\') {
-                        switch (next()) {
-                        case 'b':
-                            s += '\b';
-                            break;
-                        case 'f':
-                            s += '\f';
-                            break;
-                        case 'n':
-                            s += '\n';
-                            break;
-                        case 'r':
-                            s += '\r';
-                            break;
-                        case 't':
-                            s += '\t';
-                            break;
-                        case 'u':
-                            u = 0;
-                            for (i = 0; i < 4; i += 1) {
-                                t = parseInt(next(), 16);
-                                if (!isFinite(t)) {
-                                    break outer;
-                                }
-                                u = u * 16 + t;
-                            }
-                            s += String.fromCharCode(u);
-                            break;
-                        default:
-                            s += ch;
-                        }
-                    } else {
-                        s += ch;
-                    }
-                }
-            }
-            error("Bad string");
-        }
-
-        function array() {
-            var a = [];
-
-            if (ch == '[') {
-                next();
-                white();
-                if (ch == ']') {
-                    next();
-                    return a;
-                }
-                while (ch) {
-                    a.push(value());
-                    white();
-                    if (ch == ']') {
-                        next();
-                        return a;
-                    } else if (ch != ',') {
-                        break;
-                    }
-                    next();
-                    white();
-                }
-            }
-            error("Bad array");
-        }
-
-        function object() {
-            var k, o = {};
-
-            if (ch == '{') {
-                next();
-                white();
-                if (ch == '}') {
-                    next();
-                    return o;
-                }
-                while (ch) {
-                    k = string();
-                    white();
-                    if (ch != ':') {
-                        break;
-                    }
-                    next();
-                    o[k] = value();
-                    white();
-                    if (ch == '}') {
-                        next();
-                        return o;
-                    } else if (ch != ',') {
-                        break;
-                    }
-                    next();
-                    white();
-                }
-            }
-            error("Bad object");
-        }
-
-        function number() {
-            var n = '', v;
-            if (ch == '-') {
-                n = '-';
-                next();
-            }
-            while (ch >= '0' && ch <= '9') {
-                n += ch;
-                next();
-            }
-            if (ch == '.') {
-                n += '.';
-                while (next() && ch >= '0' && ch <= '9') {
-                    n += ch;
-                }
-            }
-            if (ch == 'e' || ch == 'E') {
-                n += 'e';
-                next();
-                if (ch == '-' || ch == '+') {
-                    n += ch;
-                    next();
-                }
-                while (ch >= '0' && ch <= '9') {
-                    n += ch;
-                    next();
-                }
-            }
-            v = +n;
-            if (!isFinite(v)) {
-                ////error("Bad number");
-            } else {
-                return v;
-            }
-        }
-
-        function word() {
-            switch (ch) {
-                case 't':
-                    if (next() == 'r' && next() == 'u' && next() == 'e') {
-                        next();
-                        return true;
-                    }
-                    break;
-                case 'f':
-                    if (next() == 'a' && next() == 'l' && next() == 's' &&
-                            next() == 'e') {
-                        next();
-                        return false;
-                    }
-                    break;
-                case 'n':
-                    if (next() == 'u' && next() == 'l' && next() == 'l') {
-                        next();
-                        return null;
-                    }
-                    break;
-            }
-            error("Syntax error");
-        }
-
-        function value() {
-            white();
-            switch (ch) {
-                case '{':
-                    return object();
-                case '[':
-                    return array();
-                case '"':
-                    return string();
-                case '-':
-                    return number();
-                default:
-                    return ch >= '0' && ch <= '9' ? number() : word();
-            }
-        }
-
-        return value();
-    }
-};
-
-// Copyright 2008, The Android Open Source Project
-//
-// Redistribution and use in source and binary forms, with or without 
-// modification, are permitted provided that the following conditions are met:
-//
-//  1. Redistributions of source code must retain the above copyright notice, 
-//     this list of conditions and the following disclaimer.
-//  2. 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.
-//  3. Neither the name of Google Inc. nor the names of its contributors may be
-//     used to endorse or promote products derived from this software without
-//     specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-
-//=============================================================================
-// Various basic JavaScript utilities.
-//=============================================================================
-
-/**
- * Check that the type is not undefined (we do it here as on
- * some devices typeof returns unknown instead of undefined...).
- * We have to pass the evaluation of (typeof elem) (i.e., a string)
- * to the function rather than simply (element) -- passing an 
- * undefined object would make the function crash on PIE.
- */
-function isDefined(type) {
-  return type != 'undefined' && type != 'unknown';
-}
-
-/**
- * Returns true if val is a function.
- */
-function isFunction(val) {
-  return typeof val == "function";
-}
-
-// TODO(aa): more basic type checking here.
-
-
-/**
- * Creates a 'bound' function that calls the current function with a preset
- * 'this' object and set of arguments.
- */
-Function.prototype.bind = function(obj) {
-  var preArgs = Array.prototype.slice.call(arguments, 1);
-  var self = this;
-  return function() {
-    var postArgs = Array.prototype.slice.call(arguments, 0);
-    var totalArgs = preArgs.concat(postArgs);
-    return self.apply(obj, totalArgs);
-  }
-};
-
-/**
- * Creates a partially applied function that calls the current function with
- * a preset set of arguments.
- */
-Function.prototype.partial = function() {
-  var args = Array.prototype.slice.call(arguments, 0);
-  return this.bind(null, args);
-};
-
-/**
- * Binds all the methods in obj to obj.
- */
-function bindMethods(obj) {
-  for (var p in obj) {
-    if (isFunction(obj[p])) {
-      obj[p] = obj[p].bind(obj);
-    }
-  }
-}
-
-
-/**
- * Trim leading and trailing whitespace from a string.
- */
-String.prototype.trim = function(str) {
-  return this.replace(/^\s+/, "").replace(/\s+$/, "");
-};
-
-
-/**
- * Find the index of a given element in an array. Returns -1 if the item does
- * not exist.
- */
-Array.prototype.indexOf = function(item) {
-  for (var i = 0; i < this.length; i++) {
-    if (this[i] === item) {
-      return i;
-    }
-  }
-  return -1;
-};
-
-/**
- * Makes a deep copy of an object.
- */
-function cloneObject(original) {
-  var newObject = new Object();
-  for (i in original) {
-    if (typeof original[i] == 'object') {
-      newObject[i] = cloneObject(original[i]);
-    }
-    else {
-      newObject[i] = original[i];
-    }
-  }
-  newObject.length = original.length;
-  return newObject;
-}
-
-var browser = {};
-
-(function() {
-  var ua = navigator.userAgent;
-  browser.opera = typeof opera != "undefined";
-  browser.ie = !browser.opera && ua.indexOf("MSIE") > -1;
-  browser.ie_mobile = (ua.indexOf("Windows CE") > -1) &&
-      (ua.indexOf("MSIE") > -1);
-  browser.webkit = ua.indexOf("WebKit") > -1;
-  // WebKit also gives product == "gecko".
-  browser.mozilla = !browser.webkit && navigator.product == "Gecko";
-  browser.safari = ua.indexOf("Safari") > -1;
-  browser.mac = navigator.platform.indexOf("Mac") > -1;
-  browser.linux = navigator.platform.indexOf("Linux") > -1;
-  browser.windows = navigator.platform.indexOf("Win") > -1;
-  browser.android = ua.indexOf("Android") > -1;
-  if (browser.android) {
-    browser.safari = false;
-  }
-  // TODO(aa): Add detection for more browsers, as necessary.
-})();
-
-// Copyright 2008, The Android Open Source Project
-//
-// Redistribution and use in source and binary forms, with or without 
-// modification, are permitted provided that the following conditions are met:
-//
-//  1. Redistributions of source code must retain the above copyright notice, 
-//     this list of conditions and the following disclaimer.
-//  2. 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.
-//  3. Neither the name of Google Inc. nor the names of its contributors may be
-//     used to endorse or promote products derived from this software without
-//     specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-
-//=============================================================================
-// DOM manipulation utilities.
-// Requires: base.js
-//=============================================================================
-
-var dom = {};
-
-/**
- * Provides a cross-browser way of getting an element by its id
- */
-dom.getElementById = function(id) {
-  if (isDefined(typeof document.getElementById)) {
-    return document.getElementById(id);
-  } else if (isDefined(typeof document.all)) {
-    return document.all[id];
-  }
-  throw new Error("Failed to get element by ID.");
-};
-
-/**
- * Gets the position and dimensions of an element in pixels in relation
- * to the window origin.
- */
-dom.getPosition = function(elem) {
-  var ret = { 'left'   : 0,
-              'top'    : 0,
-              'width'  : elem.width,
-              'height' : elem.height };
-  
-  if (!elem.offsetParent) return ret;
-  
-  var left = 0;
-  var top = 0;
-  while (elem) {
-    left += elem.offsetLeft;
-    top += elem.offsetTop;
-    elem = elem.offsetParent
-  }
-  ret.left = left;
-  ret.top = top;
-  return ret;
-};
-
-/**
- * Returns the height of the inside of the window.
- */
-dom.getWindowInnerHeight = function() {
-  if (isDefined(typeof window.innerHeight)) { // Firefox
-    return window.innerHeight;
-  } else if (isDefined(typeof document.body.offsetHeight)) { // IE
-    return document.body.offsetHeight;
-  }
-
-  throw new Error("Could not get windowInnerHeight.");
-};
-
-/**
- * Add an event listener to an element cross-browser.
- */
-dom.addEvent = function(element, eventName, handler) {
-  var wrapper = dom._callEventHandler.bind(dom, handler);
-
-  if (isDefined(typeof element.addEventListener)) {
-    // Standards-compatible browsers
-    element.addEventListener(eventName, wrapper, false);
-  } else if (isDefined(typeof element.attachEvent)) {
-    // IE
-    element.attachEvent("on" + eventName, wrapper);
-  } else {
-    throw new Error('Failed to attach event.');
-  }
-};
-
-/**
- * Private helper for calling event handlers compatibly across browsers.
- */
-dom._callEventHandler = function(handler, e) {
-  // Older versions of IE don't pass event to the handler.
-  if (!e) e = window.event;
-
-  // TODO(aa): Normalize event object properties.
-
-  return handler(e);
-};
-
-/**
- * Gets the CSS classes for an element.
- */
-dom.getClasses = function(elm) {
-  return elm.className.split(/\s+/);
-};
-
-/**
- * Check is an element has a particular CSS class name.
- */
-dom.hasClass = function(elm, className) {
-  return this.getClasses(elm).indexOf(className) > -1;
-};
-
-/**
- * Adds a CSS class to an element. Do nothing if the class already exists.
- */
-dom.addClass = function(elm, className) {
-  var classes = this.getClasses(elm);
-  if (classes.indexOf(className) > -1) {
-    return;
-  }
-  classes.push(className);
-  elm.className = classes.join(" ");
-};
-
-/**
- * Removes a CSS class from an element. Do nothing if the class doesn't exist.
- */
-dom.removeClass = function(elm, className) {
-  var classes = this.getClasses(elm);
-  var index = classes.indexOf(className);
-  if (index == -1) {
-    return;
-  }
-  classes.splice(index, 1);
-  elm.className = classes.join(" ");
-};
-
-/**
- * Gets the text (non-html) content of an element.
- */
-dom.getTextContent = function(elm) {
-  if (isDefined(typeof elm.textContent)) {
-    return elm.textContent;
-  } else if (isDefined(typeof elm.innerText)) {
-    return elm.innerText;
-  } else {
-    throw new Error("Could not find a property to get text content.");
-  }
-};
-
-/**
- * Sets the text (non-html) contents of an element.
- */
-dom.setTextContent = function(elm, text) {
-  if (isDefined(typeof elm.textContent)) {
-    elm.textContent = text;
-  } else if (isDefined(typeof elm.innerText)) {
-    elm.innerText = text;
-  } else {
-    throw new Error("Could not find a property to set text content.");
-  }
-};
-
-// Copyright 2007, The Android Open Source Project
-//
-// Redistribution and use in source and binary forms, with or without 
-// modification, are permitted provided that the following conditions are met:
-//
-//  1. Redistributions of source code must retain the above copyright notice, 
-//     this list of conditions and the following disclaimer.
-//  2. 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.
-//  3. Neither the name of Google Inc. nor the names of its contributors may be
-//     used to endorse or promote products derived from this software without
-//     specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-
-/**
- * Initialize the base functionality of the dialog.
- */
-function initDialog() {
-  if (!browser.ie_mobile) {
-    dom.addEvent(document, "keyup", handleKeyUp);
-  } else {
-    var buttonRowElem = null;
-    if (window.pie_dialog.IsSmartPhone()) {
-      buttonRowElem = dom.getElementById("button-row-smartphone");
-    } else {
-      buttonRowElem = dom.getElementById("button-row");
-    }
-    if (buttonRowElem) {
-      buttonRowElem.style.display = 'block';
-    }
-  }
-  if (browser.ie_mobile) {
-    window.pie_dialog.SetScriptContext(window);
-    window.pie_dialog.ResizeDialog();
-  }
-}
-
-/**
- * Set the label of an input button, and optionally, its accesskey.
- */
-function setButtonLabel(textID, elemID, accessKeyID) {
-  var textElem = dom.getElementById(textID);
-  var buttonElem = dom.getElementById(elemID);
-  if (textElem == null || buttonElem == null) {
-    return;
-  }
-
-  var accessKeyElem = null;
-  if (isDefined(typeof accessKeyID)) {
-    accessKeyElem = dom.getElementById(accessKeyID);
-  }
-
-  // This function works for two different kinds of buttons. Simple buttons
-  // based on the <input type="button"> tag, and custom buttons based on a
-  // <button> tag with the css class "custom".
-  // Note that on Windows Mobile 5, the tagName property is not defined.
-  // We can therefore safely assume that the converse is also true:
-  // if tagName is not defined, then the platform must be Windows Mobile 5.  
-  if (!isDefined(typeof buttonElem.tagName) ||
-      buttonElem.tagName.toLowerCase() == "input") {
-    buttonElem.value = dom.getTextContent(textElem).trim();
-    if (accessKeyElem != null) {
-      buttonElem.accessKey = dom.getTextContent(accessKeyElem).trim();
-    }
-  } else if (buttonElem.tagName.toLowerCase() == "button") {
-    var text = dom.getTextContent(textElem).trim();
-
-    if (accessKeyElem != null) {
-      // Some browsers use the accessKey attribute of the the anchor tag.
-      var accessKey = dom.getTextContent(accessKeyElem).trim();
-      buttonElem.accessKey = accessKey;
-
-      // Find the first matching character in the text and mark it.
-      // Note: this form of String.replace() only replaces the first occurence.
-      text = text.replace(accessKey,
-                          "<span class='accesskey'>" + accessKey + "</span>");
-    }
-
-    buttonElem.innerHTML = text;
-  } else {
-    throw new Error("Unexpected button tag name: " + buttonElem.tagName);
-  }
-}
-
-/**
- * Allows a dialog to do custom layout when the window changes sizes. The
- * provided function will be called with the height of the content area when the
- * dialog should relayout.
- */
-function initCustomLayout(layoutFunction) {
-  function doLayout() {
-    layoutFunction(getContentHeight());
-  }
-
-  doLayout();
-
-  // We do an additional layout in onload because sometimes things aren't
-  // stabilized when the first doLayout() is called above.
-  dom.addEvent(window, "load", doLayout);
-  dom.addEvent(window, "resize", doLayout);
-
-  // Mozilla doesn't fire continuous events during resize, so if we want to get
-  // somewhat smooth resizing, we need to run our own timer loop. This still
-  // doesn't look perfect, because the timer goes off out of sync with the
-  // browser's internal reflow, but I think it's better than nothing.
-  // TODO(aa): Keep looking for a way to get an event for each reflow, like IE.
-  if (browser.mozilla) {
-    var lastHeight = -1;
-
-    function maybeDoLayout() {
-      var currentHeight = dom.getWindowInnerHeight();
-      if (currentHeight != lastHeight) {
-        lastHeight = currentHeight;
-        doLayout();
-      }
-    }
-
-    window.setInterval(maybeDoLayout, 30);
-  }
-}
-
-/**
- * Get the JSON-formatted arguments that were passed by the caller.
- */
-function getArguments() {
-  var argsString;
-  if (browser.ie_mobile) {
-    argsString = window.pie_dialog.GetDialogArguments();
-  } else if (browser.ie) {
-    argsString = window.external.GetDialogArguments();
-  } else if (browser.mozilla) {
-    argsString = getFirefoxArguments(window.arguments[0]);
-  } else if (browser.safari) {
-    argsString = window.gears_dialogArguments;
-  } else if (browser.android) {
-    argsString = "" + window.bridge.getDialogArguments();
-  }
-
-  if (typeof argsString == "string") {
-    return JSON.parse(argsString);
-  } else {
-    return null;
-  }
-}
-
-/**
- * Helper used by getArguments(). Getting the arguments in the right type is
- * more involved in Firefox.
- */
-function getFirefoxArguments(windowArguments) {
-  var Ci = Components.interfaces;
-  windowArguments.QueryInterface(Ci.nsIProperties);
-  var supportsString = 
-    windowArguments.get("dialogArguments", Ci.nsISupportsString);
-  return supportsString.data;
-}
-
-/**
- * Close the dialog, sending the specified result back to the caller.
- */
-function saveAndClose(resultObject) {
-  var resultString = JSON.stringify(resultObject);
-  if (browser.ie_mobile) {
-    window.pie_dialog.CloseDialog(resultString);
-  } else if (browser.ie) {
-    window.external.CloseDialog(resultString);
-  } else if (browser.mozilla) {
-    saveFirefoxResults(resultString);
-    window.close();
-  } else if (browser.safari) {
-    window.gears_dialog.setResults(resultString);
-  } else if (browser.android) {
-    window.bridge.closeDialog(resultString);
-  }
-}
-
-/**
- * Helper used by endDialog() for Firefox.
- */
-function saveFirefoxResults(resultString) {
-  var Cc = Components.classes;
-  var Ci = Components.interfaces;
-  
-  var props = window.arguments[0].QueryInterface(Ci.nsIProperties);
-  var supportsString = Cc["@mozilla.org/supports-string;1"]
-      .createInstance(Ci.nsISupportsString);
-      
-  supportsString.data = resultString;
-  props.set("dialogResult", supportsString);
-}
-
-/**
- * Returns the height of the content area of the dialog.
- */
-function getContentHeight() {
-  var head = dom.getElementById("head");
-  var foot = dom.getElementById("foot");
-  return dom.getWindowInnerHeight() - head.offsetHeight - foot.offsetHeight;
-}
-
-/**
- * For some reason ESC doesn't work on HTML dialogs in either Firefox or IE. So
- * we implement it manually.
- */
-function handleKeyUp(e) {
-  var ESC_KEY_CODE = 27;
-  
-  if (e.keyCode == ESC_KEY_CODE) {
-    saveAndClose(null);
-  }
-}
-
-/**
- * Disables a button in the right way, whether it is normal or custom.
- */
-function disableButton(buttonElem) {
-  buttonElem.disabled = true;
-
-  if (browser.ie_mobile) {
-    window.pie_dialog.SetButtonEnabled(false);
-  }
-
-  if (!isDefined(typeof buttonElem.tagName) || 
-      buttonElem.tagName.toLowerCase() == "input") {
-    buttonElem.style.color = "gray";
-  } else if (buttonElem.tagName.toLowerCase() == "button") {
-    dom.addClass(buttonElem, "disabled");
-  } else {
-    throw new Error("Unexpected tag name: " + buttonElem.tagName);
-  }
-}
-
-/**
- * Enables a button in the right way, whether it is normal or custom.
- */
-function enableButton(buttonElem) {
-  buttonElem.disabled = false;
-
-  if (browser.ie_mobile) {
-    window.pie_dialog.SetButtonEnabled(true);
-  }
-  
-  if (!isDefined(typeof buttonElem.tagName) ||
-      buttonElem.tagName.toLowerCase() == "input") {
-    buttonElem.style.color = "black";
-  } else if (buttonElem.tagName.toLowerCase() == "button") {
-    dom.removeClass(buttonElem, "disabled");
-  } else {
-    throw new Error("Unexpected tag name: " + buttonElem.tagName);
-  }
-}
-
-/**
- * Returns a wrapped domain (useful for small screens dialogs, 
- * e.g. windows mobile devices)
- */
-function wrapDomain(str) {
-  if (!browser.ie_mobile) {
-    return str;
-  }
-
-  var max = 20;
-  var url;
-  var scheme_start = str.indexOf("://");
-  var scheme = "";
-
-  if (scheme_start != -1) {
-    scheme = str.substring(0, scheme_start);
-    scheme += "://";
-    // there's automatically an hyphenation
-    // point used by the browser after http://
-    // so we only have to hyphenate the
-    // rest of the string
-    url = str.substring(scheme.length);
-  } else {
-    url = str;
-  }
-
-  // We hyphenate the string on every dot
-  var components = url.split(".");
-  if (components.length < 1) {
-    return str;
-  }
-
-  var content = components[0];
-  var len = content.length;
-  for (var i=1; i < components.length; i++) {
-    var elem = components[i];
-    content += ".";
-    len++;
-    if (len + elem.length > max) {
-      content += "<br>";
-      len = 0;
-    }
-    content += elem;
-    len += elem.length;
-  }
-  return scheme + content;
-}
-
-/**
- * Resizes the dialog to fit the content size.
- */
-function resizeDialogToFitContent(opt_minDialogInnerHeight) {
-  // This does not work on PIE (no height measurement)
-  if (browser.ie_mobile) {
-    window.pie_dialog.ResizeDialog();
-    return;
-  }
-  // window.resize() is not working on Android, we bail out.
-  if (browser.android) {
-    return;
-  }
-
-  // Resize the window to fit
-  var contentDiv = dom.getElementById("content");
-  var contentHeightProvided = getContentHeight();
-  var contentHeightDesired = contentDiv.offsetHeight;
-
-  var dialogHeightProvided = dom.getWindowInnerHeight();
-  var dialogHeightDesired =
-      dialogHeightProvided + (contentHeightDesired - contentHeightProvided);
-
-  var minDialogHeight = opt_minDialogInnerHeight || 0;
-  var maxDialogHeight = 400; // arbitrary max height for a dialog to resize to
-  
-  var targetHeight = Math.max(dialogHeightDesired, minDialogHeight);
-  targetHeight = Math.min(dialogHeightDesired, maxDialogHeight);
-
-  if (targetHeight != dialogHeightProvided) {
-    var dy = targetHeight - dialogHeightProvided;
-    window.resizeBy(0, dy);
-  }
-}
-
-/**
- * Safari running on OSX 10.4 can't load images dynamically from the network,
- * this helper function calls gears-specific code to work around this
- * limitation.
- */
-function loadImage(elem, image_url) {
-  if (browser.safari) {
-    var position = dom.getPosition(elem);
-    window.gears_dialog.loadImageIntoElement(image_url, position.top,
-                                             position.left,
-                                             position.width,
-                                             position.height);
-  } else {
-    elem.src = image_url;
-  }
-}
-
-// Copyright 2008, The Android Open Source Project
-//
-// Redistribution and use in source and binary forms, with or without 
-// modification, are permitted provided that the following conditions are met:
-//
-//  1. Redistributions of source code must retain the above copyright notice, 
-//     this list of conditions and the following disclaimer.
-//  2. 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.
-//  3. Neither the name of Google Inc. nor the names of its contributors may be
-//     used to endorse or promote products derived from this software without
-//     specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-
-//=============================================================================
-// Implements the behavior of our custom buttons. There is no native support in
-// IE for rounded corners on HTML elements, so this script also implements a
-// hack to simulate them in that browser.
-//
-// Requires: base.js, dom.js
-//=============================================================================
-
-/**
- * Constructor.
- */
-function CustomButton(htmlButton) {
-  bindMethods(this);
-  
-  this._focused = false;
-  this._htmlButton = htmlButton;
-
-  if (!document.all) {  // not IE
-    dom.addEvent(htmlButton, "mouseover", this._handleMouseOver);
-    dom.addEvent(htmlButton, "mouseout", this._handleMouseOut);
-  } else {  // IE
-    // mouseover/mouseout behave badly with nested elements in IE. Luckily,
-    // mouseenter/mouseleave are provided and have the equivalent semantics.
-    dom.addEvent(htmlButton, "mouseenter", this._handleMouseOver);
-    dom.addEvent(htmlButton, "mouseleave", this._handleMouseOut);
-
-    // We also handle focus and blur in IE so that we can update the corners
-    // to match the black border IE provides.
-    dom.addEvent(htmlButton, "focusin", this._handleFocus);
-    dom.addEvent(htmlButton, "blur", this._handleBlur);
-
-    dom.addClass(htmlButton, "ie");
-    this._createCorners();
-  }
-
-  // Limit button widths to a minimum of 60px. They look funny skinnier.  
-  if (htmlButton.offsetWidth < 60) {
-    htmlButton.style.width = "60px";
-  }
-
-  htmlButton.style.visibility = "visible";
-}
-
-/**
- * Initializes all the custom buttons on the page.
- */
-CustomButton.initializeAll = function() {
-  var buttons = document.getElementsByTagName("button");
-  for (var i = 0, button; button = buttons[i]; i++) {
-    if (dom.hasClass(button, "custom")) {
-      new CustomButton(button);
-    }
-  }
-};
-
-/**
- * Highlights the button on mouseover. Note that this gets called multiple
- * times while the mouse goes over sub elements inside the button.
- */
-CustomButton.prototype._handleMouseOver = function() {
-  if (!this._htmlButton.disabled && !this._focused) {
-    dom.addClass(this._htmlButton, "hover");
-    this._setCornerColor("blue");
-  }
-};
-
-/**
- * Undoes the highlighting of the button on mouseout. Note that this gets called
- * multiple times when the mouse moves out of sub elements, even if it is still
- * over the button. That is OK, as long as there is immediately a mouseover
- * event.
- */
-CustomButton.prototype._handleMouseOut = function() {
-  if (!this._htmlButton.disabled && !this._focused) {
-    dom.removeClass(this._htmlButton, "hover");
-    this._setCornerColor("grey");
-  }
-};
-
-/**
- * Highlights the button on focus. Currently only used for IE.
- * TODO(aa): The black highlight looks cool. Consider for other browsers.
- */
-CustomButton.prototype._handleFocus = function() {
-  dom.removeClass(this._htmlButton, "hover");
-  this._setCornerColor("black");
-  this._focused = true;
-};
-
-/**
- * Undoes the highlighting of the button on blur.
- */
-CustomButton.prototype._handleBlur = function() {
-  this._setCornerColor("grey");
-  this._focused = false;
-};
-
-/**
- * Helper to create the graphics that make the button have rounded corners in
- * IE.
- */
-CustomButton.prototype._createCorners = function() {
-  // Making the button position:relative makes it possible to position things
-  // inside it relative to it's border.
-  this._htmlButton.style.position = "relative";
-
-  var verticalEdges = ["left", "right"];
-  var horizontalEdges = ["top", "bottom"];
-  var colors = ["grey", "blue", "black"];
-
-  for (var i = 0; i < verticalEdges.length; i++) {
-    for (var j = 0; j < horizontalEdges.length; j++) {
-      for (var k = 0; k < colors.length; k++) {
-        var img = document.createElement("img");
-        img.src = "button_corner_" + colors[k]  + ".gif";
-        img.color  = colors[k];
-        img.style.position = "absolute";
-        img.style[verticalEdges[i]] = "-2px";
-        img.style[horizontalEdges[j]] = "-2px";
-        img.style.filter =
-            "progid:DXImageTransform.Microsoft.BasicImage(Rotation=" + 
-            (i + j) + ")";
-        this._htmlButton.appendChild(img);
-      }
-    }
-  }
-
-  this._setCornerColor("grey");
-};
-
-/**
- * Sets the color of the corners in IE by changing the stack order of the corner
- * images.
- */
-CustomButton.prototype._setCornerColor = function(newColor) {
-  var imgs = this._htmlButton.getElementsByTagName("img");
-  for (var i = 0, img; img = imgs[i]; i++) {
-    img.style.zIndex = Number(img.color == newColor);
-  }
-};
-
-var localized_strings = {
-  "el": {
-    "string-workerpool-desc": "Εκτέλεση ασύγχρονου JavaScript για βελτίωση απόκρισης εφαρμογών",
-    "string-allow": "Να επιτρέπεται",
-    "string-query-data": "Ο παρακάτω ιστότοπος επιθυμεί να αποθηκεύει πληροφορίες στον υπολογιστή σας χρησιμοποιώντας το Gears.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "Ο παρακάτω ιστότοπος επιθυμεί να αποκτήσει πρόσβαση σε πληροφορίες σχετικά με την τοποθεσία σας μέσω του Gears.",
-    "string-html-title": "Προειδοποίηση ασφαλείας Gears",
-    "string-description": "Το Gears είναι μια επέκταση προγράμματος περιήγησης ανοιχτής προέλευσης που επιτρέπει τις εφαρμογές ιστού να παρέχουν λειτουργίες εκτός σύνδεσης χρησιμοποιώντας τα ακόλουθα JavaScript API:",
-    "string-database-desc": "Αποθήκευση δεδομένων τοπικά σε μια σχεσιακή βάση δεδομένων με δυνατότητα πλήρους αναζήτησης",
-    "string-allow-accesskey": "A",
-    "string-cancel": "Άκυρο",
-    "string-never-allow-link": "Να μην επιτρέπεται ποτέ αυτός ο ιστότοπος",
-    "string-deny": "Απόρριψη",
-    "string-never-allow-link-wince": "Να μην επιτρέπεται ποτέ",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Αποθήκευση και διανομή πόρων εφαρμογών τοπικά",
-    "string-location-privacy-statement": "Διαβάστε την πολιτική για θέματα ιδιωτικού περιεχομένου του ιστότοπου για να δείτε πώς θα χρησιμοποιηθεί η τοποθεσία σας.",
-    "string-trust-site": "Εμπιστεύομαι αυτόν τον ιστότοπο. Να επιτρέπεται να χρησιμοποιεί το Gears."
-  },
-  "gu": {
-    "string-workerpool-desc": "એપ્લિકેશનની રિસ્પોંસિવનેસ વધારવા માટે અસિંક્રોનસ JavaScript ચલાવો",
-    "string-allow": "મંજૂરી આપો",
-    "string-query-data": "નીચેની વેબસાઇટ Gearsનો ઉપયોગ કરીને તમારા કમ્પ્યુટર પર માહિતી સંગ્રહિત કરવા માંગે છે.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "નીચેની વેબસાઇટ Gearsનો ઉપયોગ કરીને તમારા સ્થાન વિશેની માહિતી એક્સેસ કરવા માંગે છે.",
-    "string-html-title": "Gears સુરક્ષા ચેતવણી",
-    "string-description": "Gears એક ઓપન સોર્સ બ્રાઉઝર એક્સ્ટેંશન છે જે નીચેની JavaScript APIsનો ઉપયોગ કરીને ઓફલાઇન ફંક્શનાલિટી આપવા વેબ એપ્લિકેશંસને એનેબલ કરે છે.",
-    "string-database-desc": "ડેટાને સ્થાનિક રીતે સંપૂર્ણ રીતે શોધી શકાય તેવા રિલેશનલ ડેટાબેસમાં સ્ટોર કરો",
-    "string-allow-accesskey": "A",
-    "string-cancel": "રદ કરો",
-    "string-never-allow-link": "આ સાઇટને ક્યારેય મંજૂરી આપશો નહીં",
-    "string-deny": "નકારો",
-    "string-never-allow-link-wince": "તેને ક્યારેય મંજૂર કરશો નહીં",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "એપ્લિકેશન સાધનોને સ્થાનિક રીતે સ્ટોર અને સર્વ કરો",
-    "string-location-privacy-statement": "તમારા સ્થળનો ઉપયોગ કેવી રીતે થશે તે જોવા સાઇટની ગોપનીયતા નીતિ વાંચો.",
-    "string-trust-site": "આ સાઇટ પર મને વિષ્વાસ છે. તેને Gearsનો ઉપયોગ કરવાની મંજુરી આપો."
-  },
-  "zh-TW": {
-    "string-workerpool-desc": "執行非同步 JavaScript 以提升應用程式的回應速度",
-    "string-allow": "允許",
-    "string-query-data": "下方的網站要使用 Gears 在您的電腦上儲存資訊。",
-    "string-deny-accesskey": "D",
-    "string-query-location": "下方的網站要使用 Gears 存取您位置的相關資訊。",
-    "string-html-title": "Gears 安全性警告",
-    "string-description": "Gears 是一種開放程式碼的瀏覽器擴充功能,它透過下列 JavaScript API 為網路應用程式提供離線功能:",
-    "string-database-desc": "在本機將資料儲存到完全可搜尋的關聯式資料庫中",
-    "string-allow-accesskey": "A",
-    "string-cancel": "取消",
-    "string-never-allow-link": "永不允許這個網站",
-    "string-deny": "拒絕",
-    "string-never-allow-link-wince": "永不允許",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "在本機儲存並提供應用程式資源",
-    "string-location-privacy-statement": "閱讀網站的隱私權政策以查看網站會如何使用您的位置。",
-    "string-trust-site": "我相信這個網站。 讓它使用 Gears。"
-  },
-  "vi": {
-    "string-workerpool-desc": "Chạy JavaScript không đồng bộ để tăng khả năng phản hồi của ứng dụng",
-    "string-allow": "Cho phép",
-    "string-query-data": "Trang web dưới đây muốn lưu trữ thông tin trên máy tính của bạn bằng cách sử dụng Gears.",
-    "string-deny-accesskey": "T",
-    "string-query-location": "Trang web dưới đây muốn truy cập vào thông tin về vị trí của bạn bằng cách sử dụng Gears.",
-    "string-html-title": "Cảnh báo Bảo mật của Gears",
-    "string-description": "Gears là một tiện ích bổ sung nguồn mở của trình duyệt cho phép ứng dụng web cung cấp tính năng ngoại tuyến bằng cách sử dụng các JavaScript API dưới đây:",
-    "string-database-desc": "Lưu dữ liệu cục bộ trong cơ sở dữ liệu quan hệ có thể tìm kiếm đầy đủ",
-    "string-allow-accesskey": "P",
-    "string-cancel": "Huỷ",
-    "string-never-allow-link": "Không bao giờ cho phép trang web này",
-    "string-deny": "Từ chối",
-    "string-never-allow-link-wince": "Không bao giờ cho phép Gears trên trang web này",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Lưu trữ và phục vụ các tài nguyên ứng dụng cục bộ",
-    "string-location-privacy-statement": "Đọc chính sách bảo mật của trang để xem vị trí của bạn sẽ được sử dụng thế nào.",
-    "string-trust-site": "Tôi tin cậy trang này. Cho phép trang web này sử dụng Gears."
-  },
-  "ca": {
-    "string-workerpool-desc": "Executar JavaScript asíncron per millorar la sensibilitat de les aplicacions",
-    "string-allow": "Permet",
-    "string-query-data": "El lloc web següent vol emmagatzemar informació al vostre ordinador mitjançant Gears.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "El lloc web següent vol accedir a informació sobre la vostra ubicació mitjançant Gears.",
-    "string-html-title": "Advertència de seguretat de Gears",
-    "string-description": "Gear és una extensió de navegador de codi obert que permet que les aplicacions web proporcionin funcionalitat fora de línia mitjançant les següents API de JavaScript:",
-    "string-database-desc": "Desar dades localment en una base de dades relacional amb funció de cerca completa",
-    "string-allow-accesskey": "P",
-    "string-cancel": "Cancel·la",
-    "string-never-allow-link": "No permetis mai aquest lloc",
-    "string-deny": "Denega",
-    "string-never-allow-link-wince": "No permetre'l mai",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Desar i servir recursos d'aplicacions localment",
-    "string-location-privacy-statement": "Llegiu la política de privadesa del lloc per veure com es farà servir la vostra ubicació.",
-    "string-trust-site": "Confio en aquest lloc. Permet que utilitzi Gears."
-  },
-  "it": {
-    "string-workerpool-desc": "Eseguire codice JavaScript in modo asincrono per migliorare la velocità di risposta dell'applicazione",
-    "string-allow": "Consenti",
-    "string-query-data": "Il sito Web riportato di seguito vuole memorizzare le informazioni relative al computer che utilizza Google Gears.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "Il sito Web riportato di seguito vuole accedere alle informazioni relative alla posizione di utilizzo di Google Gears.",
-    "string-html-title": "Avviso di protezione di Google Gears",
-    "string-description": "Google Gears è un'estensione browser open source che permette alle applicazioni Web di fornire funzionalità offline tramite le seguenti API JavaScript:",
-    "string-database-desc": "Memorizzare i dati localmente in un database relazionale dotato di ricerca integrata",
-    "string-allow-accesskey": "A",
-    "string-cancel": "Annulla",
-    "string-never-allow-link": "Non consentire mai l'accesso a questo sito",
-    "string-deny": "Nega",
-    "string-never-allow-link-wince": "Non consentirlo mai",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Memorizzare e fornire localmente le risorse dell'applicazione",
-    "string-location-privacy-statement": "Leggi le norme sulla privacy del sito per vedere come verrà utilizzata la tua posizione.",
-    "string-trust-site": "Considero questo sito attendibile. Consenti al sito di utilizzare Google Gears."
-  },
-  "kn": {
-    "string-workerpool-desc": "ಅಪ್ಲಿಕೇಶನ್ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಉತ್ತಮಪಡಿಸಲು ಏಸಿಂಕ್ರೋನಸ್ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಚಲಿಸಿ",
-    "string-allow": "ಅನುಮತಿಸು",
-    "string-query-data": "ಈ ಕೆಳಗಿನ ವೆಬ್ ಸೈಟ್ Gears ಬಳಸಿ ನಿಮ್ಮ ಕಂಪ್ಯೂಟರಿನಲ್ಲಿ ಮಾಹಿತಿಯನ್ನು ಇರಿಸಲು ಬಯಸುತ್ತಿದೆ.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "ಈ ಕೆಳಗಿನ ವೆಬ್ ಸೈಟ್ Gears ಬಳಸಿ ನಿಮ್ಮ ಸ್ಥಳದ ಕುರಿತು ಮಾಹಿತಿ ಪಡೆದುಕೊಳ್ಳಲು ಬಯಸುತ್ತಿದೆ.",
-    "string-html-title": "Gears ರಕ್ಷಣಾ ಎಚ್ಚರಿಕೆ",
-    "string-description": "Gears ಒಂದು ಓಪನ್ ಸೋರ್ಸ್ ಬ್ರೌಸರ್ ವಿಸ್ತರಣೆಯಾಗಿದ್ದು, ಅದು ವೆಬ್ ಅಪ್ಲಿಕೇಶನ್ ಗಳಿಗೆ ಈ ಕೆಳಗಿನ JavaScript API ಗಳನ್ನು ಬಳಸಿ ಆಫ್ಲೈನ್ ಫಂಕ್ಷನಾಲಿಟಿಯನ್ನು ನೀಡಲು ಸಾಧ್ಯವಾಗಿಸುತ್ತದೆ.",
-    "string-database-desc": "ಪೂರ್ಣವಾಗಿ ಹುಡುಕಬಹುದಾದ ಸಾಂಬಂಧಿಕ ಡೇಟಾಬೇಸ್‌ನಲ್ಲಿ ಸ್ಥಳೀಯವಾಗಿ ಡೇಟಾವನ್ನು ಸಂಗ್ರಹಿಸಿ",
-    "string-allow-accesskey": "A",
-    "string-cancel": "ರದ್ದುಮಾಡು",
-    "string-never-allow-link": "ಈ ಸೈಟನ್ನು ಎಂದಿಗೂ ಅನುಮತಿಸಬೇಡಿ",
-    "string-deny": "ನಿರಾಕರಿಸು",
-    "string-never-allow-link-wince": "ಅದನ್ನು ಎಂದಿಗೂ ಅನುಮತಿಸಬೇಡಿ",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "ಸ್ಥಳೀಯವಾಗಿ ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಗಳನ್ನು ಸಂಗ್ರಹಿಸಿ ಮತ್ತು ಒದಗಿಸಿ",
-    "string-location-privacy-statement": "ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಹೇಗೆ ಉಪಯೋಗಿಸಲಾಗುತ್ತದೆ ಎಂದು ತಿಳಿಯಲು ಈ ಸೈಟ್ ನ ಗೌಪ್ಯತಾ ನೀತಿಯನ್ನು ಓದಿ.",
-    "string-trust-site": "ಈ ಸೈಟನ್ನು ನಾನು ನಂಬುತ್ತೇನೆ. ಇದಕ್ಕೆ Gears ಉಪಯೋಗಿಸಲು ಅನುಮತಿಸು."
-  },
-  "ar": {
-    "string-workerpool-desc": "تشغيل جافا سكريبت غير متزامنة لتحسين سرعة استجابة التطبيقات",
-    "string-allow": "سماح",
-    "string-query-data": "يرغب موقع الويب أدناه في تخزين معلومات على موقعك باستخدام Gears.",
-    "string-deny-accesskey": "ف",
-    "string-query-location": "يرغب موقع الويب أدناه في الوصول إلى معلومات حول موقعك باستخدام Gears.",
-    "string-html-title": "تحذير أمان خاص بـ Gears",
-    "string-description": "Gears هو ملحق متصفح مفتوح المصدر يتيح لتطبيقات الويب إمكانية القيام بوظائفها في حالة عدم الاتصال باستخدام واجهات برمجة التطبيقات (API) التالية المعدة باستخدام جافا سكريبت:",
-    "string-database-desc": "تخزين البيانات محليًا في قاعدة بيانات ارتباطية قابلة للبحث بشكل كامل",
-    "string-allow-accesskey": "س",
-    "string-cancel": "إلغاء",
-    "string-never-allow-link": "عدم السماح لهذا الموقع مطلقًا",
-    "string-deny": "رفض",
-    "string-never-allow-link-wince": "عدم السماح بـ Gears مطلقًا",
-    "string-trust-site-accesskey": "موثوق",
-    "string-localserver-desc": "تخزين موارد التطبيقات وإتاحتها محليًا",
-    "string-location-privacy-statement": "قم بقراءة سياسة خصوصية الموقع لمعرفة كيف سيتم استخدام موقعك.",
-    "string-trust-site": "أثق في هذا الموقع. وأرجو السماح له باستخدام Gears."
-  },
-  "ml": {
-    "string-workerpool-desc": "അപ്ലിക്കേഷന്‍ പ്രതികരണം അഭിവൃദ്ധിപ്പെടുത്താന്‍ ഏകകാലികമല്ലാത്ത ജാവാസ്ക്രിപ്റ്റ് പ്രവര്‍ത്തിപ്പിക്കുക",
-    "string-allow": "അനുവദിക്കൂ",
-    "string-query-data": "താഴെക്കാണുന്ന വെബ്സൈറ്റ് നിങ്ങളുടെ കമ്പ്യൂട്ടറില് വിവരങ്ങള് Gears ഉപയോഗിച്ച് ശേഖരിക്കാനാഗ്രഹിക്കുന്നു.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "താഴെക്കാണുന്ന വെബ്സൈറ്റ് നിങ്ങളുടെ മേഖലയെക്കുറിച്ചുള്ള വിവരങ്ങള് Gears ഉപയോഗിച്ച് ആക്സസ്സ് ചെയ്യാനാഗ്രഹിക്കുന്നു.",
-    "string-html-title": "Gears സുരക്ഷാ മുന്നറിയിപ്പ്",
-    "string-description": "Gears ഒരു തുറന്ന ഉറവിട ബ്രൌസര്‍ എക്സ്റ്റന്ഷനാണ്, അത് JavaScript APIs ഉപയോഗിച്ച് വെബ് അപ്ളിക്കേഷന് ഓഫ്ലൈന് ക്രിയാത്മകത നല്കുന്നു:",
-    "string-database-desc": "പൂര്‍ണമായും തിരയാവുന്ന ആനുപാതികമായ ഡാറ്റാബേസില്‍ ഡാറ്റ സംഭരിക്കുക",
-    "string-allow-accesskey": "A",
-    "string-cancel": "റദ്ദാക്കൂ",
-    "string-never-allow-link": "ഈ സൈറ്റിനെ ഒരിക്കലും അനുവദിക്കരുത്",
-    "string-deny": "നിരസിക്കൂ",
-    "string-never-allow-link-wince": "ഇതൊരിക്കലും അനുവദിക്കരുത്",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "അപ്ലിക്കേഷന്‍ വിഭവങ്ങള്‍ പ്രാദേശികമായി സംഭരിച്ച് പ്രയോജനപ്പെടുത്തൂ",
-    "string-location-privacy-statement": "നിങ്ങളുടെ ലൊക്കേഷന് എങ്ങനെയാണ് ഉപയോഗിച്ചിരിക്കുന്നതെന്ന് കാണാന് സൈറ്റിന്റെ സ്വകാര്യതാ നയം വായിക്കുക.",
-    "string-trust-site": "ഞാനീ സൈറ്റിനെ വിശ്വസിക്കുന്നു. ഇതിനെ Gears ഉപയോഗിക്കാന് അനുവദിക്കുക."
-  },
-  "cs": {
-    "string-workerpool-desc": "Spouštět asynchronní JavaScript ke zlepšení odezvy aplikace",
-    "string-allow": "Povolit",
-    "string-query-data": "Následující webová stránka chce pomocí aplikace Gears uložit informace do vašeho počítače.",
-    "string-deny-accesskey": "Z",
-    "string-query-location": "Následující webová stránka se pomocí aplikace Gears pokouší získat informace o vaší lokalitě.",
-    "string-html-title": "Výstraha zabezpečení aplikace Gears",
-    "string-description": "Gears je rozšíření typu open source pro webové prohlížeče, které umožňuje webovým aplikacím pracovat v režimu offline pomocí následujících rozhraní API prostředí JavaScript:",
-    "string-database-desc": "Ukládat data lokálně v relační databázi, ve které lze vyhledávat",
-    "string-allow-accesskey": "P",
-    "string-cancel": "Zrušit",
-    "string-never-allow-link": "Nikdy nepovolit tyto stránky",
-    "string-deny": "Zamítnout",
-    "string-never-allow-link-wince": "Nikdy nepovolit tuto aplikaci",
-    "string-trust-site-accesskey": "d",
-    "string-localserver-desc": "Ukládat a nabízet zdroje aplikací lokálně",
-    "string-location-privacy-statement": "Přečtěte si zásady ochrany osobních údajů tohoto webu, kde zjistíte, jakým způsobem budou použity informace o vaší lokalitě.",
-    "string-trust-site": "Důvěřuji tomuto webu. Umožnit používání aplikace Gears."
-  },
-  "et": {
-    "string-workerpool-desc": "Käivita asünkroonne JavaScript, et rakenduse töö kiirust parandada",
-    "string-allow": "Luba",
-    "string-query-data": "Alljärgnev veebisait soovib Gearsi kasutades salvestada teavet teie arvutisse.",
-    "string-deny-accesskey": "K",
-    "string-query-location": "Alljärgnev veebisait soovib Gearsi kasutades juurdepääsu teabele teie asukoha kohta.",
-    "string-html-title": "Gearsi turvahoiatus",
-    "string-description": "Gears on avatud lähtekoodiga brauserilaiendus, mis võimaldab veebirakendustel võrguühenduseta töötada, kasutades järgmisi JavaScripti rakendusliideseid:",
-    "string-database-desc": "Salvestage andmed lokaalselt otsingu täisfunktsiooniga relatsioonandmebaasi",
-    "string-allow-accesskey": "L",
-    "string-cancel": "Tühista",
-    "string-never-allow-link": "Ära luba seda saiti kunagi",
-    "string-deny": "Keeldu",
-    "string-never-allow-link-wince": "Ära luba seda kunagi",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Salvestage ja kasutage rakenduse vahendeid lokaalselt",
-    "string-location-privacy-statement": "Kui soovite teada, kuidas teie asukohateavet kasutatakse, lugege saidi privaatsuspõhimõtteid.",
-    "string-trust-site": "Usaldan seda saiti. Luba sellel Gearsi kasutada."
-  },
-  "id": {
-    "string-workerpool-desc": "Menjalankan JavaScript asinkron untuk meningkatkan respons aplikasi",
-    "string-allow": "OK",
-    "string-query-data": "Website berikut ingin menyimpan informasi di komputer Anda dengan menggunakan Gears.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "Website berikut ingin mengakses informasi tentang lokasi Anda dengan menggunakan Gears.",
-    "string-html-title": "Peringatan Keamanan Gears",
-    "string-description": "Gears adalah ekstensi browser open source yang memungkinkan aplikasi web untuk menyediakan fungsionalitas offline dengan menggunakan JavaScript API:",
-    "string-database-desc": "Menyimpan data secara lokal pada basis data relasional yang dapat cari",
-    "string-allow-accesskey": "A",
-    "string-cancel": "Batalkan",
-    "string-never-allow-link": "Jangan pernah izinkan situs ini",
-    "string-deny": "Tolak",
-    "string-never-allow-link-wince": "Jangan pernah mengizinkannya",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Menyimpan dan menggunakan sumber daya aplikasi secara lokal",
-    "string-location-privacy-statement": "Baca kebijakan privasi situs untuk melihat bagaimana lokasi Anda akan digunakan.",
-    "string-trust-site": "Saya mempercayai situs ini. Izinkan untuk menggunakan Gears."
-  },
-  "es": {
-    "string-workerpool-desc": "Ejecutar JavaScript asíncrono para mejorar la capacidad de respuesta de la aplicación",
-    "string-allow": "Permitir",
-    "string-query-data": "El siguiente sitio Web desea almacenar información en tu equipo utilizando Gears.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "El siguiente sitio web desea acceder a información sobre tu ubicación con Gears.",
-    "string-html-title": "Advertencia de seguridad Gears",
-    "string-description": "Gears es una extensión del navegador de software libre que permite a las aplicaciones web funcionar sin conexión a través de las siguientes interfaces de programación de aplicaciones (API) de Javascript:",
-    "string-database-desc": "Almacenar datos localmente en una base de datos relacional que admite búsquedas completas",
-    "string-allow-accesskey": "P",
-    "string-cancel": "Cancelar",
-    "string-never-allow-link": "No permitir nunca este sitio",
-    "string-deny": "Denegar",
-    "string-never-allow-link-wince": "No permitirlo nunca",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Almacenar y proporcionar recursos de aplicaciones de forma local.",
-    "string-location-privacy-statement": "Lee la política de privacidad de este sitio para ver cómo se utilizará tu ubicación.",
-    "string-trust-site": "Confío en este sitio. Permitir utilizar Gears."
-  },
-  "en-GB": {
-    "string-workerpool-desc": "Run asynchronous JavaScript to improve application responsiveness",
-    "string-allow": "Allow",
-    "string-query-data": "The website below wants to store information on your computer using Gears.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "The website below wants to access information about your location using Gears.",
-    "string-html-title": "Gears Security Warning",
-    "string-description": "Gears is an open source browser extension that enables web applications to provide offline functionality using the following JavaScript APIs:",
-    "string-database-desc": "Store data locally in a fully-searchable relational database",
-    "string-allow-accesskey": "A",
-    "string-cancel": "Cancel",
-    "string-never-allow-link": "Never allow this site",
-    "string-deny": "Deny",
-    "string-never-allow-link-wince": "Never allow",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Store and serve application resources locally",
-    "string-location-privacy-statement": "Read the site's privacy policy to see how your location will be used.",
-    "string-trust-site": "I trust this site. Allow it to use Gears."
-  },
-  "ru": {
-    "string-workerpool-desc": "Запустить асинхронный JavaScript, чтобы ускорить работу приложения",
-    "string-allow": "Разрешить",
-    "string-query-data": "Указанный ниже веб-сайт запрашивает разрешение на хранение информации на компьютере с помощью Gears.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "Указанный ниже веб-сайт запрашивает разрешение на получение информации о местонахождении с помощью Gears.",
-    "string-html-title": "Предупреждение безопасности Gears",
-    "string-description": "Gears – это расширение для браузера с открытым исходным кодом, позволяющее веб-приложениям работать в автономном режиме с помощью следующих API JavaScript:",
-    "string-database-desc": "Сохраняйте данные на компьютере пользователя в виде реляционной БД с возможностью поиска по ним",
-    "string-allow-accesskey": "A",
-    "string-cancel": "Отмена",
-    "string-never-allow-link": "Никогда не разрешать этому сайту",
-    "string-deny": "Запретить",
-    "string-never-allow-link-wince": "Никогда не разрешать",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Сохраняйте и размещайте ресурсы приложений на локальном компьютере",
-    "string-location-privacy-statement": "Для того чтобы узнать о том, как будет использована информация о местонахождении, ознакомьтесь с политикой конфиденциальности сайта.",
-    "string-trust-site": "Я доверяю этому сайту. Разрешить использование Gears."
-  },
-  "nl": {
-    "string-workerpool-desc": "Asynchroon JavaScript uitvoeren om ontvankelijkheid van toepassing te verbeteren",
-    "string-allow": "Toestaan",
-    "string-query-data": "De website hieronder probeert via Gears informatie op uw computer op te slaan.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "De website hieronder probeert via Gears informatie te krijgen over uw locatie.",
-    "string-html-title": "Beveiligingswaarschuwing voor Gears",
-    "string-description": "Gears is een browseruitbreiding met open broncode waarmee webtoepassingen offline functionaliteit kunnen bieden met de volgende JavaScript-API's:",
-    "string-database-desc": "Gegevens lokaal opslaan in een volledig doorzoekbare relationele database",
-    "string-allow-accesskey": "A",
-    "string-cancel": "Annuleren",
-    "string-never-allow-link": "Deze site nooit toestaan",
-    "string-deny": "Weigeren",
-    "string-never-allow-link-wince": "Nooit toestaan",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Toepassingsbronnen lokaal opslaan en aanbieden",
-    "string-location-privacy-statement": "Lees het privacybeleid op de site voor informatie over het gebruik van uw locatie.",
-    "string-trust-site": "Ik vertrouw deze site. Sta deze site toe Gears te gebruiken."
-  },
-  "no": {
-    "string-workerpool-desc": "Kjør asynkront JavaScript for å forbedre programmets respons",
-    "string-allow": "Tillat",
-    "string-query-data": "Nettstedet nedenfor ønsker å bruke Gears til å lagre informasjon om datamaskinen.",
-    "string-deny-accesskey": "V",
-    "string-query-location": "Nettstedet nedenfor ønsker å bruke Gears for å få tilgang på informasjon om hvor du befinner deg.",
-    "string-html-title": "Sikkerhetsadvarsel for Gears",
-    "string-description": "Gears er en nettleserutvidelse med åpen kildekode som lar nettprogrammer fungere i frakoblet modus ved hjelp av følgende JavaScript API-er:",
-    "string-database-desc": "Lagre data lokalt i en fullt søkbar relasjonsdatabase",
-    "string-allow-accesskey": "T",
-    "string-cancel": "Avbryt",
-    "string-never-allow-link": "Avvis alltid dette nettstedet",
-    "string-deny": "Avvis",
-    "string-never-allow-link-wince": "Avvis alltid",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Lagre og bruk programressurser lokalt",
-    "string-location-privacy-statement": "Les retningslinjene for personvern for nettstedet for å se hvordan området brukes.",
-    "string-trust-site": "Jeg stoler på dette nettstedet. Tillat at det bruker Gears."
-  },
-  "tr": {
-    "string-workerpool-desc": "Uygulamanın daha iyi yanıt vermesi için asenkron olarak Javascript yürütür",
-    "string-allow": "İzin ver",
-    "string-query-data": "Aşağıdaki web sitesi Gears'ı kullanarak bilgisayarınızda bilgi depolamak istiyor.",
-    "string-deny-accesskey": "R",
-    "string-query-location": "Aşağıdaki web sitesi Gears'ı kullanarak konumunuzla ilgili bilgilere erişmek istiyor.",
-    "string-html-title": "Gears Güvenlik Uyarısı",
-    "string-description": "Gears, web uygulamalarının aşağıdaki JavaScript API'larını kullanarak çevrimdışı çalışmasına olanak tanıyan açık kaynaklı bir tarayıcı uzantısıdır:",
-    "string-database-desc": "Verileri tamamen aratılabilir ilişkisel veritabanında yerel olarak sakla",
-    "string-allow-accesskey": "V",
-    "string-cancel": "İptal",
-    "string-never-allow-link": "Bu siteye asla izin verme",
-    "string-deny": "Reddet",
-    "string-never-allow-link-wince": "Asla izin verme",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Uygulama kaynaklarını yerel olarak saklar ve sunar",
-    "string-location-privacy-statement": "Konumunuzun nasıl kullanılacağını öğrenmek için sitenin gizlilik politikasını okuyun.",
-    "string-trust-site": "Bu siteye güveniyorum. Gears'ı kullanmasına izin ver."
-  },
-  "lv": {
-    "string-workerpool-desc": "Palaidiet asinhrono JavaScript, lai uzlabotu lietojumprogrammas atbildēšanas iespējas",
-    "string-allow": "Atļaut",
-    "string-query-data": "Tālāk minētā vietne vēlas saglabāt informāciju par jūsu datoru, lietojot Gears.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "Tālāk minētā vietne vēlas piekļūt informācijai par jūsu atrašanās vietu, lietojot Gears.",
-    "string-html-title": "Gears drošības brīdinājums",
-    "string-description": "Gears ir atklāta pirmkoda pārlūkprogramma, ar kuru tīmekļa lietojumprogrammas nodrošina funkcionalitāti bezsaistē, izmantojot šādas JavaScript API:",
-    "string-database-desc": "Datu glabāšana lokāli pilnībā pārmeklējamā relāciju datu bāzē",
-    "string-allow-accesskey": "A",
-    "string-cancel": "Atcelt",
-    "string-never-allow-link": "Nekad neļaut piekļūt šai vietnei",
-    "string-deny": "Aizliegt",
-    "string-never-allow-link-wince": "Nekad to neatļaut",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Lietojumprogrammu resursu saglabāšana un apkalpošana lokāli",
-    "string-location-privacy-statement": "Izlasiet vietnes konfidencialitātes politiku, lai redzētu, kā tiks izmantota jūsu atrašanās vieta.",
-    "string-trust-site": "Es uzticos šai vietnei. Atļaujiet tai lietot Gears."
-  },
-  "lt": {
-    "string-workerpool-desc": "Padidinkite programos jautrumą paleisdami asinchroninę „Javascript“",
-    "string-allow": "Leisti",
-    "string-query-data": "Žemiau nurodyta interneto svetainė bando išsaugoti informaciją apie jūsų vietovę naudojant „Gears“.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "Žemiau nurodyta interneto svetainė bando prieiti prie informacijos apie jūsų vietovę naudojant „Gears“.",
-    "string-html-title": "„Gears“ įspėjimas apie saugą",
-    "string-description": "„Gears“ – tai atvirojo kodo naršyklės plėtinys, leidžiantis žiniatinklio programoms naudoti atjungties funkcines galimybes su šiais „JavaScript“ API:",
-    "string-database-desc": "Išsaugokite duomenis vietoje, sąryšinėje duomenų bazėje su veikiančia paieškos funkcija",
-    "string-allow-accesskey": "A",
-    "string-cancel": "Atšaukti",
-    "string-never-allow-link": "Niekada neleisti šios svetainės",
-    "string-deny": "Atmesti",
-    "string-never-allow-link-wince": "Niekada neleisti",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Saugokite ir prižiūrėkite programos išteklius vietoje",
-    "string-location-privacy-statement": "Perskaitykite svetainės privatumo politiką, kad sužinotumėte, kaip bus naudojama jūsų vietovė.",
-    "string-trust-site": "Pasitikiu šia svetaine. Leisti jai naudoti „Gears“."
-  },
-  "th": {
-    "string-workerpool-desc": "เรียกใช้ JavaScript อะซิงโครนัสเพื่อปรับปรุงการตอบสนองของแอปพลิเคชัน",
-    "string-allow": "อนุญาต",
-    "string-query-data": "เว็บไซต์ต่อไปนี้ต้องการเก็บข้อมูลในคอมพิวเตอร์ของคุณโดยใช้ Gears",
-    "string-deny-accesskey": "ป",
-    "string-query-location": "เว็บไซต์ต่อไปนี้ต้องการเข้าถึงข้อมูลเกี่ยวกับตำแหน่งของคุณโดยใช้ Gears",
-    "string-html-title": "คำเตือนด้านความปลอดภัยของ Gears",
-    "string-description": "Gears เป็นส่วนขยายเบราว์เซอร์แบบโอเพ่นซอร์สที่ช่วยให้แอปพลิเคชันทางเว็บมีการทำงานแบบออฟไลน์โดยใช้ JavaScript API ต่อไปนี้:",
-    "string-database-desc": "จัดเก็บข้อมูลในตัวเครื่องในฐานข้อมูลที่สัมพันธ์กันและสามารถค้นหาได้อย่างสมบูรณ์",
-    "string-allow-accesskey": "อ",
-    "string-cancel": "ยกเลิก",
-    "string-never-allow-link": "ไม่อนุญาตไซต์นี้",
-    "string-deny": "ปฏิเสธ",
-    "string-never-allow-link-wince": "ไม่อนุญาต",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "จัดเก็บและรองรับทรัพยากรของแอปพลิเคชันในเครื่อง",
-    "string-location-privacy-statement": "อ่านนโยบายส่วนบุคคลของไซต์เพื่อดูว่าตำแหน่งของคุณจะถูกนำมาใช้อย่างไร",
-    "string-trust-site": "ฉันเชื่อถือไซต์นี้ อนุญาตให้ใช้ Gears"
-  },
-  "ro": {
-    "string-workerpool-desc": "Rulaţi JavaScript asincron, pentru a îmbunătăţi viteza de răspuns a aplicaţiei",
-    "string-allow": "Permiteţi",
-    "string-query-data": "Site-ul Web de mai jos doreşte să salveze informaţii pe computerul dvs. utilizând Gears.",
-    "string-deny-accesskey": "R",
-    "string-query-location": "Site-ul Web de mai jos doreşte să acceseze informaţii despre locaţia dvs. utilizând Gears.",
-    "string-html-title": "Avertizare de securitate Gears",
-    "string-description": "Gears este o extensie de browser cu sursă liberă care permite aplicaţiilor Web să ofere funcţionalitate offline, utilizând următoarele API-uri JavaScript:",
-    "string-database-desc": "Stocaţi date local într-o bază de date relaţională în care se pot efectua căutări complete",
-    "string-allow-accesskey": "P",
-    "string-cancel": "Anulaţi",
-    "string-never-allow-link": "Nu permiteţi niciodată acest site",
-    "string-deny": "Respingeţi",
-    "string-never-allow-link-wince": "Nu permiteţi niciodată",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Stocaţi şi livraţi local resurse ale aplicaţiei",
-    "string-location-privacy-statement": "Citiţi politica de confidenţialitate a site-ului pentru a afla cum va fi utilizată locaţia dvs.",
-    "string-trust-site": "Am încredere în acest site. Îi permit să utilizeze Gears."
-  },
-  "is": {
-    "string-workerpool-desc": "Keyra ósamstillt JavaScript til að bæta svörun forrits",
-    "string-allow": "Leyfa",
-    "string-query-data": "Vefsvæðið hér fyrir neðan vill fá aðgang að upplýsingum um tölvuna þína með því að nota Gears.",
-    "string-deny-accesskey": "F",
-    "string-query-location": "Vefsvæðið hér fyrir neðan vill fá aðgang að upplýsingum um staðsetninguna þína með því að nota Gears.",
-    "string-html-title": "Öryggisviðvörun frá Gears",
-    "string-description": "Gears er vafraviðbót með opnum kóða sem gerir vefforritum kleift að vinna án nettengingar með eftirfarandi JavaScript forritaskilum:",
-    "string-database-desc": "Geyma gögn staðbundið í töflugagnagrunni sem hægt er að leita í",
-    "string-allow-accesskey": "L",
-    "string-cancel": "Hætta við",
-    "string-never-allow-link": "Aldrei leyfa þetta svæði",
-    "string-deny": "Hafna",
-    "string-never-allow-link-wince": "Aldrei leyfa það",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Geyma og vinna staðbundið með tilföng fyrir forrit",
-    "string-location-privacy-statement": "Lestu persónuverndarstefnu svæðisins til þess að sjá hvernig staðsetningin þín verður notuð.",
-    "string-trust-site": "Ég treysti þessu vefsvæði. Það má nota Gears."
-  },
-  "fil": {
-    "string-workerpool-desc": "Magpatakbo ng hindi magkakasabay na JavaScript upang mapagbuti ang kakayahang tumugon ng application",
-    "string-allow": "Payagan",
-    "string-query-data": "Nais lagyan ng impormasyon ang website sa ibaba sa iyong computer gamit ang Mga Gear.",
-    "string-deny-accesskey": "T",
-    "string-query-location": "Nais i-access ng website sa ibaba ang impormasyon tungkol sa iyong lokasyon gamit ang mga Gear.",
-    "string-html-title": "Babala sa Seguridad ng Mga Gear",
-    "string-description": "Ang mga Gear ay isang open source browser extension na pinagana ng mga web application ng offline na pagpapaandar gamit ang sumusunod na Mga JavaScript API:",
-    "string-database-desc": "I-imbak ang data nang lokal sa isang ganap na mahahanapan na relational database",
-    "string-allow-accesskey": "P",
-    "string-cancel": "Ikansela",
-    "string-never-allow-link": "Huwag kailanman payagan ang site na ito",
-    "string-deny": "Tanggihan",
-    "string-never-allow-link-wince": "Huwag kailanman ito papayagan",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Mag-imbak at maghatid nang lokal ng mga mapagkukunan ng application",
-    "string-location-privacy-statement": "Basahin ang patakaran sa privacy ng site upang makita kung paano magagamit ang iyong lokasyon.",
-    "string-trust-site": "Pinagkakatiwalaan ko ang site na ito. Pinahihintulutan na gamitin ang mga Gear na ito."
-  },
-  "ta": {
-    "string-workerpool-desc": "பயன்பாட்டின் செயல்திறனை மேம்படுத்த ஒத்திசையாத JavaScript ஐ இயக்கவும்.",
-    "string-allow": "அனுமதி",
-    "string-query-data": "கீழே உள்ள வலைத்தளம் Gears ஐப் பயன்படுத்தி உங்கள் கணினியில் தகவலைச் சேமிக்க நினைக்கிறது.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "கீழே உள்ள வலைத்தளம் Gears ஐப் பயன்படுத்தி உங்கள் இருப்பிடம் பற்றிய தகவலை அணுக நினைக்கிறது.",
-    "string-html-title": "Gears பாதுகாப்பு எச்சரிக்கை",
-    "string-description": "Gears ஒரு ஓப்பன் சோர்ஸ் உலாவி விரிவாக்கல், பின்வரும் JavaScript APIகளைப் பயன்படுத்தி ஆஃப்லைனில் வலை பயன்பாடுகளை அணுக உதவுகிறது:",
-    "string-database-desc": "தரவுகளை உங்கள் கணினியிலேயே, முழுமையாகத் தேடப்படக்கூடிய, ரிலேஷனல் டேடாபேஸில் சேமிக்கவும்",
-    "string-allow-accesskey": "A",
-    "string-cancel": "ரத்துசெய்",
-    "string-never-allow-link": "இந்த தளத்தை எப்போதும் அனுமதிக்காதே",
-    "string-deny": "மறு",
-    "string-never-allow-link-wince": "எப்போதும் அனுமதிக்காதே",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "பயன்பாட்டின் ஆதாரங்களை உங்கள் கணினியில் சேமிக்கவும் மற்றும் வழங்கவும்",
-    "string-location-privacy-statement": "உங்கள் இருப்பிடத்தை எங்கு உபயோகப்படுத்தப்படும் என்று காண தளங்களின் தனியுரிமை கொள்கையைப் படிக்கவும்.",
-    "string-trust-site": "நான் இந்த தளத்தை நம்புகிறேன். Gears ஐப் பயன்படுத்த அனுமதிக்கவும்."
-  },
-  "fr": {
-    "string-workerpool-desc": "Exécuter JavaScript asynchrone pour améliorer le temps de réponse de l'application",
-    "string-allow": "Autoriser",
-    "string-query-data": "Le site Web ci-dessous souhaite stocker des informations sur votre ordinateur à l'aide de Google Gears.",
-    "string-deny-accesskey": "R",
-    "string-query-location": "Le site Web ci-dessous souhaite accéder aux informations sur votre emplacement à l'aide de Google Gears.",
-    "string-html-title": "Avertissement de sécurité de Google Gears",
-    "string-description": "Google Gears est une extension open source de navigateur qui permet aux applications Web de fournir des services hors ligne, grâce aux API JavaScript suivantes :",
-    "string-database-desc": "Enregistrer des données localement dans une base de données relationnelle avec une fonction de recherche",
-    "string-allow-accesskey": "A",
-    "string-cancel": "Annuler",
-    "string-never-allow-link": "Ne jamais autoriser ce site",
-    "string-deny": "Refuser",
-    "string-never-allow-link-wince": "Ne jamais l'autoriser",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Stocker et distribuer localement des ressources de l'application",
-    "string-location-privacy-statement": "Lisez la politique de confidentialité du site pour savoir comment votre emplacement va être utilisé.",
-    "string-trust-site": "J'ai confiance en ce site. L'autoriser à utiliser Google Gears."
-  },
-  "bg": {
-    "string-workerpool-desc": "Изпълнявайте асинхронен JavaScript, за да подобрите скоростта на работа на приложенията",
-    "string-allow": "Разрешаване",
-    "string-query-data": "Уебсайтът по-долу иска да съхрани информация на компютъра ви чрез Gears.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "Уебсайтът по-долу иска да получи достъп до информацията за вашето местоположение чрез Gears.",
-    "string-html-title": "Предупреждение за защита на Gears",
-    "string-description": "Gears е разширение за браузъри с отворен код, което позволява на уеб приложенията да функционират в офлайн режим чрез следните приложни програмни интерфейси на JavaScript:",
-    "string-database-desc": "Съхранявайте информация локално в база от сродни данни с възможност за пълно търсене в тях",
-    "string-allow-accesskey": "A",
-    "string-cancel": "Отказ",
-    "string-never-allow-link": "Не давам разрешението си за този сайт",
-    "string-deny": "Забраняване",
-    "string-never-allow-link-wince": "Не се разрешава изобщо",
-    "string-trust-site-accesskey": "й",
-    "string-localserver-desc": "Съхранявайте и използайте локално ресурсите на приложенията",
-    "string-location-privacy-statement": "Прочетете декларацията за поверителност на сайта, за да разберете как ще се използва информацията за местоположението ви.",
-    "string-trust-site": "Имам доверие на този сайт. Нека да може да използва Gears."
-  },
-  "uk": {
-    "string-workerpool-desc": "Запустіть асинхронний сценарій Javascript, щоб підвищити швидкість реагування програми",
-    "string-allow": "Дозволити",
-    "string-query-data": "Нижченаведений веб-сайт намагається зберегти інформацію на Вашому комп’ютері за допомогою Gears.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "Нижченаведений веб-сайт намагається отримати доступ до інформації про Ваше розташування за допомогою Gears.",
-    "string-html-title": "Попередження системи безпеки Gears",
-    "string-description": "Gears – це розширення веб-браузера з відкритим кодом, яке дозволяє веб-програмам працювати в автономному режимі за допомогою таких інтерфейсів API JavaScript:",
-    "string-database-desc": "Дані зберігаються локально у відповідній базі даних із повною підтримкою функцій пошуку",
-    "string-allow-accesskey": "A",
-    "string-cancel": "Скасувати",
-    "string-never-allow-link": "Ніколи не дозволяти цьому веб-сайту",
-    "string-deny": "Відхилити",
-    "string-never-allow-link-wince": "Ніколи не дозволяти",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Локальне збереження та обслуговування програмних ресурсів",
-    "string-location-privacy-statement": "Ознайомтеся з політикою конфіденційності веб-сайту, щоб дізнатися, як буде використовуватися Ваше розташування.",
-    "string-trust-site": "Я довіряю цьому сайту. Дозволити йому використовувати Gears."
-  },
-  "hr": {
-    "string-workerpool-desc": "Pokrenite asinkroni JavaScript kako biste poboljšali odziv aplikacije",
-    "string-allow": "Dopusti",
-    "string-query-data": "Dolje navedena web-lokacija želi pomoću Gearsa pohraniti informacije na Vaše računalo.",
-    "string-deny-accesskey": "O",
-    "string-query-location": "Dolje navedena web-lokacija želi pristupiti informacijama o vašoj lokaciji pomoću Gearsa.",
-    "string-html-title": "Gearsovo upozorenje o sigurnosti",
-    "string-description": "Gears je pregledničko proširenje otvorenog izvornog koda koje web-aplikacijama omogućuje izvanmrežno funkcioniranje pomoću sljedećih API-ja za JavaScript:",
-    "string-database-desc": "Podatke spremi lokalno u potpuno pretraživoj relacijskoj bazi podataka",
-    "string-allow-accesskey": "A",
-    "string-cancel": "Odustani",
-    "string-never-allow-link": "Nikad ne dopuštaj ovu web lokaciju",
-    "string-deny": "Odbij",
-    "string-never-allow-link-wince": "Nikad ne dopuštaj",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Izvore aplikacije pohrani i poslužuj lokalno",
-    "string-location-privacy-statement": "Pročitajte pravila o zaštiti privatnosti te web-lokacije da biste saznali kako će se koristiti Vaša lokacija.",
-    "string-trust-site": "Ovu web-lokaciju smatram pouzdanom. Dopusti joj da koristi Gears."
-  },
-  "bn": {
-    "string-workerpool-desc": "প্রয়োগ প্রতিক্রিয়া উন্নত করতে অ্যাসিঙ্ক্রোনাস জাভাস্ক্রিপ্ট রান করুন",
-    "string-allow": "মঞ্জুরি দিন",
-    "string-query-data": "নিচের ওয়েবসাইটটি আপনার কম্পিউটারে তথ্য সঞ্চয় করতে চায় Gears ব্যহার করে ׀",
-    "string-deny-accesskey": "D",
-    "string-query-location": "নিচের ওয়েবসাইটটি আপনার Gears ব্যবহার করার অবস্থানের সম্পর্কে তথ্য অ্যাকসেস করতে চায় ׀",
-    "string-html-title": "Gears নিরাপত্তা সতর্কবাণী",
-    "string-description": "Gears একটি মুক্ত স্রোত ব্রাউসার যা ওয়েব অ্যাপ্লিকেশান প্রদান করে JavaScript APIs ব্যবহার করে অফলাইন ফাংশানালিটি প্রদান করে :",
-    "string-database-desc": "একটি পূর্ণ-সন্ধানযোগ্য সম্পর্কযুক্ত ডেটাবেসে স্থানীয়ভাবে ডেটা সঞ্চয় করুন",
-    "string-allow-accesskey": "A",
-    "string-cancel": "বাতিল",
-    "string-never-allow-link": "কখনই এই সাইটটির মঞ্জুরি দেবেন না",
-    "string-deny": "অস্বীকার",
-    "string-never-allow-link-wince": "এটিকে কখনই অনুমতি দেয় না",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "প্রয়োগ সম্পদ স্থানীয়ভানে সঞ্চয় এবং পরিবেশন করুন",
-    "string-location-privacy-statement": "এই সাইটের গোপনীয়তা নীতি পড়ুন আপনার অবস্থান কি ভাবে ব্যবহার করা হবে তা দেখতে׀",
-    "string-trust-site": "আমি এই সাইটে বিশ্বাস করি׀ Gears ব্যবহার করতে অনুমতি দিন ׀"
-  },
-  "en-US": {
-    "string-workerpool-desc": "Run asynchronous JavaScript to improve application responsiveness",
-    "string-allow": "Allow",
-    "string-query-data": "The website below wants to store information on your computer using Gears.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "The website below wants to access information about your location using Gears.",
-    "string-html-title": "Gears Security Warning",
-    "string-description": "Gears is an open source browser extension that enables web applications to provide offline functionality using the following JavaScript APIs:",
-    "string-database-desc": "Store data locally in a fully-searchable relational database",
-    "string-allow-accesskey": "A",
-    "string-cancel": "Cancel",
-    "string-never-allow-link": "Never allow this site",
-    "string-deny": "Deny",
-    "string-never-allow-link-wince": "Never allow it",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Store and serve application resources locally",
-    "string-location-privacy-statement": "Read the site's privacy policy to see how your location will be used.",
-    "string-trust-site": "I trust this site. Allow it to use Gears."
-  },
-  "da": {
-    "string-workerpool-desc": "Kør asynkron JavaScript for at forbedre programmernes svartid",
-    "string-allow": "Tillad",
-    "string-query-data": "Nedenstående websted ønsker at gemme oplysninger på din computer ved hjælp af Gears.",
-    "string-deny-accesskey": "F",
-    "string-query-location": "Nedenstående websted ønsker at få adgang til oplysninger om din placering ved hjælp af Gears.",
-    "string-html-title": "Gears-sikkerhedsadvarsel",
-    "string-description": "Gears er en open source-browserudvidelse, som gør det muligt for webprogrammer at stille offlinefunktioner til rådighed ved hjælp af følgende JavaScript-API'er:",
-    "string-database-desc": "Gem data lokalt i en fuldt søgbar relationel database",
-    "string-allow-accesskey": "I",
-    "string-cancel": "Annuller",
-    "string-never-allow-link": "Tillad aldrig dette websted",
-    "string-deny": "Afvis",
-    "string-never-allow-link-wince": "Giv aldrig tilladelse",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Gem og servicer applikationsressourcer lokalt",
-    "string-location-privacy-statement": "Læs webstedets politik til beskyttelse af personlige oplysninger for at få mere at vide om, hvordan din placering vil blive brugt.",
-    "string-trust-site": "Jeg har tillid til dette websted. Giv tilladelse til, at det bruger Gears."
-  },
-  "fa": {
-    "string-workerpool-desc": "JavaScript ناهمزمان را برای بهبود پاسخگویی برنامه اجرا کنید.",
-    "string-allow": "مجاز",
-    "string-query-data": "وب سایت زیر می خواهد با استفاده از Gears اطلاعات را در رایانه شما ذخیره کند.",
-    "string-deny-accesskey": "رد كردن",
-    "string-query-location": "وب سایت زیر می خواهد با استفاده از Gears به اطلاعاتی در مورد موقعیت شما دست یابد.",
-    "string-html-title": "اخطار امنیتی Gears",
-    "string-description": "Gears یک پسوند مرورگر منبع باز است که با استفاده از برنامه های JavaScript زیر امکان عملکرد برنامه های وب در حالت آفلاین را فراهم می سازد:",
-    "string-database-desc": "داده ها را در یک پایگاه داده مربوطه که کاملاً قابل جستجو باشد به صورت محلی ذخیره کنید",
-    "string-allow-accesskey": "مجاز",
-    "string-cancel": "لغو",
-    "string-never-allow-link": "هرگز به این سایت اجازه داده نشود",
-    "string-deny": "رد",
-    "string-never-allow-link-wince": "هرگز اجازه داده نشود",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "منابع برنامه را به صورت محلی ذخیره و استفاده کنید",
-    "string-location-privacy-statement": "برای اطلاع از نحوه استفاده از موقعیت خود، سیاست حفظ حقوق خصوصی سایت را مطالعه کنید.",
-    "string-trust-site": "من به این سایت اعتماد دارم. به آن اجازه دهید از Gears استفاده کند."
-  },
-  "hi": {
-    "string-workerpool-desc": "अनुप्रयोग की प्रतिक्रियात्मकता में सुधार लाने के लिए एसिंक्रॉनस JavaScript चलाएँ",
-    "string-allow": "अनुमति दें",
-    "string-query-data": "नीचे दी गई वेबसाइट Gears का उपयोग कर आपके कंप्यूटर पर जानकारी संग्रहीत करना चाहती है.",
-    "string-deny-accesskey": "इंकार करें",
-    "string-query-location": "नीचे दी गई वेबसाइट Gears का उपयोग कर आपकी स्थिति के बारे में जानकारी पर पहुँचना चाहती है.",
-    "string-html-title": "Gears सुरक्षा चेतावनी",
-    "string-description": "Gears एक खुला स्रोत ब्राउज़र एक्सटेंशन है जो वेब अनुप्रयोगों को निम्नलिखित JavaScript APIs का उपयोग कर ऑफ़लाइन कार्यक्षमताएँ उपलब्ध कराने देता है:",
-    "string-database-desc": "डेटा को स्थानीय रूप से एक पूर्ण रूप से खोजने योग्य रिलेशनल डेटाबेस में संचित करें",
-    "string-allow-accesskey": "अनुमति दें",
-    "string-cancel": "रद्द करें",
-    "string-never-allow-link": "इस साइट को कभी अनुमति न दें",
-    "string-deny": "इंकार करें",
-    "string-never-allow-link-wince": "उसे कभी अनुमति न दें",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "अनुप्रयोग संसाधन स्थानीय रूप से संचित और सर्व करें",
-    "string-location-privacy-statement": "यह देखने के लिए कि आपकी स्थिति का किस प्रकार उपयोग किया जाएगा साइट की गोपनीयता नीति पढ़ें.",
-    "string-trust-site": "मैं इस साइट पर भरोसा करता हूँ. इसे Gears का उपयोग करने दें."
-  },
-  "pt-BR": {
-    "string-workerpool-desc": "Executar o JavaScript assíncrono para melhorar a resposta do aplicativo",
-    "string-allow": "Permitir",
-    "string-query-data": "O site abaixo deseja armazenar informações sobre o computador que usa o Gears.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "O site abaixo deseja acessar informações sobre o local que usa o Gears.",
-    "string-html-title": "Aviso de segurança do Gears",
-    "string-description": "O Gears é uma extensão de navegador de código aberto que permite que aplicativos da web forneçam funcionalidades off-line utilizando estas APIs em JavaScript:",
-    "string-database-desc": "Armazenar os dados em um banco de dados relacional local completamente pesquisável",
-    "string-allow-accesskey": "P",
-    "string-cancel": "Cancelar",
-    "string-never-allow-link": "Nunca permitir este site",
-    "string-deny": "Negar",
-    "string-never-allow-link-wince": "Nunca permiti-lo",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Armazenar e atender a recursos de aplicativo localmente",
-    "string-location-privacy-statement": "Leia as políticas de privacidade dos sites para ver como seu local será usado.",
-    "string-trust-site": "Este site é confiável. Permita que ele use o Gears."
-  },
-  "fi": {
-    "string-workerpool-desc": "Paranna sovellusten suorituskykyä käyttämällä asynkronista JavaScriptiä",
-    "string-allow": "Salli",
-    "string-query-data": "Alla oleva sivusto haluaa tallentaa tietoja tietokoneellesi käyttämällä Gearsia.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "Alla oleva sivusto haluaa päästä sijaintitietoihisi käyttämällä Gearsia.",
-    "string-html-title": "Gears-tietoturvavaroitus",
-    "string-description": "Gears on avoimen lähdekoodin selainlaajennus, jonka avulla verkkosovelluksia voi käyttää offline-tilassa seuraavilla JavaScript API -liittymillä:",
-    "string-database-desc": "Tallenna tietoja paikallisesti täysin haettaviin relaatiotietokantoihin",
-    "string-allow-accesskey": "A",
-    "string-cancel": "Peruuta",
-    "string-never-allow-link": "Älä koskaan salli tätä sivustoa",
-    "string-deny": "Estä",
-    "string-never-allow-link-wince": "Älä koskaan salli",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Tallenna ja käytä sovellusten resurssitiedostoja paikallisesti",
-    "string-location-privacy-statement": "Lukemalla tämän sivuston tietosuojakäytännön näet, miten sijaintiasi käytetään.",
-    "string-trust-site": "Luotan tähän sivustoon. Anna sen käyttää Gearsia."
-  },
-  "hu": {
-    "string-workerpool-desc": "Aszinkron JavaScript futtatása az alkalmazás jobb kezelhetősége érdekében",
-    "string-allow": "Engedélyezés",
-    "string-query-data": "Az alábbi webhely a Szinkron szolgáltatás használatával adatokat szeretne tárolni az Ön számítógépén.",
-    "string-deny-accesskey": "T",
-    "string-query-location": "Az alábbi webhely a Szinkron szolgáltatás használatával adatokat szeretne megtudni az Ön helyéről.",
-    "string-html-title": "Biztonsági figyelmeztetés a Szinkrontól",
-    "string-description": "A Szinkron nyílt forráskódú böngészőbővítmény, amely lehetővé teszi a webes alkalmazások számára, hogy kapcsolaton kívüli funkciókat kínáljanak a következő JavaScript API-k segítségével:",
-    "string-database-desc": "Adatok helyi tárolása egy teljes mértékben kereshető relációs adatbázisban",
-    "string-allow-accesskey": "E",
-    "string-cancel": "Mégse",
-    "string-never-allow-link": "Soha ne engedélyezze ezt a webhelyet",
-    "string-deny": "Tiltás",
-    "string-never-allow-link-wince": "Soha ne engedélyezze",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Alkalmazás-erőforrások helyi tárolása és kiszolgálása",
-    "string-location-privacy-statement": "Olvassa el a webhely adatvédelmi szabályzatát, hogy megtudja, hogyan kezelik a felhasználók helyét.",
-    "string-trust-site": "Megbízom ebben a webhelyben. Használhatja a Szinkron szolgáltatást."
-  },
-  "ja": {
-    "string-workerpool-desc": "Asynchronous JavaScript により、アプリケーションのレスポンスを向上",
-    "string-allow": "許可",
-    "string-query-data": "下記のウェブサイトは、Gears を使用してパソコンに情報を保存します。",
-    "string-deny-accesskey": "D",
-    "string-query-location": "下記のウェブサイトは、Gears を使用して場所に関する情報にアクセスします。",
-    "string-html-title": "Gears のセキュリティ警告",
-    "string-description": "Gears は、ウェブ アプリケーションの機能をオフラインで使えるようにするオープン ソースのブラウザ拡張ツールです。使用している JavaScript API は、次のとおりです。",
-    "string-database-desc": "検索できるローカルのリレーショナル データベースにデータを保存",
-    "string-allow-accesskey": "A",
-    "string-cancel": "キャンセル",
-    "string-never-allow-link": "このサイトを常に拒否する",
-    "string-deny": "拒否",
-    "string-never-allow-link-wince": "常に拒否する",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "アプリケーション リソースをクライアント PC 側で格納して提供",
-    "string-location-privacy-statement": "場所の使用方法については、サイトのプライバシー ポリシーをご覧ください。",
-    "string-trust-site": "このサイトを信頼します。Gears の使用を許可します。"
-  },
-  "he": {
-    "string-workerpool-desc": "הפעל Javascript אסינכרוני כדי לשפר את היענות היישום",
-    "string-allow": "אפשר",
-    "string-query-data": "אתר האינטרנט שלהלן מבקש לאחסן באמצעות Gears מידע במחשב שלך.",
-    "string-deny-accesskey": "ד",
-    "string-query-location": "אתר האינטרנט שלהלן מבקש גישה באמצעות Gears למידע לגבי המיקום שלך.",
-    "string-html-title": "אזהרת אבטחה של Gears",
-    "string-description": "Gears הוא הרחבת דפדפן בעלת קוד פתוח. ההרחבה מאפשרת ליישומי אינטרנט לספק פונקציונליות באופן לא מקוון באמצעות ממשקי JavaScript API הבאים:",
-    "string-database-desc": "אחסן מידע באופן מקומי במסד נתונים טבלאי הניתן לחיפוש במלואו",
-    "string-allow-accesskey": "א",
-    "string-cancel": "ביטול",
-    "string-never-allow-link": "לעולם אין לאפשר אתר זה",
-    "string-deny": "דחה",
-    "string-never-allow-link-wince": "לעולם אל תאפשר שירות זה",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "אחסן משאבי יישומים והגש אותם באופן מקומי",
-    "string-location-privacy-statement": "עיין בהצהרת הפרטיות של האתר כדי לראות את אופן השימוש במיקומך.",
-    "string-trust-site": "אני נותן אמון באתר זה. אפשר לו להשתמש ב-Gears."
-  },
-  "te": {
-    "string-workerpool-desc": "అప్లికేషన్ ప్రతిస్పందనా స్వభావాన్ని పెంచడానికి అసమకాలీకరించిన జావాస్క్రిప్ట్‌ను రన్ చెయ్యండి",
-    "string-allow": "అనుమతించు",
-    "string-query-data": "Gears ఉపయోగించి ఈ క్రింది నున్న వెబ్సైట్ మీ కంప్యుటర్లో సమాచారాన్ని నిల్వ చెయ్యలనుకుంటుంది.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "Gears ఉపయోగించి ఈ క్రింది నున్న వెబ్సైట్ మీ స్థానం గురించి సమాచారాన్ని ఆక్సెస్ చెయ్యలనుకుంటుంది.",
-    "string-html-title": "Gears భద్రత హెచ్చెరిక",
-    "string-description": "Gears అనేది ఒక ఓపెన్ సోర్స్ బ్రౌజర్ ఎక్స్ టెన్షన్. ఇది ఈ క్రింది JavaScript API లని ఉపయోగించి వెబ్ అప్లికేషన్ల కోసం ఆఫ్లైన్ ఉపయోగాన్ని ఎనేబుల్ చేస్తుంది:",
-    "string-database-desc": "డేటాను స్థానికంగా శోధించదగిన సంబంధిత డేటాబేస్‌లో నిల్వ చెయ్యండి",
-    "string-allow-accesskey": "A",
-    "string-cancel": "రద్దు చెయ్యి",
-    "string-never-allow-link": "ఈ సైట్‌ను ఎప్పుడూ అనుమతించవద్దు",
-    "string-deny": "తిరస్కరించు",
-    "string-never-allow-link-wince": "దీనిని ఎప్పుడూ అనుమతించవద్దు",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "అప్లికేషన్ రిసోర్సులను స్థానికంగా నిల్వ చేసి, అందించు",
-    "string-location-privacy-statement": "ఈ సైట్ యొక్క గోప్యతా విధానాన్ని చదివి మీ స్థానం ఎలా ఉపయోగించబడుతుందో తెలుసుకోండి .",
-    "string-trust-site": "నేను ఈ సైట్ని నమ్ముతున్నాను. దానిని Gears ఉపయోగించడానికి అనుమతించు."
-  },
-  "pt-PT": {
-    "string-workerpool-desc": "Executar Javascript assíncrono para melhorar a capacidade de resposta das aplicações",
-    "string-allow": "Permitir",
-    "string-query-data": "O Web site abaixo deseja armazenar informação no seu computador através do Gears.",
-    "string-deny-accesskey": "E",
-    "string-query-location": "O Web site abaixo deseja aceder a informação acerca da sua localização através do Gears.",
-    "string-html-title": "Aviso de segurança do Gears",
-    "string-description": "O Gears é uma extensão de browser de software livre que permite às aplicações Web fornecerem a funcionalidade off-line através da utilização das seguintes APIs de JavaScript:",
-    "string-database-desc": "Armazenar dados localmente numa base de dados relacional totalmente pesquisável",
-    "string-allow-accesskey": "P",
-    "string-cancel": "Cancelar",
-    "string-never-allow-link": "Nunca permitir este site",
-    "string-deny": "Negar",
-    "string-never-allow-link-wince": "Nunca permitir",
-    "string-trust-site-accesskey": "c",
-    "string-localserver-desc": "Armazenar e servir localmente recursos da aplicação",
-    "string-location-privacy-statement": "Leia a política de privacidade do site para saber como a sua localização vai ser usada.",
-    "string-trust-site": "Confio neste site. Permitir que utilize o Gears."
-  },
-  "sr": {
-    "string-workerpool-desc": "Покрените асинхрони JavaScript како бисте побољшали реакције апликације",
-    "string-allow": "Дозволи",
-    "string-query-data": "Веб сајт испод жели да ускладишти информације на вашем рачунару помоћу услуге Gears.",
-    "string-deny-accesskey": "X",
-    "string-query-location": "Веб сајт испод жели да приступи информацијама о вашој локацији помоћу услуге Gears.",
-    "string-html-title": "Gears безбедносно упозорење",
-    "string-description": "Gears је проширење прегледача отвореног кода којe веб апликацијама омогућава функционисање ван мреже помоћу следећих JavaScript API-ја:",
-    "string-database-desc": "Складиштите податке локално у потпуно претраживој релационој бази података",
-    "string-allow-accesskey": "M",
-    "string-cancel": "Откажи",
-    "string-never-allow-link": "Никада не дозволи овом сајту",
-    "string-deny": "Забрани приступ",
-    "string-never-allow-link-wince": "Никада не дозволи",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Складиштите и пружајте ресурсе апликације локално",
-    "string-location-privacy-statement": "Прочитајте политику приватности сајта да бисте видели како ће се ваша локација користити.",
-    "string-trust-site": "Имам поверења у овај сајт. Дозволи му да користи Gears."
-  },
-  "ko": {
-    "string-workerpool-desc": "비동기 자바스크립트를 실행하여 응용 프로그램 응답성 개선",
-    "string-allow": "허용",
-    "string-query-data": "다음 웹사이트가 Gears를 사용하여 컴퓨터에 정보를 저장하려고 합니다.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "다음 웹사이트가 Gears를 사용하여 사용자의 위치 정보에 액세스하려고 합니다.",
-    "string-html-title": "Gears 보안경고",
-    "string-description": "Gears는 다음과 같은 자바스크립트 API를 통해 오프라인에서 웹 애플리케이션을 사용할 수 있게 해 주는 오픈 소스 브라우저 확장 프로그램입니다.",
-    "string-database-desc": "완벽한 검색이 가능한 관계형 데이터베이스의 형태로 데이터를 로컬 컴퓨터에 저장",
-    "string-allow-accesskey": "A",
-    "string-cancel": "취소",
-    "string-never-allow-link": "사이트를 허용하지 않음",
-    "string-deny": "금지",
-    "string-never-allow-link-wince": "허용하지 않음",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "로컬 컴퓨터에서 애플리케이션 리소스 저장 및 사용",
-    "string-location-privacy-statement": "위치가 사용되는 방법을 보려면 사이트의 개인정보 보호정책을 읽어 보세요.",
-    "string-trust-site": "이 사이트를 신뢰합니다. Gears 사용을 허용합니다."
-  },
-  "sv": {
-    "string-workerpool-desc": "Kör asynkron JavaScript som förbättrar programmets responsivitet",
-    "string-allow": "Tillåt",
-    "string-query-data": "Webbplatsen nedan vill ha tillgång till information om din plats som använder Gears.",
-    "string-deny-accesskey": "E",
-    "string-query-location": "Webbplatsen nedan will ha tillgång till information om din plats som använder Gears.",
-    "string-html-title": "Säkerhetsvarning i Gears",
-    "string-description": "Gears är ett webbläsartillägg med öppen källkod som gör att webbprogram kan ge offlinefunktionalitet med följande JavaScript-API:er:",
-    "string-database-desc": "Spara data lokalt i en helt sökbar relationsdatabas",
-    "string-allow-accesskey": "T",
-    "string-cancel": "Avbryt",
-    "string-never-allow-link": "Tillåt aldrig den här webbplatsen",
-    "string-deny": "Neka",
-    "string-never-allow-link-wince": "Tillåt aldrig",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Spara och hantera programresurser lokalt",
-    "string-location-privacy-statement": "Läs webbplatsens sekretesspolicy för att se hur din plats kommer att användas.",
-    "string-trust-site": "Jag litar på den här platsen Tillåt den använda Gears."
-  },
-  "ur": {
-    "string-workerpool-desc": "اپلی کیشن کا رد عمل بہتر بنانے کیلئے مطابقت پذیر جاوا اسکرپٹ چلائیں",
-    "string-allow": "اجازت دیں",
-    "string-query-data": "ذیل کی ویب سائٹ گیئرز کا استعمال کرتے ہوئے آپ کے کمپیوٹر پر معلومات جمع کرنا چاہتی ہے۔",
-    "string-deny-accesskey": "D",
-    "string-query-location": "ذیل کی ویب سائٹ گیئرز کا استعمال کرتے ہوئے آپ کے مقام سے متعلق معلومات تک رسائی حاصل کرنا چاہتی ہے۔",
-    "string-html-title": "گیئرز کی تحفظاتی تنبیہ",
-    "string-description": "گیئرز براؤزر کی ایک کھلے وسائل والی توسیع ہے جو ویب اطلاقات کو درج ذیل جاوا اسکرپٹ اطلاقات کا استعمال کرتے ہوئے آف لائن کارکردگی فراہم کرنے کے قابل بناتا ہے:",
-    "string-database-desc": "ایک پوری طرح قابل تلاش متعلقہ ڈیٹا بیس",
-    "string-allow-accesskey": "A",
-    "string-cancel": "منسوخ",
-    "string-never-allow-link": "کبھی بھی اس سائٹ کی اجازت نہ دیں۔",
-    "string-deny": "مسترد",
-    "string-never-allow-link-wince": "کبھی بھی اس کی اجازت نہ دیں",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "اطلاقی وسائل کو مقامی طور پر جمع اور استعمال کریں",
-    "string-location-privacy-statement": "یہ دیکھنے کیلئے کہ آپ کے جائے وقوع کا استعمال کس طرح کیا جائے گا، اس سائٹ کی رازداری کی پالیسی کو پڑھیں۔",
-    "string-trust-site": "میں اس سائٹ پر اعتبار کرتا ہوں۔ اسے گیئرز استعمال کرنے کی اجازت دیں۔"
-  },
-  "sk": {
-    "string-workerpool-desc": "Spustiť asynchrónny Javascript na zlepšenie reakcie aplikácie",
-    "string-allow": "Povoliť",
-    "string-query-data": "Nižšie uvedená webová lokalita chce použiť rozšírenie Gears na uchovávanie informácií vo vašom počítači.",
-    "string-deny-accesskey": "K",
-    "string-query-location": "Nižšie uvedená webová lokalita chce použiť rozšírenie Gears na získanie prístupu k informáciám o vašom umiestnení.",
-    "string-html-title": "Varovanie zabezpečenia rozšírenia Gears",
-    "string-description": "Gears je rozšírenie prehliadača typu open source, ktoré umožňuje webovým aplikáciám poskytovať funkcie v režime offline prostredníctvom nasledujúcich rozhraní JavaScript API:",
-    "string-database-desc": "Uložiť informácie lokálne v relačnej databáze, s možnosťou úplného prehľadávania",
-    "string-allow-accesskey": "P",
-    "string-cancel": "Zrušiť",
-    "string-never-allow-link": "Nikdy nepovoliť túto lokalitu",
-    "string-deny": "Zakázať",
-    "string-never-allow-link-wince": "Nikdy nepovoliť",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Uložiť a sprístupniť zdroje aplikácie lokálne",
-    "string-location-privacy-statement": "Ak chcete zistiť, na aké účely sa použijú informácie o vašom umiestnení, prečítajte si zásady ochrany osobných údajov pre túto lokalitu.",
-    "string-trust-site": "Považujem túto lokalitu za dôveryhodnú. Povoliť, aby mohla používať rozšírenie Gears."
-  },
-  "zh-CN": {
-    "string-workerpool-desc": "运行异步 JavaScript 以提高应用程序响应速度",
-    "string-allow": "允许",
-    "string-query-data": "下列网站要使用 Gears 在您的计算机上存储信息。",
-    "string-deny-accesskey": "D",
-    "string-query-location": "下列网站要使用 Gears 访问有关您的位置的信息。",
-    "string-html-title": "Gears 安全警告",
-    "string-description": "Gears 是一种开放源代码的浏览器扩展程序,通过该扩展程序网络应用程序可以使用以下 JavaScript API 提供脱机功能:",
-    "string-database-desc": "在本地将数据存储到可全面搜索的关系数据库中",
-    "string-allow-accesskey": "A",
-    "string-cancel": "取消",
-    "string-never-allow-link": "永不允许该网站",
-    "string-deny": "拒绝",
-    "string-never-allow-link-wince": "永不允许",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "在本地存储和提供应用程序资源",
-    "string-location-privacy-statement": "阅读网站的隐私政策,了解该网站会如何使用您的位置。",
-    "string-trust-site": "我信任该网站。 允许其使用 Gears。"
-  },
-  "de": {
-    "string-workerpool-desc": "Asynchrones JavaScript zum Verbessern der Anwendungsreaktion ausführen",
-    "string-allow": "Zulassen",
-    "string-query-data": "Die untenstehende Website möchte über Gears Informationen auf Ihrem Computer speichern.",
-    "string-deny-accesskey": "V",
-    "string-query-location": "Die untenstehende Website fordert über Gears Zugriffsinformationen zu Ihrem Speicherort an.",
-    "string-html-title": "Gears-Sicherheitswarnung",
-    "string-description": "Gears ist eine Open-Source-Browsererweiterung, mit der Webanwendungen unter Verwendung der folgenden JavaScript-APIs Offline-Funktionen anbieten können:",
-    "string-database-desc": "Daten lokal in einer voll durchsuchbaren relationalen Datenbank speichern",
-    "string-allow-accesskey": "Z",
-    "string-cancel": "Abbrechen",
-    "string-never-allow-link": "Diese Website nie zulassen",
-    "string-deny": "Verweigern",
-    "string-never-allow-link-wince": "Nie zulassen",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Anwendungsressourcen lokal speichern und bereitstellen",
-    "string-location-privacy-statement": "Lesen Sie die Datenschutzrichtlinien für die Site, um zu erfahren, wie Ihr Speicherort verwendet wird.",
-    "string-trust-site": "Ich vertraue dieser Site. Verwendung von Gears zulassen."
-  },
-  "pl": {
-    "string-workerpool-desc": "Uruchom asynchroniczny skrypt JavaScript, aby usprawnić działanie aplikacji",
-    "string-allow": "Zezwalaj",
-    "string-query-data": "Poniższa witryna internetowa chce przechowywać informacje na Twoim komputerze za pośrednictwem wtyczki Gears.",
-    "string-deny-accesskey": "P",
-    "string-query-location": "Poniższa witryna internetowa chce uzyskać dostęp do informacji o Twojej lokalizacji za pośrednictwem wtyczki Gears.",
-    "string-html-title": "Ostrzeżenie wtyczki Gears dotyczące zabezpieczeń",
-    "string-description": "Wtyczka Gears to rozszerzenie przeglądarki typu open source, które umożliwia aplikacjom internetowym funkcjonowanie w trybie offline przy użyciu następujących interfejsów API języka JavaScript:",
-    "string-database-desc": "Przechowuj dane lokalnie w relacyjnej bazie danych z możliwością pełnego przeszukiwania",
-    "string-allow-accesskey": "Z",
-    "string-cancel": "Anuluj",
-    "string-never-allow-link": "Nigdy nie zezwalaj na tę witrynę",
-    "string-deny": "Odmów",
-    "string-never-allow-link-wince": "Nigdy nie zezwalaj",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Przechowuj zasoby aplikacji i obsługuj je lokalnie",
-    "string-location-privacy-statement": "Zapoznaj się z polityką prywatności witryny, aby zobaczyć, do czego zostaną wykorzystane informacje o Twojej lokalizacji.",
-    "string-trust-site": "Ufam tej witrynie. Zezwól jej na korzystanie z wtyczki Gears."
-  },
-  "ms": {
-    "string-workerpool-desc": "Jalankan JavaScript tak segerak untuk meningkatkan kesambutan aplikasi",
-    "string-allow": "Benarkan",
-    "string-query-data": "Laman web di bawah mahu menyimpan maklumat pada komputer anda dengan menggunakan Gear.",
-    "string-deny-accesskey": "L",
-    "string-query-location": "Laman web di bawah mahu mengakses maklumat mengenai lokasi anda dengan menggunakan Gear.",
-    "string-html-title": "Amaran Keselamatan Gear",
-    "string-description": "Gear adalah lanjutan penyemak imbas sumber terbuka yang membolehkan aplikasi web untuk menyediakan kefungsian luar talian menggunakan JavaScript APIs yang berikut:",
-    "string-database-desc": "Simpan data setempat dalam pangkalan data hubungan boleh cari sepenuhnya",
-    "string-allow-accesskey": "N",
-    "string-cancel": "Batal",
-    "string-never-allow-link": "Jangan sekali-kali benarkan laman ini",
-    "string-deny": "Tolak",
-    "string-never-allow-link-wince": "Jangan sekali-kali benarkannya",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Simpan dan berikan sumber aplikasi setempat",
-    "string-location-privacy-statement": "Baca dasar privasi tapak untuk melihat bagaimana lokasi anda akan digunakan.",
-    "string-trust-site": "Saya percaya tapak ini. Benarkannya untuk menggunakan Gear."
-  },
-  "sl": {
-    "string-workerpool-desc": "Zaženi asinhroni javascript, da bo odzivnost aplikacij boljša",
-    "string-allow": "Dovoli",
-    "string-query-data": "To spletno mesto želi shraniti informacije o računalniku, v katerem se uporablja program Gears.",
-    "string-deny-accesskey": "R",
-    "string-query-location": "To spletno mesto želi omogočiti dostop do informacij o lokaciji, ki uporablja program Gears.",
-    "string-html-title": "Varnostno opozorilo programa Gears",
-    "string-description": "Gears je odprtokodna razširitev brskalnika, ki z uporabo teh programskih vmesnikov z JavaScriptom omogoča delovanje spletnih programov brez povezave:",
-    "string-database-desc": "Lokalno shranjevanje podatkov v relacijsko podatkovno zbirko, po kateri je mogoče iskati",
-    "string-allow-accesskey": "A",
-    "string-cancel": "Prekliči",
-    "string-never-allow-link": "Nikoli ne dovoli tega spletnega mesta",
-    "string-deny": "Zavrni",
-    "string-never-allow-link-wince": "Nikoli ne dovoli",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "Lokalno shranjevanje in omogočanje virov za aplikacije",
-    "string-location-privacy-statement": "Če želite izvedeti, kako bo uporabljena vaša lokacija, preberite pravilnik o zasebnosti, ki velja za to spletno mesto.",
-    "string-trust-site": "Temu spletnemu mestu zaupam. Dovoli mu uporabo programa Gears."
-  },
-  "mr": {
-    "string-workerpool-desc": "अनुप्रयोगाच्या प्रतिसादात्मकतेत सुधारणा करण्यासाठी असिंक्रोनस JavaScript चालवा",
-    "string-allow": "अनुमती द्या",
-    "string-query-data": "खालील वेबसाइट Gears वापरुन आपल्या संगणकावर माहिती संचयित करू इच्छित आहे.",
-    "string-deny-accesskey": "D",
-    "string-query-location": "खालील वेबसाइट Gears वापरुन आपल्या स्थानाबद्दलच्या माहितीमध्ये प्रवेश करू इच्छिते.",
-    "string-html-title": "Gears सुरक्षा चेतावणी",
-    "string-description": "Gears एक ओपन सोर्स ब्राउझर विस्तार आहे जो ऑफलाइन कार्यक्षमता प्रदान करण्यासाठी खालील JavaScript APIs वापरुन वेब अनुप्रयोग सक्षम करतोः",
-    "string-database-desc": "संपूर्ण-शोध करण्यायोग्य संबंधित डेटाबेस मध्ये स्थानिक रुपात डेटा संग्रहित करा",
-    "string-allow-accesskey": "A",
-    "string-cancel": "रद्द करा",
-    "string-never-allow-link": "या साइटला कधीही अनुमती देऊ नये",
-    "string-deny": "अमान्य करा",
-    "string-never-allow-link-wince": "यास कधीही परवानगी देऊ नये",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "अनुप्रयोग स्रोतांना स्थानिक रुपात संग्रहित आणि सर्व्ह करा",
-    "string-location-privacy-statement": "आपले स्थान कसे वापरले जाते हे जाणून घेण्यासाठी साउटचे गोपनीयता धोरण वाचा.",
-    "string-trust-site": "माझा या साइटवर विश्वास आहे. तिला Gears वापरण्याची परवानगी द्या."
-  },
-  "or": {
-    "string-workerpool-desc": "ଅନୁପ୍ରୟୋଗ ଶୀଘ୍ର ପ୍ରତିକ୍ରିୟା କରିବାକୁ ଏକ ଏସିଂକ୍ରୋନିୟସ୍ JavaScript ଚଲାନ୍ତୁ",
-    "string-allow": "ଅନୁମତି",
-    "string-query-data": "Gears ବ୍ୟବହାର କରି ନିମ୍ନ ୱେବସାଇଟ୍ ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟରରେ ସୂଚନା ଗଚ୍ଛିତ କରିବାକୁ ଚାହୁଁଛି |",
-    "string-deny-accesskey": "D",
-    "string-query-location": "Gears ବ୍ୟବହାର କରି ନିମ୍ନ ୱେବସାଇଟ୍ ଆପଣଙ୍କ ଅବସ୍ଥାନ ସମ୍ବନ୍ଧରେ ସୂଚନା ଆସେସ୍ କରିବାକୁ ଚାହୁଁଛି |",
-    "string-html-title": "Gears ସୁରକ୍ଷା ଚେତାବନୀ",
-    "string-description": "Gears ଏକ ଖୋଲା ଉତ୍ସ ବ୍ରାଉଜର୍ ବିସ୍ତାର , ଯାହା ଅଫଲାଇନ୍ କାର୍ଯ୍ୟକ୍ଷମତା ପ୍ରଦାନ କରିବାକୁ ନିମ୍ନ JavaScript APIs ବ୍ୟବହାର କରି ୱେବ୍ ଅନୁପ୍ରୟୋଗ ସକ୍ଷମ କରେ",
-    "string-database-desc": "ପୂର୍ଣ୍ଣ-ସନ୍ଧାନ ଯୋଗ୍ୟ ସମ୍ପର୍କିତ ଡାଟାବେସ୍‌‌ରେ ଡାଟା ସ୍ଥାନୀୟ ଭାବରେ ଗଚ୍ଛିତ କରନ୍ତୁ",
-    "string-allow-accesskey": "A",
-    "string-cancel": "ବାତିଲ୍",
-    "string-never-allow-link": "କେବେ ମଧ୍ୟ ଏହି ସାଇଟ୍‌କୁ ଅନୁମତି କରନ୍ତୁ ନାହିଁ",
-    "string-deny": "ଅଗ୍ରାହ୍ୟ",
-    "string-never-allow-link-wince": "ଏହାକୁ କେବେ ମଧ୍ୟ ଅନୁମତି କରନ୍ତୁ ନାହିଁ",
-    "string-trust-site-accesskey": "t",
-    "string-localserver-desc": "ଅନୁପ୍ରୟୋଗ ଉତ୍ସଗୁଡିକୁ ସ୍ଥାନୀୟ ଭାବରେ ଗଚ୍ଛିତ ଏବଂ ପରିବେଷିତ କରନ୍ତୁ",
-    "string-location-privacy-statement": "ଆଣଙ୍କର ଅବସ୍ଥାନ କିପରି ବ୍ୟବହୃତ ହେବ ଦେଖିବାକୁ ଏହି ସାଇଟର ଗୋପନୀୟତା ନୀତି ପଢନ୍ତୁ |",
-    "string-trust-site": "ମୁଁ ଏହି ସାଇଟକୁ ବିଶ୍ବାସ କରେ,ଏହାକୁ Gears ବ୍ୟବହାର କରିବାକୁ ଅନୁମତି ପ୍ରଦାନ କରନ୍ତୁ |"
-  }
-};
-
-// Insert all localized strings for the specified locale into the div or span
-// matching the id.
-function loadI18nStrings(locale) {
-  var rtl_languages = ['he', 'ar', 'fa', 'ur'];
-
-  if (!locale) {
-    locale = 'en-US';
-  } else {
-    if (!localized_strings[locale]) {
-      // For xx-YY locales, determine what the base locale is.
-      var base_locale = locale.split('-')[0];
-
-      if (localized_strings[base_locale]) {
-        locale = base_locale;
-      } else {
-        locale = 'en-US';
-      }
-    }
-  }
-
-  var strings = localized_strings[locale];
-
-  // If the specified locale is an right to left language, change the direction
-  // of the page.
-  for (index in rtl_languages) {
-    if (locale == rtl_languages[index]) {
-      document.body.dir = "rtl";
-      break;
-    }
-  }
-
-  // Copy each string to the proper UI element, if it exists.
-  for (name in strings) {
-    if (name == 'string-html-title') {
-      if (!browser.ie_mobile) {
-        // IE Mobile dialogs don't have a title bar.
-        // Furthermore, document.title is undefined in IE Mobile on WinMo 5.
-        // It's also impossible to add properties to the window object.
-        // (see http://code.google.com/apis/gears/mobile.html)
-        document.title = strings[name];
-      }
-    } else {
-      var element = dom.getElementById(name);
-      if (element) {
-        element.innerHTML = strings[name];
-      }
-    }
-  }
-}
-
-
-</script>
-
-<script>
-  var debug = false;
-  initDialog();
-
-  initWarning();
-
-  setButtonLabel("string-allow", "allow-button", "string-allow-accesskey");
-  setButtonLabel("string-deny", "deny-button", "string-deny-accesskey");
-
-  // Highlight the access key in the 'trust' text.
-  // TODO(zork): Cause this to be based on the localized string, and figure out
-  // how to programmatically set the access key for the checkbox.
-  var trustTextElement = dom.getElementById("string-trust-site");
-  text = trustTextElement.innerHTML;
-  text = text.replace(/t/, "<span class='accesskey'>t</span>");
-  trustTextElement.innerHTML = text;
-
-  if (!browser.ie_mobile) {
-    CustomButton.initializeAll();
-  }
-
-  if (browser.ie_mobile) {
-    var allowText = dom.getElementById("string-allow");
-    if (allowText) {
-      window.pie_dialog.SetButton(allowText.innerText, "allowAccessPermanently();");
-      window.pie_dialog.SetButtonEnabled(true);
-    }
-    var cancelText = dom.getElementById("string-cancel");
-    if (cancelText) {
-      window.pie_dialog.SetCancelButton(cancelText.innerText);
-    }
-    // Focus allow button by default.
-    dom.getElementById('allow-button').focus();
-  }
-
-  function setTextContent(elem, content) {
-    if (isDefined(typeof document.createTextNode)) {
-      elem.appendChild(document.createTextNode(content)); 
-    } else {
-      elem.innerText = content;
-    }
-  }
-
-  function showHelp(show) {
-    if (browser.ie_mobile) {
-      var elemSettings = dom.getElementById("permissions-settings"); 
-      var elemHelp = dom.getElementById("permissions-help"); 
-      if (show) {
-        elemSettings.style.display = 'none';
-        elemHelp.style.display = 'block';
-        window.pie_dialog.SetButton("Back", "showHelp(false);");
-        window.pie_dialog.SetButtonEnabled(true);
-      } else {
-        elemSettings.style.display = 'block';
-        elemHelp.style.display = 'none';
-        window.pie_dialog.SetButton("Allow", "allowAccessPermanently();");
-      }
-      window.pie_dialog.ResizeDialog();
-    } else {
-      window.open('http://gears.google.com/?action=help');
-    }
-  }
-
-  function initWarning() {
-    var args;
-    if (debug) {
-      // Handy for debugging layout:
-      args = {
-        locale: "en-US",
-        origin: "http://www.google.com",
-        dialogType: "localData",
-        customIcon: "http://google-gears.googlecode.com/svn/trunk/gears/test/manual/shortcuts/32.png",
-        customName: "My Application",
-        customMessage: "Press the button to enable my application to run offline!"
-      };
-    } else {
-      // The arguments to this dialog are a single string, see PermissionsDialog
-      args = getArguments();
-    }
-
-    loadI18nStrings(args.locale);
-    var origin = args['origin'];  // required parameter
-    var dialogType = args['dialogType'];  // required parameter
-    var customIcon = args['customIcon'];
-    var customName = args['customName'];
-    var customMessage = args['customMessage'];
-
-    var elem;
-
-    elem = dom.getElementById("icon");
-    if (dialogType == "localData") {
-      elem = dom.getElementById("icon-local-data");
-      elem.style.display = "block";
-      elem = dom.getElementById("local-data");
-      elem.style.display = "block";
-    } else if (dialogType == "locationData") {
-      elem = dom.getElementById("icon-locationdata");
-      elem.style.display = "block";
-      elem = dom.getElementById("location-data");
-      elem.style.display = "block";
-      elem = dom.getElementById("string-location-privacy-statement");
-      elem.style.display = "block";
-    }
-
-    if (!customName) {
-      elem = dom.getElementById("origin-only");
-      elem.style.display = "block";
-      if (browser.ie_mobile) {
-        elem.innerHTML = wrapDomain(origin);
-      } else {
-        setTextContent(elem, origin);
-      }
-
-      // When all we have is the origin, we lay it out centered because that
-      // looks nicer. This is also what the original dialog did, which did not
-      // support the extra name, icon, or message.
-      if (!browser.ie_mobile && !customIcon && !customMessage) {
-        elem.setAttribute("align", "center");
-      }
-    } else {
-      elem = dom.getElementById("origin");
-      elem.style.display = "block";
-      setTextContent(elem, origin);
-    }
-
-    if (customIcon) {
-      elem = dom.getElementById("custom-icon");
-      elem.style.display = "inline";
-      elem.height = 32;
-      elem.width = 32;
-      loadImage(elem, customIcon);
-    }
-
-    if (customName) {
-      elem = dom.getElementById("custom-name");
-      elem.style.display = "block";
-      setTextContent(elem, customName);
-    }
-
-    if (customMessage) {
-      elem = dom.getElementById("custom-message");
-      elem.style.display = "block";
-      setTextContent(elem, customMessage);
-    }
-
-    if (!browser.ie_mobile) {
-      // Set up the checkbox to toggle the enabledness of the Allow button.
-      dom.getElementById("unlock").onclick = updateAllowButtonEnabledState;
-      dom.getElementById("checkbox-row").style.display = 'block';
-      updateAllowButtonEnabledState();
-    }
-    resizeDialogToFitContent();
-  }
-
-
-  function updateAllowButtonEnabledState() {
-    var allowButton = dom.getElementById("allow-button");
-    var unlockCheckbox = dom.getElementById("unlock");
-
-    if (unlockCheckbox.checked) {
-      enableButton(allowButton);
-    } else {
-      disableButton(allowButton);
-    }
-  }
-
-  // Note: The structure that the following functions pass is coupled to the
-  // code in PermissionsDialog that processes it.
-  function allowAccessPermanently() {
-      saveAndClose({"allow": true, "permanently": true});
-  }
-
-  function denyAccessTemporarily() {
-    saveAndClose({"allow": false, "permanently": false});
-  }
-
-  function denyAccessPermanently() {
-    saveAndClose({"allow": false, "permanently": true });
-  }
-</script>
-</html>
diff --git a/assets/plugins/gears-0.4.23.0/settings_dialog.html b/assets/plugins/gears-0.4.23.0/settings_dialog.html
deleted file mode 100644 (file)
index e70e790..0000000
+++ /dev/null
@@ -1,2750 +0,0 @@
-<!DOCTYPE html>
-
-<!--
-Copyright 2007, The Android Open Source Project
-
-Redistribution and use in source and binary forms, with or without 
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice, 
-    this list of conditions and the following disclaimer.
- 2. 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.
- 3. Neither the name of Google Inc. nor the names of its contributors may be
-    used to endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
--->
-
-<html>
-<head>
-  <style type="text/css">
-
-
-/*
-Copyright 2007, The Android Open Source Project
-
-Redistribution and use in source and binary forms, with or without 
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice, 
-    this list of conditions and the following disclaimer.
- 2. 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.
- 3. Neither the name of Google Inc. nor the names of its contributors may be
-    used to endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-*/
-
-body, html {
-  background-color:white;
-  padding:0;
-  margin:0;
-  height:100%;
-  overflow:hidden;
-  cursor:default;
-
-  /* 
-    Makes the text unselectable in mozilla. See html_diaog.js for IE
-    implementation.
-  */
-  -moz-user-select:none;
-}
-
-body, td, input, select, button {
-  font-family:arial,sans-serif;
-  font-size:13px;
-}
-
-p {
-  margin:0;
-  margin-bottom:1em;
-}
-
-a {
-  color:blue;
-  text-decoration:underline;
-}
-
-button {
-  /*
-  It would be better to express margins in ems, but it causes layout
-  artifacts (presumably because of rounding errors) when combined with
-  the -moz-border-radius property used in button.css on Firefox 2.
-
-  Also: bizarely, if I try to use the more natural margin-left:10px, I get
-  a bug where the buttons bounce on IE when you hover over them.
-  */
-  position:relative;
-  margin-right:7px;
-  left:7px;
-}
-
-#head {
-  padding:1em;
-}
-
-#foot {
-
-  /*
-  On Android we do not use position:absolute due to some
-  rendering limitations (absolute positioning works, but
-  the automatic resizing of dialog is confused by the
-  variable content and the display is wrong, while if we
-  remove the absolute positioning, #foot is back in the
-  flow and the dialog displays correctly)
-  */
-
-  background:white;
-  bottom:0;
-  width:100%;
-}
-
-#button-row {
-  margin:1em;
-}
-
-.accesskey {
-  text-decoration: underline;
-
-  /* IE CSS extension */
-  accelerator: true;
-}
-
-    h1 {
-      font-size:1.2em;
-      margin:0;
-    }
-
-    h2 {
-      font-size:1.1em;
-      margin:0;
-    }
-
-    /* TODO(aa): Move into standard stylesheet if used in all dialogs? */
-    #icon {
-      margin-right:0.5em;
-    }
-
-    #content {
-      overflow-x:hidden;
-      overflow-y:auto;
-
-      margin:0 1em;
-
-    }
-
-    #content table {
-      border: 1px #ccc;
-      /* Only set the sides and bottom border of the table because
-      border-colapse doesn't work on WinCE. */
-      border-style: none solid;
-      border-collapse: collapse;
-      /* A bug in Mozilla with border-collapse:collapse along with the overflow
-      settings we have on the scroll element causes the left border to be
-      placed 1px to the left, making the element invisible. */
-      margin-left:1px;
-    }
-
-    #content td {
-
-      padding: 4px; 
-
-    }
-
-    #content table.permissions {
-      border-bottom-style: solid;
-    }
-
-    #version {
-      font-size:0.8em;
-      font-style:italic;
-    }
-
-    #content td.left {
-      width: 100%;
-
-      padding-left: 20px;
-
-    }
-
-    #content td.right {
-
-      padding-right: 20px;
-
-    }
-
-    .app-icon {
-      width: 30px;
-    }
-
-    .app-name {
-      width: 150px;
-    }
-
-    .app-origin {
-      width: 70px;
-    }
-
-
-
-    td.origin-name {
-      font-weight: bold;
-      width: 100%;
-    }
-
-
-    div.radio-buttons {
-
-      width: 150px;
-
-    }
-
-
-
-
-  </style>
-</head>
-<body>
-  <div id="strings" style="display:none;">
-    <div id="string-cancel"></div>
-    <div id="string-cancel-accesskey"></div>
-    <div id="string-apply"></div>
-    <div id="string-apply-accesskey"></div>
-    <div id="string-nosites"></div>
-    <div id="string-allowed"></div>
-    <div id="string-denied"></div>
-    <div id="string-local-storage"></div>
-    <div id="string-location-data"></div>
-    <div id="string-remove"></div>
-  </div>
-  
-  <div id="head">
-    <table width="100%" cellpadding="0" cellspacing="0" border="0">
-      <tr>
-        <td valign="middle">
-
-          <img id="icon" src="data:image/png;base64,
-iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAJPElEQVR4Xq3V
-WWyc1d0G8Oecd515Z/csHsfxntiOE8eOMY6dxFkokJCQlACBhEpsvWgLRkAL
-IhRxEYrSpp/6XYCgUokKBQEl0ABR0wrShBAI2R1nM3HseB+Px2PPPu/Mu3aE
-uKkoUhPzuzhXRzp/PUfPOcQ0TcxGrOcJ9Jz6F4YmTNq2yF4r5436aFyrlyz8
-nyQxH6m7aTdETxO+D8UssSxF/0gGc4NCpc3u2VtctvBNb5HjN71XUw8bxAHd
-pPiGkQeg/PADDI5lMZ3QYRUZL2MpqRVIyhpwGwj62OdTObo1l405svEBd9/h
-J7ae3Nd1p6rIP+wA5/tzuKExgKDfsZm32KHIU6AUaGnwiD5b5u3R0787OXVu
-x0kbF3t7ZuyzPZ/ve2HjfySI65SdPOQf7z/UNM87pPg8zi32wI0/J8oINE1F
-NgewLOBxW8GwxnyTUWCqcSycHyT7Du99V9XY1rX37Lh43QPoagrhS689zRnp
-X/p9btjcZUB+CL29vThwPD6USOnHrRbGqCixNLc3ueuK3BpMQ0U0oaJvONvd
-uvaGoVklkJm+6DbU2Aa3rxxy7CL0VBxj4Qz++s/I4ebF1VvKAyRiaEmkMobt
-bO/0Gy0NRZu9bh5XBifVxqXbnm/p2JiZVQtmJs5WhcZHq+XkEAhlYJrAF2cS
-qUX1pV13bVgSqa+yo6bMgSInl57XdOdDM0l9kFIKniWcwDP6rFtQUn/f6QTt
-uPd0z2AMJoGqGYjMqD1Vc8j5zEw/qJGG3UrBsQwMNpjgqHZW1w3MKbYiFTm1
-StOU2Q3Ai3bcdt9LH4iuusczsgxKCSwiYxLCQMmnwbAUDEMg5/PgRDec3qqc
-yXpQ4rejrjj0zME9j+/IyUnrrGrIsDwal3f1GAbReI7FgiqpeTqWWjQxJePK
-cAY9lxO4MmrCJc6UOt3BDoAFIQbmV3mF7qN7num/3F2CAnb610+CwITAsjAB
-GIYBAkBgKN4ZDiFhAttqq4TpqamNcU0PEULHeUJDnEAUs0P2e0saYeaGsLjO
-bjvfl3pDUWnX0IT8JYMcOprLmsTc0T/yzopyNRsFy7CIzOQQy3kO2ezeQRSQ
-qVvbEc2r2D00DsUwANNEhdWCUknEuyMT6GpvRTCT3GparW/LeQXTyWT0QjT9
-SXEt9+jSX1Xvd7iql+ZiF8CyDBQNmJzO64ZJj9ntLt3lCTaLNp89E+3BmXMD
-hcPVzNh4zLQGOh976oW9f0YBSy0WvD86CcNThLtrKkloZIhSm0PvHp/A1rpq
-lCiy17TbdwY710C72IOiaNR7MqFsuJjVXyoOp6Qq/TIEjiKb08FxHMqDFkY3
-yTLK2UGQQiJ0Bf/4fFQfjJa8sG7zI++1+eYYHo9nCN8iXdWlyIHgyboqsJry
-cljROmKqtreIY/9uJVgkSLaHi5evXKGHQ1Cv9oNQin2FZC5l0i0ttzrifAU5
-FovpvpEJ+YjLzup1VVL7onk2QRQYUGLi4pUYDp7zPvvcrv07BUH47mcUZXg8
-2rYEpqY8JFTUPFKzoKG5UhJ3uIo8J731Da/PWd65AqExGCODoIQAuoYGlw1B
-VthOjpEJPYpVGVNbdvOaus6GGtvqyLSyqvdqdoQS8s21TEZzkGyuE98e/h20
-JeAFL8ttiondjrllQDyGIlGA3+GgFkPH1Imv0NdzFgPxJCJZGQalqHLYsCLg
-vosH+ay4j+9sH3PO0z6e+onLZBzzq8RjMLXtn345irc+upr97Pj48bLy8iF8
-D/Liwhp0+jyBSUU52Oh2LbCYOhiOg6pqOBdL4Eg0poRy6gkLy0SKRaGy2W1v
-bnTZITEMcgB0wsM0ga8GRkFX+G9pvW/xp4qsMOevpFc6JYTL6n98ua55vc5y
-Iv4bsmvxfDS6nYjnlc2VkuWdCqedVxUVR6fj2DM8fpwThF8sdDnPcLoKllJr
-QtXur7NL/9fmcVpFlgWVJBT24FTv1zjjLt39xAcf/5S3cPhfUZFSHJ6YQoVV
-PMKKYpSxSgjJORyYmBoRrNI9j61ZeWZzZSmaXHYEBD7b5nG8GlO0rlAub6LA
-SKehxGOAaMHZLw5u7jt11IdrQP82FkFtSTEsBEGbw+knDidGUhlEFfW9wgM0
-XCynYWMoGl0OgFKEZQUNDuktWTcuEYsFBRhMpvHOhcvZ2k13Ple1uDmNa0C3
-LF6A1ZXl0FRlk3tuOavJWaQ0DQ6OO52MxzE2GQGTzYJwPFoDPlxKpgGYikTJ
-JPUUIUcp9g+OZEtuWXf/s7tff8XqcMi4Bux6K+tNDg8+6F+waAcnSchenIRL
-FGDjGL+mqIjBBCQRNosFJ0NhhFUNIsdxAqU+wenGcH8/ZkTp/PYXd77P8zyu
-FQ0lM09xbvcuR209lKEBUBOolKwICMKDedOkeZb75qV89UIf3uwbwl1zi2GD
-2e4sK68DAQopoaS6Jlzk8+N60LCifjAZS0wo3SdBkgmYlMAncmj3OpvSmvYa
-SyCUFwdg6jp+VlOGeRxtopL0srN+AZcfHYbf5USq50xw7PLXDK4DObS6FZNy
-fr+TZdZRSuEROBT6DoYQjGRljGVz3VaG+cjDMqMCpcvsc+Zs8Ta12JT+y1CH
-BwGGweHxMOTWZY9s2/WHV0S7A9eCnLh5KXoTmTVnYsmtGU2HT+SDLW77+haP
-CzaHA9l0BjlNhVDkg628HILNDvlqP5SxYXAcjwIcn0ng9RPdZ188cLitbvkK
-BdeAPTA5g1a34yDgOFiIHIQQDKayXQ6W/e1ClrWypgE7z4ElJrIDV3ApPImR
-VBYCz6FC0iHrBj4eGE413n3v02WNixVcI7bRaYMBoMJmRR4motk8av2+l6Zj
-sdWKad5htYjQczkkpiI4MDmNL6LxbsUw/1Ik8nmJYe6ITk8vkWoX7ChU8FPu
-OlrA/P+SevhFHj6bhKDVgq/jCUQNwENJkUmwXgCg6QaOzSTx4Wj4PZ/TuX5b
-bfWXQYJTvK69Wbduw/sP7Pz9AZc/YOA6sGo2AxMA1Q0IFCghJj4cGERpqf/I
-J+HIJRNmOSVUOh9LxtxWy/YHW5cotkgImqZC1/K4/dHHrtrm1+J6UXHZKlg7
-b4Jl+SqwHStRe/NatN++EcFVPzrfcOvaVk/nmhaho7Dctn7TA1u3Xg3Mmwd/
-RyduXL8BbbdvAmuxYjb+DcasAaYvg7ldAAAAAElFTkSuQmCC
-           ">
-
-          <!-- Some browsers automatically focus the first focusable item. We
-          don't want anything focused, so we add this fake item. -->
-          <a href="#" id="focus-thief"></a>
-        </td>
-        <td width="100%" valign="middle">
-          <h1>
-          <span id="string-gears-settings"></span>
-          </h1>
-        </td>
-      </tr>
-    </table>
-  </div>
-  <div id="content">
-    <p>
-      <span id="string-permissions-description"></span>
-    </p>
-    <div id='div-permissions'>
-    </div>
-    <br>
-    <br>
-    <div id="string-version"></div>
-  </div>
-  <div id="foot">
-    <div id="button-row">
-      <table width="100%" cellpadding="0" cellspacing="0" border="0">
-        <tr>
-
-          <td nowrap="true" align="right" valign="middle">
-            <button id="confirm-button" class="custom"
-                onclick="saveAndClose(calculateDiff()); return false;"
-              ></button
-            ><button id="cancel-button" accesskey="C" class="custom"
-                onclick="saveAndClose(null); return false;"
-              ></button>
-          </td>
-
-        </tr>
-      </table>
-    </div>
-  </div>
-
-
-</body>
-
-<script>
-/*
-Copyright (c) 2005 JSON.org
-
-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 Software shall be used for Good, not Evil.
-
-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.
-*/
-
-//Array.prototype.______array = '______array';
-
-var JSON = {
-    org: 'http://www.JSON.org',
-    copyright: '(c)2005 JSON.org',
-    license: 'http://www.crockford.com/JSON/license.html',
-
-    stringify: function (arg) {
-        var c, i, l, s = '', v;
-
-        switch (typeof arg) {
-        case 'object':
-            if (arg) {
-                if (arg.constructor == Array.prototype.constructor) {
-                    for (i = 0; i < arg.length; ++i) {
-                        v = this.stringify(arg[i]);
-                        if (s) {
-                            s += ',';
-                        }
-                        s += v;
-                    }
-                    return '[' + s + ']';
-                } else if (typeof arg.toString != 'undefined') {
-                    for (i in arg) {
-                        v = arg[i];
-                        if (typeof v != 'undefined' && typeof v != 'function') {
-                            v = this.stringify(v);
-                            if (s) {
-                                s += ',';
-                            }
-                            s += this.stringify(i) + ':' + v;
-                        }
-                    }
-                    return '{' + s + '}';
-                }
-            }
-            return 'null';
-        case 'number':
-            return isFinite(arg) ? String(arg) : 'null';
-        case 'string':
-            l = arg.length;
-            s = '"';
-            for (i = 0; i < l; i += 1) {
-                c = arg.charAt(i);
-                if (c >= ' ') {
-                    if (c == '\\' || c == '"') {
-                        s += '\\';
-                    }
-                    s += c;
-                } else {
-                    switch (c) {
-                        case '\b':
-                            s += '\\b';
-                            break;
-                        case '\f':
-                            s += '\\f';
-                            break;
-                        case '\n':
-                            s += '\\n';
-                            break;
-                        case '\r':
-                            s += '\\r';
-                            break;
-                        case '\t':
-                            s += '\\t';
-                            break;
-                        default:
-                            c = c.charCodeAt();
-                            s += '\\u00' + Math.floor(c / 16).toString(16) +
-                                (c % 16).toString(16);
-                    }
-                }
-            }
-            return s + '"';
-        case 'boolean':
-            return String(arg);
-        default:
-            return 'null';
-        }
-    },
-    parse: function (text) {
-        var at = 0;
-        var ch = ' ';
-
-        function error(m) {
-            throw {
-                name: 'JSONError',
-                message: m,
-                at: at - 1,
-                text: text
-            };
-        }
-
-        function next() {
-            ch = text.charAt(at);
-            at += 1;
-            return ch;
-        }
-
-        function white() {
-            while (ch) {
-                if (ch <= ' ') {
-                    next();
-                } else if (ch == '/') {
-                    switch (next()) {
-                        case '/':
-                            while (next() && ch != '\n' && ch != '\r') {}
-                            break;
-                        case '*':
-                            next();
-                            for (;;) {
-                                if (ch) {
-                                    if (ch == '*') {
-                                        if (next() == '/') {
-                                            next();
-                                            break;
-                                        }
-                                    } else {
-                                        next();
-                                    }
-                                } else {
-                                    error("Unterminated comment");
-                                }
-                            }
-                            break;
-                        default:
-                            error("Syntax error");
-                    }
-                } else {
-                    break;
-                }
-            }
-        }
-
-        function string() {
-            var i, s = '', t, u;
-
-            if (ch == '"') {
-outer:          while (next()) {
-                    if (ch == '"') {
-                        next();
-                        return s;
-                    } else if (ch == '\\') {
-                        switch (next()) {
-                        case 'b':
-                            s += '\b';
-                            break;
-                        case 'f':
-                            s += '\f';
-                            break;
-                        case 'n':
-                            s += '\n';
-                            break;
-                        case 'r':
-                            s += '\r';
-                            break;
-                        case 't':
-                            s += '\t';
-                            break;
-                        case 'u':
-                            u = 0;
-                            for (i = 0; i < 4; i += 1) {
-                                t = parseInt(next(), 16);
-                                if (!isFinite(t)) {
-                                    break outer;
-                                }
-                                u = u * 16 + t;
-                            }
-                            s += String.fromCharCode(u);
-                            break;
-                        default:
-                            s += ch;
-                        }
-                    } else {
-                        s += ch;
-                    }
-                }
-            }
-            error("Bad string");
-        }
-
-        function array() {
-            var a = [];
-
-            if (ch == '[') {
-                next();
-                white();
-                if (ch == ']') {
-                    next();
-                    return a;
-                }
-                while (ch) {
-                    a.push(value());
-                    white();
-                    if (ch == ']') {
-                        next();
-                        return a;
-                    } else if (ch != ',') {
-                        break;
-                    }
-                    next();
-                    white();
-                }
-            }
-            error("Bad array");
-        }
-
-        function object() {
-            var k, o = {};
-
-            if (ch == '{') {
-                next();
-                white();
-                if (ch == '}') {
-                    next();
-                    return o;
-                }
-                while (ch) {
-                    k = string();
-                    white();
-                    if (ch != ':') {
-                        break;
-                    }
-                    next();
-                    o[k] = value();
-                    white();
-                    if (ch == '}') {
-                        next();
-                        return o;
-                    } else if (ch != ',') {
-                        break;
-                    }
-                    next();
-                    white();
-                }
-            }
-            error("Bad object");
-        }
-
-        function number() {
-            var n = '', v;
-            if (ch == '-') {
-                n = '-';
-                next();
-            }
-            while (ch >= '0' && ch <= '9') {
-                n += ch;
-                next();
-            }
-            if (ch == '.') {
-                n += '.';
-                while (next() && ch >= '0' && ch <= '9') {
-                    n += ch;
-                }
-            }
-            if (ch == 'e' || ch == 'E') {
-                n += 'e';
-                next();
-                if (ch == '-' || ch == '+') {
-                    n += ch;
-                    next();
-                }
-                while (ch >= '0' && ch <= '9') {
-                    n += ch;
-                    next();
-                }
-            }
-            v = +n;
-            if (!isFinite(v)) {
-                ////error("Bad number");
-            } else {
-                return v;
-            }
-        }
-
-        function word() {
-            switch (ch) {
-                case 't':
-                    if (next() == 'r' && next() == 'u' && next() == 'e') {
-                        next();
-                        return true;
-                    }
-                    break;
-                case 'f':
-                    if (next() == 'a' && next() == 'l' && next() == 's' &&
-                            next() == 'e') {
-                        next();
-                        return false;
-                    }
-                    break;
-                case 'n':
-                    if (next() == 'u' && next() == 'l' && next() == 'l') {
-                        next();
-                        return null;
-                    }
-                    break;
-            }
-            error("Syntax error");
-        }
-
-        function value() {
-            white();
-            switch (ch) {
-                case '{':
-                    return object();
-                case '[':
-                    return array();
-                case '"':
-                    return string();
-                case '-':
-                    return number();
-                default:
-                    return ch >= '0' && ch <= '9' ? number() : word();
-            }
-        }
-
-        return value();
-    }
-};
-
-// Copyright 2008, The Android Open Source Project
-//
-// Redistribution and use in source and binary forms, with or without 
-// modification, are permitted provided that the following conditions are met:
-//
-//  1. Redistributions of source code must retain the above copyright notice, 
-//     this list of conditions and the following disclaimer.
-//  2. 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.
-//  3. Neither the name of Google Inc. nor the names of its contributors may be
-//     used to endorse or promote products derived from this software without
-//     specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-
-//=============================================================================
-// Various basic JavaScript utilities.
-//=============================================================================
-
-/**
- * Check that the type is not undefined (we do it here as on
- * some devices typeof returns unknown instead of undefined...).
- * We have to pass the evaluation of (typeof elem) (i.e., a string)
- * to the function rather than simply (element) -- passing an 
- * undefined object would make the function crash on PIE.
- */
-function isDefined(type) {
-  return type != 'undefined' && type != 'unknown';
-}
-
-/**
- * Returns true if val is a function.
- */
-function isFunction(val) {
-  return typeof val == "function";
-}
-
-// TODO(aa): more basic type checking here.
-
-
-/**
- * Creates a 'bound' function that calls the current function with a preset
- * 'this' object and set of arguments.
- */
-Function.prototype.bind = function(obj) {
-  var preArgs = Array.prototype.slice.call(arguments, 1);
-  var self = this;
-  return function() {
-    var postArgs = Array.prototype.slice.call(arguments, 0);
-    var totalArgs = preArgs.concat(postArgs);
-    return self.apply(obj, totalArgs);
-  }
-};
-
-/**
- * Creates a partially applied function that calls the current function with
- * a preset set of arguments.
- */
-Function.prototype.partial = function() {
-  var args = Array.prototype.slice.call(arguments, 0);
-  return this.bind(null, args);
-};
-
-/**
- * Binds all the methods in obj to obj.
- */
-function bindMethods(obj) {
-  for (var p in obj) {
-    if (isFunction(obj[p])) {
-      obj[p] = obj[p].bind(obj);
-    }
-  }
-}
-
-
-/**
- * Trim leading and trailing whitespace from a string.
- */
-String.prototype.trim = function(str) {
-  return this.replace(/^\s+/, "").replace(/\s+$/, "");
-};
-
-
-/**
- * Find the index of a given element in an array. Returns -1 if the item does
- * not exist.
- */
-Array.prototype.indexOf = function(item) {
-  for (var i = 0; i < this.length; i++) {
-    if (this[i] === item) {
-      return i;
-    }
-  }
-  return -1;
-};
-
-/**
- * Makes a deep copy of an object.
- */
-function cloneObject(original) {
-  var newObject = new Object();
-  for (i in original) {
-    if (typeof original[i] == 'object') {
-      newObject[i] = cloneObject(original[i]);
-    }
-    else {
-      newObject[i] = original[i];
-    }
-  }
-  newObject.length = original.length;
-  return newObject;
-}
-
-var browser = {};
-
-(function() {
-  var ua = navigator.userAgent;
-  browser.opera = typeof opera != "undefined";
-  browser.ie = !browser.opera && ua.indexOf("MSIE") > -1;
-  browser.ie_mobile = (ua.indexOf("Windows CE") > -1) &&
-      (ua.indexOf("MSIE") > -1);
-  browser.webkit = ua.indexOf("WebKit") > -1;
-  // WebKit also gives product == "gecko".
-  browser.mozilla = !browser.webkit && navigator.product == "Gecko";
-  browser.safari = ua.indexOf("Safari") > -1;
-  browser.mac = navigator.platform.indexOf("Mac") > -1;
-  browser.linux = navigator.platform.indexOf("Linux") > -1;
-  browser.windows = navigator.platform.indexOf("Win") > -1;
-  browser.android = ua.indexOf("Android") > -1;
-  if (browser.android) {
-    browser.safari = false;
-  }
-  // TODO(aa): Add detection for more browsers, as necessary.
-})();
-
-// Copyright 2008, The Android Open Source Project
-//
-// Redistribution and use in source and binary forms, with or without 
-// modification, are permitted provided that the following conditions are met:
-//
-//  1. Redistributions of source code must retain the above copyright notice, 
-//     this list of conditions and the following disclaimer.
-//  2. 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.
-//  3. Neither the name of Google Inc. nor the names of its contributors may be
-//     used to endorse or promote products derived from this software without
-//     specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-
-//=============================================================================
-// DOM manipulation utilities.
-// Requires: base.js
-//=============================================================================
-
-var dom = {};
-
-/**
- * Provides a cross-browser way of getting an element by its id
- */
-dom.getElementById = function(id) {
-  if (isDefined(typeof document.getElementById)) {
-    return document.getElementById(id);
-  } else if (isDefined(typeof document.all)) {
-    return document.all[id];
-  }
-  throw new Error("Failed to get element by ID.");
-};
-
-/**
- * Gets the position and dimensions of an element in pixels in relation
- * to the window origin.
- */
-dom.getPosition = function(elem) {
-  var ret = { 'left'   : 0,
-              'top'    : 0,
-              'width'  : elem.width,
-              'height' : elem.height };
-  
-  if (!elem.offsetParent) return ret;
-  
-  var left = 0;
-  var top = 0;
-  while (elem) {
-    left += elem.offsetLeft;
-    top += elem.offsetTop;
-    elem = elem.offsetParent
-  }
-  ret.left = left;
-  ret.top = top;
-  return ret;
-};
-
-/**
- * Returns the height of the inside of the window.
- */
-dom.getWindowInnerHeight = function() {
-  if (isDefined(typeof window.innerHeight)) { // Firefox
-    return window.innerHeight;
-  } else if (isDefined(typeof document.body.offsetHeight)) { // IE
-    return document.body.offsetHeight;
-  }
-
-  throw new Error("Could not get windowInnerHeight.");
-};
-
-/**
- * Add an event listener to an element cross-browser.
- */
-dom.addEvent = function(element, eventName, handler) {
-  var wrapper = dom._callEventHandler.bind(dom, handler);
-
-  if (isDefined(typeof element.addEventListener)) {
-    // Standards-compatible browsers
-    element.addEventListener(eventName, wrapper, false);
-  } else if (isDefined(typeof element.attachEvent)) {
-    // IE
-    element.attachEvent("on" + eventName, wrapper);
-  } else {
-    throw new Error('Failed to attach event.');
-  }
-};
-
-/**
- * Private helper for calling event handlers compatibly across browsers.
- */
-dom._callEventHandler = function(handler, e) {
-  // Older versions of IE don't pass event to the handler.
-  if (!e) e = window.event;
-
-  // TODO(aa): Normalize event object properties.
-
-  return handler(e);
-};
-
-/**
- * Gets the CSS classes for an element.
- */
-dom.getClasses = function(elm) {
-  return elm.className.split(/\s+/);
-};
-
-/**
- * Check is an element has a particular CSS class name.
- */
-dom.hasClass = function(elm, className) {
-  return this.getClasses(elm).indexOf(className) > -1;
-};
-
-/**
- * Adds a CSS class to an element. Do nothing if the class already exists.
- */
-dom.addClass = function(elm, className) {
-  var classes = this.getClasses(elm);
-  if (classes.indexOf(className) > -1) {
-    return;
-  }
-  classes.push(className);
-  elm.className = classes.join(" ");
-};
-
-/**
- * Removes a CSS class from an element. Do nothing if the class doesn't exist.
- */
-dom.removeClass = function(elm, className) {
-  var classes = this.getClasses(elm);
-  var index = classes.indexOf(className);
-  if (index == -1) {
-    return;
-  }
-  classes.splice(index, 1);
-  elm.className = classes.join(" ");
-};
-
-/**
- * Gets the text (non-html) content of an element.
- */
-dom.getTextContent = function(elm) {
-  if (isDefined(typeof elm.textContent)) {
-    return elm.textContent;
-  } else if (isDefined(typeof elm.innerText)) {
-    return elm.innerText;
-  } else {
-    throw new Error("Could not find a property to get text content.");
-  }
-};
-
-/**
- * Sets the text (non-html) contents of an element.
- */
-dom.setTextContent = function(elm, text) {
-  if (isDefined(typeof elm.textContent)) {
-    elm.textContent = text;
-  } else if (isDefined(typeof elm.innerText)) {
-    elm.innerText = text;
-  } else {
-    throw new Error("Could not find a property to set text content.");
-  }
-};
-
-// Copyright 2007, The Android Open Source Project
-//
-// Redistribution and use in source and binary forms, with or without 
-// modification, are permitted provided that the following conditions are met:
-//
-//  1. Redistributions of source code must retain the above copyright notice, 
-//     this list of conditions and the following disclaimer.
-//  2. 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.
-//  3. Neither the name of Google Inc. nor the names of its contributors may be
-//     used to endorse or promote products derived from this software without
-//     specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-
-/**
- * Initialize the base functionality of the dialog.
- */
-function initDialog() {
-  if (!browser.ie_mobile) {
-    dom.addEvent(document, "keyup", handleKeyUp);
-  } else {
-    var buttonRowElem = null;
-    if (window.pie_dialog.IsSmartPhone()) {
-      buttonRowElem = dom.getElementById("button-row-smartphone");
-    } else {
-      buttonRowElem = dom.getElementById("button-row");
-    }
-    if (buttonRowElem) {
-      buttonRowElem.style.display = 'block';
-    }
-  }
-  if (browser.ie_mobile) {
-    window.pie_dialog.SetScriptContext(window);
-    window.pie_dialog.ResizeDialog();
-  }
-}
-
-/**
- * Set the label of an input button, and optionally, its accesskey.
- */
-function setButtonLabel(textID, elemID, accessKeyID) {
-  var textElem = dom.getElementById(textID);
-  var buttonElem = dom.getElementById(elemID);
-  if (textElem == null || buttonElem == null) {
-    return;
-  }
-
-  var accessKeyElem = null;
-  if (isDefined(typeof accessKeyID)) {
-    accessKeyElem = dom.getElementById(accessKeyID);
-  }
-
-  // This function works for two different kinds of buttons. Simple buttons
-  // based on the <input type="button"> tag, and custom buttons based on a
-  // <button> tag with the css class "custom".
-  // Note that on Windows Mobile 5, the tagName property is not defined.
-  // We can therefore safely assume that the converse is also true:
-  // if tagName is not defined, then the platform must be Windows Mobile 5.  
-  if (!isDefined(typeof buttonElem.tagName) ||
-      buttonElem.tagName.toLowerCase() == "input") {
-    buttonElem.value = dom.getTextContent(textElem).trim();
-    if (accessKeyElem != null) {
-      buttonElem.accessKey = dom.getTextContent(accessKeyElem).trim();
-    }
-  } else if (buttonElem.tagName.toLowerCase() == "button") {
-    var text = dom.getTextContent(textElem).trim();
-
-    if (accessKeyElem != null) {
-      // Some browsers use the accessKey attribute of the the anchor tag.
-      var accessKey = dom.getTextContent(accessKeyElem).trim();
-      buttonElem.accessKey = accessKey;
-
-      // Find the first matching character in the text and mark it.
-      // Note: this form of String.replace() only replaces the first occurence.
-      text = text.replace(accessKey,
-                          "<span class='accesskey'>" + accessKey + "</span>");
-    }
-
-    buttonElem.innerHTML = text;
-  } else {
-    throw new Error("Unexpected button tag name: " + buttonElem.tagName);
-  }
-}
-
-/**
- * Allows a dialog to do custom layout when the window changes sizes. The
- * provided function will be called with the height of the content area when the
- * dialog should relayout.
- */
-function initCustomLayout(layoutFunction) {
-  function doLayout() {
-    layoutFunction(getContentHeight());
-  }
-
-  doLayout();
-
-  // We do an additional layout in onload because sometimes things aren't
-  // stabilized when the first doLayout() is called above.
-  dom.addEvent(window, "load", doLayout);
-  dom.addEvent(window, "resize", doLayout);
-
-  // Mozilla doesn't fire continuous events during resize, so if we want to get
-  // somewhat smooth resizing, we need to run our own timer loop. This still
-  // doesn't look perfect, because the timer goes off out of sync with the
-  // browser's internal reflow, but I think it's better than nothing.
-  // TODO(aa): Keep looking for a way to get an event for each reflow, like IE.
-  if (browser.mozilla) {
-    var lastHeight = -1;
-
-    function maybeDoLayout() {
-      var currentHeight = dom.getWindowInnerHeight();
-      if (currentHeight != lastHeight) {
-        lastHeight = currentHeight;
-        doLayout();
-      }
-    }
-
-    window.setInterval(maybeDoLayout, 30);
-  }
-}
-
-/**
- * Get the JSON-formatted arguments that were passed by the caller.
- */
-function getArguments() {
-  var argsString;
-  if (browser.ie_mobile) {
-    argsString = window.pie_dialog.GetDialogArguments();
-  } else if (browser.ie) {
-    argsString = window.external.GetDialogArguments();
-  } else if (browser.mozilla) {
-    argsString = getFirefoxArguments(window.arguments[0]);
-  } else if (browser.safari) {
-    argsString = window.gears_dialogArguments;
-  } else if (browser.android) {
-    argsString = "" + window.bridge.getDialogArguments();
-  }
-
-  if (typeof argsString == "string") {
-    return JSON.parse(argsString);
-  } else {
-    return null;
-  }
-}
-
-/**
- * Helper used by getArguments(). Getting the arguments in the right type is
- * more involved in Firefox.
- */
-function getFirefoxArguments(windowArguments) {
-  var Ci = Components.interfaces;
-  windowArguments.QueryInterface(Ci.nsIProperties);
-  var supportsString = 
-    windowArguments.get("dialogArguments", Ci.nsISupportsString);
-  return supportsString.data;
-}
-
-/**
- * Close the dialog, sending the specified result back to the caller.
- */
-function saveAndClose(resultObject) {
-  var resultString = JSON.stringify(resultObject);
-  if (browser.ie_mobile) {
-    window.pie_dialog.CloseDialog(resultString);
-  } else if (browser.ie) {
-    window.external.CloseDialog(resultString);
-  } else if (browser.mozilla) {
-    saveFirefoxResults(resultString);
-    window.close();
-  } else if (browser.safari) {
-    window.gears_dialog.setResults(resultString);
-  } else if (browser.android) {
-    window.bridge.closeDialog(resultString);
-  }
-}
-
-/**
- * Helper used by endDialog() for Firefox.
- */
-function saveFirefoxResults(resultString) {
-  var Cc = Components.classes;
-  var Ci = Components.interfaces;
-  
-  var props = window.arguments[0].QueryInterface(Ci.nsIProperties);
-  var supportsString = Cc["@mozilla.org/supports-string;1"]
-      .createInstance(Ci.nsISupportsString);
-      
-  supportsString.data = resultString;
-  props.set("dialogResult", supportsString);
-}
-
-/**
- * Returns the height of the content area of the dialog.
- */
-function getContentHeight() {
-  var head = dom.getElementById("head");
-  var foot = dom.getElementById("foot");
-  return dom.getWindowInnerHeight() - head.offsetHeight - foot.offsetHeight;
-}
-
-/**
- * For some reason ESC doesn't work on HTML dialogs in either Firefox or IE. So
- * we implement it manually.
- */
-function handleKeyUp(e) {
-  var ESC_KEY_CODE = 27;
-  
-  if (e.keyCode == ESC_KEY_CODE) {
-    saveAndClose(null);
-  }
-}
-
-/**
- * Disables a button in the right way, whether it is normal or custom.
- */
-function disableButton(buttonElem) {
-  buttonElem.disabled = true;
-
-  if (browser.ie_mobile) {
-    window.pie_dialog.SetButtonEnabled(false);
-  }
-
-  if (!isDefined(typeof buttonElem.tagName) || 
-      buttonElem.tagName.toLowerCase() == "input") {
-    buttonElem.style.color = "gray";
-  } else if (buttonElem.tagName.toLowerCase() == "button") {
-    dom.addClass(buttonElem, "disabled");
-  } else {
-    throw new Error("Unexpected tag name: " + buttonElem.tagName);
-  }
-}
-
-/**
- * Enables a button in the right way, whether it is normal or custom.
- */
-function enableButton(buttonElem) {
-  buttonElem.disabled = false;
-
-  if (browser.ie_mobile) {
-    window.pie_dialog.SetButtonEnabled(true);
-  }
-  
-  if (!isDefined(typeof buttonElem.tagName) ||
-      buttonElem.tagName.toLowerCase() == "input") {
-    buttonElem.style.color = "black";
-  } else if (buttonElem.tagName.toLowerCase() == "button") {
-    dom.removeClass(buttonElem, "disabled");
-  } else {
-    throw new Error("Unexpected tag name: " + buttonElem.tagName);
-  }
-}
-
-/**
- * Returns a wrapped domain (useful for small screens dialogs, 
- * e.g. windows mobile devices)
- */
-function wrapDomain(str) {
-  if (!browser.ie_mobile) {
-    return str;
-  }
-
-  var max = 20;
-  var url;
-  var scheme_start = str.indexOf("://");
-  var scheme = "";
-
-  if (scheme_start != -1) {
-    scheme = str.substring(0, scheme_start);
-    scheme += "://";
-    // there's automatically an hyphenation
-    // point used by the browser after http://
-    // so we only have to hyphenate the
-    // rest of the string
-    url = str.substring(scheme.length);
-  } else {
-    url = str;
-  }
-
-  // We hyphenate the string on every dot
-  var components = url.split(".");
-  if (components.length < 1) {
-    return str;
-  }
-
-  var content = components[0];
-  var len = content.length;
-  for (var i=1; i < components.length; i++) {
-    var elem = components[i];
-    content += ".";
-    len++;
-    if (len + elem.length > max) {
-      content += "<br>";
-      len = 0;
-    }
-    content += elem;
-    len += elem.length;
-  }
-  return scheme + content;
-}
-
-/**
- * Resizes the dialog to fit the content size.
- */
-function resizeDialogToFitContent(opt_minDialogInnerHeight) {
-  // This does not work on PIE (no height measurement)
-  if (browser.ie_mobile) {
-    window.pie_dialog.ResizeDialog();
-    return;
-  }
-  // window.resize() is not working on Android, we bail out.
-  if (browser.android) {
-    return;
-  }
-
-  // Resize the window to fit
-  var contentDiv = dom.getElementById("content");
-  var contentHeightProvided = getContentHeight();
-  var contentHeightDesired = contentDiv.offsetHeight;
-
-  var dialogHeightProvided = dom.getWindowInnerHeight();
-  var dialogHeightDesired =
-      dialogHeightProvided + (contentHeightDesired - contentHeightProvided);
-
-  var minDialogHeight = opt_minDialogInnerHeight || 0;
-  var maxDialogHeight = 400; // arbitrary max height for a dialog to resize to
-  
-  var targetHeight = Math.max(dialogHeightDesired, minDialogHeight);
-  targetHeight = Math.min(dialogHeightDesired, maxDialogHeight);
-
-  if (targetHeight != dialogHeightProvided) {
-    var dy = targetHeight - dialogHeightProvided;
-    window.resizeBy(0, dy);
-  }
-}
-
-/**
- * Safari running on OSX 10.4 can't load images dynamically from the network,
- * this helper function calls gears-specific code to work around this
- * limitation.
- */
-function loadImage(elem, image_url) {
-  if (browser.safari) {
-    var position = dom.getPosition(elem);
-    window.gears_dialog.loadImageIntoElement(image_url, position.top,
-                                             position.left,
-                                             position.width,
-                                             position.height);
-  } else {
-    elem.src = image_url;
-  }
-}
-
-// Copyright 2008, The Android Open Source Project
-//
-// Redistribution and use in source and binary forms, with or without 
-// modification, are permitted provided that the following conditions are met:
-//
-//  1. Redistributions of source code must retain the above copyright notice, 
-//     this list of conditions and the following disclaimer.
-//  2. 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.
-//  3. Neither the name of Google Inc. nor the names of its contributors may be
-//     used to endorse or promote products derived from this software without
-//     specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-
-//=============================================================================
-// Implements the behavior of our custom buttons. There is no native support in
-// IE for rounded corners on HTML elements, so this script also implements a
-// hack to simulate them in that browser.
-//
-// Requires: base.js, dom.js
-//=============================================================================
-
-/**
- * Constructor.
- */
-function CustomButton(htmlButton) {
-  bindMethods(this);
-  
-  this._focused = false;
-  this._htmlButton = htmlButton;
-
-  if (!document.all) {  // not IE
-    dom.addEvent(htmlButton, "mouseover", this._handleMouseOver);
-    dom.addEvent(htmlButton, "mouseout", this._handleMouseOut);
-  } else {  // IE
-    // mouseover/mouseout behave badly with nested elements in IE. Luckily,
-    // mouseenter/mouseleave are provided and have the equivalent semantics.
-    dom.addEvent(htmlButton, "mouseenter", this._handleMouseOver);
-    dom.addEvent(htmlButton, "mouseleave", this._handleMouseOut);
-
-    // We also handle focus and blur in IE so that we can update the corners
-    // to match the black border IE provides.
-    dom.addEvent(htmlButton, "focusin", this._handleFocus);
-    dom.addEvent(htmlButton, "blur", this._handleBlur);
-
-    dom.addClass(htmlButton, "ie");
-    this._createCorners();
-  }
-
-  // Limit button widths to a minimum of 60px. They look funny skinnier.  
-  if (htmlButton.offsetWidth < 60) {
-    htmlButton.style.width = "60px";
-  }
-
-  htmlButton.style.visibility = "visible";
-}
-
-/**
- * Initializes all the custom buttons on the page.
- */
-CustomButton.initializeAll = function() {
-  var buttons = document.getElementsByTagName("button");
-  for (var i = 0, button; button = buttons[i]; i++) {
-    if (dom.hasClass(button, "custom")) {
-      new CustomButton(button);
-    }
-  }
-};
-
-/**
- * Highlights the button on mouseover. Note that this gets called multiple
- * times while the mouse goes over sub elements inside the button.
- */
-CustomButton.prototype._handleMouseOver = function() {
-  if (!this._htmlButton.disabled && !this._focused) {
-    dom.addClass(this._htmlButton, "hover");
-    this._setCornerColor("blue");
-  }
-};
-
-/**
- * Undoes the highlighting of the button on mouseout. Note that this gets called
- * multiple times when the mouse moves out of sub elements, even if it is still
- * over the button. That is OK, as long as there is immediately a mouseover
- * event.
- */
-CustomButton.prototype._handleMouseOut = function() {
-  if (!this._htmlButton.disabled && !this._focused) {
-    dom.removeClass(this._htmlButton, "hover");
-    this._setCornerColor("grey");
-  }
-};
-
-/**
- * Highlights the button on focus. Currently only used for IE.
- * TODO(aa): The black highlight looks cool. Consider for other browsers.
- */
-CustomButton.prototype._handleFocus = function() {
-  dom.removeClass(this._htmlButton, "hover");
-  this._setCornerColor("black");
-  this._focused = true;
-};
-
-/**
- * Undoes the highlighting of the button on blur.
- */
-CustomButton.prototype._handleBlur = function() {
-  this._setCornerColor("grey");
-  this._focused = false;
-};
-
-/**
- * Helper to create the graphics that make the button have rounded corners in
- * IE.
- */
-CustomButton.prototype._createCorners = function() {
-  // Making the button position:relative makes it possible to position things
-  // inside it relative to it's border.
-  this._htmlButton.style.position = "relative";
-
-  var verticalEdges = ["left", "right"];
-  var horizontalEdges = ["top", "bottom"];
-  var colors = ["grey", "blue", "black"];
-
-  for (var i = 0; i < verticalEdges.length; i++) {
-    for (var j = 0; j < horizontalEdges.length; j++) {
-      for (var k = 0; k < colors.length; k++) {
-        var img = document.createElement("img");
-        img.src = "button_corner_" + colors[k]  + ".gif";
-        img.color  = colors[k];
-        img.style.position = "absolute";
-        img.style[verticalEdges[i]] = "-2px";
-        img.style[horizontalEdges[j]] = "-2px";
-        img.style.filter =
-            "progid:DXImageTransform.Microsoft.BasicImage(Rotation=" + 
-            (i + j) + ")";
-        this._htmlButton.appendChild(img);
-      }
-    }
-  }
-
-  this._setCornerColor("grey");
-};
-
-/**
- * Sets the color of the corners in IE by changing the stack order of the corner
- * images.
- */
-CustomButton.prototype._setCornerColor = function(newColor) {
-  var imgs = this._htmlButton.getElementsByTagName("img");
-  for (var i = 0, img; img = imgs[i]; i++) {
-    img.style.zIndex = Number(img.color == newColor);
-  }
-};
-
-var localized_strings = {
-  "el": {
-    "string-denied": "Δεν επιτρέπονται",
-    "string-apply-accesskey": "A",
-    "string-remove": "Κατάργηση",
-    "string-gears-settings": "Ρυθμίσεις Gears",
-    "string-apply": "Εφαρμογή",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Άκυρο",
-    "string-html-title": "Ρυθμίσεις Gears",
-    "string-allowed": "Επιτρέπονται",
-    "string-local-storage": "Τοπικός αποθηκευτικός χώρος",
-    "string-nosites": "Δεν υπάρχουν ιστότοποι.",
-    "string-permissions-description": "Ο παρακάτω πίνακας δείχνει τα δικαιώματα που χορηγήσατε σε κάθε ιστότοπο που επιχείρησε να χρησιμοποιήσει το Gears.",
-    "string-location-data": "Τοποθεσία",
-    "string-version": "Έκδοση Gears 0.4.23.0"
-  },
-  "gu": {
-    "string-denied": "નકારેલું",
-    "string-apply-accesskey": "A",
-    "string-remove": "દૂર કરો",
-    "string-gears-settings": "Gears સેટિંગ્સ",
-    "string-apply": "લાગુ કરો",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "રદ કરો",
-    "string-html-title": "Gears સેટિંગ્સ",
-    "string-allowed": "મંજુર કરેલ",
-    "string-local-storage": "સ્થાનિક સ્ટોરેજ",
-    "string-nosites": "કોઇ સાઇટ્સ નથીં.",
-    "string-permissions-description": "નીચેનુ કોષ્ટક દર્શાવે છે કે તમે જુદી-જુદી સાઇટ્સને કઇ પરવાનગીઓ આપેલી છે કે જેમણે Gearsનો ઉપયોગ કરવાનો પ્રયત્ન કર્યો છે.",
-    "string-location-data": "સ્થાન",
-    "string-version": "Gears સંસ્કરણ 0.4.23.0"
-  },
-  "zh-TW": {
-    "string-denied": "遭拒",
-    "string-apply-accesskey": "A",
-    "string-remove": "移除",
-    "string-gears-settings": "Gears 設定",
-    "string-apply": "套用",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "取消",
-    "string-html-title": "Gears 設定",
-    "string-allowed": "允許",
-    "string-local-storage": "本機儲存",
-    "string-nosites": "沒有網站。",
-    "string-permissions-description": "下表顯示您授予嘗試使用 Gears 之各個網站的權限。",
-    "string-location-data": "位置",
-    "string-version": "Gears 版本 0.4.23.0"
-  },
-  "vi": {
-    "string-denied": "Bị từ chối",
-    "string-apply-accesskey": "P",
-    "string-remove": "Xoá",
-    "string-gears-settings": "Cài đặt Gears",
-    "string-apply": "Áp dụng",
-    "string-cancel-accesskey": "H",
-    "string-cancel": "Huỷ",
-    "string-html-title": "Cài đặt Gears",
-    "string-allowed": "Được phép",
-    "string-local-storage": "Bộ nhớ cục bộ",
-    "string-nosites": "Không có trang web nào.",
-    "string-permissions-description": "Bảng dưới đây hiển thị các quyền bạn cấp cho mỗi trang đã cố gắng sử dụng Gears.",
-    "string-location-data": "Vị trí",
-    "string-version": "Gears phiên bản 0.4.23.0"
-  },
-  "ca": {
-    "string-denied": "Denegat",
-    "string-apply-accesskey": "P",
-    "string-remove": "Elimina",
-    "string-gears-settings": "Configuració de Gears",
-    "string-apply": "Aplica",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Cancel·la",
-    "string-html-title": "Configuració de Gears",
-    "string-allowed": "Permès",
-    "string-local-storage": "Emmagatzematge local",
-    "string-nosites": "Cap lloc.",
-    "string-permissions-description": "La taula següent mostra els permisos que teniu a cada lloc que ha intentat utilizar Gears.",
-    "string-location-data": "Ubicació",
-    "string-version": "Versió de Gears 0.4.23.0"
-  },
-  "it": {
-    "string-denied": "Non consentito",
-    "string-apply-accesskey": "A",
-    "string-remove": "Rimuovi",
-    "string-gears-settings": "Impostazioni di Google Gears",
-    "string-apply": "Applica",
-    "string-cancel-accesskey": "A",
-    "string-cancel": "Annulla",
-    "string-html-title": "Impostazioni di Google Gears",
-    "string-allowed": "Consentito",
-    "string-local-storage": "Archiviazione locale",
-    "string-nosites": "Nessun sito.",
-    "string-permissions-description": "La tabella riportata di seguito mostra le autorizzazioni concesse ai siti che hanno tentato di utilizzare Google Gears.",
-    "string-location-data": "Posizione",
-    "string-version": "Versione di Google Gears 0.4.23.0"
-  },
-  "kn": {
-    "string-denied": "ನಿರಾಕರಿಸಲಾಗಿದೆ",
-    "string-apply-accesskey": "A",
-    "string-remove": "ತೆಗೆಯಿರಿ",
-    "string-gears-settings": "Gears ಸೆಟ್ಟಿಂಗ್ಸ್",
-    "string-apply": "ಅನ್ವಯಿಸಿ",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "ರದ್ದುಮಾಡು",
-    "string-html-title": "Gears ಸೆಟ್ಟಿಂಗ್ಸ್",
-    "string-allowed": "ಅನುಮತಿಸಲಾಗಿದೆ",
-    "string-local-storage": "ಸ್ಥಳೀಯ ಶೇಖರಣೆ",
-    "string-nosites": "ಸೈಟುಗಳಿಲ್ಲ.",
-    "string-permissions-description": "ಕೆಳಗಿನ ಟೇಬಲ್ Gears ಬಳಸಲು ಪ್ರಯತ್ನಿಸಿದ ಪ್ರತಿಯೊಂದು ಸೈಟ್ ಗೂ ನೀವು ನೀಡಿದ ಅನುಮತಿಗಳನ್ನು ತೋರಿಸುತ್ತಿದೆ.",
-    "string-location-data": "ಸ್ಥಳ",
-    "string-version": "0.4.23.0 Gears ಆವೃತ್ತಿ"
-  },
-  "ar": {
-    "string-denied": "مرفوض",
-    "string-apply-accesskey": "س",
-    "string-remove": "إزالة",
-    "string-gears-settings": "إعدادات Gears",
-    "string-apply": "تطبيق",
-    "string-cancel-accesskey": "غ",
-    "string-cancel": "إلغاء",
-    "string-html-title": "إعدادات Gears",
-    "string-allowed": "مسموح",
-    "string-local-storage": "تخزين محلي",
-    "string-nosites": "لا توجد مواقع.",
-    "string-permissions-description": "يوضح الجدول أدناه الأذونات التي قمت بمنحها لكل موقع حاول استخدام Gears.",
-    "string-location-data": "الموقع",
-    "string-version": "Gears الإصدار 0.4.23.0"
-  },
-  "ml": {
-    "string-denied": "തടഞ്ഞു",
-    "string-apply-accesskey": "A",
-    "string-remove": "നീക്കംചെയ്യൂ",
-    "string-gears-settings": "Gears ക്രമീകരണങ്ങള്",
-    "string-apply": "അപേക്ഷിക്കുക",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "റദ്ദാക്കൂ",
-    "string-html-title": "Gears ക്രമീകരണങ്ങള്",
-    "string-allowed": "അനുവദിച്ചു",
-    "string-local-storage": "പ്രാദേശിക ശേഖരം",
-    "string-nosites": "സൈറ്റുകളൊന്നുമില്ല.",
-    "string-permissions-description": "താഴെക്കാണുന്ന പട്ടിക Gears ഉപയോഗിക്കാന് ശ്രമിച്ച ഓരോ സൈറ്റിലേക്കും അനുവദിച്ചവ കാണിക്കുന്നു.",
-    "string-location-data": "ലൊക്കേഷന്",
-    "string-version": "Gears പതിപ്പ് 0.4.23.0"
-  },
-  "cs": {
-    "string-denied": "Zamítnuto",
-    "string-apply-accesskey": "P",
-    "string-remove": "Odebrat",
-    "string-gears-settings": "Nastavení aplikace Gears",
-    "string-apply": "Použít",
-    "string-cancel-accesskey": "R",
-    "string-cancel": "Zrušit",
-    "string-html-title": "Nastavení aplikace Gears",
-    "string-allowed": "Povoleno",
-    "string-local-storage": "Místní úložiště",
-    "string-nosites": "Žádné weby.",
-    "string-permissions-description": "Následující tabulka zobrazuje oprávnění udělená každému webu, který se pokusil použít aplikaci Gears.",
-    "string-location-data": "Lokalita",
-    "string-version": "Gears verze 0.4.23.0"
-  },
-  "et": {
-    "string-denied": "Keelatud",
-    "string-apply-accesskey": "L",
-    "string-remove": "Eemalda",
-    "string-gears-settings": "Gearsi seaded",
-    "string-apply": "Rakenda",
-    "string-cancel-accesskey": "T",
-    "string-cancel": "Tühista",
-    "string-html-title": "Gearsi seaded",
-    "string-allowed": "Lubatud",
-    "string-local-storage": "Kohalik salvestamine",
-    "string-nosites": "Saidid puuduvad.",
-    "string-permissions-description": "Alljärgnev tabel näitab lubasid, mille olete igale Gearsi kasutada püüdnud saidile andnud.",
-    "string-location-data": "Asukoht",
-    "string-version": "Gearsi versioon 0.4.23.0"
-  },
-  "id": {
-    "string-denied": "Ditolak",
-    "string-apply-accesskey": "A",
-    "string-remove": "Hapus",
-    "string-gears-settings": "Pengaturan Gears",
-    "string-apply": "Terapkan",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Batalkan",
-    "string-html-title": "Pengaturan Gears",
-    "string-allowed": "Diizinkan",
-    "string-local-storage": "Penyimpanan lokal",
-    "string-nosites": "Tiada situs.",
-    "string-permissions-description": "Tabel berikut menunjukkan izin yang telah Anda berikan ke setiap situs yang berusaha menggunakan Gears.",
-    "string-location-data": "Lokasi",
-    "string-version": "Versi Gears 0.4.23.0"
-  },
-  "es": {
-    "string-denied": "Denegado",
-    "string-apply-accesskey": "P",
-    "string-remove": "Quitar",
-    "string-gears-settings": "Configuración Gears",
-    "string-apply": "Aplicar",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Cancelar",
-    "string-html-title": "Configuración Gears",
-    "string-allowed": "Permitido",
-    "string-local-storage": "Almacenamiento local",
-    "string-nosites": "No hay sitios.",
-    "string-permissions-description": "La siguiente tabla muestra las autorizaciones que has concedido a cada sitio en el que has intentado usar Gears.",
-    "string-location-data": "Ubicación",
-    "string-version": "Versión Gears 0.4.23.0"
-  },
-  "en-GB": {
-    "string-denied": "Denied",
-    "string-apply-accesskey": "A",
-    "string-remove": "Remove",
-    "string-gears-settings": "Gears Settings",
-    "string-apply": "Apply",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Cancel",
-    "string-html-title": "Gears Settings",
-    "string-allowed": "Allowed",
-    "string-local-storage": "Local storage",
-    "string-nosites": "No sites.",
-    "string-permissions-description": "The table below shows the permissions you have granted to each site that has attempted to use Gears.",
-    "string-location-data": "Location",
-    "string-version": "Gears version 0.4.23.0"
-  },
-  "ru": {
-    "string-denied": "Отказано",
-    "string-apply-accesskey": "A",
-    "string-remove": "Удалить",
-    "string-gears-settings": "Настройки Gears",
-    "string-apply": "Применить",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Отмена",
-    "string-html-title": "Настройки Gears",
-    "string-allowed": "Разрешено",
-    "string-local-storage": "Локальное хранилище",
-    "string-nosites": "Нет сайтов.",
-    "string-permissions-description": "В таблице ниже перечислены разрешения, предоставленные каждому сайту, который пытался воспользоваться Gears.",
-    "string-location-data": "Местонахождение",
-    "string-version": "Gears версии 0.4.23.0"
-  },
-  "nl": {
-    "string-denied": "Geweigerd",
-    "string-apply-accesskey": "A",
-    "string-remove": "Verwijderen",
-    "string-gears-settings": "Instellingen voor Gears",
-    "string-apply": "Toepassen",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Annuleren",
-    "string-html-title": "Instellingen voor Gears",
-    "string-allowed": "Toegestaan",
-    "string-local-storage": "Lokale opslag",
-    "string-nosites": "Geen sites.",
-    "string-permissions-description": "Voor elke site die heeft geprobeerd Gears te gebruiken, worden in de tabel hieronder de machtigingen weergegeven die u aan deze site hebt verleend.",
-    "string-location-data": "Locatie",
-    "string-version": "Gears-versie 0.4.23.0"
-  },
-  "no": {
-    "string-denied": "Ikke tillatt",
-    "string-apply-accesskey": "T",
-    "string-remove": "Fjern",
-    "string-gears-settings": "Innstillinger for Gears",
-    "string-apply": "Bruk",
-    "string-cancel-accesskey": "A",
-    "string-cancel": "Avbryt",
-    "string-html-title": "Innstillinger for Gears",
-    "string-allowed": "Tillatt",
-    "string-local-storage": "Lokal lagring",
-    "string-nosites": "Ingen steder.",
-    "string-permissions-description": "Tabellen nedenfor viser tillatelsene du har gitt til hvert nettsted som har forsøkt å bruke Gears.",
-    "string-location-data": "Område",
-    "string-version": "Gears versjon 0.4.23.0"
-  },
-  "tr": {
-    "string-denied": "Reddedildi",
-    "string-apply-accesskey": "V",
-    "string-remove": "Kaldır",
-    "string-gears-settings": "Gears Ayarları",
-    "string-apply": "Uygula",
-    "string-cancel-accesskey": "a",
-    "string-cancel": "İptal",
-    "string-html-title": "Gears Ayarları",
-    "string-allowed": "İzin verildi",
-    "string-local-storage": "Yerel depolama",
-    "string-nosites": "Site yok.",
-    "string-permissions-description": "Aşağıdaki tablo Gears kullanan her site için sağladığınız izinleri gösterir.",
-    "string-location-data": "Konum",
-    "string-version": "Gears sürüm 0.4.23.0"
-  },
-  "lv": {
-    "string-denied": "Neatļauts",
-    "string-apply-accesskey": "A",
-    "string-remove": "Noņemt",
-    "string-gears-settings": "Gears iestatījumi",
-    "string-apply": "Lietot",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Atcelt",
-    "string-html-title": "Gears iestatījumi",
-    "string-allowed": "Atļauts",
-    "string-local-storage": "Vietējā atmiņa",
-    "string-nosites": "Nav vietņu.",
-    "string-permissions-description": "Tālāk minētā tabula rāda atļaujas, kuras esat piešķīris katrai vietnei, kas mēģināja lietot Gears.",
-    "string-location-data": "Atrašanās vieta",
-    "string-version": "Gears versija 0.4.23.0"
-  },
-  "lt": {
-    "string-denied": "Neleidžiama",
-    "string-apply-accesskey": "A",
-    "string-remove": "Pašalinti",
-    "string-gears-settings": "„Gears“ nuostatos",
-    "string-apply": "Taikyti",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Atšaukti",
-    "string-html-title": "„Gears“ nuostatos",
-    "string-allowed": "Leidžiama",
-    "string-local-storage": "Vietinė saugykla",
-    "string-nosites": "Nėra svetainių.",
-    "string-permissions-description": "Žemiau pateikta lentelėje rodomi leidimai, kuriuos suteikėte kiekvienai svetainei, bandžiusiai naudoti „Gears“.",
-    "string-location-data": "Vietovė",
-    "string-version": "„Gears“ versija 0.4.23.0"
-  },
-  "th": {
-    "string-denied": "ปฏิเสธ",
-    "string-apply-accesskey": "อ",
-    "string-remove": "ลบ",
-    "string-gears-settings": "การตั้งค่า Gears",
-    "string-apply": "ใช้",
-    "string-cancel-accesskey": "ย",
-    "string-cancel": "ยกเลิก",
-    "string-html-title": "การตั้งค่า Gears",
-    "string-allowed": "อนุญาต",
-    "string-local-storage": "พื้นที่เก็บข้อมูลในเครื่อง",
-    "string-nosites": "ไม่มีไซต์",
-    "string-permissions-description": "ตารางต่อไปนี้แสดงสิทธิ์ที่คุณให้แก่แต่ละไซต์ที่พยายามใช้ Gears",
-    "string-location-data": "ตำแหน่ง",
-    "string-version": "Gears เวอร์ชัน 0.4.23.0"
-  },
-  "ro": {
-    "string-denied": "Refuzat",
-    "string-apply-accesskey": "P",
-    "string-remove": "Eliminaţi",
-    "string-gears-settings": "Setări Gears",
-    "string-apply": "Aplicaţi",
-    "string-cancel-accesskey": "A",
-    "string-cancel": "Anulaţi",
-    "string-html-title": "Setări Gears",
-    "string-allowed": "Permis",
-    "string-local-storage": "Stocare locală",
-    "string-nosites": "Niciun site.",
-    "string-permissions-description": "Tabelul de mai jos afişează permisiunile pe care le-aţi acordat fiecărui site care a încercat să utilizeze Gears.",
-    "string-location-data": "Locaţie",
-    "string-version": "Versiune Gears 0.4.23.0"
-  },
-  "is": {
-    "string-denied": "Hafnað",
-    "string-apply-accesskey": "L",
-    "string-remove": "Fjarlægja",
-    "string-gears-settings": "Stillingar Gears",
-    "string-apply": "Nota",
-    "string-cancel-accesskey": "H",
-    "string-cancel": "Hætta við",
-    "string-html-title": "Stillingar Gears",
-    "string-allowed": "Leyft",
-    "string-local-storage": "Staðbundin geymsla",
-    "string-nosites": "Engin vefsvæði.",
-    "string-permissions-description": "Taflan hér fyrir neðan sýnir þær heimildir sem þú hefur veitt hverju svæði sem hefur reynt að nota Gears.",
-    "string-location-data": "Staðsetning",
-    "string-version": "Gears útgáfa 0.4.23.0"
-  },
-  "fil": {
-    "string-denied": "Tinganggihan",
-    "string-apply-accesskey": "P",
-    "string-remove": "Alisin",
-    "string-gears-settings": "Mga Setting ng Gear",
-    "string-apply": "Ilapat",
-    "string-cancel-accesskey": "I",
-    "string-cancel": "Ikansela",
-    "string-html-title": "Mga Setting ng Gear",
-    "string-allowed": "Pinahintulutan",
-    "string-local-storage": "Lokal na imbakan",
-    "string-nosites": "Walang mga site.",
-    "string-permissions-description": "Ang talahanayan sa ibaba ay nagpapakita ng mga pahintulot na naibigay mo sa bawat site na sinubukang gumamit ng Mga Gear.",
-    "string-location-data": "Lokasyon",
-    "string-version": "bersyon ng Mga Gear 0.4.23.0"
-  },
-  "ta": {
-    "string-denied": "அனுமதி மறுத்தது",
-    "string-apply-accesskey": "A",
-    "string-remove": "அகற்று",
-    "string-gears-settings": "Gears அமைப்புகள்",
-    "string-apply": "பயன்படுத்து",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "ரத்துசெய்",
-    "string-html-title": "Gears அமைப்புகள்",
-    "string-allowed": "அனுமதிக்கப்பட்டது",
-    "string-local-storage": "உள்ளக சேமிப்பிடம்",
-    "string-nosites": "தளங்கள் இல்லை.",
-    "string-permissions-description": "கீழே உள்ள அட்டவணை Gears ஐப் பயன்படுத்த ஒவ்வொரு தளங்களுக்கும் நீங்கள் அளித்த அனுமதிகளை காட்டுகிறது.",
-    "string-location-data": "இருப்பிடம்",
-    "string-version": "Gears பதிப்பு 0.4.23.0"
-  },
-  "fr": {
-    "string-denied": "Refusé",
-    "string-apply-accesskey": "A",
-    "string-remove": "Supprimer",
-    "string-gears-settings": "Paramètres de Google Gears",
-    "string-apply": "Appliquer",
-    "string-cancel-accesskey": "U",
-    "string-cancel": "Annuler",
-    "string-html-title": "Paramètres de Google Gears",
-    "string-allowed": "Autorisé",
-    "string-local-storage": "Stockage local",
-    "string-nosites": "Aucun site.",
-    "string-permissions-description": "Le tableau ci-dessous montre les autorisations que vous avez accordées à chaque site ayant tenté d'utiliser Google Gears.",
-    "string-location-data": "Emplacement",
-    "string-version": "Version 0.4.23.0 de Google Gears"
-  },
-  "bg": {
-    "string-denied": "Отказан",
-    "string-apply-accesskey": "A",
-    "string-remove": "Премахване",
-    "string-gears-settings": "Настройки на Gears",
-    "string-apply": "Прилагане",
-    "string-cancel-accesskey": "С",
-    "string-cancel": "Отказ",
-    "string-html-title": "Настройки на Gears",
-    "string-allowed": "Разрешен",
-    "string-local-storage": "Локално хранилище",
-    "string-nosites": "Няма сайтове.",
-    "string-permissions-description": "В таблицата по-долу са показани дадените от вас разрешения на всеки сайт, който се е опитал да използва Gears.",
-    "string-location-data": "Местоположение",
-    "string-version": "Версия 0.4.23.0 на Gears"
-  },
-  "uk": {
-    "string-denied": "Відхилено",
-    "string-apply-accesskey": "A",
-    "string-remove": "Видалити",
-    "string-gears-settings": "Налаштування Gears",
-    "string-apply": "Застосувати",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Скасувати",
-    "string-html-title": "Налаштування Gears",
-    "string-allowed": "Дозволено",
-    "string-local-storage": "Збереження на локальному диску",
-    "string-nosites": "Сайти відсутні.",
-    "string-permissions-description": "У нижченаведеній таблиці наведено дозволи, надані кожному сайту, який намагається використовувати Gears.",
-    "string-location-data": "Розташування",
-    "string-version": "Gears версії 0.4.23.0"
-  },
-  "hr": {
-    "string-denied": "Odbijeno",
-    "string-apply-accesskey": "A",
-    "string-remove": "Ukloni",
-    "string-gears-settings": "Postavke Gearsa",
-    "string-apply": "Primijeni",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Odustani",
-    "string-html-title": "Postavke Gearsa",
-    "string-allowed": "Dopušteno",
-    "string-local-storage": "Lokalna pohrana",
-    "string-nosites": "Nema web-lokacija.",
-    "string-permissions-description": "U dolje navedenoj tablici navedene su dozvole koje ste dali svakoj web-lokaciji koja je pokušala koristiti Gears.",
-    "string-location-data": "Lokacija",
-    "string-version": "Verzija Gearsa 0.4.23.0"
-  },
-  "bn": {
-    "string-denied": "অস্বীকৃত",
-    "string-apply-accesskey": "A",
-    "string-remove": "সরান",
-    "string-gears-settings": "Gears সেটিংস",
-    "string-apply": "প্রয়োগ",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "বাতিল",
-    "string-html-title": "Gears সেটিংস",
-    "string-allowed": "অনুমতিপ্রাপ্ত",
-    "string-local-storage": "স্থানিয় স্টোরেজ",
-    "string-nosites": "কোন সাইটগুলি ׀",
-    "string-permissions-description": "নিচের সারণিটির অনুসারে আপনি প্রত্যেকটি সাইটটিকে অনুমতি দিয়েছেন যা Gears ব্যবহার করতে চেয়েছে ׀",
-    "string-location-data": "অবস্থান",
-    "string-version": "Gears সংস্করণ 0.4.23.0"
-  },
-  "en-US": {
-    "string-denied": "Denied",
-    "string-apply-accesskey": "A",
-    "string-remove": "Remove",
-    "string-gears-settings": "Gears Settings",
-    "string-apply": "Apply",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Cancel",
-    "string-html-title": "Gears Settings",
-    "string-allowed": "Allowed",
-    "string-local-storage": "Local storage",
-    "string-nosites": "No sites.",
-    "string-permissions-description": "The table below shows the permissions you have granted to each site that has attempted to use Gears.",
-    "string-location-data": "Location",
-    "string-version": "Gears version 0.4.23.0"
-  },
-  "da": {
-    "string-denied": "Afvist",
-    "string-apply-accesskey": "I",
-    "string-remove": "Fjern",
-    "string-gears-settings": "Indstillinger til Gears",
-    "string-apply": "Anvend",
-    "string-cancel-accesskey": "A",
-    "string-cancel": "Annuller",
-    "string-html-title": "Indstillinger til Gears",
-    "string-allowed": "Tilladt",
-    "string-local-storage": "Lokalt lager",
-    "string-nosites": "Ingen websteder.",
-    "string-permissions-description": "Nedenstående tabel indeholder en oversigt over de tilladelser, du har givet til de websteder, der har forsøgt at få adgang til at bruge Gears.",
-    "string-location-data": "Placering",
-    "string-version": "Gears-version PRODUKT_VERSION"
-  },
-  "fa": {
-    "string-denied": "مردود",
-    "string-apply-accesskey": "مجاز",
-    "string-remove": "حذف",
-    "string-gears-settings": "تنظیمات Gears",
-    "string-apply": "اعمال",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "لغو",
-    "string-html-title": "تنظیمات Gears",
-    "string-allowed": "مجاز",
-    "string-local-storage": "مکان ذخیره",
-    "string-nosites": "سایتی وجود ندارد.",
-    "string-permissions-description": "جدول زیر مجوزهای شما برای دستیابی به سایتهایی که از Gears استفاده می کند را نشان می دهد.",
-    "string-location-data": "موقعیت",
-    "string-version": "Gears نسخه 0.4.23.0"
-  },
-  "hi": {
-    "string-denied": "अस्वीकृत",
-    "string-apply-accesskey": "अनुमति दें",
-    "string-remove": "निकालें",
-    "string-gears-settings": "Gears सेटिंग्स",
-    "string-apply": "लागू करें",
-    "string-cancel-accesskey": "रद्द करें",
-    "string-cancel": "रद्द करें",
-    "string-html-title": "Gears सेटिंग्स",
-    "string-allowed": "स्वीकार्य",
-    "string-local-storage": "स्थानीय संग्रहण",
-    "string-nosites": "कोई साइट नहीं.",
-    "string-permissions-description": "नीचे दी गई टेबल वे अनुमतियाँ दिखाती है जो आपने उन साइटों को दी है जिन्होंने Gears का उपयोग करने का प्रयास किया है.",
-    "string-location-data": "स्थिति",
-    "string-version": "Gears संस्करण 0.4.23.0"
-  },
-  "pt-BR": {
-    "string-denied": "Negado",
-    "string-apply-accesskey": "P",
-    "string-remove": "Remover",
-    "string-gears-settings": "Configurações do Gears",
-    "string-apply": "Aplicar",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Cancelar",
-    "string-html-title": "Configurações do Gears",
-    "string-allowed": "Permitido",
-    "string-local-storage": "Armazenamento local",
-    "string-nosites": "Nenhum site.",
-    "string-permissions-description": "A tabela abaixo mostra as permissões concedidas por você a cada site que tentou usar o Gears.",
-    "string-location-data": "Local",
-    "string-version": "Gears versão 0.4.23.0"
-  },
-  "fi": {
-    "string-denied": "Estetty",
-    "string-apply-accesskey": "A",
-    "string-remove": "Poista",
-    "string-gears-settings": "Gearsin asetukset",
-    "string-apply": "Ota käyttöön",
-    "string-cancel-accesskey": "P",
-    "string-cancel": "Peruuta",
-    "string-html-title": "Gearsin asetukset",
-    "string-allowed": "Sallittu",
-    "string-local-storage": "Paikallinen tallennus",
-    "string-nosites": "Ei sivustoja.",
-    "string-permissions-description": "Oheisesta taulukosta näet luvat, jotka olet myöntänyt jokaiselle sivustolle, joka on yrittänyt käyttää Gearsia.",
-    "string-location-data": "Sijainti",
-    "string-version": "Gearsin versio 0.4.23.0"
-  },
-  "hu": {
-    "string-denied": "Megtagadva",
-    "string-apply-accesskey": "E",
-    "string-remove": "Eltávolítás",
-    "string-gears-settings": "A Szinkron beállításai",
-    "string-apply": "OK",
-    "string-cancel-accesskey": "M",
-    "string-cancel": "Mégse",
-    "string-html-title": "A Szinkron beállításai",
-    "string-allowed": "Engedélyezve",
-    "string-local-storage": "Helyi tárolás",
-    "string-nosites": "Nincsenek webhelyek.",
-    "string-permissions-description": "Az alábbi táblázat azt mutatja, hogy a Szinkron használatát megkísérlő webhelyeknek milyen engedélyeket adott.",
-    "string-location-data": "Hely",
-    "string-version": "A Szinkron verziószáma: 0.4.23.0"
-  },
-  "ja": {
-    "string-denied": "拒否",
-    "string-apply-accesskey": "A",
-    "string-remove": "削除",
-    "string-gears-settings": "Gears の設定",
-    "string-apply": "適用",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "キャンセル",
-    "string-html-title": "Gears の設定",
-    "string-allowed": "許可",
-    "string-local-storage": "ローカル保存",
-    "string-nosites": "サイトがありません。",
-    "string-permissions-description": "下記の表は、Gears を使用しようとした各サイトに与えた権限を示しています。",
-    "string-location-data": "場所",
-    "string-version": "Gears バージョン 0.4.23.0"
-  },
-  "he": {
-    "string-denied": "נדחה",
-    "string-apply-accesskey": "א",
-    "string-remove": "הסר",
-    "string-gears-settings": "הגדרות Gears",
-    "string-apply": "החל",
-    "string-cancel-accesskey": "ביטול",
-    "string-cancel": "ביטול",
-    "string-html-title": "הגדרות Gears",
-    "string-allowed": "מותר",
-    "string-local-storage": "אחסון מקומי",
-    "string-nosites": "ללא אתרים.",
-    "string-permissions-description": "הטבלה שלהלן מראה את ההרשאות שהענקת לכל אתר שניסה להשתמש ב-Gears.",
-    "string-location-data": "מיקום",
-    "string-version": "Gears בגרסה 0.4.23.0"
-  },
-  "te": {
-    "string-denied": "అనుమతి లేని",
-    "string-apply-accesskey": "A",
-    "string-remove": "తొలగించు",
-    "string-gears-settings": "Gears సెట్టింగులు",
-    "string-apply": "వర్తించు",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "రద్దు చెయ్యి",
-    "string-html-title": "Gears సెట్టింగులు",
-    "string-allowed": "అనుమతించబడిన",
-    "string-local-storage": "స్థానిక నిల్వ",
-    "string-nosites": "సైట్లు లేవు.",
-    "string-permissions-description": "ఈ క్రింది పట్టిక, మీరు ఏ సైట్లకి Gears ఉపయోగించడానికి అనుమతి ఇచ్చారో, చూపిస్తుంది.",
-    "string-location-data": "స్థానం",
-    "string-version": "0.4.23.0 Gears వర్షన్"
-  },
-  "pt-PT": {
-    "string-denied": "Negado",
-    "string-apply-accesskey": "P",
-    "string-remove": "Remover",
-    "string-gears-settings": "Definições do Gears",
-    "string-apply": "Aplicar",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Cancelar",
-    "string-html-title": "Definições do Gears",
-    "string-allowed": "Permitido",
-    "string-local-storage": "Armazenamento local",
-    "string-nosites": "Não existem sites.",
-    "string-permissions-description": "A tabela abaixo mostra as autorizações que concedeu a cada site que tentou utilizar o Gears.",
-    "string-location-data": "Localização",
-    "string-version": "Versão 0.4.23.0 do Gears"
-  },
-  "sr": {
-    "string-denied": "Забрањен приступ",
-    "string-apply-accesskey": "M",
-    "string-remove": "Уклони",
-    "string-gears-settings": "Gears подешавања",
-    "string-apply": "Примени",
-    "string-cancel-accesskey": "О",
-    "string-cancel": "Откажи",
-    "string-html-title": "Gears подешавања",
-    "string-allowed": "Дозвољен приступ",
-    "string-local-storage": "Локални простор за складиштење",
-    "string-nosites": "Ниједан сајт.",
-    "string-permissions-description": "Табела испод приказује дозволе које сте одобрили сваком сајту који је покушао да користи Gears.",
-    "string-location-data": "Локација",
-    "string-version": "Gears верзија 0.4.23.0"
-  },
-  "ko": {
-    "string-denied": "거부됨",
-    "string-apply-accesskey": "A",
-    "string-remove": "삭제",
-    "string-gears-settings": "Gears 설정",
-    "string-apply": "적용",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "취소",
-    "string-html-title": "Gears 설정",
-    "string-allowed": "허용",
-    "string-local-storage": "로컬 저장소",
-    "string-nosites": "사이트가 없습니다.",
-    "string-permissions-description": "다음 표는 Gears를 사용하려 시도했던 각 사이트에 대해 승인받은 사용권한을 보여줍니다.",
-    "string-location-data": "위치",
-    "string-version": "Gears 버전 0.4.23.0"
-  },
-  "sv": {
-    "string-denied": "Nekad",
-    "string-apply-accesskey": "T",
-    "string-remove": "Ta bort",
-    "string-gears-settings": "Inställningar i Gears",
-    "string-apply": "Tillämpa",
-    "string-cancel-accesskey": "A",
-    "string-cancel": "Avbryt",
-    "string-html-title": "Inställningar i Gears",
-    "string-allowed": "Tillåten",
-    "string-local-storage": "Lokal lagring",
-    "string-nosites": "Inga webbplatser",
-    "string-permissions-description": "Tabellen nedan visar beviljade tillstånd för varje webbplats som har försökt att använda Gears.",
-    "string-location-data": "Plats",
-    "string-version": "Gears version 0.4.23.0"
-  },
-  "ur": {
-    "string-denied": "مسترد",
-    "string-apply-accesskey": "A",
-    "string-remove": "حذف کریں",
-    "string-gears-settings": "گیئرز کی ترتیبات",
-    "string-apply": "اطلاق کریں",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "منسوخ",
-    "string-html-title": "گیئرز کی ترتیبات",
-    "string-allowed": "اجازت ہے",
-    "string-local-storage": "ذخیرہ کرنے کی مقامی جگہ",
-    "string-nosites": "کوئی سائٹ نہیں۔",
-    "string-permissions-description": "ذیل کا جدول ان اجازتوں کو دکھاتا ہے جو آپ نے ان سائٹوں کیلئے دی ہیں جنہوں نے گیئرز کے استعمال کی کوشش کی تھی۔",
-    "string-location-data": "جائے وقوع",
-    "string-version": "گیئرز ورژن0.4.23.0"
-  },
-  "sk": {
-    "string-denied": "Odmietnuté",
-    "string-apply-accesskey": "P",
-    "string-remove": "Odstrániť",
-    "string-gears-settings": "Nastavenia rozšírenia Gears",
-    "string-apply": "Použiť",
-    "string-cancel-accesskey": "R",
-    "string-cancel": "Zrušiť",
-    "string-html-title": "Nastavenia rozšírenia Gears",
-    "string-allowed": "Povolené",
-    "string-local-storage": "Lokálny ukladací priestor",
-    "string-nosites": "Žiadne lokality.",
-    "string-permissions-description": "V nižšie uvedenej tabuľke sú uvedené povolenia, ktoré máte udelené pre všetky lokality, ktoré sa pokúsili použiť rozšírenie Gears.",
-    "string-location-data": "Umiestnenie",
-    "string-version": "Gears, verzia 0.4.23.0"
-  },
-  "zh-CN": {
-    "string-denied": "已拒绝",
-    "string-apply-accesskey": "A",
-    "string-remove": "删除",
-    "string-gears-settings": "Gears 设置",
-    "string-apply": "应用",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "取消",
-    "string-html-title": "Gears 设置",
-    "string-allowed": "允许",
-    "string-local-storage": "本地存储",
-    "string-nosites": "没有网站。",
-    "string-permissions-description": "下表显示了您向试图使用 Gears 的每个网站授予了哪些权限。",
-    "string-location-data": "位置",
-    "string-version": "Gears 版本 0.4.23.0"
-  },
-  "de": {
-    "string-denied": "Verweigert",
-    "string-apply-accesskey": "Z",
-    "string-remove": "Entfernen",
-    "string-gears-settings": "Gears-Einstellungen",
-    "string-apply": "Anwenden",
-    "string-cancel-accesskey": "A",
-    "string-cancel": "Abbrechen",
-    "string-html-title": "Gears-Einstellungen",
-    "string-allowed": "Zulässig",
-    "string-local-storage": "Lokaler Speicherplatz",
-    "string-nosites": "Keine Sites.",
-    "string-permissions-description": "Die untenstehende Tabelle zeigt die Berechtigungen an, die Sie jeder Site gewährt haben, die versucht hat, Gears zu verwenden.",
-    "string-location-data": "Speicherort",
-    "string-version": "Gears-Version PRODUKT_VERSION"
-  },
-  "pl": {
-    "string-denied": "Zabroniono",
-    "string-apply-accesskey": "Z",
-    "string-remove": "Usuń",
-    "string-gears-settings": "Ustawienia wtyczki Gears",
-    "string-apply": "Zastosuj",
-    "string-cancel-accesskey": "A",
-    "string-cancel": "Anuluj",
-    "string-html-title": "Ustawienia wtyczki Gears",
-    "string-allowed": "Zezwolono",
-    "string-local-storage": "Przechowywanie danych lokalnie",
-    "string-nosites": "Brak witryn.",
-    "string-permissions-description": "Poniższa tabela zawiera uprawnienia, jakie przyznano każdej z witryn próbujących użyć wtyczki Gears.",
-    "string-location-data": "Lokalizacja",
-    "string-version": "Gears 0.4.23.0"
-  },
-  "ms": {
-    "string-denied": "Ditolak",
-    "string-apply-accesskey": "N",
-    "string-remove": "Keluarkan",
-    "string-gears-settings": "Tetapan Gear",
-    "string-apply": "Gunakan",
-    "string-cancel-accesskey": "B",
-    "string-cancel": "Batal",
-    "string-html-title": "Tetapan Gear",
-    "string-allowed": "Dibenarkan",
-    "string-local-storage": "Penyimpanan setempat",
-    "string-nosites": "Tiada tapak.",
-    "string-permissions-description": "Jadual di bawah menunjukkan kebenaran yang telah anda berikan kepada setiap tapak yang telah cuba menggunakan Gear.",
-    "string-location-data": "Lokasi",
-    "string-version": "Versi Gear 0.4.23.0"
-  },
-  "sl": {
-    "string-denied": "Zavrnjeno",
-    "string-apply-accesskey": "A",
-    "string-remove": "Odstrani",
-    "string-gears-settings": "Nastavitve programa Gears",
-    "string-apply": "Uporabi",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Prekliči",
-    "string-html-title": "Nastavitve programa Gears",
-    "string-allowed": "Dovoljeno",
-    "string-local-storage": "Lokalna shramba",
-    "string-nosites": "Ni spletnih mest.",
-    "string-permissions-description": "V spodnji tabeli so prikazana dovoljenja, ki ste jih podelili vsem spletnim mestom, ki so poskusila uporabljati program Gears.",
-    "string-location-data": "Lokacija",
-    "string-version": "Različica programa Gears 0.4.23.0"
-  },
-  "mr": {
-    "string-denied": "अननुमत",
-    "string-apply-accesskey": "A",
-    "string-remove": "काढा",
-    "string-gears-settings": "Gears सेटिंग्ज",
-    "string-apply": "लागू करा",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "रद्द करा",
-    "string-html-title": "Gears सेटिंग्ज",
-    "string-allowed": "अनुमत",
-    "string-local-storage": "स्थानिक संचय",
-    "string-nosites": "साइट नाहीत.",
-    "string-permissions-description": "निम्न सारणी Gears वापरण्याचा प्रयत्न केलेल्या प्रत्येक साइटकरिता आपल्याकडे किती परवानग्या आहेत हे दर्शविते.",
-    "string-location-data": "स्थान",
-    "string-version": "Gears आवृत्ती 0.4.23.0"
-  },
-  "or": {
-    "string-denied": "ମନାକରନ୍ତୁ",
-    "string-apply-accesskey": "A",
-    "string-remove": "ଅପସାରଣ",
-    "string-gears-settings": "Gears ସେଟିଂସମୂହ",
-    "string-apply": "ଲାଗୁ କରନ୍ତୁ",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "ବାତିଲ୍",
-    "string-html-title": "Gears ସେଟିଂସମୂହ",
-    "string-allowed": "ଅନୁମତି ପ୍ରାପ୍ତ କରନ୍ତୁ",
-    "string-local-storage": "ସ୍ଥାନୀୟ ସଂଞ୍ଚୟ",
-    "string-nosites": "କୌଣସି ସାଇଟମାନ ନାହିଁ |",
-    "string-permissions-description": "ନିମ୍ନ ସାରଣୀ ଆପଣ ପ୍ରତ୍ୟେକ ସାଇଟକୁ ପ୍ରଦାନ କରିଥିବା ସ୍ବୀକୃତି ଦର୍ଶାଉଛି,ଯାହା Gears ବ୍ୟବହାର କରିବାକୁ ପଦକ୍ଷେପ ନେଇଛି |",
-    "string-location-data": "ସ୍ଥାନ",
-    "string-version": "Gears ସଂସ୍କରଣ 0.4.23.0"
-  }
-};
-
-// Insert all localized strings for the specified locale into the div or span
-// matching the id.
-function loadI18nStrings(locale) {
-  var rtl_languages = ['he', 'ar', 'fa', 'ur'];
-
-  if (!locale) {
-    locale = 'en-US';
-  } else {
-    if (!localized_strings[locale]) {
-      // For xx-YY locales, determine what the base locale is.
-      var base_locale = locale.split('-')[0];
-
-      if (localized_strings[base_locale]) {
-        locale = base_locale;
-      } else {
-        locale = 'en-US';
-      }
-    }
-  }
-
-  var strings = localized_strings[locale];
-
-  // If the specified locale is an right to left language, change the direction
-  // of the page.
-  for (index in rtl_languages) {
-    if (locale == rtl_languages[index]) {
-      document.body.dir = "rtl";
-      break;
-    }
-  }
-
-  // Copy each string to the proper UI element, if it exists.
-  for (name in strings) {
-    if (name == 'string-html-title') {
-      if (!browser.ie_mobile) {
-        // IE Mobile dialogs don't have a title bar.
-        // Furthermore, document.title is undefined in IE Mobile on WinMo 5.
-        // It's also impossible to add properties to the window object.
-        // (see http://code.google.com/apis/gears/mobile.html)
-        document.title = strings[name];
-      }
-    } else {
-      var element = dom.getElementById(name);
-      if (element) {
-        element.innerHTML = strings[name];
-      }
-    }
-  }
-}
-
-
-</script>
-<script>
-  var debug = false;
-  var permissions;
-  var originalPermissions;
-
-  // Must match values in permission_db.h
-  var PERMISSION_NOT_SET = 0;
-  var PERMISSION_ALLOWED = 1;
-  var PERMISSION_DENIED  = 2;
-
-  if (debug && browser.ie_mobile) {
-    // Handy for debugging layout.
-    // Remember to remove the pie_dialog object tag above when debugging on
-    // WinMo 5, otherwise the assignement below will fail with "the object does
-    // not support this property or method".
-    pie_dialog = new Object();
-    pie_dialog.IsSmartPhone = function() { return false; };
-    pie_dialog.SetCancelButton = function() {};
-    pie_dialog.SetButton = function() {};
-    pie_dialog.SetButtonEnabled = function() {};
-    pie_dialog.SetScriptContext = function() {};
-    pie_dialog.ResizeDialog = function() {};
-  }
-
-  initDialog();
-
-  initSettings();
-
-  setButtonLabel("string-cancel", "cancel-button", "string-cancel-accesskey");
-  setButtonLabel("string-apply", "confirm-button", "string-apply-accesskey");
-
-  if (!browser.ie_mobile) {
-    CustomButton.initializeAll();
-    if (!browser.android) {
-      initCustomLayout(layoutSettings);
-    }
-  } else {
-    var applyText = dom.getElementById("string-apply");
-    if (applyText) {
-      window.pie_dialog.SetButton(applyText.innerText, 
-        "saveAndClose(calculateDiff());");
-    }
-    var cancelText = dom.getElementById("string-cancel");
-    if (cancelText) {
-      window.pie_dialog.SetCancelButton(cancelText.innerText);
-    }
-    window.pie_dialog.SetButtonEnabled(true);
-  }
-
-  // Start out with only cancel enabled, just for clarity.
-  disableButton(dom.getElementById("confirm-button"));
-
-  function initSettings() {
-    var args;
-
-    if (debug) {
-      // Handy for debugging layout:
-      var args = {
-        locale: "en-US",
-        permissions: [
-          {
-            name: "http://www.google.com",
-            localStorage: { permissionState: 1 },
-            locationData: { permissionState: 0 }
-          },
-          { 
-            name: "http://www.aaronboodman.com",
-            localStorage: { permissionState: 1 },
-            locationData: { permissionState: 1 }
-          },
-          { 
-            name: "http://www.evil.org",
-            localStorage: { permissionState: 2 },
-            locationData: { permissionState: 2 }
-          }
-        ]
-      };
-    } else {
-      args = getArguments();
-    }
-    loadI18nStrings(args.locale);
-    permissions = args.permissions;
-    originalPermissions = cloneObject(permissions);
-
-    updatePermissionsList();
-  }
-
-  function updatePermissionsList() {
-    var table = dom.getElementById('div-permissions');
-
-    var content = "";
-    var isFirstOrigin = true;
-    for (var index = 0; index < permissions.length; index++) {
-      content += renderOrigin(index, permissions[index], isFirstOrigin);
-      isFirstOrigin = false;
-    }
-    if (content == "") {
-      content = "<table style=\"border-style: solid;\"><tbody>";
-      content += "<tr><td class=\"left\"><em>";
-      var noSitesText = dom.getElementById("string-nosites");
-      if (noSitesText) {
-        if (isDefined(typeof noSitesText.innerText)) {
-          content += noSitesText.innerText;
-        } else {
-          content += noSitesText.textContent;
-        }
-      }
-      content += "</em></td><td></td></tr></tbody></table>";
-    } 
-    table.innerHTML = content;
-  }
-
-  function renderOrigin(index, originData, isFirstOrigin) {
-    var localStorageContent =
-        renderLocalStorage(index, originData.localStorage);
-    var locationDataContent =
-        renderLocationData(index, originData.locationData);
-
-    // Defend against an origin having no data for any permission class.
-    if (localStorageContent == "" && locationDataContent == "") {
-      return "";
-    }
-    var content = "<table";
-    if (isFirstOrigin) {
-      content += " style=\"border-top-style: solid;\"";
-    }
-    content += "><tbody>";
-    content += "<tr><td class=\"origin-name\">";
-    content += wrapDomain(originData.name);
-    content += "</td><td><a href='#' onclick='handleRemoveClick(";
-    content += index;
-    content += ");'>";
-    content += getString("string-remove");
-    content += "</a></td>";
-    content += "</td></tr></tbody></table>";
-
-    content += "<table class=\"permissions\"><tbody>";
-    if (localStorageContent != "") {
-      content += "<tr>";
-      content += localStorageContent;
-      content += "</tr>";
-    }
-    if (locationDataContent != "") {
-      content += "<tr>";
-      content += locationDataContent;
-      content += "</tr>";
-    }
-    content += "</td></tr></tbody></table>";
-    return content;
-  }
-
-  function renderLocalStorage(index, data) {
-    if (data == null || data.permissionState == PERMISSION_NOT_SET) {
-      return "";
-    }
-    var content = "";
-    content += "<td class=\"left\">";
-    content += getString("string-local-storage");
-    content += "</td><td class=\"right\">";
-    content += renderRadioButtons(index, "localStorage",
-                                  data.permissionState);
-    content += "</td>";
-    // Permission class-specific content goes here;
-    return content;
-  }
-
-  function renderLocationData(index, data) {
-    if (data == null || data.permissionState == PERMISSION_NOT_SET) {
-      return "";
-    }
-    var content = "";
-    content += "<td class=\"left\">";
-    content += getString("string-location-data");
-    content += "</td><td class=\"right\">";
-    content += renderRadioButtons(index, "locationData",
-                                  data.permissionState);
-    content += "</td>";
-    // Permission class-specific content goes here;
-    return content;
-  }
-
-  function getString(stringId) {
-    var textElement = dom.getElementById(stringId);
-    if (!isDefined(typeof textElement)) {
-      return "";
-    }
-    return dom.getTextContent(textElement);
-  }
-
-  function renderRadioButtons(index, permissionClass, permissionState) {
-    var radioButtonName = getRadioButtonName(index, permissionClass);
-    var content = "<div class=\"radio-buttons\">";
-    content += "<input type=\"radio\" name=\"" + radioButtonName + "\"";
-    content += " id=\"" + radioButtonName + "-allow\"";
-
-    if (permissionState == PERMISSION_ALLOWED) {
-      content += "checked=\"true\"";
-    }
-    content += " onclick='handleRadioClick(" + index + ", \"" +
-               permissionClass + "\", " + PERMISSION_ALLOWED + ");'>";
-    content += "</input>";
-    content += "<label for=\"" + radioButtonName + "-allow\">";
-    content += getString("string-allowed");
-    content += "</label>";
-
-    content += "<input type=\"radio\" name=\"" + radioButtonName + "\"";
-    content += " id=\"" + radioButtonName + "-deny\"";
-
-    if (permissionState == PERMISSION_DENIED) {
-      content += "checked=\"true\"";
-    }
-    content += " onclick='handleRadioClick(" + index + ", \"" +
-               permissionClass + "\", " + PERMISSION_DENIED + ");'>";
-    content += "</input>";
-    content += "<label for=\"" + radioButtonName + "-deny\">";
-    content += getString("string-denied");
-    content += "</label>";
-    content += "</div>";
-    return content;
-  }
-
-  function getRadioButtonName(index, permissionClass) {
-    return index + "-" + permissionClass + "-radio";
-  }
-
-  function handleRadioClick(index, permissionClass, permissionState) {
-    updatePermission(index, permissionClass, permissionState);
-
-    // Return false to prevent the default link action (scrolling up to top of
-    // page in this case).
-    return false;
-  }
-
-  function handleRemoveClick(index) {
-    updatePermission(index, "localStorage", PERMISSION_NOT_SET);
-    updatePermission(index, "locationData", PERMISSION_NOT_SET);
-    updatePermissionsList();
-
-    // Return false to prevent the default link action (scrolling up to top of
-    // page in this case).
-    return false;
-  }
-
-  function updatePermission(index, permissionClass, permissionState) {
-    if (permissions[index][permissionClass]) {
-      if (permissions[index][permissionClass].permissionState !=
-          permissionState) {
-        permissions[index][permissionClass].permissionState =
-          permissionState;
-        enableButton(dom.getElementById("confirm-button"));
-      }
-    }
-  }
-
-  function layoutSettings(contentHeight) {
-    var content = dom.getElementById("content");
-
-    content.style.height = Math.max(contentHeight, 0) + "px";
-
-    // If a scrollbar is going to be visible, then add some padding between it
-    // and the inner right edge of the content. We don't want to have this in
-    // all the time or else there will be double-padding when the scrollbar
-    // isn't visible.
-    if (content.scrollHeight > contentHeight) {
-      content.style.paddingRight = "1em";
-    } else {
-      content.style.paddingRight = "";
-    }
-  }
-
-  function calculateDiff() {
-    var permissionClasses = ["localStorage", "locationData"];
-    var result = { "modifiedOrigins": [] };
-    for (var index = 0; index < originalPermissions.length; index++) {
-      var originalOriginData = originalPermissions[index];
-      var originData = permissions[index];
-      // Defend against a mis-match between the origins in each list.
-      if (isDefined(typeof originData) && 
-          originData.name == originalOriginData.name) {
-        var modifiedOriginData = new Object();
-        var modified = false;
-        for (var i = 0; i < permissionClasses.length; i++) {
-          var permissionClass = permissionClasses[i];
-          // The data may not include entries for all permission classes.
-          if (isDefined(typeof originalOriginData[permissionClass])) {
-            var originalState =
-                originalOriginData[permissionClass]["permissionState"];
-            var state = originData[permissionClass]["permissionState"];
-            if (originalState != state) {
-              modified = true;
-              modifiedOriginData[permissionClass] = new Object();
-              modifiedOriginData[permissionClass]["permissionState"] = state;
-            }
-          }
-        }
-        if (modified) {
-          modifiedOriginData.name = originData.name;
-          result.modifiedOrigins.push(modifiedOriginData);
-        }
-      }
-    }
-    return result;
-  }
-
-</script>
-</html>
diff --git a/assets/plugins/gears-0.4.23.0/shortcuts_dialog.html b/assets/plugins/gears-0.4.23.0/shortcuts_dialog.html
deleted file mode 100644 (file)
index fc68120..0000000
+++ /dev/null
@@ -1,2907 +0,0 @@
-<!DOCTYPE html>
-
-<!--
-Copyright 2007, The Android Open Source Project
-
-Redistribution and use in source and binary forms, with or without 
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice, 
-    this list of conditions and the following disclaimer.
- 2. 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.
- 3. Neither the name of Google Inc. nor the names of its contributors may be
-    used to endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
--->
-
-<html>
-<head>
-  <style type="text/css">
-
-
-/*
-Copyright 2007, The Android Open Source Project
-
-Redistribution and use in source and binary forms, with or without 
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice, 
-    this list of conditions and the following disclaimer.
- 2. 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.
- 3. Neither the name of Google Inc. nor the names of its contributors may be
-    used to endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-*/
-
-body, html {
-  background-color:white;
-  padding:0;
-  margin:0;
-  height:100%;
-  overflow:hidden;
-  cursor:default;
-
-  /* 
-    Makes the text unselectable in mozilla. See html_diaog.js for IE
-    implementation.
-  */
-  -moz-user-select:none;
-}
-
-body, td, input, select, button {
-  font-family:arial,sans-serif;
-  font-size:13px;
-}
-
-p {
-  margin:0;
-  margin-bottom:1em;
-}
-
-a {
-  color:blue;
-  text-decoration:underline;
-}
-
-button {
-  /*
-  It would be better to express margins in ems, but it causes layout
-  artifacts (presumably because of rounding errors) when combined with
-  the -moz-border-radius property used in button.css on Firefox 2.
-
-  Also: bizarely, if I try to use the more natural margin-left:10px, I get
-  a bug where the buttons bounce on IE when you hover over them.
-  */
-  position:relative;
-  margin-right:7px;
-  left:7px;
-}
-
-#head {
-  padding:1em;
-}
-
-#foot {
-
-  /*
-  On Android we do not use position:absolute due to some
-  rendering limitations (absolute positioning works, but
-  the automatic resizing of dialog is confused by the
-  variable content and the display is wrong, while if we
-  remove the absolute positioning, #foot is back in the
-  flow and the dialog displays correctly)
-  */
-
-  background:white;
-  bottom:0;
-  width:100%;
-}
-
-#button-row {
-  margin:1em;
-}
-
-.accesskey {
-  text-decoration: underline;
-
-  /* IE CSS extension */
-  accelerator: true;
-}
-
-    #icon {
-      margin-right:0.5em;
-    }
-
-    #content {
-      margin:0 1em;
-      padding-bottom:1em;
-    }
-
-    #scroll td {
-      padding-top:0;
-    }
-
-    #scroll img {
-      margin-right:1em;
-    }
-
-    #highlightbox {
-      /* for pseudo-rounded corners, also see highlightbox-inner */
-      margin:0 1px;
-      border:solid #e8e8e8;
-      border-width:1px 0;
-      background:#f8f8f8;
-    }
-
-    #highlightbox-inner {
-      margin:0 -1px;
-      border:solid #e8e8e8;
-      border-width:0 1px;
-      padding:1em;
-    }
-    
-    #shortcut-name {
-      margin-bottom:2px;
-      font-weight: bold;
-    }
-
-    #shortcut-description {
-      /* We turn this on only when there is a description */
-      display:none;
-    }
-
-    #locations {
-      margin-top:1.2em;
-      display:none;
-    }
-    
-    #locations table {
-      margin-top:-2px;
-      margin-left:0.45em;
-    }
-
-  </style>
-</head>
-<body>
-  <!-- This div contains strings that are conditionally used in the UI -->
-  <div id="strings" style="display:none;">
-    <!-- window titles -->
-    <div id="string-title-default"></div>
-    <div id="string-title-simple"></div>
-    
-    <!-- headers -->
-    <div id="string-header-desktop"></div>
-    <div id="string-header-wince"></div>
-
-    <!-- buttons -->
-    <div id="string-ok"></div>
-    <div id="string-ok-accesskey"></div>
-    <div id="string-cancel"></div>
-    <div id="string-cancel-accesskey"></div>
-    <div id="string-yes"></div>
-    <div id="string-yes-accesskey"></div>
-    <div id="string-no"></div>
-    <div id="string-no-accesskey"></div>
-    <div id="string-never-allow"></div>
-    <div id="string-never-allow-wince"></div>
-  </div>
-
-  <div id="head">
-    <table width="100%" cellpadding="0" cellspacing="0" border="0">
-      <tr>
-        <td valign="top">
-
-          <img id="icon" src="data:image/png;base64,
-iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAJPElEQVR4Xq3V
-WWyc1d0G8Oecd515Z/csHsfxntiOE8eOMY6dxFkokJCQlACBhEpsvWgLRkAL
-IhRxEYrSpp/6XYCgUokKBQEl0ABR0wrShBAI2R1nM3HseB+Px2PPPu/Mu3aE
-uKkoUhPzuzhXRzp/PUfPOcQ0TcxGrOcJ9Jz6F4YmTNq2yF4r5436aFyrlyz8
-nyQxH6m7aTdETxO+D8UssSxF/0gGc4NCpc3u2VtctvBNb5HjN71XUw8bxAHd
-pPiGkQeg/PADDI5lMZ3QYRUZL2MpqRVIyhpwGwj62OdTObo1l405svEBd9/h
-J7ae3Nd1p6rIP+wA5/tzuKExgKDfsZm32KHIU6AUaGnwiD5b5u3R0787OXVu
-x0kbF3t7ZuyzPZ/ve2HjfySI65SdPOQf7z/UNM87pPg8zi32wI0/J8oINE1F
-NgewLOBxW8GwxnyTUWCqcSycHyT7Du99V9XY1rX37Lh43QPoagrhS689zRnp
-X/p9btjcZUB+CL29vThwPD6USOnHrRbGqCixNLc3ueuK3BpMQ0U0oaJvONvd
-uvaGoVklkJm+6DbU2Aa3rxxy7CL0VBxj4Qz++s/I4ebF1VvKAyRiaEmkMobt
-bO/0Gy0NRZu9bh5XBifVxqXbnm/p2JiZVQtmJs5WhcZHq+XkEAhlYJrAF2cS
-qUX1pV13bVgSqa+yo6bMgSInl57XdOdDM0l9kFIKniWcwDP6rFtQUn/f6QTt
-uPd0z2AMJoGqGYjMqD1Vc8j5zEw/qJGG3UrBsQwMNpjgqHZW1w3MKbYiFTm1
-StOU2Q3Ai3bcdt9LH4iuusczsgxKCSwiYxLCQMmnwbAUDEMg5/PgRDec3qqc
-yXpQ4rejrjj0zME9j+/IyUnrrGrIsDwal3f1GAbReI7FgiqpeTqWWjQxJePK
-cAY9lxO4MmrCJc6UOt3BDoAFIQbmV3mF7qN7num/3F2CAnb610+CwITAsjAB
-GIYBAkBgKN4ZDiFhAttqq4TpqamNcU0PEULHeUJDnEAUs0P2e0saYeaGsLjO
-bjvfl3pDUWnX0IT8JYMcOprLmsTc0T/yzopyNRsFy7CIzOQQy3kO2ezeQRSQ
-qVvbEc2r2D00DsUwANNEhdWCUknEuyMT6GpvRTCT3GparW/LeQXTyWT0QjT9
-SXEt9+jSX1Xvd7iql+ZiF8CyDBQNmJzO64ZJj9ntLt3lCTaLNp89E+3BmXMD
-hcPVzNh4zLQGOh976oW9f0YBSy0WvD86CcNThLtrKkloZIhSm0PvHp/A1rpq
-lCiy17TbdwY710C72IOiaNR7MqFsuJjVXyoOp6Qq/TIEjiKb08FxHMqDFkY3
-yTLK2UGQQiJ0Bf/4fFQfjJa8sG7zI++1+eYYHo9nCN8iXdWlyIHgyboqsJry
-cljROmKqtreIY/9uJVgkSLaHi5evXKGHQ1Cv9oNQin2FZC5l0i0ttzrifAU5
-FovpvpEJ+YjLzup1VVL7onk2QRQYUGLi4pUYDp7zPvvcrv07BUH47mcUZXg8
-2rYEpqY8JFTUPFKzoKG5UhJ3uIo8J731Da/PWd65AqExGCODoIQAuoYGlw1B
-VthOjpEJPYpVGVNbdvOaus6GGtvqyLSyqvdqdoQS8s21TEZzkGyuE98e/h20
-JeAFL8ttiondjrllQDyGIlGA3+GgFkPH1Imv0NdzFgPxJCJZGQalqHLYsCLg
-vosH+ay4j+9sH3PO0z6e+onLZBzzq8RjMLXtn345irc+upr97Pj48bLy8iF8
-D/Liwhp0+jyBSUU52Oh2LbCYOhiOg6pqOBdL4Eg0poRy6gkLy0SKRaGy2W1v
-bnTZITEMcgB0wsM0ga8GRkFX+G9pvW/xp4qsMOevpFc6JYTL6n98ua55vc5y
-Iv4bsmvxfDS6nYjnlc2VkuWdCqedVxUVR6fj2DM8fpwThF8sdDnPcLoKllJr
-QtXur7NL/9fmcVpFlgWVJBT24FTv1zjjLt39xAcf/5S3cPhfUZFSHJ6YQoVV
-PMKKYpSxSgjJORyYmBoRrNI9j61ZeWZzZSmaXHYEBD7b5nG8GlO0rlAub6LA
-SKehxGOAaMHZLw5u7jt11IdrQP82FkFtSTEsBEGbw+knDidGUhlEFfW9wgM0
-XCynYWMoGl0OgFKEZQUNDuktWTcuEYsFBRhMpvHOhcvZ2k13Ple1uDmNa0C3
-LF6A1ZXl0FRlk3tuOavJWaQ0DQ6OO52MxzE2GQGTzYJwPFoDPlxKpgGYikTJ
-JPUUIUcp9g+OZEtuWXf/s7tff8XqcMi4Bux6K+tNDg8+6F+waAcnSchenIRL
-FGDjGL+mqIjBBCQRNosFJ0NhhFUNIsdxAqU+wenGcH8/ZkTp/PYXd77P8zyu
-FQ0lM09xbvcuR209lKEBUBOolKwICMKDedOkeZb75qV89UIf3uwbwl1zi2GD
-2e4sK68DAQopoaS6Jlzk8+N60LCifjAZS0wo3SdBkgmYlMAncmj3OpvSmvYa
-SyCUFwdg6jp+VlOGeRxtopL0srN+AZcfHYbf5USq50xw7PLXDK4DObS6FZNy
-fr+TZdZRSuEROBT6DoYQjGRljGVz3VaG+cjDMqMCpcvsc+Zs8Ta12JT+y1CH
-BwGGweHxMOTWZY9s2/WHV0S7A9eCnLh5KXoTmTVnYsmtGU2HT+SDLW77+haP
-CzaHA9l0BjlNhVDkg628HILNDvlqP5SxYXAcjwIcn0ng9RPdZ188cLitbvkK
-BdeAPTA5g1a34yDgOFiIHIQQDKayXQ6W/e1ClrWypgE7z4ElJrIDV3ApPImR
-VBYCz6FC0iHrBj4eGE413n3v02WNixVcI7bRaYMBoMJmRR4motk8av2+l6Zj
-sdWKad5htYjQczkkpiI4MDmNL6LxbsUw/1Ik8nmJYe6ITk8vkWoX7ChU8FPu
-OlrA/P+SevhFHj6bhKDVgq/jCUQNwENJkUmwXgCg6QaOzSTx4Wj4PZ/TuX5b
-bfWXQYJTvK69Wbduw/sP7Pz9AZc/YOA6sGo2AxMA1Q0IFCghJj4cGERpqf/I
-J+HIJRNmOSVUOh9LxtxWy/YHW5cotkgImqZC1/K4/dHHrtrm1+J6UXHZKlg7
-b4Jl+SqwHStRe/NatN++EcFVPzrfcOvaVk/nmhaho7Dctn7TA1u3Xg3Mmwd/
-RyduXL8BbbdvAmuxYjb+DcasAaYvg7ldAAAAAElFTkSuQmCC
-           ">
-
-          <!-- Some browsers automatically focus the first focusable item. We
-          don't want anything focused, so we add this fake item. -->
-          <a href="#" id="focus-thief"></a>
-        </td>
-        <td id="header" width="100%" valign="middle"></td>
-      </tr>
-    </table>
-  </div>
-
-  <div id="content">
-    <div id="highlightbox">
-      <div id="highlightbox-inner">
-        <div id="scroll">
-          <table cellpadding="0" cellspacing="0" border="0">
-            <tr>
-              <td valign="top"><img id="shortcut-icon" width="32" height="32" src="blank.gif"></td>
-              <td align="left" width="100%" valign="middle">
-                <div id="shortcut-name"></div
-                ><div id="shortcut-description"></div>
-              </td>
-            </tr>
-          </table>
-        </div>
-      </div>
-    </div>
-
-    <div id="locations">
-      <p><span id="string-location-query"></span></p>
-      <div id="locations-windows">
-        <table cellpadding="0" cellspacing="2" border="0">
-          <tr>
-            <!-- NOTE: Confusingly, onclick also gets fired when the checkbox changes via keyboard press. -->
-            <!-- NOTE: The values in the checkboxes correspond to the SHORTCUT_LOCATION_* bitmasks defined in desktop.cc. -->
-            <td valign="middle"><input type="checkbox" id="location-desktop" value="1" onclick="resetConfirmDisabledState()"></td>
-            <td valign="middle"><label for="location-desktop"><span id="string-desktop"></span></label></td>
-          </tr>
-          <tr>
-            <td valign="middle"><input type="checkbox" id="location-startmenu" value="4" onclick="resetConfirmDisabledState()"></td>
-            <td valign="middle"><label for="location-startmenu"><span id="string-startmenu"></span></label></td>
-          </tr>
-          <tr>
-            <td valign="middle"><input type="checkbox" id="location-quicklaunch" value="2" onclick="resetConfirmDisabledState()"></td>
-            <td valign="middle"><label for="location-quicklaunch"><span id="string-quicklaunch"></span></label></td>
-          </tr>
-        </table>
-      </div>
-      <!-- TODO(aa): Support more locations on other platforms, such as dock
-      and applications on OSX? -->
-    </div>
-  </div>
-
-  <div id="foot">
-
-
-    <div id="button-row">
-      <table cellpadding="0" cellspacing="0" border="0">
-        <tr>
-
-          <td width="100%" valign="middle">
-            <a href="#" onclick="denyShortcutPermanently(); return false;" id="deny-permanently-link"></a>
-          </td>
-          <td nowrap="true" align="right" valign="middle">
-            <button id="allow-button" class="custom"
-              onclick="allowShortcutsTemporarily(); return false;"></button
-            ><button id="deny-button" class="custom"
-              onclick="denyShortcutsTemporarily(); return false;"></button>
-          </td>
-
-        </tr>
-      </table>
-    </div>
-  </div>
-
-</body>
-<!--
-We include all files through m4 as the HTML dialog implementation on
-PocketIE does not support callbacks for loading external JavaScript files.
-TODO: find a better way to include scripts for PIE
--->
-<script>
-/*
-Copyright (c) 2005 JSON.org
-
-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 Software shall be used for Good, not Evil.
-
-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.
-*/
-
-//Array.prototype.______array = '______array';
-
-var JSON = {
-    org: 'http://www.JSON.org',
-    copyright: '(c)2005 JSON.org',
-    license: 'http://www.crockford.com/JSON/license.html',
-
-    stringify: function (arg) {
-        var c, i, l, s = '', v;
-
-        switch (typeof arg) {
-        case 'object':
-            if (arg) {
-                if (arg.constructor == Array.prototype.constructor) {
-                    for (i = 0; i < arg.length; ++i) {
-                        v = this.stringify(arg[i]);
-                        if (s) {
-                            s += ',';
-                        }
-                        s += v;
-                    }
-                    return '[' + s + ']';
-                } else if (typeof arg.toString != 'undefined') {
-                    for (i in arg) {
-                        v = arg[i];
-                        if (typeof v != 'undefined' && typeof v != 'function') {
-                            v = this.stringify(v);
-                            if (s) {
-                                s += ',';
-                            }
-                            s += this.stringify(i) + ':' + v;
-                        }
-                    }
-                    return '{' + s + '}';
-                }
-            }
-            return 'null';
-        case 'number':
-            return isFinite(arg) ? String(arg) : 'null';
-        case 'string':
-            l = arg.length;
-            s = '"';
-            for (i = 0; i < l; i += 1) {
-                c = arg.charAt(i);
-                if (c >= ' ') {
-                    if (c == '\\' || c == '"') {
-                        s += '\\';
-                    }
-                    s += c;
-                } else {
-                    switch (c) {
-                        case '\b':
-                            s += '\\b';
-                            break;
-                        case '\f':
-                            s += '\\f';
-                            break;
-                        case '\n':
-                            s += '\\n';
-                            break;
-                        case '\r':
-                            s += '\\r';
-                            break;
-                        case '\t':
-                            s += '\\t';
-                            break;
-                        default:
-                            c = c.charCodeAt();
-                            s += '\\u00' + Math.floor(c / 16).toString(16) +
-                                (c % 16).toString(16);
-                    }
-                }
-            }
-            return s + '"';
-        case 'boolean':
-            return String(arg);
-        default:
-            return 'null';
-        }
-    },
-    parse: function (text) {
-        var at = 0;
-        var ch = ' ';
-
-        function error(m) {
-            throw {
-                name: 'JSONError',
-                message: m,
-                at: at - 1,
-                text: text
-            };
-        }
-
-        function next() {
-            ch = text.charAt(at);
-            at += 1;
-            return ch;
-        }
-
-        function white() {
-            while (ch) {
-                if (ch <= ' ') {
-                    next();
-                } else if (ch == '/') {
-                    switch (next()) {
-                        case '/':
-                            while (next() && ch != '\n' && ch != '\r') {}
-                            break;
-                        case '*':
-                            next();
-                            for (;;) {
-                                if (ch) {
-                                    if (ch == '*') {
-                                        if (next() == '/') {
-                                            next();
-                                            break;
-                                        }
-                                    } else {
-                                        next();
-                                    }
-                                } else {
-                                    error("Unterminated comment");
-                                }
-                            }
-                            break;
-                        default:
-                            error("Syntax error");
-                    }
-                } else {
-                    break;
-                }
-            }
-        }
-
-        function string() {
-            var i, s = '', t, u;
-
-            if (ch == '"') {
-outer:          while (next()) {
-                    if (ch == '"') {
-                        next();
-                        return s;
-                    } else if (ch == '\\') {
-                        switch (next()) {
-                        case 'b':
-                            s += '\b';
-                            break;
-                        case 'f':
-                            s += '\f';
-                            break;
-                        case 'n':
-                            s += '\n';
-                            break;
-                        case 'r':
-                            s += '\r';
-                            break;
-                        case 't':
-                            s += '\t';
-                            break;
-                        case 'u':
-                            u = 0;
-                            for (i = 0; i < 4; i += 1) {
-                                t = parseInt(next(), 16);
-                                if (!isFinite(t)) {
-                                    break outer;
-                                }
-                                u = u * 16 + t;
-                            }
-                            s += String.fromCharCode(u);
-                            break;
-                        default:
-                            s += ch;
-                        }
-                    } else {
-                        s += ch;
-                    }
-                }
-            }
-            error("Bad string");
-        }
-
-        function array() {
-            var a = [];
-
-            if (ch == '[') {
-                next();
-                white();
-                if (ch == ']') {
-                    next();
-                    return a;
-                }
-                while (ch) {
-                    a.push(value());
-                    white();
-                    if (ch == ']') {
-                        next();
-                        return a;
-                    } else if (ch != ',') {
-                        break;
-                    }
-                    next();
-                    white();
-                }
-            }
-            error("Bad array");
-        }
-
-        function object() {
-            var k, o = {};
-
-            if (ch == '{') {
-                next();
-                white();
-                if (ch == '}') {
-                    next();
-                    return o;
-                }
-                while (ch) {
-                    k = string();
-                    white();
-                    if (ch != ':') {
-                        break;
-                    }
-                    next();
-                    o[k] = value();
-                    white();
-                    if (ch == '}') {
-                        next();
-                        return o;
-                    } else if (ch != ',') {
-                        break;
-                    }
-                    next();
-                    white();
-                }
-            }
-            error("Bad object");
-        }
-
-        function number() {
-            var n = '', v;
-            if (ch == '-') {
-                n = '-';
-                next();
-            }
-            while (ch >= '0' && ch <= '9') {
-                n += ch;
-                next();
-            }
-            if (ch == '.') {
-                n += '.';
-                while (next() && ch >= '0' && ch <= '9') {
-                    n += ch;
-                }
-            }
-            if (ch == 'e' || ch == 'E') {
-                n += 'e';
-                next();
-                if (ch == '-' || ch == '+') {
-                    n += ch;
-                    next();
-                }
-                while (ch >= '0' && ch <= '9') {
-                    n += ch;
-                    next();
-                }
-            }
-            v = +n;
-            if (!isFinite(v)) {
-                ////error("Bad number");
-            } else {
-                return v;
-            }
-        }
-
-        function word() {
-            switch (ch) {
-                case 't':
-                    if (next() == 'r' && next() == 'u' && next() == 'e') {
-                        next();
-                        return true;
-                    }
-                    break;
-                case 'f':
-                    if (next() == 'a' && next() == 'l' && next() == 's' &&
-                            next() == 'e') {
-                        next();
-                        return false;
-                    }
-                    break;
-                case 'n':
-                    if (next() == 'u' && next() == 'l' && next() == 'l') {
-                        next();
-                        return null;
-                    }
-                    break;
-            }
-            error("Syntax error");
-        }
-
-        function value() {
-            white();
-            switch (ch) {
-                case '{':
-                    return object();
-                case '[':
-                    return array();
-                case '"':
-                    return string();
-                case '-':
-                    return number();
-                default:
-                    return ch >= '0' && ch <= '9' ? number() : word();
-            }
-        }
-
-        return value();
-    }
-};
-
-// Copyright 2008, The Android Open Source Project
-//
-// Redistribution and use in source and binary forms, with or without 
-// modification, are permitted provided that the following conditions are met:
-//
-//  1. Redistributions of source code must retain the above copyright notice, 
-//     this list of conditions and the following disclaimer.
-//  2. 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.
-//  3. Neither the name of Google Inc. nor the names of its contributors may be
-//     used to endorse or promote products derived from this software without
-//     specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-
-//=============================================================================
-// Various basic JavaScript utilities.
-//=============================================================================
-
-/**
- * Check that the type is not undefined (we do it here as on
- * some devices typeof returns unknown instead of undefined...).
- * We have to pass the evaluation of (typeof elem) (i.e., a string)
- * to the function rather than simply (element) -- passing an 
- * undefined object would make the function crash on PIE.
- */
-function isDefined(type) {
-  return type != 'undefined' && type != 'unknown';
-}
-
-/**
- * Returns true if val is a function.
- */
-function isFunction(val) {
-  return typeof val == "function";
-}
-
-// TODO(aa): more basic type checking here.
-
-
-/**
- * Creates a 'bound' function that calls the current function with a preset
- * 'this' object and set of arguments.
- */
-Function.prototype.bind = function(obj) {
-  var preArgs = Array.prototype.slice.call(arguments, 1);
-  var self = this;
-  return function() {
-    var postArgs = Array.prototype.slice.call(arguments, 0);
-    var totalArgs = preArgs.concat(postArgs);
-    return self.apply(obj, totalArgs);
-  }
-};
-
-/**
- * Creates a partially applied function that calls the current function with
- * a preset set of arguments.
- */
-Function.prototype.partial = function() {
-  var args = Array.prototype.slice.call(arguments, 0);
-  return this.bind(null, args);
-};
-
-/**
- * Binds all the methods in obj to obj.
- */
-function bindMethods(obj) {
-  for (var p in obj) {
-    if (isFunction(obj[p])) {
-      obj[p] = obj[p].bind(obj);
-    }
-  }
-}
-
-
-/**
- * Trim leading and trailing whitespace from a string.
- */
-String.prototype.trim = function(str) {
-  return this.replace(/^\s+/, "").replace(/\s+$/, "");
-};
-
-
-/**
- * Find the index of a given element in an array. Returns -1 if the item does
- * not exist.
- */
-Array.prototype.indexOf = function(item) {
-  for (var i = 0; i < this.length; i++) {
-    if (this[i] === item) {
-      return i;
-    }
-  }
-  return -1;
-};
-
-/**
- * Makes a deep copy of an object.
- */
-function cloneObject(original) {
-  var newObject = new Object();
-  for (i in original) {
-    if (typeof original[i] == 'object') {
-      newObject[i] = cloneObject(original[i]);
-    }
-    else {
-      newObject[i] = original[i];
-    }
-  }
-  newObject.length = original.length;
-  return newObject;
-}
-
-var browser = {};
-
-(function() {
-  var ua = navigator.userAgent;
-  browser.opera = typeof opera != "undefined";
-  browser.ie = !browser.opera && ua.indexOf("MSIE") > -1;
-  browser.ie_mobile = (ua.indexOf("Windows CE") > -1) &&
-      (ua.indexOf("MSIE") > -1);
-  browser.webkit = ua.indexOf("WebKit") > -1;
-  // WebKit also gives product == "gecko".
-  browser.mozilla = !browser.webkit && navigator.product == "Gecko";
-  browser.safari = ua.indexOf("Safari") > -1;
-  browser.mac = navigator.platform.indexOf("Mac") > -1;
-  browser.linux = navigator.platform.indexOf("Linux") > -1;
-  browser.windows = navigator.platform.indexOf("Win") > -1;
-  browser.android = ua.indexOf("Android") > -1;
-  if (browser.android) {
-    browser.safari = false;
-  }
-  // TODO(aa): Add detection for more browsers, as necessary.
-})();
-
-// Copyright 2008, The Android Open Source Project
-//
-// Redistribution and use in source and binary forms, with or without 
-// modification, are permitted provided that the following conditions are met:
-//
-//  1. Redistributions of source code must retain the above copyright notice, 
-//     this list of conditions and the following disclaimer.
-//  2. 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.
-//  3. Neither the name of Google Inc. nor the names of its contributors may be
-//     used to endorse or promote products derived from this software without
-//     specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-
-//=============================================================================
-// DOM manipulation utilities.
-// Requires: base.js
-//=============================================================================
-
-var dom = {};
-
-/**
- * Provides a cross-browser way of getting an element by its id
- */
-dom.getElementById = function(id) {
-  if (isDefined(typeof document.getElementById)) {
-    return document.getElementById(id);
-  } else if (isDefined(typeof document.all)) {
-    return document.all[id];
-  }
-  throw new Error("Failed to get element by ID.");
-};
-
-/**
- * Gets the position and dimensions of an element in pixels in relation
- * to the window origin.
- */
-dom.getPosition = function(elem) {
-  var ret = { 'left'   : 0,
-              'top'    : 0,
-              'width'  : elem.width,
-              'height' : elem.height };
-  
-  if (!elem.offsetParent) return ret;
-  
-  var left = 0;
-  var top = 0;
-  while (elem) {
-    left += elem.offsetLeft;
-    top += elem.offsetTop;
-    elem = elem.offsetParent
-  }
-  ret.left = left;
-  ret.top = top;
-  return ret;
-};
-
-/**
- * Returns the height of the inside of the window.
- */
-dom.getWindowInnerHeight = function() {
-  if (isDefined(typeof window.innerHeight)) { // Firefox
-    return window.innerHeight;
-  } else if (isDefined(typeof document.body.offsetHeight)) { // IE
-    return document.body.offsetHeight;
-  }
-
-  throw new Error("Could not get windowInnerHeight.");
-};
-
-/**
- * Add an event listener to an element cross-browser.
- */
-dom.addEvent = function(element, eventName, handler) {
-  var wrapper = dom._callEventHandler.bind(dom, handler);
-
-  if (isDefined(typeof element.addEventListener)) {
-    // Standards-compatible browsers
-    element.addEventListener(eventName, wrapper, false);
-  } else if (isDefined(typeof element.attachEvent)) {
-    // IE
-    element.attachEvent("on" + eventName, wrapper);
-  } else {
-    throw new Error('Failed to attach event.');
-  }
-};
-
-/**
- * Private helper for calling event handlers compatibly across browsers.
- */
-dom._callEventHandler = function(handler, e) {
-  // Older versions of IE don't pass event to the handler.
-  if (!e) e = window.event;
-
-  // TODO(aa): Normalize event object properties.
-
-  return handler(e);
-};
-
-/**
- * Gets the CSS classes for an element.
- */
-dom.getClasses = function(elm) {
-  return elm.className.split(/\s+/);
-};
-
-/**
- * Check is an element has a particular CSS class name.
- */
-dom.hasClass = function(elm, className) {
-  return this.getClasses(elm).indexOf(className) > -1;
-};
-
-/**
- * Adds a CSS class to an element. Do nothing if the class already exists.
- */
-dom.addClass = function(elm, className) {
-  var classes = this.getClasses(elm);
-  if (classes.indexOf(className) > -1) {
-    return;
-  }
-  classes.push(className);
-  elm.className = classes.join(" ");
-};
-
-/**
- * Removes a CSS class from an element. Do nothing if the class doesn't exist.
- */
-dom.removeClass = function(elm, className) {
-  var classes = this.getClasses(elm);
-  var index = classes.indexOf(className);
-  if (index == -1) {
-    return;
-  }
-  classes.splice(index, 1);
-  elm.className = classes.join(" ");
-};
-
-/**
- * Gets the text (non-html) content of an element.
- */
-dom.getTextContent = function(elm) {
-  if (isDefined(typeof elm.textContent)) {
-    return elm.textContent;
-  } else if (isDefined(typeof elm.innerText)) {
-    return elm.innerText;
-  } else {
-    throw new Error("Could not find a property to get text content.");
-  }
-};
-
-/**
- * Sets the text (non-html) contents of an element.
- */
-dom.setTextContent = function(elm, text) {
-  if (isDefined(typeof elm.textContent)) {
-    elm.textContent = text;
-  } else if (isDefined(typeof elm.innerText)) {
-    elm.innerText = text;
-  } else {
-    throw new Error("Could not find a property to set text content.");
-  }
-};
-
-// Copyright 2007, The Android Open Source Project
-//
-// Redistribution and use in source and binary forms, with or without 
-// modification, are permitted provided that the following conditions are met:
-//
-//  1. Redistributions of source code must retain the above copyright notice, 
-//     this list of conditions and the following disclaimer.
-//  2. 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.
-//  3. Neither the name of Google Inc. nor the names of its contributors may be
-//     used to endorse or promote products derived from this software without
-//     specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-
-/**
- * Initialize the base functionality of the dialog.
- */
-function initDialog() {
-  if (!browser.ie_mobile) {
-    dom.addEvent(document, "keyup", handleKeyUp);
-  } else {
-    var buttonRowElem = null;
-    if (window.pie_dialog.IsSmartPhone()) {
-      buttonRowElem = dom.getElementById("button-row-smartphone");
-    } else {
-      buttonRowElem = dom.getElementById("button-row");
-    }
-    if (buttonRowElem) {
-      buttonRowElem.style.display = 'block';
-    }
-  }
-  if (browser.ie_mobile) {
-    window.pie_dialog.SetScriptContext(window);
-    window.pie_dialog.ResizeDialog();
-  }
-}
-
-/**
- * Set the label of an input button, and optionally, its accesskey.
- */
-function setButtonLabel(textID, elemID, accessKeyID) {
-  var textElem = dom.getElementById(textID);
-  var buttonElem = dom.getElementById(elemID);
-  if (textElem == null || buttonElem == null) {
-    return;
-  }
-
-  var accessKeyElem = null;
-  if (isDefined(typeof accessKeyID)) {
-    accessKeyElem = dom.getElementById(accessKeyID);
-  }
-
-  // This function works for two different kinds of buttons. Simple buttons
-  // based on the <input type="button"> tag, and custom buttons based on a
-  // <button> tag with the css class "custom".
-  // Note that on Windows Mobile 5, the tagName property is not defined.
-  // We can therefore safely assume that the converse is also true:
-  // if tagName is not defined, then the platform must be Windows Mobile 5.  
-  if (!isDefined(typeof buttonElem.tagName) ||
-      buttonElem.tagName.toLowerCase() == "input") {
-    buttonElem.value = dom.getTextContent(textElem).trim();
-    if (accessKeyElem != null) {
-      buttonElem.accessKey = dom.getTextContent(accessKeyElem).trim();
-    }
-  } else if (buttonElem.tagName.toLowerCase() == "button") {
-    var text = dom.getTextContent(textElem).trim();
-
-    if (accessKeyElem != null) {
-      // Some browsers use the accessKey attribute of the the anchor tag.
-      var accessKey = dom.getTextContent(accessKeyElem).trim();
-      buttonElem.accessKey = accessKey;
-
-      // Find the first matching character in the text and mark it.
-      // Note: this form of String.replace() only replaces the first occurence.
-      text = text.replace(accessKey,
-                          "<span class='accesskey'>" + accessKey + "</span>");
-    }
-
-    buttonElem.innerHTML = text;
-  } else {
-    throw new Error("Unexpected button tag name: " + buttonElem.tagName);
-  }
-}
-
-/**
- * Allows a dialog to do custom layout when the window changes sizes. The
- * provided function will be called with the height of the content area when the
- * dialog should relayout.
- */
-function initCustomLayout(layoutFunction) {
-  function doLayout() {
-    layoutFunction(getContentHeight());
-  }
-
-  doLayout();
-
-  // We do an additional layout in onload because sometimes things aren't
-  // stabilized when the first doLayout() is called above.
-  dom.addEvent(window, "load", doLayout);
-  dom.addEvent(window, "resize", doLayout);
-
-  // Mozilla doesn't fire continuous events during resize, so if we want to get
-  // somewhat smooth resizing, we need to run our own timer loop. This still
-  // doesn't look perfect, because the timer goes off out of sync with the
-  // browser's internal reflow, but I think it's better than nothing.
-  // TODO(aa): Keep looking for a way to get an event for each reflow, like IE.
-  if (browser.mozilla) {
-    var lastHeight = -1;
-
-    function maybeDoLayout() {
-      var currentHeight = dom.getWindowInnerHeight();
-      if (currentHeight != lastHeight) {
-        lastHeight = currentHeight;
-        doLayout();
-      }
-    }
-
-    window.setInterval(maybeDoLayout, 30);
-  }
-}
-
-/**
- * Get the JSON-formatted arguments that were passed by the caller.
- */
-function getArguments() {
-  var argsString;
-  if (browser.ie_mobile) {
-    argsString = window.pie_dialog.GetDialogArguments();
-  } else if (browser.ie) {
-    argsString = window.external.GetDialogArguments();
-  } else if (browser.mozilla) {
-    argsString = getFirefoxArguments(window.arguments[0]);
-  } else if (browser.safari) {
-    argsString = window.gears_dialogArguments;
-  } else if (browser.android) {
-    argsString = "" + window.bridge.getDialogArguments();
-  }
-
-  if (typeof argsString == "string") {
-    return JSON.parse(argsString);
-  } else {
-    return null;
-  }
-}
-
-/**
- * Helper used by getArguments(). Getting the arguments in the right type is
- * more involved in Firefox.
- */
-function getFirefoxArguments(windowArguments) {
-  var Ci = Components.interfaces;
-  windowArguments.QueryInterface(Ci.nsIProperties);
-  var supportsString = 
-    windowArguments.get("dialogArguments", Ci.nsISupportsString);
-  return supportsString.data;
-}
-
-/**
- * Close the dialog, sending the specified result back to the caller.
- */
-function saveAndClose(resultObject) {
-  var resultString = JSON.stringify(resultObject);
-  if (browser.ie_mobile) {
-    window.pie_dialog.CloseDialog(resultString);
-  } else if (browser.ie) {
-    window.external.CloseDialog(resultString);
-  } else if (browser.mozilla) {
-    saveFirefoxResults(resultString);
-    window.close();
-  } else if (browser.safari) {
-    window.gears_dialog.setResults(resultString);
-  } else if (browser.android) {
-    window.bridge.closeDialog(resultString);
-  }
-}
-
-/**
- * Helper used by endDialog() for Firefox.
- */
-function saveFirefoxResults(resultString) {
-  var Cc = Components.classes;
-  var Ci = Components.interfaces;
-  
-  var props = window.arguments[0].QueryInterface(Ci.nsIProperties);
-  var supportsString = Cc["@mozilla.org/supports-string;1"]
-      .createInstance(Ci.nsISupportsString);
-      
-  supportsString.data = resultString;
-  props.set("dialogResult", supportsString);
-}
-
-/**
- * Returns the height of the content area of the dialog.
- */
-function getContentHeight() {
-  var head = dom.getElementById("head");
-  var foot = dom.getElementById("foot");
-  return dom.getWindowInnerHeight() - head.offsetHeight - foot.offsetHeight;
-}
-
-/**
- * For some reason ESC doesn't work on HTML dialogs in either Firefox or IE. So
- * we implement it manually.
- */
-function handleKeyUp(e) {
-  var ESC_KEY_CODE = 27;
-  
-  if (e.keyCode == ESC_KEY_CODE) {
-    saveAndClose(null);
-  }
-}
-
-/**
- * Disables a button in the right way, whether it is normal or custom.
- */
-function disableButton(buttonElem) {
-  buttonElem.disabled = true;
-
-  if (browser.ie_mobile) {
-    window.pie_dialog.SetButtonEnabled(false);
-  }
-
-  if (!isDefined(typeof buttonElem.tagName) || 
-      buttonElem.tagName.toLowerCase() == "input") {
-    buttonElem.style.color = "gray";
-  } else if (buttonElem.tagName.toLowerCase() == "button") {
-    dom.addClass(buttonElem, "disabled");
-  } else {
-    throw new Error("Unexpected tag name: " + buttonElem.tagName);
-  }
-}
-
-/**
- * Enables a button in the right way, whether it is normal or custom.
- */
-function enableButton(buttonElem) {
-  buttonElem.disabled = false;
-
-  if (browser.ie_mobile) {
-    window.pie_dialog.SetButtonEnabled(true);
-  }
-  
-  if (!isDefined(typeof buttonElem.tagName) ||
-      buttonElem.tagName.toLowerCase() == "input") {
-    buttonElem.style.color = "black";
-  } else if (buttonElem.tagName.toLowerCase() == "button") {
-    dom.removeClass(buttonElem, "disabled");
-  } else {
-    throw new Error("Unexpected tag name: " + buttonElem.tagName);
-  }
-}
-
-/**
- * Returns a wrapped domain (useful for small screens dialogs, 
- * e.g. windows mobile devices)
- */
-function wrapDomain(str) {
-  if (!browser.ie_mobile) {
-    return str;
-  }
-
-  var max = 20;
-  var url;
-  var scheme_start = str.indexOf("://");
-  var scheme = "";
-
-  if (scheme_start != -1) {
-    scheme = str.substring(0, scheme_start);
-    scheme += "://";
-    // there's automatically an hyphenation
-    // point used by the browser after http://
-    // so we only have to hyphenate the
-    // rest of the string
-    url = str.substring(scheme.length);
-  } else {
-    url = str;
-  }
-
-  // We hyphenate the string on every dot
-  var components = url.split(".");
-  if (components.length < 1) {
-    return str;
-  }
-
-  var content = components[0];
-  var len = content.length;
-  for (var i=1; i < components.length; i++) {
-    var elem = components[i];
-    content += ".";
-    len++;
-    if (len + elem.length > max) {
-      content += "<br>";
-      len = 0;
-    }
-    content += elem;
-    len += elem.length;
-  }
-  return scheme + content;
-}
-
-/**
- * Resizes the dialog to fit the content size.
- */
-function resizeDialogToFitContent(opt_minDialogInnerHeight) {
-  // This does not work on PIE (no height measurement)
-  if (browser.ie_mobile) {
-    window.pie_dialog.ResizeDialog();
-    return;
-  }
-  // window.resize() is not working on Android, we bail out.
-  if (browser.android) {
-    return;
-  }
-
-  // Resize the window to fit
-  var contentDiv = dom.getElementById("content");
-  var contentHeightProvided = getContentHeight();
-  var contentHeightDesired = contentDiv.offsetHeight;
-
-  var dialogHeightProvided = dom.getWindowInnerHeight();
-  var dialogHeightDesired =
-      dialogHeightProvided + (contentHeightDesired - contentHeightProvided);
-
-  var minDialogHeight = opt_minDialogInnerHeight || 0;
-  var maxDialogHeight = 400; // arbitrary max height for a dialog to resize to
-  
-  var targetHeight = Math.max(dialogHeightDesired, minDialogHeight);
-  targetHeight = Math.min(dialogHeightDesired, maxDialogHeight);
-
-  if (targetHeight != dialogHeightProvided) {
-    var dy = targetHeight - dialogHeightProvided;
-    window.resizeBy(0, dy);
-  }
-}
-
-/**
- * Safari running on OSX 10.4 can't load images dynamically from the network,
- * this helper function calls gears-specific code to work around this
- * limitation.
- */
-function loadImage(elem, image_url) {
-  if (browser.safari) {
-    var position = dom.getPosition(elem);
-    window.gears_dialog.loadImageIntoElement(image_url, position.top,
-                                             position.left,
-                                             position.width,
-                                             position.height);
-  } else {
-    elem.src = image_url;
-  }
-}
-
-// Copyright 2008, The Android Open Source Project
-//
-// Redistribution and use in source and binary forms, with or without 
-// modification, are permitted provided that the following conditions are met:
-//
-//  1. Redistributions of source code must retain the above copyright notice, 
-//     this list of conditions and the following disclaimer.
-//  2. 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.
-//  3. Neither the name of Google Inc. nor the names of its contributors may be
-//     used to endorse or promote products derived from this software without
-//     specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-
-//=============================================================================
-// Implements the behavior of our custom buttons. There is no native support in
-// IE for rounded corners on HTML elements, so this script also implements a
-// hack to simulate them in that browser.
-//
-// Requires: base.js, dom.js
-//=============================================================================
-
-/**
- * Constructor.
- */
-function CustomButton(htmlButton) {
-  bindMethods(this);
-  
-  this._focused = false;
-  this._htmlButton = htmlButton;
-
-  if (!document.all) {  // not IE
-    dom.addEvent(htmlButton, "mouseover", this._handleMouseOver);
-    dom.addEvent(htmlButton, "mouseout", this._handleMouseOut);
-  } else {  // IE
-    // mouseover/mouseout behave badly with nested elements in IE. Luckily,
-    // mouseenter/mouseleave are provided and have the equivalent semantics.
-    dom.addEvent(htmlButton, "mouseenter", this._handleMouseOver);
-    dom.addEvent(htmlButton, "mouseleave", this._handleMouseOut);
-
-    // We also handle focus and blur in IE so that we can update the corners
-    // to match the black border IE provides.
-    dom.addEvent(htmlButton, "focusin", this._handleFocus);
-    dom.addEvent(htmlButton, "blur", this._handleBlur);
-
-    dom.addClass(htmlButton, "ie");
-    this._createCorners();
-  }
-
-  // Limit button widths to a minimum of 60px. They look funny skinnier.  
-  if (htmlButton.offsetWidth < 60) {
-    htmlButton.style.width = "60px";
-  }
-
-  htmlButton.style.visibility = "visible";
-}
-
-/**
- * Initializes all the custom buttons on the page.
- */
-CustomButton.initializeAll = function() {
-  var buttons = document.getElementsByTagName("button");
-  for (var i = 0, button; button = buttons[i]; i++) {
-    if (dom.hasClass(button, "custom")) {
-      new CustomButton(button);
-    }
-  }
-};
-
-/**
- * Highlights the button on mouseover. Note that this gets called multiple
- * times while the mouse goes over sub elements inside the button.
- */
-CustomButton.prototype._handleMouseOver = function() {
-  if (!this._htmlButton.disabled && !this._focused) {
-    dom.addClass(this._htmlButton, "hover");
-    this._setCornerColor("blue");
-  }
-};
-
-/**
- * Undoes the highlighting of the button on mouseout. Note that this gets called
- * multiple times when the mouse moves out of sub elements, even if it is still
- * over the button. That is OK, as long as there is immediately a mouseover
- * event.
- */
-CustomButton.prototype._handleMouseOut = function() {
-  if (!this._htmlButton.disabled && !this._focused) {
-    dom.removeClass(this._htmlButton, "hover");
-    this._setCornerColor("grey");
-  }
-};
-
-/**
- * Highlights the button on focus. Currently only used for IE.
- * TODO(aa): The black highlight looks cool. Consider for other browsers.
- */
-CustomButton.prototype._handleFocus = function() {
-  dom.removeClass(this._htmlButton, "hover");
-  this._setCornerColor("black");
-  this._focused = true;
-};
-
-/**
- * Undoes the highlighting of the button on blur.
- */
-CustomButton.prototype._handleBlur = function() {
-  this._setCornerColor("grey");
-  this._focused = false;
-};
-
-/**
- * Helper to create the graphics that make the button have rounded corners in
- * IE.
- */
-CustomButton.prototype._createCorners = function() {
-  // Making the button position:relative makes it possible to position things
-  // inside it relative to it's border.
-  this._htmlButton.style.position = "relative";
-
-  var verticalEdges = ["left", "right"];
-  var horizontalEdges = ["top", "bottom"];
-  var colors = ["grey", "blue", "black"];
-
-  for (var i = 0; i < verticalEdges.length; i++) {
-    for (var j = 0; j < horizontalEdges.length; j++) {
-      for (var k = 0; k < colors.length; k++) {
-        var img = document.createElement("img");
-        img.src = "button_corner_" + colors[k]  + ".gif";
-        img.color  = colors[k];
-        img.style.position = "absolute";
-        img.style[verticalEdges[i]] = "-2px";
-        img.style[horizontalEdges[j]] = "-2px";
-        img.style.filter =
-            "progid:DXImageTransform.Microsoft.BasicImage(Rotation=" + 
-            (i + j) + ")";
-        this._htmlButton.appendChild(img);
-      }
-    }
-  }
-
-  this._setCornerColor("grey");
-};
-
-/**
- * Sets the color of the corners in IE by changing the stack order of the corner
- * images.
- */
-CustomButton.prototype._setCornerColor = function(newColor) {
-  var imgs = this._htmlButton.getElementsByTagName("img");
-  for (var i = 0, img; img = imgs[i]; i++) {
-    img.style.zIndex = Number(img.color == newColor);
-  }
-};
-
-var localized_strings = {
-  "el": {
-    "string-no": "Όχι",
-    "string-header-desktop": "Αυτός ο ιστότοπος θέλει να δημιουργήσει μια συντόμευση στον υπολογιστή σας. Θέλετε να το επιτρέψετε αυτό;",
-    "string-no-accesskey": "Ο",
-    "string-header-wince": "Αυτός ο ιστότοπος θέλει να δημιουργήσει μια συντόμευση στη λίστα προγραμμάτων. Θέλετε να το επιτρέψετε;",
-    "string-title-simple": "Δημιουργία συντομεύσεων εφαρμογών",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Άκυρο",
-    "string-startmenu": "Μενού έναρξης",
-    "string-yes": "Ναι",
-    "string-never-allow": "Να μην επιτρέπεται ποτέ αυτή η συντόμευση",
-    "string-yes-accesskey": "Ν",
-    "string-quicklaunch": "Γραμμή γρήγορης εκκίνησης",
-    "string-never-allow-wince": "Να μην επιτρέπεται ποτέ",
-    "string-desktop": "Επιφάνεια εργασίας",
-    "string-title-default": "Gears - Δημιουργία συντόμευσης στην επιφάνεια εργασίας",
-    "string-location-query": "Δημιουργία συντομεύσεων στις παρακάτω θέσεις:"
-  },
-  "gu": {
-    "string-no": "નહીં",
-    "string-header-desktop": "આ વેબસાઇટને તમારા કમ્પ્યુટર પર એક શોર્ટકટ બનાવવો છે શું આની તમારે મંજુરી આપવી છે?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "આ વેબસાઇટ આપની પ્રોગ્રામોની સૂચિમાં શૉર્ટકટ્સ બનાવવા માંગે છે. શું આપ આને મંજુરી આપવા માંગો છો?",
-    "string-title-simple": "એપ્લિકેશન શોર્ટકટ બનાવો",
-    "string-ok-accesskey": "O",
-    "string-ok": "ઓકે",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "રદ કરો",
-    "string-startmenu": "પ્રારંભ મેનુ",
-    "string-yes": "હા",
-    "string-never-allow": "આ શૉર્ટકટને ક્યારેય મંજૂર કરશો નહીં",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "ક્વિક લોંચ બાર",
-    "string-never-allow-wince": "ક્યારેય મંજૂર કરશો નહીં",
-    "string-desktop": "ડેસ્કટોપ",
-    "string-title-default": "Gears - ડેસ્ક્ટોપ શોર્ટકટ બનાવો",
-    "string-location-query": "નીચેના સ્થાનો પર શોર્ટકટ્સ બનાવો"
-  },
-  "zh-TW": {
-    "string-no": "否",
-    "string-header-desktop": "這個網站要在您的電腦上建立捷徑。 您是否允許這個動作?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "這個網站要在您的程式清單中建立捷徑。 您是否允許這個動作?",
-    "string-title-simple": "建立應用程式捷徑",
-    "string-ok-accesskey": "O",
-    "string-ok": "確定",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "取消",
-    "string-startmenu": "開始功能表",
-    "string-yes": "是",
-    "string-never-allow": "永不允許這個捷徑",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "快速啟動列",
-    "string-never-allow-wince": "永不允許",
-    "string-desktop": "桌面",
-    "string-title-default": "Gears - 建立桌面捷徑",
-    "string-location-query": "在下列位置建立捷徑:"
-  },
-  "vi": {
-    "string-no": "Không",
-    "string-header-desktop": "Trang web này muốn tạo một lối tắt trên màn hình của bạn. Bạn có cho phép tác vụ này không?",
-    "string-no-accesskey": "K",
-    "string-header-wince": "Trang web này muốn tạo lối tắt trong danh sách chương trình của bạn. Bạn có cho phép tác vụ này không?",
-    "string-title-simple": "Tạp Lối tắt cho Ứng dụng",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "H",
-    "string-cancel": "Huỷ",
-    "string-startmenu": "Trình đơn bắt đầu",
-    "string-yes": "Có",
-    "string-never-allow": "Không bao giờ cho phép lối tắt này",
-    "string-yes-accesskey": "C",
-    "string-quicklaunch": "Thanh khởi động nhanh",
-    "string-never-allow-wince": "Không bao giờ cho phép",
-    "string-desktop": "Màn hình",
-    "string-title-default": "Gears - Tạo Lối tắt trên Màn hình",
-    "string-location-query": "Tạo lối tắt trong các vị trí sau:"
-  },
-  "ca": {
-    "string-no": "No",
-    "string-header-desktop": "Aquest lloc web vol crear una drecera al vostre ordinador. Ho voleu permetre?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Aquest lloc web vol crear una drecera a la vostra llista de programes. Ho voleu permetre?",
-    "string-title-simple": "Creeu dreceres d'aplicacions",
-    "string-ok-accesskey": "O",
-    "string-ok": "D'acord",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Cancel·la",
-    "string-startmenu": "Menú Inici",
-    "string-yes": "Sí",
-    "string-never-allow": "No permetre mai aquesta drecera",
-    "string-yes-accesskey": "S",
-    "string-quicklaunch": "Barra d'inici ràpid",
-    "string-never-allow-wince": "No permetre mai",
-    "string-desktop": "Escriptori",
-    "string-title-default": "Gears - Crea una drecera a l'escriptori",
-    "string-location-query": "Crea dreceres a les ubicacions següents:"
-  },
-  "it": {
-    "string-no": "No",
-    "string-header-desktop": "Questo sito web vuole creare un collegamento sul tuo computer. Consentire l'operazione?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Questo sito Web vuole creare sul tuo desktop un collegamento nel tuo elenco di programmi. Consentire l'operazione?",
-    "string-title-simple": "Crea collegamenti applicazione",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "A",
-    "string-cancel": "Annulla",
-    "string-startmenu": "Menu Start",
-    "string-yes": "Sì",
-    "string-never-allow": "Non consentire mai questo collegamento",
-    "string-yes-accesskey": "S",
-    "string-quicklaunch": "Barra Avvio veloce",
-    "string-never-allow-wince": "Non consentire mai",
-    "string-desktop": "Desktop",
-    "string-title-default": "Google Gears - Crea collegamento sul desktop",
-    "string-location-query": "Crea collegamenti nelle seguenti posizioni:"
-  },
-  "kn": {
-    "string-no": "ಇಲ್ಲ",
-    "string-header-desktop": "ಈ ವೆಬ್ ಸೈಟ್ ನಿಮ್ಮ ಕಂಪ್ಯೂಟರಿನಲ್ಲಿ ಒಂದು ಶಾರ್ಟ್ ಕಟ್ ರಚಿಸಲು ಬಯಸುತ್ತದೆ. ಇದನ್ನು ನೀವು ಅನುಮತಿಸಲು ಬಯಸುತ್ತೀರಾ?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "ನಿಮ್ಮ ಕಾರ್ಯಕ್ರಮಗಳ ಪಟ್ಟಿಯಲ್ಲಿ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳನ್ನು ರಚಿಸಲು ಈ ವೆಬ್‌ಸೈಟ್ ಬಯಸುತ್ತದೆ. ನೀವು ಇದನ್ನು ಅನುಮತಿಸಲು ಬಯಸುತ್ತೀರಾ?",
-    "string-title-simple": "ಅಪ್ಲಿಕೇಶನ್ ಶಾರ್ಟ್ ಕಟ್ ಗಳನ್ನು ರಚಿಸಿ",
-    "string-ok-accesskey": "O",
-    "string-ok": "ಸರಿ",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "ರದ್ದುಮಾಡು",
-    "string-startmenu": "ಪ್ರಾರಂಭ ಮೆನು",
-    "string-yes": "ಹೌದು",
-    "string-never-allow": "ಈ ಶಾರ್ಟ್‌ಕಟ್‌ನ್ನು ಎಂದಿಗೂ ಅನುಮತಿಸಬೇಡಿ",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "ಕ್ವಿಕ್ ಲಾಂಚ್ ಬಾರ್",
-    "string-never-allow-wince": "ಎಂದಿಗೂ ಅನುಮತಿಸಬೇಡಿ",
-    "string-desktop": "ಡೆಸ್ಕ್ ಟಾಪ್",
-    "string-title-default": "Gears - ಡೆಸ್ಕ್ ಟಾಪ್ ಶಾರ್ಟ್ ಕಟ್ ರಚಿಸಿ",
-    "string-location-query": "ಈ ಕೆಳಗಿನ ಸ್ಥಳಗಳಲ್ಲಿ ಶಾರ್ಟ್ ಕಟ್ ಗಳನ್ನು ರಚಿಸಿ:"
-  },
-  "ar": {
-    "string-no": "لا",
-    "string-header-desktop": "يتطلب موقع الويب هذا إنشاء اختصار على الكمبيوتر الخاص بك. هل تريد السماح بذلك؟",
-    "string-no-accesskey": "ل",
-    "string-header-wince": "يرغب موقع الويب هذا في إنشاء اختصار في قائمة البرامج لديك. هل ترغب في السماح له بذلك؟",
-    "string-title-simple": "إنشاء اختصارات للتطبيقات",
-    "string-ok-accesskey": "م",
-    "string-ok": "موافق",
-    "string-cancel-accesskey": "غ",
-    "string-cancel": "إلغاء",
-    "string-startmenu": "القائمة ابدأ",
-    "string-yes": "نعم",
-    "string-never-allow": "عدم السماح بهذا الاختصار مطلقًا",
-    "string-yes-accesskey": "ن",
-    "string-quicklaunch": "شريط التشغيل السريع",
-    "string-never-allow-wince": "عدم السماح مطلقًا",
-    "string-desktop": "سطح المكتب",
-    "string-title-default": "Gears - إنشاء اختصار لسطح المكتب",
-    "string-location-query": "قم بإنشاء اختصارات في المواقع التالية:"
-  },
-  "ml": {
-    "string-no": "ഇല്ല",
-    "string-header-desktop": "ഈ വെബ്സൈറ്റ് നിങ്ങളുടെ കമ്പ്യൂട്ടരില് ഒരു കുറുക്കുവഴി സൃഷ്ടിക്കാന് ആവശ്യപ്പെടുന്നു. ഇതനുവദിക്കാന് നിങ്ങള് ആഗ്രഹിക്കുന്നുണ്ടോ?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "പ്രോഗ്രാമുകളുടെ പട്ടികയില്‍ ഒരു കുറുക്കുവഴി സൃഷ്ടിക്കാന്‍ ഈ വെബ്സൈറ്റ് ആവശ്യപ്പെടുന്നു. ഇതനുവദിക്കാന്‍ നിങ്ങള്‍ ആഗ്രഹിക്കുന്നുണ്ടോ?",
-    "string-title-simple": "അപ്ലിക്കേഷന്‍ കുറുക്കുവഴികള്‍ സൃഷ്ടിക്കുക",
-    "string-ok-accesskey": "O",
-    "string-ok": "ശരി",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "റദ്ദാക്കൂ",
-    "string-startmenu": "തുടങ്ങുക മെനു",
-    "string-yes": "അതെ",
-    "string-never-allow": "ഈ കുറുക്കുവഴി ഒരിക്കലും അനുവദിക്കരുത്",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "ദ്രുത ലോഞ്ച് ബാര്‍",
-    "string-never-allow-wince": "ഒരിക്കലും അനുവദിക്കരുത്",
-    "string-desktop": "ഡെസ്ക്ടോപ്",
-    "string-title-default": "Gears - ഡെസ്ക്ടോപ് കുറുക്കുവഴി സൃഷ്ടിക്കുക",
-    "string-location-query": "താഴെക്കാണുന്ന ലോക്കഷനുകളില് കുറുക്കുവഴികള് സൃഷ്ടിക്കുക"
-  },
-  "cs": {
-    "string-no": "Ne",
-    "string-header-desktop": "Tato webová stránka chce vytvořit zástupce ve vašem počítači. Chcete tuto akci povolit?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Tento web chce vytvořit zástupce v seznamu programů. Chcete tuto akci povolit?",
-    "string-title-simple": "Vytvořit zástupce aplikace",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "R",
-    "string-cancel": "Zrušit",
-    "string-startmenu": "Nabídka Start",
-    "string-yes": "Ano",
-    "string-never-allow": "Nikdy nepovolit tohoto zástupce",
-    "string-yes-accesskey": "A",
-    "string-quicklaunch": "Panel rychlého spuštění",
-    "string-never-allow-wince": "Nikdy nepovolit",
-    "string-desktop": "Plocha",
-    "string-title-default": "Gears – vytvořit zástupce na ploše",
-    "string-location-query": "Vytvořit zástupce v následujících umístěních:"
-  },
-  "et": {
-    "string-no": "Ei",
-    "string-header-desktop": "See veebilehekülg tahab teie arvutisse otseteed luua. Kas soovite seda lubada?",
-    "string-no-accesskey": "E",
-    "string-header-wince": "Veebisait soovib teie programmiloendisse luua otsetee. Kas lubate seda?",
-    "string-title-simple": "Loo rakenduse otseteed",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "T",
-    "string-cancel": "Tühista",
-    "string-startmenu": "Start-menüü",
-    "string-yes": "Jah",
-    "string-never-allow": "Ära luba seda otseteed kunagi",
-    "string-yes-accesskey": "J",
-    "string-quicklaunch": "Kiirkäivitusriba",
-    "string-never-allow-wince": "Ära luba kunagi",
-    "string-desktop": "Töölaud",
-    "string-title-default": "Gears – loo töölaua otsetee",
-    "string-location-query": "Loo otseteed järgmistesse asukohtadesse:"
-  },
-  "id": {
-    "string-no": "Tidak",
-    "string-header-desktop": "Website ini ingin membuat pintasan pada komputer Anda. Anda ingin mengizinkannya?",
-    "string-no-accesskey": "T",
-    "string-header-wince": "Situs web ini ingin membuat pintasan dalam daftar program Anda. Apakah Anda mengizinkannya?",
-    "string-title-simple": "Buat Pintasan Aplikasi",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Batalkan",
-    "string-startmenu": "Menu Mulai",
-    "string-yes": "Ya",
-    "string-never-allow": "Jangan pernah mengizinkan pintasan ini",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "Bilah luncur cepat",
-    "string-never-allow-wince": "Jangan pernah mengizinkan",
-    "string-desktop": "Desktop",
-    "string-title-default": "Gears - Buat Jalan Pintas Desktop",
-    "string-location-query": "Buat pintasan di lokasi berikut ini:"
-  },
-  "es": {
-    "string-no": "No",
-    "string-header-desktop": "Este sitio web desea crear un acceso directo en tu equipo. ¿Quieres permitirlo?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Este sitio web desea crear un acceso directo en tu lista de programas. ¿Quieres permitirlo?",
-    "string-title-simple": "Crear accesos directos de la aplicación",
-    "string-ok-accesskey": "A",
-    "string-ok": "Aceptar",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Cancelar",
-    "string-startmenu": "Menú Inicio",
-    "string-yes": "Sí",
-    "string-never-allow": "No permitir nunca este acceso directo",
-    "string-yes-accesskey": "S",
-    "string-quicklaunch": "Barra de inicio rápida",
-    "string-never-allow-wince": "No permitir nunca",
-    "string-desktop": "Escritorio",
-    "string-title-default": "Gears - Crear acceso directo en el escritorio",
-    "string-location-query": "Crear accesos directos en las siguientes ubicaciones:"
-  },
-  "en-GB": {
-    "string-no": "No",
-    "string-header-desktop": "This website wants to create a shortcut on your computer. Do you want to allow this?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "This website wants to create the shortcuts listed below in your list of programmes. Do you want to allow this?",
-    "string-title-simple": "Create Application Shortcuts",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Cancel",
-    "string-startmenu": "Start menu",
-    "string-yes": "Yes",
-    "string-never-allow": "Never allow this shortcut",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "Quick launch bar",
-    "string-never-allow-wince": "Never allow",
-    "string-desktop": "Desktop",
-    "string-title-default": "Gears - Create Desktop Shortcut",
-    "string-location-query": "Create shortcuts in the following locations:"
-  },
-  "ru": {
-    "string-no": "Нет",
-    "string-header-desktop": "Этот веб-сайт собирается создать ярлык на вашем компьютере. Разрешить?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Этот веб-сайт пытается создать ярлык в вашем списке программ. Разрешить?",
-    "string-title-simple": "Создать ярлыки для приложений",
-    "string-ok-accesskey": "O",
-    "string-ok": "ОК",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Отмена",
-    "string-startmenu": "Меню \"Пуск\"",
-    "string-yes": "Да",
-    "string-never-allow": "Никогда не разрешать создание этого ярлыка",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "Панель быстрого запуска",
-    "string-never-allow-wince": "Никогда",
-    "string-desktop": "Рабочий стол",
-    "string-title-default": "Gears — создать ярлык на рабочем столе",
-    "string-location-query": "Создать ярлыки со следующим размещением:"
-  },
-  "nl": {
-    "string-no": "Nee",
-    "string-header-desktop": "Deze website wil een snelkoppeling maken op je computer. Vind je dat goed?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Deze website wil een snelkoppeling maken in uw programmalijst. Wilt u dit toestaan?",
-    "string-title-simple": "Toepassingssnelkoppelingen maken",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Annuleren",
-    "string-startmenu": "Startmenu",
-    "string-yes": "Ja",
-    "string-never-allow": "Deze snelkoppeling nooit toestaan",
-    "string-yes-accesskey": "J",
-    "string-quicklaunch": "Werkbalk Snel starten",
-    "string-never-allow-wince": "Nooit toestaan",
-    "string-desktop": "Bureaublad",
-    "string-title-default": "Gears - Snelkoppeling op bureaublad maken",
-    "string-location-query": "Snelkoppelingen maken op de volgende locaties:"
-  },
-  "no": {
-    "string-no": "Nei",
-    "string-header-desktop": "Dette nettstedet ønsker å opprette en snarvei på datamaskinen. Vil du tillate dette?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Dette nettstedet vil opprette en snarvei i listen over programmer. Vil du tillate dette?",
-    "string-title-simple": "Opprett snarveier til programmer",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "A",
-    "string-cancel": "Avbryt",
-    "string-startmenu": "Start-meny",
-    "string-yes": "Ja",
-    "string-never-allow": "Avvis alltid denne snarveien",
-    "string-yes-accesskey": "J",
-    "string-quicklaunch": "Hurtigstartlinje",
-    "string-never-allow-wince": "Avvis alltid",
-    "string-desktop": "Skrivebord",
-    "string-title-default": "Gears – Opprett snarvei på skrivebordet",
-    "string-location-query": "Opprett snarveier på følgende plasseringer:"
-  },
-  "tr": {
-    "string-no": "Hayır",
-    "string-header-desktop": "Bu web sitesi bilgisayarınızda bir kısayol oluşturmak istiyor. Buna izin vermek istiyor musunuz?",
-    "string-no-accesskey": "H",
-    "string-header-wince": "Bu web sitesi, programlar listenizde bir kısayol oluşturmak istiyor. Buna izin vermek istiyor musunuz?",
-    "string-title-simple": "Uygulama Kısayolları Oluştur",
-    "string-ok-accesskey": "T",
-    "string-ok": "Tamam",
-    "string-cancel-accesskey": "a",
-    "string-cancel": "İptal",
-    "string-startmenu": "Başlat menüsü",
-    "string-yes": "Evet",
-    "string-never-allow": "Bu kısayola asla izin verme",
-    "string-yes-accesskey": "E",
-    "string-quicklaunch": "Hızlı başlat çubuğu",
-    "string-never-allow-wince": "Asla izin verme",
-    "string-desktop": "Masaüstü",
-    "string-title-default": "Gears - Masaüstü Kısayolu Oluştur",
-    "string-location-query": "Kısayolları aşağıdaki konumlarda oluştur:"
-  },
-  "lv": {
-    "string-no": "Nē",
-    "string-header-desktop": "Šī vietne vēlas izveidot datorā saīsni. Vai vēlaties to atļaut?",
-    "string-no-accesskey": "Nē",
-    "string-header-wince": "Šī vietne jūsu programmu sarakstā gatavojas izveidot īsceļu. Vai atļausit?",
-    "string-title-simple": "Izveidot lietojumprogrammu saīsnes",
-    "string-ok-accesskey": "O",
-    "string-ok": "Labi",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Atcelt",
-    "string-startmenu": "Izvēlne Sākt",
-    "string-yes": "Jā",
-    "string-never-allow": "Nekad neatļaut šī īsceļa izveidi",
-    "string-yes-accesskey": "Jā",
-    "string-quicklaunch": "Ātrās palaišanas josla",
-    "string-never-allow-wince": "Nekad neatļaut",
-    "string-desktop": "Datora darbvirsma",
-    "string-title-default": "Gears — darbvirsmas saīsnes izveide",
-    "string-location-query": "Izveidot saīsnes šādās vietās:"
-  },
-  "lt": {
-    "string-no": "Ne",
-    "string-header-desktop": "Ši svetainė sukurs šaukinį jūsų kompiuteryje. Ar leisti?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Ši svetainė sukurs šaukinį programų sąraše. Ar leisti?",
-    "string-title-simple": "Sukurti programos šaukinius",
-    "string-ok-accesskey": "O",
-    "string-ok": "Gerai",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Atšaukti",
-    "string-startmenu": "Pradinis meniu",
-    "string-yes": "Taip",
-    "string-never-allow": "Niekada neleisti šio šaukinio",
-    "string-yes-accesskey": "T",
-    "string-quicklaunch": "Sparčiosios paleisties juosta",
-    "string-never-allow-wince": "Niekada neleisti",
-    "string-desktop": "Darbalaukis",
-    "string-title-default": "„Gears“ – sukurti darbalaukio šaukinį",
-    "string-location-query": "Sukurti šaukinius šiose vietose:"
-  },
-  "th": {
-    "string-no": "ไม่",
-    "string-header-desktop": "เว็บไซต์นี้ต้องการสร้างทางลัดบนเดสก์ท็อปของคุณ คุณต้องการอนุญาตหรือไม่",
-    "string-no-accesskey": "ม",
-    "string-header-wince": "เว็บไซต์นี้ต้องการสร้างทางลัดที่ปรากฏในรายการโปรแกรมของคุณ คุณต้องการอนุญาตหรือไม่",
-    "string-title-simple": "สร้างทางลัดของแอปพลิเคชัน",
-    "string-ok-accesskey": "ต",
-    "string-ok": "ตกลง",
-    "string-cancel-accesskey": "ย",
-    "string-cancel": "ยกเลิก",
-    "string-startmenu": "เมนู Start",
-    "string-yes": "ใช่",
-    "string-never-allow": "ไม่อนุญาตให้สร้างทางลัดนี้",
-    "string-yes-accesskey": "ช",
-    "string-quicklaunch": "แถบ Quick Launch",
-    "string-never-allow-wince": "ไม่อนุญาต",
-    "string-desktop": "เดสก์ท็อป",
-    "string-title-default": "Gears - สร้างทางลัดบนเดสก์ท็อป",
-    "string-location-query": "สร้างทางลัดในตำแหน่งต่อไปนี้:"
-  },
-  "ro": {
-    "string-no": "Nu",
-    "string-header-desktop": "Acest site Web doreşte să creeze o comandă rapidă pe computerul dvs. Permiteţi acest lucru?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Acest site Web doreşte să creeze o comandă rapidă în lista dvs. de programe. Permiteţi acest lucru?",
-    "string-title-simple": "Creaţi comenzi rapide pentru aplicaţii",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "A",
-    "string-cancel": "Anulaţi",
-    "string-startmenu": "Meniul Start",
-    "string-yes": "Da",
-    "string-never-allow": "Nu permiteţi niciodată această comandă rapidă",
-    "string-yes-accesskey": "D",
-    "string-quicklaunch": "Bara Lansare rapidă",
-    "string-never-allow-wince": "Nu permiteţi niciodată",
-    "string-desktop": "Desktop",
-    "string-title-default": "Gears – Creaţi comandă rapidă de pe desktop",
-    "string-location-query": "Creaţi comenzi rapide în următoarele locaţii:"
-  },
-  "is": {
-    "string-no": "Nei",
-    "string-header-desktop": "Þetta vefsvæði óskar eftir að búa til flýtivísun á tölvunni hjá þér. Viltu leyfa það?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Þetta vefsvæði óskar eftir að búa til flýtivísun í forritalistanum hjá þér. Viltu leyfa það?",
-    "string-title-simple": "Útbúa flýtivísanir fyrir forrit",
-    "string-ok-accesskey": "O",
-    "string-ok": "Í lagi",
-    "string-cancel-accesskey": "H",
-    "string-cancel": "Hætta við",
-    "string-startmenu": "Upphafsvalmynd",
-    "string-yes": "Já",
-    "string-never-allow": "Aldrei heimila þessa flýtivísun",
-    "string-yes-accesskey": "J",
-    "string-quicklaunch": "Stika fyrir flýtiræsingu",
-    "string-never-allow-wince": "Leyfa aldrei",
-    "string-desktop": "Skjáborð",
-    "string-title-default": "Gears - Setja flýtivísun á skjáborð",
-    "string-location-query": "Útbúa flýtivísanir á eftirfarandi staðsetningum:"
-  },
-  "fil": {
-    "string-no": "Hindi",
-    "string-header-desktop": "Nais ng website na ito na lumikha ng isang shortcut sa iyong computer. Nais mo bang payagan ito?",
-    "string-no-accesskey": "H",
-    "string-header-wince": "Nais ng website na ito na lumikha ng isang shortcut sa iyong listahan ng mga program. Nais mo ba itong payagan?",
-    "string-title-simple": "Lumikha ng mga Shortcut ng Application",
-    "string-ok-accesskey": "K",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "I",
-    "string-cancel": "Ikansela",
-    "string-startmenu": "Start menu",
-    "string-yes": "Oo",
-    "string-never-allow": "Huwag kailanman payagan ang shortcut na ito",
-    "string-yes-accesskey": "O",
-    "string-quicklaunch": "Quick launch bar",
-    "string-never-allow-wince": "Huwag kailanman papayagan",
-    "string-desktop": "Desktop",
-    "string-title-default": "Mga Gear - Lumikha ng Shortcut sa Desktop",
-    "string-location-query": "Lumikha ng mga shortcut sa mga sumusunod na lokasyon:"
-  },
-  "ta": {
-    "string-no": "இல்லை",
-    "string-header-desktop": "இந்தத் தளம் உங்கள் கணினியில் குறுக்கு வழியை உருவாக்க விரும்புகிறது. நீங்கள் இதை அனுமதிக்க வேண்டுமா?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "உங்கள் நிரல்களின் பட்டியலில் ஒரு குறுக்குவழியை உருவாக்க இந்த வலைத்தளம் முயற்சிக்கிறது. இதனை அனுமதிக்க விரும்புகிறீர்களா?",
-    "string-title-simple": "அப்ளிகேஷன் குறுக்குவழியை உருவாக்கு",
-    "string-ok-accesskey": "O",
-    "string-ok": "சரி",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "ரத்துசெய்",
-    "string-startmenu": "ஸ்டார்ட் மெனு",
-    "string-yes": "ஆம்",
-    "string-never-allow": "இந்த குறுக்குவழியை எப்போதும் அனுமதிக்க வேண்டாம்",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "குவிக் லான்ச் பார்",
-    "string-never-allow-wince": "எப்போதும் அனுமதிக்காதே",
-    "string-desktop": "டெஸ்க்டாப்",
-    "string-title-default": "Gears - டெஸ்க்டாப் குறுக்குவழியை உருவாக்கு",
-    "string-location-query": "பின்வரும் இடத்தில் குறுக்கு வழியை உருவாக்கவும்:"
-  },
-  "fr": {
-    "string-no": "Non",
-    "string-header-desktop": "Autorisez-vous la création par ce site Web d'un raccourci sur votre ordinateur ?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Ce site Web souhaite créer un raccourci dans votre liste de programmes. Autorisez-vous cette opération ?",
-    "string-title-simple": "Créer des raccourcis d'applications",
-    "string-ok-accesskey": "K",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "U",
-    "string-cancel": "Annuler",
-    "string-startmenu": "Menu Démarrer",
-    "string-yes": "Oui",
-    "string-never-allow": "Ne jamais autoriser ce raccourci",
-    "string-yes-accesskey": "O",
-    "string-quicklaunch": "Barre de lancement rapide",
-    "string-never-allow-wince": "Ne jamais autoriser",
-    "string-desktop": "Bureau",
-    "string-title-default": "Google Gears - Créer un raccourci sur le Bureau",
-    "string-location-query": "Créer des raccourcis aux emplacements suivants :"
-  },
-  "bg": {
-    "string-no": "Не",
-    "string-header-desktop": "Прави се опит за създаване на пряк път към този уебсайт на компютъра ви. Разрешавате ли?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Този уебсайт иска да създаде пряк път в списъка ви с програми. Разрешавате ли?",
-    "string-title-simple": "Създаване на преки пътища към приложението",
-    "string-ok-accesskey": "О",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "С",
-    "string-cancel": "Отказ",
-    "string-startmenu": "Меню „Старт“",
-    "string-yes": "Да",
-    "string-never-allow": "Създаването на този пряк път не се разрешава изобщо",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "Лента за бързо стартиране",
-    "string-never-allow-wince": "Не се разрешава изобщо",
-    "string-desktop": "Работен плот",
-    "string-title-default": "Gears - Създаване на пряк път на работния плот",
-    "string-location-query": "Преки пътища да бъдат създадени на следните места:"
-  },
-  "uk": {
-    "string-no": "Ні",
-    "string-header-desktop": "Цей веб-сайт хоче створити ярлик на Вашому комп’ютері. Дозволити?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Цей веб-сайт намагається створити ярлик у списку програм. Дозволити це?",
-    "string-title-simple": "Створіть ярлики програм",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Скасувати",
-    "string-startmenu": "Меню \"Пуск\"",
-    "string-yes": "Так",
-    "string-never-allow": "Ніколи не дозволяти створювати цей ярлик",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "Панель \"Швидкий запуск\"",
-    "string-never-allow-wince": "Ніколи не дозволяти",
-    "string-desktop": "Робочий стіл",
-    "string-title-default": "Gears – Створення ярликів на робочому столі",
-    "string-location-query": "Створіть ярлики у таких розташуваннях:"
-  },
-  "hr": {
-    "string-no": "Ne",
-    "string-header-desktop": "Ova web-lokacija želi stvoriti prečac na Vašem računalu. Dopuštate li taj postupak?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Ova web-lokacija želi stvoriti prečac na Vašem popisu programa. Dopuštate li taj postupak?",
-    "string-title-simple": "Stvori prečace za aplikacije",
-    "string-ok-accesskey": "K",
-    "string-ok": "U redu",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Odustani",
-    "string-startmenu": "Izbornik Start",
-    "string-yes": "Da",
-    "string-never-allow": "Nikad ne dopuštaj ovaj prečac",
-    "string-yes-accesskey": "D",
-    "string-quicklaunch": "Traka za brzo pokretanje",
-    "string-never-allow-wince": "Ne dopuštaj",
-    "string-desktop": "Radna površina",
-    "string-title-default": "Gears – Napravi prečac na radnoj površini",
-    "string-location-query": "Stvori prečace na sljedećim mjestima:"
-  },
-  "bn": {
-    "string-no": "না",
-    "string-header-desktop": "এই ওয়েবসাইটটা আপনার কম্পিউটারে একটি শর্টকার্ট তৈরি করতে চায় ׀ আপনি কি এটার অনুমতি দিতে চান?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "এই ওয়েবসাইটটি আপনার প্রোগ্রামের তালিকাতে একটি শর্টকাট তৈরি করতে চায়৷ আপনি কি এটি মঞ্জুরি দিতে চান?",
-    "string-title-simple": "অ্যাপ্লিকেশান শর্টকার্ট তৈরি করুন",
-    "string-ok-accesskey": "O",
-    "string-ok": "ওকে",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "বাতিল",
-    "string-startmenu": "সূচনা মেনু",
-    "string-yes": "হ্যাঁ",
-    "string-never-allow": "কখনই এই শর্টকাটটির মঞ্জুরি দেবেন না",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "দ্রুত লঞ্চ দণ্ড",
-    "string-never-allow-wince": "কখনই মঞ্জুরি দেবেন না",
-    "string-desktop": "ডেস্কটপ",
-    "string-title-default": "Gears- ডেস্কটপ শর্টকাট তৈরি করুন",
-    "string-location-query": "এই যায়গাগুলিতে জন্য শর্টকার্টগুলি তৈরি করুন:"
-  },
-  "en-US": {
-    "string-no": "No",
-    "string-header-desktop": "This website wants to create a shortcut on your computer. Do you want to allow this?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "This website wants to create a shortcut in your list of programs. Do you want to allow this?",
-    "string-title-simple": "Create Application Shortcuts",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Cancel",
-    "string-startmenu": "Start menu",
-    "string-yes": "Yes",
-    "string-never-allow": "Never allow this shortcut",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "Quick launch bar",
-    "string-never-allow-wince": "Never allow",
-    "string-desktop": "Desktop",
-    "string-title-default": "Gears - Create Desktop Shortcut",
-    "string-location-query": "Create shortcuts in the following locations:"
-  },
-  "da": {
-    "string-no": "Nej",
-    "string-header-desktop": "Dette websted ønsker at oprette en genvej på din computer. Vil du tillade det?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Dette websted ønsker at oprette en genvej i din liste med programmer. Vil du tillade det?",
-    "string-title-simple": "Opret genveje til programmer",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "A",
-    "string-cancel": "Annuller",
-    "string-startmenu": "Startmenu",
-    "string-yes": "Ja",
-    "string-never-allow": "Tillad aldrig denne genvej",
-    "string-yes-accesskey": "J",
-    "string-quicklaunch": "Værktøjslinjen Hurtig start",
-    "string-never-allow-wince": "Giv aldrig tilladelse",
-    "string-desktop": "Skrivebord",
-    "string-title-default": "Gears – opret genvej på skrivebordet",
-    "string-location-query": "Opret genveje følgende steder:"
-  },
-  "fa": {
-    "string-no": "خیر",
-    "string-header-desktop": "این وب سایت می خواهد میانبری در رایانه شما ایجاد کند. آیا اجازه می دهید؟",
-    "string-no-accesskey": "N",
-    "string-header-wince": "این وب سایت می خواهد یك میانبر در ليست برنامه های شما ایجاد کند. آیا اجازه می دهید؟",
-    "string-title-simple": "ايجاد ميانبرهای برنامه",
-    "string-ok-accesskey": "O",
-    "string-ok": "تأیید",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "لغو",
-    "string-startmenu": "منوی شروع",
-    "string-yes": "بله",
-    "string-never-allow": "هرگز اجازه ندهید این میانبر ایجاد شود.",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "ميله راه اندازی سريع",
-    "string-never-allow-wince": "هرگز اجازه داده نشود",
-    "string-desktop": "دسک تاپ",
-    "string-title-default": "Gears- ایجاد میانبر در دسک تاپ",
-    "string-location-query": "ایجاد میانبر در محل های زیر:"
-  },
-  "hi": {
-    "string-no": "नहीं",
-    "string-header-desktop": "यह वेबसाइट आपके कंप्यूटर पर एक शॉर्टकट बनाना चाहती है. क्या आप इसकी अनुमति देना चाहते हैं?",
-    "string-no-accesskey": "नहीं",
-    "string-header-wince": "यह वेबसाइट आपके प्रोग्रामों की सूची में शॉर्टकट बनाना चाहती है. क्या आप इसकी अनुमति देना चाहते हैं?",
-    "string-title-simple": "अनुप्रयोग शार्टकट बनाएँ",
-    "string-ok-accesskey": "ठीक",
-    "string-ok": "ठीक",
-    "string-cancel-accesskey": "रद्द करें",
-    "string-cancel": "रद्द करें",
-    "string-startmenu": "प्रारंभ मेनू",
-    "string-yes": "हाँ",
-    "string-never-allow": "इस शॉर्टकट को कभी अनुमति न दें",
-    "string-yes-accesskey": "हाँ",
-    "string-quicklaunch": "त्वरित लॉन्च पट्टिका",
-    "string-never-allow-wince": "कभी अनुमति न दें",
-    "string-desktop": "डेस्कटॉप",
-    "string-title-default": "Gears - डेस्कटॉप शॉर्टकट बनाएँ",
-    "string-location-query": "निम्न स्थानों पर शॉर्टकट बनाएँ:"
-  },
-  "pt-BR": {
-    "string-no": "Não",
-    "string-header-desktop": "Este site deseja criar um atalho no seu computador. Gostaria de permitir isso?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Este site deseja criar um atalho na sua lista de programas. Deseja permitir isso?",
-    "string-title-simple": "Criar atalhos do aplicativo",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Cancelar",
-    "string-startmenu": "Menu Iniciar",
-    "string-yes": "Sim",
-    "string-never-allow": "Nunca permitir este atalho",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "Barra de inicialização rápida",
-    "string-never-allow-wince": "Nunca permitir",
-    "string-desktop": "Área de trabalho",
-    "string-title-default": "Gears - Criar atalho na área de trabalho",
-    "string-location-query": "Criar atalhos nos seguintes locais:"
-  },
-  "fi": {
-    "string-no": "Ei",
-    "string-header-desktop": "Tämä sivusto haluaa luoda pikakuvakkeen tietokoneellesi. Sallitko pikakuvakkeen luomisen?",
-    "string-no-accesskey": "E",
-    "string-header-wince": "Tämä sivusto haluaa luoda pikakuvakkeen ohjelmaluetteloosi. Sallitko pikakuvakkeen luomisen?",
-    "string-title-simple": "Luo sovelluksista pikakuvakkeita",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "P",
-    "string-cancel": "Peruuta",
-    "string-startmenu": "Aloitusvalikko",
-    "string-yes": "Kyllä",
-    "string-never-allow": "Älä koskaan salli tätä pikakuvaketta",
-    "string-yes-accesskey": "K",
-    "string-quicklaunch": "Pikakäynnistyspalkki",
-    "string-never-allow-wince": "Älä koskaan salli",
-    "string-desktop": "Työpöytä",
-    "string-title-default": "Gears - Luo pikakuvake työpöydälle",
-    "string-location-query": "Luo pikakuvakkeet seuraaviin kohteisiin:"
-  },
-  "hu": {
-    "string-no": "Nem",
-    "string-header-desktop": "Ez a webhely parancsikont szeretne létrehozni a számítógépen. Engedélyezi ezt?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Ez a webhely egy parancsikont kíván létrehozni a programlistában. Engedélyezi ezt?",
-    "string-title-simple": "Alkalmazásindító parancsikonok létrehozása",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "M",
-    "string-cancel": "Mégse",
-    "string-startmenu": "Start menü",
-    "string-yes": "Igen",
-    "string-never-allow": "Soha ne engedélyezze ezt a parancsikont",
-    "string-yes-accesskey": "I",
-    "string-quicklaunch": "Gyorsindítás eszköztár",
-    "string-never-allow-wince": "Soha ne engedélyezze",
-    "string-desktop": "Asztal",
-    "string-title-default": "Szinkron - Asztali parancsikon létrehozása",
-    "string-location-query": "Parancsikonok létrehozása a következő helyeken:"
-  },
-  "ja": {
-    "string-no": "いいえ",
-    "string-header-desktop": "デスクトップにこのサイトのショートカットが作成されます。許可しますか?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "プログラム一覧にこのサイトのショートカットが作成されます。許可しますか?",
-    "string-title-simple": "アプリケーション ショートカットを作成",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "キャンセル",
-    "string-startmenu": "スタート メニュー",
-    "string-yes": "はい",
-    "string-never-allow": "このショートカットを常に拒否する",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "クイック起動バー",
-    "string-never-allow-wince": "許可しない",
-    "string-desktop": "デスクトップ",
-    "string-title-default": "Gears - デスクトップ ショートカットを作成",
-    "string-location-query": "ショートカットを作成する場所"
-  },
-  "he": {
-    "string-no": "לא",
-    "string-header-desktop": "אתר אינטרנט זה רוצה ליצור קיצור דרך במחשב שלך. האם ברצונך לאפשר זאת?",
-    "string-no-accesskey": "לא",
-    "string-header-wince": "אתר אינטרנט זה מעוניין ליצור קיצור דרך ברשימת התוכניות שלך. האם ברצונך לאפשר זאת?",
-    "string-title-simple": "צור קיצורי דרך ליישומים",
-    "string-ok-accesskey": "אישור",
-    "string-ok": "אישור",
-    "string-cancel-accesskey": "ביטול",
-    "string-cancel": "ביטול",
-    "string-startmenu": "תפריט 'התחל'",
-    "string-yes": "כן",
-    "string-never-allow": "לעולם אל תאפשר קיצור דרך זה",
-    "string-yes-accesskey": "כן",
-    "string-quicklaunch": "סרגל הפעלה מהירה",
-    "string-never-allow-wince": "לעולם אל תאפשר",
-    "string-desktop": "שולחן עבודה",
-    "string-title-default": "Gears - צור קיצור דרך בשולחן העבודה",
-    "string-location-query": "צור קיצורי דרך במיקומים הבאים:"
-  },
-  "te": {
-    "string-no": "వద్దు",
-    "string-header-desktop": "ఈ వెబ్ సైట్ మీ కమ్ప్యుటర్ పైన షార్ట్ కట్స్ సృష్టించాలని అనుకుంటుంది . ఇది మీరు కొనసాగించాలని అనుకుంటున్నారా?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "ఈ వెబ్‌సైట్ మీ ప్రోగ్రామ్‌ల జాబితాలో ఒక సత్వర మార్గాన్ని సృష్టించదలిచింది. మీరు దీనిని అనుమతించదలిచారా?",
-    "string-title-simple": "అప్ప్లికేషన్ల షార్ట్కట్లు సృష్టించు",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "రద్దు చెయ్యి",
-    "string-startmenu": "స్టార్ట్ మెన్యు",
-    "string-yes": "అవును",
-    "string-never-allow": "ఈ సత్వర మార్గాన్ని ఎప్పుడూ అనుమతించవద్దు",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "శీఘ్ర లాంచ్ బార్",
-    "string-never-allow-wince": "ఎప్పుడూ అనుమతించవద్దు",
-    "string-desktop": "డెస్క్ టాప్",
-    "string-title-default": "Gears -డెస్క్ టాప్ షార్ట్ కట్ని సృష్టించు",
-    "string-location-query": "ఈ లోకేషన్స్ లో షార్ట్ కట్స్ సృష్టించండి:"
-  },
-  "pt-PT": {
-    "string-no": "Não",
-    "string-header-desktop": "Este Web site pretende criar um atalho no seu computador. Pretende permitir esta acção?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Este Web site pretende criar um atalho na sua lista de programas. Pretende permitir esta acção?",
-    "string-title-simple": "Criar atalhos para as aplicações",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Cancelar",
-    "string-startmenu": "Menu Iniciar",
-    "string-yes": "Sim",
-    "string-never-allow": "Nunca permitir este atalho",
-    "string-yes-accesskey": "S",
-    "string-quicklaunch": "Barra de iniciação rápida",
-    "string-never-allow-wince": "Nunca permitir",
-    "string-desktop": "Ambiente de trabalho",
-    "string-title-default": "Gears - Criar atalho no ambiente de trabalho",
-    "string-location-query": "Criar atalhos nas seguintes localizações:"
-  },
-  "sr": {
-    "string-no": "Не",
-    "string-header-desktop": "Овај веб сајт жели да направи пречицу на вашем рачунару. Да ли желите да то дозволите?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Овај веб сајт жели да направи пречицу на листи програма. Да ли желите да то дозволите?",
-    "string-title-simple": "Креирај пречице апликација",
-    "string-ok-accesskey": "P",
-    "string-ok": "Потврди",
-    "string-cancel-accesskey": "О",
-    "string-cancel": "Откажи",
-    "string-startmenu": "Старт мени",
-    "string-yes": "Да",
-    "string-never-allow": "Никада не дозволи ову пречицу",
-    "string-yes-accesskey": "D",
-    "string-quicklaunch": "Трака за брзо покретање",
-    "string-never-allow-wince": "Никада не дозволи",
-    "string-desktop": "Радна површина",
-    "string-title-default": "Gears - направи пречицу на радној површини",
-    "string-location-query": "Hаправи пречице на следећим локацијама:"
-  },
-  "ko": {
-    "string-no": "아니요",
-    "string-header-desktop": "웹사이트에서 사용자 컴퓨터에 바로가기를 만들려고 합니다. 허용하시겠습니까?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "웹사이트에서 프로그램 목록에 바로가기를 만들려고 합니다. 바로가기를 만드시겠습니까?",
-    "string-title-simple": "애플리케이션 바로가기 만들기",
-    "string-ok-accesskey": "O",
-    "string-ok": "확인",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "취소",
-    "string-startmenu": "시작 메뉴",
-    "string-yes": "예",
-    "string-never-allow": "바로가기를 허용하지 않음",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "빠른실행 표시줄",
-    "string-never-allow-wince": "허용 안함",
-    "string-desktop": "바탕화면",
-    "string-title-default": "Gears - 바탕화면 바로가기 만들기",
-    "string-location-query": "바로가기 생성 위치:"
-  },
-  "sv": {
-    "string-no": "Nej",
-    "string-header-desktop": "Webbplatsen försöker skapa en genväg i datorn. Vill du tillåta det?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Den här webbplatsen vill skapa en genväg i din programlista. Vill du tillåta det?",
-    "string-title-simple": "Skapa programgenvägar",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "A",
-    "string-cancel": "Avbryt",
-    "string-startmenu": "Start-meny",
-    "string-yes": "Ja",
-    "string-never-allow": "Tillåt aldrig den här genvägen",
-    "string-yes-accesskey": "J",
-    "string-quicklaunch": "Fältet Snabbstart",
-    "string-never-allow-wince": "Tillåt aldrig",
-    "string-desktop": "Skrivbord",
-    "string-title-default": "Gears - Skapa genväg på skrivbordet",
-    "string-location-query": "Skapa genvägar på följande platser:"
-  },
-  "ur": {
-    "string-no": "نہیں",
-    "string-header-desktop": "یہ ویب سائٹ آپ کے کمپیوٹر پر ایک شارٹ کٹ بنانا چاہتی ہے۔ کیا آپ اس کی اجازت دیں گے؟",
-    "string-no-accesskey": "نہیں",
-    "string-header-wince": "یہ ویب سائٹ آپ کے پروگرامز کی فہرست میں درج ذیل شارٹ کٹ بنانا چاہتی ہے۔ کیا آپ اس کی اجازت دیں گے؟",
-    "string-title-simple": "اطلاق کا شارٹ کٹ بنائیں",
-    "string-ok-accesskey": "O",
-    "string-ok": "ٹھیک ہے",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "منسوخ",
-    "string-startmenu": "اسٹارٹ مینو",
-    "string-yes": "ہاں",
-    "string-never-allow": "کبھی بھی اس شارٹ کٹ کی اجازت نہ دیں۔",
-    "string-yes-accesskey": "ہاں",
-    "string-quicklaunch": "فوری شروع کرنے کا بار",
-    "string-never-allow-wince": "کبھی بھی اجازت نہ دیں",
-    "string-desktop": "ڈیسک ٹاپ",
-    "string-title-default": "گیئرز - ڈیسک ٹاپ شارٹ کٹ بنائیں",
-    "string-location-query": "درج ذیل مقامات پر شارٹ کٹ بنائیں:"
-  },
-  "sk": {
-    "string-no": "Nie",
-    "string-header-desktop": "Táto webová lokalita chce vytvoriť odkaz v počítači. Chcete to povoliť?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Táto webová lokalita chce vytvoriť odkaz v zozname programov. Chcete to povoliť?",
-    "string-title-simple": "Vytvorte odkazy na aplikácie",
-    "string-ok-accesskey": "K",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "R",
-    "string-cancel": "Zrušiť",
-    "string-startmenu": "Ponuka Štart",
-    "string-yes": "Áno",
-    "string-never-allow": "Nikdy nepovoliť tento odkaz",
-    "string-yes-accesskey": "O",
-    "string-quicklaunch": "Panel s nástrojmi Rýchly prístup",
-    "string-never-allow-wince": "Nikdy nepovoliť",
-    "string-desktop": "Pracovná plocha",
-    "string-title-default": "Gears - Vytvoriť odkaz na pracovnej ploche",
-    "string-location-query": "Vytvoriť odkazy na nasledujúcich miestach:"
-  },
-  "zh-CN": {
-    "string-no": "否",
-    "string-header-desktop": "该网站要在您的计算机上创建快捷键。 是否允许该操作?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "该网站要在您的程序列表中创建快捷方式。 是否允许该操作?",
-    "string-title-simple": "创建应用程序快捷键",
-    "string-ok-accesskey": "O",
-    "string-ok": "确定",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "取消",
-    "string-startmenu": "开始菜单",
-    "string-yes": "是",
-    "string-never-allow": "永不允许该快捷方式",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "快速启动栏",
-    "string-never-allow-wince": "永不允许",
-    "string-desktop": "桌面",
-    "string-title-default": "Gears - 创建桌面快捷方式",
-    "string-location-query": "在以下位置创建快捷键:"
-  },
-  "de": {
-    "string-no": "Nein",
-    "string-header-desktop": "Für diese Website soll eine Verknüpfung auf Ihrem Computer erstellt werden. Möchten Sie dies zulassen?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Für diese Website soll eine Verknüpfung in Ihrer Programmliste erstellt werden. Möchten Sie dies zulassen?",
-    "string-title-simple": "Anwendungsverknüpfungen erstellen",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "A",
-    "string-cancel": "Abbrechen",
-    "string-startmenu": "Startmenü",
-    "string-yes": "Ja",
-    "string-never-allow": "Diese Verknüpfung nie zulassen",
-    "string-yes-accesskey": "J",
-    "string-quicklaunch": "Schnellstartleiste",
-    "string-never-allow-wince": "Nie zulassen",
-    "string-desktop": "Desktop",
-    "string-title-default": "Gears - Desktopverknüpfung erstellen",
-    "string-location-query": "Verknüpfungen unter folgenden Speicherpfaden erstellen:"
-  },
-  "pl": {
-    "string-no": "Nie",
-    "string-header-desktop": "Ta witryna internetowa chce utworzyć skrót na Twoim komputerze. Czy chcesz na to zezwolić?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "Ta witryna chce utworzyć skrót na Twojej liście programów. Czy chcesz na to zezwolić?",
-    "string-title-simple": "Utwórz skróty do aplikacji",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "A",
-    "string-cancel": "Anuluj",
-    "string-startmenu": "Menu Start",
-    "string-yes": "Tak",
-    "string-never-allow": "Nigdy nie zezwalaj na ten skrót",
-    "string-yes-accesskey": "T",
-    "string-quicklaunch": "Pasek szybkiego uruchamiania",
-    "string-never-allow-wince": "Nigdy nie zezwalaj",
-    "string-desktop": "Pulpit",
-    "string-title-default": "Gears — utwórz skrót na pulpicie",
-    "string-location-query": "Utwórz skróty w następujących lokalizacjach:"
-  },
-  "ms": {
-    "string-no": "Tidak",
-    "string-header-desktop": "Laman web ini mahu membuat pintasan pada komputer anda. Adakah anda membenarkannya?",
-    "string-no-accesskey": "T",
-    "string-header-wince": "Laman web ini mahu membuat pintasan dalam senarai atur cara anda. Adakah anda hendak membenarkannya?",
-    "string-title-simple": "Buat Pintasan Aplikasi",
-    "string-ok-accesskey": "O",
-    "string-ok": "OK",
-    "string-cancel-accesskey": "B",
-    "string-cancel": "Batal",
-    "string-startmenu": "Menu mula",
-    "string-yes": "Ya",
-    "string-never-allow": "Jangan sekali-kali benarkan pintasan ini",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "Bar lancar cepat",
-    "string-never-allow-wince": "Jangan sekali-kali benarkan",
-    "string-desktop": "Desktop",
-    "string-title-default": "Gear - Buat Pintasan Desktop",
-    "string-location-query": "Buat pintasan dalam lokasi yang berikut:"
-  },
-  "sl": {
-    "string-no": "Ne",
-    "string-header-desktop": "To spletno mesto želi v vašem računalniku ustvariti bližnjico. Ali želite to dejanje dovoliti?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "To spletno mesto skuša na seznamu programov ustvariti bližnjico. Ali želite to dejanje dovoliti?",
-    "string-title-simple": "Ustvarite bližnjice za programe",
-    "string-ok-accesskey": "O",
-    "string-ok": "V redu",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "Prekliči",
-    "string-startmenu": "Meni »Start«",
-    "string-yes": "Da",
-    "string-never-allow": "Nikoli ne dovoli te bližnjice",
-    "string-yes-accesskey": "D",
-    "string-quicklaunch": "Vrstica za hitri zagon",
-    "string-never-allow-wince": "Nikoli ne dovoli",
-    "string-desktop": "Namizje",
-    "string-title-default": "Gears – Ustvarjanje bližnjice na namizju",
-    "string-location-query": "Ustvari bližnjice na teh mestih:"
-  },
-  "mr": {
-    "string-no": "नाही",
-    "string-header-desktop": "ही वेबसाइट आपल्या संगणकावर शॉर्टकट तयार करू इच्छिते. यास आपली अनुमती आहे?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "ही वेबसाइट आपल्या प्रोग्राम्स सूचीमध्ये एक शॉर्टकट तयार करू इच्छित आहे. आपण यास परवानगी देऊ इच्छिता काय?",
-    "string-title-simple": "एप्लिकेशन शॉर्टकट तयार करा",
-    "string-ok-accesskey": "O",
-    "string-ok": "ओके",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "रद्द करा",
-    "string-startmenu": "स्टार्ट मेनू",
-    "string-yes": "होय",
-    "string-never-allow": "या शॉर्टकटला कधीही परवानगी देऊ नये",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "क्विक लाँच बार",
-    "string-never-allow-wince": "कधीही परवानगी देऊ नये",
-    "string-desktop": "डेस्कटॉप",
-    "string-title-default": "Gears - डेस्कटॉप शॉर्टकट तयार करा",
-    "string-location-query": "खालील स्थानांवर शॉर्टकट तयार करा:"
-  },
-  "or": {
-    "string-no": "ନା",
-    "string-header-desktop": "ଏହି ୱେବସାଇଟ୍ ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟରରେ ଏକ ସର୍ଟକଟ ସୃଷ୍ଟି କରିବାକୁ ଚାହୁଁଛି ଆପଣ ଏହାକୁ ଅନୁମତି ଦେବାକୁ ଚାହୁଁଛନ୍ତି ?",
-    "string-no-accesskey": "N",
-    "string-header-wince": "ଏହି ୱେବସାଇଟ୍ ଆପଣଙ୍କର ପ୍ରୋଗ୍ରାମ୍ ତାଲିକାରେ ଏକ ସର୍ଟକଟ୍ ସୃଷ୍ଟି କରିବାକୁ ଚାହୁଁଛି । ଆପଣ ଏହାକୁ ଅନୁମତି କରିବାକୁ ଚାହୁଁଛନ୍ତି କି?",
-    "string-title-simple": "ଅନୁପ୍ରୟୋଗ ସର୍ଟକଟଗୁଡିକ ସୃଷ୍ଟି କରନ୍ତୁ",
-    "string-ok-accesskey": "O",
-    "string-ok": "ଓକେ",
-    "string-cancel-accesskey": "C",
-    "string-cancel": "ବାତିଲ୍",
-    "string-startmenu": "ଷ୍ଟାର୍ଟ ମେନୁ",
-    "string-yes": "ହଁ",
-    "string-never-allow": "ଏହି ସର୍ଟକଟ୍ କେବେ ମଧ୍ୟ ଅନୁମତି କରନ୍ତୁ ନାହିଁ",
-    "string-yes-accesskey": "Y",
-    "string-quicklaunch": "କୁଇକ୍ ଲଞ୍ଚ୍ ବାର୍",
-    "string-never-allow-wince": "କେବେ ମଧ୍ୟ ଅନୁମତି କରନ୍ତୁ ନାହିଁ",
-    "string-desktop": "ଡେସ୍କଟପ୍",
-    "string-title-default": "Gears - ଡେସ୍କଟପ୍ ସର୍ଟକଟ୍ ସୃଷ୍ଟି କରନ୍ତୁ",
-    "string-location-query": "ନିମ୍ନ ଅବସ୍ଥାନ ଗୁଡିକରେ ସର୍ଟକଟ ସୃଷ୍ଟି କରନ୍ତୁ:"
-  }
-};
-
-// Insert all localized strings for the specified locale into the div or span
-// matching the id.
-function loadI18nStrings(locale) {
-  var rtl_languages = ['he', 'ar', 'fa', 'ur'];
-
-  if (!locale) {
-    locale = 'en-US';
-  } else {
-    if (!localized_strings[locale]) {
-      // For xx-YY locales, determine what the base locale is.
-      var base_locale = locale.split('-')[0];
-
-      if (localized_strings[base_locale]) {
-        locale = base_locale;
-      } else {
-        locale = 'en-US';
-      }
-    }
-  }
-
-  var strings = localized_strings[locale];
-
-  // If the specified locale is an right to left language, change the direction
-  // of the page.
-  for (index in rtl_languages) {
-    if (locale == rtl_languages[index]) {
-      document.body.dir = "rtl";
-      break;
-    }
-  }
-
-  // Copy each string to the proper UI element, if it exists.
-  for (name in strings) {
-    if (name == 'string-html-title') {
-      if (!browser.ie_mobile) {
-        // IE Mobile dialogs don't have a title bar.
-        // Furthermore, document.title is undefined in IE Mobile on WinMo 5.
-        // It's also impossible to add properties to the window object.
-        // (see http://code.google.com/apis/gears/mobile.html)
-        document.title = strings[name];
-      }
-    } else {
-      var element = dom.getElementById(name);
-      if (element) {
-        element.innerHTML = strings[name];
-      }
-    }
-  }
-}
-
-
-</script>
-
-<script>
-  var debug = false;
-  var dialogMinHeight = 200;
-
-  // We currently only support custom locations for desktop windows.
-  var locationsEnabled = browser.windows && !browser.ie_mobile;
-
-  var args;
-
-  if (debug) {
-    // Handy for debugging layout:
-    if (browser.ie_mobile) {
-      window.pie_dialog = new Object();
-      window.pie_dialog.IsSmartPhone = function() { return false; };
-      window.pie_dialog.SetCancelButton = function() {};
-      window.pie_dialog.SetButton = function() {};
-      window.pie_dialog.SetButtonEnabled = function() {};
-      window.pie_dialog.SetScriptContext = function() {};
-      window.pie_dialog.ResizeDialog = function() {};
-    }
-
-    args = {
-      locale: "en-US",
-      style: "simple",
-      name: "My Application",
-      link: "http://www.google.com/",
-      description: "This application does things does things!",
-      // description: "This application does things does things that do things that do things that do things that do things that do things that do things that do things that do things that do things that do things that do things that do things that do things that do things that do things that do things that do things that do things.",
-      icon16x16: "http://google-gears.googlecode.com/svn/trunk/gears/test/manual/shortcuts/16.png",
-      icon32x32: "http://google-gears.googlecode.com/svn/trunk/gears/test/manual/shortcuts/32.png",
-      icon48x48: "http://google-gears.googlecode.com/svn/trunk/gears/test/manual/shortcuts/48.png",
-      icon128x128: "http://google-gears.googlecode.com/svn/trunk/gears/test/manual/shortcuts/128.png"
-    };
-  } else {
-    args = getArguments();
-  }
-
-  loadI18nStrings(args.locale);
-
-  initDialog();
-  initLayout();
-  initShortcuts(args);
-  resizeDialogToFitContent(dialogMinHeight);
-
-  function initLayout() {
-    if (locationsEnabled) {
-      dom.getElementById("locations").style.display = "block";
-    }
-    
-    // Set up the rest of the layout. The details vary based on the layout style
-    // and the user agent (currently "simple" style only supported by desktop
-    // Gears).
-    if (isDefined(typeof args.style) && args.style == "simple") {
-      initSimpleStyle();
-    } else if (browser.ie_mobile) {
-      initPieStyle();
-    } else {
-      initDefaultStyle();
-    }
-
-    resetConfirmDisabledState();
-  }
-
-  function initSimpleStyle() {
-    document.title =
-        dom.getTextContent(dom.getElementById("string-title-simple"));
-    dom.getElementById("icon").parentNode.style.display = "none";
-    dom.getElementById("header").style.display = "none";
-    dom.getElementById("head").style.paddingBottom = "0";
-    dom.getElementById("deny-permanently-link").style.display = "none";
-    setButtonLabel("string-ok", "allow-button", "string-ok-accesskey");
-    setButtonLabel("string-cancel", "deny-button", "string-cancel-accesskey");
-
-    // Also check the desktop checkbox by default
-    dom.getElementById("location-desktop").checked = true;    
-
-    // Turn on the buttons. They are turned off by default for CustomButton, but
-    // simple style does not use custom button.
-    var buttons = document.getElementsByTagName("button");
-    for (var i = 0, button; button = buttons[i]; i++) {
-      button.className = "";
-      button.style.visibility = "visible";
-    }
-  }
-
-  function initPieStyle() {
-    // For PIE, we don't set a window title.
-    setElementContents("string-header-wince", "header");
-
-    if (window.pie_dialog.IsSmartPhone()) {
-      // On softkey-only devices we only use a regular link to trigger
-      // the "never-allow" action. For "allow" and "deny" we use only
-      // the softkey lables.
-      setElementContents("string-never-allow-wince", "deny-permanently-link");
-    } else {
-      // For touchscreen devices, we use buttons for all actions. Additionally,
-      // we also set the sofkey labels.
-      setButtonLabel("string-yes", "allow-button", "string-yes-accesskey");
-      setButtonLabel("string-no", "deny-button", "string-no-accesskey");
-      setButtonLabel("string-never-allow-wince", "deny-permanently-button");
-    }
-    // Set the softkey labels for both softkey-only and touchscreen UIs.
-    window.pie_dialog.SetButton(dom.getElementById("string-yes").innerText,
-                                "allowShortcutsTemporarily();");
-    window.pie_dialog.SetCancelButton(dom.getElementById("string-no").innerText);
-    // On PIE, the allow button is disabled by default.
-    // Why not just remove the disabled attribute?
-    // Because on WinCE, we need to also call
-    // window.pie_dialog.SetButtonEnabled(true); , which enables the right
-    // softkey button.
-    enableButton(dom.getElementById("allow-button"));
-  }
-
-  function initDefaultStyle() {
-    document.title =
-      dom.getTextContent(dom.getElementById("string-title-default"));
-    setElementContents("string-header-desktop", "header");
-    setButtonLabel("string-yes", "allow-button", "string-yes-accesskey");
-    setButtonLabel("string-no", "deny-button", "string-no-accesskey");
-    setElementContents("string-never-allow", "deny-permanently-link");
-
-    CustomButton.initializeAll();
-  }
-  
-  /**
-   * Populate the shortcuts UI based on the data passed in from C++.
-   */
-  function initShortcuts(shortcutData) {
-    var iconElement = dom.getElementById("shortcut-icon");
-    var nameElement = dom.getElementById("shortcut-name");
-    var descriptionElement = dom.getElementById("shortcut-description");
-    
-    loadImage(iconElement, pickIconToRender(shortcutData));
-    dom.setTextContent(nameElement, shortcutData.name);
-
-    if (isDefined(typeof shortcutData.description) &&
-        shortcutData.description) {
-      dom.setTextContent(descriptionElement, shortcutData.description);
-      descriptionElement.style.display = "block";
-    }
-
-    preloadIcons(shortcutData);
-  }
-
-  /**
-   * Picks the best icon to render in the UI.
-   */
-  function pickIconToRender(shortcutData) {
-    if (shortcutData.icon32x32) { // ideal size
-      return shortcutData.icon32x32;
-    } else if (shortcutData.icon48x48) { // better to pick one that is too big
-      return shortcutData.icon48x48;
-    } else if (shortcutData.icon128x128) {
-      return shortcutData.icon128x128;
-    } else {
-      return shortcutData.icon16x16; // pick too small icon last
-    }
-  }
-
-  /**
-   * Preloads the icons for a shortcut so that later when they are requested
-   * from C++, they will be fast.
-   */
-  function preloadIcons(shortcutData) {
-    for (var prop in shortcutData) {
-      if (prop.indexOf("icon") == 0) {
-        var img = new Image();
-        img.src = shortcutData[prop];
-      }
-    }
-  }
-
-  /**
-   * Sets the confirm button's disabled state depending on whether there is
-   * at least one checkbox checked.
-   */  
-  function resetConfirmDisabledState() {
-    if (!locationsEnabled) {
-      return;
-    }
-    
-    var allowButton = dom.getElementById("allow-button");
-    var checkboxes =
-        dom.getElementById("locations").getElementsByTagName("input");
-
-    for (var i = 0, checkbox; checkbox = checkboxes[i]; i++) {
-      if (checkbox.checked) {
-        enableButton(allowButton);
-        return;
-      }
-    }
-    
-    disableButton(allowButton);
-  }
-
-  /**
-   * Called when the user clicks the allow button.
-   */
-  function allowShortcutsTemporarily() {
-    var result = {
-      allow: true,
-      locations: 0
-    };
-    
-    if (locationsEnabled) {
-      var checkboxes =
-          dom.getElementById("locations").getElementsByTagName("input");
-      for (var i = 0, checkbox; checkbox = checkboxes[i]; i++) {
-        if (checkbox.checked) {
-          result.locations |= parseInt(checkbox.value);
-        }
-      }
-    }
-    saveAndClose(result);
-  }
-
-  /**
-   * Called when the user clicks the no button.
-   */
-  function denyShortcutsTemporarily() {
-    saveAndClose(null); // default behavior is to deny all
-  }
-  
-  /**
-   * Called when the user clicks the "Never allow this shortcut" link.
-   */
-  function denyShortcutPermanently() {
-    saveAndClose({
-      allow: false
-    });
-  }
-
-  /**
-   * Set the contents of the element specified by destID from from that of the
-   * element specified by sourceID.
-   */
-  function setElementContents(sourceID, destID) {
-    var sourceElem = dom.getElementById(sourceID);
-    var destElem = dom.getElementById(destID);
-    if (isDefined(typeof sourceElem) && isDefined(typeof destElem)) {
-      destElem.innerHTML = sourceElem.innerHTML;
-    }
-  }
-</script>
-</html>
diff --git a/assets/plugins/gears-0.5.2.0/dummy b/assets/plugins/gears-0.5.2.0/dummy
new file mode 100644 (file)
index 0000000..50f9ab9
--- /dev/null
@@ -0,0 +1 @@
+This file is used to ensure this subdirectory is created.
index 1d0ba0e..4a1aff2 100644 (file)
Binary files a/assets/plugins/gears.so and b/assets/plugins/gears.so differ
diff --git a/res/drawable/dialog_frame.9.png b/res/drawable/dialog_frame.9.png
deleted file mode 100644 (file)
index 3d41e2f..0000000
Binary files a/res/drawable/dialog_frame.9.png and /dev/null differ
diff --git a/res/drawable/gears.png b/res/drawable/gears.png
new file mode 100644 (file)
index 0000000..bd0fb08
Binary files /dev/null and b/res/drawable/gears.png differ
diff --git a/res/drawable/gears_back.png b/res/drawable/gears_back.png
new file mode 100755 (executable)
index 0000000..5ce50eb
Binary files /dev/null and b/res/drawable/gears_back.png differ
diff --git a/res/drawable/gears_button.xml b/res/drawable/gears_button.xml
new file mode 100755 (executable)
index 0000000..ec8cebb
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2008, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+  <item android:state_focused="true" android:state_pressed="false"
+    android:state_enabled="true"
+    android:drawable="@drawable/gears_button_selected" />
+  <item android:state_enabled="true" android:state_pressed="true"
+    android:drawable="@drawable/gears_button_pressed" />
+  <item android:state_enabled="true" android:state_focused="false"
+    android:state_pressed="false"
+    android:drawable="@drawable/gears_button_default" />
+  <item android:drawable="@drawable/gears_button_default" />
+</selector>
diff --git a/res/drawable/gears_button_default.9.png b/res/drawable/gears_button_default.9.png
new file mode 100644 (file)
index 0000000..3b1d065
Binary files /dev/null and b/res/drawable/gears_button_default.9.png differ
diff --git a/res/drawable/gears_button_pressed.9.png b/res/drawable/gears_button_pressed.9.png
new file mode 100644 (file)
index 0000000..7b56794
Binary files /dev/null and b/res/drawable/gears_button_pressed.9.png differ
diff --git a/res/drawable/gears_button_selected.9.png b/res/drawable/gears_button_selected.9.png
new file mode 100644 (file)
index 0000000..e1d5608
Binary files /dev/null and b/res/drawable/gears_button_selected.9.png differ
diff --git a/res/drawable/gears_file_audio.png b/res/drawable/gears_file_audio.png
new file mode 100755 (executable)
index 0000000..ce897b6
Binary files /dev/null and b/res/drawable/gears_file_audio.png differ
diff --git a/res/drawable/gears_file_image.png b/res/drawable/gears_file_image.png
new file mode 100755 (executable)
index 0000000..b140f84
Binary files /dev/null and b/res/drawable/gears_file_image.png differ
diff --git a/res/drawable/gears_file_unknown.png b/res/drawable/gears_file_unknown.png
new file mode 100755 (executable)
index 0000000..23386f4
Binary files /dev/null and b/res/drawable/gears_file_unknown.png differ
diff --git a/res/drawable/gears_file_video.png b/res/drawable/gears_file_video.png
new file mode 100755 (executable)
index 0000000..d876afb
Binary files /dev/null and b/res/drawable/gears_file_video.png differ
diff --git a/res/drawable/gears_folder.png b/res/drawable/gears_folder.png
new file mode 100755 (executable)
index 0000000..ed31ba5
Binary files /dev/null and b/res/drawable/gears_folder.png differ
diff --git a/res/drawable/gears_icon_32x32.png b/res/drawable/gears_icon_32x32.png
new file mode 100644 (file)
index 0000000..f703f7f
Binary files /dev/null and b/res/drawable/gears_icon_32x32.png differ
diff --git a/res/drawable/gears_icon_48x48.png b/res/drawable/gears_icon_48x48.png
new file mode 100644 (file)
index 0000000..da5493b
Binary files /dev/null and b/res/drawable/gears_icon_48x48.png differ
diff --git a/res/drawable/gears_local_data.png b/res/drawable/gears_local_data.png
new file mode 100644 (file)
index 0000000..4c43456
Binary files /dev/null and b/res/drawable/gears_local_data.png differ
diff --git a/res/drawable/gears_location_data.png b/res/drawable/gears_location_data.png
new file mode 100644 (file)
index 0000000..f69ad75
Binary files /dev/null and b/res/drawable/gears_location_data.png differ
diff --git a/res/drawable/ic_browser_done.png b/res/drawable/ic_browser_done.png
deleted file mode 100644 (file)
index 3f30072..0000000
Binary files a/res/drawable/ic_browser_done.png and /dev/null differ
diff --git a/res/drawable/ic_browser_down.png b/res/drawable/ic_browser_down.png
deleted file mode 100755 (executable)
index e3747a7..0000000
Binary files a/res/drawable/ic_browser_down.png and /dev/null differ
diff --git a/res/drawable/ic_browser_up.png b/res/drawable/ic_browser_up.png
deleted file mode 100755 (executable)
index 6ea5a81..0000000
Binary files a/res/drawable/ic_browser_up.png and /dev/null differ
diff --git a/res/drawable/ic_btn_close_panel.png b/res/drawable/ic_btn_close_panel.png
new file mode 100644 (file)
index 0000000..b6e1ce1
Binary files /dev/null and b/res/drawable/ic_btn_close_panel.png differ
diff --git a/res/drawable/ic_btn_find_next.png b/res/drawable/ic_btn_find_next.png
new file mode 100644 (file)
index 0000000..abdc247
Binary files /dev/null and b/res/drawable/ic_btn_find_next.png differ
diff --git a/res/drawable/ic_btn_find_prev.png b/res/drawable/ic_btn_find_prev.png
new file mode 100644 (file)
index 0000000..4e3da1d
Binary files /dev/null and b/res/drawable/ic_btn_find_prev.png differ
diff --git a/res/drawable/ic_menu_forward.png b/res/drawable/ic_menu_forward.png
deleted file mode 100644 (file)
index 0936fac..0000000
Binary files a/res/drawable/ic_menu_forward.png and /dev/null differ
diff --git a/res/drawable/ic_search_browser.png b/res/drawable/ic_search_browser.png
deleted file mode 100644 (file)
index 9876117..0000000
Binary files a/res/drawable/ic_search_browser.png and /dev/null differ
diff --git a/res/drawable/map.xml b/res/drawable/map.xml
deleted file mode 100644 (file)
index 84d5903..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* //device/apps/common/res/drawable/checkbox.xml
-**
-** Copyright 2007, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_focused="true" android:drawable="@drawable/mapfocused"/>
-    <item android:drawable="@drawable/mapunfocused"/>
-</selector>
diff --git a/res/drawable/mapfocused.png b/res/drawable/mapfocused.png
deleted file mode 100644 (file)
index 83efcac..0000000
Binary files a/res/drawable/mapfocused.png and /dev/null differ
diff --git a/res/drawable/mapunfocused.png b/res/drawable/mapunfocused.png
deleted file mode 100644 (file)
index 736dc68..0000000
Binary files a/res/drawable/mapunfocused.png and /dev/null differ
diff --git a/res/drawable/urlbar_background.9.png b/res/drawable/urlbar_background.9.png
deleted file mode 100644 (file)
index 38583b3..0000000
Binary files a/res/drawable/urlbar_background.9.png and /dev/null differ
diff --git a/res/layout-land/gears_dialog.xml b/res/layout-land/gears_dialog.xml
new file mode 100644 (file)
index 0000000..f5cf969
--- /dev/null
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2008, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  android:drawingCacheQuality="auto"
+  android:layout_width="fill_parent"
+  android:layout_height="wrap_content"
+  android:orientation="vertical"
+  android:padding="10dip"
+  android:background="@color/white">
+
+  <LinearLayout
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingBottom="10dip">
+
+    <LinearLayout
+      android:layout_width="fill_parent"
+      android:layout_height="wrap_content"
+      android:orientation="vertical">
+
+      <LinearLayout
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <ImageView
+          android:id="@+id/icon"
+          android:paddingRight="10dip"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:layout_centerHorizontal="true" />
+
+        <TextView
+          android:id="@+id/dialog_title"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:layout_centerVertical="true"
+          android:paddingRight="10dip"
+          android:gravity="center_vertical"
+          android:visibility="gone"
+          android:textSize="16dip"
+          android:textStyle="bold"
+          android:textColor="@color/black"/>
+
+        <TextView
+          android:id="@+id/dialog_subtitle"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:paddingTop="10dip"
+          android:paddingRight="10dip"
+          android:gravity="center_vertical"
+          android:visibility="gone"
+          android:textSize="13dip"
+          android:textColor="@color/black"/>
+
+        <TextView
+          android:id="@+id/dialog_message"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:visibility="gone"
+          android:gravity="center_vertical"
+          android:textSize="13dip"
+          android:textColor="@color/black"/>
+
+      </LinearLayout>
+
+    </LinearLayout>
+
+  </LinearLayout>
+
+  <LinearLayout
+    android:id="@+id/panel_content"
+    android:layout_width="fill_parent"
+    android:layout_height="0dip"
+    android:layout_weight="1"/>
+
+  <RelativeLayout
+    android:background="@color/white"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:paddingTop="10dip">
+
+    <Button
+      android:id="@+id/button_alwaysdeny"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_alignParentLeft="true"
+      style="@style/gears_button"
+      android:textSize="13dip"/>
+
+    <LinearLayout
+      android:layout_width="wrap_content"
+      android:layout_alignParentRight="true"
+      android:layout_height="wrap_content">
+
+      <Button
+        android:id="@+id/button_allow"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textSize="13dip"/>
+
+      <Button
+        android:id="@+id/button_deny"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textSize="13dip"/>
+
+    </LinearLayout>
+
+  </RelativeLayout>
+
+</LinearLayout>
index f08dd7d..63d18ca 100644 (file)
      limitations under the License.
 -->
 
-<LinearLayout
+<ScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical" >
-    
-    <!-- Title: -->
-    <TextView
-        android:id="@+id/title"
-        android:textStyle="bold"
-        android:textSize="14sp"
-        android:textColor="@color/white"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:layout_marginLeft="20dip"
-        android:layout_marginRight="20dip"
-        android:layout_marginTop="12dip"
-        android:layout_marginBottom="12dip" />
 
-    <!-- Address: -->
-    <TableLayout
+    <LinearLayout
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
-        android:shrinkColumns="1"
-        android:orientation="vertical">
+        android:orientation="vertical" >
+    
+        <!-- Title: -->
+        <TextView
+            android:id="@+id/title"
+            android:textStyle="bold"
+            android:textSize="14sp"
+            android:textColor="@color/white"
+            android:layout_height="wrap_content"
+            android:layout_width="wrap_content"
+            android:layout_marginLeft="20dip"
+            android:layout_marginRight="20dip"
+            android:layout_marginTop="12dip"
+            android:layout_marginBottom="12dip" />
 
-        <TableRow>
-            <TextView 
-                android:id="@+id/address_header"
-                android:text="@string/page_info_address"
-                android:textSize="14sp"
-                android:textColor="@color/white"
-                android:gravity="left"
-                android:layout_marginLeft="20dip"
-                android:layout_marginRight="20dip" />
-            
-            <TextView
-                android:id="@+id/address"
-                android:textSize="14sp"
-                android:textColor="@color/white"
-                android:gravity="left"
-                android:layout_marginLeft="10dip"
-                android:layout_marginRight="20dip"
-                android:layout_marginBottom="12dip" />
-        </TableRow>
+        <!-- Address: -->
+        <TableLayout
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:shrinkColumns="1"
+            android:orientation="vertical">
 
-    </TableLayout>
-    
-</LinearLayout>
+            <TableRow>
+                <TextView 
+                    android:id="@+id/address_header"
+                    android:text="@string/page_info_address"
+                    android:textSize="14sp"
+                    android:textColor="@color/white"
+                    android:gravity="left"
+                    android:layout_marginLeft="20dip"
+                    android:layout_marginRight="20dip" />
+                
+                <TextView
+                    android:id="@+id/address"
+                    android:textSize="14sp"
+                    android:textColor="@color/white"
+                    android:gravity="left"
+                    android:layout_marginLeft="10dip"
+                    android:layout_marginRight="20dip"
+                    android:layout_marginBottom="12dip" />
+            </TableRow>
+
+        </TableLayout>
+        
+    </LinearLayout>
+
+</ScrollView>
 
index b1da8f1..7e587c1 100644 (file)
     android:id="@+id/findControls"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
-    android:background="@android:drawable/menu_full_frame"
+    android:background="@android:drawable/bottom_bar"
     android:paddingTop="12dip"
     >
-    
-        <LinearLayout
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="vertical"
-            android:layout_marginLeft="6dip"
-            android:layout_marginRight="6dip"
-            >
-            <ImageButton android:id="@+id/done"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:src="@drawable/ic_browser_done"
-                />
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/done"
-                android:layout_gravity="center_horizontal"
-                android:textColor="?android:attr/textColorPrimaryInverse"
-                />
-        </LinearLayout>
+    <ImageButton 
+        android:src="@drawable/ic_btn_find_prev"
+        android:id="@+id/previous"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        />
 
-        <LinearLayout
-            android:layout_height="wrap_content"
-            android:layout_width="0dip"
-            android:layout_weight="1"
-            android:orientation="vertical"
-            android:layout_marginRight="6dip"
-            >
-            <EditText android:id="@+id/edit"
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:scrollHorizontally="true"
-                android:autoText="false"
-                android:capitalize="none"
-                android:hint="@string/find_dot"
-                />
-            <LinearLayout
-                android:layout_height="wrap_content"
-                android:layout_width="wrap_content"
-                android:orientation="horizontal"
-                android:layout_gravity="center_horizontal"
-                android:paddingTop="1dip"
-                >
-                <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginRight="3dip"
-                    android:text="@string/matches_found"
-                    android:textColor="?android:attr/textColorPrimaryInverse"
-                    />
-                <TextView android:id="@+id/matches"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="@string/zero"
-                    android:textColor="?android:attr/textColorPrimaryInverse"
-                    />
-            </LinearLayout>
-        </LinearLayout>
+    <ImageButton 
+        android:src="@drawable/ic_btn_find_next"
+        android:id="@+id/next"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        />
 
-        <LinearLayout
-            android:layout_width="wrap_content"
+    <LinearLayout
+        android:layout_height="wrap_content"
+        android:layout_width="0dip"
+        android:layout_weight="1"
+        android:orientation="vertical"
+        android:layout_marginRight="6dip"
+        >
+        <EditText android:id="@+id/edit"
+            android:layout_width="fill_parent"
             android:layout_height="wrap_content"
-            android:orientation="vertical"
-            android:layout_marginRight="6dip"
-            >
-            <ImageButton 
-                android:src="@drawable/ic_browser_up"
-                android:id="@+id/previous"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                />
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/prev"
-                android:layout_gravity="center_horizontal"
-                android:textColor="?android:attr/textColorPrimaryInverse"
-                />
-        </LinearLayout>
-
-        <LinearLayout
-            android:layout_width="wrap_content"
+            android:scrollHorizontally="true"
+            android:autoText="false"
+            android:capitalize="none"
+            android:hint="@string/find_dot"
+            />
+        <LinearLayout android:id="@+id/matches_view"
             android:layout_height="wrap_content"
-            android:orientation="vertical"
-            android:layout_marginRight="6dip"
+            android:layout_width="wrap_content"
+            android:orientation="horizontal"
+            android:layout_gravity="right"
+            android:visibility="invisible"
             >
-            <ImageButton 
-                android:src="@drawable/ic_browser_down"
-                android:id="@+id/next"
+            <TextView android:id="@+id/matches"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_gravity="right"
+                android:text="@string/zero"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:textColor="?android:attr/textColorSecondaryInverse"
                 />
-
             <TextView
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:text="@string/next"
-                android:layout_gravity="center_horizontal"
-                android:textColor="?android:attr/textColorPrimaryInverse"
+                android:layout_marginRight="3dip"
+                android:layout_gravity="right"
+                android:text="@string/matches_found"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:textColor="?android:attr/textColorSecondaryInverse"
                 />
         </LinearLayout>
-
+    </LinearLayout>
+    <ImageButton android:id="@+id/done"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@drawable/ic_btn_close_panel"
+        />
 </LinearLayout>        
 
diff --git a/res/layout/cache_cleared.xml b/res/layout/cache_cleared.xml
deleted file mode 100644 (file)
index a65183c..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<!--
-/*
- * Copyright 2007, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="fill_parent"
-        android:layout_height="fill_parent"
-        >
-    <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginLeft="50dip"
-            android:layout_marginTop="50dip"
-            android:layout_marginRight="50dip"
-            android:layout_marginBottom="50dip"
-            android:text="@string/cache_cleared"
-            />
-</LinearLayout>
diff --git a/res/layout/gears_dialog.xml b/res/layout/gears_dialog.xml
new file mode 100644 (file)
index 0000000..b1a43cd
--- /dev/null
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2008, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  android:drawingCacheQuality="auto"
+  android:layout_width="fill_parent"
+  android:layout_height="wrap_content"
+  android:orientation="vertical"
+  android:padding="10dip"
+  android:background="@color/white">
+
+  <LinearLayout
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingBottom="10dip">
+
+    <LinearLayout
+      android:layout_width="fill_parent"
+      android:layout_height="wrap_content"
+      android:orientation="vertical">
+
+      <LinearLayout
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <ImageView
+          android:id="@+id/icon"
+          android:paddingRight="10dip"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:layout_centerHorizontal="true" />
+
+        <TextView
+          android:id="@+id/dialog_title"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:layout_centerVertical="true"
+          android:gravity="center_vertical"
+          android:visibility="gone"
+          android:textSize="16dip"
+          android:textStyle="bold"
+          android:textColor="@color/black"/>
+
+        <TextView
+          android:id="@+id/dialog_message"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:visibility="gone"
+          android:gravity="center_vertical"
+          android:textSize="13dip"
+          android:textColor="@color/black"/>
+
+      </LinearLayout>
+
+      <TextView
+        android:id="@+id/dialog_subtitle"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingTop="10dip"
+        android:gravity="center_vertical"
+        android:visibility="gone"
+        android:textSize="13dip"
+        android:textColor="@color/black"/>
+
+    </LinearLayout>
+
+  </LinearLayout>
+
+  <LinearLayout
+    android:id="@+id/panel_content"
+    android:layout_width="fill_parent"
+    android:layout_height="0dip"
+    android:layout_weight="1"/>
+
+  <RelativeLayout
+    android:background="@color/white"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:paddingTop="10dip">
+
+    <Button
+      android:id="@+id/button_alwaysdeny"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_alignParentLeft="true"
+      style="@style/gears_button"
+      android:textSize="13dip"/>
+
+    <LinearLayout
+      android:layout_width="wrap_content"
+      android:layout_alignParentRight="true"
+      android:layout_height="wrap_content">
+
+      <Button
+        android:id="@+id/button_allow"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textSize="13dip"/>
+
+      <Button
+        android:id="@+id/button_deny"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textSize="13dip"/>
+
+    </LinearLayout>
+
+  </RelativeLayout>
+
+</LinearLayout>
diff --git a/res/layout/gears_dialog_filepicker.xml b/res/layout/gears_dialog_filepicker.xml
new file mode 100644 (file)
index 0000000..5f1c653
--- /dev/null
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2008, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  android:orientation="vertical"
+  android:layout_width="wrap_content"
+  android:layout_height="wrap_content">
+
+  <LinearLayout
+    android:orientation="vertical"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="@color/gray"
+    android:padding="1px">
+
+    <LinearLayout
+      android:orientation="vertical"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:background="@color/white">
+
+      <GridView android:id="@+id/files_list"
+        android:padding="4px"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:horizontalSpacing="2px"
+        android:verticalSpacing="2px"
+        android:numColumns="3"
+        style="@android:style/Widget.ListView.White" />
+
+    </LinearLayout>
+
+  </LinearLayout>
+
+</LinearLayout>
diff --git a/res/layout/gears_dialog_filepicker_cell.xml b/res/layout/gears_dialog_filepicker_cell.xml
new file mode 100644 (file)
index 0000000..1db167f
--- /dev/null
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2008, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  android:orientation="vertical"
+  android:layout_width="wrap_content"
+  android:layout_height="wrap_content"
+  android:gravity="center_horizontal"
+  android:padding="2px" >
+
+  <ImageView
+    android:id="@+id/icon"
+    android:scaleType="fitCenter"
+    android:layout_width="64px"
+    android:layout_height="64px" />
+
+  <TextView
+    android:id="@+id/name"
+    android:textAppearance="?android:attr/textAppearanceSmall"
+    android:textColor="@color/black"
+    android:singleLine="true"
+    android:ellipsize="middle"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content" />
+
+</LinearLayout>
diff --git a/res/layout/gears_dialog_permission.xml b/res/layout/gears_dialog_permission.xml
new file mode 100644 (file)
index 0000000..3852f83
--- /dev/null
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2008, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  android:orientation="vertical"
+  android:layout_width="fill_parent"
+  android:layout_height="wrap_content">
+
+  <LinearLayout
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:id="@+id/content_border"
+    android:padding="1px">
+
+    <LinearLayout
+      android:layout_width="fill_parent"
+      android:layout_height="wrap_content"
+      android:id="@+id/content_background"
+      android:padding="4dip">
+
+      <ImageView
+        android:id="@+id/origin_icon"
+        android:padding="10dip"
+        android:layout_centerHorizontal="true"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:visibility="gone"
+        android:adjustViewBounds="true"
+        android:src="@drawable/gears"/>
+
+      <LinearLayout
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:padding="4dip"
+        android:orientation="vertical">
+
+        <TextView
+          android:id="@+id/origin_title"
+          android:layout_width="fill_parent"
+          android:layout_height="wrap_content"
+          android:visibility="gone"
+          android:textStyle="bold"
+          android:gravity="left"
+          android:textSize="13dip"
+          android:textColor="@color/black"/>
+
+        <TextView
+          android:id="@+id/origin_subtitle"
+          android:layout_width="fill_parent"
+          android:layout_height="wrap_content"
+          android:visibility="gone"
+          android:gravity="left"
+          android:textSize="13dip"
+          android:textColor="@color/black"/>
+
+        <TextView
+          android:id="@+id/origin_message"
+          android:layout_width="fill_parent"
+          android:layout_height="wrap_content"
+          android:visibility="gone"
+          android:paddingTop="10dip"
+          android:gravity="left"
+          android:textSize="13dip"
+          android:textColor="@color/black"/>
+
+      </LinearLayout>
+
+    </LinearLayout>
+
+  </LinearLayout>
+
+  <TextView
+    android:id="@+id/privacy_policy_label"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:paddingTop="10dip"
+    android:gravity="center_horizontal"
+    android:textSize="13dip"
+    android:textStyle="italic"
+    android:textColor="@color/black"
+    android:visibility="gone"
+    android:text="@string/privacy_policy" />
+
+</LinearLayout>
diff --git a/res/layout/gears_dialog_settings.xml b/res/layout/gears_dialog_settings.xml
new file mode 100644 (file)
index 0000000..a9026db
--- /dev/null
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2008, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  android:orientation="vertical"
+  android:layout_width="wrap_content"
+  android:layout_height="wrap_content">
+
+  <LinearLayout
+    android:orientation="vertical"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="@color/gray"
+    android:padding="1px">
+
+    <LinearLayout
+      android:orientation="vertical"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:background="@color/white">
+
+      <ListView android:id="@+id/sites_list"
+        android:padding="4dip"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        style="@android:style/Widget.ListView.White" />
+
+    </LinearLayout>
+
+  </LinearLayout>
+
+  <TextView
+    android:id="@+id/gears_version"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:paddingTop="10dip"
+    android:gravity="center_horizontal"
+    android:textSize="13dip"
+    android:textStyle="italic"
+    android:textColor="@color/black" />
+
+</LinearLayout>
diff --git a/res/layout/gears_dialog_settings_row.xml b/res/layout/gears_dialog_settings_row.xml
new file mode 100644 (file)
index 0000000..8a2cadf
--- /dev/null
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2008, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  android:orientation="vertical"
+  android:layout_width="fill_parent"
+  android:layout_height="wrap_content"
+  android:textSize="13dip"
+  android:background="@color/white"
+  android:textColor="@color/black">
+
+  <LinearLayout
+    android:orientation="horizontal"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:padding="4dip">
+
+    <TextView
+      android:id="@+id/origin_name"
+      android:layout_width="0dip"
+      android:layout_height="wrap_content"
+      android:layout_weight="1"
+      android:textColor="@color/black"
+      android:textStyle="bold"/>
+
+    <Button
+      android:id="@+id/origin_remove"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      style="@style/gears_button"
+      android:text="@string/remove"/>
+
+  </LinearLayout>
+
+  <TableLayout
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content">
+
+    <TableRow
+      android:id="@+id/local_storage_choice"
+      android:visibility="gone">
+
+      <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="fill_parent"
+        android:textColor="@color/black"
+        android:gravity="center_vertical"
+        android:text="@string/local_storage"/>
+
+      <RadioGroup android:orientation="horizontal">
+        <RadioButton
+          android:id="@+id/local_storage_allowed"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:textColor="@color/black"
+          android:textSize="13dip"
+          android:text="@string/allowed"/>
+
+        <RadioButton
+          android:id="@+id/local_storage_denied"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:textColor="@color/black"
+          android:textSize="13dip"
+          android:text="@string/denied"/>
+      </RadioGroup>
+
+    </TableRow>
+
+    <TableRow
+      android:id="@+id/location_data_choice"
+      android:visibility="gone">
+
+      <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="fill_parent"
+        android:textColor="@color/black"
+        android:gravity="center_vertical"
+        android:text="@string/location"/>
+
+      <RadioGroup android:orientation="horizontal">
+        <RadioButton
+          android:id="@+id/location_data_allowed"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:textColor="@color/black"
+          android:textSize="13dip"
+          android:text="@string/allowed"/>
+
+        <RadioButton
+          android:id="@+id/location_data_denied"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:textColor="@color/black"
+          android:textSize="13dip"
+          android:text="@string/denied"/>
+      </RadioGroup>
+
+    </TableRow>
+
+  </TableLayout>
+
+</LinearLayout>
index b10b72a..ee45082 100644 (file)
      limitations under the License.
 -->
 
-<LinearLayout
+<ScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical" >
-    
-    <!-- Title: -->
-    <TextView
-        android:id="@+id/title"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:textStyle="bold"
-        android:textSize="14sp"
-        android:textColor="@color/white"
-        android:layout_marginLeft="20dip"
-        android:layout_marginRight="20dip"
-        android:layout_marginTop="12dip"
-        android:layout_marginBottom="12dip" />
-    
-    <!-- Address: -->
-    <TableLayout
+
+    <LinearLayout
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
-        android:orientation="vertical">
-        
-        <TextView 
-            android:id="@+id/address_header"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:text="@string/page_info_address"
-            android:textSize="14sp"
-            android:textColor="@color/white"
-            android:gravity="left"
-            android:layout_marginLeft="20dip"
-            android:layout_marginRight="20dip"
-            android:layout_marginBottom="10dip" />
-        
+        android:orientation="vertical" >
+    
+        <!-- Title: -->
         <TextView
-            android:id="@+id/address"
+            android:id="@+id/title"
             android:layout_height="wrap_content"
             android:layout_width="wrap_content"
+            android:textStyle="bold"
             android:textSize="14sp"
             android:textColor="@color/white"
-            android:gravity="left"
             android:layout_marginLeft="20dip"
             android:layout_marginRight="20dip"
+            android:layout_marginTop="12dip"
             android:layout_marginBottom="12dip" />
+    
+        <!-- Address: -->
+        <TableLayout
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+        
+            <TextView 
+                android:id="@+id/address_header"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="@string/page_info_address"
+                android:textSize="14sp"
+                android:textColor="@color/white"
+                android:gravity="left"
+                android:layout_marginLeft="20dip"
+                android:layout_marginRight="20dip"
+                android:layout_marginBottom="10dip" />
+            
+            <TextView
+                android:id="@+id/address"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:textSize="14sp"
+                android:textColor="@color/white"
+                android:gravity="left"
+                android:layout_marginLeft="20dip"
+                android:layout_marginRight="20dip"
+                android:layout_marginBottom="12dip" />
+            
+        </TableLayout>
         
-    </TableLayout>
+    </LinearLayout>
 
-</LinearLayout>
+</ScrollView>
index 9edd614..9c82972 100644 (file)
 
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
-    android:layout_height="198dip"
     android:orientation="vertical"
     android:padding="4dip"
-    android:background="@android:drawable/gallery_thumb">
+    android:background="@color/white">
 
     <com.android.browser.FakeWebView android:id="@+id/icon"
         android:background="@color/black"
-        android:layout_width="145dip"
-        android:layout_height="190dip" />
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent" />
 
     <TextView android:id="@+id/label"
         android:layout_width="fill_parent"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="bottom|right"
-        android:paddingTop="12dip"
-        android:paddingBottom="10dip"
-        android:paddingLeft="10dip"
-        android:paddingRight="10dip"
+        android:paddingTop="14dip"
+        android:paddingBottom="12dip"
+        android:paddingLeft="12dip"
+        android:paddingRight="12dip"
         android:src="@android:drawable/btn_dialog" />
 
 </FrameLayout>
index 383b3b6..b43e242 100644 (file)
 -->
 
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
-    <group android:id="@+id/ADD_MENU">
-        <item android:id="@+id/new_context_menu_id"
-            android:title="@string/save_to_bookmarks"/>
-    </group>
-    <group android:id="@+id/CONTEXT_MENU">
-        <item android:id="@+id/open_context_menu_id"
-            android:title="@string/open_bookmark"/>
-        <item android:id="@+id/new_window_context_menu_id"
-            android:title="@string/open_in_new_window"/>
-        <item android:id="@+id/edit_context_menu_id"
-            android:title="@string/edit_bookmark"/>
-        <item android:id="@+id/send_context_menu_id"
-            android:title="@string/tab_picker_send_url"/>
-         <item android:id="@+id/copy_url_context_menu_id"
-            android:title="@string/contextmenu_copylink"/>  
-         <item android:id="@+id/delete_context_menu_id"
-            android:title="@string/remove_bookmark"/>    
-    </group>
+  <group android:id="@+id/ADD_MENU">
+    <item android:id="@+id/new_context_menu_id"
+      android:title="@string/save_to_bookmarks"/>
+  </group>
+  <group android:id="@+id/CONTEXT_MENU">
+    <item android:id="@+id/open_context_menu_id"
+      android:title="@string/open_bookmark"/>
+    <item android:id="@+id/new_window_context_menu_id"
+      android:title="@string/open_in_new_window"/>
+    <item android:id="@+id/edit_context_menu_id"
+      android:title="@string/edit_bookmark"/>
+    <item android:id="@+id/shortcut_context_menu_id"
+      android:title="@string/create_shortcut_bookmark"/>
+    <item android:id="@+id/send_context_menu_id"
+      android:title="@string/tab_picker_send_url"/>
+    <item android:id="@+id/copy_url_context_menu_id"
+      android:title="@string/contextmenu_copylink"/>
+    <item android:id="@+id/delete_context_menu_id"
+      android:title="@string/remove_bookmark"/>
+  </group>
 </menu>
index 9f30ad1..5f5b3ca 100644 (file)
             android:title="@string/history" />
         <item android:id="@+id/view_downloads_menu_id"
             android:title="@string/menu_view_download" /> 
-<!--
-        Disabling the find option for version 1.0
         <item android:id="@+id/find_menu_id"
             android:title="@string/find_dot" 
             android:alphabeticShortcut="f" />
--->
         <item android:id="@+id/page_info_menu_id"
             android:title="@string/page_info" />
         <item android:id="@+id/bookmark_page_menu_id"
             android:alphabeticShortcut="i" />
         <item android:id="@+id/zoom_out_menu_id"
             android:alphabeticShortcut="o" />
+        <item android:id="@+id/window_one_menu_id"
+            android:alphabeticShortcut="1" />
+        <item android:id="@+id/window_two_menu_id"
+            android:alphabeticShortcut="2" />
+        <item android:id="@+id/window_three_menu_id"
+            android:alphabeticShortcut="3" />
+        <item android:id="@+id/window_four_menu_id"
+            android:alphabeticShortcut="4" />
+        <item android:id="@+id/window_five_menu_id"
+            android:alphabeticShortcut="5" />
+        <item android:id="@+id/window_six_menu_id"
+            android:alphabeticShortcut="6" />
+        <item android:id="@+id/window_seven_menu_id"
+            android:alphabeticShortcut="7" />
+        <item android:id="@+id/window_eight_menu_id"
+            android:alphabeticShortcut="8" />
         <item android:id="@+id/dump_nav_menu_id"
             android:title="@string/dump_nav"
             android:visible="false" />
     <group android:id="@+id/TAB_MENU">
         <item android:id="@+id/new_tab_menu_id"
             android:title="@string/tab_picker_new_tab"
+            android:alphabeticShortcut="t" 
             android:icon="@android:drawable/ic_menu_add" />
         <item android:id="@+id/bookmarks_tab_menu_id"
             android:title="@string/bookmarks" 
+            android:alphabeticShortcut="b" 
             android:icon="@drawable/ic_menu_bookmark" />
         <item android:id="@+id/history_tab_menu_id"
             android:title="@string/history"
+            android:alphabeticShortcut="h" 
             android:icon="@drawable/ic_menu_recent_history" />
     </group>
     <!-- these items are toggled in and out of @+id/stop_reload_menu_id -->
index 2471227..30c00bf 100644 (file)
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <string name="action">Přihlásit se</string>
-  <string name="activity_instrumentation_functional_test_runner">Spouštěč testu funkcí prohlížeče</string>
-  <string name="activity_instrumentation_test_runner">Spouštěč testu prohlížeče</string>
-  <string name="add_new_bookmark">Nová záložka</string>
-  <string name="back">Zpět</string>
-  <string name="bookmark_needs_title">"Záložka musí mít název!"</string>
-  <string name="bookmark_needs_url">"Záložka musí mít umístění!"</string>
-  <string name="bookmark_saved">Uloženo do záložek</string>
-  <string name="bookmark_url_not_valid">Adresa URL je neplatná!</string>
-  <string name="bookmarks">Záložky</string>
-  <string name="browserFrame307Post">Tato webová stránka se nyní přesměruje. Chcete znovu odeslat zadaná data formuláře do nového umístění?</string>
-  <string name="browserFrameFileErrorLabel">Chyba souboru</string>
-  <string name="browserFrameFormResubmitLabel">Potvrdit</string>
-  <string name="browserFrameFormResubmitMessage">Stránka, kterou chcete zobrazit, obsahuje data POSTDATA. Pokud znovu odešlete data, zopakují se všechny činnosti provedené formulářem (např. hledání nebo nakupování online).</string>
-  <string name="browserFrameNetworkErrorLabel">Chyba sítě</string>
-  <string name="browserFrameRedirect">Přesměrovat</string>
-  <string name="browser_bookmarks_page_bookmarks_text">Záložky</string>
-  <string name="browser_history">Historie prohlížeče</string>
-  <string name="cache_cleared">Mezipaměť vymazána</string>
-  <string name="cancel">Storno</string>
-  <string name="clear">Vymazat</string>
-  <string name="close">Zavřít</string>
-  <string name="common_name">Obecné jméno:</string>
-  <string name="contextmenu_bookmark_thislink">Přidat odkaz do záložek</string>
-  <string name="contextmenu_copylink">Kopírovat odkaz</string>
-  <string name="contextmenu_download_image">Stáhnout obrázek</string>
-  <string name="contextmenu_openlink">Otevřít odkaz</string>
-  <string name="contextmenu_openlink_newwindow">Otevřít v novém okně</string>
-  <string name="current_page">Aktuální stránka: </string>
-  <string name="delete">Odstranit</string>
-  <string name="delete_all">Odstranit vše</string>
-  <string name="delete_all_bookmarks">Odstranit všechny záložky?</string>
-  <string name="delete_all_bookmarks_warning">Odstranit všechny záložky?</string>
-  <string name="delete_bookmark">Odstranit záložku?</string>
-  <string name="delete_bookmark_warning">Odstranit \"<xliff:g id="bookmark">%s</xliff:g>\"?</string>
-  <string name="do_not_save">Neukládat</string>
-  <string name="done">Hotovo</string>
-  <string name="download_cancel_dlg_msg">Všech <xliff:g id="download_count">%d</xliff:g> souborů ke stažení bude zrušeno a vymazáno z historie stahování</string>
-  <string name="download_cancel_dlg_title">Zrušit všechny soubory ke stažení?</string>
-  <string name="download_canceled">Zrušeno</string>
-  <string name="download_clear_dlg_msg">Všechny položky budou vymazány ze seznamu a odebrány z mezipaměti prohlížeče.</string>
-  <string name="download_clear_dlg_title">Vymazat historii stahování?</string>
-  <string name="download_error">Chyba</string>
-  <string name="download_file_error">Stahování nelze dokončit; není dostatek volného místa.</string>
-  <string name="download_file_error_dlg_msg">Soubor <xliff:g id="filename">%s</xliff:g> nelze stáhnout!\nUvolněte místo a akci zopakujte</string>
-  <string name="download_file_error_dlg_title">V zařízení je nedostatek volného místa!</string>
-  <string name="download_length_required">Nelze stáhnout; nelze zjistit velikost obsahu</string>
-  <string name="download_menu_cancel">Zrušit stahování</string>
-  <string name="download_menu_cancel_all">Zrušit stahování</string>
-  <string name="download_menu_clear">Vymazat ze seznamu</string>
-  <string name="download_menu_clear_all">Vymazat seznam</string>
-  <string name="download_menu_open">Otevřít</string>
-  <string name="download_no_sdcard_dlg_msg">Ke stažení souboru <xliff:g id="filename">%s</xliff:g> je požadována karta SD</string>
-  <string name="download_no_sdcard_dlg_title">Karta SD chybí</string>
-  <string name="download_not_acceptable">Nelze stáhnout; obsah není podporován</string>
-  <string name="download_pending">Zahájení stahování\u2026</string>
-  <string name="download_pending_network">Čekání na síť\u2026</string>
-  <string name="download_precondition_failed">Stahování bylo přerušeno a nelze jej obnovit</string>
-  <string name="download_running">Stahování </string>
-  <string name="download_running_paused">Čekání na síť\u2026 </string>
-  <string name="download_success">Stahování souboru <xliff:g id="file">%s</xliff:g> dokončeno</string>
-  <string name="download_title">Historie stahování</string>
-  <string name="download_unknown_filename">&lt;Neznámý&gt;</string>
-  <string name="dump_nav">Výpis mezipaměti navigace</string>
-  <string name="edit_bookmark">Upravit záložku</string>
-  <string name="empty_bookmark">"Nelze vytvořit prázdnou záložku!"</string>
-  <string name="find_dot">Najít\u2026</string>
-  <string name="forward">Předat dál</string>
-  <string name="goto_dot">Přejít\u2026</string>
-  <string name="history">Historie</string>
-  <string name="history_picker_view_web_page">Zobrazit webovou stránku</string>
-  <string name="homepage">Domovská stránka</string>
-  <string name="homepage_set">Domovská stránka aktualizována</string>
-  <string name="http">http://</string>
-  <string name="info_base">Název:\n  <xliff:g id="title">%s1</xliff:g> \n\nAdresa URL: \n  <xliff:g id="url">%s2</xliff:g></string>
-  <string name="issued_by">Vystavitel:</string>
-  <string name="issued_to">Vystaveno pro:</string>
-  <string name="js_dialog_title_default">JavaScript</string>
-  <string name="js_dialog_title_prefix">Stránka na adrese</string>
-  <string name="js_dialog_title_suffix">uvádí:</string>
-  <string name="loadSuspended">Načítání stránky je pozastaveno a bude pokračovat po obnovení připojení</string>
-  <string name="loadSuspendedTitle">Žádné pokrytí sítí!</string>
-  <string name="location">Umístění</string>
-  <string name="matches_found">Nalezené výsledky:</string>
-  <string name="menu_preferences">Nastavení</string>
-  <string name="menu_use_as_homepage">Nastavit jako domovskou stránku</string>
-  <string name="menu_view_download">Zobrazit soubory ke stažení</string>
-  <string name="menu_zoom">Lupa</string>
-  <string name="name">Název</string>
-  <string name="new_window">Nové okno</string>
-  <string name="next">Další</string>
-  <string name="no_database">Žádná databáze!</string>
-  <string name="ok">OK</string>
-  <string name="oma_error_failed_to_download">Stažení média se nezdařilo</string>
-  <string name="oma_error_insufficient_memory">Nedostatek paměti! Zkontrolujte kartu SD</string>
-  <string name="oma_error_invalid_descriptor">Neplatný popisovač stahování</string>
-  <string name="oma_error_non_acceptable_content">Obsah není podporován</string>
-  <string name="oma_label_action">Stáhnout</string>
-  <string name="oma_label_cancel">Konec</string>
-  <string name="oma_label_description">Popis:</string>
-  <string name="oma_label_download_error">Chyba stahování:</string>
-  <string name="oma_label_exit">Konec</string>
-  <string name="oma_label_name">Název:</string>
-  <string name="oma_label_proceed">Pokračovat</string>
-  <string name="oma_label_size">Velikost:</string>
-  <string name="oma_label_type">Typ:</string>
-  <string name="oma_label_vendor">Výrobce:</string>
-  <string name="oma_label_want_to_download">Chcete tento obsah stáhnout?</string>
-  <string name="oma_status_attribute_mismatch">Neshoda atributů</string>
-  <string name="oma_status_device_aborted">Zařízení přerušeno</string>
-  <string name="oma_status_insufficient_memory">Nedostatek paměti</string>
-  <string name="oma_status_invalid_descriptor">Neplatný popisovač</string>
-  <string name="oma_status_invalid_version">Neplatná verze</string>
-  <string name="oma_status_loader_error">Chyba zavaděče</string>
-  <string name="oma_status_loss_of_service">Ztráta služby</string>
-  <string name="oma_status_non_acceptable_content">Nepřijatelný obsah</string>
-  <string name="oma_status_success">Úspěch</string>
-  <string name="oma_warning_one_or_more_types_not_supported">Nejméně jedna kategorie obsahu není podporována.</string>
-  <string name="open_bookmark">Zobrazit webovou stránku</string>
-  <string name="open_in_new_window">Otevřít v novém okně</string>
-  <string name="org_name">Organizace:</string>
-  <string name="org_unit">Organizační jednotka:</string>
-  <string name="override">Nahradit</string>
-  <string name="override_message">Chcete nahradit existující záložku?</string>
-  <string name="password">Heslo</string>
-  <string name="pref_content_block_popups">Blokovat automaticky otevíraná okna</string>
-  <string name="pref_content_javascript">Povolit JavaScript</string>
-  <string name="pref_content_load_images">Načítat obrázky</string>
-  <string name="pref_content_load_images_summary">Obrázky budou načítány s webovými stránkami</string>
-  <string name="pref_content_open_in_background">Otevřít na pozadí</string>
-  <string name="pref_content_open_in_background_summary">Otevře nová okna na pozadí</string>
-  <string name="pref_content_title">Nastavení obsahu stránky</string>
-  <string name="pref_development_nav_dump">Povolit výpis mezipaměti navigace</string>
-  <string name="pref_development_normal_rendering">Normální zobrazování</string>
-  <string name="pref_development_single_column_rendering">Zobrazování v jednom sloupci</string>
-  <string name="pref_development_title">Ladit</string>
-  <string name="pref_development_trace">Povolit trasování</string>
-  <string name="pref_development_track">Povolit trackball</string>
-  <string name="pref_development_uastring">Řetězec Desktop UA</string>
-  <string name="pref_development_viewport">Používat širokou pracovní oblast</string>
-  <string name="pref_extras_reset_default">Obnovit nastavení</string>
-  <string name="pref_extras_reset_default_dlg">Obnovit výchozí nastavení?</string>
-  <string name="pref_extras_reset_default_summary">Obnovit výchozí nastavení všech hodnot</string>
-  <string name="pref_extras_title">Doplňky</string>
-  <string name="pref_plugin_enable">Povolit moduly plug-in</string>
-  <string name="pref_plugin_enable_summary">Povolí webům používat dostupné moduly plug-in</string>
-  <string name="pref_plugin_installed">Nainstalované moduly plug-in</string>
-  <string name="pref_plugin_installed_empty_list">Žádné nainstalované moduly plug-in</string>
-  <string name="pref_plugin_installed_summary">Zobrazit aktuálně nainstalované moduly plug-in</string>
-  <string name="pref_plugin_title">Moduly plug-in</string>
-  <string name="pref_privacy_clear_cache">Vymazat mezipaměť</string>
-  <string name="pref_privacy_clear_cache_dlg">Vymazat mezipaměť?</string>
-  <string name="pref_privacy_clear_cache_summary">Vymaže mezipaměť prohlížeče</string>
-  <string name="pref_privacy_clear_cookies">Vymazat soubory cookie</string>
-  <string name="pref_privacy_clear_cookies_dlg">Vymazat všechny soubory cookie?</string>
-  <string name="pref_privacy_clear_cookies_summary">Vymaže všechny soubory cookie prohlížeče</string>
-  <string name="pref_privacy_clear_form_data">Vymazat data formulářů</string>
-  <string name="pref_privacy_clear_form_data_dlg">Vymazat uložená data formulářů?</string>
-  <string name="pref_privacy_clear_form_data_summary">Vymaže všechna uložená data formulářů</string>
-  <string name="pref_privacy_clear_history">Vymazat historii</string>
-  <string name="pref_privacy_clear_history_dlg">Vymazat historii prohlížeče?</string>
-  <string name="pref_privacy_clear_history_summary">Vymaže historii navigace prohlížeče</string>
-  <string name="pref_privacy_clear_passwords">Vymazat hesla</string>
-  <string name="pref_privacy_clear_passwords_dlg">Vymazat všechna uložená hesla?</string>
-  <string name="pref_privacy_clear_passwords_summary">Vymaže všechna uložená hesla</string>
-  <string name="pref_privacy_title">Nastavení ochrany osobních údajů</string>
-  <string name="pref_security_accept_cookies">Přijímat soubory cookie</string>
-  <string name="pref_security_accept_cookies_summary">Povolí prohlížeči pracovat se soubory cookie</string>
-  <string name="pref_security_remember_passwords">Zapamatovat hesla</string>
-  <string name="pref_security_remember_passwords_summary">Povolí zapamatování uživatelských jmen a hesel na webech</string>
-  <string name="pref_security_save_form_data">Zapamatovat data formulářů</string>
-  <string name="pref_security_save_form_data_summary">Povolí zapamatování údajů zadaných do formulářů k pozdějšímu použití</string>
-  <string name="pref_security_show_security_warning">Zobrazovat upozornění zabezpečení</string>
-  <string name="pref_security_show_security_warning_summary">Zobrazí upozornění v případě potíží se zabezpečeným webem</string>
-  <string name="pref_security_title">Nastavení zabezpečení</string>
-  <string name="pref_text_size">Velikost textu</string>
-  <string name="pref_text_size_dialogtitle">Velikost textu</string>
-  <string name="pref_text_size_summary">Vyberte velikost textu</string>
-  <string name="prev">Předchozí</string>
-  <string name="question_mark">\?</string>
-  <string name="reload">Aktualizovat</string>
-  <string name="remove_bookmark">Odstranit záložku</string>
-  <string name="replace">Nahradit</string>
-  <string name="retry">Opakovat</string>
-  <string name="save">Uložit</string>
-  <string name="save_to_bookmarks">Uložit do záložek</string>
-  <string name="search_label">Prohlížeč</string>
-  <string name="security_warning">Upozornění zabezpečení</string>
-  <string name="sign_in_to">Přihlásit k <xliff:g id="hostname">%s1</xliff:g> \"<xliff:g id="realm">%s2</xliff:g>\"</string>
-  <string name="ssl_certificate">Certifikát</string>
-  <string name="ssl_certificate_is_valid">Tento certifikát je platný</string>
-  <string name="ssl_continue">Pokračovat</string>
-  <string name="ssl_expired">Platnost tohoto certifikátu vypršela</string>
-  <string name="ssl_mismatch">Neshoda názvu hostitele</string>
-  <string name="ssl_not_yet_valid">Tento certifikát ještě není platný</string>
-  <string name="ssl_untrusted">Tento certifikát nepochází od důvěryhodného certifikačního úřadu</string>
-  <string name="ssl_warnings_header">Došlo k potížím s certifikátem zabezpečení tohoto webu</string>
-  <string name="stop">Zastavit</string>
-  <string name="stopping">Zastavení\u2026</string>
-  <string name="tab_picker_bookmark">Záložka</string>
-  <string name="tab_picker_new_tab">Otevřít nové okno</string>
-  <string name="tab_picker_properties">Vlastnosti</string>
-  <string name="tab_picker_remove_tab">Zavřít</string>
-  <string name="tab_picker_send_url">Odeslat adresu URL</string>
-  <string name="tab_picker_title">Aktuální okna</string>
-  <string name="tab_picker_view_tab">Zobrazit</string>
-  <string name="username">Jméno</string>
-  <string name="view_certificate">Zobrazit certifikát</string>
-  <string name="view_tabs">Přehled okna</string>
-  <string name="view_tabs_condensed">Okna</string>
-  <string name="visual_history">Vizuální historie</string>
-  <string name="with">s</string>
-  <string name="zero">0</string>
+    <string name="sign_in_to">"Přihlásit k <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\""</string>
+    <string name="username">"Jméno"</string>
+    <string name="password">"Heslo"</string>
+    <string name="action">"Přihlásit se"</string>
+    <string name="cancel">"Storno"</string>
+    <string name="ok">"OK"</string>
+    <string name="matches_found">"Nalezené výsledky:"</string>
+    <string name="zero">"0"</string>
+    <!-- no translation found for page_info (1656227822243993707) -->
+    <skip />
+    <!-- no translation found for page_info_view (159850381944181348) -->
+    <skip />
+    <!-- no translation found for page_info_address (2265093697152452560) -->
+    <skip />
+    <string name="ssl_warnings_header">"Došlo k potížím s certifikátem zabezpečení tohoto webu"</string>
+    <string name="ssl_continue">"Pokračovat"</string>
+    <string name="security_warning">"Upozornění zabezpečení"</string>
+    <string name="view_certificate">"Zobrazit certifikát"</string>
+    <string name="ssl_untrusted">"Tento certifikát nepochází od důvěryhodného certifikačního úřadu"</string>
+    <string name="ssl_mismatch">"Neshoda názvu hostitele"</string>
+    <string name="ssl_expired">"Platnost tohoto certifikátu vypršela"</string>
+    <string name="ssl_not_yet_valid">"Tento certifikát ještě není platný"</string>
+    <string name="ssl_certificate">"Certifikát"</string>
+    <string name="ssl_certificate_is_valid">"Tento certifikát je platný"</string>
+    <string name="issued_to">"Vystaveno pro:"</string>
+    <string name="common_name">"Obecné jméno:"</string>
+    <string name="org_name">"Organizace:"</string>
+    <string name="org_unit">"Organizační jednotka:"</string>
+    <string name="issued_by">"Vystavitel:"</string>
+    <!-- no translation found for validity_period (1501896257332312390) -->
+    <skip />
+    <!-- no translation found for issued_on (414564986069254430) -->
+    <skip />
+    <!-- no translation found for expires_on (6391846087921048527) -->
+    <skip />
+    <!-- no translation found for retrieving_creds_dlg_msg (7567204449190054542) -->
+    <skip />
+    <string name="close">"Zavřít"</string>
+    <!-- no translation found for close_window (4303233575176107684) -->
+    <skip />
+    <string name="stopping">"Zastavení…"</string>
+    <string name="stop">"Zastavit"</string>
+    <string name="reload">"Aktualizovat"</string>
+    <string name="back">"Zpět"</string>
+    <string name="forward">"Předat dál"</string>
+    <string name="save">"Uložit"</string>
+    <string name="do_not_save">"Neukládat"</string>
+    <string name="location">"Umístění"</string>
+    <string name="name">"Název"</string>
+    <string name="http">"http://"</string>
+    <string name="save_to_bookmarks">"Uložit do záložek"</string>
+    <string name="edit_bookmark">"Upravit záložku"</string>
+    <!-- no translation found for create_shortcut_bookmark (8844594917529938681) -->
+    <skip />
+    <string name="open_bookmark">"Zobrazit webovou stránku"</string>
+    <string name="remove_bookmark">"Odstranit záložku"</string>
+    <!-- no translation found for remove_history_item (7324190140276838017) -->
+    <skip />
+    <string name="bookmark_saved">"Uloženo do záložek"</string>
+    <string name="bookmark_needs_title">"Záložka musí mít název!"</string>
+    <string name="bookmark_needs_url">"Záložka musí mít umístění!"</string>
+    <string name="empty_bookmark">"Nelze vytvořit prázdnou záložku!"</string>
+    <string name="bookmark_url_not_valid">"Adresa URL je neplatná!"</string>
+    <string name="delete_bookmark">"Odstranit záložku?"</string>
+    <!-- no translation found for bookmark_page (3160265153559879995) -->
+    <skip />
+    <string name="current_page">"Aktuální stránka:"</string>
+    <string name="delete_bookmark_warning">"Odstranit \"<xliff:g id="BOOKMARK">%s</xliff:g>\"?"</string>
+    <string name="open_in_new_window">"Otevřít v novém okně"</string>
+    <string name="new_window">"Nové okno"</string>
+    <string name="goto_dot">"Přejít…"</string>
+    <string name="find_dot">"Najít…"</string>
+    <string name="homepage">"Domovská stránka"</string>
+    <string name="view_tabs">"Přehled okna"</string>
+    <string name="view_tabs_condensed">"Okna"</string>
+    <string name="tab_picker_title">"Aktuální okna"</string>
+    <string name="tab_picker_view_tab">"Zobrazit"</string>
+    <string name="tab_picker_new_tab">"Otevřít nové okno"</string>
+    <string name="tab_picker_remove_tab">"Zavřít"</string>
+    <string name="tab_picker_bookmark">"Záložka"</string>
+    <string name="tab_picker_send_url">"Odeslat adresu URL"</string>
+    <string name="bookmarks">"Záložky"</string>
+    <!-- no translation found for shortcut_bookmark (2216457055118901642) -->
+    <skip />
+    <string name="history">"Historie"</string>
+    <string name="menu_view_download">"Zobrazit soubory ke stažení"</string>
+    <!-- no translation found for menu_bookmark_page (3665522585178656450) -->
+    <skip />
+    <!-- no translation found for share_page (8692293666665880742) -->
+    <skip />
+    <string name="menu_zoom">"Lupa"</string>
+    <!-- no translation found for menu_flip_orientation (2091430534812676789) -->
+    <skip />
+    <string name="contextmenu_openlink">"Otevřít odkaz"</string>
+    <string name="contextmenu_openlink_newwindow">"Otevřít v novém okně"</string>
+    <string name="contextmenu_bookmark_thislink">"Přidat odkaz do záložek"</string>
+    <!-- no translation found for contextmenu_savelink (4158359991031234655) -->
+    <skip />
+    <!-- no translation found for contextmenu_sharelink (7783642077260444452) -->
+    <skip />
+    <!-- no translation found for contextmenu_copy (4371155644923777927) -->
+    <skip />
+    <string name="contextmenu_copylink">"Kopírovat odkaz"</string>
+    <string name="contextmenu_download_image">"Stáhnout obrázek"</string>
+    <!-- no translation found for contextmenu_view_image (531069860166711980) -->
+    <skip />
+    <!-- no translation found for contextmenu_dial_dot (6240101001071843117) -->
+    <skip />
+    <!-- no translation found for contextmenu_add_contact (8251406599209677565) -->
+    <skip />
+    <!-- no translation found for contextmenu_send_mail (1725214944636787835) -->
+    <skip />
+    <!-- no translation found for contextmenu_map (5651794703520905543) -->
+    <skip />
+    <string name="clear">"Vymazat"</string>
+    <string name="replace">"Nahradit"</string>
+    <string name="browser_bookmarks_page_bookmarks_text">"Záložky"</string>
+    <string name="menu_preferences">"Nastavení"</string>
+    <string name="pref_content_title">"Nastavení obsahu stránky"</string>
+    <string name="pref_content_load_images">"Načítat obrázky"</string>
+    <string name="pref_content_load_images_summary">"Obrázky budou načítány s webovými stránkami"</string>
+    <string name="pref_content_block_popups">"Blokovat automaticky otevíraná okna"</string>
+    <string name="pref_content_javascript">"Povolit JavaScript"</string>
+    <string name="pref_content_open_in_background">"Otevřít na pozadí"</string>
+    <string name="pref_content_open_in_background_summary">"Otevře nová okna na pozadí"</string>
+    <!-- no translation found for pref_content_homepage (2991649697673532692) -->
+    <skip />
+    <!-- no translation found for pref_content_autofit (1364437137234703707) -->
+    <skip />
+    <!-- no translation found for pref_content_autofit_summary (444470842722907601) -->
+    <skip />
+    <string name="pref_privacy_title">"Nastavení ochrany osobních údajů"</string>
+    <string name="pref_privacy_clear_cache">"Vymazat mezipaměť"</string>
+    <string name="pref_privacy_clear_cache_summary">"Vymaže mezipaměť prohlížeče"</string>
+    <string name="pref_privacy_clear_cache_dlg">"Vymazat mezipaměť?"</string>
+    <string name="pref_privacy_clear_cookies">"Vymazat soubory cookie"</string>
+    <string name="pref_privacy_clear_cookies_summary">"Vymaže všechny soubory cookie prohlížeče"</string>
+    <string name="pref_privacy_clear_cookies_dlg">"Vymazat všechny soubory cookie?"</string>
+    <string name="pref_privacy_clear_history">"Vymazat historii"</string>
+    <string name="pref_privacy_clear_history_summary">"Vymaže historii navigace prohlížeče"</string>
+    <string name="pref_privacy_clear_history_dlg">"Vymazat historii prohlížeče?"</string>
+    <string name="pref_privacy_clear_form_data">"Vymazat data formulářů"</string>
+    <string name="pref_privacy_clear_form_data_summary">"Vymaže všechna uložená data formulářů"</string>
+    <string name="pref_privacy_clear_form_data_dlg">"Vymazat uložená data formulářů?"</string>
+    <string name="pref_privacy_clear_passwords">"Vymazat hesla"</string>
+    <string name="pref_privacy_clear_passwords_summary">"Vymaže všechna uložená hesla"</string>
+    <string name="pref_privacy_clear_passwords_dlg">"Vymazat všechna uložená hesla?"</string>
+    <string name="pref_security_title">"Nastavení zabezpečení"</string>
+    <string name="pref_security_remember_passwords">"Zapamatovat hesla"</string>
+    <string name="pref_security_remember_passwords_summary">"Povolí zapamatování uživatelských jmen a hesel na webech"</string>
+    <string name="pref_security_save_form_data">"Zapamatovat data formulářů"</string>
+    <string name="pref_security_save_form_data_summary">"Povolí zapamatování údajů zadaných do formulářů k pozdějšímu použití"</string>
+    <string name="pref_security_show_security_warning">"Zobrazovat upozornění zabezpečení"</string>
+    <string name="pref_security_show_security_warning_summary">"Zobrazí upozornění v případě potíží se zabezpečeným webem"</string>
+    <string name="pref_security_accept_cookies">"Přijímat soubory cookie"</string>
+    <string name="pref_security_accept_cookies_summary">"Povolí prohlížeči pracovat se soubory cookie"</string>
+    <string name="pref_text_size">"Velikost textu"</string>
+    <!-- no translation found for pref_text_size_choices:0 (4457326528950972067) -->
+    <!-- no translation found for pref_text_size_choices:1 (1555986354512273606) -->
+    <!-- no translation found for pref_text_size_choices:2 (8305896588786870094) -->
+    <!-- no translation found for pref_text_size_choices:3 (696418588578389970) -->
+    <!-- no translation found for pref_text_size_choices:4 (369126115416730900) -->
+    <string name="pref_text_size_dialogtitle">"Velikost textu"</string>
+    <string name="pref_extras_title">"Doplňky"</string>
+    <!-- no translation found for pref_extras_gears_enable (4340581939678973961) -->
+    <skip />
+    <!-- no translation found for pref_extras_gears_enable_summary (8268383434639752615) -->
+    <skip />
+    <!-- no translation found for pref_extras_gears_settings (8134598592309505365) -->
+    <skip />
+    <string name="pref_plugin_installed">"Nainstalované moduly plug-in"</string>
+    <string name="pref_plugin_installed_empty_list">"Žádné nainstalované moduly plug-in"</string>
+    <!-- no translation found for pref_extras_gears_settings_summary (4977594917280947221) -->
+    <skip />
+    <string name="pref_extras_reset_default">"Obnovit nastavení"</string>
+    <string name="pref_extras_reset_default_summary">"Obnovit výchozí nastavení všech hodnot"</string>
+    <string name="pref_extras_reset_default_dlg">"Obnovit výchozí nastavení?"</string>
+    <!-- no translation found for pref_extras_reset_default_dlg_title (3219857287210097506) -->
+    <skip />
+    <string name="pref_development_title">"Ladit"</string>
+    <string name="pref_development_viewport">"Používat širokou pracovní oblast"</string>
+    <string name="pref_development_single_column_rendering">"Zobrazování v jednom sloupci"</string>
+    <string name="pref_development_normal_rendering">"Normální zobrazování"</string>
+    <string name="pref_development_trace">"Povolit trasování"</string>
+    <string name="pref_development_nav_dump">"Povolit výpis mezipaměti navigace"</string>
+    <string name="pref_development_uastring">"Řetězec Desktop UA"</string>
+    <!-- no translation found for pref_development_ua_choices:0 (8502182137122977907) -->
+    <!-- no translation found for pref_development_ua_choices:1 (1998909307307679470) -->
+    <!-- no translation found for pref_development_ua_choices:2 (4853619775017483028) -->
+    <!-- no translation found for pref_development_ua_values:0 (3489778245340350674) -->
+    <!-- no translation found for pref_development_ua_values:1 (6221825100252834342) -->
+    <!-- no translation found for pref_development_ua_values:2 (5248227834068796732) -->
+    <!-- no translation found for pref_default_text_encoding (6304831623703726600) -->
+    <skip />
+    <!-- no translation found for pref_default_text_encoding_choices:0 (8765350839505971955) -->
+    <!-- no translation found for pref_default_text_encoding_choices:1 (77312792454464279) -->
+    <!-- no translation found for pref_default_text_encoding_choices:2 (2253146182935181942) -->
+    <!-- no translation found for pref_default_text_encoding_choices:3 (7817846505944009833) -->
+    <!-- no translation found for pref_default_text_encoding_choices:4 (2895188063888859356) -->
+    <!-- no translation found for pref_default_text_encoding_dialogtitle (3198813978566207575) -->
+    <skip />
+    <!-- no translation found for pref_default_text_encoding_default (6124114302615434355) -->
+    <skip />
+    <string name="browserFrameRedirect">"Přesměrovat"</string>
+    <string name="browserFrame307Post">"Tato webová stránka se nyní přesměruje. Chcete znovu odeslat zadaná data formuláře do nového umístění?"</string>
+    <string name="browserFrameNetworkErrorLabel">"Chyba sítě"</string>
+    <string name="browserFrameFileErrorLabel">"Chyba souboru"</string>
+    <string name="browserFrameFormResubmitLabel">"Potvrdit"</string>
+    <string name="browserFrameFormResubmitMessage">"Stránka, kterou chcete zobrazit, obsahuje data POSTDATA. Pokud znovu odešlete data, zopakují se všechny činnosti provedené formulářem (např. hledání nebo nakupování online)."</string>
+    <string name="loadSuspendedTitle">"Žádné pokrytí sítí!"</string>
+    <string name="loadSuspended">"Načítání stránky je pozastaveno a bude pokračovat po obnovení připojení"</string>
+    <!-- no translation found for clear_history (3513685511948114003) -->
+    <skip />
+    <string name="browser_history">"Historie prohlížeče"</string>
+    <!-- no translation found for empty_history (6213663891559716675) -->
+    <skip />
+    <string name="add_new_bookmark">"Nová záložka"</string>
+    <string name="no_database">"Žádná databáze!"</string>
+    <!-- no translation found for search_hint (6901396674886953519) -->
+    <skip />
+    <!-- no translation found for search (4226978786484971503) -->
+    <skip />
+    <!-- no translation found for search_button_text (154992215859076652) -->
+    <skip />
+    <string name="js_dialog_title_prefix">"Stránka na adrese"</string>
+    <string name="js_dialog_title_suffix">"uvádí:"</string>
+    <string name="js_dialog_title_default">"JavaScript"</string>
+    <!-- no translation found for js_dialog_before_unload (6366800208412705478) -->
+    <skip />
+    <!-- no translation found for attention (2464961428524095045) -->
+    <skip />
+    <!-- no translation found for popup_window_attempt (8398708758010279253) -->
+    <skip />
+    <!-- no translation found for allow (975920461384028355) -->
+    <skip />
+    <!-- no translation found for block (8222234609302978844) -->
+    <skip />
+    <!-- no translation found for too_many_windows_dialog_title (7333114058131121612) -->
+    <skip />
+    <!-- no translation found for too_many_windows_dialog_message (5756910780171823582) -->
+    <skip />
+    <!-- no translation found for too_many_subwindows_dialog_title (2259095685014237401) -->
+    <skip />
+    <!-- no translation found for too_many_subwindows_dialog_message (8649268116653189359) -->
+    <skip />
+    <string name="download_title">"Historie stahování"</string>
+    <string name="download_unknown_filename">"&lt;Neznámý&gt;"</string>
+    <string name="download_menu_open">"Otevřít"</string>
+    <string name="download_menu_clear">"Vymazat ze seznamu"</string>
+    <string name="download_menu_cancel">"Zrušit stahování"</string>
+    <string name="download_menu_cancel_all">"Zrušit stahování"</string>
+    <string name="download_menu_clear_all">"Vymazat seznam"</string>
+    <string name="download_clear_dlg_title">"Vymazat historii stahování?"</string>
+    <string name="download_clear_dlg_msg">"Všechny položky budou vymazány ze seznamu a odebrány z mezipaměti prohlížeče."</string>
+    <string name="download_cancel_dlg_title">"Zrušit všechny soubory ke stažení?"</string>
+    <string name="download_cancel_dlg_msg">"Všech <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> souborů ke stažení bude zrušeno a vymazáno z historie stahování"</string>
+    <string name="download_file_error_dlg_title">"V zařízení je nedostatek volného místa!"</string>
+    <string name="download_file_error_dlg_msg">"Soubor <xliff:g id="FILENAME">%s</xliff:g> nelze stáhnout!"\n"Uvolněte místo a akci zopakujte"</string>
+    <!-- no translation found for download_failed_generic_dlg_title (8562717866914682645) -->
+    <skip />
+    <string name="download_no_sdcard_dlg_title">"Karta SD chybí"</string>
+    <string name="download_no_sdcard_dlg_msg">"Ke stažení souboru <xliff:g id="FILENAME">%s</xliff:g> je požadována karta SD"</string>
+    <!-- no translation found for download_sdcard_busy_dlg_title (3567893864853166417) -->
+    <skip />
+    <!-- no translation found for download_sdcard_busy_dlg_msg (1001912975692187541) -->
+    <skip />
+    <!-- no translation found for download_no_application (5265347124243427089) -->
+    <skip />
+    <string name="retry">"Opakovat"</string>
+    <!-- no translation found for no_downloads (7894879851319497472) -->
+    <skip />
+    <string name="download_error">"Chyba"</string>
+    <string name="download_success">"Stahování souboru <xliff:g id="FILE">%s</xliff:g> dokončeno"</string>
+    <string name="download_running">"Stahování"</string>
+    <string name="download_pending">"Zahájení stahování…"</string>
+    <string name="download_pending_network">"Čekání na síť…"</string>
+    <string name="download_running_paused">"Čekání na síť…"</string>
+    <string name="download_canceled">"Zrušeno"</string>
+    <string name="download_not_acceptable">"Nelze stáhnout; obsah není podporován"</string>
+    <string name="download_file_error">"Stahování nelze dokončit; není dostatek volného místa."</string>
+    <string name="download_length_required">"Nelze stáhnout; nelze zjistit velikost obsahu"</string>
+    <string name="download_precondition_failed">"Stahování bylo přerušeno a nelze jej obnovit"</string>
+    <string name="activity_instrumentation_test_runner">"Spouštěč testu prohlížeče"</string>
+    <!-- no translation found for bookmarks:0 (2669626530219651906) -->
+    <!-- no translation found for bookmarks:1 (8920188753455673436) -->
+    <!-- no translation found for bookmarks:2 (5890527770397510829) -->
+    <!-- no translation found for bookmarks:3 (634634678612400806) -->
+    <!-- no translation found for bookmarks:4 (4132740574133762086) -->
+    <!-- no translation found for bookmarks:5 (6510542478033180946) -->
+    <!-- no translation found for bookmarks:6 (5667186751799051943) -->
+    <!-- no translation found for bookmarks:7 (3378357885957076220) -->
+    <!-- no translation found for bookmarks:8 (2727431815822096867) -->
+    <!-- no translation found for bookmarks:9 (7949295853613367991) -->
+    <!-- no translation found for bookmarks:10 (5985757861847203946) -->
+    <!-- no translation found for bookmarks:11 (6260770464856553368) -->
+    <!-- no translation found for bookmarks:12 (4463319277329080059) -->
+    <!-- no translation found for bookmarks:13 (2636025423846695074) -->
+    <!-- no translation found for bookmarks:14 (2643133601978453087) -->
+    <!-- no translation found for bookmarks:15 (8995994276785373352) -->
+    <!-- no translation found for bookmarks:16 (4894838772550822052) -->
+    <!-- no translation found for bookmarks:17 (7081430327955247093) -->
+    <!-- no translation found for bookmarks:18 (2796182980773740417) -->
+    <!-- no translation found for bookmarks:19 (1324322519589241668) -->
+    <!-- no translation found for bookmarks:20 (1055922756345330887) -->
+    <!-- no translation found for bookmarks:21 (1518235964411311132) -->
+    <!-- no translation found for bookmarks:22 (8138495122223575936) -->
+    <!-- no translation found for bookmarks:23 (8289313955121188870) -->
+    <!-- no translation found for bookmarks:24 (7125621759895702022) -->
+    <!-- no translation found for bookmarks:25 (7609322002140654607) -->
+    <!-- no translation found for permlab_browserHistoryBookmarks (5493497627955922660) -->
+    <skip />
+    <!-- no translation found for permdesc_browserHistoryBookmarksr (3171543258112427347) -->
+    <skip />
+    <!-- no translation found for query_data_message (7140709852400117779) -->
+    <skip />
+    <!-- no translation found for location_message (6511630893995463975) -->
+    <skip />
+    <!-- no translation found for shortcut_message (5568077355697048834) -->
+    <skip />
+    <!-- no translation found for settings_message (1701958693991922301) -->
+    <skip />
+    <!-- no translation found for filepicker_message (5531754350158888098) -->
+    <skip />
+    <!-- no translation found for settings_title (32825391041790606) -->
+    <skip />
+    <!-- no translation found for privacy_policy (1087157192372256439) -->
+    <skip />
+    <!-- no translation found for permission_button_alwaysdeny (7803128350369883866) -->
+    <skip />
+    <!-- no translation found for permission_button_allow (7881835043864608428) -->
+    <skip />
+    <!-- no translation found for permission_button_deny (3548320067085927679) -->
+    <skip />
+    <!-- no translation found for shortcut_button_alwaysdeny (6308157245982840996) -->
+    <skip />
+    <!-- no translation found for shortcut_button_allow (8498946786971248422) -->
+    <skip />
+    <!-- no translation found for shortcut_button_deny (3940523612393573649) -->
+    <skip />
+    <!-- no translation found for settings_button_allow (7851054650645187901) -->
+    <skip />
+    <!-- no translation found for settings_button_deny (3326471281560175933) -->
+    <skip />
+    <!-- no translation found for filepicker_button_allow (5240552202985777948) -->
+    <skip />
+    <!-- no translation found for filepicker_button_deny (1051766005354192724) -->
+    <skip />
+    <!-- no translation found for remove (2594370161087626837) -->
+    <skip />
+    <!-- no translation found for local_storage (5763760818741582585) -->
+    <skip />
+    <!-- no translation found for allowed (8924273826726032911) -->
+    <skip />
+    <!-- no translation found for denied (6492706120626219130) -->
+    <skip />
+    <!-- no translation found for unrecognized_dialog_message (3815294112748134088) -->
+    <skip />
+    <!-- no translation found for default_button (1348925503811332932) -->
+    <skip />
 </resources>
diff --git a/res/values-de-rDE/strings.xml b/res/values-de-rDE/strings.xml
deleted file mode 100644 (file)
index beff7cd..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <string name="action">Anmelden</string>
-  <string name="activity_instrumentation_functional_test_runner">Testlauf Browserfunktion</string>
-  <string name="activity_instrumentation_test_runner">Testlauf Browserfunktion</string>
-  <string name="add_new_bookmark">Neues Lesezeichen</string>
-  <string name="allow">Zulassen</string>
-  <string name="attention">Achtung</string>
-  <string name="back">Zurück</string>
-  <string name="block">Blockieren</string>
-  <string name="bookmark_needs_title">"Lesezeichen müssen einen Namen besitzen."</string>
-  <string name="bookmark_needs_url">"Lesezeichen müssen auf einen Ort weisen."</string>
-  <string name="bookmark_page">Zuletzt angesehene Seite mit Lesezeichen versehen</string>
-  <string name="bookmark_saved">Unter Lesezeichen gespeichert.</string>
-  <string name="bookmark_url_not_valid">URL ist nicht gültig.</string>
-  <string name="bookmarks">Lesezeichen</string>
-  <string name="browserFrame307Post">Für diese Webseite gibt es einen anderen Ort. Möchten Sie die im Formzlar eingegebenen Daten zu diesem Ort senden?</string>
-  <string name="browserFrameFileErrorLabel">Problem mit der Datei</string>
-  <string name="browserFrameFormResubmitLabel">Bestätigen</string>
-  <string name="browserFrameFormResubmitMessage">Die Seite, die Sie ansehen möchten, enthält Daten, die bereits übertragen wurden (\"POSTDATA\"). Wenn Sie die Daten erneut senden, werden alle Aktionen, die vom Formular auf der Seite veranlasst werden (z. B. eine Suche oder ein Online-Kauf) wiederholt.</string>
-  <string name="browserFrameNetworkErrorLabel">Problem mit Datenverbindung</string>
-  <string name="browserFrameRedirect">Umleiten</string>
-  <string name="browser_bookmarks_page_bookmarks_text">Lesezeichen</string>
-  <string name="browser_history">Zuletzt besuchte Seiten</string>
-  <string name="cache_cleared">Cache gelöscht</string>
-  <string name="cancel">Abbrechen</string>
-  <string name="clear">Löschen</string>
-  <string name="clear_history">Verlauf löschen</string>
-  <string name="close">Schließen</string>
-  <string name="close_window">Dieses Fenster wird geschlossen.</string>
-  <string name="common_name">Allgemeiner Name:</string>
-  <string name="contextmenu_add_contact">Kontakt hinzufügen</string>
-  <string name="contextmenu_bookmark_thislink">Lesezeichen Verknüpfung</string>
-  <string name="contextmenu_copy">Kopieren</string>
-  <string name="contextmenu_copylink">URL Verknüpfung kopieren</string>
-  <string name="contextmenu_dial_dot">Wählen\u2026</string>
-  <string name="contextmenu_download_image">Bild speichern</string>
-  <string name="contextmenu_javascript">JavaScript</string>
-  <string name="contextmenu_map">Landkarte</string>
-  <string name="contextmenu_openlink">Öffnen</string>
-  <string name="contextmenu_openlink_newwindow">In neuem Fenster öffnen</string>
-  <string name="contextmenu_savelink">Verknüpfung speichern</string>
-  <string name="contextmenu_send_mail">E-Mail senden</string>
-  <string name="contextmenu_sharelink">Verknüpfung freigeben</string>
-  <string name="contextmenu_view_image">Bild anzeigen</string>
-  <string name="current_page">Aktuelle Seite:\u0020</string>
-  <string name="delete">Löschen</string>
-  <string name="delete_bookmark">Löschen</string>
-  <string name="delete_bookmark_warning">Lesezeichen \"<xliff:g id="bookmark">%s</xliff:g>\" wird gelöscht.</string>
-  <string name="do_not_save">Abbrechen</string>
-  <string name="done">Fertig</string>
-  <string name="download_cancel_dlg_msg">Alle <xliff:g id="download_count">%d</xliff:g> Downloads werden abgebrochen und aus dem Verlauf des Herunterladens entfernt.</string>
-  <string name="download_cancel_dlg_title">Herunterladen abbrechen</string>
-  <string name="download_canceled">Herunterladen abgebrochen.</string>
-  <string name="download_clear_dlg_msg">Alle Elemente werden in der Liste gelöscht und aus dem Browser-Cache (Zwischenspeicher) entfernt.</string>
-  <string name="download_clear_dlg_title">Löschen</string>
-  <string name="download_error">Herunterladen nicht erfolgreich.</string>
-  <string name="download_failed_generic_dlg_title">Herunterladen nicht erfolgreich</string>
-  <string name="download_file_error">Herunterladen kann nicht komplett durchgeführt werden. Der freie Speicherplatz reicht nicht aus.</string>
-  <string name="download_file_error_dlg_msg"><xliff:g id="filename">%s</xliff:g> konnte nicht heruntergeladen werden.\nStellen Sie zusätzlichen Speicher auf dem Telefon bereit und versuchen Sie es erneut.</string>
-  <string name="download_file_error_dlg_title">Speicherplatz reicht nicht aus</string>
-  <string name="download_length_required">Herunterladen kann nicht durchgeführt werden. Die Größe des Elementes kann nicht ermittelt werden.</string>
-  <string name="download_menu_cancel">Herunterladen abbrechen</string>
-  <string name="download_menu_cancel_all">Alle Herunterladungen abbrechen</string>
-  <string name="download_menu_clear">Aus Liste löschen</string>
-  <string name="download_menu_clear_all">Liste löschen</string>
-  <string name="download_menu_open">Öffnen</string>
-  <string name="download_no_application">Es gibt keine Anwendung zum Öffnen dieser Datei.</string>
-  <string name="download_no_sdcard_dlg_msg">Eine SD-Karte wird für das Herunterladen von <xliff:g id="filename">%s</xliff:g> benötigt.</string>
-  <string name="download_no_sdcard_dlg_title">Keine SD-Karte</string>
-  <string name="download_not_acceptable">Herunterladen kann nicht durchgeführt werden. Die Inhalte, die heruntergeladen werden sollen, werden vom Telefon nicht unterstützt.</string>
-  <string name="download_pending">Herunterladen wird gestartet\u2026</string>
-  <string name="download_pending_network">Warten auf Datenverbindung\u2026</string>
-  <string name="download_precondition_failed">Herunterladen wurde unterbrochen. Wiederaufnahme nicht möglich.</string>
-  <string name="download_running">Beim Herunterladen\u2026</string>
-  <string name="download_running_paused">Warten auf Datenverbindung\u2026</string>
-  <string name="download_success"><xliff:g id="file">%s</xliff:g> Herunterladen abgeschlossen.</string>
-  <string name="download_title">Verlauf des Herunterladens</string>
-  <string name="download_unknown_filename">&lt;Unbekannt&gt;</string>
-  <string name="dump_nav">Navigations-Cache löschen</string>
-  <string name="edit_bookmark">Lesezeichen bearbeiten</string>
-  <string name="empty_bookmark">"Es kann kein leeres Lesezeichen erstellt werden."</string>
-  <string name="empty_history">Browser-Verlauf ist leer.</string>
-  <string name="expires_on">Gültig bis:</string>
-  <string name="find_dot">Suchen auf Seite</string>
-  <string name="fingerprints">Fingerabdrücke:</string>
-  <string name="forward">Weiterleiten</string>
-  <string name="goto_dot">Gehe zu URL</string>
-  <string name="history">Verlauf</string>
-  <string name="history_picker_view_web_page">Öffnen</string>
-  <string name="homepage">Startseite</string>
-  <string name="homepage_set">Startseite aktualisiert</string>
-  <string name="http">http://</string>
-  <string name="info_base">Titel:\n  <xliff:g id="title">%s1</xliff:g> \n\nURL: \n  <xliff:g id="url">%s2</xliff:g></string>
-  <string name="issued_by">Herausgegeben von:</string>
-  <string name="issued_on">Herausgegeben am:</string>
-  <string name="issued_to">Herausgegeben an:</string>
-  <string name="js_dialog_before_unload">Diese Seite verlassen?\n\n<xliff:g id="message">%s</xliff:g>\n\nWählen Sie »OK« zur Fortsetzung oder »Abbrechen«, um auf aktueller Seite zu bleiben.</string>
-  <string name="js_dialog_title_default">JavaScript</string>
-  <string name="js_dialog_title_prefix">Die Seite auf</string>
-  <string name="js_dialog_title_suffix">gibt an:</string>
-  <string name="loadSuspended">Das Laden der Seite wird fortgesetzt, nachdem die Verbindung wiederhergestellt wurde.</string>
-  <string name="loadSuspendedTitle">Keine Netzverbindung</string>
-  <string name="location">Ort</string>
-  <string name="matches_found">Gefundene Übereinstimmungen:</string>
-  <string name="md5_fingerprint">MD5-Fingerabdruck:</string>
-  <string name="menu_bookmark_page">Lesezeichen für diese Seite</string>
-  <string name="menu_flip_orientation">Ausrichtung wechseln</string>
-  <string name="menu_preferences">Einstellungen</string>
-  <string name="menu_use_as_homepage">Als Startseite einstellen</string>
-  <string name="menu_view_download">Heruntergeladen</string>
-  <string name="menu_zoom">Zoom</string>
-  <string name="name">Name</string>
-  <string name="new_window">Neues Fenster</string>
-  <string name="next">Weiter</string>
-  <string name="no_database">Keine Datenbank!</string>
-  <string name="no_downloads">Verlauf des Herunterladens ist leer.</string>
-  <string name="ok">OK</string>
-  <string name="oma_error_failed_to_download">Medien können nicht heruntergeladen werden.</string>
-  <string name="oma_error_insufficient_memory">Speicher reicht nicht aus! Prüfen Sie die SD-Karte.</string>
-  <string name="oma_error_invalid_descriptor">Beschreibung des Herunterladen-Ziels ungültig. </string>
-  <string name="oma_error_non_acceptable_content">Inhalte werden nicht unterstützt.</string>
-  <string name="oma_label_action">Herunterladen</string>
-  <string name="oma_label_cancel">Beenden</string>
-  <string name="oma_label_description">Beschreibung:</string>
-  <string name="oma_label_download_error">Fehler beim Herunterladen:</string>
-  <string name="oma_label_exit">Beenden</string>
-  <string name="oma_label_name">Name:</string>
-  <string name="oma_label_proceed">Fortfahren</string>
-  <string name="oma_label_size">Größe:</string>
-  <string name="oma_label_type">Typ:</string>
-  <string name="oma_label_vendor">Anbieter:</string>
-  <string name="oma_label_want_to_download">Möchten Sie diese Inhalte herunterladen?</string>
-  <string name="oma_status_attribute_mismatch">Attribut passt nicht</string>
-  <string name="oma_status_device_aborted">Telefongespräch unterbrochen</string>
-  <string name="oma_status_insufficient_memory">Speicher reicht nicht aus</string>
-  <string name="oma_status_invalid_descriptor">Ungültige Beschreibung</string>
-  <string name="oma_status_invalid_version">Ungültige Version</string>
-  <string name="oma_status_loader_error">Ladefehler</string>
-  <string name="oma_status_loss_of_service">Verlust des Dienstes</string>
-  <string name="oma_status_non_acceptable_content">Nicht akzeptierbare Inhalte</string>
-  <string name="oma_status_success">Erfolgreich</string>
-  <string name="oma_warning_one_or_more_types_not_supported">Eine oder mehrere Inhaltskategorien werden nicht unterstützt.</string>
-  <string name="open_bookmark">Öffnen</string>
-  <string name="open_in_new_window">In neuem Fenster öffnen</string>
-  <string name="org_name">Organisation:</string>
-  <string name="org_unit">Organisatorische Einheit:</string>
-  <string name="override">Ersetzen</string>
-  <string name="override_message">Die bestehenden Lesezeichen werden ersetzt.</string>
-  <string name="page_info">Seiteninfo</string>
-  <string name="page_info_address">Adresse:</string>
-  <string name="page_info_cache_source">Cache-Quelle:</string>
-  <string name="page_info_encoding">Kodierung:</string>
-  <string name="page_info_expires">Gültig bis:</string>
-  <string name="page_info_modified">Geändert am:</string>
-  <string name="page_info_referring_url">Bezugs-URL:</string>
-  <string name="page_info_render_mode">Umsetzungsmodus:</string>
-  <string name="page_info_size">Größe:</string>
-  <string name="page_info_type">Typ:</string>
-  <string name="page_info_view">Seiteninfo anzeigen</string>
-  <string name="password">Kennwort</string>
-  <string name="popup_window_attempt">Diese Site versucht ein
-      Popup-Fenster zu öffnen.</string>
-  <string name="pref_content_autofit">Seiten automatisch einpassen</string>
-  <string name="pref_content_autofit_summary">Webseiten formatieren, um sie in den Bildschirm einzupassen</string>
-  <string name="pref_content_block_popups">Popup-Fenster blockieren</string>
-  <string name="pref_content_homepage">Als Startseite einstellen</string>
-  <string name="pref_content_javascript">JavaScript aktivieren</string>
-  <string name="pref_content_load_images">Bilder laden</string>
-  <string name="pref_content_load_images_summary">Bilder auf Webseiten anzeigen</string>
-  <string name="pref_content_open_in_background">Im Hintergrund öffnen</string>
-  <string name="pref_content_open_in_background_summary">Neue Fenster hinter aktuellem Fenster öffnen</string>
-  <string name="pref_content_title">Einstellungen für Seiteninhalte</string>
-  <string name="pref_development_nav_dump">Löschen von Nav.-Cache aktivieren</string>
-  <string name="pref_development_normal_rendering">Normales Umsetzen</string>
-  <string name="pref_development_single_column_rendering">Umsetzen einer Spalte</string>
-  <string name="pref_development_title">Programmfehler entfernen</string>
-  <string name="pref_development_trace">Tracing aktivieren</string>
-  <string name="pref_development_track">Trackball aktivieren</string>
-  <string name="pref_development_uastring">UA (User Agent) String</string>
-  <string name="pref_development_viewport">Weite Darstellung im Browser (Viewport) verwenden</string>
-  <string name="pref_extras_gears_enable">Gears aktivieren</string>
-  <string name="pref_extras_gears_enable_summary">Anwendungen, die die Browser-Funktionalität erweitern</string>
-  <string name="pref_extras_gears_settings">Gears-Einstellungen</string>
-  <string name="pref_extras_gears_settings_summary">Anwendungen, die die Browser-Funktionalität erweitern</string>
-  <string name="pref_extras_reset_default">Standard wiederherstellen</string>
-  <string name="pref_extras_reset_default_dlg">Alle Browserdaten werden gelöscht und die Einstellungen werden auf die Standardwerte zurückgesetzt.</string>
-  <string name="pref_extras_reset_default_dlg_title">Standard wiederherstellen</string>
-  <string name="pref_extras_reset_default_summary">Alle Browserdaten löschen und Einstellungen auf Standardwerte zurücksetzen</string>
-  <string name="pref_extras_title">Erweiterte Einstellungen</string>
-  <string name="pref_plugin_installed_empty_listxx">Nicht installierte Plugins.</string>
-  <string name="pref_plugin_installed_summaryxx">Aktuell installierte Plugins anzeigen</string>
-  <string name="pref_privacy_clear_cache">Zwischenspeicher löschen</string>
-  <string name="pref_privacy_clear_cache_dlg">Der Zwischenspeicher wird gelöscht.</string>
-  <string name="pref_privacy_clear_cache_summary">Alle im Zwischenspeicher gespeicherten Seiteninhalte löschen</string>
-  <string name="pref_privacy_clear_cookies">Alle Cookie-Daten löschen</string>
-  <string name="pref_privacy_clear_cookies_dlg">Alle Cookies werden gelöscht.</string>
-  <string name="pref_privacy_clear_cookies_summary">Alle Browser-Cookies löschen</string>
-  <string name="pref_privacy_clear_form_data">Formulardaten löschen</string>
-  <string name="pref_privacy_clear_form_data_dlg">Alle gespeicherten Formulardaten werden gelöscht.</string>
-  <string name="pref_privacy_clear_form_data_summary">Alle gespeicherten Formulardaten löschen</string>
-  <string name="pref_privacy_clear_history">Verlauf löschen</string>
-  <string name="pref_privacy_clear_history_dlg">Der Navigationsverlauf des Browsers wird gelöscht.</string>
-  <string name="pref_privacy_clear_history_summary">Navigationsverlauf des Browsers löschen</string>
-  <string name="pref_privacy_clear_passwords">Kennworte löschen</string>
-  <string name="pref_privacy_clear_passwords_dlg">Alle gespeicherten Kennworte werden gelöscht.</string>
-  <string name="pref_privacy_clear_passwords_summary">Alle gespeicherten Kennworte löschen</string>
-  <string name="pref_privacy_title">Datenschutzeinstellungen</string>
-  <string name="pref_security_accept_cookies">Cookies akzeptieren</string>
-  <string name="pref_security_accept_cookies_summary">Seiten ermöglichen \"cookie\"-Daten zu speichern und zu lesen</string>
-  <string name="pref_security_remember_passwords">An Kennworte erinnern</string>
-  <string name="pref_security_remember_passwords_summary">Benutzernamen und Kennworte für Webseiten speichern</string>
-  <string name="pref_security_save_form_data">An Formulardaten erinnern</string>
-  <string name="pref_security_save_form_data_summary">An Daten erinnern, die in Formulare eingegeben wurden</string>
-  <string name="pref_security_show_security_warning">Sicherheitswarnungen anzeigen</string>
-  <string name="pref_security_show_security_warning_summary">Warnung anzeigen, wenn es ein Problem mit der Sicherheit einer Seite gibt</string>
-  <string name="pref_security_title">Sicherheitseinstellungen</string>
-  <string name="pref_text_size">Textgröße</string>
-  <string name="pref_text_size_dialogtitle">Textgröße</string>
-  <string name="pref_text_size_summary">Größe von Text auf Webseiten auswählen</string>
-  <string name="prev">Zurück</string>
-  <string name="question_mark">\?</string>
-  <string name="reload">Aktualisieren</string>
-  <string name="remove_bookmark">Lesezeichen löschen</string>
-  <string name="remove_history_item">Aus Verlauf entfernen</string>
-  <string name="replace">Ersetzen</string>
-  <string name="retrieving_creds_dlg_msg">Anmeldedetails abrufen\u2026</string>
-  <string name="retry">Wiederholen</string>
-  <string name="save">OK</string>
-  <string name="save_to_bookmarks">Lesezeichen Verknüpfung</string>
-  <string name="search">Suchen</string>
-  <string name="search_button_text">Gehe zu</string>
-  <string name="search_hint">Webadresse eingeben</string>
-  <string name="search_label">Browser</string>
-  <string name="security_warning">Sicherheitswarnung</string>
-  <string name="sha1_fingerprint">Fingerabdruck gemäß SHA1:</string>
-  <string name="share_page">Seite freigeben</string>
-  <string name="shortcut_bookmark">Lesezeichen</string>
-  <string name="sign_in_to">Bei <xliff:g id="hostname">%s1</xliff:g> \"<xliff:g id="realm">%s2</xliff:g>\" anmelden</string>
-  <string name="ssl_certificate">Sicherheitszertifikat</string>
-  <string name="ssl_certificate_is_valid">Dieses Zertifikat ist gültig.</string>
-  <string name="ssl_continue">Fortfahren</string>
-  <string name="ssl_expired">Dieses Zertifikat ist nicht mehr gültig.</string>
-  <string name="ssl_mismatch">Der Name der Seite stimmt nicht mit dem Namen des Zertifikats überein.</string>
-  <string name="ssl_not_yet_valid">Dieses Zertifikat ist noch nicht gültig.</string>
-  <string name="ssl_untrusted">Dieses Zertifikat wurde von keiner zuverlässigen Stelle ausgestellt.</string>
-  <string name="ssl_warnings_header">Es gibt Probleme mit dem Sicherheitszertifikat für diese Seite.</string>
-  <string name="stop">Anhalten</string>
-  <string name="stopping">Anhalten\u2026</string>
-  <string name="tab_picker_bookmark">Lesezeichen</string>
-  <string name="tab_picker_new_tab">Neues Fenster</string>
-  <string name="tab_picker_remove_tab">Schließen</string>
-  <string name="tab_picker_send_url">Verknüpfung freigeben</string>
-  <string name="tab_picker_title">Aktuelle Fenster</string>
-  <string name="tab_picker_view_tab">Ansicht</string>
-  <string name="too_many_subwindows_dialog_message">Neues Popup-Fenster
-     konnte nicht geöffnet werden, da nicht mehr als ein Fenster gleichzeitig geöffnet werden kann.</string>
-  <string name="too_many_subwindows_dialog_title">Pop-up-Fenster bereits geöffnet</string>
-  <string name="too_many_windows_dialog_message">Neues Fenster konnte nicht geöffnet werden, da bereits die maximale Anzahl von Fenstern geöffnet ist.</string>
-  <string name="too_many_windows_dialog_title">Maximale Fensteranzahl erreicht</string>
-  <string name="username">Name</string>
-  <string name="validity_period">Gültigkeit:</string>
-  <string name="view_certificate">Zertifikat anzeigen</string>
-  <string name="view_tabs">Fensterübersicht</string>
-  <string name="view_tabs_condensed">Fenster</string>
-  <string name="visual_history">Fensterverlauf</string>
-  <string name="with">mit</string>
-  <string name="zero">0</string>
-</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
new file mode 100644 (file)
index 0000000..e943084
--- /dev/null
@@ -0,0 +1,338 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="sign_in_to">"Bei <xliff:g id="HOSTNAME">%s1</xliff:g> \"<xliff:g id="REALM">%s2</xliff:g>\" anmelden"</string>
+    <string name="username">"Name"</string>
+    <string name="password">"Passwort"</string>
+    <string name="action">"Anmelden"</string>
+    <string name="cancel">"Abbrechen"</string>
+    <string name="ok">"OK"</string>
+    <!-- no translation found for matches_found (4019114285322631887) -->
+    <skip />
+    <!-- no translation found for zero (5187607177868389265) -->
+    <skip />
+    <string name="page_info">"Seiten-Info"</string>
+    <string name="page_info_view">"Seiten-Info anzeigen"</string>
+    <string name="page_info_address">"Adresse:"</string>
+    <string name="ssl_warnings_header">"Es ist ein Problem mit dem Sicherheitszertifikat für diese Website aufgetreten."</string>
+    <string name="ssl_continue">"Fortfahren"</string>
+    <string name="security_warning">"Sicherheitswarnung"</string>
+    <string name="view_certificate">"Zertifikat anzeigen"</string>
+    <string name="ssl_untrusted">"Dieses Zertifikat wurde nicht von einer vertrauenswürdigen Stelle ausgegeben."</string>
+    <string name="ssl_mismatch">"Der Name der Website stimmt nicht mit dem Namen auf dem Zertifikat überein."</string>
+    <string name="ssl_expired">"Dieses Zertifikat ist abgelaufen."</string>
+    <string name="ssl_not_yet_valid">"Dieses Zertifikat ist noch nicht gültig."</string>
+    <string name="ssl_certificate">"Sicherheitszertifikat"</string>
+    <string name="ssl_certificate_is_valid">"Dies ist ein gültiges Zertifikat."</string>
+    <string name="issued_to">"Ausgegeben an:"</string>
+    <string name="common_name">"Allgemeiner Name."</string>
+    <string name="org_name">"Organisation:"</string>
+    <string name="org_unit">"Organisationseinheit:"</string>
+    <string name="issued_by">"Ausgegeben von:"</string>
+    <string name="validity_period">"Gültigkeit:"</string>
+    <string name="issued_on">"Ausgegeben am:"</string>
+    <string name="expires_on">"Läuft ab am:"</string>
+    <string name="retrieving_creds_dlg_msg">"Anmeldedetails werden abgerufen…"</string>
+    <string name="close">"Schließen"</string>
+    <string name="close_window">"Dieses Fenster wird geschlossen."</string>
+    <string name="stopping">"Wird angehalten..."</string>
+    <string name="stop">"Anhalten"</string>
+    <string name="reload">"Aktualisieren"</string>
+    <string name="back">"Zurück"</string>
+    <string name="forward">"Weiter"</string>
+    <string name="save">"OK"</string>
+    <string name="do_not_save">"Abbrechen"</string>
+    <string name="location">"Ort"</string>
+    <string name="name">"Name"</string>
+    <string name="http">"http://"</string>
+    <!-- no translation found for save_to_bookmarks (4680844117598293907) -->
+    <skip />
+    <string name="edit_bookmark">"Lesezeichen bearbeiten"</string>
+    <!-- no translation found for create_shortcut_bookmark (9202323987633899835) -->
+    <skip />
+    <string name="open_bookmark">"Öffnen"</string>
+    <string name="remove_bookmark">"Lesezeichen löschen"</string>
+    <string name="remove_history_item">"Aus Verlauf entfernen"</string>
+    <string name="bookmark_saved">"Gespeichert in Lesezeichen."</string>
+    <string name="bookmark_needs_title">"Das Lesezeichen muss über einen Namen verfügen."</string>
+    <string name="bookmark_needs_url">"Das Lesezeichen muss über einen Speicherort verfügen."</string>
+    <string name="empty_bookmark">"Sie können kein leeres Lesezeichen erstellen."</string>
+    <string name="bookmark_url_not_valid">"URL ist nicht gültig."</string>
+    <string name="delete_bookmark">"Löschen"</string>
+    <string name="bookmark_page">"Lesezeichen für zuletzt besuchte Seite"</string>
+    <string name="current_page">"Aktuelle Seite:"</string>
+    <string name="delete_bookmark_warning">"Lesezeichen \"<xliff:g id="BOOKMARK">%s</xliff:g>\" wird gelöscht."</string>
+    <string name="open_in_new_window">"In neuem Fenster öffnen"</string>
+    <string name="new_window">"Neues Fenster"</string>
+    <string name="goto_dot">"Gehe zu URL"</string>
+    <string name="find_dot">"Auf Seite suchen"</string>
+    <string name="homepage">"Startseite"</string>
+    <string name="view_tabs">"Fensterübersicht"</string>
+    <!-- no translation found for view_tabs_condensed (5803955493821945369) -->
+    <skip />
+    <string name="tab_picker_title">"Aktuelle Fenster"</string>
+    <string name="tab_picker_view_tab">"Anzeigen"</string>
+    <string name="tab_picker_new_tab">"Neues Fenster"</string>
+    <string name="tab_picker_remove_tab">"Schließen"</string>
+    <string name="tab_picker_bookmark">"Lesezeichen"</string>
+    <string name="tab_picker_send_url">"Link weiterleiten"</string>
+    <string name="bookmarks">"Lesezeichen"</string>
+    <string name="shortcut_bookmark">"Lesezeichen"</string>
+    <string name="history">"Suchverlauf"</string>
+    <string name="menu_view_download">"Downloads"</string>
+    <string name="menu_bookmark_page">"Lesezeichen-Seite"</string>
+    <string name="share_page">"Seitenlink weiterleiten"</string>
+    <string name="menu_zoom">"Zoom"</string>
+    <string name="menu_flip_orientation">"Ausrichtung drehen"</string>
+    <string name="contextmenu_openlink">"Öffnen"</string>
+    <string name="contextmenu_openlink_newwindow">"In neuem Fenster öffnen"</string>
+    <string name="contextmenu_bookmark_thislink">"Lesezeichen-Link"</string>
+    <string name="contextmenu_savelink">"Link speichern"</string>
+    <string name="contextmenu_sharelink">"Link weiterleiten"</string>
+    <string name="contextmenu_copy">"Kopieren"</string>
+    <string name="contextmenu_copylink">"Link-URL kopieren"</string>
+    <string name="contextmenu_download_image">"Bild speichern"</string>
+    <string name="contextmenu_view_image">"Bild anzeigen"</string>
+    <string name="contextmenu_dial_dot">"Wählen..."</string>
+    <string name="contextmenu_add_contact">"Kontakt hinzufügen"</string>
+    <string name="contextmenu_send_mail">"E-Mail senden"</string>
+    <string name="contextmenu_map">"Karte"</string>
+    <string name="clear">"Löschen"</string>
+    <string name="replace">"Ersetzen"</string>
+    <string name="browser_bookmarks_page_bookmarks_text">"Lesezeichen"</string>
+    <string name="menu_preferences">"Einstellungen"</string>
+    <string name="pref_content_title">"Einstellungen für Seiteninhalt"</string>
+    <string name="pref_content_load_images">"Bilder laden"</string>
+    <string name="pref_content_load_images_summary">"Bilder auf Webseiten anzeigen"</string>
+    <string name="pref_content_block_popups">"Popup-Fenster blockieren"</string>
+    <string name="pref_content_javascript">"JavaScript aktivieren"</string>
+    <string name="pref_content_open_in_background">"Im Hintergrund öffnen"</string>
+    <string name="pref_content_open_in_background_summary">"Neue Fenster hinter dem aktuellen Fenster geöffnet"</string>
+    <string name="pref_content_homepage">"Startseite festlegen"</string>
+    <string name="pref_content_autofit">"Seiten autom. anpassen"</string>
+    <string name="pref_content_autofit_summary">"Webseiten an den Bildschirm anpassen"</string>
+    <string name="pref_privacy_title">"Datenschutzeinstellungen"</string>
+    <string name="pref_privacy_clear_cache">"Cache löschen"</string>
+    <string name="pref_privacy_clear_cache_summary">"Alle Seiteninhalte im Cache löschen"</string>
+    <string name="pref_privacy_clear_cache_dlg">"Der Cache wird gelöscht."</string>
+    <string name="pref_privacy_clear_cookies">"Alle Cookiedaten löschen"</string>
+    <string name="pref_privacy_clear_cookies_summary">"Alle Browser-Cookies löschen"</string>
+    <string name="pref_privacy_clear_cookies_dlg">"Alle Cookies werden gelöscht."</string>
+    <string name="pref_privacy_clear_history">"Verlauf löschen"</string>
+    <string name="pref_privacy_clear_history_summary">"Navigationsverlauf des Browsers löschen"</string>
+    <string name="pref_privacy_clear_history_dlg">"Der Navigationsverlauf des Browsers wird gelöscht."</string>
+    <string name="pref_privacy_clear_form_data">"Formulardaten löschen"</string>
+    <string name="pref_privacy_clear_form_data_summary">"Alle gespeicherten Formulardaten löschen"</string>
+    <string name="pref_privacy_clear_form_data_dlg">"Alle gespeicherten Formulardaten werden gelöscht."</string>
+    <string name="pref_privacy_clear_passwords">"Passwörter löschen"</string>
+    <string name="pref_privacy_clear_passwords_summary">"Alle gespeicherten Passwörter löschen"</string>
+    <string name="pref_privacy_clear_passwords_dlg">"Alle gespeicherten Passwörter werden gelöscht."</string>
+    <string name="pref_security_title">"Sicherheitseinstellungen"</string>
+    <string name="pref_security_remember_passwords">"Passwörter merken"</string>
+    <string name="pref_security_remember_passwords_summary">"Nutzernamen und Passwörter für Websites speichern"</string>
+    <string name="pref_security_save_form_data">"Formulardaten merken"</string>
+    <string name="pref_security_save_form_data_summary">"Daten in Formularen zur späteren Verwendung merken"</string>
+    <string name="pref_security_show_security_warning">"Sicherheitswarnungen"</string>
+    <string name="pref_security_show_security_warning_summary">"Warnung anzeigen, wenn ein Problem mit der Sicherheit der Website besteht"</string>
+    <string name="pref_security_accept_cookies">"Cookies akzeptieren"</string>
+    <string name="pref_security_accept_cookies_summary">"Speichern und Lesen von \"Cookie\"-Daten zulassen"</string>
+    <!-- no translation found for pref_text_size (3765589440020504007) -->
+    <skip />
+  <string-array name="pref_text_size_choices">
+    <item>"Sehr klein"</item>
+    <item>"Klein"</item>
+    <item>"Normal"</item>
+    <item>"Groß"</item>
+    <item>"Sehr groß"</item>
+  </string-array>
+    <string name="pref_text_size_dialogtitle">"Textgröße"</string>
+    <string name="pref_extras_title">"Erweiterte Einstellungen"</string>
+    <string name="pref_extras_gears_enable">"Gears aktivieren"</string>
+    <string name="pref_extras_gears_enable_summary">"Anwendungen, die die Browserfunktionen erweitern"</string>
+    <string name="pref_extras_gears_settings">"Gears-Einstellungen"</string>
+    <!-- no translation found for pref_plugin_installed (6387683936112106178) -->
+    <skip />
+    <!-- no translation found for pref_plugin_installed_empty_list (6656686482480679665) -->
+    <skip />
+    <string name="pref_extras_gears_settings_summary">"Vom Browser nicht unterstützte Anwendungen"</string>
+    <string name="pref_extras_reset_default">"Auf Standard zurücksetzen"</string>
+    <string name="pref_extras_reset_default_summary">"Alle Browserdaten löschen und alle Einstellungen auf Standardeinstellung zurücksetzen"</string>
+    <string name="pref_extras_reset_default_dlg">"Alle Browserdaten werden gelöscht. Alle Einstellungen werden auf die Standardeinstellung zurückgesetzt."</string>
+    <string name="pref_extras_reset_default_dlg_title">"Auf Standardeinstellung zurücksetzen"</string>
+    <string name="pref_development_title">"Debuggen"</string>
+    <string name="pref_development_viewport">"Use wide viewport"</string>
+    <string name="pref_development_single_column_rendering">"Single column rendering"</string>
+    <string name="pref_development_normal_rendering">"Normal rendering"</string>
+    <string name="pref_development_trace">"Enable tracing"</string>
+    <string name="pref_development_nav_dump">"Enable nav cache dump"</string>
+    <!-- no translation found for pref_development_search_url (7979283099657732298) -->
+    <skip />
+    <string name="pref_development_uastring">"UAString"</string>
+  <string-array name="pref_development_ua_choices">
+    <item>"Android"</item>
+    <item>"Google Desktop"</item>
+    <item>"iPhone"</item>
+  </string-array>
+  <string-array name="pref_development_ua_values">
+    <item>"0"</item>
+    <item>"1"</item>
+    <item>"2"</item>
+  </string-array>
+    <!-- no translation found for pref_default_text_encoding (2689164865300623884) -->
+    <skip />
+    <!-- no translation found for pref_default_text_encoding_choices:0 (7275223955790513818) -->
+    <!-- no translation found for pref_default_text_encoding_choices:1 (2456597866837587140) -->
+    <!-- no translation found for pref_default_text_encoding_choices:2 (7143715548814380950) -->
+    <!-- no translation found for pref_default_text_encoding_choices:3 (5111312120564516587) -->
+    <!-- no translation found for pref_default_text_encoding_choices:4 (6545734186479713946) -->
+    <!-- no translation found for pref_default_text_encoding_dialogtitle (5508255018084978547) -->
+    <skip />
+    <!-- no translation found for pref_default_text_encoding_default (5272126711231936722) -->
+    <skip />
+    <string name="browserFrameRedirect">"Redirect"</string>
+    <string name="browserFrame307Post">"Diese Webseite wird umgeleitet. Sollen Ihre eingegebenen Formulardaten an den neuen Ort gesendet werden?"</string>
+    <string name="browserFrameNetworkErrorLabel">"Datenverbindungsproblem"</string>
+    <string name="browserFrameFileErrorLabel">"Problem mit Datei"</string>
+    <string name="browserFrameFormResubmitLabel">"Bestätigen"</string>
+    <string name="browserFrameFormResubmitMessage">"Die Seite, die Sie anzuzeigen versuchen, enthält Daten, die bereits gesendet wurde (\"POST-DATEN\"). Wenn Sie die Daten erneut senden, wird jede Aktion, die das Formular auf der Seite ausgeführt hat, wiederholt (wie beispielsweise eine Suche oder ein Online-Kauf)."</string>
+    <string name="loadSuspendedTitle">"Keine Netzwerkverbindung"</string>
+    <string name="loadSuspended">"Die Seite wird weiter geladen, nachdem die Verbindung wiederhergestellt wurde."</string>
+    <string name="clear_history">"Verlauf löschen"</string>
+    <string name="browser_history">"Zuletzt besuchte Seiten"</string>
+    <string name="empty_history">"Browserverlauf ist leer."</string>
+    <string name="add_new_bookmark">"Neues Lesezeichen"</string>
+    <string name="no_database">"Keine Datenbank!"</string>
+    <string name="search_hint">"Webadresse eingeben"</string>
+    <string name="search">"Suche"</string>
+    <string name="search_button_text">"Los"</string>
+    <string name="js_dialog_title_prefix">"Die Seite auf"</string>
+    <string name="js_dialog_title_suffix">"zeigt an:"</string>
+    <string name="js_dialog_title_default">"JavaScript"</string>
+    <string name="js_dialog_before_unload">"Von dieser Seite navigieren?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Wählen Sie \"OK\", um fortzufahren, oder wählen Sie \"Abbrechen\", um auf der aktuellen Seite zu bleiben."</string>
+    <string name="attention">"Achtung"</string>
+    <string name="popup_window_attempt">"Diese Website versucht, ein Pop-up-Fenster zu öffnen."</string>
+    <string name="allow">"Zulassen"</string>
+    <string name="block">"Blockieren"</string>
+    <string name="too_many_windows_dialog_title">"Fensterlimit erreicht"</string>
+    <string name="too_many_windows_dialog_message">"Es konnte kein neues Fenster geöffnet werden, da Sie bereits die maximale Anzahl an Fenstern geöffnet haben."</string>
+    <string name="too_many_subwindows_dialog_title">"Pop-up ist bereits geöffnet"</string>
+    <string name="too_many_subwindows_dialog_message">"Es konnte kein neues Pop-up-Fenster geöffnet werden, da nur jeweils ein Fenster geöffnet sein kann."</string>
+    <string name="download_title">"Downloadverlauf"</string>
+    <string name="download_unknown_filename">"&lt;Unbekannt&gt;"</string>
+    <string name="download_menu_open">"Öffnen"</string>
+    <string name="download_menu_clear">"Aus Liste löschen"</string>
+    <string name="download_menu_cancel">"Download abbrechen"</string>
+    <string name="download_menu_cancel_all">"Alle Downloads abbrechen"</string>
+    <string name="download_menu_clear_all">"Liste löschen"</string>
+    <string name="download_clear_dlg_title">"Löschen"</string>
+    <string name="download_clear_dlg_msg">"Alle Elemente werden aus der Liste gelöscht und aus dem Browser-Cache entfernt."</string>
+    <string name="download_cancel_dlg_title">"Downloads abbrechen"</string>
+    <string name="download_cancel_dlg_msg">"Alle <xliff:g id="DOWNLOAD_COUNT">%d</xliff:g> Downloads werden abgebrochen und aus dem Downloadverlauf gelöscht."</string>
+    <string name="download_file_error_dlg_title">"Kein freier Speicher vorhanden"</string>
+    <string name="download_file_error_dlg_msg">"<xliff:g id="FILENAME">%s</xliff:g> konnte nicht heruntergeladen werden."\n"Bereinigen Sie den Speicher Ihres Telefons und versuchen Sie es erneut."</string>
+    <string name="download_failed_generic_dlg_title">"Download war nicht erfolgreich"</string>
+    <string name="download_no_sdcard_dlg_title">"Keine SD-Karte"</string>
+    <string name="download_no_sdcard_dlg_msg">"Zum Download von <xliff:g id="FILENAME">%s</xliff:g> ist eine SD-Karte erforderlich."</string>
+    <!-- no translation found for download_sdcard_busy_dlg_title (6877712666046917741) -->
+    <skip />
+    <!-- no translation found for download_sdcard_busy_dlg_msg (4579003999083645700) -->
+    <skip />
+    <string name="download_no_application">"Es kann keine Anwendung gefunden werden, um diese Datei zu öffnen."</string>
+    <string name="retry">"Wiederholen"</string>
+    <string name="no_downloads">"Downloadverlauf ist leer."</string>
+    <string name="download_error">"Download war nicht erfolgreich."</string>
+    <string name="download_success">"Download von <xliff:g id="FILE">%s</xliff:g> abgeschlossen."</string>
+    <string name="download_running">"Downloadvorgang läuft..."</string>
+    <string name="download_pending">"Download wird gestartet…"</string>
+    <string name="download_pending_network">"Warten auf Datenverbindung..."</string>
+    <string name="download_running_paused">"Warten auf Datenverbindung..."</string>
+    <string name="download_canceled">"Download abgebrochen."</string>
+    <!-- no translation found for download_not_acceptable (282108828207321357) -->
+    <skip />
+    <string name="download_file_error">"Download kann nicht beendet werden, da nicht genügend Speicherplatz vorhanden ist."</string>
+    <string name="download_length_required">"Download kann nicht gestartet werden, da die Größe des Elements nicht bestimmt werden kann."</string>
+    <string name="download_precondition_failed">"Download wurde unterbrochen und kann nicht fortgesetzt werden."</string>
+    <string name="activity_instrumentation_test_runner">"Browser Test Runner"</string>
+  <string-array name="bookmarks">
+    <item>"Google"</item>
+    <item>"http://www.google.com/"</item>
+    <item>"Yahoo!"</item>
+    <item>"http://www.yahoo.com/"</item>
+    <item>"MSN"</item>
+    <item>"http://www.msn.com/"</item>
+    <item>"MySpace"</item>
+    <item>"http://www.myspace.com/"</item>
+    <item>"Facebook"</item>
+    <item>"http://www.facebook.com/"</item>
+    <item>"Wikipedia"</item>
+    <item>"http://www.wikipedia.org/"</item>
+    <item>"eBay"</item>
+    <item>"http://www.ebay.com/"</item>
+    <item>"CNN"</item>
+    <item>"http://www.cnn.com/"</item>
+    <item>"New York Times"</item>
+    <item>"http://www.nytimes.com/"</item>
+    <item>"ESPN"</item>
+    <item>"http://espn.go.com/"</item>
+    <item>"Amazon"</item>
+    <item>"http://www.amazon.com/"</item>
+    <item>"Weather Channel"</item>
+    <item>"http://www.weather.com/"</item>
+    <item>"BBC"</item>
+    <item>"http://www.bbc.co.uk/"</item>
+  </string-array>
+    <!-- no translation found for permlab_readHistoryBookmarks (2090878935052508686) -->
+    <skip />
+    <!-- no translation found for permdesc_readHistoryBookmarks (3198464990003094365) -->
+    <skip />
+    <!-- no translation found for permlab_writeHistoryBookmarks (3617974487656041765) -->
+    <skip />
+    <!-- no translation found for permdesc_writeHistoryBookmarks (2408364750616892343) -->
+    <skip />
+    <!-- no translation found for query_data_message (2662165772252682312) -->
+    <skip />
+    <!-- no translation found for location_message (3273812190303763599) -->
+    <skip />
+    <!-- no translation found for shortcut_message (8474516749978531587) -->
+    <skip />
+    <!-- no translation found for settings_message (6171686603006325199) -->
+    <skip />
+    <!-- no translation found for filepicker_message (3954806995548322454) -->
+    <skip />
+    <!-- no translation found for settings_title (3579144910187265022) -->
+    <skip />
+    <!-- no translation found for privacy_policy (864201179110197308) -->
+    <skip />
+    <!-- no translation found for permission_button_alwaysdeny (3997759797081359571) -->
+    <skip />
+    <!-- no translation found for permission_button_allow (8433538747157349096) -->
+    <skip />
+    <!-- no translation found for permission_button_deny (8238202164838263939) -->
+    <skip />
+    <!-- no translation found for shortcut_button_alwaysdeny (8677418058335584182) -->
+    <skip />
+    <!-- no translation found for shortcut_button_allow (3106634184087569293) -->
+    <skip />
+    <!-- no translation found for shortcut_button_deny (6054910540900054553) -->
+    <skip />
+    <!-- no translation found for settings_button_allow (447817497759509841) -->
+    <skip />
+    <!-- no translation found for settings_button_deny (602496920123085858) -->
+    <skip />
+    <!-- no translation found for filepicker_button_allow (2849120125810490391) -->
+    <skip />
+    <!-- no translation found for filepicker_button_deny (1302975999145835953) -->
+    <skip />
+    <!-- no translation found for remove (7820112494467011374) -->
+    <skip />
+    <!-- no translation found for local_storage (6703332885937279085) -->
+    <skip />
+    <!-- no translation found for allowed (1599514934221911624) -->
+    <skip />
+    <!-- no translation found for denied (7470209521858372968) -->
+    <skip />
+    <!-- no translation found for unrecognized_dialog_message (687399590684283989) -->
+    <skip />
+    <!-- no translation found for default_button (3901922329454578908) -->
+    <skip />
+</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
deleted file mode 100644 (file)
index ae010b1..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <string name="action">Inicio de sesión</string>
-  <string name="activity_instrumentation_functional_test_runner">Programa de ejecución de pruebas funcionales del explorador</string>
-  <string name="activity_instrumentation_test_runner">Programa de ejecución de pruebas del explorador</string>
-  <string name="add_new_bookmark">Nuevo marcador</string>
-  <string name="allow">Permitir</string>
-  <string name="attention">¡Atención!</string>
-  <string name="back">Atrás</string>
-  <string name="block">Bloquear</string>
-  <string name="bookmark_needs_title">"El marcador debe tener un nombre".</string>
-  <string name="bookmark_needs_url">"El marcador debe tener una ubicación".</string>
-  <string name="bookmark_page">Marcar la última página visualizada</string>
-  <string name="bookmark_saved">Guardada en marcadores.</string>
-  <string name="bookmark_url_not_valid">La dirección URL no es válida.</string>
-  <string name="bookmarks">Marcadores</string>
-  <string name="browserFrame307Post">Esta página Web está siendo redirigida. ¿Desea reenviar los datos introducidos en el formulario a la nueva ubicación?</string>
-  <string name="browserFrameFileErrorLabel">Problema con el archivo</string>
-  <string name="browserFrameFormResubmitLabel">Confirmar</string>
-  <string name="browserFrameFormResubmitMessage">La página que intenta ver contiene datos que ya se han enviado (\"POSTDATA\"). Si reenvía los datos, se repetirá cualquier acción que haya realizado el formulario (como una búsqueda o una compra en línea).</string>
-  <string name="browserFrameNetworkErrorLabel">Problema de conexión de datos</string>
-  <string name="browserFrameRedirect">Redireccionar</string>
-  <string name="browser_bookmarks_page_bookmarks_text">Marcadores</string>
-  <string name="browser_history">Páginas visitadas recientemente</string>
-  <string name="cache_cleared">Caché borrada</string>
-  <string name="cancel">Cancelar</string>
-  <string name="clear">Borrar</string>
-  <string name="clear_history">Borrar historial</string>
-  <string name="close">Cerrar</string>
-  <string name="close_window">Se cerrará esta ventana.</string>
-  <string name="common_name">Nombre común:</string>
-  <string name="contextmenu_add_contact">Agregar contacto</string>
-  <string name="contextmenu_bookmark_thislink">Marcar enlace</string>
-  <string name="contextmenu_copy">Copiar</string>
-  <string name="contextmenu_copylink">Copiar enlace URL</string>
-  <string name="contextmenu_dial_dot">Marcar\u2026</string>
-  <string name="contextmenu_download_image">Guardar imagen</string>
-  <string name="contextmenu_javascript">JavaScript</string>
-  <string name="contextmenu_map">Mapa</string>
-  <string name="contextmenu_openlink">Abrir</string>
-  <string name="contextmenu_openlink_newwindow">Abrir en una ventana nueva</string>
-  <string name="contextmenu_savelink">Guardar enlace</string>
-  <string name="contextmenu_send_mail">Enviar correo electrónico</string>
-  <string name="contextmenu_sharelink">Compartir enlace</string>
-  <string name="contextmenu_view_image">Ver imagen</string>
-  <string name="current_page">Página actual:\u0020</string>
-  <string name="delete">Eliminar</string>
-  <string name="delete_bookmark">Eliminar</string>
-  <string name="delete_bookmark_warning">El marcador \"<xliff:g id="bookmark">%s</xliff:g>\" se eliminará.</string>
-  <string name="do_not_save">Cancelar</string>
-  <string name="done">Listo</string>
-  <string name="download_cancel_dlg_msg">Todas las descargas de <xliff:g id="download_count">%d</xliff:g> se cancelarán y se borrarán del historial de descarga.</string>
-  <string name="download_cancel_dlg_title">Cancelar descargas</string>
-  <string name="download_canceled">Descarga cancelada.</string>
-  <string name="download_clear_dlg_msg">Todos los elementos se borrarán de la lista y se eliminarán de la caché del explorador.</string>
-  <string name="download_clear_dlg_title">Borrar</string>
-  <string name="download_error">Error en la descarga.</string>
-  <string name="download_failed_generic_dlg_title">Error en la descarga</string>
-  <string name="download_file_error">No se ha podido finalizar la descarga. No hay suficiente espacio. </string>
-  <string name="download_file_error_dlg_msg"><xliff:g id="filename">%s</xliff:g> no se ha podido descargar.\nLibere algo de espacio en su teléfono e inténtelo de nuevo.</string>
-  <string name="download_file_error_dlg_title">Sin espacio</string>
-  <string name="download_length_required">No se puede descargar. El tamaño del elemento no se puede determinar.</string>
-  <string name="download_menu_cancel">Cancelar descarga</string>
-  <string name="download_menu_cancel_all">Cancelar todas las descargas</string>
-  <string name="download_menu_clear">Borrar de la lista</string>
-  <string name="download_menu_clear_all">Borrar lista</string>
-  <string name="download_menu_open">Abrir</string>
-  <string name="download_no_application">No se ha encontrado ninguna aplicación al abrir este archivo. </string>
-  <string name="download_no_sdcard_dlg_msg">Se necesita una tarjeta SD para descargar <xliff:g id="filename">%s</xliff:g>.</string>
-  <string name="download_no_sdcard_dlg_title">Ninguna tarjeta SD</string>
-  <string name="download_not_acceptable">No se puede descargar. El contenido que se intenta descargar no es compatible con su teléfono. </string>
-  <string name="download_pending">Iniciando descarga\u2026</string>
-  <string name="download_pending_network">Esperando por conexión de datos\u2026</string>
-  <string name="download_precondition_failed">Descarga interrumpida. No se puede reiniciar. </string>
-  <string name="download_running">Descargando\u2026</string>
-  <string name="download_running_paused">Esperando por conexión de datos\u2026</string>
-  <string name="download_success"><xliff:g id="file">%s</xliff:g> Descarga completa. </string>
-  <string name="download_title">Historial de descargas</string>
-  <string name="download_unknown_filename">&lt;Desconocido&gt;</string>
-  <string name="dump_nav">Volcar caché de navegación</string>
-  <string name="edit_bookmark">Editar marcador</string>
-  <string name="empty_bookmark">"No se puede crear marcador vacío".</string>
-  <string name="empty_history">El historial del explorador está vacío.</string>
-  <string name="expires_on">Caduca el:</string>
-  <string name="find_dot">Encontrado en página</string>
-  <string name="fingerprints">Huellas digitales:</string>
-  <string name="forward">Desvío</string>
-  <string name="goto_dot">Ir a dirección URL</string>
-  <string name="history">Historial</string>
-  <string name="history_picker_view_web_page">Abrir</string>
-  <string name="homepage">Página de inicio</string>
-  <string name="homepage_set">Página de inicio actualizada</string>
-  <string name="http">http://</string>
-  <string name="info_base">Título:\n  <xliff:g id="title">%s1</xliff:g> \n\nURL: \n  <xliff:g id="url">%s2</xliff:g></string>
-  <string name="issued_by">Emitido por:</string>
-  <string name="issued_on">Emitido:</string>
-  <string name="issued_to">Emitido a:</string>
-  <string name="js_dialog_before_unload">¿Salir de esta página?\n\n<xliff:g id="message">%s</xliff:g>\n\nSeleccione Aceptar para continuar, o Cancelar para permanecer en la página actual.</string>
-  <string name="js_dialog_title_default">JavaScript</string>
-  <string name="js_dialog_title_prefix">La página en</string>
-  <string name="js_dialog_title_suffix">dice:</string>
-  <string name="loadSuspended">La página se seguirá cargando tras restablecer la conexión. </string>
-  <string name="loadSuspendedTitle">Sin conexión de red</string>
-  <string name="location">Ubicación</string>
-  <string name="matches_found">Coincidencias encontradas:</string>
-  <string name="md5_fingerprint">Huella digital MD5:</string>
-  <string name="menu_bookmark_page">Marcar página</string>
-  <string name="menu_flip_orientation">Orientación de volteo</string>
-  <string name="menu_preferences">Configuración</string>
-  <string name="menu_use_as_homepage">Establecer como página principal</string>
-  <string name="menu_view_download">Descargas</string>
-  <string name="menu_zoom">Zoom</string>
-  <string name="name">Nombre</string>
-  <string name="new_window">Nueva ventana</string>
-  <string name="next">Siguiente</string>
-  <string name="no_database">¡Ninguna base de datos!</string>
-  <string name="no_downloads">El historial de descarga está vacío.</string>
-  <string name="ok">Aceptar</string>
-  <string name="oma_error_failed_to_download">Incapaz de descargar medios. </string>
-  <string name="oma_error_insufficient_memory">¡Memoria insuficiente! Compruebe su tarjeta SD.</string>
-  <string name="oma_error_invalid_descriptor">Descriptor de descarga no válido.</string>
-  <string name="oma_error_non_acceptable_content">Contenido no compatible.</string>
-  <string name="oma_label_action">Descargar</string>
-  <string name="oma_label_cancel">Salir</string>
-  <string name="oma_label_description">Descripción:</string>
-  <string name="oma_label_download_error">Error de descarga:</string>
-  <string name="oma_label_exit">Salir</string>
-  <string name="oma_label_name">Nombre:</string>
-  <string name="oma_label_proceed">Continuar</string>
-  <string name="oma_label_size">Tamaño:</string>
-  <string name="oma_label_type">Tipo:</string>
-  <string name="oma_label_vendor">Proveedor:</string>
-  <string name="oma_label_want_to_download">¿Desea descargar este contenido?</string>
-  <string name="oma_status_attribute_mismatch">Atributos no coincidentes</string>
-  <string name="oma_status_device_aborted">Teléfono anulado</string>
-  <string name="oma_status_insufficient_memory">Memoria insuficiente</string>
-  <string name="oma_status_invalid_descriptor">Descriptor no válido</string>
-  <string name="oma_status_invalid_version">Versión no válida</string>
-  <string name="oma_status_loader_error">Error de cargador</string>
-  <string name="oma_status_loss_of_service">Pérdida de servicio</string>
-  <string name="oma_status_non_acceptable_content">Contenido inaceptable</string>
-  <string name="oma_status_success">Correcto</string>
-  <string name="oma_warning_one_or_more_types_not_supported">Una o más categorías de contenido no son compatibles.</string>
-  <string name="open_bookmark">Abrir</string>
-  <string name="open_in_new_window">Abrir en una ventana nueva</string>
-  <string name="org_name">Organización:</string>
-  <string name="org_unit">Departamento:</string>
-  <string name="override">Reemplazar</string>
-  <string name="override_message">El marcador existente será sustituido. </string>
-  <string name="page_info">Página de información</string>
-  <string name="page_info_address">Dirección:</string>
-  <string name="page_info_cache_source">Fuente de caché:</string>
-  <string name="page_info_encoding">Codificación:</string>
-  <string name="page_info_expires">Caduca:</string>
-  <string name="page_info_modified">Modificado:</string>
-  <string name="page_info_referring_url">URL de referencia:</string>
-  <string name="page_info_render_mode">Modo de presentación:</string>
-  <string name="page_info_size">Tamaño:</string>
-  <string name="page_info_type">Tipo:</string>
-  <string name="page_info_view">Ver página de información</string>
-  <string name="password">Contraseña</string>
-  <string name="popup_window_attempt">Este sitio está intentando abrir una
-      ventana emergente.</string>
-  <string name="pref_content_autofit">Ajuste automático de páginas</string>
-  <string name="pref_content_autofit_summary">Formatear páginas Web para ajustarse a la pantalla</string>
-  <string name="pref_content_block_popups">Bloquear ventanas emergentes</string>
-  <string name="pref_content_homepage">Configurar página principal</string>
-  <string name="pref_content_javascript">Habilitar JavaScript</string>
-  <string name="pref_content_load_images">Cargar imágenes</string>
-  <string name="pref_content_load_images_summary">Mostrar imágenes en páginas Web</string>
-  <string name="pref_content_open_in_background">Abrir en segundo plano</string>
-  <string name="pref_content_open_in_background_summary">Nueva ventana abierta detrás de la actual</string>
-  <string name="pref_content_title">Configuración del contenido de la página</string>
-  <string name="pref_development_nav_dump">Habilitar volcado de caché de navegación</string>
-  <string name="pref_development_normal_rendering">Presentación normal</string>
-  <string name="pref_development_single_column_rendering">Presentación en una sola columna</string>
-  <string name="pref_development_title">Depuración</string>
-  <string name="pref_development_trace">Habilitar trazado</string>
-  <string name="pref_development_track">Habilitar bola de seguimiento</string>
-  <string name="pref_development_uastring">UAString</string>
-  <string name="pref_development_viewport">Utilizar puerto de vista panorámica</string>
-  <string name="pref_extras_gears_enable">Habilitar Gears</string>
-  <string name="pref_extras_gears_enable_summary">Aplicaciones que amplían la funcionalidad del explorador</string>
-  <string name="pref_extras_gears_settings">Configuración de Gears</string>
-  <string name="pref_extras_gears_settings_summary">Aplicaciones que amplían la funcionalidad del explorador</string>
-  <string name="pref_extras_reset_default">Restablecer a predeterminados</string>
-  <string name="pref_extras_reset_default_dlg">Se borrarán todos los datos del explorador y los configuración retomarán los valores predeterminados de fábrica. </string>
-  <string name="pref_extras_reset_default_dlg_title">Restablecer a predeterminados</string>
-  <string name="pref_extras_reset_default_summary">Borrar todos los datos del explorador y restablecer a los valores predeterminados de fábrica</string>
-  <string name="pref_extras_title">Configuración avanzada</string>
-  <string name="pref_plugin_installed_empty_listxx">No hay ningún plug-in instalado.</string>
-  <string name="pref_plugin_installed_summaryxx">Ver plug-ins instalados actualmente</string>
-  <string name="pref_privacy_clear_cache">Borrar caché</string>
-  <string name="pref_privacy_clear_cache_dlg">Se borrará la caché.</string>
-  <string name="pref_privacy_clear_cache_summary">Eliminar todo el contenido de la página caché</string>
-  <string name="pref_privacy_clear_cookies">Borrar todos los datos de las cookies</string>
-  <string name="pref_privacy_clear_cookies_dlg">Se borrarán todas las cookies. </string>
-  <string name="pref_privacy_clear_cookies_summary">Borrar todas las cookies del explorador</string>
-  <string name="pref_privacy_clear_form_data">Borrar datos del formulario</string>
-  <string name="pref_privacy_clear_form_data_dlg">Se borrarán todos los datos del formulario guardados.</string>
-  <string name="pref_privacy_clear_form_data_summary">Borrar todos los datos del formulario guardados</string>
-  <string name="pref_privacy_clear_history">Borrar historial</string>
-  <string name="pref_privacy_clear_history_dlg">Se borrará el historial de navegación del explorador. </string>
-  <string name="pref_privacy_clear_history_summary">Borrar el historial de navegación del explorador</string>
-  <string name="pref_privacy_clear_passwords">Borrar contraseñas</string>
-  <string name="pref_privacy_clear_passwords_dlg">Se borrarán todas las contraseñas guardadas. </string>
-  <string name="pref_privacy_clear_passwords_summary">Borrar todas las contraseñas guardadas</string>
-  <string name="pref_privacy_title">Configuración de privacidad</string>
-  <string name="pref_security_accept_cookies">Aceptar cookies</string>
-  <string name="pref_security_accept_cookies_summary">Permite a los sitios guardar y leer los datos de la \"cookie\" </string>
-  <string name="pref_security_remember_passwords">Recordar contraseñas</string>
-  <string name="pref_security_remember_passwords_summary">Guardar nombres de usuario y contraseñas de las páginas Web</string>
-  <string name="pref_security_save_form_data">Recordar datos del formulario</string>
-  <string name="pref_security_save_form_data_summary">Recordar los datos introducidos en los formularios para utilizarlos más adelante</string>
-  <string name="pref_security_show_security_warning">Mostrar advertencias de seguridad</string>
-  <string name="pref_security_show_security_warning_summary">Mostrar advertencia si hay algún problema con la seguridad de un sitio</string>
-  <string name="pref_security_title">Configuración de seguridad</string>
-  <string name="pref_text_size">Tamaño del texto</string>
-  <string name="pref_text_size_dialogtitle">Tamaño del texto</string>
-  <string name="pref_text_size_summary">Seleccionar el tamaño del texto en las páginas Web</string>
-  <string name="prev">Ant.</string>
-  <string name="question_mark">\?</string>
-  <string name="reload">Actualizar</string>
-  <string name="remove_bookmark">Eliminar marcador</string>
-  <string name="remove_history_item">Eliminar del historial</string>
-  <string name="replace">Reemplazar</string>
-  <string name="retrieving_creds_dlg_msg">Recuperar la información de acceso\u2026</string>
-  <string name="retry">Reintentar</string>
-  <string name="save">Aceptar</string>
-  <string name="save_to_bookmarks">Marcar enlace</string>
-  <string name="search">Buscar</string>
-  <string name="search_button_text">Ir</string>
-  <string name="search_hint">Escribir dirección Web</string>
-  <string name="search_label">Explorador</string>
-  <string name="security_warning">Advertencia de seguridad</string>
-  <string name="sha1_fingerprint">Huella digital SHA1:</string>
-  <string name="share_page">Compartir página</string>
-  <string name="shortcut_bookmark">Marcador</string>
-  <string name="sign_in_to">Iniciar sesión en <xliff:g id="hostname">%s1</xliff:g> \"<xliff:g id="realm">%s2</xliff:g>\"</string>
-  <string name="ssl_certificate">Certificado de seguridad</string>
-  <string name="ssl_certificate_is_valid">Este certificado es válido.</string>
-  <string name="ssl_continue">Continuar</string>
-  <string name="ssl_expired">Este certificado ha caducado.</string>
-  <string name="ssl_mismatch">El nombre del sitio no corresponde con el nombre del certificado. </string>
-  <string name="ssl_not_yet_valid">Este certificado aún no es válido.</string>
-  <string name="ssl_untrusted">Este certificado no es de una autoridad fiable.</string>
-  <string name="ssl_warnings_header">Hay problemas con el certificado de seguridad de este sitio.</string>
-  <string name="stop">Detener</string>
-  <string name="stopping">Deteniendo\u2026</string>
-  <string name="tab_picker_bookmark">Marcador</string>
-  <string name="tab_picker_new_tab">Nueva ventana</string>
-  <string name="tab_picker_remove_tab">Cerrar</string>
-  <string name="tab_picker_send_url">Compartir enlace</string>
-  <string name="tab_picker_title">Ventanas actuales</string>
-  <string name="tab_picker_view_tab">Ver</string>
-  <string name="too_many_subwindows_dialog_message">No se pudo abrir otra
-      ventana emergente ya que sólo se puede abrir una cada vez.</string>
-  <string name="too_many_subwindows_dialog_title">Ventana emergente ya abierta</string>
-  <string name="too_many_windows_dialog_message">No se pudo abrir otra ventana por haber alcanzado el número máximo de ventanas abiertas.</string>
-  <string name="too_many_windows_dialog_title">Límite de ventanas alcanzado</string>
-  <string name="username">Nombre</string>
-  <string name="validity_period">Validez:</string>
-  <string name="view_certificate">Ver certificado</string>
-  <string name="view_tabs">Vista general de la ventana</string>
-  <string name="view_tabs_condensed">Ventana</string>
-  <string name="visual_history">Historial de la ventana</string>
-  <string name="with">con</string>
-  <string name="zero">0</string>
-</resources>
diff --git a/res/values-fr-rFR/strings.xml b/res/values-fr-rFR/strings.xml
deleted file mode 100644 (file)
index 3ddce68..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <string name="action">Connexion</string>
-  <string name="activity_instrumentation_functional_test_runner">Exécuteur de test fonctionnel du navigateur</string>
-  <string name="activity_instrumentation_test_runner">Exécuteur de test du navigateur</string>
-  <string name="add_new_bookmark">Nouveau signet</string>
-  <string name="allow">Autoriser</string>
-  <string name="attention">Attention</string>
-  <string name="back">Retour</string>
-  <string name="block">Bloquer</string>
-  <string name="bookmark_needs_title">"Le signet doit avoir un nom."</string>
-  <string name="bookmark_needs_url">"Le signet doit avoir un emplacement."</string>
-  <string name="bookmark_page">Marquer la dernière page affichée</string>
-  <string name="bookmark_saved">Enregistrée dans les signets.</string>
-  <string name="bookmark_url_not_valid">URL non valide.</string>
-  <string name="bookmarks">Signets</string>
-  <string name="browserFrame307Post">Cette page Web est redirigée. Renvoyer vos données de formulaires tapées au nouvel emplacement ?</string>
-  <string name="browserFrameFileErrorLabel">Problème avec le fichier</string>
-  <string name="browserFrameFormResubmitLabel">Confirmer</string>
-  <string name="browserFrameFormResubmitMessage">La page que vous essayer d\'afficher contient des données qui ont été déjà soumises (\"POSTDATA\"). Si vous renvoyez les données, toute action effectuée par le formulaire sur la page (telle qu\'une recherche ou un achat en ligne) sera répétée.</string>
-  <string name="browserFrameNetworkErrorLabel">Problème de connectivité de données</string>
-  <string name="browserFrameRedirect">Rediriger</string>
-  <string name="browser_bookmarks_page_bookmarks_text">Signets</string>
-  <string name="browser_history">Pages récemment visitées</string>
-  <string name="cache_cleared">Cache effacée</string>
-  <string name="cancel">Annuler</string>
-  <string name="clear">Effacer</string>
-  <string name="clear_history">Effacer l\'historique</string>
-  <string name="close">Fermer</string>
-  <string name="close_window">Cette fenêtre sera fermée.</string>
-  <string name="common_name">Nom commun :</string>
-  <string name="contextmenu_add_contact">Ajouter un contact</string>
-  <string name="contextmenu_bookmark_thislink">Lien signet</string>
-  <string name="contextmenu_copy">Copier</string>
-  <string name="contextmenu_copylink">Copier le lien URL</string>
-  <string name="contextmenu_dial_dot">Numéroter\u2026</string>
-  <string name="contextmenu_download_image">Enregistrer l\'image</string>
-  <string name="contextmenu_javascript">JavaScript</string>
-  <string name="contextmenu_map">Carte</string>
-  <string name="contextmenu_openlink">Ouvrir</string>
-  <string name="contextmenu_openlink_newwindow">Ouvrir dans une nouvelle fenêtre</string>
-  <string name="contextmenu_savelink">Enregistrer le lien</string>
-  <string name="contextmenu_send_mail">Envoyer e-mail</string>
-  <string name="contextmenu_sharelink">Partager le lien</string>
-  <string name="contextmenu_view_image">Afficher l\'image</string>
-  <string name="current_page">Page actuelle :\u0020</string>
-  <string name="delete">Supprimer</string>
-  <string name="delete_bookmark">Supprimer</string>
-  <string name="delete_bookmark_warning">Les signets \"<xliff:g id="bookmark">%s</xliff:g>\" seront supprimés.</string>
-  <string name="do_not_save">Annuler</string>
-  <string name="done">Terminé</string>
-  <string name="download_cancel_dlg_msg">Tous les téléchargements <xliff:g id="download_count">%d</xliff:g> seront annulés et effacés de l\'historique des téléchargements.</string>
-  <string name="download_cancel_dlg_title">Annuler les téléchargements</string>
-  <string name="download_canceled">Téléchargement annulé.</string>
-  <string name="download_clear_dlg_msg">Tous les éléments seront effacés de la liste et supprimés de la cache du navigateur.</string>
-  <string name="download_clear_dlg_title">Effacer</string>
-  <string name="download_error">Échec du téléchargement.</string>
-  <string name="download_failed_generic_dlg_title">Échec du téléchargement</string>
-  <string name="download_file_error">Impossible de finir le téléchargement. L\'espace est insuffisant.</string>
-  <string name="download_file_error_dlg_msg"><xliff:g id="filename">%s</xliff:g> n\'a pas pu être téléchargé.\nLibérez de l\'espace sur votre téléphone et essayez à nouveau.</string>
-  <string name="download_file_error_dlg_title">Plus d\'espace</string>
-  <string name="download_length_required">Impossible de télécharger. La taille de l\'élément ne peut pas être déterminée.</string>
-  <string name="download_menu_cancel">Annuler le téléchargement</string>
-  <string name="download_menu_cancel_all">Annuler tous les téléchargements</string>
-  <string name="download_menu_clear">Effacer de la liste</string>
-  <string name="download_menu_clear_all">Effacer la liste</string>
-  <string name="download_menu_open">Ouvrir</string>
-  <string name="download_no_application">Aucune application n\'est trouvée pour ouvrir ce fichier.</string>
-  <string name="download_no_sdcard_dlg_msg">Une carte SD est nécessaire pour télécharger <xliff:g id="filename">%s</xliff:g>.</string>
-  <string name="download_no_sdcard_dlg_title">Pas de carte SD</string>
-  <string name="download_not_acceptable">Impossible de télécharger. Le contenu en cours de téléchargement n\'est pas pris en charge sur le téléphone.</string>
-  <string name="download_pending">Début du téléchargement\u2026</string>
-  <string name="download_pending_network">Attente de la connexion de données\u2026</string>
-  <string name="download_precondition_failed">Téléchargement interrompu. Il ne peut pas être repris.</string>
-  <string name="download_running">Téléchargement\u2026</string>
-  <string name="download_running_paused">Attente de la connexion de données\u2026</string>
-  <string name="download_success"><xliff:g id="file">%s</xliff:g> Téléchargement terminé.</string>
-  <string name="download_title">Historique de téléchargement</string>
-  <string name="download_unknown_filename">&lt;Inconnu&gt;</string>
-  <string name="dump_nav">Décharger la cache de navigation</string>
-  <string name="edit_bookmark">Modifier le signet</string>
-  <string name="empty_bookmark">"Impossible de créer un signet vide."</string>
-  <string name="empty_history">L\'historique du navigateur est vide.</string>
-  <string name="expires_on">Expire le :</string>
-  <string name="find_dot">Rechercher sur la page</string>
-  <string name="fingerprints">Empreintes digitales :</string>
-  <string name="forward">Transférer</string>
-  <string name="goto_dot">Aller à URL</string>
-  <string name="history">Historique</string>
-  <string name="history_picker_view_web_page">Ouvrir</string>
-  <string name="homepage">Page d\'accueil</string>
-  <string name="homepage_set">Page d\'accueil mise à jour</string>
-  <string name="http">http://</string>
-  <string name="info_base">Titre :\n  <xliff:g id="title">%s1</xliff:g> \n\nURL : \n  <xliff:g id="url">%s2</xliff:g></string>
-  <string name="issued_by">Émis par :</string>
-  <string name="issued_on">Émis le :</string>
-  <string name="issued_to">Émis à :</string>
-  <string name="js_dialog_before_unload">Naviguer en quittant cette page ?\n\n<xliff:g id="message">%s</xliff:g>\n\nSélectionner OK pour continuer, ou Annuler pour rester sur la page actuelle.</string>
-  <string name="js_dialog_title_default">JavaScript</string>
-  <string name="js_dialog_title_prefix">La page à</string>
-  <string name="js_dialog_title_suffix">dit :</string>
-  <string name="loadSuspended">La page continuera son chargement après la restauration de la connexion.</string>
-  <string name="loadSuspendedTitle">Pas de connexion réseau</string>
-  <string name="location">Localisation</string>
-  <string name="matches_found">Correspondances trouvées :</string>
-  <string name="md5_fingerprint">Empreinte digitale MD5 :</string>
-  <string name="menu_bookmark_page">Marquer la page</string>
-  <string name="menu_flip_orientation">Retourner l\'orientation</string>
-  <string name="menu_preferences">Paramètres</string>
-  <string name="menu_use_as_homepage">Définir comme page d\'accueil</string>
-  <string name="menu_view_download">Téléchargements</string>
-  <string name="menu_zoom">Zoom</string>
-  <string name="name">Nom</string>
-  <string name="new_window">Nouvelle fenêtre</string>
-  <string name="next">Suivant</string>
-  <string name="no_database">Pas de base de données !</string>
-  <string name="no_downloads">L\'historique de téléchargement est vide.</string>
-  <string name="ok">OK</string>
-  <string name="oma_error_failed_to_download">Impossible de télécharger le média.</string>
-  <string name="oma_error_insufficient_memory">Mémoire insuffisante ! Vérifiez votre carte SD.</string>
-  <string name="oma_error_invalid_descriptor">Descripteur de téléchargement non valide.</string>
-  <string name="oma_error_non_acceptable_content">Contenu non pris en charge.</string>
-  <string name="oma_label_action">Télécharger</string>
-  <string name="oma_label_cancel">Quitter</string>
-  <string name="oma_label_description">Description :</string>
-  <string name="oma_label_download_error">Erreur de téléchargement :</string>
-  <string name="oma_label_exit">Quitter</string>
-  <string name="oma_label_name">Nom :</string>
-  <string name="oma_label_proceed">Continuer</string>
-  <string name="oma_label_size">Taille :</string>
-  <string name="oma_label_type">Type :</string>
-  <string name="oma_label_vendor">Vendeur :</string>
-  <string name="oma_label_want_to_download">Souhaitez-vous télécharger ce contenu ?</string>
-  <string name="oma_status_attribute_mismatch">Non concordance d\'attribut</string>
-  <string name="oma_status_device_aborted">Téléphone abandonné</string>
-  <string name="oma_status_insufficient_memory">Mémoire insuffisante</string>
-  <string name="oma_status_invalid_descriptor">Descripteur non valide</string>
-  <string name="oma_status_invalid_version">Version non valide</string>
-  <string name="oma_status_loader_error">Erreur de chargeur</string>
-  <string name="oma_status_loss_of_service">Perte de service</string>
-  <string name="oma_status_non_acceptable_content">Contenu non acceptable</string>
-  <string name="oma_status_success">Succès</string>
-  <string name="oma_warning_one_or_more_types_not_supported">Une ou plusieurs catégories de contenu ne sont pas prises en charge.</string>
-  <string name="open_bookmark">Ouvrir</string>
-  <string name="open_in_new_window">Ouvrir dans une nouvelle fenêtre</string>
-  <string name="org_name">Organisation :</string>
-  <string name="org_unit">Unité organisationnelle :</string>
-  <string name="override">Remplacer</string>
-  <string name="override_message">Le signet existant sera remplacé.</string>
-  <string name="page_info">Infos page</string>
-  <string name="page_info_address">Adresse :</string>
-  <string name="page_info_cache_source">Source cache :</string>
-  <string name="page_info_encoding">Codage :</string>
-  <string name="page_info_expires">Expire :</string>
-  <string name="page_info_modified">Modifié :</string>
-  <string name="page_info_referring_url">URL référente :</string>
-  <string name="page_info_render_mode">Mode de rendu :</string>
-  <string name="page_info_size">Taille :</string>
-  <string name="page_info_type">Type :</string>
-  <string name="page_info_view">Afficher les infos page</string>
-  <string name="password">Mot de passe</string>
-  <string name="popup_window_attempt">Ce site essaie d\'ouvrir une
-      fenêtre pop-up.</string>
-  <string name="pref_content_autofit">Auto ajuster pages</string>
-  <string name="pref_content_autofit_summary">Ajuster les pages Web à l\'écran</string>
-  <string name="pref_content_block_popups">Bloquer les fenêtres pop-up</string>
-  <string name="pref_content_homepage">Définir la page d\'accueil</string>
-  <string name="pref_content_javascript">Activer JavaScript</string>
-  <string name="pref_content_load_images">Charger les images</string>
-  <string name="pref_content_load_images_summary">Afficher les images sur les pages Web</string>
-  <string name="pref_content_open_in_background">Ouvrir en arrière-plan</string>
-  <string name="pref_content_open_in_background_summary">Les nouvelles fenêtres s\'ouvrent derrière l\'actuelle</string>
-  <string name="pref_content_title">Paramètres de contenu de la page</string>
-  <string name="pref_development_nav_dump">Activer décharge cache nav</string>
-  <string name="pref_development_normal_rendering">Rendu normal</string>
-  <string name="pref_development_single_column_rendering">Rendu en une colonne</string>
-  <string name="pref_development_title">Déboguer</string>
-  <string name="pref_development_trace">Activer le traçage</string>
-  <string name="pref_development_track">Activer la boute de commande</string>
-  <string name="pref_development_uastring">ChaîneUA</string>
-  <string name="pref_development_viewport">Utiliser une fenêtre d\'affichage large</string>
-  <string name="pref_extras_gears_enable">Activer les équipements</string>
-  <string name="pref_extras_gears_enable_summary">Applications étendent la fonctionnalité du navigateur</string>
-  <string name="pref_extras_gears_settings">Paramètre des équipements</string>
-  <string name="pref_extras_gears_settings_summary">Applications étendent la fonctionnalité du navigateur</string>
-  <string name="pref_extras_reset_default">Réinitialiser à défaut</string>
-  <string name="pref_extras_reset_default_dlg">Toutes les données du navigateur seront effacées et les paramètres retourneront aux valeurs par défaut.</string>
-  <string name="pref_extras_reset_default_dlg_title">Réinitialiser à défaut</string>
-  <string name="pref_extras_reset_default_summary">Effacer toutes les données du navigateur et réinitialiser les paramètres aux valeurs par défaut</string>
-  <string name="pref_extras_title">Paramètres avancés</string>
-  <string name="pref_plugin_installed_empty_listxx">Aucun plug-in installé.</string>
-  <string name="pref_plugin_installed_summaryxx">Afficher les plug-ins actuellement installés.</string>
-  <string name="pref_privacy_clear_cache">Effacer la cache</string>
-  <string name="pref_privacy_clear_cache_dlg">La cache va être effacée.</string>
-  <string name="pref_privacy_clear_cache_summary">Supprimer tout le contenu de page en cache</string>
-  <string name="pref_privacy_clear_cookies">Effacer toutes les données de cookies</string>
-  <string name="pref_privacy_clear_cookies_dlg">Tous les cookies vont être effacés.</string>
-  <string name="pref_privacy_clear_cookies_summary">Effacer tous les cookies du navigateur</string>
-  <string name="pref_privacy_clear_form_data">Effacer les données de formulaire</string>
-  <string name="pref_privacy_clear_form_data_dlg">Toutes les données de formulaire enregistrées vont être effacées.</string>
-  <string name="pref_privacy_clear_form_data_summary">Effacer toutes les données de formulaire enregistrées</string>
-  <string name="pref_privacy_clear_history">Effacer l\'historique</string>
-  <string name="pref_privacy_clear_history_dlg">L\'historique de navigation du navigateur sera effacé.</string>
-  <string name="pref_privacy_clear_history_summary">Effacer l\'historique de navigation du navigateur</string>
-  <string name="pref_privacy_clear_passwords">Effacer les mots de passe</string>
-  <string name="pref_privacy_clear_passwords_dlg">Tous les mots de passe enregistrés vont être effacés.</string>
-  <string name="pref_privacy_clear_passwords_summary">Effacer tous les mots de passe enregistrés</string>
-  <string name="pref_privacy_title">Paramètres de vie privée</string>
-  <string name="pref_security_accept_cookies">Accepter les cookies</string>
-  <string name="pref_security_accept_cookies_summary">Permettre aux sites d\'enregistrer et de lire les données de \"cookies\"</string>
-  <string name="pref_security_remember_passwords">Se souvenir des mots de passe</string>
-  <string name="pref_security_remember_passwords_summary">Enregistrer les noms d\'utilisateur et les mots de passe pour les sites Web</string>
-  <string name="pref_security_save_form_data">Se souvenir des données de formulaire</string>
-  <string name="pref_security_save_form_data_summary">Se souvenir des données saisies dans les formulaires pour utilisation ultérieure</string>
-  <string name="pref_security_show_security_warning">Afficher les avertissements de sécurité</string>
-  <string name="pref_security_show_security_warning_summary">Afficher un avertissement en cas de problème de sécurité d\'un site</string>
-  <string name="pref_security_title">Paramètres de sécurité</string>
-  <string name="pref_text_size">Taille du texte</string>
-  <string name="pref_text_size_dialogtitle">Taille du texte</string>
-  <string name="pref_text_size_summary">Sélectionnez la taille du texte sur les pages Web</string>
-  <string name="prev">Préc</string>
-  <string name="question_mark">\?</string>
-  <string name="reload">Actualiser</string>
-  <string name="remove_bookmark">Supprimer le signet</string>
-  <string name="remove_history_item">Supprimer de l\'historique</string>
-  <string name="replace">Remplacer</string>
-  <string name="retrieving_creds_dlg_msg">Récupération des détails de connexion\u2026</string>
-  <string name="retry">Réessayer</string>
-  <string name="save">OK</string>
-  <string name="save_to_bookmarks">Lien signet</string>
-  <string name="search">Recherche</string>
-  <string name="search_button_text">Aller</string>
-  <string name="search_hint">Entrer l\'adresse Web</string>
-  <string name="search_label">Navigateur</string>
-  <string name="security_warning">Avertissement de sécurité</string>
-  <string name="sha1_fingerprint">Empreinte digitale SHA1 :</string>
-  <string name="share_page">Partager page</string>
-  <string name="shortcut_bookmark">Signet</string>
-  <string name="sign_in_to">Connexion à <xliff:g id="hostname">%s1</xliff:g> \"<xliff:g id="realm">%s2</xliff:g>\"</string>
-  <string name="ssl_certificate">Certificat de sécurité</string>
-  <string name="ssl_certificate_is_valid">Ce certificat est valide.</string>
-  <string name="ssl_continue">Continuer</string>
-  <string name="ssl_expired">Ce certificat est expiré.</string>
-  <string name="ssl_mismatch">Le nom du site ne correspond pas au nom sur le certificat.</string>
-  <string name="ssl_not_yet_valid">Ce certificat n\'est pas encore valide.</string>
-  <string name="ssl_untrusted">Ce certificat n\'est pas d\'une autorité de confiance.</string>
-  <string name="ssl_warnings_header">Il y a des problèmes avec le certificat de sécurité de ce site.</string>
-  <string name="stop">Arrêter</string>
-  <string name="stopping">Arrêt\u2026</string>
-  <string name="tab_picker_bookmark">Signet</string>
-  <string name="tab_picker_new_tab">Nouvelle fenêtre</string>
-  <string name="tab_picker_remove_tab">Fermer</string>
-  <string name="tab_picker_send_url">Partager le lien</string>
-  <string name="tab_picker_title">Fenêtre actuelle</string>
-  <string name="tab_picker_view_tab">Afficher</string>
-  <string name="too_many_subwindows_dialog_message">Impossible d\'ouvrir une nouvelle
-      fenêtre pop-up car seulement une peut être ouverte à la fois.</string>
-  <string name="too_many_subwindows_dialog_title">Pop-up déjà ouverte</string>
-  <string name="too_many_windows_dialog_message">Impossible d\'ouvrir une nouvelle fenêtre parce que vous avez déjà ouvert le nombre maximum.</string>
-  <string name="too_many_windows_dialog_title">Limite de fenêtre atteinte</string>
-  <string name="username">Nom</string>
-  <string name="validity_period">Validité :</string>
-  <string name="view_certificate">Afficher le certificat</string>
-  <string name="view_tabs">Aperçu de fenêtre</string>
-  <string name="view_tabs_condensed">Fenêtre</string>
-  <string name="visual_history">Historique de fenêtre</string>
-  <string name="with">avec</string>
-  <string name="zero">0</string>
-</resources>
diff --git a/res/values-it-rIT/strings.xml b/res/values-it-rIT/strings.xml
deleted file mode 100644 (file)
index 6420cd6..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <string name="action">Accedi</string>
-  <string name="activity_instrumentation_functional_test_runner">Prova funzionamento del browser</string>
-  <string name="activity_instrumentation_test_runner">Prova verifica del browser</string>
-  <string name="add_new_bookmark">Nuovo segnalibro</string>
-  <string name="allow">Consenti</string>
-  <string name="attention">Attenzione</string>
-  <string name="back">Indietro</string>
-  <string name="block">Blocca</string>
-  <string name="bookmark_needs_title">"Il segnalibro deve avere un nome."</string>
-  <string name="bookmark_needs_url">"Il segnalibro deve avere un'ubicazione."</string>
-  <string name="bookmark_page">Pagina segnalibri visualizzati di recente</string>
-  <string name="bookmark_saved">Salvato nei segnalibri.</string>
-  <string name="bookmark_url_not_valid">URL non valido.</string>
-  <string name="bookmarks">Segnalibri</string>
-  <string name="browserFrame307Post">Reindirizzamento in corso della pagina Web. Reinviare i dati immessi nel modulo nella nuova ubicazione?</string>
-  <string name="browserFrameFileErrorLabel">Problema con il file</string>
-  <string name="browserFrameFormResubmitLabel">Conferma</string>
-  <string name="browserFrameFormResubmitMessage">La pagina che si desidera visualizzare contiene dati già inviati (\"POSTDATA\"). Se si rinviano i dati, verranno ripetute tutte le azioni sulla pagina, ad esempio ricerca o acquisto online.</string>
-  <string name="browserFrameNetworkErrorLabel">Problema di connessione dati</string>
-  <string name="browserFrameRedirect">Reindirizzamento</string>
-  <string name="browser_bookmarks_page_bookmarks_text">Segnalibri</string>
-  <string name="browser_history">Pagine visitate di recente</string>
-  <string name="cache_cleared">Cache svuotata</string>
-  <string name="cancel">Annulla</string>
-  <string name="clear">Cancella</string>
-  <string name="clear_history">Cancella cronologia</string>
-  <string name="close">Chiudi</string>
-  <string name="close_window">Questa finestra verrà chiusa.</string>
-  <string name="common_name">Nome comune:</string>
-  <string name="contextmenu_add_contact">Aggiungi contatto</string>
-  <string name="contextmenu_bookmark_thislink">Collegamento segnalibro</string>
-  <string name="contextmenu_copy">Copia</string>
-  <string name="contextmenu_copylink">Copia URL collegamento</string>
-  <string name="contextmenu_dial_dot">Componi\u2026</string>
-  <string name="contextmenu_download_image">Salva immagine</string>
-  <string name="contextmenu_javascript">JavaScript</string>
-  <string name="contextmenu_map">Mappa</string>
-  <string name="contextmenu_openlink">Apri</string>
-  <string name="contextmenu_openlink_newwindow">Apri in un'altra finestra</string>
-  <string name="contextmenu_savelink">Salva collegamento</string>
-  <string name="contextmenu_send_mail">Invia messaggio e-mail</string>
-  <string name="contextmenu_sharelink">Condividi collegamento</string>
-  <string name="contextmenu_view_image">Visualizza immagine</string>
-  <string name="current_page">Pagina attuale:\u0020</string>
-  <string name="delete">Elimina</string>
-  <string name="delete_bookmark">Elimina</string>
-  <string name="delete_bookmark_warning">Verrà eliminato il segnalibro \"<xliff:g id="bookmark">%s</xliff:g>\".</string>
-  <string name="do_not_save">Annulla</string>
-  <string name="done">Completato</string>
-  <string name="download_cancel_dlg_msg">Tutti i download <xliff:g id="download_count">%d</xliff:g> verranno annullati ed eliminati dalla cronologia di download.</string>
-  <string name="download_cancel_dlg_title">Annulla download</string>
-  <string name="download_canceled">Download annullato.</string>
-  <string name="download_clear_dlg_msg">Tutti gli elementi verranno cancellati dall'elenco e rimossi dalla cache del browser.</string>
-  <string name="download_clear_dlg_title">Cancella</string>
-  <string name="download_error">Download non riuscito.</string>
-  <string name="download_failed_generic_dlg_title">Download non riuscito</string>
-  <string name="download_file_error">Impossibile completare il download. Spazio insufficiente.</string>
-  <string name="download_file_error_dlg_msg">Impossibile scaricare <xliff:g id="filename">%s</xliff:g>.\nLiberare spazio sul telefono e riprovare.</string>
-  <string name="download_file_error_dlg_title">Spazio insufficiente</string>
-  <string name="download_length_required">Download non riuscito. Impossibile determinare le dimensioni dell'elemento.</string>
-  <string name="download_menu_cancel">Annulla download</string>
-  <string name="download_menu_cancel_all">Annulla tutti i download</string>
-  <string name="download_menu_clear">Cancella dall'elenco</string>
-  <string name="download_menu_clear_all">Cancella elenco</string>
-  <string name="download_menu_open">Apri</string>
-  <string name="download_no_application">Impossibile trovare un'applicazione per l'apertura del file.</string>
-  <string name="download_no_sdcard_dlg_msg">Per scaricare <xliff:g id="filename">%s</xliff:g>, è necessario utilizzare una scheda SD.</string>
-  <string name="download_no_sdcard_dlg_title">Nessuna scheda SD</string>
-  <string name="download_not_acceptable">Download non riuscito. Il contenuto che si sta tentando di scaricare non è supportato dal telefono.</string>
-  <string name="download_pending">Avvio del download in corso\u2026</string>
-  <string name="download_pending_network">In attesa della connessione dati\u2026</string>
-  <string name="download_precondition_failed">Download interrotto. Impossibile ripristinarlo.</string>
-  <string name="download_running">Scaricamento in corso\u2026</string>
-  <string name="download_running_paused">In attesa della connessione dati\u2026</string>
-  <string name="download_success"><xliff:g id="file">%s</xliff:g> download completato.</string>
-  <string name="download_title">Cronologia download</string>
-  <string name="download_unknown_filename">&lt;Sconosciuto&gt;</string>
-  <string name="dump_nav">Elimina cache di navigazione</string>
-  <string name="edit_bookmark">Modifica segnalibro</string>
-  <string name="empty_bookmark">"Impossibile creare un segnalibro vuoto."</string>
-  <string name="empty_history">La cronologia del browser è vuota.</string>
-  <string name="expires_on">Scade il:</string>
-  <string name="find_dot">Trova nella pagina</string>
-  <string name="fingerprints">Impronte digitali:</string>
-  <string name="forward">Inoltra</string>
-  <string name="goto_dot">Vai a URL</string>
-  <string name="history">Cronologia</string>
-  <string name="history_picker_view_web_page">Apri</string>
-  <string name="homepage">Home page</string>
-  <string name="homepage_set">Home page aggiornata</string>
-  <string name="http">http://</string>
-  <string name="info_base">Titolo:\n  <xliff:g id="title">%s1</xliff:g> \n\nURL: \n  <xliff:g id="url">%s2</xliff:g></string>
-  <string name="issued_by">Rilasciato da:</string>
-  <string name="issued_on">Rilasciato il:</string>
-  <string name="issued_to">Rilasciato a:</string>
-  <string name="js_dialog_before_unload">Uscire da questa pagina?\n\n<xliff:g id="message">%s</xliff:g>\n\nScegliere OK per continuare oppure Annulla per restare sulla pagina attuale.</string>
-  <string name="js_dialog_title_default">JavaScript</string>
-  <string name="js_dialog_title_prefix">Nella pagina a</string>
-  <string name="js_dialog_title_suffix">è riportato:</string>
-  <string name="loadSuspended">Il caricamento della pagina continuerà dopo il ripristino della connessione.</string>
-  <string name="loadSuspendedTitle">Nessuna connessione di rete</string>
-  <string name="location">Ubicazione</string>
-  <string name="matches_found">Corrispondenze trovate:</string>
-  <string name="md5_fingerprint">Impronta digitale MD5:</string>
-  <string name="menu_bookmark_page">Aggiungi pagina nei segnalibri</string>
-  <string name="menu_flip_orientation">Capovolgi orientamento</string>
-  <string name="menu_preferences">Impostazioni</string>
-  <string name="menu_use_as_homepage">Imposta come home page</string>
-  <string name="menu_view_download">Download</string>
-  <string name="menu_zoom">Zoom</string>
-  <string name="name">Nome</string>
-  <string name="new_window">Nuova finestra</string>
-  <string name="next">Avanti</string>
-  <string name="no_database">Nessun database</string>
-  <string name="no_downloads">La memoria di download è vuota.</string>
-  <string name="ok">OK</string>
-  <string name="oma_error_failed_to_download">Impossibile scaricare il supporto.</string>
-  <string name="oma_error_insufficient_memory">Memoria insufficiente. Controllare la scheda SD.</string>
-  <string name="oma_error_invalid_descriptor">Descrittore download non valido.</string>
-  <string name="oma_error_non_acceptable_content">Contenuto non supportato.</string>
-  <string name="oma_label_action">Download</string>
-  <string name="oma_label_cancel">Esci</string>
-  <string name="oma_label_description">Descrizione:</string>
-  <string name="oma_label_download_error">Errore di download:</string>
-  <string name="oma_label_exit">Esci</string>
-  <string name="oma_label_name">Nome:</string>
-  <string name="oma_label_proceed">Prosegui</string>
-  <string name="oma_label_size">Dimensione:</string>
-  <string name="oma_label_type">Tipo:</string>
-  <string name="oma_label_vendor">Fornitore:</string>
-  <string name="oma_label_want_to_download">Scaricare questo contenuto?</string>
-  <string name="oma_status_attribute_mismatch">Attributo non corrispondente</string>
-  <string name="oma_status_device_aborted">Telefonata interrotta</string>
-  <string name="oma_status_insufficient_memory">Memoria insufficiente</string>
-  <string name="oma_status_invalid_descriptor">Descrittore non valido</string>
-  <string name="oma_status_invalid_version">Versione non valida</string>
-  <string name="oma_status_loader_error">Errore nel caricatore</string>
-  <string name="oma_status_loss_of_service">Perdita di servizio</string>
-  <string name="oma_status_non_acceptable_content">Contenuto inacettabile</string>
-  <string name="oma_status_success">Riuscito</string>
-  <string name="oma_warning_one_or_more_types_not_supported">Una o più categorie di contenuto non sono supportate.</string>
-  <string name="open_bookmark">Apri</string>
-  <string name="open_in_new_window">Apri in un'altra finestra</string>
-  <string name="org_name">Organizzazione:</string>
-  <string name="org_unit">Unità organizzativa:</string>
-  <string name="override">Sostituisci</string>
-  <string name="override_message">Il segnalibro esistente verrà sostituito.</string>
-  <string name="page_info">Informazioni pagina</string>
-  <string name="page_info_address">Indirizzo:</string>
-  <string name="page_info_cache_source">Origine cache:</string>
-  <string name="page_info_encoding">Codifica:</string>
-  <string name="page_info_expires">Scade:</string>
-  <string name="page_info_modified">Modificato:</string>
-  <string name="page_info_referring_url">URL di riferimento:</string>
-  <string name="page_info_render_mode">Modalità rendering:</string>
-  <string name="page_info_size">Dimensione:</string>
-  <string name="page_info_type">Tipo:</string>
-  <string name="page_info_view">Visualizza informazioni pagina</string>
-  <string name="password">Password</string>
-  <string name="popup_window_attempt">Questo sito sta tentando di aprire una
-      finestra pop-up.</string>
-  <string name="pref_content_autofit">Adatta pagine automaticamente</string>
-  <string name="pref_content_autofit_summary">Formatta pagine Web per adattarle allo schermo</string>
-  <string name="pref_content_block_popups">Blocca finestre pop-up</string>
-  <string name="pref_content_homepage">Imposta home page</string>
-  <string name="pref_content_javascript">Abilita JavaScript</string>
-  <string name="pref_content_load_images">Carica immagini</string>
-  <string name="pref_content_load_images_summary">Visualizza immagini sulle pagine Web</string>
-  <string name="pref_content_open_in_background">Apri in secondo piano</string>
-  <string name="pref_content_open_in_background_summary">Nuove finestre aperte dietro quella corrente</string>
-  <string name="pref_content_title">Impostazioni contenuto pagina</string>
-  <string name="pref_development_nav_dump">Abilita nuova dump cache</string>
-  <string name="pref_development_normal_rendering">Rendering normale</string>
-  <string name="pref_development_single_column_rendering">Rendering singola colonna</string>
-  <string name="pref_development_title">Debug</string>
-  <string name="pref_development_trace">Abilita tracciatura</string>
-  <string name="pref_development_track">Abilita trackball</string>
-  <string name="pref_development_uastring">UAString</string>
-  <string name="pref_development_viewport">Usa visualizzazione ampia</string>
-  <string name="pref_extras_gears_enable">Abilita Gears</string>
-  <string name="pref_extras_gears_enable_summary">Applicazioni che estendono la funzionalità del browser</string>
-  <string name="pref_extras_gears_settings">Impostazioni Gears</string>
-  <string name="pref_extras_gears_settings_summary">Applicazioni che estendono la funzionalità del browser</string>
-  <string name="pref_extras_reset_default">Ripristina predefinito</string>
-  <string name="pref_extras_reset_default_dlg">Verranno cancellati tutti i dati del browser e verranno ripristinati i valori predefiniti.</string>
-  <string name="pref_extras_reset_default_dlg_title">Ripristina predefinito</string>
-  <string name="pref_extras_reset_default_summary">Cancella tutti i dati del browser e ripristina le impostazioni predefinite</string>
-  <string name="pref_extras_title">Impostazioni avanzate</string>
-  <string name="pref_plugin_installed_empty_listxx">Nessun plug-in installato.</string>
-  <string name="pref_plugin_installed_summaryxx">Visualizza plug-in attualmente installati</string>
-  <string name="pref_privacy_clear_cache">Svuota cache</string>
-  <string name="pref_privacy_clear_cache_dlg">La cache verrà svuotata.</string>
-  <string name="pref_privacy_clear_cache_summary">Elimina tutto il contenuto della pagina nella cache</string>
-  <string name="pref_privacy_clear_cookies">Cancella tutti i dati dei cookie</string>
-  <string name="pref_privacy_clear_cookies_dlg">Tutti i cookie verranno cancellati.</string>
-  <string name="pref_privacy_clear_cookies_summary">Cancella tutti i cookie del browser</string>
-  <string name="pref_privacy_clear_form_data">Cancella i dati del modulo</string>
-  <string name="pref_privacy_clear_form_data_dlg">Tutti i dati salvati nel modulo verranno cancellati.</string>
-  <string name="pref_privacy_clear_form_data_summary">Cancella tutti i dati salvati nel modulo</string>
-  <string name="pref_privacy_clear_history">Cancella cronologia</string>
-  <string name="pref_privacy_clear_history_dlg">Verrà cancellata la cronologia di navigazione del browser.</string>
-  <string name="pref_privacy_clear_history_summary">Cancella la cronologia di navigazione del browser</string>
-  <string name="pref_privacy_clear_passwords">Cancella password</string>
-  <string name="pref_privacy_clear_passwords_dlg">Tutte le password salvate verranno cancellate.</string>
-  <string name="pref_privacy_clear_passwords_summary">Cancella tutte le password salvate</string>
-  <string name="pref_privacy_title">Impostazioni privacy</string>
-  <string name="pref_security_accept_cookies">Accetta cookie</string>
-  <string name="pref_security_accept_cookies_summary">Consente ai siti di salvare e leggere i dati dei \"cookie\"</string>
-  <string name="pref_security_remember_passwords">Memorizza password</string>
-  <string name="pref_security_remember_passwords_summary">Salva nomi utente e password per i siti Web</string>
-  <string name="pref_security_save_form_data">Memorizza dati modulo</string>
-  <string name="pref_security_save_form_data_summary">Memorizza i dati immessi nel modulo per utilizzarli in seguito</string>
-  <string name="pref_security_show_security_warning">Mostra avvisi sulla sicurezza</string>
-  <string name="pref_security_show_security_warning_summary">Mostra avviso se si verifica un problema con la sicurezza di un sito</string>
-  <string name="pref_security_title">Impostazioni protezione</string>
-  <string name="pref_text_size">Dimensioni testo</string>
-  <string name="pref_text_size_dialogtitle">Dimensioni testo</string>
-  <string name="pref_text_size_summary">Selezionare la dimensione del testo sulle pagine Web</string>
-  <string name="prev">Prec</string>
-  <string name="question_mark">\?</string>
-  <string name="reload">Aggiorna</string>
-  <string name="remove_bookmark">Elimina segnalibro</string>
-  <string name="remove_history_item">Rimuovi da cronologia</string>
-  <string name="replace">Sostituisci</string>
-  <string name="retrieving_creds_dlg_msg">Recupero in corso dei dettagli di accesso\u2026</string>
-  <string name="retry">Riprova</string>
-  <string name="save">OK</string>
-  <string name="save_to_bookmarks">Collegamento segnalibro</string>
-  <string name="search">Cerca</string>
-  <string name="search_button_text">Vai</string>
-  <string name="search_hint">Immetti indirizzo Web</string>
-  <string name="search_label">Browser</string>
-  <string name="security_warning">Avviso di sicurezza</string>
-  <string name="sha1_fingerprint">Impronta digitale SHA1:</string>
-  <string name="share_page">Condividi pagina</string>
-  <string name="shortcut_bookmark">Segnalibro</string>
-  <string name="sign_in_to">Accedi a <xliff:g id="hostname">%s1</xliff:g> \"<xliff:g id="realm">%s2</xliff:g>\"</string>
-  <string name="ssl_certificate">Certificato di sicurezza</string>
-  <string name="ssl_certificate_is_valid">Questo certificato è valido.</string>
-  <string name="ssl_continue">Continua</string>
-  <string name="ssl_expired">Questo certificato è scaduto.</string>
-  <string name="ssl_mismatch">Il nome del sito non corrisponde a quello del certificato.</string>
-  <string name="ssl_not_yet_valid">Questo certificato non è ancora valido.</string>
-  <string name="ssl_untrusted">Questo certificato non proviene da un'autorità attendibile.</string>
-  <string name="ssl_warnings_header">Si sono verificati problemi con il certificato di sicurezza per questo sito.</string>
-  <string name="stop">Interrompi</string>
-  <string name="stopping">Interruzione in corso\u2026</string>
-  <string name="tab_picker_bookmark">Segnalibro</string>
-  <string name="tab_picker_new_tab">Nuova finestra</string>
-  <string name="tab_picker_remove_tab">Chiudi</string>
-  <string name="tab_picker_send_url">Condividi collegamento</string>
-  <string name="tab_picker_title">Finestre attuali</string>
-  <string name="tab_picker_view_tab">Visualizza</string>
-  <string name="too_many_subwindows_dialog_message">Impossibile aprire una nuova
-      finestra pop-up. È possibile aprire una sola finestra alla volta.</string>
-  <string name="too_many_subwindows_dialog_title">Pop-up già aperta</string>
-  <string name="too_many_windows_dialog_message">Impossibile aprire un'altra finestra. È già stato aperto il numero massimo.</string>
-  <string name="too_many_windows_dialog_title">Limite finestra raggiunto</string>
-  <string name="username">Nome</string>
-  <string name="validity_period">Validità:</string>
-  <string name="view_certificate">Visualizza certificato</string>
-  <string name="view_tabs">Panoramica finestra</string>
-  <string name="view_tabs_condensed">Finestra</string>
-  <string name="visual_history">Cronologia finestre</string>
-  <string name="with">con</string>
-  <string name="zero">0</string>
-</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
new file mode 100644 (file)
index 0000000..9511d4b
--- /dev/null
@@ -0,0 +1,338 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="sign_in_to">"<xliff:g id="HOSTNAME">%s1</xliff:g>に「<xliff:g id="REALM">%s2</xliff:g>」でログイン"</string>
+    <string name="username">"名前"</string>
+    <string name="password">"パスワード"</string>
+    <string name="action">"ログイン"</string>
+    <string name="cancel">"キャンセル"</string>
+    <string name="ok">"OK"</string>
+    <!-- no translation found for matches_found (4019114285322631887) -->
+    <skip />
+    <!-- no translation found for zero (5187607177868389265) -->
+    <skip />
+    <string name="page_info">"ページ情報"</string>
+    <string name="page_info_view">"ページ情報を表示"</string>
+    <string name="page_info_address">"アドレス:"</string>
+    <string name="ssl_warnings_header">"このサイトのセキュリティ証明書には問題があります。"</string>
+    <string name="ssl_continue">"続行"</string>
+    <string name="security_warning">"セキュリティ警告"</string>
+    <string name="view_certificate">"証明書を表示"</string>
+    <string name="ssl_untrusted">"この証明書は信頼できる認証機関のものではありません。"</string>
+    <string name="ssl_mismatch">"サイト名と証明書上の名前が一致しません。"</string>
+    <string name="ssl_expired">"この証明書は有効期限切れです。"</string>
+    <string name="ssl_not_yet_valid">"この証明書はまだ有効ではありません。"</string>
+    <string name="ssl_certificate">"セキュリティ証明書"</string>
+    <string name="ssl_certificate_is_valid">"この証明書は有効です。"</string>
+    <string name="issued_to">"発行先:"</string>
+    <string name="common_name">"共通名:"</string>
+    <string name="org_name">"組織:"</string>
+    <string name="org_unit">"組織単位:"</string>
+    <string name="issued_by">"発行者:"</string>
+    <string name="validity_period">"有効期間:"</string>
+    <string name="issued_on">"発行日:"</string>
+    <string name="expires_on">"有効期限:"</string>
+    <string name="retrieving_creds_dlg_msg">"ログイン詳細を取得中..."</string>
+    <string name="close">"閉じる"</string>
+    <string name="close_window">"このウィンドウを閉じます。"</string>
+    <string name="stopping">"停止中..."</string>
+    <string name="stop">"停止"</string>
+    <string name="reload">"リフレッシュ"</string>
+    <string name="back">"戻る"</string>
+    <string name="forward">"進む"</string>
+    <string name="save">"OK"</string>
+    <string name="do_not_save">"キャンセル"</string>
+    <string name="location">"場所"</string>
+    <string name="name">"名前"</string>
+    <string name="http">"http://"</string>
+    <!-- no translation found for save_to_bookmarks (4680844117598293907) -->
+    <skip />
+    <string name="edit_bookmark">"ブックマークを編集"</string>
+    <!-- no translation found for create_shortcut_bookmark (9202323987633899835) -->
+    <skip />
+    <string name="open_bookmark">"開く"</string>
+    <string name="remove_bookmark">"ブックマークを削除"</string>
+    <string name="remove_history_item">"履歴から削除"</string>
+    <string name="bookmark_saved">"ブックマークを保存しました。"</string>
+    <string name="bookmark_needs_title">"ブックマークには名前を指定する必要があります。"</string>
+    <string name="bookmark_needs_url">"ブックマークには場所を指定する必要があります。"</string>
+    <string name="empty_bookmark">"空のブックマークは作成できません。"</string>
+    <string name="bookmark_url_not_valid">"無効なURLです。"</string>
+    <string name="delete_bookmark">"削除"</string>
+    <string name="bookmark_page">"最後に表示したページをブックマークする"</string>
+    <string name="current_page">"現在のページ:"</string>
+    <string name="delete_bookmark_warning">"ブックマーク「<xliff:g id="BOOKMARK">%s</xliff:g>」を削除します。"</string>
+    <string name="open_in_new_window">"新しいウィンドウで開く"</string>
+    <string name="new_window">"新しいウィンドウ"</string>
+    <string name="goto_dot">"URLに移動"</string>
+    <string name="find_dot">"このページの検索"</string>
+    <string name="homepage">"ホームページ"</string>
+    <string name="view_tabs">"ウィンドウリスト"</string>
+    <!-- no translation found for view_tabs_condensed (5803955493821945369) -->
+    <skip />
+    <string name="tab_picker_title">"現在のウィンドウ"</string>
+    <string name="tab_picker_view_tab">"表示"</string>
+    <string name="tab_picker_new_tab">"新しいウィンドウ"</string>
+    <string name="tab_picker_remove_tab">"閉じる"</string>
+    <string name="tab_picker_bookmark">"ブックマーク"</string>
+    <string name="tab_picker_send_url">"リンクを共有"</string>
+    <string name="bookmarks">"ブックマーク"</string>
+    <string name="shortcut_bookmark">"ブックマーク"</string>
+    <string name="history">"履歴"</string>
+    <string name="menu_view_download">"ダウンロード"</string>
+    <string name="menu_bookmark_page">"ページをブックマーク"</string>
+    <string name="share_page">"ページを共有"</string>
+    <string name="menu_zoom">"ズーム"</string>
+    <string name="menu_flip_orientation">"画面の向きを変更"</string>
+    <string name="contextmenu_openlink">"開く"</string>
+    <string name="contextmenu_openlink_newwindow">"新しいウィンドウで開く"</string>
+    <string name="contextmenu_bookmark_thislink">"リンクをブックマーク"</string>
+    <string name="contextmenu_savelink">"リンクを保存"</string>
+    <string name="contextmenu_sharelink">"リンクを共有"</string>
+    <string name="contextmenu_copy">"コピー"</string>
+    <string name="contextmenu_copylink">"リンクのURLをコピー"</string>
+    <string name="contextmenu_download_image">"画像を保存"</string>
+    <string name="contextmenu_view_image">"画像を表示"</string>
+    <string name="contextmenu_dial_dot">"発信..."</string>
+    <string name="contextmenu_add_contact">"連絡先を追加"</string>
+    <string name="contextmenu_send_mail">"メールを送信"</string>
+    <string name="contextmenu_map">"地図"</string>
+    <string name="clear">"クリア"</string>
+    <string name="replace">"入れ替え"</string>
+    <string name="browser_bookmarks_page_bookmarks_text">"ブックマーク"</string>
+    <string name="menu_preferences">"設定"</string>
+    <string name="pref_content_title">"ページコンテンツ設定"</string>
+    <string name="pref_content_load_images">"画像のロード"</string>
+    <string name="pref_content_load_images_summary">"ウェブページに画像を表示"</string>
+    <string name="pref_content_block_popups">"ポップアップウィンドウをブロック"</string>
+    <string name="pref_content_javascript">"JavaScriptを有効化"</string>
+    <string name="pref_content_open_in_background">"バックグラウンドで開く"</string>
+    <string name="pref_content_open_in_background_summary">"現在のウィンドウの後ろに新しいウィンドウを開く"</string>
+    <string name="pref_content_homepage">"ホームページ設定"</string>
+    <string name="pref_content_autofit">"ページの自動調整"</string>
+    <string name="pref_content_autofit_summary">"ウェブページの大きさを画面に合わせて表示します"</string>
+    <string name="pref_privacy_title">"プライバシー設定"</string>
+    <string name="pref_privacy_clear_cache">"キャッシュをクリア"</string>
+    <string name="pref_privacy_clear_cache_summary">"キャッシュされたページコンテンツをすべて削除"</string>
+    <string name="pref_privacy_clear_cache_dlg">"キャッシュをクリアします。"</string>
+    <string name="pref_privacy_clear_cookies">"全Cookieデータをクリア"</string>
+    <string name="pref_privacy_clear_cookies_summary">"ブラウザのCookieをすべてクリア"</string>
+    <string name="pref_privacy_clear_cookies_dlg">"Cookieをすべてクリアします。"</string>
+    <string name="pref_privacy_clear_history">"履歴をクリア"</string>
+    <string name="pref_privacy_clear_history_summary">"ブラウザの閲覧履歴をクリア"</string>
+    <string name="pref_privacy_clear_history_dlg">"ブラウザの閲覧履歴をクリアします。"</string>
+    <string name="pref_privacy_clear_form_data">"フォームデータをクリア"</string>
+    <string name="pref_privacy_clear_form_data_summary">"保存されているフォームデータをすべてクリア"</string>
+    <string name="pref_privacy_clear_form_data_dlg">"保存されているフォームデータをすべてクリアします。"</string>
+    <string name="pref_privacy_clear_passwords">"パスワードをクリア"</string>
+    <string name="pref_privacy_clear_passwords_summary">"保存されているパスワードをすべてクリア"</string>
+    <string name="pref_privacy_clear_passwords_dlg">"保存されているパスワードをすべてクリアします。"</string>
+    <string name="pref_security_title">"セキュリティ設定"</string>
+    <string name="pref_security_remember_passwords">"パスワードを保存"</string>
+    <string name="pref_security_remember_passwords_summary">"ウェブサイト用のユーザー名とパスワードを保存"</string>
+    <string name="pref_security_save_form_data">"フォームデータを保存"</string>
+    <string name="pref_security_save_form_data_summary">"フォームに入力したデータを保存して後で再利用する"</string>
+    <string name="pref_security_show_security_warning">"セキュリティ警告を表示"</string>
+    <string name="pref_security_show_security_warning_summary">"サイトの安全性に問題がある場合に警告を表示"</string>
+    <string name="pref_security_accept_cookies">"Cookieの受け入れ"</string>
+    <string name="pref_security_accept_cookies_summary">"サイトによるCookieデータの保存と読み取りを許可します"</string>
+    <!-- no translation found for pref_text_size (3765589440020504007) -->
+    <skip />
+  <string-array name="pref_text_size_choices">
+    <item>"最小"</item>
+    <item>"小"</item>
+    <item>"中"</item>
+    <item>"大"</item>
+    <item>"最大"</item>
+  </string-array>
+    <string name="pref_text_size_dialogtitle">"テキストサイズ"</string>
+    <string name="pref_extras_title">"詳細な設定"</string>
+    <string name="pref_extras_gears_enable">"Gearsを有効化"</string>
+    <string name="pref_extras_gears_enable_summary">"ブラウザの機能を拡張するアプリケーション"</string>
+    <string name="pref_extras_gears_settings">"Gears設定"</string>
+    <!-- no translation found for pref_plugin_installed (6387683936112106178) -->
+    <skip />
+    <string name="pref_plugin_installed_empty_list">"No installed plugins."</string>
+    <string name="pref_extras_gears_settings_summary">"ブラウザの機能を拡張するアプリケーション"</string>
+    <string name="pref_extras_reset_default">"設定のリセット"</string>
+    <string name="pref_extras_reset_default_summary">"全ブラウザデータをクリアし、設定をすべてデフォルトに戻す"</string>
+    <string name="pref_extras_reset_default_dlg">"全ブラウザデータをクリアし、設定をデフォルト値に戻します。"</string>
+    <string name="pref_extras_reset_default_dlg_title">"設定をリセット"</string>
+    <string name="pref_development_title">"デバッグ"</string>
+    <string name="pref_development_viewport">"Use wide viewport"</string>
+    <string name="pref_development_single_column_rendering">"Single column rendering"</string>
+    <string name="pref_development_normal_rendering">"Normal rendering"</string>
+    <string name="pref_development_trace">"Enable tracing"</string>
+    <string name="pref_development_nav_dump">"Enable nav cache dump"</string>
+    <!-- no translation found for pref_development_search_url (7979283099657732298) -->
+    <skip />
+    <string name="pref_development_uastring">"UAString"</string>
+  <string-array name="pref_development_ua_choices">
+    <item>"Android"</item>
+    <item>"Desktop"</item>
+    <item>"iPhone"</item>
+  </string-array>
+  <string-array name="pref_development_ua_values">
+    <item>"0"</item>
+    <item>"1"</item>
+    <item>"2"</item>
+  </string-array>
+    <!-- no translation found for pref_default_text_encoding (2689164865300623884) -->
+    <skip />
+    <!-- no translation found for pref_default_text_encoding_choices:0 (7275223955790513818) -->
+    <!-- no translation found for pref_default_text_encoding_choices:1 (2456597866837587140) -->
+    <!-- no translation found for pref_default_text_encoding_choices:2 (7143715548814380950) -->
+    <!-- no translation found for pref_default_text_encoding_choices:3 (5111312120564516587) -->
+    <!-- no translation found for pref_default_text_encoding_choices:4 (6545734186479713946) -->
+    <!-- no translation found for pref_default_text_encoding_dialogtitle (5508255018084978547) -->
+    <skip />
+    <!-- no translation found for pref_default_text_encoding_default (5272126711231936722) -->
+    <skip />
+    <string name="browserFrameRedirect">"リダイレクト"</string>
+    <string name="browserFrame307Post">"このウェブページはリダイレクトされます。入力したフォームデータをリダイレクト先に送信しますか?"</string>
+    <string name="browserFrameNetworkErrorLabel">"データアクセスエラー"</string>
+    <string name="browserFrameFileErrorLabel">"ファイルに問題があります"</string>
+    <string name="browserFrameFormResubmitLabel">"確認"</string>
+    <string name="browserFrameFormResubmitMessage">"表示しようとしているページには、送信済みのデータ (「POSTDATA」) があります。データを再送すると、以前このページのフォームで実行した操作 (検索やオンライン購入など) が繰り返されます。"</string>
+    <string name="loadSuspendedTitle">"ネットワークに接続していません"</string>
+    <string name="loadSuspended">"再接続時にロードを続行します。"</string>
+    <string name="clear_history">"履歴をクリア"</string>
+    <string name="browser_history">"最近閲覧したページ"</string>
+    <string name="empty_history">"ブラウザ履歴はありません。"</string>
+    <string name="add_new_bookmark">"新しいブックマーク"</string>
+    <string name="no_database">"データベースがありません。"</string>
+    <string name="search_hint">"ウェブアドレスを入力してください"</string>
+    <string name="search">"検索"</string>
+    <string name="search_button_text">"移動"</string>
+    <string name="js_dialog_title_prefix">"ページ"</string>
+    <string name="js_dialog_title_suffix">":"</string>
+    <string name="js_dialog_title_default">"JavaScript"</string>
+    <string name="js_dialog_before_unload">"このページから移動しますか?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"続行する場合は[OK]、今のページに残る場合は[キャンセル]を選択してください。"</string>
+    <string name="attention">"注意"</string>
+    <string name="popup_window_attempt">"このサイトはポップアップウィンドウを開こうとしています。"</string>
+    <string name="allow">"許可"</string>
+    <string name="block">"ブロック"</string>
+    <string name="too_many_windows_dialog_title">"ウィンドウの数が最大です"</string>
+    <string name="too_many_windows_dialog_message">"既にウィンドウの数が最大なので、新しいウィンドウを開けません。"</string>
+    <string name="too_many_subwindows_dialog_title">"ポップアップが既に開いています"</string>
+    <string name="too_many_subwindows_dialog_message">"一度に開けるポップアップウィンドウは1つだけなので、新しいポップアップウィンドウを開けませんでした。"</string>
+    <string name="download_title">"ダウンロード履歴"</string>
+    <string name="download_unknown_filename">"&lt;不明&gt;"</string>
+    <string name="download_menu_open">"開く"</string>
+    <string name="download_menu_clear">"リストからクリア"</string>
+    <string name="download_menu_cancel">"ダウンロードをキャンセル"</string>
+    <string name="download_menu_cancel_all">"全ダウンロードをキャンセル"</string>
+    <string name="download_menu_clear_all">"リストをクリア"</string>
+    <string name="download_clear_dlg_title">"クリア"</string>
+    <string name="download_clear_dlg_msg">"リストの項目をすべてクリアし、ブラウザのキャッシュから削除します。"</string>
+    <string name="download_cancel_dlg_title">"ダウンロードをキャンセル"</string>
+    <string name="download_cancel_dlg_msg">"全<xliff:g id="DOWNLOAD_COUNT">%d</xliff:g>件のダウンロードをキャンセルし、ダウンロード履歴からクリアします。"</string>
+    <string name="download_file_error_dlg_title">"容量不足です"</string>
+    <string name="download_file_error_dlg_msg">"<xliff:g id="FILENAME">%s</xliff:g>をダウンロードできませんでした。"\n"携帯電話の空き領域を増やしてもう一度試してください。"</string>
+    <string name="download_failed_generic_dlg_title">"ダウンロードに失敗しました"</string>
+    <string name="download_no_sdcard_dlg_title">"SDカードがありません"</string>
+    <string name="download_no_sdcard_dlg_msg">"<xliff:g id="FILENAME">%s</xliff:g>をダウンロードするにはSDカードが必要です。"</string>
+    <!-- no translation found for download_sdcard_busy_dlg_title (6877712666046917741) -->
+    <skip />
+    <!-- no translation found for download_sdcard_busy_dlg_msg (4579003999083645700) -->
+    <skip />
+    <string name="download_no_application">"このファイルを開けるアプリケーションがありません。"</string>
+    <string name="retry">"再試行"</string>
+    <string name="no_downloads">"ダウンロード履歴はありません。"</string>
+    <string name="download_error">"ダウンロードできませんでした。"</string>
+    <string name="download_success">"<xliff:g id="FILE">%s</xliff:g>のダウンロードが終了しました。"</string>
+    <string name="download_running">"ダウンロード中..."</string>
+    <string name="download_pending">"ダウンロードを開始します..."</string>
+    <string name="download_pending_network">"ネットワークに接続しています..."</string>
+    <string name="download_running_paused">"ネットワークに接続しています..."</string>
+    <string name="download_canceled">"ダウンロードをキャンセルしました。"</string>
+    <!-- no translation found for download_not_acceptable (282108828207321357) -->
+    <skip />
+    <string name="download_file_error">"空き容量が不足しているため、ダウンロードを完了できません。"</string>
+    <string name="download_length_required">"項目のサイズを特定できないため、ダウンロードできません。"</string>
+    <string name="download_precondition_failed">"ダウンロードが中断されました。再開できません。"</string>
+    <!-- no translation found for activity_instrumentation_test_runner (8215091309334005029) -->
+    <skip />
+  <string-array name="bookmarks">
+    <item>"Google"</item>
+    <item>"http://www.google.com/"</item>
+    <item>"Yahoo!"</item>
+    <item>"http://www.yahoo.com/"</item>
+    <item>"MSN"</item>
+    <item>"http://www.msn.com/"</item>
+    <item>"MySpace"</item>
+    <item>"http://www.myspace.com/"</item>
+    <item>"Facebook"</item>
+    <item>"http://www.facebook.com/"</item>
+    <item>"ウィキペディア"</item>
+    <item>"http://www.wikipedia.org/"</item>
+    <item>"eBay"</item>
+    <item>"http://www.ebay.com/"</item>
+    <item>"CNN"</item>
+    <item>"http://www.cnn.com/"</item>
+    <item>"New York Times"</item>
+    <item>"http://www.nytimes.com/"</item>
+    <item>"ESPN"</item>
+    <item>"http://espn.go.com/"</item>
+    <item>"Amazon"</item>
+    <item>"http://www.amazon.com/"</item>
+    <item>"Weather Channel"</item>
+    <item>"http://www.weather.com/"</item>
+    <item>"BBC"</item>
+    <item>"http://www.bbc.co.uk/"</item>
+  </string-array>
+    <!-- no translation found for permlab_readHistoryBookmarks (2090878935052508686) -->
+    <skip />
+    <!-- no translation found for permdesc_readHistoryBookmarks (3198464990003094365) -->
+    <skip />
+    <!-- no translation found for permlab_writeHistoryBookmarks (3617974487656041765) -->
+    <skip />
+    <!-- no translation found for permdesc_writeHistoryBookmarks (2408364750616892343) -->
+    <skip />
+    <!-- no translation found for query_data_message (2662165772252682312) -->
+    <skip />
+    <!-- no translation found for location_message (3273812190303763599) -->
+    <skip />
+    <!-- no translation found for shortcut_message (8474516749978531587) -->
+    <skip />
+    <!-- no translation found for settings_message (6171686603006325199) -->
+    <skip />
+    <!-- no translation found for filepicker_message (3954806995548322454) -->
+    <skip />
+    <!-- no translation found for settings_title (3579144910187265022) -->
+    <skip />
+    <!-- no translation found for privacy_policy (864201179110197308) -->
+    <skip />
+    <!-- no translation found for permission_button_alwaysdeny (3997759797081359571) -->
+    <skip />
+    <!-- no translation found for permission_button_allow (8433538747157349096) -->
+    <skip />
+    <!-- no translation found for permission_button_deny (8238202164838263939) -->
+    <skip />
+    <!-- no translation found for shortcut_button_alwaysdeny (8677418058335584182) -->
+    <skip />
+    <!-- no translation found for shortcut_button_allow (3106634184087569293) -->
+    <skip />
+    <!-- no translation found for shortcut_button_deny (6054910540900054553) -->
+    <skip />
+    <!-- no translation found for settings_button_allow (447817497759509841) -->
+    <skip />
+    <!-- no translation found for settings_button_deny (602496920123085858) -->
+    <skip />
+    <!-- no translation found for filepicker_button_allow (2849120125810490391) -->
+    <skip />
+    <!-- no translation found for filepicker_button_deny (1302975999145835953) -->
+    <skip />
+    <!-- no translation found for remove (7820112494467011374) -->
+    <skip />
+    <!-- no translation found for local_storage (6703332885937279085) -->
+    <skip />
+    <!-- no translation found for allowed (1599514934221911624) -->
+    <skip />
+    <!-- no translation found for denied (7470209521858372968) -->
+    <skip />
+    <!-- no translation found for unrecognized_dialog_message (687399590684283989) -->
+    <skip />
+    <!-- no translation found for default_button (3901922329454578908) -->
+    <skip />
+</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
deleted file mode 100644 (file)
index fae76b6..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-  <string name="action">登入</string>
-  <string name="activity_instrumentation_functional_test_runner">瀏覽器功能測試執行器</string>
-  <string name="activity_instrumentation_test_runner">瀏覽器測試執行器</string>
-  <string name="add_new_bookmark">新增書籤</string>
-  <string name="allow">允許</string>
-  <string name="attention">注意</string>
-  <string name="back">上一步</string>
-  <string name="block">封鎖</string>
-  <string name="bookmark_needs_title">"必須輸入書籤名稱。"</string>
-  <string name="bookmark_needs_url">"必須輸入書籤位置。"</string>
-  <string name="bookmark_page">將上次檢視的頁面加入書籤</string>
-  <string name="bookmark_saved">儲存到書籤。</string>
-  <string name="bookmark_url_not_valid">URL 無效。</string>
-  <string name="bookmarks">書籤</string>
-  <string name="browserFrame307Post">此網頁已經被重新導向。需要將輸入的表單資料重新傳送到新位置嗎?</string>
-  <string name="browserFrameFileErrorLabel">檔案發生問題</string>
-  <string name="browserFrameFormResubmitLabel">確認</string>
-  <string name="browserFrameFormResubmitMessage">正在嘗試檢視的頁面包含了已經提交的資料 (\"POSTDATA\")。如果需要重新傳送資料,則頁面上之表單所要執行 (例如搜尋或線上購買) 的任何動作將會被重複執行。</string>
-  <string name="browserFrameNetworkErrorLabel">資料連線能力發生問題</string>
-  <string name="browserFrameRedirect">重新導向</string>
-  <string name="browser_bookmarks_page_bookmarks_text">書籤</string>
-  <string name="browser_history">最近造訪的頁面</string>
-  <string name="cache_cleared">快取已經清除</string>
-  <string name="cancel">取消</string>
-  <string name="clear">清除</string>
-  <string name="clear_history">清除記錄</string>
-  <string name="close">關閉</string>
-  <string name="close_window">將會關閉此視窗。</string>
-  <string name="common_name">公用名稱:</string>
-  <string name="contextmenu_add_contact">新增連絡人</string>
-  <string name="contextmenu_bookmark_thislink">書籤連結</string>
-  <string name="contextmenu_copy">複製</string>
-  <string name="contextmenu_copylink">複製 URL 連結</string>
-  <string name="contextmenu_dial_dot">撥打\u2026</string>
-  <string name="contextmenu_download_image">儲存影像</string>
-  <string name="contextmenu_javascript">JavaScript</string>
-  <string name="contextmenu_map">地圖</string>
-  <string name="contextmenu_openlink">開啟</string>
-  <string name="contextmenu_openlink_newwindow">在新視窗中開啟</string>
-  <string name="contextmenu_savelink">儲存連結</string>
-  <string name="contextmenu_send_mail">傳送電子郵件</string>
-  <string name="contextmenu_sharelink">共用連結</string>
-  <string name="contextmenu_view_image">檢視影像</string>
-  <string name="current_page">目前的頁面:\u0020</string>
-  <string name="delete">刪除</string>
-  <string name="delete_bookmark">刪除</string>
-  <string name="delete_bookmark_warning">將會刪除 \"<xliff:g id="bookmark">%s</xliff:g>\" 書籤。</string>
-  <string name="do_not_save">取消</string>
-  <string name="done">完成</string>
-  <string name="download_cancel_dlg_msg">將會取消所有 <xliff:g id="download_count">%d</xliff:g> 的下載,並從下載記錄中清除。</string>
-  <string name="download_cancel_dlg_title">取消下載</string>
-  <string name="download_canceled">下載已經取消。</string>
-  <string name="download_clear_dlg_msg">將會從清單中清除所有的項目,並從瀏覽器快取中移除。</string>
-  <string name="download_clear_dlg_title">清除</string>
-  <string name="download_error">下載失敗。</string>
-  <string name="download_failed_generic_dlg_title">下載失敗</string>
-  <string name="download_file_error">無法完成下載。空間不足。</string>
-  <string name="download_file_error_dlg_msg">無法下載 <xliff:g id="filename">%s</xliff:g>。\n請釋放電話上的部分空間並再試一次。</string>
-  <string name="download_file_error_dlg_title">空間不足</string>
-  <string name="download_length_required">無法下載。無法判斷項目的大小。</string>
-  <string name="download_menu_cancel">取消下載</string>
-  <string name="download_menu_cancel_all">取消所有下載</string>
-  <string name="download_menu_clear">從清單中清除</string>
-  <string name="download_menu_clear_all">清除清單</string>
-  <string name="download_menu_open">開啟</string>
-  <string name="download_no_application">找不到應用程式開啟此檔案。</string>
-  <string name="download_no_sdcard_dlg_msg">需要 SD 卡才能下載 <xliff:g id="filename">%s</xliff:g>。</string>
-  <string name="download_no_sdcard_dlg_title">無 SD 卡</string>
-  <string name="download_not_acceptable">無法下載。電話不支援要下載的內容。</string>
-  <string name="download_pending">開始下載\u2026</string>
-  <string name="download_pending_network">正在等待資料連線\u2026</string>
-  <string name="download_precondition_failed">下載已經中斷。無法繼續。</string>
-  <string name="download_running">正在下載\u2026</string>
-  <string name="download_running_paused">正在等待資料連線\u2026</string>
-  <string name="download_success"><xliff:g id="file">%s</xliff:g> 下載完成。</string>
-  <string name="download_title">下載記錄</string>
-  <string name="download_unknown_filename">&lt;無法辨識&gt;</string>
-  <string name="dump_nav">刪除導覽快取</string>
-  <string name="edit_bookmark">編輯書籤</string>
-  <string name="empty_bookmark">"無法建立空白書籤。"</string>
-  <string name="empty_history">瀏覽器記錄空白。</string>
-  <string name="expires_on">到期日:</string>
-  <string name="find_dot">搜尋頁面</string>
-  <string name="fingerprints">指紋:</string>
-  <string name="forward">下一頁</string>
-  <string name="goto_dot">移至 URL</string>
-  <string name="history">記錄</string>
-  <string name="history_picker_view_web_page">開啟</string>
-  <string name="homepage">首頁</string>
-  <string name="homepage_set">首頁已經更新</string>
-  <string name="http">http://</string>
-  <string name="info_base">標題:\n  <xliff:g id="title">%s1</xliff:g> \n\nURL:\n  <xliff:g id="url">%s2</xliff:g></string>
-  <string name="issued_by">發行者:</string>
-  <string name="issued_on">發行日期:</string>
-  <string name="issued_to">發給:</string>
-  <string name="js_dialog_before_unload">瀏覽此頁面以外的網頁?\n\n<xliff:g id="message">%s</xliff:g>\n\n請選取確定繼續瀏覽,或選取取消停留在目前的頁面。</string>
-  <string name="js_dialog_title_default">JavaScript</string>
-  <string name="js_dialog_title_prefix">頁面</string>
-  <string name="js_dialog_title_suffix">指出:</string>
-  <string name="loadSuspended">此頁面將會在恢復連線之後繼續載入。</string>
-  <string name="loadSuspendedTitle">無網路連線</string>
-  <string name="location">位置</string>
-  <string name="matches_found">找到的符合項目:</string>
-  <string name="md5_fingerprint">MD5 指紋:</string>
-  <string name="menu_bookmark_page">將頁面加入書籤</string>
-  <string name="menu_flip_orientation">翻轉方向</string>
-  <string name="menu_preferences">設定</string>
-  <string name="menu_use_as_homepage">設定為首頁</string>
-  <string name="menu_view_download">下載</string>
-  <string name="menu_zoom">顯示比例</string>
-  <string name="name">名稱</string>
-  <string name="new_window">新增視窗</string>
-  <string name="next">下一步</string>
-  <string name="no_database">無資料庫!</string>
-  <string name="no_downloads">下載記錄空白。</string>
-  <string name="ok">確定</string>
-  <string name="oma_error_failed_to_download">無法下載媒體。</string>
-  <string name="oma_error_insufficient_memory">記憶體不足!請檢查 SD 卡。</string>
-  <string name="oma_error_invalid_descriptor">無效的下載描述符號。</string>
-  <string name="oma_error_non_acceptable_content">不支援此內容。</string>
-  <string name="oma_label_action">下載</string>
-  <string name="oma_label_cancel">結束</string>
-  <string name="oma_label_description">說明:</string>
-  <string name="oma_label_download_error">下載錯誤:</string>
-  <string name="oma_label_exit">結束</string>
-  <string name="oma_label_name">名稱:</string>
-  <string name="oma_label_proceed">繼續</string>
-  <string name="oma_label_size">大小:</string>
-  <string name="oma_label_type">類型:</string>
-  <string name="oma_label_vendor">廠商:</string>
-  <string name="oma_label_want_to_download">是否要下載此內容?</string>
-  <string name="oma_status_attribute_mismatch">屬性不相符</string>
-  <string name="oma_status_device_aborted">電話已經中止</string>
-  <string name="oma_status_insufficient_memory">記憶體不足</string>
-  <string name="oma_status_invalid_descriptor">無效的描述符號</string>
-  <string name="oma_status_invalid_version">無效的版本</string>
-  <string name="oma_status_loader_error">裝載程式錯誤</string>
-  <string name="oma_status_loss_of_service">服務中斷</string>
-  <string name="oma_status_non_acceptable_content">無法接受的內容</string>
-  <string name="oma_status_success">成功</string>
-  <string name="oma_warning_one_or_more_types_not_supported">不支援一或多個內容類別。</string>
-  <string name="open_bookmark">開啟</string>
-  <string name="open_in_new_window">在新視窗中開啟</string>
-  <string name="org_name">組織:</string>
-  <string name="org_unit">組織單位:</string>
-  <string name="override">取代</string>
-  <string name="override_message">將會取代現有書籤。</string>
-  <string name="page_info">頁面資訊</string>
-  <string name="page_info_address">網址:</string>
-  <string name="page_info_cache_source">快取來源:</string>
-  <string name="page_info_encoding">編碼:</string>
-  <string name="page_info_expires">到期日:</string>
-  <string name="page_info_modified">修改日期:</string>
-  <string name="page_info_referring_url">參照 URL:</string>
-  <string name="page_info_render_mode">顯示模式:</string>
-  <string name="page_info_size">大小:</string>
-  <string name="page_info_type">類型:</string>
-  <string name="page_info_view">檢視頁面資訊</string>
-  <string name="password">密碼</string>
-  <string name="popup_window_attempt">網站正在嘗試開啟
-      快顯視窗。</string>
-  <string name="pref_content_autofit">自動調整為符合頁面</string>
-  <string name="pref_content_autofit_summary">將網頁格式化為符合畫面</string>
-  <string name="pref_content_block_popups">攔截快顯視窗</string>
-  <string name="pref_content_homepage">設定首頁</string>
-  <string name="pref_content_javascript">啟用 JavaScript</string>
-  <string name="pref_content_load_images">載入影像</string>
-  <string name="pref_content_load_images_summary">顯示網頁上的影像</string>
-  <string name="pref_content_open_in_background">在背景中開啟</string>
-  <string name="pref_content_open_in_background_summary">在目前的視窗後方開啟新視窗</string>
-  <string name="pref_content_title">頁面內容設定</string>
-  <string name="pref_development_nav_dump">啟用導覽快取刪除</string>
-  <string name="pref_development_normal_rendering">正常顯示</string>
-  <string name="pref_development_single_column_rendering">單一欄位顯示</string>
-  <string name="pref_development_title">偵錯</string>
-  <string name="pref_development_trace">啟用追蹤</string>
-  <string name="pref_development_track">啟用軌跡球</string>
-  <string name="pref_development_uastring">UAString</string>
-  <string name="pref_development_viewport">使用寬視圖</string>
-  <string name="pref_extras_gears_enable">啟用 Gears</string>
-  <string name="pref_extras_gears_enable_summary">擴充瀏覽器功能的應用程式</string>
-  <string name="pref_extras_gears_settings">Gears 設定</string>
-  <string name="pref_extras_gears_settings_summary">擴充瀏覽器功能的應用程式</string>
-  <string name="pref_extras_reset_default">重設成預設值</string>
-  <string name="pref_extras_reset_default_dlg">將會清除所有瀏覽器的資料,且設定也將會還原為預設值。</string>
-  <string name="pref_extras_reset_default_dlg_title">重設成預設值</string>
-  <string name="pref_extras_reset_default_summary">清除所有瀏覽器的資料,並將所有設定重設成預設值</string>
-  <string name="pref_extras_title">進階設定</string>
-  <string name="pref_plugin_installed_empty_listxx">尚未安裝外掛程式。</string>
-  <string name="pref_plugin_installed_summaryxx">檢視目前安裝的外掛程式</string>
-  <string name="pref_privacy_clear_cache">清除快取</string>
-  <string name="pref_privacy_clear_cache_dlg">將會清除快取。</string>
-  <string name="pref_privacy_clear_cache_summary">刪除所有快取的頁面內容</string>
-  <string name="pref_privacy_clear_cookies">清除所有 Cookie 的資料</string>
-  <string name="pref_privacy_clear_cookies_dlg">將會清除所有的 Cookie。</string>
-  <string name="pref_privacy_clear_cookies_summary">清除所有瀏覽器的 Cookie</string>
-  <string name="pref_privacy_clear_form_data">清除表單資料</string>
-  <string name="pref_privacy_clear_form_data_dlg">將會清除所有儲存的表單資料。</string>
-  <string name="pref_privacy_clear_form_data_summary">清除所有儲存的表單資料</string>
-  <string name="pref_privacy_clear_history">清除記錄</string>
-  <string name="pref_privacy_clear_history_dlg">將會清除瀏覽器的導覽記錄。</string>
-  <string name="pref_privacy_clear_history_summary">清除瀏覽器的導覽記錄</string>
-  <string name="pref_privacy_clear_passwords">清除密碼</string>
-  <string name="pref_privacy_clear_passwords_dlg">將會清除所有儲存的密碼。</string>
-  <string name="pref_privacy_clear_passwords_summary">清除所有儲存的密碼</string>
-  <string name="pref_privacy_title">隱私權設定</string>
-  <string name="pref_security_accept_cookies">接受 Cookie</string>
-  <string name="pref_security_accept_cookies_summary">允許網站儲存及讀取 \"Cookie\" 資料</string>
-  <string name="pref_security_remember_passwords">記住密碼</string>
-  <string name="pref_security_remember_passwords_summary">儲存網站的使用者名稱及密碼</string>
-  <string name="pref_security_save_form_data">記住表單資料</string>
-  <string name="pref_security_save_form_data_summary">記住表單中的 I 類型資料,以便稍後使用</string>
-  <string name="pref_security_show_security_warning">顯示安全性警告</string>
-  <string name="pref_security_show_security_warning_summary">如果網站的安全性發生問題,則顯示警告</string>
-  <string name="pref_security_title">安全性設定</string>
-  <string name="pref_text_size">文字大小</string>
-  <string name="pref_text_size_dialogtitle">文字大小</string>
-  <string name="pref_text_size_summary">選取網頁上的文字大小</string>
-  <string name="prev">上一頁</string>
-  <string name="question_mark">\?</string>
-  <string name="reload">重新整理</string>
-  <string name="remove_bookmark">刪除書籤</string>
-  <string name="remove_history_item">從記錄中移除</string>
-  <string name="replace">取代</string>
-  <string name="retrieving_creds_dlg_msg">正在擷取登入的詳細資料\u2026</string>
-  <string name="retry">重試</string>
-  <string name="save">確定</string>
-  <string name="save_to_bookmarks">書籤連結</string>
-  <string name="search">搜尋</string>
-  <string name="search_button_text">移至</string>
-  <string name="search_hint">輸入網址</string>
-  <string name="search_label">瀏覽器</string>
-  <string name="security_warning">安全性警告</string>
-  <string name="sha1_fingerprint">SHA1 指紋:</string>
-  <string name="share_page">共用頁面</string>
-  <string name="shortcut_bookmark">書籤</string>
-  <string name="sign_in_to">登入 <xliff:g id="hostname">%s1</xliff:g> \"<xliff:g id="realm">%s2</xliff:g>\"</string>
-  <string name="ssl_certificate">安全性憑證</string>
-  <string name="ssl_certificate_is_valid">有效的憑證。</string>
-  <string name="ssl_continue">繼續</string>
-  <string name="ssl_expired">此憑證已經過期。</string>
-  <string name="ssl_mismatch">網站名稱與憑證上的名稱不相符。</string>
-  <string name="ssl_not_yet_valid">無效的憑證。</string>
-  <string name="ssl_untrusted">此憑證不是來自信任的授權單位。</string>
-  <string name="ssl_warnings_header">此網站的安全性憑證發生問題。</string>
-  <string name="stop">停止</string>
-  <string name="stopping">正在停止\u2026</string>
-  <string name="tab_picker_bookmark">書籤</string>
-  <string name="tab_picker_new_tab">新增視窗</string>
-  <string name="tab_picker_remove_tab">關閉</string>
-  <string name="tab_picker_send_url">共用連結</string>
-  <string name="tab_picker_title">目前視窗</string>
-  <string name="tab_picker_view_tab">檢視</string>
-  <string name="too_many_subwindows_dialog_message">無法再開啟新的
-      快顯視窗;在任何情況下一次只能開啟一個視窗。</string>
-  <string name="too_many_subwindows_dialog_title">已經開啟快顯視窗</string>
-  <string name="too_many_windows_dialog_message">無法開啟新的視窗;開啟的視窗數量已經達到上限。</string>
-  <string name="too_many_windows_dialog_title">已經達到視窗數量的上限</string>
-  <string name="username">名稱</string>
-  <string name="validity_period">有效性:</string>
-  <string name="view_certificate">檢視憑證</string>
-  <string name="view_tabs">視窗概觀</string>
-  <string name="view_tabs_condensed">視窗</string>
-  <string name="visual_history">視窗記錄</string>
-  <string name="with">含有</string>
-  <string name="zero">0</string>
-</resources>
index 71ed099..0c22bc8 100644 (file)
     
     <color name="white">#ffffffff</color>
     <color name="black">#ff000000</color>
+    <color name="gray">#ffbbbbbb</color>
     
     <color name="translucent_white">#11ffffff</color>
+
+    <!-- Gears Dialog -->
+    <color name="permission_border">#f1cc1d</color>
+    <color name="permission_background">#faefb8</color>
+    <color name="shortcut_border">#e8e8e8</color>
+    <color name="shortcut_background">#f8f8f8</color>
 </resources>
 
index cb66949..7212135 100644 (file)
 
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- Sign-in dialog -->
+    <!-- This is used as the title of a dialog which is used to sign in to a secure site.
+            "%s1"is replaced with the host and "%s2" with realm -->
     <string name="sign_in_to">Sign in to <xliff:g id="hostname">%s1</xliff:g> \"<xliff:g id="realm">%s2</xliff:g>\"</string>
+    <!-- Prompt for an input box that allows the user to enter their login name -->
     <string name="username">Name</string>
+    <!-- Prompt for an input box that allows the user to enter their password -->
     <string name="password">Password</string>
+    <!-- The label on the "sign in" button -->
     <string name="action">Sign in</string>
-    <!-- Button label -->
+
+    <!-- Label for a cancel button.  It is used for multiple cancel buttons in different contexts -->
     <string name="cancel">Cancel</string>
-    <!-- Button label -->
+    <!-- Label for a confirm button.  Used in multiple contexts. -->
     <string name="ok">OK</string>
-    <!-- Button label -->
-    <string name="done">Done</string>
-    <!-- Button label -->
-    <string name="prev">Prev</string>
-    <!-- Button label -->
-    <string name="next">Next</string>
-    <string name="matches_found">Matches found:</string>
-    <string name="zero">0</string>
+
+    <!--The find dialog -->
+    <!-- Displayed on the Find Dialog, stating "X matches" where X is the
+            number of matches found in the current page -->
+    <string name="matches_found">\u0020matches</string>
+    <!-- Displayed on the Find Dialog, stating that there are "zero
+            matches" -->
+    <string name="zero">No</string>
     
     <!-- Menu item -->
     <string name="page_info">Page info</string>
+    <!-- Label for a button on an SSL error dialog that allows the user to see
+        Page info screen for the current page -->
     <string name="page_info_view">View page info</string>
     <!-- Page Info dialog strings -->
+    <!-- Noun.  The url for the current page. Displayed on the Page Info
+            screen. -->
     <string name="page_info_address">Address:</string>
-    <string name="page_info_type">Type:</string>
-    <string name="page_info_render_mode">Render mode:</string>
-    <string name="page_info_cache_source">Cache source:</string>
-    <string name="page_info_encoding">Encoding:</string>
-    <string name="page_info_size">Size:</string>
-    <string name="page_info_referring_url">Referring URL:</string>
-    <string name="page_info_modified">Modified:</string>
-    <string name="page_info_expires">Expires:</string>
 
     <!-- SSL Error dialogs -->
     <string name="ssl_warnings_header">There are problems with the security certificate for this site.</string>
+    <!-- Label for a button on an SSL error dialog that lets the user continue
+            and view the page despite the error -->
     <string name="ssl_continue">Continue</string>
+    <!-- Title for an SSL error dialog  -->
     <string name="security_warning">Security warning</string>
+    <!-- Label for a button on an SSL error dialog that lets the user view the
+        certificate -->
     <string name="view_certificate">View certificate</string>
 
+    <!-- Message in an SSL Error dialog -->
     <string name="ssl_untrusted">This certificate is not from a trusted authority.</string>
+    <!-- Message in an SSL Error dialog -->
     <string name="ssl_mismatch">The name of the site does not match the name on the certificate.</string>
+    <!-- Message in an SSL Error dialog -->
     <string name="ssl_expired">This certificate has expired.</string>
+    <!-- Message in an SSL Error dialog -->
     <string name="ssl_not_yet_valid">This certificate is not valid yet.</string>
     
     <!-- SSL Certificate dialogs -->
+    <!-- Title for an SSL Certificate dialog -->
     <string name="ssl_certificate">Security certificate</string>
+    <!-- Message on an SSL Certificate dialog -->
     <string name="ssl_certificate_is_valid">This certificate is valid.</string>
+    <!-- Label for an information field on an SSL Certificate Dialog -->
     <string name="issued_to">Issued to:</string>
+    <!-- Label for an information field on an SSL Certificate Dialog -->
     <string name="common_name">Common name:</string>
+    <!-- Label for an information field on an SSL Certificate Dialog -->
     <string name="org_name">Organization:</string>
+    <!-- Label for an information field on an SSL Certificate Dialog -->
     <string name="org_unit">Organizational unit:</string>
+    <!-- Label for an information field on an SSL Certificate Dialog -->
     <string name="issued_by">Issued by:</string>
+    <!-- Label for an information field on an SSL Certificate Dialog -->
     <string name="validity_period">Validity:</string>
+    <!-- Label for an information field on an SSL Certificate Dialog -->
     <string name="issued_on">Issued on:</string>
+    <!-- Label for an information field on an SSL Certificate Dialog -->
     <string name="expires_on">Expires on:</string>
-    <string name="fingerprints">Fingerprints:</string>
-    <string name="sha1_fingerprint">SHA1 fingerprint:</string>
-    <string name="md5_fingerprint">MD5 fingerprint:</string>
 
     <!-- Dialog that is shown while we are retrieving the login creds from the system -->
     <string name="retrieving_creds_dlg_msg">Retrieving sign-in details\u2026</string>
-    <!-- Menu item -->
+    <!-- Menu item in a context menu for closing a browser window. -->
     <string name="close">Close</string>
-    <!-- Confirmation dialog message -->
+    <!-- Confirmation dialog message stating that a browser window will be closed -->
     <string name="close_window">This window will be closed.</string>
-    <!-- Toast -->
+    <!-- Toast informing the user that loading has stopped for the current page. -->
     <string name="stopping">Stopping\u2026</string>
-    <!-- Menu item -->
+    <!-- Menu item to stop the current page from loading. -->
     <string name="stop">Stop</string>
-    <!-- Menu item -->
+    <!-- Menu item to reload or refresh the current page. -->
     <string name="reload">Refresh</string>
-    <!-- Menu item -->
+    <!-- Menu item to go back to the previous page. -->
     <string name="back">Back</string>
-    <!-- Menu item -->
+    <!-- Menu item to go to the next page (only useful if the user has previously hit back.) -->
     <string name="forward">Forward</string>
-    <!-- Button label -->
+    <!-- Button label to confirm saving a bookmark. -->
     <string name="save">OK</string>
-    <!-- Button label -->
+    <!-- Button label to cancel saving a bookmark. -->
     <string name="do_not_save">Cancel</string>
-    <!-- Field label in Bookmark dialog box -->
+    <!-- Field label in Bookmark dialog box: refers to URL of the page to bookmark -->
     <string name="location">Location</string>
-    <!-- Field label in Bookmark dialog box -->
+    <!-- Field label in Bookmark dialog box: title that the user wishes to use for the bookmark -->
     <string name="name">Name</string>
     <!-- Initial value in Location field in Bookmark dialog box -->
     <string name="http">http://</string>
-    <!-- Menu item -->
-    <string name="save_to_bookmarks">Bookmark link</string>
-    <!-- Menu item -->
+    <!-- Menu item that opens a dialog to save a bookmark, initialized with the current page -->
+    <string name="save_to_bookmarks">Bookmark</string>
+    <!-- Menu item on the bookmarks page, to edit an existing bookmark -->
     <string name="edit_bookmark">Edit bookmark</string>
+    <!-- Context menu item to create a shortcut to the bookmark on the desktop -->
+    <string name="create_shortcut_bookmark">Add shortcut to Home</string>
+    <!-- Context menu item to open the currently highlighted bookmark -->
     <string name="open_bookmark">Open</string>
-    <!-- Menu item -->
+    <!-- Menu item to remove the currently highlighted bookmark-->
     <string name="remove_bookmark">Delete bookmark</string>
-    <!-- Menu item -->
+    <!-- Menu item to remove the currently highlighted history entry from the list of previously visited sites -->
     <string name="remove_history_item">Remove from history</string>
-    <!-- Toast -->
+    <!-- Toast informing the user that their action to save a bookmark has succeeded -->
     <string name="bookmark_saved">Saved to bookmarks.</string>
     <!-- Error that appears in the title of Bookmark dialog when user selects OK with empty Name field -->
     <string name="bookmark_needs_title">"Bookmark must have a name."</string>
     <string name="empty_bookmark">"Cannot create empty bookmark."</string>
         <!-- Error that appears in the title of Bookmark dialog when user selects OK with invalid URL -->
     <string name="bookmark_url_not_valid">URL is not valid.</string>
-        <!-- Confirmation dialog title -->
+        <!-- Title of a confirmation dialog when the user deletes a bookmark-->
     <string name="delete_bookmark">Delete</string>
-    <!-- Menu item -->
+    <!-- Menu item in the page that displays all bookmarks. It brings up a
+            dialog that allows the user to bookmark the page that the browser is
+            currently on, but is not visible because the bookmarks page is 
+            showing. -->
     <string name="bookmark_page">Bookmark last-viewed page</string>
-    <!-- Summary text under the New Bookmark item on the Bookmarks screen -->
+    <!-- Summary text under the New Bookmark item on the Bookmarks screen.
+            Tells the user that if they select this item, it will bring up a
+            dialog to bookmark the page that the browser is currently viewing,
+            though it is not currently being displayed, since they are viewing
+            the bookmarks screen. -->
     <string name="current_page">Current page:\u0020</string>
-    <!-- Confirmation dialog message -->
+    <!-- Confirmation dialog message confirming that the user wishes to delete
+            the bookmark they selected for deletion -->
     <string name="delete_bookmark_warning">Bookmark \"<xliff:g id="bookmark">%s</xliff:g>\" will be deleted.</string>
-    <string name="info_base">Title:\n  <xliff:g id="title">%s1</xliff:g> \n\nURL: \n  <xliff:g id="url">%s2</xliff:g></string>
-    <!-- Menu item -->
+    <!-- Context Menu item to open the selected link in a new window -->
     <string name="open_in_new_window">Open in new window</string>
-    <!-- Appears in Current windows screen as label on blank + window; user selects this window to open a new browser window -->
+    <!-- Appears in Current windows screen as label on blank + window; user 
+            selects this window to open a new browser window -->
     <string name="new_window">New window</string>
-    <string name="delete">Delete</string>
-    <!-- Menu item -->
+    <!-- Menu item to open a dialog which allows the user to enter a url-->
     <string name="goto_dot">Go to URL</string>
+    <!-- Menu item that opens up a dialog which allows the user to provide a
+            string and search for it on the page. -->
     <string name="find_dot">Find on page</string>
-    <!-- Menu item -->
+    <!-- Menu item to go to the home page, as stored in settings -->
     <string name="homepage">Home page</string>
+    <!-- Menu item which opens a screen which shows all the currently open
+            windows, and also allows them to create a new one. -->
     <string name="view_tabs">Window overview</string>
-    <!-- Menu item -->
-    <string name="view_tabs_condensed">Window</string>
+    <!-- Menu item which opens a screen which shows all the currently open
+            windows, and also allows them to create a new one. This is a shorter
+            alternate version of "view_tabs"-->
+    <string name="view_tabs_condensed">Windows</string>
     <!-- Title of current windows screen; appears in title bar -->
     <string name="tab_picker_title">Current windows</string>
-    <!-- Menu item -->
+    <!-- Context Menu item to view the selected window on the window picker
+            screen -->
     <string name="tab_picker_view_tab">View</string>
-    <!-- Menu item -->
+    <!-- Menu item on the window picker screen to open a new window -->
     <string name="tab_picker_new_tab">New window</string>
-    <!-- Menu item -->
+    <!-- Context Menu item to close the currently selected window -->
     <string name="tab_picker_remove_tab">Close</string>
-    <!-- Menu item -->
+    <!-- Context Menu item to bookmark the currently selected window -->
     <string name="tab_picker_bookmark">Bookmark</string>
-    <!-- Menu item -->
+    <!-- Context Menu item from the bookmarks page to share the selected
+            bookmark  -->
     <string name="tab_picker_send_url">Share link</string>
-    <!-- Menu item -->
+    <!-- Menu item to open the bookmarks page. This is a shorter version that
+            is displayed with an icon -->
     <string name="bookmarks">Bookmarks</string>
+    <!-- Secondary name for the Activity "BrowserBookmarksPage" -->
     <string name="shortcut_bookmark">Bookmark</string>
-    <!-- Menu item -->
+    <!-- Menu item to display the History of previously visited pages -->
     <string name="history">History</string>
-    <string name="visual_history">Window history</string>
-    <string name="menu_use_as_homepage">Set as home page</string>
-    <!-- Menu item -->
+    <!-- Menu item for viewing downloads from the browser -->
     <string name="menu_view_download">Downloads</string>
-    <!-- Menu item -->
+    <!-- Menu item to display the bookmark page.  This is a longer version shown
+            without an icon next to it -->
     <string name="menu_bookmark_page">Bookmark page</string>
     <!-- Menu item -->
     <string name="share_page">Share page</string>
-    <string name="homepage_set">Home page updated</string>
-    <!-- Menu item -->
+    <!-- Menu item to bring up the zoom controls -->
     <string name="menu_zoom">Zoom</string>
-    <!-- Menu item -->
+    <!-- Menu item to flip the orientation of the screen.-->
     <string name="menu_flip_orientation">Flip orientation</string>
-    <!-- Menu item -->
+    <!-- Context Menu item open the currently selected link in the current
+            window.-->
     <string name="contextmenu_openlink">Open</string>
-    <!-- Menu item -->
+    <!-- Context Menu item to open the currently selected link in a new
+            window. -->
     <string name="contextmenu_openlink_newwindow">Open in new window</string>
-    <!-- Menu item -->
+    <!-- Context Menu item to create a bookmark for the url of the currently
+            selected link. -->
     <string name="contextmenu_bookmark_thislink">Bookmark link</string>
-    <!-- Menu item -->
+    <!-- Context Menu item to save the webpage referred to by this link to the
+            SD card (external storage) -->
     <string name="contextmenu_savelink">Save link</string>
-    <!-- Menu item -->
+    <!-- Context Menu item to send the url of the selected link to someone else,
+            via Gmail or another app -->
     <string name="contextmenu_sharelink">Share link</string>
-    <!-- Menu item -->
+    <!-- Context Menu item -->
     <string name="contextmenu_copy">Copy</string>
-    <!-- Menu item -->
+    <!-- Context Menu item to copy the url of the selected link to the
+            clipboard -->
     <string name="contextmenu_copylink">Copy link URL</string>
-    <!-- Menu item -->
+    <!-- Context Menu item to save the image to external storage -->
     <string name="contextmenu_download_image">Save image</string>
-    <!-- Menu item -->
+    <!-- Context Menu item to view the image by itself in the browser -->
     <string name="contextmenu_view_image">View image</string>
-    <!-- Menu item -->
+    <!-- Context Menu item to open the dialer app with the selected phone number
+            -->
     <string name="contextmenu_dial_dot">Dial\u2026</string>
-    <!-- Menu item -->
+    <!-- Context Menu item to add the selected phone number to the address book.
+            -->
     <string name="contextmenu_add_contact">Add contact</string>
-    <!-- Menu item -->
+    <!-- Context Menu item to send an email using the selected email address.-->
     <string name="contextmenu_send_mail">Send email</string>
-    <!-- Menu item -->
+    <!-- Context Menu item to show the currently selected address in the Maps
+            application -->
     <string name="contextmenu_map">Map</string>
-    <!-- Menu item -->
-    <string name="contextmenu_javascript">JavaScript</string>
  
+    <!-- Used as the title of dialogs in the Browser Settings confirming that
+            the user wants to clear (cache, history, or cookie data) -->
     <string name="clear">Clear</string>
-    <string name="cache_cleared">Cache cleared</string>
 
-    <string name="override_message">The existing bookmark will be replaced.</string>
-    <string name="override">Replace</string>
+    <!-- Part of a sentence that says "Replace <url of existing bookmark> with
+            <url of new bookmark>?" -->
     <string name="replace">Replace</string>
-    <string name="with">with</string>
-    <string name="question_mark">\?</string>
 
+    <!-- Title displayed when the bookmarks page is shown -->
     <string name="browser_bookmarks_page_bookmarks_text">Bookmarks</string>
 
-    <string name="history_picker_view_web_page">Open</string>
 
     <!-- Settings screen strings -->
-    <!-- Menu item -->
+    <!-- Menu item to open the Settings screen -->
     <string name="menu_preferences">Settings</string>
     <!-- Settings screen, section title -->
     <string name="pref_content_title">Page content settings</string>
     <!-- Settings label -->
     <string name="pref_content_load_images">Load images</string>
+    <!-- Settings label -->
     <string name="pref_content_load_images_summary">Display images on Web pages</string>
     <!-- Settings label -->
     <string name="pref_content_block_popups">Block pop-up windows</string>
     <!-- Settings summary -->
     <string name="pref_security_accept_cookies_summary">Allow sites to save and read \"cookie\" data</string>
     <!-- Settings label -->
-    <string name="pref_text_size">Text size</string>
+    <string name="pref_text_size">Set text size</string>
     <!-- Settings text size options; appear in Text size dialog box -->
     <string-array name="pref_text_size_choices">
         <item>Tiny</item>
         <item>Large</item>
         <item>Huge</item>
     </string-array>
-    <!-- Dialog box title -->
+    <!-- Title of dialog for setting the text size -->
     <string name="pref_text_size_dialogtitle">Text size</string>
-    <string name="pref_text_size_summary">Select the size of text on Web pages</string>
+    <!-- Do not translate -->
     <string-array name="pref_text_size_values">
         <item><xliff:g>SMALLEST</xliff:g></item>
         <item><xliff:g>SMALLER</xliff:g></item>
     <!-- Settings label -->
     <string name="pref_extras_gears_settings">Gears settings</string>
     <!-- Settings summary -->
+    <string name="pref_plugin_installed">Plugins list</string>
+    <!-- Settings summary -->
+    <string name="pref_plugin_installed_empty_list">No installed plugins.</string>
     <string name="pref_extras_gears_settings_summary">Applications that extend browser functionality</string>
-    <string name="pref_plugin_installed_summaryxx">View currently-installed plugins</string>
-    <string name="pref_plugin_installed_empty_listxx">No installed plugins.</string>
     <!-- Settings label -->
     <string name="pref_extras_reset_default">Reset to default</string>
     <!-- Settings summary -->
     <string name="pref_extras_reset_default_dlg">All browser data will be cleared and settings will revert to default values.</string>
     <!-- Confirmation dialog title -->
     <string name="pref_extras_reset_default_dlg_title">Reset to default</string>
+    <!-- Title for a group of settings -->
     <string name="pref_development_title">Debug</string>
+    <!-- Do not tranlsate.  Development option -->
     <string name="pref_development_viewport">Use wide viewport</string>
+    <!-- Do not tranlsate.  Development option -->
     <string name="pref_development_single_column_rendering">Single column rendering</string>
+    <!-- Do not tranlsate.  Development option -->
     <string name="pref_development_normal_rendering">Normal rendering</string>
+    <!-- Do not tranlsate.  Development option -->
     <string name="pref_development_trace">Enable tracing</string>
-    <string name="pref_development_track">Enable trackball</string>
+    <!-- Do not tranlsate.  Development option -->
     <string name="pref_development_nav_dump">Enable nav cache dump</string>
+    <!-- Do not tranlsate.  Development option -->
+    <string name="pref_development_search_url">Set search URL</string>
+    <!-- Do not tranlsate.  Development option -->
     <string name="pref_development_uastring">UAString</string>
+    <!-- Do not tranlsate.  Development option -->
     <string-array name="pref_development_ua_choices">
         <item>Android</item>
         <item>Desktop</item>
         <item>iPhone</item>
     </string-array>
+    <!-- Do not tranlsate.  Development option -->
     <string-array name="pref_development_ua_values">
         <item>0</item>
         <item>1</item>
         <item>2</item>
     </string-array>
+    <!-- Settings screen, setting option name -->
+    <string name="pref_default_text_encoding">Set text encoding</string>
+    <!-- Options in the Default encoding dialog box -->
+    <string-array name="pref_default_text_encoding_choices">
+        <item>Latin-1 (ISO-8859-1)</item>
+        <item>Unicode (UTF-8)</item>
+        <item>Japanese (ISO-2022-JP)</item>
+        <item>Japanese (SHIFT_JIS)</item>
+        <item>Japanese (EUC-JP)</item>
+        <!-- TODO: We should add a lot more encodings.  -->
+    </string-array>
+    <!-- Dialog box title -->
+    <string name="pref_default_text_encoding_dialogtitle">Text encoding</string>
+    <!-- Do not translate. Actual encoding values. Must be valid text encodings understandable from WebKit. -->
+    <string-array name="pref_default_text_encoding_values">
+        <item>Latin-1</item>
+        <item>UTF-8</item>
+        <item>ISO-2022-JP</item>
+        <item>SHIFT_JIS</item>
+        <item>EUC-JP</item>
+    </string-array>
+    <string name="pref_default_text_encoding_default">Latin-1</string>
     <!-- Dialog box title -->
     <string name="browserFrameRedirect">Redirect</string>
     <!-- Dialog box message -->
     <string name="browserFrame307Post">This Web page is being redirected. Resend your typed form data to the new location?</string>
+    <!-- Title for a dialog displayed when the browser has a data connectivity
+            problem -->
     <string name="browserFrameNetworkErrorLabel">Data connectivity problem</string>
+    <!-- Title for a dialog displayed when the browser runs into a file label
+            error -->
     <string name="browserFrameFileErrorLabel">Problem with file</string>
     <!-- Dialog box title -->
     <string name="browserFrameFormResubmitLabel">Confirm</string>
     <string name="empty_history">Browser history is empty.</string>
     <!-- Menu item -->
     <string name="add_new_bookmark">New bookmark</string>
+    <!-- Add bookmark dialog sets its title to this if we have no database.
+            This is an error case -->
     <string name="no_database">No database!</string>
     
+    <!-- This string is for the browser "Go To" UI. -->
+    <!-- Do not translate.  This string is not displayed in UI (no badge is selected for go to). -->
     <string name="search_label">Browser</string>
+    <!-- This string is for the browser "Go To" UI. -->
+    <!-- This is the hint text shown in the Go To widget, before text is entered. -->
     <string name="search_hint">Type Web address</string>
     <!-- Menu item -->
     <string name="search">Search</string>
+    <!-- This string is for the browser "Go To" UI. -->
+    <!-- This is the button label in the "Go To" UI. -->
     <string name="search_button_text">Go</string>
-    
+
+    <!-- Part of the title for a JavaScript dialog.  The full sentence says "The
+            page at <url of current page> says:" followed by the message
+            provided by the page -->
     <string name="js_dialog_title_prefix">The page at</string>
+    <!-- Part of the title for a JavaScript dialog.  The full sentence says "The
+            page at <url of current page> says:" followed by the message
+            provided by the page -->
     <string name="js_dialog_title_suffix">says:</string>
+    <!-- Default title for a javascript dialog -->
     <string name="js_dialog_title_default">JavaScript</string>
+    <!-- Message in a javascript dialog asking if the user wishes to leave the
+             current page -->
     <string name="js_dialog_before_unload">Navigate away from this page?\n\n<xliff:g id="message">%s</xliff:g>\n\nSelect OK to continue, or Cancel to stay on the current page.</string>
 
     <!-- Pop-up window dialog -->
+    <!-- Title for a dialog informing the user that the site is attempting to
+            display a popup window -->
     <string name="attention">Attention</string>
+    <!-- Message for a dialog informing the user that the site is attempting to
+            display a popup window -->
     <string name="popup_window_attempt">This site is attempting to open a
       pop-up window.</string>
+    <!-- Label for a button to allow a particular popup window to open -->
     <string name="allow">Allow</string>
+    <!-- Label for a button to disallow a particular popup from opening -->
     <string name="block">Block</string>
 
+    <!-- Title for a dialog informing the user that they cannot open any more
+            windows because the limit has been reached. -->
     <string name="too_many_windows_dialog_title">Window limit reached</string>
+    <!-- Message in a dialog telling the user that they cannot open any more
+            windows because the limit has been reached. -->
     <string name="too_many_windows_dialog_message">Could not open a new window because you have already opened the maximum number.</string>
+    <!-- Title for a dialog informing the user that they cannot open a subwindow
+            because only one can be open at a time. -->
     <string name="too_many_subwindows_dialog_title">Pop-up already open</string>
+    <!-- Message for a dialog informing the user that they cannot open a
+            subwindow because only one can be open at a time. -->
     <string name="too_many_subwindows_dialog_message">Could not open a new
       pop-up window because only one can be open at any time.</string>
 
     <string name="download_file_error_dlg_title">Out of space</string>
     <!-- Dialog message -->
     <string name="download_file_error_dlg_msg"><xliff:g id="filename">%s</xliff:g> could not be downloaded.\nFree up some space on your phone and try again.</string>
+    <!-- Title for a dialog informing the user that the download has failed -->
     <string name="download_failed_generic_dlg_title">Download unsuccessful</string>
     <!-- Dialog title -->
     <string name="download_no_sdcard_dlg_title">No SD card</string>
     <!-- Dialog message -->
     <string name="download_no_sdcard_dlg_msg">An SD card is required to download <xliff:g id="filename">%s</xliff:g>.</string>
+    <!-- Title for a dialog informing the user that the SD card used for
+            external storage is busy so they cannot download anything -->
+    <string name="download_sdcard_busy_dlg_title">SD card unavailable</string>
+    <!-- Message for a dialog informing the user that the SD card used for
+            external storage is busy so they cannot download anything.  Informs
+            the user how to enable SD card storage -->
+    <string name="download_sdcard_busy_dlg_msg">The SD card is busy. To allow downloads, go to Home > Settings > SD card &amp; phone storage and clear the \"Use for USB storage\" check box.</string>
+    <!-- Message for a dialog informing the user that there is no application on
+            the phone that can open the file that was downloaded  -->
     <string name="download_no_application">No application can be found to open this file.</string>
+    <!-- Label for a button to re-attempt downloading a file -->
     <string name="retry">Retry</string>
     <!-- Appears in Download history screen if there is no history -->
     <string name="no_downloads">Download history is empty.</string>
     <string name="download_success"><xliff:g id="file">%s</xliff:g> Download complete.</string>
     <!-- Appears in Download history screen while an item is being downloaded -->
     <string name="download_running">Downloading\u2026</string>
+    <!-- Message in the list of items which have received download requests
+            telling their status.  This message states that the download has not
+            yet begun -->
     <string name="download_pending">Starting download\u2026</string>
+    <!-- Message in the list of items which have received download requests
+            telling their status.  This message states that the download is
+            waiting for a network connection to continue -->
     <string name="download_pending_network">Waiting for data connection\u2026</string>
+    <!-- Message in the list of items which have received download requests
+            telling their status.  This message states that the download has
+            paused to wait for a network connection -->
     <string name="download_running_paused">Waiting for data connection\u2026</string>
+    <!-- Message in the list of items which have received download requests
+            telling their status.  This message states that the download has
+            been canceled -->
     <string name="download_canceled">Download canceled.</string>
-    <string name="download_not_acceptable">Cannot download. The content being downloaded is not supported on the phone.</string>
+    <!-- Message in the list of items which have received download requests
+            telling their status.  This message states that the download will
+            not happen because the content is not supported by the phone -->
+    <string name="download_not_acceptable">Cannot download. The content is not supported on the phone.</string>
+    <!-- Message in the list of items which have received download requests
+            telling their status.  This message states that the download did not
+            finish because there is not enough storage for the file -->
     <string name="download_file_error">Cannot finish download. There is not enough space.</string>
+    <!-- Message in the list of items which have received download requests
+            telling their status.  This message states that the item cannot be
+            downloaded because it cannot determine the length of the item -->
     <string name="download_length_required">Cannot download. The size of the item cannot be determined.</string>
+    <!-- Message in the list of items which have received download requests
+            telling their status.  This message states that the download was
+            interrupted and cannot be resumed -->
     <string name="download_precondition_failed">Download interrupted. It cannot be resumed.</string>
 
-    <!-- Oma Download Manager. Note: These oma_* messages are no longer used and so not revealed to the end-user-->
-    <string name="oma_label_want_to_download">Do you want to download this content?</string>
-    <string name="oma_label_download_error">Download error:</string>
-    <string name="oma_label_proceed">Proceed</string>
-    <string name="oma_label_action">Download</string>
-    <string name="oma_label_exit">Exit</string>
-    <string name="oma_label_cancel">Exit</string>   
-
-    <string name="oma_label_name">Name:</string>
-    <string name="oma_label_vendor">Vendor:</string>
-    <string name="oma_label_size">Size:</string>
-    <string name="oma_label_type">Type:</string>
-    <string name="oma_label_description">Description:</string>
-
-    <string name="oma_error_insufficient_memory">Insufficient memory! Check your SD card.</string>
-    <string name="oma_error_invalid_descriptor">Invalid download descriptor.</string>
-    <string name="oma_error_non_acceptable_content">Content not supported.</string>
-    <string name="oma_error_failed_to_download">Unable to download media.</string>
-    <string name="oma_warning_one_or_more_types_not_supported">One or more content categories are not supported.</string>
-    <string name="oma_status_success">Success</string>
-    <string name="oma_status_insufficient_memory">Insufficient memory</string>
-    <string name="oma_status_loss_of_service">Loss of service</string>
-    <string name="oma_status_attribute_mismatch">Attribute mismatch</string>
-    <string name="oma_status_invalid_descriptor">Invalid descriptor</string>
-    <string name="oma_status_invalid_version">Invalid version</string>
-    <string name="oma_status_device_aborted">Phone aborted</string>
-    <string name="oma_status_non_acceptable_content">Unacceptable content</string>
-    <string name="oma_status_loader_error">Loader error</string>
-
-
     <string name="activity_instrumentation_test_runner">Browser Test Runner</string>
+    <!-- Do not translate.  Testing only -->
     <string name="activity_instrumentation_functional_test_runner">Browser Functional Test Runner</string>
+    <!-- Do not translate.  Testing only -->
     <string name="dump_nav">Dump navigation cache</string>
 
     <!-- Bookmarks -->
         <item>BBC</item>
         <item>http://www.bbc.co.uk/</item>
     </string-array>
+
+    <!-- Note that this is the standard search url.  It uses the current locale for language -->
+    <!-- (%1$s) and country (%2$s) and shouldn't need to be replaced by locale or mcc selected -->
+    <!-- resources. -->
+    <!-- Any changes to this (especially in terms of adding/removing the MCC-specific flavors) -->
+    <!-- should be mirrored by changes in apps/GoogleSearch. -->
+    <!-- Do not translate.  This string is an internal URI, not seen in the UI. -->
+    <string name="google_search_base" translatable="false">
+        http://www.google.com/m?hl=%1$s&amp;gl=%2$s&amp;</string>
+
+    <!-- Title of an application permission, listed so the user can choose whether 
+        they want to allow the application to do this. -->
+    <string name="permlab_readHistoryBookmarks">read Browser\'s history and bookmarks</string>
+    <!-- Description of an application permission, listed so the user can choose whether
+        they want to allow the application to do this. -->
+    <string name="permdesc_readHistoryBookmarks">Allows the application to read all 
+        the URLs that the Browser has visited, and all of the Browser\'s bookmarks.</string>
+
+    <!-- Title of an application permission, listed so the user can choose whether 
+        they want to allow the application to do this. -->
+    <string name="permlab_writeHistoryBookmarks">write Browser\'s history and bookmarks</string>
+    <!-- Description of an application permission, listed so the user can choose whether
+        they want to allow the application to do this. -->
+    <string name="permdesc_writeHistoryBookmarks">Allows an application to modify the
+        Browser\'s history or bookmarks stored on your phone. Malicious applications 
+        can use this to erase or modify your Browser\'s data.</string>
+
+    <!-- Gears Dialog -->
+    <string name="query_data_message">The Web site below wants to store information on your computer using Gears.</string>
+    <string name="location_message">The Web site below wants to access information about your location using Gears.</string>
+    <string name="shortcut_message">This Web site wants to create a shortcut on your computer. Do you want to allow this?</string>
+    <string name="settings_message">The table below shows the permissions you have granted to each site that has attempted to use Gears.</string>
+    <string name="filepicker_message">Gears File Picker</string>
+
+    <string name="settings_title">Gears settings</string>
+    <string name="privacy_policy">Read the site\'s privacy policy to see how your location will be used.</string>
+
+    <string name="permission_button_alwaysdeny">Never allow this site</string>
+    <string name="permission_button_allow">Allow</string>
+    <string name="permission_button_deny">Deny</string>
+
+    <string name="shortcut_button_alwaysdeny">Never allow this shortcut</string>
+    <string name="shortcut_button_allow">OK</string>
+    <string name="shortcut_button_deny">Cancel</string>
+
+    <string name="settings_button_allow">Apply</string>
+    <string name="settings_button_deny">Cancel</string>
+
+    <string name="filepicker_button_allow">OK</string>
+    <string name="filepicker_button_deny">Cancel</string>
+
+    <string name="remove">Remove</string>
+    <string name="local_storage">Local storage</string>
+    <string name="allowed">Allowed</string>
+    <string name="denied">Denied</string>
+
+    <string name="unrecognized_dialog_message">Unrecognized dialog type</string>
+    <string name="default_button">OK</string>
+
 </resources>
index 3a5e403..1a5ee1f 100644 (file)
@@ -1,21 +1,21 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-/* //device/apps/common/assets/res/any/styles.xml
-**
-** Copyright 2006, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License"); 
-** you may not use this file except in compliance with the License. 
-** You may obtain a copy of the License at 
-**
-**     http://www.apache.org/licenses/LICENSE-2.0 
-**
-** Unless required by applicable law or agreed to in writing, software 
-** distributed under the License is distributed on an "AS IS" BASIS, 
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
-** See the License for the specific language governing permissions and 
-** limitations under the License.
-*/
+/* 
+ *
+ * Copyright 2006,2007,2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at 
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0 
+ *
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
 -->
 <resources>
     <style name="BrowserTheme" parent="@android:Theme.Black">
         <item name="android:popupBackground">@android:drawable/editbox_dropdown_dark_frame</item>
     </style>
 
+    <style name="gears_button">
+      <item name="android:background">@drawable/gears_button</item>
+    </style>
+
+    <style name="FindDialog">
+        <item name="android:windowEnterAnimation">@anim/find_dialog_enter</item>
+        <item name="android:windowExitAnimation">@anim/find_dialog_exit</item>
+    </style>
+
+
 </resources>
 
diff --git a/res/values/themes.xml b/res/values/themes.xml
new file mode 100644 (file)
index 0000000..bb922dd
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <style name="FindDialogTheme"> 
+        <item name="android:windowFrame">@null</item>
+        <item name="android:windowIsFloating">true</item>
+        <item name="android:windowIsTranslucent">true</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:background">@null</item>
+        <item name="android:windowBackground">@null</item>
+        <item name="android:windowAnimationStyle">@style/FindDialog</item>
+        <item name="android:backgroundDimEnabled">false</item>
+    </style>
+</resources>
index 08fd835..cd40322 100644 (file)
                 android:entryValues="@array/pref_text_size_values"
                 android:dialogTitle="@string/pref_text_size_dialogtitle" />
 
+        <ListPreference
+                android:key="default_text_encoding"
+                android:title="@string/pref_default_text_encoding"
+                android:defaultValue="@string/pref_default_text_encoding_default"
+                android:entries="@array/pref_default_text_encoding_choices"
+                android:entryValues="@array/pref_default_text_encoding_values"
+                android:dialogTitle="@string/pref_default_text_encoding_dialogtitle" />
+
         <CheckBoxPreference
                 android:key="block_popup_windows"
                 android:defaultValue="true"
@@ -56,8 +64,8 @@
                 android:title="@string/pref_content_open_in_background"
                 android:summary="@string/pref_content_open_in_background_summary" />
 
-        <EditTextPreference
-                android:key="homepage"
+        <com.android.browser.BrowserHomepagePreference
+                android:key="homepage" 
                 android:title="@string/pref_content_homepage"
                 android:singleLine="true" />
 
     <PreferenceCategory
             android:title="@string/pref_extras_title">
                      
+            <!-- This setting is named "Enable Gears" but is actually
+                 tied to enabling all plugins. -->
             <CheckBoxPreference
-                    android:key="enable_gears"
+                    android:key="enable_plugins"
                     android:defaultValue="true"
                     android:title="@string/pref_extras_gears_enable"
                     android:summary="@string/pref_extras_gears_enable_summary" />
             <Preference
                     android:key="gears_settings"
                     android:persistent="false"
-                    android:dependency="enable_gears"
+                    android:dependency="enable_plugins"
                     android:title="@string/pref_extras_gears_settings"
                     android:summary="@string/pref_extras_gears_settings_summary" />
 
index 22b5997..4f55f6b 100644 (file)
             android:defaultValue="false"
             android:title="@string/pref_development_nav_dump" />
 
+        <com.android.browser.BrowserSearchpagePreference
+                android:key="search_url" 
+                android:title="@string/pref_development_search_url"
+                android:singleLine="true" />
+
         <ListPreference
             android:key="user_agent"
             android:title="@string/pref_development_uastring"
index 3fe38e8..ea65a46 100644 (file)
@@ -114,7 +114,8 @@ public class AddBookmarkPage extends Activity {
      */
     boolean save() {
         String title = mTitle.getText().toString().trim();
-        String unfilteredUrl = mAddress.getText().toString();
+        String unfilteredUrl = 
+                BrowserActivity.fixUrl(mAddress.getText().toString());
         boolean emptyTitle = title.length() == 0;
         boolean emptyUrl = unfilteredUrl.trim().length() == 0;
         Resources r = getResources();
index fc4acfc..fe27f8d 100644 (file)
@@ -62,6 +62,7 @@ import android.net.http.EventHandler;
 import android.net.http.RequestQueue;
 import android.net.http.SslCertificate;
 import android.net.http.SslError;
+import android.os.AsyncTask;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Debug;
@@ -75,13 +76,16 @@ import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.os.SystemProperties;
-import android.pim.DateFormat;
+import android.preference.PreferenceManager;
 import android.provider.Browser;
 import android.provider.Checkin;
 import android.provider.Contacts.Intents.Insert;
 import android.provider.Contacts;
 import android.provider.Downloads;
+import android.provider.MediaStore;
 import android.text.IClipboard;
+import android.text.TextUtils;
+import android.text.format.DateFormat;
 import android.text.util.Regex;
 import android.util.Config;
 import android.util.Log;
@@ -94,7 +98,6 @@ import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
-import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
@@ -142,6 +145,7 @@ import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Locale;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.Vector;
@@ -179,6 +183,8 @@ public class BrowserActivity extends Activity
     private void setupHomePage() {
         final Runnable getAccount = new Runnable() {
             public void run() {
+                // Lower priority
+                Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
                 // get the default home page
                 String homepage = mSettings.getHomePage();
 
@@ -242,7 +248,9 @@ public class BrowserActivity extends Activity
                 mGls = IGoogleLoginService.Stub.asInterface(service);
                 if (done[0] == false) {
                     done[0] = true;
-                    new Thread(getAccount).start();
+                    Thread account = new Thread(getAccount);
+                    account.setName("GLSAccount");
+                    account.start();
                 }
             }
             public void onServiceDisconnected(ComponentName className) {
@@ -513,6 +521,8 @@ public class BrowserActivity extends Activity
          * as there is a limit of 1Mb (see Asset.h)
          */
         public void run() {
+            // Lower the priority
+            Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
             try {
                 if (pluginsPath == null) {
                     Log.e(TAG, "No plugins path found!");
@@ -598,11 +608,24 @@ public class BrowserActivity extends Activity
         if (copyPluginsFromAssets.newSystemImage())  {
           if (copyPluginsFromAssets.checkIsDifferentVersions()) {
             copyPluginsFromAssets.cleanPluginsDirectory();
-            new Thread(copyPluginsFromAssets).start();
+            Thread copyplugins = new Thread(copyPluginsFromAssets);
+            copyplugins.setName("CopyPlugins");
+            copyplugins.start();
           }
         }
     }
 
+    private class ClearThumbnails extends AsyncTask<File, Void, Void> {
+        @Override
+        public Void doInBackground(File... files) {
+            if (files != null) {
+                for (File f : files) {
+                    f.delete();
+                }
+            }
+            return null;
+        }
+    }
 
     @Override public void onCreate(Bundle icicle) {
         if (Config.LOGV) {
@@ -621,6 +644,9 @@ public class BrowserActivity extends Activity
 
         mResolver = getContentResolver();
 
+        setBaseSearchUrl(PreferenceManager.getDefaultSharedPreferences(this)
+                .getString("search_url", ""));
+
         //
         // start MASF proxy service
         //
@@ -658,10 +684,19 @@ public class BrowserActivity extends Activity
         mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Browser");
 
         if (!mTabControl.restoreState(icicle)) {
+            // clear up the thumbnail directory if we can't restore the state as
+            // none of the files in the directory are referenced any more.
+            new ClearThumbnails().execute(
+                    mTabControl.getThumbnailDir().listFiles());
             final Intent intent = getIntent();
             final Bundle extra = intent.getExtras();
             // Create an initial tab.
-            final TabControl.Tab t = mTabControl.createNewTab();
+            // If the intent is ACTION_VIEW and data is not null, the Browser is
+            // invoked to view the content by another application. In this case,
+            // the tab will be close when exit.
+            final TabControl.Tab t = mTabControl.createNewTab(
+                    Intent.ACTION_VIEW.equals(intent.getAction()) &&
+                    intent.getData() != null);
             mTabControl.setCurrentTab(t);
             // This is one of the only places we call attachTabToContentView
             // without animating from the tab picker.
@@ -722,6 +757,15 @@ public class BrowserActivity extends Activity
 
     @Override
     protected void onNewIntent(Intent intent) {
+        // When a tab is closed on exit, the current tab index is set to -1.
+        // Reset before proceed as Browser requires the current tab to be set.
+        if (mTabControl.getCurrentIndex() == -1) {
+            TabControl.Tab current = mTabControl.getTab(0);
+            mTabControl.setCurrentTab(current);
+            attachTabToContentView(current);
+            mWebView = current.getWebView();
+            resetTitleAndIcon(mWebView);
+        }
         if (mWebView == null) {
             return;
         }
@@ -734,6 +778,7 @@ public class BrowserActivity extends Activity
         }
         if (Intent.ACTION_VIEW.equals(action)
                 || Intent.ACTION_SEARCH.equals(action)
+                || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action)
                 || Intent.ACTION_WEB_SEARCH.equals(action)) {
             String url = getUrlFromIntent(intent);
             if (url == null || url.length() == 0) {
@@ -742,9 +787,10 @@ public class BrowserActivity extends Activity
             if (Intent.ACTION_VIEW.equals(action) && 
                     (flags & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
                 // if FLAG_ACTIVITY_BROUGHT_TO_FRONT flag is on, the url will be
-                // opened in a new tab unless we have reached MAX_TABS and the
-                // url will be opened in the current tab
-                openTabAndShow(url, null);
+                // opened in a new tab unless we have reached MAX_TABS. Then the
+                // url will be opened in the current tab. If a new tab is
+                // created, it will have "true" for exit on close.
+                openTabAndShow(url, null, true);
             } else {
                 if ("about:debug".equals(url)) {
                     mSettings.toggleDebugSettings();
@@ -779,24 +825,39 @@ public class BrowserActivity extends Activity
                     }
                 }
             } else if (Intent.ACTION_SEARCH.equals(action)
+                    || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action)
                     || Intent.ACTION_WEB_SEARCH.equals(action)) {
                 url = intent.getStringExtra(SearchManager.QUERY);
-                mLastEnteredUrl = url;
-                // Don't add Urls, just search terms.
-                // Urls will get added when the page is loaded.
-                if (!Regex.WEB_URL_PATTERN.matcher(url).matches()) {
-                    Browser.updateVisitedHistory(mResolver, url, false);
+                if (url != null) {
+                    mLastEnteredUrl = url;
+                    // Don't add Urls, just search terms.
+                    // Urls will get added when the page is loaded.
+                    if (!Regex.WEB_URL_PATTERN.matcher(url).matches()) {
+                        Browser.updateVisitedHistory(mResolver, url, false);
+                    }
+                    // In general, we shouldn't modify URL from Intent.
+                    // But currently, we get the user-typed URL from search box as well.
+                    url = fixUrl(url);
+                    url = smartUrlFilter(url);
+                    String searchSource = "&source=android-" + GOOGLE_SEARCH_SOURCE_SUGGEST + "&";
+                    if (url.contains(searchSource)) {
+                        String source = null;
+                        final Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA);
+                        if (appData != null) {
+                            source = appData.getString(SearchManager.SOURCE);
+                        }
+                        if (TextUtils.isEmpty(source)) {
+                            source = GOOGLE_SEARCH_SOURCE_UNKNOWN;
+                        }
+                        url = url.replace(searchSource, "&source=android-"+source+"&");
+                    }
                 }
-                // In general, we shouldn't modify URL from Intent.
-                // But currently, we get the user-typed URL from search box as well.
-                url = fixUrl(url);
-                url = smartUrlFilter(url);
             }
         }
         return url;
     }
 
-    private String fixUrl(String inUrl) {
+    /* package */ static String fixUrl(String inUrl) {
         if (inUrl.startsWith("http://") || inUrl.startsWith("https://"))
             return inUrl;
         if (inUrl.startsWith("http:") ||
@@ -970,7 +1031,7 @@ public class BrowserActivity extends Activity
         }
 
         mActivityInPause = true;
-        if (!pauseWebView()) {
+        if (mTabControl.getCurrentIndex() >= 0 && !pauseWebView()) {
             mWakeLock.acquire();
             mHandler.sendMessageDelayed(mHandler
                     .obtainMessage(RELEASE_WAKELOCK), WAKELOCK_TIMEOUT);
@@ -1057,6 +1118,9 @@ public class BrowserActivity extends Activity
             showHttpAuthentication(mHttpAuthHandler, null, null, title,
                     name, password, focusId);
         }
+        if (mFindDialog != null && mFindDialog.isShowing()) {
+            mFindDialog.onConfigurationChanged(newConfig);
+        }
     }
 
     @Override public void onLowMemory() {
@@ -1192,6 +1256,11 @@ public class BrowserActivity extends Activity
         // options selector, so set mCanChord to true so we can access them.
         mCanChord = true;
         int id = item.getItemId();
+        final WebView webView = getTopWindow();
+        final HashMap hrefMap = new HashMap();
+        hrefMap.put("webview", webView);
+        final Message msg = mHandler.obtainMessage(
+                FOCUS_NODE_HREF, id, 0, hrefMap);
         switch (id) {
             // -- Browser context menu
             case R.id.open_context_menu_id:
@@ -1200,21 +1269,9 @@ public class BrowserActivity extends Activity
             case R.id.save_link_context_menu_id:
             case R.id.share_link_context_menu_id:
             case R.id.copy_link_context_menu_id:
-                Message msg = mHandler.obtainMessage(
-                        FOCUS_NODE_HREF, id, 0);
-                WebView webview = getTopWindow();
-                msg.obj = webview;
-                webview.requestFocusNodeHref(msg);
+                webView.requestFocusNodeHref(msg);
                 break;
 
-            case R.id.download_context_menu_id:
-            case R.id.view_image_context_menu_id:
-                Message m = mHandler.obtainMessage(
-                        FOCUS_NODE_HREF, id, 0);
-                WebView w = getTopWindow();
-                m.obj = w;
-                w.requestImageRef(m);
-                break;
             default:
                 // For other context menus
                 return onOptionsItemSelected(item);
@@ -1222,18 +1279,34 @@ public class BrowserActivity extends Activity
         mCanChord = false;
         return true;
     }
-    
+
+    private Bundle createGoogleSearchSourceBundle(String source) {
+        Bundle bundle = new Bundle();
+        bundle.putString(SearchManager.SOURCE, source);
+        return bundle;
+    }
+
     /**
      * Overriding this forces the search key to launch global search.  The difference
      * is the final "true" which requests global search.
      */
     @Override
     public boolean onSearchRequested() {
-        startSearch(null, false, null, true); 
+        startSearch(null, false,
+                createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_SEARCHKEY), true);
         return true;
     }
 
     @Override
+    public void startSearch(String initialQuery, boolean selectInitialQuery, 
+            Bundle appSearchData, boolean globalSearch) {
+        if (appSearchData == null) {
+            appSearchData = createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_TYPE);
+        }
+        super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch);
+    }
+
+    @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         if (!mCanChord) {
             // The user has already fired a shortcut with this hold down of the
@@ -1244,23 +1317,27 @@ public class BrowserActivity extends Activity
             // -- Main menu
             case R.id.goto_menu_id: {
                 String url = getTopWindow().getUrl();
-                // TODO: Activities are requested to call onSearchRequested, and to override
-                // that function in order to insert custom fields (e.g. the search query).
-                startSearch(mSettings.getHomePage().equals(url) ? null : url, true, null, false);
+                startSearch(mSettings.getHomePage().equals(url) ? null : url, true,
+                        createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_GOTO), false);
                 }
                 break;
-                
+
             case R.id.search_menu_id:
                 // launch using "global" search, which will bring up the Google search box
-                onSearchRequested(); 
+                startSearch(null, false,
+                        createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_SEARCHMENU), true);
                 break;
-        
+
             case R.id.bookmarks_menu_id:
                 bookmarksPicker();
                 break;
 
             case R.id.windows_menu_id:
-                tabPicker(true, mTabControl.getCurrentIndex(), false);
+                if (mTabControl.getTabCount() == 1) {
+                    openTabAndShow(mSettings.getHomePage(), null, false);
+                } else {
+                    tabPicker(true, mTabControl.getCurrentIndex(), false);
+                }
                 break;
 
             case R.id.stop_reload_menu_id:
@@ -1299,7 +1376,7 @@ public class BrowserActivity extends Activity
                         indexToShow--;
                     }
                 }
-                removeTabAndShow(currentIndex, indexToShow);
+                switchTabs(currentIndex, indexToShow, true);
                 break;
 
             case R.id.homepage_menu_id:
@@ -1313,39 +1390,21 @@ public class BrowserActivity extends Activity
                 startActivityForResult(intent, PREFERENCES_PAGE);
                 break;
 
-/*
-            Disable Find for version 1.0
             case R.id.find_menu_id:
                 if (null == mFindDialog) {
                     mFindDialog = new FindDialog(this);
-                    FrameLayout.LayoutParams lp = 
-                        new FrameLayout.LayoutParams(
-                        ViewGroup.LayoutParams.FILL_PARENT, 
-                        ViewGroup.LayoutParams.WRAP_CONTENT, 
-                        Gravity.BOTTOM);
-                        mFindDialog.setLayoutParams(lp);
                 }
                 mFindDialog.setWebView(getTopWindow());
-                mContentView.addView(mFindDialog);
                 mFindDialog.show();
-                Animation anim =AnimationUtils.loadAnimation(this,
-                        R.anim.find_dialog_enter);
-                mFindDialog.startAnimation(anim);
                 mMenuState = EMPTY_MENU;
                 break;
-*/
 
             case R.id.page_info_menu_id:
-                showPageInfo(mWebView, false);
+                showPageInfo(mTabControl.getCurrentTab(), false);
                 break;
 
-            case R.id.classic_history_menu_id: {
-                    Intent i = new Intent(this, BrowserHistoryPage.class);
-                    i.putExtra("maxTabsOpen",
-                            mTabControl.getTabCount() >=
-                            TabControl.MAX_TABS);
-                    startActivityForResult(i, CLASSIC_HISTORY_PAGE);
-                }
+            case R.id.classic_history_menu_id:
+                loadHistory();
                 break;
 
             case R.id.bookmark_page_menu_id:
@@ -1448,15 +1507,33 @@ public class BrowserActivity extends Activity
             case R.id.properties_tab_menu_id:
                 if (mTabListener != null && mTabOverview != null) {
                     int pos = mTabOverview.getContextMenuPosition(item);
-                    TabControl.Tab t = mTabControl.getTab(pos);
-                    // Use the tab's data for the page info dialog.
-                    if (t.getWebView() != null) {
-                        showPageInfo(t.getWebView(), false);
-                    }
-                    // FIXME: what should we display if the WebView is null?
+                    showPageInfo(mTabControl.getTab(pos), false);
                 }
                 break;
 
+            case R.id.window_one_menu_id:
+            case R.id.window_two_menu_id:
+            case R.id.window_three_menu_id:
+            case R.id.window_four_menu_id:
+            case R.id.window_five_menu_id:
+            case R.id.window_six_menu_id:
+            case R.id.window_seven_menu_id:
+            case R.id.window_eight_menu_id:
+                {
+                    int menuid = item.getItemId();
+                    for (int id = 0; id < WINDOW_SHORTCUT_ID_ARRAY.length; id++) {
+                        if (WINDOW_SHORTCUT_ID_ARRAY[id] == menuid) {
+                            TabControl.Tab desiredTab = mTabControl.getTab(id);
+                            if (desiredTab != null && 
+                                    desiredTab != mTabControl.getCurrentTab()) {
+                                switchTabs(mTabControl.getCurrentIndex(), id, false);
+                            }
+                            break;
+                        } 
+                    }
+                }
+                break;
+                
             default:
                 if (!super.onOptionsItemSelected(item)) {
                     return false;
@@ -1468,29 +1545,9 @@ public class BrowserActivity extends Activity
     }
 
     public void closeFind() {
-        Animation anim = AnimationUtils.loadAnimation(this,
-                R.anim.find_dialog_exit);
-        mFindDialog.startAnimation(anim);
-        mContentView.removeView(mFindDialog);
-        getTopWindow().requestFocus();
         mMenuState = R.id.MAIN_MENU;
     }
 
-    @Override
-    public boolean dispatchTouchEvent(MotionEvent event) {
-        if (super.dispatchTouchEvent(event)) {
-            return true;
-        } else {
-            // We do not use the Dialog class because it places dialogs in the
-            // middle of the screen.  It would take care of dismissing find if
-            // were using it, but we are doing it manually since we are not.
-            if (mFindDialog != null && mFindDialog.hasFocus()) {
-                mFindDialog.dismiss();
-            }
-            return false;
-        }
-    }
-    
     @Override public boolean onPrepareOptionsMenu(Menu menu)
     {
         // This happens when the user begins to hold down the menu key, so
@@ -1533,14 +1590,11 @@ public class BrowserActivity extends Activity
                 final MenuItem back = menu.findItem(R.id.back_menu_id);
                 back.setVisible(canGoBack);
                 back.setEnabled(canGoBack);
-                final MenuItem close = menu.findItem(R.id.close_menu_id);
-                close.setVisible(!canGoBack);
-                close.setEnabled(!canGoBack);
                 final MenuItem flip = 
                         menu.findItem(R.id.flip_orientation_menu_id);
                 boolean keyboardClosed = 
-                        getResources().getConfiguration().keyboardHidden == 
-                        Configuration.KEYBOARDHIDDEN_YES;
+                        getResources().getConfiguration().hardKeyboardHidden == 
+                        Configuration.HARDKEYBOARDHIDDEN_YES;
                 flip.setEnabled(keyboardClosed);
 
                 boolean isHome = mSettings.getHomePage().equals(w.getUrl());
@@ -1562,6 +1616,19 @@ public class BrowserActivity extends Activity
                         PackageManager.MATCH_DEFAULT_ONLY);
                 menu.findItem(R.id.share_page_menu_id).setVisible(
                         list.size() > 0);
+                
+                // Hide the menu+<window number> items
+                // Can't set visibility in menu xml file b/c when a
+                // group is set visible, all items are set visible.
+                for (int i = 0; i < WINDOW_SHORTCUT_ID_ARRAY.length; i++) {
+                    menu.findItem(WINDOW_SHORTCUT_ID_ARRAY[i]).setVisible(false);
+                }
+
+                // If there is only 1 window, the text will be "New window"
+                final MenuItem windows = menu.findItem(R.id.windows_menu_id);
+                windows.setTitleCondensed(mTabControl.getTabCount() > 1 ?
+                        getString(R.string.view_tabs_condensed) :
+                        getString(R.string.tab_picker_new_tab));
 
                 boolean isNavDump = mSettings.isNavDump();
                 final MenuItem nav = menu.findItem(R.id.dump_nav_menu_id);
@@ -1608,26 +1675,22 @@ public class BrowserActivity extends Activity
         menu.setGroupVisible(R.id.GEO_MENU,
                 type == WebView.HitTestResult.GEO_TYPE);
         menu.setGroupVisible(R.id.IMAGE_MENU,
-                type == WebView.HitTestResult.IMAGE_TYPE ||
-                type == WebView.HitTestResult.IMAGE_ANCHOR_TYPE
+                type == WebView.HitTestResult.IMAGE_TYPE
                 || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE);
         menu.setGroupVisible(R.id.ANCHOR_MENU,
-                type == WebView.HitTestResult.ANCHOR_TYPE ||
-                type == WebView.HitTestResult.IMAGE_ANCHOR_TYPE
-                || type == WebView.HitTestResult.SRC_ANCHOR_TYPE
+                type == WebView.HitTestResult.SRC_ANCHOR_TYPE
                 || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE);
 
         // Setup custom handling depending on the type
         switch (type) {
             case WebView.HitTestResult.PHONE_TYPE:
-                menu.setHeaderTitle(extra);
+                menu.setHeaderTitle(Uri.decode(extra));
                 menu.findItem(R.id.dial_context_menu_id).setIntent(
                         new Intent(Intent.ACTION_VIEW, Uri
                                 .parse(WebView.SCHEME_TEL + extra)));
-                Intent addIntent = new Intent(Intent.ACTION_INSERT,
-                        Contacts.People.CONTENT_URI);
-                addIntent.putExtra(Insert.FULL_MODE, true);
-                addIntent.putExtra(Insert.PHONE, extra);
+                Intent addIntent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
+                addIntent.putExtra(Insert.PHONE, Uri.decode(extra));
+                addIntent.setType(Contacts.People.CONTENT_ITEM_TYPE);
                 menu.findItem(R.id.add_contact_context_menu_id).setIntent(
                         addIntent);
                 menu.findItem(R.id.copy_phone_context_menu_id).setOnMenuItemClickListener(
@@ -1653,35 +1716,16 @@ public class BrowserActivity extends Activity
                         new Copy(extra));
                 break;
 
-            case WebView.HitTestResult.ANCHOR_TYPE:
-            case WebView.HitTestResult.IMAGE_ANCHOR_TYPE:
             case WebView.HitTestResult.SRC_ANCHOR_TYPE:
             case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE:
-                mTitleView = (TextView) LayoutInflater.from(this)
+                TextView titleView = (TextView) LayoutInflater.from(this)
                         .inflate(android.R.layout.browser_link_context_header,
                         null);
-                menu.setHeaderView(mTitleView);
+                titleView.setText(extra);
+                menu.setHeaderView(titleView);
                 // decide whether to show the open link in new tab option
                 menu.findItem(R.id.open_newtab_context_menu_id).setVisible(
                         mTabControl.getTabCount() < TabControl.MAX_TABS);
-                if (type == WebView.HitTestResult.ANCHOR_TYPE
-                        || type == WebView.HitTestResult.IMAGE_ANCHOR_TYPE){
-                    menu.findItem(R.id.bookmark_context_menu_id).setVisible(
-                            false);
-                    menu.findItem(R.id.save_link_context_menu_id).setVisible(
-                            false);
-                    menu.findItem(R.id.copy_link_context_menu_id).setVisible(
-                            false);
-                    menu.findItem(R.id.share_link_context_menu_id).setVisible(
-                            false);
-                    mTitleView.setText(R.string.contextmenu_javascript);
-                    break;
-                }
-                Message headerMessage = mHandler.obtainMessage(FOCUS_NODE_HREF,
-                        HEADER_FLAG, 0);
-                headerMessage.obj = webview;
-                webview.requestFocusNodeHref(headerMessage);
-                // decide whether to show the share link option
                 PackageManager pm = getPackageManager();
                 Intent send = new Intent(Intent.ACTION_SEND);
                 send.setType("text/plain");
@@ -1689,12 +1733,14 @@ public class BrowserActivity extends Activity
                         PackageManager.MATCH_DEFAULT_ONLY);
                 menu.findItem(R.id.share_link_context_menu_id).setVisible(
                         list.size() > 0);
-                if (type == WebView.HitTestResult.ANCHOR_TYPE) {
-                    break;
-                }
-                //fall through
+                break;
 
             case WebView.HitTestResult.IMAGE_TYPE:
+                menu.setHeaderTitle(extra);
+                menu.findItem(R.id.view_image_context_menu_id).setIntent(
+                        new Intent(Intent.ACTION_VIEW, Uri.parse(extra)));
+                menu.findItem(R.id.download_context_menu_id).
+                        setOnMenuItemClickListener(new Download(extra));
                 break;
 
             default:
@@ -1793,10 +1839,10 @@ public class BrowserActivity extends Activity
         // Increment the count to indicate that we are in an animation.
         mAnimationCount++;
         // Remove the listener so we don't get any more tab changes.
-        if (mTabOverview != null) {
-            mTabOverview.setListener(null);
-        }
+        mTabOverview.setListener(null);
         mTabListener = null;
+        // Make the menu empty until the animation completes.
+        mMenuState = EMPTY_MENU;
 
     }
 
@@ -1828,7 +1874,8 @@ public class BrowserActivity extends Activity
     // the given Message. If the tab overview is already showing (i.e. this
     // method is called from TabListener.onClick(), the method will animate
     // away from the tab overview.
-    private void openTabAndShow(String url, final Message msg) {
+    private void openTabAndShow(String url, final Message msg,
+            boolean closeOnExit) {
         final boolean newTab = mTabControl.getTabCount() != TabControl.MAX_TABS;
         final TabControl.Tab currentTab = mTabControl.getCurrentTab();
         if (newTab) {
@@ -1856,7 +1903,7 @@ public class BrowserActivity extends Activity
                 }
                 // Animate from the Tab overview after any animations have
                 // finished.
-                sendAnimateFromOverview(mTabControl.createNewTab(),
+                sendAnimateFromOverview(mTabControl.createNewTab(closeOnExit),
                         true, url, delay, msg);
             }
         } else if (url != null) {
@@ -1900,10 +1947,6 @@ public class BrowserActivity extends Activity
     // be displayed to the user.
     private void animateToTabOverview(final int newIndex, final boolean remove,
             final AnimatingView view) {
-        if (mTabOverview == null) {
-            return;
-        }
-
         // Find the view in the ImageGrid allowing for the "New Tab" cell.
         int position = mTabControl.getTabIndex(view.mTab);
         if (!((ImageAdapter) mTabOverview.getAdapter()).maxedOut()) {
@@ -1920,12 +1963,10 @@ public class BrowserActivity extends Activity
         final Animation.AnimationListener l =
                 new Animation.AnimationListener() {
                     public void onAnimationStart(Animation a) {
-                        if (mTabOverview != null) {
-                            mTabOverview.requestFocus();
-                            // Clear the listener so we don't trigger a tab
-                            // selection.
-                            mTabOverview.setListener(null);
-                        }
+                        mTabOverview.requestFocus();
+                        // Clear the listener so we don't trigger a tab
+                        // selection.
+                        mTabOverview.setListener(null);
                     }
                     public void onAnimationRepeat(Animation a) {}
                     public void onAnimationEnd(Animation a) {
@@ -1940,17 +1981,15 @@ public class BrowserActivity extends Activity
                             public void run() {
                                 // Remove the AnimatingView.
                                 mContentView.removeView(view);
-                                if (mTabOverview != null) {
-                                    // Make newIndex visible.
-                                    mTabOverview.setCurrentIndex(newIndex);
-                                    // Restore the listener.
-                                    mTabOverview.setListener(mTabListener);
-                                    // Change the menu to TAB_MENU if the
-                                    // ImageGrid is interactive.
-                                    if (mTabOverview.isLive()) {
-                                        mMenuState = R.id.TAB_MENU;
-                                        mTabOverview.requestFocus();
-                                    }
+                                // Make newIndex visible.
+                                mTabOverview.setCurrentIndex(newIndex);
+                                // Restore the listener.
+                                mTabOverview.setListener(mTabListener);
+                                // Change the menu to TAB_MENU if the
+                                // ImageGrid is interactive.
+                                if (mTabOverview.isLive()) {
+                                    mMenuState = R.id.TAB_MENU;
+                                    mTabOverview.requestFocus();
                                 }
                                 // If a remove was requested, remove the tab.
                                 if (remove) {
@@ -1968,12 +2007,10 @@ public class BrowserActivity extends Activity
                                     if (currentTab != tab) {
                                         mTabControl.setCurrentTab(currentTab);
                                     }
-                                    if (mTabOverview != null) {
-                                        mTabOverview.remove(newIndex);
-                                        // Make the current tab visible.
-                                        mTabOverview.setCurrentIndex(
-                                                mTabControl.getCurrentIndex());
-                                    }
+                                    mTabOverview.remove(newIndex);
+                                    // Make the current tab visible.
+                                    mTabOverview.setCurrentIndex(
+                                            mTabControl.getCurrentIndex());
                                 }
                             }
                         });
@@ -1999,11 +2036,6 @@ public class BrowserActivity extends Activity
     // from.
     private void animateFromTabOverview(final AnimatingView view,
             final boolean newTab, final String url, final Message msg) {
-        // mTabOverview may have been dismissed
-        if (mTabOverview == null) {
-            return;
-        }
-
         // firstVisible is the first visible tab on the screen.  This helps
         // to know which corner of the screen the selected tab is.
         int firstVisible = mTabOverview.getFirstVisiblePosition();
@@ -2025,32 +2057,19 @@ public class BrowserActivity extends Activity
         // Find the view at this location.
         final View v = mTabOverview.getChildAt(location);
 
-        // Use a delay of 1 second in case we get a bad position
-        long delay = 1000;
-        boolean fade = false;
-
         // Wait until the animation completes to load the url.
         final Animation.AnimationListener l =
                 new Animation.AnimationListener() {
                     public void onAnimationStart(Animation a) {}
                     public void onAnimationRepeat(Animation a) {}
                     public void onAnimationEnd(Animation a) {
-                        // The animation is done so allow key events and other
-                        // animations to begin.
-                        mAnimationCount--;
                         mHandler.post(new Runnable() {
                             public void run() {
-                                if (v != null) {
-                                    mContentView.removeView(view);
-                                    mWebView.setVisibility(View.VISIBLE);
-                                    // Make the sub window container visible if
-                                    // there is one.
-                                    if (mTabControl.getCurrentSubWindow() != null) {
-                                        mTabControl.getCurrentTab()
-                                                .getSubWebViewContainer()
-                                                .setVisibility(View.VISIBLE);
-                                    }
-                                }
+                                mContentView.removeView(view);
+                                // Dismiss the tab overview. If the cell at the
+                                // given location is null, set the fade
+                                // parameter to true.
+                                dismissTabOverview(v == null);
                                 if (url != null) {
                                     // Dismiss the subwindow if one exists.
                                     dismissSubWindow(
@@ -2065,6 +2084,12 @@ public class BrowserActivity extends Activity
                                 if (msg != null) {
                                     msg.sendToTarget();
                                 }
+                                // The animation is done and the tab overview is
+                                // gone so allow key events and other animations
+                                // to begin.
+                                mAnimationCount--;
+                                // Reset all the title bar info.
+                                resetTitle();
                             }
                         });
                     }
@@ -2077,32 +2102,42 @@ public class BrowserActivity extends Activity
             view.startAnimation(anim);
             // Make the view VISIBLE during the animation.
             view.setVisibility(View.VISIBLE);
-            // Dismiss the tab overview after the animation completes.
-            delay = anim.getDuration();
         } else {
-            // dismiss mTabOverview and have it fade out just in case we get a
-            // bad location.
-            fade = true;
             // Go ahead and load the url.
             l.onAnimationEnd(null);
         }
-        // Reset all the title bar info.
-        resetTitle();
-        // Dismiss the tab overview either after the animation or after a
-        // second.
-        mHandler.sendMessageDelayed(mHandler.obtainMessage(
-                DISMISS_TAB_OVERVIEW, fade ? 1 : 0, 0), delay);
+    }
+
+    // Dismiss the tab overview applying a fade if needed.
+    private void dismissTabOverview(final boolean fade) {
+        if (fade) {
+            AlphaAnimation anim = new AlphaAnimation(1.0f, 0.0f);
+            anim.setDuration(500);
+            anim.startNow();
+            mTabOverview.startAnimation(anim);
+        }
+        // Just in case there was a problem with animating away from the tab
+        // overview
+        mWebView.setVisibility(View.VISIBLE);
+        // Make the sub window container visible.
+        if (mTabControl.getCurrentSubWindow() != null) {
+            mTabControl.getCurrentTab().getSubWebViewContainer()
+                    .setVisibility(View.VISIBLE);
+        }
+        mContentView.removeView(mTabOverview);
+        mTabOverview.clear();
+        mTabOverview = null;
+        mTabListener = null;
     }
 
     private void openTab(String url) {
         if (mSettings.openInBackground()) {
-            TabControl.Tab t = mTabControl.createNewTab();
+            TabControl.Tab t = mTabControl.createNewTab(false);
             if (t != null) {
-                WebView w = t.getWebView();
-                w.loadUrl(url);
+                t.getWebView().loadUrl(url);
             }
         } else {
-            openTabAndShow(url, null);
+            openTabAndShow(url, null, false);
         }
     }
 
@@ -2118,6 +2153,19 @@ public class BrowserActivity extends Activity
             mText = toCopy;
         }
     }
+    
+    private class Download implements OnMenuItemClickListener {
+        private String mText;
+
+        public boolean onMenuItemClick(MenuItem item) {
+            onDownloadStartNoStream(mText, null, null, null, -1);
+            return true;
+        }
+
+        public Download(String toDownload) {
+            mText = toDownload;
+        }
+    }
 
     private void copy(CharSequence text) {
         try {
@@ -2184,7 +2232,11 @@ public class BrowserActivity extends Activity
         mUrl = url;
         mTitle = title;
 
-        setTitle(buildUrlTitle(url, title));
+        // While the tab overview is animating or being shown, block changes
+        // to the title.
+        if (mAnimationCount == 0 && mTabOverview == null) {
+            setTitle(buildUrlTitle(url, title));
+        }
     }
 
     /**
@@ -2255,6 +2307,11 @@ public class BrowserActivity extends Activity
 
     // Set the favicon in the title bar.
     private void setFavicon(Bitmap icon) {
+        // While the tab overview is animating or being shown, block changes to
+        // the favicon.
+        if (mAnimationCount > 0 || mTabOverview != null) {
+            return;
+        }
         Drawable[] array = new Drawable[2];
         PaintDrawable p = new PaintDrawable(Color.WHITE);
         p.setCornerRadius(3f);
@@ -2294,11 +2351,11 @@ public class BrowserActivity extends Activity
         updateLockIconImage(mLockIconType);
     }
 
-    private void removeTabAndShow(int indexToRemove, int indexToShow) {
+    private void switchTabs(int indexFrom, int indexToShow, boolean remove) {
         int delay = TAB_ANIMATION_DURATION + TAB_OVERVIEW_DELAY;
         // Animate to the tab picker, remove the current tab, then
         // animate away from the tab picker to the parent WebView.
-        tabPicker(false, indexToRemove, true);
+        tabPicker(false, indexFrom, remove);
         // Change to the parent tab
         final TabControl.Tab tab = mTabControl.getTab(indexToShow);
         if (tab != null) {
@@ -2315,13 +2372,25 @@ public class BrowserActivity extends Activity
         if (mWebView.canGoBack()) {
             mWebView.goBack();
         } else {
+            TabControl.Tab self = mTabControl.getCurrentTab();
             // Check to see if we are closing a window that was created by
             // another window. If so, we switch back to that window.
-            TabControl.Tab parent = mTabControl.getCurrentTab().getParentTab();
+            TabControl.Tab parent = self.getParentTab();
             if (parent != null) {
-                removeTabAndShow(mTabControl.getCurrentIndex(),
-                        mTabControl.getTabIndex(parent));
+                switchTabs(mTabControl.getCurrentIndex(),
+                        mTabControl.getTabIndex(parent), true);
             } else {
+                if (self.closeOnExit()) {
+                    if (mTabControl.getTabCount() == 1) {
+                        finish();
+                        return;
+                    }
+                    // call pauseWebView() now, we won't be able to call it in
+                    // onPause() as the mWebView won't be valid.
+                    pauseWebView();
+                    removeTabFromContentView(self);
+                    mTabControl.removeTab(self);
+                }
                 /*
                  * Instead of finishing the activity, simply push this to the back
                  * of the stack and let ActivityManager to choose the foreground
@@ -2352,7 +2421,10 @@ public class BrowserActivity extends Activity
             if (mAnimationCount > 0) {
                 return KeyTracker.State.DONE_TRACKING;
             }
-            if (stage == KeyTracker.Stage.UP) {
+            if (stage == KeyTracker.Stage.LONG_REPEAT) {
+                loadHistory();
+                return KeyTracker.State.DONE_TRACKING;
+            } else if (stage == KeyTracker.Stage.UP) {
                 // FIXME: Currently, we do not have a notion of the
                 // history picker for the subwindow, but maybe we
                 // should?
@@ -2381,14 +2453,12 @@ public class BrowserActivity extends Activity
         if (!handled) {
             switch (keyCode) {
                 case KeyEvent.KEYCODE_SPACE:
-                    if (mMenuState == R.id.MAIN_MENU){
-                        if (event.isShiftPressed()) {
-                            getTopWindow().pageUp(false);
-                        } else {
-                            getTopWindow().pageDown(false);
-                        }
-                        handled = true;
+                    if (event.isShiftPressed()) {
+                        getTopWindow().pageUp(false);
+                    } else {
+                        getTopWindow().pageDown(false);
                     }
+                    handled = true;
                     break;
 
                 default:
@@ -2424,6 +2494,13 @@ public class BrowserActivity extends Activity
         }
     }
 
+    private void loadHistory() {
+        Intent intent = new Intent(this, BrowserHistoryPage.class);
+        intent.putExtra("maxTabsOpen",
+                mTabControl.getTabCount() >= TabControl.MAX_TABS);
+        startActivityForResult(intent, CLASSIC_HISTORY_PAGE);
+    }
+
     // called by a non-UI thread to post the message
     public void postMessage(int what, int arg1, int arg2, Object obj) {
         mHandler.sendMessage(mHandler.obtainMessage(what, arg1, arg2, obj));
@@ -2436,13 +2513,12 @@ public class BrowserActivity extends Activity
     // Message Ids
     private static final int JS_CONFIRM              = 101;
     private static final int FOCUS_NODE_HREF         = 102;
-    private static final int DISMISS_TAB_OVERVIEW    = 103;
-    private static final int CANCEL_CREDS_REQUEST    = 104;
-    private static final int ANIMATE_FROM_OVERVIEW   = 105;
-    private static final int ANIMATE_TO_OVERVIEW     = 106;
-    private static final int OPEN_TAB_AND_SHOW       = 107;
-    private static final int CHECK_MEMORY            = 108;
-    private static final int RELEASE_WAKELOCK        = 109;
+    private static final int CANCEL_CREDS_REQUEST    = 103;
+    private static final int ANIMATE_FROM_OVERVIEW   = 104;
+    private static final int ANIMATE_TO_OVERVIEW     = 105;
+    private static final int OPEN_TAB_AND_SHOW       = 106;
+    private static final int CHECK_MEMORY            = 107;
+    private static final int RELEASE_WAKELOCK        = 108;
 
     // Private handler for handling javascript and saving passwords
     private Handler mHandler = new Handler() {
@@ -2458,37 +2534,6 @@ public class BrowserActivity extends Activity
                     }
                     break;
 
-                case DISMISS_TAB_OVERVIEW:
-                    if (mTabOverview != null) {
-                        if (msg.arg1 == 1) {
-                            AlphaAnimation anim =
-                                    new AlphaAnimation(1.0f, 0.0f);
-                            anim.setDuration(500);
-                            anim.startNow();
-                            mTabOverview.startAnimation(anim);
-                        }
-                        // Just in case there was a problem with animating away
-                        // from the tab overview
-                        mWebView.setVisibility(View.VISIBLE);
-                        // Make the sub window container visible.
-                        if (mTabControl.getCurrentSubWindow() != null) {
-                            mTabControl.getCurrentTab().getSubWebViewContainer()
-                                    .setVisibility(View.VISIBLE);
-                        }
-                        mContentView.removeView(mTabOverview);
-                        mTabOverview.clear();
-                        // XXX: There are checks for mTabOverview throughout
-                        // this file because this message can be received
-                        // before it is expected. This is because we are not
-                        // enforcing the order of animations properly. In order
-                        // to get this right, we would need to rewrite a lot of
-                        // the code to dispatch this messages after all
-                        // animations have completed.
-                        mTabOverview = null;
-                        mTabListener = null;
-                    }
-                    break;
-                    
                 case ANIMATE_FROM_OVERVIEW:
                     final HashMap map = (HashMap) msg.obj;
                     animateFromTabOverview((AnimatingView) map.get("view"),
@@ -2502,7 +2547,7 @@ public class BrowserActivity extends Activity
                     break;
 
                 case OPEN_TAB_AND_SHOW:
-                    openTabAndShow((String) msg.obj, null);
+                    openTabAndShow((String) msg.obj, null, false);
                     break;
 
                 case FOCUS_NODE_HREF:
@@ -2510,18 +2555,16 @@ public class BrowserActivity extends Activity
                     if (url == null || url.length() == 0) {
                         break;
                     }
-                    WebView view = (WebView) msg.obj;
+                    HashMap focusNodeMap = (HashMap) msg.obj;
+                    WebView view = (WebView) focusNodeMap.get("webview");
                     // Only apply the action if the top window did not change.
                     if (getTopWindow() != view) {
                         break;
                     }
                     switch (msg.arg1) {
-                        case HEADER_FLAG:
-                            mTitleView.setText(url);
-                            break;
                         case R.id.open_context_menu_id:
                         case R.id.view_image_context_menu_id:
-                            loadURL(url);
+                            loadURL(getTopWindow(), url);
                             break;
                         case R.id.open_newtab_context_menu_id:
                             openTab(url);
@@ -2546,7 +2589,7 @@ public class BrowserActivity extends Activity
                     break;
 
                 case LOAD_URL:
-                    loadURL((String) msg.obj);
+                    loadURL(getTopWindow(), (String) msg.obj);
                     break;
 
                 case STOP_LOAD:
@@ -2574,9 +2617,6 @@ public class BrowserActivity extends Activity
         }
     };
 
-    private static final int HEADER_FLAG = Integer.MIN_VALUE;
-    private TextView mTitleView = null;
-
     // -------------------------------------------------------------------------
     // WebViewClient implementation.
     //-------------------------------------------------------------------------
@@ -2591,14 +2631,22 @@ public class BrowserActivity extends Activity
         return mWebViewClient;
     }
 
+    private void updateIcon(String url, Bitmap icon) {
+        if (icon != null) {
+            BrowserBookmarksAdapter.updateBookmarkFavicon(mResolver,
+                    url, icon);
+        }
+        setFavicon(icon);
+    }
+
     private final WebViewClient mWebViewClient = new WebViewClient() {
         @Override
         public void onPageStarted(WebView view, String url, Bitmap favicon) {
             resetLockIcon(url);
             setUrlTitle(url, null);
-            // Call onReceivedIcon instead of setFavicon so the bookmark
+            // Call updateIcon instead of setFavicon so the bookmark
             // database can be updated.
-            mWebChromeClient.onReceivedIcon(view, favicon);
+            updateIcon(url, favicon);
 
             if (mSettings.isTracing() == true) {
                 // FIXME: we should save the trace file somewhere other than data.
@@ -2664,8 +2712,6 @@ public class BrowserActivity extends Activity
             // Reset the title and icon in case we stopped a provisional
             // load.
             resetTitleAndIcon(view);
-            // Make the progress full.
-            getWindow().setFeatureInt(Window.FEATURE_PROGRESS, 10000);
 
             // Update the lock icon image only once we are done loading
             updateLockIconImage(mLockIconType);
@@ -2891,6 +2937,7 @@ public class BrowserActivity extends Activity
             if (errorCode != EventHandler.ERROR_LOOKUP &&
                     errorCode != EventHandler.ERROR_CONNECT &&
                     errorCode != EventHandler.ERROR_BAD_URL &&
+                    errorCode != EventHandler.ERROR_UNSUPPORTED_SCHEME &&
                     errorCode != EventHandler.FILE_ERROR) {
                 new AlertDialog.Builder(BrowserActivity.this)
                         .setTitle((errorCode == EventHandler.FILE_NOT_FOUND_ERROR) ?
@@ -3106,7 +3153,7 @@ public class BrowserActivity extends Activity
                 // openTabAndShow will dispatch the message after creating the
                 // new WebView. This will prevent another request from coming
                 // in during the animation.
-                openTabAndShow(null, msg);
+                openTabAndShow(null, msg, false);
                 parent.addChildTab(mTabControl.getCurrentTab());
                 WebView.WebViewTransport transport = 
                     (WebView.WebViewTransport) msg.obj;
@@ -3204,13 +3251,18 @@ public class BrowserActivity extends Activity
                     mTabControl.getCurrentTab().getParentTab();
             if (parent != null) {
                 // JavaScript can only close popup window.
-                removeTabAndShow(currentIndex, mTabControl.getTabIndex(parent));
+                switchTabs(currentIndex, mTabControl.getTabIndex(parent), true);
             }
         }
 
         @Override
         public void onProgressChanged(WebView view, int newProgress) {
-            getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress*100);
+            // Block progress updates to the title bar while the tab overview
+            // is animating or being displayed.
+            if (mAnimationCount == 0 && mTabOverview == null) {
+                getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
+                        newProgress * 100);
+            }
 
             if (newProgress == 100) {
                 // onProgressChanged() is called for sub-frame too while
@@ -3222,7 +3274,7 @@ public class BrowserActivity extends Activity
 
         @Override
         public void onReceivedTitle(WebView view, String title) {
-            String url = view.getUrl();
+            String url = view.getOriginalUrl();
 
             // here, if url is null, we want to reset the title
             setUrlTitle(url, title);
@@ -3245,7 +3297,9 @@ public class BrowserActivity extends Activity
                 Cursor c = mResolver.query(Browser.BOOKMARKS_URI,
                     Browser.HISTORY_PROJECTION, where, selArgs, null);
                 if (c.moveToFirst()) {
-                    Log.d(LOGTAG, "updating cursor");
+                    if (Config.LOGV) {
+                        Log.v(LOGTAG, "updating cursor");
+                    }
                     // Current implementation of database only has one entry per
                     // url.
                     int titleIndex =
@@ -3263,11 +3317,7 @@ public class BrowserActivity extends Activity
 
         @Override
         public void onReceivedIcon(WebView view, Bitmap icon) {
-            if (icon != null) {
-                BrowserBookmarksAdapter.updateBookmarkFavicon(mResolver,
-                        view.getUrl(), icon);
-            }
-            setFavicon(icon);
+            updateIcon(view.getUrl(), icon);
         }
 
         //----------------------------------------------------------------------
@@ -3470,20 +3520,29 @@ public class BrowserActivity extends Activity
      * @param mimetype The mimetype of the content reported by the server
      * @param contentLength The file size reported by the server
      */
-    public void onDownloadStartNoStream(String url, String userAgent,
+    /*package */ void onDownloadStartNoStream(String url, String userAgent,
             String contentDisposition, String mimetype, long contentLength) {
 
         String filename = URLUtil.guessFileName(url,
                 contentDisposition, mimetype);
 
         // Check to see if we have an SDCard
-        if (!Environment.getExternalStorageState().
-                equals(Environment.MEDIA_MOUNTED)) {
-            String msg =
-                getString(R.string.download_no_sdcard_dlg_msg, filename);
+        String status = Environment.getExternalStorageState();
+        if (!status.equals(Environment.MEDIA_MOUNTED)) {
+            int title;
+            String msg;
+
+            // Check to see if the SDCard is busy, same as the music app
+            if (status.equals(Environment.MEDIA_SHARED)) {
+                msg = getString(R.string.download_sdcard_busy_dlg_msg);
+                title = R.string.download_sdcard_busy_dlg_title;
+            } else {
+                msg = getString(R.string.download_no_sdcard_dlg_msg, filename);
+                title = R.string.download_no_sdcard_dlg_title;
+            }
 
             new AlertDialog.Builder(this)
-                .setTitle(R.string.download_no_sdcard_dlg_title)
+                .setTitle(title)
                 .setIcon(R.drawable.ic_dialog_alert)
                 .setMessage(msg)
                 .setPositiveButton(R.string.ok, null)
@@ -3508,9 +3567,15 @@ public class BrowserActivity extends Activity
         if (contentLength > 0) {
             values.put(Downloads.TOTAL_BYTES, contentLength);
         }
-        final Uri contentUri =
-                getContentResolver().insert(Downloads.CONTENT_URI, values);
-        viewDownloads(contentUri);
+        if (mimetype == null) {
+            // We must have long pressed on a link or image to download it. We
+            // are not sure of the mimetype in this case, so do a head request
+            new FetchUrlMimeType(this).execute(values);
+        } else {
+            final Uri contentUri =
+                    getContentResolver().insert(Downloads.CONTENT_URI, values);
+            viewDownloads(contentUri);
+        }
 
     }
 
@@ -3563,29 +3628,38 @@ public class BrowserActivity extends Activity
         } else if (lockIconType == LOCK_ICON_MIXED) {
             d = mMixLockIcon;
         }
-        getWindow().setFeatureDrawable(Window.FEATURE_RIGHT_ICON, d);
+        // If the tab overview is animating or being shown, do not update the
+        // lock icon.
+        if (mAnimationCount == 0 && mTabOverview == null) {
+            getWindow().setFeatureDrawable(Window.FEATURE_RIGHT_ICON, d);
+        }
     }
 
     /**
      * Displays a page-info dialog.
-     * @param view The target web-view.
+     * @param tab The tab to show info about
      * @param fromShowSSLCertificateOnError The flag that indicates whether
      * this dialog was opened from the SSL-certificate-on-error dialog or
      * not. This is important, since we need to know whether to return to
      * the parent dialog or simply dismiss.
      */
-    private void showPageInfo(final WebView view,
+    private void showPageInfo(final TabControl.Tab tab,
                               final boolean fromShowSSLCertificateOnError) {
         final LayoutInflater factory = LayoutInflater
                 .from(this);
 
         final View pageInfoView = factory.inflate(R.layout.page_info, null);
+        
+        final WebView view = tab.getWebView();
 
         String url = null;
         String title = null;
 
-        // Use the cached title and url if this is the current WebView
-        if (view == mWebView) {
+        if (view == null) {
+            url = tab.getUrl();
+            title = tab.getTitle();
+        }else if (view == mWebView) {
+             // Use the cached title and url if this is the current WebView
             url = mUrl;
             title = mTitle;
         } else {
@@ -3603,7 +3677,7 @@ public class BrowserActivity extends Activity
         ((TextView) pageInfoView.findViewById(R.id.address)).setText(url);
         ((TextView) pageInfoView.findViewById(R.id.title)).setText(title);
 
-        mPageInfoView = view;
+        mPageInfoView = tab;
         mPageInfoFromShowSSLCertificateOnError = new Boolean(fromShowSSLCertificateOnError);
 
         AlertDialog.Builder alertDialogBuilder =
@@ -3649,7 +3723,8 @@ public class BrowserActivity extends Activity
 
         // if we have a main top-level page SSL certificate set or a certificate
         // error
-        if (fromShowSSLCertificateOnError || view.getCertificate() != null) {
+        if (fromShowSSLCertificateOnError || 
+                (view != null && view.getCertificate() != null)) {
             // add a 'View Certificate' button
             alertDialogBuilder.setNeutralButton(
                 R.string.view_certificate,
@@ -3671,7 +3746,7 @@ public class BrowserActivity extends Activity
                             // otherwise, display the top-most certificate from
                             // the chain
                             if (view.getCertificate() != null) {
-                                showSSLCertificate(view);
+                                showSSLCertificate(tab);
                             }
                         }
                     }
@@ -3684,9 +3759,9 @@ public class BrowserActivity extends Activity
        /**
      * Displays the main top-level page SSL certificate dialog
      * (accessible from the Page-Info dialog).
-     * @param view The target web-view.
+     * @param tab The tab to show certificate for.
      */
-    private void showSSLCertificate(final WebView view) {
+    private void showSSLCertificate(final TabControl.Tab tab) {
         final View certificateView =
             inflateCertificateView(mWebView.getCertificate());
         if (certificateView == null) {
@@ -3703,7 +3778,7 @@ public class BrowserActivity extends Activity
         ((TextView)ll.findViewById(R.id.success))
             .setText(R.string.ssl_certificate_is_valid);
 
-        mSSLCertificateView = view;
+        mSSLCertificateView = tab;
         mSSLCertificateDialog =
             new AlertDialog.Builder(this)
                 .setTitle(R.string.ssl_certificate).setIcon(
@@ -3716,7 +3791,7 @@ public class BrowserActivity extends Activity
                                 mSSLCertificateDialog = null;
                                 mSSLCertificateView = null;
 
-                                showPageInfo(view, false);
+                                showPageInfo(tab, false);
                             }
                         })
                 .setOnCancelListener(
@@ -3725,7 +3800,7 @@ public class BrowserActivity extends Activity
                                 mSSLCertificateDialog = null;
                                 mSSLCertificateView = null;
 
-                                showPageInfo(view, false);
+                                showPageInfo(tab, false);
                             }
                         })
                 .show();
@@ -3811,7 +3886,8 @@ public class BrowserActivity extends Activity
                                 // need to show the dialog again once the
                                 // user is done exploring the page-info details
 
-                                showPageInfo(view, true);
+                                showPageInfo(mTabControl.getTabFromView(view), 
+                                        true);
                             }
                         })
                 .setOnCancelListener(
@@ -4016,6 +4092,7 @@ public class BrowserActivity extends Activity
                         .show();
             }
         }
+        mTabControl.getCurrentWebView().setNetworkAvailable(up);
     }
 
     @Override
@@ -4030,14 +4107,19 @@ public class BrowserActivity extends Activity
                     if (extras != null && extras.getBoolean("new_window", false)) {
                         openTab(data);
                     } else {
+                        final TabControl.Tab currentTab =
+                                mTabControl.getCurrentTab();
                         // If the Window overview is up and we are not in the
                         // middle of an animation, animate away from it to the
                         // current tab.
                         if (mTabOverview != null && mAnimationCount == 0) {
-                            sendAnimateFromOverview(mTabControl.getCurrentTab(),
-                                    false, data, TAB_OVERVIEW_DELAY, null);
+                            sendAnimateFromOverview(currentTab, false, data,
+                                    TAB_OVERVIEW_DELAY, null);
                         } else {
-                            loadURL(data);
+                            dismissSubWindow(currentTab);
+                            if (data != null && data.length() != 0) {
+                                getTopWindow().loadUrl(data);
+                            }
                         }
                     }
                 }
@@ -4053,7 +4135,7 @@ public class BrowserActivity extends Activity
      * menu to see the download window, or when a download changes state. It
      * shows the download window ontop of the current window.
      */
-    private void viewDownloads(Uri downloadRecord) {
+    /* package */ void viewDownloads(Uri downloadRecord) {
         Intent intent = new Intent(this,
                 BrowserDownloadPage.class);
         intent.setData(downloadRecord);
@@ -4071,30 +4153,41 @@ public class BrowserActivity extends Activity
                 throw new AssertionError();
             }
 
-            mTabControl.removeTab(mTabControl.getTab(position));
+            // Remember the current tab.
+            TabControl.Tab current = mTabControl.getCurrentTab();
+            final TabControl.Tab remove = mTabControl.getTab(position);
+            mTabControl.removeTab(remove);
+            // If we removed the current tab, use the tab at position - 1 if
+            // possible.
+            if (current == remove) {
+                // If the user removes the last tab, act like the New Tab item
+                // was clicked on.
+                if (mTabControl.getTabCount() == 0) {
+                    current = mTabControl.createNewTab(false);
+                    sendAnimateFromOverview(current, true,
+                            mSettings.getHomePage(), TAB_OVERVIEW_DELAY, null);
+                } else {
+                    final int index = position > 0 ? (position - 1) : 0;
+                    current = mTabControl.getTab(index);
+                }
+            }
+
             // The tab overview could have been dismissed before this method is
             // called.
             if (mTabOverview != null) {
                 // Remove the tab and change the index.
-                mTabOverview.remove(position--);
-                mTabOverview.setCurrentIndex(position);
-            } else {
-                position--;
+                mTabOverview.remove(position);
+                mTabOverview.setCurrentIndex(mTabControl.getTabIndex(current));
             }
 
             // FIXME: This isn't really right. We don't have a current WebView
             // since we are switching between tabs and haven't selected a new
             // one. This just prevents a NPE in case the user hits home from the
             // tab switcher.
-            int index = position;
-            if (index == ImageGrid.NEW_TAB) {
-                index = 0;
-            }
-            final TabControl.Tab t = mTabControl.getTab(index);
             // Only the current tab ensures its WebView is non-null. This
             // implies that we are reloading the freed tab.
-            mTabControl.setCurrentTab(t);
-            mWebView = t.getWebView();
+            mTabControl.setCurrentTab(current);
+            mWebView = current.getWebView();
         }
         public void onClick(int index) {
             // Change the tab if necessary.
@@ -4112,13 +4205,10 @@ public class BrowserActivity extends Activity
             // Clear all the data for tab picker so next time it will be
             // recreated.
             mTabControl.wipeAllPickerData();
-            BrowserActivity.this.getWindow().setFeatureInt(
-                    Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);
-            BrowserActivity.this.mMenuState = EMPTY_MENU;
 
             // NEW_TAB means that the "New Tab" cell was clicked on.
             if (index == ImageGrid.NEW_TAB) {
-                openTabAndShow(mSettings.getHomePage(), null);
+                openTabAndShow(mSettings.getHomePage(), null, false);
             } else {
                 sendAnimateFromOverview(mTabControl.getTab(index),
                         false, null, 0, null);
@@ -4156,11 +4246,13 @@ public class BrowserActivity extends Activity
         protected void onDraw(Canvas canvas) {
             canvas.save();
             canvas.drawColor(Color.WHITE);
-            canvas.setDrawFilter(sZoomFilter);
-            float scale = getWidth() * mScale;
-            canvas.scale(scale, scale);
-            canvas.translate(-mScrollX, -mScrollY);
-            canvas.drawPicture(mPicture);
+            if (mPicture != null) {
+                canvas.setDrawFilter(sZoomFilter);
+                float scale = getWidth() * mScale;
+                canvas.scale(scale, scale);
+                canvas.translate(-mScrollX, -mScrollY);
+                canvas.drawPicture(mPicture);
+            }
             canvas.restore();
         }
     }
@@ -4219,12 +4311,13 @@ public class BrowserActivity extends Activity
         // set it here to prevent another request to animate from coming in
         // between now and when ANIMATE_TO_OVERVIEW is handled.
         mAnimationCount++;
-        if (stay) {
-            getWindow().setFeatureDrawable(Window.FEATURE_LEFT_ICON, null);
-            getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
-                    Window.PROGRESS_VISIBILITY_OFF);
-            setTitle(R.string.tab_picker_title);
-        }
+        // Always change the title bar to the window overview title while
+        // animating.
+        getWindow().setFeatureDrawable(Window.FEATURE_LEFT_ICON, null);
+        getWindow().setFeatureDrawable(Window.FEATURE_RIGHT_ICON, null);
+        getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
+                Window.PROGRESS_VISIBILITY_OFF);
+        setTitle(R.string.tab_picker_title);
         // Make the menu empty until the animation completes.
         mMenuState = EMPTY_MENU;
     }
@@ -4254,14 +4347,13 @@ public class BrowserActivity extends Activity
         startActivityForResult(intent, BOOKMARKS_PAGE);
     }
 
-    // Called when loading from bookmarks or goto.
-    private void loadURL(String url) {
+    // Called when loading from context menu or LOAD_URL message
+    private void loadURL(WebView view, String url) {
         // In case the user enters nothing.
-        if (url != null && url.length() != 0) {
+        if (url != null && url.length() != 0 && view != null) {
             url = smartUrlFilter(url);
-            WebView w = getTopWindow();
-            if (!mWebViewClient.shouldOverrideUrlLoading(w, url)) {
-                w.loadUrl(url);
+            if (!mWebViewClient.shouldOverrideUrlLoading(view, url)) {
+                view.loadUrl(url);
             }
         }
     }
@@ -4316,21 +4408,23 @@ public class BrowserActivity extends Activity
      * @return Original or modified URL
      *
      */
-    String smartUrlFilter(String inUrl) {
+    String smartUrlFilter(String url) {
 
+        String inUrl = url.trim();
         boolean hasSpace = inUrl.indexOf(' ') != -1;
 
-        if (!hasSpace) {
-            Matcher matcher = ACCEPTED_URI_SCHEMA.matcher(inUrl);
-            if (matcher.matches()) {
-                // force scheme to lowercase
-                String scheme = matcher.group(1);
-                String lcScheme = scheme.toLowerCase();
-                if (!lcScheme.equals(scheme)) {
-                    return lcScheme + matcher.group(2);
-                }
-                return inUrl;
+        Matcher matcher = ACCEPTED_URI_SCHEMA.matcher(inUrl);
+        if (matcher.matches()) {
+            if (hasSpace) {
+                inUrl = inUrl.replace(" ", "%20");
+            }
+            // force scheme to lowercase
+            String scheme = matcher.group(1);
+            String lcScheme = scheme.toLowerCase();
+            if (!lcScheme.equals(scheme)) {
+                return lcScheme + matcher.group(2);
             }
+            return inUrl;
         }
         if (hasSpace) {
             // FIXME: quick search, need to be customized by setting
@@ -4378,6 +4472,33 @@ public class BrowserActivity extends Activity
                 QUERY_PLACE_HOLDER);
     }
 
+    /* package */void setBaseSearchUrl(String url) {
+        if (url == null || url.length() == 0) {
+            /*
+             * get the google search url based on the SIM. Default is US. NOTE:
+             * This code uses resources to optionally select the search Uri,
+             * based on the MCC value from the SIM. The default string will most
+             * likely be fine. It is parameterized to accept info from the
+             * Locale, the language code is the first parameter (%1$s) and the
+             * country code is the second (%2$s). This code must function in the
+             * same way as a similar lookup in
+             * com.android.googlesearch.SuggestionProvider#onCreate(). If you
+             * change either of these functions, change them both. (The same is
+             * true for the underlying resource strings, which are stored in
+             * mcc-specific xml files.)
+             */
+            Locale l = Locale.getDefault();
+            QuickSearch_G = getResources().getString(
+                    R.string.google_search_base, l.getLanguage(),
+                    l.getCountry().toLowerCase())
+                    + "client=ms-"
+                    + SystemProperties.get("ro.com.google.clientid", "unknown")
+                    + "&source=android-" + GOOGLE_SEARCH_SOURCE_SUGGEST + "&q=%s";
+        } else {
+            QuickSearch_G = url;
+        }
+    }
+
     private final static int LOCK_ICON_UNSECURE = 0;
     private final static int LOCK_ICON_SECURE   = 1;
     private final static int LOCK_ICON_MIXED    = 2;
@@ -4458,7 +4579,7 @@ public class BrowserActivity extends Activity
     // As PageInfo has different style for landscape / portrait, we have
     // to re-open it when configuration changed
     private AlertDialog mPageInfoDialog;
-    private WebView mPageInfoView;
+    private TabControl.Tab mPageInfoView;
     // If the Page-Info dialog is launched from the SSL-certificate-on-error
     // dialog, we should not just dismiss it, but should get back to the
     // SSL-certificate-on-error dialog. This flag is used to store this state
@@ -4474,7 +4595,7 @@ public class BrowserActivity extends Activity
     // as SSLCertificate has different style for landscape / portrait, we
     // have to re-open it when configuration changed
     private AlertDialog mSSLCertificateDialog;
-    private WebView mSSLCertificateView;
+    private TabControl.Tab mSSLCertificateView;
 
     // as HttpAuthentication has different style for landscape / portrait, we
     // have to re-open it when configuration changed
@@ -4487,10 +4608,7 @@ public class BrowserActivity extends Activity
                                             ViewGroup.LayoutParams.FILL_PARENT);
     // We may provide UI to customize these
     // Google search from the browser
-    final static String QuickSearch_G =
-            "http://www.google.com/m?client=ms-"
-            + SystemProperties.get("ro.com.google.clientid", "unknown")
-            + "&source=android-chrome&q=%s";
+    static String QuickSearch_G;
     // Wikipedia search
     final static String QuickSearch_W = "http://en.wikipedia.org/w/index.php?search=%s&go=Go";
     // Dictionary search
@@ -4498,7 +4616,20 @@ public class BrowserActivity extends Activity
     // Google Mobile Local search
     final static String QuickSearch_L = "http://www.google.com/m/search?site=local&q=%s&near=mountain+view";
 
-    private final static String QUERY_PLACE_HOLDER = "%s";
+    final static String QUERY_PLACE_HOLDER = "%s";
+
+    // "source" parameter for Google search through search key
+    final static String GOOGLE_SEARCH_SOURCE_SEARCHKEY = "browser-key";
+    // "source" parameter for Google search through search menu
+    final static String GOOGLE_SEARCH_SOURCE_SEARCHMENU = "browser-menu";
+    // "source" parameter for Google search through goto menu
+    final static String GOOGLE_SEARCH_SOURCE_GOTO = "browser-goto";
+    // "source" parameter for Google search through simplily type
+    final static String GOOGLE_SEARCH_SOURCE_TYPE = "browser-type";
+    // "source" parameter for Google search suggested by the browser
+    final static String GOOGLE_SEARCH_SOURCE_SUGGEST = "browser-suggest";
+    // "source" parameter for Google search from unknown source
+    final static String GOOGLE_SEARCH_SOURCE_UNKNOWN = "unknown";
 
     private final static String LOGTAG = "browser";
 
@@ -4516,6 +4647,13 @@ public class BrowserActivity extends Activity
     // overlap. A count of 0 means no animation where a count of > 0 means
     // there are animations in progress.
     private int mAnimationCount;
+    
+    // As the ids are dynamically created, we can't guarantee that they will
+    // be in sequence, so this static array maps ids to a window number.
+    final static private int[] WINDOW_SHORTCUT_ID_ARRAY = 
+    { R.id.window_one_menu_id, R.id.window_two_menu_id, R.id.window_three_menu_id,
+      R.id.window_four_menu_id, R.id.window_five_menu_id, R.id.window_six_menu_id,
+      R.id.window_seven_menu_id, R.id.window_eight_menu_id };
 
     // monitor platform changes
     private IntentFilter mNetworkStateChangedFilter;
index 3b76e75..479dc0e 100644 (file)
@@ -312,8 +312,21 @@ class BrowserBookmarksAdapter extends BaseAdapter {
         if (url == null || favicon == null) {
             return;
         }
-        final String[] selArgs = new String[] { url };
-        final String where = Browser.BookmarkColumns.URL + " == ? AND "
+        // Strip the query.
+        int query = url.indexOf('?');
+        String noQuery = url;
+        if (query != -1) {
+            noQuery = url.substring(0, query);
+        }
+        url = noQuery + '?';
+        // Use noQuery to search for the base url (i.e. if the url is
+        // http://www.yahoo.com/?rs=1, search for http://www.yahoo.com)
+        // Use url to match the base url with other queries (i.e. if the url is
+        // http://www.google.com/m, search for
+        // http://www.google.com/m?some_query)
+        final String[] selArgs = new String[] { noQuery, url };
+        final String where = "(" + Browser.BookmarkColumns.URL + " == ? OR "
+                + Browser.BookmarkColumns.URL + " GLOB ? || '*') AND "
                 + Browser.BookmarkColumns.BOOKMARK + " == 1";
         final String[] projection = new String[] { Browser.BookmarkColumns._ID };
         final Cursor c = cr.query(Browser.BOOKMARKS_URI, projection, where,
index f938ff9..5c509a8 100644 (file)
@@ -20,6 +20,7 @@ import android.app.Activity;
 import android.app.AlertDialog;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.graphics.Bitmap;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
@@ -52,6 +53,10 @@ public class BrowserBookmarksPage extends Activity implements
     private AddNewBookmark          mAddHeader;
     private boolean                 mCanceled = false;
     private boolean                 mCreateShortcut;
+    // XXX: There is no public string defining this intent so if Home changes
+    // the value, we have to update this string.
+    private static final String     INSTALL_SHORTCUT =
+            "com.android.launcher.action.INSTALL_SHORTCUT";
     
     private final static String LOGTAG = "browser";
 
@@ -80,6 +85,12 @@ public class BrowserBookmarksPage extends Activity implements
         case R.id.edit_context_menu_id:
             editBookmark(i.position);
             break;
+        case R.id.shortcut_context_menu_id:
+            final Intent send = createShortcutIntent(getUrl(i.position),
+                    getBookmarkTitle(i.position));
+            send.setAction(INSTALL_SHORTCUT);
+            sendBroadcast(send);
+            break;
         case R.id.delete_context_menu_id:
             displayRemoveBookmarkDialog(i.position);
             break;
@@ -191,19 +202,27 @@ public class BrowserBookmarksPage extends Activity implements
                     loadUrl(position);
                 }
             } else {
-                final Intent intent = new Intent();
-                intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_VIEW,
-                        Uri.parse(getUrl(position))));
-                intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getBookmarkTitle(position));
-                intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
-                        Intent.ShortcutIconResource.fromContext(BrowserBookmarksPage.this,
-                                R.drawable.ic_launcher_browser));
+                final Intent intent = createShortcutIntent(getUrl(position),
+                        getBookmarkTitle(position));
                 setResult(RESULT_OK, intent);
                 finish();
             }
         }
     };
 
+    private Intent createShortcutIntent(String url, String title) {
+        final Intent i = new Intent();
+        i.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_VIEW,
+                    Uri.parse(url)));
+        i.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);
+        i.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
+                Intent.ShortcutIconResource.fromContext(BrowserBookmarksPage.this,
+                        R.drawable.ic_launcher_browser));
+        // Do not allow duplicate items
+        i.putExtra("duplicate", false);
+        return i;
+    }
+
     private void saveCurrentPage() {
         Intent i = new Intent(BrowserBookmarksPage.this,
                 AddBookmarkPage.class);
@@ -290,7 +309,7 @@ public class BrowserBookmarksPage extends Activity implements
         final int deletePos = position;
         new AlertDialog.Builder(this)
                 .setTitle(R.string.delete_bookmark)
-                .setIcon(R.drawable.ssl_icon)
+                .setIcon(android.R.drawable.ic_dialog_alert)
                 .setMessage(getText(R.string.delete_bookmark_warning).toString().replace(
                         "%s", getBookmarkTitle(deletePos)))
                 .setPositiveButton(R.string.ok, 
index b3e08f5..0b509ef 100644 (file)
@@ -20,7 +20,6 @@ package com.android.browser;
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
-import android.content.Formatter;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
@@ -30,6 +29,7 @@ import android.drm.mobile1.DrmRawContent;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.provider.Downloads;
+import android.text.format.Formatter;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.ProgressBar;
@@ -59,7 +59,7 @@ public class BrowserDownloadAdapter extends ResourceCursorAdapter {
 
     public BrowserDownloadAdapter(Context context, int layout, Cursor c) {
         super(context, layout, c);
-        mFilenameColumnId = c.getColumnIndexOrThrow(Downloads.FILENAME);
+        mFilenameColumnId = c.getColumnIndexOrThrow(Downloads._DATA);
         mTitleColumnId = c.getColumnIndexOrThrow(Downloads.TITLE);
         mDescColumnId = c.getColumnIndexOrThrow(Downloads.DESCRIPTION);
         mStatusColumnId = c.getColumnIndexOrThrow(Downloads.STATUS);
@@ -213,7 +213,7 @@ public class BrowserDownloadAdapter extends ResourceCursorAdapter {
                 return R.string.download_file_error;
                 
             case Downloads.STATUS_BAD_REQUEST:
-            case Downloads.STATUS_ERROR:
+            case Downloads.STATUS_UNKNOWN_ERROR:
             default:
                 return R.string.download_error;
         }
index e2b11a6..4397337 100644 (file)
@@ -75,7 +75,7 @@ public class BrowserDownloadPage extends Activity
         mDownloadCursor = managedQuery(Downloads.CONTENT_URI, 
                 new String [] {"_id", Downloads.TITLE, Downloads.STATUS,
                 Downloads.TOTAL_BYTES, Downloads.CURRENT_BYTES, 
-                Downloads.FILENAME, Downloads.DESCRIPTION, 
+                Downloads._DATA, Downloads.DESCRIPTION, 
                 Downloads.MIMETYPE, Downloads.LAST_MODIFICATION,
                 Downloads.VISIBILITY}, 
                 null, null);
@@ -170,6 +170,7 @@ public class BrowserDownloadPage extends Activity
                     (AdapterView.AdapterContextMenuInfo) menuInfo;
             mDownloadCursor.moveToPosition(info.position);
             mContextMenuPosition = info.position;
+            menu.setHeaderTitle(mDownloadCursor.getString(mTitleColumnId));
             
             MenuInflater inflater = getMenuInflater();
             int status = mDownloadCursor.getInt(mStatusColumnId);
@@ -242,10 +243,7 @@ public class BrowserDownloadPage extends Activity
      * @param id Row id of the download to resume
      */
     private void resumeDownload(final long id) {
-        Uri record = ContentUris.withAppendedId(Downloads.CONTENT_URI, id);
-        ContentValues values = new ContentValues();
-        values.put(Downloads.CONTROL, Downloads.CONTROL_RUN);
-        getContentResolver().update(record, values, null, null);
+        // the relevant functionality doesn't exist in the download manager
     }
     
     /**
@@ -327,7 +325,7 @@ public class BrowserDownloadPage extends Activity
      */
     private void cancelAllDownloads() {
         if (mDownloadCursor.moveToFirst()) {
-            StringBuffer where = new StringBuffer();
+            StringBuilder where = new StringBuilder();
             boolean firstTime = true;
             while (!mDownloadCursor.isAfterLast()) {
                 int status = mDownloadCursor.getInt(mStatusColumnId);
@@ -339,9 +337,9 @@ public class BrowserDownloadPage extends Activity
                     }
                     where.append("( ");
                     where.append(Downloads._ID);
-                    where.append(" = ");
+                    where.append(" = '");
                     where.append(mDownloadCursor.getLong(mIdColumnId));
-                    where.append(" )");
+                    where.append("' )");
                 }
                 mDownloadCursor.moveToNext();
             }
@@ -372,7 +370,7 @@ public class BrowserDownloadPage extends Activity
      */
     private void clearAllDownloads() {
         if (mDownloadCursor.moveToFirst()) {
-            StringBuffer where = new StringBuffer();
+            StringBuilder where = new StringBuilder();
             boolean firstTime = true;
             while (!mDownloadCursor.isAfterLast()) {
                 int status = mDownloadCursor.getInt(mStatusColumnId);
@@ -384,9 +382,9 @@ public class BrowserDownloadPage extends Activity
                     }
                     where.append("( ");
                     where.append(Downloads._ID);
-                    where.append(" = ");
+                    where.append(" = '");
                     where.append(mDownloadCursor.getLong(mIdColumnId));
-                    where.append(" )");
+                    where.append("' )");
                 }
                 mDownloadCursor.moveToNext();
             }
@@ -402,7 +400,7 @@ public class BrowserDownloadPage extends Activity
      */
     private void openCurrentDownload() {
         int filenameColumnId = 
-                mDownloadCursor.getColumnIndexOrThrow(Downloads.FILENAME);
+                mDownloadCursor.getColumnIndexOrThrow(Downloads._DATA);
         String filename = mDownloadCursor.getString(filenameColumnId);
         int mimetypeColumnId =
                 mDownloadCursor.getColumnIndexOrThrow(Downloads.MIMETYPE);
diff --git a/src/com/android/browser/BrowserHomepagePreference.java b/src/com/android/browser/BrowserHomepagePreference.java
new file mode 100644 (file)
index 0000000..bc21143
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.preference.EditTextPreference;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.text.util.Regex;
+import android.util.AttributeSet;
+
+public class BrowserHomepagePreference extends EditTextPreference implements
+        TextWatcher {
+
+    public BrowserHomepagePreference(Context context, AttributeSet attrs,
+            int defStyle) {
+        super(context, attrs, defStyle);
+        getEditText().addTextChangedListener(this);
+    }
+
+    public BrowserHomepagePreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        getEditText().addTextChangedListener(this);
+    }
+
+    public BrowserHomepagePreference(Context context) {
+        super(context);
+        getEditText().addTextChangedListener(this);
+    }
+
+    public void afterTextChanged(Editable s) {
+        AlertDialog dialog = (AlertDialog) getDialog();
+        // This callback is called before the dialog has been fully constructed
+        if (dialog != null) {
+            dialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(
+                    Regex.WEB_URL_PATTERN.matcher(s.toString()).matches());
+        }
+    }
+
+    public void beforeTextChanged(CharSequence s, int start, int count,
+            int after) {
+    }
+
+    public void onTextChanged(CharSequence s, int start, int before, int count) {
+    }
+}
index b8bc495..b23f750 100644 (file)
@@ -51,6 +51,9 @@ public class BrowserPreferencesPage extends PreferenceActivity
                 getPreferenceScreen().getSharedPreferences()
                 .getString(BrowserSettings.PREF_TEXT_SIZE, null)) );
         
+        e = findPreference(BrowserSettings.PREF_DEFAULT_TEXT_ENCODING);
+        e.setOnPreferenceChangeListener(this);
+        
         if (BrowserSettings.getInstance().showDebugSettings()) {
             addPreferencesFromResource(R.xml.debug_preferences);
         }
@@ -76,30 +79,36 @@ public class BrowserPreferencesPage extends PreferenceActivity
             }
         } else if (pref.getKey().equals(BrowserSettings.PREF_HOMEPAGE)) {
             String value = (String) objValue;
-            
-            if (value.length() > 0) {
-                Uri path = Uri.parse(value);
-                if (path.getScheme() == null) {
-                    value = "http://"+value;
-                    
-                    pref.setSummary(value);
-                    
-                    // Update through the EditText control as it has a cached copy
-                    // of the string and it will handle persisting the value
-                    ((EditTextPreference)(pref)).setText(value);
-                    
-                    // as we update the value above, we need to return false
-                    // here so that setText() is not called by EditTextPref 
-                    // with the old value.
-                    return false;
-                }
+            boolean needUpdate = value.indexOf(' ') != -1;
+            if (needUpdate) {
+                value = value.trim().replace(" ", "%20");
             }
-            
+            Uri path = Uri.parse(value);
+            if (path.getScheme() == null) {
+                value = "http://" + value;
+                needUpdate = true;
+            }
+            // Set the summary value.
             pref.setSummary(value);
-            return true;
+            if (needUpdate) {
+                // Update through the EditText control as it has a cached copy
+                // of the string and it will handle persisting the value
+                ((EditTextPreference) pref).setText(value);
+
+                // as we update the value above, we need to return false
+                // here so that setText() is not called by EditTextPref
+                // with the old value.
+                return false;
+            } else {
+                return true;
+            }
         } else if (pref.getKey().equals(BrowserSettings.PREF_TEXT_SIZE)) {
             pref.setSummary(getVisualTextSizeName((String) objValue));
             return true;
+        } else if (pref.getKey().equals(
+                BrowserSettings.PREF_DEFAULT_TEXT_ENCODING)) {
+            pref.setSummary((String) objValue);
+            return true;
         }
         
         return false;
index 4f456e7..7aa5bb2 100644 (file)
@@ -30,6 +30,7 @@ import android.database.DataSetObserver;
 import android.database.sqlite.SQLiteOpenHelper;
 import android.database.sqlite.SQLiteDatabase;
 import android.net.Uri;
+import android.os.SystemProperties;
 import android.provider.Browser;
 import android.util.Log;
 import android.text.util.Regex;
@@ -101,6 +102,45 @@ public class BrowserProvider extends ContentProvider {
 
     public BrowserProvider() {
     }
+  
+
+    private static CharSequence replaceSystemPropertyInString(CharSequence srcString) {
+        StringBuffer sb = new StringBuffer();
+        int lastCharLoc = 0;
+        for (int i = 0; i < srcString.length(); ++i) {
+            char c = srcString.charAt(i);
+            if (c == '{') {
+                sb.append(srcString.subSequence(lastCharLoc, i));
+                lastCharLoc = i;
+          inner:
+                for (int j = i; j < srcString.length(); ++j) {
+                    char k = srcString.charAt(j);
+                    if (k == '}') {
+                        String propertyKeyValue = srcString.subSequence(i + 1, j).toString();
+                        // See if the propertyKeyValue specifies a default value
+                        int defaultOffset = propertyKeyValue.indexOf(':');
+                        if (defaultOffset == -1) {
+                            sb.append(SystemProperties.get(propertyKeyValue));
+                        } else {
+                            String propertyKey = propertyKeyValue.substring(0, defaultOffset);
+                            String defaultValue = 
+                                    propertyKeyValue.substring(defaultOffset + 1, 
+                                                               propertyKeyValue.length());
+                            sb.append(SystemProperties.get(propertyKey, defaultValue));
+                        }
+                        lastCharLoc = j + 1;
+                        i = j;
+                        break inner;
+                    }
+                }
+            }
+        }
+        if (srcString.length() - lastCharLoc > 0) {
+            // Put on the tail, if there is one
+            sb.append(srcString.subSequence(lastCharLoc, srcString.length()));
+        }
+        return sb;
+    }
 
     private static class DatabaseHelper extends SQLiteOpenHelper {
         private Context mContext;
@@ -129,9 +169,10 @@ public class BrowserProvider extends ContentProvider {
             int size = bookmarks.length;
             try {
                 for (int i = 0; i < size; i = i + 2) {
+                    CharSequence bookmarkDestination = replaceSystemPropertyInString(bookmarks[i + 1]);
                     db.execSQL("INSERT INTO bookmarks (title, url, visits, " +
                             "date, created, bookmark)" + " VALUES('" +
-                            bookmarks[i] + "', '" + bookmarks[i + 1] + 
+                            bookmarks[i] + "', '" + bookmarkDestination + 
                             "', 0, 0, 0, 1);");
                 }
             } catch (ArrayIndexOutOfBoundsException e) {
@@ -401,12 +442,18 @@ public class BrowserProvider extends ContentProvider {
                 myArgs = null;
             } else {
                 String like = selectionArgs[0] + "%";
-                SUGGEST_ARGS[0] = "http://" + like;
-                SUGGEST_ARGS[1] = "http://www." + like;
-                SUGGEST_ARGS[2] = "https://" + like;
-                SUGGEST_ARGS[3] = "https://www." + like;
-                myArgs = SUGGEST_ARGS;
-                suggestSelection = SUGGEST_SELECTION;
+                if (selectionArgs[0].startsWith("http")) {
+                    myArgs = new String[1];
+                    myArgs[0] = like;
+                    suggestSelection = selection;
+                } else {
+                    SUGGEST_ARGS[0] = "http://" + like;
+                    SUGGEST_ARGS[1] = "http://www." + like;
+                    SUGGEST_ARGS[2] = "https://" + like;
+                    SUGGEST_ARGS[3] = "https://www." + like;
+                    myArgs = SUGGEST_ARGS;
+                    suggestSelection = SUGGEST_SELECTION;
+                }
             }
             // Suggestions are always performed with the default sort order:
             // date ASC.
diff --git a/src/com/android/browser/BrowserSearchpagePreference.java b/src/com/android/browser/BrowserSearchpagePreference.java
new file mode 100644 (file)
index 0000000..09e8993
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.preference.EditTextPreference;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.text.util.Regex;
+import android.util.AttributeSet;
+
+public class BrowserSearchpagePreference extends EditTextPreference implements
+        TextWatcher {
+
+    public BrowserSearchpagePreference(Context context, AttributeSet attrs,
+            int defStyle) {
+        super(context, attrs, defStyle);
+        getEditText().addTextChangedListener(this);
+    }
+
+    public BrowserSearchpagePreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        getEditText().addTextChangedListener(this);
+    }
+
+    public BrowserSearchpagePreference(Context context) {
+        super(context);
+        getEditText().addTextChangedListener(this);
+    }
+
+    public void afterTextChanged(Editable s) {
+        AlertDialog dialog = (AlertDialog) getDialog();
+        // This callback is called before the dialog has been fully constructed
+        if (dialog != null) {
+            String string = s.toString();
+            int length = string.length();
+            int first = length > 0 ? string
+                    .indexOf(BrowserActivity.QUERY_PLACE_HOLDER) : -1;
+            int last = length > 0 ? string
+                    .lastIndexOf(BrowserActivity.QUERY_PLACE_HOLDER) : -1;
+            dialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(
+                    length == 0 || (first > 0 && first == last));
+        }
+    }
+
+    public void beforeTextChanged(CharSequence s, int start, int count,
+            int after) {
+    }
+
+    public void onTextChanged(CharSequence s, int start, int before, int count) {
+    }
+}
index b19c02e..6164e38 100644 (file)
@@ -22,6 +22,7 @@ import android.content.Context;
 import android.content.pm.ActivityInfo;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
+import android.os.SystemProperties;
 import android.view.WindowManager;
 import android.webkit.CacheManager;
 import android.webkit.CookieManager;
@@ -63,7 +64,8 @@ class BrowserSettings extends Observable {
     private boolean saveFormData = true;
     private boolean openInBackground = false;
     private String defaultTextEncodingName;
-    private String homeUrl = "http://www.google.com/m";
+    private String homeUrl = "http://www.google.com/m?client=ms-" + 
+        SystemProperties.get("ro.com.google.clientid", "unknown");
     private boolean loginInitialized = false;
     private int orientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
     private boolean autoFitPage = true;
@@ -102,7 +104,17 @@ class BrowserSettings extends Observable {
     public final static String PREF_DEBUG_SETTINGS = "debug_menu";
     public final static String PREF_GEARS_SETTINGS = "gears_settings";
     public final static String PREF_TEXT_SIZE = "text_size";
-    
+    public final static String PREF_DEFAULT_TEXT_ENCODING =
+            "default_text_encoding";
+
+    private static final String DESKTOP_USERAGENT = "Mozilla/5.0 (Macintosh; " +
+            "U; Intel Mac OS X 10_5_5; en-us) AppleWebKit/525.18 (KHTML, " +
+            "like Gecko) Version/3.1.2 Safari/525.20.1";
+
+    private static final String IPHONE_USERAGENT = "Mozilla/5.0 (iPhone; U; " +
+            "CPU iPhone OS 2_2 like Mac OS X; en-us) AppleWebKit/525.18.1 " +
+            "(KHTML, like Gecko) Version/3.1.1 Mobile/5G77 Safari/525.20";
+
     // Value to truncate strings when adding them to a TextView within
     // a ListView
     public final static int MAX_TEXTVIEW_LEN = 80;
@@ -134,7 +146,14 @@ class BrowserSettings extends Observable {
             WebSettings s = mSettings;
 
             s.setLayoutAlgorithm(b.layoutAlgorithm);
-            s.setUserAgent(b.userAgent);
+            if (b.userAgent == 0) {
+                // use the default ua string
+                s.setUserAgentString(null);
+            } else if (b.userAgent == 1) {
+                s.setUserAgentString(DESKTOP_USERAGENT);
+            } else if (b.userAgent == 2) {
+                s.setUserAgentString(IPHONE_USERAGENT);
+            }
             s.setUseWideViewPort(b.useWideViewPort);
             s.setLoadsImagesAutomatically(b.loadsImagesAutomatically);
             s.setJavaScriptEnabled(b.javaScriptEnabled);
@@ -157,6 +176,8 @@ class BrowserSettings extends Observable {
             s.setNeedInitialFocus(false);
             // Browser supports multiple windows
             s.setSupportMultipleWindows(true);
+            // Turn off file access
+            s.setAllowFileAccess(false);
         }
     }
    
@@ -218,6 +239,9 @@ class BrowserSettings extends Observable {
         } else {
             layoutAlgorithm = WebSettings.LayoutAlgorithm.NORMAL;
         }
+        defaultTextEncodingName =
+                p.getString(PREF_DEFAULT_TEXT_ENCODING,
+                        defaultTextEncodingName);
         
         showDebugSettings = 
                 p.getBoolean(PREF_DEBUG_SETTINGS, showDebugSettings);
@@ -244,6 +268,8 @@ class BrowserSettings extends Observable {
             navDump = p.getBoolean("enable_nav_dump", navDump);
             doFlick = p.getBoolean("enable_flick", doFlick);
             userAgent = Integer.parseInt(p.getString("user_agent", "0"));
+            mTabControl.getBrowserActivity().setBaseSearchUrl(
+                    p.getString("search_url", ""));
         }
         update();
     }
@@ -398,10 +424,6 @@ class BrowserSettings extends Observable {
         ContentResolver resolver = context.getContentResolver();
         Browser.clearHistory(resolver);
         Browser.clearSearches(resolver);
-        // Delete back-forward list
-        if (mTabControl != null) {
-            mTabControl.clearHistory();
-        }
     }
 
     /* package */ void clearFormData(Context context) {
index 200f86a..7997672 100644 (file)
@@ -70,12 +70,14 @@ public class FakeWebView extends ImageView {
                 final WebView w = mTab.getTopWindow();
                 if (w != null) {
                     Picture p = w.capturePicture();
-                    canvas.save();
-                    float scale = getWidth() * w.getScale() / w.getWidth();
-                    canvas.scale(scale, scale);
-                    canvas.translate(-w.getScrollX(), -w.getScrollY());
-                    canvas.drawPicture(p);
-                    canvas.restore();
+                    if (p != null) {
+                        canvas.save();
+                        float scale = getWidth() * w.getScale() / w.getWidth();
+                        canvas.scale(scale, scale);
+                        canvas.translate(-w.getScrollX(), -w.getScrollY());
+                        canvas.drawPicture(p);
+                        canvas.restore();
+                    }
                 }
             }
         }
diff --git a/src/com/android/browser/FetchUrlMimeType.java b/src/com/android/browser/FetchUrlMimeType.java
new file mode 100644 (file)
index 0000000..8578643
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.content.ContentValues;
+import android.net.Uri;
+import android.net.http.AndroidHttpClient;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.Header;
+import org.apache.http.client.methods.HttpHead;
+
+import java.io.IOException;
+
+import android.os.AsyncTask;
+import android.provider.Downloads;
+import android.webkit.MimeTypeMap;
+import android.webkit.URLUtil;
+
+/**
+ * This class is used to pull down the http headers of a given URL so that
+ * we can analyse the mimetype and make any correction needed before we give
+ * the URL to the download manager. The ContentValues class holds the
+ * content that would be provided to the download manager, so that on
+ * completion of checking the mimetype, we can issue the download to
+ * the download manager.
+ * This operation is needed when the user long-clicks on a link or image and
+ * we don't know the mimetype. If the user just clicks on the link, we will
+ * do the same steps of correcting the mimetype down in
+ * android.os.webkit.LoadListener rather than handling it here.
+ *
+ */
+class FetchUrlMimeType extends AsyncTask<ContentValues, String, String> {
+
+    BrowserActivity mActivity;
+    ContentValues mValues;
+
+    public FetchUrlMimeType(BrowserActivity activity) {
+        mActivity = activity;
+    }
+
+    @Override
+    public String doInBackground(ContentValues... values) {
+        mValues = values[0];
+
+        // Check to make sure we have a URI to download
+        String uri = mValues.getAsString(Downloads.URI);
+        if (uri == null || uri.length() == 0) {
+            return null;
+        }
+
+        // User agent is likely to be null, though the AndroidHttpClient
+        // seems ok with that.
+        AndroidHttpClient client = AndroidHttpClient.newInstance(
+                mValues.getAsString(Downloads.USER_AGENT));
+        HttpHead request = new HttpHead(uri);
+
+        String cookie = mValues.getAsString(Downloads.COOKIE_DATA);
+        if (cookie != null && cookie.length() > 0) {
+            request.addHeader("Cookie", cookie);
+        }
+
+        String referer = mValues.getAsString(Downloads.REFERER);
+        if (referer != null && referer.length() > 0) {
+            request.addHeader("Referer", referer);
+        }
+
+        HttpResponse response;
+        Boolean succeeded = true;
+        String mimeType = null;
+        try {
+            response = client.execute(request);
+            // We could get a redirect here, but if we do lets let
+            // the download manager take care of it, and thus trust that
+            // the server sends the right mimetype
+            if (response.getStatusLine().getStatusCode() == 200) {
+                Header header = response.getFirstHeader("Content-Type");
+                if (header != null) {
+                    mimeType = header.getValue();
+                    final int semicolonIndex = mimeType.indexOf(';');
+                    if (semicolonIndex != -1) {
+                        mimeType = mimeType.substring(0, semicolonIndex);
+                    }
+                }
+            }
+        } catch (IllegalArgumentException ex) {
+            request.abort();
+        } catch (IOException ex) {
+            request.abort();
+        } finally {
+            client.close();
+        }
+
+        return mimeType;
+    }
+
+   @Override
+    public void onPostExecute(String mimeType) {
+       if (mimeType != null) {
+           String url = mValues.getAsString(Downloads.URI);
+           if (mimeType.equalsIgnoreCase("text/plain") ||
+                   mimeType.equalsIgnoreCase("application/octet-stream")) {
+               String newMimeType =
+                       MimeTypeMap.getSingleton().getMimeTypeFromExtension(
+                           MimeTypeMap.getFileExtensionFromUrl(url));
+               if (newMimeType != null) {
+                   mValues.put(Downloads.MIMETYPE, newMimeType);
+               }
+           }
+           String filename = URLUtil.guessFileName(url,
+                   null, mimeType);
+           mValues.put(Downloads.FILENAME_HINT, filename);
+       }
+
+       // Start the download
+       final Uri contentUri =
+           mActivity.getContentResolver().insert(Downloads.CONTENT_URI, mValues);
+       mActivity.viewDownloads(contentUri);
+    }
+
+}
index 42447e3..2b26784 100644 (file)
 
 package com.android.browser;
 
+import android.app.Dialog;
+import android.content.res.Configuration;
+import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
 import android.text.Editable;
 import android.text.Spannable;
 import android.text.TextWatcher;
+import android.view.Gravity;
 import android.view.KeyEvent;
-import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.LayoutInflater;
+import android.view.Window;
 import android.webkit.WebView;
 import android.widget.EditText;
-import android.widget.LinearLayout;
 import android.widget.TextView;
 
-/* package */ class FindDialog extends LinearLayout implements TextWatcher {
+/* package */ class FindDialog extends Dialog implements TextWatcher {
     private WebView         mWebView;
     private TextView        mMatches;
     private BrowserActivity mBrowserActivity;
@@ -41,10 +43,7 @@ import android.widget.TextView;
     private EditText        mEditText;
     private View            mNextButton;
     private View            mPrevButton;
-
-    // Tags for messages to be sent to the handler.
-    private final static int FIND_RESPONSE  = 0;
-    private final static int NUM_FOUND      = 1;
+    private View            mMatchesView;
 
     private View.OnClickListener mFindListener = new View.OnClickListener() {
         public void onClick(View v) {
@@ -65,26 +64,7 @@ import android.widget.TextView;
             if (mWebView == null) {
                 throw new AssertionError("No WebView for FindDialog::onClick");
             }
-            // Find is disabled for version 1.0, so find methods on WebView are
-            // currently private.
-            //mWebView.findPrevious(mEditText.getText().toString(),
-            //        mFindHandler.obtainMessage(FIND_RESPONSE));
-        }
-    };
-    
-    private Handler mFindHandler = new Handler() {
-        public void handleMessage(Message msg) {
-            if (NUM_FOUND == msg.what) {
-                mMatches.setText(Integer.toString(msg.arg1));
-                if (0 == msg.arg1) {
-                    disableButtons();
-                } else {
-                    mPrevButton.setFocusable(true);
-                    mNextButton.setFocusable(true);
-                    mPrevButton.setEnabled(true);
-                    mNextButton.setEnabled(true);
-                }
-            }
+            mWebView.findNext(false);
         }
     };
     
@@ -95,20 +75,35 @@ import android.widget.TextView;
         mNextButton.setFocusable(false);
     }
 
-    public void setWebView(WebView webview) {
+    /* package */ void setWebView(WebView webview) {
         mWebView = webview;
     }
 
     /* package */ FindDialog(BrowserActivity context) {
-        super(context);
+        super(context, R.style.FindDialogTheme);
         mBrowserActivity = context;
-        LayoutInflater factory = LayoutInflater.from(context);
-        factory.inflate(R.layout.browser_find, this);
-        
-        setLayoutParams(new ViewGroup.LayoutParams(
-                ViewGroup.LayoutParams.FILL_PARENT,
-                ViewGroup.LayoutParams.WRAP_CONTENT));
-        
+        setCanceledOnTouchOutside(true);
+    }
+
+    /* package */ void onConfigurationChanged(Configuration newConfig) {
+        // FIXME: Would like to call mWebView.findAll again, so that the
+        // matches would refresh, but the new picture has not yet been
+        // created, so it is too soon.
+        mEditText.getText().clear();
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        Window theWindow = getWindow();
+        theWindow.setGravity(Gravity.BOTTOM|Gravity.FILL_HORIZONTAL);
+
+        setContentView(R.layout.browser_find);
+
+        theWindow.setLayout(ViewGroup.LayoutParams.FILL_PARENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT);
+
         mEditText = (EditText) findViewById(R.id.edit);
         
         View button = findViewById(R.id.next);
@@ -124,47 +119,21 @@ import android.widget.TextView;
         mOk = button;
         
         mMatches = (TextView) findViewById(R.id.matches);
+        mMatchesView = findViewById(R.id.matches_view);
         disableButtons();
     }
     
     public void dismiss() {
+        super.dismiss();
         mBrowserActivity.closeFind();
-        // If the nav buttons are highlighted, then there are matches
-        // highlighted in the WebView, and they should be cleared.
-        if (mPrevButton.isEnabled()) {
-            // Find is disabled for version 1.0, so find methods on WebView are
-            // currently private.
-            //mWebView.clearMatches();
-        }
+        mWebView.clearMatches();
     }
     
     @Override
     public boolean dispatchKeyEvent(KeyEvent event) {
-        // Make up and down find previous/next
         int code = event.getKeyCode();
         boolean up = event.getAction() == KeyEvent.ACTION_UP;
         switch (code) {
-            case KeyEvent.KEYCODE_BACK:
-                if (up) {
-                    dismiss();
-                }
-                return true;
-            case KeyEvent.KEYCODE_DPAD_UP:
-                if (event.getMetaState() != 0) {
-                    break;
-                }
-                if (up) {
-                    mFindPreviousListener.onClick(null);
-                }
-                return true;
-            case KeyEvent.KEYCODE_DPAD_DOWN:
-                if (event.getMetaState() != 0) {
-                    break;
-                }
-                if (up) {
-                    mFindListener.onClick(null);
-                }
-                return true;
             case KeyEvent.KEYCODE_DPAD_CENTER:
             case KeyEvent.KEYCODE_ENTER:
                 if (!mEditText.hasFocus()) {
@@ -179,26 +148,16 @@ import android.widget.TextView;
         }
         return super.dispatchKeyEvent(event);
     }
-    
-    @Override
-    public boolean dispatchTouchEvent(MotionEvent ev) {
-        super.dispatchTouchEvent(ev);
-        // Return true so that BrowserActivity thinks we handled it and does
-        // not dismiss us.
-        return true;
-    }
 
     private void findNext() {
         if (mWebView == null) {
             throw new AssertionError("No WebView for FindDialog::findNext");
         }
-        // Find is disabled for version 1.0, so find methods on WebView are
-        // currently private.
-        //mWebView.findNext(mEditText.getText().toString(),
-        //        mFindHandler.obtainMessage(FIND_RESPONSE));
+        mWebView.findNext(true);
     }
     
     public void show() {
+        super.show();
         mEditText.requestFocus();
         mEditText.setText("");
         Spannable span = (Spannable) mEditText.getText();
@@ -219,22 +178,30 @@ import android.widget.TextView;
                               int start, 
                               int before, 
                               int count) {
+        if (mWebView == null) {
+            throw new AssertionError(
+                    "No WebView for FindDialog::onTextChanged");
+        }
         CharSequence find = mEditText.getText();
         if (0 == find.length()) {
             disableButtons();
-            // Find is disabled for version 1.0, so find methods on WebView are
-            // currently private.
-            //mWebView.clearMatches();
-            mMatches.setText(R.string.zero);
+            mWebView.clearMatches();
+            mMatchesView.setVisibility(View.INVISIBLE);
         } else {
-            if (mWebView == null) {
-                throw new AssertionError(
-                        "No WebView for FindDialog::onTextChanged");
+            mMatchesView.setVisibility(View.VISIBLE);
+            int found = mWebView.findAll(find.toString());
+            mMatches.setText(Integer.toString(found));
+            if (found < 2) {
+                disableButtons();
+                if (found == 0) {
+                    mMatches.setText(R.string.zero);
+                }
+            } else {
+                mPrevButton.setFocusable(true);
+                mNextButton.setFocusable(true);
+                mPrevButton.setEnabled(true);
+                mNextButton.setEnabled(true);
             }
-            // Find is disabled for version 1.0, so find methods on WebView are
-            // currently private.
-            //mWebView.findAll(find.toString(),
-            //        mFindHandler.obtainMessage(NUM_FOUND));
         }
     }
 
diff --git a/src/com/android/browser/GearsBaseDialog.java b/src/com/android/browser/GearsBaseDialog.java
new file mode 100644 (file)
index 0000000..c930dc8
--- /dev/null
@@ -0,0 +1,336 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Handler;
+import android.util.Log;
+import android.view.InflateException;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.lang.ClassCastException;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * Base dialog class for gears
+ */
+class GearsBaseDialog {
+
+  private static final String TAG = "GearsNativeDialog";
+  protected Handler mHandler;
+  protected Activity mActivity;
+  protected String mDialogArguments;
+
+  private Bitmap mIcon;
+  private final int MAX_ICON_SIZE = 64;
+  protected int mChoosenIconSize;
+
+  // Dialog closing types
+  public static final int CANCEL = 0;
+  public static final int ALWAYS_DENY = 1;
+  public static final int ALLOW = 2;
+  public static final int DENY = 3;
+  public static final int NEW_ICON = 4;
+  public static final int UPDATE_ICON = 5;
+  public static final int REQUEST_ICON = 6;
+  public static final int PAUSE_REQUEST_ICON = 7;
+
+  protected final String LOCAL_DATA_STRING = "localData";
+  protected final String LOCAL_STORAGE_STRING = "localStorage";
+  protected final String LOCATION_DATA_STRING = "locationData";
+
+  protected String mGearsVersion = "UNDEFINED";
+  protected boolean mDebug = false;
+
+  public GearsBaseDialog(Activity activity, Handler handler, String arguments) {
+    mActivity = activity;
+    mHandler = handler;
+    mDialogArguments = arguments;
+  }
+
+  Resources getResources() {
+    return mActivity.getResources();
+  }
+
+  Object getSystemService(String name) {
+    return mActivity.getSystemService(name);
+  }
+
+  View findViewById(int id) {
+    return mActivity.findViewById(id);
+  }
+
+  private String getString(int id) {
+    return mActivity.getString(id);
+  }
+
+  public void setDebug(boolean debug) {
+    mDebug = debug;
+  }
+
+  public void setGearsVersion(String version) {
+    mGearsVersion = version;
+  }
+
+  public String closeDialog(int closingType) {
+    return null;
+  }
+
+  /*
+   * Utility methods for setting up the dialogs elements
+   */
+
+  /**
+   * Inflate a given layout in a view (which has to be
+   * a ViewGroup, e.g. LinearLayout).
+   * This is used to share the basic dialog outline among
+   * the different dialog types.
+   */
+  void inflate(int layout, int viewID) {
+    LayoutInflater inflater = (LayoutInflater) getSystemService(
+        Context.LAYOUT_INFLATER_SERVICE);
+    View view = findViewById(viewID);
+    if (view != null) {
+      try {
+        ViewGroup viewGroup = (ViewGroup) view;
+        inflater.inflate(layout, viewGroup);
+      } catch (ClassCastException e) {
+        String msg = "exception, the view (" + view + ")";
+        msg += " is not a ViewGroup";
+        Log.e(TAG, msg, e);
+      } catch (InflateException e) {
+        Log.e(TAG, "exception while inflating the layout", e);
+      }
+    } else {
+      String msg = "problem, trying to inflate a non-existent view";
+      msg += " (" + viewID + ")";
+      Log.e(TAG, msg);
+    }
+  }
+
+  /**
+   * Button setup.
+   * Set the button's text and its listener. If the text resource's id
+   * is 0, makes the button invisible.
+   */
+  void setupButton(int buttonRscID,
+                   int rscString,
+                   View.OnClickListener listener) {
+    View view = findViewById(buttonRscID);
+    if (view == null) {
+      return;
+    }
+    Button button = (Button) view;
+
+    if (rscString == 0) {
+      button.setVisibility(View.GONE);
+    } else {
+      CharSequence text = getString(rscString);
+      button.setText(text);
+      button.setOnClickListener(listener);
+    }
+  }
+
+  /**
+   * Utility method to setup the three dialog buttons.
+   */
+  void setupButtons(int alwaysDenyRsc, int allowRsc, int denyRsc) {
+    setupButton(R.id.button_alwaysdeny, alwaysDenyRsc,
+                new Button.OnClickListener() {
+                  public void onClick(View v) {
+                    mHandler.sendEmptyMessage(ALWAYS_DENY);
+                  }
+                });
+
+    setupButton(R.id.button_allow, allowRsc,
+                new Button.OnClickListener() {
+                  public void onClick(View v) {
+                    mHandler.sendEmptyMessage(ALLOW);
+                  }
+                });
+
+    setupButton(R.id.button_deny, denyRsc,
+                new Button.OnClickListener() {
+                  public void onClick(View v) {
+                    mHandler.sendEmptyMessage(DENY);
+                  }
+                });
+  }
+
+  /**
+   * Utility method to set elements' text indicated in
+   * the dialogs' arguments.
+   */
+  void setLabel(JSONObject json, String name, int rsc) {
+    try {
+      if (json.has(name)) {
+        String text = json.getString(name);
+        View view = findViewById(rsc);
+        if (view != null && text != null) {
+          TextView textView = (TextView) view;
+          textView.setText(text);
+          textView.setVisibility(View.VISIBLE);
+        }
+      }
+    } catch (JSONException e) {
+      Log.e(TAG, "json exception", e);
+    }
+  }
+
+  /**
+   * Utility class to download an icon in the background.
+   * Once done ask the UI thread to update the icon.
+   */
+  class IconDownload implements Runnable {
+    private String mUrlString;
+
+    IconDownload(String url) {
+      mUrlString = url;
+    }
+
+    public void run() {
+      if (mUrlString == null) {
+        return;
+      }
+      try {
+        URL url = new URL(mUrlString);
+        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+        connection.setDoInput(true);
+        connection.connect();
+        int length = connection.getContentLength();
+        InputStream is = connection.getInputStream();
+        Bitmap customIcon = BitmapFactory.decodeStream(is);
+        if (customIcon != null) {
+          mIcon = customIcon;
+          mHandler.sendEmptyMessage(UPDATE_ICON);
+        }
+      } catch (ClassCastException e) {
+        Log.e(TAG, "Class cast exception (" + mUrlString + ")", e);
+      } catch (MalformedURLException e) {
+        Log.e(TAG, "Malformed url (" + mUrlString + ") ", e);
+      } catch (IOException e) {
+        Log.e(TAG, "Exception downloading icon (" + mUrlString + ") ", e);
+      }
+    }
+  }
+
+  /**
+   * Utility method to update the icon.
+   * Called on the UI thread.
+   */
+  public void updateIcon() {
+    if (mIcon == null) {
+      return;
+    }
+    View view = findViewById(R.id.origin_icon);
+    if (view != null) {
+      ImageView imageView = (ImageView) view;
+      imageView.setMaxHeight(MAX_ICON_SIZE);
+      imageView.setMaxWidth(MAX_ICON_SIZE);
+      imageView.setScaleType(ImageView.ScaleType.FIT_XY);
+      imageView.setImageBitmap(mIcon);
+      imageView.setVisibility(View.VISIBLE);
+    }
+  }
+
+  /**
+   * Utility method to download an icon from a url and set
+   * it to the GUI element R.id.origin_icon.
+   * It is used both in the shortcut dialog and the
+   * permission dialog.
+   * The actual download is done in the background via
+   * IconDownload; once the icon is downlowded the UI is updated
+   * via updateIcon().
+   * The icon size is included in the layout with the choosen
+   * size, although not displayed, to limit text reflow once
+   * the icon is received.
+   */
+  void downloadIcon(String url) {
+    if (url == null) {
+      return;
+    }
+    View view = findViewById(R.id.origin_icon);
+    if (view != null) {
+      view.setMinimumWidth(mChoosenIconSize);
+      view.setMinimumHeight(mChoosenIconSize);
+      view.setVisibility(View.INVISIBLE);
+    }
+    Thread thread = new Thread(new IconDownload(url));
+    thread.start();
+  }
+
+  /**
+   * Utility method that get the dialogMessage
+   * and icon and ask the setupDialog(message,icon)
+   * method to set the values.
+   */
+  public void setupDialog() {
+    TextView dialogMessage = null;
+    ImageView icon = null;
+
+    View view = findViewById(R.id.dialog_message);
+    if (view != null) {
+      dialogMessage = (TextView) view;
+    }
+
+    View iconView = findViewById(R.id.icon);
+    if (iconView != null) {
+      icon = (ImageView) iconView;
+    }
+
+    if ((dialogMessage != null) && (icon != null)) {
+      setupDialog(dialogMessage, icon);
+      dialogMessage.setVisibility(View.VISIBLE);
+    }
+  }
+
+  /*
+   * Set the message and icon of the dialog
+   */
+  public void setupDialog(TextView message, ImageView icon) {
+    message.setText(R.string.unrecognized_dialog_message);
+    icon.setImageResource(R.drawable.gears_icon_48x48);
+    message.setVisibility(View.VISIBLE);
+  }
+
+  /**
+   * Setup the dialog
+   * By default, just display a simple message.
+   */
+  public void setup() {
+    setupButtons(0, 0, R.string.default_button);
+    setupDialog();
+  }
+
+
+}
index fd9e762..62a8aaa 100644 (file)
@@ -48,6 +48,8 @@ public class GearsDialog extends Activity {
   private String htmlContent;
   private String dialogArguments;
 
+  private boolean dismissed = false;
+
   @Override
   public void onCreate(Bundle icicle) {
     super.onCreate(icicle);
@@ -66,14 +68,24 @@ public class GearsDialog extends Activity {
   }
 
   @Override
+  public void onDestroy() {
+    super.onDestroy();
+    // In case we reach this point without
+    // notifying GearsDialogService, we do it now.
+    if (!dismissed) {
+      notifyEndOfDialog();
+    }
+  }
+
+  @Override
   public void onConfigurationChanged(Configuration newConfig) {
     super.onConfigurationChanged(newConfig);
     Intent i = getIntent();
     boolean inSettings = i.getBooleanExtra("inSettings", false);
     // If we are called from the settings, we
-    // dismiss ourselve upon upon rotation
+    // dismiss ourselve upon rotation
     if (inSettings) {
-      GearsDialogService.signalFinishedDialog();
+      notifyEndOfDialog();
       finish();
     }
   }
@@ -88,10 +100,22 @@ public class GearsDialog extends Activity {
     webview.loadDataWithBaseURL("", htmlContent, "text/html", "", "");
   }
 
+  /**
+   * Signal to GearsDialogService that we are done.
+   */
+  private void notifyEndOfDialog() {
+    GearsDialogService.signalFinishedDialog();
+    dismissed = true;
+  }
+
+  /**
+   * Intercepts the back key to immediately notify
+   * GearsDialogService that we are done.
+   */
   public boolean dispatchKeyEvent(KeyEvent event) {
     if (event.getKeyCode() ==  KeyEvent.KEYCODE_BACK && event.isDown()) {
-      GearsDialogService.signalFinishedDialog();
-     }
+      notifyEndOfDialog();
+    }
     return super.dispatchKeyEvent(event);
   }
 
@@ -110,7 +134,7 @@ public class GearsDialog extends Activity {
    */
   public void closeDialog(String results) {
     GearsDialogService.closeDialog(results);
-    GearsDialogService.signalFinishedDialog();
+    notifyEndOfDialog();
     finish();
   }
 
diff --git a/src/com/android/browser/GearsFilePickerDialog.java b/src/com/android/browser/GearsFilePickerDialog.java
new file mode 100644 (file)
index 0000000..4a3c0ed
--- /dev/null
@@ -0,0 +1,629 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.net.Uri;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.provider.MediaStore;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.GridView;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Vector;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+
+/**
+ * Gears FilePicker dialog
+ */
+class GearsFilePickerDialog extends GearsBaseDialog
+  implements View.OnTouchListener {
+
+  private static final String TAG = "Gears FilePicker";
+  private static Bitmap mDirectoryIcon;
+  private static Bitmap mDefaultIcon;
+  private static Bitmap mImageIcon;
+  private static Bitmap mBackIcon;
+  private static ImagesLoad mImagesLoader;
+  private FilePickerAdapter mAdapter;
+
+  public GearsFilePickerDialog(Activity activity,
+                               Handler handler,
+                               String arguments) {
+    super (activity, handler, arguments);
+    mAdapter = new FilePickerAdapter(activity);
+  }
+
+  public void setup() {
+    inflate(R.layout.gears_dialog_filepicker, R.id.panel_content);
+    setupButtons(0,
+                 R.string.filepicker_button_allow,
+                 R.string.filepicker_button_deny);
+    setupDialog();
+    GridView view = (GridView) findViewById(R.id.files_list);
+    view.setAdapter(mAdapter);
+    view.setOnTouchListener(this);
+
+    mImagesLoader = new ImagesLoad(mAdapter);
+    mImagesLoader.setAdapterView(view);
+    Thread thread = new Thread(mImagesLoader);
+    thread.start();
+  }
+
+  public void setupDialog(TextView message, ImageView icon) {
+    message.setText(R.string.filepicker_message);
+    message.setTextSize(24);
+    icon.setImageResource(R.drawable.gears_icon_48x48);
+  }
+
+  public boolean onTouch(View v, MotionEvent event) {
+    mImagesLoader.pauseIconRequest();
+    return false;
+  }
+
+  /**
+   * Utility class to load and generate thumbnails
+   * for image files
+   */
+  class ImagesLoad implements Runnable {
+    private Map mImagesMap;
+    private Vector mImagesPath;
+    private BaseAdapter mAdapter;
+    private AdapterView mAdapterView;
+    private Vector<FilePickerElement> mElements;
+    private Handler mLoaderHandler;
+
+    ImagesLoad(BaseAdapter adapter) {
+      mAdapter = adapter;
+    }
+
+    public void signalChanges() {
+      Message message = mHandler.obtainMessage(GearsBaseDialog.NEW_ICON,
+                                               mAdapter);
+      mHandler.sendMessage(message);
+    }
+
+    /**
+     * TODO: use the same thumbnails as the photo app
+     * (bug: http://b/issue?id=1497927)
+     */
+    public String getThumbnailPath(String path) {
+      File f = new File(path);
+      String myPath = f.getParent() + "/.thumbnails";
+      File d = new File(myPath);
+      if (!d.exists()) {
+        d.mkdirs();
+      }
+      return myPath + "/" + f.getName();
+    }
+
+    public boolean saveImage(String path, Bitmap image) {
+      boolean ret = false;
+      try {
+        FileOutputStream outStream = new FileOutputStream(path);
+        ret = image.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
+      } catch (IOException e) {
+        Log.e(TAG, "IOException ", e);
+      }
+      return ret;
+    }
+
+    public Bitmap generateImage(FilePickerElement elem) {
+      String path = elem.getPath();
+      Bitmap finalImage = null;
+      try {
+        String thumbnailPath = getThumbnailPath(path);
+        File thumbnail = new File(thumbnailPath);
+        if (thumbnail.exists()) {
+          finalImage = BitmapFactory.decodeFile(thumbnailPath);
+          if (finalImage != null) {
+            return finalImage;
+          }
+        }
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inJustDecodeBounds = true;
+        BitmapFactory.decodeFile(path, options);
+
+        int width = options.outWidth;
+        int height = options.outHeight;
+        int size = 128;
+        int sampleSize = 1;
+        if (width > size || height > size) {
+          sampleSize = 2;
+          while ((width / sampleSize > size)
+                 || (height / sampleSize > size)) {
+            sampleSize += 2;
+          }
+        }
+        options.inJustDecodeBounds = false;
+        options.inSampleSize = sampleSize;
+        Bitmap originalImage = BitmapFactory.decodeFile(path, options);
+        if (originalImage == null) {
+          return null;
+        }
+        finalImage = Bitmap.createScaledBitmap(originalImage, size, size, true);
+        if (saveImage(thumbnailPath, finalImage)) {
+          if (mDebug) {
+            Log.v(TAG, "Saved thumbnail for file " + path);
+          }
+        } else {
+          Log.e(TAG, "Could NOT Save thumbnail for file " + path);
+        }
+        originalImage.recycle();
+      } catch (java.lang.OutOfMemoryError e) {
+        Log.e(TAG, "Intercepted OOM ", e);
+      }
+      return finalImage;
+    }
+
+    public void pauseIconRequest() {
+      Message message = Message.obtain(mLoaderHandler,
+                                       GearsBaseDialog.PAUSE_REQUEST_ICON);
+      mLoaderHandler.sendMessageAtFrontOfQueue(message);
+    }
+    public void postIconRequest(FilePickerElement item, int position) {
+      if (item == null) {
+        return;
+      }
+      Message message = mLoaderHandler.obtainMessage(
+          GearsBaseDialog.REQUEST_ICON, position, 0, item);
+      mLoaderHandler.sendMessage(message);
+    }
+
+    public void generateIcon(FilePickerElement elem) {
+      if (elem.isImage()) {
+        if (elem.getThumbnail() == null) {
+          Bitmap image = generateImage(elem);
+          if (image != null) {
+            elem.setThumbnail(image);
+          }
+        }
+      }
+    }
+
+    public void setAdapterView(AdapterView view) {
+      mAdapterView = view;
+    }
+
+    public void run() {
+      Looper.prepare();
+      mLoaderHandler = new Handler() {
+        public void handleMessage(Message msg) {
+          int visibleElements = 10;
+          if (msg.what == GearsBaseDialog.PAUSE_REQUEST_ICON) {
+            try {
+              // We are busy (likely) scrolling the view,
+              // so we just pause the loading.
+              Thread.sleep(1000);
+              mLoaderHandler.removeMessages(
+                  GearsBaseDialog.PAUSE_REQUEST_ICON);
+            } catch (InterruptedException e) {
+              Log.e(TAG, "InterruptedException ", e);
+            }
+          } else if (msg.what == GearsBaseDialog.REQUEST_ICON) {
+            try {
+              Thread.sleep(10);
+            } catch (InterruptedException e) {
+              Log.e(TAG, "InterruptedException ", e);
+            }
+            FilePickerElement elem = (FilePickerElement) msg.obj;
+            int firstVisiblePosition = mAdapterView.getFirstVisiblePosition();
+            // If the elements are not visible, we slow down the update
+            // TODO: replace this by a low-priority thread
+            if ((msg.arg1 < firstVisiblePosition - visibleElements)
+                && msg.arg1 > firstVisiblePosition + visibleElements) {
+              try {
+                Thread.sleep(100);
+              } catch (InterruptedException e) {
+              }
+            }
+            generateIcon(elem);
+            signalChanges();
+          }
+        }
+      };
+      Looper.loop();
+    }
+  }
+
+  /**
+   * Utility class representing an element displayed in the
+   * file picker, associated with an icon and/or thumbnail
+   */
+  class FilePickerElement {
+    private File mPath;
+    private String mName;
+    private Bitmap mIcon;
+    private boolean mIsSelected;
+    private Vector mChildren;
+    private FilePickerElement mParent;
+    private boolean mIsParent;
+    private BaseAdapter mAdapter;
+    private String mExtension;
+    private Bitmap mThumbnail;
+    private boolean mIsImage;
+
+    public FilePickerElement(String name, BaseAdapter adapter) {
+      this(name, adapter, null);
+    }
+
+    public FilePickerElement(String path, String name, BaseAdapter adapter) {
+      this(path, name, adapter, null);
+    }
+
+    public FilePickerElement(String name,
+                             BaseAdapter adapter,
+                             FilePickerElement parent) {
+      mName = name;
+      mAdapter = adapter;
+      mParent = parent;
+      mIsSelected = false;
+      mChildren = null;
+    }
+
+    public FilePickerElement(String path,
+                             String name,
+                             BaseAdapter adapter,
+                             FilePickerElement parent) {
+      mPath = new File(path);
+      mName = name;
+      mIsSelected = false;
+      mChildren = null;
+      mParent = parent;
+      mAdapter = adapter;
+      mExtension = null;
+
+      setIcons();
+    }
+
+    public void setIcons() {
+      if (mPath.isDirectory()) {
+        if (mDirectoryIcon == null) {
+          mDirectoryIcon = BitmapFactory.decodeResource(
+              getResources(), R.drawable.gears_folder);
+        }
+        mIcon = mDirectoryIcon;
+
+      } else {
+        if (isImage()) {
+          if (mImageIcon == null) {
+            mImageIcon = BitmapFactory.decodeResource(
+                getResources(), R.drawable.gears_file_image);
+          }
+          mIcon = mImageIcon;
+        } else if (isAudio()) {
+          mIcon = BitmapFactory.decodeResource(
+              getResources(), R.drawable.gears_file_audio);
+        } else if (isVideo()) {
+          mIcon = BitmapFactory.decodeResource(
+              getResources(), R.drawable.gears_file_video);
+        } else {
+          if (mDefaultIcon == null) {
+            mDefaultIcon = BitmapFactory.decodeResource(
+                getResources(), R.drawable.gears_file_unknown);
+          }
+          mIcon = mDefaultIcon;
+        }
+      }
+      if (mBackIcon == null) {
+        mBackIcon = BitmapFactory.decodeResource(getResources(),
+                                                 R.drawable.gears_back);
+      }
+    }
+
+    public boolean isImage() {
+      if (mIsImage) return mIsImage;
+      String extension = getExtension();
+      if (extension != null) {
+        if (extension.equalsIgnoreCase("jpg") ||
+            extension.equalsIgnoreCase("jpeg") ||
+            extension.equalsIgnoreCase("png") ||
+            extension.equalsIgnoreCase("gif")) {
+          mIsImage = true;
+          return true;
+        }
+      }
+      return false;
+    }
+
+    public boolean isAudio() {
+      String extension = getExtension();
+      if (extension != null) {
+        if (extension.equalsIgnoreCase("mp3") ||
+            extension.equalsIgnoreCase("wav") ||
+            extension.equalsIgnoreCase("aac")) {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    public boolean isVideo() {
+      String extension = getExtension();
+      if (extension != null) {
+        if (extension.equalsIgnoreCase("mpg") ||
+            extension.equalsIgnoreCase("mpeg") ||
+            extension.equalsIgnoreCase("mpe") ||
+            extension.equalsIgnoreCase("divx") ||
+            extension.equalsIgnoreCase("3gpp") ||
+            extension.equalsIgnoreCase("avi")) {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    public void setParent(boolean isParent) {
+      mIsParent = isParent;
+    }
+
+    public boolean isDirectory() {
+      return mPath.isDirectory();
+    }
+
+    public String getExtension() {
+      if (isDirectory()) {
+        return null;
+      }
+      if (mExtension == null) {
+        String path = getPath();
+        int index = path.lastIndexOf(".");
+        if ((index != -1) && (index != path.length() - 1)){
+          // if we find a dot that is not the last character
+          mExtension = path.substring(index+1);
+          return mExtension;
+        }
+      }
+      return mExtension;
+    }
+
+    public void refresh() {
+      mChildren = null;
+      Vector children = getChildren();
+      for (int i = 0; i < children.size(); i++) {
+        FilePickerElement elem = (FilePickerElement) children.get(i);
+        mImagesLoader.postIconRequest(elem, i);
+      }
+    }
+
+    public Vector getChildren() {
+      if (isDirectory()) {
+        if (mChildren == null) {
+          mChildren = new Vector();
+          File[] files = mPath.listFiles();
+          if (mParent != null) {
+            mChildren.add(mParent);
+            mParent.setParent(true);
+          }
+          for (int i = 0; i < files.length; i++) {
+            String name = files[i].getName();
+            String fpath = files[i].getPath();
+            if (!name.startsWith(".")) { // hide dotfiles
+              FilePickerElement elem = new FilePickerElement(fpath, name,
+                                                             mAdapter, this);
+              elem.setParent(false);
+              mChildren.add(elem);
+            }
+          }
+        }
+      }
+      return mChildren;
+    }
+
+    public FilePickerElement getChild(int position) {
+      Vector children = getChildren();
+      if (children != null) {
+        return (FilePickerElement) children.get(position);
+      }
+      return null;
+    }
+
+    public Bitmap getIcon(int position) {
+      if (mIsParent) {
+        return mBackIcon;
+      }
+      if (isImage()) {
+        if (mThumbnail != null) {
+          return mThumbnail;
+        } else {
+          mImagesLoader.postIconRequest(this, position);
+        }
+      }
+      return mIcon;
+    }
+
+    public Bitmap getThumbnail() {
+      return mThumbnail;
+    }
+
+    public void setThumbnail(Bitmap icon) {
+      mThumbnail = icon;
+    }
+
+    public String getName() {
+      return mName;
+    }
+
+    public String getPath() {
+      return mPath.getPath();
+    }
+
+    public void toggleSelection() {
+      mIsSelected = !mIsSelected;
+    }
+
+    public boolean isSelected() {
+      return mIsSelected;
+    }
+
+  }
+
+  /**
+   * Adapter for the GridView
+   */
+  class FilePickerAdapter extends BaseAdapter {
+    private Context mContext;
+    private Map mImagesMap;
+    private Map mImagesSelected;
+
+    private Vector mImages;
+    private Vector<FilePickerElement> mFiles;
+
+    private FilePickerElement mRootElement;
+    private FilePickerElement mCurrentElement;
+
+    public FilePickerAdapter(Context context) {
+      mContext = context;
+      mImages = new Vector();
+      mFiles = new Vector();
+
+      mImagesMap = Collections.synchronizedMap(new HashMap());
+      mImagesSelected = new HashMap();
+
+      Uri requests[] = { MediaStore.Images.Media.INTERNAL_CONTENT_URI,
+                         MediaStore.Images.Media.EXTERNAL_CONTENT_URI };
+
+      String sdCardPath = Environment.getExternalStorageDirectory().getPath();
+      mRootElement = new FilePickerElement(sdCardPath, "SD Card", this);
+      mCurrentElement = mRootElement;
+    }
+
+    public void addImage(String path) {
+      mImages.add(path);
+      Bitmap image = BitmapFactory.decodeResource(
+          getResources(), R.drawable.gears_file_unknown);
+      mImagesMap.put(path, image);
+      mImagesSelected.put(path, Boolean.FALSE);
+    }
+
+    public int getCount() {
+      Vector elems = mCurrentElement.getChildren();
+      return elems.size();
+    }
+
+    public Object getItem(int position) {
+      return position;
+    }
+
+    public long getItemId(int position) {
+      return position;
+    }
+
+    public Vector selectedElements() {
+      if (mCurrentElement == null) {
+        return null;
+      }
+      Vector children = mCurrentElement.getChildren();
+      Vector ret = new Vector();
+      for (int i = 0; i < children.size(); i++) {
+        FilePickerElement elem = (FilePickerElement) children.get(i);
+        if (elem.isSelected()) {
+          ret.add(elem);
+        }
+      }
+      return ret;
+    }
+
+    public View getView(int position, View convertView, ViewGroup parent) {
+      View cell = convertView;
+      if (cell == null) {
+        LayoutInflater inflater = (LayoutInflater) getSystemService(
+            Context.LAYOUT_INFLATER_SERVICE);
+        cell = inflater.inflate(R.layout.gears_dialog_filepicker_cell, null);
+      }
+      ImageView imageView = (ImageView) cell.findViewById(R.id.icon);
+      TextView textView = (TextView) cell.findViewById(R.id.name);
+      FilePickerElement elem = mCurrentElement.getChild(position);
+      if (elem == null) {
+        String message = "Could not get elem " + position;
+        message += " for " + mCurrentElement.getPath();
+        Log.e(TAG, message);
+        return null;
+      }
+      String path = elem.getPath();
+      textView.setText(elem.getName());
+
+      View.OnClickListener listener = new View.OnClickListener() {
+        public void onClick(View view) {
+          int pos = (Integer) view.getTag();
+          FilePickerElement elem = mCurrentElement.getChild(pos);
+          if (elem.isDirectory()) {
+            mCurrentElement = elem;
+            mCurrentElement.refresh();
+          } else {
+            elem.toggleSelection();
+          }
+          notifyDataSetChanged();
+        }
+      };
+      imageView.setOnClickListener(listener);
+      cell.setLayoutParams(new GridView.LayoutParams(96, 96));
+
+      imageView.setTag(position);
+
+      if (elem.isSelected()) {
+        cell.setBackgroundColor(Color.LTGRAY);
+      } else {
+        cell.setBackgroundColor(Color.WHITE);
+      }
+      Bitmap bmp = elem.getIcon(position);
+      if (bmp != null) {
+        imageView.setImageBitmap(bmp);
+      }
+
+      return cell;
+    }
+  }
+
+  private String selectedFiles() {
+    Vector selection = mAdapter.selectedElements();
+    JSONArray jsonSelection = new JSONArray();
+    if (selection != null) {
+      for (int i = 0; i < selection.size(); i++) {
+        FilePickerElement elem = (FilePickerElement) selection.get(i);
+        jsonSelection.put(elem.getPath());
+      }
+    }
+    return jsonSelection.toString();
+  }
+
+  public String closeDialog(int closingType) {
+    return selectedFiles();
+  }
+}
diff --git a/src/com/android/browser/GearsNativeDialog.java b/src/com/android/browser/GearsNativeDialog.java
new file mode 100644 (file)
index 0000000..c8ae741
--- /dev/null
@@ -0,0 +1,274 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Config;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.Window;
+import android.widget.BaseAdapter;
+
+import android.webkit.gears.NativeDialog;
+
+import com.android.browser.GearsBaseDialog;
+import com.android.browser.GearsPermissionsDialog;
+import com.android.browser.GearsSettingsDialog;
+import com.android.browser.GearsShortcutDialog;
+import com.android.browser.GearsFilePickerDialog;
+
+/**
+ * Native dialog Activity used by gears
+ * TODO: rename in GearsNativeDialogActivity
+ * @hide
+ */
+public class GearsNativeDialog extends Activity {
+
+  private static final String TAG = "GearsNativeDialog";
+
+  private String mDialogArguments;
+
+  private String mGearsVersion = null;
+
+  private boolean mDebug = false;
+
+  private int mDialogType;
+  private final int SETTINGS_DIALOG = 1;
+  private final int PERMISSION_DIALOG = 2;
+  private final int SHORTCUT_DIALOG = 3;
+  private final int LOCATION_DIALOG = 4;
+  private final int FILEPICKER_DIALOG = 5;
+
+  private final String VERSION_STRING = "version";
+  private final String SETTINGS_DIALOG_STRING = "settings_dialog";
+  private final String PERMISSION_DIALOG_STRING = "permissions_dialog";
+  private final String SHORTCUT_DIALOG_STRING = "shortcuts_dialog";
+  private final String LOCATION_DIALOG_STRING = "locations_dialog";
+  private final String FILEPICKER_DIALOG_STRING = "filepicker_dialog";
+
+  private boolean mDialogDismissed = false;
+
+  GearsBaseDialog dialog;
+
+  // Handler for callbacks to the UI thread
+  final Handler mHandler = new Handler() {
+    public void handleMessage(Message msg) {
+      if (msg.what == GearsBaseDialog.NEW_ICON) {
+        BaseAdapter adapter = (BaseAdapter) msg.obj;
+        adapter.notifyDataSetChanged();
+      } else if (msg.what == GearsBaseDialog.UPDATE_ICON) {
+        dialog.updateIcon();
+      } else if (msg.what == GearsBaseDialog.ALWAYS_DENY) {
+        closeDialog(GearsBaseDialog.ALWAYS_DENY);
+      } else if (msg.what == GearsBaseDialog.ALLOW) {
+        closeDialog(GearsBaseDialog.ALLOW);
+      } else if (msg.what == GearsBaseDialog.DENY) {
+        closeDialog(GearsBaseDialog.DENY);
+      }
+      super.handleMessage(msg);
+    }
+  };
+
+  @Override
+  public void onCreate(Bundle icicle) {
+    super.onCreate(icicle);
+    requestWindowFeature(Window.FEATURE_NO_TITLE);
+    setContentView(R.layout.gears_dialog);
+    getArguments();
+
+    switch (mDialogType) {
+      case SETTINGS_DIALOG:
+        dialog = new GearsSettingsDialog(this, mHandler, mDialogArguments);
+        dialog.setGearsVersion(mGearsVersion);
+        break;
+      case PERMISSION_DIALOG:
+        dialog = new GearsPermissionsDialog(this, mHandler, mDialogArguments);
+        break;
+      case SHORTCUT_DIALOG:
+        dialog = new GearsShortcutDialog(this, mHandler, mDialogArguments);
+        break;
+      case LOCATION_DIALOG:
+        dialog = new GearsPermissionsDialog(this, mHandler, mDialogArguments);
+        break;
+      case FILEPICKER_DIALOG:
+        dialog = new GearsFilePickerDialog(this, mHandler, mDialogArguments);
+        break;
+      default:
+        dialog = new GearsBaseDialog(this, mHandler, mDialogArguments);
+    }
+    dialog.setDebug(mDebug);
+    dialog.setup();
+  }
+
+  /**
+   * Get the arguments for the dialog
+   *
+   * The dialog needs a json string as an argument, as
+   * well as a dialogType. In debug mode the arguments
+   * are mocked.
+   */
+  private void getArguments() {
+    if (mDebug) {
+      mDialogType = FILEPICKER_DIALOG +1;
+      mockArguments();
+
+      return;
+    }
+
+    Intent intent = getIntent();
+    mDialogArguments = intent.getStringExtra("dialogArguments");
+    String dialogTypeString = intent.getStringExtra("dialogType");
+    if (dialogTypeString == null) {
+      return;
+    }
+
+    if (Config.LOGV) {
+      Log.v(TAG, "dialogtype: " + dialogTypeString);
+    }
+
+    if (dialogTypeString.equalsIgnoreCase(SETTINGS_DIALOG_STRING)) {
+      mDialogType = SETTINGS_DIALOG;
+      mGearsVersion = intent.getStringExtra(VERSION_STRING);
+    } else if (dialogTypeString.equalsIgnoreCase(PERMISSION_DIALOG_STRING)) {
+      mDialogType = PERMISSION_DIALOG;
+    } else if (dialogTypeString.equalsIgnoreCase(SHORTCUT_DIALOG_STRING)) {
+      mDialogType = SHORTCUT_DIALOG;
+    } else if (dialogTypeString.equalsIgnoreCase(LOCATION_DIALOG_STRING)) {
+      mDialogType = LOCATION_DIALOG;
+    } else if (dialogTypeString.equalsIgnoreCase(FILEPICKER_DIALOG_STRING)) {
+      mDialogType = FILEPICKER_DIALOG;
+    }
+  }
+
+  /**
+   * Utility method for debugging the dialog.
+   *
+   * Set mock arguments.
+   */
+  private void mockArguments() {
+    String argumentsShortcuts = "{ locale: \"en-US\","
+        + "name: \"My Application\", link: \"http://www.google.com/\","
+        + "description: \"This application does things does things!\","
+        + "icon16x16: \"http://google-gears.googlecode.com/"
+        + "svn/trunk/gears/test/manual/shortcuts/16.png\","
+        + "icon32x32: \"http://google-gears.googlecode.com/"
+        + "svn/trunk/gears/test/manual/shortcuts/32.png\","
+        + "icon48x48: \"http://google-gears.googlecode.com/"
+        + "svn/trunk/gears/test/manual/shortcuts/48.png\","
+        + "icon128x128: \"http://google-gears.googlecode.com/"
+        + "svn/trunk/gears/test/manual/shortcuts/128.png\"}";
+
+    String argumentsPermissions = "{ locale: \"en-US\", "
+        + "origin: \"http://www.google.com\", dialogType: \"localData\","
+        + "customIcon: \"http://google-gears.googlecode.com/"
+        + "svn/trunk/gears/test/manual/shortcuts/32.png\","
+        + "customName: \"My Application\","
+        + "customMessage: \"Press the button to enable my "
+        + "application to run offline!\" };";
+
+    String argumentsLocation = "{ locale: \"en-US\", "
+        + "origin: \"http://www.google.com\", dialogType: \"locationData\","
+        + "customIcon: \"http://google-gears.googlecode.com/"
+        + "svn/trunk/gears/test/manual/shortcuts/32.png\","
+        + "customName: \"My Application\","
+        + "customMessage: \"Press the button to enable my "
+        + "application to run offline!\" };";
+
+    String argumentsSettings = "{ locale: \"en-US\", permissions: [ { "
+        + "name: \"http://www.google.com\", "
+        + "localStorage: { permissionState: 1 }, "
+        + "locationData: { permissionState: 0 } }, "
+        + "{ name: \"http://www.aaronboodman.com\", "
+        + "localStorage: { permissionState: 1 }, "
+        + "locationData: { permissionState: 2 } }, "
+        + "{ name: \"http://www.evil.org\", "
+        + "localStorage: { permissionState: 2 }, "
+        + "locationData: { permissionState: 2 } } ] }";
+
+    switch (mDialogType) {
+      case SHORTCUT_DIALOG:
+        mDialogArguments = argumentsShortcuts;
+        break;
+      case PERMISSION_DIALOG:
+        mDialogArguments = argumentsPermissions;
+        break;
+      case LOCATION_DIALOG:
+        mDialogArguments = argumentsLocation;
+        break;
+      case SETTINGS_DIALOG:
+        mDialogArguments = argumentsSettings;
+    }
+  }
+
+  /**
+   * Close the dialog and set the return string value.
+   */
+  private void closeDialog(int closingType) {
+    String ret = dialog.closeDialog(closingType);
+
+    if (mDebug) {
+      Log.v(TAG, "closeDialog ret value: " + ret);
+    }
+
+    NativeDialog.closeDialog(ret);
+    notifyEndOfDialog();
+    finish();
+  }
+
+  @Override
+  public void onDestroy() {
+    super.onDestroy();
+    // In case we reach this point without
+    // notifying NativeDialog, we do it now.
+    if (!mDialogDismissed) {
+      notifyEndOfDialog();
+    }
+  }
+
+  @Override
+  public void onPause(){
+    super.onPause();
+    if (!mDialogDismissed) {
+      closeDialog(GearsBaseDialog.CANCEL);
+    }
+  }
+
+  /**
+   * Signal to NativeDialog that we are done.
+   */
+  private void notifyEndOfDialog() {
+    NativeDialog.signalFinishedDialog();
+    mDialogDismissed = true;
+  }
+
+  /**
+   * Intercepts the back key to immediately notify
+   * NativeDialog that we are done.
+   */
+  public boolean dispatchKeyEvent(KeyEvent event) {
+    if (event.getKeyCode() ==  KeyEvent.KEYCODE_BACK && event.isDown()) {
+      closeDialog(GearsBaseDialog.CANCEL);
+    }
+    return super.dispatchKeyEvent(event);
+  }
+
+}
diff --git a/src/com/android/browser/GearsPermissions.java b/src/com/android/browser/GearsPermissions.java
new file mode 100644 (file)
index 0000000..cd46324
--- /dev/null
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.util.Log;
+
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * The permission mechanism works the following way:
+ *
+ * PermissionType allows to define a type of permission
+ *   (e.g. localStorage/locationData), storing a name and a set of
+ *   resource ids corresponding to the GUI resources.
+ *
+ * Permission defines an actual permission instance, with a type and a value.
+ *
+ * OriginPermissions holds an origin with a set of Permission objects
+ */
+class GearsPermissions {
+
+  private static final String TAG = "GearsPermissions";
+
+  /**
+   * Defines a type of permission
+   *
+   * Store the permission's name (used in the json result)
+   * Graphically, each permission is a label followed by two radio buttons.
+   * We store the resources ids here.
+   */
+  public static class PermissionType {
+    public static final int PERMISSION_NOT_SET = 0;
+    public static final int PERMISSION_ALLOWED = 1;
+    public static final int PERMISSION_DENIED = 2;
+
+    String mName;
+    int mRowRsc;
+    int mAllowedButtonRsc;
+    int mDeniedButtonRsc;
+
+    PermissionType(String name) {
+      mName = name;
+    }
+
+    public void setResources(int rowRsc, int allowedButtonRsc,
+        int deniedButtonRsc) {
+      mRowRsc = rowRsc;
+      mAllowedButtonRsc = allowedButtonRsc;
+      mDeniedButtonRsc = deniedButtonRsc;
+    }
+
+    public int getRowRsc() {
+      return mRowRsc;
+    }
+
+    public int getAllowedButtonRsc() {
+      return mAllowedButtonRsc;
+    }
+
+    public int getDeniedButtonRsc() {
+      return mDeniedButtonRsc;
+    }
+
+    public String getName() {
+      return mName;
+    }
+
+  }
+
+  /**
+   * Simple class to store an instance of a permission
+   *
+   * i.e. a permission type and a value
+   * Value can be either PERMISSION_NOT_SET,
+   * PERMISSION_ALLOWED or PERMISSION_DENIED
+   * (defined in PermissionType).
+   */
+  public static class Permission {
+    PermissionType mType;
+    int mValue;
+
+    Permission(PermissionType type, int value) {
+      mType = type;
+      mValue = value;
+    }
+
+    Permission(PermissionType type) {
+      mType = type;
+      mValue = 0;
+    }
+
+    public PermissionType getType() {
+      return mType;
+    }
+
+    public void setValue(int value) {
+      mValue = value;
+    }
+
+    public int getValue() {
+      return mValue;
+    }
+  }
+
+  /**
+   * Interface used by the GearsNativeDialog implementation
+   * to listen to changes in the permissions.
+   */
+  public interface PermissionsChangesListener {
+    public boolean setPermission(PermissionType type, int perm);
+  }
+
+  /**
+   * Holds the model for an origin -- each origin has a set of
+   * permissions.
+   */
+  public static class OriginPermissions {
+    HashMap<PermissionType, Permission> mPermissions;
+    String mOrigin;
+    public static PermissionsChangesListener mListener;
+
+    public static void setListener(PermissionsChangesListener listener) {
+      mListener = listener;
+    }
+
+    OriginPermissions(String anOrigin) {
+      mOrigin = anOrigin;
+      mPermissions = new HashMap<PermissionType, Permission>();
+    }
+
+    OriginPermissions(OriginPermissions perms) {
+      mOrigin = perms.getOrigin();
+      mPermissions = new HashMap<PermissionType, Permission>();
+      HashMap<PermissionType, Permission> permissions = perms.getPermissions();
+      Iterator<PermissionType> iterator = permissions.keySet().iterator();
+      while (iterator.hasNext()) {
+        Permission permission = permissions.get(iterator.next());
+        int value = permission.getValue();
+        setPermission(permission.getType(), value);
+      }
+    }
+
+    public String getOrigin() {
+      return mOrigin;
+    }
+
+    public HashMap<PermissionType, Permission> getPermissions() {
+      return mPermissions;
+    }
+
+    public int getPermission(PermissionType type) {
+      return mPermissions.get(type).getValue();
+    }
+
+    public void setPermission(PermissionType type, int perm) {
+      if (mPermissions.get(type) == null) {
+        Permission permission = new Permission(type, perm);
+        mPermissions.put(type, permission);
+        return;
+      }
+
+      if (mListener != null) {
+        mListener.setPermission(type, perm);
+      }
+
+      mPermissions.get(type).setValue(perm);
+    }
+
+    public void print() {
+      Log.v(TAG, "Permissions for " + mOrigin);
+      Iterator<PermissionType> iterator = mPermissions.keySet().iterator();
+      while (iterator.hasNext()) {
+        Permission permission = mPermissions.get(iterator.next());
+        String name = permission.getType().getName();
+        int value = permission.getValue();
+        Log.v(TAG, "  " + name + ": " + value);
+      }
+    }
+  }
+
+}
diff --git a/src/com/android/browser/GearsPermissionsDialog.java b/src/com/android/browser/GearsPermissionsDialog.java
new file mode 100644 (file)
index 0000000..b57ab0b
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.Activity;
+import android.os.Handler;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * Gears permission dialog
+ */
+class GearsPermissionsDialog extends GearsBaseDialog {
+
+  private static final String TAG = "GearsPermissionsDialog";
+
+  private String mDialogType;
+
+  public GearsPermissionsDialog(Activity activity,
+                                Handler handler,
+                                String arguments) {
+    super (activity, handler, arguments);
+  }
+
+  public void setup() {
+    inflate(R.layout.gears_dialog_permission, R.id.panel_content);
+    setupButtons(R.string.permission_button_alwaysdeny,
+                 R.string.permission_button_allow,
+                 R.string.permission_button_deny);
+
+    View contentBorder = findViewById(R.id.content_border);
+    if (contentBorder != null) {
+      contentBorder.setBackgroundResource(R.color.permission_border);
+    }
+    View contentBackground = findViewById(R.id.content_background);
+    if (contentBackground != null) {
+      contentBackground.setBackgroundResource(R.color.permission_background);
+    }
+
+    try {
+      JSONObject json = new JSONObject(mDialogArguments);
+
+      if (json.has("dialogType")) {
+        mDialogType = json.getString("dialogType");
+        setupDialog();
+      }
+
+      if (!json.has("customName")) {
+        setLabel(json, "origin", R.id.origin_title);
+        View titleView = findViewById(R.id.origin_title);
+        if (titleView != null) {
+          TextView title = (TextView) titleView;
+          title.setGravity(Gravity.CENTER);
+        }
+      } else {
+        setLabel(json, "customName", R.id.origin_title);
+        setLabel(json, "origin", R.id.origin_subtitle);
+        setLabel(json, "customMessage", R.id.origin_message);
+      }
+
+      if (json.has("customIcon")) {
+        String iconUrl = json.getString("customIcon");
+        mChoosenIconSize = 32;
+        downloadIcon(iconUrl);
+      }
+
+    } catch (JSONException e) {
+      Log.e(TAG, "JSON exception ", e);
+    }
+  }
+
+  public void setupDialog(TextView message, ImageView icon) {
+    if (mDialogType.equalsIgnoreCase(LOCAL_DATA_STRING)) {
+      message.setText(R.string.query_data_message);
+      icon.setImageResource(R.drawable.gears_local_data);
+    } else if (mDialogType.equalsIgnoreCase(LOCATION_DATA_STRING)) {
+      message.setText(R.string.location_message);
+      icon.setImageResource(R.drawable.gears_location_data);
+      View privacyPolicyLabel = findViewById(R.id.privacy_policy_label);
+      if (privacyPolicyLabel != null) {
+        privacyPolicyLabel.setVisibility(View.VISIBLE);
+      }
+    }
+  }
+
+  public String closeDialog(int closingType) {
+    String ret = null;
+    switch (closingType) {
+      case ALWAYS_DENY:
+        ret = "{\"allow\": false, \"permanently\": true }";
+        break;
+      case ALLOW:
+        ret = "{\"allow\": true, \"permanently\": true }";
+        break;
+      case DENY:
+        ret = "{\"allow\": false, \"permanently\": false }";
+        break;
+    }
+    return ret;
+  }
+
+}
diff --git a/src/com/android/browser/GearsSettingsDialog.java b/src/com/android/browser/GearsSettingsDialog.java
new file mode 100644 (file)
index 0000000..dead4f2
--- /dev/null
@@ -0,0 +1,500 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Handler;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.CompoundButton;
+import android.widget.ImageView;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.RadioButton;
+import android.widget.TextView;
+
+import com.android.browser.GearsPermissions.OriginPermissions;
+import com.android.browser.GearsPermissions.PermissionsChangesListener;
+import com.android.browser.GearsPermissions.PermissionType;
+
+import java.util.Vector;
+import java.util.List;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * Gears Settings dialog
+ */
+class GearsSettingsDialog extends GearsBaseDialog
+    implements PermissionsChangesListener {
+
+  private static final String TAG = "GearsPermissionsDialog";
+  private Vector<OriginPermissions> mSitesPermissions = null;
+  private Vector<OriginPermissions> mOriginalPermissions = null;
+  private Vector<OriginPermissions> mCurrentPermissions = null;
+
+  private Vector<PermissionType> mPermissions;
+
+  // We declare the permissions globally to simplify the code
+  private final PermissionType LOCAL_STORAGE =
+      new PermissionType(LOCAL_STORAGE_STRING);
+  private final PermissionType LOCATION_DATA =
+      new PermissionType(LOCATION_DATA_STRING);
+
+  private boolean mChanges = false;
+
+
+  public GearsSettingsDialog(Activity activity,
+                             Handler handler,
+                             String arguments) {
+    super (activity, handler, arguments);
+  }
+
+  public void setup() {
+    // First let's add the permissions' resources
+    LOCAL_STORAGE.setResources(R.id.local_storage_choice,
+       R.id.local_storage_allowed,
+       R.id.local_storage_denied);
+
+    LOCATION_DATA.setResources(R.id.location_data_choice,
+       R.id.location_data_allowed,
+       R.id.location_data_denied);
+
+    // add the permissions to the list of permissions.
+    mPermissions = new Vector<PermissionType>();
+    mPermissions.add(LOCAL_STORAGE);
+    mPermissions.add(LOCATION_DATA);
+    OriginPermissions.setListener(this);
+
+
+    inflate(R.layout.gears_dialog_settings, R.id.panel_content);
+    setupDialog();
+    setupButtons(0,
+                 R.string.settings_button_allow,
+                 R.string.settings_button_deny);
+
+    // by default disable the allow button (it will get enabled if
+    // something is changed by the user)
+    View buttonView = findViewById(R.id.button_allow);
+    if (buttonView != null) {
+      Button button = (Button) buttonView;
+      button.setEnabled(false);
+    }
+
+    View gearsVersionView = findViewById(R.id.gears_version);
+    if (gearsVersionView != null) {
+      TextView gearsVersion = (TextView) gearsVersionView;
+      gearsVersion.setText(mGearsVersion);
+    }
+
+    // We manage the permissions using three vectors, mSitesPermissions,
+    // mOriginalPermissions and mCurrentPermissions.
+    // The dialog's arguments are parsed and a list of permissions is
+    // generated and stored in those three vectors.
+    // mOriginalPermissions is a separate copy and will not be modified;
+    // mSitesPermissions contains the current permissions _only_ --
+    // if an origin is removed, it is also removed from mSitesPermissions.
+    // Finally, mCurrentPermissions contains the current permissions and
+    // is a clone of mSitesPermissions, but removed sites aren't removed,
+    // their permissions are simply set to PERMISSION_NOT_SET. This
+    // allows us to easily generate the final difference between the
+    // original permissions and the final permissions, while directly
+    // using mSitesPermissions for the listView adapter (SettingsAdapter).
+
+    mSitesPermissions = new Vector<OriginPermissions>();
+    mOriginalPermissions = new Vector<OriginPermissions>();
+
+    try {
+      JSONObject json = new JSONObject(mDialogArguments);
+      if (json.has("permissions")) {
+        JSONArray jsonArray = json.getJSONArray("permissions");
+        for (int i = 0; i < jsonArray.length(); i++) {
+          JSONObject infos = jsonArray.getJSONObject(i);
+          String name = null;
+          int localStorage = PermissionType.PERMISSION_NOT_SET;
+          int locationData = PermissionType.PERMISSION_NOT_SET;
+          if (infos.has("name")) {
+            name = infos.getString("name");
+          }
+          if (infos.has(LOCAL_STORAGE_STRING)) {
+            JSONObject perm = infos.getJSONObject(LOCAL_STORAGE_STRING);
+            if (perm.has("permissionState")) {
+              localStorage = perm.getInt("permissionState");
+            }
+          }
+          if (infos.has(LOCATION_DATA_STRING)) {
+            JSONObject perm = infos.getJSONObject(LOCATION_DATA_STRING);
+            if (perm.has("permissionState")) {
+              locationData = perm.getInt("permissionState");
+            }
+          }
+          OriginPermissions perms = new OriginPermissions(name);
+          perms.setPermission(LOCAL_STORAGE, localStorage);
+          perms.setPermission(LOCATION_DATA, locationData);
+
+          mSitesPermissions.add(perms);
+          mOriginalPermissions.add(new OriginPermissions(perms));
+        }
+      }
+    } catch (JSONException e) {
+      Log.e(TAG, "JSON exception ", e);
+    }
+    mCurrentPermissions = (Vector<OriginPermissions>)mSitesPermissions.clone();
+
+    View listView = findViewById(R.id.sites_list);
+    if (listView != null) {
+      ListView list = (ListView) listView;
+      list.setAdapter(new SettingsAdapter(mActivity, mSitesPermissions));
+    }
+    if (mDebug) {
+      printPermissions();
+    }
+  }
+
+  public void setupDialog() {
+    View dialogTitleView = findViewById(R.id.dialog_title);
+    if (dialogTitleView != null) {
+      TextView dialogTitle = (TextView) dialogTitleView;
+      dialogTitle.setText(R.string.settings_title);
+      dialogTitle.setVisibility(View.VISIBLE);
+    }
+    View dialogSubtitleView = findViewById(R.id.dialog_subtitle);
+    if (dialogSubtitleView != null) {
+      TextView dialogSubtitle = (TextView) dialogSubtitleView;
+      dialogSubtitle.setText(R.string.settings_message);
+      dialogSubtitle.setVisibility(View.VISIBLE);
+    }
+    View iconView = findViewById(R.id.icon);
+    if (iconView != null) {
+      ImageView icon = (ImageView) iconView;
+      icon.setImageResource(R.drawable.gears_icon_32x32);
+    }
+  }
+
+  /**
+   * GearsPermissions.PermissionsChangesListener delegate
+   */
+  public boolean setPermission(PermissionType type, int perm) {
+    if (mChanges == false) {
+      signalChanges();
+    }
+    return mChanges;
+  }
+
+  /**
+   * Controller class for binding the model (OriginPermissions) with
+   * the UI.
+   */
+  class PermissionController {
+    final static int ALLOWED_BUTTON = 1;
+    final static int DENIED_BUTTON = 2;
+    private int mButtonType;
+    private PermissionType mPermissionType;
+    private OriginPermissions mPermissions;
+
+    PermissionController(PermissionType permissionType, int buttonType,
+        OriginPermissions permissions) {
+      mPermissionType = permissionType;
+      mButtonType = buttonType;
+      mPermissions = permissions;
+    }
+
+    public boolean isChecked() {
+      boolean checked = false;
+
+      switch (mButtonType) {
+        case ALLOWED_BUTTON:
+          if (mPermissions.getPermission(mPermissionType) ==
+              PermissionType.PERMISSION_ALLOWED) {
+            checked = true;
+          } break;
+        case DENIED_BUTTON:
+          if (mPermissions.getPermission(mPermissionType) ==
+              PermissionType.PERMISSION_DENIED) {
+            checked = true;
+          }
+      }
+      return checked;
+    }
+
+    public String print() {
+        return printType() + " for " + mPermissions.getOrigin();
+    }
+
+    private String printType() {
+      switch (mButtonType) {
+        case ALLOWED_BUTTON:
+          return "ALLOWED_BUTTON";
+        case DENIED_BUTTON:
+          return "DENIED_BUTTON";
+      }
+      return "UNKNOWN BUTTON";
+    }
+
+    public void changed(boolean isChecked) {
+      if (isChecked == isChecked()) {
+        return; // already set
+      }
+
+      switch (mButtonType) {
+        case ALLOWED_BUTTON:
+          mPermissions.setPermission(mPermissionType,
+              PermissionType.PERMISSION_ALLOWED);
+          break;
+        case DENIED_BUTTON:
+          mPermissions.setPermission(mPermissionType,
+              PermissionType.PERMISSION_DENIED);
+          break;
+      }
+    }
+  }
+
+
+
+  /**
+   * Adapter class for the list view in the settings dialog
+   *
+   * Every row in the settings dialog display the permissions
+   * for a given origin. For every type of permission
+   * (location, local data...) there is two radio buttons to
+   * authorize or deny the permission.
+   * A remove button is also present to let the user remove
+   * all the authorization of an origin in one step.
+   */
+  class SettingsAdapter extends ArrayAdapter {
+    private Activity mContext;
+    private List mItems;
+
+    SettingsAdapter(Activity context, List items) {
+      super(context, R.layout.gears_dialog_settings_row, items);
+      mContext = context;
+      mItems = items;
+    }
+
+    /*
+     * setup the necessary listeners for the radiobuttons
+     * When the buttons are clicked the permissions change.
+     */
+    private void createAndSetButtonListener(View buttonView,
+        OriginPermissions perms, PermissionType permissionType,
+        int buttonType) {
+      if (buttonView == null) {
+        return;
+      }
+      RadioButton button = (RadioButton) buttonView;
+
+      button.setOnCheckedChangeListener(null);
+      PermissionController p = new PermissionController(permissionType,
+          buttonType, perms);
+      button.setTag(p);
+
+      CompoundButton.OnCheckedChangeListener listener =
+          new CompoundButton.OnCheckedChangeListener() {
+        public void onCheckedChanged(CompoundButton buttonView,
+            boolean isChecked) {
+          PermissionController perm = (PermissionController)buttonView.getTag();
+          perm.changed(isChecked);
+        }
+      };
+
+      button.setOnCheckedChangeListener(listener);
+
+      if (p.isChecked() != button.isChecked()) {
+        button.setChecked(p.isChecked());
+      }
+    }
+
+    /*
+     * setup the remove button for an origin: each row has a global
+     * remove button in addition to the radio buttons controlling the
+     * permissions.
+     */
+    private void setRemoveButton(Button button, OriginPermissions perms) {
+      Button.OnClickListener listener = new Button.OnClickListener() {
+        public void onClick(View buttonView) {
+          if (mChanges == false) {
+            signalChanges();
+          }
+          OriginPermissions perm = (OriginPermissions) buttonView.getTag();
+          perm.setPermission(LOCAL_STORAGE, PermissionType.PERMISSION_NOT_SET);
+          perm.setPermission(LOCATION_DATA, PermissionType.PERMISSION_NOT_SET);
+          mSitesPermissions.remove(perm);
+
+          View view = findViewById(R.id.sites_list);
+          if (view != null) {
+            ListView listView = (ListView) view;
+            ListAdapter listAdapter = listView.getAdapter();
+            if (listAdapter != null) {
+              SettingsAdapter settingsAdapter = (SettingsAdapter) listAdapter;
+              settingsAdapter.notifyDataSetChanged();
+            }
+          }
+        }
+      };
+      button.setTag(perms);
+      button.setOnClickListener(listener);
+    }
+
+    public View getView(int position, View convertView, ViewGroup parent) {
+      View row = convertView;
+      if (row == null) { // no cached view, we create one
+        LayoutInflater inflater = (LayoutInflater) getSystemService(
+            Context.LAYOUT_INFLATER_SERVICE);
+        row = inflater.inflate(R.layout.gears_dialog_settings_row, null);
+      }
+
+      OriginPermissions perms = (OriginPermissions) mItems.get(position);
+
+      View nameView = row.findViewById(R.id.origin_name);
+      if (nameView != null) {
+        TextView originName = (TextView) nameView;
+        originName.setText(perms.getOrigin());
+      }
+
+      View removeButtonView = row.findViewById(R.id.origin_remove);
+      if (removeButtonView != null) {
+        Button removeButton = (Button) removeButtonView;
+        setRemoveButton(removeButton, perms);
+      }
+
+      for (int i = 0; i < mPermissions.size(); i++) {
+        PermissionType type = mPermissions.get(i);
+        int rowRsc = type.getRowRsc();
+        int allowedButtonRsc = type.getAllowedButtonRsc();
+        int deniedButtonRsc = type.getDeniedButtonRsc();
+
+        View rowView = row.findViewById(rowRsc);
+        if (rowView != null) {
+          int perm = perms.getPermission(type);
+          if (perm != PermissionType.PERMISSION_NOT_SET) {
+            createAndSetButtonListener(row.findViewById(allowedButtonRsc),
+                perms, type, PermissionController.ALLOWED_BUTTON);
+            createAndSetButtonListener(row.findViewById(deniedButtonRsc),
+                perms, type, PermissionController.DENIED_BUTTON);
+            rowView.setVisibility(View.VISIBLE);
+          } else {
+            rowView.setVisibility(View.GONE);
+          }
+        }
+      }
+
+      return row;
+    }
+  }
+
+  /**
+   * Utility method used in debug mode to print the list of
+   * permissions (original values and current values).
+   */
+  public void printPermissions() {
+    Log.v(TAG, "Original Permissions: ");
+    for (int i = 0; i < mOriginalPermissions.size(); i++) {
+      OriginPermissions p = mOriginalPermissions.get(i);
+      p.print();
+    }
+    Log.v(TAG, "Current Permissions: ");
+    for (int i = 0; i < mSitesPermissions.size(); i++) {
+      OriginPermissions p = mSitesPermissions.get(i);
+      p.print();
+    }
+  }
+
+  /**
+   * Utility method used by the settings dialog, signaling
+   * the user the settings have been modified.
+   * We reflect this by enabling the Allow button (disabled
+   * by default).
+   */
+  public void signalChanges() {
+    View view = findViewById(R.id.button_allow);
+    if (view != null) {
+      Button button = (Button) view;
+      button.setEnabled(true);
+    }
+    mChanges = true;
+  }
+
+  /**
+   * Computes the difference between the original permissions and the
+   * current ones. Returns a json-formatted string.
+   * It is used by the Settings dialog.
+   */
+  public String computeDiff(boolean modif) {
+    String ret = null;
+    try {
+      JSONObject results = new JSONObject();
+      JSONArray permissions = new JSONArray();
+
+      for (int i = 0; modif && i < mOriginalPermissions.size(); i++) {
+        OriginPermissions original = mOriginalPermissions.get(i);
+        OriginPermissions current = mCurrentPermissions.get(i);
+        JSONObject permission = new JSONObject();
+        boolean modifications = false;
+
+        for (int j = 0; j < mPermissions.size(); j++) {
+          PermissionType type = mPermissions.get(j);
+
+          if (current.getPermission(type) != original.getPermission(type)) {
+            JSONObject state = new JSONObject();
+            state.put("permissionState", current.getPermission(type));
+            permission.put(type.getName(), state);
+            modifications = true;
+          }
+        }
+
+        if (modifications) {
+          permission.put("name", current.getOrigin());
+          permissions.put(permission);
+        }
+      }
+      results.put("modifiedOrigins", permissions);
+      ret = results.toString();
+    } catch (JSONException e) {
+      Log.e(TAG, "JSON exception ", e);
+    }
+    return ret;
+  }
+
+  public String closeDialog(int closingType) {
+    String ret = null;
+    switch (closingType) {
+      case ALWAYS_DENY:
+        ret = "{\"allow\": false }";
+        break;
+      case ALLOW:
+        ret = computeDiff(true);
+        break;
+      case DENY:
+        ret = computeDiff(false);
+        break;
+    }
+
+    if (mDebug) {
+      printPermissions();
+    }
+
+    return ret;
+  }
+
+}
diff --git a/src/com/android/browser/GearsShortcutDialog.java b/src/com/android/browser/GearsShortcutDialog.java
new file mode 100644 (file)
index 0000000..deede12
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.Activity;
+import android.os.Handler;
+import android.util.Log;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * Gears Shortcut dialog
+ */
+class GearsShortcutDialog extends GearsBaseDialog {
+
+  private static final String TAG = "GearsPermissionsDialog";
+
+  private final String ICON_16 = "icon16x16";
+  private final String ICON_32 = "icon32x32";
+  private final String ICON_48 = "icon48x48";
+  private final String ICON_128 = "icon128x128";
+
+  public GearsShortcutDialog(Activity activity,
+                             Handler handler,
+                             String arguments) {
+    super (activity, handler, arguments);
+  }
+
+  public void setup() {
+    inflate(R.layout.gears_dialog_permission, R.id.panel_content);
+    setupButtons(R.string.shortcut_button_alwaysdeny,
+                 R.string.shortcut_button_allow,
+                 R.string.shortcut_button_deny);
+
+    View contentBorder = findViewById(R.id.content_border);
+    if (contentBorder != null) {
+      contentBorder.setBackgroundResource(R.color.shortcut_border);
+    }
+    View contentBackground = findViewById(R.id.content_background);
+    if (contentBackground != null) {
+      contentBackground.setBackgroundResource(R.color.shortcut_background);
+    }
+
+    try {
+      JSONObject json = new JSONObject(mDialogArguments);
+
+      String iconUrl = pickIconToRender(json);
+      if (iconUrl != null) {
+        downloadIcon(iconUrl);
+      }
+
+      setupDialog();
+
+      setLabel(json, "name", R.id.origin_title);
+      setLabel(json, "link", R.id.origin_subtitle);
+      setLabel(json, "description", R.id.origin_message);
+    } catch (JSONException e) {
+      Log.e(TAG, "JSON exception", e);
+    }
+  }
+
+  public void setupDialog(TextView message, ImageView icon) {
+    message.setText(R.string.shortcut_message);
+    icon.setImageResource(R.drawable.gears_icon_48x48);
+  }
+
+  /**
+   * Utility method to validate an icon url. Used in the
+   * shortcut dialog.
+   */
+  boolean validIcon(JSONObject json, String name) {
+    try {
+      if (json.has(name)) {
+        String str = json.getString(name);
+        if (str.length() > 0) {
+          return true;
+        }
+      }
+    } catch (JSONException e) {
+      Log.e(TAG, "JSON exception", e);
+    }
+    return false;
+  }
+
+
+  /**
+   * Utility method to pick the best indicated icon
+   * from the dialogs' arguments. Used in the
+   * shortcut dialog.
+   */
+  String pickIconToRender(JSONObject json) {
+    try {
+      if (validIcon(json, ICON_48)) { // ideal size
+        mChoosenIconSize = 48;
+        return json.getString(ICON_48);
+      } else if (validIcon(json, ICON_32)) {
+        mChoosenIconSize = 32;
+        return json.getString(ICON_32);
+      } else if (validIcon(json, ICON_128)) {
+        mChoosenIconSize = 128;
+        return json.getString(ICON_128);
+      } else if (validIcon(json, ICON_16)) {
+        mChoosenIconSize = 16;
+        return json.getString(ICON_16);
+      }
+    } catch (JSONException e) {
+      Log.e(TAG, "JSON exception", e);
+    }
+    mChoosenIconSize = 0;
+    return null;
+  }
+
+  public String closeDialog(int closingType) {
+    String ret = null;
+    switch (closingType) {
+      case ALWAYS_DENY:
+        ret = "{\"allow\": false, \"permanently\": true }";
+        break;
+      case ALLOW:
+        ret = "{\"allow\": true, \"locations\": 0 }";
+        break;
+      case DENY:
+        ret = null;
+        break;
+    }
+    return ret;
+  }
+
+}
index e6eaa75..b4c1209 100644 (file)
 package com.android.browser;
 
 import android.app.AlertDialog;
+import android.content.Context;
 import android.content.DialogInterface;
+import android.content.res.Configuration;
+import android.content.res.Resources;
 import android.database.DataSetObserver;
 import android.graphics.Color;
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.LayoutInflater;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.content.res.Resources;
 import android.webkit.WebView;
-import android.widget.*;
+import android.widget.ImageView;
+import android.widget.ListAdapter;
+import android.widget.TextView;
 
 import java.util.ArrayList;
 
@@ -38,31 +40,25 @@ import java.util.ArrayList;
 public class ImageAdapter implements ListAdapter {
     
     ArrayList<TabControl.Tab> mItems;  // Items shown in the grid
-    ArrayList<DataSetObserver> mDataObservers; // Data change listeners
-    Context mContext;  // Context to use to inflate views
-    boolean mMaxedOut;
-    boolean mLandScape;
-    ImageGrid mImageGrid;
-    boolean mIsLive;
+    private ArrayList<DataSetObserver> mDataObservers; // Data change listeners
+    private Context mContext;  // Context to use to inflate views
+    private boolean mMaxedOut;
+    private ImageGrid mImageGrid;
+    private boolean mIsLive;
+    private int mTabHeight;
 
-    ImageAdapter(Context context, ImageGrid grid,
-            ArrayList<TabControl.Tab> items, boolean live) {
+    ImageAdapter(Context context, ImageGrid grid, boolean live) {
         mContext = context;
         mIsLive = live;
-        if (items == null) {
-            mItems = new ArrayList<TabControl.Tab>();
-        } else {
-            mItems = items;
-            if (items.size() == TabControl.MAX_TABS) {
-                mMaxedOut = true;
-            }
-        }
+        mItems = new ArrayList<TabControl.Tab>();
         mImageGrid = grid;
         mDataObservers = new ArrayList<DataSetObserver>();
-        mLandScape = context.getResources().getConfiguration().orientation ==
-                Configuration.ORIENTATION_LANDSCAPE;
     }
-    
+
+    void heightChanged(int newHeight) {
+        mTabHeight = newHeight;
+    }
+
     /**
      *  Whether the adapter is at its limit, determined by TabControl.MAX_TABS
      *
@@ -197,9 +193,9 @@ public class ImageAdapter implements ListAdapter {
             TabControl.Tab t = mItems.get(position);
             img.setTab(t);
             tv.setText(t.getTitle());
-            // Do not put the 'X' for a single tab or if the tab picker isn't
-            // "live" (meaning the user cannot click on a tab)
-            if (mItems.size() == 1 || !mIsLive) {
+            // Do not put the 'X' if the tab picker isn't "live" (meaning the
+            // user cannot click on a tab)
+            if (!mIsLive) {
                 close.setVisibility(View.GONE);
             } else {
                 close.setVisibility(View.VISIBLE);
@@ -218,10 +214,9 @@ public class ImageAdapter implements ListAdapter {
             tv.setText(R.string.new_window);
             close.setVisibility(View.GONE);
         }
-        if (mLandScape) {
-            ViewGroup.LayoutParams lp = img.getLayoutParams();
-            lp.width = 225;
-            lp.height = 120;
+        ViewGroup.LayoutParams lp = img.getLayoutParams();
+        if (lp.height != mTabHeight) {
+            lp.height = mTabHeight;
             img.requestLayout();
         }
         return v;
@@ -245,7 +240,7 @@ public class ImageAdapter implements ListAdapter {
                 };
         new AlertDialog.Builder(mContext)
                 .setTitle(R.string.close)
-                .setIcon(R.drawable.ssl_icon)
+                .setIcon(android.R.drawable.ic_dialog_alert)
                 .setMessage(R.string.close_window)
                 .setPositiveButton(R.string.ok, confirm)
                 .setNegativeButton(R.string.cancel, null)
@@ -257,7 +252,6 @@ public class ImageAdapter implements ListAdapter {
      */
     public void registerDataSetObserver(DataSetObserver observer) {
         mDataObservers.add(observer);
-
     }
 
     /* (non-Javadoc)
@@ -272,9 +266,8 @@ public class ImageAdapter implements ListAdapter {
      */
     public void unregisterDataSetObserver(DataSetObserver observer) {
         mDataObservers.remove(observer);
-
     }
-    
+
     /**
      * Notify all the observers that a change has happened.
      */
index e0a5c89..9eccb16 100644 (file)
@@ -39,6 +39,7 @@ class ImageGrid extends GridView implements OnItemClickListener,
     private Listener     mListener;
     private ImageAdapter mAdapter;
     private boolean      mIsLive;
+    private static final int SPACING = 10;
     public static final int CANCEL  = -99;
     public static final int NEW_TAB = -1;
 
@@ -58,23 +59,18 @@ class ImageGrid extends GridView implements OnItemClickListener,
             setOnItemClickListener(this);
             setOnCreateContextMenuListener(this);
         }
-        if (Config.DEBUG && l == null) {
-            throw new AssertionError();
-        }
         mListener = l;
 
-        mAdapter = new ImageAdapter(context, this, null, live);
+        mAdapter = new ImageAdapter(context, this, live);
         setAdapter(mAdapter);
 
-        // android.R.color.window_background seems to return transparent?
-//        setBackgroundColor(android.R.color.window_background);
         setBackgroundColor(0xFF000000);
 
-        setPadding(0, 10, 0, 10);
-        setVerticalSpacing(10);
-        setHorizontalSpacing(10);
+        setVerticalSpacing(SPACING);
+        setHorizontalSpacing(SPACING);
         setNumColumns(2);
         setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
+        setSelector(android.R.drawable.gallery_thumb);
     }
 
     @Override
@@ -189,11 +185,6 @@ class ImageGrid extends GridView implements OnItemClickListener,
                 position--;
             }
             menu.setHeaderTitle(mAdapter.mItems.get(position).getTitle());
-
-            // If we only have one active tab left, don't add the remove option
-            if (mAdapter.mItems.size() <= 1) {
-                menu.findItem(R.id.remove_tab_menu_id).setVisible(false);
-            }
         }
     }
 
@@ -212,10 +203,13 @@ class ImageGrid extends GridView implements OnItemClickListener,
     
     @Override
     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        // Called when our orientation changes.  Replace the adapter with one
-        // that has the appropriate dimensions.
-        mAdapter = new ImageAdapter(mContext, this, mAdapter.mItems, mIsLive);
-        setAdapter(mAdapter);
+        // Called when our orientation changes. Tell the adapter about the new
+        // size. Compute the individual tab height by taking the grid height
+        // and subtracting the SPACING. Then subtract the list padding twice
+        // (once for each tab on screen) and divide the remaining height by 2.
+        int tabHeight = (h - SPACING
+                - 2 * (getListPaddingTop() + getListPaddingBottom())) / 2;
+        mAdapter.heightChanged(tabHeight);
         super.onSizeChanged(w, h, oldw, oldh);
     }
 
index 66adf3c..01ef3a8 100644 (file)
@@ -35,6 +35,7 @@ import android.webkit.WebViewClient;
 import android.widget.FrameLayout;
 import android.widget.ImageButton;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Vector;
 
@@ -169,9 +170,12 @@ class TabControl {
         // children.
         private Vector<Tab> mChildTabs;
 
+        private Boolean mCloseOnExit;
+
         // Construct a new tab
-        private Tab(WebView w) {
+        private Tab(WebView w, boolean closeOnExit) {
             mMainView = w;
+            mCloseOnExit = closeOnExit;
         }
 
         /**
@@ -236,6 +240,17 @@ class TabControl {
 
         private void setParentTab(Tab parent) {
             mParentTab = parent;
+            // This tab may have been freed due to low memory. If that is the
+            // case, the parent tab index is already saved. If we are changing
+            // that index (most likely due to removing the parent tab) we must
+            // update the parent tab index in the saved Bundle.
+            if (mSavedState != null) {
+                if (parent == null) {
+                    mSavedState.remove(PARENTTAB);
+                } else {
+                    mSavedState.putInt(PARENTTAB, getTabIndex(parent));
+                }
+            }
         }
         
         /**
@@ -273,8 +288,20 @@ class TabControl {
         public Tab getParentTab() {
             return mParentTab;
         }
+
+        /**
+         * Return whether this tab should be closed when it is backing out of
+         * the first page.
+         * @return TRUE if this tab should be closed when exit.
+         */
+        public boolean closeOnExit() {
+            return mCloseOnExit;
+        }
     };
 
+    // Directory to store thumbnails for each WebView.
+    private final File mThumbnailDir;
+
     /**
      * Construct a new TabControl object that interfaces with the given
      * BrowserActivity instance.
@@ -286,6 +313,15 @@ class TabControl {
         mInflateService =
                 ((LayoutInflater) activity.getSystemService(
                         Context.LAYOUT_INFLATER_SERVICE));
+        mThumbnailDir = activity.getDir("thumbnails", 0);
+    }
+
+    File getThumbnailDir() {
+        return mThumbnailDir;
+    }
+
+    BrowserActivity getBrowserActivity() {
+        return mActivity;
     }
 
     /**
@@ -368,7 +404,7 @@ class TabControl {
      * @return The newly createTab or null if we have reached the maximum
      *         number of open tabs.
      */
-    Tab createNewTab() {
+    Tab createNewTab(boolean closeOnExit) {
         int size = mTabs.size();
         // Return false if we have maxed out on tabs
         if (MAX_TABS == size) {
@@ -382,7 +418,7 @@ class TabControl {
         final BrowserSettings s = BrowserSettings.getInstance();
         s.addObserver(w.getSettings()).update(s, null);
         // Create a new tab and add it to the tab list
-        Tab t = new Tab(w);
+        Tab t = new Tab(w, closeOnExit);
         mTabs.add(t);
         return t;
     }
@@ -418,6 +454,26 @@ class TabControl {
         
         // Remove it from our list of tabs.
         mTabs.remove(t);
+
+        // The tab indices have shifted, update all the saved state so we point
+        // to the correct index.
+        for (Tab tab : mTabs) {
+            if (tab.mChildTabs != null) {
+                for (Tab child : tab.mChildTabs) {
+                    child.setParentTab(tab);
+                }
+            }
+        }
+
+
+        // This tab may have been pushed in to the background and then closed.
+        // If the saved state contains a picture file, delete the file.
+        if (t.mSavedState != null) {
+            if (t.mSavedState.containsKey("picture")) {
+                new File(t.mSavedState.getString("picture")).delete();
+            }
+        }
+
         // Remove it from the queue of viewed tabs.
         mTabQueue.remove(t);
         mCurrentTab = -1;
@@ -473,6 +529,8 @@ class TabControl {
     private static final String CURRTAB = "currentTab";
     private static final String CURRURL = "currentUrl";
     private static final String CURRTITLE = "currentTitle";
+    private static final String CLOSEONEXIT = "closeonexit";
+    private static final String PARENTTAB = "parentTab";
 
     /**
      * Save the state of all the Tabs.
@@ -506,7 +564,7 @@ class TabControl {
             final int currentTab = inState.getInt(CURRTAB, -1);
             for (int i = 0; i < numTabs; i++) {
                 if (i == currentTab) {
-                    Tab t = createNewTab();
+                    Tab t = createNewTab(false);
                     // Me must set the current tab before restoring the state
                     // so that all the client classes are set.
                     setCurrentTab(t);
@@ -518,7 +576,7 @@ class TabControl {
                 } else {
                     // Create a new tab and don't restore the state yet, add it
                     // to the tab list
-                    Tab t = new Tab(null);
+                    Tab t = new Tab(null, false);
                     t.mSavedState = inState.getBundle(WEBVIEW + i);
                     if (t.mSavedState != null) {
                         t.mUrl = t.mSavedState.getString(CURRURL);
@@ -528,6 +586,21 @@ class TabControl {
                     mTabQueue.add(t);
                 }
             }
+            // Rebuild the tree of tabs. Do this after all tabs have been
+            // created/restored so that the parent tab exists.
+            for (int i = 0; i < numTabs; i++) {
+                final Bundle b = inState.getBundle(WEBVIEW + i);
+                final Tab t = getTab(i);
+                if (b != null && t != null) {
+                    final int parentIndex = b.getInt(PARENTTAB, -1);
+                    if (parentIndex != -1) {
+                        final Tab parent = getTab(parentIndex);
+                        if (parent != null) {
+                            parent.addChildTab(t);
+                        }
+                    }
+                }
+            }
         }
         return true;
     }
@@ -801,9 +874,16 @@ class TabControl {
             }
             final Bundle b = new Bundle();
             final WebBackForwardList list = w.saveState(b);
+            if (list != null) {
+                final File f = new File(mThumbnailDir, w.hashCode()
+                        + "_pic.save");
+                if (w.savePicture(b, f)) {
+                    b.putString("picture", f.getPath());
+                }
+            }
 
             // Store some extra info for displaying the tab in the picker.
-            final WebHistoryItem item = 
+            final WebHistoryItem item =
                     list != null ? list.getCurrentItem() : null;
             populatePickerData(t, item);
             if (t.mUrl != null) {
@@ -812,6 +892,12 @@ class TabControl {
             if (t.mTitle != null) {
                 b.putString(CURRTITLE, t.mTitle);
             }
+            b.putBoolean(CLOSEONEXIT, t.mCloseOnExit);
+
+            // Remember the parent tab so the relationship can be restored.
+            if (t.mParentTab != null) {
+                b.putInt(PARENTTAB, getTabIndex(t.mParentTab));
+            }
 
             // Remember the saved state.
             t.mSavedState = b;
@@ -832,9 +918,15 @@ class TabControl {
         if (list == null) {
             return false;
         }
+        if (b.containsKey("picture")) {
+            final File f = new File(b.getString("picture"));
+            w.restorePicture(b, f);
+            f.delete();
+        }
         t.mSavedState = null;
         t.mUrl = null;
         t.mTitle = null;
+        t.mCloseOnExit = b.getBoolean(CLOSEONEXIT);
         return true;
     }
 }