From c677ae61d61061ae726292349e1839618b5471e9 Mon Sep 17 00:00:00 2001 From: Chris Pederick Date: Fri, 10 Mar 2017 14:37:48 -0800 Subject: [PATCH 1/4] Initial commit for porting the Firefox version over to a WebExtension --- configuration/chrome/configuration.properties | 4 +- configuration/chrome/manifest.json | 19 +- configuration/common/configuration.properties | 6 +- configuration/common/manifest-bottom.json | 3 + configuration/common/manifest-top.json | 12 + configuration/firefox/chrome.manifest | 17 - .../firefox/configuration.properties | 4 +- configuration/firefox/install.rdf | 65 -- configuration/firefox/manifest.json | 4 + configuration/opera/configuration.properties | 4 +- configuration/opera/manifest.json | 19 +- gulp/{chromium.js => build.js} | 215 ++-- gulp/chrome.js | 2 +- gulp/common.js | 2 +- gulp/firefox.js | 347 +----- gulp/lint.js | 15 +- gulp/opera.js | 2 +- images/chrome/icon-2x.png | Bin 1050 -> 0 bytes images/chrome/icon-color-2x.png | Bin 2031 -> 0 bytes images/chrome/icon-color.png | Bin 642 -> 0 bytes images/chrome/icon.png | Bin 515 -> 0 bytes images/{chrome => common}/feature-2x.png | Bin images/{chrome => common}/feature.png | Bin images/common/logos/24.png | Bin 0 -> 888 bytes images/common/logos/256.png | Bin 0 -> 75014 bytes images/common/logos/512.png | Bin 0 -> 235174 bytes images/common/logos/monochrome/128.png | Bin 0 -> 2455 bytes images/common/logos/monochrome/24.png | Bin 0 -> 490 bytes images/common/logos/monochrome/256.png | Bin 0 -> 4194 bytes images/common/logos/monochrome/48.png | Bin 0 -> 987 bytes images/common/logos/monochrome/512.png | Bin 0 -> 6137 bytes images/common/logos/monochrome/64.png | Bin 0 -> 1851 bytes images/{chrome => common}/options-2x.png | Bin images/{chrome => common}/options.png | Bin images/firefox/skins/default/close-2x.png | Bin 1729 -> 0 bytes images/firefox/skins/default/close.png | Bin 687 -> 0 bytes images/firefox/skins/default/dashboard-2x.png | Bin 11932 -> 0 bytes images/firefox/skins/default/dashboard.png | Bin 4337 -> 0 bytes images/firefox/skins/default/disabled-2x.png | Bin 2270 -> 0 bytes images/firefox/skins/default/disabled.png | Bin 888 -> 0 bytes images/firefox/skins/default/options-2x.png | Bin 39860 -> 0 bytes images/firefox/skins/default/options.png | Bin 12812 -> 0 bytes images/firefox/skins/default/statusbar-2x.png | Bin 5521 -> 0 bytes images/firefox/skins/default/statusbar.png | Bin 1913 -> 0 bytes .../firefox/skins/default/validation-2x.png | Bin 5155 -> 0 bytes images/firefox/skins/default/validation.png | Bin 1779 -> 0 bytes images/firefox/skins/mac/close-2x.png | Bin 375 -> 0 bytes images/firefox/skins/mac/close.png | Bin 174 -> 0 bytes images/firefox/skins/mac/dashboard-2x.png | Bin 2433 -> 0 bytes images/firefox/skins/mac/dashboard.png | Bin 1056 -> 0 bytes images/firefox/skins/mac/disabled-2x.png | Bin 585 -> 0 bytes images/firefox/skins/mac/disabled.png | Bin 278 -> 0 bytes images/firefox/skins/mac/statusbar-2x.png | Bin 1169 -> 0 bytes images/firefox/skins/mac/statusbar.png | Bin 513 -> 0 bytes images/firefox/skins/mac/toolbar-2x.png | Bin 3841 -> 0 bytes images/firefox/skins/mac/toolbar.png | Bin 1793 -> 0 bytes images/firefox/skins/mac/validation-2x.png | Bin 1060 -> 0 bytes images/firefox/skins/mac/validation.png | Bin 488 -> 0 bytes package.json | 3 +- source/chrome/javascript/common/common.js | 84 -- source/chrome/javascript/content/content.js | 145 --- source/chrome/javascript/cookies/cookies.js | 49 +- .../chrome/javascript/dashboard/dashboard.js | 173 --- .../chrome/javascript/dashboard/edit-css.js | 150 --- .../dashboard/element-information.js | 93 -- source/chrome/javascript/locales/locales.js | 15 - source/chrome/javascript/overlay/cookies.js | 329 ------ source/chrome/javascript/overlay/css.js | 263 ----- source/chrome/javascript/overlay/forms.js | 316 ----- source/chrome/javascript/overlay/images.js | 357 ------ .../chrome/javascript/overlay/information.js | 464 -------- source/chrome/javascript/overlay/options.js | 39 - source/chrome/javascript/overlay/resize.js | 274 ----- source/chrome/javascript/storage/storage.js | 189 --- .../javascript/toolbar/element-ancestors.js | 50 - .../chrome/javascript/toolbar/line-guides.js | 85 -- source/chrome/javascript/toolbar/ruler.js | 138 --- .../chrome/style-sheets/dashboard/common.css | 27 - .../style-sheets/toolbar/line-guides.css | 5 - source/chrome/style-sheets/toolbar/ruler.css | 4 - source/common/html/about/about.html | 8 +- .../html/background/background.html | 12 +- .../html/generated/find-broken-images.html | 14 +- .../html/generated/find-duplicate-ids.html | 14 +- .../generated/view-anchor-information.html | 14 +- .../generated/view-color-information.html | 14 +- .../generated/view-cookie-information.html | 26 +- source/common/html/generated/view-css.html | 22 +- .../html/generated/view-document-outline.html | 14 +- .../html/generated/view-form-information.html | 14 +- .../generated/view-image-information.html | 14 +- .../html/generated/view-javascript.html | 22 +- .../html/generated/view-link-information.html | 14 +- .../generated/view-meta-tag-information.html | 14 +- .../html/generated/view-response-headers.html | 14 +- .../generated/view-responsive-layouts.html | 14 +- .../html/options/options.html | 32 +- .../common/html/options/syntax-highlight.html | 16 +- .../html/overlay/overlay.html | 20 +- .../html/validation/css.html | 8 +- .../html/validation/html.html | 8 +- source/common/javascript/about/about.js | 1 - .../javascript/background/background.js | 9 +- source/common/javascript/common/common.js | 135 ++- source/common/javascript/common/css.js | 40 +- .../javascript/common/jquery/tablednd.js | 0 source/common/javascript/content/content.js | 184 ++- source/common/javascript/cookies/cookies.js | 49 + .../javascript/dashboard/common.js | 0 .../common/javascript/dashboard/dashboard.js | 172 ++- .../common/javascript/dashboard/edit-css.js | 149 ++- .../dashboard/element-information.js | 96 +- .../javascript/features/common.js | 2 +- source/common/javascript/features/css.js | 4 +- source/common/javascript/features/forms.js | 33 +- source/common/javascript/features/images.js | 38 +- .../common/javascript/features/information.js | 46 +- .../javascript/features/miscellaneous.js | 29 +- source/common/javascript/features/outline.js | 36 +- source/common/javascript/generated/common.js | 2 +- source/common/javascript/locales/locales.js | 12 + .../javascript/options/options.js | 9 - source/common/javascript/overlay/cookies.js | 326 ++++++ source/common/javascript/overlay/css.js | 260 +++++ source/common/javascript/overlay/forms.js | 313 +++++ source/common/javascript/overlay/images.js | 355 ++++++ .../common/javascript/overlay/information.js | 468 ++++++++ .../javascript/overlay/miscellaneous.js | 46 +- source/common/javascript/overlay/options.js | 38 +- .../javascript/overlay/outline.js | 2 +- .../javascript/overlay/overlay.js | 45 +- source/common/javascript/overlay/resize.js | 272 +++++ .../javascript/overlay/tools.js | 9 +- source/common/javascript/storage/storage.js | 180 +++ .../javascript/toolbar/color-picker.js | 4 +- .../javascript/toolbar/element-ancestors.js | 35 + .../common/javascript/toolbar/line-guides.js | 85 +- source/common/javascript/toolbar/ruler.js | 139 ++- .../javascript/upgrade/upgrade.js | 36 +- .../javascript/validation/css.js | 0 .../javascript/validation/html.js | 0 .../locales/en_US/messages.json | 25 +- source/common/style-sheets/about/about.css | 4 +- .../common/bootstrap/bootstrap.css.map | 1 + .../common/style-sheets/dashboard/common.css | 35 +- .../style-sheets/dashboard/dashboard.css | 0 .../dashboard/element-information.css | 6 - .../common/style-sheets/generated/common.css | 4 +- .../style-sheets/options/options.css | 6 +- .../style-sheets/overlay/overlay.css | 8 +- .../toolbar/color-picker-toolbar.css | 0 .../style-sheets/toolbar/color-picker.css | 0 .../style-sheets/toolbar/common.css | 0 .../style-sheets/toolbar/line-guides.css | 12 +- source/common/style-sheets/toolbar/ruler.css | 4 + .../style-sheets/toolbar/toolbar.css | 0 source/firefox/html/dashboard/edit-css.html | 25 - source/firefox/html/dashboard/edit-html.html | 28 - .../html/dashboard/element-information.html | 31 - .../html/dashboard/style-information.html | 29 - .../html/generated/view-document-size.html | 69 -- .../html/toolbar/element-ancestors.html | 20 - source/firefox/html/validation/css.html | 30 - source/firefox/html/validation/html.html | 29 - .../javascript/application/application.js | 207 ---- source/firefox/javascript/common/common.js | 495 -------- source/firefox/javascript/content/content.js | 118 -- source/firefox/javascript/cookies/cookies.js | 97 +- .../firefox/javascript/dashboard/dashboard.js | 253 ---- .../firefox/javascript/dashboard/edit-css.js | 464 -------- .../firefox/javascript/dashboard/edit-html.js | 273 ----- .../dashboard/element-information.js | 79 -- .../javascript/dashboard/html/common.js | 221 ---- .../javascript/dashboard/html/edit-css.js | 19 - .../dashboard/html/element-information.js | 22 - .../dashboard/html/style-information.js | 23 - .../javascript/dashboard/style-information.js | 338 ------ source/firefox/javascript/dialogs/cookie.js | 139 --- source/firefox/javascript/dialogs/message.js | 16 - .../dialogs/outline-custom-elements.js | 96 -- .../javascript/dialogs/resize-window.js | 89 -- source/firefox/javascript/features/images.js | 71 -- .../generated/view-document-size.js | 199 ---- source/firefox/javascript/locales/locales.js | 52 - .../javascript/options/dialogs/dialogs.js | 15 - .../javascript/options/dialogs/keyboard.js | 84 -- .../javascript/options/dialogs/resize.js | 37 - .../options/dialogs/responsive-layout.js | 30 - .../javascript/options/dialogs/tool.js | 98 -- .../options/dialogs/view-source-with.js | 67 -- source/firefox/javascript/options/options.js | 1015 ----------------- source/firefox/javascript/overlay/cookies.js | 124 -- source/firefox/javascript/overlay/css.js | 398 ------- source/firefox/javascript/overlay/disable.js | 239 ---- source/firefox/javascript/overlay/forms.js | 125 -- source/firefox/javascript/overlay/images.js | 279 ----- .../firefox/javascript/overlay/information.js | 264 ----- .../javascript/overlay/miscellaneous.js | 369 ------ source/firefox/javascript/overlay/options.js | 200 ---- source/firefox/javascript/overlay/outline.js | 156 --- source/firefox/javascript/overlay/overlay.js | 949 --------------- source/firefox/javascript/overlay/resize.js | 178 --- source/firefox/javascript/overlay/tools.js | 143 --- .../firefox/javascript/overlay/view-source.js | 147 --- .../javascript/preferences/defaults.js | 87 -- .../javascript/preferences/preferences.js | 261 ----- source/firefox/javascript/storage/storage.js | 119 -- .../javascript/toolbar/element-ancestors.js | 39 - .../firefox/javascript/toolbar/line-guides.js | 67 -- .../javascript/toolbar/page-magnifier.js | 195 ---- .../javascript/toolbar/page-validation.js | 370 ------ source/firefox/javascript/toolbar/ruler.js | 148 --- source/firefox/javascript/upgrade/upgrade.js | 237 ---- source/firefox/javascript/validation/css.js | 240 ---- source/firefox/javascript/validation/html.js | 255 ----- .../locales/cs-CZ/dashboard/dashboard.dtd | 16 - .../cs-CZ/dashboard/dashboard.properties | 24 - .../firefox/locales/cs-CZ/dialogs/cookie.dtd | 8 - .../locales/cs-CZ/dialogs/cookie.properties | 1 - .../firefox/locales/cs-CZ/dialogs/message.dtd | 2 - .../cs-CZ/dialogs/outline-custom-elements.dtd | 7 - .../locales/cs-CZ/dialogs/resize-window.dtd | 4 - .../cs-CZ/dialogs/resize-window.properties | 3 - .../firefox/locales/cs-CZ/options/options.dtd | 51 - .../locales/cs-CZ/options/options.properties | 36 - .../firefox/locales/cs-CZ/overlay/overlay.dtd | 442 ------- .../locales/cs-CZ/overlay/overlay.properties | 282 ----- .../locales/de/dashboard/dashboard.dtd | 22 - .../locales/de/dashboard/dashboard.properties | 29 - source/firefox/locales/de/dialogs/cookie.dtd | 9 - .../locales/de/dialogs/cookie.properties | 2 - source/firefox/locales/de/dialogs/message.dtd | 3 - .../de/dialogs/outline-custom-elements.dtd | 8 - .../locales/de/dialogs/resize-window.dtd | 5 - .../de/dialogs/resize-window.properties | 4 - source/firefox/locales/de/options/options.dtd | 62 - .../locales/de/options/options.properties | 49 - source/firefox/locales/de/overlay/overlay.dtd | 442 ------- .../locales/de/overlay/overlay.properties | 281 ----- .../locales/en-US/dashboard/dashboard.dtd | 25 - .../en-US/dashboard/dashboard.properties | 33 - .../firefox/locales/en-US/dialogs/cookie.dtd | 9 - .../locales/en-US/dialogs/cookie.properties | 2 - .../firefox/locales/en-US/dialogs/message.dtd | 3 - .../en-US/dialogs/outline-custom-elements.dtd | 8 - .../locales/en-US/dialogs/resize-window.dtd | 5 - .../en-US/dialogs/resize-window.properties | 4 - .../firefox/locales/en-US/options/options.dtd | 72 -- .../locales/en-US/options/options.properties | 53 - .../firefox/locales/en-US/overlay/overlay.dtd | 479 -------- .../locales/en-US/overlay/overlay.properties | 341 ------ .../locales/fr/dashboard/dashboard.dtd | 21 - .../locales/fr/dashboard/dashboard.properties | 29 - source/firefox/locales/fr/dialogs/cookie.dtd | 9 - .../locales/fr/dialogs/cookie.properties | 2 - source/firefox/locales/fr/dialogs/message.dtd | 3 - .../fr/dialogs/outline-custom-elements.dtd | 8 - .../locales/fr/dialogs/resize-window.dtd | 5 - .../fr/dialogs/resize-window.properties | 4 - source/firefox/locales/fr/options/options.dtd | 62 - .../locales/fr/options/options.properties | 49 - source/firefox/locales/fr/overlay/overlay.dtd | 442 ------- .../locales/fr/overlay/overlay.properties | 282 ----- .../locales/ja-JP/dashboard/dashboard.dtd | 21 - .../ja-JP/dashboard/dashboard.properties | 29 - .../firefox/locales/ja-JP/dialogs/cookie.dtd | 9 - .../locales/ja-JP/dialogs/cookie.properties | 2 - .../firefox/locales/ja-JP/dialogs/message.dtd | 3 - .../ja-JP/dialogs/outline-custom-elements.dtd | 8 - .../locales/ja-JP/dialogs/resize-window.dtd | 5 - .../ja-JP/dialogs/resize-window.properties | 4 - .../firefox/locales/ja-JP/options/options.dtd | 62 - .../locales/ja-JP/options/options.properties | 49 - .../firefox/locales/ja-JP/overlay/overlay.dtd | 442 ------- .../locales/ja-JP/overlay/overlay.properties | 282 ----- .../locales/pl-PL/dashboard/dashboard.dtd | 21 - .../pl-PL/dashboard/dashboard.properties | 29 - .../firefox/locales/pl-PL/dialogs/cookie.dtd | 9 - .../locales/pl-PL/dialogs/cookie.properties | 2 - .../firefox/locales/pl-PL/dialogs/message.dtd | 3 - .../pl-PL/dialogs/outline-custom-elements.dtd | 8 - .../locales/pl-PL/dialogs/resize-window.dtd | 5 - .../pl-PL/dialogs/resize-window.properties | 4 - .../firefox/locales/pl-PL/options/options.dtd | 62 - .../locales/pl-PL/options/options.properties | 49 - .../firefox/locales/pl-PL/overlay/overlay.dtd | 442 ------- .../locales/pl-PL/overlay/overlay.properties | 282 ----- .../locales/pt-BR/dashboard/dashboard.dtd | 16 - .../pt-BR/dashboard/dashboard.properties | 24 - .../firefox/locales/pt-BR/dialogs/cookie.dtd | 8 - .../locales/pt-BR/dialogs/cookie.properties | 1 - .../firefox/locales/pt-BR/dialogs/message.dtd | 2 - .../pt-BR/dialogs/outline-custom-elements.dtd | 7 - .../locales/pt-BR/dialogs/resize-window.dtd | 4 - .../pt-BR/dialogs/resize-window.properties | 3 - .../firefox/locales/pt-BR/options/options.dtd | 51 - .../locales/pt-BR/options/options.properties | 36 - .../firefox/locales/pt-BR/overlay/overlay.dtd | 404 ------- .../locales/pt-BR/overlay/overlay.properties | 221 ---- .../locales/sv-SE/dashboard/dashboard.dtd | 21 - .../sv-SE/dashboard/dashboard.properties | 29 - .../firefox/locales/sv-SE/dialogs/cookie.dtd | 9 - .../locales/sv-SE/dialogs/cookie.properties | 2 - .../firefox/locales/sv-SE/dialogs/message.dtd | 3 - .../sv-SE/dialogs/outline-custom-elements.dtd | 8 - .../locales/sv-SE/dialogs/resize-window.dtd | 5 - .../sv-SE/dialogs/resize-window.properties | 4 - .../firefox/locales/sv-SE/options/options.dtd | 62 - .../locales/sv-SE/options/options.properties | 49 - .../firefox/locales/sv-SE/overlay/overlay.dtd | 442 ------- .../locales/sv-SE/overlay/overlay.properties | 282 ----- .../locales/zh-CN/dashboard/dashboard.dtd | 25 - .../zh-CN/dashboard/dashboard.properties | 33 - .../firefox/locales/zh-CN/dialogs/cookie.dtd | 9 - .../locales/zh-CN/dialogs/cookie.properties | 2 - .../firefox/locales/zh-CN/dialogs/message.dtd | 3 - .../zh-CN/dialogs/outline-custom-elements.dtd | 8 - .../locales/zh-CN/dialogs/resize-window.dtd | 5 - .../zh-CN/dialogs/resize-window.properties | 4 - .../firefox/locales/zh-CN/options/options.dtd | 72 -- .../locales/zh-CN/options/options.properties | 54 - .../firefox/locales/zh-CN/overlay/overlay.dtd | 479 -------- .../locales/zh-CN/overlay/overlay.properties | 341 ------ .../style-sheets/dashboard/dashboard.css | 28 - .../style-sheets/dashboard/html/common.css | 2 - .../dashboard/html/style-information.css | 2 - .../firefox/style-sheets/dialogs/message.css | 5 - .../dialogs/outline-custom-elements.css | 2 - .../images/display-image-file-sizes.css | 1 - .../generated/view-document-size.css | 9 - .../firefox/style-sheets/options/options.css | 5 - .../firefox/style-sheets/overlay/overlay.css | 38 +- source/firefox/style-sheets/skin/common.css | 177 --- source/firefox/style-sheets/skin/mac.css | 102 -- source/firefox/xul/dashboard/edit-css.xul | 45 - source/firefox/xul/dashboard/edit-html.xul | 39 - .../xul/dashboard/element-information.xul | 20 - .../xul/dashboard/style-information.xul | 20 - source/firefox/xul/dialogs/cookie.xul | 52 - source/firefox/xul/dialogs/message.xul | 13 - .../xul/dialogs/outline-custom-elements.xul | 54 - source/firefox/xul/dialogs/resize-window.xul | 33 - .../firefox/xul/options/dialogs/keyboard.xul | 49 - source/firefox/xul/options/dialogs/resize.xul | 70 -- .../xul/options/dialogs/responsive-layout.xul | 45 - source/firefox/xul/options/dialogs/tool.xul | 68 -- .../xul/options/dialogs/view-source-with.xul | 57 - source/firefox/xul/options/options.xul | 25 - source/firefox/xul/options/panes/advanced.xul | 19 - source/firefox/xul/options/panes/colors.xul | 32 - source/firefox/xul/options/panes/general.xul | 26 - source/firefox/xul/options/panes/keyboard.xul | 27 - source/firefox/xul/options/panes/resize.xul | 41 - .../xul/options/panes/responsive-layouts.xul | 34 - source/firefox/xul/options/panes/tools.xul | 39 - .../firefox/xul/options/panes/view-source.xul | 44 - source/firefox/xul/overlay/menus/cookies.xul | 17 - source/firefox/xul/overlay/menus/css.xul | 35 - source/firefox/xul/overlay/menus/disable.xul | 43 - source/firefox/xul/overlay/menus/forms.xul | 33 - source/firefox/xul/overlay/menus/images.xul | 38 - .../firefox/xul/overlay/menus/information.xul | 29 - .../xul/overlay/menus/miscellaneous.xul | 27 - source/firefox/xul/overlay/menus/options.xul | 14 - source/firefox/xul/overlay/menus/outline.xul | 29 - source/firefox/xul/overlay/menus/resize.xul | 11 - source/firefox/xul/overlay/menus/tools.xul | 12 - .../firefox/xul/overlay/menus/view-source.xul | 11 - source/firefox/xul/overlay/overlay.xul | 583 ---------- source/opera/javascript/cookies/cookies.js | 9 + source/opera/style-sheets/overlay/overlay.css | 3 + 371 files changed, 3948 insertions(+), 25022 deletions(-) create mode 100644 configuration/common/manifest-bottom.json create mode 100644 configuration/common/manifest-top.json delete mode 100644 configuration/firefox/chrome.manifest delete mode 100644 configuration/firefox/install.rdf create mode 100644 configuration/firefox/manifest.json rename gulp/{chromium.js => build.js} (53%) delete mode 100644 images/chrome/icon-2x.png delete mode 100644 images/chrome/icon-color-2x.png delete mode 100644 images/chrome/icon-color.png delete mode 100644 images/chrome/icon.png rename images/{chrome => common}/feature-2x.png (100%) rename images/{chrome => common}/feature.png (100%) create mode 100644 images/common/logos/24.png create mode 100644 images/common/logos/256.png create mode 100644 images/common/logos/512.png create mode 100644 images/common/logos/monochrome/128.png create mode 100644 images/common/logos/monochrome/24.png create mode 100644 images/common/logos/monochrome/256.png create mode 100644 images/common/logos/monochrome/48.png create mode 100644 images/common/logos/monochrome/512.png create mode 100644 images/common/logos/monochrome/64.png rename images/{chrome => common}/options-2x.png (100%) rename images/{chrome => common}/options.png (100%) delete mode 100644 images/firefox/skins/default/close-2x.png delete mode 100644 images/firefox/skins/default/close.png delete mode 100644 images/firefox/skins/default/dashboard-2x.png delete mode 100644 images/firefox/skins/default/dashboard.png delete mode 100644 images/firefox/skins/default/disabled-2x.png delete mode 100644 images/firefox/skins/default/disabled.png delete mode 100644 images/firefox/skins/default/options-2x.png delete mode 100644 images/firefox/skins/default/options.png delete mode 100644 images/firefox/skins/default/statusbar-2x.png delete mode 100644 images/firefox/skins/default/statusbar.png delete mode 100644 images/firefox/skins/default/validation-2x.png delete mode 100644 images/firefox/skins/default/validation.png delete mode 100644 images/firefox/skins/mac/close-2x.png delete mode 100644 images/firefox/skins/mac/close.png delete mode 100644 images/firefox/skins/mac/dashboard-2x.png delete mode 100644 images/firefox/skins/mac/dashboard.png delete mode 100644 images/firefox/skins/mac/disabled-2x.png delete mode 100644 images/firefox/skins/mac/disabled.png delete mode 100644 images/firefox/skins/mac/statusbar-2x.png delete mode 100644 images/firefox/skins/mac/statusbar.png delete mode 100644 images/firefox/skins/mac/toolbar-2x.png delete mode 100644 images/firefox/skins/mac/toolbar.png delete mode 100644 images/firefox/skins/mac/validation-2x.png delete mode 100644 images/firefox/skins/mac/validation.png delete mode 100644 source/chrome/javascript/common/common.js delete mode 100644 source/chrome/javascript/content/content.js delete mode 100644 source/chrome/javascript/dashboard/dashboard.js delete mode 100644 source/chrome/javascript/dashboard/edit-css.js delete mode 100644 source/chrome/javascript/dashboard/element-information.js delete mode 100644 source/chrome/javascript/locales/locales.js delete mode 100644 source/chrome/javascript/overlay/cookies.js delete mode 100644 source/chrome/javascript/overlay/css.js delete mode 100644 source/chrome/javascript/overlay/forms.js delete mode 100644 source/chrome/javascript/overlay/images.js delete mode 100644 source/chrome/javascript/overlay/information.js delete mode 100644 source/chrome/javascript/overlay/options.js delete mode 100644 source/chrome/javascript/overlay/resize.js delete mode 100644 source/chrome/javascript/storage/storage.js delete mode 100644 source/chrome/javascript/toolbar/element-ancestors.js delete mode 100644 source/chrome/javascript/toolbar/line-guides.js delete mode 100644 source/chrome/javascript/toolbar/ruler.js delete mode 100644 source/chrome/style-sheets/dashboard/common.css delete mode 100644 source/chrome/style-sheets/toolbar/line-guides.css delete mode 100644 source/chrome/style-sheets/toolbar/ruler.css rename source/{chrome => common}/html/background/background.html (80%) rename source/{chrome => common}/html/options/options.html (91%) rename source/{chrome => common}/html/overlay/overlay.html (96%) rename source/{chrome => common}/html/validation/css.html (70%) rename source/{chrome => common}/html/validation/html.html (68%) rename source/{chrome => common}/javascript/background/background.js (97%) rename source/{chrome => common}/javascript/common/jquery/tablednd.js (100%) rename source/{chrome => common}/javascript/dashboard/common.js (100%) rename source/{chrome => common}/javascript/features/common.js (68%) rename source/{chrome => common}/javascript/options/options.js (98%) rename source/{chrome => common}/javascript/overlay/miscellaneous.js (81%) rename source/{chrome => common}/javascript/overlay/outline.js (98%) rename source/{chrome => common}/javascript/overlay/overlay.js (89%) rename source/{chrome => common}/javascript/overlay/tools.js (90%) rename source/{chrome => common}/javascript/toolbar/color-picker.js (94%) rename source/{chrome => common}/javascript/upgrade/upgrade.js (89%) rename source/{chrome => common}/javascript/validation/css.js (100%) rename source/{chrome => common}/javascript/validation/html.js (100%) rename source/{chrome => common}/locales/en_US/messages.json (93%) create mode 100755 source/common/style-sheets/common/bootstrap/bootstrap.css.map rename source/{chrome => common}/style-sheets/dashboard/dashboard.css (100%) delete mode 100644 source/common/style-sheets/dashboard/element-information.css rename source/{chrome => common}/style-sheets/options/options.css (88%) rename source/{chrome => common}/style-sheets/overlay/overlay.css (91%) rename source/{chrome => common}/style-sheets/toolbar/color-picker-toolbar.css (100%) rename source/{chrome => common}/style-sheets/toolbar/color-picker.css (100%) rename source/{chrome => common}/style-sheets/toolbar/common.css (100%) rename source/{chrome => common}/style-sheets/toolbar/toolbar.css (100%) delete mode 100644 source/firefox/html/dashboard/edit-css.html delete mode 100644 source/firefox/html/dashboard/edit-html.html delete mode 100644 source/firefox/html/dashboard/element-information.html delete mode 100644 source/firefox/html/dashboard/style-information.html delete mode 100644 source/firefox/html/generated/view-document-size.html delete mode 100644 source/firefox/html/toolbar/element-ancestors.html delete mode 100644 source/firefox/html/validation/css.html delete mode 100644 source/firefox/html/validation/html.html delete mode 100644 source/firefox/javascript/application/application.js delete mode 100644 source/firefox/javascript/common/common.js delete mode 100644 source/firefox/javascript/content/content.js delete mode 100644 source/firefox/javascript/dashboard/dashboard.js delete mode 100644 source/firefox/javascript/dashboard/edit-css.js delete mode 100644 source/firefox/javascript/dashboard/edit-html.js delete mode 100644 source/firefox/javascript/dashboard/element-information.js delete mode 100644 source/firefox/javascript/dashboard/html/common.js delete mode 100644 source/firefox/javascript/dashboard/html/edit-css.js delete mode 100644 source/firefox/javascript/dashboard/html/element-information.js delete mode 100644 source/firefox/javascript/dashboard/html/style-information.js delete mode 100644 source/firefox/javascript/dashboard/style-information.js delete mode 100644 source/firefox/javascript/dialogs/cookie.js delete mode 100644 source/firefox/javascript/dialogs/message.js delete mode 100644 source/firefox/javascript/dialogs/outline-custom-elements.js delete mode 100644 source/firefox/javascript/dialogs/resize-window.js delete mode 100644 source/firefox/javascript/features/images.js delete mode 100644 source/firefox/javascript/generated/view-document-size.js delete mode 100644 source/firefox/javascript/locales/locales.js delete mode 100644 source/firefox/javascript/options/dialogs/dialogs.js delete mode 100644 source/firefox/javascript/options/dialogs/keyboard.js delete mode 100644 source/firefox/javascript/options/dialogs/resize.js delete mode 100644 source/firefox/javascript/options/dialogs/responsive-layout.js delete mode 100644 source/firefox/javascript/options/dialogs/tool.js delete mode 100644 source/firefox/javascript/options/dialogs/view-source-with.js delete mode 100644 source/firefox/javascript/options/options.js delete mode 100644 source/firefox/javascript/overlay/cookies.js delete mode 100644 source/firefox/javascript/overlay/css.js delete mode 100644 source/firefox/javascript/overlay/disable.js delete mode 100644 source/firefox/javascript/overlay/forms.js delete mode 100644 source/firefox/javascript/overlay/images.js delete mode 100644 source/firefox/javascript/overlay/information.js delete mode 100644 source/firefox/javascript/overlay/miscellaneous.js delete mode 100644 source/firefox/javascript/overlay/options.js delete mode 100644 source/firefox/javascript/overlay/outline.js delete mode 100644 source/firefox/javascript/overlay/overlay.js delete mode 100644 source/firefox/javascript/overlay/resize.js delete mode 100644 source/firefox/javascript/overlay/tools.js delete mode 100644 source/firefox/javascript/overlay/view-source.js delete mode 100644 source/firefox/javascript/preferences/defaults.js delete mode 100644 source/firefox/javascript/preferences/preferences.js delete mode 100644 source/firefox/javascript/storage/storage.js delete mode 100644 source/firefox/javascript/toolbar/element-ancestors.js delete mode 100644 source/firefox/javascript/toolbar/line-guides.js delete mode 100644 source/firefox/javascript/toolbar/page-magnifier.js delete mode 100644 source/firefox/javascript/toolbar/page-validation.js delete mode 100644 source/firefox/javascript/toolbar/ruler.js delete mode 100644 source/firefox/javascript/upgrade/upgrade.js delete mode 100644 source/firefox/javascript/validation/css.js delete mode 100644 source/firefox/javascript/validation/html.js delete mode 100644 source/firefox/locales/cs-CZ/dashboard/dashboard.dtd delete mode 100644 source/firefox/locales/cs-CZ/dashboard/dashboard.properties delete mode 100644 source/firefox/locales/cs-CZ/dialogs/cookie.dtd delete mode 100644 source/firefox/locales/cs-CZ/dialogs/cookie.properties delete mode 100644 source/firefox/locales/cs-CZ/dialogs/message.dtd delete mode 100644 source/firefox/locales/cs-CZ/dialogs/outline-custom-elements.dtd delete mode 100644 source/firefox/locales/cs-CZ/dialogs/resize-window.dtd delete mode 100644 source/firefox/locales/cs-CZ/dialogs/resize-window.properties delete mode 100644 source/firefox/locales/cs-CZ/options/options.dtd delete mode 100644 source/firefox/locales/cs-CZ/options/options.properties delete mode 100644 source/firefox/locales/cs-CZ/overlay/overlay.dtd delete mode 100644 source/firefox/locales/cs-CZ/overlay/overlay.properties delete mode 100644 source/firefox/locales/de/dashboard/dashboard.dtd delete mode 100644 source/firefox/locales/de/dashboard/dashboard.properties delete mode 100644 source/firefox/locales/de/dialogs/cookie.dtd delete mode 100644 source/firefox/locales/de/dialogs/cookie.properties delete mode 100644 source/firefox/locales/de/dialogs/message.dtd delete mode 100644 source/firefox/locales/de/dialogs/outline-custom-elements.dtd delete mode 100644 source/firefox/locales/de/dialogs/resize-window.dtd delete mode 100644 source/firefox/locales/de/dialogs/resize-window.properties delete mode 100644 source/firefox/locales/de/options/options.dtd delete mode 100644 source/firefox/locales/de/options/options.properties delete mode 100644 source/firefox/locales/de/overlay/overlay.dtd delete mode 100644 source/firefox/locales/de/overlay/overlay.properties delete mode 100644 source/firefox/locales/en-US/dashboard/dashboard.dtd delete mode 100644 source/firefox/locales/en-US/dashboard/dashboard.properties delete mode 100644 source/firefox/locales/en-US/dialogs/cookie.dtd delete mode 100644 source/firefox/locales/en-US/dialogs/cookie.properties delete mode 100644 source/firefox/locales/en-US/dialogs/message.dtd delete mode 100644 source/firefox/locales/en-US/dialogs/outline-custom-elements.dtd delete mode 100644 source/firefox/locales/en-US/dialogs/resize-window.dtd delete mode 100644 source/firefox/locales/en-US/dialogs/resize-window.properties delete mode 100644 source/firefox/locales/en-US/options/options.dtd delete mode 100644 source/firefox/locales/en-US/options/options.properties delete mode 100644 source/firefox/locales/en-US/overlay/overlay.dtd delete mode 100644 source/firefox/locales/en-US/overlay/overlay.properties delete mode 100644 source/firefox/locales/fr/dashboard/dashboard.dtd delete mode 100644 source/firefox/locales/fr/dashboard/dashboard.properties delete mode 100644 source/firefox/locales/fr/dialogs/cookie.dtd delete mode 100644 source/firefox/locales/fr/dialogs/cookie.properties delete mode 100644 source/firefox/locales/fr/dialogs/message.dtd delete mode 100644 source/firefox/locales/fr/dialogs/outline-custom-elements.dtd delete mode 100644 source/firefox/locales/fr/dialogs/resize-window.dtd delete mode 100644 source/firefox/locales/fr/dialogs/resize-window.properties delete mode 100644 source/firefox/locales/fr/options/options.dtd delete mode 100644 source/firefox/locales/fr/options/options.properties delete mode 100644 source/firefox/locales/fr/overlay/overlay.dtd delete mode 100644 source/firefox/locales/fr/overlay/overlay.properties delete mode 100644 source/firefox/locales/ja-JP/dashboard/dashboard.dtd delete mode 100644 source/firefox/locales/ja-JP/dashboard/dashboard.properties delete mode 100644 source/firefox/locales/ja-JP/dialogs/cookie.dtd delete mode 100644 source/firefox/locales/ja-JP/dialogs/cookie.properties delete mode 100644 source/firefox/locales/ja-JP/dialogs/message.dtd delete mode 100644 source/firefox/locales/ja-JP/dialogs/outline-custom-elements.dtd delete mode 100644 source/firefox/locales/ja-JP/dialogs/resize-window.dtd delete mode 100644 source/firefox/locales/ja-JP/dialogs/resize-window.properties delete mode 100644 source/firefox/locales/ja-JP/options/options.dtd delete mode 100644 source/firefox/locales/ja-JP/options/options.properties delete mode 100644 source/firefox/locales/ja-JP/overlay/overlay.dtd delete mode 100644 source/firefox/locales/ja-JP/overlay/overlay.properties delete mode 100644 source/firefox/locales/pl-PL/dashboard/dashboard.dtd delete mode 100644 source/firefox/locales/pl-PL/dashboard/dashboard.properties delete mode 100644 source/firefox/locales/pl-PL/dialogs/cookie.dtd delete mode 100644 source/firefox/locales/pl-PL/dialogs/cookie.properties delete mode 100644 source/firefox/locales/pl-PL/dialogs/message.dtd delete mode 100644 source/firefox/locales/pl-PL/dialogs/outline-custom-elements.dtd delete mode 100644 source/firefox/locales/pl-PL/dialogs/resize-window.dtd delete mode 100644 source/firefox/locales/pl-PL/dialogs/resize-window.properties delete mode 100644 source/firefox/locales/pl-PL/options/options.dtd delete mode 100644 source/firefox/locales/pl-PL/options/options.properties delete mode 100644 source/firefox/locales/pl-PL/overlay/overlay.dtd delete mode 100644 source/firefox/locales/pl-PL/overlay/overlay.properties delete mode 100644 source/firefox/locales/pt-BR/dashboard/dashboard.dtd delete mode 100644 source/firefox/locales/pt-BR/dashboard/dashboard.properties delete mode 100644 source/firefox/locales/pt-BR/dialogs/cookie.dtd delete mode 100644 source/firefox/locales/pt-BR/dialogs/cookie.properties delete mode 100644 source/firefox/locales/pt-BR/dialogs/message.dtd delete mode 100644 source/firefox/locales/pt-BR/dialogs/outline-custom-elements.dtd delete mode 100644 source/firefox/locales/pt-BR/dialogs/resize-window.dtd delete mode 100644 source/firefox/locales/pt-BR/dialogs/resize-window.properties delete mode 100644 source/firefox/locales/pt-BR/options/options.dtd delete mode 100644 source/firefox/locales/pt-BR/options/options.properties delete mode 100644 source/firefox/locales/pt-BR/overlay/overlay.dtd delete mode 100644 source/firefox/locales/pt-BR/overlay/overlay.properties delete mode 100644 source/firefox/locales/sv-SE/dashboard/dashboard.dtd delete mode 100644 source/firefox/locales/sv-SE/dashboard/dashboard.properties delete mode 100644 source/firefox/locales/sv-SE/dialogs/cookie.dtd delete mode 100644 source/firefox/locales/sv-SE/dialogs/cookie.properties delete mode 100644 source/firefox/locales/sv-SE/dialogs/message.dtd delete mode 100644 source/firefox/locales/sv-SE/dialogs/outline-custom-elements.dtd delete mode 100644 source/firefox/locales/sv-SE/dialogs/resize-window.dtd delete mode 100644 source/firefox/locales/sv-SE/dialogs/resize-window.properties delete mode 100644 source/firefox/locales/sv-SE/options/options.dtd delete mode 100644 source/firefox/locales/sv-SE/options/options.properties delete mode 100644 source/firefox/locales/sv-SE/overlay/overlay.dtd delete mode 100644 source/firefox/locales/sv-SE/overlay/overlay.properties delete mode 100644 source/firefox/locales/zh-CN/dashboard/dashboard.dtd delete mode 100644 source/firefox/locales/zh-CN/dashboard/dashboard.properties delete mode 100644 source/firefox/locales/zh-CN/dialogs/cookie.dtd delete mode 100644 source/firefox/locales/zh-CN/dialogs/cookie.properties delete mode 100644 source/firefox/locales/zh-CN/dialogs/message.dtd delete mode 100644 source/firefox/locales/zh-CN/dialogs/outline-custom-elements.dtd delete mode 100644 source/firefox/locales/zh-CN/dialogs/resize-window.dtd delete mode 100644 source/firefox/locales/zh-CN/dialogs/resize-window.properties delete mode 100644 source/firefox/locales/zh-CN/options/options.dtd delete mode 100644 source/firefox/locales/zh-CN/options/options.properties delete mode 100644 source/firefox/locales/zh-CN/overlay/overlay.dtd delete mode 100644 source/firefox/locales/zh-CN/overlay/overlay.properties delete mode 100644 source/firefox/style-sheets/dashboard/dashboard.css delete mode 100644 source/firefox/style-sheets/dashboard/html/common.css delete mode 100644 source/firefox/style-sheets/dashboard/html/style-information.css delete mode 100644 source/firefox/style-sheets/dialogs/message.css delete mode 100644 source/firefox/style-sheets/dialogs/outline-custom-elements.css delete mode 100644 source/firefox/style-sheets/features/images/display-image-file-sizes.css delete mode 100644 source/firefox/style-sheets/generated/view-document-size.css delete mode 100644 source/firefox/style-sheets/options/options.css delete mode 100644 source/firefox/style-sheets/skin/common.css delete mode 100644 source/firefox/style-sheets/skin/mac.css delete mode 100644 source/firefox/xul/dashboard/edit-css.xul delete mode 100644 source/firefox/xul/dashboard/edit-html.xul delete mode 100644 source/firefox/xul/dashboard/element-information.xul delete mode 100644 source/firefox/xul/dashboard/style-information.xul delete mode 100644 source/firefox/xul/dialogs/cookie.xul delete mode 100644 source/firefox/xul/dialogs/message.xul delete mode 100644 source/firefox/xul/dialogs/outline-custom-elements.xul delete mode 100644 source/firefox/xul/dialogs/resize-window.xul delete mode 100644 source/firefox/xul/options/dialogs/keyboard.xul delete mode 100644 source/firefox/xul/options/dialogs/resize.xul delete mode 100644 source/firefox/xul/options/dialogs/responsive-layout.xul delete mode 100644 source/firefox/xul/options/dialogs/tool.xul delete mode 100644 source/firefox/xul/options/dialogs/view-source-with.xul delete mode 100644 source/firefox/xul/options/options.xul delete mode 100644 source/firefox/xul/options/panes/advanced.xul delete mode 100644 source/firefox/xul/options/panes/colors.xul delete mode 100644 source/firefox/xul/options/panes/general.xul delete mode 100644 source/firefox/xul/options/panes/keyboard.xul delete mode 100644 source/firefox/xul/options/panes/resize.xul delete mode 100644 source/firefox/xul/options/panes/responsive-layouts.xul delete mode 100644 source/firefox/xul/options/panes/tools.xul delete mode 100644 source/firefox/xul/options/panes/view-source.xul delete mode 100644 source/firefox/xul/overlay/menus/cookies.xul delete mode 100644 source/firefox/xul/overlay/menus/css.xul delete mode 100644 source/firefox/xul/overlay/menus/disable.xul delete mode 100644 source/firefox/xul/overlay/menus/forms.xul delete mode 100644 source/firefox/xul/overlay/menus/images.xul delete mode 100644 source/firefox/xul/overlay/menus/information.xul delete mode 100644 source/firefox/xul/overlay/menus/miscellaneous.xul delete mode 100644 source/firefox/xul/overlay/menus/options.xul delete mode 100644 source/firefox/xul/overlay/menus/outline.xul delete mode 100644 source/firefox/xul/overlay/menus/resize.xul delete mode 100644 source/firefox/xul/overlay/menus/tools.xul delete mode 100644 source/firefox/xul/overlay/menus/view-source.xul delete mode 100644 source/firefox/xul/overlay/overlay.xul create mode 100644 source/opera/javascript/cookies/cookies.js create mode 100644 source/opera/style-sheets/overlay/overlay.css diff --git a/configuration/chrome/configuration.properties b/configuration/chrome/configuration.properties index 693148d..7d566bf 100644 --- a/configuration/chrome/configuration.properties +++ b/configuration/chrome/configuration.properties @@ -1,3 +1 @@ -common.prefix= -description=Adds a toolbar button with various web developer tools. The official port of the Web Developer extension for Firefox. -version=0.4.8 +version=0.5 diff --git a/configuration/chrome/manifest.json b/configuration/chrome/manifest.json index 96e058c..652a699 100644 --- a/configuration/chrome/manifest.json +++ b/configuration/chrome/manifest.json @@ -1,15 +1,4 @@ -{ - "background": { "page": "background/background.html" }, - "browser_action": { "default_icon": { "19": "overlay/images/icon.png", "38": "overlay/images/icon-2x.png" }, "default_popup": "overlay/overlay.html", "default_title": "__MSG_extensionName__" }, - "content_scripts": [{ "js": ["content/content.js"], "matches": [""] }], - "default_locale": "en_US", - "description": "__MSG_extensionDescription__", - "homepage_url": "@url@", - "icons": { "16": "common/images/logos/16.png", "48": "common/images/logos/48.png", "128": "common/images/logos/128.png" }, - "manifest_version": 2, - "name": "__MSG_extensionName__", - "options_page": "options/options.html", - "permissions": ["clipboardWrite", "contentSettings", "cookies", "history", "tabs", ""], - "version": "@version@", - "web_accessible_resources": ["*"] -} +{"remove-top": "", + "browser_action": { "default_icon": { "16": "/common/images/logos/16.png", "24": "/common/images/logos/24.png", "32": "/common/images/logos/32.png", "48": "/common/images/logos/48.png", "64": "/common/images/logos/64.png", "128": "/common/images/logos/128.png", "256": "/common/images/logos/256.png", "512": "/common/images/logos/512.png" }, "default_popup": "/overlay/overlay.html", "default_title": "__MSG_extensionName__" }, + "permissions": ["browsingData", "clipboardWrite", "contentSettings", "cookies", "history", "storage", "tabs", ""], +"remove-bottom": ""} diff --git a/configuration/common/configuration.properties b/configuration/common/configuration.properties index b6569ef..fe429c7 100644 --- a/configuration/common/configuration.properties +++ b/configuration/common/configuration.properties @@ -1,6 +1,4 @@ author=Chris Pederick -id=web-developer +description=Adds a toolbar button with various web developer tools. name=Web Developer -namespace=WebDeveloper -preferences=webdeveloper -url=http://chrispederick.com/work/web-developer +url=http://chrispederick.com/work/web-developer/ diff --git a/configuration/common/manifest-bottom.json b/configuration/common/manifest-bottom.json new file mode 100644 index 0000000..c4c82ed --- /dev/null +++ b/configuration/common/manifest-bottom.json @@ -0,0 +1,3 @@ +{"remove-top": "", + "web_accessible_resources": ["*"] +} diff --git a/configuration/common/manifest-top.json b/configuration/common/manifest-top.json new file mode 100644 index 0000000..f484817 --- /dev/null +++ b/configuration/common/manifest-top.json @@ -0,0 +1,12 @@ +{ + "background": { "page": "/background/background.html" }, + "content_scripts": [{ "js": ["/content/content.js"], "matches": [""] }], + "default_locale": "en_US", + "description": "__MSG_extensionDescription__", + "homepage_url": "@url@", + "icons": { "16": "/common/images/logos/16.png", "24": "/common/images/logos/24.png", "32": "/common/images/logos/32.png", "48": "/common/images/logos/48.png", "64": "/common/images/logos/64.png", "128": "/common/images/logos/128.png", "256": "/common/images/logos/256.png", "512": "/common/images/logos/512.png" }, + "manifest_version": 2, + "name": "__MSG_extensionName__", + "options_ui": { "page": "/options/options.html" }, + "version": "@version@", +"remove-bottom": ""} diff --git a/configuration/firefox/chrome.manifest b/configuration/firefox/chrome.manifest deleted file mode 100644 index cd7f45e..0000000 --- a/configuration/firefox/chrome.manifest +++ /dev/null @@ -1,17 +0,0 @@ -content web-developer content/web-developer/ contentaccessible=yes -locale web-developer en-US locale/en-US/ -locale web-developer cs-CZ locale/cs-CZ/ -locale web-developer de locale/de/ -locale web-developer fr locale/fr/ -locale web-developer ja-JP locale/ja-JP/ -locale web-developer pl-PL locale/pl-PL/ -locale web-developer pt-BR locale/pt-BR/ -locale web-developer sv-SE locale/sv-SE/ -locale web-developer zh-CN locale/zh-CN/ -overlay chrome://browser/content/browser.xul chrome://web-developer/content/overlay/overlay.xul -overlay chrome://navigator/content/navigator.xul chrome://web-developer/content/overlay/overlay.xul -skin web-developer classic/1.0 skin/default/ -skin web-developer classic/1.0 skin/mac/ os=Darwin -style chrome://browser/content/browser.xul chrome://web-developer/skin/web-developer.css -style chrome://global/content/customizeToolbar.xul chrome://web-developer/skin/web-developer.css -style chrome://navigator/content/navigator.xul chrome://web-developer/skin/web-developer.css diff --git a/configuration/firefox/configuration.properties b/configuration/firefox/configuration.properties index 2539ab9..55659ca 100644 --- a/configuration/firefox/configuration.properties +++ b/configuration/firefox/configuration.properties @@ -1,3 +1 @@ -common.prefix=chrome://web-developer/content -description=Adds a menu and a toolbar with various web developer tools. -version=1.2.12 +version=2.0 diff --git a/configuration/firefox/install.rdf b/configuration/firefox/install.rdf deleted file mode 100644 index cfcb34e..0000000 --- a/configuration/firefox/install.rdf +++ /dev/null @@ -1,65 +0,0 @@ - - - - @author@ - @description@ - @url@/@browser@/ - chrome://web-developer/content/common/images/logos/48.png - chrome://web-developer/content/common/images/logos/64.png - {c45c406e-ab73-11d8-be73-000a95be3b12} - @name@ - chrome://web-developer/content/options/options.xul - @version@ - - - en-US - @name@ - @description@ - - - - - de - @name@ - Fügt ein Menü und eine Symbolleiste mit diversen Werkzeugen für Webentwickler hinzu. - - - - - ja-JP - @name@ - はツールバーや右クリックメニューから利用できる便利なWeb開発ツールです - - - - - sv-SE - @name@ - Lägger till en meny och ett verktygsfält med diverse webbutvecklingsverktyg. - - - - - zh-CN - @name@ - 一款为WEB开发添加多种实用功能和工具的好插件 - - - false - - - {ec8030f7-c20a-464f-9b0e-13a3a9e97384} - 54.* - 3.6 - - - - - {92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} - 2.46.* - 2.0 - - - 2 - - diff --git a/configuration/firefox/manifest.json b/configuration/firefox/manifest.json new file mode 100644 index 0000000..b6164c4 --- /dev/null +++ b/configuration/firefox/manifest.json @@ -0,0 +1,4 @@ +{"remove-top": "", + "browser_action": { "browser_style": false, "default_icon": { "16": "/common/images/logos/monochrome/16.png", "24": "/common/images/logos/monochrome/24.png", "32": "/common/images/logos/monochrome/32.png", "48": "/common/images/logos/monochrome/48.png", "64": "/common/images/logos/monochrome/64.png", "128": "/common/images/logos/monochrome/128.png", "256": "/common/images/logos/monochrome/256.png", "512": "/common/images/logos/monochrome/512.png" }, "default_popup": "/overlay/overlay.html", "default_title": "__MSG_extensionName__" }, + "permissions": ["clipboardWrite", "cookies", "history", "storage", "tabs", ""], +"remove-bottom": ""} diff --git a/configuration/opera/configuration.properties b/configuration/opera/configuration.properties index a91eb7c..5971fc4 100644 --- a/configuration/opera/configuration.properties +++ b/configuration/opera/configuration.properties @@ -1,3 +1 @@ -common.prefix= -description=Adds a toolbar button with various web developer tools. The official port of the Web Developer extension for Firefox. -version=0.2.2 +version=0.3 diff --git a/configuration/opera/manifest.json b/configuration/opera/manifest.json index 39d9f3b..290d72b 100644 --- a/configuration/opera/manifest.json +++ b/configuration/opera/manifest.json @@ -1,15 +1,4 @@ -{ - "background": { "page": "background/background.html" }, - "browser_action": { "default_icon": { "19": "overlay/images/icon.png", "38": "overlay/images/icon-2x.png" }, "default_popup": "overlay/overlay.html", "default_title": "__MSG_extensionName__" }, - "content_scripts": [{ "js": ["content/content.js"], "matches": [""] }], - "default_locale": "en_US", - "description": "__MSG_extensionDescription__", - "homepage_url": "@url@", - "icons": { "16": "common/images/logos/16.png", "48": "common/images/logos/48.png", "128": "common/images/logos/128.png" }, - "manifest_version": 2, - "name": "__MSG_extensionName__", - "options_page": "options/options.html", - "permissions": ["clipboardWrite", "cookies", "history", "tabs", ""], - "version": "@version@", - "web_accessible_resources": ["*"] -} +{"remove-top": "", + "browser_action": { "default_icon": { "16": "/common/images/logos/monochrome/16.png", "24": "/common/images/logos/monochrome/24.png", "32": "/common/images/logos/monochrome/32.png", "48": "/common/images/logos/monochrome/48.png", "64": "/common/images/logos/monochrome/64.png", "128": "/common/images/logos/monochrome/128.png", "256": "/common/images/logos/monochrome/256.png", "512": "/common/images/logos/monochrome/512.png" }, "default_popup": "/overlay/overlay.html", "default_title": "__MSG_extensionName__" }, + "permissions": ["browsingData", "clipboardWrite", "cookies", "history", "storage", "tabs", ""], +"remove-bottom": ""} diff --git a/gulp/chromium.js b/gulp/build.js similarity index 53% rename from gulp/chromium.js rename to gulp/build.js index 43f150a..535119f 100644 --- a/gulp/chromium.js +++ b/gulp/build.js @@ -4,123 +4,141 @@ var gulp = require("gulp"); var merge = require("merge-stream"); var plugins = require("gulp-load-plugins")(); -global.chromiumAboutTask = function(browserName) +global.buildAbout = function(browserName) { return merge( gulp.src("source/common/html/about/about.html") - .pipe(global.filterPropertiesTask(browserName)()) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/about")), gulp.src("source/common/javascript/about/about.js") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/about/javascript")), gulp.src("source/common/style-sheets/about/about.css") - .pipe(global.filterPropertiesTask(browserName)()) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/about")) ); }; -global.chromiumAllTask = function(browserName) +global.buildAll = function(browserName) { return merge( - global.chromiumAboutTask(browserName), - global.chromiumBackgroundTask(browserName), - global.chromiumCommonTask(browserName), - global.chromiumConfigurationTask(browserName), - global.chromiumContentTask(browserName), - global.chromiumDashboardTask(browserName), - global.chromiumFeaturesTask(browserName), - global.chromiumGeneratedTask(browserName), - global.chromiumLocalesTask(browserName), - global.chromiumOptionsTask(browserName), - global.chromiumOverlayTask(browserName), - global.chromiumToolbarsTask(browserName) + global.buildAbout(browserName), + global.buildBackground(browserName), + global.buildCommon(browserName), + global.buildConfiguration(browserName), + global.buildContent(browserName), + global.buildDashboard(browserName), + global.buildFeatures(browserName), + global.buildGenerated(browserName), + global.buildLocales(browserName), + global.buildOptions(browserName), + global.buildOverlay(browserName), + global.buildToolbars(browserName) ); }; -global.chromiumBackgroundTask = function(browserName) +global.buildBackground = function(browserName) { return merge( - gulp.src("source/chrome/html/background/background.html") - .pipe(global.filterPropertiesTask(browserName)()) + gulp.src("source/common/html/background/background.html") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/background")), - gulp.src("source/chrome/javascript/background/background.js") + gulp.src("source/common/javascript/background/background.js") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/background/javascript")) ); }; -global.chromiumCommonTask = function(browserName) +global.buildCommon = function(browserName) { return merge( gulp.src("source/common/javascript/common/bootstrap/*") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/common/javascript/bootstrap")), gulp.src("source/common/javascript/common/codemirror/*") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/common/javascript/codemirror")), - gulp.src(["source/common/javascript/common/jquery/*", "source/chrome/javascript/common/jquery/*"]) + gulp.src("source/common/javascript/common/jquery/*") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/common/javascript/jquery")), - gulp.src(["source/common/javascript/common/common.js", "source/chrome/javascript/common/common.js"]) - .pipe(plugins.concat("common.js")) + gulp.src("source/common/javascript/common/common.js") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/common/javascript")), gulp.src("source/common/javascript/common/css.js") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/common/javascript")), - gulp.src(["source/common/javascript/cookies/cookies.js", "source/chrome/javascript/cookies/cookies.js"]) + gulp.src(["source/common/javascript/cookies/cookies.js", "source/" + browserName + "/javascript/cookies/cookies.js"]) .pipe(plugins.concat("cookies.js")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/cookies")), - gulp.src(["source/common/javascript/locales/locales.js", "source/chrome/javascript/locales/locales.js"]) - .pipe(plugins.concat("locales.js")) + gulp.src("source/common/javascript/locales/locales.js") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/locales")), - gulp.src(["source/common/javascript/storage/storage.js", "source/chrome/javascript/storage/storage.js"]) - .pipe(plugins.concat("storage.js")) - .pipe(global.filterPropertiesTask(browserName)()) + gulp.src("source/common/javascript/storage/storage.js") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/storage")), - gulp.src("source/chrome/javascript/upgrade/upgrade.js") - .pipe(global.filterPropertiesTask(browserName)()) + gulp.src("source/common/javascript/upgrade/upgrade.js") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/upgrade")), gulp.src(["source/common/style-sheets/common/bootstrap/bootstrap.css", "source/common/style-sheets/common/bootstrap/font-awesome.css"]) .pipe(plugins.concat("bootstrap.css")) .pipe(plugins.replace("fonts/fontawesome-webfont", "../fonts/fontawesome-webfont")) + .pipe(global.filterProperties(browserName)()) + .pipe(gulp.dest("build/" + browserName + "/common/style-sheets")), + gulp.src("source/common/style-sheets/common/bootstrap/bootstrap.css.map") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/common/style-sheets")), gulp.src("source/common/style-sheets/generated/common.css") .pipe(plugins.rename("generated.css")) - .pipe(global.filterPropertiesTask(browserName)()) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/common/style-sheets")), gulp.src(["source/common/style-sheets/common/codemirror/codemirror.css", "source/common/style-sheets/common/codemirror/theme.css"]) .pipe(plugins.concat("syntax-highlight.css")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/common/style-sheets")), - gulp.src(["images/common/logos/favicon.ico", "images/common/logos/16.png", "images/common/logos/32.png", "images/common/logos/48.png", "images/common/logos/64.png", "images/common/logos/128.png"]) + gulp.src("images/common/logos/**") .pipe(gulp.dest("build/" + browserName + "/common/images/logos")), gulp.src("source/common/fonts/*") .pipe(gulp.dest("build/" + browserName + "/common/fonts")) ); }; -global.chromiumConfigurationTask = function(browserName) +global.buildConfiguration = function(browserName) { - return gulp.src("configuration/" + browserName + "/manifest.json") - .pipe(global.filterPropertiesTask(browserName)()) + return gulp.src(["configuration/common/manifest-top.json", "configuration/" + browserName + "/manifest.json", "configuration/common/manifest-bottom.json"]) + .pipe(plugins.concat("manifest.json")) + .pipe(plugins.replace('{"remove-top": "",', "")) + .pipe(plugins.replace('"remove-bottom": ""}', "")) + .pipe(plugins.replace(/^\s*[\r\n]/gm, "")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName)); }; -global.chromiumContentTask = function(browserName) +global.buildContent = function(browserName) { - return gulp.src(["source/common/javascript/common/common.js", "source/chrome/javascript/common/common.js", "source/common/javascript/common/css.js", "source/common/javascript/content/content.js", "source/chrome/javascript/content/content.js"]) + return gulp.src(["source/common/javascript/common/common.js", "source/common/javascript/common/css.js", "source/common/javascript/content/content.js"]) .pipe(plugins.concat("content.js")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/content")); }; -global.chromiumDashboardTask = function(browserName) +global.buildDashboard = function(browserName) { return merge( - gulp.src(["source/common/javascript/toolbar/html/element-ancestors.js", "source/chrome/javascript/dashboard/common.js"]) + gulp.src(["source/common/javascript/dashboard/common.js", "source/common/javascript/toolbar/html/element-ancestors.js"]) .pipe(plugins.concat("dashboard.js")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/dashboard/javascript/html")), - gulp.src(["source/common/javascript/common/common.js", "source/chrome/javascript/common/common.js", "source/common/javascript/dashboard/dashboard.js", "source/chrome/javascript/dashboard/dashboard.js", "source/common/javascript/dashboard/element-information.js", "source/chrome/javascript/dashboard/element-information.js", "source/common/javascript/dashboard/edit-css.js", "source/chrome/javascript/dashboard/edit-css.js", "source/common/javascript/toolbar/element-ancestors.js", "source/chrome/javascript/toolbar/element-ancestors.js"]) + gulp.src(["source/common/javascript/common/common.js", "source/common/javascript/dashboard/dashboard.js", "source/common/javascript/dashboard/edit-css.js", "source/common/javascript/dashboard/element-information.js", "source/common/javascript/toolbar/element-ancestors.js"]) .pipe(plugins.concat("dashboard.js")) - .pipe(global.filterPropertiesTask(browserName)()) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/dashboard/javascript")), - gulp.src("source/chrome/style-sheets/dashboard/dashboard.css") + gulp.src("source/common/style-sheets/dashboard/dashboard.css") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/dashboard/style-sheets")), - gulp.src(["source/common/style-sheets/common/bootstrap/bootstrap.css", "source/common/style-sheets/dashboard/common.css", "source/common/style-sheets/dashboard/element-information.css", "source/chrome/style-sheets/dashboard/common.css"]) + gulp.src(["source/common/style-sheets/common/bootstrap/bootstrap.css", "source/common/style-sheets/dashboard/common.css"]) .pipe(plugins.concat("common.css")) - .pipe(global.filterPropertiesTask(browserName)()) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/dashboard/style-sheets")), gulp.src("images/common/logos/monochrome/16.png") .pipe(plugins.rename("logo.png")) @@ -128,127 +146,142 @@ global.chromiumDashboardTask = function(browserName) ); }; -global.chromiumFeaturesTask = function(browserName) +global.buildFeatures = function(browserName) { return merge( - gulp.src(["source/common/javascript/common/common.js", "source/chrome/javascript/features/common.js", "source/common/javascript/common/css.js", "source/common/javascript/features/css.js"]) + gulp.src(["source/common/javascript/common/common.js", "source/common/javascript/common/css.js", "source/common/javascript/features/common.js", "source/common/javascript/features/css.js"]) .pipe(plugins.concat("css.js")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/features/javascript")), - gulp.src(["source/common/javascript/common/common.js", "source/chrome/javascript/features/common.js", "source/common/javascript/features/forms.js"]) + gulp.src(["source/common/javascript/common/common.js", "source/common/javascript/features/common.js", "source/common/javascript/features/forms.js"]) .pipe(plugins.concat("forms.js")) - .pipe(global.filterPropertiesTask(browserName)()) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/features/javascript")), - gulp.src(["source/common/javascript/common/common.js", "source/chrome/javascript/features/common.js", "source/common/javascript/features/images.js"]) + gulp.src(["source/common/javascript/common/common.js", "source/common/javascript/features/common.js", "source/common/javascript/features/images.js"]) .pipe(plugins.concat("images.js")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/features/javascript")), - gulp.src(["source/common/javascript/common/common.js", "source/chrome/javascript/features/common.js", "source/common/javascript/features/information.js"]) + gulp.src(["source/common/javascript/common/common.js", "source/common/javascript/features/common.js", "source/common/javascript/features/information.js"]) .pipe(plugins.concat("information.js")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/features/javascript")), - gulp.src(["source/common/javascript/common/common.js", "source/chrome/javascript/features/common.js", "source/common/javascript/features/miscellaneous.js"]) + gulp.src(["source/common/javascript/common/common.js", "source/common/javascript/features/common.js", "source/common/javascript/features/miscellaneous.js"]) .pipe(plugins.concat("miscellaneous.js")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/features/javascript")), - gulp.src(["source/common/javascript/common/common.js", "source/chrome/javascript/features/common.js", "source/common/javascript/features/outline.js"]) + gulp.src(["source/common/javascript/common/common.js", "source/common/javascript/features/common.js", "source/common/javascript/features/outline.js"]) .pipe(plugins.concat("outline.js")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/features/javascript")), gulp.src("source/common/style-sheets/features/**") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/features/style-sheets")), gulp.src("source/common/style-sheets/common/reset.css") .pipe(plugins.rename("disable-browser-default-styles.css")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/features/style-sheets/css")), gulp.src("images/common/transparent.png") .pipe(gulp.dest("build/" + browserName + "/features/style-sheets/images")), - gulp.src("source/chrome/html/validation/*") - .pipe(global.filterPropertiesTask(browserName)()) + gulp.src("source/common/html/validation/*") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/validation")), - gulp.src("source/chrome/javascript/validation/*") + gulp.src("source/common/javascript/validation/*") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/validation/javascript")) ); }; -global.chromiumGeneratedTask = function(browserName) +global.buildGenerated = function(browserName) { return merge( gulp.src(["source/common/html/generated/*", "source/common/style-sheets/generated/*", "!source/common/style-sheets/generated/common.css"]) - .pipe(global.filterPropertiesTask(browserName)()) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/generated")), gulp.src("source/common/javascript/generated/**") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/generated/javascript")) ); }; -global.chromiumLocalesTask = function(browserName) +global.buildLocales = function(browserName) { - return gulp.src("source/chrome/locales/**") - .pipe(global.filterPropertiesTask(browserName)()) + return gulp.src("source/common/locales/**") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/_locales")); }; -global.chromiumOptionsTask = function(browserName) +global.buildOptions = function(browserName) { return merge( - gulp.src(["source/common/html/options/syntax-highlight.html", "source/chrome/html/options/options.html"]) - .pipe(global.filterPropertiesTask(browserName)()) + gulp.src(["source/common/html/options/options.html", "source/common/html/options/syntax-highlight.html"]) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/options")), - gulp.src(["source/chrome/javascript/options/options.js", "source/common/javascript/options/syntax-highlight.js"]) + gulp.src(["source/common/javascript/options/options.js", "source/common/javascript/options/syntax-highlight.js"]) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/options/javascript")), - gulp.src(["source/chrome/style-sheets/options/options.css", "source/common/style-sheets/options/syntax-highlight.css"]) - .pipe(global.filterPropertiesTask(browserName)()) + gulp.src(["source/common/style-sheets/options/options.css", "source/common/style-sheets/options/syntax-highlight.css"]) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/options")), - gulp.src(["images/chrome/options.png", "images/chrome/options-2x.png"]) + gulp.src(["images/common/options.png", "images/common/options-2x.png"]) .pipe(gulp.dest("build/" + browserName + "/options/images")) ); }; -global.chromiumOverlayTask = function(browserName) +global.buildOverlay = function(browserName) { return merge( - gulp.src("source/chrome/html/overlay/overlay.html") - .pipe(global.filterPropertiesTask(browserName)()) + gulp.src("source/common/html/overlay/overlay.html") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/overlay")), - gulp.src(["source/common/javascript/overlay/*", "source/chrome/javascript/overlay/overlay.js", "source/chrome/javascript/overlay/*"]) + gulp.src(["source/common/javascript/overlay/*", "source/" + browserName + "/javascript/overlay/*"]) .pipe(plugins.concat("overlay.js")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/overlay/javascript")), - gulp.src("source/chrome/style-sheets/overlay/overlay.css") + gulp.src(["source/common/style-sheets/overlay/overlay.css", "source/" + browserName + "/style-sheets/overlay/overlay.css"]) + .pipe(plugins.concat("overlay.css")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/overlay")), - gulp.src(["images/common/toolbar.png", "images/common/toolbar-2x.png", "images/chrome/feature.png", "images/chrome/feature-2x.png", "images/chrome/icon.png", "images/chrome/icon-2x.png", "images/chrome/icon-color.png", "images/chrome/icon-color-2x.png"]) + gulp.src(["images/common/feature.png", "images/common/feature-2x.png", "images/common/toolbar.png", "images/common/toolbar-2x.png"]) .pipe(gulp.dest("build/" + browserName + "/overlay/images")) ); }; -global.chromiumToolbarsTask = function(browserName) +global.buildToolbars = function(browserName) { return merge( - gulp.src("source/chrome/javascript/toolbar/color-picker.js") - .pipe(global.filterPropertiesTask(browserName)()) - .pipe(gulp.dest("build/" + browserName + "/toolbar/javascript")), - gulp.src(["source/common/javascript/toolbar/line-guides.js", "source/chrome/javascript/toolbar/line-guides.js"]) - .pipe(plugins.concat("line-guides.js")) - .pipe(gulp.dest("build/" + browserName + "/toolbar/javascript")), - gulp.src(["source/common/javascript/toolbar/ruler.js", "source/chrome/javascript/toolbar/ruler.js"]) - .pipe(plugins.concat("ruler.js")) + gulp.src(["source/common/javascript/toolbar/color-picker.js", "source/common/javascript/toolbar/line-guides.js", "source/common/javascript/toolbar/ruler.js"]) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/toolbar/javascript")), - gulp.src(["source/chrome/style-sheets/toolbar/toolbar.css", "source/chrome/style-sheets/toolbar/color-picker.css"]) + gulp.src(["source/common/style-sheets/toolbar/toolbar.css", "source/common/style-sheets/toolbar/color-picker.css"]) .pipe(plugins.concat("color-picker.css")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/toolbar")), - gulp.src(["source/common/style-sheets/common/bootstrap/bootstrap.css", "source/common/style-sheets/common/common.css", "source/chrome/style-sheets/toolbar/common.css", "source/chrome/style-sheets/toolbar/color-picker-toolbar.css"]) + gulp.src(["source/common/style-sheets/common/bootstrap/bootstrap.css", "source/common/style-sheets/common/common.css", "source/common/style-sheets/toolbar/common.css", "source/common/style-sheets/toolbar/color-picker-toolbar.css"]) .pipe(plugins.concat("color-picker-toolbar.css")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/toolbar")), gulp.src("source/common/style-sheets/toolbar/element-ancestors.css") + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/toolbar")), - gulp.src(["source/chrome/style-sheets/toolbar/toolbar.css", "source/common/style-sheets/toolbar/element-information.css", "source/chrome/style-sheets/toolbar/element-information.css"]) + gulp.src(["source/common/style-sheets/toolbar/toolbar.css", "source/common/style-sheets/toolbar/element-information.css"]) .pipe(plugins.concat("element-information.css")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/toolbar")), - gulp.src(["source/chrome/style-sheets/toolbar/toolbar.css", "source/common/style-sheets/toolbar/line-guides.css"]) + gulp.src(["source/common/style-sheets/toolbar/toolbar.css", "source/common/style-sheets/toolbar/line-guides.css"]) .pipe(plugins.concat("line-guides.css")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/toolbar")), - gulp.src(["source/common/style-sheets/common/bootstrap/bootstrap.css", "source/common/style-sheets/common/common.css", "source/chrome/style-sheets/toolbar/common.css", "source/chrome/style-sheets/toolbar/line-guides.css"]) + gulp.src(["source/common/style-sheets/common/bootstrap/bootstrap.css", "source/common/style-sheets/common/common.css", "source/common/style-sheets/toolbar/common.css", "source/common/style-sheets/toolbar/line-guides.css"]) .pipe(plugins.concat("line-guides-toolbar.css")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/toolbar")), - gulp.src(["source/chrome/style-sheets/toolbar/toolbar.css", "source/common/style-sheets/toolbar/ruler.css"]) + gulp.src(["source/common/style-sheets/toolbar/toolbar.css", "source/common/style-sheets/toolbar/ruler.css"]) .pipe(plugins.concat("ruler.css")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/toolbar")), - gulp.src(["source/common/style-sheets/common/bootstrap/bootstrap.css", "source/common/style-sheets/common/common.css", "source/chrome/style-sheets/toolbar/common.css", "source/chrome/style-sheets/toolbar/ruler.css"]) + gulp.src(["source/common/style-sheets/common/bootstrap/bootstrap.css", "source/common/style-sheets/common/common.css", "source/common/style-sheets/toolbar/common.css", "source/common/style-sheets/toolbar/ruler.css"]) .pipe(plugins.concat("ruler-toolbar.css")) + .pipe(global.filterProperties(browserName)()) .pipe(gulp.dest("build/" + browserName + "/toolbar")), gulp.src("images/common/logos/monochrome/16.png") .pipe(plugins.rename("logo.png")) diff --git a/gulp/chrome.js b/gulp/chrome.js index 3dee830..73d4f48 100644 --- a/gulp/chrome.js +++ b/gulp/chrome.js @@ -8,7 +8,7 @@ var runSequence = require("run-sequence"); gulp.task("build-chrome-all", function() { - return global.chromiumAllTask("chrome"); + return global.buildAll("chrome"); }); gulp.task("clean-chrome", function() diff --git a/gulp/common.js b/gulp/common.js index 23d32d1..e759c07 100644 --- a/gulp/common.js +++ b/gulp/common.js @@ -24,7 +24,7 @@ global.errorHandler = function(error, emitEnd, task) } }; -global.filterPropertiesTask = function(browserName) +global.filterProperties = function(browserName) { return lazypipe() .pipe(filterProperties, { propertiesPath: "build/" + browserName + ".properties" }) diff --git a/gulp/firefox.js b/gulp/firefox.js index a774726..111213d 100644 --- a/gulp/firefox.js +++ b/gulp/firefox.js @@ -1,338 +1,15 @@ "use strict"; -global.firefoxOverlayMenus = ["cookies", "css", "disable", "forms", "images", "information", "miscellaneous", "options", "outline", "resize", "tools", "view-source"]; -global.firefoxOverlaySuffixes = ["app-menu", "context", "menu", "seamonkey", "toolbar", "toolbar-button"]; -global.firefoxPackageName = "web-developer-firefox.xpi"; +global.firefoxPackageName = "web-developer-firefox.zip"; var del = require("del"); -var fs = require("fs"); +var exec = require("child_process"); var gulp = require("gulp"); -var merge = require("merge-stream"); -var plugins = require("gulp-load-plugins")(); var runSequence = require("run-sequence"); -global.buildFirefoxMenu = function(menu, suffix) +gulp.task("build-firefox-all", function() { - return gulp.src("source/firefox/xul/overlay/menus/" + menu + ".xul") - .pipe(plugins.rename(menu + "-" + suffix + ".xul")) - .pipe(plugins.replace("${suffix}", suffix)) - .pipe(gulp.dest("build/firefox/overlay")); -}; - -gulp.task("build-firefox-about", function() -{ - return merge( - gulp.src("source/common/html/about/about.html") - .pipe(global.filterPropertiesTask("firefox")()) - .pipe(gulp.dest("build/firefox/content/web-developer/about")), - gulp.src(["source/common/javascript/generated/common.js", "source/common/javascript/about/about.js"]) - .pipe(plugins.concat("about.js")) - .pipe(gulp.dest("build/firefox/content/web-developer/about/javascript")), - gulp.src("source/common/style-sheets/about/about.css") - .pipe(global.filterPropertiesTask("firefox")()) - .pipe(gulp.dest("build/firefox/content/web-developer/about")) - ); -}); - -gulp.task("build-firefox-all", function(callback) -{ - runSequence([ - "build-firefox-about", - "build-firefox-common", - "build-firefox-configuration", - "build-firefox-content", - "build-firefox-dashboard", - "build-firefox-dialogs", - "build-firefox-features", - "build-firefox-generated", - "build-firefox-locales", - "build-firefox-options", - "build-firefox-overlay", - "build-firefox-skins", - "build-firefox-toolbars" - ], callback); -}); - -gulp.task("build-firefox-common", function() -{ - return merge( - gulp.src("source/common/javascript/common/bootstrap/*") - .pipe(gulp.dest("build/firefox/content/web-developer/common/javascript/bootstrap")), - gulp.src("source/common/javascript/common/codemirror/*") - .pipe(gulp.dest("build/firefox/content/web-developer/common/javascript/codemirror")), - gulp.src("source/common/javascript/common/jquery/*") - .pipe(gulp.dest("build/firefox/content/web-developer/common/javascript/jquery")), - gulp.src(["source/common/javascript/common/common.js", "source/firefox/javascript/common/common.js"]) - .pipe(plugins.concat("common.js")) - .pipe(gulp.dest("build/firefox/content/web-developer/common/javascript")), - gulp.src(["source/common/javascript/cookies/cookies.js", "source/firefox/javascript/cookies/cookies.js"]) - .pipe(plugins.concat("cookies.js")) - .pipe(gulp.dest("build/firefox/content/web-developer/cookies")), - gulp.src(["source/common/javascript/locales/locales.js", "source/firefox/javascript/locales/locales.js"]) - .pipe(plugins.concat("locales.js")) - .pipe(gulp.dest("build/firefox/content/web-developer/locales")), - gulp.src("source/firefox/javascript/preferences/defaults.js") - .pipe(gulp.dest("build/firefox/defaults/preferences")), - gulp.src("source/firefox/javascript/preferences/preferences.js") - .pipe(gulp.dest("build/firefox/content/web-developer/preferences")), - gulp.src(["source/common/javascript/storage/storage.js", "source/firefox/javascript/storage/storage.js"]) - .pipe(plugins.concat("storage.js")) - .pipe(gulp.dest("build/firefox/content/web-developer/storage")), - gulp.src(["source/common/javascript/toolbar/element-ancestors.js", "source/firefox/javascript/toolbar/element-ancestors.js"]) - .pipe(plugins.concat("element-ancestors.js")) - .pipe(gulp.dest("build/firefox/content/web-developer/toolbar/javascript")), - gulp.src(["source/common/javascript/toolbar/element-ancestors.js", "source/firefox/javascript/toolbar/element-ancestors.js"]) - .pipe(plugins.concat("element-ancestors.js")) - .pipe(gulp.dest("build/firefox/content/web-developer/toolbar/javascript")), - gulp.src(["source/common/style-sheets/common/bootstrap/bootstrap.css", "source/common/style-sheets/common/bootstrap/font-awesome.css"]) - .pipe(plugins.concat("bootstrap.css")) - .pipe(plugins.replace("fonts/fontawesome-webfont", "../fonts/fontawesome-webfont")) - .pipe(gulp.dest("build/firefox/content/web-developer/common/style-sheets")), - gulp.src("source/common/style-sheets/generated/common.css") - .pipe(plugins.rename("generated.css")) - .pipe(global.filterPropertiesTask("firefox")()) - .pipe(gulp.dest("build/firefox/content/web-developer/common/style-sheets")), - gulp.src(["source/common/style-sheets/common/codemirror/codemirror.css", "source/common/style-sheets/common/codemirror/theme.css"]) - .pipe(plugins.concat("syntax-highlight.css")) - .pipe(gulp.dest("build/firefox/content/web-developer/common/style-sheets")), - gulp.src(["images/common/logos/favicon.ico", "images/common/logos/16.png", "images/common/logos/48.png", "images/common/logos/64.png", "images/common/logos/128.png"]) - .pipe(gulp.dest("build/firefox/content/web-developer/common/images/logos")), - gulp.src("source/common/fonts/*") - .pipe(gulp.dest("build/firefox/content/web-developer/common/fonts")) - ); -}); - -gulp.task("build-firefox-configuration", function() -{ - return gulp.src(["configuration/firefox/chrome.manifest", "configuration/firefox/install.rdf"]) - .pipe(global.filterPropertiesTask("firefox")()) - .pipe(gulp.dest("build/firefox")); -}); - -gulp.task("build-firefox-content", function() -{ - return gulp.src(["source/common/javascript/common/common.js", "source/firefox/javascript/common/common.js", "source/common/javascript/common/css.js", "source/common/javascript/content/content.js", "source/firefox/javascript/content/content.js"]) - .pipe(plugins.concat("content.js")) - .pipe(gulp.dest("build/firefox/content/web-developer/content")); -}); - -gulp.task("build-firefox-dashboard", function() -{ - return merge( - gulp.src("source/firefox/html/dashboard/*") - .pipe(global.filterPropertiesTask("firefox")()) - .pipe(gulp.dest("build/firefox/content/web-developer/dashboard")), - gulp.src("source/firefox/xul/dashboard/*") - .pipe(gulp.dest("build/firefox/content/web-developer/dashboard")), - gulp.src(["source/common/javascript/dashboard/dashboard.js", "source/firefox/javascript/dashboard/dashboard.js"]) - .pipe(plugins.concat("dashboard.js")) - .pipe(gulp.dest("build/firefox/content/web-developer/dashboard/javascript")), - gulp.src(["source/common/javascript/dashboard/element-information.js", "source/firefox/javascript/dashboard/element-information.js"]) - .pipe(plugins.concat("element-information.js")) - .pipe(gulp.dest("build/firefox/content/web-developer/dashboard/javascript")), - gulp.src(["source/firefox/javascript/dashboard/edit-html.js", "source/firefox/javascript/dashboard/style-information.js"]) - .pipe(gulp.dest("build/firefox/content/web-developer/dashboard/javascript")), - gulp.src(["source/common/javascript/dashboard/edit-css.js", "source/firefox/javascript/dashboard/edit-css.js"]) - .pipe(plugins.concat("edit-css.js")) - .pipe(gulp.dest("build/firefox/content/web-developer/dashboard/javascript")), - gulp.src(["source/common/javascript/toolbar/html/element-ancestors.js", "source/firefox/javascript/dashboard/html/*", "!source/firefox/javascript/dashboard/html/common.js"]) - .pipe(gulp.dest("build/firefox/content/web-developer/dashboard/javascript/html")), - gulp.src(["source/common/javascript/generated/common.js", "source/firefox/javascript/dashboard/html/common.js"]) - .pipe(plugins.concat("common.js")) - .pipe(gulp.dest("build/firefox/content/web-developer/dashboard/javascript/html")), - gulp.src(["source/common/style-sheets/dashboard/common.css", "source/firefox/style-sheets/dashboard/html/common.css"]) - .pipe(plugins.concat("common.css")) - .pipe(gulp.dest("build/firefox/content/web-developer/dashboard")), - gulp.src(["source/common/style-sheets/dashboard/element-information.css", "source/firefox/style-sheets/dashboard/dashboard.css"]) - .pipe(gulp.dest("build/firefox/content/web-developer/dashboard")), - gulp.src(["source/common/style-sheets/generated/common.css", "source/firefox/style-sheets/dashboard/html/style-information.css"]) - .pipe(plugins.concat("style-information.css")) - .pipe(gulp.dest("build/firefox/content/web-developer/dashboard")) - ); -}); - -gulp.task("build-firefox-dialogs", function() -{ - return merge( - gulp.src("source/firefox/xul/dialogs/*") - .pipe(gulp.dest("build/firefox/content/web-developer/dialogs")), - gulp.src("source/firefox/javascript/dialogs/*") - .pipe(gulp.dest("build/firefox/content/web-developer/dialogs/javascript")), - gulp.src("source/firefox/style-sheets/dialogs/*") - .pipe(gulp.dest("build/firefox/content/web-developer/dialogs/style-sheets")) - ); -}); - -gulp.task("build-firefox-features", function() -{ - return merge( - gulp.src(["source/common/style-sheets/features/**", "source/firefox/style-sheets/features/**"]) - .pipe(gulp.dest("build/firefox/content/web-developer/features/style-sheets")), - gulp.src("source/common/style-sheets/common/reset.css") - .pipe(plugins.rename("disable-browser-default-styles.css")) - .pipe(gulp.dest("build/firefox/content/web-developer/features/style-sheets/css")), - gulp.src("images/common/transparent.png") - .pipe(gulp.dest("build/firefox/content/web-developer/features/style-sheets/images")), - gulp.src("source/firefox/html/validation/*") - .pipe(global.filterPropertiesTask("firefox")()) - .pipe(gulp.dest("build/firefox/content/web-developer/validation")) - ); -}); - -gulp.task("build-firefox-generated", function() -{ - return merge( - gulp.src(["source/common/html/generated/*", "source/common/style-sheets/generated/*", "source/firefox/html/generated/*", "source/firefox/style-sheets/generated/*", "!source/common/style-sheets/generated/common.css"]) - .pipe(global.filterPropertiesTask("firefox")()) - .pipe(gulp.dest("build/firefox/content/web-developer/generated")), - gulp.src("source/common/javascript/generated/beautify/beautify.js") - .pipe(gulp.dest("build/firefox/content/web-developer/generated/javascript/beautify")), - gulp.src(["source/common/javascript/generated/*", "source/firefox/javascript/generated/*", "!source/common/javascript/generated/view-cookie-information.js"]) - .pipe(gulp.dest("build/firefox/content/web-developer/generated/javascript")), - gulp.src(["source/common/javascript/generated/view-cookie-information.js", "source/firefox/javascript/preferences/preferences.js"]) - .pipe(plugins.concat("view-cookie-information.js")) - .pipe(gulp.dest("build/firefox/content/web-developer/generated/javascript")) - ); -}); - -gulp.task("build-firefox-locales", function() -{ - return gulp.src("source/firefox/locales/**") - .pipe(global.filterPropertiesTask("firefox")()) - .pipe(gulp.dest("build/firefox/locale")); -}); - -gulp.task("build-firefox-options", function() -{ - return merge( - gulp.src("source/firefox/xul/options/**") - .pipe(gulp.dest("build/firefox/content/web-developer/options")), - gulp.src("source/common/html/options/syntax-highlight.html") - .pipe(global.filterPropertiesTask("firefox")()) - .pipe(gulp.dest("build/firefox/content/web-developer/options/html")), - gulp.src("source/firefox/javascript/options/options.js") - .pipe(gulp.dest("build/firefox/content/web-developer/options/javascript")), - gulp.src("source/firefox/javascript/options/dialogs/*") - .pipe(gulp.dest("build/firefox/content/web-developer/options/dialogs/javascript")), - gulp.src("source/common/javascript/options/syntax-highlight.js") - .pipe(gulp.dest("build/firefox/content/web-developer/options/html/javascript")), - gulp.src("source/firefox/style-sheets/options/options.css") - .pipe(gulp.dest("build/firefox/content/web-developer/options/style-sheets")), - gulp.src("source/common/style-sheets/options/syntax-highlight.css") - .pipe(gulp.dest("build/firefox/content/web-developer/options/html")) - ); -}); - -gulp.task("build-firefox-overlay", function() -{ - var overlay = gulp.src("source/firefox/xul/overlay/overlay.xul"); - - overlay.setMaxListeners(0); - - // Loop through the suffixes - for(var i = 0, l = global.firefoxOverlaySuffixes.length; i < l; i++) - { - // Loop through the menus - for(var j = 0, m = global.firefoxOverlayMenus.length; j < m; j++) - { - overlay.pipe(plugins.replace("${" + global.firefoxOverlaySuffixes[i].replace("-", ".") + "." + global.firefoxOverlayMenus[j].replace("-", ".") + "}", fs.readFileSync("build/firefox/overlay/" + global.firefoxOverlayMenus[j] + "-" + global.firefoxOverlaySuffixes[i] + ".xul", "utf8"))); - } - } - - return merge( - overlay.pipe(gulp.dest("build/firefox/content/web-developer/overlay")), - gulp.src(["source/common/javascript/features/*", "source/common/javascript/overlay/*", "source/common/javascript/toolbar/*", "source/firefox/javascript/application/*", "source/firefox/javascript/features/*", "source/firefox/javascript/overlay/*", "source/firefox/javascript/toolbar/*", "source/firefox/javascript/upgrade/*", "source/firefox/javascript/validation/*", "!source/common/javascript/toolbar/html/*"]) - .pipe(plugins.concat("overlay.js")) - .pipe(global.filterPropertiesTask("firefox")()) - .pipe(gulp.dest("build/firefox/content/web-developer/overlay/javascript")), - gulp.src("source/firefox/style-sheets/overlay/overlay.css") - .pipe(gulp.dest("build/firefox/content/web-developer/overlay/style-sheets")) - ); -}); - -gulp.task("build-firefox-menus", function() -{ - var menus = []; - - // Loop through the suffixes - for(var i = 0, l = global.firefoxOverlaySuffixes.length; i < l; i++) - { - // Loop through the menus - for(var j = 0, m = global.firefoxOverlayMenus.length; j < m; j++) - { - menus.push(global.buildFirefoxMenu(global.firefoxOverlayMenus[j], global.firefoxOverlaySuffixes[i])); - } - } - - return merge(menus); -}); - -gulp.task("build-firefox-skins", function() -{ - return merge( - gulp.src("source/firefox/style-sheets/skin/common.css") - .pipe(plugins.rename("web-developer.css")) - .pipe(gulp.dest("build/firefox/skin/default")), - gulp.src(["source/firefox/style-sheets/skin/common.css", "source/firefox/style-sheets/skin/mac.css"]) - .pipe(plugins.concat("web-developer.css")) - .pipe(gulp.dest("build/firefox/skin/mac")), - gulp.src("images/firefox/skins/**") - .pipe(gulp.dest("build/firefox/skin")), - gulp.src("images/common/logos/16.png") - .pipe(plugins.rename("button.png")) - .pipe(gulp.dest("build/firefox/skin/default")), - gulp.src("images/common/logos/16.png") - .pipe(plugins.rename("menu.png")) - .pipe(gulp.dest("build/firefox/skin/default")), - gulp.src("images/common/logos/16.png") - .pipe(plugins.rename("button.png")) - .pipe(gulp.dest("build/firefox/skin/mac/color")), - gulp.src("images/common/logos/16.png") - .pipe(plugins.rename("menu.png")) - .pipe(gulp.dest("build/firefox/skin/mac/color")), - gulp.src("images/common/logos/32.png") - .pipe(plugins.rename("button-2x.png")) - .pipe(gulp.dest("build/firefox/skin/default")), - gulp.src("images/common/logos/32.png") - .pipe(plugins.rename("menu-2x.png")) - .pipe(gulp.dest("build/firefox/skin/default")), - gulp.src("images/common/logos/32.png") - .pipe(plugins.rename("button-2x.png")) - .pipe(gulp.dest("build/firefox/skin/mac/color")), - gulp.src("images/common/logos/32.png") - .pipe(plugins.rename("menu-2x.png")) - .pipe(gulp.dest("build/firefox/skin/mac/color")), - gulp.src(["images/common/toolbar.png", "images/common/toolbar-2x.png"]) - .pipe(gulp.dest("build/firefox/skin/default")), - gulp.src("images/common/logos/monochrome/16.png") - .pipe(plugins.rename("button.png")) - .pipe(gulp.dest("build/firefox/skin/mac")), - gulp.src("images/common/logos/monochrome/32.png") - .pipe(plugins.rename("button-2x.png")) - .pipe(gulp.dest("build/firefox/skin/mac")), - gulp.src(["images/common/toolbar.png", "images/common/toolbar-2x.png"]) - .pipe(gulp.dest("build/firefox/skin/mac/color")), - gulp.src(["images/firefox/skins/default/options.png", "images/firefox/skins/default/options-2x.png"]) - .pipe(gulp.dest("build/firefox/skin/mac")), - gulp.src(["images/firefox/skins/default/*", "!images/firefox/skins/default/options.png", "!images/firefox/skins/default/options-2x.png"]) - .pipe(gulp.dest("build/firefox/skin/mac/color")) - ); -}); - -gulp.task("build-firefox-toolbars", function() -{ - return merge( - gulp.src("source/firefox/html/toolbar/element-ancestors.html") - .pipe(global.filterPropertiesTask("firefox")()) - .pipe(gulp.dest("build/firefox/content/web-developer/toolbar/html")), - gulp.src(["source/common/javascript/generated/common.js", "source/common/javascript/toolbar/html/element-ancestors.js"]) - .pipe(plugins.concat("element-ancestors.js")) - .pipe(gulp.dest("build/firefox/content/web-developer/toolbar/html/javascript")), - gulp.src("source/common/style-sheets/toolbar/element-ancestors.css") - .pipe(gulp.dest("build/firefox/content/web-developer/toolbar/html")), - gulp.src("source/common/style-sheets/toolbar/**") - .pipe(gulp.dest("build/firefox/content/web-developer/toolbar")) - ); + return global.buildAll("firefox"); }); gulp.task("clean-firefox", function() @@ -340,14 +17,20 @@ gulp.task("clean-firefox", function() return del(["build/firefox", "build/firefox.properties", "build/" + global.firefoxPackageName]); }); -gulp.task("clean-firefox-menus", function() +gulp.task("initialize-firefox-build", function(callback) { - return del("build/firefox/overlay"); + global.initializeBuild("firefox", callback); }); -gulp.task("initialize-firefox-build", function(callback) +gulp.task("install-firefox", function(callback) { - global.initializeBuild("firefox", callback); + process.chdir("build/firefox"); + exec.exec("../../node_modules/web-ext/bin/web-ext run --browser-console --start-url chrispederick.com", function(error, output, errors) + { + console.log(output); // eslint-disable-line no-console + console.log(errors); // eslint-disable-line no-console + callback(error); + }); }); gulp.task("package-firefox", function() @@ -355,5 +38,5 @@ gulp.task("package-firefox", function() return global.packageTask("firefox", global.firefoxPackageName); }); -gulp.task("build-firefox", function(callback) { runSequence("initialize-firefox-build", "build-firefox-menus", "build-firefox-all", "clean-firefox-menus", callback); }); +gulp.task("build-firefox", function(callback) { runSequence("initialize-firefox-build", "build-firefox-all", callback); }); gulp.task("firefox", function(callback) { runSequence("build-firefox", "package-firefox", callback); }); diff --git a/gulp/lint.js b/gulp/lint.js index ad7bb8e..3521fbc 100644 --- a/gulp/lint.js +++ b/gulp/lint.js @@ -1,5 +1,6 @@ "use strict"; +var exec = require("child_process"); var gulp = require("gulp"); var plugins = require("gulp-load-plugins")(); @@ -18,4 +19,16 @@ gulp.task("lint-style-sheets", function() .pipe(plugins.csslint.reporter("compact")); }); -gulp.task("lint", ["lint-javascript", "lint-style-sheets"]); +gulp.task("lint-web-extension", function(callback) +{ + process.chdir("build/firefox"); + exec.exec("../../node_modules/web-ext/bin/web-ext lint -w", function(error, output, errors) + { + console.log(output); // eslint-disable-line no-console + console.log(errors); // eslint-disable-line no-console + callback(error); + }); + process.chdir("../.."); +}); + +gulp.task("lint", ["lint-javascript", "lint-style-sheets", "lint-web-extension"]); diff --git a/gulp/opera.js b/gulp/opera.js index e729cae..f003ebb 100644 --- a/gulp/opera.js +++ b/gulp/opera.js @@ -8,7 +8,7 @@ var runSequence = require("run-sequence"); gulp.task("build-opera-all", function() { - return global.chromiumAllTask("opera"); + return global.buildAll("opera"); }); gulp.task("clean-opera", function() diff --git a/images/chrome/icon-2x.png b/images/chrome/icon-2x.png deleted file mode 100644 index 6e04a99fd9ba155940aef15623aec34865c95df7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1050 zcmV+#1m*jQP)sI0aOTc@ziKC(?5HVUwD^dh|&~}P-q*c(rzmjDH1AqaOtp64lk!F|;kfu-7^ggf}+p zOh99>H7&-V#KI&5v|FTjc^mPW^ξ>(|gLrp0)LaJS4Yz)dRFf?Ncj>4K+& z>4GQ5IPSyP$ZjKD>;XoM^=-5|^vtl*g-&vnsvg@0JD5e+Jv>NK45vNg`!TlEux^zrL}-oyDU0`5NmKLdE_zjP+cWf zEajY+RF@k`d5i=ut@*@KihF@GJP=IA5V{4pZCLCUu!(aKtBcS-0=!U!8>nME4_;dC zA_=(=kLnvj*J>PdOWY2@y1)-!Yk|00mEKiQazm`3+}lPHI(d41awz*p6(I*V9ddaT zH_0Zvg8%>k07*qoM6N<$g4r0}J^%m! diff --git a/images/chrome/icon-color-2x.png b/images/chrome/icon-color-2x.png deleted file mode 100644 index 522c4ba70d0d845bc9f61061e02e38b430d0758b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2031 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 diff --git a/images/chrome/icon.png b/images/chrome/icon.png deleted file mode 100644 index ef9aa8402ee238ab7ea9ec28c442f7292dfcf000..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 515 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 R&m;f<002ovPDHLkV1hkmMF;=@ literal 0 HcmV?d00001 diff --git a/images/common/logos/512.png b/images/common/logos/512.png new file mode 100644 index 0000000000000000000000000000000000000000..097b08c63a2ed8827dbea587ba532a7117781209 GIT binary patch literal 235174 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�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 b|4!XHY?_RD@O;4HpQmb1ak9B*<)89Dcl$l4 literal 0 HcmV?d00001 diff --git a/images/common/logos/monochrome/24.png b/images/common/logos/monochrome/24.png new file mode 100644 index 0000000000000000000000000000000000000000..6600869a71288263871173675ec5bfdf623bde3c GIT binary patch literal 490 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 literal 0 HcmV?d00001 diff --git a/images/common/logos/monochrome/64.png b/images/common/logos/monochrome/64.png new file mode 100644 index 0000000000000000000000000000000000000000..6edb1af8f694ecdd6958c3f576e2b1575e86423c GIT binary patch literal 1851 zcmeH|`#aMM0LH&I$!&2Wm$_@0OK3PoXf@X`%Pg~#Te(KZvOOo4L}Eo5x%K20Z6hHL zu?RUXDPgk?DVLTAXA`-G;pqS9eV+IIJnygXFK-$a;{=g}N&)}?adEcy+$ZX%#libo z%(@`}0FWfs&C6lG{?e}n_7}MAe)rNoYABu<93TP$iyjaYmync(9Fmd!?XaBu5d}ph zWvHr}hNjk0n2xRr_uHfj!w=lZXVdPp69#?KEyxH z`}+9@T(}q%8h$Av@^TdEN;H{rH7@>oQc5cIc3S$KyBW01tem`p!lIIgrF3R_RZV@v zvqskQ=9U*7J+J!u2L{=kp?^m|j*U-#n))(5^L1{Xzp(Uud1ZBN{m16kws2?Hb#8zI z0HS6t_NTlET?5{He=oee@9d2;qdEQB@5;5))yp3svX$~fWQTJ4OyhZULFEIVd`2+# zgOt7|+WZ1CbM55%=gDUBHGPU)Ik6C164{k1h&+8w$B43kADBTa0~Y zR@ny{^8%cg--9iCb)mMf8u!W>lJzjC0tY2ir$?Uu9cJ@(ld@)QS1iVfVP*4fQ^}b+ zK$}!VfNRU;@YYuBOrateehw^cBr2|KBwl8smfX3G*CKS$L`yRnkV1l~YoCjaNU)DHL(Y5pWtVPae6vv7zpQ zN5f|FchgXP0>@aI!HtAKiycCwDAppFsn9V=D&!iYy1f}JP&BPr)_|^FMjGqk(3}?2 z?W#2}n|qI#uldfs$qmaTCc`Di;lCv~1bVkr#zjxfU6^R|ZZ6cLEGcSO_Bbl|q*4vC6FOSq(IglM# zf0Mm@BB<{%VSR&Yj{iVv;+jENq1ddjVn&+YN5M>P%$%x~Z@QMW)45O_+--=H{dMKV z`$HKO({IT)S>uVV_RuI~Jz`taLJ~)z^o{|gm9uO_@|R`|1lYKaKt~4!mt>nu;)IXX zu%4HA8POQk7g~*3k_0n~{wEDi*o0U6F+=&?JMfrYHI`mw(pc1aVZF4zoG-*l-pB)X z+%==eU&HeNr6d#J;v7eW6j_3;yOZ^9!;|)n``r>y?$X<>NjK~q4O3>hms;0NY;PVN qIx7fknNkdzaD_9yLJqzx7};yQZ%{u#=2!hZ02c?0{nOI{$^Qd$A8RE5 literal 0 HcmV?d00001 diff --git a/images/chrome/options-2x.png b/images/common/options-2x.png similarity index 100% rename from images/chrome/options-2x.png rename to images/common/options-2x.png diff --git a/images/chrome/options.png b/images/common/options.png similarity index 100% rename from images/chrome/options.png rename to images/common/options.png diff --git a/images/firefox/skins/default/close-2x.png b/images/firefox/skins/default/close-2x.png deleted file mode 100644 index 421e94684e3b1153cf907b5e4e4931b3a0aed7c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1729 zcmV;y20r6j0FA9J5g?8?Bg8bIi(`awezAYHGC9 zw455#9LFQY0~N|i!4uEag3%;RbZ}wuA)2E#^XvQH_kcxl0(7R{%!l9q_}%aS-(C9j z`9D8fjlADu@WJ=ekSi<==W8MR_dYo10GCUR{NNr3FN+TN^L(+DO8fd>#yq+gl{>aY z_`5HTwb76Eusd73n*ET?^Cm>G(zZ65~$b#8}}d6htaJC6UjBF zh$<38?qEIlUn{S$1>bYc96>i;%A%%e>D2npIQnf;I&BT-yOqS&w&2e{K{wwXNA78Z zsCh;fHOwlYiiBWvg3EoFVbR_cBZB9{D4m)nC(AsSO0Dysq6_2g1f6=Ei-#tGJqHqX zUz+Ts*0;uZY?~(AJ$~FTI;o)~kIF3umc)oohFgrB7Pu}=N+Z|QWNMsbQ%EEiWYg3X zYJIbqYH=pEAPEq6e{k44wjg-j#8hf|eH1lLv3u-0u#x)(2VEEyN6>>0PTk4DW+R{V zeT2XCOMWypJZ%AHMasCI9Y`(nMo~>cEJ3$^a~NmwvULFW`LT&4&CREVi8hbTb%iz` zXEH;nw4dl^`dzkg6H6jeEu9-~qHAMgAK>~k33LMi&J70Lw1_WrHokwSK zqG%&J0e$J$f*5j_enXUv~N4KugdL!rD*iV#B4ed*p3nS_B z$SBAtc?@}Fd>l2-dXnn$F&`aGjU|KW%9v&WsX?j{4!Aonydl}q2iSKYG4%l^6lMzTYnIJ<)wb^>A$u>Y5JoC1_ zT2Pr3Kx8sj4dZ+liFiA`3+&C{tOowW;eCW)srOoFotZEL6P{`75xAgz8}!P)Z- zPA`y-4;1Jm0-dreGD+ybE>jJiufsSONO~;6SD_LhRhZRu0)ZIE2l5X{mYh5mXph;S zRvCHMsxU6)k%E62s&al6%1L|Eg6O0(kg5~q3O%rKA}`avCXY{K>Zt-}2DUEv=v@*k zLpdjqen{5S@j*H|V&lCK?t^cahZzazOjZz;57ZHSxIxd7SP{ZGfmD&Cr|L8v913(O zftRI~_l#MFemLv)YIWq9UZXn z?HsfSva||R9>)`OrRBjYX;%z~fNW1tbQNj!r)p;q?TptlT{m>Qz8O^(LB-^hK@~?T8nd4U*{MdO}%^ z&CI0+PTHBEqeD1Al{m?j7JpgB3$!0pp`typJh3D{FsQO&%6{?kiwvp^W?L4^5>V_w z6>d%y><=V}#6C@T#A=A?EelemcYf!=DglcZx5tT8We=qNR+08wG_=o)sss(Lmzq8^ za4qw7emO7;1bT(Qd4Z}SOAM;!-EnHFOz5y@zL>1EY3V?kfwuG)@H$kD@T2XN#OHc0 zbw#MqvOSs^iu99N^hib}*kjhv50u+6L#6w@e0U_- z87tDt5dJP=jrWf21K2+xS~xFW8pOA58vr95oPB03Ra&)FVbRiJgV0(m`c8pfA}|As zA{ka?ZiCLGPmyR@9P5JC1eBZ$SaNuNtKr9#l*pJj0B@uSjhGuGf=6tN=h`~p{VG(-;j$E}eHJbfRX4NMKCdZl z4*_Z=S)VR$Gh6dj9P5B-nA&$bd`NgL%P`LbMj$-I{=sLa+E0AcFS7+|RY11`{uj?b X*EHD?RKtDp00000NkvXXu0mjfS-3hg diff --git a/images/firefox/skins/default/close.png b/images/firefox/skins/default/close.png deleted file mode 100644 index 374d3834e19f5d2d26313a394a9b8130c3d6b824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 687 zcmV;g0#N;lP)CE&o!L#BHqnN}P11aH(|k3F)~aBO3W8MxK|yoSqWEzX@!(Aa@6v-P-W1zP zvG!oqe#AgFwM}DVsv;HwNkd{++XTfw;q}deOG~Sl!amH)yYqWyc4i3xYzeJMh|HU? z(|Os(q<>A0i$ZI{!IHIcoj`VSyHf!}Md{lQb6w`u%_MQR(3W&%yK+79M>tdZ1S zb2WFO4OUM}uyXSx%PZr2wUjSpHc-TgZF^NJJSI>lTj4-v1V{h12zd=IqsjC%FF+3!4 z#c?-<_qe+3r!ZutdF+*CABA*)!lWB}V!blBMndFv(lTmeo&k{-UpXku`57dU0SlLZ zC<^vR7T$?QI%h%>U>Gyn8T6Z&^i1R`F_hdlaTSRtmoeChcn}E*`FL{ifr(Y8 zBprSl`*FLOcda|bTTRT<-^``G4dgrqoQQzbA=?m&Sp5Qt-fQAA*Yu>l*4G4E;SZl& V4}+UXx%L16002ovPDHLkV1izXKA->q diff --git a/images/firefox/skins/default/dashboard-2x.png b/images/firefox/skins/default/dashboard-2x.png deleted file mode 100644 index c511835b7459363eb8115f97ebcd77dc8fe2d978..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11932 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 diff --git a/images/firefox/skins/default/disabled.png b/images/firefox/skins/default/disabled.png deleted file mode 100644 index 94a6d95f779ab3dc833710960f2f0167e3818bee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 888 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 TwzS7O00000NkvXXu0mjfv%2|d diff --git a/images/firefox/skins/default/statusbar.png b/images/firefox/skins/default/statusbar.png deleted file mode 100644 index 674d4f3d7413ad5233fff89c310bc8a7804e0103..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1913 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 R!6X0x002ovPDHLkV1j_@`@8@E diff --git a/images/firefox/skins/default/validation.png b/images/firefox/skins/default/validation.png deleted file mode 100644 index 52ba10935d9c1caec2e8bdcf50c589c0cbd8ccd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1779 zcmVFxU_=m<#ia@@Dz;j+O5M^HtF@Ju zacgDj0y@=NTu`Z)7IoaH)^Sv7rIi*JF!A=?UzkY{I@Ou}nKSSHd(Zv<-1pyq@3L4n zmrN#8NPT?PNF`qTe7(Kv{Cx&r_V@9*95BT9T%f<-!5|sEDO4sKPN=JSXO6ocSZS-NR$3&W@`woi;Z5W|eLQJF@a2%nIAhwD@EWs$vFo=#+{U()4 z2fnJn(HkZGN=jJ0yNi8G4@xsfQV;LtkA~K-KZd8(!_|Zgu9!?dhLZ5hy{WJIOb$! zHf${`dsbZZ*4@-J{W;^z>^ikteGFqlfneXOh)*c=o0PUJ)UxN~D$uV`JufJY&+d%j z@<3s&U%U_Z3zOkat`_di9Rm**B``o6eHi<5+X`qLHyAMIg_j5@!44dkl`O6Tfamv` z?jNYyziaiib4QNPG9>TCm`EVl{j%Z{7y3?{R2*de{K$M*zb_5G_--*I&I`8Wl%xo^ zlXZPwMYTP6cRDoX#=({JXn1Ho12;?Gh8xo(8K8|mj5Xzrga;+l0CUPk1KjOiL{U^3 zj={l0r<^)mS%0;vti6774(weqqe-IzCX!thKtOO#Qhv-^36@@`#;6+xrc4X(!zh6b$!>Sj-cM=dSzgos9rh%|~V>Mr7$tuugo>td7uE^CBvX}AD>2`irj9S zGi1EjIW$e!USJA?%ylxz+cXrkbG^tYXYOZy5CE!lkwtBIQ9Sbx3}M%rReZRhc7b{# zuzubQc-Y(wEo9bhfj*2O2f3JY$e(S$goHxjE*zIE%&!6KGwYpGUp_y!cKWl6HC1;P z&dE5=a9o6YY;(wN)oWaiPpZ-&vSbjk#a$m@3fqc=EdUUvf5-f**;n z(+X#}dGs(e6R{6|ZGvNl2@KFiAI6Y_T+G?+>9ox5VXiL1s=*#!`}5PrK5D*l8g3t6 z19c_?)NUz){A7(q=0D`9fT9j`CnP*gl%SmEYRMqNjqlSii_CtQ-qni!e``Iqu={&e z`?1^1MAR9%GaONf;d=FcsGVbg8k)lZZS-LbIamPZV6N@6I3gF9t1_B~VR9N)&q{$$ z@)MzK&KM}sYaudF3c<1fAYbVhthGBaF?#p0O7bITmy%^eiU~{NdNPiR=76Ku`GQjPfWq*`o{vd)7&(MJ@gA=HB?+C}$8_p{zFo#fZn&!bNKQ05b(T6eQREQjRcGpU992^|pi60r;oHx@5 zIq3#S8=nAU;$k3Lr2>swh5gW99499eo@ZUe^zINy;Y1MNRx0Z#>h=F{-t{MNTjrn|C%w&yUQ1Tg|jXsPOIJ{m$xIP4qJ)TG2VzFK(m9FxWNVa%+xovf!xNCR= z2WDW?`agBiy*i5ZRFJP*?9}H=6Q}R>&v*m=K$tlF8Veo!>Hq$3!t-;BOUj VixE0nHBtZo002ovPDHLkV1g#6RDJ*e diff --git a/images/firefox/skins/mac/close-2x.png b/images/firefox/skins/mac/close-2x.png deleted file mode 100644 index a3bd2da273673307d71288dc1ef5939c19d839d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 375 zcmV--0f_#IP)S7=>YH;#yp&2zoafP1RND?I|Qp+Spq4;xx4`{CpPyLv%VniRdB+o=q8;Lo?rm z?1;#p8VU>re*W=$&an^I>>)-o!3AQx;SsJ`V1uM%o>|dEo+}}>iY;ZO2`%|?ksDTh(Zrx zgd7rRj@_rap(S&jJb=#8Uy? zwSYzn36vuWEuc_1Y>+vOqxLOufP3qxePwQ0`+yUl0_FjD#Hnn(2h1- z+iP5f9>P(p#L}?2=>@jNP1i9@u)#AlY*AR@9oKzbL}MJoHHVm>nc=%&DDXcEd;+Hj VLahSDKivQT002ovPDHLkV1lAroJarw diff --git a/images/firefox/skins/mac/close.png b/images/firefox/skins/mac/close.png deleted file mode 100644 index b0231070c91fc74d8628e39793f393ff7bf4a8c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-goPB!E^pupq0`|9TK zT_LR6d$Z3x5Rf~{wrdL8y-6+kXRf=t#CY zIT0(ez{BY5k{#15{KPiwj(u>W`Gw$vLmqXTHWs~^{d!KEboa^h^}UT@7nAIk$k#06 Zdl($P{eJHAr$7fVc)I$ztaD0e0sz{RMrQy3 diff --git a/images/firefox/skins/mac/dashboard-2x.png b/images/firefox/skins/mac/dashboard-2x.png deleted file mode 100644 index 5dc5624dbe7ec2ed579a85e7b69cad9f8e69445b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2433 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 XQn5%iGfDrl00000NkvXXu0mjfF8%;{ diff --git a/images/firefox/skins/mac/disabled.png b/images/firefox/skins/mac/disabled.png deleted file mode 100644 index 408d3fade56ac906a9976551dcdf53937c75d1ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278 zcmV+x0qOpUP)MXnIa=PfLDk@vJ4?grDfO=rp5ms|CeZH zH@ul)M)*I4G}d%nnV7hCXgw(|LBm6#@li7mwtNdy7uwn`&4q>S43rFo@S>8g+cXeH z$_Y3S=H7&{dP=HhLN@_7!kL33wOwQ7@1^;cE$6tdJb&3%zu3Mruxk`vi1^ zx#|k}6ppeppM`;qlvIp_@S2@T!$O$qX=yq2A^h0Mzq;v3{?$XfK6wwOtp}|Y35-b*J5>ZqXeb9=6FZDrGR4R%U zqo62FY|}KGwn?m7OA)*vN^5AuD3$u41xu3}Nm|J!Kfe$2FdSxfX1C{9lG#6eUb1sJ zm;anOb7pdpq>=BpwWZ^&MN85) zFouzKT<(QM?6(BBBt8L%i}4C(Asj)2h2yqDo`)QE{v@(U6|i3#Lzuu#iA@0FDtrZb zhOykjaVszkc}`%F<+9(33CPnECkcoQ_ClU9+?==sAX+gFd458JrDHz@8D6wl_H~$s z47-qy811r<;Vf=XOac(kK|a5s(bBQ6z!+pWhgFu&u>zk%0lJV5x$=9V00U^6_X$8$ z;v>js9IGv!;{ymI==F?3*k|!PMlqE5ViOoGCXFv z@?Ss^3Gjo>Mkgw;FV9HO0|n@H(D_So5(;su&?E>tNfjCkoaz4p8Q!*B`8Fsr0e~kR zJj(8eV%pY8hbE_))USWl!Qv3BAiPyf0&IW+4B@hXd;T#fz-G%8zZ(BQh6BEBzJv@ptZ~p0 zyP*&}940^~gzHfq;#vsXi@gPGLJl(giW|IbYVb7_;C%-b?}7sS=({RMp#Yy)zWTFJ z0Oz9saUX;!Ooo_(aR2#C0y{7Z879zyZYaPBEVW$eJD?CJQHdIyhC;Miy8rh~r1Gp7?sV`tSdY&j!$CAz zT?ir`g(Ccg6%JOr{($nxVaziF<#7fpix~Fz#(B;s$}s>1=s}r-+regR!|P~AjgzHd z;$bL{Ee@{!ZBT?x)S?bMpa>rpxUxBrXV@gFEoK>7Fk9%_K2Z^}STv10=k(h^;%Ugx?%?YG6pGK8Q$P|- z8gKP7aVCw%oZxRX&x;R2h%J!ksDqas_dqe_@UJHa#q>x4+<~ehI-E+@Ok%;_jg#dW*jhe)cVq72k|4aZ>0K53Wu*cX^ zT;K|2%KqbcK*;4<6CN@8D*;eJTtG0O7(WFurj>KNLXfmWpqi0}Ad~k1s2;>1m{5$b z!W~u-MhsPo&$S|Bg;0kEYw;;GE5CCG_Hlqt&j6@Ol(;k+L>7V-<>Z?X>%Cx0`PmjL zglD`!koLKFap=k!05yzz%sUzl;T?h_<>YO6a|z%L?aCe@#34oujXt*PA-1t(Y$Ebi z0J9Jyf>QKad-599%E^x*&H#)PWse5LAjSjgeFm_BIU|gy*A|$880WZw7$eGwhafov zfa3J9A9x8Q9S_FuZh>ykhafc%afm7>t-vM3a*8vEWW=)#`Stv&^) zMTn6=P&wfo#On?)7IO5+x;^lyR{PqIAA{5~1YzakYw+YFfM?V?dX!@VaWv&P9pV_v z%kKbc!N={khAi$Zw@4#}TgSC5)?NA(7yb+t0?4mVj82~*fYDX300000NkvXXu0mjf Dib&!h diff --git a/images/firefox/skins/mac/toolbar-2x.png b/images/firefox/skins/mac/toolbar-2x.png deleted file mode 100644 index df400c87efcf4ca172d187af776da2246ca01fef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3841 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 diff --git a/images/firefox/skins/mac/toolbar.png b/images/firefox/skins/mac/toolbar.png deleted file mode 100644 index 4347b5ed79be5a57c04d078ebeb4e8aa649eb5c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1793 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 li").length === 0) - { - WebDeveloper.Dashboard.removeDashboard(contentDocument); - } -}; - -// Create the dashboard -WebDeveloper.Dashboard.createDashboard = function(contentDocument, dashboardHTML) -{ - var dashboard = contentDocument.createElement("iframe"); - var dashboardDocument = null; - var resizer = null; - - dashboard.setAttribute("id", "web-developer-dashboard"); - - WebDeveloper.Common.getDocumentBodyElement(contentDocument).appendChild(dashboard); - - dashboardDocument = dashboard.contentDocument; - window.WebDeveloperEvents = window.WebDeveloperEvents || {}; - window.WebDeveloperEvents.Dashboard = window.WebDeveloperEvents.Dashboard || {}; - window.WebDeveloperEvents.Dashboard.mouseUp = WebDeveloper.Dashboard.mouseUp; - - WebDeveloper.Common.toggleStyleSheet("dashboard/style-sheets/dashboard.css", "web-developer-dashboard-styles", contentDocument, false); - WebDeveloper.Common.toggleStyleSheet("dashboard/style-sheets/common.css", "web-developer-dashboard-styles", dashboardDocument, false); - - WebDeveloper.Common.getDocumentBodyElement(dashboardDocument).innerHTML = dashboardHTML; - - WebDeveloper.Common.includeJavaScript("@common.prefix@/common/javascript/jquery/jquery.js", dashboardDocument, function() - { - WebDeveloper.Common.includeJavaScript("@common.prefix@/common/javascript/bootstrap/tab.js", dashboardDocument, function() - { - WebDeveloper.Common.includeJavaScript("dashboard/javascript/html/dashboard.js", dashboardDocument); - }); - }); - - resizer = dashboardDocument.getElementById("web-developer-dashboard-resizer"); - - contentDocument.addEventListener("mouseup", window.WebDeveloperEvents.Dashboard.mouseUp, false); - dashboardDocument.addEventListener("mousemove", WebDeveloper.Dashboard.mouseMove, false); - dashboardDocument.addEventListener("mouseup", WebDeveloper.Dashboard.mouseUp, false); - resizer.addEventListener("mousedown", WebDeveloper.Dashboard.resizerMouseDown, false); - - // Get the dashboard templates - chrome.extension.sendMessage({ item: "dashboard_height", type: "get-storage-item" }, function(response) - { - var height = response.value; - - // If the dashboard height value was returned - if(height) - { - var pixels = height.indexOf("px"); - - // If there are pixels in the height - if(pixels != -1) - { - height = height.substring(0, pixels); - } - - WebDeveloper.Dashboard.resize(height); - } - }); -}; - -// Returns the dashboard -WebDeveloper.Dashboard.getDashboard = function(contentDocument) -{ - return contentDocument.getElementById("web-developer-dashboard"); -}; - -// Handles the mouse move event -WebDeveloper.Dashboard.mouseMove = function(event) -{ - // If resizing the dashboard - if(WebDeveloper.Dashboard.resizing) - { - WebDeveloper.Dashboard.resize(WebDeveloper.Dashboard.getDashboard(WebDeveloper.Common.getContentDocument()).offsetHeight - event.pageY); - } -}; - -// Handles the mouse up event -WebDeveloper.Dashboard.mouseUp = function() -{ - WebDeveloper.Dashboard.resizing = false; -}; - -// Opens a dashboard tab -WebDeveloper.Dashboard.openDashboardTab = function(tabId, title, contentDocument, templates) -{ - var dashboard = WebDeveloper.Dashboard.getDashboard(contentDocument); - var dashboardDocument = null; - var panels = null; - var tabs = null; - - // If the dashboard does not already exist - if(!dashboard) - { - WebDeveloper.Dashboard.createDashboard(contentDocument, templates.dashboard); - - dashboard = WebDeveloper.Dashboard.getDashboard(contentDocument); - } - - dashboardDocument = dashboard.contentDocument; - - panels = dashboardDocument.getElementById("web-developer-dashboard-panels"); - tabs = dashboardDocument.getElementById("web-developer-dashboard-tabs"); - - WebDeveloper.Common.removeClass(panels.querySelector(".active"), "active"); - WebDeveloper.Common.removeClass(tabs.querySelector(".active"), "active"); - - WebDeveloper.Common.appendHTML(templates.panel, panels, dashboardDocument); - WebDeveloper.Common.appendHTML(templates.tab, tabs, dashboardDocument); - - return dashboardDocument.getElementById(tabId + "-panel"); -}; - -// Removes the dashboard -WebDeveloper.Dashboard.removeDashboard = function(contentDocument) -{ - WebDeveloper.Common.removeMatchingElements("#web-developer-dashboard", contentDocument); - WebDeveloper.Common.toggleStyleSheet("dashboard/style-sheets/dashboard.css", "web-developer-dashboard-styles", contentDocument, false); - - contentDocument.removeEventListener("mouseup", window.WebDeveloperEvents.Dashboard.mouseUp, false); - - window.WebDeveloperEvents.Dashboard = null; -}; - -// Resizes the dashboard -WebDeveloper.Dashboard.resize = function(height) -{ - var contentDocument = WebDeveloper.Common.getContentDocument(); - var dashboard = WebDeveloper.Dashboard.getDashboard(contentDocument); - - dashboard.style.setProperty("height", height + "px", "important"); - - WebDeveloper.Dashboard.adjustBodyBottomMargin(contentDocument, height); - WebDeveloper.EditCSS.resize(dashboard); - WebDeveloper.ElementInformation.resize(dashboard); - - // Get the dashboard templates - chrome.extension.sendMessage({ item: "dashboard_height", type: "set-storage-item", value: height }, function() - { - // Ignore - }); -}; - -// Handles the resizer mouse down event -WebDeveloper.Dashboard.resizerMouseDown = function(event) -{ - // If the click was not a right click - if(event.button != 2) - { - WebDeveloper.Dashboard.resizing = true; - } -}; diff --git a/source/chrome/javascript/dashboard/edit-css.js b/source/chrome/javascript/dashboard/edit-css.js deleted file mode 100644 index 936a60a..0000000 --- a/source/chrome/javascript/dashboard/edit-css.js +++ /dev/null @@ -1,150 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.EditCSS = WebDeveloper.EditCSS || {}; - -// Adds a tab -WebDeveloper.EditCSS.addTab = function(title, css, tabs, panels, position, contentDocument) -{ - var active = ""; - - if(position == 1) - { - active = "active"; - } - - // Get the edit CSS tab templates - chrome.extension.sendMessage({ active: active, css: css, position: position, title: title, type: "get-edit-css-tab-templates" }, function(response) - { - WebDeveloper.Common.appendHTML(response.panel, panels, contentDocument); - WebDeveloper.Common.appendHTML(response.tab, tabs, contentDocument); - }); -}; - -// Applies the CSS -WebDeveloper.EditCSS.apply = function() -{ - // If the content document is set - if(WebDeveloper.EditCSS.contentDocument) - { - WebDeveloper.EditCSS.applyCSS(); - } -}; - -// Edits the CSS of the page -WebDeveloper.EditCSS.editCSS = function(edit, contentDocument, locale) -{ - // If editing the CSS - if(edit) - { - WebDeveloper.EditCSS.contentDocument = contentDocument; - - WebDeveloper.EditCSS.loadDashboardTemplates(locale); - } - else - { - WebDeveloper.EditCSS.contentDocument = contentDocument; - - WebDeveloper.EditCSS.stopUpdate(); - WebDeveloper.EditCSS.resetDocument(); - WebDeveloper.Dashboard.closeDashboardTab("edit-css", contentDocument); - - WebDeveloper.EditCSS.contentDocument = null; - } -}; - -// Returns the styles containers -WebDeveloper.EditCSS.getStylesContainers = function() -{ - var dashboard = WebDeveloper.Dashboard.getDashboard(WebDeveloper.EditCSS.contentDocument); - var stylesContainers = []; - - // If the dashboard was found - if(dashboard) - { - stylesContainers = dashboard.contentDocument.getElementById("edit-css-panel").getElementsByTagName("textarea"); - } - - return stylesContainers; -}; - -// Returns the styles in a container -WebDeveloper.EditCSS.getStylesFromContainer = function(stylesContainer) -{ - return stylesContainer.value; -}; - -// Loads the dashboard templates -WebDeveloper.EditCSS.loadDashboardTemplates = function(locale) -{ - // Get the dashboard templates - chrome.extension.sendMessage({ dashboardTitle: locale.dashboardTitle, tabId: "edit-css", title: locale.editCSS, type: "get-edit-css-dashboard-templates" }, function(response) - { - // If the dashboard template was returned - sometimes this fails - if(response.dashboard) - { - var dashboardPanel = WebDeveloper.Dashboard.openDashboardTab("edit-css", locale.editCSS, WebDeveloper.EditCSS.contentDocument, response); - - WebDeveloper.EditCSS.retrieveCSS(dashboardPanel, response.editCSS, locale); - WebDeveloper.CSS.toggleAllStyleSheets(true, WebDeveloper.EditCSS.contentDocument); - WebDeveloper.EditCSS.update(); - } - else - { - WebDeveloper.EditCSS.loadDashboardTemplates(WebDeveloper.EditCSS.contentDocument, locale); - } - }); -}; - -// Resizes the edit CSS elements -WebDeveloper.EditCSS.resize = function(dashboard) -{ - var editCSSPanels = dashboard.contentDocument.getElementById("web-developer-edit-css-panels"); - - // If the edit CSS panels exist - if(editCSSPanels) - { - editCSSPanels.style.height = dashboard.offsetHeight - editCSSPanels.offsetTop - 1 + "px"; - } -}; - -// Retrieves the CSS for the document -WebDeveloper.EditCSS.retrieveCSS = function(dashboardPanel, editCSSPanel, locale) -{ - var documentCSS = WebDeveloper.Content.getDocumentCSS(WebDeveloper.EditCSS.contentDocument, true); - - dashboardPanel.innerHTML = editCSSPanel; - - // Get the style sheet content - chrome.extension.sendMessage({ errorMessage: "/* " + locale.couldNotLoadCSS + " */", type: "get-url-contents", urls: documentCSS.styleSheets }, function(response) - { - var dashboardDocument = WebDeveloper.Dashboard.getDashboard(WebDeveloper.EditCSS.contentDocument).contentDocument; - var panels = dashboardDocument.getElementById("web-developer-edit-css-panels"); - var position = 1; - var styleSheet = null; - var tabs = dashboardDocument.getElementById("web-developer-edit-css-tabs"); - - // Loop through the style sheets - for(var i = 0, l = response.length; i < l; i++) - { - styleSheet = response[i]; - - WebDeveloper.EditCSS.addTab(WebDeveloper.Dashboard.formatURL(styleSheet.url), styleSheet.content, tabs, panels, position, dashboardDocument); - - position++; - } - - // If there are embedded styles - if(documentCSS.embedded) - { - WebDeveloper.EditCSS.addTab(locale.embeddedStyles, documentCSS.embedded, tabs, panels, position, dashboardDocument); - } - - // If there is no CSS - if(!documentCSS.styleSheets.length && !documentCSS.embedded) - { - WebDeveloper.EditCSS.addTab(locale.editCSS, "", tabs, panels, position, dashboardDocument); - } - - window.setTimeout(function() { WebDeveloper.EditCSS.resize(WebDeveloper.Dashboard.getDashboard(WebDeveloper.EditCSS.contentDocument)); }, 100); - }); -}; diff --git a/source/chrome/javascript/dashboard/element-information.js b/source/chrome/javascript/dashboard/element-information.js deleted file mode 100644 index 7fc99ff..0000000 --- a/source/chrome/javascript/dashboard/element-information.js +++ /dev/null @@ -1,93 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.ElementInformation = WebDeveloper.ElementInformation || {}; -WebDeveloper.ElementInformation.breadcrumbHeight = 37; -WebDeveloper.ElementInformation.locale = null; - -// Displays the information for an element -WebDeveloper.ElementInformation.displayElementInformation = function(element) -{ - var contentDocument = WebDeveloper.Common.getContentDocument(); - var generatedDocument = WebDeveloper.Dashboard.getDashboard(contentDocument).contentDocument; - var elementInformation = generatedDocument.getElementById("element-information-content"); - var dispatchEvent = generatedDocument.createEvent("Events"); - - WebDeveloper.Common.empty(elementInformation); - elementInformation.appendChild(WebDeveloper.ElementInformation.generateElementInformation(element, contentDocument, generatedDocument, "none")); - - dispatchEvent.initEvent("web-developer-initialize-ancestors-event", true, false); - generatedDocument.querySelector("#element-information-content .breadcrumb").dispatchEvent(dispatchEvent); -}; - -// Returns a string from the locale -WebDeveloper.ElementInformation.getLocaleString = function(name) -{ - return WebDeveloper.ElementInformation.locale[name]; -}; - -// Initializes the display element information dashboard -WebDeveloper.ElementInformation.initialize = function(display, contentDocument, locale) -{ - // If displaying the element information dashboard - if(display) - { - WebDeveloper.ElementInformation.locale = locale; - window.WebDeveloperEvents = window.WebDeveloperEvents || {}; - window.WebDeveloperEvents.ElementInformation = window.WebDeveloperEvents.ElementInformation || {}; - window.WebDeveloperEvents.ElementInformation.click = WebDeveloper.ElementInformation.click; - window.WebDeveloperEvents.ElementInformation.mouseOver = WebDeveloper.ElementAncestors.mouseOver; - - WebDeveloper.ElementInformation.loadDashboardTemplates(contentDocument, locale); - - contentDocument.addEventListener("click", window.WebDeveloperEvents.ElementInformation.click, true); - contentDocument.addEventListener("mouseover", window.WebDeveloperEvents.ElementInformation.mouseOver, false); - } - else - { - WebDeveloper.Dashboard.closeDashboardTab("element-information", contentDocument); - - contentDocument.removeEventListener("click", window.WebDeveloperEvents.ElementInformation.click, true); - contentDocument.removeEventListener("mouseover", window.WebDeveloperEvents.ElementInformation.mouseOver, false); - WebDeveloper.ElementAncestors.removeOutline(contentDocument); - - window.WebDeveloperEvents.ElementInformation = null; - } - - WebDeveloper.Common.toggleStyleSheet("toolbar/element-ancestors.css", "web-developer-element-information-styles", contentDocument, false); -}; - -// Loads the dashboard templates -WebDeveloper.ElementInformation.loadDashboardTemplates = function(contentDocument, locale) -{ - // Get the dashboard templates - chrome.extension.sendMessage({ dashboardTitle: locale.dashboardTitle, selectAnElementDisplayInformation: locale.selectAnElementDisplayInformation, tabId: "element-information", title: locale.elementInformation, type: "get-element-information-dashboard-templates" }, function(response) - { - // If the dashboard template was returned - sometimes this fails - if(response.dashboard) - { - var dashboardPanel = WebDeveloper.Dashboard.openDashboardTab("element-information", locale.elementInformation, contentDocument, response); - - dashboardPanel.innerHTML = response.elementInformation; - - dashboardPanel.addEventListener("click", WebDeveloper.ElementInformation.clickOutput, false); - - window.setTimeout(function() { WebDeveloper.ElementInformation.resize(WebDeveloper.Dashboard.getDashboard(contentDocument)); }, 100); - } - else - { - WebDeveloper.ElementInformation.loadDashboardTemplates(contentDocument, locale); - } - }); -}; - -// Resizes the element information elements -WebDeveloper.ElementInformation.resize = function(dashboard) -{ - var elementInformationPanel = dashboard.contentDocument.getElementById("element-information-panel"); - - // If the element information panel exists - if(elementInformationPanel) - { - elementInformationPanel.style.height = dashboard.offsetHeight - elementInformationPanel.offsetTop - WebDeveloper.ElementInformation.breadcrumbHeight + "px"; - } -}; diff --git a/source/chrome/javascript/locales/locales.js b/source/chrome/javascript/locales/locales.js deleted file mode 100644 index 6f312ee..0000000 --- a/source/chrome/javascript/locales/locales.js +++ /dev/null @@ -1,15 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Locales = WebDeveloper.Locales || {}; - -// Returns a formatted string from the locale -WebDeveloper.Locales.getFormattedString = function(name, parameters) -{ - return chrome.i18n.getMessage(name, parameters); -}; - -// Returns a string from the locale -WebDeveloper.Locales.getString = function(name) -{ - return chrome.i18n.getMessage(name); -}; diff --git a/source/chrome/javascript/overlay/cookies.js b/source/chrome/javascript/overlay/cookies.js deleted file mode 100644 index b06ee96..0000000 --- a/source/chrome/javascript/overlay/cookies.js +++ /dev/null @@ -1,329 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.Cookies = WebDeveloper.Overlay.Cookies || {}; - -$(function() -{ - var addCookieExpires = $("#add-cookie-expires"); - var addCookieHost = $("#add-cookie-host"); - var addCookieName = $("#add-cookie-name"); - var addCookiePath = $("#add-cookie-path"); - var addCookieValue = $("#add-cookie-value"); - var disableCookiesMenu = $("#disable-cookies"); - - disableCookiesMenu.append(WebDeveloper.Locales.getString("disableCookies")).on("click", WebDeveloper.Overlay.Cookies.toggleCookies); - $("#add-cookie").append(WebDeveloper.Locales.getString("addCookieMenu")).on("click", WebDeveloper.Overlay.Cookies.addCookie); - $("#delete-domain-cookies").append(WebDeveloper.Locales.getString("deleteDomainCookies")).on("click", WebDeveloper.Overlay.Cookies.deleteDomainCookies); - $("#delete-path-cookies").append(WebDeveloper.Locales.getString("deletePathCookies")).on("click", WebDeveloper.Overlay.Cookies.deletePathCookies); - $("#delete-session-cookies").append(WebDeveloper.Locales.getString("deleteSessionCookies")).on("click", WebDeveloper.Overlay.Cookies.deleteSessionCookies); - $("#view-cookie-information").append(WebDeveloper.Locales.getString("viewCookieInformation")).on("click", WebDeveloper.Overlay.Cookies.viewCookieInformation); - - $("#add-cookie-cancel").on("click", WebDeveloper.Overlay.Cookies.cancelAddCookie); - $("#add-cookie-dialog").on("submit", function(event) { event.preventDefault(); }); - $("#add-cookie-submit").on("click", WebDeveloper.Overlay.Cookies.submitAddCookie); - - $("legend", $("#add-cookie-dialog")).text(WebDeveloper.Locales.getString("addCookie")); - $("#add-cookie-cancel").text(WebDeveloper.Locales.getString("cancel")); - $("#add-cookie-secure").after(WebDeveloper.Locales.getString("secureCookie")); - $("#add-cookie-session").after(WebDeveloper.Locales.getString("sessionCookie")).on("change", WebDeveloper.Overlay.Cookies.changeSession); - $("#add-cookie-submit").append(WebDeveloper.Locales.getString("add")); - $('[for="add-cookie-expires"]').text(WebDeveloper.Locales.getString("expires")); - $('[for="add-cookie-host"]').text(WebDeveloper.Locales.getString("host")); - $('[for="add-cookie-name"]').text(WebDeveloper.Locales.getString("name")); - $('[for="add-cookie-path"]').text(WebDeveloper.Locales.getString("path")); - $('[for="add-cookie-value"]').text(WebDeveloper.Locales.getString("value")); - - addCookieExpires.attr("placeholder", WebDeveloper.Locales.getString("expiresPlaceholder")); - addCookieHost.attr("placeholder", WebDeveloper.Locales.getString("hostPlaceholder")); - addCookieName.attr("placeholder", WebDeveloper.Locales.getString("namePlaceholder")); - addCookiePath.attr("placeholder", WebDeveloper.Locales.getString("pathPlaceholder")); - addCookieValue.attr("placeholder", WebDeveloper.Locales.getString("valuePlaceholder")); - addCookieExpires.add(addCookieHost).add(addCookieName).add(addCookiePath).add(addCookieValue).on("keypress", WebDeveloper.Overlay.Cookies.addCookieKeyPress); - - WebDeveloper.Overlay.updateContentSettingMenu(disableCookiesMenu, "cookies"); -}); - -// Adds a cookie -WebDeveloper.Overlay.Cookies.addCookie = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.tabs.sendMessage(tab.id, { type: "get-location-details" }, function(response) - { - var addCookieDialog = $("#add-cookie-dialog"); - - $("#add-cookie-expires").val(WebDeveloper.Cookies.getDateTomorrow()).prop("disabled", false); - $("#add-cookie-host").val(response.host); - $("#add-cookie-path").val(response.path); - $("#add-cookie-value").focus(); - - WebDeveloper.Overlay.Cookies.resetAddDialog(addCookieDialog); - - $(".tabbable, #confirmation, #notification").slideUp(WebDeveloper.Overlay.animationSpeed, function() - { - addCookieDialog.slideDown(WebDeveloper.Overlay.animationSpeed); - }); - }); - } - }); -}; - -// Handles a key press when adding a cookie -WebDeveloper.Overlay.Cookies.addCookieKeyPress = function(event) -{ - // If the enter key was pressed - if(event.keyCode == 13) - { - WebDeveloper.Overlay.Cookies.submitAddCookie(); - } -}; - -// Cancels adding a cookie -WebDeveloper.Overlay.Cookies.cancelAddCookie = function() -{ - $("#add-cookie-dialog").slideUp(WebDeveloper.Overlay.animationSpeed, function() - { - $(".tabbable").slideDown(WebDeveloper.Overlay.animationSpeed); - }); -}; - -// Handles the cookie session setting being changed -WebDeveloper.Overlay.Cookies.changeSession = function() -{ - var session = $(this); - - // If the session setting is checked - if(session.prop("checked")) - { - $("#add-cookie-expires").val("").prop("disabled", true); - } - else - { - $("#add-cookie-expires").val(WebDeveloper.Cookies.getDateTomorrow()).prop("disabled", false); - } -}; - -// Converts an array of cookies -WebDeveloper.Overlay.Cookies.convertCookies = function(cookies) -{ - var convertedCookies = []; - var cookie = null; - var cookieObject = null; - - // Loop through the cookies - for(var i = 0, l = cookies.length; i < l; i++) - { - cookie = {}; - cookieObject = cookies[i]; - - cookie.expires = cookieObject.expirationDate; - cookie.host = cookieObject.domain; - cookie.httpOnly = cookieObject.httpOnly; - cookie.name = cookieObject.name; - cookie.path = cookieObject.path; - cookie.secure = cookieObject.secure; - cookie.session = cookieObject.session; - cookie.value = cookieObject.value; - - convertedCookies.push(cookie); - } - - return convertedCookies; -}; - -// Deletes all the cookies for the current domain -WebDeveloper.Overlay.Cookies.deleteDomainCookies = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.cookies.getAll({}, function(allCookies) - { - chrome.tabs.sendMessage(tab.id, { allCookies: WebDeveloper.Overlay.Cookies.convertCookies(allCookies), type: "get-domain-cookies" }, function(cookies) - { - WebDeveloper.Cookies.deleteDomainCookies(cookies); - }); - }); - } - }); -}; - -// Deletes all the cookies for the current path -WebDeveloper.Overlay.Cookies.deletePathCookies = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.cookies.getAll({}, function(allCookies) - { - chrome.tabs.sendMessage(tab.id, { allCookies: WebDeveloper.Overlay.Cookies.convertCookies(allCookies), type: "get-path-cookies" }, function(cookies) - { - WebDeveloper.Cookies.deletePathCookies(cookies); - }); - }); - } - }); -}; - -// Deletes all session cookies -WebDeveloper.Overlay.Cookies.deleteSessionCookies = function() -{ - chrome.cookies.getAll({}, function(allCookies) - { - WebDeveloper.Cookies.deleteSessionCookies(WebDeveloper.Overlay.Cookies.convertCookies(allCookies)); - }); -}; - -// Populates a cookie from a dialog -WebDeveloper.Overlay.Cookies.populateCookieFromDialog = function() -{ - var cookie = {}; - - cookie.host = $("#add-cookie-host").val(); - cookie.name = $("#add-cookie-name").val(); - cookie.path = $("#add-cookie-path").val(); - cookie.value = $("#add-cookie-value").val(); - - // If the cookie is secure - if($("#add-cookie-secure").prop("checked")) - { - cookie.secure = true; - } - - // If the cookie is a session cookie - if($("#add-cookie-session").prop("checked")) - { - cookie.session = true; - } - else - { - cookie.expires = $("#add-cookie-expires").val(); - } - - return cookie; -}; - -// Resets the add cookie dialog -WebDeveloper.Overlay.Cookies.resetAddDialog = function(addDialog) -{ - $(".has-error", addDialog).removeClass("has-error"); - $(".help-block", addDialog).text(""); -}; - -// Adds a cookie -WebDeveloper.Overlay.Cookies.submitAddCookie = function() -{ - // If the dialog is valid - if(WebDeveloper.Overlay.Cookies.validateAddDialog()) - { - var cookie = WebDeveloper.Overlay.Cookies.populateCookieFromDialog(); - - WebDeveloper.Cookies.addCookie(cookie); - WebDeveloper.Overlay.Cookies.cancelAddCookie(); - WebDeveloper.Overlay.displayNotification(WebDeveloper.Locales.getFormattedString("cookieAdded", [cookie.name])); - } -}; - -// Toggles cookies -WebDeveloper.Overlay.Cookies.toggleCookies = function() -{ - WebDeveloper.Overlay.toggleContentSetting("cookies", $(this), "enableCookiesResult", "disableCookiesResult"); -}; - -// Returns true if the add dialog is valid -WebDeveloper.Overlay.Cookies.validateAddDialog = function() -{ - var expires = $("#add-cookie-expires"); - var host = $("#add-cookie-host"); - var hostValue = host.val().trim(); - var name = $("#add-cookie-name"); - var path = $("#add-cookie-path"); - var valid = true; - - WebDeveloper.Overlay.Cookies.resetAddDialog($("#add-cookie-dialog")); - - // If the cookie name is not set - if(!name.val()) - { - name.closest(".form-group").addClass("has-error"); - name.next(".help-block").text(WebDeveloper.Locales.getString("nameCannotBeEmpty")); - - valid = false; - } - - // If the cookie host is not set - if(!hostValue) - { - host.closest(".form-group").addClass("has-error"); - host.next(".help-block").text(WebDeveloper.Locales.getString("hostCannotBeEmpty")); - - valid = false; - } - else if(hostValue == "localhost" || hostValue == ".localhost") - { - host.closest(".form-group").addClass("has-error"); - host.next(".help-block").html(WebDeveloper.Locales.getString("extensionName") + " " + WebDeveloper.Locales.getString("hostCannotBeLocalhost")); - - valid = false; - } - - // If the cookie path is not set - if(!path.val()) - { - path.closest(".form-group").addClass("has-error"); - path.next(".help-block").text(WebDeveloper.Locales.getString("pathCannotBeEmpty")); - - valid = false; - } - - // If the cookie is not a session cookie - if(!$("#add-cookie-session").prop("checked")) - { - var expiresValue = expires.val().trim(); - - // If the cookie expires is not set - if(!expiresValue) - { - expires.closest(".form-group").addClass("has-error"); - expires.closest(".input-group").next(".help-block").text(WebDeveloper.Locales.getString("expiresCannotBeEmpty")); - - valid = false; - } - else if(new Date(expiresValue) == "Invalid Date") - { - expires.closest(".form-group").addClass("has-error"); - expires.closest(".input-group").next(".help-block").text(WebDeveloper.Locales.getString("expiresNotValid")); - - valid = false; - } - } - - return valid; -}; - -// Displays all the cookies for the page -WebDeveloper.Overlay.Cookies.viewCookieInformation = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.cookies.getAll({}, function(allCookies) - { - chrome.tabs.sendMessage(tab.id, { allCookies: WebDeveloper.Overlay.Cookies.convertCookies(allCookies), type: "get-cookies" }, function(data) - { - chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("generated/view-cookie-information.html"), tab.index, data, WebDeveloper.Overlay.Cookies.getViewCookieInformationLocale()); - }); - }); - } - }); -}; diff --git a/source/chrome/javascript/overlay/css.js b/source/chrome/javascript/overlay/css.js deleted file mode 100644 index ac6ace8..0000000 --- a/source/chrome/javascript/overlay/css.js +++ /dev/null @@ -1,263 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.CSS = WebDeveloper.Overlay.CSS || {}; - -$(function() -{ - $("#disable-all-styles").append(WebDeveloper.Locales.getString("disableAllStyles")).on("click", WebDeveloper.Overlay.CSS.disableAllStyles); - $("#disable-browser-default-styles").append(WebDeveloper.Locales.getString("disableBrowserDefaultStyles")).on("click", WebDeveloper.Overlay.CSS.disableBrowserDefaultStyles); - $("#disable-embedded-styles").append(WebDeveloper.Locales.getString("disableEmbeddedStyles")).on("click", WebDeveloper.Overlay.CSS.disableEmbeddedStyles); - $("#disable-inline-styles").append(WebDeveloper.Locales.getString("disableInlineStyles")).on("click", WebDeveloper.Overlay.CSS.disableInlineStyles); - $("#disable-linked-style-sheets").append(WebDeveloper.Locales.getString("disableLinkedStyleSheets")).on("click", WebDeveloper.Overlay.CSS.disableLinkedStyleSheets); - $("#disable-print-styles").append(WebDeveloper.Locales.getString("disablePrintStyles")).on("click", WebDeveloper.Overlay.CSS.disablePrintStyles); - $("#display-handheld-styles").append(WebDeveloper.Locales.getString("displayHandheldStyles")).on("click", WebDeveloper.Overlay.CSS.displayHandheldStyles); - $("#display-print-styles").append(WebDeveloper.Locales.getString("displayPrintStyles")).on("click", WebDeveloper.Overlay.CSS.displayPrintStyles); - $("#edit-css").append(WebDeveloper.Locales.getString("editCSS")).on("click", WebDeveloper.Overlay.CSS.editCSS); - $("#reload-linked-style-sheets").append(WebDeveloper.Locales.getString("reloadLinkedStyleSheets")).on("click", WebDeveloper.Overlay.CSS.reloadLinkedStyleSheets); - $("#use-border-box-model").append(WebDeveloper.Locales.getString("useBorderBoxModel")).on("click", WebDeveloper.Overlay.CSS.useBorderBoxModel); - $("#view-css").append(WebDeveloper.Locales.getString("viewCSS")).on("click", WebDeveloper.Overlay.CSS.viewCSS); -}); - -// Adds a feature on a tab -WebDeveloper.Overlay.CSS.addFeatureOnTab = function(featureItem, tab, scriptCode) -{ - WebDeveloper.Overlay.addFeatureOnTab(featureItem, tab, "features/javascript/css.js", scriptCode); -}; - -// Disables all styles -WebDeveloper.Overlay.CSS.disableAllStyles = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var disable = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.CSS.toggleAllStyles(" + disable + ", [document]);"); - } - }); -}; - -// Disables the browser default styles -WebDeveloper.Overlay.CSS.disableBrowserDefaultStyles = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.CSS.toggleBrowserDefaultStyles([document]);"); - } - }); -}; - -// Disables embedded styles -WebDeveloper.Overlay.CSS.disableEmbeddedStyles = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var disable = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.CSS.toggleEmbeddedStyles(" + disable + ", [document]);"); - } - }); -}; - -// Disables inline styles -WebDeveloper.Overlay.CSS.disableInlineStyles = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var disable = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.CSS.toggleInlineStyles(" + disable + ", [document]);"); - } - }); -}; - -// Disables linked style sheets -WebDeveloper.Overlay.CSS.disableLinkedStyleSheets = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var disable = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.CSS.toggleLinkedStyleSheets(" + disable + ", [document]);"); - } - }); -}; - -// Disables print styles -WebDeveloper.Overlay.CSS.disablePrintStyles = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var disable = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.CSS.togglePrintStyles(" + disable + ", [document]);"); - } - }); -}; - -// Displays handheld styles -WebDeveloper.Overlay.CSS.displayHandheldStyles = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var storage = chrome.extension.getBackgroundPage().WebDeveloper.Storage; - var display = !storage.isFeatureOnTab(feature, tab); - - // If displaying handheld styles and print styles are being displayed - if(display && storage.isFeatureOnTab("display-print-styles", tab)) - { - var displayPrintStylesItem = $("#display-print-styles"); - - WebDeveloper.Overlay.CSS.toggleFeatureOnTab(displayPrintStylesItem, tab, 'WebDeveloper.CSS.toggleMediaTypeStyles("print", false, [document]);'); - } - - WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, 'WebDeveloper.CSS.toggleMediaTypeStyles("handheld", ' + display + ", [document]);"); - } - }); -}; - -// Displays print styles -WebDeveloper.Overlay.CSS.displayPrintStyles = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var storage = chrome.extension.getBackgroundPage().WebDeveloper.Storage; - var display = !storage.isFeatureOnTab(feature, tab); - - // If displaying print styles and handheld styles are being displayed - if(display && storage.isFeatureOnTab("display-handheld-styles", tab)) - { - var displayHandheldStylesItem = $("#display-handheld-styles"); - - WebDeveloper.Overlay.CSS.toggleFeatureOnTab(displayHandheldStylesItem, tab, 'WebDeveloper.CSS.toggleMediaTypeStyles("handheld", false, [document]);'); - } - - WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, 'WebDeveloper.CSS.toggleMediaTypeStyles("print", ' + display + ", [document]);"); - } - }); -}; - -// Edits the CSS of the page -WebDeveloper.Overlay.CSS.editCSS = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var edit = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - var locale = ""; - - locale += "'couldNotLoadCSS': '" + WebDeveloper.Locales.getString("couldNotLoadCSS") + "',"; - locale += "'dashboardTitle': '" + WebDeveloper.Locales.getString("extensionName") + " " + WebDeveloper.Locales.getString("dashboard") + "',"; - locale += "'editCSS': '" + WebDeveloper.Locales.getString("editCSS") + "',"; - locale += "'embeddedStyles': '" + WebDeveloper.Locales.getString("embeddedStyles") + "'"; - - WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "dashboard/javascript/dashboard.js", "WebDeveloper.EditCSS.editCSS(" + edit + ", document, {" + locale + "});", true); - } - }); -}; - -// Reloads the linked style sheets of the page -WebDeveloper.Overlay.CSS.reloadLinkedStyleSheets = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.CSS.addFeatureOnTab(featureItem, tab, "WebDeveloper.CSS.reloadLinkedStyleSheets([document]);"); - } - }); -}; - -// Toggles a feature on a tab -WebDeveloper.Overlay.CSS.toggleFeatureOnTab = function(featureItem, tab, scriptCode) -{ - WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "features/javascript/css.js", scriptCode); -}; - -// Displays alt attributes for all images -WebDeveloper.Overlay.CSS.useBorderBoxModel = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.CSS.useBorderBoxModel([document]);"); - } - }); -}; - -// Displays the CSS -WebDeveloper.Overlay.CSS.viewCSS = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.tabs.sendMessage(tab.id, { type: "get-css" }, function(data) - { - data.theme = chrome.extension.getBackgroundPage().WebDeveloper.Storage.getItem("syntax_highlight_theme"); - - chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("generated/view-css.html"), tab.index, data, WebDeveloper.Overlay.CSS.getViewCSSLocale()); - }); - } - }); -}; diff --git a/source/chrome/javascript/overlay/forms.js b/source/chrome/javascript/overlay/forms.js deleted file mode 100644 index df48b59..0000000 --- a/source/chrome/javascript/overlay/forms.js +++ /dev/null @@ -1,316 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.Forms = WebDeveloper.Overlay.Forms || {}; - -$(function() -{ - $("#check-all-checkboxes").append(WebDeveloper.Locales.getString("checkAllCheckboxes")).on("click", WebDeveloper.Overlay.Forms.checkAllCheckboxes); - $("#clear-form-fields").append(WebDeveloper.Locales.getString("clearFormFields")).on("click", WebDeveloper.Overlay.Forms.clearFormFields); - $("#clear-radio-buttons").append(WebDeveloper.Locales.getString("clearRadioButtons")).on("click", WebDeveloper.Overlay.Forms.clearRadioButtons); - $("#convert-form-gets-to-posts").append(WebDeveloper.Locales.getString("convertFormGetsToPosts")).on("click", function() { WebDeveloper.Overlay.Forms.convertFormMethods("post"); }); - $("#convert-form-posts-to-gets").append(WebDeveloper.Locales.getString("convertFormPostsToGets")).on("click", function() { WebDeveloper.Overlay.Forms.convertFormMethods("get"); }); - $("#convert-select-elements-to-text-inputs").append(WebDeveloper.Locales.getString("convertSelectElementsToTextInputs")).on("click", WebDeveloper.Overlay.Forms.convertSelectElementsToTextInputs); - $("#convert-text-inputs-to-textareas").append(WebDeveloper.Locales.getString("convertTextInputsToTextareas")).on("click", WebDeveloper.Overlay.Forms.convertTextInputsToTextareas); - $("#display-form-details").append(WebDeveloper.Locales.getString("displayFormDetails")).on("click", WebDeveloper.Overlay.Forms.displayFormDetails); - $("#display-passwords").append(WebDeveloper.Locales.getString("displayPasswords")).on("click", WebDeveloper.Overlay.Forms.displayPasswords); - $("#enable-auto-completion").append(WebDeveloper.Locales.getString("enableAutoCompletion")).on("click", WebDeveloper.Overlay.Forms.enableAutoCompletion); - $("#enable-form-fields").append(WebDeveloper.Locales.getString("enableFormFields")).on("click", WebDeveloper.Overlay.Forms.enableFormFields); - $("#expand-select-elements").append(WebDeveloper.Locales.getString("expandSelectElements")).on("click", WebDeveloper.Overlay.Forms.expandSelectElements); - $("#make-form-fields-writable").append(WebDeveloper.Locales.getString("makeFormFieldsWritable")).on("click", WebDeveloper.Overlay.Forms.makeFormFieldsWritable); - $("#outline-form-fields-without-labels").append(WebDeveloper.Locales.getString("outlineFormFieldsWithoutLabels")).on("click", WebDeveloper.Overlay.Forms.outlineFormFieldsWithoutLabels); - $("#populate-form-fields").append(WebDeveloper.Locales.getString("populateFormFields")).on("click", WebDeveloper.Overlay.Forms.populateFormFields); - $("#remove-form-validation").append(WebDeveloper.Locales.getString("removeFormValidation")).on("click", WebDeveloper.Overlay.Forms.removeFormValidation); - $("#remove-maximum-lengths").append(WebDeveloper.Locales.getString("removeMaximumLengths")).on("click", WebDeveloper.Overlay.Forms.removeMaximumLengths); - $("#uncheck-all-checkboxes").append(WebDeveloper.Locales.getString("uncheckAllCheckboxes")).on("click", WebDeveloper.Overlay.Forms.uncheckAllCheckboxes); - $("#view-form-information").append(WebDeveloper.Locales.getString("viewFormInformation")).on("click", WebDeveloper.Overlay.Forms.viewFormInformation); -}); - -// Adds a feature on a tab -WebDeveloper.Overlay.Forms.addFeatureOnTab = function(featureItem, tab, scriptCode) -{ - WebDeveloper.Overlay.addFeatureOnTab(featureItem, tab, "features/javascript/forms.js", scriptCode); -}; - -// Checks all checkboxes -WebDeveloper.Overlay.Forms.checkAllCheckboxes = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.toggleCheckboxes(true, [document]);"); - } - }); -}; - -// Clears all form fields -WebDeveloper.Overlay.Forms.clearFormFields = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.clearFormFields([document]);"); - } - }); -}; - -// Clears all radio buttons -WebDeveloper.Overlay.Forms.clearRadioButtons = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.clearRadioButtons([document]);"); - } - }); -}; - -// Converts the methods of all forms -WebDeveloper.Overlay.Forms.convertFormMethods = function(method) -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, 'WebDeveloper.Forms.convertFormMethods("' + method + '", [document]);'); - } - }); -}; - -// Converts select elements to text inputs -WebDeveloper.Overlay.Forms.convertSelectElementsToTextInputs = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.convertSelectElementsToTextInputs([document]);"); - } - }); -}; - -// Converts text inputs to textareas -WebDeveloper.Overlay.Forms.convertTextInputsToTextareas = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.convertTextInputsToTextareas([document]);"); - } - }); -}; - -// Displays the details about all forms -WebDeveloper.Overlay.Forms.displayFormDetails = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Forms.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.displayFormDetails(" + display + ", [document]);"); - } - }); -}; - -// Displays all passwords -WebDeveloper.Overlay.Forms.displayPasswords = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.displayPasswords([document]);"); - } - }); -}; - -// Enables auto completion on all elements -WebDeveloper.Overlay.Forms.enableAutoCompletion = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.enableAutoCompletion([document]);"); - } - }); -}; - -// Enables all form fields -WebDeveloper.Overlay.Forms.enableFormFields = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.enableFormFields([document]);"); - } - }); -}; - -// Expands all select elements -WebDeveloper.Overlay.Forms.expandSelectElements = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.expandSelectElements([document]);"); - } - }); -}; - -// Makes all form fields writable -WebDeveloper.Overlay.Forms.makeFormFieldsWritable = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.makeFormFieldsWritable([document]);"); - } - }); -}; - -// Outlines all form fields without labels -WebDeveloper.Overlay.Forms.outlineFormFieldsWithoutLabels = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Forms.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.outlineFormFieldsWithoutLabels(" + display + ", [document]);"); - } - }); -}; - -// Populates all form fields -WebDeveloper.Overlay.Forms.populateFormFields = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, 'WebDeveloper.Forms.populateFormFields([document], "' + chrome.extension.getBackgroundPage().WebDeveloper.Storage.getItem("populate_email_address") + '", "' + WebDeveloper.Locales.getString("password").toLowerCase() + '");'); - } - }); -}; - -// Removes validation on all form fields -WebDeveloper.Overlay.Forms.removeFormValidation = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.removeFormValidation([document]);"); - } - }); -}; - -// Removes maximum lengths from all elements -WebDeveloper.Overlay.Forms.removeMaximumLengths = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.removeMaximumLengths([document]);"); - } - }); -}; - -// Toggles a feature on a tab -WebDeveloper.Overlay.Forms.toggleFeatureOnTab = function(featureItem, tab, scriptCode) -{ - WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "features/javascript/forms.js", scriptCode); -}; - -// Unchecks all checkboxes -WebDeveloper.Overlay.Forms.uncheckAllCheckboxes = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.toggleCheckboxes(false, [document]);"); - } - }); -}; - -// Displays information about all forms -WebDeveloper.Overlay.Forms.viewFormInformation = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.tabs.sendMessage(tab.id, { type: "get-forms" }, function(data) - { - chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("generated/view-form-information.html"), tab.index, data, WebDeveloper.Overlay.Forms.getViewFormInformationLocale()); - }); - } - }); -}; diff --git a/source/chrome/javascript/overlay/images.js b/source/chrome/javascript/overlay/images.js deleted file mode 100644 index bfdae59..0000000 --- a/source/chrome/javascript/overlay/images.js +++ /dev/null @@ -1,357 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.Images = WebDeveloper.Overlay.Images || {}; - -$(function() -{ - var disableImagesMenu = $("#disable-images"); - - disableImagesMenu.append(WebDeveloper.Locales.getString("disableImages")).on("click", WebDeveloper.Overlay.Images.toggleImages); - $("#display-alt-attributes").append(WebDeveloper.Locales.getString("displayAltAttributes")).on("click", WebDeveloper.Overlay.Images.displayAltAttributes); - $("#display-image-dimensions").append(WebDeveloper.Locales.getString("displayImageDimensions")).on("click", WebDeveloper.Overlay.Images.displayImageDimensions); - $("#display-image-paths").append(WebDeveloper.Locales.getString("displayImagePaths")).on("click", WebDeveloper.Overlay.Images.displayImagePaths); - $("#find-broken-images").append(WebDeveloper.Locales.getString("findBrokenImages")).on("click", WebDeveloper.Overlay.Images.findBrokenImages); - $("#hide-background-images").append(WebDeveloper.Locales.getString("hideBackgroundImages")).on("click", WebDeveloper.Overlay.Images.hideBackgroundImages); - $("#hide-images").append(WebDeveloper.Locales.getString("hideImages")).on("click", WebDeveloper.Overlay.Images.hideImages); - $("#make-images-full-size").append(WebDeveloper.Locales.getString("makeImagesFullSize")).on("click", WebDeveloper.Overlay.Images.makeImagesFullSize); - $("#make-images-invisible").append(WebDeveloper.Locales.getString("makeImagesInvisible")).on("click", WebDeveloper.Overlay.Images.makeImagesInvisible); - $("#outline-all-images").append(WebDeveloper.Locales.getString("outlineAllImages")).on("click", WebDeveloper.Overlay.Images.outlineAllImages); - $("#outline-background-images").append(WebDeveloper.Locales.getString("outlineBackgroundImages")).on("click", WebDeveloper.Overlay.Images.outlineBackgroundImages); - $("#outline-images-with-adjusted-dimensions").append(WebDeveloper.Locales.getString("outlineImagesWithAdjustedDimensions")).on("click", WebDeveloper.Overlay.Images.outlineImagesWithAdjustedDimensions); - $("#outline-images-with-empty-alt-attributes").append(WebDeveloper.Locales.getString("outlineImagesWithEmptyAltAttributes")).on("click", WebDeveloper.Overlay.Images.outlineImagesWithEmptyAltAttributes); - $("#outline-images-with-oversized-dimensions").append(WebDeveloper.Locales.getString("outlineImagesWithOversizedDimensions")).on("click", WebDeveloper.Overlay.Images.outlineImagesWithOversizedDimensions); - $("#outline-images-without-alt-attributes").append(WebDeveloper.Locales.getString("outlineImagesWithoutAltAttributes")).on("click", WebDeveloper.Overlay.Images.outlineImagesWithoutAltAttributes); - $("#outline-images-without-dimensions").append(WebDeveloper.Locales.getString("outlineImagesWithoutDimensions")).on("click", WebDeveloper.Overlay.Images.outlineImagesWithoutDimensions); - $("#reload-images").append(WebDeveloper.Locales.getString("reloadImages")).on("click", WebDeveloper.Overlay.Images.reloadImages); - $("#replace-images-with-alt-attributes").append(WebDeveloper.Locales.getString("replaceImagesWithAltAttributes")).on("click", WebDeveloper.Overlay.Images.replaceImagesWithAltAttributes); - $("#view-image-information").append(WebDeveloper.Locales.getString("viewImageInformation")).on("click", WebDeveloper.Overlay.Images.viewImageInformation); - - WebDeveloper.Overlay.updateContentSettingMenu(disableImagesMenu, "images"); -}); - -// Adds a feature on a tab -WebDeveloper.Overlay.Images.addFeatureOnTab = function(featureItem, tab, scriptCode) -{ - WebDeveloper.Overlay.addFeatureOnTab(featureItem, tab, "features/javascript/images.js", scriptCode); -}; - -// Displays alt attributes for all images -WebDeveloper.Overlay.Images.displayAltAttributes = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.displayAltAttributes(" + display + ", [document]);"); - } - }); -}; - -// Displays the dimensions for all images -WebDeveloper.Overlay.Images.displayImageDimensions = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - var locale = ""; - - locale += "'height': '" + WebDeveloper.Locales.getString("height") + "',"; - locale += "'width': '" + WebDeveloper.Locales.getString("width") + "'"; - - WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.displayImageDimensions(" + display + ", [document], {" + locale + "});"); - } - }); -}; - -// Displays the paths for all images -WebDeveloper.Overlay.Images.displayImagePaths = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.displayImagePaths(" + display + ", [document]);"); - } - }); -}; - -// Finds all the broken images on a page -WebDeveloper.Overlay.Images.findBrokenImages = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.tabs.sendMessage(tab.id, { type: "get-broken-images" }, function(data) - { - var locale = WebDeveloper.Locales.setupGeneratedLocale(); - - locale.brokenImage = WebDeveloper.Locales.getString("brokenImage"); - locale.brokenImages = WebDeveloper.Locales.getString("brokenImages"); - - chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("generated/find-broken-images.html"), tab.index, data, locale); - }); - } - }); -}; - -// Hides all background images -WebDeveloper.Overlay.Images.hideBackgroundImages = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.hideBackgroundImages([document]);"); - } - }); -}; - -// Hides all images -WebDeveloper.Overlay.Images.hideImages = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var disable = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.hideImages(" + disable + ", [document]);"); - } - }); -}; - -// Makes all images full size -WebDeveloper.Overlay.Images.makeImagesFullSize = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Images.addFeatureOnTab(featureItem, tab, "WebDeveloper.Images.makeImagesFullSize([document]);"); - } - }); -}; - -// Makes all images invisible -WebDeveloper.Overlay.Images.makeImagesInvisible = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var invisible = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.makeImagesInvisible(" + invisible + ", [document]);"); - } - }); -}; - -// Outlines all images -WebDeveloper.Overlay.Images.outlineAllImages = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.outlineAllImages([document]);"); - } - }); -}; - -// Outlines all background images -WebDeveloper.Overlay.Images.outlineBackgroundImages = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var outline = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.outlineBackgroundImages(" + outline + ", [document]);"); - } - }); -}; - -// Outlines all images with adjusted dimensions -WebDeveloper.Overlay.Images.outlineImagesWithAdjustedDimensions = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var outline = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.outlineImagesWithAdjustedDimensions(" + outline + ", [document]);"); - } - }); -}; - -// Outlines all images with empty alt attributes -WebDeveloper.Overlay.Images.outlineImagesWithEmptyAltAttributes = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.outlineImagesWithEmptyAltAttributes([document]);"); - } - }); -}; - -// Outlines all images with oversized dimensions -WebDeveloper.Overlay.Images.outlineImagesWithOversizedDimensions = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var outline = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.outlineImagesWithOversizedDimensions(" + outline + ", [document]);"); - } - }); -}; - -// Outlines all images without alt attributes -WebDeveloper.Overlay.Images.outlineImagesWithoutAltAttributes = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.outlineImagesWithoutAltAttributes([document]);"); - } - }); -}; - -// Outlines all images without dimensions -WebDeveloper.Overlay.Images.outlineImagesWithoutDimensions = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.outlineImagesWithoutDimensions([document]);"); - } - }); -}; - -// Reloads all the images on a page -WebDeveloper.Overlay.Images.reloadImages = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Images.addFeatureOnTab(featureItem, tab, "WebDeveloper.Images.reloadImages([document]);"); - } - }); -}; - -// Replaces all images with alt attributes -WebDeveloper.Overlay.Images.replaceImagesWithAltAttributes = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var replace = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.replaceImagesWithAltAttributes(" + replace + ", [document]);"); - } - }); -}; - -// Toggles a feature on a tab -WebDeveloper.Overlay.Images.toggleFeatureOnTab = function(featureItem, tab, scriptCode) -{ - WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "features/javascript/images.js", scriptCode); -}; - -// Toggles images -WebDeveloper.Overlay.Images.toggleImages = function() -{ - WebDeveloper.Overlay.toggleContentSetting("images", $(this), "enableImagesResult", "disableImagesResult"); -}; - -// Displays all the images -WebDeveloper.Overlay.Images.viewImageInformation = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.tabs.sendMessage(tab.id, { type: "get-images" }, function(data) - { - chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("generated/view-image-information.html"), tab.index, data, WebDeveloper.Overlay.Images.getViewImageInformationLocale()); - }); - } - }); -}; diff --git a/source/chrome/javascript/overlay/information.js b/source/chrome/javascript/overlay/information.js deleted file mode 100644 index 105b16a..0000000 --- a/source/chrome/javascript/overlay/information.js +++ /dev/null @@ -1,464 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.Information = WebDeveloper.Overlay.Information || {}; - -$(function() -{ - $("#display-abbreviations").append(WebDeveloper.Locales.getString("displayAbbreviations")).on("click", WebDeveloper.Overlay.Information.displayAbbreviations); - $("#display-access-keys").append(WebDeveloper.Locales.getString("displayAccessKeys")).on("click", WebDeveloper.Overlay.Information.displayAccessKeys); - $("#display-anchors").append(WebDeveloper.Locales.getString("displayAnchors")).on("click", WebDeveloper.Overlay.Information.displayAnchors); - $("#display-aria-roles").append(WebDeveloper.Locales.getString("displayARIARoles")).on("click", WebDeveloper.Overlay.Information.displayARIARoles); - $("#display-div-dimensions").append(WebDeveloper.Locales.getString("displayDivDimensions")).on("click", WebDeveloper.Overlay.Information.displayDivDimensions); - $("#display-div-order").append(WebDeveloper.Locales.getString("displayDivOrder")).on("click", WebDeveloper.Overlay.Information.displayDivOrder); - $("#display-element-information").append(WebDeveloper.Locales.getString("displayElementInformation")).on("click", WebDeveloper.Overlay.Information.displayElementInformation); - $("#display-id-class-details").append(WebDeveloper.Locales.getString("displayIdClassDetails")).on("click", WebDeveloper.Overlay.Information.displayIdClassDetails); - $("#display-link-details").append(WebDeveloper.Locales.getString("displayLinkDetails")).on("click", WebDeveloper.Overlay.Information.displayLinkDetails); - $("#display-object-information").append(WebDeveloper.Locales.getString("displayObjectInformation")).on("click", WebDeveloper.Overlay.Information.displayObjectInformation); - $("#display-stack-levels").append(WebDeveloper.Locales.getString("displayStackLevels")).on("click", WebDeveloper.Overlay.Information.displayStackLevels); - $("#display-tab-index").append(WebDeveloper.Locales.getString("displayTabIndex")).on("click", WebDeveloper.Overlay.Information.displayTabIndex); - $("#display-table-depth").append(WebDeveloper.Locales.getString("displayTableDepth")).on("click", WebDeveloper.Overlay.Information.displayTableDepth); - $("#display-table-information").append(WebDeveloper.Locales.getString("displayTableInformation")).on("click", WebDeveloper.Overlay.Information.displayTableInformation); - $("#display-title-attributes").append(WebDeveloper.Locales.getString("displayTitleAttributes")).on("click", WebDeveloper.Overlay.Information.displayTitleAttributes); - $("#display-topographic-information").append(WebDeveloper.Locales.getString("displayTopographicInformation")).on("click", WebDeveloper.Overlay.Information.displayTopographicInformation); - $("#find-duplicate-ids").append(WebDeveloper.Locales.getString("findDuplicateIds")).on("click", WebDeveloper.Overlay.Information.findDuplicateIds); - $("#view-anchor-information").append(WebDeveloper.Locales.getString("viewAnchorInformation")).on("click", WebDeveloper.Overlay.Information.viewAnchorInformation); - $("#view-color-information").append(WebDeveloper.Locales.getString("viewColorInformation")).on("click", WebDeveloper.Overlay.Information.viewColorInformation); - $("#view-document-outline").append(WebDeveloper.Locales.getString("viewDocumentOutline")).on("click", WebDeveloper.Overlay.Information.viewDocumentOutline); - $("#view-link-information").append(WebDeveloper.Locales.getString("viewLinkInformation")).on("click", WebDeveloper.Overlay.Information.viewLinkInformation); - $("#view-meta-tag-information").append(WebDeveloper.Locales.getString("viewMetaTagInformation")).on("click", WebDeveloper.Overlay.Information.viewMetaTagInformation); - $("#view-javascript").append(WebDeveloper.Locales.getString("viewJavaScript")).on("click", WebDeveloper.Overlay.Information.viewJavaScript); - $("#view-response-headers").append(WebDeveloper.Locales.getString("viewResponseHeaders")).on("click", WebDeveloper.Overlay.Information.viewResponseHeaders); -}); - -// Displays the abbreviations on a page -WebDeveloper.Overlay.Information.displayAbbreviations = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayAbbreviations([document]);"); - } - }); -}; - -// Displays the access keys on a page -WebDeveloper.Overlay.Information.displayAccessKeys = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayAccessKeys(" + display + ", [document]);"); - } - }); -}; - -// Displays the anchors on a page -WebDeveloper.Overlay.Information.displayAnchors = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayAnchors(" + display + ", [document]);"); - } - }); -}; - -// Displays the ARIA roles on a page -WebDeveloper.Overlay.Information.displayARIARoles = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayARIARoles([document]);"); - } - }); -}; - -// Displays the dimensions for divs on a page -WebDeveloper.Overlay.Information.displayDivDimensions = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - var locale = ""; - - locale += "'height': '" + WebDeveloper.Locales.getString("height") + "',"; - locale += "'width': '" + WebDeveloper.Locales.getString("width") + "'"; - - WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayDivDimensions(" + display + ", [document], {" + locale + "});"); - } - }); -}; - -// Displays the order of the divs on a page -WebDeveloper.Overlay.Information.displayDivOrder = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayDivOrder(" + display + ", [document]);"); - } - }); -}; - -// Displays information about an element -WebDeveloper.Overlay.Information.displayElementInformation = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - var locale = ""; - - locale += "'ancestors': '" + WebDeveloper.Locales.getString("ancestors") + "',"; - locale += "'children': '" + WebDeveloper.Locales.getString("children") + "',"; - locale += "'dashboardTitle': '" + WebDeveloper.Locales.getString("extensionName") + " " + WebDeveloper.Locales.getString("dashboard") + "',"; - locale += "'dom': '" + WebDeveloper.Locales.getString("dom") + "',"; - locale += "'elementInformation': '" + WebDeveloper.Locales.getString("elementInformation") + "',"; - locale += "'layout': '" + WebDeveloper.Locales.getString("layout") + "',"; - locale += "'position': '" + WebDeveloper.Locales.getString("position") + "',"; - locale += "'selectAnElementDisplayInformation': '" + WebDeveloper.Locales.getString("selectAnElementDisplayInformation") + "',"; - locale += "'text': '" + WebDeveloper.Locales.getString("text") + "'"; - - WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "dashboard/javascript/dashboard.js", "WebDeveloper.ElementInformation.initialize(" + display + ", document, {" + locale + "});", true); - } - }); -}; - -// Displays the id and class details for a page -WebDeveloper.Overlay.Information.displayIdClassDetails = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayIdClassDetails(" + display + ", [document]);"); - } - }); -}; - -// Displays the details for the links on a page -WebDeveloper.Overlay.Information.displayLinkDetails = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayLinkDetails([document]);"); - } - }); -}; - -// Displays the information for objects on a page -WebDeveloper.Overlay.Information.displayObjectInformation = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayObjectInformation(" + display + ", [document]);"); - } - }); -}; - -// Displays the stack levels on a page -WebDeveloper.Overlay.Information.displayStackLevels = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayStackLevels(" + display + ", [document]);"); - } - }); -}; - -// Displays the tab indices on a page -WebDeveloper.Overlay.Information.displayTabIndex = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayTabIndex(" + display + ", [document]);"); - } - }); -}; - -// Displays the depth of all tables on a page -WebDeveloper.Overlay.Information.displayTableDepth = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayTableDepth(" + display + ", [document], '" + WebDeveloper.Locales.getString("depth") + "');"); - } - }); -}; - -// Displays the information for tables on a page -WebDeveloper.Overlay.Information.displayTableInformation = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayTableInformation(" + display + ", [document]);"); - } - }); -}; - -// Displays the title attributes on a page -WebDeveloper.Overlay.Information.displayTitleAttributes = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var feature = featureItem.attr("id"); - var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); - - WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayTitleAttributes(" + display + ", [document]);"); - } - }); -}; - -// Displays the topographic information for a page -WebDeveloper.Overlay.Information.displayTopographicInformation = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayTopographicInformation([document]);"); - } - }); -}; - -// Finds all the duplicate ids on a page -WebDeveloper.Overlay.Information.findDuplicateIds = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.tabs.sendMessage(tab.id, { type: "get-duplicate-ids" }, function(data) - { - var locale = WebDeveloper.Locales.setupGeneratedLocale(); - - locale.duplicateId = WebDeveloper.Locales.getString("duplicateId"); - locale.duplicateIds = WebDeveloper.Locales.getString("duplicateIds"); - - chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("generated/find-duplicate-ids.html"), tab.index, data, locale); - }); - } - }); -}; - -// Toggles a feature on a tab -WebDeveloper.Overlay.Information.toggleFeatureOnTab = function(featureItem, tab, scriptCode) -{ - WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "features/javascript/information.js", scriptCode); -}; - -// Displays the anchor information for a page -WebDeveloper.Overlay.Information.viewAnchorInformation = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.tabs.sendMessage(tab.id, { type: "get-anchors" }, function(data) - { - chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("generated/view-anchor-information.html"), tab.index, data, WebDeveloper.Overlay.Information.getViewAnchorInformationLocale()); - }); - } - }); -}; - -// Displays the color information for a page -WebDeveloper.Overlay.Information.viewColorInformation = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.tabs.sendMessage(tab.id, { type: "get-colors" }, function(data) - { - chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("generated/view-color-information.html"), tab.index, data, WebDeveloper.Overlay.Information.getViewColorInformationLocale()); - }); - } - }); -}; - -// Displays the document outline -WebDeveloper.Overlay.Information.viewDocumentOutline = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.tabs.sendMessage(tab.id, { type: "get-document-outline" }, function(data) - { - chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("generated/view-document-outline.html"), tab.index, data, WebDeveloper.Overlay.Information.getViewDocumentOutlineLocale()); - }); - } - }); -}; - -// Displays the JavaScript -WebDeveloper.Overlay.Information.viewJavaScript = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.tabs.sendMessage(tab.id, { type: "get-javascript" }, function(data) - { - data.theme = chrome.extension.getBackgroundPage().WebDeveloper.Storage.getItem("syntax_highlight_theme"); - - chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("generated/view-javascript.html"), tab.index, data, WebDeveloper.Overlay.Information.getViewJavaScriptLocale()); - }); - } - }); -}; - -// Displays the link information for a page -WebDeveloper.Overlay.Information.viewLinkInformation = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.tabs.sendMessage(tab.id, { type: "get-links" }, function(data) - { - chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("generated/view-link-information.html"), tab.index, data, WebDeveloper.Overlay.Information.getViewLinkInformationLocale()); - }); - } - }); -}; - -// Displays the meta tag information for a page -WebDeveloper.Overlay.Information.viewMetaTagInformation = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.tabs.sendMessage(tab.id, { type: "get-meta-tags" }, function(data) - { - chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("generated/view-meta-tag-information.html"), tab.index, data, WebDeveloper.Overlay.Information.getViewMetaTagInformationLocale()); - }); - } - }); -}; - -// Displays the response headers -WebDeveloper.Overlay.Information.viewResponseHeaders = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.tabs.sendMessage(tab.id, { type: "get-document-details" }, function(data) - { - chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("generated/view-response-headers.html"), tab.index, data, WebDeveloper.Overlay.Information.getViewResponseHeadersLocale()); - }); - } - }); -}; diff --git a/source/chrome/javascript/overlay/options.js b/source/chrome/javascript/overlay/options.js deleted file mode 100644 index b76a8bc..0000000 --- a/source/chrome/javascript/overlay/options.js +++ /dev/null @@ -1,39 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.Options = WebDeveloper.Overlay.Options || {}; - -$(function() -{ - $("#about").append(WebDeveloper.Locales.getString("aboutMenu")).on("click", WebDeveloper.Overlay.Options.about); - $("#help").append(WebDeveloper.Locales.getString("help")).on("click", WebDeveloper.Overlay.openURL); - $("#options").append(WebDeveloper.Locales.getString("optionsMenu")).on("click", WebDeveloper.Overlay.Options.options); - $("#reset-page").append(WebDeveloper.Locales.getString("resetPage")).on("click", WebDeveloper.Overlay.Options.resetPage); -}); - -// Opens the about page -WebDeveloper.Overlay.Options.about = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("about/about.html"), tab.index, null, WebDeveloper.Overlay.Options.getAboutLocale()); - }); -}; - -// Opens the options -WebDeveloper.Overlay.Options.options = function() -{ - WebDeveloper.Overlay.openTab(chrome.extension.getURL("options/options.html")); -}; - -// Resets the page -WebDeveloper.Overlay.Options.resetPage = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - WebDeveloper.Overlay.addScriptToTab(tab, { code: "window.location.reload();" }, function() - { - WebDeveloper.Overlay.close(); - }); - }); -}; diff --git a/source/chrome/javascript/overlay/resize.js b/source/chrome/javascript/overlay/resize.js deleted file mode 100644 index 555724b..0000000 --- a/source/chrome/javascript/overlay/resize.js +++ /dev/null @@ -1,274 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.Resize = WebDeveloper.Overlay.Resize || {}; - -$(function() -{ - var resizeWindowHeight = $("#resize-window-height"); - var resizeWindowWidth = $("#resize-window-width"); - - $("#display-window-size").append(WebDeveloper.Locales.getString("displayWindowSize")).on("click", WebDeveloper.Overlay.Resize.displayWindowSize); - $("#edit-resize-dimensions").append(WebDeveloper.Locales.getString("editResizeDimensions")).on("click", WebDeveloper.Overlay.Resize.editResizeDimensions); - $("#resize-menu").on("click", ".custom-resize-window", WebDeveloper.Overlay.Resize.customResizeWindow); - $("#resize-window").append(WebDeveloper.Locales.getString("resizeWindowMenu")).on("click", WebDeveloper.Overlay.Resize.displayResizeDialog); - $("#view-responsive-layouts").append(WebDeveloper.Locales.getString("viewResponsiveLayouts")).on("click", WebDeveloper.Overlay.Resize.viewResponsiveLayouts); - - $("#resize-window-cancel").on("click", WebDeveloper.Overlay.Resize.cancelResizeWindow); - $("#resize-window-dialog").on("submit", function(event) { event.preventDefault(); }); - $("#resize-window-submit").on("click", WebDeveloper.Overlay.Resize.submitResizeWindow); - - $("legend", $("#resize-window-dialog")).text(WebDeveloper.Locales.getString("resizeWindow")); - $("#resize-window-cancel").text(WebDeveloper.Locales.getString("cancel")); - $("#resize-window-submit").append(WebDeveloper.Locales.getString("resize")); - $('[for="resize-window-height"]').text(WebDeveloper.Locales.getString("height")); - $('[for="resize-window-width"]').text(WebDeveloper.Locales.getString("width")); - - resizeWindowHeight.attr("placeholder", WebDeveloper.Locales.getString("heightPlaceholder")); - resizeWindowWidth.attr("placeholder", WebDeveloper.Locales.getString("widthPlaceholder")); - resizeWindowHeight.add(resizeWindowWidth).on("keypress", WebDeveloper.Overlay.Resize.resizeWindowKeyPress); - - WebDeveloper.Overlay.Resize.setupCustomResizeOptions(); -}); - -// Cancels resizing the window -WebDeveloper.Overlay.Resize.cancelResizeWindow = function() -{ - $("#resize-window-dialog").slideUp(WebDeveloper.Overlay.animationSpeed, function() - { - $(".tabbable").slideDown(WebDeveloper.Overlay.animationSpeed); - }); -}; - -// Resizes the window to a custom size -WebDeveloper.Overlay.Resize.customResizeWindow = function() -{ - var featureItem = $(this); - - WebDeveloper.Overlay.Resize.resizeWindow(featureItem.data("height"), featureItem.data("width")); -}; - -// Displays the resize dialog -WebDeveloper.Overlay.Resize.displayResizeDialog = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.tabs.sendMessage(tab.id, { type: "get-window-size" }, function(response) - { - var resizeWindowDialog = $("#resize-window-dialog"); - - $("#resize-window-height").val(response.outerHeight); - $("#resize-window-width").val(response.outerWidth).focus(); - - WebDeveloper.Overlay.Resize.resetResizeDialog(resizeWindowDialog); - - $(".tabbable, #confirmation, #notification").slideUp(WebDeveloper.Overlay.animationSpeed, function() - { - resizeWindowDialog.slideDown(WebDeveloper.Overlay.animationSpeed); - }); - }); - } - }); -}; - -// Displays the window size -WebDeveloper.Overlay.Resize.displayWindowSize = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - chrome.tabs.sendMessage(tab.id, { type: "get-window-size" }, function(response) - { - WebDeveloper.Overlay.displayNotification(WebDeveloper.Locales.getFormattedString("displayWindowSizeResult", [response.outerWidth, response.outerHeight, response.innerWidth, response.innerHeight]), "info"); - }); - } - }); -}; - -// Opens the options to edit the resize dimensions -WebDeveloper.Overlay.Resize.editResizeDimensions = function() -{ - WebDeveloper.Overlay.openTab(chrome.extension.getURL("options/options.html#resize-tab")); -}; - -// Resets the add cookie dialog -WebDeveloper.Overlay.Resize.resetResizeDialog = function(resizeDialog) -{ - $(".has-error", resizeDialog).removeClass("has-error"); - $(".help-block", resizeDialog).text(""); -}; - -// Resizes the window -WebDeveloper.Overlay.Resize.resizeWindow = function(height, width) -{ - WebDeveloper.Overlay.getSelectedWindow(function(selectedWindow) - { - var size = {}; - - // Set the window state to normal before resizing the window - size.state = "normal"; - - // If the height is not a wildcard - if(height != "*") - { - size.height = parseInt(height, 10); - } - - // If the width is not a wildcard - if(width != "*") - { - size.width = parseInt(width, 10); - } - - chrome.windows.update(selectedWindow.id, size, function() - { - WebDeveloper.Overlay.close(); - }); - }); -}; - -// Handles a key press when resizing the window -WebDeveloper.Overlay.Resize.resizeWindowKeyPress = function(event) -{ - // If the enter key was pressed - if(event.keyCode == 13) - { - WebDeveloper.Overlay.Resize.submitResizeWindow(); - } -}; - -// Sets up the custom resize options -WebDeveloper.Overlay.Resize.setupCustomResizeOptions = function() -{ - var description = null; - var editResizeDimensions = $("#edit-resize-dimensions").closest("li"); - var height = 0; - var resizeOption = null; - var storage = chrome.extension.getBackgroundPage().WebDeveloper.Storage; - var width = 0; - - $(".custom-resize-window", $("#custom-resize-options")).remove(); - - // Loop through the resize options - for(var i = 1, l = storage.getItem("resize_count"); i <= l; i++) - { - description = storage.getItem("resize_" + i + "_description"); - height = storage.getItem("resize_" + i + "_height"); - width = storage.getItem("resize_" + i + "_width"); - - // If the description, height and width are set - if(description && height > 0 && width > 0) - { - resizeOption = {}; - - resizeOption.description = description; - resizeOption.height = height; - resizeOption.width = width; - - editResizeDimensions.before(ich.customResizeOption(resizeOption)); - } - } -}; - -// Resizes the window -WebDeveloper.Overlay.Resize.submitResizeWindow = function() -{ - // If the dialog is valid - if(WebDeveloper.Overlay.Resize.validateResizeDialog()) - { - WebDeveloper.Overlay.Resize.resizeWindow($("#resize-window-height").val(), $("#resize-window-width").val()); - } -}; - -// Returns true if the resize dialog is valid -WebDeveloper.Overlay.Resize.validateResizeDialog = function() -{ - var height = $("#resize-window-height"); - var heightValue = height.val().trim(); - var width = $("#resize-window-width"); - var widthValue = width.val().trim(); - var valid = true; - - WebDeveloper.Overlay.Resize.resetResizeDialog($("#resize-window-dialog")); - - // If the height is not set - if(!heightValue) - { - height.closest(".form-group").addClass("has-error"); - height.closest(".input-group").next(".help-block").text(WebDeveloper.Locales.getString("heightCannotBeEmpty")); - - valid = false; - } - else if(heightValue != "*" && (parseInt(heightValue, 10) != heightValue || heightValue <= 0)) - { - height.closest(".form-group").addClass("has-error"); - height.closest(".input-group").next(".help-block").text(WebDeveloper.Locales.getString("heightNotValid")); - - valid = false; - } - - // If the width is not set - if(!widthValue) - { - width.closest(".form-group").addClass("has-error"); - width.closest(".input-group").next(".help-block").text(WebDeveloper.Locales.getString("widthCannotBeEmpty")); - - valid = false; - } - else if(widthValue != "*" && (parseInt(widthValue, 10) != widthValue || widthValue <= 0)) - { - width.closest(".form-group").addClass("has-error"); - width.closest(".input-group").next(".help-block").text(WebDeveloper.Locales.getString("widthNotValid")); - - valid = false; - } - - return valid; -}; - -// Displays the responsive layouts for the page -WebDeveloper.Overlay.Resize.viewResponsiveLayouts = function() -{ - WebDeveloper.Overlay.getSelectedTab(function(tab) - { - // If the tab is valid - if(WebDeveloper.Overlay.isValidTab(tab)) - { - var data = {}; - var description = null; - var height = null; - var layout = null; - var storage = chrome.extension.getBackgroundPage().WebDeveloper.Storage; - var width = null; - - data.layouts = []; - data.pageURL = tab.url; - - // Loop through the possible responsive options - for(var i = 1, l = storage.getItem("responsive_layout_count"); i <= l; i++) - { - description = storage.getItem("responsive_layout_" + i + "_description"); - height = storage.getItem("responsive_layout_" + i + "_height"); - width = storage.getItem("responsive_layout_" + i + "_width"); - - // If the description, height and width are set - if(description && height > 0 && width > 0) - { - layout = {}; - layout.description = description; - layout.height = height; - layout.width = width; - - data.layouts.push(layout); - } - } - - chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("generated/view-responsive-layouts.html"), tab.index, data, WebDeveloper.Overlay.Resize.getViewResponsiveLayoutsLocale()); - } - }); -}; diff --git a/source/chrome/javascript/storage/storage.js b/source/chrome/javascript/storage/storage.js deleted file mode 100644 index 96a0afd..0000000 --- a/source/chrome/javascript/storage/storage.js +++ /dev/null @@ -1,189 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Storage = WebDeveloper.Storage || {}; - -// Clears the features on a tab -WebDeveloper.Storage.clearTabFeatures = function(featureTabId) -{ - window.localStorage.removeItem(featureTabId); - - WebDeveloper.Storage.updateBadgeText(featureTabId); -}; - -// Returns the list of features on a tab -WebDeveloper.Storage.getFeaturesOnTab = function(tabId) -{ - var featuresOnTab = window.localStorage.getItem(tabId); - - // If there are features on the tab - if(featuresOnTab) - { - return featuresOnTab.split(","); - } - - return null; -}; - -// Returns an item -WebDeveloper.Storage.getItem = function(item) -{ - return window.localStorage.getItem(item); -}; - -// Returns true if a feature is on a tab -WebDeveloper.Storage.isFeatureOnTab = function(feature, tab) -{ - var tabId = tab.id; - var featuresOnTab = window.localStorage.getItem(tabId); - - // If there are features on the tab - if(featuresOnTab) - { - var featuresOnTabArray = featuresOnTab.split(","); - - // Loop through the features on the tab - for(var i = 0, l = featuresOnTabArray.length; i < l; i++) - { - // If the feature is on the tab - if(featuresOnTabArray[i] == feature) - { - return true; - } - } - } - - return false; -}; - -// Removes an item -WebDeveloper.Storage.removeItem = function(item) -{ - window.localStorage.removeItem(item); -}; - -// Sets an item -WebDeveloper.Storage.setItem = function(item, value) -{ - window.localStorage.setItem(item, value); -}; - -// Sets an item if it is not already set -WebDeveloper.Storage.setItemIfNotSet = function(item, value) -{ - // If the item is not already set - if(!WebDeveloper.Storage.getItem(item)) - { - window.localStorage.setItem(item, value); - } -}; - -// Handles a tab selection changing -WebDeveloper.Storage.tabSelectionChanged = function(tabId) -{ - WebDeveloper.Storage.updateBadgeText(tabId); -}; - -// Handles a tab updating -WebDeveloper.Storage.tabUpdated = function(tabId, properties) -{ - // If there are no properties or the status is loading - if(!properties || properties.status == "loading") - { - WebDeveloper.Storage.clearTabFeatures(tabId); - } -}; - -// Toggles a feature on a tab -WebDeveloper.Storage.toggleFeatureOnTab = function(feature, tab) -{ - var featureTabId = tab.id; - var currentFeaturesOnTab = window.localStorage.getItem(featureTabId); - var newFeaturesOnTab = null; - - // If there are features on the tab - if(currentFeaturesOnTab) - { - var featureOnTab = false; - - newFeaturesOnTab = currentFeaturesOnTab.split(","); - - // Loop through the features on the tab - for(var i = 0, l = newFeaturesOnTab.length; i < l; i++) - { - // If the feature is on the tab - if(newFeaturesOnTab[i] == feature) - { - featureOnTab = true; - - newFeaturesOnTab.splice(i, 1); - } - } - - // If the feature is on the tab - if(featureOnTab) - { - newFeaturesOnTab = newFeaturesOnTab.join(","); - } - else - { - newFeaturesOnTab = currentFeaturesOnTab + feature + ","; - } - } - else - { - newFeaturesOnTab = feature + ","; - } - - window.localStorage.setItem(featureTabId, newFeaturesOnTab); - - WebDeveloper.Storage.updateBadgeText(featureTabId); -}; - -// Updates the badge text for a tab -WebDeveloper.Storage.updateBadgeText = function(featureTabId) -{ - var badgeText = ""; - var badgeTooltip = "@name@"; - var featuresOnTab = WebDeveloper.Storage.getFeaturesOnTab(featureTabId); - - // If there are features on the tab - if(featuresOnTab) - { - var featureCount = featuresOnTab.length - 1; - var featureDescription = "features"; - - // If there is only one feature count - if(featureCount == 1) - { - featureDescription = "feature"; - } - - badgeText = featureCount.toString(); - badgeTooltip += "\n" + badgeText + " active " + featureDescription + " on this tab"; - } - - chrome.browserAction.setBadgeText({ text: badgeText, tabId: featureTabId }); - chrome.browserAction.setTitle({ title: badgeTooltip, tabId: featureTabId }); -}; - -// Updates the extension icon -WebDeveloper.Storage.updateIcon = function() -{ - var icon = { path: { 19: "/overlay/images/icon.png", 38: "/overlay/images/icon-2x.png" } }; - - // If the icon should be in color - if(WebDeveloper.Storage.getItem("icon_color") == "true") - { - icon = { path: { 19: "/overlay/images/icon-color.png", 38: "/overlay/images/icon-color-2x.png" } }; - } - - chrome.browserAction.setIcon(icon); -}; - -WebDeveloper.Storage.updateIcon(); - -chrome.tabs.onRemoved.addListener(WebDeveloper.Storage.tabUpdated); -chrome.tabs.onSelectionChanged.addListener(WebDeveloper.Storage.tabSelectionChanged); -chrome.tabs.onUpdated.addListener(WebDeveloper.Storage.tabUpdated); - -chrome.browserAction.setBadgeBackgroundColor({ color: [0, 200, 0, 255] }); diff --git a/source/chrome/javascript/toolbar/element-ancestors.js b/source/chrome/javascript/toolbar/element-ancestors.js deleted file mode 100644 index 24eb640..0000000 --- a/source/chrome/javascript/toolbar/element-ancestors.js +++ /dev/null @@ -1,50 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.ElementAncestors = WebDeveloper.ElementAncestors || {}; - -// Creates the element information toolbar -WebDeveloper.ElementAncestors.createToolbar = function() -{ - // Ignore -}; - -// Displays the ancestors of an element -WebDeveloper.ElementAncestors.displayElementAncestors = function(element) -{ - var dashboard = WebDeveloper.Dashboard.getDashboard(WebDeveloper.Common.getContentDocument()); - - // If the dashboard exists - if(dashboard) - { - // If the element is not the dashboard - if(!element.hasAttribute("id") || element.getAttribute("id") != dashboard.getAttribute("id")) - { - var generatedDocument = dashboard.contentDocument; - var dispatchEvent = generatedDocument.createEvent("Events"); - var elementAncestors = generatedDocument.getElementById("current-element-ancestors"); - - WebDeveloper.Common.empty(elementAncestors); - elementAncestors.appendChild(WebDeveloper.ElementAncestors.getAncestorInformation(element, generatedDocument)); - - dispatchEvent.initEvent("web-developer-initialize-ancestors-event", true, false); - generatedDocument.querySelector("#current-element-ancestors .breadcrumb").dispatchEvent(dispatchEvent); - } - } -}; - -// Generates ancestor information for an element -WebDeveloper.ElementAncestors.generateAncestorInformation = function(element, contentDocument) -{ - var ancestorInformation = contentDocument.createElement("div"); - - ancestorInformation.setAttribute("id", "web-developer-ancestors"); - ancestorInformation.appendChild(WebDeveloper.ElementAncestors.getAncestorInformation(element, contentDocument)); - - return ancestorInformation; -}; - -// Removes the element information toolbar -WebDeveloper.ElementAncestors.removeToolbar = function() -{ - // Ignore -}; diff --git a/source/chrome/javascript/toolbar/line-guides.js b/source/chrome/javascript/toolbar/line-guides.js deleted file mode 100644 index 13746ac..0000000 --- a/source/chrome/javascript/toolbar/line-guides.js +++ /dev/null @@ -1,85 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.LineGuides = WebDeveloper.LineGuides || {}; -WebDeveloper.LineGuides.toolbarDocument = null; - -// Creates the line guides events -WebDeveloper.LineGuides.createEvents = function(contentDocument) -{ - window.WebDeveloperEvents = window.WebDeveloperEvents || {}; - window.WebDeveloperEvents.LineGuides = window.WebDeveloperEvents.LineGuides || {}; - window.WebDeveloperEvents.LineGuides.mouseMove = WebDeveloper.LineGuides.mouseMove; - window.WebDeveloperEvents.LineGuides.resizeDocument = WebDeveloper.LineGuides.resize; - - contentDocument.addEventListener("mousemove", window.WebDeveloperEvents.LineGuides.mouseMove, false); - contentDocument.addEventListener("resize", window.WebDeveloperEvents.LineGuides.resize, false); -}; - -// Creates the line guides toolbar -WebDeveloper.LineGuides.createToolbar = function(contentDocument, toolbarHTML) -{ - var lineGuidesToolbar = contentDocument.createElement("iframe"); - var styleSheet = null; - - lineGuidesToolbar.setAttribute("class", "web-developer-toolbar"); - lineGuidesToolbar.setAttribute("id", "web-developer-line-guides-toolbar"); - - WebDeveloper.Common.getDocumentBodyElement(contentDocument).appendChild(lineGuidesToolbar); - - WebDeveloper.LineGuides.toolbarDocument = lineGuidesToolbar.contentDocument; - styleSheet = WebDeveloper.LineGuides.toolbarDocument.createElement("link"); - - styleSheet.setAttribute("rel", "stylesheet"); - styleSheet.setAttribute("href", WebDeveloper.Common.getChromeURL("toolbar/line-guides-toolbar.css")); - WebDeveloper.Common.getDocumentHeadElement(WebDeveloper.LineGuides.toolbarDocument).appendChild(styleSheet); - - WebDeveloper.Common.getDocumentBodyElement(WebDeveloper.LineGuides.toolbarDocument).innerHTML = toolbarHTML; - - WebDeveloper.LineGuides.toolbarDocument.querySelector("img").setAttribute("src", WebDeveloper.Common.getChromeURL("toolbar/images/logo.png")); - WebDeveloper.LineGuides.toolbarDocument.getElementById("add-horizontal-line-guide").addEventListener("click", WebDeveloper.LineGuides.addHorizontalLineGuide, false); - WebDeveloper.LineGuides.toolbarDocument.getElementById("add-vertical-line-guide").addEventListener("click", WebDeveloper.LineGuides.addVerticalLineGuide, false); -}; - -// Returns the line guides color -WebDeveloper.LineGuides.getColor = function() -{ - return "#cc0000"; -}; - -// Hides the line guide information -WebDeveloper.LineGuides.hideInformation = function() -{ - WebDeveloper.Common.removeClass(WebDeveloper.Common.getDocumentBodyElement(WebDeveloper.LineGuides.toolbarDocument), "display-information"); -}; - -// Removes the line guides events -WebDeveloper.LineGuides.removeEvents = function(contentDocument) -{ - contentDocument.removeEventListener("mousemove", window.WebDeveloperEvents.LineGuides.mouseMove, false); - contentDocument.removeEventListener("resize", window.WebDeveloperEvents.LineGuides.resize, false); - - window.WebDeveloperEvents.LineGuides = null; -}; - -// Removes the line guides toolbar -WebDeveloper.LineGuides.removeToolbar = function(contentDocument) -{ - // If the toolbar document is set - if(WebDeveloper.LineGuides.toolbarDocument) - { - WebDeveloper.LineGuides.toolbarDocument.getElementById("add-horizontal-line-guide").removeEventListener("click", WebDeveloper.LineGuides.addHorizontalLineGuide, false); - WebDeveloper.LineGuides.toolbarDocument.getElementById("add-vertical-line-guide").removeEventListener("click", WebDeveloper.LineGuides.addVerticalLineGuide, false); - } - - WebDeveloper.Common.removeMatchingElements("#web-developer-line-guides-toolbar", contentDocument); -}; - -// Updates the line guide information -WebDeveloper.LineGuides.updateInformation = function(position, previousPosition, nextPosition) -{ - WebDeveloper.LineGuides.toolbarDocument.getElementById("line-guide-position").textContent = position + "px"; - WebDeveloper.LineGuides.toolbarDocument.getElementById("next-line-guide-position").textContent = nextPosition + "px"; - WebDeveloper.LineGuides.toolbarDocument.getElementById("previous-line-guide-position").textContent = previousPosition + "px"; - - WebDeveloper.Common.addClass(WebDeveloper.Common.getDocumentBodyElement(WebDeveloper.LineGuides.toolbarDocument), "display-information"); -}; diff --git a/source/chrome/javascript/toolbar/ruler.js b/source/chrome/javascript/toolbar/ruler.js deleted file mode 100644 index 4508f21..0000000 --- a/source/chrome/javascript/toolbar/ruler.js +++ /dev/null @@ -1,138 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Ruler = WebDeveloper.Ruler || {}; -WebDeveloper.Ruler.toolbarDocument = null; - -// Creates the ruler events -WebDeveloper.Ruler.createEvents = function(contentDocument) -{ - window.WebDeveloperEvents = window.WebDeveloperEvents || {}; - window.WebDeveloperEvents.Ruler = window.WebDeveloperEvents.Ruler || {}; - window.WebDeveloperEvents.Ruler.mouseDown = WebDeveloper.Ruler.mouseDown; - window.WebDeveloperEvents.Ruler.mouseMove = WebDeveloper.Ruler.mouseMove; - window.WebDeveloperEvents.Ruler.mouseUp = WebDeveloper.Ruler.mouseUp; - window.WebDeveloperEvents.Ruler.resizeDocument = WebDeveloper.Ruler.resizeDocument; - - contentDocument.addEventListener("mousedown", window.WebDeveloperEvents.Ruler.mouseDown, true); - contentDocument.addEventListener("mousemove", window.WebDeveloperEvents.Ruler.mouseMove, false); - contentDocument.addEventListener("mouseup", window.WebDeveloperEvents.Ruler.mouseUp, true); - contentDocument.addEventListener("resize", window.WebDeveloperEvents.Ruler.resizeDocument, false); -}; - -// Creates the ruler toolbar -WebDeveloper.Ruler.createToolbar = function(contentDocument, toolbarHTML) -{ - var rulerToolbar = contentDocument.createElement("iframe"); - var styleSheet = null; - - rulerToolbar.setAttribute("id", "web-developer-ruler-toolbar"); - rulerToolbar.setAttribute("class", "web-developer-toolbar"); - - WebDeveloper.Common.getDocumentBodyElement(contentDocument).appendChild(rulerToolbar); - - WebDeveloper.Ruler.toolbarDocument = rulerToolbar.contentDocument; - styleSheet = WebDeveloper.Ruler.toolbarDocument.createElement("link"); - - styleSheet.setAttribute("rel", "stylesheet"); - styleSheet.setAttribute("href", WebDeveloper.Common.getChromeURL("toolbar/ruler-toolbar.css")); - WebDeveloper.Common.getDocumentHeadElement(WebDeveloper.Ruler.toolbarDocument).appendChild(styleSheet); - - WebDeveloper.Common.getDocumentBodyElement(WebDeveloper.Ruler.toolbarDocument).innerHTML = toolbarHTML; - - WebDeveloper.Ruler.toolbarDocument.querySelector("img").setAttribute("src", WebDeveloper.Common.getChromeURL("toolbar/images/logo.png")); - WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-height").addEventListener("change", WebDeveloper.Ruler.updateHeight, false); - WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-width").addEventListener("change", WebDeveloper.Ruler.updateWidth, false); -}; - -// Removes the ruler events -WebDeveloper.Ruler.removeEvents = function(contentDocument) -{ - contentDocument.removeEventListener("mousedown", window.WebDeveloperEvents.Ruler.mouseDown, true); - contentDocument.removeEventListener("mousemove", window.WebDeveloperEvents.Ruler.mouseMove, false); - contentDocument.removeEventListener("mouseup", window.WebDeveloperEvents.Ruler.mouseUp, true); - contentDocument.removeEventListener("resize", window.WebDeveloperEvents.Ruler.resizeDocument, false); - - window.WebDeveloperEvents.Ruler = null; -}; - -// Removes the ruler toolbar -WebDeveloper.Ruler.removeToolbar = function(contentDocument) -{ - // If the toolbar document is set - if(WebDeveloper.Ruler.toolbarDocument) - { - WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-height").removeEventListener("change", WebDeveloper.Ruler.updateHeight, false); - WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-width").removeEventListener("change", WebDeveloper.Ruler.updateWidth, false); - } - - WebDeveloper.Common.removeMatchingElements("#web-developer-ruler-toolbar", contentDocument); -}; - -// Updates the ruler height -WebDeveloper.Ruler.updateHeight = function() -{ - var height = WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-height").value.replace(/px/gi, ""); - - // If the height is valid - if(height && parseInt(height, 10) == height && height > 0) - { - height = parseInt(height, 10); - WebDeveloper.Ruler.ruler.style.height = height - 2 + "px"; - WebDeveloper.Ruler.endY = WebDeveloper.Ruler.startY + height; - - WebDeveloper.Ruler.resizeBackgrounds(); - WebDeveloper.Ruler.updateInformation(); - } -}; - -// Updates the ruler information -WebDeveloper.Ruler.updateInformation = function() -{ - // If the ruler is set - if(WebDeveloper.Ruler.ruler) - { - WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-height").value = WebDeveloper.Ruler.ruler.offsetHeight + "px"; - WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-width").value = WebDeveloper.Ruler.ruler.offsetWidth + "px"; - - // If the end x position is greater than the start x position - if(WebDeveloper.Ruler.endX > WebDeveloper.Ruler.startX) - { - WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-end-x").textContent = WebDeveloper.Ruler.endX + 2 + "px"; - WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-start-x").textContent = WebDeveloper.Ruler.startX + "px"; - } - else - { - WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-end-x").textContent = WebDeveloper.Ruler.endX + "px"; - WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-start-x").textContent = WebDeveloper.Ruler.startX + 2 + "px"; - } - - // If the end y position is greater than the start y position - if(WebDeveloper.Ruler.endY > WebDeveloper.Ruler.startY) - { - WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-end-y").textContent = WebDeveloper.Ruler.endY + 2 + "px"; - WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-start-y").textContent = WebDeveloper.Ruler.startY + "px"; - } - else - { - WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-end-y").textContent = WebDeveloper.Ruler.endY + "px"; - WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-start-y").textContent = WebDeveloper.Ruler.startY + 2 + "px"; - } - } -}; - -// Updates the ruler width -WebDeveloper.Ruler.updateWidth = function() -{ - var width = WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-width").value.replace(/px/gi, ""); - - // If the width is valid - if(width && parseInt(width, 10) == width && width > 0) - { - width = parseInt(width, 10); - WebDeveloper.Ruler.ruler.style.width = width - 2 + "px"; - WebDeveloper.Ruler.endX = WebDeveloper.Ruler.startX + width; - - WebDeveloper.Ruler.resizeBackgrounds(); - WebDeveloper.Ruler.updateInformation(); - } -}; diff --git a/source/chrome/style-sheets/dashboard/common.css b/source/chrome/style-sheets/dashboard/common.css deleted file mode 100644 index 9ce80e5..0000000 --- a/source/chrome/style-sheets/dashboard/common.css +++ /dev/null @@ -1,27 +0,0 @@ -/* Dashboard styles */ - -html { padding-bottom: 0; } -#web-developer-dashboard-panels .nav-tabs > li:first-child, #web-developer-dashboard-tabs > li:first-child { margin-left: 5px; } -#web-developer-dashboard-resizer { background-color: #e6e6e6; border-bottom: 1px solid #a3a3a3; color: #666; cursor: row-resize; font-size: 9px; height: 5px; line-height: 5px; text-align: center; } -#web-developer-dashboard-tabs { margin: 5px 0; } -#web-developer-dashboard-title { background: url(@common.prefix@/common/images/logos/16.png) no-repeat 0 0; font-size: 14px; line-height: 16px; margin: 0; padding-left: 20px; position: absolute; right: 5px; top: 21px; } - -@media (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5) -{ - #web-developer-dashboard-title { background-image: url(@common.prefix@/common/images/logos/32.png); background-size: 16px 16px; } -} - -/* Edit CSS styles */ - -#web-developer-edit-css-panels > div > textarea { border-style: none; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 13px; height: 100%; word-wrap: normal; } - -/* Element information styles */ - -#element-information-panel { margin: 0 5px; overflow: scroll; } - -/* Element ancestors styles */ - -#current-element-ancestors { border-top: 1px solid #a3a3a3; bottom: 0; -webkit-box-shadow: 0 0 7px rgba(0, 0, 0, 0.3); -moz-box-shadow: 0 0 7px rgba(0, 0, 0, 0.3); box-shadow: 0 0 7px rgba(0, 0, 0, 0.3); left: 0; position: fixed; width: 100%; } -#current-element-ancestors > .breadcrumb { background-color: #e6e6e6; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; margin: 0; } -#current-element-ancestors > .breadcrumb > li { color: #333; } -#current-element-ancestors > .breadcrumb > li > a { color: #999; cursor: text; pointer-events: none; text-decoration: none; } diff --git a/source/chrome/style-sheets/toolbar/line-guides.css b/source/chrome/style-sheets/toolbar/line-guides.css deleted file mode 100644 index e5f5b92..0000000 --- a/source/chrome/style-sheets/toolbar/line-guides.css +++ /dev/null @@ -1,5 +0,0 @@ -span { display: none; } -#add-horizontal-line-guide { margin: 0 5px 0 20px; } -#line-guide-position, #previous-line-guide-position { margin: 0 10px 0 5px; } -#next-line-guide-position { margin-left: 5px; } -.display-information span { display: inline; } diff --git a/source/chrome/style-sheets/toolbar/ruler.css b/source/chrome/style-sheets/toolbar/ruler.css deleted file mode 100644 index f164d93..0000000 --- a/source/chrome/style-sheets/toolbar/ruler.css +++ /dev/null @@ -1,4 +0,0 @@ -#web-developer-ruler-end-x, #web-developer-ruler-start-x { margin: 0 10px 0 5px; } -#web-developer-ruler-end-y { margin-left: 5px; } -#web-developer-ruler-height, #web-developer-ruler-width { margin: 0 20px 0 0; width: 60px; } -#web-developer-ruler-start-y { margin: 0 20px 0 5px; } diff --git a/source/common/html/about/about.html b/source/common/html/about/about.html index 6f460ce..847a208 100644 --- a/source/common/html/about/about.html +++ b/source/common/html/about/about.html @@ -4,10 +4,10 @@ @name@ - + - + @@ -34,7 +34,7 @@

-
+

@url@@browser@/

@@ -43,7 +43,7 @@

- + diff --git a/source/chrome/html/background/background.html b/source/common/html/background/background.html similarity index 80% rename from source/chrome/html/background/background.html rename to source/common/html/background/background.html index 0fea547..27119f9 100644 --- a/source/chrome/html/background/background.html +++ b/source/common/html/background/background.html @@ -8,12 +8,12 @@ - - - - - - + + + + + + - - - + + + + diff --git a/source/common/html/generated/find-duplicate-ids.html b/source/common/html/generated/find-duplicate-ids.html index 81bb2ee..e353344 100644 --- a/source/common/html/generated/find-duplicate-ids.html +++ b/source/common/html/generated/find-duplicate-ids.html @@ -4,10 +4,10 @@ @name@ - - + + - + @@ -43,10 +43,10 @@ - - - - + + + + diff --git a/source/common/html/generated/view-anchor-information.html b/source/common/html/generated/view-anchor-information.html index 7b3c379..9428148 100644 --- a/source/common/html/generated/view-anchor-information.html +++ b/source/common/html/generated/view-anchor-information.html @@ -4,10 +4,10 @@ @name@ - - + + - + @@ -43,10 +43,10 @@ - - - - + + + + diff --git a/source/common/html/generated/view-color-information.html b/source/common/html/generated/view-color-information.html index 0f9af51..75ed67a 100644 --- a/source/common/html/generated/view-color-information.html +++ b/source/common/html/generated/view-color-information.html @@ -4,11 +4,11 @@ @name@ - - + + - + @@ -44,10 +44,10 @@ - - - - + + + + diff --git a/source/common/html/generated/view-cookie-information.html b/source/common/html/generated/view-cookie-information.html index c0429ca..82a1b77 100644 --- a/source/common/html/generated/view-cookie-information.html +++ b/source/common/html/generated/view-cookie-information.html @@ -4,11 +4,11 @@ @name@ - - + + - + @@ -152,17 +152,17 @@

- - - - - - + + + + + + - - - - + + + + diff --git a/source/common/html/generated/view-css.html b/source/common/html/generated/view-css.html index 005cbf1..7038496 100644 --- a/source/common/html/generated/view-css.html +++ b/source/common/html/generated/view-css.html @@ -4,11 +4,11 @@ @name@ - - - + + + - + @@ -56,13 +56,13 @@ - - - - - - - + + + + + + + diff --git a/source/common/html/generated/view-document-outline.html b/source/common/html/generated/view-document-outline.html index 96cddd5..f88abd1 100644 --- a/source/common/html/generated/view-document-outline.html +++ b/source/common/html/generated/view-document-outline.html @@ -4,11 +4,11 @@ @name@ - - + + - + @@ -44,10 +44,10 @@ - - - - + + + + diff --git a/source/common/html/generated/view-form-information.html b/source/common/html/generated/view-form-information.html index 7f8ddd1..00a04ac 100644 --- a/source/common/html/generated/view-form-information.html +++ b/source/common/html/generated/view-form-information.html @@ -4,11 +4,11 @@ @name@ - - + + - + @@ -48,10 +48,10 @@ - - - - + + + + diff --git a/source/common/html/generated/view-image-information.html b/source/common/html/generated/view-image-information.html index 830d42c..4a99172 100644 --- a/source/common/html/generated/view-image-information.html +++ b/source/common/html/generated/view-image-information.html @@ -4,11 +4,11 @@ @name@ - - + + - + @@ -48,10 +48,10 @@ - - - - + + + + diff --git a/source/common/html/generated/view-javascript.html b/source/common/html/generated/view-javascript.html index 095050a..4d8a10c 100644 --- a/source/common/html/generated/view-javascript.html +++ b/source/common/html/generated/view-javascript.html @@ -4,12 +4,12 @@ @name@ - - - + + + - + @@ -58,13 +58,13 @@ - - - - - - - + + + + + + + diff --git a/source/common/html/generated/view-link-information.html b/source/common/html/generated/view-link-information.html index 0c34acb..23542e7 100644 --- a/source/common/html/generated/view-link-information.html +++ b/source/common/html/generated/view-link-information.html @@ -4,10 +4,10 @@ @name@ - - + + - + @@ -43,10 +43,10 @@ - - - - + + + + diff --git a/source/common/html/generated/view-meta-tag-information.html b/source/common/html/generated/view-meta-tag-information.html index 7e2003c..c00a8f0 100644 --- a/source/common/html/generated/view-meta-tag-information.html +++ b/source/common/html/generated/view-meta-tag-information.html @@ -4,10 +4,10 @@ @name@ - - + + - + @@ -43,10 +43,10 @@ - - - - + + + + diff --git a/source/common/html/generated/view-response-headers.html b/source/common/html/generated/view-response-headers.html index 99c7a1a..7f62c30 100644 --- a/source/common/html/generated/view-response-headers.html +++ b/source/common/html/generated/view-response-headers.html @@ -4,10 +4,10 @@ @name@ - - + + - + @@ -27,10 +27,10 @@ - - - - + + + + diff --git a/source/common/html/generated/view-responsive-layouts.html b/source/common/html/generated/view-responsive-layouts.html index ad068c4..f706ac4 100644 --- a/source/common/html/generated/view-responsive-layouts.html +++ b/source/common/html/generated/view-responsive-layouts.html @@ -4,11 +4,11 @@ @name@ - - + + - + @@ -49,10 +49,10 @@ - - - - + + + + diff --git a/source/chrome/html/options/options.html b/source/common/html/options/options.html similarity index 91% rename from source/chrome/html/options/options.html rename to source/common/html/options/options.html index 6908ce2..8afd577 100644 --- a/source/chrome/html/options/options.html +++ b/source/common/html/options/options.html @@ -4,10 +4,10 @@ @name@ - + - + @@ -77,16 +77,6 @@ - -
-
-
- -
-
-
@@ -317,15 +307,15 @@

- - - - - - - - - + + + + + + + + + - - - - - + + + + + + diff --git a/source/chrome/html/overlay/overlay.html b/source/common/html/overlay/overlay.html similarity index 96% rename from source/chrome/html/overlay/overlay.html rename to source/common/html/overlay/overlay.html index 7669f03..1885ce9 100644 --- a/source/chrome/html/overlay/overlay.html +++ b/source/common/html/overlay/overlay.html @@ -1,10 +1,10 @@ - + @name@ - + @@ -259,7 +259,7 @@
@@ -386,13 +386,13 @@ - - - - - - - + + + + + + + + diff --git a/source/chrome/html/validation/html.html b/source/common/html/validation/html.html similarity index 68% rename from source/chrome/html/validation/html.html rename to source/common/html/validation/html.html index 28ab826..5fd3384 100644 --- a/source/chrome/html/validation/html.html +++ b/source/common/html/validation/html.html @@ -4,10 +4,10 @@ @name@ - - + + - + @@ -24,7 +24,7 @@ - + diff --git a/source/common/javascript/about/about.js b/source/common/javascript/about/about.js index 52149ad..2ca4687 100644 --- a/source/common/javascript/about/about.js +++ b/source/common/javascript/about/about.js @@ -10,7 +10,6 @@ WebDeveloper.Generated.initialize = function(data, locale) $("title").text(locale.about + " " + name); $("h1").text(name); $("#description").text(locale.extensionDescription); - $("#follow-on-appnet").text(locale.followOnAppNet); $("#follow-on-twitter").text(locale.followOnTwitter); $("#author").text(locale.author); $("#version").text(locale.version); diff --git a/source/chrome/javascript/background/background.js b/source/common/javascript/background/background.js similarity index 97% rename from source/chrome/javascript/background/background.js rename to source/common/javascript/background/background.js index 466074c..866c63d 100644 --- a/source/chrome/javascript/background/background.js +++ b/source/common/javascript/background/background.js @@ -236,11 +236,6 @@ WebDeveloper.Background.message = function(message, sender, sendResponse) // No response required sendResponse({}); } - else - { - // Unknown message - sendResponse({}); - } }; // Opens a generated tab @@ -251,7 +246,7 @@ WebDeveloper.Background.openGeneratedTab = function(tabURL, tabIndex, data, loca var tabLoaded = function(tabId, tabInformation) { // If this is the opened tab and it finished loading - if(tabId == openedTab.id && tabInformation.status == "complete") + if(tabId == openedTab.id && tabInformation.status && tabInformation.status == "complete") { WebDeveloper.Background.initializeGeneratedTab(tabURL, data, locale); @@ -303,4 +298,4 @@ WebDeveloper.Background.validateLocalHTML = function(tabURL, tabIndex, validateU }); }; -chrome.extension.onMessage.addListener(WebDeveloper.Background.message); +chrome.runtime.onMessage.addListener(WebDeveloper.Background.message); diff --git a/source/common/javascript/common/common.js b/source/common/javascript/common/common.js index 9453a74..9e63e2b 100644 --- a/source/common/javascript/common/common.js +++ b/source/common/javascript/common/common.js @@ -9,7 +9,15 @@ WebDeveloper.Common.addClass = function(element, className) // If the element and class name are set and the element does not already have this class if(element && className && !WebDeveloper.Common.hasClass(element, className)) { - element.className = (element.className + " " + className).trim(); + // If the classes are on an SVG + if(element.className instanceof SVGAnimatedString) + { + element.className.baseVal = (element.className.baseVal + " " + className).trim(); + } + else + { + element.className = (element.className + " " + className).trim(); + } } }; @@ -61,6 +69,24 @@ WebDeveloper.Common.adjustElementPosition = function(element, xPosition, yPositi } }; +// Adjusts the position of the given element +WebDeveloper.Common.appendHTML = function(html, element, contentDocument) +{ + // If the HTML, element and content document are set + if(html && element && contentDocument) + { + var htmlElement = contentDocument.createElement("div"); + + htmlElement.innerHTML = html; + + // While there children of the HTML element + while(htmlElement.firstChild) + { + element.appendChild(htmlElement.firstChild); + } + } +}; + // Returns true if the array contains the element WebDeveloper.Common.contains = function(array, element) { @@ -136,6 +162,24 @@ WebDeveloper.Common.formatDimensions = function(width, height, locale) return ""; }; +// Returns a chrome URL +WebDeveloper.Common.getChromeURL = function(url) +{ + return chrome.extension.getURL(url); +}; + +// Returns the current content document +WebDeveloper.Common.getContentDocument = function() +{ + return document; +}; + +// Returns the current content window +WebDeveloper.Common.getContentWindow = function() +{ + return window; +}; + // Returns a CSS primitive value WebDeveloper.Common.getCSSPrimitiveValue = function(type) { @@ -171,6 +215,12 @@ WebDeveloper.Common.getCSSPrimitiveValue = function(type) } }; +// Returns a CSS property +WebDeveloper.Common.getCSSProperty = function(property) +{ + return property; +}; + // Returns the CSS text from a property WebDeveloper.Common.getCSSText = function(property) { @@ -499,6 +549,45 @@ WebDeveloper.Common.getPropertyCSSValue = function(computedStyle, property) return cssProperty; }; +// Gets the content from a URL +WebDeveloper.Common.getURLContent = function(urlContentRequest, errorMessage, configuration) +{ + var url = urlContentRequest.url; + + // If the URL is not entirely generated + if(url.indexOf("wyciwyg://") !== 0) + { + // Try to download the file + try + { + var request = new XMLHttpRequest(); + + request.timeout = WebDeveloper.Common.requestTimeout; + + request.onreadystatechange = function() + { + // If the request completed + if(request.readyState == 4) + { + WebDeveloper.Common.urlContentRequestComplete(request.responseText, urlContentRequest, configuration); + } + }; + + request.ontimeout = function() + { + WebDeveloper.Common.urlContentRequestComplete(errorMessage, urlContentRequest, configuration); + }; + + request.open("get", url); + request.send(null); + } + catch(exception) + { + WebDeveloper.Common.urlContentRequestComplete(errorMessage, urlContentRequest, configuration); + } + } +}; + // Returns the contents of the given URLs WebDeveloper.Common.getURLContents = function(urlContentRequests, errorMessage, callback) { @@ -518,7 +607,15 @@ WebDeveloper.Common.hasClass = function(element, className) // If the element and class name are set if(element && className) { - var classes = element.className.split(" "); + var classes = element.className; + + // If the classes are on an SVG + if(classes instanceof SVGAnimatedString) + { + classes = classes.baseVal; + } + + classes = classes.split(" "); // Loop through the classes for(var i = 0, l = classes.length; i < l; i++) @@ -661,6 +758,20 @@ WebDeveloper.Common.isCSSURI = function(property) return false; }; +// Logs a message +WebDeveloper.Common.log = function(message, exception) +{ + // If an exception is set + if(exception) + { + console.warn(message, exception); // eslint-disable-line no-console + } + else + { + console.warn(message); // eslint-disable-line no-console + } +}; + // Returns the position if the item is in the array or -1 if it is not WebDeveloper.Common.positionInArray = function(item, array) { @@ -687,7 +798,15 @@ WebDeveloper.Common.removeClass = function(element, className) // If the element and class name are set if(element && className) { - var classes = element.className.split(" "); + var classes = element.className; + + // If the classes are on an SVG + if(classes instanceof SVGAnimatedString) + { + classes = classes.baseVal; + } + + classes = classes.split(" "); // Loop through the classes for(var i = 0, l = classes.length; i < l; i++) @@ -697,7 +816,15 @@ WebDeveloper.Common.removeClass = function(element, className) { classes.splice(i, 1); - element.className = classes.join(" ").trim(); + // If the classes are on an SVG + if(element.className instanceof SVGAnimatedString) + { + element.className.baseVal = classes.join(" ").trim(); + } + else + { + element.className = classes.join(" ").trim(); + } break; } diff --git a/source/common/javascript/common/css.js b/source/common/javascript/common/css.js index 4319654..f2dc078 100644 --- a/source/common/javascript/common/css.js +++ b/source/common/javascript/common/css.js @@ -82,34 +82,42 @@ WebDeveloper.CSS.getImportedStyleSheets = function(styleSheet) // If the style sheet is set if(styleSheet) { - var cssRules = styleSheet.cssRules; - - // If there are CSS rules - if(cssRules) + // Try to access the style sheet rules + try { - var cssRule = null; - var importedStyleSheet = null; + var cssRules = styleSheet.cssRules; - // Loop through the style sheet rules - for(var i = 0, l = cssRules.length; i < l; i++) + // If there are CSS rules + if(cssRules) { - cssRule = cssRules[i]; + var cssRule = null; + var importedStyleSheet = null; - // If this is an import rule - if(cssRule.type == 3) + // Loop through the style sheet rules + for(var i = 0, l = cssRules.length; i < l; i++) { - importedStyleSheet = cssRule.styleSheet; + cssRule = cssRules[i]; - // If this style sheet is valid - if(WebDeveloper.CSS.isValidStyleSheet(importedStyleSheet)) + // If this is an import rule + if(cssRule.type == 3) { - styleSheets.push(importedStyleSheet.href); + importedStyleSheet = cssRule.styleSheet; + + // If this style sheet is valid + if(WebDeveloper.CSS.isValidStyleSheet(importedStyleSheet)) + { + styleSheets.push(importedStyleSheet.href); - styleSheets = styleSheets.concat(WebDeveloper.CSS.getImportedStyleSheets(importedStyleSheet)); + styleSheets = styleSheets.concat(WebDeveloper.CSS.getImportedStyleSheets(importedStyleSheet)); + } } } } } + catch(exception) + { + WebDeveloper.Common.log("Could not access the style sheet rules for " + styleSheet.href + ".", exception); + } } return styleSheets; diff --git a/source/chrome/javascript/common/jquery/tablednd.js b/source/common/javascript/common/jquery/tablednd.js similarity index 100% rename from source/chrome/javascript/common/jquery/tablednd.js rename to source/common/javascript/common/jquery/tablednd.js diff --git a/source/common/javascript/content/content.js b/source/common/javascript/content/content.js index 692ac0c..dd6ada5 100644 --- a/source/common/javascript/content/content.js +++ b/source/common/javascript/content/content.js @@ -466,6 +466,29 @@ WebDeveloper.Content.getDocuments = function(frame) return documents; }; +// Returns any domain cookies +WebDeveloper.Content.getDomainCookies = function(allCookies) +{ + var documents = WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()); + var domainCookies = []; + + // Loop through the documents + for(var i = 0, l = documents.length; i < l; i++) + { + // Try to get the host + try + { + domainCookies = domainCookies.concat(WebDeveloper.Content.filterCookies(allCookies, documents[i].location.hostname, "/", false)); + } + catch(exception) + { + // Ignore + } + } + + return domainCookies; +}; + // Returns any duplicate ids in the document WebDeveloper.Content.getDuplicateIds = function() { @@ -475,7 +498,7 @@ WebDeveloper.Content.getDuplicateIds = function() var documentDuplicateIds = null; var duplicateIds = {}; var id = null; - var nonDuplicateIds = null; + var nonDuplicateIds = null; duplicateIds.documents = []; duplicateIds.pageTitle = contentDocument.title; @@ -816,6 +839,18 @@ WebDeveloper.Content.getLinks = function() return links; }; +// Returns the details for the location +WebDeveloper.Content.getLocationDetails = function() +{ + var windowLocation = WebDeveloper.Common.getContentWindow().location; + var locationDetails = {}; + + locationDetails.host = windowLocation.hostname; + locationDetails.path = windowLocation.pathname; + + return locationDetails; +}; + // Returns any meta tags in the document WebDeveloper.Content.getMetaTags = function() { @@ -826,6 +861,7 @@ WebDeveloper.Content.getMetaTags = function() var documentMetaTags = null; var metaTag = null; var metaTags = {}; + var sortedMetaTags = []; metaTags.documents = []; metaTags.pageTitle = contentDocument.title; @@ -839,6 +875,7 @@ WebDeveloper.Content.getMetaTags = function() documentMetaTags = {}; documentMetaTags.metaTags = []; documentMetaTags.url = contentDocument.documentURI; + sortedMetaTags = []; // Loop through the meta tags for(var j = 0, m = documentAllMetaTags.length; j < m; j++) @@ -868,15 +905,45 @@ WebDeveloper.Content.getMetaTags = function() documentMetaTag.name = metaTag.getAttribute("property"); } - documentMetaTags.metaTags.push(documentMetaTag); + sortedMetaTags.push(documentMetaTag); } + sortedMetaTags.sort(WebDeveloper.Content.sortMetaTags); + + documentMetaTags.metaTags = sortedMetaTags; + metaTags.documents.push(documentMetaTags); } return metaTags; }; +// Returns any path cookies +WebDeveloper.Content.getPathCookies = function(allCookies) +{ + var contentDocument = null; + var documents = WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()); + var pathCookies = []; + + // Loop through the documents + for(var i = 0, l = documents.length; i < l; i++) + { + contentDocument = documents[i]; + + // Try to get the host and path + try + { + pathCookies = pathCookies.concat(WebDeveloper.Content.filterCookies(allCookies, contentDocument.location.hostname, contentDocument.location.pathname, false)); + } + catch(exception) + { + // Ignore + } + } + + return pathCookies; +}; + // Returns the window size WebDeveloper.Content.getWindowSize = function() { @@ -890,6 +957,18 @@ WebDeveloper.Content.getWindowSize = function() return size; }; +// Turns text lower case while checking if the text is set +WebDeveloper.Content.lowerCase = function(text) +{ + // If the text is set + if(text) + { + return text.toLowerCase(); + } + + return text; +}; + // Sorts two cookies WebDeveloper.Content.sortCookies = function(cookieOne, cookieTwo) { @@ -915,6 +994,31 @@ WebDeveloper.Content.sortCookies = function(cookieOne, cookieTwo) return 1; }; +// Sorts two meta tags +WebDeveloper.Content.sortMetaTags = function(metaTagOne, metaTagTwo) +{ + // If meta tag one and meta tag two are set + if(metaTagOne && metaTagTwo) + { + var metaTagOneContent = WebDeveloper.Content.lowerCase(metaTagOne.content); + var metaTagOneName = WebDeveloper.Content.lowerCase(metaTagOne.name); + var metaTagTwoContent = WebDeveloper.Content.lowerCase(metaTagTwo.content); + var metaTagTwoName = WebDeveloper.Content.lowerCase(metaTagTwo.name); + + // If the cookies are equal + if(metaTagOneName == metaTagTwoName && metaTagOneContent == metaTagTwoContent) + { + return 0; + } + else if(metaTagOneName < metaTagTwoName || metaTagOneName == metaTagTwoName && metaTagOneContent < metaTagTwoContent) + { + return -1; + } + } + + return 1; +}; + // Tidies a list of colors by removing duplicates and sorting WebDeveloper.Content.tidyColors = function(colors) { @@ -939,3 +1043,79 @@ WebDeveloper.Content.tidyColors = function(colors) return tidiedColors; }; + +// Handles any content messages +WebDeveloper.Content.message = function(message, sender, sendResponse) +{ + // If the message type is to get anchors + if(message.type == "get-anchors") + { + sendResponse(WebDeveloper.Content.getAnchors()); + } + else if(message.type == "get-broken-images") + { + sendResponse(WebDeveloper.Content.getBrokenImages()); + } + else if(message.type == "get-colors") + { + sendResponse(WebDeveloper.Content.getColors()); + } + else if(message.type == "get-cookies") + { + sendResponse(WebDeveloper.Content.getCookies(message.allCookies)); + } + else if(message.type == "get-css") + { + sendResponse(WebDeveloper.Content.getCSS()); + } + else if(message.type == "get-document-details") + { + sendResponse(WebDeveloper.Content.getDocumentDetails()); + } + else if(message.type == "get-document-outline") + { + sendResponse(WebDeveloper.Content.getDocumentOutline()); + } + else if(message.type == "get-domain-cookies") + { + sendResponse(WebDeveloper.Content.getDomainCookies(message.allCookies)); + } + else if(message.type == "get-duplicate-ids") + { + sendResponse(WebDeveloper.Content.getDuplicateIds()); + } + else if(message.type == "get-forms") + { + sendResponse(WebDeveloper.Content.getForms()); + } + else if(message.type == "get-images") + { + sendResponse(WebDeveloper.Content.getImages()); + } + else if(message.type == "get-javascript") + { + sendResponse(WebDeveloper.Content.getJavaScript()); + } + else if(message.type == "get-links") + { + sendResponse(WebDeveloper.Content.getLinks()); + } + else if(message.type == "get-location-details") + { + sendResponse(WebDeveloper.Content.getLocationDetails()); + } + else if(message.type == "get-meta-tags") + { + sendResponse(WebDeveloper.Content.getMetaTags()); + } + else if(message.type == "get-path-cookies") + { + sendResponse(WebDeveloper.Content.getPathCookies(message.allCookies)); + } + else if(message.type == "get-window-size") + { + sendResponse(WebDeveloper.Content.getWindowSize()); + } +}; + +chrome.runtime.onMessage.addListener(WebDeveloper.Content.message); diff --git a/source/common/javascript/cookies/cookies.js b/source/common/javascript/cookies/cookies.js index 1812e4d..7e25914 100644 --- a/source/common/javascript/cookies/cookies.js +++ b/source/common/javascript/cookies/cookies.js @@ -2,6 +2,55 @@ var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-defi WebDeveloper.Cookies = WebDeveloper.Cookies || {}; +// Adds a cookie +WebDeveloper.Cookies.addCookie = function(cookie) +{ + var host = WebDeveloper.Cookies.sanitizeHost(cookie.host.trim()); + var name = cookie.name.trim(); + var protocol = "http://"; + var secure = cookie.secure; + var url = null; + var value = cookie.value.trim(); + + // If the cookie is secure + if(secure) + { + protocol = "https://"; + } + + url = protocol + host + cookie.path.trim(); + + // If the cookie is a session cookie + if(cookie.session) + { + chrome.cookies.set({ domain: host, name: name, secure: secure, url: url, value: value }); + } + else + { + chrome.cookies.set({ domain: host, expirationDate: new Date(cookie.expires.trim()).getTime() / 1000, name: name, secure: secure, url: url, value: value }); + } +}; + +// Returns true if you can edit a local cookie +WebDeveloper.Cookies.canEditLocalCookie = function() +{ + return false; +}; + +// Deletes a cookie +WebDeveloper.Cookies.deleteCookie = function(cookie) +{ + var protocol = "http://"; + + // If the cookie is secure + if(cookie.secure) + { + protocol = "https://"; + } + + chrome.cookies.remove({ name: cookie.name, url: protocol + cookie.host + cookie.path }); +}; + // Deletes all the cookies for the current domain WebDeveloper.Cookies.deleteDomainCookies = function(cookies) { diff --git a/source/chrome/javascript/dashboard/common.js b/source/common/javascript/dashboard/common.js similarity index 100% rename from source/chrome/javascript/dashboard/common.js rename to source/common/javascript/dashboard/common.js diff --git a/source/common/javascript/dashboard/dashboard.js b/source/common/javascript/dashboard/dashboard.js index 82426fa..dd5e0cd 100644 --- a/source/common/javascript/dashboard/dashboard.js +++ b/source/common/javascript/dashboard/dashboard.js @@ -1,6 +1,27 @@ var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define -WebDeveloper.Dashboard = WebDeveloper.Dashboard || {}; +WebDeveloper.Dashboard = WebDeveloper.Dashboard || {}; +WebDeveloper.Dashboard.resizing = false; + +// Adjusts the bottom margin of the body +WebDeveloper.Dashboard.adjustBodyBottomMargin = function(contentDocument, height) +{ + WebDeveloper.Common.getDocumentBodyElement(contentDocument).style.setProperty("margin-bottom", parseInt(height, 10) + 20 + "px", "important"); +}; + +// Closes a dashboard tab +WebDeveloper.Dashboard.closeDashboardTab = function(tabId, contentDocument) +{ + var dashboardDocument = WebDeveloper.Dashboard.getDashboard(contentDocument).contentDocument; + + WebDeveloper.Common.removeMatchingElements("#" + tabId + "-panel, #" + tabId + "-tab", dashboardDocument); + + // If the last tab on the dashboard was closed + if(dashboardDocument.querySelectorAll("#web-developer-dashboard-tabs > li").length === 0) + { + WebDeveloper.Dashboard.removeDashboard(contentDocument); + } +}; // Converts a title to an id WebDeveloper.Dashboard.convertTitleToId = function(title) @@ -8,6 +29,63 @@ WebDeveloper.Dashboard.convertTitleToId = function(title) return "web-developer-" + title.toLowerCase().replace(" ", "-"); }; +// Create the dashboard +WebDeveloper.Dashboard.createDashboard = function(contentDocument, dashboardHTML) +{ + var dashboard = contentDocument.createElement("iframe"); + var dashboardDocument = null; + var resizer = null; + + dashboard.setAttribute("id", "web-developer-dashboard"); + + WebDeveloper.Common.getDocumentBodyElement(contentDocument).appendChild(dashboard); + + dashboardDocument = dashboard.contentDocument; + window.WebDeveloperEvents = window.WebDeveloperEvents || {}; + window.WebDeveloperEvents.Dashboard = window.WebDeveloperEvents.Dashboard || {}; + window.WebDeveloperEvents.Dashboard.mouseUp = WebDeveloper.Dashboard.mouseUp; + + WebDeveloper.Common.toggleStyleSheet("/dashboard/style-sheets/dashboard.css", "web-developer-dashboard-styles", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/dashboard/style-sheets/common.css", "web-developer-dashboard-styles", dashboardDocument, false); + + WebDeveloper.Common.getDocumentBodyElement(dashboardDocument).innerHTML = dashboardHTML; + + WebDeveloper.Common.includeJavaScript("/common/javascript/jquery/jquery.js", dashboardDocument, function() + { + WebDeveloper.Common.includeJavaScript("/common/javascript/bootstrap/tab.js", dashboardDocument, function() + { + WebDeveloper.Common.includeJavaScript("/dashboard/javascript/html/dashboard.js", dashboardDocument); + }); + }); + + resizer = dashboardDocument.getElementById("web-developer-dashboard-resizer"); + + contentDocument.addEventListener("mouseup", window.WebDeveloperEvents.Dashboard.mouseUp, false); + dashboardDocument.addEventListener("mousemove", WebDeveloper.Dashboard.mouseMove, false); + dashboardDocument.addEventListener("mouseup", WebDeveloper.Dashboard.mouseUp, false); + resizer.addEventListener("mousedown", WebDeveloper.Dashboard.resizerMouseDown, false); + + // Get the dashboard templates + chrome.runtime.sendMessage({ item: "dashboard_height", type: "get-storage-item" }, function(response) + { + var height = response.value; + + // If the dashboard height value was returned + if(height) + { + var pixels = height.indexOf("px"); + + // If there are pixels in the height + if(pixels != -1) + { + height = height.substring(0, pixels); + } + + WebDeveloper.Dashboard.resize(height); + } + }); +}; + // Formats a URL WebDeveloper.Dashboard.formatURL = function(url) { @@ -28,3 +106,95 @@ WebDeveloper.Dashboard.formatURL = function(url) return url; }; + +// Returns the dashboard +WebDeveloper.Dashboard.getDashboard = function(contentDocument) +{ + return contentDocument.getElementById("web-developer-dashboard"); +}; + +// Handles the mouse move event +WebDeveloper.Dashboard.mouseMove = function(event) +{ + // If resizing the dashboard + if(WebDeveloper.Dashboard.resizing) + { + WebDeveloper.Dashboard.resize(WebDeveloper.Dashboard.getDashboard(WebDeveloper.Common.getContentDocument()).offsetHeight - event.pageY); + } +}; + +// Handles the mouse up event +WebDeveloper.Dashboard.mouseUp = function() +{ + WebDeveloper.Dashboard.resizing = false; +}; + +// Opens a dashboard tab +WebDeveloper.Dashboard.openDashboardTab = function(tabId, title, contentDocument, templates) +{ + var dashboard = WebDeveloper.Dashboard.getDashboard(contentDocument); + var dashboardDocument = null; + var panels = null; + var tabs = null; + + // If the dashboard does not already exist + if(!dashboard) + { + WebDeveloper.Dashboard.createDashboard(contentDocument, templates.dashboard); + + dashboard = WebDeveloper.Dashboard.getDashboard(contentDocument); + } + + dashboardDocument = dashboard.contentDocument; + + panels = dashboardDocument.getElementById("web-developer-dashboard-panels"); + tabs = dashboardDocument.getElementById("web-developer-dashboard-tabs"); + + WebDeveloper.Common.removeClass(panels.querySelector(".active"), "active"); + WebDeveloper.Common.removeClass(tabs.querySelector(".active"), "active"); + + WebDeveloper.Common.appendHTML(templates.panel, panels, dashboardDocument); + WebDeveloper.Common.appendHTML(templates.tab, tabs, dashboardDocument); + + return dashboardDocument.getElementById(tabId + "-panel"); +}; + +// Removes the dashboard +WebDeveloper.Dashboard.removeDashboard = function(contentDocument) +{ + WebDeveloper.Common.removeMatchingElements("#web-developer-dashboard", contentDocument); + WebDeveloper.Common.toggleStyleSheet("/dashboard/style-sheets/dashboard.css", "web-developer-dashboard-styles", contentDocument, false); + + contentDocument.removeEventListener("mouseup", window.WebDeveloperEvents.Dashboard.mouseUp, false); + + window.WebDeveloperEvents.Dashboard = null; +}; + +// Resizes the dashboard +WebDeveloper.Dashboard.resize = function(height) +{ + var contentDocument = WebDeveloper.Common.getContentDocument(); + var dashboard = WebDeveloper.Dashboard.getDashboard(contentDocument); + + dashboard.style.setProperty("height", height + "px", "important"); + + WebDeveloper.Dashboard.adjustBodyBottomMargin(contentDocument, height); + WebDeveloper.EditCSS.resize(dashboard); + WebDeveloper.ElementInformation.resize(dashboard); + + // Store the dashboard height + chrome.runtime.sendMessage({ item: "dashboard_height", type: "set-storage-item", value: height }, function() + { + // Ignore + }); +}; + +// Handles the resizer mouse down event +WebDeveloper.Dashboard.resizerMouseDown = function(event) +{ + // If the click was not a right click + if(event.button != 2) + { + WebDeveloper.Dashboard.resizing = true; + } +}; diff --git a/source/common/javascript/dashboard/edit-css.js b/source/common/javascript/dashboard/edit-css.js index 0f95bee..0c07cc3 100644 --- a/source/common/javascript/dashboard/edit-css.js +++ b/source/common/javascript/dashboard/edit-css.js @@ -5,6 +5,34 @@ WebDeveloper.EditCSS.contentDocument = null; WebDeveloper.EditCSS.interval = null; WebDeveloper.EditCSS.updateFrequency = 500; +// Adds a tab +WebDeveloper.EditCSS.addTab = function(title, css, tabs, panels, position, contentDocument) +{ + var active = ""; + + if(position == 1) + { + active = "active"; + } + + // Get the edit CSS tab templates + chrome.runtime.sendMessage({ active: active, css: css, position: position, title: title, type: "get-edit-css-tab-templates" }, function(response) + { + WebDeveloper.Common.appendHTML(response.panel, panels, contentDocument); + WebDeveloper.Common.appendHTML(response.tab, tabs, contentDocument); + }); +}; + +// Applies the CSS +WebDeveloper.EditCSS.apply = function() +{ + // If the content document is set + if(WebDeveloper.EditCSS.contentDocument) + { + WebDeveloper.EditCSS.applyCSS(); + } +}; + // Applies the CSS WebDeveloper.EditCSS.applyCSS = function() { @@ -52,6 +80,71 @@ WebDeveloper.EditCSS.applyCSS = function() return stylesUpdated; }; +// Edits the CSS of the page +WebDeveloper.EditCSS.editCSS = function(edit, contentDocument, locale) +{ + // If editing the CSS + if(edit) + { + WebDeveloper.EditCSS.contentDocument = contentDocument; + + WebDeveloper.EditCSS.loadDashboardTemplates(locale); + } + else + { + WebDeveloper.EditCSS.contentDocument = contentDocument; + + WebDeveloper.EditCSS.stopUpdate(); + WebDeveloper.EditCSS.resetDocument(); + WebDeveloper.Dashboard.closeDashboardTab("edit-css", contentDocument); + + WebDeveloper.EditCSS.contentDocument = null; + } +}; + +// Returns the styles containers +WebDeveloper.EditCSS.getStylesContainers = function() +{ + var dashboard = WebDeveloper.Dashboard.getDashboard(WebDeveloper.EditCSS.contentDocument); + var stylesContainers = []; + + // If the dashboard was found + if(dashboard) + { + stylesContainers = dashboard.contentDocument.getElementById("edit-css-panel").getElementsByTagName("textarea"); + } + + return stylesContainers; +}; + +// Returns the styles in a container +WebDeveloper.EditCSS.getStylesFromContainer = function(stylesContainer) +{ + return stylesContainer.value; +}; + +// Loads the dashboard templates +WebDeveloper.EditCSS.loadDashboardTemplates = function(locale) +{ + // Get the dashboard templates + chrome.runtime.sendMessage({ dashboardTitle: locale.dashboardTitle, tabId: "edit-css", title: locale.editCSS, type: "get-edit-css-dashboard-templates" }, function(response) + { + // If the dashboard template was returned - sometimes this fails + if(response.dashboard) + { + var dashboardPanel = WebDeveloper.Dashboard.openDashboardTab("edit-css", locale.editCSS, WebDeveloper.EditCSS.contentDocument, response); + + WebDeveloper.EditCSS.retrieveCSS(dashboardPanel, response.editCSS, locale); + WebDeveloper.CSS.toggleAllStyleSheets(true, WebDeveloper.EditCSS.contentDocument); + WebDeveloper.EditCSS.update(); + } + else + { + WebDeveloper.EditCSS.loadDashboardTemplates(WebDeveloper.EditCSS.contentDocument, locale); + } + }); +}; + // Resets a document WebDeveloper.EditCSS.resetDocument = function() { @@ -59,6 +152,60 @@ WebDeveloper.EditCSS.resetDocument = function() WebDeveloper.CSS.toggleAllStyleSheets(false, WebDeveloper.EditCSS.contentDocument); }; +// Resizes the edit CSS elements +WebDeveloper.EditCSS.resize = function(dashboard) +{ + var editCSSPanels = dashboard.contentDocument.getElementById("web-developer-edit-css-panels"); + + // If the edit CSS panels exist + if(editCSSPanels) + { + editCSSPanels.style.height = dashboard.offsetHeight - editCSSPanels.offsetTop - 1 + "px"; + } +}; + +// Retrieves the CSS for the document +WebDeveloper.EditCSS.retrieveCSS = function(dashboardPanel, editCSSPanel, locale) +{ + var documentCSS = WebDeveloper.Content.getDocumentCSS(WebDeveloper.EditCSS.contentDocument, true); + + dashboardPanel.innerHTML = editCSSPanel; + + // Get the style sheet content + chrome.runtime.sendMessage({ errorMessage: "/* " + locale.couldNotLoadCSS + " */", type: "get-url-contents", urls: documentCSS.styleSheets }, function(response) + { + var dashboardDocument = WebDeveloper.Dashboard.getDashboard(WebDeveloper.EditCSS.contentDocument).contentDocument; + var panels = dashboardDocument.getElementById("web-developer-edit-css-panels"); + var position = 1; + var styleSheet = null; + var tabs = dashboardDocument.getElementById("web-developer-edit-css-tabs"); + + // Loop through the style sheets + for(var i = 0, l = response.length; i < l; i++) + { + styleSheet = response[i]; + + WebDeveloper.EditCSS.addTab(WebDeveloper.Dashboard.formatURL(styleSheet.url), styleSheet.content, tabs, panels, position, dashboardDocument); + + position++; + } + + // If there are embedded styles + if(documentCSS.embedded) + { + WebDeveloper.EditCSS.addTab(locale.embeddedStyles, documentCSS.embedded, tabs, panels, position, dashboardDocument); + } + + // If there is no CSS + if(!documentCSS.styleSheets.length && !documentCSS.embedded) + { + WebDeveloper.EditCSS.addTab(locale.editCSS, "", tabs, panels, position, dashboardDocument); + } + + window.setTimeout(function() { WebDeveloper.EditCSS.resize(WebDeveloper.Dashboard.getDashboard(WebDeveloper.EditCSS.contentDocument)); }, 100); + }); +}; + // Stops the CSS updating WebDeveloper.EditCSS.stopUpdate = function() { @@ -77,6 +224,6 @@ WebDeveloper.EditCSS.update = function() // If the update frequency is greater than 0 if(WebDeveloper.EditCSS.updateFrequency > 0) { - WebDeveloper.EditCSS.interval = window.setInterval(WebDeveloper.EditCSS.apply, WebDeveloper.EditCSS.updateFrequency); + WebDeveloper.EditCSS.interval = window.setInterval(function() { WebDeveloper.EditCSS.apply(); }, WebDeveloper.EditCSS.updateFrequency); } }; diff --git a/source/common/javascript/dashboard/element-information.js b/source/common/javascript/dashboard/element-information.js index e0fee8b..5835bba 100644 --- a/source/common/javascript/dashboard/element-information.js +++ b/source/common/javascript/dashboard/element-information.js @@ -1,8 +1,10 @@ var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define -WebDeveloper.ElementInformation = WebDeveloper.ElementInformation || {}; -WebDeveloper.ElementInformation.currentElement = null; -WebDeveloper.ElementInformation.selfClosingTags = ["area", "br", "col", "hr", "img", "input", "param"]; +WebDeveloper.ElementInformation = WebDeveloper.ElementInformation || {}; +WebDeveloper.ElementInformation.breadcrumbHeight = 37; +WebDeveloper.ElementInformation.currentElement = null; +WebDeveloper.ElementInformation.locale = null; +WebDeveloper.ElementInformation.selfClosingTags = ["area", "br", "col", "hr", "img", "input", "param"]; // Adds a CSS property WebDeveloper.ElementInformation.addCSSProperty = function(element, property, contentDocument) @@ -87,6 +89,21 @@ WebDeveloper.ElementInformation.clickOutput = function(event) } }; +// Displays the information for an element +WebDeveloper.ElementInformation.displayElementInformation = function(element) +{ + var contentDocument = WebDeveloper.Common.getContentDocument(); + var generatedDocument = WebDeveloper.Dashboard.getDashboard(contentDocument).contentDocument; + var elementInformation = generatedDocument.getElementById("element-information-content"); + var dispatchEvent = generatedDocument.createEvent("Events"); + + WebDeveloper.Common.empty(elementInformation); + elementInformation.appendChild(WebDeveloper.ElementInformation.generateElementInformation(element, contentDocument, generatedDocument, "none")); + + dispatchEvent.initEvent("web-developer-initialize-ancestors-event", true, false); + generatedDocument.querySelector("#element-information-content .breadcrumb").dispatchEvent(dispatchEvent); +}; + // Generates ancestor information for an element WebDeveloper.ElementInformation.generateAncestorInformation = function(element, contentDocument) { @@ -404,6 +421,79 @@ WebDeveloper.ElementInformation.getElementDescription = function(element, conten return description; }; +// Returns a string from the locale +WebDeveloper.ElementInformation.getLocaleString = function(name) +{ + return WebDeveloper.ElementInformation.locale[name]; +}; + +// Initializes the display element information dashboard +WebDeveloper.ElementInformation.initialize = function(display, contentDocument, locale) +{ + // If displaying the element information dashboard + if(display) + { + WebDeveloper.ElementInformation.locale = locale; + window.WebDeveloperEvents = window.WebDeveloperEvents || {}; + window.WebDeveloperEvents.ElementInformation = window.WebDeveloperEvents.ElementInformation || {}; + window.WebDeveloperEvents.ElementInformation.click = WebDeveloper.ElementInformation.click; + window.WebDeveloperEvents.ElementInformation.mouseOver = WebDeveloper.ElementAncestors.mouseOver; + + WebDeveloper.ElementInformation.loadDashboardTemplates(contentDocument, locale); + + contentDocument.addEventListener("click", window.WebDeveloperEvents.ElementInformation.click, true); + contentDocument.addEventListener("mouseover", window.WebDeveloperEvents.ElementInformation.mouseOver, false); + } + else + { + WebDeveloper.Dashboard.closeDashboardTab("element-information", contentDocument); + + contentDocument.removeEventListener("click", window.WebDeveloperEvents.ElementInformation.click, true); + contentDocument.removeEventListener("mouseover", window.WebDeveloperEvents.ElementInformation.mouseOver, false); + WebDeveloper.ElementAncestors.removeOutline(contentDocument); + + window.WebDeveloperEvents.ElementInformation = null; + } + + WebDeveloper.Common.toggleStyleSheet("/toolbar/element-ancestors.css", "web-developer-element-information-styles", contentDocument, false); +}; + +// Loads the dashboard templates +WebDeveloper.ElementInformation.loadDashboardTemplates = function(contentDocument, locale) +{ + // Get the dashboard templates + chrome.runtime.sendMessage({ dashboardTitle: locale.dashboardTitle, selectAnElementDisplayInformation: locale.selectAnElementDisplayInformation, tabId: "element-information", title: locale.elementInformation, type: "get-element-information-dashboard-templates" }, function(response) + { + // If the dashboard template was returned - sometimes this fails + if(response.dashboard) + { + var dashboardPanel = WebDeveloper.Dashboard.openDashboardTab("element-information", locale.elementInformation, contentDocument, response); + + dashboardPanel.innerHTML = response.elementInformation; + + dashboardPanel.addEventListener("click", WebDeveloper.ElementInformation.clickOutput, false); + + window.setTimeout(function() { WebDeveloper.ElementInformation.resize(WebDeveloper.Dashboard.getDashboard(contentDocument)); }, 100); + } + else + { + WebDeveloper.ElementInformation.loadDashboardTemplates(contentDocument, locale); + } + }); +}; + +// Resizes the element information elements +WebDeveloper.ElementInformation.resize = function(dashboard) +{ + var elementInformationPanel = dashboard.contentDocument.getElementById("element-information-panel"); + + // If the element information panel exists + if(elementInformationPanel) + { + elementInformationPanel.style.height = dashboard.offsetHeight - elementInformationPanel.offsetTop - WebDeveloper.ElementInformation.breadcrumbHeight + "px"; + } +}; + // Handles a child element being selected WebDeveloper.ElementInformation.selectChildElement = function(eventTarget) { diff --git a/source/chrome/javascript/features/common.js b/source/common/javascript/features/common.js similarity index 68% rename from source/chrome/javascript/features/common.js rename to source/common/javascript/features/common.js index 5b3196c..0516216 100644 --- a/source/chrome/javascript/features/common.js +++ b/source/common/javascript/features/common.js @@ -5,5 +5,5 @@ WebDeveloper.Common = WebDeveloper.Common || {}; // Displays a notification WebDeveloper.Common.displayNotification = function(message, parameters) { - chrome.extension.sendMessage({ message: message, parameters: parameters, type: "display-notification" }); + chrome.runtime.sendMessage({ message: message, parameters: parameters, type: "display-notification" }); }; diff --git a/source/common/javascript/features/css.js b/source/common/javascript/features/css.js index e2593fa..d0eb059 100644 --- a/source/common/javascript/features/css.js +++ b/source/common/javascript/features/css.js @@ -72,7 +72,7 @@ WebDeveloper.CSS.toggleBrowserDefaultStyles = function(documents) // Loop through the documents for(var i = 0, l = documents.length; i < l; i++) { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/css/disable-browser-default-styles.css", "web-developer-disable-browser-default-styles", documents[i], true); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/css/disable-browser-default-styles.css", "web-developer-disable-browser-default-styles", documents[i], true); } }; @@ -264,6 +264,6 @@ WebDeveloper.CSS.useBorderBoxModel = function(documents) // Loop through the documents for(var i = 0, l = documents.length; i < l; i++) { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/css/use-border-box-model.css", "web-developer-use-border-box-model", documents[i], false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/css/use-border-box-model.css", "web-developer-use-border-box-model", documents[i], false); } }; diff --git a/source/common/javascript/features/forms.js b/source/common/javascript/features/forms.js index 33dac07..93aafbe 100644 --- a/source/common/javascript/features/forms.js +++ b/source/common/javascript/features/forms.js @@ -462,8 +462,8 @@ WebDeveloper.Forms.displayFormDetails = function(display, documents) WebDeveloper.Common.removeMatchingElements(".web-developer-display-form-details", contentDocument); } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-form-details-before", contentDocument, false); - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/forms/display-form-details.css", "web-developer-display-form-details", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-form-details-before", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/forms/display-form-details.css", "web-developer-display-form-details", contentDocument, false); } }; @@ -721,7 +721,7 @@ WebDeveloper.Forms.outlineFormFieldsWithoutLabels = function(outline, documents) } } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/forms/outline-form-fields-without-labels.css", "web-developer-outline-form-fields-without-labels", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/forms/outline-form-fields-without-labels.css", "web-developer-outline-form-fields-without-labels", contentDocument, false); } }; @@ -1076,7 +1076,8 @@ WebDeveloper.Forms.removeMaximumLengths = function(documents) // Toggles all checkboxes WebDeveloper.Forms.toggleCheckboxes = function(check, documents) { - var checkboxes = null; + var alteredCheckboxes = 0; + var checkboxes = null; // Loop through the documents for(var i = 0, l = documents.length; i < l; i++) @@ -1087,6 +1088,30 @@ WebDeveloper.Forms.toggleCheckboxes = function(check, documents) for(var j = 0, m = checkboxes.length; j < m; j++) { checkboxes[j].checked = check; + + alteredCheckboxes++; + } + } + + // If one checkbox was altered + if(alteredCheckboxes == 1) + { + // If checking checkboxes + if(check) + { + WebDeveloper.Common.displayNotification("checkAllCheckboxesSingleResult"); + } + else + { + WebDeveloper.Common.displayNotification("uncheckAllCheckboxesSingleResult"); } } + else if(check) + { + WebDeveloper.Common.displayNotification("checkAllCheckboxesMultipleResult", [alteredCheckboxes]); + } + else + { + WebDeveloper.Common.displayNotification("uncheckAllCheckboxesMultipleResult", [alteredCheckboxes]); + } }; diff --git a/source/common/javascript/features/images.js b/source/common/javascript/features/images.js index 3bc1276..170d4d1 100644 --- a/source/common/javascript/features/images.js +++ b/source/common/javascript/features/images.js @@ -41,7 +41,7 @@ WebDeveloper.Images.displayAltAttributes = function(display, documents) WebDeveloper.Common.removeMatchingElements(".web-developer-display-alt-attributes", contentDocument); } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-alt-attributes", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-alt-attributes", contentDocument, false); } }; @@ -79,8 +79,8 @@ WebDeveloper.Images.displayImageDimensions = function(display, documents, locale WebDeveloper.Common.removeMatchingElements(".web-developer-display-image-dimensions", contentDocument); } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-image-dimensions-before", contentDocument, false); - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/images/display-image-dimensions.css", "web-developer-display-image-dimensions", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-image-dimensions-before", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/images/display-image-dimensions.css", "web-developer-display-image-dimensions", contentDocument, false); } }; @@ -125,7 +125,7 @@ WebDeveloper.Images.displayImagePaths = function(display, documents) WebDeveloper.Common.removeMatchingElements(".web-developer-display-image-paths", contentDocument); } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-image-paths", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-image-paths", contentDocument, false); } }; @@ -135,7 +135,7 @@ WebDeveloper.Images.hideBackgroundImages = function(documents) // Loop through the documents for(var i = 0, l = documents.length; i < l; i++) { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/images/hide-background-images.css", "web-developer-hide-background-images", documents[i], false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/images/hide-background-images.css", "web-developer-hide-background-images", documents[i], false); } }; @@ -170,7 +170,7 @@ WebDeveloper.Images.hideImages = function(hide, documents) } } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/images/hide-images.css", "web-developer-hide-images", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/images/hide-images.css", "web-developer-hide-images", contentDocument, false); } }; @@ -281,7 +281,7 @@ WebDeveloper.Images.makeImagesInvisible = function(invisible, documents) } } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/images/make-images-invisible.css", "web-developer-make-images-invisible", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/images/make-images-invisible.css", "web-developer-make-images-invisible", contentDocument, false); } }; @@ -291,7 +291,7 @@ WebDeveloper.Images.outlineAllImages = function(documents) // Loop through the documents for(var i = 0, l = documents.length; i < l; i++) { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/images/outline-all-images.css", "web-developer-outline-all-images", documents[i], false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/images/outline-all-images.css", "web-developer-outline-all-images", documents[i], false); } }; @@ -337,7 +337,7 @@ WebDeveloper.Images.outlineBackgroundImages = function(outline, documents) } } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/images/outline-background-images.css", "web-developer-outline-background-images", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/images/outline-background-images.css", "web-developer-outline-background-images", contentDocument, false); } }; @@ -386,7 +386,7 @@ WebDeveloper.Images.outlineImagesWithAdjustedDimensions = function(outline, docu } } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/images/outline-images-with-adjusted-dimensions.css", "web-developer-outline-images-with-adjusted-dimensions", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/images/outline-images-with-adjusted-dimensions.css", "web-developer-outline-images-with-adjusted-dimensions", contentDocument, false); } }; @@ -396,7 +396,7 @@ WebDeveloper.Images.outlineImagesWithEmptyAltAttributes = function(documents) // Loop through the documents for(var i = 0, l = documents.length; i < l; i++) { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/images/outline-images-with-empty-alt-attributes.css", "web-developer-outline-images-with-empty-alt-attributes", documents[i], false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/images/outline-images-with-empty-alt-attributes.css", "web-developer-outline-images-with-empty-alt-attributes", documents[i], false); } }; @@ -445,7 +445,7 @@ WebDeveloper.Images.outlineImagesWithOversizedDimensions = function(outline, doc } } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/images/outline-images-with-oversized-dimensions.css", "web-developer-outline-images-with-oversized-dimensions", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/images/outline-images-with-oversized-dimensions.css", "web-developer-outline-images-with-oversized-dimensions", contentDocument, false); } }; @@ -455,7 +455,7 @@ WebDeveloper.Images.outlineImagesWithoutAltAttributes = function(documents) // Loop through the documents for(var i = 0, l = documents.length; i < l; i++) { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/images/outline-images-without-alt-attributes.css", "web-developer-outline-images-without-alt-attributes", documents[i], false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/images/outline-images-without-alt-attributes.css", "web-developer-outline-images-without-alt-attributes", documents[i], false); } }; @@ -465,7 +465,7 @@ WebDeveloper.Images.outlineImagesWithoutDimensions = function(documents) // Loop through the documents for(var i = 0, l = documents.length; i < l; i++) { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/images/outline-images-without-dimensions.css", "web-developer-outline-images-without-dimensions", documents[i], false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/images/outline-images-without-dimensions.css", "web-developer-outline-images-without-dimensions", documents[i], false); } }; @@ -571,6 +571,12 @@ WebDeveloper.Images.replaceImagesWithAltAttributes = function(replace, documents spanElement = contentDocument.createElement("span"); text = image.getAttribute("alt"); + // If the text is not set + if(!text) + { + text = ""; + } + spanElement.setAttribute("class", "web-developer-replace-images-with-alt-attributes"); spanElement.appendChild(contentDocument.createTextNode(text)); image.parentNode.insertBefore(spanElement, image); @@ -581,7 +587,7 @@ WebDeveloper.Images.replaceImagesWithAltAttributes = function(replace, documents WebDeveloper.Common.removeMatchingElements(".web-developer-replace-images-with-alt-attributes", contentDocument); } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/images/hide-images.css", "web-developer-replace-images-with-alt-attributes", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/images/hide-images.css", "web-developer-replace-images-with-alt-attributes", contentDocument, false); } }; @@ -599,7 +605,7 @@ WebDeveloper.Images.resizeImageDimensions = function() // If the image dimensions are already updating if(WebDeveloper.Images.imageDimensionsUpdating) { - WebDeveloper.Images.imageDimensionsTimeout = window.setTimeout(WebDeveloper.Images.resizeImageDimensions, 0); + WebDeveloper.Images.imageDimensionsTimeout = window.setTimeout(function() { WebDeveloper.Images.resizeImageDimensions(); }, 0); } else { diff --git a/source/common/javascript/features/information.js b/source/common/javascript/features/information.js index d3ce24d..08bd2b6 100644 --- a/source/common/javascript/features/information.js +++ b/source/common/javascript/features/information.js @@ -15,8 +15,8 @@ WebDeveloper.Information.displayAbbreviations = function(documents) { contentDocument = documents[i]; - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-abbreviations-before", contentDocument, false); - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/information/display-abbreviations.css", "web-developer-display-abbreviations", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-abbreviations-before", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/information/display-abbreviations.css", "web-developer-display-abbreviations", contentDocument, false); } }; @@ -54,7 +54,7 @@ WebDeveloper.Information.displayAccessKeys = function(display, documents) } } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-access-keys", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-access-keys", contentDocument, false); } }; @@ -116,7 +116,7 @@ WebDeveloper.Information.displayAnchors = function(display, documents) } } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-anchors", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-anchors", contentDocument, false); } }; @@ -130,8 +130,8 @@ WebDeveloper.Information.displayARIARoles = function(documents) { contentDocument = documents[i]; - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-aria-roles-before", contentDocument, false); - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/information/display-aria-roles.css", "web-developer-display-aria-roles", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-aria-roles-before", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/information/display-aria-roles.css", "web-developer-display-aria-roles", contentDocument, false); } }; @@ -169,8 +169,8 @@ WebDeveloper.Information.displayDivDimensions = function(display, documents, loc WebDeveloper.Common.removeMatchingElements(".web-developer-display-div-dimensions", contentDocument); } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-div-dimensions-before", contentDocument, false); - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/information/display-div-dimensions.css", "web-developer-display-div-dimensions", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-div-dimensions-before", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/information/display-div-dimensions.css", "web-developer-display-div-dimensions", contentDocument, false); } }; @@ -211,8 +211,8 @@ WebDeveloper.Information.displayDivOrder = function(display, documents) WebDeveloper.Common.removeMatchingElements(".web-developer-display-div-order", contentDocument); } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-div-order-before", contentDocument, false); - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/information/display-div-order.css", "web-developer-display-div-order", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-div-order-before", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/information/display-div-order.css", "web-developer-display-div-order", contentDocument, false); } }; @@ -257,7 +257,7 @@ WebDeveloper.Information.displayIdClassDetails = function(display, documents) WebDeveloper.Common.removeMatchingElements(".web-developer-id-class-details", contentDocument); } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-id-class-details", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-id-class-details", contentDocument, false); } }; @@ -271,8 +271,8 @@ WebDeveloper.Information.displayLinkDetails = function(documents) { contentDocument = documents[i]; - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-link-details-before", contentDocument, false); - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/information/display-link-details.css", "web-developer-display-link-details", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-link-details-before", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/information/display-link-details.css", "web-developer-display-link-details", contentDocument, false); } }; @@ -403,8 +403,8 @@ WebDeveloper.Information.displayObjectInformation = function(display, documents) WebDeveloper.Common.removeMatchingElements(".web-developer-display-object-information", contentDocument); } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-object-information-before", contentDocument, false); - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/information/display-object-information.css", "web-developer-display-object-information", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-object-information-before", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/information/display-object-information.css", "web-developer-display-object-information", contentDocument, false); } }; @@ -444,7 +444,7 @@ WebDeveloper.Information.displayStackLevels = function(display, documents) WebDeveloper.Common.removeMatchingElements(".web-developer-display-stack-levels", contentDocument); } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-stack-levels", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-stack-levels", contentDocument, false); } }; @@ -484,7 +484,7 @@ WebDeveloper.Information.displayTabIndex = function(display, documents) WebDeveloper.Common.removeMatchingElements(".web-developer-display-tab-index", contentDocument); } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-tab-index", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-tab-index", contentDocument, false); } }; @@ -574,7 +574,7 @@ WebDeveloper.Information.displayTableDepth = function(display, documents, depth) WebDeveloper.Common.removeMatchingElements(".web-developer-display-table-depth", contentDocument); } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-table-depth", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-table-depth", contentDocument, false); } }; @@ -633,8 +633,8 @@ WebDeveloper.Information.displayTableInformation = function(display, documents) WebDeveloper.Common.removeMatchingElements(".web-developer-display-table-information", contentDocument); } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-table-information-before", contentDocument, false); - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/information/display-table-information.css", "web-developer-display-table-information", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-table-information-before", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/information/display-table-information.css", "web-developer-display-table-information", contentDocument, false); } }; @@ -674,7 +674,7 @@ WebDeveloper.Information.displayTitleAttributes = function(display, documents) WebDeveloper.Common.removeMatchingElements(".web-developer-display-title-attributes", contentDocument); } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-title-attributes", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-display-title-attributes", contentDocument, false); } }; @@ -684,7 +684,7 @@ WebDeveloper.Information.displayTopographicInformation = function(documents) // Loop through the documents for(var i = 0, l = documents.length; i < l; i++) { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/information/display-topographic-information.css", "web-developer-display-topographic-information", documents[i], false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/information/display-topographic-information.css", "web-developer-display-topographic-information", documents[i], false); } }; @@ -757,7 +757,7 @@ WebDeveloper.Information.resizeDivDimensions = function() // If the div dimensions are already updating if(WebDeveloper.Information.divDimensionsUpdating) { - WebDeveloper.Information.divDimensionsTimeout = window.setTimeout(WebDeveloper.Information.resizeDivDimensions, 0); + WebDeveloper.Information.divDimensionsTimeout = window.setTimeout(function() { WebDeveloper.Information.resizeDivDimensions(); }, 0); } else { diff --git a/source/common/javascript/features/miscellaneous.js b/source/common/javascript/features/miscellaneous.js index 3019b79..5e251d4 100644 --- a/source/common/javascript/features/miscellaneous.js +++ b/source/common/javascript/features/miscellaneous.js @@ -5,10 +5,11 @@ WebDeveloper.Miscellaneous = WebDeveloper.Miscellaneous || {}; // Displays all hidden elements WebDeveloper.Miscellaneous.displayHiddenElements = function(documents) { - var contentDocument = null; - var inputElements = null; - var node = null; - var treeWalker = null; + var contentDocument = null; + var displayedElements = 0; + var inputElements = null; + var node = null; + var treeWalker = null; // Loop through the documents for(var i = 0, l = documents.length; i < l; i++) @@ -21,14 +22,28 @@ WebDeveloper.Miscellaneous.displayHiddenElements = function(documents) for(var j = 0, m = inputElements.length; j < m; j++) { inputElements[j].removeAttribute("type"); + + displayedElements++; } // While the tree walker has more nodes while((node = treeWalker.nextNode()) !== null) { node.style.display = ""; + + displayedElements++; } } + + // If one element was displayed + if(displayedElements == 1) + { + WebDeveloper.Common.displayNotification("displayHiddenElementsSingleResult"); + } + else + { + WebDeveloper.Common.displayNotification("displayHiddenElementsMultipleResult", [displayedElements]); + } }; // Filter for the hidden node tree walker @@ -45,8 +60,8 @@ WebDeveloper.Miscellaneous.hiddenNodeFilter = function(node) var display = WebDeveloper.Common.getPropertyCSSValue(computedStyle, "display"); var tagName = node.tagName; - // If this element has a display and tag name, the display is set to none and the tag name is not script - if(display && tagName && WebDeveloper.Common.getCSSText(display) == "none") + // If this element has a display and tag name, is not a script or style and the display is set to none + if(display && tagName && tagName.toLowerCase() != "script" && tagName.toLowerCase() != "style" && WebDeveloper.Common.getCSSText(display) == "none") { return NodeFilter.FILTER_ACCEPT; } @@ -62,7 +77,7 @@ WebDeveloper.Miscellaneous.linearizePage = function(documents) // Loop through the documents for(var i = 0, l = documents.length; i < l; i++) { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/miscellaneous/linearize-page.css", "web-developer-linearize-page", documents[i], false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/miscellaneous/linearize-page.css", "web-developer-linearize-page", documents[i], false); } }; diff --git a/source/common/javascript/features/outline.js b/source/common/javascript/features/outline.js index 46014ec..5cc1d46 100644 --- a/source/common/javascript/features/outline.js +++ b/source/common/javascript/features/outline.js @@ -12,13 +12,13 @@ WebDeveloper.Outline.outlineBlockLevelElements = function(documents, showElement { contentDocument = documents[i]; - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/outline/outline-block-level-elements.css", "web-developer-outline-block-level-elements", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/outline/outline-block-level-elements.css", "web-developer-outline-block-level-elements", contentDocument, false); // If showing element tag names if(showElementTagNames) { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-outline-block-level-elements-before-common", contentDocument, false); - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/outline/outline-block-level-elements-before.css", "web-developer-outline-block-level-elements-before", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-outline-block-level-elements-before-common", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/outline/outline-block-level-elements-before.css", "web-developer-outline-block-level-elements-before", contentDocument, false); } } }; @@ -33,13 +33,13 @@ WebDeveloper.Outline.outlineDeprecatedElements = function(documents, showElement { contentDocument = documents[i]; - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/outline/outline-deprecated-elements.css", "web-developer-outline-deprecated-elements", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/outline/outline-deprecated-elements.css", "web-developer-outline-deprecated-elements", contentDocument, false); // If showing element tag names if(showElementTagNames) { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-outline-deprecated-elements-before-common", contentDocument, false); - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/outline/outline-deprecated-elements-before.css", "web-developer-outline-deprecated-elements-before", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-outline-deprecated-elements-before-common", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/outline/outline-deprecated-elements-before.css", "web-developer-outline-deprecated-elements-before", contentDocument, false); } } }; @@ -119,7 +119,7 @@ WebDeveloper.Outline.outlineFloatedElements = function(outline, documents) } } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/outline/outline-floated-elements.css", "web-developer-outline-floated-elements", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/outline/outline-floated-elements.css", "web-developer-outline-floated-elements", contentDocument, false); } }; @@ -129,7 +129,7 @@ WebDeveloper.Outline.outlineFrames = function(documents) // Loop through the documents for(var i = 0, l = documents.length; i < l; i++) { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/outline/outline-frames.css", "web-developer-outline-frames", documents[i], false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/outline/outline-frames.css", "web-developer-outline-frames", documents[i], false); } }; @@ -143,13 +143,13 @@ WebDeveloper.Outline.outlineHeadings = function(documents, showElementTagNames) { contentDocument = documents[i]; - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/outline/outline-headings.css", "web-developer-outline-headings", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/outline/outline-headings.css", "web-developer-outline-headings", contentDocument, false); // If showing element tag names if(showElementTagNames) { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-outline-headings-before-common", contentDocument, false); - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/outline/outline-headings-before.css", "web-developer-outline-headings-before", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-outline-headings-before-common", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/outline/outline-headings-before.css", "web-developer-outline-headings-before", contentDocument, false); } } }; @@ -160,7 +160,7 @@ WebDeveloper.Outline.outlineNonSecureElements = function(documents) // Loop through the documents for(var i = 0, l = documents.length; i < l; i++) { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/outline/outline-non-secure-elements.css", "web-developer-outline-non-secure-elements", documents[i], false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/outline/outline-non-secure-elements.css", "web-developer-outline-non-secure-elements", documents[i], false); } }; @@ -206,7 +206,7 @@ WebDeveloper.Outline.outlinePositionedElements = function(positionType, outline, } } - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/outline/outline-positioned-elements.css", className, contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/outline/outline-positioned-elements.css", className, contentDocument, false); } }; @@ -216,7 +216,7 @@ WebDeveloper.Outline.outlineTableCaptions = function(documents) // Loop through the documents for(var i = 0, l = documents.length; i < l; i++) { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/outline/outline-table-captions.css", "web-developer-outline-table-captions", documents[i], false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/outline/outline-table-captions.css", "web-developer-outline-table-captions", documents[i], false); } }; @@ -230,13 +230,13 @@ WebDeveloper.Outline.outlineTableCells = function(documents, showElementTagNames { contentDocument = documents[i]; - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/outline/outline-table-cells.css", "web-developer-outline-table-cells", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/outline/outline-table-cells.css", "web-developer-outline-table-cells", contentDocument, false); // If showing element tag names if(showElementTagNames) { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-outline-table-cells-before-common", contentDocument, false); - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/outline/outline-table-cells-before.css", "web-developer-outline-table-cells-before", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/before.css", "web-developer-outline-table-cells-before-common", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/outline/outline-table-cells-before.css", "web-developer-outline-table-cells-before", contentDocument, false); } } }; @@ -247,6 +247,6 @@ WebDeveloper.Outline.outlineTables = function(documents) // Loop through the documents for(var i = 0, l = documents.length; i < l; i++) { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/outline/outline-tables.css", "web-developer-outline-tables", documents[i], false); + WebDeveloper.Common.toggleStyleSheet("/features/style-sheets/outline/outline-tables.css", "web-developer-outline-tables", documents[i], false); } }; diff --git a/source/common/javascript/generated/common.js b/source/common/javascript/generated/common.js index 42ba830..cf93a47 100644 --- a/source/common/javascript/generated/common.js +++ b/source/common/javascript/generated/common.js @@ -32,7 +32,7 @@ WebDeveloper.Generated.addDocument = function(documentURL, documentCount, itemDe { element = document.createElement("h3"); - // If the item count is set + // If the item count is not set if(typeof itemCount === "undefined") { element.appendChild(document.createTextNode(itemDescription)); diff --git a/source/common/javascript/locales/locales.js b/source/common/javascript/locales/locales.js index ac11747..66f8f6e 100644 --- a/source/common/javascript/locales/locales.js +++ b/source/common/javascript/locales/locales.js @@ -2,6 +2,18 @@ var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-defi WebDeveloper.Locales = WebDeveloper.Locales || {}; +// Returns a formatted string from the locale +WebDeveloper.Locales.getFormattedString = function(name, parameters) +{ + return chrome.i18n.getMessage(name, parameters); +}; + +// Returns a string from the locale +WebDeveloper.Locales.getString = function(name) +{ + return chrome.i18n.getMessage(name); +}; + // Sets up the generated locale WebDeveloper.Locales.setupGeneratedLocale = function() { diff --git a/source/chrome/javascript/options/options.js b/source/common/javascript/options/options.js similarity index 98% rename from source/chrome/javascript/options/options.js rename to source/common/javascript/options/options.js index 226b0c3..13864c5 100644 --- a/source/chrome/javascript/options/options.js +++ b/source/common/javascript/options/options.js @@ -235,7 +235,6 @@ WebDeveloper.Options.initializeColorsTab = function() { $("#syntax_highlight_theme").val(WebDeveloper.Storage.getItem("syntax_highlight_theme")).on("change", WebDeveloper.Options.updateSyntaxHighlightTheme); $("#syntax-highlight-browser").on("load", WebDeveloper.Options.updateSyntaxHighlightTheme); - $("#icon_color").prop("checked", WebDeveloper.Storage.getItem("icon_color") == "true").on("change", WebDeveloper.Options.updateIconColor); }; // Initializes the general tab @@ -436,7 +435,6 @@ WebDeveloper.Options.localizeColorsTab = function() $("#syntax-highlight-performance").text(WebDeveloper.Locales.getString("syntaxHighlightPerformance")); $('[for="syntax_highlight_theme"]').text(WebDeveloper.Locales.getString("syntaxHighlightTheme")); - $("#icon_color").after(WebDeveloper.Locales.getString("displayExtensionIconColor")); $('[value="dark"]').text(WebDeveloper.Locales.getString("dark")); $('[value="light"]').text(WebDeveloper.Locales.getString("light")); @@ -612,13 +610,6 @@ WebDeveloper.Options.updateDisplayOverlayWith = function() WebDeveloper.Storage.setItem("display_overlay_with", $("#display_overlay_with").val()); }; -// Updates the icon color -WebDeveloper.Options.updateIconColor = function() -{ - WebDeveloper.Storage.setItem("icon_color", $("#icon_color").prop("checked")); - WebDeveloper.Storage.updateIcon(); -}; - // Updates the populate email address WebDeveloper.Options.updatePopulateEmailAddress = function() { diff --git a/source/common/javascript/overlay/cookies.js b/source/common/javascript/overlay/cookies.js index ee526be..14c9a27 100644 --- a/source/common/javascript/overlay/cookies.js +++ b/source/common/javascript/overlay/cookies.js @@ -3,6 +3,185 @@ var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-defi WebDeveloper.Overlay = WebDeveloper.Overlay || {}; WebDeveloper.Overlay.Cookies = WebDeveloper.Overlay.Cookies || {}; +$(function() +{ + var addCookieExpires = $("#add-cookie-expires"); + var addCookieHost = $("#add-cookie-host"); + var addCookieName = $("#add-cookie-name"); + var addCookiePath = $("#add-cookie-path"); + var addCookieValue = $("#add-cookie-value"); + var disableCookiesMenu = $("#disable-cookies"); + + disableCookiesMenu.append(WebDeveloper.Locales.getString("disableCookies")).on("click", WebDeveloper.Overlay.Cookies.toggleCookies); + $("#add-cookie").append(WebDeveloper.Locales.getString("addCookieMenu")).on("click", WebDeveloper.Overlay.Cookies.addCookie); + $("#delete-domain-cookies").append(WebDeveloper.Locales.getString("deleteDomainCookies")).on("click", WebDeveloper.Overlay.Cookies.deleteDomainCookies); + $("#delete-path-cookies").append(WebDeveloper.Locales.getString("deletePathCookies")).on("click", WebDeveloper.Overlay.Cookies.deletePathCookies); + $("#delete-session-cookies").append(WebDeveloper.Locales.getString("deleteSessionCookies")).on("click", WebDeveloper.Overlay.Cookies.deleteSessionCookies); + $("#view-cookie-information").append(WebDeveloper.Locales.getString("viewCookieInformation")).on("click", WebDeveloper.Overlay.Cookies.viewCookieInformation); + + $("#add-cookie-cancel").on("click", WebDeveloper.Overlay.Cookies.cancelAddCookie); + $("#add-cookie-dialog").on("submit", function(event) { event.preventDefault(); }); + $("#add-cookie-submit").on("click", WebDeveloper.Overlay.Cookies.submitAddCookie); + + $("legend", $("#add-cookie-dialog")).text(WebDeveloper.Locales.getString("addCookie")); + $("#add-cookie-cancel").text(WebDeveloper.Locales.getString("cancel")); + $("#add-cookie-secure").after(WebDeveloper.Locales.getString("secureCookie")); + $("#add-cookie-session").after(WebDeveloper.Locales.getString("sessionCookie")).on("change", WebDeveloper.Overlay.Cookies.changeSession); + $("#add-cookie-submit").append(WebDeveloper.Locales.getString("add")); + $('[for="add-cookie-expires"]').text(WebDeveloper.Locales.getString("expires")); + $('[for="add-cookie-host"]').text(WebDeveloper.Locales.getString("host")); + $('[for="add-cookie-name"]').text(WebDeveloper.Locales.getString("name")); + $('[for="add-cookie-path"]').text(WebDeveloper.Locales.getString("path")); + $('[for="add-cookie-value"]').text(WebDeveloper.Locales.getString("value")); + + addCookieExpires.attr("placeholder", WebDeveloper.Locales.getString("expiresPlaceholder")); + addCookieHost.attr("placeholder", WebDeveloper.Locales.getString("hostPlaceholder")); + addCookieName.attr("placeholder", WebDeveloper.Locales.getString("namePlaceholder")); + addCookiePath.attr("placeholder", WebDeveloper.Locales.getString("pathPlaceholder")); + addCookieValue.attr("placeholder", WebDeveloper.Locales.getString("valuePlaceholder")); + addCookieExpires.add(addCookieHost).add(addCookieName).add(addCookiePath).add(addCookieValue).on("keypress", WebDeveloper.Overlay.Cookies.addCookieKeyPress); + + WebDeveloper.Overlay.updateContentSettingMenu(disableCookiesMenu, "cookies"); +}); + +// Adds a cookie +WebDeveloper.Overlay.Cookies.addCookie = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.tabs.sendMessage(tab.id, { type: "get-location-details" }, function(response) + { + var addCookieDialog = $("#add-cookie-dialog"); + + $("#add-cookie-expires").val(WebDeveloper.Cookies.getDateTomorrow()).prop("disabled", false); + $("#add-cookie-host").val(response.host); + $("#add-cookie-path").val(response.path); + $("#add-cookie-value").focus(); + + WebDeveloper.Overlay.Cookies.resetAddDialog(addCookieDialog); + + $(".tabbable, #confirmation, #notification").slideUp(WebDeveloper.Overlay.animationSpeed, function() + { + addCookieDialog.slideDown(WebDeveloper.Overlay.animationSpeed); + }); + }); + } + }); +}; + +// Handles a key press when adding a cookie +WebDeveloper.Overlay.Cookies.addCookieKeyPress = function(event) +{ + // If the enter key was pressed + if(event.keyCode == 13) + { + WebDeveloper.Overlay.Cookies.submitAddCookie(); + } +}; + +// Cancels adding a cookie +WebDeveloper.Overlay.Cookies.cancelAddCookie = function() +{ + $("#add-cookie-dialog").slideUp(WebDeveloper.Overlay.animationSpeed, function() + { + $(".tabbable").slideDown(WebDeveloper.Overlay.animationSpeed); + }); +}; + +// Handles the cookie session setting being changed +WebDeveloper.Overlay.Cookies.changeSession = function() +{ + var session = $(this); + + // If the session setting is checked + if(session.prop("checked")) + { + $("#add-cookie-expires").val("").prop("disabled", true); + } + else + { + $("#add-cookie-expires").val(WebDeveloper.Cookies.getDateTomorrow()).prop("disabled", false); + } +}; + +// Converts an array of cookies +WebDeveloper.Overlay.Cookies.convertCookies = function(cookies) +{ + var convertedCookies = []; + var cookie = null; + var cookieObject = null; + + // Loop through the cookies + for(var i = 0, l = cookies.length; i < l; i++) + { + cookie = {}; + cookieObject = cookies[i]; + + cookie.expires = cookieObject.expirationDate; + cookie.host = cookieObject.domain; + cookie.httpOnly = cookieObject.httpOnly; + cookie.name = cookieObject.name; + cookie.path = cookieObject.path; + cookie.secure = cookieObject.secure; + cookie.session = cookieObject.session; + cookie.value = cookieObject.value; + + convertedCookies.push(cookie); + } + + return convertedCookies; +}; + +// Deletes all the cookies for the current domain +WebDeveloper.Overlay.Cookies.deleteDomainCookies = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.cookies.getAll({}, function(allCookies) + { + chrome.tabs.sendMessage(tab.id, { allCookies: WebDeveloper.Overlay.Cookies.convertCookies(allCookies), type: "get-domain-cookies" }, function(cookies) + { + WebDeveloper.Cookies.deleteDomainCookies(cookies); + }); + }); + } + }); +}; + +// Deletes all the cookies for the current path +WebDeveloper.Overlay.Cookies.deletePathCookies = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.cookies.getAll({}, function(allCookies) + { + chrome.tabs.sendMessage(tab.id, { allCookies: WebDeveloper.Overlay.Cookies.convertCookies(allCookies), type: "get-path-cookies" }, function(cookies) + { + WebDeveloper.Cookies.deletePathCookies(cookies); + }); + }); + } + }); +}; + +// Deletes all session cookies +WebDeveloper.Overlay.Cookies.deleteSessionCookies = function() +{ + chrome.cookies.getAll({}, function(allCookies) + { + WebDeveloper.Cookies.deleteSessionCookies(WebDeveloper.Overlay.Cookies.convertCookies(allCookies)); + }); +}; + // Returns the locale for the view cookie information feature WebDeveloper.Overlay.Cookies.getViewCookieInformationLocale = function() { @@ -50,3 +229,150 @@ WebDeveloper.Overlay.Cookies.getViewCookieInformationLocale = function() return locale; }; + +// Populates a cookie from a dialog +WebDeveloper.Overlay.Cookies.populateCookieFromDialog = function() +{ + var cookie = {}; + + cookie.host = $("#add-cookie-host").val(); + cookie.name = $("#add-cookie-name").val(); + cookie.path = $("#add-cookie-path").val(); + cookie.value = $("#add-cookie-value").val(); + + // If the cookie is secure + if($("#add-cookie-secure").prop("checked")) + { + cookie.secure = true; + } + + // If the cookie is a session cookie + if($("#add-cookie-session").prop("checked")) + { + cookie.session = true; + } + else + { + cookie.expires = $("#add-cookie-expires").val(); + } + + return cookie; +}; + +// Resets the add cookie dialog +WebDeveloper.Overlay.Cookies.resetAddDialog = function(addDialog) +{ + $(".has-error", addDialog).removeClass("has-error"); + $(".help-block", addDialog).text(""); +}; + +// Adds a cookie +WebDeveloper.Overlay.Cookies.submitAddCookie = function() +{ + // If the dialog is valid + if(WebDeveloper.Overlay.Cookies.validateAddDialog()) + { + var cookie = WebDeveloper.Overlay.Cookies.populateCookieFromDialog(); + + WebDeveloper.Cookies.addCookie(cookie); + WebDeveloper.Overlay.Cookies.cancelAddCookie(); + WebDeveloper.Overlay.displayNotification(WebDeveloper.Locales.getFormattedString("cookieAdded", [cookie.name])); + } +}; + +// Toggles cookies +WebDeveloper.Overlay.Cookies.toggleCookies = function() +{ + WebDeveloper.Overlay.toggleContentSetting("cookies", $(this), "enableCookiesResult", "disableCookiesResult"); +}; + +// Returns true if the add dialog is valid +WebDeveloper.Overlay.Cookies.validateAddDialog = function() +{ + var expires = $("#add-cookie-expires"); + var host = $("#add-cookie-host"); + var hostValue = host.val().trim(); + var name = $("#add-cookie-name"); + var path = $("#add-cookie-path"); + var valid = true; + + WebDeveloper.Overlay.Cookies.resetAddDialog($("#add-cookie-dialog")); + + // If the cookie name is not set + if(!name.val()) + { + name.closest(".form-group").addClass("has-error"); + name.next(".help-block").text(WebDeveloper.Locales.getString("nameCannotBeEmpty")); + + valid = false; + } + + // If the cookie host is not set + if(!hostValue) + { + host.closest(".form-group").addClass("has-error"); + host.next(".help-block").text(WebDeveloper.Locales.getString("hostCannotBeEmpty")); + + valid = false; + } + else if(hostValue == "localhost" || hostValue == ".localhost") + { + host.closest(".form-group").addClass("has-error"); + host.next(".help-block").html(WebDeveloper.Locales.getString("extensionName") + " " + WebDeveloper.Locales.getString("hostCannotBeLocalhost")); + + valid = false; + } + + // If the cookie path is not set + if(!path.val()) + { + path.closest(".form-group").addClass("has-error"); + path.next(".help-block").text(WebDeveloper.Locales.getString("pathCannotBeEmpty")); + + valid = false; + } + + // If the cookie is not a session cookie + if(!$("#add-cookie-session").prop("checked")) + { + var expiresValue = expires.val().trim(); + + // If the cookie expires is not set + if(!expiresValue) + { + expires.closest(".form-group").addClass("has-error"); + expires.closest(".input-group").next(".help-block").text(WebDeveloper.Locales.getString("expiresCannotBeEmpty")); + + valid = false; + } + else if(new Date(expiresValue) == "Invalid Date") + { + expires.closest(".form-group").addClass("has-error"); + expires.closest(".input-group").next(".help-block").text(WebDeveloper.Locales.getString("expiresNotValid")); + + valid = false; + } + } + + return valid; +}; + +// Displays all the cookies for the page +WebDeveloper.Overlay.Cookies.viewCookieInformation = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.cookies.getAll({}, function(allCookies) + { + chrome.tabs.sendMessage(tab.id, { allCookies: WebDeveloper.Overlay.Cookies.convertCookies(allCookies), type: "get-cookies" }, function(data) + { + chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("/generated/view-cookie-information.html"), tab.index, data, WebDeveloper.Overlay.Cookies.getViewCookieInformationLocale()); + WebDeveloper.Overlay.close(); + }); + }); + } + }); +}; diff --git a/source/common/javascript/overlay/css.js b/source/common/javascript/overlay/css.js index 84044dd..87229cf 100644 --- a/source/common/javascript/overlay/css.js +++ b/source/common/javascript/overlay/css.js @@ -3,6 +3,211 @@ var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-defi WebDeveloper.Overlay = WebDeveloper.Overlay || {}; WebDeveloper.Overlay.CSS = WebDeveloper.Overlay.CSS || {}; +$(function() +{ + $("#disable-all-styles").append(WebDeveloper.Locales.getString("disableAllStyles")).on("click", WebDeveloper.Overlay.CSS.disableAllStyles); + $("#disable-browser-default-styles").append(WebDeveloper.Locales.getString("disableBrowserDefaultStyles")).on("click", WebDeveloper.Overlay.CSS.disableBrowserDefaultStyles); + $("#disable-embedded-styles").append(WebDeveloper.Locales.getString("disableEmbeddedStyles")).on("click", WebDeveloper.Overlay.CSS.disableEmbeddedStyles); + $("#disable-inline-styles").append(WebDeveloper.Locales.getString("disableInlineStyles")).on("click", WebDeveloper.Overlay.CSS.disableInlineStyles); + $("#disable-linked-style-sheets").append(WebDeveloper.Locales.getString("disableLinkedStyleSheets")).on("click", WebDeveloper.Overlay.CSS.disableLinkedStyleSheets); + $("#disable-print-styles").append(WebDeveloper.Locales.getString("disablePrintStyles")).on("click", WebDeveloper.Overlay.CSS.disablePrintStyles); + $("#display-handheld-styles").append(WebDeveloper.Locales.getString("displayHandheldStyles")).on("click", WebDeveloper.Overlay.CSS.displayHandheldStyles); + $("#display-print-styles").append(WebDeveloper.Locales.getString("displayPrintStyles")).on("click", WebDeveloper.Overlay.CSS.displayPrintStyles); + $("#edit-css").append(WebDeveloper.Locales.getString("editCSS")).on("click", WebDeveloper.Overlay.CSS.editCSS); + $("#reload-linked-style-sheets").append(WebDeveloper.Locales.getString("reloadLinkedStyleSheets")).on("click", WebDeveloper.Overlay.CSS.reloadLinkedStyleSheets); + $("#use-border-box-model").append(WebDeveloper.Locales.getString("useBorderBoxModel")).on("click", WebDeveloper.Overlay.CSS.useBorderBoxModel); + $("#view-css").append(WebDeveloper.Locales.getString("viewCSS")).on("click", WebDeveloper.Overlay.CSS.viewCSS); +}); + +// Adds a feature on a tab +WebDeveloper.Overlay.CSS.addFeatureOnTab = function(featureItem, tab, scriptCode) +{ + WebDeveloper.Overlay.addFeatureOnTab(featureItem, tab, "/features/javascript/css.js", scriptCode); +}; + +// Disables all styles +WebDeveloper.Overlay.CSS.disableAllStyles = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var disable = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.CSS.toggleAllStyles(" + disable + ", [document]);"); + } + }); +}; + +// Disables the browser default styles +WebDeveloper.Overlay.CSS.disableBrowserDefaultStyles = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.CSS.toggleBrowserDefaultStyles([document]);"); + } + }); +}; + +// Disables embedded styles +WebDeveloper.Overlay.CSS.disableEmbeddedStyles = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var disable = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.CSS.toggleEmbeddedStyles(" + disable + ", [document]);"); + } + }); +}; + +// Disables inline styles +WebDeveloper.Overlay.CSS.disableInlineStyles = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var disable = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.CSS.toggleInlineStyles(" + disable + ", [document]);"); + } + }); +}; + +// Disables linked style sheets +WebDeveloper.Overlay.CSS.disableLinkedStyleSheets = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var disable = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.CSS.toggleLinkedStyleSheets(" + disable + ", [document]);"); + } + }); +}; + +// Disables print styles +WebDeveloper.Overlay.CSS.disablePrintStyles = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var disable = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.CSS.togglePrintStyles(" + disable + ", [document]);"); + } + }); +}; + +// Displays handheld styles +WebDeveloper.Overlay.CSS.displayHandheldStyles = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var storage = chrome.extension.getBackgroundPage().WebDeveloper.Storage; + var display = !storage.isFeatureOnTab(feature, tab); + + // If displaying handheld styles and print styles are being displayed + if(display && storage.isFeatureOnTab("display-print-styles", tab)) + { + var displayPrintStylesItem = $("#display-print-styles"); + + WebDeveloper.Overlay.CSS.toggleFeatureOnTab(displayPrintStylesItem, tab, 'WebDeveloper.CSS.toggleMediaTypeStyles("print", false, [document]);'); + } + + WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, 'WebDeveloper.CSS.toggleMediaTypeStyles("handheld", ' + display + ", [document]);"); + } + }); +}; + +// Displays print styles +WebDeveloper.Overlay.CSS.displayPrintStyles = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var storage = chrome.extension.getBackgroundPage().WebDeveloper.Storage; + var display = !storage.isFeatureOnTab(feature, tab); + + // If displaying print styles and handheld styles are being displayed + if(display && storage.isFeatureOnTab("display-handheld-styles", tab)) + { + var displayHandheldStylesItem = $("#display-handheld-styles"); + + WebDeveloper.Overlay.CSS.toggleFeatureOnTab(displayHandheldStylesItem, tab, 'WebDeveloper.CSS.toggleMediaTypeStyles("handheld", false, [document]);'); + } + + WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, 'WebDeveloper.CSS.toggleMediaTypeStyles("print", ' + display + ", [document]);"); + } + }); +}; + +// Edits the CSS of the page +WebDeveloper.Overlay.CSS.editCSS = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var edit = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + var locale = ""; + + locale += "'couldNotLoadCSS': '" + WebDeveloper.Locales.getString("couldNotLoadCSS") + "',"; + locale += "'dashboardTitle': '" + WebDeveloper.Locales.getString("extensionName") + " " + WebDeveloper.Locales.getString("dashboard") + "',"; + locale += "'editCSS': '" + WebDeveloper.Locales.getString("editCSS") + "',"; + locale += "'embeddedStyles': '" + WebDeveloper.Locales.getString("embeddedStyles") + "'"; + + WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "dashboard/javascript/dashboard.js", "WebDeveloper.EditCSS.editCSS(" + edit + ", document, {" + locale + "});", true); + } + }); +}; + // Returns the locale for the view CSS feature WebDeveloper.Overlay.CSS.getViewCSSLocale = function() { @@ -18,3 +223,58 @@ WebDeveloper.Overlay.CSS.getViewCSSLocale = function() return locale; }; + +// Reloads the linked style sheets of the page +WebDeveloper.Overlay.CSS.reloadLinkedStyleSheets = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.CSS.addFeatureOnTab(featureItem, tab, "WebDeveloper.CSS.reloadLinkedStyleSheets([document]);"); + } + }); +}; + +// Toggles a feature on a tab +WebDeveloper.Overlay.CSS.toggleFeatureOnTab = function(featureItem, tab, scriptCode) +{ + WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "/features/javascript/css.js", scriptCode); +}; + +// Displays alt attributes for all images +WebDeveloper.Overlay.CSS.useBorderBoxModel = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.CSS.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.CSS.useBorderBoxModel([document]);"); + } + }); +}; + +// Displays the CSS +WebDeveloper.Overlay.CSS.viewCSS = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.tabs.sendMessage(tab.id, { type: "get-css" }, function(data) + { + data.theme = chrome.extension.getBackgroundPage().WebDeveloper.Storage.getItem("syntax_highlight_theme"); + + chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("generated/view-css.html"), tab.index, data, WebDeveloper.Overlay.CSS.getViewCSSLocale()); + WebDeveloper.Overlay.close(); + }); + } + }); +}; diff --git a/source/common/javascript/overlay/forms.js b/source/common/javascript/overlay/forms.js index 77a8445..08b8969 100644 --- a/source/common/javascript/overlay/forms.js +++ b/source/common/javascript/overlay/forms.js @@ -3,6 +3,203 @@ var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-defi WebDeveloper.Overlay = WebDeveloper.Overlay || {}; WebDeveloper.Overlay.Forms = WebDeveloper.Overlay.Forms || {}; +$(function() +{ + $("#check-all-checkboxes").append(WebDeveloper.Locales.getString("checkAllCheckboxes")).on("click", WebDeveloper.Overlay.Forms.checkAllCheckboxes); + $("#clear-form-fields").append(WebDeveloper.Locales.getString("clearFormFields")).on("click", WebDeveloper.Overlay.Forms.clearFormFields); + $("#clear-radio-buttons").append(WebDeveloper.Locales.getString("clearRadioButtons")).on("click", WebDeveloper.Overlay.Forms.clearRadioButtons); + $("#convert-form-gets-to-posts").append(WebDeveloper.Locales.getString("convertFormGetsToPosts")).on("click", function() { WebDeveloper.Overlay.Forms.convertFormMethods("post"); }); + $("#convert-form-posts-to-gets").append(WebDeveloper.Locales.getString("convertFormPostsToGets")).on("click", function() { WebDeveloper.Overlay.Forms.convertFormMethods("get"); }); + $("#convert-select-elements-to-text-inputs").append(WebDeveloper.Locales.getString("convertSelectElementsToTextInputs")).on("click", WebDeveloper.Overlay.Forms.convertSelectElementsToTextInputs); + $("#convert-text-inputs-to-textareas").append(WebDeveloper.Locales.getString("convertTextInputsToTextareas")).on("click", WebDeveloper.Overlay.Forms.convertTextInputsToTextareas); + $("#display-form-details").append(WebDeveloper.Locales.getString("displayFormDetails")).on("click", WebDeveloper.Overlay.Forms.displayFormDetails); + $("#display-passwords").append(WebDeveloper.Locales.getString("displayPasswords")).on("click", WebDeveloper.Overlay.Forms.displayPasswords); + $("#enable-auto-completion").append(WebDeveloper.Locales.getString("enableAutoCompletion")).on("click", WebDeveloper.Overlay.Forms.enableAutoCompletion); + $("#enable-form-fields").append(WebDeveloper.Locales.getString("enableFormFields")).on("click", WebDeveloper.Overlay.Forms.enableFormFields); + $("#expand-select-elements").append(WebDeveloper.Locales.getString("expandSelectElements")).on("click", WebDeveloper.Overlay.Forms.expandSelectElements); + $("#make-form-fields-writable").append(WebDeveloper.Locales.getString("makeFormFieldsWritable")).on("click", WebDeveloper.Overlay.Forms.makeFormFieldsWritable); + $("#outline-form-fields-without-labels").append(WebDeveloper.Locales.getString("outlineFormFieldsWithoutLabels")).on("click", WebDeveloper.Overlay.Forms.outlineFormFieldsWithoutLabels); + $("#populate-form-fields").append(WebDeveloper.Locales.getString("populateFormFields")).on("click", WebDeveloper.Overlay.Forms.populateFormFields); + $("#remove-form-validation").append(WebDeveloper.Locales.getString("removeFormValidation")).on("click", WebDeveloper.Overlay.Forms.removeFormValidation); + $("#remove-maximum-lengths").append(WebDeveloper.Locales.getString("removeMaximumLengths")).on("click", WebDeveloper.Overlay.Forms.removeMaximumLengths); + $("#uncheck-all-checkboxes").append(WebDeveloper.Locales.getString("uncheckAllCheckboxes")).on("click", WebDeveloper.Overlay.Forms.uncheckAllCheckboxes); + $("#view-form-information").append(WebDeveloper.Locales.getString("viewFormInformation")).on("click", WebDeveloper.Overlay.Forms.viewFormInformation); +}); + +// Adds a feature on a tab +WebDeveloper.Overlay.Forms.addFeatureOnTab = function(featureItem, tab, scriptCode) +{ + WebDeveloper.Overlay.addFeatureOnTab(featureItem, tab, "/features/javascript/forms.js", scriptCode); +}; + +// Checks all checkboxes +WebDeveloper.Overlay.Forms.checkAllCheckboxes = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.toggleCheckboxes(true, [document]);"); + } + }); +}; + +// Clears all form fields +WebDeveloper.Overlay.Forms.clearFormFields = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.clearFormFields([document]);"); + } + }); +}; + +// Clears all radio buttons +WebDeveloper.Overlay.Forms.clearRadioButtons = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.clearRadioButtons([document]);"); + } + }); +}; + +// Converts the methods of all forms +WebDeveloper.Overlay.Forms.convertFormMethods = function(method) +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, 'WebDeveloper.Forms.convertFormMethods("' + method + '", [document]);'); + } + }); +}; + +// Converts select elements to text inputs +WebDeveloper.Overlay.Forms.convertSelectElementsToTextInputs = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.convertSelectElementsToTextInputs([document]);"); + } + }); +}; + +// Converts text inputs to textareas +WebDeveloper.Overlay.Forms.convertTextInputsToTextareas = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.convertTextInputsToTextareas([document]);"); + } + }); +}; + +// Displays the details about all forms +WebDeveloper.Overlay.Forms.displayFormDetails = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Forms.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.displayFormDetails(" + display + ", [document]);"); + } + }); +}; + +// Displays all passwords +WebDeveloper.Overlay.Forms.displayPasswords = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.displayPasswords([document]);"); + } + }); +}; + +// Enables auto completion on all elements +WebDeveloper.Overlay.Forms.enableAutoCompletion = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.enableAutoCompletion([document]);"); + } + }); +}; + +// Enables all form fields +WebDeveloper.Overlay.Forms.enableFormFields = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.enableFormFields([document]);"); + } + }); +}; + +// Expands all select elements +WebDeveloper.Overlay.Forms.expandSelectElements = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.expandSelectElements([document]);"); + } + }); +}; + // Returns the locale for the view form information feature WebDeveloper.Overlay.Forms.getViewFormInformationLocale = function() { @@ -23,3 +220,119 @@ WebDeveloper.Overlay.Forms.getViewFormInformationLocale = function() return locale; }; + +// Makes all form fields writable +WebDeveloper.Overlay.Forms.makeFormFieldsWritable = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.makeFormFieldsWritable([document]);"); + } + }); +}; + +// Outlines all form fields without labels +WebDeveloper.Overlay.Forms.outlineFormFieldsWithoutLabels = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Forms.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.outlineFormFieldsWithoutLabels(" + display + ", [document]);"); + } + }); +}; + +// Populates all form fields +WebDeveloper.Overlay.Forms.populateFormFields = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, 'WebDeveloper.Forms.populateFormFields([document], "' + chrome.extension.getBackgroundPage().WebDeveloper.Storage.getItem("populate_email_address") + '", "' + WebDeveloper.Locales.getString("password").toLowerCase() + '");'); + } + }); +}; + +// Removes validation on all form fields +WebDeveloper.Overlay.Forms.removeFormValidation = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.removeFormValidation([document]);"); + } + }); +}; + +// Removes maximum lengths from all elements +WebDeveloper.Overlay.Forms.removeMaximumLengths = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.removeMaximumLengths([document]);"); + } + }); +}; + +// Toggles a feature on a tab +WebDeveloper.Overlay.Forms.toggleFeatureOnTab = function(featureItem, tab, scriptCode) +{ + WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "/features/javascript/forms.js", scriptCode); +}; + +// Unchecks all checkboxes +WebDeveloper.Overlay.Forms.uncheckAllCheckboxes = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Forms.addFeatureOnTab(featureItem, tab, "WebDeveloper.Forms.toggleCheckboxes(false, [document]);"); + } + }); +}; + +// Displays information about all forms +WebDeveloper.Overlay.Forms.viewFormInformation = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.tabs.sendMessage(tab.id, { type: "get-forms" }, function(data) + { + chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("/generated/view-form-information.html"), tab.index, data, WebDeveloper.Overlay.Forms.getViewFormInformationLocale()); + WebDeveloper.Overlay.close(); + }); + } + }); +}; diff --git a/source/common/javascript/overlay/images.js b/source/common/javascript/overlay/images.js index c26bb6b..c07e3f9 100644 --- a/source/common/javascript/overlay/images.js +++ b/source/common/javascript/overlay/images.js @@ -3,6 +3,119 @@ var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-defi WebDeveloper.Overlay = WebDeveloper.Overlay || {}; WebDeveloper.Overlay.Images = WebDeveloper.Overlay.Images || {}; +$(function() +{ + var disableImagesMenu = $("#disable-images"); + + disableImagesMenu.append(WebDeveloper.Locales.getString("disableImages")).on("click", WebDeveloper.Overlay.Images.toggleImages); + $("#display-alt-attributes").append(WebDeveloper.Locales.getString("displayAltAttributes")).on("click", WebDeveloper.Overlay.Images.displayAltAttributes); + $("#display-image-dimensions").append(WebDeveloper.Locales.getString("displayImageDimensions")).on("click", WebDeveloper.Overlay.Images.displayImageDimensions); + $("#display-image-paths").append(WebDeveloper.Locales.getString("displayImagePaths")).on("click", WebDeveloper.Overlay.Images.displayImagePaths); + $("#find-broken-images").append(WebDeveloper.Locales.getString("findBrokenImages")).on("click", WebDeveloper.Overlay.Images.findBrokenImages); + $("#hide-background-images").append(WebDeveloper.Locales.getString("hideBackgroundImages")).on("click", WebDeveloper.Overlay.Images.hideBackgroundImages); + $("#hide-images").append(WebDeveloper.Locales.getString("hideImages")).on("click", WebDeveloper.Overlay.Images.hideImages); + $("#make-images-full-size").append(WebDeveloper.Locales.getString("makeImagesFullSize")).on("click", WebDeveloper.Overlay.Images.makeImagesFullSize); + $("#make-images-invisible").append(WebDeveloper.Locales.getString("makeImagesInvisible")).on("click", WebDeveloper.Overlay.Images.makeImagesInvisible); + $("#outline-all-images").append(WebDeveloper.Locales.getString("outlineAllImages")).on("click", WebDeveloper.Overlay.Images.outlineAllImages); + $("#outline-background-images").append(WebDeveloper.Locales.getString("outlineBackgroundImages")).on("click", WebDeveloper.Overlay.Images.outlineBackgroundImages); + $("#outline-images-with-adjusted-dimensions").append(WebDeveloper.Locales.getString("outlineImagesWithAdjustedDimensions")).on("click", WebDeveloper.Overlay.Images.outlineImagesWithAdjustedDimensions); + $("#outline-images-with-empty-alt-attributes").append(WebDeveloper.Locales.getString("outlineImagesWithEmptyAltAttributes")).on("click", WebDeveloper.Overlay.Images.outlineImagesWithEmptyAltAttributes); + $("#outline-images-with-oversized-dimensions").append(WebDeveloper.Locales.getString("outlineImagesWithOversizedDimensions")).on("click", WebDeveloper.Overlay.Images.outlineImagesWithOversizedDimensions); + $("#outline-images-without-alt-attributes").append(WebDeveloper.Locales.getString("outlineImagesWithoutAltAttributes")).on("click", WebDeveloper.Overlay.Images.outlineImagesWithoutAltAttributes); + $("#outline-images-without-dimensions").append(WebDeveloper.Locales.getString("outlineImagesWithoutDimensions")).on("click", WebDeveloper.Overlay.Images.outlineImagesWithoutDimensions); + $("#reload-images").append(WebDeveloper.Locales.getString("reloadImages")).on("click", WebDeveloper.Overlay.Images.reloadImages); + $("#replace-images-with-alt-attributes").append(WebDeveloper.Locales.getString("replaceImagesWithAltAttributes")).on("click", WebDeveloper.Overlay.Images.replaceImagesWithAltAttributes); + $("#view-image-information").append(WebDeveloper.Locales.getString("viewImageInformation")).on("click", WebDeveloper.Overlay.Images.viewImageInformation); + + WebDeveloper.Overlay.updateContentSettingMenu(disableImagesMenu, "images"); +}); + +// Adds a feature on a tab +WebDeveloper.Overlay.Images.addFeatureOnTab = function(featureItem, tab, scriptCode) +{ + WebDeveloper.Overlay.addFeatureOnTab(featureItem, tab, "/features/javascript/images.js", scriptCode); +}; + +// Displays alt attributes for all images +WebDeveloper.Overlay.Images.displayAltAttributes = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.displayAltAttributes(" + display + ", [document]);"); + } + }); +}; + +// Displays the dimensions for all images +WebDeveloper.Overlay.Images.displayImageDimensions = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + var locale = ""; + + locale += "'height': '" + WebDeveloper.Locales.getString("height") + "',"; + locale += "'width': '" + WebDeveloper.Locales.getString("width") + "'"; + + WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.displayImageDimensions(" + display + ", [document], {" + locale + "});"); + } + }); +}; + +// Displays the paths for all images +WebDeveloper.Overlay.Images.displayImagePaths = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.displayImagePaths(" + display + ", [document]);"); + } + }); +}; + +// Finds all the broken images on a page +WebDeveloper.Overlay.Images.findBrokenImages = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.tabs.sendMessage(tab.id, { type: "get-broken-images" }, function(data) + { + var locale = WebDeveloper.Locales.setupGeneratedLocale(); + + locale.brokenImage = WebDeveloper.Locales.getString("brokenImage"); + locale.brokenImages = WebDeveloper.Locales.getString("brokenImages"); + + chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("/generated/find-broken-images.html"), tab.index, data, locale); + WebDeveloper.Overlay.close(); + }); + } + }); +}; + // Returns the locale for the view image information feature WebDeveloper.Overlay.Images.getViewImageInformationLocale = function() { @@ -19,3 +132,245 @@ WebDeveloper.Overlay.Images.getViewImageInformationLocale = function() return locale; }; + +// Hides all background images +WebDeveloper.Overlay.Images.hideBackgroundImages = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.hideBackgroundImages([document]);"); + } + }); +}; + +// Hides all images +WebDeveloper.Overlay.Images.hideImages = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var disable = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.hideImages(" + disable + ", [document]);"); + } + }); +}; + +// Makes all images full size +WebDeveloper.Overlay.Images.makeImagesFullSize = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Images.addFeatureOnTab(featureItem, tab, "WebDeveloper.Images.makeImagesFullSize([document]);"); + } + }); +}; + +// Makes all images invisible +WebDeveloper.Overlay.Images.makeImagesInvisible = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var invisible = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.makeImagesInvisible(" + invisible + ", [document]);"); + } + }); +}; + +// Outlines all images +WebDeveloper.Overlay.Images.outlineAllImages = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.outlineAllImages([document]);"); + } + }); +}; + +// Outlines all background images +WebDeveloper.Overlay.Images.outlineBackgroundImages = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var outline = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.outlineBackgroundImages(" + outline + ", [document]);"); + } + }); +}; + +// Outlines all images with adjusted dimensions +WebDeveloper.Overlay.Images.outlineImagesWithAdjustedDimensions = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var outline = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.outlineImagesWithAdjustedDimensions(" + outline + ", [document]);"); + } + }); +}; + +// Outlines all images with empty alt attributes +WebDeveloper.Overlay.Images.outlineImagesWithEmptyAltAttributes = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.outlineImagesWithEmptyAltAttributes([document]);"); + } + }); +}; + +// Outlines all images with oversized dimensions +WebDeveloper.Overlay.Images.outlineImagesWithOversizedDimensions = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var outline = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.outlineImagesWithOversizedDimensions(" + outline + ", [document]);"); + } + }); +}; + +// Outlines all images without alt attributes +WebDeveloper.Overlay.Images.outlineImagesWithoutAltAttributes = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.outlineImagesWithoutAltAttributes([document]);"); + } + }); +}; + +// Outlines all images without dimensions +WebDeveloper.Overlay.Images.outlineImagesWithoutDimensions = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.outlineImagesWithoutDimensions([document]);"); + } + }); +}; + +// Reloads all the images on a page +WebDeveloper.Overlay.Images.reloadImages = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Images.addFeatureOnTab(featureItem, tab, "WebDeveloper.Images.reloadImages([document]);"); + } + }); +}; + +// Replaces all images with alt attributes +WebDeveloper.Overlay.Images.replaceImagesWithAltAttributes = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var replace = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Images.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Images.replaceImagesWithAltAttributes(" + replace + ", [document]);"); + } + }); +}; + +// Toggles a feature on a tab +WebDeveloper.Overlay.Images.toggleFeatureOnTab = function(featureItem, tab, scriptCode) +{ + WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "/features/javascript/images.js", scriptCode); +}; + +// Toggles images +WebDeveloper.Overlay.Images.toggleImages = function() +{ + WebDeveloper.Overlay.toggleContentSetting("images", $(this), "enableImagesResult", "disableImagesResult"); +}; + +// Displays all the images +WebDeveloper.Overlay.Images.viewImageInformation = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.tabs.sendMessage(tab.id, { type: "get-images" }, function(data) + { + chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("/generated/view-image-information.html"), tab.index, data, WebDeveloper.Overlay.Images.getViewImageInformationLocale()); + WebDeveloper.Overlay.close(); + }); + } + }); +}; diff --git a/source/common/javascript/overlay/information.js b/source/common/javascript/overlay/information.js index 5b11da7..61c2cb9 100644 --- a/source/common/javascript/overlay/information.js +++ b/source/common/javascript/overlay/information.js @@ -3,6 +3,347 @@ var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-defi WebDeveloper.Overlay = WebDeveloper.Overlay || {}; WebDeveloper.Overlay.Information = WebDeveloper.Overlay.Information || {}; +$(function() +{ + $("#display-abbreviations").append(WebDeveloper.Locales.getString("displayAbbreviations")).on("click", WebDeveloper.Overlay.Information.displayAbbreviations); + $("#display-access-keys").append(WebDeveloper.Locales.getString("displayAccessKeys")).on("click", WebDeveloper.Overlay.Information.displayAccessKeys); + $("#display-anchors").append(WebDeveloper.Locales.getString("displayAnchors")).on("click", WebDeveloper.Overlay.Information.displayAnchors); + $("#display-aria-roles").append(WebDeveloper.Locales.getString("displayARIARoles")).on("click", WebDeveloper.Overlay.Information.displayARIARoles); + $("#display-div-dimensions").append(WebDeveloper.Locales.getString("displayDivDimensions")).on("click", WebDeveloper.Overlay.Information.displayDivDimensions); + $("#display-div-order").append(WebDeveloper.Locales.getString("displayDivOrder")).on("click", WebDeveloper.Overlay.Information.displayDivOrder); + $("#display-element-information").append(WebDeveloper.Locales.getString("displayElementInformation")).on("click", WebDeveloper.Overlay.Information.displayElementInformation); + $("#display-id-class-details").append(WebDeveloper.Locales.getString("displayIdClassDetails")).on("click", WebDeveloper.Overlay.Information.displayIdClassDetails); + $("#display-link-details").append(WebDeveloper.Locales.getString("displayLinkDetails")).on("click", WebDeveloper.Overlay.Information.displayLinkDetails); + $("#display-object-information").append(WebDeveloper.Locales.getString("displayObjectInformation")).on("click", WebDeveloper.Overlay.Information.displayObjectInformation); + $("#display-stack-levels").append(WebDeveloper.Locales.getString("displayStackLevels")).on("click", WebDeveloper.Overlay.Information.displayStackLevels); + $("#display-tab-index").append(WebDeveloper.Locales.getString("displayTabIndex")).on("click", WebDeveloper.Overlay.Information.displayTabIndex); + $("#display-table-depth").append(WebDeveloper.Locales.getString("displayTableDepth")).on("click", WebDeveloper.Overlay.Information.displayTableDepth); + $("#display-table-information").append(WebDeveloper.Locales.getString("displayTableInformation")).on("click", WebDeveloper.Overlay.Information.displayTableInformation); + $("#display-title-attributes").append(WebDeveloper.Locales.getString("displayTitleAttributes")).on("click", WebDeveloper.Overlay.Information.displayTitleAttributes); + $("#display-topographic-information").append(WebDeveloper.Locales.getString("displayTopographicInformation")).on("click", WebDeveloper.Overlay.Information.displayTopographicInformation); + $("#find-duplicate-ids").append(WebDeveloper.Locales.getString("findDuplicateIds")).on("click", WebDeveloper.Overlay.Information.findDuplicateIds); + $("#view-anchor-information").append(WebDeveloper.Locales.getString("viewAnchorInformation")).on("click", WebDeveloper.Overlay.Information.viewAnchorInformation); + $("#view-color-information").append(WebDeveloper.Locales.getString("viewColorInformation")).on("click", WebDeveloper.Overlay.Information.viewColorInformation); + $("#view-document-outline").append(WebDeveloper.Locales.getString("viewDocumentOutline")).on("click", WebDeveloper.Overlay.Information.viewDocumentOutline); + $("#view-link-information").append(WebDeveloper.Locales.getString("viewLinkInformation")).on("click", WebDeveloper.Overlay.Information.viewLinkInformation); + $("#view-meta-tag-information").append(WebDeveloper.Locales.getString("viewMetaTagInformation")).on("click", WebDeveloper.Overlay.Information.viewMetaTagInformation); + $("#view-javascript").append(WebDeveloper.Locales.getString("viewJavaScript")).on("click", WebDeveloper.Overlay.Information.viewJavaScript); + $("#view-response-headers").append(WebDeveloper.Locales.getString("viewResponseHeaders")).on("click", WebDeveloper.Overlay.Information.viewResponseHeaders); +}); + +// Displays the abbreviations on a page +WebDeveloper.Overlay.Information.displayAbbreviations = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayAbbreviations([document]);"); + } + }); +}; + +// Displays the access keys on a page +WebDeveloper.Overlay.Information.displayAccessKeys = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayAccessKeys(" + display + ", [document]);"); + } + }); +}; + +// Displays the anchors on a page +WebDeveloper.Overlay.Information.displayAnchors = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayAnchors(" + display + ", [document]);"); + } + }); +}; + +// Displays the ARIA roles on a page +WebDeveloper.Overlay.Information.displayARIARoles = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayARIARoles([document]);"); + } + }); +}; + +// Displays the dimensions for divs on a page +WebDeveloper.Overlay.Information.displayDivDimensions = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + var locale = ""; + + locale += "'height': '" + WebDeveloper.Locales.getString("height") + "',"; + locale += "'width': '" + WebDeveloper.Locales.getString("width") + "'"; + + WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayDivDimensions(" + display + ", [document], {" + locale + "});"); + } + }); +}; + +// Displays the order of the divs on a page +WebDeveloper.Overlay.Information.displayDivOrder = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayDivOrder(" + display + ", [document]);"); + } + }); +}; + +// Displays information about an element +WebDeveloper.Overlay.Information.displayElementInformation = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + var locale = ""; + + locale += "'ancestors': '" + WebDeveloper.Locales.getString("ancestors") + "',"; + locale += "'children': '" + WebDeveloper.Locales.getString("children") + "',"; + locale += "'dashboardTitle': '" + WebDeveloper.Locales.getString("extensionName") + " " + WebDeveloper.Locales.getString("dashboard") + "',"; + locale += "'dom': '" + WebDeveloper.Locales.getString("dom") + "',"; + locale += "'elementInformation': '" + WebDeveloper.Locales.getString("elementInformation") + "',"; + locale += "'layout': '" + WebDeveloper.Locales.getString("layout") + "',"; + locale += "'position': '" + WebDeveloper.Locales.getString("position") + "',"; + locale += "'selectAnElementDisplayInformation': '" + WebDeveloper.Locales.getString("selectAnElementDisplayInformation") + "',"; + locale += "'text': '" + WebDeveloper.Locales.getString("text") + "'"; + + WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "/dashboard/javascript/dashboard.js", "WebDeveloper.ElementInformation.initialize(" + display + ", document, {" + locale + "});", true); + } + }); +}; + +// Displays the id and class details for a page +WebDeveloper.Overlay.Information.displayIdClassDetails = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayIdClassDetails(" + display + ", [document]);"); + } + }); +}; + +// Displays the details for the links on a page +WebDeveloper.Overlay.Information.displayLinkDetails = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayLinkDetails([document]);"); + } + }); +}; + +// Displays the information for objects on a page +WebDeveloper.Overlay.Information.displayObjectInformation = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayObjectInformation(" + display + ", [document]);"); + } + }); +}; + +// Displays the stack levels on a page +WebDeveloper.Overlay.Information.displayStackLevels = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayStackLevels(" + display + ", [document]);"); + } + }); +}; + +// Displays the tab indices on a page +WebDeveloper.Overlay.Information.displayTabIndex = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayTabIndex(" + display + ", [document]);"); + } + }); +}; + +// Displays the depth of all tables on a page +WebDeveloper.Overlay.Information.displayTableDepth = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayTableDepth(" + display + ", [document], '" + WebDeveloper.Locales.getString("depth") + "');"); + } + }); +}; + +// Displays the information for tables on a page +WebDeveloper.Overlay.Information.displayTableInformation = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayTableInformation(" + display + ", [document]);"); + } + }); +}; + +// Displays the title attributes on a page +WebDeveloper.Overlay.Information.displayTitleAttributes = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var feature = featureItem.attr("id"); + var display = !chrome.extension.getBackgroundPage().WebDeveloper.Storage.isFeatureOnTab(feature, tab); + + WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayTitleAttributes(" + display + ", [document]);"); + } + }); +}; + +// Displays the topographic information for a page +WebDeveloper.Overlay.Information.displayTopographicInformation = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + WebDeveloper.Overlay.Information.toggleFeatureOnTab(featureItem, tab, "WebDeveloper.Information.displayTopographicInformation([document]);"); + } + }); +}; + +// Finds all the duplicate ids on a page +WebDeveloper.Overlay.Information.findDuplicateIds = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.tabs.sendMessage(tab.id, { type: "get-duplicate-ids" }, function(data) + { + var locale = WebDeveloper.Locales.setupGeneratedLocale(); + + locale.duplicateId = WebDeveloper.Locales.getString("duplicateId"); + locale.duplicateIds = WebDeveloper.Locales.getString("duplicateIds"); + + chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("/generated/find-duplicate-ids.html"), tab.index, data, locale); + WebDeveloper.Overlay.close(); + }); + } + }); +}; + // Returns the locale for the view anchor information feature WebDeveloper.Overlay.Information.getViewAnchorInformationLocale = function() { @@ -94,3 +435,130 @@ WebDeveloper.Overlay.Information.getViewResponseHeadersLocale = function() return locale; }; + +// Toggles a feature on a tab +WebDeveloper.Overlay.Information.toggleFeatureOnTab = function(featureItem, tab, scriptCode) +{ + WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "/features/javascript/information.js", scriptCode); +}; + +// Displays the anchor information for a page +WebDeveloper.Overlay.Information.viewAnchorInformation = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.tabs.sendMessage(tab.id, { type: "get-anchors" }, function(data) + { + chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("/generated/view-anchor-information.html"), tab.index, data, WebDeveloper.Overlay.Information.getViewAnchorInformationLocale()); + WebDeveloper.Overlay.close(); + }); + } + }); +}; + +// Displays the color information for a page +WebDeveloper.Overlay.Information.viewColorInformation = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.tabs.sendMessage(tab.id, { type: "get-colors" }, function(data) + { + chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("/generated/view-color-information.html"), tab.index, data, WebDeveloper.Overlay.Information.getViewColorInformationLocale()); + WebDeveloper.Overlay.close(); + }); + } + }); +}; + +// Displays the document outline +WebDeveloper.Overlay.Information.viewDocumentOutline = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.tabs.sendMessage(tab.id, { type: "get-document-outline" }, function(data) + { + chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("/generated/view-document-outline.html"), tab.index, data, WebDeveloper.Overlay.Information.getViewDocumentOutlineLocale()); + WebDeveloper.Overlay.close(); + }); + } + }); +}; + +// Displays the JavaScript +WebDeveloper.Overlay.Information.viewJavaScript = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.tabs.sendMessage(tab.id, { type: "get-javascript" }, function(data) + { + data.theme = chrome.extension.getBackgroundPage().WebDeveloper.Storage.getItem("syntax_highlight_theme"); + + chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("/generated/view-javascript.html"), tab.index, data, WebDeveloper.Overlay.Information.getViewJavaScriptLocale()); + WebDeveloper.Overlay.close(); + }); + } + }); +}; + +// Displays the link information for a page +WebDeveloper.Overlay.Information.viewLinkInformation = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.tabs.sendMessage(tab.id, { type: "get-links" }, function(data) + { + chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("/generated/view-link-information.html"), tab.index, data, WebDeveloper.Overlay.Information.getViewLinkInformationLocale()); + WebDeveloper.Overlay.close(); + }); + } + }); +}; + +// Displays the meta tag information for a page +WebDeveloper.Overlay.Information.viewMetaTagInformation = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.tabs.sendMessage(tab.id, { type: "get-meta-tags" }, function(data) + { + chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("/generated/view-meta-tag-information.html"), tab.index, data, WebDeveloper.Overlay.Information.getViewMetaTagInformationLocale()); + WebDeveloper.Overlay.close(); + }); + } + }); +}; + +// Displays the response headers +WebDeveloper.Overlay.Information.viewResponseHeaders = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.tabs.sendMessage(tab.id, { type: "get-document-details" }, function(data) + { + chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("/generated/view-response-headers.html"), tab.index, data, WebDeveloper.Overlay.Information.getViewResponseHeadersLocale()); + WebDeveloper.Overlay.close(); + }); + } + }); +}; diff --git a/source/chrome/javascript/overlay/miscellaneous.js b/source/common/javascript/overlay/miscellaneous.js similarity index 81% rename from source/chrome/javascript/overlay/miscellaneous.js rename to source/common/javascript/overlay/miscellaneous.js index 678396a..353e689 100644 --- a/source/chrome/javascript/overlay/miscellaneous.js +++ b/source/common/javascript/overlay/miscellaneous.js @@ -5,7 +5,8 @@ WebDeveloper.Overlay.Miscellaneous = WebDeveloper.Overlay.Miscellaneous || {}; $(function() { - $("#clear-cache").append(WebDeveloper.Locales.getString("clearCache")).on("click", WebDeveloper.Overlay.Miscellaneous.clearCache); + var clearCacheMenu = $("#clear-cache"); + $("#clear-history").append(WebDeveloper.Locales.getString("clearHistory")).on("click", WebDeveloper.Overlay.Miscellaneous.confirmClearHistory); $("#display-color-picker").append(WebDeveloper.Locales.getString("displayColorPicker")).on("click", WebDeveloper.Overlay.Miscellaneous.displayColorPicker); $("#display-hidden-elements").append(WebDeveloper.Locales.getString("displayHiddenElements")).on("click", WebDeveloper.Overlay.Miscellaneous.displayHiddenElements); @@ -15,12 +16,22 @@ $(function() $("#make-frames-resizable").append(WebDeveloper.Locales.getString("makeFramesResizable")).on("click", WebDeveloper.Overlay.Miscellaneous.makeFramesResizable); $("#mark-all-links-unvisited").append(WebDeveloper.Locales.getString("markAllLinksUnvisited")).on("click", function() { WebDeveloper.Overlay.Miscellaneous.toggleVisitedLinks(false); }); $("#mark-all-links-visited").append(WebDeveloper.Locales.getString("markAllLinksVisited")).on("click", function() { WebDeveloper.Overlay.Miscellaneous.toggleVisitedLinks(true); }); + + // If the browsing data API is set + if(chrome.browsingData) + { + clearCacheMenu.append(WebDeveloper.Locales.getString("clearCache")).on("click", WebDeveloper.Overlay.Miscellaneous.confirmClearCache); + } + else + { + clearCacheMenu.hide(); + } }); // Adds a feature on a tab WebDeveloper.Overlay.Miscellaneous.addFeatureOnTab = function(featureItem, tab, scriptCode) { - WebDeveloper.Overlay.addFeatureOnTab(featureItem, tab, "features/javascript/miscellaneous.js", scriptCode); + WebDeveloper.Overlay.addFeatureOnTab(featureItem, tab, "/features/javascript/miscellaneous.js", scriptCode); }; // Adds an href to the history @@ -32,7 +43,12 @@ WebDeveloper.Overlay.Miscellaneous.addToHistory = function(href) // Clears the cache WebDeveloper.Overlay.Miscellaneous.clearCache = function() { - WebDeveloper.Overlay.openTab("chrome://settings/clearBrowserData"); + WebDeveloper.Overlay.closeConfirmation(); + + chrome.browsingData.removeCache({ since: 0 }, function() + { + WebDeveloper.Overlay.displayNotification(WebDeveloper.Locales.getString("clearCacheResult")); + }); }; // Clears the history @@ -46,6 +62,12 @@ WebDeveloper.Overlay.Miscellaneous.clearHistory = function() }); }; +// Asks to confirm to clear the cache +WebDeveloper.Overlay.Miscellaneous.confirmClearCache = function() +{ + WebDeveloper.Overlay.displayConfirmation(null, WebDeveloper.Locales.getString("clearCacheConfirmation"), WebDeveloper.Locales.getString("clear"), "trash", WebDeveloper.Overlay.Miscellaneous.clearCache); +}; + // Asks to confirm to clear the history WebDeveloper.Overlay.Miscellaneous.confirmClearHistory = function() { @@ -70,7 +92,7 @@ WebDeveloper.Overlay.Miscellaneous.displayColorPicker = function() locale.selectedColor = WebDeveloper.Locales.getString("selectedColor"); locale.title = WebDeveloper.Locales.getString("extensionName") + " " + WebDeveloper.Locales.getString("colorPicker"); - WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "toolbar/javascript/color-picker.js", "WebDeveloper.ColorPicker.displayColorPicker(" + display + ", document, '" + ich.colorPickerToolbar(locale, true) + "');", true); + WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "/toolbar/javascript/color-picker.js", "WebDeveloper.ColorPicker.displayColorPicker(" + display + ", document, '" + ich.colorPickerToolbar(locale, true) + "');", true); } }); }; @@ -111,7 +133,7 @@ WebDeveloper.Overlay.Miscellaneous.displayLineGuides = function() locale.previousPosition = WebDeveloper.Locales.getString("previousPosition"); locale.title = WebDeveloper.Locales.getString("extensionName") + " " + WebDeveloper.Locales.getString("lineGuides"); - WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "toolbar/javascript/line-guides.js", "WebDeveloper.LineGuides.displayLineGuides(" + display + ", document, '" + ich.lineGuidesToolbar(locale, true) + "');", true); + WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "/toolbar/javascript/line-guides.js", "WebDeveloper.LineGuides.displayLineGuides(" + display + ", document, '" + ich.lineGuidesToolbar(locale, true) + "');", true); } }); }; @@ -137,7 +159,7 @@ WebDeveloper.Overlay.Miscellaneous.displayRuler = function() locale.width = WebDeveloper.Locales.getString("width"); locale.yLabel = WebDeveloper.Locales.getString("yLabel"); - WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "toolbar/javascript/ruler.js", "WebDeveloper.Ruler.displayRuler(" + display + ", document, '" + ich.rulerToolbar(locale, true) + "');", true); + WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "/toolbar/javascript/ruler.js", "WebDeveloper.Ruler.displayRuler(" + display + ", document, '" + ich.rulerToolbar(locale, true) + "');", true); } }); }; @@ -181,7 +203,7 @@ WebDeveloper.Overlay.Miscellaneous.removeFromHistory = function(href) // Toggles a feature on a tab WebDeveloper.Overlay.Miscellaneous.toggleFeatureOnTab = function(featureItem, tab, scriptCode) { - WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "features/javascript/miscellaneous.js", scriptCode); + WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "/features/javascript/miscellaneous.js", scriptCode); }; // Toggles all links on the page between visited and unvisited @@ -216,6 +238,16 @@ WebDeveloper.Overlay.Miscellaneous.toggleVisitedLinks = function(visited) } } } + + // If marking links as visited + if(visited) + { + WebDeveloper.Common.displayNotification("markAllLinksVisitedResult"); + } + else + { + WebDeveloper.Common.displayNotification("markAllLinksUnvisitedResult"); + } }); } }); diff --git a/source/common/javascript/overlay/options.js b/source/common/javascript/overlay/options.js index 05c6608..ba05dd0 100644 --- a/source/common/javascript/overlay/options.js +++ b/source/common/javascript/overlay/options.js @@ -3,6 +3,24 @@ var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-defi WebDeveloper.Overlay = WebDeveloper.Overlay || {}; WebDeveloper.Overlay.Options = WebDeveloper.Overlay.Options || {}; +$(function() +{ + $("#about").append(WebDeveloper.Locales.getString("aboutMenu")).on("click", WebDeveloper.Overlay.Options.about); + $("#help").append(WebDeveloper.Locales.getString("help")).on("click", WebDeveloper.Overlay.openURL); + $("#options").append(WebDeveloper.Locales.getString("optionsMenu")).on("click", WebDeveloper.Overlay.Options.options); + $("#reset-page").append(WebDeveloper.Locales.getString("resetPage")).on("click", WebDeveloper.Overlay.Options.resetPage); +}); + +// Opens the about page +WebDeveloper.Overlay.Options.about = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("/about/about.html"), tab.index, null, WebDeveloper.Overlay.Options.getAboutLocale()); + WebDeveloper.Overlay.close(); + }); +}; + // Returns the locale for the about feature WebDeveloper.Overlay.Options.getAboutLocale = function() { @@ -13,9 +31,27 @@ WebDeveloper.Overlay.Options.getAboutLocale = function() locale.buildDate = WebDeveloper.Locales.getString("buildDate"); locale.extensionDescription = WebDeveloper.Locales.getString("extensionDescription"); locale.extensionName = WebDeveloper.Locales.getString("extensionName"); - locale.followOnAppNet = WebDeveloper.Locales.getString("followOnAppNet"); locale.followOnTwitter = WebDeveloper.Locales.getString("followOnTwitter"); locale.version = WebDeveloper.Locales.getString("version"); return locale; }; + +// Opens the options +WebDeveloper.Overlay.Options.options = function() +{ + chrome.runtime.openOptionsPage(); + WebDeveloper.Overlay.close(); +}; + +// Resets the page +WebDeveloper.Overlay.Options.resetPage = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + WebDeveloper.Overlay.addScriptToTab(tab, { code: "window.location.reload();" }, function() + { + WebDeveloper.Overlay.close(); + }); + }); +}; diff --git a/source/chrome/javascript/overlay/outline.js b/source/common/javascript/overlay/outline.js similarity index 98% rename from source/chrome/javascript/overlay/outline.js rename to source/common/javascript/overlay/outline.js index 83900ec..45889fe 100644 --- a/source/chrome/javascript/overlay/outline.js +++ b/source/common/javascript/overlay/outline.js @@ -250,7 +250,7 @@ WebDeveloper.Overlay.Outline.outlineTables = function() // Toggles a feature on a tab WebDeveloper.Overlay.Outline.toggleFeatureOnTab = function(featureItem, tab, scriptCode) { - WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "features/javascript/outline.js", scriptCode); + WebDeveloper.Overlay.toggleFeatureOnTab(featureItem, tab, "/features/javascript/outline.js", scriptCode); }; // Toggles whether to show element tag names when outlining diff --git a/source/chrome/javascript/overlay/overlay.js b/source/common/javascript/overlay/overlay.js similarity index 89% rename from source/chrome/javascript/overlay/overlay.js rename to source/common/javascript/overlay/overlay.js index f54a21e..fdb514f 100644 --- a/source/chrome/javascript/overlay/overlay.js +++ b/source/common/javascript/overlay/overlay.js @@ -265,27 +265,46 @@ WebDeveloper.Overlay.openURL = function(event) event.preventDefault(); }; +// Sets a content setting +WebDeveloper.Overlay.setContentSetting = function(settingType, currentSetting, newSetting, menu, message) +{ + chrome.contentSettings[settingType].clear({}, function() + { + chrome.contentSettings[settingType].get({ primaryUrl: "http://*/*" }, function(details) + { + // If the setting is still set to the current setting + if(details.setting == currentSetting) + { + chrome.contentSettings[settingType].set({ primaryPattern: "", setting: newSetting }, function() + { + WebDeveloper.Overlay.updateContentSettingMenu(menu, settingType); + WebDeveloper.Overlay.displayNotification(WebDeveloper.Locales.getString(message)); + }); + } + else + { + WebDeveloper.Overlay.updateContentSettingMenu(menu, settingType); + WebDeveloper.Overlay.displayNotification(WebDeveloper.Locales.getString(message)); + } + }); + }); +}; + // Toggles a content setting WebDeveloper.Overlay.toggleContentSetting = function(settingType, menu, enableMessage, disableMessage) { chrome.contentSettings[settingType].get({ primaryUrl: "http://*/*" }, function(details) { - // If the setting is currently set to allow - if(details.setting == "allow") + var currentSetting = details.setting; + + // If the setting is currently set to block + if(currentSetting == "block") { - chrome.contentSettings[settingType].set({ primaryPattern: "", setting: "block" }, function() - { - WebDeveloper.Overlay.updateContentSettingMenu(menu, settingType); - WebDeveloper.Overlay.displayNotification(WebDeveloper.Locales.getString(disableMessage)); - }); + WebDeveloper.Overlay.setContentSetting(settingType, currentSetting, "allow", menu, enableMessage); } else { - chrome.contentSettings[settingType].clear({}, function() - { - WebDeveloper.Overlay.updateContentSettingMenu(menu, settingType); - WebDeveloper.Overlay.displayNotification(WebDeveloper.Locales.getString(enableMessage)); - }); + WebDeveloper.Overlay.setContentSetting(settingType, currentSetting, "block", menu, disableMessage); } }); }; @@ -330,4 +349,4 @@ WebDeveloper.Overlay.updateContentSettingMenu = function(menu, settingType) } }; -chrome.extension.onMessage.addListener(WebDeveloper.Overlay.message); +chrome.runtime.onMessage.addListener(WebDeveloper.Overlay.message); diff --git a/source/common/javascript/overlay/resize.js b/source/common/javascript/overlay/resize.js index f413de1..f4ba8f8 100644 --- a/source/common/javascript/overlay/resize.js +++ b/source/common/javascript/overlay/resize.js @@ -3,6 +3,100 @@ var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-defi WebDeveloper.Overlay = WebDeveloper.Overlay || {}; WebDeveloper.Overlay.Resize = WebDeveloper.Overlay.Resize || {}; +$(function() +{ + var resizeWindowHeight = $("#resize-window-height"); + var resizeWindowWidth = $("#resize-window-width"); + + $("#display-window-size").append(WebDeveloper.Locales.getString("displayWindowSize")).on("click", WebDeveloper.Overlay.Resize.displayWindowSize); + $("#edit-resize-dimensions").append(WebDeveloper.Locales.getString("editResizeDimensions")).on("click", WebDeveloper.Overlay.Resize.editResizeDimensions); + $("#resize-menu").on("click", ".custom-resize-window", WebDeveloper.Overlay.Resize.customResizeWindow); + $("#resize-window").append(WebDeveloper.Locales.getString("resizeWindowMenu")).on("click", WebDeveloper.Overlay.Resize.displayResizeDialog); + $("#view-responsive-layouts").append(WebDeveloper.Locales.getString("viewResponsiveLayouts")).on("click", WebDeveloper.Overlay.Resize.viewResponsiveLayouts); + + $("#resize-window-cancel").on("click", WebDeveloper.Overlay.Resize.cancelResizeWindow); + $("#resize-window-dialog").on("submit", function(event) { event.preventDefault(); }); + $("#resize-window-submit").on("click", WebDeveloper.Overlay.Resize.submitResizeWindow); + + $("legend", $("#resize-window-dialog")).text(WebDeveloper.Locales.getString("resizeWindow")); + $("#resize-window-cancel").text(WebDeveloper.Locales.getString("cancel")); + $("#resize-window-submit").append(WebDeveloper.Locales.getString("resize")); + $('[for="resize-window-height"]').text(WebDeveloper.Locales.getString("height")); + $('[for="resize-window-width"]').text(WebDeveloper.Locales.getString("width")); + + resizeWindowHeight.attr("placeholder", WebDeveloper.Locales.getString("heightPlaceholder")); + resizeWindowWidth.attr("placeholder", WebDeveloper.Locales.getString("widthPlaceholder")); + resizeWindowHeight.add(resizeWindowWidth).on("keypress", WebDeveloper.Overlay.Resize.resizeWindowKeyPress); + + WebDeveloper.Overlay.Resize.setupCustomResizeOptions(); +}); + +// Cancels resizing the window +WebDeveloper.Overlay.Resize.cancelResizeWindow = function() +{ + $("#resize-window-dialog").slideUp(WebDeveloper.Overlay.animationSpeed, function() + { + $(".tabbable").slideDown(WebDeveloper.Overlay.animationSpeed); + }); +}; + +// Resizes the window to a custom size +WebDeveloper.Overlay.Resize.customResizeWindow = function() +{ + var featureItem = $(this); + + WebDeveloper.Overlay.Resize.resizeWindow(featureItem.data("height"), featureItem.data("width")); +}; + +// Displays the resize dialog +WebDeveloper.Overlay.Resize.displayResizeDialog = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.tabs.sendMessage(tab.id, { type: "get-window-size" }, function(response) + { + var resizeWindowDialog = $("#resize-window-dialog"); + + $("#resize-window-height").val(response.outerHeight); + $("#resize-window-width").val(response.outerWidth).focus(); + + WebDeveloper.Overlay.Resize.resetResizeDialog(resizeWindowDialog); + + $(".tabbable, #confirmation, #notification").slideUp(WebDeveloper.Overlay.animationSpeed, function() + { + resizeWindowDialog.slideDown(WebDeveloper.Overlay.animationSpeed); + }); + }); + } + }); +}; + +// Displays the window size +WebDeveloper.Overlay.Resize.displayWindowSize = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + chrome.tabs.sendMessage(tab.id, { type: "get-window-size" }, function(response) + { + WebDeveloper.Overlay.displayNotification(WebDeveloper.Locales.getFormattedString("displayWindowSizeResult", [response.outerWidth, response.outerHeight, response.innerWidth, response.innerHeight]), "info"); + }); + } + }); +}; + +// Opens the options to edit the resize dimensions +WebDeveloper.Overlay.Resize.editResizeDimensions = function() +{ + chrome.runtime.openOptionsPage(); + WebDeveloper.Overlay.close(); +}; + // Returns the locale for the view responsive layouts feature WebDeveloper.Overlay.Resize.getViewResponsiveLayoutsLocale = function() { @@ -14,3 +108,181 @@ WebDeveloper.Overlay.Resize.getViewResponsiveLayoutsLocale = function() return locale; }; + +// Resets the add cookie dialog +WebDeveloper.Overlay.Resize.resetResizeDialog = function(resizeDialog) +{ + $(".has-error", resizeDialog).removeClass("has-error"); + $(".help-block", resizeDialog).text(""); +}; + +// Resizes the window +WebDeveloper.Overlay.Resize.resizeWindow = function(height, width) +{ + WebDeveloper.Overlay.getSelectedWindow(function(selectedWindow) + { + var size = {}; + + // Set the window state to normal before resizing the window + size.state = "normal"; + + // If the height is not a wildcard + if(height != "*") + { + size.height = parseInt(height, 10); + } + + // If the width is not a wildcard + if(width != "*") + { + size.width = parseInt(width, 10); + } + + chrome.windows.update(selectedWindow.id, size, function() + { + WebDeveloper.Overlay.close(); + }); + }); +}; + +// Handles a key press when resizing the window +WebDeveloper.Overlay.Resize.resizeWindowKeyPress = function(event) +{ + // If the enter key was pressed + if(event.keyCode == 13) + { + WebDeveloper.Overlay.Resize.submitResizeWindow(); + } +}; + +// Sets up the custom resize options +WebDeveloper.Overlay.Resize.setupCustomResizeOptions = function() +{ + var description = null; + var editResizeDimensions = $("#edit-resize-dimensions").closest("li"); + var height = 0; + var resizeOption = null; + var storage = chrome.extension.getBackgroundPage().WebDeveloper.Storage; + var width = 0; + + $(".custom-resize-window", $("#custom-resize-options")).remove(); + + // Loop through the resize options + for(var i = 1, l = storage.getItem("resize_count"); i <= l; i++) + { + description = storage.getItem("resize_" + i + "_description"); + height = storage.getItem("resize_" + i + "_height"); + width = storage.getItem("resize_" + i + "_width"); + + // If the description, height and width are set + if(description && height > 0 && width > 0) + { + resizeOption = {}; + + resizeOption.description = description; + resizeOption.height = height; + resizeOption.width = width; + + editResizeDimensions.before(ich.customResizeOption(resizeOption)); + } + } +}; + +// Resizes the window +WebDeveloper.Overlay.Resize.submitResizeWindow = function() +{ + // If the dialog is valid + if(WebDeveloper.Overlay.Resize.validateResizeDialog()) + { + WebDeveloper.Overlay.Resize.resizeWindow($("#resize-window-height").val(), $("#resize-window-width").val()); + } +}; + +// Returns true if the resize dialog is valid +WebDeveloper.Overlay.Resize.validateResizeDialog = function() +{ + var height = $("#resize-window-height"); + var heightValue = height.val().trim(); + var width = $("#resize-window-width"); + var widthValue = width.val().trim(); + var valid = true; + + WebDeveloper.Overlay.Resize.resetResizeDialog($("#resize-window-dialog")); + + // If the height is not set + if(!heightValue) + { + height.closest(".form-group").addClass("has-error"); + height.closest(".input-group").next(".help-block").text(WebDeveloper.Locales.getString("heightCannotBeEmpty")); + + valid = false; + } + else if(heightValue != "*" && (parseInt(heightValue, 10) != heightValue || heightValue <= 0)) + { + height.closest(".form-group").addClass("has-error"); + height.closest(".input-group").next(".help-block").text(WebDeveloper.Locales.getString("heightNotValid")); + + valid = false; + } + + // If the width is not set + if(!widthValue) + { + width.closest(".form-group").addClass("has-error"); + width.closest(".input-group").next(".help-block").text(WebDeveloper.Locales.getString("widthCannotBeEmpty")); + + valid = false; + } + else if(widthValue != "*" && (parseInt(widthValue, 10) != widthValue || widthValue <= 0)) + { + width.closest(".form-group").addClass("has-error"); + width.closest(".input-group").next(".help-block").text(WebDeveloper.Locales.getString("widthNotValid")); + + valid = false; + } + + return valid; +}; + +// Displays the responsive layouts for the page +WebDeveloper.Overlay.Resize.viewResponsiveLayouts = function() +{ + WebDeveloper.Overlay.getSelectedTab(function(tab) + { + // If the tab is valid + if(WebDeveloper.Overlay.isValidTab(tab)) + { + var data = {}; + var description = null; + var height = null; + var layout = null; + var storage = chrome.extension.getBackgroundPage().WebDeveloper.Storage; + var width = null; + + data.layouts = []; + data.pageURL = tab.url; + + // Loop through the possible responsive options + for(var i = 1, l = storage.getItem("responsive_layout_count"); i <= l; i++) + { + description = storage.getItem("responsive_layout_" + i + "_description"); + height = storage.getItem("responsive_layout_" + i + "_height"); + width = storage.getItem("responsive_layout_" + i + "_width"); + + // If the description, height and width are set + if(description && height > 0 && width > 0) + { + layout = {}; + layout.description = description; + layout.height = height; + layout.width = width; + + data.layouts.push(layout); + } + } + + chrome.extension.getBackgroundPage().WebDeveloper.Background.openGeneratedTab(chrome.extension.getURL("/generated/view-responsive-layouts.html"), tab.index, data, WebDeveloper.Overlay.Resize.getViewResponsiveLayoutsLocale()); + WebDeveloper.Overlay.close(); + } + }); +}; diff --git a/source/chrome/javascript/overlay/tools.js b/source/common/javascript/overlay/tools.js similarity index 90% rename from source/chrome/javascript/overlay/tools.js rename to source/common/javascript/overlay/tools.js index 3e12bc1..e8e3670 100644 --- a/source/chrome/javascript/overlay/tools.js +++ b/source/common/javascript/overlay/tools.js @@ -28,7 +28,8 @@ WebDeveloper.Overlay.Tools.customTool = function() // Opens the options to edit the tools WebDeveloper.Overlay.Tools.editTools = function() { - WebDeveloper.Overlay.openTab(chrome.extension.getURL("options/options.html#tools-tab")); + chrome.runtime.openOptionsPage(); + WebDeveloper.Overlay.close(); }; // Sets up the custom tools @@ -71,7 +72,8 @@ WebDeveloper.Overlay.Tools.validateLocalCSS = function() { chrome.tabs.sendMessage(tab.id, { type: "get-css" }, function(data) { - chrome.extension.getBackgroundPage().WebDeveloper.Background.validateLocalCSS(chrome.extension.getURL("validation/css.html"), tab.index, data); + chrome.extension.getBackgroundPage().WebDeveloper.Background.validateLocalCSS(chrome.extension.getURL("/validation/css.html"), tab.index, data); + WebDeveloper.Overlay.close(); }); } }); @@ -85,7 +87,8 @@ WebDeveloper.Overlay.Tools.validateLocalHTML = function() // If the tab is valid if(WebDeveloper.Overlay.isValidTab(tab)) { - chrome.extension.getBackgroundPage().WebDeveloper.Background.validateLocalHTML(chrome.extension.getURL("validation/html.html"), tab.index, tab.url); + chrome.extension.getBackgroundPage().WebDeveloper.Background.validateLocalHTML(chrome.extension.getURL("/validation/html.html"), tab.index, tab.url); + WebDeveloper.Overlay.close(); } }); }; diff --git a/source/common/javascript/storage/storage.js b/source/common/javascript/storage/storage.js index af66e26..d3291e5 100644 --- a/source/common/javascript/storage/storage.js +++ b/source/common/javascript/storage/storage.js @@ -2,3 +2,183 @@ var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-defi WebDeveloper.Storage = WebDeveloper.Storage || {}; WebDeveloper.Storage.storageId = "web-developer"; + +// Clears the features on a tab +WebDeveloper.Storage.clearTabFeatures = function(tabProperties, tabId, updateBadgeText) +{ + // If there are no tab properties, no status or the status is loading + if(!tabProperties || !tabProperties.status || tabProperties.status == "loading") + { + WebDeveloper.Storage.removeItem(tabId); + + // If the badge text should be updated + if(updateBadgeText) + { + WebDeveloper.Storage.updateBadgeText(tabId); + } + } +}; + +// Returns the list of features on a tab +WebDeveloper.Storage.getFeaturesOnTab = function(tabId) +{ + var featuresOnTab = WebDeveloper.Storage.getItem(tabId); + + // If there are features on the tab + if(featuresOnTab) + { + return featuresOnTab.split(","); + } + + return null; +}; + +// Returns an item +WebDeveloper.Storage.getItem = function(item) +{ + return window.localStorage.getItem(item); +}; + +// Returns true if a feature is on a tab +WebDeveloper.Storage.isFeatureOnTab = function(feature, tab) +{ + var tabId = tab.id; + var featuresOnTab = WebDeveloper.Storage.getItem(tabId); + + // If there are features on the tab + if(featuresOnTab) + { + var featuresOnTabArray = featuresOnTab.split(","); + + // Loop through the features on the tab + for(var i = 0, l = featuresOnTabArray.length; i < l; i++) + { + // If the feature is on the tab + if(featuresOnTabArray[i] == feature) + { + return true; + } + } + } + + return false; +}; + +// Removes an item +WebDeveloper.Storage.removeItem = function(item) +{ + window.localStorage.removeItem(item); +}; + +// Sets an item +WebDeveloper.Storage.setItem = function(item, value) +{ + window.localStorage.setItem(item, value); +}; + +// Sets an item if it is not already set +WebDeveloper.Storage.setItemIfNotSet = function(item, value) +{ + // If the item is not already set + if(!WebDeveloper.Storage.getItem(item)) + { + WebDeveloper.Storage.setItem(item, value); + } +}; + +// Handles a tab being activated +WebDeveloper.Storage.tabActivated = function(tabInfo) +{ + WebDeveloper.Storage.updateBadgeText(tabInfo.tabId); +}; + +// Handles a tab being removed +WebDeveloper.Storage.tabRemoved = function(tabId, properties) +{ + WebDeveloper.Storage.clearTabFeatures(properties, tabId, false); +}; + +// Handles a tab updating +WebDeveloper.Storage.tabUpdated = function(tabId, properties) +{ + WebDeveloper.Storage.clearTabFeatures(properties, tabId, true); +}; + +// Toggles a feature on a tab +WebDeveloper.Storage.toggleFeatureOnTab = function(feature, tab) +{ + var featureTabId = tab.id; + var currentFeaturesOnTab = WebDeveloper.Storage.getItem(featureTabId); + var newFeaturesOnTab = null; + + // If there are features on the tab + if(currentFeaturesOnTab) + { + var featureOnTab = false; + + newFeaturesOnTab = currentFeaturesOnTab.split(","); + + // Loop through the features on the tab + for(var i = 0, l = newFeaturesOnTab.length; i < l; i++) + { + // If the feature is on the tab + if(newFeaturesOnTab[i] == feature) + { + featureOnTab = true; + + newFeaturesOnTab.splice(i, 1); + } + } + + // If the feature is on the tab + if(featureOnTab) + { + newFeaturesOnTab = newFeaturesOnTab.join(","); + } + else + { + newFeaturesOnTab = currentFeaturesOnTab + feature + ","; + } + } + else + { + newFeaturesOnTab = feature + ","; + } + + WebDeveloper.Storage.setItem(featureTabId, newFeaturesOnTab); + + WebDeveloper.Storage.updateBadgeText(featureTabId); +}; + +// Updates the badge text for a tab +WebDeveloper.Storage.updateBadgeText = function(featureTabId) +{ + var badgeText = ""; + var badgeTooltip = "@name@"; + var featuresOnTab = WebDeveloper.Storage.getFeaturesOnTab(featureTabId); + + // If there are features on the tab + if(featuresOnTab) + { + var featureCount = featuresOnTab.length - 1; + var featureDescription = "features"; + + // If there is only one feature count + if(featureCount == 1) + { + featureDescription = "feature"; + } + + badgeText = featureCount.toString(); + badgeTooltip += "\n" + badgeText + " active " + featureDescription + " on this tab"; + } + + chrome.browserAction.setBadgeText({ text: badgeText, tabId: featureTabId }); + chrome.browserAction.setTitle({ title: badgeTooltip, tabId: featureTabId }); +}; + +chrome.tabs.onActivated.addListener(WebDeveloper.Storage.tabActivated); +chrome.tabs.onRemoved.addListener(WebDeveloper.Storage.tabRemoved); +chrome.tabs.onUpdated.addListener(WebDeveloper.Storage.tabUpdated); + +chrome.browserAction.setBadgeBackgroundColor({ color: [0, 200, 0, 255] }); diff --git a/source/chrome/javascript/toolbar/color-picker.js b/source/common/javascript/toolbar/color-picker.js similarity index 94% rename from source/chrome/javascript/toolbar/color-picker.js rename to source/common/javascript/toolbar/color-picker.js index 810d35e..1415127 100644 --- a/source/chrome/javascript/toolbar/color-picker.js +++ b/source/common/javascript/toolbar/color-picker.js @@ -58,7 +58,7 @@ WebDeveloper.ColorPicker.displayColorPicker = function(display, contentDocument, WebDeveloper.ColorPicker.removeColorPicker(contentDocument); } - WebDeveloper.Common.toggleStyleSheet("toolbar/color-picker.css", "web-developer-color-picker-styles", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/toolbar/color-picker.css", "web-developer-color-picker-styles", contentDocument, false); }; // Gets the color @@ -80,7 +80,7 @@ WebDeveloper.ColorPicker.getColor = function(event, type) // If the event target is not the color picker, the color picker is not an ancestor of the event target and the event target is not a scrollbar if(eventTarget != colorPicker && !WebDeveloper.Common.isAncestor(eventTarget, colorPicker) && tagName && tagName.toLowerCase() != "scrollbar") { - chrome.extension.sendMessage({ type: "get-color", x: event.clientX, y: event.clientY, eventType: type }); + chrome.runtime.sendMessage({ type: "get-color", x: event.clientX, y: event.clientY, eventType: type }); } } } diff --git a/source/common/javascript/toolbar/element-ancestors.js b/source/common/javascript/toolbar/element-ancestors.js index 28af7aa..568bd3e 100644 --- a/source/common/javascript/toolbar/element-ancestors.js +++ b/source/common/javascript/toolbar/element-ancestors.js @@ -3,6 +3,41 @@ var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-defi WebDeveloper.ElementAncestors = WebDeveloper.ElementAncestors || {}; WebDeveloper.ElementAncestors.element = null; +// Displays the ancestors of an element +WebDeveloper.ElementAncestors.displayElementAncestors = function(element) +{ + var dashboard = WebDeveloper.Dashboard.getDashboard(WebDeveloper.Common.getContentDocument()); + + // If the dashboard exists + if(dashboard) + { + // If the element is not the dashboard + if(!element.hasAttribute("id") || element.getAttribute("id") != dashboard.getAttribute("id")) + { + var generatedDocument = dashboard.contentDocument; + var dispatchEvent = generatedDocument.createEvent("Events"); + var elementAncestors = generatedDocument.getElementById("current-element-ancestors"); + + WebDeveloper.Common.empty(elementAncestors); + elementAncestors.appendChild(WebDeveloper.ElementAncestors.getAncestorInformation(element, generatedDocument)); + + dispatchEvent.initEvent("web-developer-initialize-ancestors-event", true, false); + generatedDocument.querySelector("#current-element-ancestors .breadcrumb").dispatchEvent(dispatchEvent); + } + } +}; + +// Generates ancestor information for an element +WebDeveloper.ElementAncestors.generateAncestorInformation = function(element, contentDocument) +{ + var ancestorInformation = contentDocument.createElement("div"); + + ancestorInformation.setAttribute("id", "web-developer-ancestors"); + ancestorInformation.appendChild(WebDeveloper.ElementAncestors.getAncestorInformation(element, contentDocument)); + + return ancestorInformation; +}; + // Returns the ancestor information for an element WebDeveloper.ElementAncestors.getAncestorInformation = function(element, contentDocument) { diff --git a/source/common/javascript/toolbar/line-guides.js b/source/common/javascript/toolbar/line-guides.js index a7f7cc6..5920a85 100644 --- a/source/common/javascript/toolbar/line-guides.js +++ b/source/common/javascript/toolbar/line-guides.js @@ -4,6 +4,7 @@ WebDeveloper.LineGuides = WebDeveloper.LineGuides || {}; WebDeveloper.LineGuides.padding = 2; WebDeveloper.LineGuides.selectedlineGuide = null; WebDeveloper.LineGuides.spacing = 98; +WebDeveloper.LineGuides.toolbarDocument = null; // Adds a horizontal line guide WebDeveloper.LineGuides.addHorizontalLineGuide = function() @@ -89,6 +90,18 @@ WebDeveloper.LineGuides.addVerticalLineGuide = function() WebDeveloper.Common.getDocumentBodyElement(contentDocument).appendChild(lineGuide); }; +// Creates the line guides events +WebDeveloper.LineGuides.createEvents = function(contentDocument) +{ + window.WebDeveloperEvents = window.WebDeveloperEvents || {}; + window.WebDeveloperEvents.LineGuides = window.WebDeveloperEvents.LineGuides || {}; + window.WebDeveloperEvents.LineGuides.mouseMove = WebDeveloper.LineGuides.mouseMove; + window.WebDeveloperEvents.LineGuides.resizeDocument = WebDeveloper.LineGuides.resize; + + contentDocument.addEventListener("mousemove", window.WebDeveloperEvents.LineGuides.mouseMove, false); + contentDocument.addEventListener("resize", window.WebDeveloperEvents.LineGuides.resize, false); +}; + // Creates the line guides WebDeveloper.LineGuides.createLineGuides = function() { @@ -96,6 +109,31 @@ WebDeveloper.LineGuides.createLineGuides = function() WebDeveloper.LineGuides.addVerticalLineGuide(); }; +// Creates the line guides toolbar +WebDeveloper.LineGuides.createToolbar = function(contentDocument, toolbarHTML) +{ + var lineGuidesToolbar = contentDocument.createElement("iframe"); + var styleSheet = null; + + lineGuidesToolbar.setAttribute("class", "web-developer-toolbar"); + lineGuidesToolbar.setAttribute("id", "web-developer-line-guides-toolbar"); + + WebDeveloper.Common.getDocumentBodyElement(contentDocument).appendChild(lineGuidesToolbar); + + WebDeveloper.LineGuides.toolbarDocument = lineGuidesToolbar.contentDocument; + styleSheet = WebDeveloper.LineGuides.toolbarDocument.createElement("link"); + + styleSheet.setAttribute("rel", "stylesheet"); + styleSheet.setAttribute("href", WebDeveloper.Common.getChromeURL("toolbar/line-guides-toolbar.css")); + WebDeveloper.Common.getDocumentHeadElement(WebDeveloper.LineGuides.toolbarDocument).appendChild(styleSheet); + + WebDeveloper.Common.getDocumentBodyElement(WebDeveloper.LineGuides.toolbarDocument).innerHTML = toolbarHTML; + + WebDeveloper.LineGuides.toolbarDocument.querySelector("img").setAttribute("src", WebDeveloper.Common.getChromeURL("toolbar/images/logo.png")); + WebDeveloper.LineGuides.toolbarDocument.getElementById("add-horizontal-line-guide").addEventListener("click", WebDeveloper.LineGuides.addHorizontalLineGuide, false); + WebDeveloper.LineGuides.toolbarDocument.getElementById("add-vertical-line-guide").addEventListener("click", WebDeveloper.LineGuides.addVerticalLineGuide, false); +}; + // Displays line guides WebDeveloper.LineGuides.displayLineGuides = function(display, contentDocument, toolbarHTML) { @@ -113,7 +151,13 @@ WebDeveloper.LineGuides.displayLineGuides = function(display, contentDocument, t WebDeveloper.LineGuides.removeToolbar(contentDocument); } - WebDeveloper.Common.toggleStyleSheet("toolbar/line-guides.css", "web-developer-display-line-guides", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/toolbar/line-guides.css", "web-developer-display-line-guides", contentDocument, false); +}; + +// Returns the line guides color +WebDeveloper.LineGuides.getColor = function() +{ + return "#cc0000"; }; // Returns an array containing the horizontal line guide positions @@ -177,6 +221,12 @@ WebDeveloper.LineGuides.getVerticalLineGuidePositions = function(contentDocument return WebDeveloper.LineGuides.getLineGuidePositions(contentDocument, "vertical"); }; +// Hides the line guide information +WebDeveloper.LineGuides.hideInformation = function() +{ + WebDeveloper.Common.removeClass(WebDeveloper.Common.getDocumentBodyElement(WebDeveloper.LineGuides.toolbarDocument), "display-information"); +}; + // Handles the mouse down event on a line guide WebDeveloper.LineGuides.mouseDown = function(event) { @@ -261,12 +311,34 @@ WebDeveloper.LineGuides.mouseUp = function() WebDeveloper.LineGuides.selectedlineGuide = null; }; +// Removes the line guides events +WebDeveloper.LineGuides.removeEvents = function(contentDocument) +{ + contentDocument.removeEventListener("mousemove", window.WebDeveloperEvents.LineGuides.mouseMove, false); + contentDocument.removeEventListener("resize", window.WebDeveloperEvents.LineGuides.resize, false); + + window.WebDeveloperEvents.LineGuides = null; +}; + // Removes the line guides WebDeveloper.LineGuides.removeLineGuides = function(contentDocument) { WebDeveloper.Common.removeMatchingElements("#web-developer-line-guide-information, .web-developer-line-guide", contentDocument); }; +// Removes the line guides toolbar +WebDeveloper.LineGuides.removeToolbar = function(contentDocument) +{ + // If the toolbar document is set + if(WebDeveloper.LineGuides.toolbarDocument) + { + WebDeveloper.LineGuides.toolbarDocument.getElementById("add-horizontal-line-guide").removeEventListener("click", WebDeveloper.LineGuides.addHorizontalLineGuide, false); + WebDeveloper.LineGuides.toolbarDocument.getElementById("add-vertical-line-guide").removeEventListener("click", WebDeveloper.LineGuides.addVerticalLineGuide, false); + } + + WebDeveloper.Common.removeMatchingElements("#web-developer-line-guides-toolbar", contentDocument); +}; + // Handles the resize event on the window WebDeveloper.LineGuides.resize = function() { @@ -317,6 +389,16 @@ WebDeveloper.LineGuides.sizeLineGuide = function(lineGuide, contentDocument, con } }; +// Updates the line guide information +WebDeveloper.LineGuides.updateInformation = function(position, previousPosition, nextPosition) +{ + WebDeveloper.LineGuides.toolbarDocument.getElementById("line-guide-position").textContent = position + "px"; + WebDeveloper.LineGuides.toolbarDocument.getElementById("next-line-guide-position").textContent = nextPosition + "px"; + WebDeveloper.LineGuides.toolbarDocument.getElementById("previous-line-guide-position").textContent = previousPosition + "px"; + + WebDeveloper.Common.addClass(WebDeveloper.Common.getDocumentBodyElement(WebDeveloper.LineGuides.toolbarDocument), "display-information"); +}; + // Updates the line guide information WebDeveloper.LineGuides.updateLineGuideInformation = function(lineGuide) { @@ -351,4 +433,3 @@ WebDeveloper.LineGuides.updateLineGuideInformation = function(lineGuide) WebDeveloper.LineGuides.updateInformation(position, previousPosition, nextPosition); } }; - diff --git a/source/common/javascript/toolbar/ruler.js b/source/common/javascript/toolbar/ruler.js index 1f0ef98..4a4b154 100644 --- a/source/common/javascript/toolbar/ruler.js +++ b/source/common/javascript/toolbar/ruler.js @@ -1,6 +1,23 @@ var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define -WebDeveloper.Ruler = WebDeveloper.Ruler || {}; +WebDeveloper.Ruler = WebDeveloper.Ruler || {}; +WebDeveloper.Ruler.toolbarDocument = null; + +// Creates the ruler events +WebDeveloper.Ruler.createEvents = function(contentDocument) +{ + window.WebDeveloperEvents = window.WebDeveloperEvents || {}; + window.WebDeveloperEvents.Ruler = window.WebDeveloperEvents.Ruler || {}; + window.WebDeveloperEvents.Ruler.mouseDown = WebDeveloper.Ruler.mouseDown; + window.WebDeveloperEvents.Ruler.mouseMove = WebDeveloper.Ruler.mouseMove; + window.WebDeveloperEvents.Ruler.mouseUp = WebDeveloper.Ruler.mouseUp; + window.WebDeveloperEvents.Ruler.resizeDocument = WebDeveloper.Ruler.resizeDocument; + + contentDocument.addEventListener("mousedown", window.WebDeveloperEvents.Ruler.mouseDown, true); + contentDocument.addEventListener("mousemove", window.WebDeveloperEvents.Ruler.mouseMove, false); + contentDocument.addEventListener("mouseup", window.WebDeveloperEvents.Ruler.mouseUp, true); + contentDocument.addEventListener("resize", window.WebDeveloperEvents.Ruler.resizeDocument, false); +}; // Creates the ruler WebDeveloper.Ruler.createRuler = function(contentDocument) @@ -71,11 +88,36 @@ WebDeveloper.Ruler.createRuler = function(contentDocument) }, 100); }; +// Creates the ruler toolbar +WebDeveloper.Ruler.createToolbar = function(contentDocument, toolbarHTML) +{ + var rulerToolbar = contentDocument.createElement("iframe"); + var styleSheet = null; + + rulerToolbar.setAttribute("id", "web-developer-ruler-toolbar"); + rulerToolbar.setAttribute("class", "web-developer-toolbar"); + + WebDeveloper.Common.getDocumentBodyElement(contentDocument).appendChild(rulerToolbar); + + WebDeveloper.Ruler.toolbarDocument = rulerToolbar.contentDocument; + styleSheet = WebDeveloper.Ruler.toolbarDocument.createElement("link"); + + styleSheet.setAttribute("rel", "stylesheet"); + styleSheet.setAttribute("href", WebDeveloper.Common.getChromeURL("toolbar/ruler-toolbar.css")); + WebDeveloper.Common.getDocumentHeadElement(WebDeveloper.Ruler.toolbarDocument).appendChild(styleSheet); + + WebDeveloper.Common.getDocumentBodyElement(WebDeveloper.Ruler.toolbarDocument).innerHTML = toolbarHTML; + + WebDeveloper.Ruler.toolbarDocument.querySelector("img").setAttribute("src", WebDeveloper.Common.getChromeURL("toolbar/images/logo.png")); + WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-height").addEventListener("change", WebDeveloper.Ruler.updateHeight, false); + WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-width").addEventListener("change", WebDeveloper.Ruler.updateWidth, false); +}; + // Displays the ruler WebDeveloper.Ruler.displayRuler = function(display, contentDocument, toolbarHTML) { // Run first so that the size calculations are accurate on setup - WebDeveloper.Common.toggleStyleSheet("toolbar/ruler.css", "web-developer-ruler-styles", contentDocument, false); + WebDeveloper.Common.toggleStyleSheet("/toolbar/ruler.css", "web-developer-ruler-styles", contentDocument, false); // If displaying the ruler if(display) @@ -313,12 +355,36 @@ WebDeveloper.Ruler.mouseUp = function(event) } }; +// Removes the ruler events +WebDeveloper.Ruler.removeEvents = function(contentDocument) +{ + contentDocument.removeEventListener("mousedown", window.WebDeveloperEvents.Ruler.mouseDown, true); + contentDocument.removeEventListener("mousemove", window.WebDeveloperEvents.Ruler.mouseMove, false); + contentDocument.removeEventListener("mouseup", window.WebDeveloperEvents.Ruler.mouseUp, true); + contentDocument.removeEventListener("resize", window.WebDeveloperEvents.Ruler.resizeDocument, false); + + window.WebDeveloperEvents.Ruler = null; +}; + // Removes the ruler WebDeveloper.Ruler.removeRuler = function(contentDocument) { WebDeveloper.Common.removeMatchingElements("#web-developer-ruler-container", contentDocument); }; +// Removes the ruler toolbar +WebDeveloper.Ruler.removeToolbar = function(contentDocument) +{ + // If the toolbar document is set + if(WebDeveloper.Ruler.toolbarDocument) + { + WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-height").removeEventListener("change", WebDeveloper.Ruler.updateHeight, false); + WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-width").removeEventListener("change", WebDeveloper.Ruler.updateWidth, false); + } + + WebDeveloper.Common.removeMatchingElements("#web-developer-ruler-toolbar", contentDocument); +}; + // Resets the ruler WebDeveloper.Ruler.reset = function() { @@ -398,3 +464,72 @@ WebDeveloper.Ruler.resizeDocument = function() WebDeveloper.Ruler.resizeContainer(); WebDeveloper.Ruler.resizeBackgrounds(); }; + +// Updates the ruler height +WebDeveloper.Ruler.updateHeight = function() +{ + var height = WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-height").value.replace(/px/gi, ""); + + // If the height is valid + if(height && parseInt(height, 10) == height && height > 0) + { + height = parseInt(height, 10); + WebDeveloper.Ruler.ruler.style.height = height - 2 + "px"; + WebDeveloper.Ruler.endY = WebDeveloper.Ruler.startY + height; + + WebDeveloper.Ruler.resizeBackgrounds(); + WebDeveloper.Ruler.updateInformation(); + } +}; + +// Updates the ruler information +WebDeveloper.Ruler.updateInformation = function() +{ + // If the ruler is set + if(WebDeveloper.Ruler.ruler) + { + WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-height").value = WebDeveloper.Ruler.ruler.offsetHeight + "px"; + WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-width").value = WebDeveloper.Ruler.ruler.offsetWidth + "px"; + + // If the end x position is greater than the start x position + if(WebDeveloper.Ruler.endX > WebDeveloper.Ruler.startX) + { + WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-end-x").textContent = WebDeveloper.Ruler.endX + 2 + "px"; + WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-start-x").textContent = WebDeveloper.Ruler.startX + "px"; + } + else + { + WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-end-x").textContent = WebDeveloper.Ruler.endX + "px"; + WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-start-x").textContent = WebDeveloper.Ruler.startX + 2 + "px"; + } + + // If the end y position is greater than the start y position + if(WebDeveloper.Ruler.endY > WebDeveloper.Ruler.startY) + { + WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-end-y").textContent = WebDeveloper.Ruler.endY + 2 + "px"; + WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-start-y").textContent = WebDeveloper.Ruler.startY + "px"; + } + else + { + WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-end-y").textContent = WebDeveloper.Ruler.endY + "px"; + WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-start-y").textContent = WebDeveloper.Ruler.startY + 2 + "px"; + } + } +}; + +// Updates the ruler width +WebDeveloper.Ruler.updateWidth = function() +{ + var width = WebDeveloper.Ruler.toolbarDocument.getElementById("web-developer-ruler-width").value.replace(/px/gi, ""); + + // If the width is valid + if(width && parseInt(width, 10) == width && width > 0) + { + width = parseInt(width, 10); + WebDeveloper.Ruler.ruler.style.width = width - 2 + "px"; + WebDeveloper.Ruler.endX = WebDeveloper.Ruler.startX + width; + + WebDeveloper.Ruler.resizeBackgrounds(); + WebDeveloper.Ruler.updateInformation(); + } +}; diff --git a/source/chrome/javascript/upgrade/upgrade.js b/source/common/javascript/upgrade/upgrade.js similarity index 89% rename from source/chrome/javascript/upgrade/upgrade.js rename to source/common/javascript/upgrade/upgrade.js index b6bdcae..25c0e51 100644 --- a/source/chrome/javascript/upgrade/upgrade.js +++ b/source/common/javascript/upgrade/upgrade.js @@ -31,6 +31,20 @@ WebDeveloper.Upgrade.fixContentSettings = function() } }; +// Migrates any legacy settings +WebDeveloper.Upgrade.migrateLegacySettings = function() +{ + // Loop through the legacy settings + for(var i = 0, l = window.localStorage.length; i < l; i++) + { + var key = window.localStorage.key(i); + + WebDeveloper.Storage.setItem(key, window.localStorage.getItem(key)); + } + + // window.localStorage.clear(); +}; + // Migrates the tools WebDeveloper.Upgrade.migrateTools = function() { @@ -52,7 +66,13 @@ WebDeveloper.Upgrade.migrateTools = function() // Opens the upgrade URL WebDeveloper.Upgrade.openUpgradeURL = function(version) { - chrome.tabs.create({ url: "@url@/@browser@/installed/" + version + "/" }); + chrome.tabs.create({ url: "@url@@browser@/installed/" + version + "/" }); +}; + +// Removes any deleted settings +WebDeveloper.Upgrade.removeDeletedSettings = function() +{ + WebDeveloper.Storage.removeItem("icon_color"); }; // Sets up the default options @@ -111,24 +131,20 @@ WebDeveloper.Upgrade.setupDefaultOptions = function() // Upgrades the extension WebDeveloper.Upgrade.upgrade = function() { - var contentSettingsVersion = "0.4.8"; - var previousVersion = WebDeveloper.Storage.getItem("version"); + var previousVersion = WebDeveloper.Storage.getItem("version"); // If the versions do not match if(previousVersion != "@version@") { WebDeveloper.Storage.setItem("version", "@version@"); WebDeveloper.Upgrade.openUpgradeURL("@version@"); - WebDeveloper.Upgrade.migrateTools(); - } - // If this is the content settings version - if(contentSettingsVersion == "@version@") - { WebDeveloper.Upgrade.fixContentSettings(); + // WebDeveloper.Upgrade.migrateLegacySettings(); + WebDeveloper.Upgrade.migrateTools(); + WebDeveloper.Upgrade.removeDeletedSettings(); + WebDeveloper.Upgrade.setupDefaultOptions(); } - - WebDeveloper.Upgrade.setupDefaultOptions(); }; WebDeveloper.Upgrade.upgrade(); diff --git a/source/chrome/javascript/validation/css.js b/source/common/javascript/validation/css.js similarity index 100% rename from source/chrome/javascript/validation/css.js rename to source/common/javascript/validation/css.js diff --git a/source/chrome/javascript/validation/html.js b/source/common/javascript/validation/html.js similarity index 100% rename from source/chrome/javascript/validation/html.js rename to source/common/javascript/validation/html.js diff --git a/source/chrome/locales/en_US/messages.json b/source/common/locales/en_US/messages.json similarity index 93% rename from source/chrome/locales/en_US/messages.json rename to source/common/locales/en_US/messages.json index 880dbd1..bbc7a42 100644 --- a/source/chrome/locales/en_US/messages.json +++ b/source/common/locales/en_US/messages.json @@ -24,6 +24,7 @@ "dark": { "message": "Dark" }, "dashboard": { "message": "Dashboard" }, "delete": { "message": "Delete" }, + "depth": { "message": "Depth" }, "description": { "message": "Description" }, "disable": { "message": "Disable" }, "documents": { "message": "Documents" }, @@ -223,8 +224,12 @@ "buildDate": { "message": "Build Date" }, "cannotEdit": { "message": "Cannot edit" }, "cannotEditHTTPOnlyCookies": { "message": "HttpOnly cookies cannot be edited." }, - "cannotEditLocalhostCookies": { "message": "Cookies on a localhost domain cannot be edited. More information" }, - "chromeExtensionGalleryError": { "message": "does not work on the Chrome Extension Gallery. More information" }, + "cannotEditLocalhostCookies": { "message": "Cookies on a localhost domain cannot be edited. More information" }, + "checkAllCheckboxesSingleResult": { "message": "1 checkbox checked." }, + "checkAllCheckboxesMultipleResult": { "message": "$count$ checkboxes checked.", "placeholders": { "count": { "content": "$1" } } }, + "chromeExtensionGalleryError": { "message": "does not work on the Chrome Extension Gallery. More information" }, + "clearCacheConfirmation": { "message": "Are you sure you want to clear the cache?" }, + "clearCacheResult": { "message": "The cache has been cleared." }, "clearFormFieldsSingleResult": { "message": "Cleared form fields in 1 form." }, "clearFormFieldsMultipleResult": { "message": "Cleared form fields in $count$ forms.", "placeholders": { "count": { "content": "$1" } } }, "clearHistoryConfirmation": { "message": "Are you sure you want to clear the history?" }, @@ -272,6 +277,8 @@ "disableNotificationsResult": { "message": "Notifications have been disabled." }, "disablePluginsResult": { "message": "Plugins have been disabled." }, "disablePopupsResult": { "message": "Popups have been disabled." }, + "displayHiddenElementsSingleResult": { "message": "1 hidden element displayed." }, + "displayHiddenElementsMultipleResult": { "message": "$count$ hidden elements displayed.", "placeholders": { "count": { "content": "$1" } } }, "displayPasswordsSingleResult": { "message": "1 password displayed." }, "displayPasswordsMultipleResult": { "message": "$count$ passwords displayed.", "placeholders": { "count": { "content": "$1" } } }, "displayWindowSizeResult": { "message": "Window: $outerWidth$px x $outerHeight$px     Viewport: $innerWidth$px x $innerHeight$px", "placeholders": { "outerWidth": { "content": "$1" }, "outerHeight": { "content": "$2" }, "innerWidth": { "content": "$3" }, "innerHeight": { "content": "$4" } } }, @@ -300,12 +307,11 @@ "expiresCannotBeEmpty": { "message": "The expires date cannot be empty if this is not a session cookie." }, "expiresNotValid": { "message": "The expires date is not a valid date." }, "expiresPlaceholder": { "message": "Enter the expires date" }, - "followOnAppNet": { "message": "Follow on App.net" }, "followOnTwitter": { "message": "Follow on Twitter" }, "heightCannotBeEmpty": { "message": "The height cannot be empty." }, "heightNotValid": { "message": "The height is not valid." }, "hostCannotBeEmpty": { "message": "The host cannot be empty." }, - "hostCannotBeLocalhost": { "message": "cannot add cookies on a localhost domain. More information" }, + "hostCannotBeLocalhost": { "message": "cannot add cookies on a localhost domain. More information" }, "hostPlaceholder": { "message": "Enter the host" }, "hoverColor": { "message": "Hover Color:" }, "httpOnly": { "message": "HttpOnly" }, @@ -314,8 +320,12 @@ "linkInformation": { "message": "Link Information" }, "makeFormFieldsWritableSingleResult": { "message": "1 form field made writable." }, "makeFormFieldsWritableMultipleResult": { "message": "$count$ form fields made writable.", "placeholders": { "count": { "content": "$1" } } }, + "makeFramesResizableSingleResult": { "message": "1 frame made resizable." }, + "makeFramesResizableMultipleResult": { "message": "$count$ frames made resizable.", "placeholders": { "count": { "content": "$1" } } }, "makeImagesFullSizeSingleResult": { "message": "1 image made full size." }, "makeImagesFullSizeMultipleResult": { "message": "$count$ images made full size.", "placeholders": { "count": { "content": "$1" } } }, + "markAllLinksUnvisitedResult": { "message": "All links have been marked unvisited." }, + "markAllLinksVisitedResult": { "message": "All links have been marked visited." }, "maximumLength": { "message": "Maximum Length" }, "metaTag": { "message": "meta tag" }, "metaTags": { "message": "Meta Tags" }, @@ -330,9 +340,9 @@ "populateFormFieldsMultipleResult": { "message": "$count$ form fields populated.", "placeholders": { "count": { "content": "$1" } } }, "positionLabel": { "message": "Position =" }, "previousPosition": { "message": "Previous Position =" }, - "reloadImagesResult": { "message": "The images have been reloaded." }, + "reloadImagesResult": { "message": "All images have been reloaded." }, "reloadLayouts": { "message": "Reload Layouts" }, - "reloadLinkedStyleSheetsResult": { "message": "The linked style sheets have been reloaded." }, + "reloadLinkedStyleSheetsResult": { "message": "All linked style sheets have been reloaded." }, "removeFormValidationMultipleResult": { "message": "Removed validation from $count$ form fields.", "placeholders": { "count": { "content": "$1" } } }, "removeFormValidationSingleResult": { "message": "Removed validation from 1 form field." }, "removeMaximumLengthsSingleResult": { "message": "Removed maximum length from 1 form field." }, @@ -347,6 +357,8 @@ "sessionCookie": { "message": "Session cookie" }, "startPositionX": { "message": "Start Position: X =" }, "syntaxHighlighting": { "message": "Syntax Highlighting" }, + "uncheckAllCheckboxesSingleResult": { "message": "1 checkbox unchecked." }, + "uncheckAllCheckboxesMultipleResult": { "message": "$count$ checkboxes unchecked.", "placeholders": { "count": { "content": "$1" } } }, "undoBeautifyJavaScript": { "message": "Undo beautify JavaScript" }, "urlCannotBeEmpty": { "message": "The URL cannot be empty." }, "valuePlaceholder": { "message": "Enter the value" }, @@ -365,7 +377,6 @@ "deleteTool": { "message": "Delete Tool" }, "deleteToolConfirmation": { "message": "Are you sure you want to delete the '$option$' tool?", "placeholders": { "option": { "content": "$1" } } }, "descriptionPlaceholder": { "message": "Enter a description" }, - "displayExtensionIconColor": { "message": "Display the extension icon in color" }, "displayOverlayWith": { "message": "Display the overlay with" }, "dragDropReorder": { "message": "Drag and drop to re-order." }, "editResizeOption": { "message": "Edit Resize Option" }, diff --git a/source/common/style-sheets/about/about.css b/source/common/style-sheets/about/about.css index 4500bfa..41d164f 100644 --- a/source/common/style-sheets/about/about.css +++ b/source/common/style-sheets/about/about.css @@ -1,4 +1,4 @@ -h1 { background: url(@common.prefix@/common/images/logos/64.png) no-repeat 0 0; min-height: 64px; padding-left: 75px; } +h1 { background: url(/common/images/logos/64.png) no-repeat 0 0; min-height: 64px; padding-left: 75px; } h2 { font-size: 21px; line-height: 1; margin: 0; } p { margin-bottom: 25px; } .btn-dark { background-color: #333; border-color: #111; color: #fff; } @@ -7,5 +7,5 @@ p { margin-bottom: 25px; } @media (-webkit-min-device-pixel-ratio: 1.5), (min--moz-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5) { - h1 { background-image: url(@common.prefix@/common/images/logos/128.png); background-size: 64px 64px; } + h1 { background-image: url(/common/images/logos/128.png); background-size: 64px 64px; } } diff --git a/source/common/style-sheets/common/bootstrap/bootstrap.css.map b/source/common/style-sheets/common/bootstrap/bootstrap.css.map new file mode 100755 index 0000000..f010c82 --- /dev/null +++ b/source/common/style-sheets/common/bootstrap/bootstrap.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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AW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;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ukDH;AexkDC;EACE,oBAAA;Cf0kDH;Ae3kDC;EACE,WAAA;Cf6kDH;Ae9kDC;EACE,oBAAA;CfglDH;AejlDC;EACE,mBAAA;CfmlDH;Ae/kDC;EACE,YAAA;CfilDH;AejmDC;EACE,WAAA;CfmmDH;AepmDC;EACE,mBAAA;CfsmDH;AevmDC;EACE,mBAAA;CfymDH;Ae1mDC;EACE,UAAA;Cf4mDH;Ae7mDC;EACE,mBAAA;Cf+mDH;AehnDC;EACE,mBAAA;CfknDH;AennDC;EACE,UAAA;CfqnDH;AetnDC;EACE,mBAAA;CfwnDH;AeznDC;EACE,mBAAA;Cf2nDH;Ae5nDC;EACE,UAAA;Cf8nDH;Ae/nDC;EACE,mBAAA;CfioDH;AeloDC;EACE,kBAAA;CfooDH;AehoDC;EACE,WAAA;CfkoDH;AepnDC;EACE,kBAAA;CfsnDH;AevnDC;EACE,0BAAA;CfynDH;Ae1nDC;EACE,0BAAA;Cf4nDH;Ae7nDC;EACE,iBAAA;Cf+nDH;AehoDC;EACE,0BAAA;CfkoDH;AenoDC;EACE,0BAAA;CfqoDH;AetoDC;EACE,iBAAA;CfwoDH;AezoDC;EACE,0BAAA;Cf2oDH;Ae5oDC;EACE,0BAAA;Cf8oDH;Ae/oDC;EACE,iBAAA;CfipDH;AelpDC;EACE,0BAAA;CfopDH;AerpDC;EACE,yBAAA;CfupDH;AexpDC;EACE,gBAAA;Cf0pDH;Aa1pDD;EElCI;IACE,YAAA;Gf+rDH;EexrDD;IACE,YAAA;Gf0rDD;Ee3rDD;IACE,oBAAA;Gf6rDD;Ee9rDD;IACE,oBAAA;GfgsDD;EejsDD;IACE,WAAA;GfmsDD;EepsDD;IACE,oBAAA;GfssDD;EevsDD;IACE,oBAAA;GfysDD;Ee1sDD;IACE,WAAA;Gf4sDD;Ee7sDD;IACE,oBAAA;Gf+sDD;EehtDD;IACE,oBAAA;GfktDD;EentDD;IACE,WAAA;GfqtDD;EettDD;IACE,oBAAA;GfwtDD;EeztDD;IACE,mBAAA;Gf2tDD;Ee7sDD;IACE,YAAA;Gf+sDD;EehtDD;IACE,oBAAA;GfktDD;EentDD;IACE,oBAAA;GfqtDD;EettDD;IACE,WAAA;GfwtDD;EeztDD;IACE,oBAAA;Gf2tDD;Ee5tDD;IACE,oBAAA;Gf8tDD;Ee/tDD;IACE,WAAA;GfiuDD;EeluDD;IACE,oBAAA;GfouDD;EeruDD;IACE,oBAAA;GfuuDD;EexuDD;IACE,WAAA;Gf0uDD;Ee3uDD;IACE,oBAAA;Gf6uDD;Ee9uDD;IACE,mBAAA;GfgvDD;Ee5uDD;IACE,YAAA;Gf8uDD;Ee9vDD;IACE,WAAA;GfgwDD;EejwDD;IACE,mBAAA;GfmwDD;EepwDD;IACE,mBAAA;GfswDD;EevwDD;IACE,UAAA;GfywDD;Ee1wDD;IACE,mBAAA;Gf4wDD;Ee7wDD;IACE,mBAAA;Gf+wDD;EehxDD;IACE,UAAA;GfkxDD;EenxDD;IACE,mBAAA;GfqxDD;EetxDD;IACE,mBAAA;GfwxDD;EezxDD;IACE,UAAA;Gf2xDD;Ee5xDD;IACE,mBAAA;Gf8xDD;Ee/xDD;IACE,kBAAA;GfiyDD;Ee7xDD;IACE,WAAA;Gf+xDD;EejxDD;IACE,kBAAA;GfmxDD;EepxDD;IACE,0BAAA;GfsxDD;EevxDD;IACE,0BAAA;GfyxDD;Ee1xDD;IACE,iBAAA;Gf4xDD;Ee7xDD;IACE,0BAAA;Gf+xDD;EehyDD;IACE,0BAAA;GfkyDD;EenyDD;IACE,iBAAA;GfqyDD;EetyDD;IACE,0BAAA;GfwyDD;EezyDD;IACE,0BAAA;Gf2yDD;Ee5yDD;IACE,iBAAA;Gf8yDD;Ee/yDD;IACE,0BAAA;GfizDD;EelzDD;IACE,yBAAA;GfozDD;EerzDD;IACE,gBAAA;GfuzDD;CACF;Aa/yDD;EE3CI;IACE,YAAA;Gf61DH;Eet1DD;IACE,YAAA;Gfw1DD;Eez1DD;IACE,oBAAA;Gf21DD;Ee51DD;IACE,oBAAA;Gf81DD;Ee/1DD;IACE,WAAA;Gfi2DD;Eel2DD;IACE,oBAAA;Gfo2DD;Eer2DD;IACE,oBAAA;Gfu2DD;Eex2DD;IACE,WAAA;Gf02DD;Ee32DD;IACE,oBAAA;Gf62DD;Ee92DD;IACE,oBAAA;Gfg3DD;Eej3DD;IACE,WAAA;Gfm3DD;Eep3DD;IACE,oBAAA;Gfs3DD;Eev3DD;IACE,mBAAA;Gfy3DD;Ee32DD;IACE,YAAA;Gf62DD;Ee92DD;IACE,oBAAA;Gfg3DD;Eej3DD;IACE,oBAAA;Gfm3DD;Eep3DD;IACE,WAAA;Gfs3DD;Eev3DD;IACE,oBAAA;Gfy3DD;Ee13DD;IACE,oBAAA;Gf43DD;Ee73DD;IACE,WAAA;Gf+3DD;Eeh4DD;IACE,oBAAA;Gfk4DD;Een4DD;IACE,oBAAA;Gfq4DD;Eet4DD;IACE,WAAA;Gfw4DD;Eez4DD;IACE,oBAAA;Gf24DD;Ee54DD;IACE,mBAAA;Gf84DD;Ee14DD;IACE,YAAA;Gf44DD;Ee55DD;IACE,WAAA;Gf85DD;Ee/5DD;IACE,mBAAA;Gfi6DD;Eel6DD;IACE,mBAAA;Gfo6DD;Eer6DD;IACE,UAAA;Gfu6DD;Eex6DD;IACE,mBAAA;Gf06DD;Ee36DD;IACE,mBAAA;Gf66DD;Ee96DD;IACE,UAAA;Gfg7DD;Eej7DD;IACE,mBAAA;Gfm7DD;Eep7DD;IACE,mBAAA;Gfs7DD;Eev7DD;IACE,UAAA;Gfy7DD;Ee17DD;IACE,mBAAA;Gf47DD;Ee77DD;IACE,kBAAA;Gf+7DD;Ee37DD;IACE,WAAA;Gf67DD;Ee/6DD;IACE,kBAAA;Gfi7DD;Eel7DD;IACE,0BAAA;Gfo7DD;Eer7DD;IACE,0BAAA;Gfu7DD;Eex7DD;IACE,iBAAA;Gf07DD;Ee37DD;IACE,0BAAA;Gf67DD;Ee97DD;IACE,0BAAA;Gfg8DD;Eej8DD;IACE,iBAAA;Gfm8DD;Eep8DD;IACE,0BAAA;Gfs8DD;Eev8DD;IACE,0BAAA;Gfy8DD;Ee18DD;IACE,iBAAA;Gf48DD;Ee78DD;IACE,0BAAA;Gf+8DD;Eeh9DD;IACE,yBAAA;Gfk9DD;Een9DD;IACE,gBAAA;Gfq9DD;CACF;Aa18DD;EE9CI;IACE,YAAA;Gf2/DH;Eep/DD;IACE,YAAA;Gfs/DD;Eev/DD;IACE,oBAAA;Gfy/DD;Ee1/DD;IACE,oBAAA;Gf4/DD;Ee7/DD;IACE,WAAA;Gf+/DD;EehgED;IACE,oBAAA;GfkgED;EengED;IACE,oBAAA;GfqgED;EetgED;IACE,WAAA;GfwgED;EezgED;IACE,oBAAA;Gf2gED;Ee5gED;IACE,oBAAA;Gf8gED;Ee/gED;IACE,WAAA;GfihED;EelhED;IACE,oBAAA;GfohED;EerhED;IACE,mBAAA;GfuhED;EezgED;IACE,YAAA;Gf2gED;Ee5gED;IACE,oBAAA;Gf8gED;Ee/gED;IACE,oBAAA;GfihED;EelhED;IACE,WAAA;GfohED;EerhED;IACE,oBAAA;GfuhED;EexhED;IACE,oBAAA;Gf0hED;Ee3hED;IACE,WAAA;Gf6hED;Ee9hED;IACE,oBAAA;GfgiED;EejiED;IACE,oBAAA;GfmiED;EepiED;IACE,WAAA;GfsiED;EeviED;IACE,oBAAA;GfyiED;Ee1iED;IACE,mBAAA;Gf4iED;EexiED;IACE,YAAA;Gf0iED;Ee1jED;IACE,WAAA;Gf4jED;Ee7jED;IACE,mBAAA;Gf+jED;EehkED;IACE,mBAAA;GfkkED;EenkED;IACE,UAAA;GfqkED;EetkED;IACE,mBAAA;GfwkED;EezkED;IACE,mBAAA;Gf2kED;Ee5kED;IACE,UAAA;Gf8kED;Ee/kED;IACE,mBAAA;GfilED;EellED;IACE,mBAAA;GfolED;EerlED;IACE,UAAA;GfulED;EexlED;IACE,mBAAA;Gf0lED;Ee3lED;IACE,kBAAA;Gf6lED;EezlED;IACE,WAAA;Gf2lED;Ee7kED;IACE,kBAAA;Gf+kED;EehlED;IACE,0BAAA;GfklED;EenlED;IACE,0BAAA;GfqlED;EetlED;IACE,iBAAA;GfwlED;EezlED;IACE,0BAAA;Gf2lED;Ee5lED;IACE,0BAAA;Gf8lED;Ee/lED;IACE,iBAAA;GfimED;EelmED;IACE,0BAAA;GfomED;EermED;IACE,0BAAA;GfumED;EexmED;IACE,iBAAA;Gf0mED;Ee3mED;IACE,0BAAA;Gf6mED;Ee9mED;IACE,yBAAA;GfgnED;EejnED;IACE,gBAAA;GfmnED;CACF;AgBvrED;EACE,8BAAA;ChByrED;AgBvrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChByrED;AgBvrED;EACE,iBAAA;ChByrED;AgBnrED;EACE,YAAA;EACA,gBAAA;EACA,oBAAA;ChBqrED;AgBxrED;;;;;;EAWQ,aAAA;EACA,wBAAA;EACA,oBAAA;EACA,2BAAA;ChBqrEP;AgBnsED;EAoBI,uBAAA;EACA,8BAAA;ChBkrEH;AgBvsED;;;;;;EA8BQ,cAAA;ChBirEP;AgB/sED;EAoCI,2BAAA;ChB8qEH;AgBltED;EAyCI,uBAAA;ChB4qEH;AgBrqED;;;;;;EAOQ,aAAA;ChBsqEP;AgB3pED;EACE,uBAAA;ChB6pED;AgB9pED;;;;;;EAQQ,uBAAA;ChB8pEP;AgBtqED;;EAeM,yBAAA;ChB2pEL;AgBjpED;EAEI,0BAAA;ChBkpEH;AgBzoED;EAEI,0BAAA;ChB0oEH;AgBjoED;EACE,iBAAA;EACA,YAAA;EACA,sBAAA;ChBmoED;AgB9nEG;;EACE,iBAAA;EACA,YAAA;EACA,oBAAA;ChBioEL;AiB7wEC;;;;;;;;;;;;EAOI,0BAAA;CjBoxEL;AiB9wEC;;;;;EAMI,0BAAA;CjB+wEL;AiBlyEC;;;;;;;;;;;;EAOI,0BAAA;CjByyEL;AiBnyEC;;;;;EAMI,0BAAA;CjBoyEL;AiBvzEC;;;;;;;;;;;;EAOI,0BAAA;CjB8zEL;AiBxzEC;;;;;EAMI,0BAAA;CjByzEL;AiB50EC;;;;;;;;;;;;EAOI,0BAAA;CjBm1EL;AiB70EC;;;;;EAMI,0BAAA;CjB80EL;AiBj2EC;;;;;;;;;;;;EAOI,0BAAA;CjBw2EL;AiBl2EC;;;;;EAMI,0BAAA;CjBm2EL;AgBjtED;EACE,iBAAA;EACA,kBAAA;ChBmtED;AgBtpED;EACA;IA3DI,YAAA;IACA,oBAAA;IACA,mBAAA;IACA,6CAAA;IACA,uBAAA;GhBotED;EgB7pEH;IAnDM,iBAAA;GhBmtEH;EgBhqEH;;;;;;IA1CY,oBAAA;GhBktET;EgBxqEH;IAlCM,UAAA;GhB6sEH;EgB3qEH;;;;;;IAzBY,eAAA;GhB4sET;EgBnrEH;;;;;;IArBY,gBAAA;GhBgtET;EgB3rEH;;;;IARY,iBAAA;GhBysET;CACF;AkBn6ED;EACE,WAAA;EACA,UAAA;EACA,UAAA;EAIA,aAAA;ClBk6ED;AkB/5ED;EACE,eAAA;EACA,YAAA;EACA,WAAA;EACA,oBAAA;EACA,gBAAA;EACA,qBAAA;EACA,eAAA;EACA,UAAA;EACA,iCAAA;ClBi6ED;AkB95ED;EACE,sBAAA;EACA,gBAAA;EACA,mBAAA;EACA,kBAAA;ClBg6ED;AkBr5ED;Eb4BE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL43ET;AkBr5ED;;EAEE,gBAAA;EACA,mBAAA;EACA,oBAAA;ClBu5ED;AkBp5ED;EACE,eAAA;ClBs5ED;AkBl5ED;EACE,eAAA;EACA,YAAA;ClBo5ED;AkBh5ED;;EAEE,aAAA;ClBk5ED;AkB94ED;;;EZrEE,2CAAA;EACA,qBAAA;CNw9ED;AkB74ED;EACE,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;ClB+4ED;AkBr3ED;EACE,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;EbxDA,yDAAA;EACQ,iDAAA;EAyHR,uFAAA;EACK,0EAAA;EACG,uEAAA;CLwzET;AmBh8EC;EACE,sBAAA;EACA,WAAA;EdUF,uFAAA;EACQ,+EAAA;CLy7ET;AKx5EC;EACE,YAAA;EACA,WAAA;CL05EH;AKx5EC;EAA0B,YAAA;CL25E3B;AK15EC;EAAgC,YAAA;CL65EjC;AkBj4EC;EACE,UAAA;EACA,8BAAA;ClBm4EH;AkB33EC;;;EAGE,0BAAA;EACA,WAAA;ClB63EH;AkB13EC;;EAEE,oBAAA;ClB43EH;AkBx3EC;EACE,aAAA;ClB03EH;AkB92ED;EACE,yBAAA;ClBg3ED;AkBx0ED;EAtBI;;;;IACE,kBAAA;GlBo2EH;EkBj2EC;;;;;;;;IAEE,kBAAA;GlBy2EH;EkBt2EC;;;;;;;;IAEE,kBAAA;GlB82EH;CACF;AkBp2ED;EACE,oBAAA;ClBs2ED;AkB91ED;;EAEE,mBAAA;EACA,eAAA;EACA,iBAAA;EACA,oBAAA;ClBg2ED;AkBr2ED;;EAQI,iBAAA;EACA,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,gBAAA;ClBi2EH;AkB91ED;;;;EAIE,mBAAA;EACA,mBAAA;EACA,mBAAA;ClBg2ED;AkB71ED;;EAEE,iBAAA;ClB+1ED;AkB31ED;;EAEE,mBAAA;EACA,sBAAA;EACA,mBAAA;EACA,iBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;ClB61ED;AkB31ED;;EAEE,cAAA;EACA,kBAAA;ClB61ED;AkBp1EC;;;;;;EAGE,oBAAA;ClBy1EH;AkBn1EC;;;;EAEE,oBAAA;ClBu1EH;AkBj1EC;;;;EAGI,oBAAA;ClBo1EL;AkBz0ED;EAEE,iBAAA;EACA,oBAAA;EAEA,iBAAA;EACA,iBAAA;ClBy0ED;AkBv0EC;;EAEE,gBAAA;EACA,iBAAA;ClBy0EH;AkB5zED;ECnQE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnBkkFD;AmBhkFC;EACE,aAAA;EACA,kBAAA;CnBkkFH;AmB/jFC;;EAEE,aAAA;CnBikFH;AkBx0ED;EAEI,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;ClBy0EH;AkB/0ED;EASI,aAAA;EACA,kBAAA;ClBy0EH;AkBn1ED;;EAcI,aAAA;ClBy0EH;AkBv1ED;EAiBI,aAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;ClBy0EH;AkBr0ED;EC/RE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBumFD;AmBrmFC;EACE,aAAA;EACA,kBAAA;CnBumFH;AmBpmFC;;EAEE,aAAA;CnBsmFH;AkBj1ED;EAEI,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;ClBk1EH;AkBx1ED;EASI,aAAA;EACA,kBAAA;ClBk1EH;AkB51ED;;EAcI,aAAA;ClBk1EH;AkBh2ED;EAiBI,aAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;ClBk1EH;AkBz0ED;EAEE,mBAAA;ClB00ED;AkB50ED;EAMI,sBAAA;ClBy0EH;AkBr0ED;EACE,mBAAA;EACA,OAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,mBAAA;EACA,qBAAA;ClBu0ED;AkBr0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClBu0ED;AkBr0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClBu0ED;AkBn0ED;;;;;;;;;;EC1ZI,eAAA;CnByuFH;AkB/0ED;ECtZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CL0rFT;AmBxuFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL+rFT;AkBz1ED;EC5YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBwuFH;AkB91ED;ECtYI,eAAA;CnBuuFH;AkB91ED;;;;;;;;;;EC7ZI,eAAA;CnBuwFH;AkB12ED;ECzZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLwtFT;AmBtwFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL6tFT;AkBp3ED;EC/YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBswFH;AkBz3ED;ECzYI,eAAA;CnBqwFH;AkBz3ED;;;;;;;;;;EChaI,eAAA;CnBqyFH;AkBr4ED;EC5ZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLsvFT;AmBpyFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL2vFT;AkB/4ED;EClZI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBoyFH;AkBp5ED;EC5YI,eAAA;CnBmyFH;AkBh5EC;EACE,UAAA;ClBk5EH;AkBh5EC;EACE,OAAA;ClBk5EH;AkBx4ED;EACE,eAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;ClB04ED;AkBvzED;EAwEA;IAtIM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlBy3EH;EkBrvEH;IA/HM,sBAAA;IACA,YAAA;IACA,uBAAA;GlBu3EH;EkB1vEH;IAxHM,sBAAA;GlBq3EH;EkB7vEH;IApHM,sBAAA;IACA,uBAAA;GlBo3EH;EkBjwEH;;;IA9GQ,YAAA;GlBo3EL;EkBtwEH;IAxGM,YAAA;GlBi3EH;EkBzwEH;IApGM,iBAAA;IACA,uBAAA;GlBg3EH;EkB7wEH;;IA5FM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlB62EH;EkBpxEH;;IAtFQ,gBAAA;GlB82EL;EkBxxEH;;IAjFM,mBAAA;IACA,eAAA;GlB62EH;EkB7xEH;IA3EM,OAAA;GlB22EH;CACF;AkBj2ED;;;;EASI,cAAA;EACA,iBAAA;EACA,iBAAA;ClB81EH;AkBz2ED;;EAiBI,iBAAA;ClB41EH;AkB72ED;EJthBE,mBAAA;EACA,oBAAA;Cds4FD;AkB10EC;EAyBF;IAnCM,kBAAA;IACA,iBAAA;IACA,iBAAA;GlBw1EH;CACF;AkBx3ED;EAwCI,YAAA;ClBm1EH;AkBr0EC;EAUF;IAdQ,kBAAA;IACA,gBAAA;GlB60EL;CACF;AkBn0EC;EAEF;IANQ,iBAAA;IACA,gBAAA;GlB20EL;CACF;AoBp6FD;EACE,sBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,+BAAA;MAAA,2BAAA;EACA,gBAAA;EACA,uBAAA;EACA,8BAAA;EACA,oBAAA;EC0CA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,mBAAA;EhB+JA,0BAAA;EACG,uBAAA;EACC,sBAAA;EACI,kBAAA;CL+tFT;AoBv6FG;;;;;;EdnBF,2CAAA;EACA,qBAAA;CNk8FD;AoB16FC;;;EAGE,YAAA;EACA,sBAAA;CpB46FH;AoBz6FC;;EAEE,WAAA;EACA,uBAAA;Ef2BF,yDAAA;EACQ,iDAAA;CLi5FT;AoBz6FC;;;EAGE,oBAAA;EE7CF,cAAA;EAGA,0BAAA;EjB8DA,yBAAA;EACQ,iBAAA;CL05FT;AoBz6FG;;EAEE,qBAAA;CpB26FL;AoBl6FD;EC3DE,YAAA;EACA,uBAAA;EACA,mBAAA;CrBg+FD;AqB99FC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBg+FP;AqB99FC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBg+FP;AqB99FC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBg+FP;AqB99FG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBs+FT;AqBn+FC;;;EAGE,uBAAA;CrBq+FH;AqBh+FG;;;;;;;;;EAGE,uBAAA;EACI,mBAAA;CrBw+FT;AoBv9FD;ECZI,YAAA;EACA,uBAAA;CrBs+FH;AoBx9FD;EC9DE,YAAA;EACA,0BAAA;EACA,sBAAA;CrByhGD;AqBvhGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrByhGP;AqBvhGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrByhGP;AqBvhGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrByhGP;AqBvhGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB+hGT;AqB5hGC;;;EAGE,uBAAA;CrB8hGH;AqBzhGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBiiGT;AoB7gGD;ECfI,eAAA;EACA,uBAAA;CrB+hGH;AoB7gGD;EClEE,YAAA;EACA,0BAAA;EACA,sBAAA;CrBklGD;AqBhlGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBklGP;AqBhlGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBklGP;AqBhlGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBklGP;AqBhlGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBwlGT;AqBrlGC;;;EAGE,uBAAA;CrBulGH;AqBllGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrB0lGT;AoBlkGD;ECnBI,eAAA;EACA,uBAAA;CrBwlGH;AoBlkGD;ECtEE,YAAA;EACA,0BAAA;EACA,sBAAA;CrB2oGD;AqBzoGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB2oGP;AqBzoGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB2oGP;AqBzoGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB2oGP;AqBzoGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBipGT;AqB9oGC;;;EAGE,uBAAA;CrBgpGH;AqB3oGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBmpGT;AoBvnGD;ECvBI,eAAA;EACA,uBAAA;CrBipGH;AoBvnGD;EC1EE,YAAA;EACA,0BAAA;EACA,sBAAA;CrBosGD;AqBlsGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBosGP;AqBlsGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBosGP;AqBlsGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBosGP;AqBlsGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB0sGT;AqBvsGC;;;EAGE,uBAAA;CrBysGH;AqBpsGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrB4sGT;AoB5qGD;EC3BI,eAAA;EACA,uBAAA;CrB0sGH;AoB5qGD;EC9EE,YAAA;EACA,0BAAA;EACA,sBAAA;CrB6vGD;AqB3vGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB6vGP;AqB3vGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB6vGP;AqB3vGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB6vGP;AqB3vGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBmwGT;AqBhwGC;;;EAGE,uBAAA;CrBkwGH;AqB7vGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBqwGT;AoBjuGD;EC/BI,eAAA;EACA,uBAAA;CrBmwGH;AoB5tGD;EACE,eAAA;EACA,oBAAA;EACA,iBAAA;CpB8tGD;AoB5tGC;;;;;EAKE,8BAAA;EfnCF,yBAAA;EACQ,iBAAA;CLkwGT;AoB7tGC;;;;EAIE,0BAAA;CpB+tGH;AoB7tGC;;EAEE,eAAA;EACA,2BAAA;EACA,8BAAA;CpB+tGH;AoB3tGG;;;;EAEE,eAAA;EACA,sBAAA;CpB+tGL;AoBttGD;;ECxEE,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CrBkyGD;AoBztGD;;EC5EE,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrByyGD;AoB5tGD;;EChFE,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrBgzGD;AoB3tGD;EACE,eAAA;EACA,YAAA;CpB6tGD;AoBztGD;EACE,gBAAA;CpB2tGD;AoBptGC;;;EACE,YAAA;CpBwtGH;AuBl3GD;EACE,WAAA;ElBoLA,yCAAA;EACK,oCAAA;EACG,iCAAA;CLisGT;AuBr3GC;EACE,WAAA;CvBu3GH;AuBn3GD;EACE,cAAA;CvBq3GD;AuBn3GC;EAAY,eAAA;CvBs3Gb;AuBr3GC;EAAY,mBAAA;CvBw3Gb;AuBv3GC;EAAY,yBAAA;CvB03Gb;AuBv3GD;EACE,mBAAA;EACA,UAAA;EACA,iBAAA;ElBuKA,gDAAA;EACQ,2CAAA;KAAA,wCAAA;EAOR,mCAAA;EACQ,8BAAA;KAAA,2BAAA;EAGR,yCAAA;EACQ,oCAAA;KAAA,iCAAA;CL2sGT;AwBr5GD;EACE,sBAAA;EACA,SAAA;EACA,UAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,yBAAA;EACA,oCAAA;EACA,mCAAA;CxBu5GD;AwBn5GD;;EAEE,mBAAA;CxBq5GD;AwBj5GD;EACE,WAAA;CxBm5GD;AwB/4GD;EACE,mBAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,sCAAA;EACA,mBAAA;EnBsBA,oDAAA;EACQ,4CAAA;EmBrBR,qCAAA;UAAA,6BAAA;CxBk5GD;AwB74GC;EACE,SAAA;EACA,WAAA;CxB+4GH;AwBx6GD;ECzBE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBo8GD;AwB96GD;EAmCI,eAAA;EACA,kBAAA;EACA,YAAA;EACA,oBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxB84GH;AwBx4GC;;EAEE,sBAAA;EACA,eAAA;EACA,0BAAA;CxB04GH;AwBp4GC;;;EAGE,YAAA;EACA,sBAAA;EACA,WAAA;EACA,0BAAA;CxBs4GH;AwB73GC;;;EAGE,eAAA;CxB+3GH;AwB33GC;;EAEE,sBAAA;EACA,8BAAA;EACA,uBAAA;EE3GF,oEAAA;EF6GE,oBAAA;CxB63GH;AwBx3GD;EAGI,eAAA;CxBw3GH;AwB33GD;EAQI,WAAA;CxBs3GH;AwB92GD;EACE,WAAA;EACA,SAAA;CxBg3GD;AwBx2GD;EACE,QAAA;EACA,YAAA;CxB02GD;AwBt2GD;EACE,eAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxBw2GD;AwBp2GD;EACE,gBAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,OAAA;EACA,aAAA;CxBs2GD;AwBl2GD;EACE,SAAA;EACA,WAAA;CxBo2GD;AwB51GD;;EAII,cAAA;EACA,0BAAA;EACA,4BAAA;EACA,YAAA;CxB41GH;AwBn2GD;;EAWI,UAAA;EACA,aAAA;EACA,mBAAA;CxB41GH;AwBv0GD;EAXE;IApEA,WAAA;IACA,SAAA;GxB05GC;EwBv1GD;IA1DA,QAAA;IACA,YAAA;GxBo5GC;CACF;A2BpiHD;;EAEE,mBAAA;EACA,sBAAA;EACA,uBAAA;C3BsiHD;A2B1iHD;;EAMI,mBAAA;EACA,YAAA;C3BwiHH;A2BtiHG;;;;;;;;EAIE,WAAA;C3B4iHL;A2BtiHD;;;;EAKI,kBAAA;C3BuiHH;A2BliHD;EACE,kBAAA;C3BoiHD;A2BriHD;;;EAOI,YAAA;C3BmiHH;A2B1iHD;;;EAYI,iBAAA;C3BmiHH;A2B/hHD;EACE,iBAAA;C3BiiHD;A2B7hHD;EACE,eAAA;C3B+hHD;A2B9hHC;EClDA,8BAAA;EACG,2BAAA;C5BmlHJ;A2B7hHD;;EC/CE,6BAAA;EACG,0BAAA;C5BglHJ;A2B5hHD;EACE,YAAA;C3B8hHD;A2B5hHD;EACE,iBAAA;C3B8hHD;A2B5hHD;;ECnEE,8BAAA;EACG,2BAAA;C5BmmHJ;A2B3hHD;ECjEE,6BAAA;EACG,0BAAA;C5B+lHJ;A2B1hHD;;EAEE,WAAA;C3B4hHD;A2B3gHD;EACE,kBAAA;EACA,mBAAA;C3B6gHD;A2B3gHD;EACE,mBAAA;EACA,oBAAA;C3B6gHD;A2BxgHD;EtB/CE,yDAAA;EACQ,iDAAA;CL0jHT;A2BxgHC;EtBnDA,yBAAA;EACQ,iBAAA;CL8jHT;A2BrgHD;EACE,eAAA;C3BugHD;A2BpgHD;EACE,wBAAA;EACA,uBAAA;C3BsgHD;A2BngHD;EACE,wBAAA;C3BqgHD;A2B9/GD;;;EAII,eAAA;EACA,YAAA;EACA,YAAA;EACA,gBAAA;C3B+/GH;A2BtgHD;EAcM,YAAA;C3B2/GL;A2BzgHD;;;;EAsBI,iBAAA;EACA,eAAA;C3By/GH;A2Bp/GC;EACE,iBAAA;C3Bs/GH;A2Bp/GC;EC3KA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5B4pHF;A2Bt/GC;EC/KA,2BAAA;EACC,0BAAA;EAOD,gCAAA;EACC,+BAAA;C5BkqHF;A2Bv/GD;EACE,iBAAA;C3By/GD;A2Bv/GD;;EC/KE,8BAAA;EACC,6BAAA;C5B0qHF;A2Bt/GD;EC7LE,2BAAA;EACC,0BAAA;C5BsrHF;A2Bl/GD;EACE,eAAA;EACA,YAAA;EACA,oBAAA;EACA,0BAAA;C3Bo/GD;A2Bx/GD;;EAOI,YAAA;EACA,oBAAA;EACA,UAAA;C3Bq/GH;A2B9/GD;EAYI,YAAA;C3Bq/GH;A2BjgHD;EAgBI,WAAA;C3Bo/GH;A2Bn+GD;;;;EAKM,mBAAA;EACA,uBAAA;EACA,qBAAA;C3Bo+GL;A6B9sHD;EACE,mBAAA;EACA,eAAA;EACA,0BAAA;C7BgtHD;A6B7sHC;EACE,YAAA;EACA,gBAAA;EACA,iBAAA;C7B+sHH;A6BxtHD;EAeI,mBAAA;EACA,WAAA;EAKA,YAAA;EAEA,YAAA;EACA,iBAAA;C7BusHH;A6BrsHG;EACE,WAAA;C7BusHL;A6B7rHD;;;EV0BE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBwqHD;AmBtqHC;;;EACE,aAAA;EACA,kBAAA;CnB0qHH;AmBvqHC;;;;;;EAEE,aAAA;CnB6qHH;A6B/sHD;;;EVqBE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnB+rHD;AmB7rHC;;;EACE,aAAA;EACA,kBAAA;CnBisHH;AmB9rHC;;;;;;EAEE,aAAA;CnBosHH;A6B7tHD;;;EAGE,oBAAA;C7B+tHD;A6B7tHC;;;EACE,iBAAA;C7BiuHH;A6B7tHD;;EAEE,UAAA;EACA,oBAAA;EACA,uBAAA;C7B+tHD;A6B1tHD;EACE,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;EACA,uBAAA;EACA,mBAAA;C7B4tHD;A6BztHC;EACE,kBAAA;EACA,gBAAA;EACA,mBAAA;C7B2tHH;A6BztHC;EACE,mBAAA;EACA,gBAAA;EACA,mBAAA;C7B2tHH;A6B/uHD;;EA0BI,cAAA;C7BytHH;A6BptHD;;;;;;;EDpGE,8BAAA;EACG,2BAAA;C5Bi0HJ;A6BrtHD;EACE,gBAAA;C7ButHD;A6BrtHD;;;;;;;EDxGE,6BAAA;EACG,0BAAA;C5Bs0HJ;A6BttHD;EACE,eAAA;C7BwtHD;A6BntHD;EACE,mBAAA;EAGA,aAAA;EACA,oBAAA;C7BmtHD;A6BxtHD;EAUI,mBAAA;C7BitHH;A6B3tHD;EAYM,kBAAA;C7BktHL;A6B/sHG;;;EAGE,WAAA;C7BitHL;A6B5sHC;;EAGI,mBAAA;C7B6sHL;A6B1sHC;;EAGI,WAAA;EACA,kBAAA;C7B2sHL;A8B12HD;EACE,iBAAA;EACA,gBAAA;EACA,iBAAA;C9B42HD;A8B/2HD;EAOI,mBAAA;EACA,eAAA;C9B22HH;A8Bn3HD;EAWM,mBAAA;EACA,eAAA;EACA,mBAAA;C9B22HL;A8B12HK;;EAEE,sBAAA;EACA,0BAAA;C9B42HP;A8Bv2HG;EACE,eAAA;C9By2HL;A8Bv2HK;;EAEE,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,oBAAA;C9By2HP;A8Bl2HG;;;EAGE,0BAAA;EACA,sBAAA;C9Bo2HL;A8B74HD;ELHE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBm5HD;A8Bn5HD;EA0DI,gBAAA;C9B41HH;A8Bn1HD;EACE,8BAAA;C9Bq1HD;A8Bt1HD;EAGI,YAAA;EAEA,oBAAA;C9Bq1HH;A8B11HD;EASM,kBAAA;EACA,wBAAA;EACA,8BAAA;EACA,2BAAA;C9Bo1HL;A8Bn1HK;EACE,mCAAA;C9Bq1HP;A8B/0HK;;;EAGE,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,iCAAA;EACA,gBAAA;C9Bi1HP;A8B50HC;EAqDA,YAAA;EA8BA,iBAAA;C9B6vHD;A8Bh1HC;EAwDE,YAAA;C9B2xHH;A8Bn1HC;EA0DI,mBAAA;EACA,mBAAA;C9B4xHL;A8Bv1HC;EAgEE,UAAA;EACA,WAAA;C9B0xHH;A8B9wHD;EA0DA;IAjEM,oBAAA;IACA,UAAA;G9ByxHH;E8BztHH;IA9DQ,iBAAA;G9B0xHL;CACF;A8Bp2HC;EAuFE,gBAAA;EACA,mBAAA;C9BgxHH;A8Bx2HC;;;EA8FE,uBAAA;C9B+wHH;A8BjwHD;EA2BA;IApCM,8BAAA;IACA,2BAAA;G9B8wHH;E8B3uHH;;;IA9BM,0BAAA;G9B8wHH;CACF;A8B/2HD;EAEI,YAAA;C9Bg3HH;A8Bl3HD;EAMM,mBAAA;C9B+2HL;A8Br3HD;EASM,iBAAA;C9B+2HL;A8B12HK;;;EAGE,YAAA;EACA,0BAAA;C9B42HP;A8Bp2HD;EAEI,YAAA;C9Bq2HH;A8Bv2HD;EAIM,gBAAA;EACA,eAAA;C9Bs2HL;A8B11HD;EACE,YAAA;C9B41HD;A8B71HD;EAII,YAAA;C9B41HH;A8Bh2HD;EAMM,mBAAA;EACA,mBAAA;C9B61HL;A8Bp2HD;EAYI,UAAA;EACA,WAAA;C9B21HH;A8B/0HD;EA0DA;IAjEM,oBAAA;IACA,UAAA;G9B01HH;E8B1xHH;IA9DQ,iBAAA;G9B21HL;CACF;A8Bn1HD;EACE,iBAAA;C9Bq1HD;A8Bt1HD;EAKI,gBAAA;EACA,mBAAA;C9Bo1HH;A8B11HD;;;EAYI,uBAAA;C9Bm1HH;A8Br0HD;EA2BA;IApCM,8BAAA;IACA,2BAAA;G9Bk1HH;E8B/yHH;;;IA9BM,0BAAA;G9Bk1HH;CACF;A8Bz0HD;EAEI,cAAA;C9B00HH;A8B50HD;EAKI,eAAA;C9B00HH;A8Bj0HD;EAEE,iBAAA;EF3OA,2BAAA;EACC,0BAAA;C5B8iIF;A+BxiID;EACE,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,8BAAA;C/B0iID;A+BliID;EA8nBA;IAhoBI,mBAAA;G/BwiID;CACF;A+BzhID;EAgnBA;IAlnBI,YAAA;G/B+hID;CACF;A+BjhID;EACE,oBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,2DAAA;UAAA,mDAAA;EAEA,kCAAA;C/BkhID;A+BhhIC;EACE,iBAAA;C/BkhIH;A+Bt/HD;EA6jBA;IArlBI,YAAA;IACA,cAAA;IACA,yBAAA;YAAA,iBAAA;G/BkhID;E+BhhIC;IACE,0BAAA;IACA,wBAAA;IACA,kBAAA;IACA,6BAAA;G/BkhIH;E+B/gIC;IACE,oBAAA;G/BihIH;E+B5gIC;;;IAGE,gBAAA;IACA,iBAAA;G/B8gIH;CACF;A+B1gID;;EAGI,kBAAA;C/B2gIH;A+BtgIC;EAmjBF;;IArjBM,kBAAA;G/B6gIH;CACF;A+BpgID;;;;EAII,oBAAA;EACA,mBAAA;C/BsgIH;A+BhgIC;EAgiBF;;;;IAniBM,gBAAA;IACA,eAAA;G/B0gIH;CACF;A+B9/HD;EACE,cAAA;EACA,sBAAA;C/BggID;A+B3/HD;EA8gBA;IAhhBI,iBAAA;G/BigID;CACF;A+B7/HD;;EAEE,gBAAA;EACA,SAAA;EACA,QAAA;EACA,cAAA;C/B+/HD;A+Bz/HD;EAggBA;;IAlgBI,iBAAA;G/BggID;CACF;A+B9/HD;EACE,OAAA;EACA,sBAAA;C/BggID;A+B9/HD;EACE,UAAA;EACA,iBAAA;EACA,sBAAA;C/BggID;A+B1/HD;EACE,YAAA;EACA,mBAAA;EACA,gBAAA;EACA,kBAAA;EACA,aAAA;C/B4/HD;A+B1/HC;;EAEE,sBAAA;C/B4/HH;A+BrgID;EAaI,eAAA;C/B2/HH;A+Bl/HD;EALI;;IAEE,mBAAA;G/B0/HH;CACF;A+Bh/HD;EACE,mBAAA;EACA,aAAA;EACA,mBAAA;EACA,kBAAA;EC9LA,gBAAA;EACA,mBAAA;ED+LA,8BAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;C/Bm/HD;A+B/+HC;EACE,WAAA;C/Bi/HH;A+B//HD;EAmBI,eAAA;EACA,YAAA;EACA,YAAA;EACA,mBAAA;C/B++HH;A+BrgID;EAyBI,gBAAA;C/B++HH;A+Bz+HD;EAqbA;IAvbI,cAAA;G/B++HD;CACF;A+Bt+HD;EACE,oBAAA;C/Bw+HD;A+Bz+HD;EAII,kBAAA;EACA,qBAAA;EACA,kBAAA;C/Bw+HH;A+B58HC;EA2YF;IAjaM,iBAAA;IACA,YAAA;IACA,YAAA;IACA,cAAA;IACA,8BAAA;IACA,UAAA;IACA,yBAAA;YAAA,iBAAA;G/Bs+HH;E+B3kHH;;IAxZQ,2BAAA;G/Bu+HL;E+B/kHH;IArZQ,kBAAA;G/Bu+HL;E+Bt+HK;;IAEE,uBAAA;G/Bw+HP;CACF;A+Bt9HD;EA+XA;IA1YI,YAAA;IACA,UAAA;G/Bq+HD;E+B5lHH;IAtYM,YAAA;G/Bq+HH;E+B/lHH;IApYQ,kBAAA;IACA,qBAAA;G/Bs+HL;CACF;A+B39HD;EACE,mBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,qCAAA;E1B9NA,6FAAA;EACQ,qFAAA;E2B/DR,gBAAA;EACA,mBAAA;ChC4vID;AkBtuHD;EAwEA;IAtIM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlBwyHH;EkBpqHH;IA/HM,sBAAA;IACA,YAAA;IACA,uBAAA;GlBsyHH;EkBzqHH;IAxHM,sBAAA;GlBoyHH;EkB5qHH;IApHM,sBAAA;IACA,uBAAA;GlBmyHH;EkBhrHH;;;IA9GQ,YAAA;GlBmyHL;EkBrrHH;IAxGM,YAAA;GlBgyHH;EkBxrHH;IApGM,iBAAA;IACA,uBAAA;GlB+xHH;EkB5rHH;;IA5FM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlB4xHH;EkBnsHH;;IAtFQ,gBAAA;GlB6xHL;EkBvsHH;;IAjFM,mBAAA;IACA,eAAA;GlB4xHH;EkB5sHH;IA3EM,OAAA;GlB0xHH;CACF;A+BpgIC;EAmWF;IAzWM,mBAAA;G/B8gIH;E+B5gIG;IACE,iBAAA;G/B8gIL;CACF;A+B7/HD;EAoVA;IA5VI,YAAA;IACA,UAAA;IACA,eAAA;IACA,gBAAA;IACA,eAAA;IACA,kBAAA;I1BzPF,yBAAA;IACQ,iBAAA;GLmwIP;CACF;A+BngID;EACE,cAAA;EHpUA,2BAAA;EACC,0BAAA;C5B00IF;A+BngID;EACE,iBAAA;EHzUA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5By0IF;A+B//HD;EChVE,gBAAA;EACA,mBAAA;ChCk1ID;A+BhgIC;ECnVA,iBAAA;EACA,oBAAA;ChCs1ID;A+BjgIC;ECtVA,iBAAA;EACA,oBAAA;ChC01ID;A+B3/HD;EChWE,iBAAA;EACA,oBAAA;ChC81ID;A+Bv/HD;EAsSA;IA1SI,YAAA;IACA,kBAAA;IACA,mBAAA;G/B+/HD;CACF;A+Bl+HD;EAhBE;IExWA,uBAAA;GjC81IC;E+Br/HD;IE5WA,wBAAA;IF8WE,oBAAA;G/Bu/HD;E+Bz/HD;IAKI,gBAAA;G/Bu/HH;CACF;A+B9+HD;EACE,0BAAA;EACA,sBAAA;C/Bg/HD;A+Bl/HD;EAKI,YAAA;C/Bg/HH;A+B/+HG;;EAEE,eAAA;EACA,8BAAA;C/Bi/HL;A+B1/HD;EAcI,YAAA;C/B++HH;A+B7/HD;EAmBM,YAAA;C/B6+HL;A+B3+HK;;EAEE,YAAA;EACA,8BAAA;C/B6+HP;A+Bz+HK;;;EAGE,YAAA;EACA,0BAAA;C/B2+HP;A+Bv+HK;;;EAGE,YAAA;EACA,8BAAA;C/By+HP;A+BjhID;EA8CI,mBAAA;C/Bs+HH;A+Br+HG;;EAEE,uBAAA;C/Bu+HL;A+BxhID;EAoDM,uBAAA;C/Bu+HL;A+B3hID;;EA0DI,sBAAA;C/Bq+HH;A+B99HK;;;EAGE,0BAAA;EACA,YAAA;C/Bg+HP;A+B/7HC;EAoKF;IA7LU,YAAA;G/B49HP;E+B39HO;;IAEE,YAAA;IACA,8BAAA;G/B69HT;E+Bz9HO;;;IAGE,YAAA;IACA,0BAAA;G/B29HT;E+Bv9HO;;;IAGE,YAAA;IACA,8BAAA;G/By9HT;CACF;A+B3jID;EA8GI,YAAA;C/Bg9HH;A+B/8HG;EACE,YAAA;C/Bi9HL;A+BjkID;EAqHI,YAAA;C/B+8HH;A+B98HG;;EAEE,YAAA;C/Bg9HL;A+B58HK;;;;EAEE,YAAA;C/Bg9HP;A+Bx8HD;EACE,uBAAA;EACA,sBAAA;C/B08HD;A+B58HD;EAKI,eAAA;C/B08HH;A+Bz8HG;;EAEE,YAAA;EACA,8BAAA;C/B28HL;A+Bp9HD;EAcI,eAAA;C/By8HH;A+Bv9HD;EAmBM,eAAA;C/Bu8HL;A+Br8HK;;EAEE,YAAA;EACA,8BAAA;C/Bu8HP;A+Bn8HK;;;EAGE,YAAA;EACA,0BAAA;C/Bq8HP;A+Bj8HK;;;EAGE,YAAA;EACA,8BAAA;C/Bm8HP;A+B3+HD;EA+CI,mBAAA;C/B+7HH;A+B97HG;;EAEE,uBAAA;C/Bg8HL;A+Bl/HD;EAqDM,uBAAA;C/Bg8HL;A+Br/HD;;EA2DI,sBAAA;C/B87HH;A+Bx7HK;;;EAGE,0BAAA;EACA,YAAA;C/B07HP;A+Bn5HC;EAwBF;IAvDU,sBAAA;G/Bs7HP;E+B/3HH;IApDU,0BAAA;G/Bs7HP;E+Bl4HH;IAjDU,eAAA;G/Bs7HP;E+Br7HO;;IAEE,YAAA;IACA,8BAAA;G/Bu7HT;E+Bn7HO;;;IAGE,YAAA;IACA,0BAAA;G/Bq7HT;E+Bj7HO;;;IAGE,YAAA;IACA,8BAAA;G/Bm7HT;CACF;A+B3hID;EA+GI,eAAA;C/B+6HH;A+B96HG;EACE,YAAA;C/Bg7HL;A+BjiID;EAsHI,eAAA;C/B86HH;A+B76HG;;EAEE,YAAA;C/B+6HL;A+B36HK;;;;EAEE,YAAA;C/B+6HP;AkCzjJD;EACE,kBAAA;EACA,oBAAA;EACA,iBAAA;EACA,0BAAA;EACA,mBAAA;ClC2jJD;AkChkJD;EAQI,sBAAA;ClC2jJH;AkCnkJD;EAWM,kBAAA;EACA,eAAA;EACA,YAAA;ClC2jJL;AkCxkJD;EAkBI,eAAA;ClCyjJH;AmC7kJD;EACE,sBAAA;EACA,gBAAA;EACA,eAAA;EACA,mBAAA;CnC+kJD;AmCnlJD;EAOI,gBAAA;CnC+kJH;AmCtlJD;;EAUM,mBAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,sBAAA;EACA,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,kBAAA;CnCglJL;AmC9kJG;;EAGI,eAAA;EPXN,+BAAA;EACG,4BAAA;C5B2lJJ;AmC7kJG;;EPvBF,gCAAA;EACG,6BAAA;C5BwmJJ;AmCxkJG;;;;EAEE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CnC4kJL;AmCtkJG;;;;;;EAGE,WAAA;EACA,YAAA;EACA,0BAAA;EACA,sBAAA;EACA,gBAAA;CnC2kJL;AmCloJD;;;;;;EAkEM,eAAA;EACA,uBAAA;EACA,mBAAA;EACA,oBAAA;CnCwkJL;AmC/jJD;;EC3EM,mBAAA;EACA,gBAAA;EACA,uBAAA;CpC8oJL;AoC5oJG;;ERKF,+BAAA;EACG,4BAAA;C5B2oJJ;AoC3oJG;;ERTF,gCAAA;EACG,6BAAA;C5BwpJJ;AmC1kJD;;EChFM,kBAAA;EACA,gBAAA;EACA,iBAAA;CpC8pJL;AoC5pJG;;ERKF,+BAAA;EACG,4BAAA;C5B2pJJ;AoC3pJG;;ERTF,gCAAA;EACG,6BAAA;C5BwqJJ;AqC3qJD;EACE,gBAAA;EACA,eAAA;EACA,iBAAA;EACA,mBAAA;CrC6qJD;AqCjrJD;EAOI,gBAAA;CrC6qJH;AqCprJD;;EAUM,sBAAA;EACA,kBAAA;EACA,uBAAA;EACA,uBAAA;EACA,oBAAA;CrC8qJL;AqC5rJD;;EAmBM,sBAAA;EACA,0BAAA;CrC6qJL;AqCjsJD;;EA2BM,aAAA;CrC0qJL;AqCrsJD;;EAkCM,YAAA;CrCuqJL;AqCzsJD;;;;EA2CM,eAAA;EACA,uBAAA;EACA,oBAAA;CrCoqJL;AsCltJD;EACE,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,kBAAA;EACA,eAAA;EACA,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,yBAAA;EACA,qBAAA;CtCotJD;AsChtJG;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;CtCktJL;AsC7sJC;EACE,cAAA;CtC+sJH;AsC3sJC;EACE,mBAAA;EACA,UAAA;CtC6sJH;AsCtsJD;ECtCE,0BAAA;CvC+uJD;AuC5uJG;;EAEE,0BAAA;CvC8uJL;AsCzsJD;EC1CE,0BAAA;CvCsvJD;AuCnvJG;;EAEE,0BAAA;CvCqvJL;AsC5sJD;EC9CE,0BAAA;CvC6vJD;AuC1vJG;;EAEE,0BAAA;CvC4vJL;AsC/sJD;EClDE,0BAAA;CvCowJD;AuCjwJG;;EAEE,0BAAA;CvCmwJL;AsCltJD;ECtDE,0BAAA;CvC2wJD;AuCxwJG;;EAEE,0BAAA;CvC0wJL;AsCrtJD;EC1DE,0BAAA;CvCkxJD;AuC/wJG;;EAEE,0BAAA;CvCixJL;AwCnxJD;EACE,sBAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,YAAA;EACA,eAAA;EACA,uBAAA;EACA,oBAAA;EACA,mBAAA;EACA,0BAAA;EACA,oBAAA;CxCqxJD;AwClxJC;EACE,cAAA;CxCoxJH;AwChxJC;EACE,mBAAA;EACA,UAAA;CxCkxJH;AwC/wJC;;EAEE,OAAA;EACA,iBAAA;CxCixJH;AwC5wJG;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;CxC8wJL;AwCzwJC;;EAEE,eAAA;EACA,uBAAA;CxC2wJH;AwCxwJC;EACE,aAAA;CxC0wJH;AwCvwJC;EACE,kBAAA;CxCywJH;AwCtwJC;EACE,iBAAA;CxCwwJH;AyCl0JD;EACE,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,eAAA;EACA,0BAAA;CzCo0JD;AyCz0JD;;EASI,eAAA;CzCo0JH;AyC70JD;EAaI,oBAAA;EACA,gBAAA;EACA,iBAAA;CzCm0JH;AyCl1JD;EAmBI,0BAAA;CzCk0JH;AyC/zJC;;EAEE,mBAAA;EACA,mBAAA;EACA,oBAAA;CzCi0JH;AyC31JD;EA8BI,gBAAA;CzCg0JH;AyC9yJD;EACA;IAfI,kBAAA;IACA,qBAAA;GzCg0JD;EyC9zJC;;IAEE,mBAAA;IACA,oBAAA;GzCg0JH;EyCvzJH;;IAJM,gBAAA;GzC+zJH;CACF;A0C52JD;EACE,eAAA;EACA,aAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;ErCiLA,4CAAA;EACK,uCAAA;EACG,oCAAA;CL8rJT;A0Cx3JD;;EAaI,kBAAA;EACA,mBAAA;C1C+2JH;A0C32JC;;;EAGE,sBAAA;C1C62JH;A0Cl4JD;EA0BI,aAAA;EACA,eAAA;C1C22JH;A2Cp4JD;EACE,cAAA;EACA,oBAAA;EACA,8BAAA;EACA,mBAAA;C3Cs4JD;A2C14JD;EAQI,cAAA;EAEA,eAAA;C3Co4JH;A2C94JD;EAeI,kBAAA;C3Ck4JH;A2Cj5JD;;EAqBI,iBAAA;C3Cg4JH;A2Cr5JD;EAyBI,gBAAA;C3C+3JH;A2Cv3JD;;EAEE,oBAAA;C3Cy3JD;A2C33JD;;EAMI,mBAAA;EACA,UAAA;EACA,aAAA;EACA,eAAA;C3Cy3JH;A2Cj3JD;ECvDE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C26JD;A2Ct3JD;EClDI,0BAAA;C5C26JH;A2Cz3JD;EC/CI,eAAA;C5C26JH;A2Cx3JD;EC3DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Cs7JD;A2C73JD;ECtDI,0BAAA;C5Cs7JH;A2Ch4JD;ECnDI,eAAA;C5Cs7JH;A2C/3JD;EC/DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Ci8JD;A2Cp4JD;EC1DI,0BAAA;C5Ci8JH;A2Cv4JD;ECvDI,eAAA;C5Ci8JH;A2Ct4JD;ECnEE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C48JD;A2C34JD;EC9DI,0BAAA;C5C48JH;A2C94JD;EC3DI,eAAA;C5C48JH;A6C98JD;EACE;IAAQ,4BAAA;G7Ci9JP;E6Ch9JD;IAAQ,yBAAA;G7Cm9JP;CACF;A6Ch9JD;EACE;IAAQ,4BAAA;G7Cm9JP;E6Cl9JD;IAAQ,yBAAA;G7Cq9JP;CACF;A6Cx9JD;EACE;IAAQ,4BAAA;G7Cm9JP;E6Cl9JD;IAAQ,yBAAA;G7Cq9JP;CACF;A6C98JD;EACE,iBAAA;EACA,aAAA;EACA,oBAAA;EACA,0BAAA;EACA,mBAAA;ExCsCA,uDAAA;EACQ,+CAAA;CL26JT;A6C78JD;EACE,YAAA;EACA,UAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,YAAA;EACA,mBAAA;EACA,0BAAA;ExCyBA,uDAAA;EACQ,+CAAA;EAyHR,oCAAA;EACK,+BAAA;EACG,4BAAA;CL+zJT;A6C18JD;;ECCI,8MAAA;EACA,yMAAA;EACA,sMAAA;EDAF,mCAAA;UAAA,2BAAA;C7C88JD;A6Cv8JD;;ExC5CE,2DAAA;EACK,sDAAA;EACG,mDAAA;CLu/JT;A6Cp8JD;EErEE,0BAAA;C/C4gKD;A+CzgKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C49JH;A6Cx8JD;EEzEE,0BAAA;C/CohKD;A+CjhKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9Co+JH;A6C58JD;EE7EE,0BAAA;C/C4hKD;A+CzhKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C4+JH;A6Ch9JD;EEjFE,0BAAA;C/CoiKD;A+CjiKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9Co/JH;AgD5iKD;EAEE,iBAAA;ChD6iKD;AgD3iKC;EACE,cAAA;ChD6iKH;AgDziKD;;EAEE,QAAA;EACA,iBAAA;ChD2iKD;AgDxiKD;EACE,eAAA;ChD0iKD;AgDviKD;EACE,eAAA;ChDyiKD;AgDtiKC;EACE,gBAAA;ChDwiKH;AgDpiKD;;EAEE,mBAAA;ChDsiKD;AgDniKD;;EAEE,oBAAA;ChDqiKD;AgDliKD;;;EAGE,oBAAA;EACA,oBAAA;ChDoiKD;AgDjiKD;EACE,uBAAA;ChDmiKD;AgDhiKD;EACE,uBAAA;ChDkiKD;AgD9hKD;EACE,cAAA;EACA,mBAAA;ChDgiKD;AgD1hKD;EACE,gBAAA;EACA,iBAAA;ChD4hKD;AiDnlKD;EAEE,oBAAA;EACA,gBAAA;CjDolKD;AiD5kKD;EACE,mBAAA;EACA,eAAA;EACA,mBAAA;EAEA,oBAAA;EACA,uBAAA;EACA,uBAAA;CjD6kKD;AiD1kKC;ErB3BA,6BAAA;EACC,4BAAA;C5BwmKF;AiD3kKC;EACE,iBAAA;ErBvBF,gCAAA;EACC,+BAAA;C5BqmKF;AiDpkKD;;EAEE,YAAA;CjDskKD;AiDxkKD;;EAKI,YAAA;CjDukKH;AiDnkKC;;;;EAEE,sBAAA;EACA,YAAA;EACA,0BAAA;CjDukKH;AiDnkKD;EACE,YAAA;EACA,iBAAA;CjDqkKD;AiDhkKC;;;EAGE,0BAAA;EACA,eAAA;EACA,oBAAA;CjDkkKH;AiDvkKC;;;EASI,eAAA;CjDmkKL;AiD5kKC;;;EAYI,eAAA;CjDqkKL;AiDhkKC;;;EAGE,WAAA;EACA,YAAA;EACA,0BAAA;EACA,sBAAA;CjDkkKH;AiDxkKC;;;;;;;;;EAYI,eAAA;CjDukKL;AiDnlKC;;;EAeI,eAAA;CjDykKL;AkD3qKC;EACE,eAAA;EACA,0BAAA;ClD6qKH;AkD3qKG;;EAEE,eAAA;ClD6qKL;AkD/qKG;;EAKI,eAAA;ClD8qKP;AkD3qKK;;;;EAEE,eAAA;EACA,0BAAA;ClD+qKP;AkD7qKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDkrKP;AkDxsKC;EACE,eAAA;EACA,0BAAA;ClD0sKH;AkDxsKG;;EAEE,eAAA;ClD0sKL;AkD5sKG;;EAKI,eAAA;ClD2sKP;AkDxsKK;;;;EAEE,eAAA;EACA,0BAAA;ClD4sKP;AkD1sKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD+sKP;AkDruKC;EACE,eAAA;EACA,0BAAA;ClDuuKH;AkDruKG;;EAEE,eAAA;ClDuuKL;AkDzuKG;;EAKI,eAAA;ClDwuKP;AkDruKK;;;;EAEE,eAAA;EACA,0BAAA;ClDyuKP;AkDvuKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD4uKP;AkDlwKC;EACE,eAAA;EACA,0BAAA;ClDowKH;AkDlwKG;;EAEE,eAAA;ClDowKL;AkDtwKG;;EAKI,eAAA;ClDqwKP;AkDlwKK;;;;EAEE,eAAA;EACA,0BAAA;ClDswKP;AkDpwKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDywKP;AiDxqKD;EACE,cAAA;EACA,mBAAA;CjD0qKD;AiDxqKD;EACE,iBAAA;EACA,iBAAA;CjD0qKD;AmDpyKD;EACE,oBAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;E9C0DA,kDAAA;EACQ,0CAAA;CL6uKT;AmDnyKD;EACE,cAAA;CnDqyKD;AmDhyKD;EACE,mBAAA;EACA,qCAAA;EvBpBA,6BAAA;EACC,4BAAA;C5BuzKF;AmDtyKD;EAMI,eAAA;CnDmyKH;AmD9xKD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,eAAA;CnDgyKD;AmDpyKD;;;;;EAWI,eAAA;CnDgyKH;AmD3xKD;EACE,mBAAA;EACA,0BAAA;EACA,2BAAA;EvBxCA,gCAAA;EACC,+BAAA;C5Bs0KF;AmDrxKD;;EAGI,iBAAA;CnDsxKH;AmDzxKD;;EAMM,oBAAA;EACA,iBAAA;CnDuxKL;AmDnxKG;;EAEI,cAAA;EvBvEN,6BAAA;EACC,4BAAA;C5B61KF;AmDjxKG;;EAEI,iBAAA;EvBvEN,gCAAA;EACC,+BAAA;C5B21KF;AmD1yKD;EvB1DE,2BAAA;EACC,0BAAA;C5Bu2KF;AmD7wKD;EAEI,oBAAA;CnD8wKH;AmD3wKD;EACE,oBAAA;CnD6wKD;AmDrwKD;;;EAII,iBAAA;CnDswKH;AmD1wKD;;;EAOM,mBAAA;EACA,oBAAA;CnDwwKL;AmDhxKD;;EvBzGE,6BAAA;EACC,4BAAA;C5B63KF;AmDrxKD;;;;EAmBQ,4BAAA;EACA,6BAAA;CnDwwKP;AmD5xKD;;;;;;;;EAwBU,4BAAA;CnD8wKT;AmDtyKD;;;;;;;;EA4BU,6BAAA;CnDoxKT;AmDhzKD;;EvBjGE,gCAAA;EACC,+BAAA;C5Bq5KF;AmDrzKD;;;;EAyCQ,+BAAA;EACA,gCAAA;CnDkxKP;AmD5zKD;;;;;;;;EA8CU,+BAAA;CnDwxKT;AmDt0KD;;;;;;;;EAkDU,gCAAA;CnD8xKT;AmDh1KD;;;;EA2DI,2BAAA;CnD2xKH;AmDt1KD;;EA+DI,cAAA;CnD2xKH;AmD11KD;;EAmEI,UAAA;CnD2xKH;AmD91KD;;;;;;;;;;;;EA0EU,eAAA;CnDkyKT;AmD52KD;;;;;;;;;;;;EA8EU,gBAAA;CnD4yKT;AmD13KD;;;;;;;;EAuFU,iBAAA;CnD6yKT;AmDp4KD;;;;;;;;EAgGU,iBAAA;CnD8yKT;AmD94KD;EAsGI,UAAA;EACA,iBAAA;CnD2yKH;AmDjyKD;EACE,oBAAA;CnDmyKD;AmDpyKD;EAKI,iBAAA;EACA,mBAAA;CnDkyKH;AmDxyKD;EASM,gBAAA;CnDkyKL;AmD3yKD;EAcI,iBAAA;CnDgyKH;AmD9yKD;;EAkBM,2BAAA;CnDgyKL;AmDlzKD;EAuBI,cAAA;CnD8xKH;AmDrzKD;EAyBM,8BAAA;CnD+xKL;AmDxxKD;EC1PE,mBAAA;CpDqhLD;AoDnhLC;EACE,eAAA;EACA,0BAAA;EACA,mBAAA;CpDqhLH;AoDxhLC;EAMI,uBAAA;CpDqhLL;AoD3hLC;EASI,eAAA;EACA,0BAAA;CpDqhLL;AoDlhLC;EAEI,0BAAA;CpDmhLL;AmDvyKD;EC7PE,sBAAA;CpDuiLD;AoDriLC;EACE,YAAA;EACA,0BAAA;EACA,sBAAA;CpDuiLH;AoD1iLC;EAMI,0BAAA;CpDuiLL;AoD7iLC;EASI,eAAA;EACA,uBAAA;CpDuiLL;AoDpiLC;EAEI,6BAAA;CpDqiLL;AmDtzKD;EChQE,sBAAA;CpDyjLD;AoDvjLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDyjLH;AoD5jLC;EAMI,0BAAA;CpDyjLL;AoD/jLC;EASI,eAAA;EACA,0BAAA;CpDyjLL;AoDtjLC;EAEI,6BAAA;CpDujLL;AmDr0KD;ECnQE,sBAAA;CpD2kLD;AoDzkLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD2kLH;AoD9kLC;EAMI,0BAAA;CpD2kLL;AoDjlLC;EASI,eAAA;EACA,0BAAA;CpD2kLL;AoDxkLC;EAEI,6BAAA;CpDykLL;AmDp1KD;ECtQE,sBAAA;CpD6lLD;AoD3lLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD6lLH;AoDhmLC;EAMI,0BAAA;CpD6lLL;AoDnmLC;EASI,eAAA;EACA,0BAAA;CpD6lLL;AoD1lLC;EAEI,6BAAA;CpD2lLL;AmDn2KD;ECzQE,sBAAA;CpD+mLD;AoD7mLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD+mLH;AoDlnLC;EAMI,0BAAA;CpD+mLL;AoDrnLC;EASI,eAAA;EACA,0BAAA;CpD+mLL;AoD5mLC;EAEI,6BAAA;CpD6mLL;AqD7nLD;EACE,mBAAA;EACA,eAAA;EACA,UAAA;EACA,WAAA;EACA,iBAAA;CrD+nLD;AqDpoLD;;;;;EAYI,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,aAAA;EACA,YAAA;EACA,UAAA;CrD+nLH;AqD1nLD;EACE,uBAAA;CrD4nLD;AqDxnLD;EACE,oBAAA;CrD0nLD;AsDrpLD;EACE,iBAAA;EACA,cAAA;EACA,oBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EjDwDA,wDAAA;EACQ,gDAAA;CLgmLT;AsD/pLD;EASI,mBAAA;EACA,kCAAA;CtDypLH;AsDppLD;EACE,cAAA;EACA,mBAAA;CtDspLD;AsDppLD;EACE,aAAA;EACA,mBAAA;CtDspLD;AuD5qLD;EACE,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,YAAA;EACA,0BAAA;EjCRA,aAAA;EAGA,0BAAA;CtBqrLD;AuD7qLC;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;EjCfF,aAAA;EAGA,0BAAA;CtB6rLD;AuDzqLC;EACE,WAAA;EACA,gBAAA;EACA,wBAAA;EACA,UAAA;EACA,yBAAA;CvD2qLH;AwDhsLD;EACE,iBAAA;CxDksLD;AwD9rLD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,kCAAA;EAIA,WAAA;CxD6rLD;AwD1rLC;EnD+GA,sCAAA;EACI,kCAAA;EACC,iCAAA;EACG,8BAAA;EAkER,oDAAA;EAEK,0CAAA;EACG,oCAAA;CL6gLT;AwDhsLC;EnD2GA,mCAAA;EACI,+BAAA;EACC,8BAAA;EACG,2BAAA;CLwlLT;AwDpsLD;EACE,mBAAA;EACA,iBAAA;CxDssLD;AwDlsLD;EACE,mBAAA;EACA,YAAA;EACA,aAAA;CxDosLD;AwDhsLD;EACE,mBAAA;EACA,uBAAA;EACA,uBAAA;EACA,qCAAA;EACA,mBAAA;EnDaA,iDAAA;EACQ,yCAAA;EmDZR,qCAAA;UAAA,6BAAA;EAEA,WAAA;CxDksLD;AwD9rLD;EACE,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,uBAAA;CxDgsLD;AwD9rLC;ElCrEA,WAAA;EAGA,yBAAA;CtBowLD;AwDjsLC;ElCtEA,aAAA;EAGA,0BAAA;CtBwwLD;AwDhsLD;EACE,cAAA;EACA,iCAAA;CxDksLD;AwD9rLD;EACE,iBAAA;CxDgsLD;AwD5rLD;EACE,UAAA;EACA,wBAAA;CxD8rLD;AwDzrLD;EACE,mBAAA;EACA,cAAA;CxD2rLD;AwDvrLD;EACE,cAAA;EACA,kBAAA;EACA,8BAAA;CxDyrLD;AwD5rLD;EAQI,iBAAA;EACA,iBAAA;CxDurLH;AwDhsLD;EAaI,kBAAA;CxDsrLH;AwDnsLD;EAiBI,eAAA;CxDqrLH;AwDhrLD;EACE,mBAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;CxDkrLD;AwDhqLD;EAZE;IACE,aAAA;IACA,kBAAA;GxD+qLD;EwD7qLD;InDvEA,kDAAA;IACQ,0CAAA;GLuvLP;EwD5qLD;IAAY,aAAA;GxD+qLX;CACF;AwD1qLD;EAFE;IAAY,aAAA;GxDgrLX;CACF;AyD/zLD;EACE,mBAAA;EACA,cAAA;EACA,eAAA;ECRA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;EDHA,gBAAA;EnCVA,WAAA;EAGA,yBAAA;CtBs1LD;AyD30LC;EnCdA,aAAA;EAGA,0BAAA;CtB01LD;AyD90LC;EAAW,iBAAA;EAAmB,eAAA;CzDk1L/B;AyDj1LC;EAAW,iBAAA;EAAmB,eAAA;CzDq1L/B;AyDp1LC;EAAW,gBAAA;EAAmB,eAAA;CzDw1L/B;AyDv1LC;EAAW,kBAAA;EAAmB,eAAA;CzD21L/B;AyDv1LD;EACE,iBAAA;EACA,iBAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,mBAAA;CzDy1LD;AyDr1LD;EACE,mBAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;CzDu1LD;AyDn1LC;EACE,UAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,uBAAA;CzDq1LH;AyDn1LC;EACE,UAAA;EACA,WAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;CzDq1LH;AyDn1LC;EACE,UAAA;EACA,UAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;CzDq1LH;AyDn1LC;EACE,SAAA;EACA,QAAA;EACA,iBAAA;EACA,4BAAA;EACA,yBAAA;CzDq1LH;AyDn1LC;EACE,SAAA;EACA,SAAA;EACA,iBAAA;EACA,4BAAA;EACA,wBAAA;CzDq1LH;AyDn1LC;EACE,OAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,0BAAA;CzDq1LH;AyDn1LC;EACE,OAAA;EACA,WAAA;EACA,iBAAA;EACA,wBAAA;EACA,0BAAA;CzDq1LH;AyDn1LC;EACE,OAAA;EACA,UAAA;EACA,iBAAA;EACA,wBAAA;EACA,0BAAA;CzDq1LH;A2Dl7LD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,iBAAA;EACA,aAAA;EDXA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;ECAA,gBAAA;EAEA,uBAAA;EACA,qCAAA;UAAA,6BAAA;EACA,uBAAA;EACA,qCAAA;EACA,mBAAA;EtD8CA,kDAAA;EACQ,0CAAA;CLk5LT;A2D77LC;EAAY,kBAAA;C3Dg8Lb;A2D/7LC;EAAY,kBAAA;C3Dk8Lb;A2Dj8LC;EAAY,iBAAA;C3Do8Lb;A2Dn8LC;EAAY,mBAAA;C3Ds8Lb;A2Dn8LD;EACE,UAAA;EACA,kBAAA;EACA,gBAAA;EACA,0BAAA;EACA,iCAAA;EACA,2BAAA;C3Dq8LD;A2Dl8LD;EACE,kBAAA;C3Do8LD;A2D57LC;;EAEE,mBAAA;EACA,eAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;C3D87LH;A2D37LD;EACE,mBAAA;C3D67LD;A2D37LD;EACE,mBAAA;EACA,YAAA;C3D67LD;A2Dz7LC;EACE,UAAA;EACA,mBAAA;EACA,uBAAA;EACA,0BAAA;EACA,sCAAA;EACA,cAAA;C3D27LH;A2D17LG;EACE,aAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,uBAAA;C3D47LL;A2Dz7LC;EACE,SAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,4BAAA;EACA,wCAAA;C3D27LH;A2D17LG;EACE,aAAA;EACA,UAAA;EACA,cAAA;EACA,qBAAA;EACA,yBAAA;C3D47LL;A2Dz7LC;EACE,UAAA;EACA,mBAAA;EACA,oBAAA;EACA,6BAAA;EACA,yCAAA;EACA,WAAA;C3D27LH;A2D17LG;EACE,aAAA;EACA,SAAA;EACA,mBAAA;EACA,oBAAA;EACA,0BAAA;C3D47LL;A2Dx7LC;EACE,SAAA;EACA,aAAA;EACA,kBAAA;EACA,sBAAA;EACA,2BAAA;EACA,uCAAA;C3D07LH;A2Dz7LG;EACE,aAAA;EACA,WAAA;EACA,sBAAA;EACA,wBAAA;EACA,cAAA;C3D27LL;A4DpjMD;EACE,mBAAA;C5DsjMD;A4DnjMD;EACE,mBAAA;EACA,iBAAA;EACA,YAAA;C5DqjMD;A4DxjMD;EAMI,cAAA;EACA,mBAAA;EvD6KF,0CAAA;EACK,qCAAA;EACG,kCAAA;CLy4LT;A4D/jMD;;EAcM,eAAA;C5DqjML;A4D3hMC;EA4NF;IvD3DE,uDAAA;IAEK,6CAAA;IACG,uCAAA;IA7JR,oCAAA;IAEQ,4BAAA;IA+GR,4BAAA;IAEQ,oBAAA;GL86LP;E4DzjMG;;IvDmHJ,2CAAA;IACQ,mCAAA;IuDjHF,QAAA;G5D4jML;E4D1jMG;;IvD8GJ,4CAAA;IACQ,oCAAA;IuD5GF,QAAA;G5D6jML;E4D3jMG;;;IvDyGJ,wCAAA;IACQ,gCAAA;IuDtGF,QAAA;G5D8jML;CACF;A4DpmMD;;;EA6CI,eAAA;C5D4jMH;A4DzmMD;EAiDI,QAAA;C5D2jMH;A4D5mMD;;EAsDI,mBAAA;EACA,OAAA;EACA,YAAA;C5D0jMH;A4DlnMD;EA4DI,WAAA;C5DyjMH;A4DrnMD;EA+DI,YAAA;C5DyjMH;A4DxnMD;;EAmEI,QAAA;C5DyjMH;A4D5nMD;EAuEI,YAAA;C5DwjMH;A4D/nMD;EA0EI,WAAA;C5DwjMH;A4DhjMD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EtC9FA,aAAA;EAGA,0BAAA;EsC6FA,gBAAA;EACA,YAAA;EACA,mBAAA;EACA,0CAAA;EACA,mCAAA;C5DmjMD;A4D9iMC;EdnGE,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9CopMH;A4DljMC;EACE,WAAA;EACA,SAAA;EdxGA,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9C6pMH;A4DpjMC;;EAEE,WAAA;EACA,YAAA;EACA,sBAAA;EtCvHF,aAAA;EAGA,0BAAA;CtB4qMD;A4DtlMD;;;;EAuCI,mBAAA;EACA,SAAA;EACA,kBAAA;EACA,WAAA;EACA,sBAAA;C5DqjMH;A4DhmMD;;EA+CI,UAAA;EACA,mBAAA;C5DqjMH;A4DrmMD;;EAoDI,WAAA;EACA,oBAAA;C5DqjMH;A4D1mMD;;EAyDI,YAAA;EACA,aAAA;EACA,eAAA;EACA,mBAAA;C5DqjMH;A4DhjMG;EACE,iBAAA;C5DkjML;A4D9iMG;EACE,iBAAA;C5DgjML;A4DtiMD;EACE,mBAAA;EACA,aAAA;EACA,UAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;C5DwiMD;A4DjjMD;EAYI,sBAAA;EACA,YAAA;EACA,aAAA;EACA,YAAA;EACA,oBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;EAWA,0BAAA;EACA,mCAAA;C5D8hMH;A4D7jMD;EAkCI,UAAA;EACA,YAAA;EACA,aAAA;EACA,uBAAA;C5D8hMH;A4DvhMD;EACE,mBAAA;EACA,UAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,YAAA;EACA,mBAAA;EACA,0CAAA;C5DyhMD;A4DxhMC;EACE,kBAAA;C5D0hMH;A4Dj/LD;EAhCE;;;;IAKI,YAAA;IACA,aAAA;IACA,kBAAA;IACA,gBAAA;G5DmhMH;E4D3hMD;;IAYI,mBAAA;G5DmhMH;E4D/hMD;;IAgBI,oBAAA;G5DmhMH;E4D9gMD;IACE,UAAA;IACA,WAAA;IACA,qBAAA;G5DghMD;E4D5gMD;IACE,aAAA;G5D8gMD;CACF;A6D7wMC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE,aAAA;EACA,eAAA;C7D6yMH;A6D3yMC;;;;;;;;;;;;;;;;EACE,YAAA;C7D4zMH;AiCp0MD;E6BRE,eAAA;EACA,kBAAA;EACA,mBAAA;C9D+0MD;AiCt0MD;EACE,wBAAA;CjCw0MD;AiCt0MD;EACE,uBAAA;CjCw0MD;AiCh0MD;EACE,yBAAA;CjCk0MD;AiCh0MD;EACE,0BAAA;CjCk0MD;AiCh0MD;EACE,mBAAA;CjCk0MD;AiCh0MD;E8BzBE,YAAA;EACA,mBAAA;EACA,kBAAA;EACA,8BAAA;EACA,UAAA;C/D41MD;AiC9zMD;EACE,yBAAA;CjCg0MD;AiCzzMD;EACE,gBAAA;CjC2zMD;AgE51MD;EACE,oBAAA;ChE81MD;AgEx1MD;;;;ECdE,yBAAA;CjE42MD;AgEv1MD;;;;;;;;;;;;EAYE,yBAAA;ChEy1MD;AgEl1MD;EA6IA;IC7LE,0BAAA;GjEs4MC;EiEr4MD;IAAU,0BAAA;GjEw4MT;EiEv4MD;IAAU,8BAAA;GjE04MT;EiEz4MD;;IACU,+BAAA;GjE44MT;CACF;AgE51MD;EAwIA;IA1II,0BAAA;GhEk2MD;CACF;AgE51MD;EAmIA;IArII,2BAAA;GhEk2MD;CACF;AgE51MD;EA8HA;IAhII,iCAAA;GhEk2MD;CACF;AgE31MD;EAwHA;IC7LE,0BAAA;GjEo6MC;EiEn6MD;IAAU,0BAAA;GjEs6MT;EiEr6MD;IAAU,8BAAA;GjEw6MT;EiEv6MD;;IACU,+BAAA;GjE06MT;CACF;AgEr2MD;EAmHA;IArHI,0BAAA;GhE22MD;CACF;AgEr2MD;EA8GA;IAhHI,2BAAA;GhE22MD;CACF;AgEr2MD;EAyGA;IA3GI,iCAAA;GhE22MD;CACF;AgEp2MD;EAmGA;IC7LE,0BAAA;GjEk8MC;EiEj8MD;IAAU,0BAAA;GjEo8MT;EiEn8MD;IAAU,8BAAA;GjEs8MT;EiEr8MD;;IACU,+BAAA;GjEw8MT;CACF;AgE92MD;EA8FA;IAhGI,0BAAA;GhEo3MD;CACF;AgE92MD;EAyFA;IA3FI,2BAAA;GhEo3MD;CACF;AgE92MD;EAoFA;IAtFI,iCAAA;GhEo3MD;CACF;AgE72MD;EA8EA;IC7LE,0BAAA;GjEg+MC;EiE/9MD;IAAU,0BAAA;GjEk+MT;EiEj+MD;IAAU,8BAAA;GjEo+MT;EiEn+MD;;IACU,+BAAA;GjEs+MT;CACF;AgEv3MD;EAyEA;IA3EI,0BAAA;GhE63MD;CACF;AgEv3MD;EAoEA;IAtEI,2BAAA;GhE63MD;CACF;AgEv3MD;EA+DA;IAjEI,iCAAA;GhE63MD;CACF;AgEt3MD;EAyDA;ICrLE,yBAAA;GjEs/MC;CACF;AgEt3MD;EAoDA;ICrLE,yBAAA;GjE2/MC;CACF;AgEt3MD;EA+CA;ICrLE,yBAAA;GjEggNC;CACF;AgEt3MD;EA0CA;ICrLE,yBAAA;GjEqgNC;CACF;AgEn3MD;ECnJE,yBAAA;CjEygND;AgEh3MD;EA4BA;IC7LE,0BAAA;GjEqhNC;EiEphND;IAAU,0BAAA;GjEuhNT;EiEthND;IAAU,8BAAA;GjEyhNT;EiExhND;;IACU,+BAAA;GjE2hNT;CACF;AgE93MD;EACE,yBAAA;ChEg4MD;AgE33MD;EAqBA;IAvBI,0BAAA;GhEi4MD;CACF;AgE/3MD;EACE,yBAAA;ChEi4MD;AgE53MD;EAcA;IAhBI,2BAAA;GhEk4MD;CACF;AgEh4MD;EACE,yBAAA;ChEk4MD;AgE73MD;EAOA;IATI,iCAAA;GhEm4MD;CACF;AgE53MD;EACA;ICrLE,yBAAA;GjEojNC;CACF","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n border: 0;\n background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #fff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #ccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: floor((@gutter / 2));\n padding-right: ceil((@gutter / 2));\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on ``\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n .border-top-radius(@btn-border-radius-base);\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n .border-top-radius(0);\n .border-bottom-radius(@btn-border-radius-base);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @input-border-radius;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @input-border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @input-border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on
    ,
      , or
      .\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsible panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n &:extend(.clearfix all);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: @line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: (@carousel-control-font-size * 1.5);\n height: (@carousel-control-font-size * 1.5);\n margin-top: (@carousel-control-font-size / -2);\n font-size: (@carousel-control-font-size * 1.5);\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: (@carousel-control-font-size / -2);\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: (@carousel-control-font-size / -2);\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file diff --git a/source/common/style-sheets/dashboard/common.css b/source/common/style-sheets/dashboard/common.css index ad00a32..683363a 100644 --- a/source/common/style-sheets/dashboard/common.css +++ b/source/common/style-sheets/dashboard/common.css @@ -1,4 +1,31 @@ -html { overflow: auto; } +/* Dashboard styles */ + +html { overflow: auto; padding-bottom: 0; } +#web-developer-dashboard-panels .nav-tabs > li:first-child, #web-developer-dashboard-tabs > li:first-child { margin-left: 5px; } +#web-developer-dashboard-resizer { background-color: #e6e6e6; border-bottom: 1px solid #a3a3a3; color: #666; cursor: row-resize; font-size: 9px; height: 5px; line-height: 5px; text-align: center; } +#web-developer-dashboard-tabs { margin: 5px 0; } +#web-developer-dashboard-title { background: url(/common/images/logos/16.png) no-repeat 0 0; font-size: 14px; line-height: 16px; margin: 0; padding-left: 20px; position: absolute; right: 5px; top: 21px; } + +@media (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5) +{ + #web-developer-dashboard-title { background-image: url(/common/images/logos/32.png); background-size: 16px 16px; } +} + +/* Edit CSS styles */ + +#web-developer-edit-css-panels > div > textarea { border-style: none; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 13px; height: 100%; word-wrap: normal; } + +/* Element information styles */ + +#element-information-panel { margin: 0 5px; overflow: scroll; } + +/* Element ancestors styles */ + +#current-element-ancestors { border-top: 1px solid #a3a3a3; bottom: 0; -webkit-box-shadow: 0 0 7px rgba(0, 0, 0, 0.3); -moz-box-shadow: 0 0 7px rgba(0, 0, 0, 0.3); box-shadow: 0 0 7px rgba(0, 0, 0, 0.3); left: 0; position: fixed; width: 100%; } +#current-element-ancestors > .breadcrumb { background-color: #e6e6e6; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; margin: 0; } +#current-element-ancestors > .breadcrumb > li { color: #333; } +#current-element-ancestors > .breadcrumb > li > a { color: #999; cursor: text; pointer-events: none; text-decoration: none; } + #web-developer-content { background-color: #f5f5f5; border-style: none; color: #333; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 13px; margin: 0; padding: 0; word-wrap: normal; width: 100%; } #web-developer-ancestors { margin: 10px 0 -10px 0; } #web-developer-ancestors:after, #web-developer-ancestors:before { clear: both; content: ""; display: block; height: 0; overflow: hidden; visibility: hidden; } @@ -7,4 +34,10 @@ html { overflow: auto; } #web-developer-copy-ancestor-path { float: right; } #web-developer-information { margin-bottom: 0; } .breadcrumb { overflow: hidden; position: relative; } +.CodeMirror { border-color: #000; border-color: rgba(0, 0, 0, 0.15); border-style: solid; border-width: 1px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); } +.web-developer-ancestors, .web-developer-children { padding-bottom: 10px; } +.web-developer-ancestors > ol, .web-developer-children > ol { background-color: #f5f5f5; border-color: #000; border-color: rgba(0, 0, 0, 0.15); border-style: solid; border-width: 1px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; list-style-type: none; margin: 0; padding: 10px; } +.web-developer-ancestors > ol > li, .web-developer-children > ol > li { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.web-developer-ancestors > ol > .last { display: none; } +.web-developer-css .CodeMirror-scroll > div { height: auto !important; } .web-developer-middle-ancestor a { cursor: text; text-decoration: none; } diff --git a/source/chrome/style-sheets/dashboard/dashboard.css b/source/common/style-sheets/dashboard/dashboard.css similarity index 100% rename from source/chrome/style-sheets/dashboard/dashboard.css rename to source/common/style-sheets/dashboard/dashboard.css diff --git a/source/common/style-sheets/dashboard/element-information.css b/source/common/style-sheets/dashboard/element-information.css deleted file mode 100644 index d1e18ed..0000000 --- a/source/common/style-sheets/dashboard/element-information.css +++ /dev/null @@ -1,6 +0,0 @@ -.CodeMirror { border-color: #000; border-color: rgba(0, 0, 0, 0.15); border-style: solid; border-width: 1px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); } -.web-developer-ancestors, .web-developer-children { padding-bottom: 10px; } -.web-developer-ancestors > ol, .web-developer-children > ol { background-color: #f5f5f5; border-color: #000; border-color: rgba(0, 0, 0, 0.15); border-style: solid; border-width: 1px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; list-style-type: none; margin: 0; padding: 10px; } -.web-developer-ancestors > ol > li, .web-developer-children > ol > li { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.web-developer-ancestors > ol > .last { display: none; } -.web-developer-css .CodeMirror-scroll > div { height: auto !important; } diff --git a/source/common/style-sheets/generated/common.css b/source/common/style-sheets/generated/common.css index 62c2500..e6ee47d 100644 --- a/source/common/style-sheets/generated/common.css +++ b/source/common/style-sheets/generated/common.css @@ -9,12 +9,12 @@ pre { overflow: auto; white-space: pre; } .dropdown-menu { min-width: 360px; max-width: 480px; } .dropdown-menu a { white-space: normal; } .help-block:empty { display: none; } -.navbar-text { background: url(@common.prefix@/common/images/logos/16.png) no-repeat 0 2px; padding-left: 20px; } +.navbar-text { background: url(/common/images/logos/16.png) no-repeat 0 2px; padding-left: 20px; } .progress { margin: 100px auto; width: 50%; } .progress > .progress-bar { width: 50%; } .web-developer-separator { border-top: 1px solid #eee; margin: 40px; } @media (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5) { - .navbar-text { background-image: url(@common.prefix@/common/images/logos/32.png); background-size: 16px 16px; } + .navbar-text { background-image: url(/common/images/logos/32.png); background-size: 16px 16px; } } diff --git a/source/chrome/style-sheets/options/options.css b/source/common/style-sheets/options/options.css similarity index 88% rename from source/chrome/style-sheets/options/options.css rename to source/common/style-sheets/options/options.css index b2673a5..8669c1c 100644 --- a/source/chrome/style-sheets/options/options.css +++ b/source/common/style-sheets/options/options.css @@ -1,10 +1,10 @@ /* Options styles */ -body { padding: 70px 0 20px 0; } +body { min-width: 750px; padding: 70px 0 20px 0; } #delete-dialog { display: none; } .form-horizontal .btn-default { margin-right: 5px; } .help-block:empty { display: none; } -.navbar-text { background: url(@common.prefix@/common/images/logos/16.png) no-repeat 0 2px; padding-left: 20px; } +.navbar-text { background: url(/common/images/logos/16.png) no-repeat 0 2px; padding-left: 20px; } .single .btn-danger { display: none; } .tab-content { margin-top: 20px; } .table tbody > tr > td { vertical-align: middle; } @@ -16,7 +16,7 @@ body { padding: 70px 0 20px 0; } @media (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5) { - .navbar-text { background-image: url(@common.prefix@/common/images/logos/32.png); background-size: 16px 16px; } + .navbar-text { background-image: url(/common/images/logos/32.png); background-size: 16px 16px; } } @media (min-width: 768px) diff --git a/source/chrome/style-sheets/overlay/overlay.css b/source/common/style-sheets/overlay/overlay.css similarity index 91% rename from source/chrome/style-sheets/overlay/overlay.css rename to source/common/style-sheets/overlay/overlay.css index ecab275..20e6bac 100644 --- a/source/chrome/style-sheets/overlay/overlay.css +++ b/source/common/style-sheets/overlay/overlay.css @@ -1,9 +1,7 @@ /* Overlay styles */ *::selection { background-color: transparent; } -html { width: 800px; } -body, html { overflow: hidden; } -body { max-width: 100vw; } +body, html { overflow: hidden; width: 800px; } body::-webkit-scrollbar, html::-webkit-scrollbar { display: none; } .help-block:empty { display: none; } @@ -65,7 +63,3 @@ body::-webkit-scrollbar, html::-webkit-scrollbar { display: none; } #resize-window-cancel { margin-right: 5px; } #resize-window-dialog { display: none; margin: 5px; } #resize-window-dialog .form-actions { margin-bottom: 0; } - -/* Opera styles */ - -.opera #clear-cache, .opera #clear-history, .opera #disable-cookies, .opera #disable-images, .opera #disable-menu, .opera #disable-toolbar { display: none; } diff --git a/source/chrome/style-sheets/toolbar/color-picker-toolbar.css b/source/common/style-sheets/toolbar/color-picker-toolbar.css similarity index 100% rename from source/chrome/style-sheets/toolbar/color-picker-toolbar.css rename to source/common/style-sheets/toolbar/color-picker-toolbar.css diff --git a/source/chrome/style-sheets/toolbar/color-picker.css b/source/common/style-sheets/toolbar/color-picker.css similarity index 100% rename from source/chrome/style-sheets/toolbar/color-picker.css rename to source/common/style-sheets/toolbar/color-picker.css diff --git a/source/chrome/style-sheets/toolbar/common.css b/source/common/style-sheets/toolbar/common.css similarity index 100% rename from source/chrome/style-sheets/toolbar/common.css rename to source/common/style-sheets/toolbar/common.css diff --git a/source/common/style-sheets/toolbar/line-guides.css b/source/common/style-sheets/toolbar/line-guides.css index 113c7f6..de3762f 100644 --- a/source/common/style-sheets/toolbar/line-guides.css +++ b/source/common/style-sheets/toolbar/line-guides.css @@ -1,3 +1,9 @@ +span { display: none; } +#add-horizontal-line-guide { margin: 0 5px 0 20px; } +#line-guide-position, #previous-line-guide-position { margin: 0 10px 0 5px; } +#next-line-guide-position { margin-left: 5px; } +.display-information span { display: inline; } + .web-developer-line-guide { background: transparent !important; @@ -22,11 +28,11 @@ text-transform: none !important; } -*::selection { background-color: transparent !important; } -*::-moz-selection { background-color: transparent !important; } - .web-developer-horizontal-line-guide { left: 0 !important; padding: 2px 0 !important; } .web-developer-horizontal-line-guide div { height: 1px !important; width: 100% !important; } .web-developer-line-guide { cursor: move !important; position: fixed !important; z-index: 2147483646 !important; } .web-developer-vertical-line-guide { padding: 0 2px !important; top: 0 !important; } .web-developer-vertical-line-guide div { height: 100% !important; width: 1px !important; } + +*::selection { background-color: transparent !important; } +*::-moz-selection { background-color: transparent !important; } diff --git a/source/common/style-sheets/toolbar/ruler.css b/source/common/style-sheets/toolbar/ruler.css index f8bf262..fe9e554 100644 --- a/source/common/style-sheets/toolbar/ruler.css +++ b/source/common/style-sheets/toolbar/ruler.css @@ -12,5 +12,9 @@ #web-developer-ruler-bottom-left { border-width: 1px 1px 0 0 !important; cursor: sw-resize !important; } #web-developer-ruler-bottom-right { border-width: 1px 0 0 1px !important; cursor: se-resize !important; } #web-developer-ruler-container { z-index: 2147483647 !important; } +#web-developer-ruler-end-x, #web-developer-ruler-start-x { margin: 0 10px 0 5px; } +#web-developer-ruler-end-y { margin-left: 5px; } +#web-developer-ruler-height, #web-developer-ruler-width { margin: 0 20px 0 0; width: 60px; } +#web-developer-ruler-start-y { margin: 0 20px 0 5px; } #web-developer-ruler-top-left { border-width: 0 1px 1px 0 !important; cursor: nw-resize !important; } #web-developer-ruler-top-right { border-width: 0 0 1px 1px !important; cursor: ne-resize !important; } diff --git a/source/chrome/style-sheets/toolbar/toolbar.css b/source/common/style-sheets/toolbar/toolbar.css similarity index 100% rename from source/chrome/style-sheets/toolbar/toolbar.css rename to source/common/style-sheets/toolbar/toolbar.css diff --git a/source/firefox/html/dashboard/edit-css.html b/source/firefox/html/dashboard/edit-css.html deleted file mode 100644 index 836edc1..0000000 --- a/source/firefox/html/dashboard/edit-css.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - @name@ - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/html/dashboard/edit-html.html b/source/firefox/html/dashboard/edit-html.html deleted file mode 100644 index 9353e85..0000000 --- a/source/firefox/html/dashboard/edit-html.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - @name@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/html/dashboard/element-information.html b/source/firefox/html/dashboard/element-information.html deleted file mode 100644 index 7205472..0000000 --- a/source/firefox/html/dashboard/element-information.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - @name@ - - - - - - - - -
      -

      -
      - - - - - - - - - - - - - - diff --git a/source/firefox/html/dashboard/style-information.html b/source/firefox/html/dashboard/style-information.html deleted file mode 100644 index 8f5b40a..0000000 --- a/source/firefox/html/dashboard/style-information.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - @name@ - - - - - - - - -
      -

      -
      - - - - - - - - - - - - diff --git a/source/firefox/html/generated/view-document-size.html b/source/firefox/html/generated/view-document-size.html deleted file mode 100644 index 22159b4..0000000 --- a/source/firefox/html/generated/view-document-size.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - @name@ - - - - - - - - - -
      - -
      -
      -
      -
      -
      - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/html/toolbar/element-ancestors.html b/source/firefox/html/toolbar/element-ancestors.html deleted file mode 100644 index fbf5a05..0000000 --- a/source/firefox/html/toolbar/element-ancestors.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - @name@ - - - - - - -
      - - - - - - - diff --git a/source/firefox/html/validation/css.html b/source/firefox/html/validation/css.html deleted file mode 100644 index c528632..0000000 --- a/source/firefox/html/validation/css.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - @name@ - - - - - - - - -
      -
      -
      -
      -
      - - - - - - diff --git a/source/firefox/html/validation/html.html b/source/firefox/html/validation/html.html deleted file mode 100644 index 804c8ac..0000000 --- a/source/firefox/html/validation/html.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - @name@ - - - - - - - - -
      -
      -
      -
      -
      - - - - - - diff --git a/source/firefox/javascript/application/application.js b/source/firefox/javascript/application/application.js deleted file mode 100644 index 6de9741..0000000 --- a/source/firefox/javascript/application/application.js +++ /dev/null @@ -1,207 +0,0 @@ -// Constructs an application object -function WebDeveloperApplication(applicationPath) -{ - this.applicationPath = applicationPath; - this.executable = this.getExecutable(); - this.file = null; -} - -// Creates a source file -WebDeveloperApplication.prototype.createSourceFile = function(temporaryDirectory, uri) -{ - var sourceFile = null; - - // If the URI has a file scheme - if(uri.scheme == "file") - { - var fileProtocolHandler = Components.classes["@mozilla.org/network/protocol;1?name=file"].createInstance(Components.interfaces.nsIFileProtocolHandler); - - sourceFile = fileProtocolHandler.getFileFromURLSpec(uri.spec); - } - - // If the source file is not set - if(!sourceFile) - { - var fileExtension = "html"; - var fileName = uri.host; - var url = Components.classes["@mozilla.org/network/standard-url;1"].createInstance(Components.interfaces.nsIURL); - - sourceFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); - url.spec = uri.spec; - - // If the URL has a file extension - if(url.fileExtension) - { - fileExtension = url.fileExtension; - } - - temporaryDirectory.append("webdeveloper-" + fileName + "-" + new Date().getTime() + "." + fileExtension); - sourceFile.initWithPath(temporaryDirectory.path); - } - - return sourceFile; -}; - -// Returns an executable for the application -WebDeveloperApplication.prototype.getExecutable = function() -{ - var executable = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); - - // If the extension is running on a Mac and the application path points at an application bundle - if(WebDeveloper.Common.isMac() && WebDeveloper.Common.endsWith(this.applicationPath, ".app")) - { - executable.initWithPath("/usr/bin/open"); - } - else - { - executable.initWithPath(this.applicationPath); - } - - return executable; -}; - -// Returns the post data -WebDeveloperApplication.prototype.getPostData = function() -{ - // Try to get the post data - try - { - var sessionHistory = getWebNavigation().sessionHistory; - var entry = sessionHistory.getEntryAtIndex(sessionHistory.index, false).QueryInterface(Components.interfaces.nsISHEntry); - - return entry.postData; - } - catch(exception) - { - return null; - } -}; - -// Launch the application with the given file -WebDeveloperApplication.prototype.launchWithFile = function() -{ - var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess); - var processArguments = [this.file.path]; - - process.init(this.executable); - - // If the extension is running on a Mac and the application path points at an application bundle - if(WebDeveloper.Common.isMac() && WebDeveloper.Common.endsWith(this.applicationPath, ".app")) - { - processArguments = ["-a", this.applicationPath, this.file.path]; - } - - process.run(false, processArguments, processArguments.length); -}; - -// Launch the application with the source from the given URI -WebDeveloperApplication.prototype.launchWithSource = function(uri, contentWindow) -{ - var temporaryDirectory = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("TmpD", Components.interfaces.nsIFile); - - // If the temporary directory exists, is a directory and is writable - if(temporaryDirectory.exists() && temporaryDirectory.isDirectory() && temporaryDirectory.isWritable()) - { - // If the executable exists and is executable - if(this.executable.exists() && this.executable.isExecutable()) - { - this.file = this.createSourceFile(temporaryDirectory, uri); - - if(uri.scheme == "file") - { - this.launchWithFile(); - } - else - { - var webBrowserPersistInterface = Components.interfaces.nsIWebBrowserPersist; - var webBrowserPersist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(webBrowserPersistInterface); - - webBrowserPersist.persistFlags = webBrowserPersistInterface.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION | webBrowserPersistInterface.PERSIST_FLAGS_FROM_CACHE | webBrowserPersistInterface.PERSIST_FLAGS_REPLACE_EXISTING_FILES; - webBrowserPersist.progressListener = this; - - // Try to use the old method signature for Firefox < 36 - try - { - webBrowserPersist.saveURI(uri, null, uri, this.getPostData(), null, this.file, contentWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIWebNavigation).QueryInterface(Components.interfaces.nsILoadContext)); - } - catch(exception) - { - webBrowserPersist.saveURI(uri, null, uri, this.getPostData(), null, 0, this.file, contentWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIWebNavigation).QueryInterface(Components.interfaces.nsILoadContext)); - } - } - } - else - { - WebDeveloper.Common.displayError(WebDeveloper.Locales.getString("viewSourceWith"), WebDeveloper.Locales.getFormattedString("launchApplicationFailed", [this.applicationPath])); - } - } - else - { - WebDeveloper.Common.displayError(WebDeveloper.Locales.getString("viewSourceWith"), WebDeveloper.Locales.getFormattedString("temporaryDirectoryFailed", [temporaryDirectory.path])); - } -}; - -// Launch the application with the given URL -WebDeveloperApplication.prototype.launchWithURL = function(url) -{ - // If the executable exists and is executable - if(this.executable.exists() && this.executable.isExecutable()) - { - var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess); - var processArguments = [url]; - - process.init(this.executable); - - // If the extension is running on a Mac and the application path points at an application bundle - if(WebDeveloper.Common.isMac() && WebDeveloper.Common.endsWith(this.applicationPath, ".app")) - { - processArguments = ["-a", this.applicationPath, url]; - } - - process.run(false, processArguments, processArguments.length); - } - else - { - WebDeveloper.Common.displayError(WebDeveloper.Locales.getString("openApplication"), WebDeveloper.Locales.getFormattedString("launchApplicationFailed", [this.applicationPath])); - } -}; - -// Called when the progress state changes -WebDeveloperApplication.prototype.onStateChange = function(webProgress, request, stateFlags) -{ - // If the progress has stopped - if(stateFlags & Components.interfaces.nsIWebProgressListener.STATE_STOP) - { - this.launchWithFile(); - } -}; - -// Indicates the interfaces this object supports -WebDeveloperApplication.prototype.QueryInterface = function(id) -{ - // If the query is for a supported interface - if(id.equals(Components.interfaces.nsISupports) || id.equals(Components.interfaces.nsIWebProgressListener)) - { - return this; - } - - throw Components.results.NS_NOINTERFACE; -}; - -// Dummy methods requiring implementations -WebDeveloperApplication.prototype.onLocationChange = function() -{ - // Ignore -}; -WebDeveloperApplication.prototype.onProgressChange = function() -{ - // Ignore -}; -WebDeveloperApplication.prototype.onSecurityChange = function() -{ - // Ignore -}; -WebDeveloperApplication.prototype.onStatusChange = function() -{ - // Ignore -}; diff --git a/source/firefox/javascript/common/common.js b/source/firefox/javascript/common/common.js deleted file mode 100644 index 36d64bf..0000000 --- a/source/firefox/javascript/common/common.js +++ /dev/null @@ -1,495 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Common = WebDeveloper.Common || {}; - -// Clears a notification -WebDeveloper.Common.clearNotification = function() -{ - var notificationBox = WebDeveloper.Common.getTabBrowser().getNotificationBox(); - var existingNotification = notificationBox.getNotificationWithValue("web-developer-notification"); - - // If there is an existing notification - if(existingNotification) - { - notificationBox.removeNotification(existingNotification); - } -}; - -// Configures the element with the given attribute and value -WebDeveloper.Common.configureElement = function(element, attribute, value) -{ - // If the element exists - if(element) - { - element.setAttribute(attribute, value); - } -}; - -// Converts a value to a boolean -WebDeveloper.Common.convertToBoolean = function(value) -{ - // If the value is false - if(value == "false") - { - return false; - } - - return Boolean(value).valueOf(); -}; - -// Displays an error message -WebDeveloper.Common.displayError = function(title, message) -{ - Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService).alert(null, title, message); -}; - -// Displays a notification -WebDeveloper.Common.displayNotification = function(notification, substitutes) -{ - var message = null; - var notificationBox = WebDeveloper.Common.getTabBrowser().getNotificationBox(); - - // If there are substitutes - if(substitutes) - { - message = WebDeveloper.Locales.getFormattedString(notification, substitutes); - } - else - { - message = WebDeveloper.Locales.getString(notification); - } - - WebDeveloper.Common.clearNotification(); - notificationBox.appendNotification(message, "web-developer-notification", "chrome://web-developer/skin/button.png", notificationBox.PRIORITY_INFO_HIGH, null); -}; - -// Displays a message with a URL -WebDeveloper.Common.displayURLMessage = function(message, url) -{ - window.openDialog("chrome://web-developer/content/dialogs/message.xul", "web-developer-message-dialog", "centerscreen,chrome,modal", message, url); -}; - -// Handles the completion of a file size request -WebDeveloper.Common.fileSizeRequestComplete = function(fileSize, fileSizeRequest, configuration) -{ - fileSizeRequest.fileObject.size = fileSize; - - configuration.fileSizeRequestsRemaining--; - - // If there are no file size requests remaining - if(configuration.fileSizeRequestsRemaining === 0) - { - configuration.callback(); - } -}; - -// Formats a file size -WebDeveloper.Common.formatFileSize = function(fileSize, bytesLocale, kilobytesLocale) -{ - // If the file size is set - if(fileSize) - { - // If the file size is greater than a kilobyte - if(fileSize > 1024) - { - return Math.round(fileSize / 1024) + " " + kilobytesLocale; - } - - return fileSize + " " + bytesLocale; - } - - return ""; -}; - -// Returns a chrome URL -WebDeveloper.Common.getChromeURL = function(url) -{ - return "chrome://web-developer/content/" + url; -}; - -// Returns the id for a command -WebDeveloper.Common.getCommandId = function(id) -{ - // If the id is set - if(id) - { - return "web-developer-" + id + "-command"; - } - - return ""; -}; - -// Returns the compressed file size -WebDeveloper.Common.getCompressedFileSize = function(fileSize, fileSizeRequest, configuration, callback) -{ - var url = fileSizeRequest.url; - - // Gets the file from the cache - WebDeveloper.Common.getFileFromCache(url, function(file) - { - // If the file is set - if(file) - { - fileSize.size = file.dataSize; - - callback(file); - } - else - { - var ioService = null; - - // Try to download the file - try - { - ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); - - fileSize.size = ioService.newChannelFromURI2(ioService.newURI(url, null, null), null, null, null, 0, 1).open().available(); - } - catch(exception) - { - // Try to download the file - try - { - ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); - - fileSize.size = ioService.newChannelFromURI(ioService.newURI(url, null, null)).open().available(); - } - catch(exception2) - { - fileSize.size = null; - } - } - - callback(); - } - }); -}; - -// Returns the current content document -WebDeveloper.Common.getContentDocument = function() -{ - return WebDeveloper.Common.getSelectedBrowser().contentDocument; -}; - -// Returns the current content window -WebDeveloper.Common.getContentWindow = function() -{ - return WebDeveloper.Common.getSelectedBrowser().contentWindow; -}; - -// Returns a CSS property -WebDeveloper.Common.getCSSProperty = function(property) -{ - // If the property is set - if(property) - { - return property[0]; - } - - return null; -}; - -// Returns the id for a feature -WebDeveloper.Common.getFeatureId = function(id) -{ - // If the id is set - if(id) - { - return id.replace("web-developer-", "").replace("-command", ""); - } - - return ""; -}; - -// Returns a file from the cache -WebDeveloper.Common.getFileFromCache = function(url, callback) -{ - var cacheSession = null; - - // Try to get the file from the cache - try - { - cacheSession = Components.classes["@mozilla.org/network/cache-service;1"].getService(Components.interfaces.nsICacheService).createSession("HTTP", 0, true); - cacheSession.doomEntriesIfExpired = false; - - /* eslint-disable indent */ - // Open the cache entry asynchronously - cacheSession.asyncOpenCacheEntry(url, Components.interfaces.nsICache.ACCESS_READ, - { - // Handles the cache entry being available - onCacheEntryAvailable: function(descriptor) - { - callback(descriptor); - } - }); - /* eslint-enable indent */ - } - catch(exception) - { - callback(); - } -}; - -// Returns the size of a file -WebDeveloper.Common.getFileSize = function(fileSizeRequest, configuration) -{ - var fileSize = {}; - - // Get the compressed file size - WebDeveloper.Common.getCompressedFileSize(fileSize, fileSizeRequest, configuration, function(file) - { - // If including the uncompressed size and the file is compressed - if(fileSizeRequest.includeUncompressed && WebDeveloper.Common.isFileCompressed(file)) - { - WebDeveloper.Common.getUncompressedFileSize(fileSize, fileSizeRequest, configuration); - } - else - { - WebDeveloper.Common.fileSizeRequestComplete(fileSize, fileSizeRequest, configuration); - } - }); -}; - -// Returns the file sizes of the given files -WebDeveloper.Common.getFileSizes = function(fileSizeRequests, callback) -{ - var fileSizeRequestsRemaining = fileSizeRequests.length; - var configuration = { callback: callback, fileSizeRequestsRemaining: fileSizeRequestsRemaining }; - - // Loop through the file size requests - for(var i = 0, l = fileSizeRequests.length; i < l; i++) - { - WebDeveloper.Common.getFileSize(fileSizeRequests[i], configuration); - } -}; - -// Returns the main window -WebDeveloper.Common.getMainWindow = function() -{ - return Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow("navigator:browser"); -}; - -// Returns the selected browser -WebDeveloper.Common.getSelectedBrowser = function() -{ - return WebDeveloper.Common.getTabBrowser().selectedBrowser; -}; - -// Returns the tab browser -WebDeveloper.Common.getTabBrowser = function() -{ - return WebDeveloper.Common.getMainWindow().gBrowser; -}; - -// Returns the tab that contains the given document -WebDeveloper.Common.getTabForDocument = function(documentElement) -{ - var tabBrowser = WebDeveloper.Common.getTabBrowser(); - - // If the tabs are set (requires Firefox 3.6) - if(tabBrowser.tabs) - { - return tabBrowser.tabs[tabBrowser.getBrowserIndexForDocument(documentElement)]; - } - - return tabBrowser.tabContainer.getItemAtIndex(tabBrowser.getBrowserIndexForDocument(documentElement)); -}; - -// Gets the uncompressed size of a file -WebDeveloper.Common.getUncompressedFileSize = function(fileSize, fileSizeRequest, configuration) -{ - // Requests the URL content - WebDeveloper.Common.requestURLContent(fileSizeRequest.url, "", function(urlContent) - { - // If the URL content is set and is larger than the compressed size - if(urlContent && urlContent.length > fileSize.size) - { - fileSize.uncompressedSize = urlContent.length; - } - - WebDeveloper.Common.fileSizeRequestComplete(fileSize, fileSizeRequest, configuration); - }); -}; - -// Gets the content from a URL -WebDeveloper.Common.getURLContent = function(urlContentRequest, errorMessage, configuration) -{ - var url = urlContentRequest.url; - - // If the URL is not entirely generated - if(url.indexOf("wyciwyg://") !== 0) - { - var content = null; - - // Gets the file from the cache - WebDeveloper.Common.getFileFromCache(url, function(file) - { - // If the file is set and is not compressed - if(file && !WebDeveloper.Common.isFileCompressed(file)) - { - // Try to load the content from the file - try - { - var inputStream = file.openInputStream(0); - var scriptableStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream); - - scriptableStream.init(inputStream); - - content = scriptableStream.read(scriptableStream.available()); - - scriptableStream.close(); - inputStream.close(); - } - catch(exception) - { - content = null; - } - } - - // If the content has been loaded - if(content) - { - WebDeveloper.Common.urlContentRequestComplete(content, urlContentRequest, configuration); - } - else - { - // Requests the URL content - WebDeveloper.Common.requestURLContent(url, errorMessage, function(urlContent) - { - WebDeveloper.Common.urlContentRequestComplete(urlContent, urlContentRequest, configuration); - }); - } - }); - } -}; - -// Returns true if the file is compressed -WebDeveloper.Common.isFileCompressed = function(file) -{ - // If there is a file - if(file) - { - var encoding = null; - var responseHeaders = null; - - // Try to get the cache encoding - try - { - // Specific case-sensitive required - encoding = file.getMetaDataElement("request-Accept-Encoding"); - } - catch(exception4) - { - encoding = null; - - // Try to get the response headers - try - { - // Specific case-sensitive required - responseHeaders = file.getMetaDataElement("response-head"); - } - catch(exception5) - { - responseHeaders = null; - } - } - - // If the cache is not GZIP encoded - if((!encoding || encoding.indexOf("gzip") == -1) && (!responseHeaders || responseHeaders.indexOf("Content-Encoding: deflate") == -1 && responseHeaders.indexOf("Content-Encoding: gzip") == -1)) - { - return false; - } - } - - return true; -}; - -// Returns true if the extension is running on a Mac -WebDeveloper.Common.isMac = function() -{ - // If the OS is set to Darwin - if(Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).OS == "Darwin") - { - return true; - } - - return false; -}; - -// Logs a message -WebDeveloper.Common.log = function(message) -{ - // If the message is not set - if(!message) - { - message = "null"; - } - - Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService).logStringMessage(message); -}; - -// Opens the URL in a new tab -WebDeveloper.Common.openURL = function(url) -{ - var tabBrowser = WebDeveloper.Common.getTabBrowser(); - var newTab = tabBrowser.addTab(url); - - tabBrowser.selectedTab = newTab; - - return newTab; -}; - -// Returns true if the page has frames -WebDeveloper.Common.pageHasFrames = function() -{ - // If the content document has a frame element - if(WebDeveloper.Common.getContentDocument().getElementsByTagName("frame").length > 0) - { - return true; - } - - return false; -}; - -// Removes the given attribute from an element -WebDeveloper.Common.removeElementAttribute = function(element, attribute) -{ - // If the element exists - if(element) - { - element.removeAttribute(attribute); - } -}; - -// Requests the URL content -WebDeveloper.Common.requestURLContent = function(url, errorMessage, callback) -{ - // Try to request the URL - try - { - var request = new XMLHttpRequest(); - - request.timeout = WebDeveloper.Common.requestTimeout; - - request.onreadystatechange = function() - { - // If the request completed - if(request.readyState == 4) - { - callback(request.responseText); - } - }; - - request.ontimeout = function() - { - callback(errorMessage); - }; - - request.open("get", url); - request.send(null); - } - catch(exception) - { - callback(errorMessage); - } -}; diff --git a/source/firefox/javascript/content/content.js b/source/firefox/javascript/content/content.js deleted file mode 100644 index 5ba730e..0000000 --- a/source/firefox/javascript/content/content.js +++ /dev/null @@ -1,118 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Content = WebDeveloper.Content || {}; - -// Returns the size of a document -WebDeveloper.Content.getDocumentSize = function(callback) -{ - var contentDocument = WebDeveloper.Common.getContentDocument(); - var contentDocuments = WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()); - var documentSize = {}; - var documentSizeDocument = null; - var documentSizeImage = null; - var documentSizeObject = null; - var documentSizeScript = null; - var documentSizeStyleSheet = null; - var documentURL = null; - var fileSizeRequests = []; - var image = null; - var images = null; - var object = null; - var objects = null; - var script = null; - var scripts = null; - var styleSheets = null; - var url = null; - - documentSize.documents = []; - documentSize.images = []; - documentSize.objects = []; - documentSize.pageURL = contentDocument.documentURI; - documentSize.scripts = []; - documentSize.styleSheets = []; - - // Loop through the documents - for(var i = 0, l = contentDocuments.length; i < l; i++) - { - contentDocument = contentDocuments[i]; - documentSizeDocument = {}; - documentURL = contentDocument.documentURI; - documentSizeDocument.url = documentURL; - images = WebDeveloper.Common.getDocumentImages(contentDocument); - objects = contentDocument.embeds; - scripts = contentDocument.querySelectorAll("script[src]"); - styleSheets = WebDeveloper.Content.getDocumentCSS(contentDocument, false).styleSheets; - - fileSizeRequests.push({ fileObject: documentSizeDocument, includeUncompressed: true, url: documentURL }); - - // Loop through the images - for(var j = 0, m = images.length; j < m; j++) - { - documentSizeImage = {}; - image = images[j]; - url = image.src; - documentSizeImage.url = url; - - fileSizeRequests.push({ fileObject: documentSizeImage, includeUncompressed: false, url: url }); - - documentSize.images.push(documentSizeImage); - } - - // Loop through the objects - for(j = 0, m = objects.length; j < m; j++) - { - documentSizeObject = {}; - object = objects[j]; - url = object.src; - documentSizeObject.url = url; - - fileSizeRequests.push({ fileObject: documentSizeObject, includeUncompressed: false, url: url }); - - documentSize.objects.push(documentSizeObject); - } - - // Loop through the scripts - for(j = 0, m = scripts.length; j < m; j++) - { - documentSizeScript = {}; - script = scripts[j]; - url = script.src; - documentSizeScript.url = url; - - fileSizeRequests.push({ fileObject: documentSizeScript, includeUncompressed: true, url: url }); - - documentSize.scripts.push(documentSizeScript); - } - - // Loop through the style sheets - for(j = 0, m = styleSheets.length; j < m; j++) - { - documentSizeStyleSheet = {}; - url = styleSheets[j]; - documentSizeStyleSheet.url = url; - - fileSizeRequests.push({ fileObject: documentSizeStyleSheet, includeUncompressed: true, url: url }); - - documentSize.styleSheets.push(documentSizeStyleSheet); - } - - documentSize.documents.push(documentSizeDocument); - } - - WebDeveloper.Common.getFileSizes(fileSizeRequests, function() - { - documentSize.documents.sort(WebDeveloper.Content.sortByFileSize); - documentSize.images.sort(WebDeveloper.Content.sortByFileSize); - documentSize.objects.sort(WebDeveloper.Content.sortByFileSize); - documentSize.scripts.sort(WebDeveloper.Content.sortByFileSize); - documentSize.styleSheets.sort(WebDeveloper.Content.sortByFileSize); - - callback(documentSize); - }); -}; - -// Sorts files by file size -WebDeveloper.Content.sortByFileSize = function(fileOne, fileTwo) -{ - return fileTwo.size.size - fileOne.size.size; -}; diff --git a/source/firefox/javascript/cookies/cookies.js b/source/firefox/javascript/cookies/cookies.js index 27a3e3f..b7b4052 100644 --- a/source/firefox/javascript/cookies/cookies.js +++ b/source/firefox/javascript/cookies/cookies.js @@ -2,99 +2,14 @@ var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-defi WebDeveloper.Cookies = WebDeveloper.Cookies || {}; -// Adds a cookie -WebDeveloper.Cookies.addCookie = function(cookie) +// Sanitizes a cookie host +WebDeveloper.Cookies.sanitizeHost = function(host) { - var path = cookie.path.trim(); - var cookieString = cookie.name.trim() + "=" + cookie.value.trim() + ";path=" + path + ";"; - var cookiePreference = WebDeveloper.Preferences.getIntegerPreference("network.cookie.cookieBehavior"); - var host = cookie.host.trim(); - var scheme = "http://"; - var uri = null; - - // If the host is a domain - if(host.charAt(0) == ".") + // If the host is set and starts with '.' + if(host && host.charAt(0) == ".") { - cookieString += "domain=" + host + ";"; - host = host.substring(1); - } - - // If this is not a session cookie - if(!cookie.session) - { - cookieString += "expires=" + new Date(cookie.expires.trim()).toUTCString() + ";"; - } - - // If the cookie is secure - if(cookie.secure) - { - cookieString += "secure;"; - scheme = "https://"; - } - - uri = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService).newURI(scheme + host + path, null, null); - - // If the cookie preference is not allowing all cookies - if(cookiePreference !== 0) - { - WebDeveloper.Preferences.setIntegerPreference("network.cookie.cookieBehavior", 0); - } - - Components.classes["@mozilla.org/cookieService;1"].getService().QueryInterface(Components.interfaces.nsICookieService).setCookieString(uri, null, cookieString.substring(0, cookieString.length - 1), null); - - // If the cookie preference was not allowing all cookies - if(cookiePreference !== 0) - { - WebDeveloper.Preferences.setIntegerPreference("network.cookie.cookieBehavior", cookiePreference); - } -}; - -// Returns true if you can edit a local cookie -WebDeveloper.Cookies.canEditLocalCookie = function() -{ - return true; -}; - -// Deletes a cookie -WebDeveloper.Cookies.deleteCookie = function(cookie) -{ - // Try to delete the cookie without origin attributes - try - { - Components.classes["@mozilla.org/cookiemanager;1"].getService(Components.interfaces.nsICookieManager2).remove(cookie.host, cookie.name, cookie.path, false); - } - catch(exception) - { - Components.classes["@mozilla.org/cookiemanager;1"].getService(Components.interfaces.nsICookieManager2).remove(cookie.host, cookie.name, cookie.path, false, cookie.originAttributes); - } -}; - -// Returns all cookies -WebDeveloper.Cookies.getAllCookies = function() -{ - var allCookies = []; - var cookie = null; - var cookieEnumeration = Components.classes["@mozilla.org/cookiemanager;1"].getService(Components.interfaces.nsICookieManager2).enumerator; - var cookieObject = null; - - // Loop through the cookies - while(cookieEnumeration.hasMoreElements()) - { - cookie = {}; - cookieObject = cookieEnumeration.getNext().QueryInterface(Components.interfaces.nsICookie2); - - cookie.expires = cookieObject.expires; - cookie.host = cookieObject.host; - cookie.httpOnly = cookieObject.isHttpOnly; - cookie.name = cookieObject.name; - cookie.originAttributes = cookieObject.originAttributes; - cookie.path = cookieObject.path; - cookie.secure = cookieObject.isSecure; - cookie.session = cookieObject.isSession; - cookie.value = cookieObject.value; - - allCookies.push(cookie); + return host.substring(1); } - return allCookies; + return host; }; diff --git a/source/firefox/javascript/dashboard/dashboard.js b/source/firefox/javascript/dashboard/dashboard.js deleted file mode 100644 index a3bf27e..0000000 --- a/source/firefox/javascript/dashboard/dashboard.js +++ /dev/null @@ -1,253 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Dashboard = WebDeveloper.Dashboard || {}; - -// Closes all tabs in the dashboard and the dashboard itself -WebDeveloper.Dashboard.closeDashboard = function() -{ - var tabElements = null; - var tabPanels = document.getElementById("web-developer-dashboard-tab-panels"); - var tabs = document.getElementById("web-developer-dashboard-tabs"); - - tabElements = tabs.getElementsByTagName("tab"); - - // Loop through the tab elements - while(tabElements.length) - { - tabs.removeChild(tabElements[0]); - } - - WebDeveloper.Common.empty(tabPanels); - - document.getElementById("web-developer-dashboard").hidden = true; - document.getElementById("web-developer-dashboard-splitter").hidden = true; -}; - -// Closes the given tab in the dashboard -WebDeveloper.Dashboard.closeDashboardTab = function(title) -{ - var i = 0; - var l = 0; - var tab = null; - var tabBox = document.getElementById("web-developer-dashboard-tab-box"); - var tabElements = null; - var selectedTab = tabBox.selectedTab; - var selectedTabPanel = tabBox.selectedPanel; - var tabPanels = document.getElementById("web-developer-dashboard-tab-panels"); - var tabs = document.getElementById("web-developer-dashboard-tabs"); - - // If the title is set - if(title) - { - tabElements = tabs.getElementsByTagName("tab"); - - // Loop through the tabs - for(i = 0, l = tabElements.length; i < l; i++) - { - tab = tabElements.item(i); - - // If the tab has a matching label attribute - if(tab.hasAttribute("label") && tab.getAttribute("label") == title) - { - selectedTab = tab; - selectedTabPanel = tabPanels.childNodes[i]; - - break; - } - } - } - - // If a selected tab panel is set, but not a selected tab - if(selectedTabPanel && !selectedTab) - { - var selectedTabPanelIndex = 0; - var tabPanel = null; - var tabPanelElements = tabPanels.childNodes; - - tabElements = tabs.getElementsByTagName("tab"); - - // Loop through the tab panels - for(i = 0, l = tabPanelElements.length; i < l; i++) - { - tabPanel = tabPanelElements.item(i); - - // If this is the selected tab - if(tabPanel == selectedTabPanel) - { - break; - } - - selectedTabPanelIndex++; - } - - selectedTab = tabElements.item(selectedTabPanelIndex); - - // Set the title so we know the title of the tab that was removed - title = selectedTab.label; - } - - // If a selected tab and tab panel are set - if(selectedTab && selectedTabPanel) - { - tabPanels.removeChild(selectedTabPanel); - tabs.removeChild(selectedTab); - - // If there are no tab panels remaining - if(tabPanels.childNodes.length === 0) - { - document.getElementById("web-developer-dashboard").hidden = true; - document.getElementById("web-developer-dashboard-splitter").hidden = true; - } - else - { - tabs.selectedIndex = 0; - } - } - - // If the title matches edit HTML - if(title == WebDeveloper.Locales.getString("editHTML")) - { - var tabBrowser = WebDeveloper.Common.getTabBrowser(); - - // If the tab browser is set - if(tabBrowser) - { - tabBrowser.reload(); - } - } -}; - -// Is the given tab open in the dashboard -WebDeveloper.Dashboard.isOpenInDashboard = function(title) -{ - var tab = null; - var tabs = document.getElementById("web-developer-dashboard-tabs").getElementsByTagName("tab"); - - // Loop through the tabs - for(var i = 0, l = tabs.length; i < l; i++) - { - tab = tabs.item(i); - - // If the tab has a matching label attribute - if(tab.hasAttribute("label") && tab.getAttribute("label") == title) - { - return true; - } - } - - return false; -}; - -// Moves the dashboard -WebDeveloper.Dashboard.moveDashboard = function(position) -{ - // If the position is not the current position - if(position !== WebDeveloper.Preferences.getExtensionStringPreference("dashboard.position")) - { - WebDeveloper.Preferences.setExtensionStringPreference("dashboard.position", position); - WebDeveloper.Dashboard.positionDashboard(); - } -}; - -// Opens the given URL in the dashboard -WebDeveloper.Dashboard.openInDashboard = function(title, url) -{ - var browser = document.createElement("browser"); - var tab = document.createElement("tab"); - var tabCount = 0; - var tabPanel = document.createElement("tabpanel"); - var tabPanels = document.getElementById("web-developer-dashboard-tab-panels"); - var tabs = document.getElementById("web-developer-dashboard-tabs"); - - browser.setAttribute("type", "content"); - browser.setAttribute("flex", "1"); - browser.setAttribute("src", url); - tabPanel.appendChild(browser); - tab.setAttribute("label", title); - - tabPanels.appendChild(tabPanel); - tabs.insertBefore(tab, document.getElementById("web-developer-dashboard-flex-spacer")); - - tabCount = tabPanels.childNodes.length - 1; - tabs.selectedIndex = tabCount; - - // If this is the only tab - if(tabCount === 0) - { - var dashboard = document.getElementById("web-developer-dashboard"); - - WebDeveloper.Dashboard.positionDashboard(); - - // If the dashboard height is less than 200 - if(dashboard.height < 200) - { - dashboard.height = 200; - } - - // If the dashboard width is less than 200 - if(dashboard.width < 200) - { - dashboard.width = 200; - } - - dashboard.hidden = false; - document.getElementById("web-developer-dashboard-splitter").hidden = false; - } -}; - -// Positions the dashboard -WebDeveloper.Dashboard.positionDashboard = function() -{ - var appContent = document.getElementById("appcontent"); - var dashboard = document.getElementById("web-developer-dashboard"); - var dashboardSplitter = document.getElementById("web-developer-dashboard-splitter"); - var position = WebDeveloper.Preferences.getExtensionStringPreference("dashboard.position"); - - // If the dashboard should be positioned at the bottom - if(position == "bottom") - { - appContent.appendChild(dashboardSplitter); - appContent.appendChild(dashboard); - } - else if(position == "left") - { - var browser = appContent.parentNode; - - browser.insertBefore(dashboard, appContent); - browser.insertBefore(dashboardSplitter, appContent); - } - else if(position == "right") - { - WebDeveloper.Common.insertAfter(dashboard, appContent); - WebDeveloper.Common.insertAfter(dashboardSplitter, appContent); - } - else if(position == "top") - { - WebDeveloper.Common.insertAsFirstChild(appContent, dashboardSplitter); - WebDeveloper.Common.insertAsFirstChild(appContent, dashboard); - } - - // If the dashboard is positioned at the bottom or top - if(position == "bottom" || position == "top") - { - dashboardSplitter.setAttribute("orient", "vertical"); - } - else if(position == "left" || position == "right") - { - dashboardSplitter.setAttribute("orient", "horizontal"); - } - - dashboardSplitter.setAttribute("class", position); -}; - -// Updates the move menu -WebDeveloper.Dashboard.updateMoveMenu = function() -{ - var menu = document.getElementById("web-developer-move-dashboard-" + WebDeveloper.Preferences.getExtensionStringPreference("dashboard.position")); - - // If the menu is set - if(menu) - { - menu.setAttribute("checked", true); - } -}; diff --git a/source/firefox/javascript/dashboard/edit-css.js b/source/firefox/javascript/dashboard/edit-css.js deleted file mode 100644 index ee5a353..0000000 --- a/source/firefox/javascript/dashboard/edit-css.js +++ /dev/null @@ -1,464 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.EditCSS = WebDeveloper.EditCSS || {}; -WebDeveloper.EditCSS.theme = null; - -// Adds a tab -WebDeveloper.EditCSS.addTab = function(title, styles, stylesURL, tabs, tabPanels, color, errorMessage) -{ - var browser = document.createElement("browser"); - var tab = document.createElement("tab"); - var tabPanel = document.createElement("tabpanel"); - var uri = Components.classes["@mozilla.org/network/standard-url;1"].createInstance(Components.interfaces.nsIURL); - - uri.spec = stylesURL; - - tab.setAttribute("label", title); - tabs.appendChild(tab); - - browser.setAttribute("disablehistory", "true"); - browser.setAttribute("enablehistory", "false"); - browser.setAttribute("flex", "1"); - browser.setAttribute("src", "chrome://web-developer/content/dashboard/edit-css.html"); - browser.setAttribute("web-developer-base", uri.directory); - - var load = (function(styleContent, url, theme, loadErrorMessage) - { - var handler = function() - { - var contentDocument = browser.contentDocument; - var dispatchEvent = contentDocument.createEvent("Events"); - var headElement = WebDeveloper.Common.getDocumentHeadElement(contentDocument); - - dispatchEvent.initEvent("web-developer-dashboard-event", true, false); - - // If there is a load error message we need to load the content - if(loadErrorMessage) - { - var urlContentRequest = { url: url }; - - WebDeveloper.Common.getURLContent(urlContentRequest, loadErrorMessage, { urlContentRequestsRemaining: 1, callback: function() - { - headElement.setAttribute("data-web-developer", JSON.stringify({ content: urlContentRequest.content, theme: theme })); - headElement.dispatchEvent(dispatchEvent); - } }); - } - else - { - headElement.setAttribute("data-web-developer", JSON.stringify({ content: styleContent, theme: theme })); - headElement.dispatchEvent(dispatchEvent); - } - - browser.removeEventListener("load", handler, true); - }; - - return handler; - })(styles, stylesURL, color, errorMessage); - - browser.addEventListener("load", load, true); - tabPanel.appendChild(browser); - tabPanels.appendChild(tabPanel); -}; - -// Applies the CSS -WebDeveloper.EditCSS.apply = function() -{ - WebDeveloper.EditCSS.applyCSS(); - /* - var stylesUpdated = WebDeveloper.EditCSS.applyCSS(); - - // If the styles were updated - if(stylesUpdated) - { - var body = WebDeveloper.Common.getDocumentBodyElement(WebDeveloper.EditCSS.contentDocument); - - // Hiding and showing the body forces a repaint in Firefox - needed for initial :first-letter changes - body.style.display = "none"; - - window.setTimeout(function() { body.style.display = "block"; }, 0); - } - */ -}; - -// Changes the syntax highlight theme -WebDeveloper.EditCSS.changeSyntaxHighlightTheme = function(type, color) -{ - var stylesContainer = null; - var stylesContainers = WebDeveloper.EditCSS.getStylesContainers(); - - WebDeveloper.EditCSS.theme = color; - - // Loop through the styles containers - for(var i = 0, l = stylesContainers.length; i < l; i++) - { - stylesContainer = stylesContainers[i]; - - // If the styles container is fully loaded - if(stylesContainer.contentDocument.defaultView.WebDeveloper) - { - stylesContainer.contentDocument.defaultView.WebDeveloper.Dashboard.changeSyntaxHighlightTheme(type, color); - } - } - - // If the color is not set - if(color == "none") - { - WebDeveloper.EditCSS.toggleSearch(false); - } - else - { - WebDeveloper.EditCSS.toggleSearch(true); - } -}; - -// Clear the CSS -WebDeveloper.EditCSS.clear = function() -{ - WebDeveloper.EditCSS.getSelectedBrowser().WebDeveloper.Dashboard.setContent(""); -}; - -// Returns the selected panel -WebDeveloper.EditCSS.getSelectedBrowser = function() -{ - var selectedPanel = document.getElementById("web-developer-edit-css-tab-box").selectedPanel; - - // If the selected panel is not set - if(!selectedPanel) - { - selectedPanel = document.getElementById("web-developer-edit-css-tab-panels").firstChild; - } - - return selectedPanel.getElementsByTagName("browser")[0].contentDocument.defaultView; -}; - -// Returns the selected tab -WebDeveloper.EditCSS.getSelectedTab = function() -{ - var selectedTab = document.getElementById("web-developer-edit-css-tab-box").selectedTab; - - // If the selected tab is not set - if(!selectedTab) - { - selectedTab = document.getElementById("web-developer-edit-css-tabs").firstChild; - } - - return selectedTab; -}; - -// Returns the styles containers -WebDeveloper.EditCSS.getStylesContainers = function() -{ - return document.getElementById("web-developer-edit-css-tab-panels").getElementsByTagName("browser"); -}; - -// Returns the styles in a container -WebDeveloper.EditCSS.getStylesFromContainer = function(stylesContainer) -{ - // If the styles container is fully loaded - if(stylesContainer.contentDocument.defaultView.WebDeveloper) - { - return stylesContainer.contentDocument.defaultView.WebDeveloper.Dashboard.getContent(); - } - - return ""; -}; - -// Initializes the edit CSS dashboard -WebDeveloper.EditCSS.initialize = function() -{ - // Try to get the tab browser - try - { - var tabBrowser = WebDeveloper.Common.getTabBrowser(); - - // If the tab browser is set - if(tabBrowser) - { - var tabContainer = tabBrowser.tabContainer; - var theme = WebDeveloper.Preferences.getExtensionStringPreference("syntax.highlight.theme"); - - WebDeveloper.EditCSS.contentDocument = WebDeveloper.Common.getContentDocument(); - - WebDeveloper.EditCSS.updatePinButton(); - WebDeveloper.EditCSS.retrieveCSS(theme); - WebDeveloper.CSS.toggleAllStyleSheets(true, WebDeveloper.EditCSS.contentDocument); - WebDeveloper.EditCSS.update(); - - // If the tab container is set - if(tabContainer) - { - tabContainer.addEventListener("TabSelect", WebDeveloper.EditCSS.tabSelect, false); - } - - // If the theme is not set - if(theme == "none") - { - WebDeveloper.EditCSS.toggleSearch(false); - } - - document.getElementById("web-developer-search-dashboard-text").addEventListener("keypress", WebDeveloper.EditCSS.search, false); - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-syntax-highlight-" + theme), "checked", true); - - // If the extension is running on a Mac - if(WebDeveloper.Common.isMac()) - { - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-dashboard-toolbar"), "color", WebDeveloper.Preferences.getExtensionBooleanPreference("toolbar.color")); - } - - tabBrowser.addEventListener("load", WebDeveloper.EditCSS.pageLoad, true); - } - } - catch(exception) - { - // Ignore - } -}; - -// Opens new CSS -WebDeveloper.EditCSS.open = function() -{ - var filePicker = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker); - - filePicker.appendFilter(WebDeveloper.Locales.getString("styleSheetDescription"), "*.css"); - filePicker.init(window, WebDeveloper.Locales.getString("openStyleSheet"), filePicker.modeOpen); - - // If the user selected a style sheet - if(filePicker.show() == filePicker.returnOK) - { - var inputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream); - var scriptableStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream); - - inputStream.init(filePicker.file, parseInt(1, 16), parseInt(444, 8), null); - scriptableStream.init(inputStream); - - WebDeveloper.EditCSS.getSelectedBrowser().WebDeveloper.Dashboard.setContent(scriptableStream.read(scriptableStream.available())); - - scriptableStream.close(); - inputStream.close(); - } -}; - -// Reinitializes the dashboard when the page changes -WebDeveloper.EditCSS.pageLoad = function(event) -{ - var originalTarget = event.originalTarget; - - // If the event came from an HTML document and it is not a frame - if(originalTarget instanceof HTMLDocument && !originalTarget.defaultView.frameElement) - { - WebDeveloper.EditCSS.contentDocument = WebDeveloper.Common.getContentDocument(); - - WebDeveloper.EditCSS.stopUpdate(); - - // If not pinning the CSS - if(!WebDeveloper.Preferences.getExtensionBooleanPreference("edit.css.pin")) - { - WebDeveloper.Common.removeMatchingElements(".web-developer-edit-css-styles", WebDeveloper.EditCSS.contentDocument); - WebDeveloper.EditCSS.retrieveCSS(WebDeveloper.Preferences.getExtensionStringPreference("syntax.highlight.theme")); - } - - WebDeveloper.CSS.toggleAllStyleSheets(true, WebDeveloper.EditCSS.contentDocument); - WebDeveloper.EditCSS.update(); - } -}; - -// Resets the CSS -WebDeveloper.EditCSS.reset = function() -{ - var theme = WebDeveloper.EditCSS.theme; - - // If the theme is not set - if(!theme) - { - theme = WebDeveloper.Preferences.getExtensionStringPreference("syntax.highlight.theme"); - } - - WebDeveloper.EditCSS.stopUpdate(); - WebDeveloper.EditCSS.resetDocument(); - WebDeveloper.EditCSS.retrieveCSS(theme); - WebDeveloper.CSS.toggleAllStyleSheets(true, WebDeveloper.EditCSS.contentDocument); - WebDeveloper.EditCSS.update(); -}; - -// Retrieves the CSS for the document -WebDeveloper.EditCSS.retrieveCSS = function(theme) -{ - var documentCSS = WebDeveloper.Content.getDocumentCSS(WebDeveloper.EditCSS.contentDocument, true); - var documentURL = WebDeveloper.EditCSS.contentDocument.documentURI; - var errorMessage = "/* " + WebDeveloper.Locales.getString("couldNotLoadCSS") + " */"; - var styleSheet = null; - var tabs = document.getElementById("web-developer-edit-css-tabs"); - var tabPanels = document.getElementById("web-developer-edit-css-tab-panels"); - - WebDeveloper.Common.empty(tabs); - WebDeveloper.Common.empty(tabPanels); - - // Loop through the style sheets - for(var i = 0, l = documentCSS.styleSheets.length; i < l; i++) - { - styleSheet = documentCSS.styleSheets[i]; - - WebDeveloper.EditCSS.addTab(WebDeveloper.Dashboard.formatURL(styleSheet), null, styleSheet, tabs, tabPanels, theme, errorMessage); - } - - // If there are embedded styles - if(documentCSS.embedded) - { - WebDeveloper.EditCSS.addTab(WebDeveloper.Locales.getString("embeddedStyles"), documentCSS.embedded, documentURL, tabs, tabPanels, theme); - } - - // If there is no CSS - if(!documentCSS.styleSheets.length && !documentCSS.embedded) - { - WebDeveloper.EditCSS.addTab(WebDeveloper.Locales.getString("editCSS"), "", documentURL, tabs, tabPanels, theme); - } - - document.getElementById("web-developer-edit-css-tabs").firstChild.setAttribute("selected", true); -}; - -// Saves the CSS -WebDeveloper.EditCSS.save = function() -{ - var css = WebDeveloper.EditCSS.getSelectedBrowser().WebDeveloper.Dashboard.getContent(); - var filePicker = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker); - var result = null; - - filePicker.defaultExtension = "css"; - filePicker.defaultString = WebDeveloper.EditCSS.getSelectedTab().getAttribute("label"); - - filePicker.appendFilter(WebDeveloper.Locales.getString("styleSheetDescription"), "*.css"); - filePicker.init(window, WebDeveloper.Locales.getString("saveStyleSheet"), filePicker.modeSave); - - result = filePicker.show(); - - // If the user selected a style sheet - if(result == filePicker.returnOK || result == filePicker.returnReplace) - { - var file = filePicker.file; - var outputStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); - - // If the file does not exist - if(!file.exists()) - { - file.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, parseInt(644, 8)); - } - - outputStream.init(file, parseInt(4, 16) | parseInt(8, 16) | parseInt(20, 16), parseInt(644, 8), null); - outputStream.write(css, css.length); - outputStream.close(); - } -}; - -// Searches the CSS -WebDeveloper.EditCSS.search = function(event) -{ - // If the event is not set or the event key code is set and is 13 - if(!event || event.keyCode && event.keyCode == 13) - { - var query = document.getElementById("web-developer-search-dashboard-text").value; - - // If the query is set - if(query) - { - WebDeveloper.EditCSS.getSelectedBrowser().WebDeveloper.Dashboard.search(query); - } - } -}; - -// Handles a browser tab being selected -WebDeveloper.EditCSS.tabSelect = function() -{ - var contentDocument = WebDeveloper.Common.getContentDocument(); - - // If the content document is different - if(contentDocument != WebDeveloper.EditCSS.contentDocument) - { - WebDeveloper.EditCSS.resetDocument(); - - WebDeveloper.EditCSS.contentDocument = contentDocument; - - // If not pinning the CSS - if(!WebDeveloper.Preferences.getExtensionBooleanPreference("edit.css.pin")) - { - WebDeveloper.EditCSS.retrieveCSS(WebDeveloper.Preferences.getExtensionStringPreference("syntax.highlight.theme")); - } - - WebDeveloper.CSS.toggleAllStyleSheets(true, WebDeveloper.EditCSS.contentDocument); - WebDeveloper.EditCSS.update(); - } -}; - -// Toggles pinning of the CSS -WebDeveloper.EditCSS.togglePin = function() -{ - WebDeveloper.Preferences.setExtensionBooleanPreference("edit.css.pin", !WebDeveloper.Preferences.getExtensionBooleanPreference("edit.css.pin")); - WebDeveloper.EditCSS.updatePinButton(); -}; - -// Toggles the search -WebDeveloper.EditCSS.toggleSearch = function(enable) -{ - document.getElementById("web-developer-search-dashboard").disabled = !enable; - document.getElementById("web-developer-search-dashboard-text").disabled = !enable; -}; - -// Uninitializes edit CSS -WebDeveloper.EditCSS.uninitialize = function() -{ - // Try to get the tab browser - try - { - var tabBrowser = WebDeveloper.Common.getTabBrowser(); - - WebDeveloper.EditCSS.stopUpdate(); - WebDeveloper.EditCSS.resetDocument(); - - WebDeveloper.EditCSS.contentDocument = null; - - // If the tab browser is set - if(tabBrowser) - { - var tabContainer = tabBrowser.tabContainer; - - document.getElementById("web-developer-search-dashboard-text").removeEventListener("keypress", WebDeveloper.EditCSS.search, false); - tabBrowser.removeEventListener("load", WebDeveloper.EditCSS.pageLoad, true); - - // If the tab container is set - if(tabContainer) - { - tabContainer.removeEventListener("TabSelect", WebDeveloper.EditCSS.tabSelect, false); - } - } - } - catch(exception) - { - // Ignore - } -}; - -// Updates the pin CSS button -WebDeveloper.EditCSS.updatePinButton = function() -{ - var pin = WebDeveloper.Preferences.getExtensionBooleanPreference("edit.css.pin"); - var pinButton = document.getElementById("web-developer-pin-dashboard"); - var tooltip = null; - - // If the pin button exists - if(pinButton) - { - // If pinning the CSS - if(pin) - { - tooltip = WebDeveloper.Locales.getString("unpinCSS"); - } - else - { - tooltip = WebDeveloper.Locales.getString("pinCSS"); - } - - pinButton.checked = pin; - - pinButton.setAttribute("tooltiptext", tooltip); - } -}; diff --git a/source/firefox/javascript/dashboard/edit-html.js b/source/firefox/javascript/dashboard/edit-html.js deleted file mode 100644 index 2dc1297..0000000 --- a/source/firefox/javascript/dashboard/edit-html.js +++ /dev/null @@ -1,273 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.EditHTML = WebDeveloper.EditHTML || {}; -WebDeveloper.EditHTML.contentDocument = null; -WebDeveloper.EditHTML.interval = null; -WebDeveloper.EditHTML.oldHTML = null; -WebDeveloper.EditHTML.updateFrequency = 500; - -// Applies the HTML -WebDeveloper.EditHTML.apply = function() -{ - var contentBody = WebDeveloper.Common.getDocumentBodyElement(WebDeveloper.EditHTML.contentDocument); - var newHTML = document.getElementById("web-developer-edit-html-browser").contentDocument.defaultView.WebDeveloper.Dashboard.getContent(); - - // If the content body is set and the new HTML is not the same as the old HTML - if(contentBody && newHTML != WebDeveloper.EditHTML.oldHTML) - { - contentBody.innerHTML = newHTML; - WebDeveloper.EditHTML.oldHTML = newHTML; - } -}; - -// Changes the syntax highlight theme -WebDeveloper.EditHTML.changeSyntaxHighlightTheme = function(type, color) -{ - document.getElementById("web-developer-edit-html-browser").contentDocument.defaultView.WebDeveloper.Dashboard.changeSyntaxHighlightTheme(type, color); - - // If the color is not set - if(color == "none") - { - WebDeveloper.EditHTML.toggleSearch(false); - } - else - { - WebDeveloper.EditHTML.toggleSearch(true); - } -}; - -// Clear the HTML -WebDeveloper.EditHTML.clear = function() -{ - document.getElementById("web-developer-edit-html-browser").contentDocument.defaultView.WebDeveloper.Dashboard.setContent(""); -}; - -// Initializes the edit HTML dashboard -WebDeveloper.EditHTML.initialize = function() -{ - // Try to get the tab browser - try - { - var tabBrowser = WebDeveloper.Common.getTabBrowser(); - - // If the tab browser is set - if(tabBrowser) - { - var tabContainer = tabBrowser.tabContainer; - var theme = WebDeveloper.Preferences.getExtensionStringPreference("syntax.highlight.theme"); - - WebDeveloper.EditHTML.contentDocument = WebDeveloper.Common.getContentDocument(); - - WebDeveloper.EditHTML.retrieveHTML(theme); - WebDeveloper.EditHTML.update(); - - // If the tab container is set - if(tabContainer) - { - tabContainer.addEventListener("TabSelect", WebDeveloper.EditHTML.tabSelect, false); - } - - // If the theme is not set - if(theme == "none") - { - WebDeveloper.EditHTML.toggleSearch(false); - } - - document.getElementById("web-developer-search-dashboard-text").addEventListener("keypress", WebDeveloper.EditHTML.search, false); - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-syntax-highlight-" + theme), "checked", true); - - // If the extension is running on a Mac - if(WebDeveloper.Common.isMac()) - { - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-dashboard-toolbar"), "color", WebDeveloper.Preferences.getExtensionBooleanPreference("toolbar.color")); - } - - tabBrowser.addEventListener("load", WebDeveloper.EditHTML.pageLoad, true); - } - } - catch(exception) - { - // Ignore - } -}; - -// Reinitializes the dashboard when the page changes -WebDeveloper.EditHTML.pageLoad = function(event) -{ - var originalTarget = event.originalTarget; - - // If the event came from an HTML document and it is not a frame - if(originalTarget instanceof HTMLDocument && !originalTarget.defaultView.frameElement) - { - WebDeveloper.EditHTML.contentDocument = WebDeveloper.Common.getContentDocument(); - - WebDeveloper.EditHTML.stopUpdate(); - - // If the page is generated - if(originalTarget.documentURI == "about:blank") - { - window.setTimeout(function() - { - WebDeveloper.EditHTML.retrieveHTML(WebDeveloper.Preferences.getExtensionStringPreference("syntax.highlight.theme")); - WebDeveloper.EditHTML.update(); - }, 1000); - } - else - { - WebDeveloper.EditHTML.retrieveHTML(WebDeveloper.Preferences.getExtensionStringPreference("syntax.highlight.theme")); - WebDeveloper.EditHTML.update(); - } - } -}; - -// Resets the edited HTML -WebDeveloper.EditHTML.reset = function() -{ - WebDeveloper.Common.getTabBrowser().reload(); -}; - -// Retrieves the HTML -WebDeveloper.EditHTML.retrieveHTML = function(theme) -{ - var contentBody = WebDeveloper.Common.getDocumentBodyElement(WebDeveloper.EditHTML.contentDocument); - - // If the content body is set - if(contentBody) - { - var editor = document.getElementById("web-developer-edit-html-browser").contentDocument.defaultView.WebDeveloper.Dashboard; - - editor.initializeEditor("htmlmixed", theme); - editor.setContent(contentBody.innerHTML); - } - - WebDeveloper.EditHTML.apply(); -}; - -// Saves the HTML -WebDeveloper.EditHTML.save = function() -{ - var filePicker = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker); - var result = null; - var url = Components.classes["@mozilla.org/network/standard-url;1"].createInstance(Components.interfaces.nsIURL); - - url.spec = WebDeveloper.EditHTML.contentDocument.documentURI; - filePicker.defaultExtension = url.fileExtension; - filePicker.defaultString = url.fileName; - - filePicker.init(window, WebDeveloper.Locales.getString("saveHTML"), filePicker.modeSave); - - result = filePicker.show(); - - // If the user selected a file - if(result == filePicker.returnOK || result == filePicker.returnReplace) - { - var file = filePicker.file; - var webBrowserPersistInterface = Components.interfaces.nsIWebBrowserPersist; - var webBrowserPersist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(webBrowserPersistInterface); - - webBrowserPersist.persistFlags = webBrowserPersistInterface.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION | webBrowserPersistInterface.PERSIST_FLAGS_FROM_CACHE | webBrowserPersistInterface.PERSIST_FLAGS_REPLACE_EXISTING_FILES; - - // If the file does not exist - if(!file.exists()) - { - file.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, parseInt(644, 8)); - } - - webBrowserPersist.saveDocument(WebDeveloper.EditHTML.contentDocument, file, null, WebDeveloper.EditHTML.contentDocument.contentType, webBrowserPersistInterface.ENCODE_FLAGS_ENCODE_BASIC_ENTITIES, 0); - } -}; - -// Searches the HTML -WebDeveloper.EditHTML.search = function(event) -{ - // If the event is not set or the event key code is set and is 13 - if(!event || event.keyCode && event.keyCode == 13) - { - var query = document.getElementById("web-developer-search-dashboard-text").value; - - // If the query is set - if(query) - { - document.getElementById("web-developer-edit-html-browser").contentDocument.defaultView.WebDeveloper.Dashboard.search(query); - } - } -}; - -// Stops the HTML updating -WebDeveloper.EditHTML.stopUpdate = function() -{ - // If the interval id is set - if(WebDeveloper.EditHTML.interval) - { - window.clearInterval(WebDeveloper.EditHTML.interval); - - WebDeveloper.EditHTML.interval = null; - } -}; - -// Handles a browser tab being selected -WebDeveloper.EditHTML.tabSelect = function() -{ - var contentDocument = WebDeveloper.Common.getContentDocument(); - - // If the content document is different - if(contentDocument != WebDeveloper.EditHTML.contentDocument) - { - WebDeveloper.EditHTML.contentDocument.location.reload(false); - - WebDeveloper.EditHTML.contentDocument = contentDocument; - - WebDeveloper.EditHTML.retrieveHTML(WebDeveloper.Preferences.getExtensionStringPreference("syntax.highlight.theme")); - } -}; - -// Toggles the search -WebDeveloper.EditHTML.toggleSearch = function(enable) -{ - document.getElementById("web-developer-search-dashboard").disabled = !enable; - document.getElementById("web-developer-search-dashboard-text").disabled = !enable; -}; - -// Uninitializes edit HTML -WebDeveloper.EditHTML.uninitialize = function() -{ - // Try to get the tab browser - try - { - var tabBrowser = WebDeveloper.Common.getTabBrowser(); - - WebDeveloper.EditHTML.contentDocument = null; - - WebDeveloper.EditHTML.stopUpdate(); - - // If the tab browser is set - if(tabBrowser) - { - var tabContainer = tabBrowser.tabContainer; - - document.getElementById("web-developer-search-dashboard-text").removeEventListener("keypress", WebDeveloper.EditHTML.search, false); - tabBrowser.removeEventListener("load", WebDeveloper.EditHTML.pageLoad, true); - - // If the tab container is set - if(tabContainer) - { - tabContainer.removeEventListener("TabSelect", WebDeveloper.EditHTML.tabSelect, false); - } - } - } - catch(exception) - { - // Ignore - } -}; - -// Updates the HTML -WebDeveloper.EditHTML.update = function() -{ - // If the update frequency is greater than 0 - if(WebDeveloper.EditHTML.updateFrequency > 0) - { - WebDeveloper.EditHTML.interval = window.setInterval(WebDeveloper.EditHTML.apply, WebDeveloper.EditHTML.updateFrequency); - } -}; diff --git a/source/firefox/javascript/dashboard/element-information.js b/source/firefox/javascript/dashboard/element-information.js deleted file mode 100644 index 8ace631..0000000 --- a/source/firefox/javascript/dashboard/element-information.js +++ /dev/null @@ -1,79 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.ElementInformation = WebDeveloper.ElementInformation || {}; - -// Copies the ancestor path -WebDeveloper.ElementInformation.copyAncestorPath = function() -{ - Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(document.getElementById("web-developer-element-information-browser").contentDocument.defaultView.WebDeveloper.Dashboard.getAncestorPath()); - - WebDeveloper.Common.displayNotification("ancestorPathCopied"); -}; - -// Displays the information for an element -WebDeveloper.ElementInformation.displayElementInformation = function(element) -{ - var generatedDocument = document.getElementById("web-developer-element-information-browser").contentDocument; - var theme = WebDeveloper.Preferences.getExtensionStringPreference("syntax.highlight.theme"); - - generatedDocument.defaultView.WebDeveloper.Dashboard.setPosition(WebDeveloper.Preferences.getExtensionStringPreference("dashboard.position")); - generatedDocument.defaultView.WebDeveloper.Dashboard.initialize(WebDeveloper.ElementInformation.generateElementInformation(element, element.ownerDocument, generatedDocument, theme), theme); -}; - -// Returns a string from the locale -WebDeveloper.ElementInformation.getLocaleString = function(name) -{ - return WebDeveloper.Locales.getString(name); -}; - -// Initializes the element information dashboard -WebDeveloper.ElementInformation.initialize = function() -{ - var contentDocument = null; - var documents = WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()); - - // Loop through the documents - for(var i = 0, l = documents.length; i < l; i++) - { - contentDocument = documents[i]; - - contentDocument.addEventListener("click", WebDeveloper.ElementInformation.click, true); - contentDocument.addEventListener("mouseover", WebDeveloper.ElementAncestors.mouseOver, false); - - WebDeveloper.Common.toggleStyleSheet("toolbar/style-sheets/element-ancestors.css", "web-developer-element-information-styles", contentDocument, false); - } - - WebDeveloper.ElementAncestors.createToolbar(); - - contentDocument = document.getElementById("web-developer-element-information-browser").contentDocument; - contentDocument.getElementById("web-developer-information").textContent = WebDeveloper.Locales.getString("selectAnElementDisplayInformation"); - - contentDocument.addEventListener("click", WebDeveloper.ElementInformation.clickOutput, false); -}; - -// Uninitializes the element information dashboard -WebDeveloper.ElementInformation.uninitialize = function() -{ - var contentDocument = document.getElementById("web-developer-element-information-browser").contentDocument; - var documents = WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()); - - contentDocument.removeEventListener("click", WebDeveloper.ElementInformation.clickOutput, false); - - // Loop through the documents - for(var i = 0, l = documents.length; i < l; i++) - { - contentDocument = documents[i]; - - contentDocument.removeEventListener("click", WebDeveloper.ElementInformation.click, true); - contentDocument.removeEventListener("mouseover", WebDeveloper.ElementAncestors.mouseOver, false); - - WebDeveloper.ElementAncestors.removeOutline(contentDocument); - WebDeveloper.Common.toggleStyleSheet("toolbar/style-sheets/element-ancestors.css", "web-developer-element-information-styles", contentDocument, false); - } - - // If the style information is not also running - if(!WebDeveloper.Common.getMainWindow().WebDeveloper.Dashboard.isOpenInDashboard(WebDeveloper.Locales.getString("styleInformation"))) - { - WebDeveloper.ElementAncestors.removeToolbar(contentDocument); - } -}; diff --git a/source/firefox/javascript/dashboard/html/common.js b/source/firefox/javascript/dashboard/html/common.js deleted file mode 100644 index b9d2b00..0000000 --- a/source/firefox/javascript/dashboard/html/common.js +++ /dev/null @@ -1,221 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Dashboard = WebDeveloper.Dashboard || {}; -WebDeveloper.Dashboard.browserWindow = null; -WebDeveloper.Dashboard.currentLine = null; -WebDeveloper.Dashboard.editor = null; -WebDeveloper.Dashboard.editorElement = null; -WebDeveloper.Dashboard.lastPosition = null; -WebDeveloper.Dashboard.lastQuery = null; -WebDeveloper.Dashboard.textArea = null; - -// Adjusts the breadcrumb -WebDeveloper.Dashboard.adjustBreadcrumb = function() -{ - // If the dashboard is not vertical - if(!$("html").hasClass("vertical")) - { - $(".breadcrumb").css("margin-right", $("#web-developer-copy-ancestor-path").outerWidth() + 10 + "px"); - } -}; - -// Changes the syntax highlight theme -WebDeveloper.Dashboard.changeSyntaxHighlightTheme = function(type, color) -{ - WebDeveloper.Dashboard.setContent(WebDeveloper.Dashboard.getContent(), true); - - // If the color is not set - if(color == "none") - { - $(".CodeMirror").hide(); - WebDeveloper.Dashboard.textArea.show(); - } - else if(WebDeveloper.Dashboard.editorElement) - { - $(".CodeMirror").show(); - WebDeveloper.Dashboard.textArea.hide(); - - WebDeveloper.Dashboard.editor.setOption("theme", color); - } - else - { - WebDeveloper.Dashboard.initializeSyntaxHighlight(type, color); - } - - WebDeveloper.Dashboard.resize(); -}; - -// Returns the ancestor path -WebDeveloper.Dashboard.getAncestorPath = function() -{ - var ancestor = null; - var ancestorData = null; - var ancestorPath = ""; - - // Loop through the ancestors - $("li", $("#web-developer-ancestors")).each(function() - { - ancestor = $(this); - ancestorData = ancestor.data("web-developer-element-id"); - ancestorPath += ancestor.data("web-developer-element-tag"); - - // If the ancestor data is set - if(ancestorData) - { - ancestorPath += ancestorData; - } - - ancestorData = ancestor.data("web-developer-element-classes"); - - // If the ancestor data is set - if(ancestorData) - { - ancestorPath += ancestorData; - } - - ancestorPath += " > "; - }); - - // If the ancestor path is set - if(ancestorPath) - { - ancestorPath = ancestorPath.substring(0, ancestorPath.length - 3); - } - - return ancestorPath; -}; - -// Returns the content -WebDeveloper.Dashboard.getContent = function() -{ - // If the text area is set and is visible - if(WebDeveloper.Dashboard.textArea && WebDeveloper.Dashboard.textArea.is(":visible")) - { - return WebDeveloper.Dashboard.textArea.val(); - } - else if(WebDeveloper.Dashboard.editor) - { - return WebDeveloper.Dashboard.editor.getValue(); - } - - return null; -}; - -// Initializes the editor -WebDeveloper.Dashboard.initializeEditor = function(type, color) -{ - WebDeveloper.Dashboard.browserWindow = $(window); - WebDeveloper.Dashboard.textArea = $("#web-developer-content"); - - // If the color is set - if(color != "none") - { - WebDeveloper.Dashboard.initializeSyntaxHighlight(type, color); - } - - WebDeveloper.Dashboard.resize(); - - WebDeveloper.Dashboard.browserWindow.on("resize", WebDeveloper.Dashboard.resize); -}; - -// Initializes the syntax highlight functionality -WebDeveloper.Dashboard.initializeSyntaxHighlight = function(type, color) -{ - /* eslint-disable indent */ - WebDeveloper.Dashboard.editor = CodeMirror.fromTextArea($("#web-developer-content").get(0), - { - onFocus: function() { window.focus(); }, - lineNumbers: true, - mode: type, - onCursorActivity: function() - { - // If the current line is set - if(WebDeveloper.Dashboard.currentLine) - { - WebDeveloper.Dashboard.editor.setLineClass(WebDeveloper.Dashboard.currentLine, null); - } - - WebDeveloper.Dashboard.currentLine = WebDeveloper.Dashboard.editor.setLineClass(WebDeveloper.Dashboard.editor.getCursor().line, null, "current-line"); - }, - tabSize: 2, - theme: color - }); - /* eslint-enable indent */ - - WebDeveloper.Dashboard.editorElement = $(WebDeveloper.Dashboard.editor.getScrollerElement()); -}; - -// Handles the window being resized -WebDeveloper.Dashboard.resize = function() -{ - WebDeveloper.Dashboard.textArea.height(WebDeveloper.Dashboard.browserWindow.height()); - - // If the editor element is set - if(WebDeveloper.Dashboard.editorElement) - { - WebDeveloper.Dashboard.editorElement.height(WebDeveloper.Dashboard.browserWindow.height()); - } -}; - -// Searches for the specified query -WebDeveloper.Dashboard.search = function(query) -{ - // If the editor element is set - if(WebDeveloper.Dashboard.editorElement) - { - var cursor = null; - - // If this is a new query - if(query != WebDeveloper.Dashboard.lastQuery) - { - WebDeveloper.Dashboard.lastPosition = null; - WebDeveloper.Dashboard.lastQuery = query; - } - - cursor = WebDeveloper.Dashboard.editor.getSearchCursor(query, WebDeveloper.Dashboard.lastPosition, true); - - // If the search was not found - if(!cursor.findNext()) - { - cursor = WebDeveloper.Dashboard.editor.getSearchCursor(query, null, true); - - // If the search was still not found - if(!cursor.findNext()) - { - return; - } - } - - WebDeveloper.Dashboard.lastPosition = cursor.to(); - - WebDeveloper.Dashboard.editor.setSelection(cursor.from(), WebDeveloper.Dashboard.lastPosition); - } -}; - -// Sets the content -WebDeveloper.Dashboard.setContent = function(content, excludeNewLine) -{ - WebDeveloper.Dashboard.textArea.val(content); - - // If the editor is set - if(WebDeveloper.Dashboard.editor) - { - // If not excluding the new line - if(!excludeNewLine) - { - content += "\n"; - } - - WebDeveloper.Dashboard.editor.setValue(content); - } -}; - -// Sets the position -WebDeveloper.Dashboard.setPosition = function(position) -{ - // If the position is left or right - if(position == "left" || position == "right") - { - $("html").addClass("vertical"); - } -}; diff --git a/source/firefox/javascript/dashboard/html/edit-css.js b/source/firefox/javascript/dashboard/html/edit-css.js deleted file mode 100644 index c71e123..0000000 --- a/source/firefox/javascript/dashboard/html/edit-css.js +++ /dev/null @@ -1,19 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Dashboard = WebDeveloper.Dashboard || {}; - -// Initializes the page with JSON data -WebDeveloper.Dashboard.initializeWithJSON = function(event) -{ - var eventTarget = event.target; - var data = JSON.parse(eventTarget.getAttribute("data-web-developer")); - - WebDeveloper.Dashboard.initializeEditor("css", data.theme); - WebDeveloper.Dashboard.setContent(data.content); - - eventTarget.removeAttribute("data-web-developer"); - - window.removeEventListener("web-developer-dashboard-event", WebDeveloper.Dashboard.initializeWithJSON, false); -}; - -window.addEventListener("web-developer-dashboard-event", WebDeveloper.Dashboard.initializeWithJSON, false); diff --git a/source/firefox/javascript/dashboard/html/element-information.js b/source/firefox/javascript/dashboard/html/element-information.js deleted file mode 100644 index 62ed85c..0000000 --- a/source/firefox/javascript/dashboard/html/element-information.js +++ /dev/null @@ -1,22 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Dashboard = WebDeveloper.Dashboard || {}; - -// Initializes the page -WebDeveloper.Dashboard.initialize = function(elementInformation, theme) -{ - var content = $("#content"); - - // Fades out the previous content before updating - content.fadeOut(WebDeveloper.Generated.animationSpeed, function() - { - content.css("visibility", "hidden").show().empty().get(0).appendChild(elementInformation); - - WebDeveloper.Dashboard.adjustBreadcrumb(); - WebDeveloper.Generated.resizeAncestors(true); - WebDeveloper.Generated.initializeSyntaxHighlight(theme); - - // Fades in the new content - content.hide().css("visibility", "visible").fadeIn(WebDeveloper.Generated.animationSpeed); - }); -}; diff --git a/source/firefox/javascript/dashboard/html/style-information.js b/source/firefox/javascript/dashboard/html/style-information.js deleted file mode 100644 index faa1682..0000000 --- a/source/firefox/javascript/dashboard/html/style-information.js +++ /dev/null @@ -1,23 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Dashboard = WebDeveloper.Dashboard || {}; - -// Initializes the page -WebDeveloper.Dashboard.initialize = function(styleInformation, theme) -{ - var content = $("#content"); - - // Fades out the previous content before updating - content.fadeOut(WebDeveloper.Generated.animationSpeed, function() - { - content.css("visibility", "hidden").show().empty().get(0).appendChild(styleInformation); - - WebDeveloper.Dashboard.adjustBreadcrumb(); - WebDeveloper.Generated.resizeAncestors(true); - WebDeveloper.Generated.initializeCommonElements(); - WebDeveloper.Generated.initializeSyntaxHighlight(theme); - - // Fades in the new content - content.hide().css("visibility", "visible").fadeIn(WebDeveloper.Generated.animationSpeed); - }); -}; diff --git a/source/firefox/javascript/dashboard/style-information.js b/source/firefox/javascript/dashboard/style-information.js deleted file mode 100644 index 0c4d95d..0000000 --- a/source/firefox/javascript/dashboard/style-information.js +++ /dev/null @@ -1,338 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.StyleInformation = WebDeveloper.StyleInformation || {}; -WebDeveloper.StyleInformation.currentElement = null; - -// Handles the click event -WebDeveloper.StyleInformation.click = function(event) -{ - // If the click was not a right click - if(event.button != 2) - { - var eventTarget = event.target; - - // If the event target is set - if(eventTarget) - { - var tagName = eventTarget.tagName; - - // If the event target is not a scrollbar - if(tagName && tagName.toLowerCase() != "scrollbar") - { - WebDeveloper.StyleInformation.displayStyleInformation(eventTarget); - } - - event.stopPropagation(); - event.preventDefault(); - } - } -}; - -// Handles the click event inside the output -WebDeveloper.StyleInformation.clickOutput = function(event) -{ - // If the click was not a right click - if(event.button != 2) - { - var eventTarget = event.target; - - // If the event target is set - if(eventTarget) - { - // If the event target is the copy ancestor path button - if(eventTarget.hasAttribute("id") && eventTarget.getAttribute("id") == "web-developer-copy-ancestor-path") - { - WebDeveloper.StyleInformation.copyAncestorPath(); - } - else - { - var tagName = eventTarget.tagName; - - // If the event target is a link - if(tagName && tagName.toLowerCase() == "a") - { - var href = eventTarget.getAttribute("href"); - - // If the href is set and is a hash - if(href && href == "#") - { - WebDeveloper.StyleInformation.selectParentElement(eventTarget); - } - else - { - WebDeveloper.Common.openURL(href); - } - - event.preventDefault(); - } - } - } - } -}; - -// Copies the ancestor path -WebDeveloper.StyleInformation.copyAncestorPath = function() -{ - Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(document.getElementById("web-developer-style-information-browser").contentDocument.defaultView.WebDeveloper.Dashboard.getAncestorPath()); - - WebDeveloper.Common.displayNotification("ancestorPathCopied"); -}; - -// Displays the style information for an element -WebDeveloper.StyleInformation.displayStyleInformation = function(element) -{ - var childElement = null; - var generatedDocument = document.getElementById("web-developer-style-information-browser").contentDocument; - var generatedContent = generatedDocument.getElementById("content"); - var headingElement = null; - var noStyleInformation = true; - var styleInformation = generatedDocument.createDocumentFragment(); - var styleSheet = null; - var styleSheets = WebDeveloper.StyleInformation.getStyleInformation(element); - - WebDeveloper.StyleInformation.currentElement = element; - - WebDeveloper.Common.empty(generatedContent); - styleInformation.appendChild(WebDeveloper.ElementAncestors.generateAncestorInformation(element, generatedDocument)); - - // Loop through the style sheets - for(styleSheet in styleSheets) - { - // Filter unwanted properties - if(styleSheets.hasOwnProperty(styleSheet)) - { - childElement = generatedDocument.createElement("i"); - headingElement = generatedDocument.createElement("h3"); - - childElement.setAttribute("class", "icon-caret-down"); - headingElement.appendChild(childElement); - - // If this is the embedded style sheet - if(styleSheet == "web-developer-embedded") - { - headingElement.appendChild(generatedDocument.createTextNode(WebDeveloper.Locales.getString("embeddedStyles"))); - } - else - { - childElement = generatedDocument.createElement("a"); - - childElement.appendChild(generatedDocument.createTextNode(styleSheet)); - childElement.setAttribute("href", styleSheet); - headingElement.appendChild(childElement); - } - - styleInformation.appendChild(headingElement); - - childElement = generatedDocument.createElement("pre"); - - childElement.appendChild(generatedDocument.createTextNode(styleSheets[styleSheet].trim())); - childElement.setAttribute("class", "web-developer-syntax-highlight"); - childElement.setAttribute("data-line-numbers", "false"); - childElement.setAttribute("data-type", "css"); - styleInformation.appendChild(childElement); - - noStyleInformation = false; - } - } - - // If no style information was found - if(noStyleInformation) - { - childElement = generatedDocument.createElement("p"); - - childElement.appendChild(generatedDocument.createTextNode(WebDeveloper.Locales.getString("noStyleInformation"))); - childElement.setAttribute("class", "lead text-info"); - childElement.setAttribute("id", "web-developer-information"); - styleInformation.appendChild(childElement); - } - - generatedDocument.defaultView.WebDeveloper.Dashboard.setPosition(WebDeveloper.Preferences.getExtensionStringPreference("dashboard.position")); - generatedDocument.defaultView.WebDeveloper.Dashboard.initialize(styleInformation, WebDeveloper.Preferences.getExtensionStringPreference("syntax.highlight.theme")); -}; - -// Formats a style -WebDeveloper.StyleInformation.formatStyle = function(property, value) -{ - return " " + WebDeveloper.CSS.formatStyleProperty(property) + ": " + WebDeveloper.CSS.formatStyleValue(value) + ";\n"; -}; - -// Gets the style information for an element -WebDeveloper.StyleInformation.getStyleInformation = function(element) -{ - var domUtils = Components.classes["@mozilla.org/inspector/dom-utils;1"].getService(Components.interfaces.inIDOMUtils); - var line = null; - var rule = null; - var rules = domUtils.getCSSStyleRules(element); - var ruleStyle = null; - var ruleStyles = null; - var styleSheet = null; - var styleSheetHref = null; - var styleSheets = []; - var styleText = null; - - // Loop through the element rules - for(var i = 0, l = rules.Count(); i < l; i++) - { - rule = rules.GetElementAt(i).QueryInterface(Components.interfaces.nsIDOMCSSStyleRule); - line = domUtils.getRuleLine(rule); - - // If there is a parent style sheet - if(rule.parentStyleSheet) - { - styleSheet = rule.parentStyleSheet; - } - - // If this is a valid style sheet - if(WebDeveloper.CSS.isValidStyleSheet(styleSheet)) - { - ruleStyles = rule.style; - styleSheetHref = styleSheet.href; - styleText = "/* " + WebDeveloper.Locales.getString("line") + " " + line + " */\n" + rule.selectorText + "\n{\n"; - - // If the style sheet href is not set - if(!styleSheetHref) - { - styleSheetHref = "web-developer-embedded"; - } - - // Loop through the style rules - for(var j = 0, m = ruleStyles.length; j < m; j++) - { - ruleStyle = ruleStyles[j]; - - // If this is a valid rule style - if(WebDeveloper.CSS.isValidRuleStyle(ruleStyles, ruleStyle)) - { - styleText += WebDeveloper.StyleInformation.formatStyle(ruleStyle, ruleStyles.getPropertyValue(ruleStyle)); - } - } - - styleText += "}\n\n"; - - // If this style sheet has rules already stored - if(styleSheets[styleSheetHref]) - { - styleSheets[styleSheetHref] += styleText; - } - else - { - styleSheets[styleSheetHref] = styleText; - } - } - } - - // If the element has inline styles - if(element.hasAttribute("style")) - { - var inlineStyle = null; - var inlineStyles = element.getAttribute("style").split(";"); - var property = null; - - styleText = ""; - - // If there are inline styles - if(inlineStyles.length) - { - // Loop through the inline styles - for(i = 0, l = inlineStyles.length; i < l; i++) - { - inlineStyle = inlineStyles[i]; - - // If the inline style is set - if(inlineStyle) - { - ruleStyle = inlineStyle.split(":"); - property = ruleStyle[0].trim(); - - // If the property is not an outline - if(property != "outline") - { - styleText += WebDeveloper.StyleInformation.formatStyle(property, ruleStyle[1].trim()); - } - } - } - - // If the style text is set - if(styleText) - { - styleSheets["/* " + WebDeveloper.Locales.getString("inlineStyles") + " */"] = "\n{\n" + styleText + "\n}\n"; - } - } - } - - return styleSheets; -}; - -// Initializes the style information dashboard -WebDeveloper.StyleInformation.initialize = function() -{ - var contentDocument = null; - var documents = WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()); - - // Loop through the documents - for(var i = 0, l = documents.length; i < l; i++) - { - contentDocument = documents[i]; - - contentDocument.addEventListener("click", WebDeveloper.StyleInformation.click, true); - contentDocument.addEventListener("mouseover", WebDeveloper.ElementAncestors.mouseOver, false); - - WebDeveloper.Common.toggleStyleSheet("toolbar/style-sheets/element-ancestors.css", "web-developer-style-information-styles", contentDocument, false); - } - - WebDeveloper.ElementAncestors.createToolbar(); - - contentDocument = document.getElementById("web-developer-style-information-browser").contentDocument; - contentDocument.getElementById("web-developer-information").textContent = WebDeveloper.Locales.getString("selectAnElementDisplayStyles"); - - contentDocument.addEventListener("click", WebDeveloper.StyleInformation.clickOutput, false); -}; - -// Handles a parent element being selected -WebDeveloper.StyleInformation.selectParentElement = function(eventTarget) -{ - var ancestorCount = 0; - var element = eventTarget.parentNode; - var parentElement = WebDeveloper.StyleInformation.currentElement; - - // Loop through the next siblings - while((element = element.nextSibling) !== null) - { - ancestorCount++; - } - - // Loop through the ancestors - for(var i = 0; i < ancestorCount; i++) - { - parentElement = parentElement.parentNode; - } - - WebDeveloper.StyleInformation.displayStyleInformation(parentElement); -}; - -// Uninitializes the style information dashboard -WebDeveloper.StyleInformation.uninitialize = function() -{ - var contentDocument = document.getElementById("web-developer-style-information-browser").contentDocument; - var documents = WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()); - - contentDocument.removeEventListener("click", WebDeveloper.StyleInformation.clickOutput, false); - - // Loop through the documents - for(var i = 0, l = documents.length; i < l; i++) - { - contentDocument = documents[i]; - - contentDocument.removeEventListener("click", WebDeveloper.StyleInformation.click, true); - contentDocument.removeEventListener("mouseover", WebDeveloper.ElementAncestors.mouseOver, false); - - WebDeveloper.ElementAncestors.removeOutline(contentDocument); - WebDeveloper.Common.toggleStyleSheet("toolbar/style-sheets/element-ancestors.css", "web-developer-style-information-styles", contentDocument, false); - } - - // If the element information is not also running - if(!WebDeveloper.Common.getMainWindow().WebDeveloper.Dashboard.isOpenInDashboard(WebDeveloper.Locales.getString("elementInformation"))) - { - WebDeveloper.ElementAncestors.removeToolbar(); - } -}; diff --git a/source/firefox/javascript/dialogs/cookie.js b/source/firefox/javascript/dialogs/cookie.js deleted file mode 100644 index 7c84613..0000000 --- a/source/firefox/javascript/dialogs/cookie.js +++ /dev/null @@ -1,139 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Cookie = WebDeveloper.Cookie || {}; - -// Handles the cookie dialog being accepted -WebDeveloper.Cookie.accept = function() -{ - var host = document.getElementById("web-developer-host").value.trim(); - var errors = ""; - var expires = document.getElementById("web-developer-expires").value.trim(); - var expiresDate = new Date(expires); - var name = document.getElementById("web-developer-name").value.trim(); - var path = document.getElementById("web-developer-path").value.trim(); - - // If the name is empty - if(!name) - { - errors += WebDeveloper.Locales.getString("emptyName") + "\n"; - } - - // If the host is empty - if(!host) - { - errors += WebDeveloper.Locales.getString("emptyHost") + "\n"; - } - - // If the path is empty - if(!path) - { - errors += WebDeveloper.Locales.getString("emptyPath") + "\n"; - } - - // If this is not a session cookie - if(!document.getElementById("web-developer-session-cookie").checked) - { - // If the expires is empty - if(!expires) - { - errors += WebDeveloper.Locales.getString("emptyExpires") + "\n"; - } - else if(expiresDate && expiresDate == "Invalid Date") - { - errors += WebDeveloper.Locales.getString("invalidExpires") + "\n"; - } - } - - // If there are errors - if(errors) - { - WebDeveloper.Common.displayError(WebDeveloper.Locales.getString("addCookieError"), errors.trim()); - - return false; - } - else - { // eslint-disable-line no-else-return - var value = document.getElementById("web-developer-value").value.trim(); - var cookie = name + "=" + value + ";path=" + path + ";"; - var cookiePreference = WebDeveloper.Preferences.getIntegerPreference("network.cookie.cookieBehavior"); - var scheme = "http://"; - var secure = document.getElementById("web-developer-secure-cookie").checked; - var session = document.getElementById("web-developer-session-cookie").checked; - var uri = null; - - // If the host is a domain - if(host.charAt(0) == ".") - { - cookie += "domain=" + host + ";"; - host = host.substring(1); - } - - // If this is not a session cookie - if(!session) - { - cookie += "expires=" + expiresDate.toUTCString() + ";"; - } - - // If the cookie is secure - if(secure) - { - cookie += "secure;"; - scheme = "https://"; - } - - uri = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService).newURI(scheme + host + path, null, null); - - // If the cookie preference is not allowing all cookies - if(cookiePreference !== 0) - { - WebDeveloper.Preferences.setIntegerPreference("network.cookie.cookieBehavior", 0); - } - - Components.classes["@mozilla.org/cookieService;1"].getService().QueryInterface(Components.interfaces.nsICookieService).setCookieString(uri, null, cookie.substring(0, cookie.length - 1), null); - - // If the cookie preference was not allowing all cookies - if(cookiePreference !== 0) - { - WebDeveloper.Preferences.setIntegerPreference("network.cookie.cookieBehavior", cookiePreference); - } - } - - return true; -}; - -// Initializes the cookie dialog -WebDeveloper.Cookie.initialize = function() -{ - var date = new Date(); - var url = Components.classes["@mozilla.org/network/standard-url;1"].createInstance(Components.interfaces.nsIURL); - - url.spec = WebDeveloper.Common.getContentDocument().documentURI; - - date.setDate(date.getDate() + 1); - - document.getElementById("web-developer-expires").value = date.toUTCString(); - document.getElementById("web-developer-host").value = url.host; - document.getElementById("web-developer-path").value = url.path; -}; - -// Updates the expiry status -WebDeveloper.Cookie.updateExpiryStatus = function() -{ - var expires = document.getElementById("web-developer-expires"); - - // If session cookie is checked - if(document.getElementById("web-developer-session-cookie").checked) - { - expires.disabled = true; - expires.value = ""; - } - else - { - var date = new Date(); - - date.setDate(date.getDate() + 1); - - expires.disabled = false; - expires.value = date.toUTCString(); - } -}; diff --git a/source/firefox/javascript/dialogs/message.js b/source/firefox/javascript/dialogs/message.js deleted file mode 100644 index d96aa4c..0000000 --- a/source/firefox/javascript/dialogs/message.js +++ /dev/null @@ -1,16 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Message = WebDeveloper.Message || {}; - -// Initializes the message dialog -WebDeveloper.Message.initialize = function() -{ - document.getElementById("web-developer-message").value = window.arguments[0]; -}; - -// Opens the more information URL in a new tab -WebDeveloper.Message.moreInformation = function() -{ - WebDeveloper.Common.openURL(window.arguments[1]); - window.close(); -}; diff --git a/source/firefox/javascript/dialogs/outline-custom-elements.js b/source/firefox/javascript/dialogs/outline-custom-elements.js deleted file mode 100644 index f5a3b44..0000000 --- a/source/firefox/javascript/dialogs/outline-custom-elements.js +++ /dev/null @@ -1,96 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.OutlineCustomElements = WebDeveloper.OutlineCustomElements || {}; - -// Handles the outline custom elements dialog being accepted -WebDeveloper.OutlineCustomElements.accept = function() -{ - // Loop through the outline custom elements - for(var i = 1; i <= 5; i++) - { - WebDeveloper.Preferences.setExtensionStringPreference("outline.custom.element." + i, document.getElementById("web-developer-outline-custom-element-" + i).value); - WebDeveloper.Preferences.setExtensionStringPreference("outline.custom.element." + i + ".color", document.getElementById("web-developer-outline-custom-element-" + i + "-color").color); - } - - WebDeveloper.OutlineCustomElements.outline(); - - return true; -}; - -// Initializes the outline custom elements dialog -WebDeveloper.OutlineCustomElements.initialize = function() -{ - // Loop through the outline custom elements - for(var i = 1; i <= 5; i++) - { - document.getElementById("web-developer-outline-custom-element-" + i).value = WebDeveloper.Preferences.getExtensionStringPreference("outline.custom.element." + i); - document.getElementById("web-developer-outline-custom-element-" + i + "-color").color = WebDeveloper.Preferences.getExtensionStringPreference("outline.custom.element." + i + ".color"); - } -}; - -// Outlines the custom elements -WebDeveloper.OutlineCustomElements.outline = function() -{ - var contentDocument = null; - var documents = WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()); - var outlineColor = null; - var outlineElement = null; - var outlineElements = null; - var outlineElementValue = null; - var showElementTagNames = WebDeveloper.Preferences.getExtensionBooleanPreference("outline.show.element.tag.names"); - var styleElement = null; - var styles = null; - - // Loop through the documents - for(var i = 0, l = documents.length; i < l; i++) - { - contentDocument = documents[i]; - styles = ""; - - // Loop through outline custom elements - for(var j = 1; j <= 5; j++) - { - outlineColor = WebDeveloper.Preferences.getExtensionStringPreference("outline.custom.element." + j + ".color"); - outlineElement = WebDeveloper.Preferences.getExtensionStringPreference("outline.custom.element." + j); - - // If the outline color and element are set - if(outlineColor && outlineElement) - { - outlineElements = outlineElement.split(","); - - // Loop through the elements - for(var k = 0, m = outlineElements.length; k < m; k++) - { - outlineElementValue = outlineElements[k].trim(); - - styles += outlineElementValue + " { outline: 1px solid " + outlineColor + " !important; } "; - - // If showing element tag names - if(showElementTagNames) - { - styles += outlineElementValue + ':before { content: "<' + outlineElementValue + '>" !important; } '; - } - } - } - } - - // If the styles are set - if(styles) - { - styleElement = contentDocument.createElement("style"); - - styleElement.appendChild(contentDocument.createTextNode(styles)); - styleElement.setAttribute("id", "web-developer-outline-custom-elements"); - - WebDeveloper.Common.getDocumentHeadElement(contentDocument).appendChild(styleElement); - } - - // If showing element tag names - if(showElementTagNames) - { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-outline-custom-elements-before", contentDocument, false); - } - } - - WebDeveloper.Storage.toggleFeature(window.arguments[0]); -}; diff --git a/source/firefox/javascript/dialogs/resize-window.js b/source/firefox/javascript/dialogs/resize-window.js deleted file mode 100644 index cb26a9f..0000000 --- a/source/firefox/javascript/dialogs/resize-window.js +++ /dev/null @@ -1,89 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.ResizeWindow = WebDeveloper.ResizeWindow || {}; - -// Handles the resize window dialog being accepted -WebDeveloper.ResizeWindow.accept = function() -{ - var height = document.getElementById("web-developer-resize-height").value.replace(/px/gi, "").trim(); - var width = document.getElementById("web-developer-resize-width").value.replace(/px/gi, "").trim(); - - // If the width and height are valid - if(width && height && (width == "*" || parseInt(width, 10) == width && width > 0) && (height == "*" || parseInt(height, 10) == height && height > 0)) - { - var contentWindow = window.opener.content; - var windowX = window.opener.screenX; - var windowY = window.opener.screenY; - - // If resizing the view port - if(document.getElementById("web-developer-resize-viewport").checked) - { - WebDeveloper.Preferences.setExtensionBooleanPreference("resize.viewport", true); - - // If the width is not a wildcard - if(width != "*") - { - contentWindow.innerWidth = width; - } - - // If the height is not a wildcard - if(height != "*") - { - contentWindow.innerHeight = height; - } - } - else - { - WebDeveloper.Preferences.deleteExtensionPreference("resize.viewport"); - - // If the width is a wildcard - if(width == "*") - { - width = contentWindow.outerWidth; - } - - // If the height is a wildcard - if(height == "*") - { - height = contentWindow.outerHeight; - } - - window.opener.resizeTo(width, height); - } - - window.opener.screenX = windowX; - window.opener.screenY = windowY; - - return true; - } - else if(!height || parseInt(height, 10) != height || height <= 0) - { - WebDeveloper.Common.displayError(WebDeveloper.Locales.getString("resizeWindow"), WebDeveloper.Locales.getString("invalidHeight")); - } - else - { - WebDeveloper.Common.displayError(WebDeveloper.Locales.getString("resizeWindow"), WebDeveloper.Locales.getString("invalidWidth")); - } - - return false; -}; - -// Initializes the resize dialog -WebDeveloper.ResizeWindow.initialize = function() -{ - var resizeViewport = WebDeveloper.Preferences.getExtensionBooleanPreference("resize.viewport"); - - document.getElementById("web-developer-resize-viewport").checked = resizeViewport; - - // If resizing the viewport - if(resizeViewport) - { - document.getElementById("web-developer-resize-width").value = window.arguments[2]; - document.getElementById("web-developer-resize-height").value = window.arguments[3]; - } - else - { - document.getElementById("web-developer-resize-width").value = window.arguments[0]; - document.getElementById("web-developer-resize-height").value = window.arguments[1]; - } -}; diff --git a/source/firefox/javascript/features/images.js b/source/firefox/javascript/features/images.js deleted file mode 100644 index de16313..0000000 --- a/source/firefox/javascript/features/images.js +++ /dev/null @@ -1,71 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Images = WebDeveloper.Images || {}; - -// Displays the file sizes for all images -WebDeveloper.Images.displayImageFileSizes = function(display, documents) -{ - var contentDocument = null; - var fileSizeRequests = []; - var image = null; - var images = null; - - // Loop through the documents - for(var i = 0, l = documents.length; i < l; i++) - { - contentDocument = documents[i]; - - // If displaying the file sizes - if(display) - { - images = contentDocument.images; - - // Loop through the images - for(var j = 0, m = images.length; j < m; j++) - { - image = images[j]; - - fileSizeRequests.push({ fileObject: {}, image: image, includeUncompressed: false, url: image.src }); - } - } - else - { - WebDeveloper.Common.removeMatchingElements(".web-developer-display-image-file-sizes", contentDocument); - } - - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-display-image-file-sizes-before", contentDocument, false); - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/images/display-image-file-sizes.css", "web-developer-display-image-file-sizes", contentDocument, false); - } - - // If display the file sizes and there are requests - if(display && fileSizeRequests.length) - { - WebDeveloper.Common.getFileSizes(fileSizeRequests, function() - { - var bytes = WebDeveloper.Locales.getString("bytes"); - var fileSizeRequest = null; - var kilobytes = WebDeveloper.Locales.getString("kilobytes"); - var spanElement = null; - var text = null; - - // Loop through the file size requests - for(i = 0, l = fileSizeRequests.length; i < l; i++) - { - fileSizeRequest = fileSizeRequests[i]; - image = fileSizeRequest.image; - contentDocument = image.ownerDocument; - text = WebDeveloper.Common.formatFileSize(fileSizeRequest.fileObject.size.size, bytes, kilobytes); - - // If the text is set - if(text) - { - spanElement = contentDocument.createElement("span"); - - spanElement.setAttribute("class", "web-developer-display-image-file-sizes"); - spanElement.appendChild(contentDocument.createTextNode(text)); - image.parentNode.insertBefore(spanElement, image); - } - } - }); - } -}; diff --git a/source/firefox/javascript/generated/view-document-size.js b/source/firefox/javascript/generated/view-document-size.js deleted file mode 100644 index 2fbb388..0000000 --- a/source/firefox/javascript/generated/view-document-size.js +++ /dev/null @@ -1,199 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Generated = WebDeveloper.Generated || {}; - -// Adds a section to the document size -WebDeveloper.Generated.addSection = function(elements, descriptionSingular, descriptionPlural, tableBody, bytesLocale, kilobytesLocale) -{ - var element = null; - var elementsLength = elements.length; - var fileSize = null; - var filesLength = 0; - var sectionHeader = null; - var sectionSize = 0; - var sectionUncompressedSize = 0; - var size = null; - var sizeInformation = {}; - var uncompressedSize = null; - - sizeInformation.description = elementsLength + " "; - - // If there is only one element - if(elementsLength == 1) - { - sizeInformation.description += descriptionSingular; - } - else - { - sizeInformation.description += descriptionPlural; - } - - sectionHeader = ich.documentSizeHeader(sizeInformation); - - tableBody.append(sectionHeader); - - // Loop through the elements - for(var i = 0; i < elementsLength; i++) - { - element = elements[i]; - fileSize = element.size; - size = fileSize.size; - sizeInformation = {}; - uncompressedSize = fileSize.uncompressedSize; - - sectionSize += size; - - filesLength++; - - sizeInformation.size = WebDeveloper.Common.formatFileSize(size, bytesLocale, kilobytesLocale); - sizeInformation.url = element.url; - - // If the uncompressed size is set - if(uncompressedSize) - { - sizeInformation.uncompressedSize = WebDeveloper.Common.formatFileSize(uncompressedSize, bytesLocale, kilobytesLocale); - - sectionUncompressedSize += uncompressedSize; - } - else - { - sectionUncompressedSize += size; - } - - // If this is an odd row - if(i % 2 === 0) - { - sizeInformation.stripe = ' class="odd"'; - } - - tableBody.append(ich.documentSizeElement(sizeInformation)); - } - - // If the size is set - if(sectionSize > 0) - { - $("td:eq(1)", sectionHeader).text(WebDeveloper.Common.formatFileSize(sectionSize, bytesLocale, kilobytesLocale)); - } - - // If the uncompressed size is set - if(sectionUncompressedSize > 0) - { - $("td:eq(2)", sectionHeader).text(WebDeveloper.Common.formatFileSize(sectionUncompressedSize, bytesLocale, kilobytesLocale)); - } - - return { files: filesLength, size: sectionSize, uncompressedSize: sectionUncompressedSize }; -}; - -// Collapses all sections -WebDeveloper.Generated.collapseAllSections = function(event) -{ - var tableBody = $("tbody"); - - $("i", tableBody).removeClass("icon-caret-down").addClass("icon-caret-right"); - $("tr:not(#web-developer-total, .web-developer-section)", tableBody).slideUp(WebDeveloper.Generated.animationSpeed); - - event.preventDefault(); -}; - -// Expands all sections -WebDeveloper.Generated.expandAllSections = function(event) -{ - var tableBody = $("tbody"); - - $("i", tableBody).removeClass("icon-caret-right").addClass("icon-caret-down"); - $("tr:not(#web-developer-total, .web-developer-section)", tableBody).slideDown(WebDeveloper.Generated.animationSpeed); - - event.preventDefault(); -}; - -// Toggles a section -WebDeveloper.Generated.toggleSection = function() -{ - var sectionHeader = $(this); - - $("i", sectionHeader).toggleClass("icon-caret-down").toggleClass("icon-caret-right"); - sectionHeader.nextUntil("#web-developer-total, .web-developer-section").slideToggle(WebDeveloper.Generated.animationSpeed); -}; - -// Initializes the page with data and locale -WebDeveloper.Generated.initialize = function(data, locale) -{ - var bytesLocale = locale.bytes; - var documentSize = locale.documentSize; - var filesLength = 0; - var kilobytesLocale = locale.kilobytes; - var sectionResults = null; - var tableBody = null; - var total = {}; - var totalSize = 0; - var totalUncompressedSize = 0; - - WebDeveloper.Generated.emptyContent(); - WebDeveloper.Generated.localizeHeader(locale); - WebDeveloper.Generated.setPageTitle(documentSize, data, locale); - - $("#content").append(ich.documentSizeTable(locale)); - - tableBody = $("tbody"); - sectionResults = WebDeveloper.Generated.addSection(data.documents, locale.document, locale.documents, tableBody, bytesLocale, kilobytesLocale); - - filesLength += sectionResults.files; - totalSize += sectionResults.size; - totalUncompressedSize += sectionResults.uncompressedSize; - - sectionResults = WebDeveloper.Generated.addSection(data.images, locale.image, locale.images, tableBody, bytesLocale, kilobytesLocale); - - filesLength += sectionResults.files; - totalSize += sectionResults.size; - totalUncompressedSize += sectionResults.uncompressedSize; - - sectionResults = WebDeveloper.Generated.addSection(data.objects, locale.object, locale.objects, tableBody, bytesLocale, kilobytesLocale); - - filesLength += sectionResults.files; - totalSize += sectionResults.size; - totalUncompressedSize += sectionResults.uncompressedSize; - - sectionResults = WebDeveloper.Generated.addSection(data.scripts, locale.script, locale.scripts, tableBody, bytesLocale, kilobytesLocale); - - filesLength += sectionResults.files; - totalSize += sectionResults.size; - totalUncompressedSize += sectionResults.uncompressedSize; - - sectionResults = WebDeveloper.Generated.addSection(data.styleSheets, locale.styleSheet, locale.styleSheets, tableBody, bytesLocale, kilobytesLocale); - - filesLength += sectionResults.files; - totalSize += sectionResults.size; - totalUncompressedSize += sectionResults.uncompressedSize; - - total.description = filesLength + " "; - - // If there is only one file - if(filesLength == 1) - { - total.description += locale.file; - } - else - { - total.description += locale.files; - } - - // If the size is set - if(totalSize > 0) - { - total.size = WebDeveloper.Common.formatFileSize(totalSize, bytesLocale, kilobytesLocale); - } - - // If the uncompressed size is set - if(totalUncompressedSize > 0) - { - total.uncompressedSize = WebDeveloper.Common.formatFileSize(totalUncompressedSize, bytesLocale, kilobytesLocale); - } - - tableBody.append(ich.documentSizeTotal(total)); - - $("tr:not(#web-developer-total, .web-developer-section)", tableBody).hide(); - - $(".web-developer-section").click(WebDeveloper.Generated.toggleSection); - $("#web-developer-collapse-all").click(WebDeveloper.Generated.collapseAllSections); - $("#web-developer-expand-all").click(WebDeveloper.Generated.expandAllSections); -}; diff --git a/source/firefox/javascript/locales/locales.js b/source/firefox/javascript/locales/locales.js deleted file mode 100644 index 447ac52..0000000 --- a/source/firefox/javascript/locales/locales.js +++ /dev/null @@ -1,52 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Locales = WebDeveloper.Locales || {}; -WebDeveloper.Locales.defaultBundleId = "web-developer-string-bundle"; - -// Returns a formatted string from the locale -WebDeveloper.Locales.getFormattedString = function(name, parameters, bundleId) -{ - var localeString = null; - - // Try to get the string from the localization - try - { - // If the bundle id is not set - if(!bundleId) - { - bundleId = WebDeveloper.Locales.defaultBundleId; - } - - localeString = document.getElementById(bundleId).getFormattedString(name, parameters); - } - catch(exception) - { - localeString = ""; - } - - return localeString; -}; - -// Returns a string from the locale -WebDeveloper.Locales.getString = function(name, bundleId) -{ - var localeString = null; - - // Try to get the string from the localization - try - { - // If the bundle id is not set - if(!bundleId) - { - bundleId = WebDeveloper.Locales.defaultBundleId; - } - - localeString = document.getElementById(bundleId).getString(name); - } - catch(exception) - { - localeString = ""; - } - - return localeString; -}; diff --git a/source/firefox/javascript/options/dialogs/dialogs.js b/source/firefox/javascript/options/dialogs/dialogs.js deleted file mode 100644 index fabf7da..0000000 --- a/source/firefox/javascript/options/dialogs/dialogs.js +++ /dev/null @@ -1,15 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Dialog = WebDeveloper.Dialog || {}; - -// Adds a preference -WebDeveloper.Dialog.addPreference = function(id, name, type, preferences) -{ - var preference = document.createElement("preference"); - - preference.setAttribute("id", id); - preference.setAttribute("name", name); - preference.setAttribute("type", type); - - preferences.appendChild(preference); -}; diff --git a/source/firefox/javascript/options/dialogs/keyboard.js b/source/firefox/javascript/options/dialogs/keyboard.js deleted file mode 100644 index 0c1c4be..0000000 --- a/source/firefox/javascript/options/dialogs/keyboard.js +++ /dev/null @@ -1,84 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Keyboard = WebDeveloper.Keyboard || {}; - -// Handles the keyboard dialog being accepted -WebDeveloper.Keyboard.accept = function() -{ - // If adding the keyboard shortcut - if(window.arguments[0][0] == "add") - { - WebDeveloper.Preferences.setExtensionIntegerPreference("keyboard.count", window.arguments[0][1] + 1); - } - - // If the extension is not running on a Mac - if(!WebDeveloper.Common.isMac()) - { - document.getElementById("web-developer-keyboard-dialog-pane").writePreferences(); - } -}; - -// Initializes the keyboard dialog -WebDeveloper.Keyboard.initialize = function() -{ - var position = window.arguments[0][1] + 1; - var preferences = document.getElementById("web-developer-keyboard-preferences"); - var selectedFeature = null; - - WebDeveloper.Dialog.addPreference("webdeveloper.keyboard.feature", "extensions.webdeveloper.keyboard." + position + ".feature", "unichar", preferences); - WebDeveloper.Dialog.addPreference("webdeveloper.keyboard.key", "extensions.webdeveloper.keyboard." + position + ".key", "wstring", preferences); - WebDeveloper.Dialog.addPreference("webdeveloper.keyboard.modifiers", "extensions.webdeveloper.keyboard." + position + ".modifiers", "unichar", preferences); - - // If editing the keyboard shortcut - if(window.arguments[0][0] == "edit") - { - selectedFeature = WebDeveloper.Preferences.getExtensionStringPreference("keyboard." + (window.arguments[0][1] + 1) + ".feature"); - } - - WebDeveloper.Keyboard.populateFeatures(selectedFeature); - - document.getElementById("web-developer-keyboard-alt-shift").setAttribute("label", WebDeveloper.Locales.getString("VK_ALT", "web-developer-platform-keys") + WebDeveloper.Locales.getString("MODIFIER_SEPARATOR", "web-developer-platform-keys") + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys")); - document.getElementById("web-developer-keyboard-control-shift").setAttribute("label", WebDeveloper.Locales.getString("VK_CONTROL", "web-developer-platform-keys") + WebDeveloper.Locales.getString("MODIFIER_SEPARATOR", "web-developer-platform-keys") + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys")); - document.getElementById("web-developer-keyboard-meta-shift").setAttribute("label", WebDeveloper.Locales.getString("VK_META", "web-developer-platform-keys") + WebDeveloper.Locales.getString("MODIFIER_SEPARATOR", "web-developer-platform-keys") + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys")); -}; - -// Populates the features -WebDeveloper.Keyboard.populateFeatures = function(selectedFeature) -{ - var feature = null; - var featureId = null; - var featureMenu = document.getElementById("web-developer-keyboard-feature"); - var features = WebDeveloper.Common.getMainWindow().document.querySelectorAll(".web-developer-feature-command"); - var sortedFeatures = []; - - // Loop through the features - for(var i = 0, l = features.length; i < l; i++) - { - feature = features[i]; - - sortedFeatures.push([WebDeveloper.Common.getFeatureId(feature.getAttribute("id")), feature.getAttribute("label")]); - } - - sortedFeatures.sort(WebDeveloper.Keyboard.sortFeatures); - - // Loop through the sorted features - for(i = 0, l = sortedFeatures.length; i < l; i++) - { - feature = sortedFeatures[i]; - featureId = feature[0]; - - featureMenu.appendItem(feature[1], featureId); - - // If this is the selected feature - if(selectedFeature == featureId) - { - featureMenu.selectedIndex = i; - } - } -}; - -// Sorts the features -WebDeveloper.Keyboard.sortFeatures = function(featureOne, featureTwo) -{ - return featureOne[1] > featureTwo[1]; -}; diff --git a/source/firefox/javascript/options/dialogs/resize.js b/source/firefox/javascript/options/dialogs/resize.js deleted file mode 100644 index e091cd6..0000000 --- a/source/firefox/javascript/options/dialogs/resize.js +++ /dev/null @@ -1,37 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Resize = WebDeveloper.Resize || {}; - -// Handles the resize dialog being accepted -WebDeveloper.Resize.accept = function() -{ - // If adding the resize option - if(window.arguments[0][0] == "add") - { - WebDeveloper.Preferences.setExtensionIntegerPreference("resize.count", window.arguments[0][1] + 1); - } - - // If the extension is not running on a Mac - if(!WebDeveloper.Common.isMac()) - { - document.getElementById("web-developer-resize-dialog-pane").writePreferences(); - } -}; - -// Initializes the resize dialog -WebDeveloper.Resize.initialize = function() -{ - var position = window.arguments[0][1] + 1; - var preferences = document.getElementById("web-developer-resize-preferences"); - - WebDeveloper.Dialog.addPreference("webdeveloper.resize.description", "extensions.webdeveloper.resize." + position + ".description", "wstring", preferences); - WebDeveloper.Dialog.addPreference("webdeveloper.resize.height", "extensions.webdeveloper.resize." + position + ".height", "int", preferences); - WebDeveloper.Dialog.addPreference("webdeveloper.resize.key", "extensions.webdeveloper.resize." + position + ".key", "wstring", preferences); - WebDeveloper.Dialog.addPreference("webdeveloper.resize.modifiers", "extensions.webdeveloper.resize." + position + ".modifiers", "unichar", preferences); - WebDeveloper.Dialog.addPreference("webdeveloper.resize.viewport", "extensions.webdeveloper.resize." + position + ".viewport", "bool", preferences); - WebDeveloper.Dialog.addPreference("webdeveloper.resize.width", "extensions.webdeveloper.resize." + position + ".width", "int", preferences); - - document.getElementById("web-developer-resize-alt-shift").setAttribute("label", WebDeveloper.Locales.getString("VK_ALT", "web-developer-platform-keys") + WebDeveloper.Locales.getString("MODIFIER_SEPARATOR", "web-developer-platform-keys") + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys")); - document.getElementById("web-developer-resize-control-shift").setAttribute("label", WebDeveloper.Locales.getString("VK_CONTROL", "web-developer-platform-keys") + WebDeveloper.Locales.getString("MODIFIER_SEPARATOR", "web-developer-platform-keys") + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys")); - document.getElementById("web-developer-resize-meta-shift").setAttribute("label", WebDeveloper.Locales.getString("VK_META", "web-developer-platform-keys") + WebDeveloper.Locales.getString("MODIFIER_SEPARATOR", "web-developer-platform-keys") + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys")); -}; diff --git a/source/firefox/javascript/options/dialogs/responsive-layout.js b/source/firefox/javascript/options/dialogs/responsive-layout.js deleted file mode 100644 index 9b9dbeb..0000000 --- a/source/firefox/javascript/options/dialogs/responsive-layout.js +++ /dev/null @@ -1,30 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.ResponsiveLayout = WebDeveloper.ResponsiveLayout || {}; - -// Handles the responsive layout dialog being accepted -WebDeveloper.ResponsiveLayout.accept = function() -{ - // If adding the responsive option - if(window.arguments[0][0] == "add") - { - WebDeveloper.Preferences.setExtensionIntegerPreference("responsive.layout.count", window.arguments[0][1] + 1); - } - - // If the extension is not running on a Mac - if(!WebDeveloper.Common.isMac()) - { - document.getElementById("web-developer-responsive-layout-dialog-pane").writePreferences(); - } -}; - -// Initializes the responsive layout dialog -WebDeveloper.ResponsiveLayout.initialize = function() -{ - var position = window.arguments[0][1] + 1; - var preferences = document.getElementById("web-developer-responsive-layout-preferences"); - - WebDeveloper.Dialog.addPreference("webdeveloper.responsive.layout.description", "extensions.webdeveloper.responsive.layout." + position + ".description", "wstring", preferences); - WebDeveloper.Dialog.addPreference("webdeveloper.responsive.layout.height", "extensions.webdeveloper.responsive.layout." + position + ".height", "int", preferences); - WebDeveloper.Dialog.addPreference("webdeveloper.responsive.layout.width", "extensions.webdeveloper.responsive.layout." + position + ".width", "int", preferences); -}; diff --git a/source/firefox/javascript/options/dialogs/tool.js b/source/firefox/javascript/options/dialogs/tool.js deleted file mode 100644 index 481ed41..0000000 --- a/source/firefox/javascript/options/dialogs/tool.js +++ /dev/null @@ -1,98 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Tool = WebDeveloper.Tool || {}; - -// Handles the tool dialog being accepted -WebDeveloper.Tool.accept = function() -{ - // If adding the tool - if(window.arguments[0][0] == "add") - { - WebDeveloper.Preferences.setExtensionIntegerPreference("tool.count", window.arguments[0][1] + 1); - } - - // If the extension is not running on a Mac - if(!WebDeveloper.Common.isMac()) - { - document.getElementById("web-developer-tool-dialog-pane").writePreferences(); - } -}; - -// Changes the tool type -WebDeveloper.Tool.changeType = function() -{ - var application = document.getElementById("web-developer-tool-application-radio").selected; - var path = document.getElementById("web-developer-tool-path"); - var url = document.getElementById("web-developer-tool-url"); - - path.disabled = !application; - document.getElementById("web-developer-tool-path-choose").disabled = !application; - url.disabled = application; - - // If the application radio button is selected - if(application) - { - url.value = ""; - } - else - { - path.value = ""; - } -}; - -// Open a dialog to choose an application -WebDeveloper.Tool.chooseApplication = function() -{ - var filePicker = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker); - - filePicker.init(window, WebDeveloper.Locales.getString("chooseApplication"), filePicker.modeOpen); - filePicker.appendFilters(filePicker.filterApps); - - // If the user selected an application - if(filePicker.show() == filePicker.returnOK) - { - var applicationPath = filePicker.file.path; - var executable = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); - - executable.initWithPath(applicationPath); - - // If the executable exists and is executable - if(executable.exists() && executable.isExecutable()) - { - var toolPath = document.getElementById("web-developer-tool-path"); - - toolPath.value = applicationPath; - - document.getElementById("web-developer-tool-dialog-pane").userChangedValue(toolPath); - } - else - { - WebDeveloper.Common.displayError(WebDeveloper.Locales.getString("chooseApplication"), WebDeveloper.Locales.getFormattedString("invalidApplication", [applicationPath])); - } - } -}; - -// Initializes the tool dialog -WebDeveloper.Tool.initialize = function() -{ - var position = window.arguments[0][1] + 1; - var preferences = document.getElementById("web-developer-tool-preferences"); - - WebDeveloper.Dialog.addPreference("webdeveloper.tool.description", "extensions.webdeveloper.tool." + position + ".description", "wstring", preferences); - WebDeveloper.Dialog.addPreference("webdeveloper.tool.key", "extensions.webdeveloper.tool." + position + ".key", "wstring", preferences); - WebDeveloper.Dialog.addPreference("webdeveloper.tool.modifiers", "extensions.webdeveloper.tool." + position + ".modifiers", "unichar", preferences); - WebDeveloper.Dialog.addPreference("webdeveloper.tool.path", "extensions.webdeveloper.tool." + position + ".path", "unichar", preferences); - WebDeveloper.Dialog.addPreference("webdeveloper.tool.url", "extensions.webdeveloper.tool." + position + ".url", "unichar", preferences); - - // If editing a tool and it has a URL - if(window.arguments[0][0] == "edit" && WebDeveloper.Preferences.getExtensionStringPreference("tool." + position + ".url")) - { - document.getElementById("web-developer-tool-url-radio").radioGroup.selectedIndex = 1; - - WebDeveloper.Tool.changeType(); - } - - document.getElementById("web-developer-tool-alt-shift").setAttribute("label", WebDeveloper.Locales.getString("VK_ALT", "web-developer-platform-keys") + WebDeveloper.Locales.getString("MODIFIER_SEPARATOR", "web-developer-platform-keys") + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys")); - document.getElementById("web-developer-tool-control-shift").setAttribute("label", WebDeveloper.Locales.getString("VK_CONTROL", "web-developer-platform-keys") + WebDeveloper.Locales.getString("MODIFIER_SEPARATOR", "web-developer-platform-keys") + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys")); - document.getElementById("web-developer-tool-meta-shift").setAttribute("label", WebDeveloper.Locales.getString("VK_META", "web-developer-platform-keys") + WebDeveloper.Locales.getString("MODIFIER_SEPARATOR", "web-developer-platform-keys") + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys")); -}; diff --git a/source/firefox/javascript/options/dialogs/view-source-with.js b/source/firefox/javascript/options/dialogs/view-source-with.js deleted file mode 100644 index a27fa16..0000000 --- a/source/firefox/javascript/options/dialogs/view-source-with.js +++ /dev/null @@ -1,67 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.ViewSourceWith = WebDeveloper.ViewSourceWith || {}; - -// Handles the view source with dialog being accepted -WebDeveloper.ViewSourceWith.accept = function() -{ - // If adding the tool - if(window.arguments[0][0] == "add") - { - WebDeveloper.Preferences.setExtensionIntegerPreference("view.source.with.count", window.arguments[0][1] + 1); - } - - // If the extension is not running on a Mac - if(!WebDeveloper.Common.isMac()) - { - document.getElementById("web-developer-view-source-with-dialog-pane").writePreferences(); - } -}; - -// Open a dialog to choose an application -WebDeveloper.ViewSourceWith.chooseApplication = function() -{ - var filePicker = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker); - - filePicker.init(window, WebDeveloper.Locales.getString("chooseApplication"), filePicker.modeOpen); - filePicker.appendFilters(filePicker.filterApps); - - // If the user selected an application - if(filePicker.show() == filePicker.returnOK) - { - var applicationPath = filePicker.file.path; - var executable = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); - - executable.initWithPath(applicationPath); - - // If the executable exists and is executable - if(executable.exists() && executable.isExecutable()) - { - var viewSourceWithPath = document.getElementById("web-developer-view-source-with-path"); - - viewSourceWithPath.value = applicationPath; - - document.getElementById("web-developer-view-source-with-dialog-pane").userChangedValue(viewSourceWithPath); - } - else - { - WebDeveloper.Common.displayError(WebDeveloper.Locales.getString("chooseApplication"), WebDeveloper.Locales.getFormattedString("invalidApplication", [applicationPath])); - } - } -}; - -// Initializes the view source with dialog -WebDeveloper.ViewSourceWith.initialize = function() -{ - var position = window.arguments[0][1] + 1; - var preferences = document.getElementById("web-developer-view-source-with-preferences"); - - WebDeveloper.Dialog.addPreference("webdeveloper.view.source.with.description", "extensions.webdeveloper.view.source.with." + position + ".description", "unichar", preferences); - WebDeveloper.Dialog.addPreference("webdeveloper.view.source.with.key", "extensions.webdeveloper.view.source.with." + position + ".key", "unichar", preferences); - WebDeveloper.Dialog.addPreference("webdeveloper.view.source.with.modifiers", "extensions.webdeveloper.view.source.with." + position + ".modifiers", "unichar", preferences); - WebDeveloper.Dialog.addPreference("webdeveloper.view.source.with.path", "extensions.webdeveloper.view.source.with." + position + ".path", "unichar", preferences); - - document.getElementById("web-developer-view-source-with-alt-shift").setAttribute("label", WebDeveloper.Locales.getString("VK_ALT", "web-developer-platform-keys") + WebDeveloper.Locales.getString("MODIFIER_SEPARATOR", "web-developer-platform-keys") + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys")); - document.getElementById("web-developer-view-source-with-control-shift").setAttribute("label", WebDeveloper.Locales.getString("VK_CONTROL", "web-developer-platform-keys") + WebDeveloper.Locales.getString("MODIFIER_SEPARATOR", "web-developer-platform-keys") + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys")); - document.getElementById("web-developer-view-source-with-meta-shift").setAttribute("label", WebDeveloper.Locales.getString("VK_META", "web-developer-platform-keys") + WebDeveloper.Locales.getString("MODIFIER_SEPARATOR", "web-developer-platform-keys") + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys")); -}; diff --git a/source/firefox/javascript/options/options.js b/source/firefox/javascript/options/options.js deleted file mode 100644 index cfbccbc..0000000 --- a/source/firefox/javascript/options/options.js +++ /dev/null @@ -1,1015 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Options = WebDeveloper.Options || {}; - -// Adds a keyboard shortcut -WebDeveloper.Options.addKeyboardShortcut = function() -{ - document.documentElement.openSubDialog("chrome://web-developer/content/options/dialogs/keyboard.xul", "", ["add", document.getElementById("web-developer-keyboard-shortcuts").getRowCount()]); - WebDeveloper.Options.initializeKeyboardPane(); -}; - -// Adds a resize option -WebDeveloper.Options.addResizeOption = function() -{ - document.documentElement.openSubDialog("chrome://web-developer/content/options/dialogs/resize.xul", "", ["add", document.getElementById("web-developer-resize-options").getRowCount()]); - WebDeveloper.Options.initializeResizePane(); -}; - -// Adds a responsive layout -WebDeveloper.Options.addResponsiveLayout = function() -{ - document.documentElement.openSubDialog("chrome://web-developer/content/options/dialogs/responsive-layout.xul", "", ["add", document.getElementById("web-developer-responsive-layouts").getRowCount()]); - WebDeveloper.Options.initializeResponsiveLayoutsPane(); -}; - -// Adds a tool -WebDeveloper.Options.addTool = function() -{ - document.documentElement.openSubDialog("chrome://web-developer/content/options/dialogs/tool.xul", "", ["add", document.getElementById("web-developer-tools").getRowCount()]); - WebDeveloper.Options.initializeToolsPane(); -}; - -// Adds a view source with option -WebDeveloper.Options.addViewSourceWithOption = function() -{ - document.documentElement.openSubDialog("chrome://web-developer/content/options/dialogs/view-source-with.xul", "", ["add", document.getElementById("web-developer-view-source-with-options").getRowCount()]); - WebDeveloper.Options.initializeViewSourcePane(); -}; - -// Adds a tool separator -WebDeveloper.Options.addToolSeparator = function() -{ - var listItem = document.createElement("listitem"); - var separator = document.createElement("separator"); - - separator.setAttribute("class", "groove"); - listItem.appendChild(separator); - - separator = document.createElement("separator"); - - separator.setAttribute("class", "groove"); - listItem.appendChild(separator); - - separator = document.createElement("separator"); - - separator.setAttribute("class", "groove"); - listItem.appendChild(separator); - - document.getElementById("web-developer-tools").appendChild(listItem); -}; - -// Deletes a keyboard shortcut -WebDeveloper.Options.deleteKeyboardShortcut = function() -{ - var keyboardShortcuts = document.getElementById("web-developer-keyboard-shortcuts"); - - // If the deletion is confirmed - if(WebDeveloper.Options.displayDeleteConfirmation(WebDeveloper.Locales.getString("deleteKeyboardShortcut"), WebDeveloper.Locales.getFormattedString("deleteKeyboardShortcutConfirmation", [keyboardShortcuts.selectedItem.childNodes[0].getAttribute("label")]))) - { - keyboardShortcuts.removeItemAt(keyboardShortcuts.selectedIndex); - WebDeveloper.Options.updateKeyboardPreferences(); - } -}; - -// Deletes a resize option -WebDeveloper.Options.deleteResizeOption = function() -{ - var resizeOptions = document.getElementById("web-developer-resize-options"); - - // If the deletion is confirmed - if(WebDeveloper.Options.displayDeleteConfirmation(WebDeveloper.Locales.getString("deleteResizeOption"), WebDeveloper.Locales.getFormattedString("deleteResizeOptionConfirmation", [resizeOptions.selectedItem.childNodes[0].getAttribute("label")]))) - { - resizeOptions.removeItemAt(resizeOptions.selectedIndex); - WebDeveloper.Options.updateResizePreferences(); - } -}; - -// Deletes a responsive layout -WebDeveloper.Options.deleteResponsiveLayout = function() -{ - var responsiveLayouts = document.getElementById("web-developer-responsive-layouts"); - - // If the deletion is confirmed - if(WebDeveloper.Options.displayDeleteConfirmation(WebDeveloper.Locales.getString("deleteResponsiveLayout"), WebDeveloper.Locales.getFormattedString("deleteResponsiveLayoutConfirmation", [responsiveLayouts.selectedItem.childNodes[0].getAttribute("label")]))) - { - responsiveLayouts.removeItemAt(responsiveLayouts.selectedIndex); - WebDeveloper.Options.updateResponsiveLayoutsPreferences(); - } -}; - -// Deletes a tool -WebDeveloper.Options.deleteTool = function() -{ - var tools = document.getElementById("web-developer-tools"); - - // If the deletion is confirmed - if(WebDeveloper.Options.displayDeleteConfirmation(WebDeveloper.Locales.getString("deleteTool"), WebDeveloper.Locales.getFormattedString("deleteToolConfirmation", [tools.selectedItem.childNodes[0].getAttribute("label")]))) - { - tools.removeItemAt(tools.selectedIndex); - WebDeveloper.Options.updateToolsPreferences(); - } -}; - -// Deletes a view source with option -WebDeveloper.Options.deleteViewSourceWithOption = function() -{ - var viewSourceWithOptions = document.getElementById("web-developer-view-source-with-options"); - - // If the deletion is confirmed - if(WebDeveloper.Options.displayDeleteConfirmation(WebDeveloper.Locales.getString("deleteViewSourceWithOption"), WebDeveloper.Locales.getFormattedString("deleteViewSourceWithOptionConfirmation", [viewSourceWithOptions.selectedItem.childNodes[0].getAttribute("label")]))) - { - viewSourceWithOptions.removeItemAt(viewSourceWithOptions.selectedIndex); - WebDeveloper.Options.updateViewSourceWithPreferences(); - } -}; - -// Displays a delete confirmation dialog -WebDeveloper.Options.displayDeleteConfirmation = function(title, message) -{ - var promptService = Components.interfaces.nsIPromptService; - - // If the deletion is confirmed - if(Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(promptService).confirmEx(null, title, message, promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_0 + promptService.BUTTON_TITLE_CANCEL * promptService.BUTTON_POS_1, WebDeveloper.Locales.getString("delete"), null, null, null, { value: false }) === 0) - { - return true; - } - - return false; -}; - -// Edits a keyboard shortcut -WebDeveloper.Options.editKeyboardShortcut = function() -{ - document.documentElement.openSubDialog("chrome://web-developer/content/options/dialogs/keyboard.xul", "", ["edit", document.getElementById("web-developer-keyboard-shortcuts").selectedIndex]); - WebDeveloper.Options.initializeKeyboardPane(); -}; - -// Edits a resize option -WebDeveloper.Options.editResizeOption = function() -{ - document.documentElement.openSubDialog("chrome://web-developer/content/options/dialogs/resize.xul", "", ["edit", document.getElementById("web-developer-resize-options").selectedIndex]); - WebDeveloper.Options.initializeResizePane(); -}; - -// Edits a responsive layout -WebDeveloper.Options.editResponsiveLayout = function() -{ - document.documentElement.openSubDialog("chrome://web-developer/content/options/dialogs/responsive-layout.xul", "", ["edit", document.getElementById("web-developer-responsive-layouts").selectedIndex]); - WebDeveloper.Options.initializeResponsiveLayoutsPane(); -}; - -// Edits a tool -WebDeveloper.Options.editTool = function() -{ - document.documentElement.openSubDialog("chrome://web-developer/content/options/dialogs/tool.xul", "", ["edit", document.getElementById("web-developer-tools").selectedIndex]); - WebDeveloper.Options.initializeToolsPane(); -}; - -// Edits a view source with option -WebDeveloper.Options.editViewSourceWithOption = function() -{ - document.documentElement.openSubDialog("chrome://web-developer/content/options/dialogs/view-source-with.xul", "", ["edit", document.getElementById("web-developer-view-source-with-options").selectedIndex]); - WebDeveloper.Options.initializeViewSourcePane(); -}; - -// Removes all items from a list box -WebDeveloper.Options.emptyListBox = function(listBox) -{ - // While there are still rows - while(listBox.getRowCount() > 0) - { - listBox.removeItemAt(0); - } -}; - -// Initializes the options dialog -WebDeveloper.Options.initialize = function() -{ - // If the window arguments are set - if(window.arguments) - { - var pane = document.getElementById("web-developer-options-" + window.arguments[0] + "-pane"); - - // If the pane is set - if(pane) - { - document.getElementById("web-developer-options").showPane(pane); - } - } -}; - -// Initializes the colors browser -WebDeveloper.Options.initializeColorsBrowser = function() -{ - WebDeveloper.Options.updateSyntaxHighlightTheme(); - - document.getElementById("web-developer-syntax-highlight-browser").removeEventListener("load", WebDeveloper.Options.initializeColorsBrowser, true); -}; - -// Initializes the colors pane -WebDeveloper.Options.initializeColorsPane = function() -{ - // If the extension is running on a Mac - if(WebDeveloper.Common.isMac()) - { - document.getElementById("web-developer-toolbar-color").hidden = false; - } - - document.getElementById("web-developer-syntax-highlight-browser").addEventListener("load", WebDeveloper.Options.initializeColorsBrowser, true); -}; - -// Initializes the keyboard pane -WebDeveloper.Options.initializeKeyboardPane = function() -{ - var command = null; - var feature = null; - var key = null; - var keyboardShortcuts = document.getElementById("web-developer-keyboard-shortcuts"); - var listCell = null; - var listItem = null; - var modifiers = null; - var modifierSeparator = WebDeveloper.Locales.getString("MODIFIER_SEPARATOR", "web-developer-platform-keys"); - - WebDeveloper.Options.emptyListBox(keyboardShortcuts); - - // Loop through the keyboard shortcuts - for(var i = 1, l = WebDeveloper.Preferences.getExtensionIntegerPreference("keyboard.count"); i <= l; i++) - { - feature = WebDeveloper.Preferences.getExtensionStringPreference("keyboard." + i + ".feature"); - key = WebDeveloper.Preferences.getLocalizedPreference("keyboard." + i + ".key"); - modifiers = WebDeveloper.Preferences.getExtensionStringPreference("keyboard." + i + ".modifiers"); - - // If the feature, key and modifiers are set - if(feature && key && modifiers) - { - command = WebDeveloper.Common.getMainWindow().document.getElementById("web-developer-" + feature + "-command"); - - // If the command is set - if(command) - { - listCell = document.createElement("listcell"); - listItem = document.createElement("listitem"); - - listCell.setAttribute("data-web-developer-feature", feature); - listCell.setAttribute("label", command.getAttribute("label")); - listItem.appendChild(listCell); - - listCell = document.createElement("listcell"); - - listCell.setAttribute("data-web-developer-key", key); - listCell.setAttribute("data-web-developer-modifiers", modifiers); - - // If the modifiers are alt and shift - if(modifiers == "alt shift") - { - listCell.setAttribute("label", WebDeveloper.Locales.getString("VK_ALT", "web-developer-platform-keys") + modifierSeparator + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys") + modifierSeparator + key); - } - else if(modifiers == "control shift") - { - listCell.setAttribute("label", WebDeveloper.Locales.getString("VK_CONTROL", "web-developer-platform-keys") + modifierSeparator + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys") + modifierSeparator + key); - } - else if(modifiers == "meta shift") - { - listCell.setAttribute("label", WebDeveloper.Locales.getString("VK_META", "web-developer-platform-keys") + modifierSeparator + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys") + modifierSeparator + key); - } - - listItem.appendChild(listCell); - - keyboardShortcuts.appendChild(listItem); - } - } - } -}; - -// Initializes the resize pane -WebDeveloper.Options.initializeResizePane = function() -{ - var description = null; - var height = 0; - var key = null; - var listCell = null; - var listItem = null; - var modifiers = null; - var modifierSeparator = WebDeveloper.Locales.getString("MODIFIER_SEPARATOR", "web-developer-platform-keys"); - var resizeOptions = document.getElementById("web-developer-resize-options"); - var viewport = false; - var width = 0; - - WebDeveloper.Options.emptyListBox(resizeOptions); - - // Loop through the resize options - for(var i = 1, l = WebDeveloper.Preferences.getExtensionIntegerPreference("resize.count"); i <= l; i++) - { - description = WebDeveloper.Preferences.getLocalizedPreference("resize." + i + ".description"); - height = WebDeveloper.Preferences.getExtensionIntegerPreference("resize." + i + ".height"); - key = WebDeveloper.Preferences.getLocalizedPreference("resize." + i + ".key"); - modifiers = WebDeveloper.Preferences.getExtensionStringPreference("resize." + i + ".modifiers"); - width = WebDeveloper.Preferences.getExtensionIntegerPreference("resize." + i + ".width"); - - // If the description, height and width are set - if(description && height > 0 && width > 0) - { - listCell = document.createElement("listcell"); - listItem = document.createElement("listitem"); - viewport = WebDeveloper.Preferences.getExtensionBooleanPreference("resize." + i + ".viewport"); - - listCell.setAttribute("label", description); - listItem.appendChild(listCell); - - listCell = document.createElement("listcell"); - - listCell.setAttribute("label", width); - listItem.appendChild(listCell); - - listCell = document.createElement("listcell"); - - listCell.setAttribute("label", height); - listItem.appendChild(listCell); - - listCell = document.createElement("listcell"); - - // If resizing the viewport - if(viewport) - { - listCell.setAttribute("label", WebDeveloper.Locales.getString("yes")); - } - else - { - listCell.setAttribute("label", WebDeveloper.Locales.getString("no")); - } - - listItem.appendChild(listCell); - - listCell = document.createElement("listcell"); - - // If a key and modifiers are set - if(key && modifiers) - { - listCell.setAttribute("data-web-developer-key", key); - listCell.setAttribute("data-web-developer-modifiers", modifiers); - - // If the modifiers are alt and shift - if(modifiers == "alt shift") - { - listCell.setAttribute("label", WebDeveloper.Locales.getString("VK_ALT", "web-developer-platform-keys") + modifierSeparator + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys") + modifierSeparator + key); - } - else if(modifiers == "control shift") - { - listCell.setAttribute("label", WebDeveloper.Locales.getString("VK_CONTROL", "web-developer-platform-keys") + modifierSeparator + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys") + modifierSeparator + key); - } - else if(modifiers == "meta shift") - { - listCell.setAttribute("label", WebDeveloper.Locales.getString("VK_META", "web-developer-platform-keys") + modifierSeparator + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys") + modifierSeparator + key); - } - } - - listItem.appendChild(listCell); - - resizeOptions.appendChild(listItem); - } - } -}; - -// Initializes the responsive layouts pane -WebDeveloper.Options.initializeResponsiveLayoutsPane = function() -{ - var description = null; - var height = 0; - var listCell = null; - var listItem = null; - var responsiveLayouts = document.getElementById("web-developer-responsive-layouts"); - var width = 0; - - WebDeveloper.Options.emptyListBox(responsiveLayouts); - - // Loop through the responsive layouts - for(var i = 1, l = WebDeveloper.Preferences.getExtensionIntegerPreference("responsive.layout.count"); i <= l; i++) - { - description = WebDeveloper.Preferences.getLocalizedPreference("responsive.layout." + i + ".description"); - height = WebDeveloper.Preferences.getExtensionIntegerPreference("responsive.layout." + i + ".height"); - width = WebDeveloper.Preferences.getExtensionIntegerPreference("responsive.layout." + i + ".width"); - - // If the description, height and width are set - if(description && height > 0 && width > 0) - { - listCell = document.createElement("listcell"); - listItem = document.createElement("listitem"); - - listCell.setAttribute("label", description); - listItem.appendChild(listCell); - - listCell = document.createElement("listcell"); - - listCell.setAttribute("label", width); - listItem.appendChild(listCell); - - listCell = document.createElement("listcell"); - - listCell.setAttribute("label", height); - listItem.appendChild(listCell); - - responsiveLayouts.appendChild(listItem); - } - } -}; - -// Initializes the tools pane -WebDeveloper.Options.initializeToolsPane = function() -{ - var description = null; - var key = null; - var listCell = null; - var listItem = null; - var modifiers = null; - var modifierSeparator = WebDeveloper.Locales.getString("MODIFIER_SEPARATOR", "web-developer-platform-keys"); - var path = null; - var separator = null; - var tools = document.getElementById("web-developer-tools"); - var url = null; - - WebDeveloper.Options.emptyListBox(tools); - - // Loop through the tools - for(var i = 1, l = WebDeveloper.Preferences.getExtensionIntegerPreference("tool.count"); i <= l; i++) - { - // If this is a separator - if(WebDeveloper.Preferences.getExtensionBooleanPreference("tool." + i + ".separator")) - { - separator = document.createElement("separator"); - listItem = document.createElement("listitem"); - - separator.setAttribute("class", "groove"); - listItem.appendChild(separator); - - separator = document.createElement("separator"); - - separator.setAttribute("class", "groove"); - listItem.appendChild(separator); - - separator = document.createElement("separator"); - - separator.setAttribute("class", "groove"); - listItem.appendChild(separator); - - tools.appendChild(listItem); - } - else - { - description = WebDeveloper.Preferences.getLocalizedPreference("tool." + i + ".description"); - path = WebDeveloper.Preferences.getExtensionStringPreference("tool." + i + ".path"); - url = WebDeveloper.Preferences.getExtensionStringPreference("tool." + i + ".url"); - - // If the description and either a path or url are set - if(description && path || url) - { - key = WebDeveloper.Preferences.getLocalizedPreference("tool." + i + ".key"); - listCell = document.createElement("listcell"); - listItem = document.createElement("listitem"); - modifiers = WebDeveloper.Preferences.getExtensionStringPreference("tool." + i + ".modifiers"); - - listCell.setAttribute("label", description); - listItem.appendChild(listCell); - - listCell = document.createElement("listcell"); - - // If a path is set - if(path) - { - listCell.setAttribute("data-web-developer-tool-type", "path"); - listCell.setAttribute("label", path); - } - else - { - listCell.setAttribute("data-web-developer-tool-type", "url"); - listCell.setAttribute("label", url); - } - - listItem.appendChild(listCell); - - listCell = document.createElement("listcell"); - - // If a key and modifiers are set - if(key && modifiers) - { - listCell.setAttribute("data-web-developer-key", key); - listCell.setAttribute("data-web-developer-modifiers", modifiers); - - // If the modifiers are alt and shift - if(modifiers == "alt shift") - { - listCell.setAttribute("label", WebDeveloper.Locales.getString("VK_ALT", "web-developer-platform-keys") + modifierSeparator + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys") + modifierSeparator + key); - } - else if(modifiers == "control shift") - { - listCell.setAttribute("label", WebDeveloper.Locales.getString("VK_CONTROL", "web-developer-platform-keys") + modifierSeparator + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys") + modifierSeparator + key); - } - else if(modifiers == "meta shift") - { - listCell.setAttribute("label", WebDeveloper.Locales.getString("VK_META", "web-developer-platform-keys") + modifierSeparator + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys") + modifierSeparator + key); - } - } - - listItem.appendChild(listCell); - - tools.appendChild(listItem); - } - } - } -}; - -// Initializes the view source pane -WebDeveloper.Options.initializeViewSourcePane = function() -{ - var description = null; - var key = null; - var listCell = null; - var listItem = null; - var modifiers = null; - var modifierSeparator = WebDeveloper.Locales.getString("MODIFIER_SEPARATOR", "web-developer-platform-keys"); - var path = null; - var viewSourceWithOptions = document.getElementById("web-developer-view-source-with-options"); - - WebDeveloper.Options.emptyListBox(viewSourceWithOptions); - - // Loop through the view source with options - for(var i = 1, l = WebDeveloper.Preferences.getExtensionIntegerPreference("view.source.with.count"); i <= l; i++) - { - description = WebDeveloper.Preferences.getExtensionStringPreference("view.source.with." + i + ".description"); - path = WebDeveloper.Preferences.getExtensionStringPreference("view.source.with." + i + ".path"); - - // If the description and path are set - if(description && path) - { - key = WebDeveloper.Preferences.getExtensionStringPreference("view.source.with." + i + ".key"); - listCell = document.createElement("listcell"); - listItem = document.createElement("listitem"); - modifiers = WebDeveloper.Preferences.getExtensionStringPreference("tool." + i + ".modifiers"); - - listCell.setAttribute("label", description); - listItem.appendChild(listCell); - - listCell = document.createElement("listcell"); - - listCell.setAttribute("label", path); - listItem.appendChild(listCell); - - listCell = document.createElement("listcell"); - - // If a key and modifiers are set - if(key && modifiers) - { - listCell.setAttribute("data-web-developer-key", key); - listCell.setAttribute("data-web-developer-modifiers", modifiers); - - // If the modifiers are alt and shift - if(modifiers == "alt shift") - { - listCell.setAttribute("label", WebDeveloper.Locales.getString("VK_ALT", "web-developer-platform-keys") + modifierSeparator + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys") + modifierSeparator + key); - } - else if(modifiers == "control shift") - { - listCell.setAttribute("label", WebDeveloper.Locales.getString("VK_CONTROL", "web-developer-platform-keys") + modifierSeparator + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys") + modifierSeparator + key); - } - else if(modifiers == "meta shift") - { - listCell.setAttribute("label", WebDeveloper.Locales.getString("VK_META", "web-developer-platform-keys") + modifierSeparator + WebDeveloper.Locales.getString("VK_SHIFT", "web-developer-platform-keys") + modifierSeparator + key); - } - } - - listItem.appendChild(listCell); - - viewSourceWithOptions.appendChild(listItem); - } - } -}; - -// Moves down an item in a list box -WebDeveloper.Options.moveDownListBoxItem = function(listBox) -{ - var selectedItem = listBox.selectedItem; - var selectedIndex = listBox.selectedIndex; - - // If an item is selected and it is not at the bottom - if(selectedItem && selectedIndex != listBox.getRowCount() - 1) - { - listBox.selectItem(listBox.insertBefore(selectedItem, listBox.getItemAtIndex(selectedIndex + 2))); - } -}; - -// Moves down a resize option -WebDeveloper.Options.moveDownResizeOption = function() -{ - WebDeveloper.Options.moveDownListBoxItem(document.getElementById("web-developer-resize-options")); - WebDeveloper.Options.updateResizePreferences(); -}; - -// Moves down a responsive layout -WebDeveloper.Options.moveDownResponsiveLayout = function() -{ - WebDeveloper.Options.moveDownListBoxItem(document.getElementById("web-developer-responsive-layouts")); - WebDeveloper.Options.updateResponsiveLayoutsPreferences(); -}; - -// Moves down a tool -WebDeveloper.Options.moveDownTool = function() -{ - WebDeveloper.Options.moveDownListBoxItem(document.getElementById("web-developer-tools")); - WebDeveloper.Options.updateToolsPreferences(); -}; - -// Moves down a view source with option -WebDeveloper.Options.moveDownViewSourceWithOption = function() -{ - WebDeveloper.Options.moveDownListBoxItem(document.getElementById("web-developer-view-source-with-options")); - WebDeveloper.Options.updateViewSourceWithPreferences(); -}; - -// Moves up an item in a list box -WebDeveloper.Options.moveUpListBoxItem = function(listBox) -{ - var selectedItem = listBox.selectedItem; - var selectedIndex = listBox.selectedIndex; - - // If an item is selected and it is not at the top - if(selectedItem && selectedIndex !== 0) - { - listBox.selectItem(listBox.insertBefore(selectedItem, listBox.getItemAtIndex(selectedIndex - 1))); - } -}; - -// Moves up a resize option -WebDeveloper.Options.moveUpResizeOption = function() -{ - WebDeveloper.Options.moveUpListBoxItem(document.getElementById("web-developer-resize-options")); - WebDeveloper.Options.updateResizePreferences(); -}; - -// Moves up a responsive layout -WebDeveloper.Options.moveUpResponsiveLayout = function() -{ - WebDeveloper.Options.moveUpListBoxItem(document.getElementById("web-developer-responsive-layouts")); - WebDeveloper.Options.updateResponsiveLayoutsPreferences(); -}; - -// Moves up a tool -WebDeveloper.Options.moveUpTool = function() -{ - WebDeveloper.Options.moveUpListBoxItem(document.getElementById("web-developer-tools")); - WebDeveloper.Options.updateToolsPreferences(); -}; - -// Moves up a view source with option -WebDeveloper.Options.moveUpViewSourceWithOption = function() -{ - WebDeveloper.Options.moveUpListBoxItem(document.getElementById("web-developer-view-source-with-options")); - WebDeveloper.Options.updateViewSourceWithPreferences(); -}; - -// Handles a keyboard shortcut being selected -WebDeveloper.Options.selectKeyboardShortcut = function() -{ - var selectedItem = document.getElementById("web-developer-keyboard-shortcuts").selectedItem; - - document.getElementById("web-developer-delete-keyboard-shortcut").disabled = !selectedItem; - document.getElementById("web-developer-edit-keyboard-shortcut").disabled = !selectedItem; -}; - -// Handles a resize option being selected -WebDeveloper.Options.selectResizeOption = function() -{ - var resizeOptions = document.getElementById("web-developer-resize-options"); - var resizeCount = resizeOptions.getRowCount(); - var selectedIndex = resizeOptions.selectedIndex; - var selectedItem = resizeOptions.selectedItem; - - document.getElementById("web-developer-delete-resize-option").disabled = !selectedItem || resizeCount == 1; - document.getElementById("web-developer-edit-resize-option").disabled = !selectedItem; - document.getElementById("web-developer-move-down-resize-option").disabled = !selectedItem || selectedIndex == resizeCount - 1; - document.getElementById("web-developer-move-up-resize-option").disabled = !selectedItem || !selectedIndex; -}; - -// Handles a responsive layout being selected -WebDeveloper.Options.selectResponsiveLayout = function() -{ - var responsiveLayouts = document.getElementById("web-developer-responsive-layouts"); - var responsiveLayoutCount = responsiveLayouts.getRowCount(); - var selectedIndex = responsiveLayouts.selectedIndex; - var selectedItem = responsiveLayouts.selectedItem; - - document.getElementById("web-developer-delete-responsive-layout").disabled = !selectedItem || responsiveLayoutCount == 1; - document.getElementById("web-developer-edit-responsive-layout").disabled = !selectedItem; - document.getElementById("web-developer-move-down-responsive-layout").disabled = !selectedItem || selectedIndex == responsiveLayoutCount - 1; - document.getElementById("web-developer-move-up-responsive-layout").disabled = !selectedItem || !selectedIndex; -}; - -// Handles a tool being selected -WebDeveloper.Options.selectTool = function() -{ - var tools = document.getElementById("web-developer-tools"); - var selectedIndex = tools.selectedIndex; - var selectedItem = tools.selectedItem; - var toolCount = tools.getRowCount(); - - document.getElementById("web-developer-delete-tool").disabled = !selectedItem || toolCount == 1; - document.getElementById("web-developer-edit-tool").disabled = !selectedItem; - document.getElementById("web-developer-move-down-tool").disabled = !selectedItem || selectedIndex == toolCount - 1; - document.getElementById("web-developer-move-up-tool").disabled = !selectedItem || !selectedIndex; -}; - -// Handles a view source with option being selected -WebDeveloper.Options.selectViewSourceWithOption = function() -{ - var viewSourceWithOptions = document.getElementById("web-developer-view-source-with-options"); - var selectedIndex = viewSourceWithOptions.selectedIndex; - var selectedItem = viewSourceWithOptions.selectedItem; - var viewSourceWithCount = viewSourceWithOptions.getRowCount(); - - document.getElementById("web-developer-delete-view-source-with-option").disabled = !selectedItem; - document.getElementById("web-developer-edit-view-source-with-option").disabled = !selectedItem; - document.getElementById("web-developer-move-down-view-source-with-option").disabled = !selectedItem || selectedIndex == viewSourceWithCount - 1; - document.getElementById("web-developer-move-up-view-source-with-option").disabled = !selectedItem || !selectedIndex; -}; - -// Updates the keyboard preferences -WebDeveloper.Options.updateKeyboardPreferences = function() -{ - var feature = null; - var key = null; - var keyboard = null; - var keyboardShortcut = null; - var keyboardShortcuts = document.getElementById("web-developer-keyboard-shortcuts"); - var keyboardShortcutCount = keyboardShortcuts.getRowCount(); - var modifiers = null; - var position = 0; - - // Loop through the keyboard shortcuts - for(var i = 1, l = WebDeveloper.Preferences.getExtensionIntegerPreference("keyboard.count"); i <= l; i++) - { - WebDeveloper.Preferences.deleteExtensionPreference("keyboard." + i + ".feature"); - WebDeveloper.Preferences.deleteExtensionPreference("keyboard." + i + ".key"); - WebDeveloper.Preferences.deleteExtensionPreference("keyboard." + i + ".modifiers"); - } - - // Loop through the keyboard shortcuts - for(i = 0; i < keyboardShortcutCount; i++) - { - position = i + 1; - keyboardShortcut = keyboardShortcuts.getItemAtIndex(i).childNodes; - feature = keyboardShortcut[0].getAttribute("data-web-developer-feature"); - keyboard = keyboardShortcut[1]; - key = keyboard.getAttribute("data-web-developer-key"); - modifiers = keyboard.getAttribute("data-web-developer-modifiers"); - - // If the keyboard shortcut description matches the original localized version - if(key == WebDeveloper.Locales.getString("extensions.webdeveloper.keyboard." + position + ".key")) - { - WebDeveloper.Preferences.deleteExtensionPreference("keyboard." + position + ".key"); - } - else - { - WebDeveloper.Preferences.setExtensionStringPreference("keyboard." + position + ".key", key); - } - - WebDeveloper.Preferences.setExtensionStringPreference("keyboard." + position + ".feature", feature); - WebDeveloper.Preferences.setExtensionStringPreference("keyboard." + position + ".modifiers", modifiers); - } - - WebDeveloper.Preferences.setExtensionIntegerPreference("keyboard.count", keyboardShortcutCount); -}; - -// Updates the resize preferences -WebDeveloper.Options.updateResizePreferences = function() -{ - var key = null; - var keyboard = null; - var modifiers = null; - var position = 0; - var resizeOption = null; - var resizeOptions = document.getElementById("web-developer-resize-options"); - var resizeCount = resizeOptions.getRowCount(); - var viewport = false; - - // Loop through the resize preferences - for(var i = 1, l = WebDeveloper.Preferences.getExtensionIntegerPreference("resize.count"); i <= l; i++) - { - WebDeveloper.Preferences.deleteExtensionPreference("resize." + i + ".description"); - WebDeveloper.Preferences.deleteExtensionPreference("resize." + i + ".height"); - WebDeveloper.Preferences.deleteExtensionPreference("resize." + i + ".key"); - WebDeveloper.Preferences.deleteExtensionPreference("resize." + i + ".modifiers"); - WebDeveloper.Preferences.deleteExtensionPreference("resize." + i + ".viewport"); - WebDeveloper.Preferences.deleteExtensionPreference("resize." + i + ".width"); - } - - // Loop through the resize options - for(i = 0; i < resizeCount; i++) - { - position = i + 1; - resizeOption = resizeOptions.getItemAtIndex(i).childNodes; - keyboard = resizeOption[3]; - key = keyboard.getAttribute("data-web-developer-key"); - modifiers = keyboard.getAttribute("data-web-developer-modifiers"); - viewport = false; - - WebDeveloper.Preferences.setExtensionStringPreference("resize." + position + ".description", resizeOption[0].getAttribute("label")); - WebDeveloper.Preferences.setExtensionIntegerPreference("resize." + position + ".width", resizeOption[1].getAttribute("label")); - WebDeveloper.Preferences.setExtensionIntegerPreference("resize." + position + ".height", resizeOption[2].getAttribute("label")); - - // If resizing the viewport - if(resizeOption[3].getAttribute("label") == WebDeveloper.Locales.getString("yes")) - { - viewport = true; - } - - WebDeveloper.Preferences.setExtensionBooleanPreference("resize." + position + ".viewport", viewport); - - // If a key and modifiers are set - if(key && modifiers) - { - WebDeveloper.Preferences.setExtensionStringPreference("resize." + position + ".key", key); - WebDeveloper.Preferences.setExtensionStringPreference("resize." + position + ".modifiers", modifiers); - } - } - - WebDeveloper.Preferences.setExtensionIntegerPreference("resize.count", resizeCount); - - // If the first resize description matches the original localized version - if(WebDeveloper.Preferences.getExtensionStringPreference("resize.1.description") == WebDeveloper.Locales.getString("extensions.webdeveloper.resize.1.description")) - { - WebDeveloper.Preferences.deleteExtensionPreference("resize.1.description"); - } -}; - -// Updates the responsive layouts preferences -WebDeveloper.Options.updateResponsiveLayoutsPreferences = function() -{ - var description = null; - var position = 0; - var responsiveLayout = null; - var responsiveLayouts = document.getElementById("web-developer-responsive-layouts"); - var responsiveLayoutCount = responsiveLayouts.getRowCount(); - - // Loop through the responsive layout preferences - for(var i = 1, l = WebDeveloper.Preferences.getExtensionIntegerPreference("responsive.layout.count"); i <= l; i++) - { - WebDeveloper.Preferences.deleteExtensionPreference("responsive.layout." + i + ".description"); - WebDeveloper.Preferences.deleteExtensionPreference("responsive.layout." + i + ".height"); - WebDeveloper.Preferences.deleteExtensionPreference("responsive.layout." + i + ".width"); - } - - // Loop through the responsive layout options - for(i = 0; i < responsiveLayoutCount; i++) - { - position = i + 1; - responsiveLayout = responsiveLayouts.getItemAtIndex(i).childNodes; - description = responsiveLayout[0].getAttribute("label"); - - WebDeveloper.Preferences.setExtensionIntegerPreference("responsive.layout." + position + ".width", responsiveLayout[1].getAttribute("label")); - WebDeveloper.Preferences.setExtensionIntegerPreference("responsive.layout." + position + ".height", responsiveLayout[2].getAttribute("label")); - - // If the responsive option description matches the original localized version - if(description == WebDeveloper.Locales.getString("extensions.webdeveloper.responsive.layout." + position + ".description")) - { - WebDeveloper.Preferences.deleteExtensionPreference("responsive.layout." + position + ".description"); - } - else - { - WebDeveloper.Preferences.setExtensionStringPreference("responsive.layout." + position + ".description", description); - } - } - - WebDeveloper.Preferences.setExtensionIntegerPreference("responsive.layout.count", responsiveLayoutCount); -}; - -// Updates the syntax highlight theme -WebDeveloper.Options.updateSyntaxHighlightTheme = function() -{ - document.getElementById("web-developer-syntax-highlight-browser").contentDocument.defaultView.WebDeveloper.setTheme(document.getElementById("web-developer-syntax-highlight-theme").value); -}; - -// Updates the tools preferences -WebDeveloper.Options.updateToolsPreferences = function() -{ - var description = null; - var key = null; - var keyboard = null; - var modifiers = null; - var pathURL = null; - var position = 0; - var tool = null; - var tools = document.getElementById("web-developer-tools"); - var toolCount = tools.getRowCount(); - - // Loop through the tools preferences - for(var i = 1, l = WebDeveloper.Preferences.getExtensionIntegerPreference("tool.count"); i <= l; i++) - { - WebDeveloper.Preferences.deleteExtensionPreference("tool." + i + ".description"); - WebDeveloper.Preferences.deleteExtensionPreference("tool." + i + ".key"); - WebDeveloper.Preferences.deleteExtensionPreference("tool." + i + ".modifiers"); - WebDeveloper.Preferences.deleteExtensionPreference("tool." + i + ".path"); - WebDeveloper.Preferences.deleteExtensionPreference("tool." + i + ".separator"); - WebDeveloper.Preferences.deleteExtensionPreference("tool." + i + ".url"); - } - - // Loop through the tools - for(i = 0; i < toolCount; i++) - { - position = i + 1; - tool = tools.getItemAtIndex(i).childNodes; - - // If this is a separator - if(tool[0].nodeName == "separator") - { - WebDeveloper.Preferences.setExtensionBooleanPreference("tool." + i + ".separator"); - } - else - { - description = tool[0].getAttribute("label"); - keyboard = tool[2]; - key = keyboard.getAttribute("data-web-developer-key"); - modifiers = keyboard.getAttribute("data-web-developer-modifiers"); - pathURL = tool[1]; - - // If the tool description matches the original localized version - if(description == WebDeveloper.Locales.getString("extensions.webdeveloper.tool." + position + ".description")) - { - WebDeveloper.Preferences.deleteExtensionPreference("tool." + position + ".description"); - } - else - { - WebDeveloper.Preferences.setExtensionStringPreference("tool." + position + ".description", description); - } - - // If this is an application - if(pathURL.getAttribute("data-web-developer-tool-type") == "path") - { - WebDeveloper.Preferences.setExtensionStringPreference("tool." + position + ".path", pathURL.getAttribute("label")); - } - else - { - WebDeveloper.Preferences.setExtensionStringPreference("tool." + position + ".url", pathURL.getAttribute("label")); - } - - // If a key and modifiers are set - if(key && modifiers) - { - // If the tool key matches the original localized version - if(key == WebDeveloper.Locales.getString("extensions.webdeveloper.tool." + position + ".key")) - { - WebDeveloper.Preferences.deleteExtensionPreference("tool." + position + ".key"); - } - else - { - WebDeveloper.Preferences.setExtensionStringPreference("tool." + position + ".key", key); - } - - WebDeveloper.Preferences.setExtensionStringPreference("tool." + position + ".modifiers", modifiers); - } - } - } - - WebDeveloper.Preferences.setExtensionIntegerPreference("tool.count", toolCount); -}; - -// Updates the view source with preferences -WebDeveloper.Options.updateViewSourceWithPreferences = function() -{ - var key = null; - var keyboard = null; - var modifiers = null; - var position = 0; - var viewSourceWithOption = null; - var viewSourceWithOptions = document.getElementById("web-developer-view-source-with-options"); - var viewSourceWithCount = viewSourceWithOptions.getRowCount(); - - // Loop through the view source with preferences - for(var i = 1, l = WebDeveloper.Preferences.getExtensionIntegerPreference("view.source.with.count"); i <= l; i++) - { - WebDeveloper.Preferences.deleteExtensionPreference("view.source.with." + i + ".description"); - WebDeveloper.Preferences.deleteExtensionPreference("view.source.with." + i + ".key"); - WebDeveloper.Preferences.deleteExtensionPreference("view.source.with." + i + ".modifiers"); - WebDeveloper.Preferences.deleteExtensionPreference("view.source.with." + i + ".path"); - } - - // Loop through the view source with options - for(i = 0; i < viewSourceWithCount; i++) - { - position = i + 1; - viewSourceWithOption = viewSourceWithOptions.getItemAtIndex(i).childNodes; - keyboard = viewSourceWithOption[2]; - key = keyboard.getAttribute("data-web-developer-key"); - modifiers = keyboard.getAttribute("data-web-developer-modifiers"); - - WebDeveloper.Preferences.setExtensionStringPreference("view.source.with." + position + ".description", viewSourceWithOption[0].getAttribute("label")); - WebDeveloper.Preferences.setExtensionStringPreference("view.source.with." + position + ".path", viewSourceWithOption[1].getAttribute("label")); - - // If a key and modifiers are set - if(key && modifiers) - { - WebDeveloper.Preferences.setExtensionStringPreference("view.source.with." + position + ".key", key); - WebDeveloper.Preferences.setExtensionStringPreference("view.source.with." + position + ".modifiers", modifiers); - } - } - - WebDeveloper.Preferences.setExtensionIntegerPreference("view.source.with.count", viewSourceWithCount); -}; diff --git a/source/firefox/javascript/overlay/cookies.js b/source/firefox/javascript/overlay/cookies.js deleted file mode 100644 index c53edad..0000000 --- a/source/firefox/javascript/overlay/cookies.js +++ /dev/null @@ -1,124 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.Cookies = WebDeveloper.Overlay.Cookies || {}; - -// Adds a cookie -WebDeveloper.Overlay.Cookies.addCookie = function() -{ - window.openDialog("chrome://web-developer/content/dialogs/cookie.xul", "web-developer-cookie-dialog", "centerscreen,chrome,modal", "add"); -}; - -// Deletes all the cookies for the current domain -WebDeveloper.Overlay.Cookies.deleteDomainCookies = function() -{ - var allCookies = WebDeveloper.Cookies.getAllCookies(); - var documents = WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()); - var domainCookies = []; - - // Loop through the documents - for(var i = 0, l = documents.length; i < l; i++) - { - // Try to get the host - try - { - domainCookies = domainCookies.concat(WebDeveloper.Content.filterCookies(allCookies, documents[i].location.hostname, "/", false)); - } - catch(exception) - { - // Ignore - } - } - - WebDeveloper.Cookies.deleteDomainCookies(domainCookies); -}; - -// Deletes all the cookies for the current path -WebDeveloper.Overlay.Cookies.deletePathCookies = function() -{ - var allCookies = WebDeveloper.Cookies.getAllCookies(); - var contentDocument = null; - var documents = WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()); - var pathCookies = []; - - // Loop through the documents - for(var i = 0, l = documents.length; i < l; i++) - { - contentDocument = documents[i]; - - // Try to get the host and path - try - { - pathCookies = pathCookies.concat(WebDeveloper.Content.filterCookies(allCookies, contentDocument.location.hostname, contentDocument.location.pathname, false)); - } - catch(exception) - { - // Ignore - } - } - - WebDeveloper.Cookies.deletePathCookies(pathCookies); -}; - -// Deletes all session cookies -WebDeveloper.Overlay.Cookies.deleteSessionCookies = function() -{ - WebDeveloper.Cookies.deleteSessionCookies(WebDeveloper.Cookies.getAllCookies()); -}; - -// Toggles cookies -WebDeveloper.Overlay.Cookies.toggleCookies = function(element) -{ - var cookieBehavior = 2; - - // If enabling cookies - if(WebDeveloper.Common.convertToBoolean(element.getAttribute("checked"))) - { - cookieBehavior = 0; - } - - WebDeveloper.Preferences.setIntegerPreference("network.cookie.cookieBehavior", cookieBehavior); -}; - -// Toggles third-party cookies -WebDeveloper.Overlay.Cookies.toggleThirdPartyCookies = function(element) -{ - var cookieBehavior = 1; - - // If enabling third-party cookies - if(WebDeveloper.Common.convertToBoolean(element.getAttribute("checked"))) - { - cookieBehavior = 0; - } - - WebDeveloper.Preferences.setIntegerPreference("network.cookie.cookieBehavior", cookieBehavior); -}; - -// Updates the disable cookies menu -WebDeveloper.Overlay.Cookies.updateDisableCookiesMenu = function() -{ - var disableThirdPartyCookiesChecked = false; - var disableThirdPartyCookiesMenu = document.getElementById("web-developer-disable-third-party-cookies-command"); - var disableCookiesChecked = false; - var disableCookiesPreferenceValue = WebDeveloper.Preferences.getIntegerPreference("network.cookie.cookieBehavior"); - - // If the cookie preference value is set to 2 - if(disableCookiesPreferenceValue == 2) - { - disableCookiesChecked = true; - } - else if(disableCookiesPreferenceValue == 1) - { - disableThirdPartyCookiesChecked = true; - } - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-all-cookies-command"), "checked", disableCookiesChecked); - WebDeveloper.Common.configureElement(disableThirdPartyCookiesMenu, "checked", disableThirdPartyCookiesChecked); - WebDeveloper.Common.configureElement(disableThirdPartyCookiesMenu, "disabled", disableCookiesChecked); -}; - -// Displays all the cookies for the page -WebDeveloper.Overlay.Cookies.viewCookieInformation = function() -{ - WebDeveloper.Overlay.openGeneratedTab(WebDeveloper.Common.getChromeURL("generated/view-cookie-information.html"), WebDeveloper.Content.getCookies(WebDeveloper.Cookies.getAllCookies()), WebDeveloper.Overlay.Cookies.getViewCookieInformationLocale()); -}; diff --git a/source/firefox/javascript/overlay/css.js b/source/firefox/javascript/overlay/css.js deleted file mode 100644 index 34aa6b0..0000000 --- a/source/firefox/javascript/overlay/css.js +++ /dev/null @@ -1,398 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.CSS = WebDeveloper.Overlay.CSS || {}; -WebDeveloper.Overlay.CSS.userStyleSheet = null; - -// Adds a user style sheet to the page -WebDeveloper.Overlay.CSS.addUserStyleSheet = function(element) -{ - var addStyleSheet = !WebDeveloper.Common.convertToBoolean(element.getAttribute("checked")); - var documents = WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()); - var i = 0; - var l = 0; - - // If adding a style sheet - if(addStyleSheet) - { - var filePicker = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker); - - filePicker.appendFilter(WebDeveloper.Locales.getString("styleSheets"), "*.css"); - filePicker.init(window, WebDeveloper.Locales.getString("addUserStyleSheet"), filePicker.modeOpen); - - // If the user selected a style sheet - if(filePicker.show() == filePicker.returnOK) - { - var inputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream); - var scriptableStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream); - - inputStream.init(filePicker.file, parseInt(1, 16), parseInt(444, 8), null); - scriptableStream.init(inputStream); - - WebDeveloper.Overlay.CSS.userStyleSheet = scriptableStream.read(scriptableStream.available()); - - scriptableStream.close(); - inputStream.close(); - } - else - { - addStyleSheet = false; - WebDeveloper.Overlay.CSS.userStyleSheet = null; - } - } - - // If adding a style sheet and the style sheet is not empty - if(addStyleSheet && WebDeveloper.Overlay.CSS.userStyleSheet) - { - var contentDocument = null; - var styleElement = null; - - // Loop through the documents - for(i = 0, l = documents.length; i < l; i++) - { - contentDocument = documents[i]; - styleElement = contentDocument.createElement("style"); - - styleElement.setAttribute("id", "web-developer-add-user-style-sheet"); - styleElement.appendChild(contentDocument.createTextNode(WebDeveloper.Overlay.CSS.userStyleSheet)); - - WebDeveloper.Common.getDocumentHeadElement(contentDocument).appendChild(styleElement); - } - - // If the feature is not active - if(!WebDeveloper.Storage.isFeatureActive("add-user-style-sheet")) - { - WebDeveloper.Storage.toggleFeature("add-user-style-sheet"); - } - } - else - { - WebDeveloper.Overlay.CSS.userStyleSheet = null; - - // Loop through the documents - for(i = 0, l = documents.length; i < l; i++) - { - WebDeveloper.Common.removeMatchingElements("#web-developer-add-user-style-sheet", documents[i]); - } - - // If the feature is active - if(WebDeveloper.Storage.isFeatureActive("add-user-style-sheet")) - { - WebDeveloper.Storage.toggleFeature("add-user-style-sheet"); - } - } -}; - -// Disables all styles -WebDeveloper.Overlay.CSS.disableAllStyles = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.CSS.toggleAllStyles(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Disables the browser default styles -WebDeveloper.Overlay.CSS.disableBrowserDefaultStyles = function(element) -{ - WebDeveloper.CSS.toggleBrowserDefaultStyles(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Disables embedded styles -WebDeveloper.Overlay.CSS.disableEmbeddedStyles = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.CSS.toggleEmbeddedStyles(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Disables an individual style sheet -WebDeveloper.Overlay.CSS.disableIndividualStyleSheet = function(disableStyleSheetURL) -{ - var styleSheet = null; - var styleSheets = WebDeveloper.Common.getContentDocument().styleSheets; - var styleSheetURL = null; - - // Loop through the style sheets - for(var i = 0, l = styleSheets.length; i < l; i++) - { - styleSheet = styleSheets[i]; - styleSheetURL = styleSheet.href; - - // If this is the style sheet to disable - if(styleSheetURL == disableStyleSheetURL) - { - styleSheet.disabled = !styleSheet.disabled; - } - } -}; - -// Disables inline styles -WebDeveloper.Overlay.CSS.disableInlineStyles = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.CSS.toggleInlineStyles(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Disables linked style sheets -WebDeveloper.Overlay.CSS.disableLinkedStyleSheets = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.CSS.toggleLinkedStyleSheets(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Disables print styles -WebDeveloper.Overlay.CSS.disablePrintStyles = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.CSS.togglePrintStyles(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Displays handheld styles -WebDeveloper.Overlay.CSS.displayHandheldStyles = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - var display = !WebDeveloper.Storage.isFeatureActive(featureId); - - // If displaying handheld styles and print styles are being displayed - if(display && WebDeveloper.Storage.isFeatureActive("display-print-styles")) - { - WebDeveloper.CSS.toggleMediaTypeStyles("print", false, WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature("display-print-styles"); - } - - WebDeveloper.CSS.toggleMediaTypeStyles("handheld", display, WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature("display-handheld-styles"); -}; - -// Displays print styles -WebDeveloper.Overlay.CSS.displayPrintStyles = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - var display = !WebDeveloper.Storage.isFeatureActive(featureId); - - // If displaying print styles and handheld styles are being displayed - if(display && WebDeveloper.Storage.isFeatureActive("display-handheld-styles")) - { - WebDeveloper.CSS.toggleMediaTypeStyles("handheld", false, WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature("display-handheld-styles"); - } - - WebDeveloper.CSS.toggleMediaTypeStyles("print", display, WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature("display-print-styles"); -}; - -// Displays style information for an element -WebDeveloper.Overlay.CSS.displayStyleInformation = function() -{ - var styleInformation = WebDeveloper.Locales.getString("styleInformation"); - - // If style information is open in the dashboard - if(WebDeveloper.Dashboard.isOpenInDashboard(styleInformation)) - { - WebDeveloper.Dashboard.closeDashboardTab(styleInformation); - } - else if(WebDeveloper.Overlay.isDOMInspectorAvailable()) - { - WebDeveloper.Dashboard.openInDashboard(styleInformation, "chrome://web-developer/content/dashboard/style-information.xul"); - } - else - { - WebDeveloper.Common.displayURLMessage(WebDeveloper.Locales.getString("domInspectorRequired"), "@url@/help/#dom-inspector"); - } -}; - -// Edits the CSS of the page -WebDeveloper.Overlay.CSS.editCSS = function() -{ - var editCSS = WebDeveloper.Locales.getString("editCSS"); - - // If edit CSS is open in the dashboard - if(WebDeveloper.Dashboard.isOpenInDashboard(editCSS)) - { - WebDeveloper.Dashboard.closeDashboardTab(editCSS); - } - else if(WebDeveloper.Common.pageHasFrames()) - { - WebDeveloper.Common.displayError(editCSS, WebDeveloper.Locales.getString("framesNotSupported")); - } - else - { - WebDeveloper.Dashboard.openInDashboard(editCSS, "chrome://web-developer/content/dashboard/edit-css.xul"); - } -}; - -// Formats a style sheet URL for a menu item -WebDeveloper.Overlay.CSS.formatStyleSheetURLForMenu = function(url) -{ - var formattedURL = WebDeveloper.Common.removeReloadParameterFromURL(url); - - // If the style sheet URL is too long for a menu - if(formattedURL.length > 65) - { - formattedURL = formattedURL.substring(0, 20) + "..." + formattedURL.substr(-40); - } - - return formattedURL; -}; - -// Reloads linked style sheets -WebDeveloper.Overlay.CSS.reloadLinkedStyleSheets = function() -{ - WebDeveloper.CSS.reloadLinkedStyleSheets(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Updates the CSS menu -WebDeveloper.Overlay.CSS.updateCSSMenu = function(suffix) -{ - var command = document.getElementById("web-developer-edit-css-command"); - var disableAllStyles = WebDeveloper.Storage.isFeatureActive("disable-all-styles"); - var displayStyleInformationOpen = WebDeveloper.Dashboard.isOpenInDashboard(WebDeveloper.Locales.getString("styleInformation")); - var editCSSOpen = WebDeveloper.Dashboard.isOpenInDashboard(WebDeveloper.Locales.getString("editCSS")); - var menu = document.getElementById("web-developer-edit-css-" + suffix); - - WebDeveloper.Common.configureElement(command, "checked", editCSSOpen); - WebDeveloper.Common.configureElement(command, "disabled", disableAllStyles); - - // If the menu exists - if(menu) - { - // If edit CSS is not open and the page has frames - if(!editCSSOpen && WebDeveloper.Common.pageHasFrames()) - { - menu.setAttribute("class", "menuitem-iconic"); - } - else if(menu.hasAttribute("class")) - { - menu.removeAttribute("class"); - } - } - - command = document.getElementById("web-developer-display-style-information-command"); - menu = document.getElementById("web-developer-display-style-information-" + suffix); - - WebDeveloper.Common.configureElement(command, "checked", displayStyleInformationOpen); - WebDeveloper.Common.configureElement(command, "disabled", disableAllStyles); - - // If the menu exists - if(menu) - { - // If display style information is not open and the DOM Inspector is not found - if(!displayStyleInformationOpen && !WebDeveloper.Overlay.isDOMInspectorAvailable()) - { - menu.setAttribute("class", "menuitem-iconic"); - } - else if(menu.hasAttribute("class")) - { - menu.removeAttribute("class"); - } - } - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-add-user-style-sheet-command"), "disabled", disableAllStyles); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-display-styles-media-type-" + suffix), "disabled", disableAllStyles); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-reload-linked-style-sheets-command"), "disabled", disableAllStyles); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-use-border-box-model-command"), "disabled", disableAllStyles); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-view-css-command"), "disabled", disableAllStyles); - WebDeveloper.Overlay.configureFeatureElement("web-developer-add-user-style-sheet-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-use-border-box-model-command", "checked"); -}; - -// Updates the disable individual style sheet menu -WebDeveloper.Overlay.CSS.updateDisableIndividualStyleSheetMenu = function(menu) -{ - var contentDocument = WebDeveloper.Common.getContentDocument(); - var menuItem = null; - var styleSheet = null; - var styleSheets = contentDocument.styleSheets; - var styleSheetURL = null; - - WebDeveloper.Overlay.removeGeneratedMenuItems(menu); - - // Loop through the style sheets - for(var i = 0, l = styleSheets.length; i < l; i++) - { - styleSheet = styleSheets[i]; - styleSheetURL = styleSheet.href; - - // If this is a valid style sheet, is not an line style sheet and is not an alternate style sheet - if(WebDeveloper.CSS.isValidStyleSheet(styleSheet) && styleSheetURL && styleSheetURL != contentDocument.documentURI) - { - menuItem = document.createElement("menuitem"); - - menuItem.setAttribute("class", "web-developer-generated-menu"); - menuItem.setAttribute("label", WebDeveloper.Overlay.CSS.formatStyleSheetURLForMenu(styleSheetURL)); - menuItem.setAttribute("oncommand", "WebDeveloper.Overlay.CSS.disableIndividualStyleSheet('" + styleSheetURL + "')"); - menuItem.setAttribute("type", "checkbox"); - - // If the style sheet is disabled - if(!styleSheet.disabled) - { - menuItem.setAttribute("checked", true); - } - - menu.appendChild(menuItem); - } - } - - // If the menu has no children - if(!menu.hasChildNodes()) - { - menuItem = document.createElement("menuitem"); - - menuItem.setAttribute("class", "webdeveloper-generated-menu"); - menuItem.setAttribute("disabled", true); - menuItem.setAttribute("label", WebDeveloper.Locales.getString("noStyleSheets")); - menu.appendChild(menuItem); - } -}; - -// Updates the disable styles menu -WebDeveloper.Overlay.CSS.updateDisableStylesMenu = function(suffix) -{ - var disableAllStyles = WebDeveloper.Storage.isFeatureActive("disable-all-styles"); - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-browser-default-styles-command"), "disabled", disableAllStyles); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-embedded-styles-command"), "disabled", disableAllStyles); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-inline-styles-command"), "disabled", disableAllStyles); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-linked-style-sheets-command"), "disabled", disableAllStyles); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-print-styles-command"), "disabled", disableAllStyles); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-individual-style-sheet-" + suffix), "disabled", disableAllStyles); - WebDeveloper.Overlay.configureFeatureElement("web-developer-disable-all-styles-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-disable-browser-default-styles-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-disable-embedded-styles-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-disable-inline-styles-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-disable-linked-style-sheets-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-disable-print-styles-command", "checked"); -}; - -// Updates the display styles by media type menu -WebDeveloper.Overlay.CSS.updateDisplayStylesMediaTypeMenu = function() -{ - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-handheld-styles-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-print-styles-command", "checked"); -}; - -// Uses the border box model -WebDeveloper.Overlay.CSS.useBorderBoxModel = function(element) -{ - WebDeveloper.CSS.useBorderBoxModel(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Displays the CSS -WebDeveloper.Overlay.CSS.viewCSS = function() -{ - var data = WebDeveloper.Content.getCSS(); - - data.theme = WebDeveloper.Preferences.getExtensionStringPreference("syntax.highlight.theme"); - - WebDeveloper.Overlay.openGeneratedTab(WebDeveloper.Common.getChromeURL("generated/view-css.html"), data, WebDeveloper.Overlay.CSS.getViewCSSLocale()); -}; diff --git a/source/firefox/javascript/overlay/disable.js b/source/firefox/javascript/overlay/disable.js deleted file mode 100644 index f83d0c9..0000000 --- a/source/firefox/javascript/overlay/disable.js +++ /dev/null @@ -1,239 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.Disable = WebDeveloper.Overlay.Disable || {}; - -// Toggles the cache -WebDeveloper.Overlay.Disable.toggleCache = function(element) -{ - WebDeveloper.Preferences.enablePreference(element, "browser.cache.disk.enable"); - WebDeveloper.Preferences.enablePreference(element, "browser.cache.memory.enable"); -}; - -// Toggles the check for newer version of page setting -WebDeveloper.Overlay.Disable.toggleCheckForNewerVersionOfPage = function(frequency) -{ - WebDeveloper.Preferences.setIntegerPreference("browser.cache.check_doc_frequency", frequency); -}; - -// Toggles DNS cache -WebDeveloper.Overlay.Disable.toggleDNSCache = function(element) -{ - // If enabling the DNS cache - if(WebDeveloper.Common.convertToBoolean(element.getAttribute("checked"))) - { - WebDeveloper.Preferences.deletePreference("network.dnsCacheExpiration"); - } - else - { - WebDeveloper.Preferences.setIntegerPreference("network.dnsCacheExpiration", 0); - } -}; - -// Toggles Java -WebDeveloper.Overlay.Disable.toggleJava = function(element) -{ - WebDeveloper.Preferences.enablePreference(element, "security.enable_java"); -}; - -// Toggle JavaScript -WebDeveloper.Overlay.Disable.toggleJavaScript = function(element) -{ - var javaScriptButton = document.getElementById("web-developer-javascript-statusbar"); - - WebDeveloper.Preferences.enablePreference(element, "javascript.enabled"); - - // If the JavaScript button exists - if(javaScriptButton) - { - // If enabling JavaScript - if(WebDeveloper.Common.convertToBoolean(element.getAttribute("checked"))) - { - // If the JavaScript button has a class attribute - if(javaScriptButton.hasAttribute("class")) - { - javaScriptButton.removeAttribute("class"); - } - - // If the JavaScript button has a tooltip text attribute - if(javaScriptButton.hasAttribute("tooltiptext")) - { - javaScriptButton.removeAttribute("tooltiptext"); - } - } - else - { - javaScriptButton.setAttribute("class", "disabled"); - javaScriptButton.setAttribute("tooltiptext", WebDeveloper.Locales.getString("javaScriptDisabledTooltip")); - } - } -}; - -// Toggles meta redirects -WebDeveloper.Overlay.Disable.toggleMetaRedirects = function(element) -{ - var allowMetaRedirects = false; - var browsers = WebDeveloper.Common.getTabBrowser().browsers; - - // If the element is checked - if(WebDeveloper.Common.convertToBoolean(element.getAttribute("checked"))) - { - allowMetaRedirects = true; - } - - // Loop through the browsers - for(var i = 0, l = browsers.length; i < l; i++) - { - browsers[i].docShell.allowMetaRedirects = allowMetaRedirects; - } - - WebDeveloper.Preferences.setExtensionBooleanPreference("meta.redirects.disable", !allowMetaRedirects); -}; - -// Toggles the minimum font size -WebDeveloper.Overlay.Disable.toggleMinimumFontSize = function(element) -{ - var defaultFontSize = 10; - var minimumFontSize = null; - - // If enabling the minimum font size - if(WebDeveloper.Common.convertToBoolean(element.getAttribute("checked"))) - { - minimumFontSize = WebDeveloper.Preferences.getExtensionIntegerPreference("font.minimum.size"); - - // If the minimum font size is not set - if(minimumFontSize === 0) - { - minimumFontSize = defaultFontSize; - } - - WebDeveloper.Preferences.deleteExtensionPreference("font.minimum.size"); - WebDeveloper.Preferences.setIntegerPreference("font.minimum-size.x-western", minimumFontSize); - } - else - { - minimumFontSize = WebDeveloper.Preferences.getIntegerPreference("font.minimum-size.x-western"); - - // If the minimum font size is not set - if(minimumFontSize === 0) - { - minimumFontSize = defaultFontSize; - } - - WebDeveloper.Preferences.deletePreference("font.minimum-size.x-western"); - WebDeveloper.Preferences.setExtensionIntegerPreference("font.minimum.size", minimumFontSize); - } - - BrowserReload(); -}; - -// Toggles the page colors -WebDeveloper.Overlay.Disable.togglePageColors = function(element) -{ - var pageColors = 2; - - // If enabling page colors - if(WebDeveloper.Common.convertToBoolean(element.getAttribute("checked"))) - { - pageColors = 0; - } - - WebDeveloper.Preferences.setIntegerPreference("browser.display.document_color_use", pageColors); - WebDeveloper.Preferences.enablePreference(element, "browser.display.use_document_colors"); - BrowserReload(); -}; - -// Toggles the proxy settings -WebDeveloper.Overlay.Disable.toggleProxy = function(proxyType) -{ - WebDeveloper.Preferences.setIntegerPreference("network.proxy.type", proxyType); -}; - -// Toggles referrers -WebDeveloper.Overlay.Disable.toggleReferrers = function(element) -{ - var sendReferrer = 0; - - // If enabling referrers - if(WebDeveloper.Common.convertToBoolean(element.getAttribute("checked"))) - { - sendReferrer = 2; - } - - WebDeveloper.Preferences.setIntegerPreference("network.http.sendRefererHeader", sendReferrer); -}; - -// Updates the check for newer version of page menu -WebDeveloper.Overlay.Disable.updateCheckForNewerVersionOfPageMenu = function() -{ - var checkForNewerVersionOfPageType = WebDeveloper.Preferences.getIntegerPreference("browser.cache.check_doc_frequency"); - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-check-for-newer-version-of-page-when-page-is-out-of-date-command"), "checked", checkForNewerVersionOfPageType == 3); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-check-for-newer-version-of-page-every-time-command"), "checked", checkForNewerVersionOfPageType == 1); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-check-for-newer-version-of-page-once-per-session-command"), "checked", checkForNewerVersionOfPageType === 0); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-never-check-for-newer-version-of-page-command"), "checked", checkForNewerVersionOfPageType == 2); -}; - -// Updates the disable cache menu -WebDeveloper.Overlay.Disable.updateDisableCacheMenu = function() -{ - var cacheDisabled = !WebDeveloper.Preferences.getBooleanPreference("browser.cache.disk.enable") && !WebDeveloper.Preferences.getBooleanPreference("browser.cache.memory.enable"); - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-entire-cache-command"), "checked", cacheDisabled); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-check-for-newer-version-of-page-command"), "disabled", cacheDisabled); -}; - -// Updates the disable menu -WebDeveloper.Overlay.Disable.updateDisableMenu = function() -{ - var dnsCacheDisabled = false; - var pageColorsDisabled = false; - var referrersDisabled = false; - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-java-command"), "checked", !WebDeveloper.Preferences.getBooleanPreference("security.enable_java")); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-javascript-command"), "checked", !WebDeveloper.Preferences.getBooleanPreference("javascript.enabled")); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-meta-redirects-command"), "checked", WebDeveloper.Preferences.getExtensionBooleanPreference("meta.redirects.disable")); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-minimum-font-size-command"), "checked", WebDeveloper.Preferences.getIntegerPreference("font.minimum-size.x-western") === 0); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-popup-blocker-command"), "checked", !WebDeveloper.Preferences.getBooleanPreference("dom.disable_open_during_load")); - - // If the DNS cache preference is set to 0 - if(WebDeveloper.Preferences.isPreferenceSet("network.dnsCacheExpiration") && WebDeveloper.Preferences.getIntegerPreference("network.dnsCacheExpiration") === 0) - { - dnsCacheDisabled = true; - } - - // If the page colors preference is set to 2 or true - if(WebDeveloper.Preferences.isPreferenceSet("browser.display.document_color_use") && WebDeveloper.Preferences.getIntegerPreference("browser.display.document_color_use") === 2 || !WebDeveloper.Preferences.getBooleanPreference("browser.display.use_document_colors")) - { - pageColorsDisabled = true; - } - - // If the referrer preference is not set or is set to 0 - if(WebDeveloper.Preferences.isPreferenceSet("network.http.sendRefererHeader") && WebDeveloper.Preferences.getIntegerPreference("network.http.sendRefererHeader") === 0) - { - referrersDisabled = true; - } - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-dns-cache-command"), "checked", dnsCacheDisabled); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-page-colors-command"), "checked", pageColorsDisabled); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-referrers-command"), "checked", referrersDisabled); -}; - -// Updates the disable JavaScript menu -WebDeveloper.Overlay.Disable.updateDisableJavaScriptMenu = function() -{ - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-all-javascript-command"), "checked", !WebDeveloper.Preferences.getBooleanPreference("javascript.enabled")); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-strict-javascript-warnings-command"), "checked", !WebDeveloper.Preferences.getBooleanPreference("javascript.options.strict")); -}; - -// Updates the disable proxy menu -WebDeveloper.Overlay.Disable.updateDisableProxyMenu = function() -{ - var proxyType = WebDeveloper.Preferences.getIntegerPreference("network.proxy.type"); - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-use-auto-detect-proxy-command"), "checked", proxyType == 4); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-use-configuration-url-proxy-command"), "checked", proxyType == 2); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-use-manual-proxy-command"), "checked", proxyType == 1); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-use-no-proxy-command"), "checked", proxyType === 0); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-use-system-proxy-command"), "checked", proxyType == 5); -}; diff --git a/source/firefox/javascript/overlay/forms.js b/source/firefox/javascript/overlay/forms.js deleted file mode 100644 index 34ca99a..0000000 --- a/source/firefox/javascript/overlay/forms.js +++ /dev/null @@ -1,125 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.Forms = WebDeveloper.Overlay.Forms || {}; - -// Clears all form fields -WebDeveloper.Overlay.Forms.clearFormFields = function() -{ - WebDeveloper.Forms.clearFormFields(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Clears all radio buttons -WebDeveloper.Overlay.Forms.clearRadioButtons = function() -{ - WebDeveloper.Forms.clearRadioButtons(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Converts the methods of all forms -WebDeveloper.Overlay.Forms.convertFormMethods = function(method) -{ - WebDeveloper.Forms.convertFormMethods(method, WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Converts select elements to text inputs -WebDeveloper.Overlay.Forms.convertSelectElementsToTextInputs = function() -{ - WebDeveloper.Forms.convertSelectElementsToTextInputs(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Converts text inputs to textareas -WebDeveloper.Overlay.Forms.convertTextInputsToTextareas = function() -{ - WebDeveloper.Forms.convertTextInputsToTextareas(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Displays the details about all forms -WebDeveloper.Overlay.Forms.displayFormDetails = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Forms.displayFormDetails(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Displays all passwords -WebDeveloper.Overlay.Forms.displayPasswords = function() -{ - WebDeveloper.Forms.displayPasswords(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Enables auto completion on all elements -WebDeveloper.Overlay.Forms.enableAutoCompletion = function() -{ - WebDeveloper.Forms.enableAutoCompletion(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Enables the form elements -WebDeveloper.Overlay.Forms.enableFormElements = function() -{ - WebDeveloper.Forms.enableFormElements(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Enables all form fields -WebDeveloper.Overlay.Forms.enableFormFields = function() -{ - WebDeveloper.Forms.enableFormFields(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Expands all select elements -WebDeveloper.Overlay.Forms.expandSelectElements = function() -{ - WebDeveloper.Forms.expandSelectElements(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Makes all form fields writable -WebDeveloper.Overlay.Forms.makeFormFieldsWritable = function() -{ - WebDeveloper.Forms.makeFormFieldsWritable(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Outlines all form fields without labels -WebDeveloper.Overlay.Forms.outlineFormFieldsWithoutLabels = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Forms.outlineFormFieldsWithoutLabels(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Populates all form fields -WebDeveloper.Overlay.Forms.populateFormFields = function() -{ - WebDeveloper.Forms.populateFormFields(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()), WebDeveloper.Preferences.getExtensionStringPreference("populate.email.address"), WebDeveloper.Locales.getString("password").toLowerCase()); -}; - -// Removes validation on all form fields -WebDeveloper.Overlay.Forms.removeFormValidation = function() -{ - WebDeveloper.Forms.removeFormValidation(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Removes maximum lengths from all elements -WebDeveloper.Overlay.Forms.removeMaximumLengths = function() -{ - WebDeveloper.Forms.removeMaximumLengths(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Toggles all the checkboxes on the page -WebDeveloper.Overlay.Forms.toggleCheckboxes = function(check) -{ - WebDeveloper.Forms.toggleCheckboxes(check, WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Updates the forms menu -WebDeveloper.Overlay.Forms.updateFormsMenu = function() -{ - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-form-details-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-form-fields-without-labels-command", "checked"); -}; - -// Displays information about all forms -WebDeveloper.Overlay.Forms.viewFormInformation = function() -{ - WebDeveloper.Overlay.openGeneratedTab(WebDeveloper.Common.getChromeURL("generated/view-form-information.html"), WebDeveloper.Content.getForms(), WebDeveloper.Overlay.Forms.getViewFormInformationLocale()); -}; diff --git a/source/firefox/javascript/overlay/images.js b/source/firefox/javascript/overlay/images.js deleted file mode 100644 index 8193767..0000000 --- a/source/firefox/javascript/overlay/images.js +++ /dev/null @@ -1,279 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.Images = WebDeveloper.Overlay.Images || {}; - -// Disables external site images -WebDeveloper.Overlay.Images.disableExternalSiteImages = function(element) -{ - var imageBehavior = 3; - - // If enabling external images - if(WebDeveloper.Common.convertToBoolean(element.getAttribute("checked"))) - { - imageBehavior = 1; - } - - WebDeveloper.Preferences.setIntegerPreference("permissions.default.image", imageBehavior); - BrowserReload(); -}; - -// Disables image animations -WebDeveloper.Overlay.Images.disableImageAnimations = function(element) -{ - var imageBehavior = "none"; - - // If enabling images - if(WebDeveloper.Common.convertToBoolean(element.getAttribute("checked"))) - { - imageBehavior = "normal"; - } - - WebDeveloper.Preferences.setStringPreference("image.animation_mode", imageBehavior); - BrowserReload(); -}; - -// Disables images -WebDeveloper.Overlay.Images.disableImages = function(element) -{ - var imageBehavior = 2; - - // If enabling images - if(WebDeveloper.Common.convertToBoolean(element.getAttribute("checked"))) - { - imageBehavior = 1; - } - - WebDeveloper.Preferences.setIntegerPreference("permissions.default.image", imageBehavior); - BrowserReload(); -}; - -// Displays alt attributes for all images -WebDeveloper.Overlay.Images.displayAltAttributes = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Images.displayAltAttributes(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Displays the dimensions for all images -WebDeveloper.Overlay.Images.displayImageDimensions = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - var locale = WebDeveloper.Locales.setupGeneratedLocale(); - - locale.height = WebDeveloper.Locales.getString("height"); - locale.width = WebDeveloper.Locales.getString("width"); - - WebDeveloper.Images.displayImageDimensions(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()), locale); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Displays the file sizes for all images -WebDeveloper.Overlay.Images.displayImageFileSizes = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Images.displayImageFileSizes(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Displays the paths for all images -WebDeveloper.Overlay.Images.displayImagePaths = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Images.displayImagePaths(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Finds all the broken images on a page -WebDeveloper.Overlay.Images.findBrokenImages = function() -{ - var locale = WebDeveloper.Locales.setupGeneratedLocale(); - - locale.brokenImage = WebDeveloper.Locales.getString("brokenImage"); - locale.brokenImages = WebDeveloper.Locales.getString("brokenImages"); - - WebDeveloper.Overlay.openGeneratedTab(WebDeveloper.Common.getChromeURL("generated/find-broken-images.html"), WebDeveloper.Content.getBrokenImages(), locale); -}; - -// Hides the background images in a document -WebDeveloper.Overlay.Images.hideBackgroundImages = function(element) -{ - WebDeveloper.Images.hideBackgroundImages(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Hides the images -WebDeveloper.Overlay.Images.hideImages = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Images.hideImages(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Makes all images full size -WebDeveloper.Overlay.Images.makeImagesFullSize = function() -{ - WebDeveloper.Images.makeImagesFullSize(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Makes all images invisible -WebDeveloper.Overlay.Images.makeImagesInvisible = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Images.makeImagesInvisible(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Outlines all images -WebDeveloper.Overlay.Images.outlineAllImages = function(element) -{ - WebDeveloper.Images.outlineAllImages(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Outlines all background images -WebDeveloper.Overlay.Images.outlineBackgroundImages = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Images.outlineBackgroundImages(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Outlines all images with adjusted dimensions -WebDeveloper.Overlay.Images.outlineImagesWithAdjustedDimensions = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Images.outlineImagesWithAdjustedDimensions(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Outlines all images with empty alt attributes -WebDeveloper.Overlay.Images.outlineImagesWithEmptyAltAttributes = function(element) -{ - WebDeveloper.Images.outlineImagesWithEmptyAltAttributes(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Outlines all images with oversized dimensions -WebDeveloper.Overlay.Images.outlineImagesWithOversizedDimensions = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Images.outlineImagesWithOversizedDimensions(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Outlines all images without alt attributes -WebDeveloper.Overlay.Images.outlineImagesWithoutAltAttributes = function(element) -{ - WebDeveloper.Images.outlineImagesWithoutAltAttributes(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Outlines all images without dimensions -WebDeveloper.Overlay.Images.outlineImagesWithoutDimensions = function(element) -{ - WebDeveloper.Images.outlineImagesWithEmptyAltAttributes(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Reloads images -WebDeveloper.Overlay.Images.reloadImages = function() -{ - WebDeveloper.Images.reloadImages(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Replaces all images with alt attributes -WebDeveloper.Overlay.Images.replaceImagesWithAltAttributes = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Images.replaceImagesWithAltAttributes(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Updates the disable images menu -WebDeveloper.Overlay.Images.updateDisableImagesMenu = function() -{ - var disableImageAnimations = false; - var disableImageAnimationsMenu = document.getElementById("web-developer-disable-image-animations-command"); - var disableExternalSiteImages = false; - var disableExternalSiteImagesMenu = document.getElementById("web-developer-disable-external-site-images-command"); - var disableImages = false; - var disableImagesPreference = WebDeveloper.Preferences.getIntegerPreference("permissions.default.image"); - - // If the image preference is set to 2 - if(disableImagesPreference == 2) - { - disableImages = true; - } - else if(disableImagesPreference == 3) - { - disableExternalSiteImages = true; - } - - // If the image animation preference is set to none - if(WebDeveloper.Preferences.getStringPreference("image.animation_mode") == "none") - { - disableImageAnimations = true; - } - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-disable-all-images-command"), "checked", disableImages); - WebDeveloper.Common.configureElement(disableExternalSiteImagesMenu, "checked", disableExternalSiteImages); - WebDeveloper.Common.configureElement(disableExternalSiteImagesMenu, "disabled", disableImages); - WebDeveloper.Common.configureElement(disableImageAnimationsMenu, "checked", disableImageAnimations); - WebDeveloper.Common.configureElement(disableImageAnimationsMenu, "disabled", disableImages); -}; - -// Updates the images menu -WebDeveloper.Overlay.Images.updateImagesMenu = function(suffix) -{ - var disableImages = WebDeveloper.Preferences.getIntegerPreference("permissions.default.image") == 2; - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-display-alt-attributes-command"), "disabled", disableImages); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-display-image-dimensions-command"), "disabled", disableImages); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-display-image-file-sizes-command"), "disabled", disableImages); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-display-image-paths-command"), "disabled", disableImages); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-find-broken-images-command"), "disabled", disableImages); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-hide-background-images-command"), "disabled", disableImages); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-hide-images-command"), "disabled", disableImages); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-make-images-full-size-command"), "disabled", disableImages); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-make-images-invisible-command"), "disabled", disableImages); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-outline-images-" + suffix), "disabled", disableImages); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-reload-images-command"), "disabled", disableImages); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-replace-images-with-alt-attributes-command"), "disabled", disableImages); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-view-image-information-command"), "disabled", disableImages); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-alt-attributes-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-image-dimensions-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-image-file-sizes-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-image-paths-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-hide-background-images-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-hide-images-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-replace-images-with-alt-attributes-command", "checked"); -}; - -// Updates the outline images menu -WebDeveloper.Overlay.Images.updateOutlineImagesMenu = function() -{ - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-all-images-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-background-images-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-images-with-adjusted-dimensions-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-images-with-empty-alt-attributes-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-images-with-oversized-dimensions-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-images-without-alt-attributes-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-images-without-dimensions-command", "checked"); -}; - -// Displays all the images -WebDeveloper.Overlay.Images.viewImageInformation = function() -{ - WebDeveloper.Overlay.openGeneratedTab(WebDeveloper.Common.getChromeURL("generated/view-image-information.html"), WebDeveloper.Content.getImages(), WebDeveloper.Overlay.Images.getViewImageInformationLocale()); -}; diff --git a/source/firefox/javascript/overlay/information.js b/source/firefox/javascript/overlay/information.js deleted file mode 100644 index 7b6dcac..0000000 --- a/source/firefox/javascript/overlay/information.js +++ /dev/null @@ -1,264 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.Information = WebDeveloper.Overlay.Information || {}; - -// Displays the abbreviations on a page -WebDeveloper.Overlay.Information.displayAbbreviations = function(element) -{ - WebDeveloper.Information.displayAbbreviations(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Displays the access keys on a page -WebDeveloper.Overlay.Information.displayAccessKeys = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Information.displayAccessKeys(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Displays the anchors on a page -WebDeveloper.Overlay.Information.displayAnchors = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Information.displayAnchors(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Displays the ARIA roles on a page -WebDeveloper.Overlay.Information.displayARIARoles = function(element) -{ - WebDeveloper.Information.displayARIARoles(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Displays the order of the divs on a page -WebDeveloper.Overlay.Information.displayDivOrder = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Information.displayDivOrder(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Displays the dimensions of the divs on a page -WebDeveloper.Overlay.Information.displayDivDimensions = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - var locale = WebDeveloper.Locales.setupGeneratedLocale(); - - locale.height = WebDeveloper.Locales.getString("height"); - locale.width = WebDeveloper.Locales.getString("width"); - - WebDeveloper.Information.displayDivDimensions(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()), locale); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Displays information about the selected element -WebDeveloper.Overlay.Information.displayElementInformation = function() -{ - var elementInformation = WebDeveloper.Locales.getString("elementInformation"); - - // If element information is open in the dashboard - if(WebDeveloper.Dashboard.isOpenInDashboard(elementInformation)) - { - WebDeveloper.Dashboard.closeDashboardTab(elementInformation); - } - else - { - WebDeveloper.Dashboard.openInDashboard(elementInformation, "chrome://web-developer/content/dashboard/element-information.xul"); - } -}; - -// Displays the id and class details for a page -WebDeveloper.Overlay.Information.displayIdClassDetails = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Information.displayIdClassDetails(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Displays the details for the links on a page -WebDeveloper.Overlay.Information.displayLinkDetails = function(element) -{ - WebDeveloper.Information.displayLinkDetails(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Displays the information for objects on a page -WebDeveloper.Overlay.Information.displayObjectInformation = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Information.displayObjectInformation(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Displays the stack levels on a page -WebDeveloper.Overlay.Information.displayStackLevels = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Information.displayStackLevels(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Displays the tab indices on a page -WebDeveloper.Overlay.Information.displayTabIndex = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Information.displayTabIndex(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Displays the depth of all tables on a page -WebDeveloper.Overlay.Information.displayTableDepth = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Information.displayTableDepth(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()), WebDeveloper.Locales.getString("depth")); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Displays the information for tables on a page -WebDeveloper.Overlay.Information.displayTableInformation = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Information.displayTableInformation(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Displays the title attributes on a page -WebDeveloper.Overlay.Information.displayTitleAttributes = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Information.displayTitleAttributes(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Displays the topographic information for a page -WebDeveloper.Overlay.Information.displayTopographicInformation = function(element) -{ - WebDeveloper.Information.displayTopographicInformation(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Finds all the duplicate ids on a page -WebDeveloper.Overlay.Information.findDuplicateIds = function() -{ - var locale = WebDeveloper.Locales.setupGeneratedLocale(); - - locale.duplicateId = WebDeveloper.Locales.getString("duplicateId"); - locale.duplicateIds = WebDeveloper.Locales.getString("duplicateIds"); - - WebDeveloper.Overlay.openGeneratedTab(WebDeveloper.Common.getChromeURL("generated/find-duplicate-ids.html"), WebDeveloper.Content.getDuplicateIds(), locale); -}; - -// Updates the information menu -WebDeveloper.Overlay.Information.updateInformationMenu = function() -{ - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-abbreviations-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-access-keys-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-anchors-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-div-order", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-div-size", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-id-class-details-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-link-details-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-object-information-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-stack-levels-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-tab-index-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-table-depth-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-table-information-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-title-attributes-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-topographic-information-command", "checked"); - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-display-element-information-command"), "checked", WebDeveloper.Dashboard.isOpenInDashboard(WebDeveloper.Locales.getString("elementInformation"))); -}; - -// Displays the anchor information for a page -WebDeveloper.Overlay.Information.viewAnchorInformation = function() -{ - WebDeveloper.Overlay.openGeneratedTab(WebDeveloper.Common.getChromeURL("generated/view-anchor-information.html"), WebDeveloper.Content.getAnchors(), WebDeveloper.Overlay.Information.getViewAnchorInformationLocale()); -}; - -// Displays the color information for a page -WebDeveloper.Overlay.Information.viewColorInformation = function() -{ - WebDeveloper.Overlay.openGeneratedTab(WebDeveloper.Common.getChromeURL("generated/view-color-information.html"), WebDeveloper.Content.getColors(), WebDeveloper.Overlay.Information.getViewColorInformationLocale()); -}; - -// Displays the document outline -WebDeveloper.Overlay.Information.viewDocumentOutline = function() -{ - WebDeveloper.Overlay.openGeneratedTab(WebDeveloper.Common.getChromeURL("generated/view-document-outline.html"), WebDeveloper.Content.getDocumentOutline(), WebDeveloper.Overlay.Information.getViewDocumentOutlineLocale()); -}; - -// Displays the document size -WebDeveloper.Overlay.Information.viewDocumentSize = function() -{ - var locale = WebDeveloper.Locales.setupGeneratedLocale(); - - locale.bytes = WebDeveloper.Locales.getString("bytes"); - locale.document = WebDeveloper.Locales.getString("document"); - locale.documents = WebDeveloper.Locales.getString("documents"); - locale.documentSize = WebDeveloper.Locales.getString("documentSize"); - locale.file = WebDeveloper.Locales.getString("file"); - locale.files = WebDeveloper.Locales.getString("files"); - locale.image = WebDeveloper.Locales.getString("image"); - locale.images = WebDeveloper.Locales.getString("images"); - locale.kilobytes = WebDeveloper.Locales.getString("kilobytes"); - locale.object = WebDeveloper.Locales.getString("object"); - locale.objects = WebDeveloper.Locales.getString("objects"); - locale.script = WebDeveloper.Locales.getString("script"); - locale.scripts = WebDeveloper.Locales.getString("scripts"); - locale.size = WebDeveloper.Locales.getString("size"); - locale.styleSheet = WebDeveloper.Locales.getString("styleSheet"); - locale.styleSheets = WebDeveloper.Locales.getString("styleSheets"); - locale.uncompressedSize = WebDeveloper.Locales.getString("uncompressedSize"); - - WebDeveloper.Content.getDocumentSize(function(data) - { - WebDeveloper.Overlay.openGeneratedTab(WebDeveloper.Common.getChromeURL("generated/view-document-size.html"), data, locale); - }); -}; - -// Displays the JavaScript -WebDeveloper.Overlay.Information.viewJavaScript = function() -{ - var data = WebDeveloper.Content.getJavaScript(); - - data.theme = WebDeveloper.Preferences.getExtensionStringPreference("syntax.highlight.theme"); - - WebDeveloper.Overlay.openGeneratedTab(WebDeveloper.Common.getChromeURL("generated/view-javascript.html"), data, WebDeveloper.Overlay.Information.getViewJavaScriptLocale()); -}; - -// Displays the link information for a page -WebDeveloper.Overlay.Information.viewLinkInformation = function() -{ - WebDeveloper.Overlay.openGeneratedTab(WebDeveloper.Common.getChromeURL("generated/view-link-information.html"), WebDeveloper.Content.getLinks(), WebDeveloper.Overlay.Information.getViewLinkInformationLocale()); -}; - -// Displays the meta tag information for a page -WebDeveloper.Overlay.Information.viewMetaTagInformation = function() -{ - WebDeveloper.Overlay.openGeneratedTab(WebDeveloper.Common.getChromeURL("generated/view-meta-tag-information.html"), WebDeveloper.Content.getMetaTags(), WebDeveloper.Overlay.Information.getViewMetaTagInformationLocale()); -}; - -// View page information -WebDeveloper.Overlay.Information.viewPageInformation = function() -{ - BrowserPageInfo(null); -}; - -// Displays the response headers -WebDeveloper.Overlay.Information.viewResponseHeaders = function() -{ - WebDeveloper.Overlay.openGeneratedTab(WebDeveloper.Common.getChromeURL("generated/view-response-headers.html"), WebDeveloper.Content.getDocumentDetails(), WebDeveloper.Overlay.Information.getViewResponseHeadersLocale()); -}; diff --git a/source/firefox/javascript/overlay/miscellaneous.js b/source/firefox/javascript/overlay/miscellaneous.js deleted file mode 100644 index dfde316..0000000 --- a/source/firefox/javascript/overlay/miscellaneous.js +++ /dev/null @@ -1,369 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.Miscellaneous = WebDeveloper.Overlay.Miscellaneous || {}; - -// Adds an href to the history -WebDeveloper.Overlay.Miscellaneous.addToHistory = function(link, uri) -{ - var browserHistory = Components.classes["@mozilla.org/browser/history;1"]; - - // If browser history exists - if(browserHistory) - { - browserHistory.getService(Components.interfaces.mozIAsyncHistory).isURIVisited(uri, function(addURI, alreadyVisited) - { - // If the URI is not already in the history - if(!alreadyVisited) - { - var asyncHistory = Components.classes["@mozilla.org/browser/history;1"].getService(Components.interfaces.mozIAsyncHistory); - - asyncHistory.updatePlaces({ uri: addURI, visits: [{ transitionType: Components.classes["@mozilla.org/browser/nav-history-service;1"].getService(Components.interfaces.nsINavHistoryService).TRANSITION_LINK, visitDate: new Date().getTime() }] }); - } - - WebDeveloper.Overlay.Miscellaneous.recheckLink(link); - }); - } - else - { - var globalHistory = Components.classes["@mozilla.org/browser/global-history;2"].getService(Components.interfaces.nsIGlobalHistory2); - - // If the URI is not already in the history - if(!globalHistory.isVisited(uri)) - { - globalHistory.addURI(uri, false, false, null); - } - - WebDeveloper.Overlay.Miscellaneous.recheckLink(link); - } -}; - -// Clears all private data -WebDeveloper.Overlay.Miscellaneous.clearAllPrivateData = function() -{ - Components.classes["@mozilla.org/browser/browserglue;1"].getService(Components.interfaces.nsIBrowserGlue).sanitize(window || null); -}; - -// Clears the cache -WebDeveloper.Overlay.Miscellaneous.clearCache = function() -{ - // If the clearing is confirmed - WebDeveloper.Overlay.displayConfirmation(WebDeveloper.Locales.getString("clearCache"), WebDeveloper.Locales.getString("clearCacheConfirmation"), WebDeveloper.Locales.getString("clear"), null, function() - { - // Try to clear the cache - try - { - Components.classes["@mozilla.org/netwerk/cache-storage-service;1"].getService(Components.interfaces.nsICacheStorageService).clear(); - } - catch(exception) - { - // Ignore - } - - // Try to clear the cache - try - { - Components.classes["@mozilla.org/network/cache-service;1"].getService(Components.interfaces.nsICacheService).evictEntries(Components.interfaces.nsICache.STORE_ANYWHERE); - } - catch(exception) - { - // Ignore - } - - WebDeveloper.Common.displayNotification("clearCacheResult"); - }); -}; - -// Clears the history -WebDeveloper.Overlay.Miscellaneous.clearHistory = function() -{ - // If the clearing is confirmed - WebDeveloper.Overlay.displayConfirmation(WebDeveloper.Locales.getString("clearHistory"), WebDeveloper.Locales.getString("clearHistoryConfirmation"), WebDeveloper.Locales.getString("clear"), null, function() - { - WebDeveloper.Overlay.Miscellaneous.removeAllFromHistory(); - - WebDeveloper.Common.displayNotification("clearHistoryResult"); - }); -}; - -// Clears the HTTP authentication -WebDeveloper.Overlay.Miscellaneous.clearHTTPAuthentication = function() -{ - // If the clearing is confirmed - WebDeveloper.Overlay.displayConfirmation(WebDeveloper.Locales.getString("clearHTTPAuthentication"), WebDeveloper.Locales.getString("clearHTTPAuthenticationConfirmation"), WebDeveloper.Locales.getString("clear"), null, function() - { - var authenticationManager = Components.classes["@mozilla.org/network/http-auth-manager;1"].getService(Components.interfaces.nsIHttpAuthManager); - - authenticationManager.clearAll(); - - WebDeveloper.Common.displayNotification("clearHTTPAuthenticationResult"); - }); -}; - -// Displays all hidden elements -WebDeveloper.Overlay.Miscellaneous.displayHiddenElements = function() -{ - WebDeveloper.Miscellaneous.displayHiddenElements(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Displays line guides -WebDeveloper.Overlay.Miscellaneous.displayLineGuides = function(element) -{ - // If the page has frames - if(WebDeveloper.Common.pageHasFrames()) - { - WebDeveloper.Common.displayError(WebDeveloper.Locales.getString("displayLineGuides"), WebDeveloper.Locales.getString("framesNotSupported")); - } - else - { - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.LineGuides.displayLineGuides(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Common.getContentDocument()); - WebDeveloper.Storage.toggleFeature(featureId); - } -}; - -// Displays a page magnifier -WebDeveloper.Overlay.Miscellaneous.displayPageMagnifier = function(element) -{ - // If the page has frames - if(WebDeveloper.Common.pageHasFrames()) - { - WebDeveloper.Common.displayError(WebDeveloper.Locales.getString("displayPageMagnifier"), WebDeveloper.Locales.getString("framesNotSupported")); - } - else - { - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.PageMagnifier.displayPageMagnifier(!WebDeveloper.Storage.isFeatureActive(featureId)); - WebDeveloper.Storage.toggleFeature(featureId); - } -}; - -// Displays a ruler -WebDeveloper.Overlay.Miscellaneous.displayRuler = function(element) -{ - // If the page has frames - if(WebDeveloper.Common.pageHasFrames()) - { - WebDeveloper.Common.displayError(WebDeveloper.Locales.getString("displayRuler"), WebDeveloper.Locales.getString("framesNotSupported")); - } - else - { - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Ruler.displayRuler(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Common.getContentDocument()); - WebDeveloper.Storage.toggleFeature(featureId); - } -}; - -// Edits the HTML of the page -WebDeveloper.Overlay.Miscellaneous.editHTML = function() -{ - var editHTML = WebDeveloper.Locales.getString("editHTML"); - - // If edit HTML is open in the dashboard - if(WebDeveloper.Dashboard.isOpenInDashboard(editHTML)) - { - WebDeveloper.Dashboard.closeDashboardTab(editHTML); - } - else if(WebDeveloper.Common.pageHasFrames()) - { - WebDeveloper.Common.displayError(editHTML, WebDeveloper.Locales.getString("framesNotSupported")); - } - else - { - WebDeveloper.Dashboard.openInDashboard(editHTML, WebDeveloper.Common.getChromeURL("dashboard/edit-html.xul")); - } -}; - -// Linearizes the page -WebDeveloper.Overlay.Miscellaneous.linearizePage = function(element) -{ - WebDeveloper.Miscellaneous.linearizePage(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Makes all frames resizable -WebDeveloper.Overlay.Miscellaneous.makeFramesResizable = function() -{ - WebDeveloper.Miscellaneous.makeFramesResizable(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); -}; - -// Forces the browser to recheck a link -WebDeveloper.Overlay.Miscellaneous.recheckLink = function(link) -{ - var href = link.href; - - // Force the browser to recheck the history by changing the href - link.href = ""; - link.href = href; -}; - -// Removes an href from the history -WebDeveloper.Overlay.Miscellaneous.removeFromHistory = function(link, uri) -{ - var browserHistory = Components.classes["@mozilla.org/browser/history;1"]; - - // If browser history exists - if(browserHistory) - { - browserHistory.getService(Components.interfaces.mozIAsyncHistory).isURIVisited(uri, function(removeURI, inHistory) - { - // If the URI is in the history - if(inHistory) - { - Components.classes["@mozilla.org/browser/nav-history-service;1"].getService(Components.interfaces.nsIBrowserHistory).removePage(removeURI); - } - - WebDeveloper.Overlay.Miscellaneous.recheckLink(link); - }); - } - else - { - var globalHistory = Components.classes["@mozilla.org/browser/global-history;2"]; - - // If the URI is in the history - if(globalHistory.getService(Components.interfaces.nsIGlobalHistory2).isVisited(uri)) - { - globalHistory.getService(Components.interfaces.nsIBrowserHistory).removePage(uri); - } - - WebDeveloper.Overlay.Miscellaneous.recheckLink(link); - } -}; - -// Clears the history -WebDeveloper.Overlay.Miscellaneous.removeAllFromHistory = function() -{ - var browserHistory = Components.classes["@mozilla.org/browser/nav-history-service;1"].getService(Components.interfaces.nsIBrowserHistory); - - // If browser history is set - if(browserHistory) - { - browserHistory.removeAllPages(); - } - else - { - Components.classes["@mozilla.org/browser/global-history;2"].getService(Components.interfaces.nsIBrowserHistory).removeAllPages(); - } -}; - -// Toggles all links on the page between visited and unvisited -WebDeveloper.Overlay.Miscellaneous.toggleVisitedLinks = function(visited) -{ - var documents = WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()); - var href = null; - var link = null; - var links = null; - var uri = null; - - // Loop through the documents - for(var i = 0, l = documents.length; i < l; i++) - { - links = documents[i].links; - - // Loop through all the links - for(var j = 0, m = links.length; j < m; j++) - { - link = links[j]; - href = link.href; - - // If this link has an href - if(href) - { - uri = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService).newURI(href, null, null); - - // If marking links as visited - if(visited) - { - WebDeveloper.Overlay.Miscellaneous.addToHistory(link, uri); - } - else - { - WebDeveloper.Overlay.Miscellaneous.removeFromHistory(link, uri); - } - } - } - } -}; - -// Updates the miscellaneous menu -WebDeveloper.Overlay.Miscellaneous.updateMiscellaneousMenu = function(suffix) -{ - var command = document.getElementById("web-developer-edit-html-command"); - var editHTMLOpen = WebDeveloper.Dashboard.isOpenInDashboard(WebDeveloper.Locales.getString("editHTML")); - var menu = document.getElementById("web-developer-edit-html-" + suffix); - var pageHasFrames = WebDeveloper.Common.pageHasFrames(); - - WebDeveloper.Common.configureElement(command, "checked", editHTMLOpen); - - // If the menu exists - if(menu) - { - // If edit HTML is not open and the page has frames - if(!editHTMLOpen && pageHasFrames) - { - menu.setAttribute("class", "menuitem-iconic"); - } - else if(menu.hasAttribute("class")) - { - menu.removeAttribute("class"); - } - } - - menu = document.getElementById("web-developer-display-line-guides-" + suffix); - - // If the menu exists - if(menu) - { - // If the page has frames - if(pageHasFrames) - { - menu.setAttribute("class", "menuitem-iconic"); - } - else if(menu.hasAttribute("class")) - { - menu.removeAttribute("class"); - } - } - - menu = document.getElementById("web-developer-display-page-magnifier-" + suffix); - - // If the menu exists - if(menu) - { - var canvas = document.getElementById("web-developer-page-magnifier"); - - // If the canvas is not set or has no context - if(!canvas || !canvas.getContext) - { - menu.setAttribute("class", "menuitem-iconic"); - } - else if(menu.hasAttribute("class")) - { - menu.removeAttribute("class"); - } - } - - menu = document.getElementById("web-developer-display-ruler-" + suffix); - - // If the menu exists - if(menu) - { - // If the page has frames - if(pageHasFrames) - { - menu.setAttribute("class", "menuitem-iconic"); - } - else if(menu.hasAttribute("class")) - { - menu.removeAttribute("class"); - } - } - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-display-page-magnifier-command"), "checked", !document.getElementById("web-developer-page-magnifier-toolbar").hidden); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-line-guides-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-ruler-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-linearize-page-command", "checked"); -}; diff --git a/source/firefox/javascript/overlay/options.js b/source/firefox/javascript/overlay/options.js deleted file mode 100644 index 853ebaa..0000000 --- a/source/firefox/javascript/overlay/options.js +++ /dev/null @@ -1,200 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.Options = WebDeveloper.Overlay.Options || {}; - -// Displays the about page -WebDeveloper.Overlay.Options.about = function() -{ - WebDeveloper.Overlay.openGeneratedTab(WebDeveloper.Common.getChromeURL("about/about.html"), null, WebDeveloper.Overlay.Options.getAboutLocale()); -}; - -WebDeveloper.Overlay.Options.generateCommandMenu = function(commandId) -{ - var command = document.getElementById(commandId); - var menuItem = null; - - // If the command is set - if(command) - { - menuItem = document.createElement("menuitem"); - - menuItem.setAttribute("class", "web-developer-generated-menu"); - menuItem.setAttribute("label", command.getAttribute("label")); - menuItem.setAttribute("command", commandId); - menuItem.setAttribute("type", "checkbox"); - } - - return menuItem; -}; - -// Opens the help -WebDeveloper.Overlay.Options.help = function() -{ - WebDeveloper.Common.openURL("@url@/@browser@/help/"); -}; - -// Displays the options dialog -WebDeveloper.Overlay.Options.options = function(openPane) -{ - // If an open pane is set - if(openPane) - { - window.openDialog("chrome://web-developer/content/options/options.xul", "web-developer-options-dialog", "centerscreen,chrome,dialog=yes,titlebar,toolbar", openPane); - } - else - { - window.openDialog("chrome://web-developer/content/options/options.xul", "web-developer-options-dialog", "centerscreen,chrome,dialog=yes,titlebar,toolbar"); - } -}; - -// Resets the page -WebDeveloper.Overlay.Options.resetPage = function() -{ - var tabFeature = WebDeveloper.Locales.getString("elementInformation"); - - WebDeveloper.Overlay.toggleFeatures(WebDeveloper.Common.getTabBrowser().selectedTab, true); - - // If the display element information feature is active - if(WebDeveloper.Dashboard.isOpenInDashboard(tabFeature)) - { - WebDeveloper.Dashboard.closeDashboardTab(tabFeature); - } - - tabFeature = WebDeveloper.Locales.getString("styleInformation"); - - // If the display style information feature is active - if(WebDeveloper.Dashboard.isOpenInDashboard(tabFeature)) - { - WebDeveloper.Dashboard.closeDashboardTab(tabFeature); - } - - tabFeature = WebDeveloper.Locales.getString("editCSS"); - - // If the edit CSS feature is active - if(WebDeveloper.Dashboard.isOpenInDashboard(tabFeature)) - { - WebDeveloper.Dashboard.closeDashboardTab(tabFeature); - } - - tabFeature = WebDeveloper.Locales.getString("editHTML"); - - // If the edit HTML feature is active - if(WebDeveloper.Dashboard.isOpenInDashboard(tabFeature)) - { - WebDeveloper.Dashboard.closeDashboardTab(tabFeature); - } -}; - -// Updates the active features menu -WebDeveloper.Overlay.Options.updateActiveFeaturesMenu = function(menu) -{ - var activeFeatures = WebDeveloper.Storage.getFeatures(WebDeveloper.Common.getTabBrowser().selectedTab); - var menuItem = null; - var separator = menu.getElementsByTagName("menuseparator")[0]; - - WebDeveloper.Overlay.removeGeneratedMenuItems(menu); - - // If the separator exists - if(separator) - { - // If there are active features - if(activeFeatures) - { - activeFeatures.sort(); - - // Loop through the active features - for(var i = 0, l = activeFeatures.length; i < l; i++) - { - menuItem = WebDeveloper.Overlay.Options.generateCommandMenu(WebDeveloper.Common.getCommandId(activeFeatures[i])); - - // If the menu item is set - if(menuItem) - { - menu.insertBefore(menuItem, separator); - } - } - } - - // If the edit CSS feature is active - if(WebDeveloper.Dashboard.isOpenInDashboard(WebDeveloper.Locales.getString("editCSS"))) - { - menuItem = WebDeveloper.Overlay.Options.generateCommandMenu("web-developer-edit-css-command"); - - // If the menu item is set - if(menuItem) - { - menu.insertBefore(menuItem, separator); - } - } - - // If the edit HTML feature is active - if(WebDeveloper.Dashboard.isOpenInDashboard(WebDeveloper.Locales.getString("editHTML"))) - { - menuItem = WebDeveloper.Overlay.Options.generateCommandMenu("web-developer-edit-html-command"); - - // If the menu item is set - if(menuItem) - { - menu.insertBefore(menuItem, separator); - } - } - - // If the element information feature is active - if(WebDeveloper.Dashboard.isOpenInDashboard(WebDeveloper.Locales.getString("elementInformation"))) - { - menuItem = WebDeveloper.Overlay.Options.generateCommandMenu("web-developer-display-element-information-command"); - - // If the menu item is set - if(menuItem) - { - menu.insertBefore(menuItem, separator); - } - } - - // If the style information feature is active - if(WebDeveloper.Dashboard.isOpenInDashboard(WebDeveloper.Locales.getString("styleInformation"))) - { - menuItem = WebDeveloper.Overlay.Options.generateCommandMenu("web-developer-display-style-information-command"); - - // If the menu item is set - if(menuItem) - { - menu.insertBefore(menuItem, separator); - } - } - } -}; - -// Updates the options menu -WebDeveloper.Overlay.Options.updateOptionsMenu = function(suffix) -{ - var activeFeatures = WebDeveloper.Storage.hasFeatures(); - - // If there are no active features - if(!activeFeatures) - { - activeFeatures = WebDeveloper.Dashboard.isOpenInDashboard(WebDeveloper.Locales.getString("editCSS")); - } - - // If there are no active features - if(!activeFeatures) - { - activeFeatures = WebDeveloper.Dashboard.isOpenInDashboard(WebDeveloper.Locales.getString("editHTML")); - } - - // If there are no active features - if(!activeFeatures) - { - activeFeatures = WebDeveloper.Dashboard.isOpenInDashboard(WebDeveloper.Locales.getString("elementInformation")); - } - - // If there are no active features - if(!activeFeatures) - { - activeFeatures = WebDeveloper.Dashboard.isOpenInDashboard(WebDeveloper.Locales.getString("styleInformation")); - } - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-active-features-" + suffix), "disabled", !activeFeatures); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-pin-features-command"), "checked", WebDeveloper.Preferences.getExtensionBooleanPreference("pin.features")); -}; diff --git a/source/firefox/javascript/overlay/outline.js b/source/firefox/javascript/overlay/outline.js deleted file mode 100644 index b69530f..0000000 --- a/source/firefox/javascript/overlay/outline.js +++ /dev/null @@ -1,156 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.Outline = WebDeveloper.Overlay.Outline || {}; - -// Outlines all block level elements -WebDeveloper.Overlay.Outline.outlineBlockLevelElements = function(element) -{ - WebDeveloper.Outline.outlineBlockLevelElements(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()), WebDeveloper.Preferences.getExtensionBooleanPreference("outline.show.element.tag.names")); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Outlines the specified elements -WebDeveloper.Overlay.Outline.outlineCustomElements = function(element) -{ - var elementId = element.getAttribute("id"); - var featureId = WebDeveloper.Common.getFeatureId(elementId); - - // If custom elements are already being outlined - if(WebDeveloper.Storage.isFeatureActive(featureId)) - { - var contentDocument = null; - var documents = WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()); - - // Loop through the documents - for(var i = 0, l = documents.length; i < l; i++) - { - contentDocument = documents[i]; - - WebDeveloper.Common.removeMatchingElements("#web-developer-outline-custom-elements", contentDocument); - - // If showing element tag names - if(WebDeveloper.Preferences.getExtensionBooleanPreference("outline.show.element.tag.names")) - { - WebDeveloper.Common.toggleStyleSheet("features/style-sheets/before.css", "web-developer-outline-custom-elements-before", contentDocument, false); - } - } - - WebDeveloper.Storage.toggleFeature(featureId); - } - else - { - window.openDialog("chrome://web-developer/content/dialogs/outline-custom-elements.xul", "web-developer-outline-dialog", "centerscreen,chrome,modal", featureId); - } -}; - -// Outlines all deprecated elements -WebDeveloper.Overlay.Outline.outlineDeprecatedElements = function(element) -{ - WebDeveloper.Outline.outlineDeprecatedElements(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()), WebDeveloper.Preferences.getExtensionBooleanPreference("outline.show.element.tag.names")); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Outlines all external links -WebDeveloper.Overlay.Outline.outlineExternalLinks = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Outline.outlineExternalLinks(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Outlines all floated elements -WebDeveloper.Overlay.Outline.outlineFloatedElements = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Outline.outlineFloatedElements(!WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Outlines all frames -WebDeveloper.Overlay.Outline.outlineFrames = function(element) -{ - WebDeveloper.Outline.outlineFrames(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Outlines all headings -WebDeveloper.Overlay.Outline.outlineHeadings = function(element) -{ - WebDeveloper.Outline.outlineHeadings(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()), WebDeveloper.Preferences.getExtensionBooleanPreference("outline.show.element.tag.names")); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Outlines all non-secure elements -WebDeveloper.Overlay.Outline.outlineNonSecureElements = function(element) -{ - WebDeveloper.Outline.outlineNonSecureElements(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Outlines all positioned elements -WebDeveloper.Overlay.Outline.outlinePositionedElements = function(positionType, element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.Outline.outlinePositionedElements(positionType, !WebDeveloper.Storage.isFeatureActive(featureId), WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Outlines all tables -WebDeveloper.Overlay.Outline.outlineTables = function(element) -{ - WebDeveloper.Outline.outlineTables(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Outlines all table captions -WebDeveloper.Overlay.Outline.outlineTableCaptions = function(element) -{ - WebDeveloper.Outline.outlineTableCaptions(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow())); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Outlines all table cells -WebDeveloper.Overlay.Outline.outlineTableCells = function(element) -{ - WebDeveloper.Outline.outlineTableCells(WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()), WebDeveloper.Preferences.getExtensionBooleanPreference("outline.show.element.tag.names")); - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Toggles whether to show element tag names when outlining -WebDeveloper.Overlay.Outline.toggleShowElementTagNames = function(element) -{ - WebDeveloper.Preferences.disableExtensionPreference(element, "outline.show.element.tag.names"); -}; - -// Updates the outline menu -WebDeveloper.Overlay.Outline.updateOutlineMenu = function() -{ - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-block-level-elements-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-custom-elements-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-deprecated-elements-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-external-links-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-floated-elements-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-frames-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-headings-command", "checked"); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-outline-show-element-tag-names-command"), "checked", WebDeveloper.Preferences.getExtensionBooleanPreference("outline.show.element.tag.names")); -}; - -// Updates the outline positioned elements menu -WebDeveloper.Overlay.Outline.updateOutlinePositionedElementsMenu = function() -{ - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-absolute-positioned-elements-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-fixed-positioned-elements-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-relative-positioned-elements-command", "checked"); -}; - -// Updates the outline tables menu -WebDeveloper.Overlay.Outline.updateOutlineTablesMenu = function() -{ - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-all-tables-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-table-captions-command", "checked"); - WebDeveloper.Overlay.configureFeatureElement("web-developer-outline-table-cells-command", "checked"); -}; diff --git a/source/firefox/javascript/overlay/overlay.js b/source/firefox/javascript/overlay/overlay.js deleted file mode 100644 index 01a7929..0000000 --- a/source/firefox/javascript/overlay/overlay.js +++ /dev/null @@ -1,949 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.errorThrottle = 500; -WebDeveloper.Overlay.featureSuffixes = ["app-menu", "context", "menu", "toolbar", "toolbar-button"]; -WebDeveloper.Overlay.lastCSSErrorTime = null; -WebDeveloper.Overlay.lastJavaScriptErrorTime = null; -WebDeveloper.Overlay.preferenceBranch = null; - -// Closes the confirmation -WebDeveloper.Overlay.closeConfirmation = function() -{ - // Ignore -}; - -// Configures an element for a feature -WebDeveloper.Overlay.configureFeatureElement = function(id, attribute) -{ - WebDeveloper.Common.configureElement(document.getElementById(id), attribute, WebDeveloper.Storage.isFeatureActive(WebDeveloper.Common.getFeatureId(id))); -}; - -// Displays a confirmation dialog -WebDeveloper.Overlay.displayConfirmation = function(title, message, buttonText, buttonIcon, callback) -{ - // If the hide confirmation dialogs preference is set - if(WebDeveloper.Preferences.getExtensionBooleanPreference("confirmation.dialogs.hide")) - { - callback(); - } - else - { - var checkBox = { value: false }; - var promptService = Components.interfaces.nsIPromptService; - var result = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(promptService).confirmEx(null, title, message, promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_0 + promptService.BUTTON_TITLE_CANCEL * promptService.BUTTON_POS_1, buttonText, null, null, WebDeveloper.Locales.getString("stopConfirmation"), checkBox); - - // If the check box was checked - if(checkBox.value) - { - WebDeveloper.Preferences.setExtensionBooleanPreference("confirmation.dialogs.hide", true); - } - - // If the question was confirmed - if(result === 0) - { - callback(); - } - } -}; - -// Initializes the extension -WebDeveloper.Overlay.initialize = function() -{ - // Try to get the tab browser - try - { - var tabBrowser = WebDeveloper.Common.getTabBrowser(); - - // If the tab browser is set - if(tabBrowser) - { - var consoleService = Components.classes["@mozilla.org/consoleservice;1"].getService().QueryInterface(Components.interfaces.nsIConsoleService); - var tabContainer = tabBrowser.tabContainer; - - WebDeveloper.Overlay.preferenceBranch = WebDeveloper.Preferences.getExtensionBranch().QueryInterface(Components.interfaces.nsIPrefBranch2); - - WebDeveloper.Upgrade.upgrade(); - WebDeveloper.Overlay.setupKeyboardShortcuts(); - WebDeveloper.Overlay.updateChrome(); - - tabBrowser.addEventListener("load", WebDeveloper.Overlay.pageLoad, true); - tabBrowser.addEventListener("unload", WebDeveloper.Overlay.pageUnload, true); - - // If the tab container is set - if(tabContainer) - { - tabContainer.addEventListener("TabSelect", WebDeveloper.Overlay.tabSelect, false); - } - - // If the console service is set - if(consoleService) - { - consoleService.registerListener(WebDeveloper.Overlay.ErrorConsoleListener); - } - - // If the preference branch is set - if(WebDeveloper.Overlay.preferenceBranch) - { - WebDeveloper.Overlay.preferenceBranch.addObserver("", WebDeveloper.Overlay.PreferenceObserver, false); - } - - window.removeEventListener("load", WebDeveloper.Overlay.initialize, false); - } - } - catch(exception) - { - // Ignore - } -}; - -// Returns true if the DOM Inspector is available -WebDeveloper.Overlay.isDOMInspectorAvailable = function() -{ - // Try to load the DOM Inspector - try - { - Components.classes["@mozilla.org/inspector/dom-utils;1"].getService(Components.interfaces.inIDOMUtils); - - return true; - } - catch(exception) - { - // Ignore - } - - return false; -}; - -// Opens the browser console -WebDeveloper.Overlay.openBrowserConsole = function() -{ - // Try to use the dev tools browser - try - { - gDevToolsBrowser.selectToolCommand(WebDeveloper.Common.getTabBrowser(), "webconsole"); - } - catch(exception) - { - toJavaScriptConsole(); - } -}; - -// Opens a generated tab -WebDeveloper.Overlay.openGeneratedTab = function(url, data, locale) -{ - var tab = WebDeveloper.Common.getTabBrowser().getBrowserForTab(WebDeveloper.Common.openURL(url)); - var load = (function(dataContent, localeContent) - { - var handler = function() - { - var contentDocument = tab.contentDocument; - var dispatchEvent = contentDocument.createEvent("Events"); - var headElement = WebDeveloper.Common.getDocumentHeadElement(contentDocument); - - dispatchEvent.initEvent("web-developer-generated-event", true, false); - headElement.setAttribute("data-web-developer", JSON.stringify(dataContent)); - headElement.setAttribute("data-web-developer-locale", JSON.stringify(localeContent)); - headElement.dispatchEvent(dispatchEvent); - - tab.removeEventListener("load", handler, true); - }; - - return handler; - })(data, locale); - - tab.addEventListener("load", load, true); -}; - -// Opens a toolbar button automatically if another toolbar button is open on the toolbar -WebDeveloper.Overlay.openToolbarButton = function(currentToolbarButton) -{ - // If the toolbar button is set and is not open - if(currentToolbarButton && !currentToolbarButton.open) - { - var toolbarButton = null; - var toolbarButtons = currentToolbarButton.parentNode.getElementsByTagName("toolbarbutton"); - - // Loop through the toolbar buttons - for(var i = 0, l = toolbarButtons.length; i < l; i++) - { - toolbarButton = toolbarButtons.item(i); - - // If the toolbar button is set, is not the same toolbar button and is open - if(toolbarButton && toolbarButton != currentToolbarButton && toolbarButton.open) - { - toolbarButton.open = false; - currentToolbarButton.open = true; - - break; - } - } - } -}; - -// Handles the page being loaded -WebDeveloper.Overlay.pageLoad = function(event) -{ - var originalTarget = event.originalTarget; - - // If the event came from an HTML document and it is not a frame - if(originalTarget instanceof HTMLDocument && !originalTarget.defaultView.frameElement) - { - var loadBrowser = WebDeveloper.Common.getTabBrowser().getBrowserForDocument(originalTarget); - var tab = WebDeveloper.Common.getTabForDocument(originalTarget); - - WebDeveloper.Overlay.updateMetaRedirects(loadBrowser); - - // If pinning features - if(WebDeveloper.Preferences.getExtensionBooleanPreference("pin.features")) - { - WebDeveloper.Overlay.toggleFeatures(tab, false); - } - else - { - WebDeveloper.Storage.deleteFeatures(tab); - WebDeveloper.ElementAncestors.removeToolbar(); - WebDeveloper.PageValidation.removeToolbar(); - } - - // If the selected browser is the one that loaded - if(WebDeveloper.Common.getSelectedBrowser() == loadBrowser) - { - WebDeveloper.Overlay.updateRenderMode(); - } - } -}; - -// Handles the page being unloaded -WebDeveloper.Overlay.pageUnload = function(event) -{ - var originalTarget = event.originalTarget; - - // If the event came from an HTML document and it is not a frame - if(originalTarget instanceof HTMLDocument && !originalTarget.defaultView.frameElement) - { - WebDeveloper.Common.clearNotification(); - WebDeveloper.Overlay.updateCSSStatus(); - WebDeveloper.Overlay.updateJavaScriptStatus(); - } -}; - -// Removes all the generated menu items from the menu -WebDeveloper.Overlay.removeGeneratedMenuItems = function(menu) -{ - var generatedMenuItems = []; - var menuItem = null; - var menuItems = menu.childNodes; - - // Loop through the menu items - for(var i = 0, l = menuItems.length; i < l; i++) - { - menuItem = menuItems.item(i); - - // If this is a generated menu item - if(menuItem && menuItem.hasAttribute("class") && menuItem.getAttribute("class") == "web-developer-generated-menu") - { - generatedMenuItems.push(menuItem); - } - } - - // Loop through the generated menu items - for(i = 0, l = generatedMenuItems.length; i < l; i++) - { - menu.removeChild(generatedMenuItems[i]); - } -}; - -// Removes all the keyboard shortcuts for the extension -WebDeveloper.Overlay.removeKeyboardShortcuts = function(keySet) -{ - var extensionKeys = keySet.getElementsByClassName("web-developer-key"); - - // While there are extension keys remaining - while(extensionKeys.length) - { - keySet.removeChild(extensionKeys[0]); - } -}; - -// Resets the CSS status button -WebDeveloper.Overlay.resetCSSStatus = function() -{ - var cssButton = document.getElementById("web-developer-css-statusbar"); - - // If the CSS button exists - if(cssButton) - { - // If the CSS button has a class attribute - if(cssButton.hasAttribute("class")) - { - cssButton.removeAttribute("class"); - } - - // If the CSS button has a tooltip text attribute - if(cssButton.hasAttribute("tooltiptext")) - { - cssButton.removeAttribute("tooltiptext"); - } - - // If the toolbar preference is set to text and the CSS button has a label attribute - if(WebDeveloper.Preferences.getExtensionStringPreference("toolbar.icons") == "text" && cssButton.hasAttribute("label")) - { - cssButton.removeAttribute("label"); - } - } -}; - -// Resets the JavaScript status button -WebDeveloper.Overlay.resetJavaScriptStatus = function() -{ - var javaScriptButton = document.getElementById("web-developer-javascript-statusbar"); - - // If the JavaScript button exists - if(javaScriptButton) - { - // If JavaScript is enabled - if(WebDeveloper.Preferences.getBooleanPreference("javascript.enabled")) - { - // If the JavaScript button has a class attribute - if(javaScriptButton.hasAttribute("class")) - { - javaScriptButton.removeAttribute("class"); - } - - // If the JavaScript button has a tooltip text attribute - if(javaScriptButton.hasAttribute("tooltiptext")) - { - javaScriptButton.removeAttribute("tooltiptext"); - } - - // If the toolbar preference is set to text and the JavaScript button has a label attribute - if(WebDeveloper.Preferences.getExtensionStringPreference("toolbar.icons") == "text" && javaScriptButton.hasAttribute("label")) - { - javaScriptButton.removeAttribute("label"); - } - } - else if(!javaScriptButton.hasAttribute("class") || javaScriptButton.getAttribute("class") != "disabled") - { - javaScriptButton.setAttribute("class", "disabled"); - javaScriptButton.setAttribute("tooltiptext", WebDeveloper.Locales.getString("javaScriptDisabledTooltip")); - - // If the toolbar preference is set to text - if(WebDeveloper.Preferences.getExtensionStringPreference("toolbar.icons") == "text") - { - javaScriptButton.setAttribute("label", WebDeveloper.Locales.getString("javaScriptDisabledLabel")); - } - } - } -}; - -// Sets up the feature keyboard shortcuts -WebDeveloper.Overlay.setupFeatureKeyboardShortcuts = function(keySet) -{ - var feature = null; - var featureElement = null; - var key = null; - var keyElement = null; - var keyId = null; - var modifiers = null; - - // Loop through the tools - for(var i = 1, l = WebDeveloper.Preferences.getExtensionIntegerPreference("keyboard.count"); i <= l; i++) - { - feature = WebDeveloper.Preferences.getExtensionStringPreference("keyboard." + i + ".feature"); - key = WebDeveloper.Preferences.getLocalizedPreference("keyboard." + i + ".key"); - modifiers = WebDeveloper.Preferences.getExtensionStringPreference("keyboard." + i + ".modifiers"); - - // If the feature, key and modifiers are set - if(feature && key && modifiers) - { - keyElement = document.createElement("key"); - keyId = "web-developer-" + feature + "-key"; - - keyElement.setAttribute("class", "web-developer-key"); - keyElement.setAttribute("command", "web-developer-" + feature + "-command"); - keyElement.setAttribute("id", keyId); - keyElement.setAttribute("key", key); - keyElement.setAttribute("modifiers", modifiers); - - keySet.appendChild(keyElement); - - // Loop through the feature suffixes - for(var j = 0, m = WebDeveloper.Overlay.featureSuffixes.length; j < m; j++) - { - featureElement = document.getElementById("web-developer-" + feature + "-" + WebDeveloper.Overlay.featureSuffixes[j]); - - // If the feature element is set - if(featureElement) - { - featureElement.setAttribute("key", keyId); - } - } - } - } -}; - -// Sets up the keyboard shortcuts -WebDeveloper.Overlay.setupKeyboardShortcuts = function() -{ - var keySet = document.getElementById("mainKeyset"); - - WebDeveloper.Overlay.removeKeyboardShortcuts(keySet); - WebDeveloper.Overlay.setupFeatureKeyboardShortcuts(keySet); - WebDeveloper.Overlay.setupResizeKeyboardShortcuts(keySet); - WebDeveloper.Overlay.setupToolsKeyboardShortcuts(keySet); - WebDeveloper.Overlay.setupViewSourceWithKeyboardShortcuts(keySet); -}; - -// Sets up the resize keyboard shortcuts -WebDeveloper.Overlay.setupResizeKeyboardShortcuts = function(keySet) -{ - var description = null; - var height = null; - var key = null; - var keyElement = null; - var modifiers = null; - var viewport = null; - var width = null; - - // Loop through the possible resize options - for(var i = 1, l = WebDeveloper.Preferences.getExtensionIntegerPreference("resize.count"); i <= l; i++) - { - description = WebDeveloper.Preferences.getLocalizedPreference("resize." + i + ".description"); - height = WebDeveloper.Preferences.getExtensionIntegerPreference("resize." + i + ".height"); - width = WebDeveloper.Preferences.getExtensionIntegerPreference("resize." + i + ".width"); - - // If the description, height and width are set - if(description && height > 0 && width > 0) - { - key = WebDeveloper.Preferences.getExtensionStringPreference("resize." + i + ".key"); - modifiers = WebDeveloper.Preferences.getExtensionStringPreference("resize." + i + ".modifiers"); - viewport = WebDeveloper.Preferences.getExtensionBooleanPreference("resize." + i + ".viewport"); - - // If a key and modifiers are set - if(key && modifiers) - { - keyElement = document.createElement("key"); - - keyElement.setAttribute("class", "web-developer-key"); - keyElement.setAttribute("id", "web-developer-resize-" + i + "-key"); - keyElement.setAttribute("key", key); - keyElement.setAttribute("modifiers", modifiers); - keyElement.setAttribute("oncommand", "WebDeveloper.Overlay.Resize.resizeWindow(" + width + ", " + height + ", " + viewport + ")"); - - keySet.appendChild(keyElement); - } - } - } -}; - -// Sets up the tools keyboard shortcuts -WebDeveloper.Overlay.setupToolsKeyboardShortcuts = function(keySet) -{ - var description = null; - var key = null; - var keyElement = null; - var modifiers = null; - var path = null; - var url = null; - - // Loop through the tools - for(var i = 1, l = WebDeveloper.Preferences.getExtensionIntegerPreference("tool.count"); i <= l; i++) - { - // If this is not a separator - if(!WebDeveloper.Preferences.getExtensionBooleanPreference("tool." + i + ".separator")) - { - description = WebDeveloper.Preferences.getLocalizedPreference("tool." + i + ".description"); - path = WebDeveloper.Preferences.getExtensionStringPreference("tool." + i + ".path"); - url = WebDeveloper.Preferences.getExtensionStringPreference("tool." + i + ".url"); - - // If the description and either a path or url are set - if(description && path || url) - { - key = WebDeveloper.Preferences.getLocalizedPreference("tool." + i + ".key"); - modifiers = WebDeveloper.Preferences.getExtensionStringPreference("tool." + i + ".modifiers"); - - // If a key and modifiers are set - if(key && modifiers) - { - keyElement = document.createElement("key"); - - keyElement.setAttribute("class", "web-developer-key"); - keyElement.setAttribute("id", "web-developer-tools-" + i + "-key"); - keyElement.setAttribute("key", key); - keyElement.setAttribute("modifiers", modifiers); - - // If the path is set - if(path) - { - keyElement.setAttribute("oncommand", "WebDeveloper.Overlay.Tools.loadApplicationWithURL('" + path.replace(/\\/gi, "\\\\") + "', WebDeveloper.Common.getTabBrowser().currentURI.spec)"); - } - else - { - keyElement.setAttribute("oncommand", "WebDeveloper.Common.openURL('" + url + "' + encodeURIComponent(WebDeveloper.Common.getTabBrowser().currentURI.spec))"); - } - - keySet.appendChild(keyElement); - } - } - } - } -}; - -// Sets up the view source with keyboard shortcuts -WebDeveloper.Overlay.setupViewSourceWithKeyboardShortcuts = function(keySet) -{ - var description = null; - var key = null; - var keyElement = null; - var modifiers = null; - var path = null; - - // Loop through the view source with options - for(var i = 1; i <= WebDeveloper.Preferences.getExtensionIntegerPreference("view.source.with.count"); i++) - { - description = WebDeveloper.Preferences.getExtensionStringPreference("view.source.with." + i + ".description"); - path = WebDeveloper.Preferences.getExtensionStringPreference("view.source.with." + i + ".path"); - - // If the description and path are set - if(description && path) - { - key = WebDeveloper.Preferences.getExtensionStringPreference("view.source.with." + i + ".key"); - modifiers = WebDeveloper.Preferences.getExtensionStringPreference("view.source.with." + i + ".modifiers"); - - // If a key and modifiers are set - if(key && modifiers) - { - keyElement = document.createElement("key"); - - keyElement.setAttribute("class", "web-developer-key"); - keyElement.setAttribute("id", "web-developer-view-source-with-" + i + "-key"); - keyElement.setAttribute("key", key); - keyElement.setAttribute("modifiers", modifiers); - keyElement.setAttribute("oncommand", "WebDeveloper.Overlay.ViewSource.loadApplicationWithSource('" + path.replace(/\\/gi, "\\\\") + "')"); - - keySet.appendChild(keyElement); - } - } - } -}; - -// Handles a tab being selected -WebDeveloper.Overlay.tabSelect = function() -{ - var elementInformationToolbar = document.getElementById("web-developer-element-information-toolbar"); - - // If the element information toolbar is set - if(elementInformationToolbar) - { - // If a feature that uses the element information toolbar is active - if(WebDeveloper.Dashboard.isOpenInDashboard(WebDeveloper.Locales.getString("elementInformation")) || WebDeveloper.Dashboard.isOpenInDashboard(WebDeveloper.Locales.getString("styleInformation"))) - { - elementInformationToolbar.hidden = false; - } - else - { - elementInformationToolbar.hidden = true; - } - } - - WebDeveloper.Overlay.resetCSSStatus(); - WebDeveloper.Overlay.resetJavaScriptStatus(); - WebDeveloper.Overlay.updateRenderMode(); -}; - -// Toggles the features -WebDeveloper.Overlay.toggleFeatures = function(tab, reset) -{ - var feature = null; - var features = WebDeveloper.Storage.getFeatures(tab); - - // If the features are set - if(features) - { - // Loop through the features - for(var i = 0, l = features.length; i < l; i++) - { - feature = features[i]; - - // If not resetting features - if(!reset) - { - WebDeveloper.Storage.toggleFeature(feature, tab); - } - - document.getElementById(WebDeveloper.Common.getCommandId(feature)).doCommand(); - } - } -}; - -// Toggles the toolbar -WebDeveloper.Overlay.toggleToolbar = function(event) -{ - // If there is no event or it came from the button - if(!event || event.target.getAttribute("id") == "web-developer-button") - { - var toolbar = document.getElementById("web-developer-toolbar"); - - toolbar.collapsed = !toolbar.collapsed; - - document.persist("web-developer-toolbar", "collapsed"); - } -}; - -// Uninitializes the extension -WebDeveloper.Overlay.uninitialize = function() -{ - // Try to get the tab browser - try - { - var tabBrowser = WebDeveloper.Common.getTabBrowser(); - - // If the tab browser is set - if(tabBrowser) - { - var consoleService = Components.classes["@mozilla.org/consoleservice;1"].getService().QueryInterface(Components.interfaces.nsIConsoleService); - var tabContainer = tabBrowser.tabContainer; - - tabBrowser.removeEventListener("load", WebDeveloper.Overlay.pageLoad, true); - tabBrowser.removeEventListener("unload", WebDeveloper.Overlay.pageUnload, true); - - // If the tab container is set - if(tabContainer) - { - tabContainer.removeEventListener("TabSelect", WebDeveloper.Overlay.tabSelect, false); - } - - // If the console service is set - if(consoleService) - { - consoleService.unregisterListener(WebDeveloper.Overlay.ErrorConsoleListener); - } - - // If the preference branch is set - if(WebDeveloper.Overlay.preferenceBranch) - { - WebDeveloper.Overlay.preferenceBranch.removeObserver("", WebDeveloper.Overlay.PreferenceObserver); - } - - window.removeEventListener("unload", WebDeveloper.Overlay.uninitialize, false); - } - } - catch(exception) - { - // Ignore - } -}; - -// Updates the chrome -WebDeveloper.Overlay.updateChrome = function() -{ - var hideContextMenuPreference = WebDeveloper.Preferences.getExtensionBooleanPreference("context.hide"); - var hideMenuPreference = WebDeveloper.Preferences.getExtensionBooleanPreference("menu.hide"); - var toolbar = document.getElementById("web-developer-toolbar"); - - // If the toolbar exists - if(toolbar) - { - var toolbarButtons = toolbar.getElementsByTagName("toolbarbutton"); - var toolbarButtonsLength = toolbarButtons.length; - var toolbarPreference = WebDeveloper.Preferences.getExtensionStringPreference("toolbar.icons"); - - toolbar.setAttribute("mode", toolbarPreference); - - // If the toolbar preference is set to icons - if(toolbarPreference == "icons") - { - toolbarPreference = "pictures"; - } - - toolbar.setAttribute("buttonstyle", toolbarPreference); - - // Loop through the toolbar buttons - for(var i = 0; i < toolbarButtonsLength; i++) - { - toolbarButtons[i].setAttribute("buttonstyle", toolbarPreference); - } - - // If the toolbar preference is not set to text - if(toolbarPreference != "text") - { - WebDeveloper.Common.removeElementAttribute(document.getElementById("web-developer-css-statusbar"), "label"); - WebDeveloper.Common.removeElementAttribute(document.getElementById("web-developer-javascript-statusbar"), "label"); - WebDeveloper.Common.removeElementAttribute(document.getElementById("web-developer-render-mode-statusbar"), "label"); - } - } - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-app-menu"), "hidden", hideMenuPreference); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-context"), "hidden", hideContextMenuPreference); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-context-separator1"), "hidden", hideContextMenuPreference); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-menu"), "hidden", hideMenuPreference); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-seamonkey"), "hidden", hideMenuPreference); - - // If the extension is running on a Mac - if(WebDeveloper.Common.isMac()) - { - var color = WebDeveloper.Preferences.getExtensionBooleanPreference("toolbar.color"); - var toolbars = document.querySelectorAll(".web-developer-toolbar"); - - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-app-menu"), "color", color); - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-button"), "color", color); - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-context"), "color", color); - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-menu"), "color", color); - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-seamonkey"), "color", color); - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-toolbar"), "color", color); - - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-cookies-toolbar"), "color", color); - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-css-toolbar"), "color", color); - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-disable-toolbar"), "color", color); - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-forms-toolbar"), "color", color); - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-images-toolbar"), "color", color); - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-information-toolbar"), "color", color); - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-miscellaneous-toolbar"), "color", color); - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-options-toolbar"), "color", color); - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-outline-toolbar"), "color", color); - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-resize-toolbar"), "color", color); - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-tools-toolbar"), "color", color); - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-view-source-toolbar"), "color", color); - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-css-statusbar"), "web-developer-color", color); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-javascript-statusbar"), "web-developer-color", color); - WebDeveloper.Common.configureElement(document.getElementById("web-developer-render-mode-statusbar"), "web-developer-color", color); - - // Loop through the toolbars - for(var j = 0, m = toolbars.length; j < m; j++) - { - WebDeveloper.Common.toggleClass(toolbars[j], "color", color); - } - - WebDeveloper.Common.toggleClass(document.getElementById("web-developer-dashboard"), "color", color); - } -}; - -// Updates the CSS status button -WebDeveloper.Overlay.updateCSSStatus = function(error) -{ - var time = new Date().getTime(); - - // If the last CSS error time is not set or is longer ago than the throttle - if(!WebDeveloper.Overlay.lastCSSErrorTime || time - WebDeveloper.Overlay.lastCSSErrorTime > WebDeveloper.Overlay.errorThrottle) - { - var cssButton = document.getElementById("web-developer-css-statusbar"); - - WebDeveloper.Overlay.lastCSSErrorTime = time; - - // If the CSS button is set - if(cssButton) - { - // If the error is set - if(error) - { - var errorMessage = error.errorMessage; - - cssButton.setAttribute("tooltiptext", WebDeveloper.Locales.getFormattedString("cssErrorTooltip", [errorMessage])); - - // If the CSS button does not have a class attribute or it is not set to error - if(!cssButton.hasAttribute("class") || cssButton.getAttribute("class") != "error") - { - cssButton.setAttribute("class", "error"); - - // If the toolbar preference is set to text - if(WebDeveloper.Preferences.getExtensionStringPreference("toolbar.icons") == "text") - { - cssButton.setAttribute("label", WebDeveloper.Locales.getString("cssErrorLabel")); - } - } - } - else if(!cssButton.hasAttribute("class") || cssButton.getAttribute("class") != "valid") - { - cssButton.setAttribute("class", "valid"); - cssButton.setAttribute("tooltiptext", WebDeveloper.Locales.getString("cssNoErrorsTooltip")); - - // If the toolbar preference is set to text - if(WebDeveloper.Preferences.getExtensionStringPreference("toolbar.icons") == "text") - { - cssButton.setAttribute("label", WebDeveloper.Locales.getString("cssNoErrorsLabel")); - } - } - } - } -}; - -// Updates the JavaScript status button -WebDeveloper.Overlay.updateJavaScriptStatus = function(error) -{ - var time = new Date().getTime(); - - // If the last error time is not set or is longer ago than the throttle - if(!WebDeveloper.Overlay.lastJavaScriptErrorTime || time - WebDeveloper.Overlay.lastJavaScriptErrorTime > WebDeveloper.Overlay.errorThrottle) - { - var javaScriptButton = document.getElementById("web-developer-javascript-statusbar"); - - WebDeveloper.Overlay.lastJavaScriptErrorTime = time; - - // If the JavaScript button is set - if(javaScriptButton) - { - // If the error is set - if(error) - { - var errorMessage = error.errorMessage; - var warning = error.flags & error.warningFlag !== 0; - - // If this is a warning - if(warning) - { - javaScriptButton.setAttribute("tooltiptext", WebDeveloper.Locales.getFormattedString("javaScriptWarningTooltip", [errorMessage])); - - // If the JavaScript button does not have a class attribute or it is not set to warning - if(!javaScriptButton.hasAttribute("class") || javaScriptButton.getAttribute("class") != "warning") - { - javaScriptButton.setAttribute("class", "warning"); - - // If the toolbar preference is set to text - if(WebDeveloper.Preferences.getExtensionStringPreference("toolbar.icons") == "text") - { - javaScriptButton.setAttribute("label", WebDeveloper.Locales.getString("javaScriptWarningLabel")); - } - } - } - else - { - javaScriptButton.setAttribute("tooltiptext", WebDeveloper.Locales.getFormattedString("javaScriptErrorTooltip", [errorMessage])); - - // If the JavaScript button does not have a class attribute or it is not set to error - if(!javaScriptButton.hasAttribute("class") || javaScriptButton.getAttribute("class") != "error") - { - javaScriptButton.setAttribute("class", "error"); - - // If the toolbar preference is set to text - if(WebDeveloper.Preferences.getExtensionStringPreference("toolbar.icons") == "text") - { - javaScriptButton.setAttribute("label", WebDeveloper.Locales.getString("javaScriptErrorLabel")); - } - } - } - } - } - else if(!javaScriptButton.hasAttribute("class") || javaScriptButton.getAttribute("class") != "disabled" && javaScriptButton.getAttribute("class") != "valid") - { - javaScriptButton.setAttribute("class", "valid"); - javaScriptButton.setAttribute("tooltiptext", WebDeveloper.Locales.getString("javaScriptNoErrorsTooltip")); - - // If the toolbar preference is set to text - if(WebDeveloper.Preferences.getExtensionStringPreference("toolbar.icons") == "text") - { - javaScriptButton.setAttribute("label", WebDeveloper.Locales.getString("javaScriptNoErrorsLabel")); - } - } - } -}; - -// Updates meta redirects -WebDeveloper.Overlay.updateMetaRedirects = function(browserElement) -{ - // If the browser element is set - if(browserElement) - { - browserElement.docShell.allowMetaRedirects = !WebDeveloper.Preferences.getExtensionBooleanPreference("meta.redirects.disable"); - } -}; - -// Updates the render mode status button -WebDeveloper.Overlay.updateRenderMode = function() -{ - var renderModeButton = document.getElementById("web-developer-render-mode-statusbar"); - - // If the render mode button exists - if(renderModeButton) - { - var renderMode = WebDeveloper.Common.getContentDocument().compatMode; - - // If the render mode is quirks mode - if(renderMode == "BackCompat") - { - renderModeButton.setAttribute("class", "quirks"); - renderModeButton.setAttribute("tooltiptext", WebDeveloper.Locales.getString("quirksModeTooltip")); - - // If the toolbar is in text mode - if(WebDeveloper.Preferences.getExtensionStringPreference("toolbar.icons") == "text") - { - renderModeButton.setAttribute("label", WebDeveloper.Locales.getString("quirksModeLabel")); - } - } - else - { - // If the render mode button has a class attribute - if(renderModeButton.hasAttribute("class")) - { - renderModeButton.removeAttribute("class"); - } - - renderModeButton.setAttribute("tooltiptext", WebDeveloper.Locales.getString("standardsComplianceModeTooltip")); - - // If the toolbar is in text mode - if(WebDeveloper.Preferences.getExtensionStringPreference("toolbar.icons") == "text") - { - renderModeButton.setAttribute("label", WebDeveloper.Locales.getString("standardsComplianceModeLabel")); - } - } - } -}; - -// Error console listener -WebDeveloper.Overlay.ErrorConsoleListener = -{ - // Observes changes in the console - observe: function(error) - { - // If the error is set - if(error) - { - // Try to convert the error to a script error - try - { - var errorCategory = null; - - error = error.QueryInterface(Components.interfaces.nsIScriptError); - errorCategory = error.category; - - // If the error category is set and is content javascript - if(errorCategory && errorCategory == "content javascript") - { - WebDeveloper.Overlay.updateJavaScriptStatus(error); - } - else if(errorCategory && errorCategory == "CSS Parser") - { - WebDeveloper.Overlay.updateCSSStatus(error); - } - } - catch(exception) - { - // Ignore - } - } - - return false; - } -}; - -// Preference observer -WebDeveloper.Overlay.PreferenceObserver = -{ - // Observes changes in the console - observe: function(subject, topic, data) - { - // If a preference was changed - if(topic == "nsPref:changed") - { - // If the context hide, menu hide, toolbar color or toolbar icons preference was changed - if(data == "context.hide" || data == "menu.hide" || data == "toolbar.color" || data == "toolbar.icons") - { - WebDeveloper.Overlay.updateChrome(); - } - } - } -}; - -window.addEventListener("load", WebDeveloper.Overlay.initialize, false); -window.addEventListener("unload", WebDeveloper.Overlay.uninitialize, false); diff --git a/source/firefox/javascript/overlay/resize.js b/source/firefox/javascript/overlay/resize.js deleted file mode 100644 index 7f933f5..0000000 --- a/source/firefox/javascript/overlay/resize.js +++ /dev/null @@ -1,178 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.Resize = WebDeveloper.Overlay.Resize || {}; - -// Resizes the window to a custom size -WebDeveloper.Overlay.Resize.customResizeWindow = function() -{ - var contentWindow = WebDeveloper.Common.getContentWindow(); - - window.openDialog("chrome://web-developer/content/dialogs/resize-window.xul", "web-developer-resize-dialog", "centerscreen,chrome,modal", contentWindow.outerWidth, contentWindow.outerHeight, contentWindow.innerWidth, contentWindow.innerHeight); -}; - -// Displays the current window size -WebDeveloper.Overlay.Resize.displayWindowSize = function() -{ - var contentWindow = WebDeveloper.Common.getContentWindow(); - - WebDeveloper.Common.displayNotification("displayWindowSizeResult", [contentWindow.outerWidth, contentWindow.outerHeight, contentWindow.innerWidth, contentWindow.innerHeight]); -}; - -// Displays the current window size in the title bar -WebDeveloper.Overlay.Resize.displayWindowSizeInTitle = function(element) -{ - var contentDocument = WebDeveloper.Common.getContentDocument(); - - // If not adding the window size to the title - if(WebDeveloper.Common.convertToBoolean(element.getAttribute("checked"))) - { - var title = contentDocument.title; - - contentDocument.title = title.substring(0, title.lastIndexOf(" - ")); - - // Try to remove the event listener - try - { - window.removeEventListener("resize", WebDeveloper.Overlay.Resize.updateWindowSizeInTitle, false); - } - catch(exception) - { - // Ignore - } - } - else - { - var contentWindow = WebDeveloper.Common.getContentWindow(); - - contentDocument.title += " - " + contentWindow.outerWidth + "x" + contentWindow.outerHeight + " [" + contentWindow.innerWidth + "x" + contentWindow.innerHeight + "]"; - - window.addEventListener("resize", WebDeveloper.Overlay.Resize.updateWindowSizeInTitle, false); - } - - WebDeveloper.Storage.toggleFeature(WebDeveloper.Common.getFeatureId(element.getAttribute("id"))); -}; - -// Resizes the window or viewport to the given width and height -WebDeveloper.Overlay.Resize.resizeWindow = function(width, height, viewport) -{ - var windowX = window.screenX; - var windowY = window.screenY; - - // If resizing the viewport - if(viewport) - { - var contentWindow = WebDeveloper.Common.getContentWindow(); - - contentWindow.innerHeight = height; - contentWindow.innerWidth = width; - } - else - { - window.resizeTo(width, height); - } - - window.screenX = windowX; - window.screenY = windowY; -}; - -// Updates the resize menu -WebDeveloper.Overlay.Resize.updateResizeMenu = function(menu, suffix) -{ - var contentWindow = WebDeveloper.Common.getContentWindow(); - var description = null; - var height = null; - var key = null; - var menuItem = document.createElement("menuitem"); - var modifiers = null; - var resizeSeparator = document.getElementById("web-developer-resize-separator3-" + suffix); - var viewport = false; - var viewportHeight = contentWindow.innerHeight; - var viewportWidth = contentWindow.innerWidth; - var width = null; - var windowHeight = contentWindow.outerHeight; - var windowWidth = contentWindow.outerWidth; - - WebDeveloper.Overlay.configureFeatureElement("web-developer-display-window-size-title-command", "checked"); - WebDeveloper.Overlay.removeGeneratedMenuItems(menu); - - // Loop through the possible resize options - for(var i = 1, l = WebDeveloper.Preferences.getExtensionIntegerPreference("resize.count"); i <= l; i++) - { - description = WebDeveloper.Preferences.getLocalizedPreference("resize." + i + ".description"); - height = WebDeveloper.Preferences.getExtensionIntegerPreference("resize." + i + ".height"); - width = WebDeveloper.Preferences.getExtensionIntegerPreference("resize." + i + ".width"); - - // If the description, height and width are set - if(description && height > 0 && width > 0) - { - key = WebDeveloper.Preferences.getExtensionStringPreference("resize." + i + ".key"); - menuItem = document.createElement("menuitem"); - modifiers = WebDeveloper.Preferences.getExtensionStringPreference("resize." + i + ".modifiers"); - viewport = WebDeveloper.Preferences.getExtensionBooleanPreference("resize." + i + ".viewport"); - - // If the resize attributes match the current size - if(viewport && viewportWidth == width && viewportHeight == height || !viewport && windowWidth == width && windowHeight == height) - { - menuItem.setAttribute("checked", true); - } - - menuItem.setAttribute("class", "web-developer-generated-menu"); - menuItem.setAttribute("label", description); - menuItem.setAttribute("oncommand", "WebDeveloper.Overlay.Resize.resizeWindow(" + width + ", " + height + ", " + viewport + ")"); - menuItem.setAttribute("type", "radio"); - - // If a key and modifiers are set - if(key && modifiers) - { - menuItem.setAttribute("key", "web-developer-resize-" + i + "-key"); - } - - menu.insertBefore(menuItem, resizeSeparator); - } - } -}; - -// Updates the window size in the title bar -WebDeveloper.Overlay.Resize.updateWindowSizeInTitle = function() -{ - var contentDocument = WebDeveloper.Common.getContentDocument(); - var contentWindow = WebDeveloper.Common.getContentWindow(); - var title = contentDocument.title; - - contentDocument.title = title.substring(0, title.lastIndexOf(" - ")) + " - " + contentWindow.outerWidth + "x" + contentWindow.outerHeight + " [" + contentWindow.innerWidth + "x" + contentWindow.innerHeight + "]"; -}; - -// Displays the responsive layouts for the page -WebDeveloper.Overlay.Resize.viewResponsiveLayouts = function() -{ - var data = {}; - var description = null; - var height = null; - var layout = null; - var width = null; - - data.layouts = []; - data.pageURL = WebDeveloper.Common.getTabBrowser().currentURI.spec; - - // Loop through the possible responsive options - for(var i = 1, l = WebDeveloper.Preferences.getExtensionIntegerPreference("responsive.layout.count"); i <= l; i++) - { - description = WebDeveloper.Preferences.getLocalizedPreference("responsive.layout." + i + ".description"); - height = WebDeveloper.Preferences.getExtensionIntegerPreference("responsive.layout." + i + ".height"); - width = WebDeveloper.Preferences.getExtensionIntegerPreference("responsive.layout." + i + ".width"); - - // If the description, height and width are set - if(description && height > 0 && width > 0) - { - layout = {}; - layout.description = description; - layout.height = height; - layout.width = width; - - data.layouts.push(layout); - } - } - - WebDeveloper.Overlay.openGeneratedTab(WebDeveloper.Common.getChromeURL("generated/view-responsive-layouts.html"), data, WebDeveloper.Overlay.Resize.getViewResponsiveLayoutsLocale()); -}; diff --git a/source/firefox/javascript/overlay/tools.js b/source/firefox/javascript/overlay/tools.js deleted file mode 100644 index 45f468b..0000000 --- a/source/firefox/javascript/overlay/tools.js +++ /dev/null @@ -1,143 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.Tools = WebDeveloper.Overlay.Tools || {}; - -// Displays a page validation toolbar -WebDeveloper.Overlay.Tools.displayPageValidation = function(element) -{ - var featureId = WebDeveloper.Common.getFeatureId(element.getAttribute("id")); - - WebDeveloper.PageValidation.displayPageValidation(!WebDeveloper.Storage.isFeatureActive(featureId)); - WebDeveloper.Storage.toggleFeature(featureId); -}; - -// Returns true if the DOM Inspector chrome is available -WebDeveloper.Overlay.Tools.isDOMInspectorChromeAvailable = function() -{ - // If the inspectDOMDocument method is available - if(typeof inspectDOMDocument == "function") - { - return true; - } - - return false; -}; - -// Loads the given application with the given URL -WebDeveloper.Overlay.Tools.loadApplicationWithURL = function(application, url) -{ - // If the application and URL are set - if(application && url) - { - application = new WebDeveloperApplication(application); - - application.launchWithURL(url); - } -}; - -// Opens the DOM Inspector -WebDeveloper.Overlay.Tools.openDOMInspector = function() -{ - // If the DOM Inspector and chrome is available - if(WebDeveloper.Overlay.isDOMInspectorAvailable() && WebDeveloper.Overlay.Tools.isDOMInspectorChromeAvailable()) - { - inspectDOMDocument(WebDeveloper.Common.getContentDocument()); - } - else - { - WebDeveloper.Common.displayURLMessage(WebDeveloper.Locales.getString("domInspectorRequired"), "@url@/help/#dom-inspector"); - } -}; - -// Updates the tools menu -WebDeveloper.Overlay.Tools.updateToolsMenu = function(menu, suffix) -{ - var description = null; - var key = null; - var menuItem = null; - var modifiers = null; - var path = null; - var toolsSeparator = menu.getElementsByAttribute("id", "web-developer-tools-separator1-" + suffix)[0]; - var url = null; - - WebDeveloper.Overlay.removeGeneratedMenuItems(menu); - - // Loop through the possible tools - for(var i = 1, l = WebDeveloper.Preferences.getExtensionIntegerPreference("tool.count"); i <= l; i++) - { - // If this is a separator - if(WebDeveloper.Preferences.getExtensionBooleanPreference("tool." + i + ".separator")) - { - menuItem = document.createElement("menuseparator"); - - menuItem.setAttribute("class", "web-developer-generated-menu"); - menu.insertBefore(menuItem, toolsSeparator); - } - else - { - description = WebDeveloper.Preferences.getLocalizedPreference("tool." + i + ".description"); - path = WebDeveloper.Preferences.getExtensionStringPreference("tool." + i + ".path"); - url = WebDeveloper.Preferences.getExtensionStringPreference("tool." + i + ".url"); - - // If the description and either a path or url are set - if(description && path || url) - { - key = WebDeveloper.Preferences.getExtensionStringPreference("tool." + i + ".key"); - menuItem = document.createElement("menuitem"); - modifiers = WebDeveloper.Preferences.getExtensionStringPreference("tool." + i + ".modifiers"); - - menuItem.setAttribute("class", "web-developer-generated-menu"); - menuItem.setAttribute("label", description); - - // If the path is set - if(path) - { - menuItem.setAttribute("oncommand", "WebDeveloper.Overlay.Tools.loadApplicationWithURL('" + path.replace(/\\/gi, "\\\\") + "', WebDeveloper.Common.getTabBrowser().currentURI.spec)"); - } - else - { - menuItem.setAttribute("oncommand", "WebDeveloper.Common.openURL('" + url + "' + encodeURIComponent(WebDeveloper.Common.getTabBrowser().currentURI.spec))"); - } - - // If a key and modifiers are set - if(key && modifiers) - { - menuItem.setAttribute("key", "web-developer-tools-" + i + "-key"); - } - - menu.insertBefore(menuItem, toolsSeparator); - } - } - } - - menuItem = document.getElementById("web-developer-dom-inspector-" + suffix); - - // If the menu exists - if(menuItem) - { - // If the DOM Inspector or chrome is not available - if(!WebDeveloper.Overlay.isDOMInspectorAvailable() || !WebDeveloper.Overlay.Tools.isDOMInspectorChromeAvailable()) - { - menuItem.setAttribute("class", "menuitem-iconic"); - } - else if(menuItem.hasAttribute("class")) - { - menuItem.removeAttribute("class"); - } - } - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-display-page-validation-command"), "checked", !document.getElementById("web-developer-page-validation-toolbar").hidden); -}; - -// Validates local CSS -WebDeveloper.Overlay.Tools.validateLocalCSS = function() -{ - new WebDeveloperValidateCSS().validateCSS(WebDeveloper.Common.getTabBrowser().currentURI, WebDeveloper.Content.getCSS()); -}; - -// Validates a local HTML file -WebDeveloper.Overlay.Tools.validateLocalHTML = function() -{ - new WebDeveloperValidateHTML().validateHTML(WebDeveloper.Common.getTabBrowser().currentURI, WebDeveloper.Common.getContentWindow()); -}; diff --git a/source/firefox/javascript/overlay/view-source.js b/source/firefox/javascript/overlay/view-source.js deleted file mode 100644 index cb12960..0000000 --- a/source/firefox/javascript/overlay/view-source.js +++ /dev/null @@ -1,147 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Overlay = WebDeveloper.Overlay || {}; -WebDeveloper.Overlay.ViewSource = WebDeveloper.Overlay.ViewSource || {}; -WebDeveloper.Overlay.ViewSource.clearViewGeneratedSourceSelectionDelay = 1500; - -// Clears the view generated source selection -WebDeveloper.Overlay.ViewSource.clearViewGeneratedSourceSelection = function(selection, generatedSourceWindow) -{ - selection.removeAllRanges(); - - // If the generated source window is set - if(generatedSourceWindow) - { - generatedSourceWindow.gBrowser.contentWindow.getSelection().removeAllRanges(); - } -}; - -// Updates the view frame source menu -WebDeveloper.Overlay.ViewSource.updateViewFrameSourceMenu = function(menu) -{ - var contentDocument = null; - var documents = WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()); - var menuItem = null; - - WebDeveloper.Overlay.removeGeneratedMenuItems(menu); - - // Loop through the documents - for(var i = 1, l = documents.length; i < l; i++) - { - menuItem = document.createElement("menuitem"); - contentDocument = documents[i]; - menuItem.contentDocument = contentDocument; - - menuItem.setAttribute("class", "web-developer-generated-menu"); - menuItem.setAttribute("label", contentDocument.documentURI); - menuItem.setAttribute("oncommand", "WebDeveloper.Overlay.ViewSource.viewSource(this.contentDocument)"); - menu.appendChild(menuItem); - } -}; - -// Loads the given application with the source of the current page -WebDeveloper.Overlay.ViewSource.loadApplicationWithSource = function(application) -{ - // If the application is set - if(application) - { - application = new WebDeveloperApplication(application); - - application.launchWithSource(WebDeveloper.Common.getTabBrowser().currentURI, WebDeveloper.Common.getContentWindow()); - } -}; - -// Updates the view source menu -WebDeveloper.Overlay.ViewSource.updateViewSourceMenu = function(menu, suffix) -{ - var description = null; - var frameCount = WebDeveloper.Content.getDocuments(WebDeveloper.Common.getContentWindow()).length; - var key = null; - var menuItem = document.createElement("menuitem"); - var modifiers = null; - var path = null; - var viewSourceWithCount = WebDeveloper.Preferences.getExtensionIntegerPreference("view.source.with.count"); - var viewSourceWithSeparator = document.getElementById("web-developer-view-source-separator3-" + suffix); - - WebDeveloper.Overlay.removeGeneratedMenuItems(menu); - - // If there are no view source with applications - if(viewSourceWithCount === 0) - { - viewSourceWithSeparator.setAttribute("hidden", true); - } - else - { - viewSourceWithSeparator.setAttribute("hidden", false); - - // Loop through the view source with options - for(var i = 1; i <= viewSourceWithCount; i++) - { - description = WebDeveloper.Preferences.getExtensionStringPreference("view.source.with." + i + ".description"); - path = WebDeveloper.Preferences.getExtensionStringPreference("view.source.with." + i + ".path"); - - // If the description and path are set - if(description && path) - { - key = WebDeveloper.Preferences.getExtensionStringPreference("view.source.with." + i + ".key"); - menuItem = document.createElement("menuitem"); - modifiers = WebDeveloper.Preferences.getExtensionStringPreference("view.source.with." + i + ".modifiers"); - - menuItem.setAttribute("class", "web-developer-generated-menu"); - menuItem.setAttribute("label", description); - menuItem.setAttribute("oncommand", "WebDeveloper.Overlay.ViewSource.loadApplicationWithSource('" + path.replace(/\\/gi, "\\\\") + "')"); - - // If a key and modifiers are set - if(key && modifiers) - { - menuItem.setAttribute("key", "web-developer-view-source-with-" + i + "-key"); - } - - menu.insertBefore(menuItem, viewSourceWithSeparator); - } - } - } - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-view-frame-source-" + suffix), "disabled", frameCount === 1); -}; - -// View the generated source -WebDeveloper.Overlay.ViewSource.viewGeneratedSource = function() -{ - var currentDocument = WebDeveloper.Common.getContentDocument(); - var currentWindow = WebDeveloper.Common.getContentWindow(); - var generatedSourceWindow = null; - var mainWindow = WebDeveloper.Common.getMainWindow(); - var selection = currentWindow.getSelection(); - - selection.selectAllChildren(currentDocument.documentElement); - - // If the view partial source in browser function exists - if(mainWindow.gViewSourceUtils && mainWindow.gViewSourceUtils.viewPartialSourceInBrowser) - { - mainWindow.gViewSourceUtils.viewPartialSourceInBrowser(WebDeveloper.Common.getSelectedBrowser(), null, null); - } - else - { - generatedSourceWindow = window.openDialog("chrome://global/content/viewPartialSource.xul", "_blank", "chrome,dialog=no,resizable,scrollbars", WebDeveloper.Common.getTabBrowser().currentURI.spec, "charset=" + currentDocument.characterSet, currentWindow.getSelection(), "selection"); - } - - window.setTimeout(WebDeveloper.Overlay.ViewSource.clearViewGeneratedSourceSelection, WebDeveloper.Overlay.ViewSource.clearViewGeneratedSourceSelectionDelay, selection, generatedSourceWindow); -}; - -// View source -WebDeveloper.Overlay.ViewSource.viewSource = function(frameDocument) -{ - // If the view source in tab preference is set to true - if(WebDeveloper.Preferences.getExtensionBooleanPreference("view.source.tab")) - { - var tabBrowser = WebDeveloper.Common.getTabBrowser(); - var newTab = tabBrowser.addTab("view-source:" + frameDocument.documentURI); - - tabBrowser.selectedTab = newTab; - } - else - { - BrowserViewSourceOfDocument(frameDocument); - } -}; diff --git a/source/firefox/javascript/preferences/defaults.js b/source/firefox/javascript/preferences/defaults.js deleted file mode 100644 index eb3735b..0000000 --- a/source/firefox/javascript/preferences/defaults.js +++ /dev/null @@ -1,87 +0,0 @@ -// Advanced -pref("extensions.webdeveloper.dashboard.position", "bottom"); -pref("extensions.webdeveloper.populate.email.address", "example@example.com"); - -// Colors -pref("extensions.webdeveloper.syntax.highlight.theme", "none"); - -// General -pref("extensions.webdeveloper.toolbar.icons", "full"); - -// Keyboard -pref("extensions.webdeveloper.keyboard.1.feature", "disable-all-styles"); -pref("extensions.webdeveloper.keyboard.1.key", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.keyboard.1.modifiers", "alt shift"); -pref("extensions.webdeveloper.keyboard.2.feature", "edit-css"); -pref("extensions.webdeveloper.keyboard.2.key", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.keyboard.2.modifiers", "alt shift"); -pref("extensions.webdeveloper.keyboard.3.feature", "validate-local-html"); -pref("extensions.webdeveloper.keyboard.3.key", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.keyboard.3.modifiers", "alt shift"); -pref("extensions.webdeveloper.keyboard.4.feature", "view-css"); -pref("extensions.webdeveloper.keyboard.4.key", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.keyboard.4.modifiers", "alt shift"); -pref("extensions.webdeveloper.keyboard.5.feature", "view-javascript"); -pref("extensions.webdeveloper.keyboard.5.key", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.keyboard.5.modifiers", "alt shift"); -pref("extensions.webdeveloper.keyboard.6.feature", "view-source-view-source"); -pref("extensions.webdeveloper.keyboard.6.key", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.keyboard.6.modifiers", "alt shift"); -pref("extensions.webdeveloper.keyboard.7.feature", "display-style-information"); -pref("extensions.webdeveloper.keyboard.7.key", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.keyboard.7.modifiers", "alt shift"); -pref("extensions.webdeveloper.keyboard.count", 7); - -// Miscellaneous -pref("extensions.webdeveloper.line.guides.color", "#cc0000"); -pref("extensions.webdeveloper.magnification.level", "2"); -pref("extensions.webdeveloper.ruler.color", "#cc0000"); - -// Outline -pref("extensions.webdeveloper.outline.custom.element.1.color", "#cc0000"); -pref("extensions.webdeveloper.outline.custom.element.2.color", "#3333ff"); -pref("extensions.webdeveloper.outline.custom.element.3.color", "#009900"); -pref("extensions.webdeveloper.outline.custom.element.4.color", "#cc0000"); -pref("extensions.webdeveloper.outline.custom.element.5.color", "#3333ff"); - -// Resize -pref("extensions.webdeveloper.resize.1.description", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.resize.1.height", 768); -pref("extensions.webdeveloper.resize.1.width", 1024); -pref("extensions.webdeveloper.resize.count", 1); - -// Responsive layout -pref("extensions.webdeveloper.responsive.layout.1.description", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.responsive.layout.1.height", 480); -pref("extensions.webdeveloper.responsive.layout.1.width", 320); -pref("extensions.webdeveloper.responsive.layout.2.description", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.responsive.layout.2.height", 320); -pref("extensions.webdeveloper.responsive.layout.2.width", 480); -pref("extensions.webdeveloper.responsive.layout.3.description", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.responsive.layout.3.height", 800); -pref("extensions.webdeveloper.responsive.layout.3.width", 600); -pref("extensions.webdeveloper.responsive.layout.4.description", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.responsive.layout.4.height", 600); -pref("extensions.webdeveloper.responsive.layout.4.width", 800); -pref("extensions.webdeveloper.responsive.layout.5.description", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.responsive.layout.5.height", 1024); -pref("extensions.webdeveloper.responsive.layout.5.width", 768); -pref("extensions.webdeveloper.responsive.layout.6.description", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.responsive.layout.6.height", 768); -pref("extensions.webdeveloper.responsive.layout.6.width", 1024); -pref("extensions.webdeveloper.responsive.layout.count", 6); - -// Tools -pref("extensions.webdeveloper.tool.count", 5); -pref("extensions.webdeveloper.tool.1.description", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.tool.1.url", "http://jigsaw.w3.org/css-validator/validator?profile=css3&warning=0&uri="); -pref("extensions.webdeveloper.tool.2.description", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.tool.2.url", "http://validator.w3.org/feed/check.cgi?url="); -pref("extensions.webdeveloper.tool.3.description", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.tool.3.key", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.tool.3.modifiers", "alt shift"); -pref("extensions.webdeveloper.tool.3.url", "http://validator.w3.org/check?verbose=1&uri="); -pref("extensions.webdeveloper.tool.4.description", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.tool.4.url", "http://wave.webaim.org/report#/"); -pref("extensions.webdeveloper.tool.5.description", "chrome://web-developer/locale/options/options.properties"); -pref("extensions.webdeveloper.tool.5.url", "http://validator.w3.org/checklink?check=Check&hide_type=all&summary=on&uri="); diff --git a/source/firefox/javascript/preferences/preferences.js b/source/firefox/javascript/preferences/preferences.js deleted file mode 100644 index 9329a6a..0000000 --- a/source/firefox/javascript/preferences/preferences.js +++ /dev/null @@ -1,261 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Preferences = WebDeveloper.Preferences || {}; -WebDeveloper.Preferences.preferencesService = null; - -// Deletes a preference for the extension -WebDeveloper.Preferences.deleteExtensionPreference = function(preference) -{ - WebDeveloper.Preferences.deletePreference(preference, WebDeveloper.Preferences.getExtensionBranch()); -}; - -// Deletes a preference -WebDeveloper.Preferences.deletePreference = function(preference, branch) -{ - // If the branch is not set - if(!branch) - { - branch = WebDeveloper.Preferences.getGlobalBranch(); - } - - // Try to delete the extension - try - { - branch.clearUserPref(preference); - } - catch(exception) - { - // Ignore - } -}; - -// Deletes a preference branch -WebDeveloper.Preferences.deletePreferenceBranch = function(branch) -{ - branch.deleteBranch(""); -}; - -// Disables the given preference for the extension -WebDeveloper.Preferences.disableExtensionPreference = function(element, preference) -{ - WebDeveloper.Preferences.setExtensionBooleanPreference(preference, !WebDeveloper.Common.convertToBoolean(element.getAttribute("checked"))); -}; - -// Disables the given preference -WebDeveloper.Preferences.disablePreference = function(element, preference) -{ - WebDeveloper.Preferences.setBooleanPreference(preference, !WebDeveloper.Common.convertToBoolean(element.getAttribute("checked"))); -}; - -// Enables the given preference for the extension -WebDeveloper.Preferences.enableExtensionPreference = function(element, preference) -{ - WebDeveloper.Preferences.setExtensionBooleanPreference(preference, WebDeveloper.Common.convertToBoolean(element.getAttribute("checked"))); -}; - -// Enables the given preference -WebDeveloper.Preferences.enablePreference = function(element, preference) -{ - WebDeveloper.Preferences.setBooleanPreference(preference, WebDeveloper.Common.convertToBoolean(element.getAttribute("checked"))); -}; - -// Returns a boolean preference, returning false if the preference is not set -WebDeveloper.Preferences.getBooleanPreference = function(preference, branch) -{ - // If the branch is not set - if(!branch) - { - branch = WebDeveloper.Preferences.getGlobalBranch(); - } - - // Try to get the preference - try - { - return branch.getBoolPref(preference); - } - catch(exception) - { - // Ignore - } - - return false; -}; - -// Returns the preferences branch -WebDeveloper.Preferences.getBranch = function(branch) -{ - return WebDeveloper.Preferences.getPreferencesService().getBranch(branch); -}; - -// Returns a boolean preference for the extension, returning false if the preference is not set -WebDeveloper.Preferences.getExtensionBooleanPreference = function(preference) -{ - return WebDeveloper.Preferences.getBooleanPreference(preference, WebDeveloper.Preferences.getExtensionBranch()); -}; - -// Returns the extension preferences branch -WebDeveloper.Preferences.getExtensionBranch = function() -{ - return WebDeveloper.Preferences.getBranch("extensions.webdeveloper."); -}; - -// Returns an integer preference for the extension, returning 0 if the preference is not set -WebDeveloper.Preferences.getExtensionIntegerPreference = function(preference) -{ - return WebDeveloper.Preferences.getIntegerPreference(preference, WebDeveloper.Preferences.getExtensionBranch()); -}; - -// Returns a string preference for the extension, returning null if the preference is not set -WebDeveloper.Preferences.getExtensionStringPreference = function(preference) -{ - return WebDeveloper.Preferences.getStringPreference(preference, WebDeveloper.Preferences.getExtensionBranch()); -}; - -// Returns the global preferences branch -WebDeveloper.Preferences.getGlobalBranch = function() -{ - return WebDeveloper.Preferences.getBranch(""); -}; - -// Returns an integer preference, returning 0 if the preference is not set -WebDeveloper.Preferences.getIntegerPreference = function(preference, branch) -{ - // If the branch is not set - if(!branch) - { - branch = WebDeveloper.Preferences.getGlobalBranch(); - } - - // Try to get the preference - try - { - return branch.getIntPref(preference); - } - catch(exception) - { - // Ignore - } - - return 0; -}; - -// Returns a localized preference, returning null if the preference is not set -WebDeveloper.Preferences.getLocalizedPreference = function(preference) -{ - // Try to get the preference - try - { - return WebDeveloper.Preferences.getExtensionBranch().getComplexValue(preference, Components.interfaces.nsIPrefLocalizedString).data.trim(); - } - catch(exception) - { - // Ignore - } - - return null; -}; - -// Returns the preferences service -WebDeveloper.Preferences.getPreferencesService = function() -{ - // If the preferences service is not set - if(!WebDeveloper.Preferences.preferencesService) - { - WebDeveloper.Preferences.preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService); - } - - return WebDeveloper.Preferences.preferencesService; -}; - -// Returns a string preference, returning null if the preference is not set -WebDeveloper.Preferences.getStringPreference = function(preference, branch) -{ - // If the branch is not set - if(!branch) - { - branch = WebDeveloper.Preferences.getGlobalBranch(); - } - - // Try to get the preference - try - { - return branch.getComplexValue(preference, Components.interfaces.nsISupportsString).data.trim(); - } - catch(exception) - { - // Ignore - } - - return null; -}; - -// Returns a string preference, returning null if the preference is not set -WebDeveloper.Preferences.isPreferenceSet = function(preference, branch) -{ - // If the branch is not set - if(!branch) - { - branch = WebDeveloper.Preferences.getGlobalBranch(); - } - - return branch.prefHasUserValue(preference); -}; - -// Sets a boolean preference -WebDeveloper.Preferences.setBooleanPreference = function(preference, value, branch) -{ - // If the branch is not set - if(!branch) - { - branch = WebDeveloper.Preferences.getGlobalBranch(); - } - - branch.setBoolPref(preference, value); -}; - -// Sets a boolean preference for the extension -WebDeveloper.Preferences.setExtensionBooleanPreference = function(preference, value) -{ - WebDeveloper.Preferences.setBooleanPreference(preference, value, WebDeveloper.Preferences.getExtensionBranch()); -}; - -// Sets an integer preference for the extension -WebDeveloper.Preferences.setExtensionIntegerPreference = function(preference, value) -{ - WebDeveloper.Preferences.setIntegerPreference(preference, value, WebDeveloper.Preferences.getExtensionBranch()); -}; - -// Sets a string preference for the extension -WebDeveloper.Preferences.setExtensionStringPreference = function(preference, value) -{ - WebDeveloper.Preferences.setStringPreference(preference, value, WebDeveloper.Preferences.getExtensionBranch()); -}; - -// Sets an integer preference -WebDeveloper.Preferences.setIntegerPreference = function(preference, value, branch) -{ - // If the branch is not set - if(!branch) - { - branch = WebDeveloper.Preferences.getGlobalBranch(); - } - - branch.setIntPref(preference, value); -}; - -// Sets a string preference -WebDeveloper.Preferences.setStringPreference = function(preference, value, branch) -{ - var supportsStringInterface = Components.interfaces.nsISupportsString; - var string = Components.classes["@mozilla.org/supports-string;1"].createInstance(supportsStringInterface); - - // If the branch is not set - if(!branch) - { - branch = WebDeveloper.Preferences.getGlobalBranch(); - } - - string.data = value; - - branch.setComplexValue(preference, supportsStringInterface, string); -}; diff --git a/source/firefox/javascript/storage/storage.js b/source/firefox/javascript/storage/storage.js deleted file mode 100644 index 6f3ae50..0000000 --- a/source/firefox/javascript/storage/storage.js +++ /dev/null @@ -1,119 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Storage = WebDeveloper.Storage || {}; -WebDeveloper.Storage.sessionStore = null; - -// Deletes the features on a tab -WebDeveloper.Storage.deleteFeatures = function(tab) -{ - try - { - WebDeveloper.Storage.getSessionStore().deleteTabValue(tab, WebDeveloper.Storage.storageId); - } - catch(exception) - { - // Ignore - } -}; - -// Gets the features on a tab -WebDeveloper.Storage.getFeatures = function(tab) -{ - var features = WebDeveloper.Storage.getSessionStore().getTabValue(tab, WebDeveloper.Storage.storageId); - - // If there are features - if(features) - { - return features.split(","); - } - - return null; -}; - -// Returns the session store -WebDeveloper.Storage.getSessionStore = function() -{ - // If the session store is not set - if(!WebDeveloper.Storage.sessionStore) - { - // Try to set the session store - try - { - WebDeveloper.Storage.sessionStore = Components.classes["@mozilla.org/browser/sessionstore;1"].getService(Components.interfaces.nsISessionStore); - } - catch(exception) - { - WebDeveloper.Storage.sessionStore = Components.classes["@mozilla.org/suite/sessionstore;1"].getService(Components.interfaces.nsISessionStore); - } - } - - return WebDeveloper.Storage.sessionStore; -}; - -// Returns true if any feature is active on the current tab -WebDeveloper.Storage.hasFeatures = function() -{ - // If there are features - if(WebDeveloper.Storage.getFeatures(WebDeveloper.Common.getTabBrowser().selectedTab)) - { - return true; - } - - return false; -}; - -// Returns true if a feature is active on a tab -WebDeveloper.Storage.isFeatureActive = function(feature) -{ - return WebDeveloper.Common.inArray(feature, WebDeveloper.Storage.getFeatures(WebDeveloper.Common.getTabBrowser().selectedTab)); -}; - -// Sets the features on a tab -WebDeveloper.Storage.setFeatures = function(features) -{ - WebDeveloper.Storage.getSessionStore().setTabValue(WebDeveloper.Common.getTabBrowser().selectedTab, WebDeveloper.Storage.storageId, features.join(",")); -}; - -// Toggles a feature on a tab -WebDeveloper.Storage.toggleFeature = function(feature, tab) -{ - var features = null; - var position = null; - - // If the tab is not set - if(!tab) - { - tab = WebDeveloper.Common.getTabBrowser().selectedTab; - } - - features = WebDeveloper.Storage.getFeatures(tab); - position = WebDeveloper.Common.positionInArray(feature, features); - - // If the feature is not on the tab - if(position == -1) - { - // If there are any features - if(features) - { - features.push(feature); - } - else - { - features = [feature]; - } - } - else - { - features.splice(position, 1); - } - - // If there are features - if(features.length) - { - WebDeveloper.Storage.setFeatures(features); - } - else - { - WebDeveloper.Storage.deleteFeatures(tab); - } -}; diff --git a/source/firefox/javascript/toolbar/element-ancestors.js b/source/firefox/javascript/toolbar/element-ancestors.js deleted file mode 100644 index b62b59c..0000000 --- a/source/firefox/javascript/toolbar/element-ancestors.js +++ /dev/null @@ -1,39 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.ElementAncestors = WebDeveloper.ElementAncestors || {}; - -// Creates the element information toolbar -WebDeveloper.ElementAncestors.createToolbar = function() -{ - WebDeveloper.Common.configureElement(WebDeveloper.Common.getMainWindow().document.getElementById("web-developer-element-ancestors-toolbar"), "hidden", false); -}; - -// Displays the ancestors of an element -WebDeveloper.ElementAncestors.displayElementAncestors = function(element) -{ - var contentDocument = WebDeveloper.Common.getMainWindow().document.getElementById("web-developer-element-ancestors-browser").contentDocument; - - contentDocument.defaultView.WebDeveloper.Generated.populateAncestors(WebDeveloper.ElementAncestors.getAncestorInformation(element, contentDocument)); -}; - -// Generates ancestor information for an element -WebDeveloper.ElementAncestors.generateAncestorInformation = function(element, contentDocument) -{ - var ancestorInformation = contentDocument.createElement("div"); - var buttonElement = contentDocument.createElement("button"); - - buttonElement.appendChild(contentDocument.createTextNode(WebDeveloper.Locales.getString("copyAncestorPath"))); - buttonElement.setAttribute("class", "btn btn-primary"); - buttonElement.setAttribute("id", "web-developer-copy-ancestor-path"); - ancestorInformation.appendChild(buttonElement); - ancestorInformation.appendChild(WebDeveloper.ElementAncestors.getAncestorInformation(element, contentDocument)); - ancestorInformation.setAttribute("id", "web-developer-ancestors"); - - return ancestorInformation; -}; - -// Removes the element information toolbar -WebDeveloper.ElementAncestors.removeToolbar = function() -{ - WebDeveloper.Common.configureElement(WebDeveloper.Common.getMainWindow().document.getElementById("web-developer-element-ancestors-toolbar"), "hidden", true); -}; diff --git a/source/firefox/javascript/toolbar/line-guides.js b/source/firefox/javascript/toolbar/line-guides.js deleted file mode 100644 index 7ce3e13..0000000 --- a/source/firefox/javascript/toolbar/line-guides.js +++ /dev/null @@ -1,67 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.LineGuides = WebDeveloper.LineGuides || {}; - -// Creates the line guides events -WebDeveloper.LineGuides.createEvents = function(contentDocument) -{ - contentDocument.addEventListener("mousemove", WebDeveloper.LineGuides.mouseMove, false); - contentDocument.addEventListener("resize", WebDeveloper.LineGuides.resize, false); -}; - -// Creates the line guides toolbar -WebDeveloper.LineGuides.createToolbar = function() -{ - document.getElementById("web-developer-line-guides-color").color = WebDeveloper.Preferences.getExtensionStringPreference("line.guides.color"); - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-line-guides-toolbar"), "hidden", false); -}; - -// Returns the line guides color -WebDeveloper.LineGuides.getColor = function() -{ - return WebDeveloper.Preferences.getExtensionStringPreference("line.guides.color"); -}; - -// Hides the line guide information -WebDeveloper.LineGuides.hideInformation = function() -{ - document.getElementById("web-developer-line-guides-information").hidden = true; -}; - -// Removes the line guides events -WebDeveloper.LineGuides.removeEvents = function(contentDocument) -{ - contentDocument.removeEventListener("mousemove", WebDeveloper.LineGuides.moveLineGuide, false); - contentDocument.removeEventListener("resize", WebDeveloper.LineGuides.resizeLineGuides, false); -}; - -// Removes the line guides toolbar -WebDeveloper.LineGuides.removeToolbar = function() -{ - WebDeveloper.Common.configureElement(document.getElementById("web-developer-line-guides-toolbar"), "hidden", true); -}; - -// Updates the line guides color -WebDeveloper.LineGuides.updateColor = function() -{ - var color = document.getElementById("web-developer-line-guides-color").color; - var lineGuides = WebDeveloper.Common.getContentDocument().querySelectorAll(".web-developer-line-guide div"); - - // Loop through the line guides - for(var i = 0, l = lineGuides.length; i < l; i++) - { - lineGuides[i].style.backgroundColor = color; - } - - WebDeveloper.Preferences.setExtensionStringPreference("line.guides.color", color); -}; - -// Updates the line guide information -WebDeveloper.LineGuides.updateInformation = function(position, previousPosition, nextPosition) -{ - document.getElementById("web-developer-line-guide-position").value = position + "px"; - document.getElementById("web-developer-next-line-guide-position").value = nextPosition + "px"; - document.getElementById("web-developer-previous-line-guide-position").value = previousPosition + "px"; - document.getElementById("web-developer-line-guides-information").hidden = false; -}; diff --git a/source/firefox/javascript/toolbar/page-magnifier.js b/source/firefox/javascript/toolbar/page-magnifier.js deleted file mode 100644 index f225a93..0000000 --- a/source/firefox/javascript/toolbar/page-magnifier.js +++ /dev/null @@ -1,195 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.PageMagnifier = WebDeveloper.PageMagnifier || {}; - -// Creates the page magnifier -WebDeveloper.PageMagnifier.createPageMagnifier = function() -{ - var browserBoxObject = WebDeveloper.Common.getSelectedBrowser().boxObject; - var container = document.getElementById("web-developer-page-magnifier-container"); - - WebDeveloper.PageMagnifier.update(0, 0); - - container.addEventListener("DOMMouseScroll", WebDeveloper.PageMagnifier.mouseScroll, true); - window.addEventListener("mousemove", WebDeveloper.PageMagnifier.mouseMove, false); - - container.style.left = browserBoxObject.x + 50 + "px"; - container.style.top = browserBoxObject.y + 50 + "px"; - container.hidden = false; -}; - -// Creates the page magnifier toolbar -WebDeveloper.PageMagnifier.createToolbar = function() -{ - document.getElementById("web-developer-magnification-level").value = WebDeveloper.Preferences.getExtensionStringPreference("magnification.level"); - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-page-magnifier-toolbar"), "hidden", false); -}; - -// Displays a page magnifier -WebDeveloper.PageMagnifier.displayPageMagnifier = function(display) -{ - // If displaying a page magnifier - if(display) - { - WebDeveloper.PageMagnifier.createPageMagnifier(); - WebDeveloper.PageMagnifier.createToolbar(); - } - else - { - WebDeveloper.PageMagnifier.removePageMagnifier(); - WebDeveloper.PageMagnifier.removeToolbar(); - } -}; - -// Handles the mouse move event -WebDeveloper.PageMagnifier.mouseMove = function(event) -{ - var canvas = document.getElementById("web-developer-page-magnifier"); - var eventTarget = event.target; - - // If the canvas and event target are set and the canvas is the event target - if(canvas && eventTarget && canvas == eventTarget) - { - var container = document.getElementById("web-developer-page-magnifier-container"); - - // If the container is set - if(container) - { - var browserBoxObject = WebDeveloper.Common.getSelectedBrowser().boxObject; - var browserXPosition = browserBoxObject.x; - var browserYPosition = browserBoxObject.y; - var canvasHalfHeight = canvas.height / 2; - var canvasHalfWidth = canvas.width / 2; - var containerXPosition = event.clientX - canvasHalfWidth; - var containerYPosition = event.clientY - canvasHalfHeight; - var documentElement = WebDeveloper.Common.getContentDocument().documentElement; - var magnificationLevel = parseFloat(WebDeveloper.Preferences.getExtensionStringPreference("magnification.level")); - var magnifierXPosition = event.clientX - browserXPosition - canvasHalfWidth / magnificationLevel + documentElement.scrollLeft; - var magnifierYPosition = event.clientY - browserYPosition - canvasHalfHeight / magnificationLevel + documentElement.scrollTop; - - // If the container X position is less than the browser X position - if(containerXPosition < browserXPosition) - { - containerXPosition = browserXPosition; - } - - // If the container Y position is less than the browser Y position - if(containerYPosition < browserYPosition) - { - containerYPosition = browserYPosition; - } - - // If the magnifier X position is less than 0 - if(magnifierXPosition < 0) - { - magnifierXPosition = 0; - } - - // If the magnifier Y position is less than 0 - if(magnifierYPosition < 0) - { - magnifierYPosition = 0; - } - - container.style.left = containerXPosition + "px"; - container.style.top = containerYPosition + "px"; - - WebDeveloper.PageMagnifier.update(magnifierXPosition, magnifierYPosition); - } - } -}; - -// Handles the mouse scroll event -WebDeveloper.PageMagnifier.mouseScroll = function(event) -{ - var eventDetail = event.detail; - - // If the event detail is set - if(eventDetail) - { - var magnificationLevel = parseFloat(WebDeveloper.Preferences.getExtensionStringPreference("magnification.level")); - - // If the event detail is greater than zero (scroll down) - if(eventDetail > 0) - { - // If the magnification level is greater than one - if(magnificationLevel > 1) - { - magnificationLevel -= 1; - } - } - else - { - magnificationLevel += 1; - } - - document.getElementById("web-developer-magnification-level").value = magnificationLevel; - - WebDeveloper.Preferences.setExtensionStringPreference("magnification.level", magnificationLevel); - WebDeveloper.PageMagnifier.update(0, 0); - - event.stopPropagation(); - event.preventDefault(); - } -}; - -// Removes the page magnifier -WebDeveloper.PageMagnifier.removePageMagnifier = function() -{ - var container = document.getElementById("web-developer-page-magnifier-container"); - - container.removeEventListener("DOMMouseScroll", WebDeveloper.PageMagnifier.mouseScroll, true); - window.removeEventListener("mousemove", WebDeveloper.PageMagnifier.mouseMove, false); - - container.hidden = true; -}; - -// Removes the page magnifier toolbar -WebDeveloper.PageMagnifier.removeToolbar = function() -{ - WebDeveloper.Common.configureElement(document.getElementById("web-developer-page-magnifier-toolbar"), "hidden", true); -}; - -// Updates the magnification level -WebDeveloper.PageMagnifier.updateMagnificationLevel = function(element) -{ - var magnificationLevel = element.value; - - // If the magnification level is empty or not a number or less than zero - if(!magnificationLevel || parseFloat(magnificationLevel) != magnificationLevel || magnificationLevel <= 0) - { - WebDeveloper.Common.displayError(WebDeveloper.Locales.getString("displayPageMagnifier"), WebDeveloper.Locales.getString("invalidMagnificationLevel")); - } - else - { - WebDeveloper.Preferences.setExtensionStringPreference("magnification.level", magnificationLevel); - WebDeveloper.PageMagnifier.update(0, 0); - } -}; - -// Updates the page magnifier -WebDeveloper.PageMagnifier.update = function(xPosition, yPosition) -{ - var canvas = document.getElementById("web-developer-page-magnifier"); - - // If the canvas was found - if(canvas) - { - var context = canvas.getContext("2d"); - var height = canvas.height; - var magnificationLevel = parseFloat(WebDeveloper.Preferences.getExtensionStringPreference("magnification.level")); - var width = canvas.width; - - // If the magnification level is not valid - if(typeof magnificationLevel == "number" && isNaN(magnificationLevel)) - { - magnificationLevel = 2; - } - - context.save(); - context.scale(magnificationLevel, magnificationLevel); - context.drawWindow(WebDeveloper.Common.getContentWindow(), xPosition, yPosition, (xPosition + width) / magnificationLevel, (yPosition + height) / magnificationLevel, "rgb(255, 255, 255)"); - context.restore(); - } -}; diff --git a/source/firefox/javascript/toolbar/page-validation.js b/source/firefox/javascript/toolbar/page-validation.js deleted file mode 100644 index b016d4d..0000000 --- a/source/firefox/javascript/toolbar/page-validation.js +++ /dev/null @@ -1,370 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.PageValidation = WebDeveloper.PageValidation || {}; -WebDeveloper.PageValidation.cssValidator = null; -WebDeveloper.PageValidation.htmlValidator = null; -WebDeveloper.PageValidation.selectedTab = 0; - -// Clears the CSS validation details for the page -WebDeveloper.PageValidation.clearCSSValidation = function() -{ - var validationButton = document.getElementById("web-developer-css-validation"); - - // If the validation button is set - if(validationButton) - { - validationButton.label = ""; - - // If the validation button has a class attribute - if(validationButton.hasAttribute("class")) - { - validationButton.removeAttribute("class"); - } - } - - // If the CSS validator is set - if(WebDeveloper.PageValidation.cssValidator) - { - WebDeveloper.PageValidation.cssValidator.cleanUp(); - } -}; - -// Clears the HTML validation details for the page -WebDeveloper.PageValidation.clearHTMLValidation = function() -{ - var validationButton = document.getElementById("web-developer-html-validation"); - - // If the validation button is set - if(validationButton) - { - validationButton.label = ""; - - // If the validation button has a class attribute - if(validationButton.hasAttribute("class")) - { - validationButton.removeAttribute("class"); - } - } - - // If the HTML validator is set - if(WebDeveloper.PageValidation.htmlValidator) - { - WebDeveloper.PageValidation.htmlValidator.cleanUp(); - } -}; - -// Creates the page validation toolbar -WebDeveloper.PageValidation.createToolbar = function() -{ - var contentDocument = WebDeveloper.Common.getContentDocument(); - - WebDeveloper.PageValidation.cssValidator = new WebDeveloperValidateCSS(); - WebDeveloper.PageValidation.htmlValidator = new WebDeveloperValidateHTML(); - - WebDeveloper.PageValidation.updateCSSValidation(contentDocument); - WebDeveloper.PageValidation.updateHTMLValidation(contentDocument, WebDeveloper.Common.getContentWindow()); - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-page-validation-toolbar"), "hidden", false); - - // Try to get the tab browser - try - { - var tabBrowser = WebDeveloper.Common.getTabBrowser(); - - // If the tab browser is set - if(tabBrowser) - { - var tabContainer = tabBrowser.tabContainer; - - tabBrowser.addEventListener("load", WebDeveloper.PageValidation.pageLoad, true); - tabBrowser.addEventListener("unload", WebDeveloper.PageValidation.pageUnload, true); - - // If the tab container is set - if(tabContainer) - { - tabContainer.addEventListener("TabSelect", WebDeveloper.PageValidation.tabSelect, false); - } - } - } - catch(exception) - { - // Ignore - } -}; - -// Displays a page validation toolbar -WebDeveloper.PageValidation.displayPageValidation = function(display) -{ - WebDeveloper.PageValidation.clearCSSValidation(); - WebDeveloper.PageValidation.clearHTMLValidation(); - - // If displaying a page magnifier - if(display) - { - WebDeveloper.PageValidation.createToolbar(); - } - else - { - WebDeveloper.PageValidation.removeToolbar(); - } -}; - -// Checks if the page is validatable -WebDeveloper.PageValidation.isValidatablePage = function(uri) -{ - // If the URI is set and is validatable - if(uri && uri != "about:blank" && uri != "http://www.hermish.com/check_this.cfm" && uri != "http://jigsaw.w3.org/css-validator/validator" && uri != "http://validator.w3.org/check") - { - return true; - } - - return false; -}; - -// Handles the page being loaded -WebDeveloper.PageValidation.pageLoad = function(event) -{ - var originalTarget = event.originalTarget; - - // If the event came from an HTML document and it is not a frame - if(originalTarget instanceof HTMLDocument && !originalTarget.defaultView.frameElement) - { - var contentDocument = WebDeveloper.Common.getContentDocument(); - - WebDeveloper.PageValidation.clearCSSValidation(); - WebDeveloper.PageValidation.clearHTMLValidation(); - - // If the page is validatable - if(WebDeveloper.PageValidation.isValidatablePage(contentDocument.documentURI)) - { - WebDeveloper.PageValidation.updateCSSValidation(contentDocument); - WebDeveloper.PageValidation.updateHTMLValidation(contentDocument, WebDeveloper.Common.getContentWindow()); - } - } -}; - -// Handles the page being unloaded -WebDeveloper.PageValidation.pageUnload = function(event) -{ - var originalTarget = event.originalTarget; - - // If the event came from an HTML document and it is not a frame - if(originalTarget instanceof HTMLDocument && !originalTarget.defaultView.frameElement) - { - WebDeveloper.PageValidation.clearCSSValidation(); - WebDeveloper.PageValidation.clearHTMLValidation(); - } -}; - -// Handles a tab being selected -WebDeveloper.PageValidation.tabSelect = function() -{ - var tabBrowser = WebDeveloper.Common.getTabBrowser(); - var selectedTab = tabBrowser.mTabBox.selectedIndex; - - // If the selected tab is different - if(selectedTab != WebDeveloper.PageValidation.selectedTab) - { - var contentDocument = WebDeveloper.Common.getContentDocument(); - - WebDeveloper.PageValidation.selectedTab = selectedTab; - - WebDeveloper.PageValidation.clearCSSValidation(); - WebDeveloper.PageValidation.clearHTMLValidation(); - - // If the page is validatable - if(WebDeveloper.PageValidation.isValidatablePage(contentDocument.documentURI)) - { - WebDeveloper.PageValidation.updateCSSValidation(contentDocument); - WebDeveloper.PageValidation.updateHTMLValidation(contentDocument, WebDeveloper.Common.getContentWindow()); - } - } -}; - -// Removes the page validation toolbar -WebDeveloper.PageValidation.removeToolbar = function() -{ - WebDeveloper.PageValidation.cssValidator = null; - WebDeveloper.PageValidation.htmlValidator = null; - - WebDeveloper.Common.configureElement(document.getElementById("web-developer-page-validation-toolbar"), "hidden", true); - - // Try to get the tab browser - try - { - var tabBrowser = WebDeveloper.Common.getTabBrowser(); - - // If the tab browser is set - if(tabBrowser) - { - var tabContainer = tabBrowser.tabContainer; - - tabBrowser.removeEventListener("load", WebDeveloper.PageValidation.pageLoad, true); - tabBrowser.removeEventListener("unload", WebDeveloper.PageValidation.pageUnload, true); - - // If the tab container is set - if(tabContainer) - { - tabContainer.removeEventListener("TabSelect", WebDeveloper.PageValidation.tabSelect, false); - } - } - } - catch(exception) - { - // Ignore - } -}; - -// Updates the CSS validation for the page -WebDeveloper.PageValidation.updateCSSValidation = function(contentDocument) -{ - WebDeveloper.PageValidation.updateValidation(document.getElementById("web-developer-css-validation")); - WebDeveloper.PageValidation.cssValidator.cleanUp(); - WebDeveloper.PageValidation.cssValidator.validateBackgroundCSS(Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService).newURI(contentDocument.documentURI, null, null), WebDeveloper.Content.getCSS()); -}; - -// Updates the CSS validation details for the page -WebDeveloper.PageValidation.updateCSSValidationDetails = function() -{ - // If the CSS validation request is set and is ready - if(WebDeveloper.PageValidation.cssValidator.validationRequest && WebDeveloper.PageValidation.cssValidator.validationRequest.readyState == 4) - { - var buttonUpdated = false; - var validationButton = document.getElementById("web-developer-css-validation"); - - // If the validation button is set - if(validationButton) - { - // Try to check the validation status - try - { - // If the validation status is set to success - if(WebDeveloper.PageValidation.cssValidator.validationRequest.status == 200) - { - var validationStatus = WebDeveloper.PageValidation.cssValidator.validationRequest.getResponseHeader("X-W3C-Validator-Status"); - - // If the validation status is set - if(validationStatus) - { - // If the validation status is valid - if(validationStatus == "Valid") - { - buttonUpdated = true; - validationButton.label = WebDeveloper.Locales.getString("valid"); - - validationButton.setAttribute("class", "valid"); - } - else if(validationStatus != "Abort") - { - buttonUpdated = true; - validationButton.label = WebDeveloper.Locales.getString("invalid") + ": " + WebDeveloper.PageValidation.cssValidator.validationRequest.getResponseHeader("X-W3C-Validator-Errors") + " " + WebDeveloper.Locales.getString("errors").toLowerCase(); - - validationButton.setAttribute("class", "invalid"); - } - } - } - } - catch(exception) - { - // Ignore - } - - // If the button was not updated - if(!buttonUpdated) - { - validationButton.label = ""; - - // If the validation button has a class - if(validationButton.hasAttribute("class")) - { - validationButton.removeAttribute("class"); - } - } - } - - WebDeveloper.PageValidation.cssValidator.cleanUp(); - } -}; - -// Updates the HTML validation for the page -WebDeveloper.PageValidation.updateHTMLValidation = function(contentDocument, contentWindow) -{ - WebDeveloper.PageValidation.updateValidation(document.getElementById("web-developer-html-validation")); - WebDeveloper.PageValidation.htmlValidator.cleanUp(); - WebDeveloper.PageValidation.htmlValidator.validateBackgroundHTML(Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService).newURI(contentDocument.documentURI, null, null), contentWindow); -}; - -// Updates the HTML validation details for the page -WebDeveloper.PageValidation.updateHTMLValidationDetails = function() -{ - // If the HTML validation request is set and is ready - if(WebDeveloper.PageValidation.htmlValidator.validationRequest && WebDeveloper.PageValidation.htmlValidator.validationRequest.readyState == 4) - { - var buttonUpdated = false; - var validationButton = document.getElementById("web-developer-html-validation"); - - // If the validation button is set - if(validationButton) - { - // Try to check the validation status - try - { - // If the validation status is set to success - if(WebDeveloper.PageValidation.htmlValidator.validationRequest.status == 200) - { - var validationResponse = WebDeveloper.PageValidation.htmlValidator.validationRequest.responseText; - - // If the validation response is set - if(validationResponse) - { - // If the validation response contains success - if(validationResponse.indexOf('

      ') != -1) - { - buttonUpdated = true; - validationButton.label = WebDeveloper.Locales.getString("valid"); - - validationButton.setAttribute("class", "valid"); - } - else if(validationResponse.indexOf('

      ') != -1) - { - buttonUpdated = true; - validationButton.label = WebDeveloper.Locales.getString("invalid") + ": " + WebDeveloper.Common.getOccurrenceCount(validationResponse, '

    1. WebDeveloper.Ruler.startX) - { - document.getElementById("web-developer-ruler-end-x").value = WebDeveloper.Ruler.endX + 2 + "px"; - document.getElementById("web-developer-ruler-start-x").value = WebDeveloper.Ruler.startX + "px"; - } - else - { - document.getElementById("web-developer-ruler-end-x").value = WebDeveloper.Ruler.endX + "px"; - document.getElementById("web-developer-ruler-start-x").value = WebDeveloper.Ruler.startX + 2 + "px"; - } - - // If the end y position is greater than the start y position - if(WebDeveloper.Ruler.endY > WebDeveloper.Ruler.startY) - { - document.getElementById("web-developer-ruler-end-y").value = WebDeveloper.Ruler.endY + 2 + "px"; - document.getElementById("web-developer-ruler-start-y").value = WebDeveloper.Ruler.startY + "px"; - } - else - { - document.getElementById("web-developer-ruler-end-y").value = WebDeveloper.Ruler.endY + "px"; - document.getElementById("web-developer-ruler-start-y").value = WebDeveloper.Ruler.startY + 2 + "px"; - } - } -}; - -// Updates the ruler width -WebDeveloper.Ruler.updateWidth = function(element) -{ - var width = element.value.replace(/px/gi, ""); - - // If the width is empty or not a number or less than zero - if(!width || parseInt(width, 10) != width || width <= 0) - { - WebDeveloper.Common.displayError(WebDeveloper.Locales.getString("displayRuler"), WebDeveloper.Locales.getString("invalidWidth")); - } - else - { - var contentDocument = WebDeveloper.Common.getContentDocument(); - - width = parseInt(width, 10); - WebDeveloper.Ruler.ruler.style.width = width - 2 + "px"; - WebDeveloper.Ruler.endX = WebDeveloper.Ruler.startX + width; - - WebDeveloper.Ruler.resizeBackgrounds(); - WebDeveloper.Ruler.updateInformation(contentDocument); - } -}; diff --git a/source/firefox/javascript/upgrade/upgrade.js b/source/firefox/javascript/upgrade/upgrade.js deleted file mode 100644 index e7bec70..0000000 --- a/source/firefox/javascript/upgrade/upgrade.js +++ /dev/null @@ -1,237 +0,0 @@ -var WebDeveloper = WebDeveloper || {}; // eslint-disable-line no-use-before-define - -WebDeveloper.Upgrade = WebDeveloper.Upgrade || {}; - -// Returns the legacy extension preferences branch -WebDeveloper.Upgrade.getLegacyExtensionBranch = function() -{ - return WebDeveloper.Preferences.getBranch("webdeveloper."); -}; - -// Migrate to version 1.2 -WebDeveloper.Upgrade.migrate12 = function() -{ - WebDeveloper.Upgrade.migrateLegacyBooleanPreference("confirmation.dialogs.hide"); - WebDeveloper.Upgrade.migrateLegacyBooleanPreference("context.hide"); - WebDeveloper.Upgrade.migrateLegacyStringPreference("dashboard.position"); - WebDeveloper.Upgrade.migrateLegacyBooleanPreference("edit.stick", "edit.css.pin"); - WebDeveloper.Upgrade.migrateLegacyIntegerPreference("font.minimum.size"); - WebDeveloper.Upgrade.migrateLegacyStringPreference("magnification.level"); - WebDeveloper.Upgrade.migrateLegacyBooleanPreference("menu.hide"); - WebDeveloper.Upgrade.migrateLegacyBooleanPreference("persist.features", "pin.features"); - WebDeveloper.Upgrade.migrateLegacyStringPreference("populate.form.fields.email", "populate.email.address"); - WebDeveloper.Upgrade.migrateLegacyBooleanPreference("resize.viewport"); - WebDeveloper.Upgrade.migrateLegacyStringPreference("toolbar.icons"); - - WebDeveloper.Upgrade.migrateLegacyResizePreferences(); - WebDeveloper.Upgrade.migrateLegacyToolPreferences(); - - WebDeveloper.Preferences.deletePreferenceBranch(WebDeveloper.Upgrade.getLegacyExtensionBranch()); -}; - -// Migrates a legacy boolean preference -WebDeveloper.Upgrade.migrateLegacyBooleanPreference = function(legacyPreference, preference) -{ - var value = null; - - // If the preference is not set - if(!preference) - { - preference = legacyPreference; - } - - value = WebDeveloper.Preferences.getBooleanPreference(legacyPreference, WebDeveloper.Upgrade.getLegacyExtensionBranch()); - - // If the value is set - if(value) - { - WebDeveloper.Preferences.setExtensionBooleanPreference(preference, value); - } -}; - -// Migrates a legacy integer preference -WebDeveloper.Upgrade.migrateLegacyIntegerPreference = function(legacyPreference, preference) -{ - var legacyBranch = WebDeveloper.Upgrade.getLegacyExtensionBranch(); - - // If the preference is not set - if(!preference) - { - preference = legacyPreference; - } - - // If the legacy preference is set - if(WebDeveloper.Preferences.isPreferenceSet(legacyPreference, legacyBranch)) - { - var value = WebDeveloper.Preferences.getIntegerPreference(legacyPreference, legacyBranch); - - // If the value does not equal the new preference - if(value !== WebDeveloper.Preferences.getExtensionIntegerPreference(preference)) - { - WebDeveloper.Preferences.setExtensionIntegerPreference(preference, value); - } - } -}; - -// Migrates the legacy resize preferences -WebDeveloper.Upgrade.migrateLegacyResizePreferences = function() -{ - var legacyBranch = WebDeveloper.Upgrade.getLegacyExtensionBranch(); - var preference = "resize.count"; - var resizeCount = WebDeveloper.Preferences.getIntegerPreference(preference, legacyBranch); - var value = null; - - // If the resize count is greater than the new preference - if(resizeCount > WebDeveloper.Preferences.getExtensionIntegerPreference(preference)) - { - WebDeveloper.Preferences.setExtensionIntegerPreference(preference, resizeCount); - } - - // Loop through the possible resize options - for(var i = 1; i <= resizeCount; i++) - { - preference = "resize." + i + ".description"; - value = WebDeveloper.Preferences.getStringPreference(preference, legacyBranch); - - // If the legacy description is set and does not equal the new preference - if(value && value !== WebDeveloper.Preferences.getLocalizedPreference(preference)) - { - WebDeveloper.Preferences.setExtensionStringPreference(preference, value); - } - - preference = "resize." + i + ".height"; - value = WebDeveloper.Preferences.getIntegerPreference(preference, legacyBranch); - - // If the legacy height is set and does not equal the new preference - if(value > 0 && value !== WebDeveloper.Preferences.getExtensionIntegerPreference(preference)) - { - WebDeveloper.Preferences.setExtensionIntegerPreference(preference, value); - } - - preference = "resize." + i + ".width"; - value = WebDeveloper.Preferences.getIntegerPreference(preference, legacyBranch); - - // If the legacy width is set and does not equal the new preference - if(value > 0 && value !== WebDeveloper.Preferences.getExtensionIntegerPreference(preference)) - { - WebDeveloper.Preferences.setExtensionIntegerPreference(preference, value); - } - - preference = "resize." + i + ".viewport"; - value = WebDeveloper.Preferences.getBooleanPreference(preference, legacyBranch); - - // If the legacy viewport is set - if(value) - { - WebDeveloper.Preferences.setExtensionBooleanPreference(preference, value); - } - } -}; - -// Migrates a legacy string preference -WebDeveloper.Upgrade.migrateLegacyStringPreference = function(legacyPreference, preference) -{ - var legacyBranch = WebDeveloper.Upgrade.getLegacyExtensionBranch(); - - // If the preference is not set - if(!preference) - { - preference = legacyPreference; - } - - // If the legacy preference is set - if(WebDeveloper.Preferences.isPreferenceSet(legacyPreference, legacyBranch)) - { - var value = WebDeveloper.Preferences.getStringPreference(legacyPreference, legacyBranch); - - // If the value does not equal the new preference - if(value !== WebDeveloper.Preferences.getExtensionStringPreference(preference)) - { - WebDeveloper.Preferences.setExtensionStringPreference(preference, value); - } - } -}; - -// Migrates the legacy tool preferences -WebDeveloper.Upgrade.migrateLegacyToolPreferences = function() -{ - var legacyBranch = WebDeveloper.Upgrade.getLegacyExtensionBranch(); - var preference = "tool.count"; - var toolCount = WebDeveloper.Preferences.getIntegerPreference(preference, legacyBranch); - var value = null; - - // If the tool count is greater than the new preference - if(toolCount > WebDeveloper.Preferences.getExtensionIntegerPreference(preference)) - { - WebDeveloper.Preferences.setExtensionIntegerPreference(preference, toolCount); - } - - // Loop through the possible tools - for(var i = 1; i <= toolCount; i++) - { - preference = "tool." + i + ".separator"; - value = WebDeveloper.Preferences.getBooleanPreference(preference, legacyBranch); - - // If the legacy separator is set and does not equal the new preference - if(value && value !== WebDeveloper.Preferences.getExtensionBooleanPreference(preference)) - { - WebDeveloper.Preferences.setExtensionBooleanPreference(preference, value); - } - else - { - preference = "tool." + i + ".description"; - value = WebDeveloper.Preferences.getStringPreference(preference, legacyBranch); - - // If the legacy description is set and does not equal the new preference - if(value && value !== WebDeveloper.Preferences.getLocalizedPreference(preference)) - { - WebDeveloper.Preferences.setExtensionStringPreference(preference, value); - } - - preference = "tool." + i + ".path"; - value = WebDeveloper.Preferences.getStringPreference(preference, legacyBranch); - - // If the legacy path is set and does not equal the new preference - if(value && value !== WebDeveloper.Preferences.getExtensionStringPreference(preference)) - { - WebDeveloper.Preferences.setExtensionStringPreference(preference, value); - } - - preference = "tool." + i + ".url"; - value = WebDeveloper.Preferences.getStringPreference(preference, legacyBranch); - - // If the legacy url is set and does not equal the new preference - if(value && value !== WebDeveloper.Preferences.getExtensionStringPreference(preference)) - { - WebDeveloper.Preferences.setExtensionStringPreference(preference, value); - } - } - } -}; - -// Opens the upgrade URL -WebDeveloper.Upgrade.openUpgradeURL = function(version) -{ - // Set a timeout to make sure the window has finished loading - window.setTimeout(function() - { - var tabBrowser = WebDeveloper.Common.getTabBrowser(); - var newTab = tabBrowser.addTab("@url@/@browser@/installed/" + version + "/"); - - tabBrowser.selectedTab = newTab; - }, 0); -}; - -// Upgrades the extension -WebDeveloper.Upgrade.upgrade = function() -{ - var previousVersion = WebDeveloper.Preferences.getExtensionStringPreference("version"); - - // If the versions do not match - if(previousVersion != "@version@") - { - WebDeveloper.Preferences.setExtensionStringPreference("version", "@version@"); - WebDeveloper.Upgrade.openUpgradeURL("@version@"); - WebDeveloper.Upgrade.migrate12(); - } -}; diff --git a/source/firefox/javascript/validation/css.js b/source/firefox/javascript/validation/css.js deleted file mode 100644 index 1195818..0000000 --- a/source/firefox/javascript/validation/css.js +++ /dev/null @@ -1,240 +0,0 @@ -// Constructs a validate CSS object -function WebDeveloperValidateCSS() -{ - this.file = null; - this.validationRequest = null; -} - -// Cleans up -WebDeveloperValidateCSS.prototype.cleanUp = function() -{ - // If the file is set - if(this.file) - { - // Try to delete the file - try - { - this.file.remove(false); - } - catch(exception) - { - // Ignore - } - - this.file = null; - } - - // If the validation request is set - if(this.validationRequest) - { - this.validationRequest.abort(); - } -}; - -// Creates a source file -WebDeveloperValidateCSS.prototype.createSourceFile = function(uri) -{ - var temporaryDirectory = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("TmpD", Components.interfaces.nsIFile); - - // If the temporary directory exists, is a directory and is writable - if(temporaryDirectory.exists() && temporaryDirectory.isDirectory() && temporaryDirectory.isWritable()) - { - var fileName = ""; - var sourceFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); - - // Try to get the host - try - { - fileName = uri.host; - } - catch(exception) - { - // Ignore - } - - temporaryDirectory.append("web-developer-" + fileName + "-" + new Date().getTime() + ".css"); - sourceFile.initWithPath(temporaryDirectory.path); - - return sourceFile; - } - - WebDeveloper.Common.displayError(WebDeveloper.Locales.getString("validateCSS"), WebDeveloper.Locales.getFormattedString("temporaryDirectoryFailed", [temporaryDirectory.path])); - - return null; -}; - -// Returns the CSS as text -WebDeveloperValidateCSS.prototype.getCSS = function(css, callback) -{ - var contentDocument = null; - var cssText = ""; - var documents = css.documents; - var styleSheets = null; - var urlContentRequests = []; - - // Loop through the documents - for(var i = 0, l = documents.length; i < l; i++) - { - contentDocument = documents[i]; - styleSheets = contentDocument.styleSheets; - - // If there are embedded styles - if(contentDocument.embedded) - { - cssText += contentDocument.embedded; - } - - // Loop through the style sheets - for(var j = 0, m = styleSheets.length; j < m; j++) - { - urlContentRequests.push({ url: styleSheets[j] }); - } - } - - // If there are external style sheets to get the CSS from - if(urlContentRequests.length) - { - WebDeveloper.Common.getURLContents(urlContentRequests, "", function() - { - // Loop through the URL content requests - for(var k = 0, n = urlContentRequests.length; k < n; k++) - { - cssText += urlContentRequests[k].content; - } - - callback(cssText); - }); - } - else - { - callback(cssText); - } -}; - -// Parses the validation results by type -WebDeveloperValidateCSS.prototype.parseValidationResultsByType = function(type) -{ - var count = 0; - var resultsHTML = this.validationRequest.responseText; - var startPosition = resultsHTML.indexOf('
      '); - - // If the start position is greater than 0 - if(startPosition > 0) - { - var endPosition = resultsHTML.indexOf("
      ", startPosition); - - // If the end position is greater than 0 - if(endPosition > 0) - { - count = resultsHTML.slice(startPosition, endPosition).split("
    2. ").length; - } - } - - // If the count is greater than 0 - if(count > 0) - { - return count - 1; - } - - return 0; -}; - -// Validate the CSS from the given URI and document list in the background -WebDeveloperValidateCSS.prototype.validateBackgroundCSS = function(uri, css) -{ - var boundaryString = new Date().getTime(); - var boundary = "--" + boundaryString; - var fileName = "css"; - var validator = this; - - // Try to get the host - try - { - fileName = uri.host; - } - catch(exception) - { - // Ignore - } - - // If the validation request is not set - if(!this.validationRequest) - { - this.validationRequest = new XMLHttpRequest(); - } - - this.validationRequest.onreadystatechange = WebDeveloper.PageValidation.updateCSSValidationDetails; - - this.validationRequest.open("post", "http://jigsaw.w3.org/css-validator/validator"); - this.validationRequest.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundaryString); - - this.getCSS(css, function(cssText) - { - var requestBody = boundary + "\r\nContent-Disposition: form-data; name=\"file\"; filename=\"" + fileName + ".css\"\r\n"; - - requestBody += "Content-Type: text/css\r\n\r\n"; - requestBody += cssText + "\r\n"; - requestBody += boundary + "\r\n"; - requestBody += "Content-Disposition: form-data; name=\"profile\"\r\n\r\ncss3\r\n"; - requestBody += boundary + "\r\n"; - requestBody += "Content-Disposition: form-data; name=\"usermedium\"\r\n\r\nall\r\n"; - requestBody += boundary + "\r\n"; - requestBody += "Content-Disposition: form-data; name=\"warning\"\r\n\r\n0\r\n"; - requestBody += boundary + "--"; - - // Try to send the request - try - { - validator.validationRequest.sendAsBinary(requestBody); - } - catch(exception2) - { - // Try to send as a blob - try - { - validator.validationRequest.send(new Blob([requestBody], { type: "text/css" })); - } - catch(exception3) - { - // Reset the validation request - validator.validationRequest = new XMLHttpRequest(); - } - } - }); -}; - -// Validate the CSS from the given URI and document list -WebDeveloperValidateCSS.prototype.validateCSS = function(uri, css) -{ - var tab = WebDeveloper.Common.getTabBrowser().getBrowserForTab(WebDeveloper.Common.openURL(WebDeveloper.Common.getChromeURL("validation/css.html"))); - var load = (function(validator, url) - { - var handler = function() - { - validator.getCSS(css, function(cssText) - { - var contentDocument = tab.contentDocument; - var outputStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); - - validator.file = validator.createSourceFile(url); - - validator.file.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, parseInt(644, 8)); - outputStream.init(validator.file, parseInt(4, 16) | parseInt(8, 16) | parseInt(20, 16), parseInt(644, 8), null); - - outputStream.write(cssText, cssText.length); - outputStream.close(); - - contentDocument.getElementById("file").value = validator.file.path; - - contentDocument.getElementById("form").submit(); - window.setTimeout(function() { validator.cleanUp(); }, 1000); - }); - - tab.removeEventListener("load", handler, true); - }; - - return handler; - })(this, uri); - - tab.addEventListener("load", load, true); -}; diff --git a/source/firefox/javascript/validation/html.js b/source/firefox/javascript/validation/html.js deleted file mode 100644 index 8f8259f..0000000 --- a/source/firefox/javascript/validation/html.js +++ /dev/null @@ -1,255 +0,0 @@ -// Constructs a validate HTML object -function WebDeveloperValidateHTML() -{ - this.file = null; - this.fileElement = null; - this.formElement = null; - this.validationRequest = null; -} - -// Cleans up -WebDeveloperValidateHTML.prototype.cleanUp = function() -{ - // If the file is set - if(this.file) - { - // Try to delete the file - try - { - this.file.remove(false); - } - catch(exception) - { - // Ignore - } - - this.file = null; - } - - // If the validation request is set - if(this.validationRequest) - { - this.validationRequest.abort(); - } -}; - -// Creates a source file -WebDeveloperValidateHTML.prototype.createSourceFile = function(uri) -{ - var temporaryDirectory = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("TmpD", Components.interfaces.nsIFile); - - // If the temporary directory exists, is a directory and is writable - if(temporaryDirectory.exists() && temporaryDirectory.isDirectory() && temporaryDirectory.isWritable()) - { - var fileName = ""; - var sourceFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); - - // Try to get the host - try - { - fileName = uri.host; - } - catch(exception) - { - // Ignore - } - - temporaryDirectory.append("web-developer-" + fileName + "-" + new Date().getTime() + ".html"); - sourceFile.initWithPath(temporaryDirectory.path); - - return sourceFile; - } - - WebDeveloper.Common.displayError(WebDeveloper.Locales.getString("validateHTML"), WebDeveloper.Locales.getFormattedString("temporaryDirectoryFailed", [temporaryDirectory.path])); - - return null; -}; - -// Returns the post data -WebDeveloperValidateHTML.prototype.getPostData = function() -{ - // Try to get the post data - try - { - var sessionHistory = getWebNavigation().sessionHistory; - var entry = sessionHistory.getEntryAtIndex(sessionHistory.index, false).QueryInterface(Components.interfaces.nsISHEntry); - - return entry.postData; - } - catch(exception) - { - return null; - } -}; - -// Saves the HTML -WebDeveloperValidateHTML.prototype.saveHTML = function(uri, contentWindow) -{ - var webBrowserPersistInterface = Components.interfaces.nsIWebBrowserPersist; - var webBrowserPersist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(webBrowserPersistInterface); - - webBrowserPersist.persistFlags = webBrowserPersistInterface.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION | webBrowserPersistInterface.PERSIST_FLAGS_FROM_CACHE | webBrowserPersistInterface.PERSIST_FLAGS_REPLACE_EXISTING_FILES; - webBrowserPersist.progressListener = this; - - // Try to use the old method signature for Firefox < 36 - try - { - webBrowserPersist.saveURI(uri, null, uri, this.getPostData(), null, this.file, contentWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIWebNavigation).QueryInterface(Components.interfaces.nsILoadContext)); - } - catch(exception) - { - webBrowserPersist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(webBrowserPersistInterface); - webBrowserPersist.persistFlags = webBrowserPersistInterface.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION | webBrowserPersistInterface.PERSIST_FLAGS_FROM_CACHE | webBrowserPersistInterface.PERSIST_FLAGS_REPLACE_EXISTING_FILES; - webBrowserPersist.progressListener = this; - - webBrowserPersist.saveURI(uri, null, uri, this.getPostData(), null, 0, this.file, contentWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIWebNavigation).QueryInterface(Components.interfaces.nsILoadContext)); - } -}; - -// Submits the background request to validate the HTML -WebDeveloperValidateHTML.prototype.submitBackgroundRequest = function() -{ - var boundaryString = new Date().getTime(); - var boundary = "--" + boundaryString; - var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter); - var inputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream); - var scriptableStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream); - var requestBody = boundary + "\r\nContent-Disposition: form-data; name=\"uploaded_file\"; filename=\"" + this.file.leafName + "\"\r\n"; - - converter.charset = WebDeveloper.Common.getContentDocument().characterSet; - this.validationRequest.onreadystatechange = WebDeveloper.PageValidation.updateHTMLValidationDetails; - - inputStream.init(this.file, parseInt(1, 16), parseInt(444, 8), null); - scriptableStream.init(inputStream); - - requestBody += "Content-Type: text/html\r\n\r\n"; - requestBody += converter.ConvertToUnicode(scriptableStream.read(scriptableStream.available())) + "\r\n"; - requestBody += boundary + "--"; - - scriptableStream.close(); - inputStream.close(); - - this.validationRequest.open("post", "http://validator.w3.org/check"); - - // Try to set the request header - try - { - this.validationRequest.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundaryString); - this.validationRequest.sendAsBinary(requestBody); - } - catch(exception) - { - // Try to send as a blob - try - { - this.validationRequest.send(new Blob([requestBody], { type: "text/html" })); - } - catch(exception2) - { - // Reset the validation request - this.validationRequest = new XMLHttpRequest(); - } - } -}; - -// Submits the form to validate the HTML -WebDeveloperValidateHTML.prototype.submitForm = function() -{ - var that = this; - - this.fileElement.value = this.file.path; - - this.formElement.submit(); - window.setTimeout(function() { that.cleanUp(); }, 5000); -}; - -// Validate the HTML from the given URI in the background -WebDeveloperValidateHTML.prototype.validateBackgroundHTML = function(uri, contentWindow) -{ - this.file = this.createSourceFile(uri); - - // If the validation request is not set - if(!this.validationRequest) - { - this.validationRequest = new XMLHttpRequest(); - } - - this.saveHTML(uri, contentWindow); -}; - -// Validate the HTML from the given URI -WebDeveloperValidateHTML.prototype.validateHTML = function(uri, contentWindow) -{ - var tab = WebDeveloper.Common.getTabBrowser().getBrowserForTab(WebDeveloper.Common.openURL(WebDeveloper.Common.getChromeURL("validation/html.html"))); - var load = (function(validator, url) - { - var handler = function() - { - var contentDocument = tab.contentDocument; - - validator.file = validator.createSourceFile(url); - validator.fileElement = contentDocument.getElementById("file"); - validator.formElement = contentDocument.getElementById("form"); - - validator.saveHTML(url, contentWindow); - - tab.removeEventListener("load", handler, true); - }; - - return handler; - })(this, uri); - - tab.addEventListener("load", load, true); -}; - -// Called when the progress state changes -WebDeveloperValidateHTML.prototype.onStateChange = function(webProgress, request, stateFlags) -{ - // If the progress has stopped - if(stateFlags & Components.interfaces.nsIWebProgressListener.STATE_STOP) - { - // If the file is set and exists - if(this.file && this.file.exists()) - { - // If the validation request is set - if(this.validationRequest) - { - this.submitBackgroundRequest(); - } - else - { - this.submitForm(); - } - } - } -}; - -// Indicates the interfaces this object supports -WebDeveloperValidateHTML.prototype.QueryInterface = function(id) -{ - // If the query is for a supported interface - if(id.equals(Components.interfaces.nsISupports) || id.equals(Components.interfaces.nsIWebProgressListener)) - { - return this; - } - - throw Components.results.NS_NOINTERFACE; -}; - -// Dummy methods requiring implementations -WebDeveloperValidateHTML.prototype.onLocationChange = function() -{ - // Ignore -}; -WebDeveloperValidateHTML.prototype.onProgressChange = function() -{ - // Ignore -}; -WebDeveloperValidateHTML.prototype.onSecurityChange = function() -{ - // Ignore -}; -WebDeveloperValidateHTML.prototype.onStatusChange = function() -{ - // Ignore -}; diff --git a/source/firefox/locales/cs-CZ/dashboard/dashboard.dtd b/source/firefox/locales/cs-CZ/dashboard/dashboard.dtd deleted file mode 100644 index 2e0fdcf..0000000 --- a/source/firefox/locales/cs-CZ/dashboard/dashboard.dtd +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/cs-CZ/dashboard/dashboard.properties b/source/firefox/locales/cs-CZ/dashboard/dashboard.properties deleted file mode 100644 index 17eadd0..0000000 --- a/source/firefox/locales/cs-CZ/dashboard/dashboard.properties +++ /dev/null @@ -1,24 +0,0 @@ -ancestors=Předci -attribute=Atribut -children=Potomci -dom=DOM -layout=Layout -position=Pozice -text=Text -value=Hodnota -ancestorPathCopied=Cesta předka byla zkopírována do schránky. -copyAncestorPath=Kopírovat cestu předka -elementInformation=Informace o prvku -selectAnElementDisplayInformation=Pro zobrazení informací vyberte požadovaný prvek -inlineStyles=Inline styly -line=Řádka -noStyleInformation=Žádné informace o stylech -selectAnElementDisplayStyles=Pro zobrazení použitých strylů vyberte požadovaný prvek. -editCSS=Upravit CSS -embeddedStyles=Vložené styly -openStyleSheet=Otevřít soubor stylů -pinCSS=Připnout CSS -saveStyleSheet=Uložit soubor stylů -styleSheetDescription=Soubory stylů -unpinCSS=Odepout CSS -saveHTML=Uložit HTML diff --git a/source/firefox/locales/cs-CZ/dialogs/cookie.dtd b/source/firefox/locales/cs-CZ/dialogs/cookie.dtd deleted file mode 100644 index e82ff73..0000000 --- a/source/firefox/locales/cs-CZ/dialogs/cookie.dtd +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/source/firefox/locales/cs-CZ/dialogs/cookie.properties b/source/firefox/locales/cs-CZ/dialogs/cookie.properties deleted file mode 100644 index 0577cd8..0000000 --- a/source/firefox/locales/cs-CZ/dialogs/cookie.properties +++ /dev/null @@ -1 +0,0 @@ -addCookieError=Při přidávání cookie nastala chyba diff --git a/source/firefox/locales/cs-CZ/dialogs/message.dtd b/source/firefox/locales/cs-CZ/dialogs/message.dtd deleted file mode 100644 index 0d7b29e..0000000 --- a/source/firefox/locales/cs-CZ/dialogs/message.dtd +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/source/firefox/locales/cs-CZ/dialogs/outline-custom-elements.dtd b/source/firefox/locales/cs-CZ/dialogs/outline-custom-elements.dtd deleted file mode 100644 index 9266046..0000000 --- a/source/firefox/locales/cs-CZ/dialogs/outline-custom-elements.dtd +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/source/firefox/locales/cs-CZ/dialogs/resize-window.dtd b/source/firefox/locales/cs-CZ/dialogs/resize-window.dtd deleted file mode 100644 index f654da9..0000000 --- a/source/firefox/locales/cs-CZ/dialogs/resize-window.dtd +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/source/firefox/locales/cs-CZ/dialogs/resize-window.properties b/source/firefox/locales/cs-CZ/dialogs/resize-window.properties deleted file mode 100644 index de04df1..0000000 --- a/source/firefox/locales/cs-CZ/dialogs/resize-window.properties +++ /dev/null @@ -1,3 +0,0 @@ -invalidHeight=Zadejte správně výšku. -invalidWidth=Zadejte správně šířku. -resizeWindow=Změnit velikost okna diff --git a/source/firefox/locales/cs-CZ/options/options.dtd b/source/firefox/locales/cs-CZ/options/options.dtd deleted file mode 100644 index 954a64f..0000000 --- a/source/firefox/locales/cs-CZ/options/options.dtd +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/cs-CZ/options/options.properties b/source/firefox/locales/cs-CZ/options/options.properties deleted file mode 100644 index 860f6b8..0000000 --- a/source/firefox/locales/cs-CZ/options/options.properties +++ /dev/null @@ -1,36 +0,0 @@ -delete=Smazat -no=Ne -yes=Ano -deleteKeyboardShortcut=Smazat klávesovou zkratku -deleteKeyboardShortcutConfirmation=Opravdu chcete smazat klávesovou zkratku %S? -extensions.webdeveloper.keyboard.1.key=T -extensions.webdeveloper.keyboard.2.key=D -extensions.webdeveloper.keyboard.3.key=L -extensions.webdeveloper.keyboard.4.key=C -extensions.webdeveloper.keyboard.5.key=J -extensions.webdeveloper.keyboard.6.key=U -extensions.webdeveloper.keyboard.7.key=Y -deleteResizeOption=Odstranění nastavení rozlišení -deleteResizeOptionConfirmation=Opravdu chcete odstranit %S nastavení rozlišení? -extensions.webdeveloper.resize.1.description=1024x768 -deleteResponsiveLayout=Odstranění responsivního layoutu -deleteResponsiveLayoutConfirmation=Opravdu chcete odstranit %S responsivní layout? -extensions.webdeveloper.responsive.layout.1.description=Mobil na výšku -extensions.webdeveloper.responsive.layout.2.description=Mobil na šířku -extensions.webdeveloper.responsive.layout.3.description=Malý tablet na výšku -extensions.webdeveloper.responsive.layout.4.description=Malý tablet na šířku -extensions.webdeveloper.responsive.layout.5.description=Tablet na výšku -extensions.webdeveloper.responsive.layout.6.description=Tablet na šířku -chooseApplication=Vyberte aplikaci -deleteTool=Odstranění nástroje -deleteToolConfirmation=Opravdu chcete odstranit tento nástroj %S? -extensions.webdeveloper.tool.1.description=Validovat CSS -extensions.webdeveloper.tool.2.description=Validovat feed -extensions.webdeveloper.tool.3.description=Validovat HTML -extensions.webdeveloper.tool.3.key=H -extensions.webdeveloper.tool.4.description=Validovat odkazy -extensions.webdeveloper.tool.5.description=Validovat přístupnost podle Section 508 -extensions.webdeveloper.tool.6.description=Validovat přístupnost podle WAI -invalidApplication=Aplikace '%S' není platnou aplikací. -deleteViewSourceWithOption=Odstranit aplikaci pro zobrazení zdroje -deleteViewSourceWithOptionConfirmation=Opravdu chcete odstranit aplikaci %S pro zobrazení zdroje? diff --git a/source/firefox/locales/cs-CZ/overlay/overlay.dtd b/source/firefox/locales/cs-CZ/overlay/overlay.dtd deleted file mode 100644 index 1b0f263..0000000 --- a/source/firefox/locales/cs-CZ/overlay/overlay.dtd +++ /dev/null @@ -1,442 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/cs-CZ/overlay/overlay.properties b/source/firefox/locales/cs-CZ/overlay/overlay.properties deleted file mode 100644 index fe9a4dc..0000000 --- a/source/firefox/locales/cs-CZ/overlay/overlay.properties +++ /dev/null @@ -1,282 +0,0 @@ -# Common -about=O -action=Akce -alt=Alt -anchor=Kotva -anchors=Kotvy -author=Autor -bytes=bytů -cancel=Zrušit -clear=Vymazat -color=Barva -colors=Barvy -content=Obsah -cookie=Cookie -cookies=Cookies -css=CSS -dark=Dark -delete=Smazat -depth=Hloubka -document=Dokument -documents=Dokumenty -edit=Upravit… -elements=Prvky -errors=Chyby -expires=Vyprší -file=Soubor -files=Soubory -form=Formulář -forms=Formuláře -from=Formulář -heading=Záhlaví -headings=Záhlaví -height=Výška -host=Server -id=Id -image=Obrázek -images=Obrázky -invalid=Nevalidní -javaScript=JavaScript -kilobytes=kb -label=Jmenovka -layouts=Layouty -light=Light -link=Odkaz -links=Odkazy -loading=Načítání -method=Metoda -name=Název -no=Ne -none=None -object=Objekt -objects=Objekty -password=Heslo -path=Cesta -position=Pozice -property=Vlastnost -save=Uložit -script=Skript -scripts=Scripty -secure=Zabezpečený -size=Velikost -src=Src -styleSheet=Soubor stylů -styleSheets=Soubory stylů -type=Typ -validating=Validuji... -value=Hodnota -version=Verze -warning=Varování -warnings=Varování -width=Šířka -yes=Ano -# CSS Status -cssErrorLabel=E -cssErrorTooltip=Chyba CSS: %S -cssNoErrorsLabel=N -cssNoErrorsTooltip=Žádné chyby CSS -cssWarningLabel=W -cssWarningTooltip=CSS varování: %S -# JavaScript Status -javaScriptDisabledLabel=D -javaScriptDisabledTooltip=JavaScript zakázaný -javaScriptErrorLabel=E -javaScriptErrorTooltip=Chyb v JavaScriptu: %S -javaScriptNoErrorsLabel=N -javaScriptNoErrorsTooltip=Žádné chyby v JavaScriptu -javaScriptWarningLabel=W -javaScriptWarningTooltip=Varování JavaScriptu: %S -# Render Mode Status -quirksModeLabel=Q -quirksModeTooltip=Režim zpětné kompatibility -standardsComplianceModeLabel=S -standardsComplianceModeTooltip=Režim standardů -# About -buildDate=Datum sestavení -extensionDescription=Přidává nabídku a lištu s různými nástroji pro webové vývojáře. -followOnAppNet=Follow on App.net -followOnTwitter=Follow on Twitter -# Applications -launchApplicationFailed=Aplikaci '%S' nelze spustit. -openApplication=Otevřít aplikaci -temporaryDirectoryFailed=Dočasný adresář '%S' nenalezen. -# DOM Inspector -domInspectorRequired=Tato funkce vyžaduje nainstalovaný DOM Inspector. -# Frames -framesNotSupported=Tato funkce není podporována na stránkách s rámy. -# Generated Pages -collapseAll=Sbalit vše -expandAll=Rozbalit vše -extensionName=Web Developer -# Prompts -stopConfirmation=Příště již nepožadovat toto potvrzení -# Add User Style Sheet -addUserStyleSheet=Přidat uživatelský styl -# Clear Cache -clearCache=Vymazat mezipaměť -clearCacheConfirmation=Opravdu chcete vymazat mezipaměť? -clearCacheResult=Mezipaměť byla vymazána. -# Clear Form Fields -clearFormFieldsMultipleResult=Pole %S formulářů byla vyčištěna. -clearFormFieldsSingleResult=Pole 1 formuláře byla vyčištěna. -# Clear History -clearHistory=Vymazat historii -clearHistoryConfirmation=Opravdu chcete vymazat historii? -clearHistoryResult=Historie byla vymazána. -# Clear HTTP Authentication -clearHTTPAuthentication=Vymazat HTTP autentikaci -clearHTTPAuthenticationConfirmation=Opravdu chcete vyčistit HTTP autentikaci? -clearHTTPAuthenticationResult=HTTP autentikace byla vymazána. -# Clear Radio Buttons -clearRadioButtonsMultipleResult=%S přepínačů bylo odznačeno. -clearRadioButtonsSingleResult=1 přepínač odznačen. -# Convert Form Methods -convertFormMethodsMultipleResult=%S formulářů zkonvertováno na %S. -convertFormMethodsSingleResult=1 formulář zkonvertován na %S. -# Convert Select Elements To Text Inputs -convertSelectElementsToTextInputsMultipleResult=%S prvků select bylo změněno na textová pole. -convertSelectElementsToTextInputsSingleResult=1 prvek select byl změněn na textové pole. -# Convert Text Inputs To Textareas -convertTextInputsToTextareasMultipleResult=%S prvků typu text bylo změněno na textová pole. -convertTextInputsToTextareasSingleResult=1 prvek typu text byl změněn na textové pole. -# Delete Domain Cookies -deleteDomainCookies=Smazat cookies z této domény -deleteDomainCookiesMultipleConfirmation=Opravdu chcete smazat %S cookies z této domény? -deleteDomainCookiesMultipleResult=%S cookies z této domény bylo smazáno. -deleteDomainCookiesNoneFound=Žádná cookie z této domény ke smazání. -deleteDomainCookiesSingleConfirmation=Opravdu chcete smazat 1 cookie z této domény? -deleteDomainCookiesSingleResult=1 cookie z této domény byla smazána. -# Delete Path Cookies -deletePathCookies=Smazat cookies z této cesty -deletePathCookiesMultipleConfirmation=Opravdu chcete smazat %S cookies z této cesty? -deletePathCookiesMultipleResult=%S cookies z této cesty bylo smazáno. -deletePathCookiesNoneFound=Žádná cookie z této cesty ke smazání. -deletePathCookiesSingleConfirmation=Opravdu chcete smazat 1 cookie z této cesty? -deletePathCookiesSingleResult=1 cookie z této cesty byla smazána. -# Delete Session Cookies -deleteSessionCookies=Smazat cookies relace -deleteSessionCookiesMultipleConfirmation=Opravdu chcete smazat %S cookies relace? -deleteSessionCookiesMultipleResult=%S cookies relace bylo smazáno. -deleteSessionCookiesNoneFound=Žádná cookie relace ke smazání. -deleteSessionCookiesSingleConfirmation=Opravdu chcete smazat 1 cookie relace? -deleteSessionCookiesSingleResult=1 cookie relace byla smazána. -# Disable Individual Style Sheets -noStyleSheets=Žádné stylové předpisy -# Display Element Information -elementInformation=Žádné informace o prvcích -# Display Line Guides -displayLineGuides=Zobrazit vodící linky -# Display Page Magnifier -displayPageMagnifier=Zobrazit lupu -invalidMagnificationLevel=Uveďte správně úroveň zvětšení. -# Display Passwords -displayPasswordsSingleResult=1 heslo zobrazeno. -displayPasswordsMultipleResult=%S hesel zobrazeno. -# Display Ruler -displayRuler=Zobrazit pravítko -invalidHeight=Zadejte správně výšku. -invalidWidth=Zadejte správně šířku. -# Display Style Information -styleInformation=Informace o stylech -# Display Window Size -displayWindowSizeResult=Šířka okna: %Spx\nVýška okna: %Spx\n\nŠířka průhledu: %Spx\nVýška průhledu: %Spx -# Edit CSS -editCSS=Upravit CSS -# Edit HTML -editHTML=Upravit HTML -# Enable Auto Completion -enableAutoCompletionMultipleResult=Automatické doplňování povoleno v %S formulářích. -enableAutoCompletionSingleResult=Automatické doplňování povoleno v 1 formuláři. -# Enable Form Fields -enableFormFieldsMultipleResult=%S prvků formuláře bylo povoleno. -enableFormFieldsSingleResult=1 prvek formuláře byl povolen. -# Expand Select Elements -expandSelectElementsMultipleResult=%S prvků typu select zvětšeno. -expandSelectElementsSingleResult=1 prvek typu select zvětšen. -# Find Broken Images -brokenImage=poškozený obrázek -brokenImages=Poškozené obrázky -# Find Duplicate Ids -duplicateId=duplicitní ID -duplicateIds=Duplicitní ID -# Make Form Fields Writable -makeFormFieldsWritableMultipleResult=%S polí formuláře změněno na zapisovatelné. -makeFormFieldsWritableSingleResult=1 pole formuláře změněno na zapisovatelné. -# Make Frames Resizable -makeFramesResizableMultipleResult=%S rámů umožňuje změnu velikosti. -makeFramesResizableSingleResult=1 rám umožňuje změnu velikosti. -# Make Images Full Size -makeImagesFullSizeMultipleResult=%S obrázků zvětšeno na plnou velikost. -makeImagesFullSizeSingleResult=1 obrázek zvětšen na plnou velikost. -# Populate Form Fields -populateFormFieldsMultipleResult=%S formulářových polí předvyplněno. -populateFormFieldsSingleResult=1 formulářové pole předvyplněno. -# Reload Images -reloadImagesResult=Obrázky byly znovu načteny. -# Reload Linked Style Sheets -reloadLinkedStyleSheetsResult=Připojené předpisy stylů byly znovu načteny. -# Remove Form Validation -removeFormValidationMultipleResult=Removed validation from %S form fields. -removeFormValidationSingleResult=Removed validation from 1 form field. -# Remove Maximum Lengths -removeMaximumLengthsMultipleResult=Maximální délka byla zrušena u %S prvků formuláře. -removeMaximumLengthsSingleResult=Maximální délka byla zrušena u 1 prvku formuláře. -# Validate CSS -validateCSS=Validovat CSS -# Validate HTML -validateHTML=Validovat HTML -# View Anchor Information -anchorInformation=Informace o kotvě -# View Color Information -colorInformation=Informace o barvě -# View Cookie Information -atEndOfSession=Na konci relace -cookieInformation=Informace o cookie -cannotEdit=Nelze upravit -cannotEditHTTPOnlyCookies=Cookies HttpOnly nemohou být upraveny. -cannotEditLocalhostCookies=Cookies na doméně localhost nemohou být upraveny. Více informací -cookieDeleted=Cookie %S smazána. -cookieEdited=Cookie %S upravena. -deleteConfirmation=Potvrzení -deleteCookie=Smazat cookie -deleteCookieConfirmation=Opravdu chcete smazat cookie? -editCookie=Upravit cookie -expiresCannotBeEmpty=Pokud se nejedná cookie relace, nemůžete zadat prázdnou dobu vypršení. -expiresNotValid=Datum vypršení není ve správném formátu. -hostCannotBeEmpty=Server musí být zadán. -httpOnly=HttpOnly -nameCannotBeEmpty=Název musí být zadán. -pathCannotBeEmpty=Cesta musí být zadána. -secureCookie=Zabezpečená cookie -sessionCookie=Cookie relace -# View CSS -couldNotLoadCSS=CSS nelze načíst. -embeddedCSSFrom=CSS vložený z -syntaxHighlighting=Syntax Highlighting -# View Document Outline -documentOutline=Osnova dokumentu -missingHeading=(Chybějící záhlaví) -noHeadingText=(Chybějící text záhlaví) -# View Document Size -documentSize=Velikost dokumentu -uncompressedSize=Velikost po rozbalení -# View Form Information -maximumLength=Maximální délka -# View JavaScript -beautifyJavaScript=Zkrášlit JavaScript -couldNotLoadJavaScript=JavaScript nelze načíst. -embeddedJavaScriptFrom=JavaScript vložený z -undoBeautifyJavaScript=Zpět zkrášlení JavaScriptu -# View Link Information -linkInformation=Informace o odkazu -# View Meta Tag Information -metaTag=meta tag -metaTags=Meta tagy -# View Response Headers -couldNotLoadResponseHeaders=Hlavičky odpovědi nelze načíst. -responseHeaders=Hlavičky odpovědi -# View Responsive Layouts -reloadLayouts=Znovu načíst layouty -responsiveLayouts=Responsivní layouty -# View Source With -viewSourceWith=Zobrazit zdrojový kód s diff --git a/source/firefox/locales/de/dashboard/dashboard.dtd b/source/firefox/locales/de/dashboard/dashboard.dtd deleted file mode 100644 index cf0de64..0000000 --- a/source/firefox/locales/de/dashboard/dashboard.dtd +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/de/dashboard/dashboard.properties b/source/firefox/locales/de/dashboard/dashboard.properties deleted file mode 100644 index 4a7b27b..0000000 --- a/source/firefox/locales/de/dashboard/dashboard.properties +++ /dev/null @@ -1,29 +0,0 @@ -# Common -ancestors=Vorgänger -attribute=Attribut -children=Kinder -dom=DOM -layout=Layout -position=Position -text=Text -value=Wert -# Element Information -ancestorPathCopied=Der Pfad des Vorgängers wurde in die Zwischenablage kopiert. -copyAncestorPath=Pfad des Vorgängers kopieren -elementInformation=Elementinformationen -selectAnElementDisplayInformation=Wählen Sie ein Element aus, um Informationen über dieses anzuzeigen -# Style Information -inlineStyles=Inline-Stile -line=Zeile -noStyleInformation=Keine Stilinformationen -selectAnElementDisplayStyles=Wählen Sie ein Element aus, um die Stile anzuzeigen, die auf es angewendet werden -# Edit CSS -editCSS=CSS bearbeiten -embeddedStyles=Eingebettete Stile -openStyleSheet=Stilvorlage öffnen -pinCSS=CSS anheften -saveStyleSheet=Stilvorlage speichern -styleSheetDescription=Stilvorlagendateien -unpinCSS=Anheften des CSS rückgängig machen -# Edit HTML -saveHTML=HTML speichern diff --git a/source/firefox/locales/de/dialogs/cookie.dtd b/source/firefox/locales/de/dialogs/cookie.dtd deleted file mode 100644 index fa9a77b..0000000 --- a/source/firefox/locales/de/dialogs/cookie.dtd +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/source/firefox/locales/de/dialogs/cookie.properties b/source/firefox/locales/de/dialogs/cookie.properties deleted file mode 100644 index db876e8..0000000 --- a/source/firefox/locales/de/dialogs/cookie.properties +++ /dev/null @@ -1,2 +0,0 @@ -# Cookie -addCookieError=Fehler beim Hinzufügen des Cookies diff --git a/source/firefox/locales/de/dialogs/message.dtd b/source/firefox/locales/de/dialogs/message.dtd deleted file mode 100644 index 4fe00f1..0000000 --- a/source/firefox/locales/de/dialogs/message.dtd +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/source/firefox/locales/de/dialogs/outline-custom-elements.dtd b/source/firefox/locales/de/dialogs/outline-custom-elements.dtd deleted file mode 100644 index 0f380e8..0000000 --- a/source/firefox/locales/de/dialogs/outline-custom-elements.dtd +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/source/firefox/locales/de/dialogs/resize-window.dtd b/source/firefox/locales/de/dialogs/resize-window.dtd deleted file mode 100644 index 1019e7d..0000000 --- a/source/firefox/locales/de/dialogs/resize-window.dtd +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/source/firefox/locales/de/dialogs/resize-window.properties b/source/firefox/locales/de/dialogs/resize-window.properties deleted file mode 100644 index 0b90603..0000000 --- a/source/firefox/locales/de/dialogs/resize-window.properties +++ /dev/null @@ -1,4 +0,0 @@ -# Resize window -invalidHeight=Es muss eine gültige Höhe angegeben werden. -invalidWidth=Es muss eine gültige Breite angegeben werden. -resizeWindow=Fenstergröße verändern diff --git a/source/firefox/locales/de/options/options.dtd b/source/firefox/locales/de/options/options.dtd deleted file mode 100644 index 2b5c7e0..0000000 --- a/source/firefox/locales/de/options/options.dtd +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/de/options/options.properties b/source/firefox/locales/de/options/options.properties deleted file mode 100644 index 58c4b49..0000000 --- a/source/firefox/locales/de/options/options.properties +++ /dev/null @@ -1,49 +0,0 @@ -# Common -delete=Löschen -no=Nein -yes=Ja -# Keyboard -deleteKeyboardShortcut=Tastenkürzel löschen -deleteKeyboardShortcutConfirmation=Möchten sie wirklich das Tastenkürzel %S löschen? -# Disable All Styles -extensions.webdeveloper.keyboard.1.key=A -# Edit CSS -extensions.webdeveloper.keyboard.2.key=D -# Validate Local HTML -extensions.webdeveloper.keyboard.3.key=L -# View CSS -extensions.webdeveloper.keyboard.4.key=C -# View JavaScript -extensions.webdeveloper.keyboard.5.key=J -# View Source -extensions.webdeveloper.keyboard.6.key=U -# View Style Information -extensions.webdeveloper.keyboard.7.key=Y -# Resize -deleteResizeOption=Einstellung für die Größenveränderung löschen -deleteResizeOptionConfirmation=Wollen Sie wirklich die Einstellung %S für die Größenveränderung löschen? -extensions.webdeveloper.resize.1.description=1024x768 -# Responsive layouts -deleteResponsiveLayout=Angepasste Anordnung löschen -deleteResponsiveLayoutConfirmation=Wollen Sie wirklich die angepasste Anordnung %S löschen? -extensions.webdeveloper.responsive.layout.1.description=Mobiles Hochformat -extensions.webdeveloper.responsive.layout.2.description=Mobiles Querformat -extensions.webdeveloper.responsive.layout.3.description=Hochformat für kleine Tablets -extensions.webdeveloper.responsive.layout.4.description=Querformat für kleine Tablets -extensions.webdeveloper.responsive.layout.5.description=Tablethochformat -extensions.webdeveloper.responsive.layout.6.description=Tabletquerformat -# Tools -chooseApplication=Anwendung auswählen -deleteTool=Werkzeug löschen -deleteToolConfirmation=Wollen Sie wirklich das Werkzeug %S löschen? -extensions.webdeveloper.tool.1.description=CSS überprüfen -extensions.webdeveloper.tool.2.description=Feed überprüfen -extensions.webdeveloper.tool.3.description=HTML überprüfen -extensions.webdeveloper.tool.3.key=V -extensions.webdeveloper.tool.4.description=Verweise überprüfen -extensions.webdeveloper.tool.5.description=Abschnitt 508 überprüfen -extensions.webdeveloper.tool.6.description=WAI überprüfen -invalidApplication=%S ist keine gültige Anwendung. -# View Source With -deleteViewSourceWithOption=Einstellung »Quelltext anzeigen mit« löschen -deleteViewSourceWithOptionConfirmation=Möchten Sie wirklich die Einstellung »Quelltext anzeigen mit« %S löschen? diff --git a/source/firefox/locales/de/overlay/overlay.dtd b/source/firefox/locales/de/overlay/overlay.dtd deleted file mode 100644 index 3c5216d..0000000 --- a/source/firefox/locales/de/overlay/overlay.dtd +++ /dev/null @@ -1,442 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/de/overlay/overlay.properties b/source/firefox/locales/de/overlay/overlay.properties deleted file mode 100644 index 00100f2..0000000 --- a/source/firefox/locales/de/overlay/overlay.properties +++ /dev/null @@ -1,281 +0,0 @@ -# Common -about=Über -action=Aktion -alt=Alt -anchor=Anker -anchors=Anker -author=Autor -bytes=Bytes -cancel=Abbrechen -clear=Löschen -color=Farbe -colors=Farben -content=Inhalt -cookie=Cookie -cookies=Cookies -css=CSS -dark=Dark -delete=Löschen -depth=Tiefe -document=Dokument -documents=Dokumente -edit=Bearbeiten … -elements=Elemente -errors=Fehler -expires=Gültig bis -file=Datei -files=Dateien -form=Formular -forms=Formulare -from=Von -heading=Überschrift -headings=Überschriften -height=Höhe -host=Host -id=ID -image=Bild -images=Bilder -invalid=Ungültig -javaScript=JavaScript -kilobytes=KB -label=Beschriftung -layouts=Layouts -light=Light -link=Verweis -links=Verweise -loading=Laden -method=Methode -name=Name -no=Nein -none=None -object=Objekt -objects=Objekte -password=Passwort -path=Pfad -position=Position -property=Eigenschaft -save=Speichern -script=Skript -scripts=Skripte -secure=Sicher -size=Größe -src=Src -styleSheet=Stilvorlage -styleSheets=Stilvorlagen -type=Typ -validating=Validiere … -value=Wert -version=Version -warning=Warnung -warnings=Warnungen -width=Breite -yes=Ja -# CSS Status -cssErrorLabel=F -cssErrorTooltip=CSS-Fehler: %S -cssNoErrorsLabel=K -cssNoErrorsTooltip=Keine CSS-Fehler -cssWarningLabel=W -cssWarningTooltip=CSS-Warnung: %S -# JavaScript Status -javaScriptDisabledLabel=d -javaScriptDisabledTooltip=JavaScript deaktiviert -javaScriptErrorLabel=h -javaScriptErrorTooltip=JavaScript-Fehler: %S -javaScriptNoErrorsLabel=K -javaScriptNoErrorsTooltip=Keine JavaScript-Fehler -javaScriptWarningLabel=W -javaScriptWarningTooltip=JavaScript-Warnung: %S -# Render Mode Status -quirksModeLabel=Q -quirksModeTooltip=Quirks-Modus -standardsComplianceModeLabel=S -standardsComplianceModeTooltip=Standardmodus -# About -buildDate=Erstellungsdatum -extensionDescription=Fügt ein Menü und eine Symbolleiste mit diversen Werkzeugen für Webentwickler hinzu. -followOnAppNet=Auf App.net folgen -followOnTwitter=Auf Twitter folgen -# Applications -launchApplicationFailed=Anwendung %S kann nicht gestartet werden. -openApplication=Anwendung öffnen -temporaryDirectoryFailed=Eine temporäre Datei kann nicht in das Verzeichnis %S geschreiben werden. -# DOM Inspector -domInspectorRequired=Diese Funktion erfordert die Installation von DOM-Inspector. -# Frames -framesNotSupported=Diese Funktion wird auf Seiten mit Frames nicht unterstützt. -# Generated Pages -collapseAll=Alle einklappen -expandAll=Alle ausklappen -extensionName=Web-Developer -# Prompts -stopConfirmation=Nicht mehr um Bestätigung bitten -# Add User Style Sheet -addUserStyleSheet=Benutzerdefinierte Stilvorlage hinzufügen -# Clear Cache -clearCache=Zwischenspeicher leeren -clearCacheConfirmation=Möchten Sie wirklich den Zwischenspeicher leeren? -clearCacheResult=Der Zwischenspeicher wurde geleert. -# Clear Form Fields -clearFormFieldsMultipleResult=Formularfelder in %S Formularen geleert. -clearFormFieldsSingleResult=Formularfelder in 1 Formular geleert. -# Clear History -clearHistory=Verlauf löschen -clearHistoryConfirmation=Möchten Sie wirklich den Verlauf löschen? -clearHistoryResult=Der Verlauf wurde gelöscht. -# Clear HTTP Authentication -clearHTTPAuthentication=HTTP-Authentifizierung löschen -clearHTTPAuthenticationConfirmation=Möchten Sie wirklich die HTTP-Authentifizierung löschen? -clearHTTPAuthenticationResult=Die HTTP-Authentifizierung wurde gelöscht. -# Clear Radio Buttons -clearRadioButtonsMultipleResult=%S Optionsschaltflächen geleert. -clearRadioButtonsSingleResult=1 Optionsschaltfläche geleert. -# Convert Form Methods -convertFormMethodsMultipleResult=%S Formulare in %Ss umgewandelt. -convertFormMethodsSingleResult=1 Formular in %S umgewandelt. -# Convert Select Elements To Text Inputs -convertSelectElementsToTextInputsMultipleResult=%S Auswahlelemente in Texteingabefelder umgewandelt. -convertSelectElementsToTextInputsSingleResult=1 Auswahlelement in ein Texteingabefeld umgewandelt. -# Convert Text Inputs To Textareas -convertTextInputsToTextareasMultipleResult=%S Texteingabefelder in Textfelder umgewandelt. -convertTextInputsToTextareasSingleResult=1 Texteingabefeld in ein Textfeld umgewandelt. -# Delete Domain Cookies -deleteDomainCookies=Domaincookies löschen -deleteDomainCookiesMultipleConfirmation=Möchten Sie wirklich %S Domaincookies löschen? -deleteDomainCookiesMultipleResult=%S Domaincookies wurden gelöscht. -deleteDomainCookiesNoneFound=Keine zu löschenden Domaincookies vorhanden. -deleteDomainCookiesSingleConfirmation=Möchten Sie wirklich 1 Domaincookie löschen? -deleteDomainCookiesSingleResult=1 Domaincookie gelöscht. -# Delete Path Cookies -deletePathCookies=Pfadcookies löschen -deletePathCookiesMultipleConfirmation=Möchten Sie wirklich %S Pfadcookies löschen? -deletePathCookiesMultipleResult=%S Pfadcookies gelöscht. -deletePathCookiesNoneFound=Keine zu löschenden Pfadcookies vorhanden. -deletePathCookiesSingleConfirmation=Möchten Sie wirklich 1 Pfadcookie löschen? -deletePathCookiesSingleResult=1 Pfadcookie gelöscht. -# Delete Session Cookies -deleteSessionCookies=Sitzungscookies löschen -deleteSessionCookiesMultipleConfirmation=Möchten Sie wirklich %S Sitzungscookies löschen? -deleteSessionCookiesMultipleResult=%S Sitzungscookies gelöscht. -deleteSessionCookiesNoneFound=Keine zu löschenden Sitzungscookies vorhanden. -deleteSessionCookiesSingleConfirmation=Möchten Sie wirklich 1 Sitzungscookie löschen? -deleteSessionCookiesSingleResult=1 Sitzungscookie gelöscht. -# Disable Individual Style Sheets -noStyleSheets=Keine Stilvorlagen -# Display Element Information -elementInformation=Elementinformationen -# Display Line Guides -displayLineGuides=Führungslinien anzeigen -# Display Page Magnifier -displayPageMagnifier=Seitenlupe anzeigen -invalidMagnificationLevel=Es muss eine gültige Vergrößerungsstufe angegeben werden. -# Display Passwords -displayPasswordsSingleResult=1 Passwort angezeigt. -displayPasswordsMultipleResult=%S Passwörter angezeigt. -# Display Ruler -displayRuler=Lineal anzeigen -invalidHeight=Es muss eine gültige Höhe angegeben werden. -invalidWidth=Es muss eine gültige Breite angegeben werden. -# Display Style Information -styleInformation=Stilinformationen -# Display Window Size -displayWindowSizeResult=Fenster: %Spx x %Spx Ansichtsfenster: %Spx x %Spx -# Edit CSS -editCSS=CSS bearbeiten -# Edit HTML -editHTML=HTML bearbeiten -# Enable Auto Completion -enableAutoCompletionMultipleResult=Autovervollständigung für %S Elemente aktiviert. -enableAutoCompletionSingleResult=Autovervollständigung für 1 Element aktiviert. -# Enable Form Fields -enableFormFieldsMultipleResult=%S Formularfelder aktiviert. -enableFormFieldsSingleResult=1 Formularfeld aktiviert. -# Expand Select Elements -expandSelectElementsMultipleResult=%S Auswahlelemente ausgeklappt. -expandSelectElementsSingleResult=1 Auswahlelement ausgeklappt. -# Find Broken Images -brokenImage=beschädigtes Bild -brokenImages=Beschädigte Bilder -# Find Duplicate Ids -duplicateId=doppelte ID -duplicateIds=Doppelte IDs -# Make Form Fields Writable -makeFormFieldsWritableMultipleResult=%S Formularfelder beschreibbar gemacht. -makeFormFieldsWritableSingleResult=1 Formularfeld beschreibbar gemacht. -# Make Frames Resizable -makeFramesResizableMultipleResult=Die Größe von %S Frames lässt sich jetzt ändern. -makeFramesResizableSingleResult=Die Größe von 1 Frame lässt sich jetzt ändern. -# Make Images Full Size -makeImagesFullSizeMultipleResult=%S Bilder sind jetzt in voller Größe. -makeImagesFullSizeSingleResult=1 Bild ist jetzt in voller Größe. -# Populate Form Fields -populateFormFieldsMultipleResult=%S Formularfelder befüllt. -populateFormFieldsSingleResult=1 Formularfeld befüllt. -# Reload Images -reloadImagesResult=Die Bilder wurden neu geladen. -# Reload Linked Style Sheets -reloadLinkedStyleSheetsResult=Die zugehörigen Stilvorlagen wurden neu geladen. -# Remove Form Validation -removeFormValidationMultipleResult=Removed validation from %S form fields. -removeFormValidationSingleResult=Removed validation from 1 form field. -# Remove Maximum Lengths -removeMaximumLengthsMultipleResult=Von %S Formularfeldern wurde die Maximallänge entfernt. -removeMaximumLengthsSingleResult=Von 1 Formularfeld wurde die Maximallänge entfernt. -# Validate CSS -validateCSS=CSS validieren -# Validate HTML -validateHTML=HTML validieren -# View Anchor Information -anchorInformation=Ankerinformationen -# View Color Information -colorInformation=Farbinformationen -# View Cookie Information -atEndOfSession=Am Ende der Sitzung -cookieInformation=Cookie-Informationen -cannotEdit=Kann nicht bearbeitet werden -cannotEditHTTPOnlyCookies=HttpOnly kann nicht bearbeitet werden. -cannotEditLocalhostCookies=Cookies auf einer Localhost-Domain können nicht bearbeitet werden. Mehr informationen -cookieDeleted=Cookie %S wurde gelöscht. -cookieEdited=Cookie %S wurde bearbeitet. -deleteConfirmation=Löschen … -deleteCookie=Cookie löschen -deleteCookieConfirmation=Möchten Sie wirklich Cookie %S löschen? -editCookie=Cookie bearbeiten -expiresCannotBeEmpty=Das Verfallsdatum darf nicht leer sein, wenn dies kein Sitzungscookie ist. -expiresNotValid=Das Verfallsdatum ist kein gültiges Datum. -hostCannotBeEmpty=Das Hostfeld darf nicht leer sein. -httpOnly=HttpOnly -nameCannotBeEmpty=Der Name darf nicht leer sein. -pathCannotBeEmpty=Der Pfad darf nicht leer sein. -secureCookie=Sicheres Cookie -sessionCookie=Sitzungscookie -# View CSS -couldNotLoadCSS=Das CSS konnte nicht geladen werden. -embeddedCSSFrom=Eingebettetes CSS von -# View Document Outline -documentOutline=Dokumentkontur -missingHeading=(Fehlende Überschrift) -noHeadingText=(Kein Überschriftstext) -# View Document Size -documentSize=Dokumentgröße -uncompressedSize=Nichtkomprimierte Größe -# View Form Information -maximumLength=Maximallänge -# View JavaScript -beautifyJavaScript=JavaScript verschönern -couldNotLoadJavaScript=Das JavaScript konnte nicht geladen werden. -embeddedJavaScriptFrom=Eingebettetes JavaScript von -undoBeautifyJavaScript=Verschönerung des JavaScript rückgängig machen -# View Link Information -linkInformation=Verweisinformationen -# View Meta Tag Information -metaTag=Meta-Tag -metaTags=Meta-Tags -# View Response Headers -couldNotLoadResponseHeaders=Die Antwortkopfdaten konnten nicht geladen werden. -responseHeaders=Antwortkopfdaten -# View Responsive Layouts -reloadLayouts=Ansichten neu laden -responsiveLayouts=Angepasste Ansichten -# View Source With -viewSourceWith=Quelltext ansehen mit diff --git a/source/firefox/locales/en-US/dashboard/dashboard.dtd b/source/firefox/locales/en-US/dashboard/dashboard.dtd deleted file mode 100644 index b213d8a..0000000 --- a/source/firefox/locales/en-US/dashboard/dashboard.dtd +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/en-US/dashboard/dashboard.properties b/source/firefox/locales/en-US/dashboard/dashboard.properties deleted file mode 100644 index eadd43e..0000000 --- a/source/firefox/locales/en-US/dashboard/dashboard.properties +++ /dev/null @@ -1,33 +0,0 @@ -# Common -ancestors=Ancestors -attribute=Attribute -children=Children -dom=DOM -layout=Layout -position=Position -text=Text -value=Value - -# Element Information -ancestorPathCopied=The ancestor path has been copied to the clipboard. -copyAncestorPath=Copy ancestor path -elementInformation=Element Information -selectAnElementDisplayInformation=Select an element to display the information about it - -# Style Information -embeddedStyles=Embedded Styles -inlineStyles=Inline styles -line=Line -noStyleInformation=No style information -selectAnElementDisplayStyles=Select an element to display the styles applied to it - -# Edit CSS -editCSS=Edit CSS -openStyleSheet=Open Style Sheet -pinCSS=Pin CSS -saveStyleSheet=Save Style Sheet -styleSheetDescription=Style Sheet Files -unpinCSS=Unpin CSS - -# Edit HTML -saveHTML=Save HTML diff --git a/source/firefox/locales/en-US/dialogs/cookie.dtd b/source/firefox/locales/en-US/dialogs/cookie.dtd deleted file mode 100644 index 94c1509..0000000 --- a/source/firefox/locales/en-US/dialogs/cookie.dtd +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/source/firefox/locales/en-US/dialogs/cookie.properties b/source/firefox/locales/en-US/dialogs/cookie.properties deleted file mode 100644 index d1c51c0..0000000 --- a/source/firefox/locales/en-US/dialogs/cookie.properties +++ /dev/null @@ -1,2 +0,0 @@ -# Cookie -addCookieError=Error Adding Cookie diff --git a/source/firefox/locales/en-US/dialogs/message.dtd b/source/firefox/locales/en-US/dialogs/message.dtd deleted file mode 100644 index f897f28..0000000 --- a/source/firefox/locales/en-US/dialogs/message.dtd +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/source/firefox/locales/en-US/dialogs/outline-custom-elements.dtd b/source/firefox/locales/en-US/dialogs/outline-custom-elements.dtd deleted file mode 100644 index 95958bf..0000000 --- a/source/firefox/locales/en-US/dialogs/outline-custom-elements.dtd +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/source/firefox/locales/en-US/dialogs/resize-window.dtd b/source/firefox/locales/en-US/dialogs/resize-window.dtd deleted file mode 100644 index e0c3e8e..0000000 --- a/source/firefox/locales/en-US/dialogs/resize-window.dtd +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/source/firefox/locales/en-US/dialogs/resize-window.properties b/source/firefox/locales/en-US/dialogs/resize-window.properties deleted file mode 100644 index d409c8a..0000000 --- a/source/firefox/locales/en-US/dialogs/resize-window.properties +++ /dev/null @@ -1,4 +0,0 @@ -# Resize window -invalidHeight=A valid height must be specified. -invalidWidth=A valid width must be specified. -resizeWindow=Resize Window diff --git a/source/firefox/locales/en-US/options/options.dtd b/source/firefox/locales/en-US/options/options.dtd deleted file mode 100644 index d4eb526..0000000 --- a/source/firefox/locales/en-US/options/options.dtd +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/en-US/options/options.properties b/source/firefox/locales/en-US/options/options.properties deleted file mode 100644 index 996fa6c..0000000 --- a/source/firefox/locales/en-US/options/options.properties +++ /dev/null @@ -1,53 +0,0 @@ -# Common -delete=Delete -no=No -yes=Yes - -# Keyboard -deleteKeyboardShortcut=Delete Keyboard Shortcut -deleteKeyboardShortcutConfirmation=Are you sure you want to delete the %S keyboard shortcut? -# Disable All Styles -extensions.webdeveloper.keyboard.1.key=A -# Edit CSS -extensions.webdeveloper.keyboard.2.key=D -# Validate Local HTML -extensions.webdeveloper.keyboard.3.key=L -# View CSS -extensions.webdeveloper.keyboard.4.key=C -# View JavaScript -extensions.webdeveloper.keyboard.5.key=J -# View Source -extensions.webdeveloper.keyboard.6.key=U -# View Style Information -extensions.webdeveloper.keyboard.7.key=Y - -# Resize -deleteResizeOption=Delete Resize Option -deleteResizeOptionConfirmation=Are you sure you want to delete the %S resize option? -extensions.webdeveloper.resize.1.description=1024x768 - -# Responsive layouts -deleteResponsiveLayout=Delete Responsive Layout -deleteResponsiveLayoutConfirmation=Are you sure you want to delete the %S responsive layout? -extensions.webdeveloper.responsive.layout.1.description=Mobile portrait -extensions.webdeveloper.responsive.layout.2.description=Mobile landscape -extensions.webdeveloper.responsive.layout.3.description=Small tablet portrait -extensions.webdeveloper.responsive.layout.4.description=Small tablet landscape -extensions.webdeveloper.responsive.layout.5.description=Tablet portrait -extensions.webdeveloper.responsive.layout.6.description=Tablet landscape - -# Tools -chooseApplication=Choose Application -deleteTool=Delete Tool -deleteToolConfirmation=Are you sure you want to delete the %S tool? -extensions.webdeveloper.tool.1.description=Validate CSS -extensions.webdeveloper.tool.2.description=Validate Feed -extensions.webdeveloper.tool.3.description=Validate HTML -extensions.webdeveloper.tool.3.key=V -extensions.webdeveloper.tool.4.description=Validate Accessibility -extensions.webdeveloper.tool.5.description=Validate Links -invalidApplication=%S is not a valid application. - -# View Source With -deleteViewSourceWithOption=Delete View Source With Option -deleteViewSourceWithOptionConfirmation=Are you sure you want to delete the %S view source with option? diff --git a/source/firefox/locales/en-US/overlay/overlay.dtd b/source/firefox/locales/en-US/overlay/overlay.dtd deleted file mode 100644 index 43fff4e..0000000 --- a/source/firefox/locales/en-US/overlay/overlay.dtd +++ /dev/null @@ -1,479 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/en-US/overlay/overlay.properties b/source/firefox/locales/en-US/overlay/overlay.properties deleted file mode 100644 index 875741e..0000000 --- a/source/firefox/locales/en-US/overlay/overlay.properties +++ /dev/null @@ -1,341 +0,0 @@ -# Common -about=About -action=Action -alt=Alt -anchor=Anchor -anchors=Anchors -author=Author -bytes=bytes -cancel=Cancel -clear=Clear -color=Color -colors=Colors -content=Content -cookie=Cookie -cookies=Cookies -css=CSS -dark=Dark -delete=Delete -depth=Depth -document=Document -documents=Documents -edit=Edit... -elements=Elements -errors=Errors -expires=Expires -file=File -files=Files -form=Form -forms=Forms -from=From -heading=Heading -headings=Headings -height=Height -host=Host -id=Id -image=Image -images=Images -invalid=Invalid -javaScript=JavaScript -kilobytes=KB -label=Label -layouts=Layouts -light=Light -link=Link -links=Links -loading=Loading -method=Method -name=Name -no=No -none=None -object=Object -objects=Objects -password=Password -path=Path -position=Position -property=Property -save=Save -script=Script -scripts=Scripts -secure=Secure -size=Size -src=Src -styleSheet=Style Sheet -styleSheets=Style Sheets -type=Type -validating=Validating... -value=Value -version=Version -warning=Warning -warnings=Warnings -width=Width -yes=Yes - -# CSS Status -cssErrorLabel=E -cssErrorTooltip=CSS Error: %S -cssNoErrorsLabel=N -cssNoErrorsTooltip=No CSS Errors -cssWarningLabel=W -cssWarningTooltip=CSS Warning: %S - -# JavaScript Status -javaScriptDisabledLabel=D -javaScriptDisabledTooltip=JavaScript Disabled -javaScriptErrorLabel=E -javaScriptErrorTooltip=JavaScript Error: %S -javaScriptNoErrorsLabel=N -javaScriptNoErrorsTooltip=No JavaScript Errors -javaScriptWarningLabel=W -javaScriptWarningTooltip=JavaScript Warning: %S - -# Render Mode Status -quirksModeLabel=Q -quirksModeTooltip=Quirks Mode -standardsComplianceModeLabel=S -standardsComplianceModeTooltip=Standards Compliance Mode - -# About -buildDate=Build Date -extensionDescription=@description@ -followOnAppNet=Follow on App.net -followOnTwitter=Follow on Twitter - -# Applications -launchApplicationFailed=Unable to launch the application %S. -openApplication=Open Application -temporaryDirectoryFailed=A temporary file could not be written in the directory %S. - -# DOM Inspector -domInspectorRequired=This feature requires the DOM Inspector to be installed. - -# Frames -framesNotSupported=This feature is not supported on pages with frames. - -# Generated Pages -collapseAll=Collapse all -expandAll=Expand all -extensionName=@name@ - -# Prompts -stopConfirmation=Do not ask for confirmation in the future - -# Add User Style Sheet -addUserStyleSheet=Add User Style Sheet - -# Clear Cache -clearCache=Clear Cache -clearCacheConfirmation=Are you sure you want to clear the cache? -clearCacheResult=The cache has been cleared. - -# Clear Form Fields -clearFormFieldsMultipleResult=Cleared form fields in %S forms. -clearFormFieldsSingleResult=Cleared form fields in 1 form. - -# Clear History -clearHistory=Clear History -clearHistoryConfirmation=Are you sure you want to clear the history? -clearHistoryResult=The history has been cleared. - -# Clear HTTP Authentication -clearHTTPAuthentication=Clear HTTP Authentication -clearHTTPAuthenticationConfirmation=Are you sure you want to clear the HTTP authentication? -clearHTTPAuthenticationResult=The HTTP authentication has been cleared. - -# Clear Radio Buttons -clearRadioButtonsMultipleResult=%S radio buttons cleared. -clearRadioButtonsSingleResult=1 radio button cleared. - -# Convert Form Methods -convertFormMethodsMultipleResult=%S forms converted to %Ss. -convertFormMethodsSingleResult=1 form converted to a %S. - -# Convert Select Elements To Text Inputs -convertSelectElementsToTextInputsMultipleResult=%S select elements converted to text inputs. -convertSelectElementsToTextInputsSingleResult=1 select element converted to a text input. - -# Convert Text Inputs To Textareas -convertTextInputsToTextareasMultipleResult=%S text inputs converted to textareas. -convertTextInputsToTextareasSingleResult=1 text input converted to a textarea. - -# Delete Domain Cookies -deleteDomainCookies=Delete Domain Cookies -deleteDomainCookiesMultipleConfirmation=Are you sure you want to delete %S domain cookies? -deleteDomainCookiesMultipleResult=%S domain cookies deleted. -deleteDomainCookiesNoneFound=There are 0 domain cookies to delete. -deleteDomainCookiesSingleConfirmation=Are you sure you want to delete 1 domain cookie? -deleteDomainCookiesSingleResult=1 domain cookie deleted. - -# Delete Path Cookies -deletePathCookies=Delete Path Cookies -deletePathCookiesMultipleConfirmation=Are you sure you want to delete %S path cookies? -deletePathCookiesMultipleResult=%S path cookies deleted. -deletePathCookiesNoneFound=There are 0 path cookies to delete. -deletePathCookiesSingleConfirmation=Are you sure you want to delete 1 path cookie? -deletePathCookiesSingleResult=1 path cookie deleted. - -# Delete Session Cookies -deleteSessionCookies=Delete Session Cookies -deleteSessionCookiesMultipleConfirmation=Are you sure you want to delete %S session cookies? -deleteSessionCookiesMultipleResult=%S session cookies deleted. -deleteSessionCookiesNoneFound=There are 0 session cookies to delete. -deleteSessionCookiesSingleConfirmation=Are you sure you want to delete 1 session cookie? -deleteSessionCookiesSingleResult=1 session cookie deleted. - -# Disable Individual Style Sheets -noStyleSheets=No Style Sheets - -# Display Element Information -elementInformation=Element Information - -# Display Line Guides -displayLineGuides=Display Line Guides - -# Display Page Magnifier -displayPageMagnifier=Display Page Magnifier -invalidMagnificationLevel=A valid magnification level must be specified. - -# Display Passwords -displayPasswordsSingleResult=1 password displayed. -displayPasswordsMultipleResult=%S passwords displayed. - -# Display Ruler -displayRuler=Display Ruler -invalidHeight=A valid height must be specified. -invalidWidth=A valid width must be specified. - -# Display Style Information -styleInformation=Style Information - -# Display Window Size -displayWindowSizeResult=Window: %Spx x %Spx Viewport: %Spx x %Spx - -# Edit CSS -editCSS=Edit CSS - -# Edit HTML -editHTML=Edit HTML - -# Enable Auto Completion -enableAutoCompletionMultipleResult=Enabled auto completion for %S elements. -enableAutoCompletionSingleResult=Enabled auto completion for 1 element. - -# Enable Form Fields -enableFormFieldsMultipleResult=%S form fields enabled. -enableFormFieldsSingleResult=1 form field enabled. - -# Expand Select Elements -expandSelectElementsMultipleResult=%S select elements expanded. -expandSelectElementsSingleResult=1 select element expanded. - -# Find Broken Images -brokenImage=broken image -brokenImages=Broken Images - -# Find Duplicate Ids -duplicateId=duplicate id -duplicateIds=Duplicate Ids - -# Make Form Fields Writable -makeFormFieldsWritableMultipleResult=%S form fields made writable. -makeFormFieldsWritableSingleResult=1 form field made writable. - -# Make Frames Resizable -makeFramesResizableMultipleResult=%S frames made resizable. -makeFramesResizableSingleResult=1 frame made resizable. - -# Make Images Full Size -makeImagesFullSizeMultipleResult=%S images made full size. -makeImagesFullSizeSingleResult=1 image made full size. - -# Populate Form Fields -populateFormFieldsMultipleResult=%S form fields populated. -populateFormFieldsSingleResult=1 form field populated. - -# Reload Images -reloadImagesResult=The images have been reloaded. - -# Reload Linked Style Sheets -reloadLinkedStyleSheetsResult=The linked style sheets have been reloaded. - -# Remove Form Validation -removeFormValidationMultipleResult=Removed validation from %S form fields. -removeFormValidationSingleResult=Removed validation from 1 form field. - -# Remove Maximum Lengths -removeMaximumLengthsMultipleResult=Removed maximum length from %S form fields. -removeMaximumLengthsSingleResult=Removed maximum length from 1 form field. - -# Validate CSS -validateCSS=Validate CSS - -# Validate HTML -validateHTML=Validate HTML - -# View Anchor Information -anchorInformation=Anchor Information - -# View Color Information -colorInformation=Color Information - -# View Cookie Information -atEndOfSession=At end of session -cookieInformation=Cookie Information -cannotEdit=Cannot edit -cannotEditHTTPOnlyCookies=HttpOnly cookies cannot be edited. -cannotEditLocalhostCookies=Cookies on a localhost domain cannot be edited. More information -cookieDeleted=The cookie %S was deleted. -cookieEdited=The cookie %S was edited. -deleteConfirmation=Delete... -deleteCookie=Delete Cookie -deleteCookieConfirmation=Are you sure you want to delete the cookie %S? -editCookie=Edit Cookie -expiresCannotBeEmpty=The expires date cannot be empty if this is not a session cookie. -expiresNotValid=The expires date is not a valid date. -hostCannotBeEmpty=The host cannot be empty. -httpOnly=HttpOnly -nameCannotBeEmpty=The name cannot be empty. -pathCannotBeEmpty=The path cannot be empty. -secureCookie=Secure cookie -sessionCookie=Session cookie - -# View CSS -couldNotLoadCSS=The CSS could not be loaded. -embeddedCSSFrom=Embedded CSS from -syntaxHighlighting=Syntax Highlighting - -# View Document Outline -documentOutline=Document Outline -missingHeading=(Missing heading) -noHeadingText=(No heading text) - -# View Document Size -documentSize=Document Size -uncompressedSize=Uncompressed Size - -# View Form Information -maximumLength=Maximum Length - -# View JavaScript -beautifyJavaScript=Beautify JavaScript -couldNotLoadJavaScript=The JavaScript could not be loaded. -embeddedJavaScriptFrom=Embedded JavaScript from -undoBeautifyJavaScript=Undo beautify JavaScript - -# View Link Information -linkInformation=Link Information - -# View Meta Tag Information -metaTag=meta tag -metaTags=Meta Tags - -# View Response Headers -couldNotLoadResponseHeaders=The response headers could not be loaded. -responseHeaders=Response Headers - -# View Responsive Layouts -reloadLayouts=Reload Layouts -responsiveLayouts=Responsive Layouts - -# View Source With -viewSourceWith=View Source With diff --git a/source/firefox/locales/fr/dashboard/dashboard.dtd b/source/firefox/locales/fr/dashboard/dashboard.dtd deleted file mode 100644 index 6385a45..0000000 --- a/source/firefox/locales/fr/dashboard/dashboard.dtd +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/fr/dashboard/dashboard.properties b/source/firefox/locales/fr/dashboard/dashboard.properties deleted file mode 100644 index 24aa26d..0000000 --- a/source/firefox/locales/fr/dashboard/dashboard.properties +++ /dev/null @@ -1,29 +0,0 @@ -# Common -ancestors=Ancêtres -attribute=Attribut -children=Enfants -dom=DOM -layout=Apparence -position=Position -text=Texte -value=Valeur -# Element Information -ancestorPathCopied=Le chemin des ancêtres a été copié dans le presse-papiers. -copyAncestorPath=Copier le chemin des ancêtres -elementInformation=Information sur l'élément -selectAnElementDisplayInformation=Sélectionnez un élément pour afficher ses informations -# Style Information -inlineStyles=Styles en-ligne -line=Ligne -noStyleInformation=Aucune information de style -selectAnElementDisplayStyles=Sélectionnez un élément pour afficher les styles appliqués -# Edit CSS -editCSS=Édition CSS -embeddedStyles=Styles incorporés -openStyleSheet=Ouvrir une feuille de style -pinCSS=Verrouiller les CSS -saveStyleSheet=Enregistrer la feuille de style -styleSheetDescription=Fichiers CSS -unpinCSS=Déverrouiller les CSS -# Edit HTML -saveHTML=Enregistrer le code HTML diff --git a/source/firefox/locales/fr/dialogs/cookie.dtd b/source/firefox/locales/fr/dialogs/cookie.dtd deleted file mode 100644 index e9ecc31..0000000 --- a/source/firefox/locales/fr/dialogs/cookie.dtd +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/source/firefox/locales/fr/dialogs/cookie.properties b/source/firefox/locales/fr/dialogs/cookie.properties deleted file mode 100644 index ba46855..0000000 --- a/source/firefox/locales/fr/dialogs/cookie.properties +++ /dev/null @@ -1,2 +0,0 @@ -# Cookie -addCookieError=Erreur lors de l'ajout du cookie diff --git a/source/firefox/locales/fr/dialogs/message.dtd b/source/firefox/locales/fr/dialogs/message.dtd deleted file mode 100644 index 13aa820..0000000 --- a/source/firefox/locales/fr/dialogs/message.dtd +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/source/firefox/locales/fr/dialogs/outline-custom-elements.dtd b/source/firefox/locales/fr/dialogs/outline-custom-elements.dtd deleted file mode 100644 index b066980..0000000 --- a/source/firefox/locales/fr/dialogs/outline-custom-elements.dtd +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/source/firefox/locales/fr/dialogs/resize-window.dtd b/source/firefox/locales/fr/dialogs/resize-window.dtd deleted file mode 100644 index f0c9c5c..0000000 --- a/source/firefox/locales/fr/dialogs/resize-window.dtd +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/source/firefox/locales/fr/dialogs/resize-window.properties b/source/firefox/locales/fr/dialogs/resize-window.properties deleted file mode 100644 index 4b9a735..0000000 --- a/source/firefox/locales/fr/dialogs/resize-window.properties +++ /dev/null @@ -1,4 +0,0 @@ -# Resize window -invalidHeight=Une hauteur valide doit être indiquée. -invalidWidth=Une largeur valide doit être indiquée. -resizeWindow=Redimensionner la fenêtre diff --git a/source/firefox/locales/fr/options/options.dtd b/source/firefox/locales/fr/options/options.dtd deleted file mode 100644 index f280070..0000000 --- a/source/firefox/locales/fr/options/options.dtd +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/fr/options/options.properties b/source/firefox/locales/fr/options/options.properties deleted file mode 100644 index 7cafdbd..0000000 --- a/source/firefox/locales/fr/options/options.properties +++ /dev/null @@ -1,49 +0,0 @@ -# Common -delete=Effacer -no=Non -yes=Oui -# Keyboard -deleteKeyboardShortcut=Supprimer le raccourci clavier -deleteKeyboardShortcutConfirmation=Souhaitez-vous vraiment supprimer le raccourci clavier %S ? -# Disable All Styles -extensions.webdeveloper.keyboard.1.key=A -# Edit CSS -extensions.webdeveloper.keyboard.2.key=D -# Validate Local HTML -extensions.webdeveloper.keyboard.3.key=L -# View CSS -extensions.webdeveloper.keyboard.4.key=C -# View JavaScript -extensions.webdeveloper.keyboard.5.key=J -# View Source -extensions.webdeveloper.keyboard.6.key=U -# View Style Information -extensions.webdeveloper.keyboard.7.key=Y -# Resize -deleteResizeOption=Suppression de redimensionnement -deleteResizeOptionConfirmation=Souhaitez-vous vraiment supprimer le redimensionnement %S ? -extensions.webdeveloper.resize.1.description=1024x768 -# Responsive layouts -deleteResponsiveLayout=Suppression de modèle d'adaptation -deleteResponsiveLayoutConfirmation=Confirmez vous la suppression du modèle d'adaptation %S ? -extensions.webdeveloper.responsive.layout.1.description=Mobile portrait -extensions.webdeveloper.responsive.layout.2.description=Mobile paysage -extensions.webdeveloper.responsive.layout.3.description=Petite tablette portrait -extensions.webdeveloper.responsive.layout.4.description=Petite tablette paysage -extensions.webdeveloper.responsive.layout.5.description=Tablette portrait -extensions.webdeveloper.responsive.layout.6.description=Tablette paysage -# Tools -chooseApplication=Choisir une application -deleteTool=Supprimer l'outil -deleteToolConfirmation=Confirmez vous la suppression de l'outil %S ? -extensions.webdeveloper.tool.1.description=Validation CSS -extensions.webdeveloper.tool.2.description=Validation des flux -extensions.webdeveloper.tool.3.description=Validation HTML -extensions.webdeveloper.tool.3.key=V -extensions.webdeveloper.tool.4.description=Validation des liens -extensions.webdeveloper.tool.5.description=Validation Section 508 -extensions.webdeveloper.tool.6.description=Validation WAI -invalidApplication=L'application « %S » n'est pas une application valide. -# View Source With -deleteViewSourceWithOption=Suppression d'une entrée pour « Voir le code source avec » -deleteViewSourceWithOptionConfirmation=Souhaitez-vous vraiment supprimer l'entrée « %s » pour « Voir le code source avec » ? diff --git a/source/firefox/locales/fr/overlay/overlay.dtd b/source/firefox/locales/fr/overlay/overlay.dtd deleted file mode 100644 index f59f33c..0000000 --- a/source/firefox/locales/fr/overlay/overlay.dtd +++ /dev/null @@ -1,442 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/fr/overlay/overlay.properties b/source/firefox/locales/fr/overlay/overlay.properties deleted file mode 100644 index b953cb4..0000000 --- a/source/firefox/locales/fr/overlay/overlay.properties +++ /dev/null @@ -1,282 +0,0 @@ -# Common -about=À propos -action=Action -alt=Alt -anchor=Ancre -anchors=Ancres -author=Auteur -bytes=octets -cancel=Annuler -clear=Effacer -color=Couleur -colors=Couleurs -content=Contenu -cookie=Cookie -cookies=Cookies -css=CSS -dark=Dark -delete=Supprimer -depth=Profondeur -document=Document -documents=Documents -edit=Éditer… -elements=Éléments -errors=Erreurs -expires=Expire le -file=Fichier -files=Fichiers -form=Formulaire -forms=Formulaires -from=Dans -heading=Titre -headings=Titres -height=Hauteur -host=Domaine (host) -id=Id -image=Image -images=Images -invalid=Non valide -javaScript=JavaScript -kilobytes=Ko -label=Label -layouts=Modèles -light=Light -link=Lien -links=Liens -loading=Chargement -method=Méthode -name=Nom -no=Non -none=None -object=Object -objects=Objects -password=Mot de passe -path=Chemin -position=Position -property=Propriété -save=Enregistrer -script=Script -scripts=Scripts -secure=Sécurisé -size=Poids -src=Src -styleSheet=Feuille de style -styleSheets=Feuilles de style -type=Type -validating=Validation… -value=Valeur -version=Version -warning=Avertissement -warnings=Avertissements -width=Largeur -yes=Oui -# CSS Status -cssErrorLabel=E -cssErrorTooltip=Erreur CSS : %S -cssNoErrorsLabel=N -cssNoErrorsTooltip=Pas d'erreurs CSS -cssWarningLabel=A -cssWarningTooltip=Avertissement CSS : %S -# JavaScript Status -javaScriptDisabledLabel=D -javaScriptDisabledTooltip=JavaScript désactivé -javaScriptErrorLabel=E -javaScriptErrorTooltip=Erreur JavaScript : %S -javaScriptNoErrorsLabel=N -javaScriptNoErrorsTooltip=Pas d'erreur JavaScript -javaScriptWarningLabel=A -javaScriptWarningTooltip=Avertissement JavaScript : %S -# Render Mode Status -quirksModeLabel=Q -quirksModeTooltip=Mode natif (mode Quirks) -standardsComplianceModeLabel=S -standardsComplianceModeTooltip=Mode de Conformité aux normes -# About -buildDate=Date de création -extensionDescription=Ajoute un menu et une barre d'outils divers pour les développeurs web. -followOnAppNet=Follow on App.net -followOnTwitter=Follow on Twitter -# Applications -launchApplicationFailed=Impossible de lancer l'application « %S ». -openApplication=Ouvrir l'application -temporaryDirectoryFailed=Impossible d'écrire un fichier temporaire dans le dossier %S. -# DOM Inspector -domInspectorRequired=Cette fonctionnalité nécessite que l'inspecteur DOM soit installé. -# Frames -framesNotSupported=Cette fonctionnalité n'est pas disponible sur les pages contenant des cadres (frames). -# Generated Pages -collapseAll=Tout replier -expandAll=Tout déplier -extensionName=Web Developer -# Prompts -stopConfirmation=Ne plus demander à l'avenir -# Add User Style Sheet -addUserStyleSheet=Ajouter une feuille de style personnalisée -# Clear Cache -clearCache=Vider le cache -clearCacheConfirmation=Souhaitez-vous vraiment vider le cache ? -clearCacheResult=Le cache a été vidé. -# Clear Form Fields -clearFormFieldsMultipleResult=Les champs ont été effacés dans %S formulaires. -clearFormFieldsSingleResult=Les champs ont été effacés dans 1 formulaire. -# Clear History -clearHistory=Effacer l'historique -clearHistoryConfirmation=Souhaitez-vous vraiment effacer l'historique ? -clearHistoryResult=L'historique a été effacé. -# Clear HTTP Authentication -clearHTTPAuthentication=Effacer l'identification HTTP -clearHTTPAuthenticationConfirmation=Souhaitez-vous vraiment effacer l'identification HTTP ? -clearHTTPAuthenticationResult=L'identification HTTP a été effacée. -# Clear Radio Buttons -clearRadioButtonsMultipleResult=%S boutons radio ont été décochés. -clearRadioButtonsSingleResult=1 bouton radio a été décoché -# Convert Form Methods -convertFormMethodsMultipleResult=%S formulaires convertis en %S. -convertFormMethodsSingleResult=1 formulaire converti en %S. -# Convert Select Elements To Text Inputs -convertSelectElementsToTextInputsMultipleResult=%S éléments select convertis en input text. -convertSelectElementsToTextInputsSingleResult=1 élément select converti en input text. -# Convert Text Inputs To Textareas -convertTextInputsToTextareasMultipleResult=%S input text convertis en textarea. -convertTextInputsToTextareasSingleResult=1 input text converti en textarea. -# Delete Domain Cookies -deleteDomainCookies=Supprimer les cookies de domaine -deleteDomainCookiesMultipleConfirmation=Souhaitez-vous vraiment supprimer les %S cookies de domaine ? -deleteDomainCookiesMultipleResult=%S cookies de domaine ont été supprimés. -deleteDomainCookiesNoneFound=Aucun cookie de domaine à supprimer. -deleteDomainCookiesSingleConfirmation=Souhaitez-vous vraiment supprimer 1 cookie de domaine ? -deleteDomainCookiesSingleResult=1 cookie de domaine supprimé. -# Delete Path Cookies -deletePathCookies=Supprimer les cookies de chemin -deletePathCookiesMultipleConfirmation=Souhaitez-vous vraiment supprimer les %S cookies de chemin ? -deletePathCookiesMultipleResult=%S cookies de chemin ont été supprimés. -deletePathCookiesNoneFound=Aucun cookie de chemin à supprimer. -deletePathCookiesSingleConfirmation=Souhaitez-vous vraiment supprimer 1 cookie de chemin ? -deletePathCookiesSingleResult=1 cookie de chemin a été supprimé. -# Delete Session Cookies -deleteSessionCookies=Supprimer les cookies de session -deleteSessionCookiesMultipleConfirmation=Souhaitez-vous vraiment supprimer les %S cookies de session ? -deleteSessionCookiesMultipleResult=%S cookies de session ont été supprimés. -deleteSessionCookiesNoneFound=Aucun cookie de session à supprimer. -deleteSessionCookiesSingleConfirmation=Souhaitez-vous vraiment supprimer 1 cookie de session ? -deleteSessionCookiesSingleResult=1 cookie de session a été supprimé. -# Disable Individual Style Sheets -noStyleSheets=Aucune feuille de style. -# Display Element Information -elementInformation=Information sur l'élément -# Display Line Guides -displayLineGuides=Afficher les lignes repères -# Display Page Magnifier -displayPageMagnifier=Afficher la loupe -invalidMagnificationLevel=Un grossissement valide doit être indiqué. -# Display Passwords -displayPasswordsSingleResult=1 mot de passe affiché. -displayPasswordsMultipleResult=%S mots de passe affichés. -# Display Ruler -displayRuler=Afficher l'outil de mesure -invalidHeight=Une hauteur valide doit être indiquée. -invalidWidth=Une largeur valide doit être indiquée. -# Display Style Information -styleInformation=Information sur le style -# Display Window Size -displayWindowSizeResult=Fenêtre : %Spx x %Spx Zone d'affichage: %Spx x %Spx -# Edit CSS -editCSS=Édition CSS -# Edit HTML -editHTML=Édition HTML -# Enable Auto Completion -enableAutoCompletionMultipleResult=Auto-complétion activée pour %S éléments. -enableAutoCompletionSingleResult=Auto-complétion activée pour 1 élément. -# Enable Form Fields -enableFormFieldsMultipleResult=%S champs de formulaire ont été autorisés. -enableFormFieldsSingleResult=1 champ de formulaire a été autorisé. -# Expand Select Elements -expandSelectElementsMultipleResult=%S éléments select déroulés. -expandSelectElementsSingleResult=1 élément select déroulé. -# Find Broken Images -brokenImage=Image inaccessible -brokenImages=Images inaccessibles -# Find Duplicate Ids -duplicateId=Id dupliqué -duplicateIds=Id dupliqués -# Make Form Fields Writable -makeFormFieldsWritableMultipleResult=%S champs rendus modifiables. -makeFormFieldsWritableSingleResult=1 champs rendu modifiable. -# Make Frames Resizable -makeFramesResizableMultipleResult=%S cadres (frames) rendus redimensionnables. -makeFramesResizableSingleResult=1 cadre (frame) rendu redimensionnable. -# Make Images Full Size -makeImagesFullSizeMultipleResult=%S images mises en taille réelle. -makeImagesFullSizeSingleResult=1 image mise en taille réelle. -# Populate Form Fields -populateFormFieldsMultipleResult=%S champs de formulaire remplis. -populateFormFieldsSingleResult=1 champ de formulaire rempli. -# Reload Images -reloadImagesResult=les images ont été rechargées. -# Reload Linked Style Sheets -reloadLinkedStyleSheetsResult=les feuilles de style liéesont été rechargées. -# Remove Form Validation -removeFormValidationMultipleResult=Removed validation from %S form fields. -removeFormValidationSingleResult=Removed validation from 1 form field. -# Remove Maximum Lengths -removeMaximumLengthsMultipleResult=Longueurs maximales supprimées pour %S champs de formulaire. -removeMaximumLengthsSingleResult=Longueur maximale supprimé pour 1 champs de formulaire. -# Validate CSS -validateCSS=Validation CSS -# Validate HTML -validateHTML=Validation HTML -# View Anchor Information -anchorInformation=Information sur l'ancre -# View Color Information -colorInformation=Information sur la couleur -# View Cookie Information -atEndOfSession=À la fin de la session -cookieInformation=Information du cookie -cannotEdit=Édition impossible -cannotEditHTTPOnlyCookies=Les cookies HttpOnly ne peuvent pas être édités. -cannotEditLocalhostCookies=Les cookies sur un domaine localhost ne peuvent pas être édités. More information -cookieDeleted=Le cookie %S a été supprimé. -cookieEdited=le cookie %S a été modifié. -deleteConfirmation=Suppression… -deleteCookie=Supprimer le cookie -deleteCookieConfirmation=Souhaitez-vous vraiment supprimer le cookie %S? -editCookie=Édition du cookie -expiresCannotBeEmpty=La date d'expiration ne peut pas être vide si ce n'est pas un cookie de session. -expiresNotValid=La date d'expiration n'est pas valide. -hostCannotBeEmpty=Le domaine doit être défini. -httpOnly=HttpOnly -nameCannotBeEmpty=Le nom doit être défini. -pathCannotBeEmpty=le chemin doit être défini. -secureCookie=Cookie sécurisé -sessionCookie=Cookie de session -# View CSS -couldNotLoadCSS=Impossible de charger les CSS. -embeddedCSSFrom=CSS embarqués depuis -syntaxHighlighting=Syntax Highlighting -# View Document Outline -documentOutline=Plan du document -missingHeading=(Titre manquant) -noHeadingText=(Aucun titre de texte) -# View Document Size -documentSize=Poids du document -uncompressedSize=Poids non compressé -# View Form Information -maximumLength=Longueur maximale -# View JavaScript -beautifyJavaScript=Embellir le JavaScript -couldNotLoadJavaScript=Impossible de charger le JavaScript. -embeddedJavaScriptFrom=JavaScript embarqué depuis -undoBeautifyJavaScript=Annuler embellir le JavaScript -# View Link Information -linkInformation=Informations sur le lien -# View Meta Tag Information -metaTag=Balise Meta -metaTags=Balises Meta -# View Response Headers -couldNotLoadResponseHeaders=Impossible de charger l'en-tête de réponse. -responseHeaders=En-têtes de réponse -# View Responsive Layouts -reloadLayouts=Recharger les modèles -responsiveLayouts=Modèles adaptatifs -# View Source With -viewSourceWith=Voir le code source avec diff --git a/source/firefox/locales/ja-JP/dashboard/dashboard.dtd b/source/firefox/locales/ja-JP/dashboard/dashboard.dtd deleted file mode 100644 index a48d15e..0000000 --- a/source/firefox/locales/ja-JP/dashboard/dashboard.dtd +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/ja-JP/dashboard/dashboard.properties b/source/firefox/locales/ja-JP/dashboard/dashboard.properties deleted file mode 100644 index 7748b41..0000000 --- a/source/firefox/locales/ja-JP/dashboard/dashboard.properties +++ /dev/null @@ -1,29 +0,0 @@ -# Common -ancestors=祖先セレクタ -attribute=属性 -children=子孫セレクタ -dom=DOM -layout=レイアウト -position=ポジション -text=テキスト -value=値 -# Element Information -ancestorPathCopied=祖先セレクタのパスをクリップボードにコピーしました。 -copyAncestorPath=祖先セレクタのパスのコピー -elementInformation=要素情報 -selectAnElementDisplayInformation=Select an element to display the information about it -# Style Information -inlineStyles=インラインスタイル -line=ライン -noStyleInformation=CSS情報がありません -selectAnElementDisplayStyles=Select an element to display the styles applied to it -# Edit CSS -editCSS=CSS編集 -embeddedStyles=HTML埋込みCSS -openStyleSheet=CSSを開く -pinCSS=CSSにピンを打つ -saveStyleSheet=CSSの保存 -styleSheetDescription=CSSファイル -unpinCSS=CSSのピンを抜く -# Edit HTML -saveHTML=HTMLを保存 diff --git a/source/firefox/locales/ja-JP/dialogs/cookie.dtd b/source/firefox/locales/ja-JP/dialogs/cookie.dtd deleted file mode 100644 index 3c0eb8e..0000000 --- a/source/firefox/locales/ja-JP/dialogs/cookie.dtd +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/source/firefox/locales/ja-JP/dialogs/cookie.properties b/source/firefox/locales/ja-JP/dialogs/cookie.properties deleted file mode 100644 index 2241802..0000000 --- a/source/firefox/locales/ja-JP/dialogs/cookie.properties +++ /dev/null @@ -1,2 +0,0 @@ -# Cookie -addCookieError=Cookieの追加に失敗しました diff --git a/source/firefox/locales/ja-JP/dialogs/message.dtd b/source/firefox/locales/ja-JP/dialogs/message.dtd deleted file mode 100644 index 2de232f..0000000 --- a/source/firefox/locales/ja-JP/dialogs/message.dtd +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/source/firefox/locales/ja-JP/dialogs/outline-custom-elements.dtd b/source/firefox/locales/ja-JP/dialogs/outline-custom-elements.dtd deleted file mode 100644 index 4e7b893..0000000 --- a/source/firefox/locales/ja-JP/dialogs/outline-custom-elements.dtd +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/source/firefox/locales/ja-JP/dialogs/resize-window.dtd b/source/firefox/locales/ja-JP/dialogs/resize-window.dtd deleted file mode 100644 index 35ca52f..0000000 --- a/source/firefox/locales/ja-JP/dialogs/resize-window.dtd +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/source/firefox/locales/ja-JP/dialogs/resize-window.properties b/source/firefox/locales/ja-JP/dialogs/resize-window.properties deleted file mode 100644 index f1533ad..0000000 --- a/source/firefox/locales/ja-JP/dialogs/resize-window.properties +++ /dev/null @@ -1,4 +0,0 @@ -# Resize window -invalidHeight=適切な縦幅を指定してください。 -invalidWidth=適切な横幅を指定してください。 -resizeWindow=ウィンドウのリサイズ diff --git a/source/firefox/locales/ja-JP/options/options.dtd b/source/firefox/locales/ja-JP/options/options.dtd deleted file mode 100644 index 18468cd..0000000 --- a/source/firefox/locales/ja-JP/options/options.dtd +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/ja-JP/options/options.properties b/source/firefox/locales/ja-JP/options/options.properties deleted file mode 100644 index 890f910..0000000 --- a/source/firefox/locales/ja-JP/options/options.properties +++ /dev/null @@ -1,49 +0,0 @@ -# Common -delete=削除 -no=いいえ -yes=はい -# Keyboard -deleteKeyboardShortcut=ショートカットを削除する -deleteKeyboardShortcutConfirmation=本当に「%S」ショートカットを削除しますか? -# Disable All Styles -extensions.webdeveloper.keyboard.1.key=A -# Edit CSS -extensions.webdeveloper.keyboard.2.key=D -# Validate Local HTML -extensions.webdeveloper.keyboard.3.key=L -# View CSS -extensions.webdeveloper.keyboard.4.key=C -# View JavaScript -extensions.webdeveloper.keyboard.5.key=J -# View Source -extensions.webdeveloper.keyboard.6.key=U -# View Style Information -extensions.webdeveloper.keyboard.7.key=Y -# Resize -deleteResizeOption=サイズ設定を削除する -deleteResizeOptionConfirmation=本当に「%S」の設定を削除しますか? -extensions.webdeveloper.resize.1.description=1024x768 -# Responsive layouts -deleteResponsiveLayout=画面表示の削除 -deleteResponsiveLayoutConfirmation=本当に「%S」の設定を削除しますか? -extensions.webdeveloper.responsive.layout.1.description=モバイルポートレート -extensions.webdeveloper.responsive.layout.2.description=モバイルランドスケープ -extensions.webdeveloper.responsive.layout.3.description=スモールタブレットポートレート -extensions.webdeveloper.responsive.layout.4.description=スモールタブレットランドスケープ -extensions.webdeveloper.responsive.layout.5.description=タブレットポートレート -extensions.webdeveloper.responsive.layout.6.description=タブレットランドスケープ -# Tools -chooseApplication=アプリケーションの選択 -deleteTool=ツールの削除 -deleteToolConfirmation=本当に「%S」を削除しますか? -extensions.webdeveloper.tool.1.description=CSSの検証 -extensions.webdeveloper.tool.2.description=Feedの検証 -extensions.webdeveloper.tool.3.description=HTMLの検証 -extensions.webdeveloper.tool.3.key=V -extensions.webdeveloper.tool.4.description=リンク切れの検証 -extensions.webdeveloper.tool.5.description=米国リハビリテーション法508条の検証 -extensions.webdeveloper.tool.6.description=WAI(W3Cの規格)の検証 -invalidApplication=%Sは適切なアプリケーションではありません -# View Source With -deleteViewSourceWithOption=ソース表示機能(テキストエディタなど)の設定を削除する -deleteViewSourceWithOptionConfirmation=本当に「%S」を削除しますか? diff --git a/source/firefox/locales/ja-JP/overlay/overlay.dtd b/source/firefox/locales/ja-JP/overlay/overlay.dtd deleted file mode 100644 index 225fb87..0000000 --- a/source/firefox/locales/ja-JP/overlay/overlay.dtd +++ /dev/null @@ -1,442 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/ja-JP/overlay/overlay.properties b/source/firefox/locales/ja-JP/overlay/overlay.properties deleted file mode 100644 index 6561b5e..0000000 --- a/source/firefox/locales/ja-JP/overlay/overlay.properties +++ /dev/null @@ -1,282 +0,0 @@ -# Common -about=About -action=アクション -alt=Alt -anchor=アンカー -anchors=アンカー -author=作成者 -bytes=bytes -cancel=中止 -clear=クリア -color=色 -colors=色 -content=コンテンツ -cookie=Cookie -cookies=Cookie -css=CSS -dark=Dark -delete=削除 -depth=深さ -document=ドキュメント -documents=ドキュメント -edit=編集 -elements=要素 -errors=エラー -expires=有効期限 -file=ファイル -files=ファイル -form=フォーム -forms=フォーム -from=From -heading=見出し -headings=見出し -height=height -host=ホスト -id=Id -image=画像 -images=画像 -invalid=不適切 -javaScript=JavaScript -kilobytes=KB -label=Label -layouts=レイアウト -light=Light -link=リンク -links=リンク -loading=読み込み中 -method=Method -name=Name -no=No -none=None -object=オブジェクト -objects=オブジェクト -password=パスワード -path=パス -position=ポジション -property=プロパティ -save=保存 -script=スクリプト -scripts=スクリプト -secure=セキュア -size=サイズ -src=Src -styleSheet=CSS -styleSheets=CSS -type=Type -validating=検証中 -value=Value -version=バージョン -warning=警告 -warnings=警告 -width=width -yes=Yes -# CSS Status -cssErrorLabel=E -cssErrorTooltip=CSSエラー: %S -cssNoErrorsLabel=N -cssNoErrorsTooltip=CSSエラーはありません -cssWarningLabel=W -cssWarningTooltip=CSS警告: %S -# JavaScript Status -javaScriptDisabledLabel=D -javaScriptDisabledTooltip=JavaScriptの無効化 -javaScriptErrorLabel=E -javaScriptErrorTooltip=JavaScriptエラー: %S -javaScriptNoErrorsLabel=N -javaScriptNoErrorsTooltip=JavaScriptエラーはありません -javaScriptWarningLabel=W -javaScriptWarningTooltip=JavaScript警告: %S -# Render Mode Status -quirksModeLabel=Q -quirksModeTooltip=Quirksモード(過去互換) -standardsComplianceModeLabel=S -standardsComplianceModeTooltip=標準準拠モード -# About -buildDate=ビルドした日 -extensionDescription=Web Developerは、ツールバーや右クリックメニューから利用できる便利なWeb開発ツールです。 -followOnAppNet=Follow on App.net -followOnTwitter=Follow on Twitter -# Applications -launchApplicationFailed=アプリケーション「%S」を起動できません。 -openApplication=アプリケーションを開く -temporaryDirectoryFailed=「%S」ディレクトリに一時ファイルを書き込むことができませんでした。 -# DOM Inspector -domInspectorRequired=この機能を利用するには、DOMインスペクタをインストールする必要があります。 -# Frames -framesNotSupported=フレームページでは、この機能がサポートされていません。 -# Generated Pages -collapseAll=縮小表示 -expandAll=全表示 -extensionName=Web Developer -# Prompts -stopConfirmation=今後の確認をしない -# Add User Style Sheet -addUserStyleSheet=CSSを追加する -# Clear Cache -clearCache=キャッシュのクリア -clearCacheConfirmation=本当にキャッシュをクリアしますか? -clearCacheResult=キャッシュがクリアされました。 -# Clear Form Fields -clearFormFieldsMultipleResult=フォームの入力値を%S個クリアしました。 -clearFormFieldsSingleResult=フォームの入力値を1個クリアしました。 -# Clear History -clearHistory=履歴のクリア -clearHistoryConfirmation=本当に履歴を削除しますか? -clearHistoryResult=履歴をクリアしました。 -# Clear HTTP Authentication -clearHTTPAuthentication=HTTP認証のクリア -clearHTTPAuthenticationConfirmation=本当にHTTP認証をクリアしますか? -clearHTTPAuthenticationResult=HTTP認証をクリアしました。 -# Clear Radio Buttons -clearRadioButtonsMultipleResult=ラジオボタンのチェックを%S個クリアしました。 -clearRadioButtonsSingleResult=ラジオボタンのチェックを1個クリアしました。 -# Convert Form Methods -convertFormMethodsMultipleResult=%S個のform要素のmethod属性値を%Sに変換しました。 -convertFormMethodsSingleResult=1個のform要素のmethod属性値を%Sに変換しました。 -# Convert Select Elements To Text Inputs -convertSelectElementsToTextInputsMultipleResult=%S個のselect要素をinput要素(type=\"text\")に変換しました。 -convertSelectElementsToTextInputsSingleResult=1個のselect要素をinput要素(type=\"text\")に変換しました。 -# Convert Text Inputs To Textareas -convertTextInputsToTextareasMultipleResult=%S個のinput要素(type=\"text\")をtextarea要素に変換しました。 -convertTextInputsToTextareasSingleResult=1個のinput要素(type=\"text\")をtextarea要素に変換しました。 -# Delete Domain Cookies -deleteDomainCookies=ドメインCookieの削除 -deleteDomainCookiesMultipleConfirmation=本当に%S個のドメインCookieを削除しますか? -deleteDomainCookiesMultipleResult=%S個のドメインCookieを削除しました。 -deleteDomainCookiesNoneFound=ドメインCookieがありません。 -deleteDomainCookiesSingleConfirmation=本当に1個のドメインCookieを削除しますか? -deleteDomainCookiesSingleResult=1個のドメインCookieを削除しました。 -# Delete Path Cookies -deletePathCookies=パスCookieの削除 -deletePathCookiesMultipleConfirmation=本当に%S個のパスCookieを削除しますか? -deletePathCookiesMultipleResult=%S個のパスCookieを削除しました。 -deletePathCookiesNoneFound=パスCookieがありません。 -deletePathCookiesSingleConfirmation=本当に1個のパスCookieを削除しますか? -deletePathCookiesSingleResult=1個のパスCookieを削除しました。 -# Delete Session Cookies -deleteSessionCookies=セッションCookieの削除 -deleteSessionCookiesMultipleConfirmation=本当に%S個のセッションCookieを削除しますか? -deleteSessionCookiesMultipleResult=%S個のセッションCookieを削除しました。 -deleteSessionCookiesNoneFound=セッションCookieがありません。 -deleteSessionCookiesSingleConfirmation=本当に1個のセッションCookieを削除しますか? -deleteSessionCookiesSingleResult=1個のセッションCookieを削除しました。 -# Disable Individual Style Sheets -noStyleSheets=CSSがありません。 -# Display Element Information -elementInformation=要素情報 -# Display Line Guides -displayLineGuides=ガイドラインを表示する -# Display Page Magnifier -displayPageMagnifier=ページの拡大機能を表示する -invalidMagnificationLevel=拡大レベルの指定が不適切です。 -# Display Passwords -displayPasswordsSingleResult=1個のパスワードを表示しました。 -displayPasswordsMultipleResult=%S個のパスワードを表示しました。 -# Display Ruler -displayRuler=ルーラの表示 -invalidHeight=縦幅の指定が不適切です。 -invalidWidth=横幅の指定が不適切です。 -# Display Style Information -styleInformation=CSS情報 -# Display Window Size -displayWindowSizeResult=Window: %Spx x %Spx Viewport: %Spx x %Spx -# Edit CSS -editCSS=CSSの編集 -# Edit HTML -editHTML=HTMLの編集 -# Enable Auto Completion -enableAutoCompletionMultipleResult=%S個のautocomplete="off"を削除しました。 -enableAutoCompletionSingleResult=%S個のautocomplete="off"を削除しました。 -# Enable Form Fields -enableFormFieldsMultipleResult=%S個のdisabled属性を削除しました。 -enableFormFieldsSingleResult=1個のdisabled属性を削除しました。 -# Expand Select Elements -expandSelectElementsMultipleResult=%S個のselect要素の値を全て表示しました。 -expandSelectElementsSingleResult=1個のselect要素の値を全て表示しました。 -# Find Broken Images -brokenImage=壊れた画像 -brokenImages=壊れた画像 -# Find Duplicate Ids -duplicateId=重複id -duplicateIds=重複Ids -# Make Form Fields Writable -makeFormFieldsWritableMultipleResult=%S個のreadonly属性を削除しました。 -makeFormFieldsWritableSingleResult=1個のreadonly属性を削除しました。 -# Make Frames Resizable -makeFramesResizableMultipleResult=%S個のフレームをサイズ変更できるようにしました。 -makeFramesResizableSingleResult=1個のフレームをサイズ変更できるようにしました。 -# Make Images Full Size -makeImagesFullSizeMultipleResult=%S個の画像を本来のサイズにしました。 -makeImagesFullSizeSingleResult=1個の画像を本来のサイズにしました。 -# Populate Form Fields -populateFormFieldsMultipleResult=%S個のフィールドに自動割り当てしました。 -populateFormFieldsSingleResult=1個のフィールドに自動割り当てしました。 -# Reload Images -reloadImagesResult=画像を再読み込みしました。 -# Reload Linked Style Sheets -reloadLinkedStyleSheetsResult=link要素で指定されたCSSを再読み込みしました。 -# Remove Form Validation -removeFormValidationMultipleResult=Removed validation from %S form fields. -removeFormValidationSingleResult=Removed validation from 1 form field. -# Remove Maximum Lengths -removeMaximumLengthsMultipleResult=%S個のmaxlenght属性を削除しました。 -removeMaximumLengthsSingleResult=1個のmaxlenght属性を削除しました。 -# Validate CSS -validateCSS=CSSの検証 -# Validate HTML -validateHTML=HTMLの検証 -# View Anchor Information -anchorInformation=アンカー情報 -# View Color Information -colorInformation=色情報 -# View Cookie Information -atEndOfSession=セッションの終了 -cookieInformation=Cookie情報 -cannotEdit=編集できません -cannotEditHTTPOnlyCookies=HttpOnly cookieは編集できません -cannotEditLocalhostCookies=ローカルホストドメインのCookieは編集できません。さらなる情報 -cookieDeleted=%S個のCookieを削除しました。 -cookieEdited=%S個のCookieを編集しました。 -deleteConfirmation=削除 -deleteCookie=Cookieを削除する -deleteCookieConfirmation=本当に%S個のCookieを削除しますか? -editCookie=Cookieを編集する -expiresCannotBeEmpty=セッションCookieでない場合は、必ず有効期限を指定してください。 -expiresNotValid=指定された有効期限が不適切です。 -hostCannotBeEmpty=ホストを指定してください。 -httpOnly=HttpOnly -nameCannotBeEmpty=名前を指定してください。 -pathCannotBeEmpty=パスを指定してください。 -secureCookie=セキュアCookie -sessionCookie=セッションCookie -# View CSS -couldNotLoadCSS=CSSを読み込みできません。 -embeddedCSSFrom=style要素のCSS: -syntaxHighlighting=Syntax Highlighting -# View Document Outline -documentOutline=ドキュメントの概要 -missingHeading=(見出し(H要素)がありません) -noHeadingText=(見出し(H要素)のテキストがありません) -# View Document Size -documentSize=ドキュメントサイズ -uncompressedSize=未圧縮のサイズ -# View Form Information -maximumLength=最大の長さ -# View JavaScript -beautifyJavaScript=Beautify JavaScript -couldNotLoadJavaScript=JavaScriptの読み込みができません。 -embeddedJavaScriptFrom=JavaScript: -undoBeautifyJavaScript=Undo beautify JavaScript -# View Link Information -linkInformation=リンク情報 -# View Meta Tag Information -metaTag=metaタグ -metaTags=metaタグ -# View Response Headers -couldNotLoadResponseHeaders=レスポンスヘッダーを読み込みできませんでした。 -responseHeaders=レスポンスヘッダー -# View Responsive Layouts -reloadLayouts=レイアウトの再読み込み -responsiveLayouts=レイアウトのレスポンス -# View Source With -viewSourceWith=ソースの表示: diff --git a/source/firefox/locales/pl-PL/dashboard/dashboard.dtd b/source/firefox/locales/pl-PL/dashboard/dashboard.dtd deleted file mode 100644 index 09f0273..0000000 --- a/source/firefox/locales/pl-PL/dashboard/dashboard.dtd +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/pl-PL/dashboard/dashboard.properties b/source/firefox/locales/pl-PL/dashboard/dashboard.properties deleted file mode 100644 index 4eaca33..0000000 --- a/source/firefox/locales/pl-PL/dashboard/dashboard.properties +++ /dev/null @@ -1,29 +0,0 @@ -# Common -ancestors=Przodkowie -attribute=Atrybut -children=Dziecko -dom=DOM -layout=Układ -position=Pozycja -text=Tekst -value=Wartość -# Element Information -ancestorPathCopied=Ścieżka przodka została skopiowana do schowka. -copyAncestorPath=Kopiuj ścieżkę przodka -elementInformation=Informacje o elemencie -selectAnElementDisplayInformation=Wybierz element, by wyświetlić informacje o nim -# Style Information -inlineStyles=Style w tekście -line=Wiersz -noStyleInformation=Nie ma informacji o stylu -selectAnElementDisplayStyles=Wybierz element, by wyświetlić zastosowane dla niego style -# Edit CSS -editCSS=Edytowanie stylów -embeddedStyles=Style osadzone -openStyleSheet=Otwórz arkusz stylów -pinCSS=Przypnij style -saveStyleSheet=Zapisz arkusz stylów -styleSheetDescription=Pliki arkusza stylów -unpinCSS=Odepnij style -# Edit HTML -saveHTML=Zapisz HTML diff --git a/source/firefox/locales/pl-PL/dialogs/cookie.dtd b/source/firefox/locales/pl-PL/dialogs/cookie.dtd deleted file mode 100644 index c53fd49..0000000 --- a/source/firefox/locales/pl-PL/dialogs/cookie.dtd +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/source/firefox/locales/pl-PL/dialogs/cookie.properties b/source/firefox/locales/pl-PL/dialogs/cookie.properties deleted file mode 100644 index dd01d8f..0000000 --- a/source/firefox/locales/pl-PL/dialogs/cookie.properties +++ /dev/null @@ -1,2 +0,0 @@ -# Cookie -addCookieError=Błąd przy dodawaniu ciasteczka diff --git a/source/firefox/locales/pl-PL/dialogs/message.dtd b/source/firefox/locales/pl-PL/dialogs/message.dtd deleted file mode 100644 index 9d4dbae..0000000 --- a/source/firefox/locales/pl-PL/dialogs/message.dtd +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/source/firefox/locales/pl-PL/dialogs/outline-custom-elements.dtd b/source/firefox/locales/pl-PL/dialogs/outline-custom-elements.dtd deleted file mode 100644 index 4f2127e..0000000 --- a/source/firefox/locales/pl-PL/dialogs/outline-custom-elements.dtd +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/source/firefox/locales/pl-PL/dialogs/resize-window.dtd b/source/firefox/locales/pl-PL/dialogs/resize-window.dtd deleted file mode 100644 index b9e15a3..0000000 --- a/source/firefox/locales/pl-PL/dialogs/resize-window.dtd +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/source/firefox/locales/pl-PL/dialogs/resize-window.properties b/source/firefox/locales/pl-PL/dialogs/resize-window.properties deleted file mode 100644 index 8de22aa..0000000 --- a/source/firefox/locales/pl-PL/dialogs/resize-window.properties +++ /dev/null @@ -1,4 +0,0 @@ -# Resize window -invalidHeight=Musi być podana poprawna wysokość. -invalidWidth=Musi być podana poprawna szerokość. -resizeWindow=Zmień rozmiar okna diff --git a/source/firefox/locales/pl-PL/options/options.dtd b/source/firefox/locales/pl-PL/options/options.dtd deleted file mode 100644 index 840a47c..0000000 --- a/source/firefox/locales/pl-PL/options/options.dtd +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/pl-PL/options/options.properties b/source/firefox/locales/pl-PL/options/options.properties deleted file mode 100644 index 241db93..0000000 --- a/source/firefox/locales/pl-PL/options/options.properties +++ /dev/null @@ -1,49 +0,0 @@ -# Common -delete=Usuń -no=Nie -yes=Tak -# Keyboard -deleteKeyboardShortcut=Usuń skrót klawiszowy -deleteKeyboardShortcutConfirmation=Czy na pewno chcesz usunąć skrót klawiszowy? -# Disable All Styles -extensions.webdeveloper.keyboard.1.key=W -# Edit CSS -extensions.webdeveloper.keyboard.2.key=D -# Validate Local HTML -extensions.webdeveloper.keyboard.3.key=L -# View CSS -extensions.webdeveloper.keyboard.4.key=C -# View JavaScript -extensions.webdeveloper.keyboard.5.key=J -# View Source -extensions.webdeveloper.keyboard.6.key=R -# View Style Information -extensions.webdeveloper.keyboard.7.key=N -# Resize -deleteResizeOption=Usuń ustawienie zmiany rozmiaru -deleteResizeOptionConfirmation=Czy na pewno chcesz usunąć ustawienie zmiany rozmiaru %S? -extensions.webdeveloper.resize.1.description=1024x768 -# Responsive layouts -deleteResponsiveLayout=Usuń responsywny układ -deleteResponsiveLayoutConfirmation=Czy na pewno chcesz usunąć responsywny układ %S? -extensions.webdeveloper.responsive.layout.1.description=Mobile – układ pionowy -extensions.webdeveloper.responsive.layout.2.description=Mobile – układ poziomy -extensions.webdeveloper.responsive.layout.3.description=Mały tablet – układ pionowy -extensions.webdeveloper.responsive.layout.4.description=Mały tablet – układ poziomy -extensions.webdeveloper.responsive.layout.5.description=Tablet – układ pionowy -extensions.webdeveloper.responsive.layout.6.description=Tablet – układ poziomy -# Tools -chooseApplication=Wybierz aplikację -deleteTool=Usuń narzędzie -deleteToolConfirmation=Czy na pewno chcesz usunąć narzędzie %S? -extensions.webdeveloper.tool.1.description=Sprawdź CSS -extensions.webdeveloper.tool.2.description=Sprawdź RSS -extensions.webdeveloper.tool.3.description=Sprawdź HTML -extensions.webdeveloper.tool.3.key=S -extensions.webdeveloper.tool.4.description=Sprawdź odnośniki -extensions.webdeveloper.tool.5.description=Sprawdź sekcję 508 -extensions.webdeveloper.tool.6.description=Sprawdź WAI -invalidApplication=%S nie jest właściwą aplikacją. -# View Source With -deleteViewSourceWithOption=Usuń opcję zobacz źródło z -deleteViewSourceWithOptionConfirmation=Czy na pewno chcesz usunąć opcję zobacz źródło z %S? diff --git a/source/firefox/locales/pl-PL/overlay/overlay.dtd b/source/firefox/locales/pl-PL/overlay/overlay.dtd deleted file mode 100644 index a238ee6..0000000 --- a/source/firefox/locales/pl-PL/overlay/overlay.dtd +++ /dev/null @@ -1,442 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/pl-PL/overlay/overlay.properties b/source/firefox/locales/pl-PL/overlay/overlay.properties deleted file mode 100644 index d9ae3dd..0000000 --- a/source/firefox/locales/pl-PL/overlay/overlay.properties +++ /dev/null @@ -1,282 +0,0 @@ -# Common -about=O -action=Akcja -alt=Alt -anchor=Kotwica -anchors=Kotwice -author=Autor -bytes=bajtów -cancel=Anuluj -clear=Wyczyść -color=Kolor -colors=Kolory -content=Treść -cookie=Ciasteczko -cookies=Ciasteczka -css=CSS -dark=Dark -delete=Usuń -depth=Głębokość -document=Dokument -documents=Dokumenty -edit=Edytuj… -elements=Elementy -errors=Błędy -expires=Wygasa -file=Plik -files=Pliki -form=Formularz -forms=Formularze -from=Z -heading=Nagłówek -headings=Nagłówki -height=Wysokość -host=Serwer -id=Id -image=Obrazek -images=Obrazki -invalid=Nieprawidłowy -javaScript=JavaScript -kilobytes=KB -label=Etykieta -layouts=Układy -light=Light -link=Odnośnik -links=Odnośniki -loading=Wczytywanie -method=Metoda -name=Nazwa -no=Nie -none=None -object=Obiekt -objects=Obiekty -password=Hasło -path=Ścieżka -position=Pozycja -property=Właściwości -save=Zapisz -script=Skrypt -scripts=Skrypty -secure=Zabezpiecz -size=Rozmiar -src=Atrybut src -styleSheet=Arkusz stylów -styleSheets=Arkusze stylów -type=Typ -validating=Sprawdzanie… -value=Wartość -version=Wersja -warning=Ostrzeżenie -warnings=Ostrzeżenia -width=Szerokość -yes=Tak -# CSS Status -cssErrorLabel=B -cssErrorTooltip=CSS – błąd: %S -cssNoErrorsLabel=N -cssNoErrorsTooltip=Nie ma błędów CSS -cssWarningLabel=O -cssWarningTooltip=CSS – ostrzeżenie: %S -# JavaScript Status -javaScriptDisabledLabel=V -javaScriptDisabledTooltip=JavaScript wyłączony -javaScriptErrorLabel=J -javaScriptErrorTooltip=Błąd JavaScriptu: %S -javaScriptNoErrorsLabel=N -javaScriptNoErrorsTooltip=Nie ma błędów JavaScriptu -javaScriptWarningLabel=W -javaScriptWarningTooltip=JavaScript – ostrzeżenie: %S -# Render Mode Status -quirksModeLabel=Q -quirksModeTooltip=Tryb quirks -standardsComplianceModeLabel=S -standardsComplianceModeTooltip=Tryb zgodności standardów -# About -buildDate=Data kompilacji -extensionDescription=Dodaje menu i pasek narzędziowy z różnymi narzędziami przydatnymi programistom internetowym. -followOnAppNet=Follow on App.net -followOnTwitter=Follow on Twitter -# Applications -launchApplicationFailed=Nie udało się uruchomić aplikacji %S. -openApplication=Otwórz aplikację -temporaryDirectoryFailed=Nie można zapisać pliku tymczasowego w katalogu %S. -# DOM Inspector -domInspectorRequired=Ta funkcja wymaga, aby był zainstalowany dodatek Inspektor DOM. -# Frames -framesNotSupported=Ta funkcja nie jest obsługiwana na stronach zawierających ramki. -# Generated Pages -collapseAll=Zwiń wszystko -expandAll=Rozwiń wszystko -extensionName=Web Developer -# Prompts -stopConfirmation=Nie wyświetlaj tego potwierdzenia -# Add User Style Sheet -addUserStyleSheet=Dodaj własny arkusz stylów -# Clear Cache -clearCache=Wyczyść bufor podręczny -clearCacheConfirmation=Czy na pewno chcesz wyczyścić bufor podręczny? -clearCacheResult=Bufor podręczny został wyczyszczony. -# Clear Form Fields -clearFormFieldsMultipleResult=Usunięto z pól w %S formularzach. -clearFormFieldsSingleResult=Usunięto z pól w jednym formularzu. -# Clear History -clearHistory=Wyczyść historię -clearHistoryConfirmation=Czy na pewno chcesz wyczyścić historię? -clearHistoryResult=Historia została wyczyszczona. -# Clear HTTP Authentication -clearHTTPAuthentication=Czyszczenie danych uwierzytelniania HTTP -clearHTTPAuthenticationConfirmation=Czy na pewno chcesz wyczyścić dane uwierzytelniania HTTP? -clearHTTPAuthenticationResult=Dane uwierzytelniania HTTP zostały wyczyszczone. -# Clear Radio Buttons -clearRadioButtonsMultipleResult=Wyczyszczono przyciski typu „radio”: %S. -clearRadioButtonsSingleResult=Jeden przycisk typu „radio” został wyczyszczony. -# Convert Form Methods -convertFormMethodsMultipleResult=%S formularzy zostało przekształconych na metodę %S. -convertFormMethodsSingleResult=Jeden formularz został przekształcony na metodę %S. -# Convert Select Elements To Text Inputs -convertSelectElementsToTextInputsMultipleResult=Elementy przekształcone na pola tekstowe: %S. -convertSelectElementsToTextInputsSingleResult=Jeden element został przekształcony na pole tekstowe. -# Convert Text Inputs To Textareas -convertTextInputsToTextareasMultipleResult=Jednowierszowe pola tekstowe przekształcone na pola wielowierszowe: %S. -convertTextInputsToTextareasSingleResult=Jedno jednowierszowe pole tekstowe zostało przekształcone na pole wielowierszowe. -# Delete Domain Cookies -deleteDomainCookies=Usuwanie ciasteczek domeny -deleteDomainCookiesMultipleConfirmation=Czy na pewno chcesz usunąć %S ciasteczek domeny? -deleteDomainCookiesMultipleResult=Usunięto %S ciasteczek domeny. -deleteDomainCookiesNoneFound=Nie ma ciasteczek domeny do usunięcia. -deleteDomainCookiesSingleConfirmation=Czy na pewno chcesz usunąć ciasteczko domeny? -deleteDomainCookiesSingleResult=Ciasteczko domeny zostało usunięte. -# Delete Path Cookies -deletePathCookies=Usuwanie ciasteczek ścieżki -deletePathCookiesMultipleConfirmation=Czy na pewno chcesz usunąć %S ciasteczek ścieżki? -deletePathCookiesMultipleResult=Usunięto %S ciasteczek ścieżki. -deletePathCookiesNoneFound=Nie ma ciasteczek ścieżki do usunięcia. -deletePathCookiesSingleConfirmation=Czy na pewno chcesz usunąć ciasteczko ścieżki? -deletePathCookiesSingleResult=Ciasteczko ścieżki zostało usunięte. -# Delete Session Cookies -deleteSessionCookies=Usuwanie ciasteczek sesji -deleteSessionCookiesMultipleConfirmation=Czy na pewno chcesz usunąć %S ciasteczek sesji? -deleteSessionCookiesMultipleResult=Usunięto %S ciasteczek sesji. -deleteSessionCookiesNoneFound=Nie ma ciasteczek sesji do usunięcia. -deleteSessionCookiesSingleConfirmation=Czy na pewno chcesz usunąć ciasteczko sesji? -deleteSessionCookiesSingleResult=Ciasteczko sesji zostało usunięte. -# Disable Individual Style Sheets -noStyleSheets=Nie ma arkuszy stylów -# Display Element Information -elementInformation=Informacje o elemencie -# Display Line Guides -displayLineGuides=Wyświetlaj prowadnice -# Display Page Magnifier -displayPageMagnifier=Wyświetlaj powiększenie strony -invalidMagnificationLevel=Musi być określona prawidłowa wartość powiększenia. -# Display Passwords -displayPasswordsSingleResult=Wyświetlone hasła: 1. -displayPasswordsMultipleResult=Wyświetlone hasła: %S. -# Display Ruler -displayRuler=Wyświetlaj linijkę -invalidHeight=Musi być określona prawidłowa wysokość. -invalidWidth=Musi być określona prawidłowa szerokość. -# Display Style Information -styleInformation=Informacje o stylach -# Display Window Size -displayWindowSizeResult=Okno: %Spx x %Spx Treść strony: %Spx x %Spx -# Edit CSS -editCSS=Edytowanie stylów -# Edit HTML -editHTML=Edytowanie HTML -# Enable Auto Completion -enableAutoCompletionMultipleResult=Włączono autouzupełnianie dla %S elementów. -enableAutoCompletionSingleResult=Włączono autouzupełnianie dla jednego elementu. -# Enable Form Fields -enableFormFieldsMultipleResult=Odblokowano %S pól formularza. -enableFormFieldsSingleResult=Odblokowano jedno pole formularza. -# Expand Select Elements -expandSelectElementsMultipleResult=Rozwinięto %S elementów. -expandSelectElementsSingleResult=Rozwinięto jeden element. -# Find Broken Images -brokenImage=uszkodzony obrazek -brokenImages=Uszkodzone obrazki -# Find Duplicate Ids -duplicateId=zduplikowany id -duplicateIds=Zduplikowane ID -# Make Form Fields Writable -makeFormFieldsWritableMultipleResult=Uaktywnione pola formularza: %S. -makeFormFieldsWritableSingleResult=Uaktywnione pola formularza: 1. -# Make Frames Resizable -makeFramesResizableMultipleResult=Ramki zmienione na skalowalne: %S. -makeFramesResizableSingleResult=Ramki zmienione na skalowalne: 1. -# Make Images Full Size -makeImagesFullSizeMultipleResult=Obrazki zmienione na pełny rozmiar: %S. -makeImagesFullSizeSingleResult=Obrazki zmienione na pełny rozmiar: 1. -# Populate Form Fields -populateFormFieldsMultipleResult=Wypełnione pola formularza: %S. -populateFormFieldsSingleResult=Wypełnione pola formularza: 1. -# Reload Images -reloadImagesResult=Obrazki zostały odświeżone. -# Reload Linked Style Sheets -reloadLinkedStyleSheetsResult=Dołączone style zostały odświeżone. -# Remove Form Validation -removeFormValidationMultipleResult=Removed validation from %S form fields. -removeFormValidationSingleResult=Removed validation from 1 form field. -# Remove Maximum Lengths -removeMaximumLengthsMultipleResult=Usunięto ograniczenie długości pola formularza dla %S pól. -removeMaximumLengthsSingleResult=Usunięto ograniczenie długości pola formularza dla jednego pola. -# Validate CSS -validateCSS=Sprawdź CSS -# Validate HTML -validateHTML=Sprawdź HTML -# View Anchor Information -anchorInformation=Informacje o kotwicach -# View Color Information -colorInformation=Informacje o kolorze -# View Cookie Information -atEndOfSession=Na końcu sesji -cookieInformation=Informacje o ciasteczku -cannotEdit=Nie można wyedytować -cannotEditHTTPOnlyCookies=Nie można edytować ciasteczek HttpOnly. -cannotEditLocalhostCookies=Nie można edytować ciasteczek w domenie serwera lokalnego. Więcej informacji na ten temat -cookieDeleted=Ciasteczko %S zostało usunięte. -cookieEdited=Ciasteczko %S zostało zmienione. -deleteConfirmation=Usuń… -deleteCookie=Usuwanie ciasteczka -deleteCookieConfirmation=Czy na pewno chcesz usunąć ciasteczko %S? -editCookie=Edycja ciasteczka -expiresCannotBeEmpty=Pole daty wygaśnięcia nie może być puste, jeśli nie jest to ciasteczko sesji. -expiresNotValid=Data wygaśnięcia nie jest poprawną datą. -hostCannotBeEmpty=Pole serwera nie może być puste. -httpOnly=HttpOnly -nameCannotBeEmpty=Pole nazwy nie może być puste. -pathCannotBeEmpty=Pole ścieżki nie może być puste. -secureCookie=Bezpieczne ciasteczko -sessionCookie=Ciasteczko sesji -# View CSS -couldNotLoadCSS=Nie można wczytać arkusza stylów. -embeddedCSSFrom=Arkusz stylów osadzony z -syntaxHighlighting=Syntax Highlighting -# View Document Outline -documentOutline=Zarys dokumentu -missingHeading=(Brak nagłówka) -noHeadingText=(Brak tekstu nagłówka) -# View Document Size -documentSize=Rozmiar dokumentu -uncompressedSize=Rozmiar nieskompresowany -# View Form Information -maximumLength=Maksymalna długość -# View JavaScript -beautifyJavaScript=Formatowanie JavaScriptu -couldNotLoadJavaScript=Nie można wczytać kodu JavaScript. -embeddedJavaScriptFrom=Kod JavaScript osadzony z -undoBeautifyJavaScript=Cofnij formatowanie -# View Link Information -linkInformation=Informacje o odnośnikach -# View Meta Tag Information -metaTag=znacznik meta -metaTags=Znaczniki meta -# View Response Headers -couldNotLoadResponseHeaders=Nie można wczytać nagłówków odpowiedzi. -responseHeaders=Nagłówki odpowiedzi -# View Responsive Layouts -reloadLayouts=Odśwież układy -responsiveLayouts=Responsywne układy -# View Source With -viewSourceWith=Zobacz źródło z diff --git a/source/firefox/locales/pt-BR/dashboard/dashboard.dtd b/source/firefox/locales/pt-BR/dashboard/dashboard.dtd deleted file mode 100644 index 125b08b..0000000 --- a/source/firefox/locales/pt-BR/dashboard/dashboard.dtd +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/pt-BR/dashboard/dashboard.properties b/source/firefox/locales/pt-BR/dashboard/dashboard.properties deleted file mode 100644 index f086b37..0000000 --- a/source/firefox/locales/pt-BR/dashboard/dashboard.properties +++ /dev/null @@ -1,24 +0,0 @@ -ancestors=Ancestrais -attribute=Atributo -children=Filhos -dom=DOM -layout=Layout -position=Posição -text=Texto -value=Valor -ancestorPathCopied=O caminho do ancestral foi copiado para a área de transferência. -copyAncestorPath=Copiar caminho do ancestral -elementInformation=Informação do elemento -selectAnElementDisplayInformation=Selecione um elemento para exibir as informações sobre ele -inlineStyles=Estilos inline -line=Linha -noStyleInformation=Nenhuma informação de estilo -selectAnElementDisplayStyles=Selecione um elemento para exibir os estilos aplicados a ele -editCSS=Editar CSS -embeddedStyles=Estilos incorporados -openStyleSheet=Abrir folha de estilo -pinCSS=Fixar CSS -saveStyleSheet=Salvar folha de estilo -styleSheetDescription=Arquivos de folha de estilo -unpinCSS=Desfixar CSS -saveHTML=Salvar HTML diff --git a/source/firefox/locales/pt-BR/dialogs/cookie.dtd b/source/firefox/locales/pt-BR/dialogs/cookie.dtd deleted file mode 100644 index 8ee2bda..0000000 --- a/source/firefox/locales/pt-BR/dialogs/cookie.dtd +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/source/firefox/locales/pt-BR/dialogs/cookie.properties b/source/firefox/locales/pt-BR/dialogs/cookie.properties deleted file mode 100644 index da9d309..0000000 --- a/source/firefox/locales/pt-BR/dialogs/cookie.properties +++ /dev/null @@ -1 +0,0 @@ -addCookieError=Erro ao adicionar cookie diff --git a/source/firefox/locales/pt-BR/dialogs/message.dtd b/source/firefox/locales/pt-BR/dialogs/message.dtd deleted file mode 100644 index 601e66f..0000000 --- a/source/firefox/locales/pt-BR/dialogs/message.dtd +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/source/firefox/locales/pt-BR/dialogs/outline-custom-elements.dtd b/source/firefox/locales/pt-BR/dialogs/outline-custom-elements.dtd deleted file mode 100644 index 7a18aee..0000000 --- a/source/firefox/locales/pt-BR/dialogs/outline-custom-elements.dtd +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/source/firefox/locales/pt-BR/dialogs/resize-window.dtd b/source/firefox/locales/pt-BR/dialogs/resize-window.dtd deleted file mode 100644 index dc417dd..0000000 --- a/source/firefox/locales/pt-BR/dialogs/resize-window.dtd +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/source/firefox/locales/pt-BR/dialogs/resize-window.properties b/source/firefox/locales/pt-BR/dialogs/resize-window.properties deleted file mode 100644 index a5daf9d..0000000 --- a/source/firefox/locales/pt-BR/dialogs/resize-window.properties +++ /dev/null @@ -1,3 +0,0 @@ -invalidHeight=Uma altura válida deve ser especificada. -invalidWidth=Uma largura válida deve ser especificada. -resizeWindow=Redimensionar janela diff --git a/source/firefox/locales/pt-BR/options/options.dtd b/source/firefox/locales/pt-BR/options/options.dtd deleted file mode 100644 index b80a658..0000000 --- a/source/firefox/locales/pt-BR/options/options.dtd +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/pt-BR/options/options.properties b/source/firefox/locales/pt-BR/options/options.properties deleted file mode 100644 index 6e240d1..0000000 --- a/source/firefox/locales/pt-BR/options/options.properties +++ /dev/null @@ -1,36 +0,0 @@ -delete=Apagar -no=Não -yes=Sim -deleteKeyboardShortcut=Apagar atalho de teclado -deleteKeyboardShortcutConfirmation=Tem certeza que quer apagar o atalho de teclado %S? -extensions.webdeveloper.keyboard.1.key=T -extensions.webdeveloper.keyboard.2.key=E -extensions.webdeveloper.keyboard.3.key=L -extensions.webdeveloper.keyboard.4.key=C -extensions.webdeveloper.keyboard.5.key=J -extensions.webdeveloper.keyboard.6.key=F -extensions.webdeveloper.keyboard.7.key=T -deleteResizeOption=Apagar opção de redimensionar -deleteResizeOptionConfirmation=Tem certeza que quer apagar a opção de redimensionar %S? -extensions.webdeveloper.resize.1.description=1024x768 -deleteResponsiveLayout=Apagar layout responsivo -deleteResponsiveLayoutConfirmation=Tem certeza que quer apagar o layout responsivo %S? -extensions.webdeveloper.responsive.layout.1.description=Retrato em mobile -extensions.webdeveloper.responsive.layout.2.description=Paisagem em mobile -extensions.webdeveloper.responsive.layout.3.description=Retrato em tablet pequeno -extensions.webdeveloper.responsive.layout.4.description=Paisagem em tablet pequeno -extensions.webdeveloper.responsive.layout.5.description=Retrato em tablet -extensions.webdeveloper.responsive.layout.6.description=Paisagem em tablet -chooseApplication=Escolher aplicação -deleteTool=Ferramenta de remoção -deleteToolConfirmation=Tem certeza que quer apagar a ferramenta %S? -extensions.webdeveloper.tool.1.description=Validar CSS -extensions.webdeveloper.tool.2.description=Validar feed -extensions.webdeveloper.tool.3.description=Validar HTML -extensions.webdeveloper.tool.3.key=V -extensions.webdeveloper.tool.4.description=Validar links -extensions.webdeveloper.tool.5.description=Validar seção 508 -extensions.webdeveloper.tool.6.description=Validar WAI -invalidApplication=%S não é uma aplicação válida. -deleteViewSourceWithOption=Apagar opção 'Ver código fonte com' -deleteViewSourceWithOptionConfirmation=Tem certeza que quer apagar a opção 'ver código fonte com' %S? diff --git a/source/firefox/locales/pt-BR/overlay/overlay.dtd b/source/firefox/locales/pt-BR/overlay/overlay.dtd deleted file mode 100644 index 771a4b8..0000000 --- a/source/firefox/locales/pt-BR/overlay/overlay.dtd +++ /dev/null @@ -1,404 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/pt-BR/overlay/overlay.properties b/source/firefox/locales/pt-BR/overlay/overlay.properties deleted file mode 100644 index 6c754a0..0000000 --- a/source/firefox/locales/pt-BR/overlay/overlay.properties +++ /dev/null @@ -1,221 +0,0 @@ -about=Sobre -action=Ação -alt=Alt -anchor=Âncora -anchors=Âncoras -author=Autor -bytes=bytes -cancel=Cancelar -clear=Limpar -color=Cor -colors=Cores -content=Conteúdo -cookie=Cookie -cookies=Cookies -css=CSS -dark=Dark -delete=Apagar -depth=Profundidade -document=Documento -documents=Documentos -edit=Editar… -elements=Elementos -errors=Erros -expires=Expiração -file=Arquivo -files=Arquivos -form=Formulário -forms=Formulários -from=De -heading=Cabeçalho -headings=Cabeçalhos -height=Altura -host=Host -id=Id -image=Imagem -images=Imagens -invalid=Inválido -javaScript=JavaScript -kilobytes=KB -label=Rótulo -layouts=Layouts -light=Light -link=Link -links=Links -loading=Carregamento -method=Método -name=Nome -no=Não -none=None -object=Objeto -objects=Objetos -password=Senha -path=Caminho -position=Posição -property=Propriedade -save=Salvar -script=Script -scripts=Scripts -secure=Seguro -size=Tamanho -src=Origem -styleSheet=Folha de Estilo -styleSheets=Folhas de Estilo -type=Tipo -validating=Validando… -value=Valor -version=Versão -warning=Alerta -warnings=Alertas -width=Largura -yes=Sim -cssErrorLabel=E -cssErrorTooltip=Erro de CSS: %S -cssNoErrorsLabel=N -cssNoErrorsTooltip=Nenhum erro de CSS -cssWarningLabel=A -cssWarningTooltip=Alerta de CSS: %S -javaScriptDisabledLabel=D -javaScriptDisabledTooltip=JavaScript desabilitado -javaScriptErrorLabel=E -javaScriptErrorTooltip=Erro de JavaScript: %S -javaScriptNoErrorsLabel=N -javaScriptNoErrorsTooltip=Nenhum erro de JavaScript -javaScriptWarningLabel=A -javaScriptWarningTooltip=Alerta de JavaScript: %S -quirksModeLabel=Q -quirksModeTooltip=Modo Quirks -standardsComplianceModeLabel=S -standardsComplianceModeTooltip=Modo Standards Compliance (conformidade com normas) -buildDate=Data de geração -extensionDescription=Adiciona um menu e uma barra com várias ferramentas de desenvolvimento para web. -followOnAppNet=Follow on App.net -followOnTwitter=Follow on Twitter -launchApplicationFailed=Não foi possível lançar a aplicação %S. -openApplication=Abrir aplicação -temporaryDirectoryFailed=Não foi possível gravar um arquivo temporário no diretório %S. -domInspectorRequired=Este recurso necessita que o DOM Inspector esteja instalado. -framesNotSupported=Este recurso não é suportado em páginas com frames. -collapseAll=Recolher tudo -expandAll=Expandir tudo -extensionName=Web Developer -stopConfirmation=Não pedir confirmação no futuro -addUserStyleSheet=Adicionar folha de estilo do usuário -clearCache=Limpar cache -clearCacheConfirmation=Tem certeza que quer limpar o cache? -clearCacheResult=O cache foi limpo. -clearFormFieldsMultipleResult=Campos de formulário limpos em %S formulários. -clearFormFieldsSingleResult=Campos de formulário limpos em 1 formulário. -clearHistory=Limpar histórico -clearHistoryConfirmation=Tem certeza que quer limpar o histórico? -clearHistoryResult=O histórico foi limpo. -clearHTTPAuthentication=Limpar autenticação HTTP -clearHTTPAuthenticationConfirmation=Tem certeza que quer limpar a autenticação HTTP? -clearHTTPAuthenticationResult=A autenticação HTTP foi limpa. -clearRadioButtonsMultipleResult=%S botões de rádio limpos. -clearRadioButtonsSingleResult=1 botão de rádio limpo. -convertFormMethodsMultipleResult=%S formulários convertidos para %Ss. -convertFormMethodsSingleResult=1 formulário convertido para um %S. -convertSelectElementsToTextInputsMultipleResult=%S elementos selecionados convertidos para entradas de texto. -convertSelectElementsToTextInputsSingleResult=1 elemento selecionado convertido para uma entrada de texto. -convertTextInputsToTextareasMultipleResult=%S entradas de texto convertidas para áreas de texto. -convertTextInputsToTextareasSingleResult=1 entrada de texto convertida para uma área de texto. -deleteDomainCookies=Apagar cookies de domínio -deleteDomainCookiesMultipleConfirmation=Tem certeza que quer apagar %S cookies de domínio? -deleteDomainCookiesMultipleResult=%S cookies de domínio apagados. -deleteDomainCookiesNoneFound=Não há nenhum cookie de domínio a apagar. -deleteDomainCookiesSingleConfirmation=Tem certeza que quer apagar 1 cookie de domínio? -deleteDomainCookiesSingleResult=1 cookie de domínio apagado. -deletePathCookies=Apagar cookies de caminho -deletePathCookiesMultipleConfirmation=Tem certeza que quer apagar %S cookies de caminho? -deletePathCookiesMultipleResult=%S cookies de caminho apagados. -deletePathCookiesNoneFound=Não há nenhum cookie de caminho a apagar. -deletePathCookiesSingleConfirmation=Tem certeza que quer apagar 1 cookie de caminho? -deletePathCookiesSingleResult=1 cookie de caminho apagado. -deleteSessionCookies=Apagar cookies de sessão -deleteSessionCookiesMultipleConfirmation=Tem certeza que quer apagar %S cookies de sessão? -deleteSessionCookiesMultipleResult=%S cookies de sessão apagados. -deleteSessionCookiesNoneFound=Não há nenhum cookie de sessão a apagar. -deleteSessionCookiesSingleConfirmation=Tem certeza que quer apagar 1 cookie de sessão? -deleteSessionCookiesSingleResult=1 cookie de sessão apagado. -noStyleSheets=Nenhuma folha de estilo -elementInformation=Informações do elemento -displayLineGuides=Exibir guias de linha -displayPageMagnifier=Exibir lente de aumento da página -invalidMagnificationLevel=Um nível de aumento válido deve ser especificado. -displayPasswordsSingleResult=1 senha exibida. -displayPasswordsMultipleResult=%S senhas exibidas. -displayRuler=Exibir régua -invalidHeight=Uma altura válida deve ser especificada. -invalidWidth=Uma largura válida deve ser especificada. -styleInformation=Informações de estilo -displayWindowSizeResult=Janela: %Spx x %Spx Área de visualização (Viewport): %Spx x %Spx -editCSS=Editar CSS -editHTML=Editar HTML -enableAutoCompletionMultipleResult=Habilitar preenchimento automático para %S elementos. -enableAutoCompletionSingleResult=Habilitar preenchimento automático para 1 elemento. -enableFormFieldsMultipleResult=%S campos de formulário habilitados. -enableFormFieldsSingleResult=1 campo de formulário habilitado. -expandSelectElementsMultipleResult=%S elementos selecionados expandidos. -expandSelectElementsSingleResult=1 elemento selecionado expandido. -brokenImage=imagem quebrada -brokenImages=Imagens qubradas -duplicateId=id duplicado -duplicateIds=Ids duplicados -makeFormFieldsWritableMultipleResult=%S campos de formulário tornados graváveis. -makeFormFieldsWritableSingleResult=1 campo de formulário tornado gravável. -makeFramesResizableMultipleResult=%S frames tornados redimensionáveis. -makeFramesResizableSingleResult=1 frame tornado redimensionável. -makeImagesFullSizeMultipleResult=%S imagens alteradas para tamanho completo. -makeImagesFullSizeSingleResult=1 imagem alterada para tamanho completo. -populateFormFieldsMultipleResult=%S campos de formulário preenchidos. -populateFormFieldsSingleResult=1 campo de formulário preenchido. -reloadImagesResult=As imagens foram recarregadas. -reloadLinkedStyleSheetsResult=A folha de estilo linkada foi recarregada. -removeFormValidationMultipleResult=Removed validation from %S form fields. -removeFormValidationSingleResult=Removed validation from 1 form field. -removeMaximumLengthsMultipleResult=Removida a largura máxima de %S campos de formulário. -removeMaximumLengthsSingleResult=Removida a largura máxima de 1 campo de formulário. -validateCSS=Validar CSS -validateHTML=Validar HTML -anchorInformation=Informações de âncora -colorInformation=Informações de cor -atEndOfSession=No final da sessão -cookieInformation=Informações de cookie -cannotEdit=Não é possível editar -cannotEditHTTPOnlyCookies=Cookies HttpOnly não podem ser editados. -cannotEditLocalhostCookies=Cookies em um domínio localhost não podem ser editados Mais informações -cookieDeleted=O cookie %S foi apagado. -cookieEdited=O cookie %S foi editado. -deleteConfirmation=Apagar… -deleteCookie=Apagar cookie -deleteCookieConfirmation=Tem certeza que quer apagar o cookie %S? -editCookie=Editar cookie -expiresCannotBeEmpty=A data de expiração não pode ficar vazia se este não for um cookie de sessão. -expiresNotValid=A data de expiração não é válida. -hostCannotBeEmpty=O host não pode ficar vazio. -httpOnly=HttpOnly -nameCannotBeEmpty=O nome não pode ficar vazio. -pathCannotBeEmpty=O caminho não pode ficar vazio. -secureCookie=Cookie de segurança -sessionCookie=Cookie de sessão -couldNotLoadCSS=O CSS não pode ser carregado. -embeddedCSSFrom=CSS incorporado de -documentOutline=Destaque do documento -missingHeading=(Falta cabeçalho) -noHeadingText=(Nenhum texto de cabeçalho) -documentSize=Tamanho do documento -uncompressedSize=Tamanho descompactado -maximumLength=Largura máxima -beautifyJavaScript=Embelezar JavaScript -couldNotLoadJavaScript=O JavaScript não pode ser carregado. -embeddedJavaScriptFrom=JavaScript incorporado de -undoBeautifyJavaScript=Desfazer embelezamento de JavaScript -linkInformation=Informações de link -metaTag=meta tag -metaTags=Meta Tags -couldNotLoadResponseHeaders=Os cabeçalhos de resposta não puderam ser carregados. -responseHeaders=Cabeçalhos de resposta -reloadLayouts=Recarregar layouts -responsiveLayouts=Layouts responsivos -viewSourceWith=Ver código fonte com diff --git a/source/firefox/locales/sv-SE/dashboard/dashboard.dtd b/source/firefox/locales/sv-SE/dashboard/dashboard.dtd deleted file mode 100644 index b65adf6..0000000 --- a/source/firefox/locales/sv-SE/dashboard/dashboard.dtd +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/sv-SE/dashboard/dashboard.properties b/source/firefox/locales/sv-SE/dashboard/dashboard.properties deleted file mode 100644 index 703ea98..0000000 --- a/source/firefox/locales/sv-SE/dashboard/dashboard.properties +++ /dev/null @@ -1,29 +0,0 @@ -# Common -ancestors=Överordnade -attribute=Attribut -children=Underordnade -dom=DOM -layout=Layout -position=Position -text=Text -value=Värde -# Elementinformation -ancestorPathCopied=Sökvägen till det överordnade objektet har kopierats till Urklipp. -copyAncestorPath=Kopiera sökväg till överordnat objekt -elementInformation=Elementinformation -selectAnElementDisplayInformation=Markera ett objekt för att visa informationen om det -# Formatinformation -inlineStyles=Infogade format -line=Rad -noStyleInformation=Ingen formatinformation -selectAnElementDisplayStyles=Markera ett objekt för att visa de format som tillämpas på det -# Redigera CSS -editCSS=Redigera CSS -embeddedStyles=Inbäddade format -openStyleSheet=Öppna formatmall -pinCSS=Nåla fast CSS -saveStyleSheet=Spara formatmall -styleSheetDescription=Formatmallsfiler -unpinCSS=Ta bort nål för CSS -# Redigera HTML -saveHTML=Spara HTML diff --git a/source/firefox/locales/sv-SE/dialogs/cookie.dtd b/source/firefox/locales/sv-SE/dialogs/cookie.dtd deleted file mode 100644 index 1595956..0000000 --- a/source/firefox/locales/sv-SE/dialogs/cookie.dtd +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/source/firefox/locales/sv-SE/dialogs/cookie.properties b/source/firefox/locales/sv-SE/dialogs/cookie.properties deleted file mode 100644 index 3fb18a7..0000000 --- a/source/firefox/locales/sv-SE/dialogs/cookie.properties +++ /dev/null @@ -1,2 +0,0 @@ -# Cookie -addCookieError=Ett fel inträffade när en kaka skulle läggas till diff --git a/source/firefox/locales/sv-SE/dialogs/message.dtd b/source/firefox/locales/sv-SE/dialogs/message.dtd deleted file mode 100644 index 9b5c513..0000000 --- a/source/firefox/locales/sv-SE/dialogs/message.dtd +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/source/firefox/locales/sv-SE/dialogs/outline-custom-elements.dtd b/source/firefox/locales/sv-SE/dialogs/outline-custom-elements.dtd deleted file mode 100644 index 22d7e02..0000000 --- a/source/firefox/locales/sv-SE/dialogs/outline-custom-elements.dtd +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/source/firefox/locales/sv-SE/dialogs/resize-window.dtd b/source/firefox/locales/sv-SE/dialogs/resize-window.dtd deleted file mode 100644 index c96d17d..0000000 --- a/source/firefox/locales/sv-SE/dialogs/resize-window.dtd +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/source/firefox/locales/sv-SE/dialogs/resize-window.properties b/source/firefox/locales/sv-SE/dialogs/resize-window.properties deleted file mode 100644 index 159b01a..0000000 --- a/source/firefox/locales/sv-SE/dialogs/resize-window.properties +++ /dev/null @@ -1,4 +0,0 @@ -# Byt storlek window -invalidHeight=En giltig höjd måste anges. -invalidWidth=En giltig bredd måste anges. -resizeWindow=Byt storlek på fönstret diff --git a/source/firefox/locales/sv-SE/options/options.dtd b/source/firefox/locales/sv-SE/options/options.dtd deleted file mode 100644 index be3d76d..0000000 --- a/source/firefox/locales/sv-SE/options/options.dtd +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/sv-SE/options/options.properties b/source/firefox/locales/sv-SE/options/options.properties deleted file mode 100644 index a32d28d..0000000 --- a/source/firefox/locales/sv-SE/options/options.properties +++ /dev/null @@ -1,49 +0,0 @@ -# Common -delete=Ta bort -no=Nej -yes=Ja -# Kortkommando -deleteKeyboardShortcut=Ta bort kortkommando -deleteKeyboardShortcutConfirmation=Är du säker på att du vill ta bort kortkommandot %S? -# Inaktivera All Styles -extensions.webdeveloper.keyboard.1.key=A -# Redigera CSS -extensions.webdeveloper.keyboard.2.key=D -# Validera Local HTML -extensions.webdeveloper.keyboard.3.key=L -# Visa CSS -extensions.webdeveloper.keyboard.4.key=C -# Visa JavaScript -extensions.webdeveloper.keyboard.5.key=J -# Visa källkod -extensions.webdeveloper.keyboard.6.key=U -# Visa Formatinformation -extensions.webdeveloper.keyboard.7.key=Y -# Byt storlek -deleteResizeOption=Ta bort Byt storlek-alternativ -deleteResizeOptionConfirmation=Är du säker på att du vill ta bort byt storlek-alternativet %S? -extensions.webdeveloper.resize.1.description=1024x768 -# Responsive layouts -deleteResponsiveLayout=Ta bort anpassningsbar webbdesign-layout -deleteResponsiveLayoutConfirmation=Är du säker på att du vill ta bort anpassningsbar webbdesign-layouten %S? -extensions.webdeveloper.responsive.layout.1.description=Mobil, stående -extensions.webdeveloper.responsive.layout.2.description=Mobil, liggande -extensions.webdeveloper.responsive.layout.3.description=Liten surfplatta, stående -extensions.webdeveloper.responsive.layout.4.description=Liten surfplatta, liggande -extensions.webdeveloper.responsive.layout.5.description=Surfplatta, stående -extensions.webdeveloper.responsive.layout.6.description=Surfplatta, liggande -# Verktyg -chooseApplication=Välj program -deleteTool=Ta bort verktyg -deleteToolConfirmation=Är du säker på att du vill ta bort verktyget %S? -extensions.webdeveloper.tool.1.description=Validera CSS -extensions.webdeveloper.tool.2.description=Validera flöde -extensions.webdeveloper.tool.3.description=Validera HTML -extensions.webdeveloper.tool.3.key=V -extensions.webdeveloper.tool.4.description=Validera länkar -extensions.webdeveloper.tool.5.description=Validera Section 508 -extensions.webdeveloper.tool.6.description=Validera WAI -invalidApplication=%S är inte ett giltigt program. -# Visa källkod With -deleteViewSourceWithOption=Ta bort Visa källkod med-alternativ -deleteViewSourceWithOptionConfirmation=Är du säker på att du vill ta bort visa källkod med-alternativet %S? diff --git a/source/firefox/locales/sv-SE/overlay/overlay.dtd b/source/firefox/locales/sv-SE/overlay/overlay.dtd deleted file mode 100644 index 5bdc4d9..0000000 --- a/source/firefox/locales/sv-SE/overlay/overlay.dtd +++ /dev/null @@ -1,442 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/sv-SE/overlay/overlay.properties b/source/firefox/locales/sv-SE/overlay/overlay.properties deleted file mode 100644 index c6dfa70..0000000 --- a/source/firefox/locales/sv-SE/overlay/overlay.properties +++ /dev/null @@ -1,282 +0,0 @@ -# Common -about=Om -action=Åtgärd -alt=ALT -anchor=Ankare -anchors=Ankare -author=Skapat av -bytes=byte -cancel=Avbryt -clear=Rensa -color=Färg -colors=Färger -content=Innehåll -cookie=Kaka -cookies=Kakor -css=CSS -dark=Dark -delete=Ta bort -depth=Djup -document=Dokument -documents=Dokument -edit=Redigera… -elements=Element -errors=Fel -expires=Förfaller -file=Fil -files=Filer -form=Formulär -forms=Formulär -from=Från -heading=Rubrik -headings=Rubriker -height=Höjd -host=Värd -id=ID -image=Bild -images=Bilder -invalid=Ogiltig -javaScript=JavaScript -kilobytes=kB -label=Etikett -layouts=Layouter -light=Light -link=Länk -links=Länkar -loading=Läser in -method=Metod -name=Namn -no=Nej -none=None -object=Objekt -objects=Objekt -password=Lösenord -path=Sökväg -position=Position -property=Egenskap -save=Spara -script=Skript -scripts=Skript -secure=Säker -size=Storlek -src=Källkod -styleSheet=Formatmall -styleSheets=Formatmallar -type=Typ -validating=Validerar… -value=Värde -version=Version -warning=Varning -warnings=Varningar -width=Bredd -yes=Ja -# CSS Status -cssErrorLabel=F -cssErrorTooltip=CSS-fel: %S -cssNoErrorsLabel=O -cssNoErrorsTooltip=Inga CSS-fel -cssWarningLabel=V -cssWarningTooltip=CSS-varning: %S -# JavaScript Status -javaScriptDisabledLabel=I -javaScriptDisabledTooltip=JavaScript är inaktiverat -javaScriptErrorLabel=F -javaScriptErrorTooltip=JavaScript-fel: %S -javaScriptNoErrorsLabel=O -javaScriptNoErrorsTooltip=Inga JavaScript-fel -javaScriptWarningLabel=V -javaScriptWarningTooltip=JavaScript-varning: %S -# Render Mode Status -quirksModeLabel=B -quirksModeTooltip=Bristfällig kod (quirks) -standardsComplianceModeLabel=E -standardsComplianceModeTooltip=Efterlevnad av standarder -# About -buildDate=Byggdatum -extensionDescription=Lägger till en meny och ett verktygsfält med diverse webbutvecklingsverktyg. -followOnAppNet=Follow on App.net -followOnTwitter=Follow on Twitter -# Applications -launchApplicationFailed=Det gick inte att starta programmet %S. -openApplication=Öppna program -temporaryDirectoryFailed=Det gick inte att skriva till en temporär fil i mappen %S. -# DOM Inspector -domInspectorRequired=Denna funktion kräver att tillägget DOM Inspector installeras. -# Frames -framesNotSupported=Denna funktion stöds inte på sidor med ramar. -# Generated Pages -collapseAll=Dölj alla -expandAll=Visa alla -extensionName=Web Developer -# Prompts -stopConfirmation=Begär ingen bekräftelse nästa gång -# Lägg till formatmall -addUserStyleSheet=Lägg till formatmall -# Rensa Cache -clearCache=Rensa cache -clearCacheConfirmation=Är du säker på att du vill rensa cachen? -clearCacheResult=Cachen har rensats. -# Rensa formulärfält -clearFormFieldsMultipleResult=Rensade formulärfält i %S formulär. -clearFormFieldsSingleResult=Rensade formulärfält i 1 formulär. -# Rensa History -clearHistory=Rensa historik -clearHistoryConfirmation=Är du säker på att du vill rensa historiken? -clearHistoryResult=Historiken har rensats. -# Rensa HTTP Authentication -clearHTTPAuthentication=Rensa HTTP-autentisering -clearHTTPAuthenticationConfirmation=Är du säker på att du vill rensa HTTP-autentiseringen? -clearHTTPAuthenticationResult=HTTP-autentiseringen har rensats. -# Rensa alternativknappar -clearRadioButtonsMultipleResult=%S alternativknappar rensades. -clearRadioButtonsSingleResult=1 alternativknapp rensades. -# Convert Form Methods -convertFormMethodsMultipleResult=%S formulär konverterades till %S. -convertFormMethodsSingleResult=1 formulär konverterades till %S. -# Convert Select Elements To Text Inputs -convertSelectElementsToTextInputsMultipleResult=%S markerade element konverterades till textindata. -convertSelectElementsToTextInputsSingleResult=1 markerat element konverterades till a textindata. -# Convert Text Inputs To Textareas -convertTextInputsToTextareasMultipleResult=%S textindataobjekt konverterades till textområden. -convertTextInputsToTextareasSingleResult=1 textindataobjekt konverterades till ett textområde. -# Ta bort domänkakor -deleteDomainCookies=Ta bort domänkakor -deleteDomainCookiesMultipleConfirmation=Är du säker på att du vill ta bort %S domänkakor? -deleteDomainCookiesMultipleResult=%S domänkakor togs bort. -deleteDomainCookiesNoneFound=Det finns inga domänkakor att ta bort. -deleteDomainCookiesSingleConfirmation=Är du säker på att du vill ta bort 1 domänkaka? -deleteDomainCookiesSingleResult=1 domänkaka togs bort. -# Ta bort sökvägskakor -deletePathCookies=Ta bort sökvägskakor -deletePathCookiesMultipleConfirmation=Är du säker på att du vill ta bort %S sökvägskakor? -deletePathCookiesMultipleResult=%S sökvägskakor togs bort. -deletePathCookiesNoneFound=Det finns inga sökvägskakor att ta bort. -deletePathCookiesSingleConfirmation=Är du säker på att du vill ta bort 1 sökvägskaka? -deletePathCookiesSingleResult=1 sökvägskaka togs bort. -# Ta bort sessionskakor -deleteSessionCookies=Ta bort sessionskakor -deleteSessionCookiesMultipleConfirmation=Är du säker på att du vill ta bort %S sessionskakor? -deleteSessionCookiesMultipleResult=%S sessionskakor togs bort. -deleteSessionCookiesNoneFound=Det finns inga sessionskakor att ta bort. -deleteSessionCookiesSingleConfirmation=Är du säker på att du vill ta bort 1 sessionskaka? -deleteSessionCookiesSingleResult=1 sessionskaka togs bort. -# Inaktivera Individual Style Sheets -noStyleSheets=Inga formatmallar -# Display Elementinformation -elementInformation=Elementinformation -# Display Rad Guides -displayLineGuides=Visa stödlinjer -# Display Page Magnifier -displayPageMagnifier=Visa förstoringsglas för sida -invalidMagnificationLevel=En giltig förstoringsnivå måste anges. -# Display Passwords -displayPasswordsSingleResult=1 lösenord visas. -displayPasswordsMultipleResult=%S lösenord visas. -# Display Ruler -displayRuler=Visa linjal -invalidHeight=En giltig höjd måste anges. -invalidWidth=En giltig bredd måste anges. -# Display Formatinformation -styleInformation=Formatinformation -# Display Window Size -displayWindowSizeResult=Fönster: %Spx x %Spx Visningsområde: %Spx x %Spx -# Redigera CSS -editCSS=Redigera CSS -# Redigera HTML -editHTML=Redigera HTML -# Enable Auto Completion -enableAutoCompletionMultipleResult=Automatisk komplettering aktiverades för %S element. -enableAutoCompletionSingleResult=Automatisk komplettering aktiverades för 1 element. -# Enable formulärfält -enableFormFieldsMultipleResult=%S formulärfält aktiverades. -enableFormFieldsSingleResult=1 formulärfält aktiverades. -# Expand Select Elements -expandSelectElementsMultipleResult=%S markerade element expanderades. -expandSelectElementsSingleResult=1 markerat element expanderades. -# Find Broken Bilder -brokenImage=bruten bildlänk -brokenImages=Brutna bildlänkar -# Find Duplicate Ids -duplicateId=ID-dubblett -duplicateIds=ID-dubbletter -# Make formulärfält Writable -makeFormFieldsWritableMultipleResult=%S formulärfält gjordes skrivbara. -makeFormFieldsWritableSingleResult=1 formulärfält gjordes skrivbart. -# Make Frames Resizable -makeFramesResizableMultipleResult=%S ramar gjordes justerbara. -makeFramesResizableSingleResult=1 ram gjordes justerbar. -# Make Bilder Full Size -makeImagesFullSizeMultipleResult=%S bilder maximerades till naturlig storlek. -makeImagesFullSizeSingleResult=1 bild maximerades till naturlig storlek. -# Populate formulärfält -populateFormFieldsMultipleResult=%S formulärfält fylldes i. -populateFormFieldsSingleResult=1 formulärfält fylldes i. -# Uppdatera Bilder -reloadImagesResult=Bilderna har uppdaterats. -# Uppdatera länkade formatmallar -reloadLinkedStyleSheetsResult=De länkade formatmallarna har uppdaterats. -# Remove Form Validation -removeFormValidationMultipleResult=Removed validation from %S form fields. -removeFormValidationSingleResult=Removed validation from 1 form field. -# Remove Maximum Lengths -removeMaximumLengthsMultipleResult=Maximilängden togs bort från %S formulärfält. -removeMaximumLengthsSingleResult=Maximilängden togs bort från 1 formulärfält. -# Validera CSS -validateCSS=Validera CSS -# Validera HTML -validateHTML=Validera HTML -# Visa Anchor Information -anchorInformation=Ankarinformation -# Visa Color Information -colorInformation=Färginformation -# Visa kakinformation -atEndOfSession=I slutet av sessionen -cookieInformation=Kakinformation -cannotEdit=Ingen redigering -cannotEditHTTPOnlyCookies=HttpOnly-flaggade kakor kan inte redigeras. -cannotEditLocalhostCookies=Kakor på en lokal värddomän (localhost) kan inte redigeras. Mer information (på engelska) -cookieDeleted=Kakan %S togs bort. -cookieEdited=Kakan %S redigerades. -deleteConfirmation=Ta bort… -deleteCookie=Ta bort kaka -deleteCookieConfirmation=Är du säker på att du vill ta bort kakan %S? -editCookie=Redigera kaka -expiresCannotBeEmpty=Förfallodatumfältet får inte vara tomt om kakan inte är en sessionskaka. -expiresNotValid=Förfallodatumet är inte ett giltigt datum. -hostCannotBeEmpty=Värdfältet får inte vara tomt. -httpOnly=HttpOnly -nameCannotBeEmpty=Namnfältet får inte vara tomt. -pathCannotBeEmpty=Sökvägsfältet får inte vara tomt. -secureCookie=Säker kaka -sessionCookie=Sessionskaka -# Visa CSS -couldNotLoadCSS=Det gick inte att läsa in CSS-datan. -embeddedCSSFrom=Inbäddad CSS från -syntaxHighlighting=Syntax Highlighting -# Visa Document Kontur -documentOutline=Dokumentkonturering -missingHeading=(Rubrik saknas) -noHeadingText=(Ingen rubriktext) -# Visa Document Size -documentSize=Dokumentstorlek -uncompressedSize=Okomprimerad storlek -# Visa Form Information -maximumLength=Maximilängd -# Visa JavaScript -beautifyJavaScript=Försköna JavaScript -couldNotLoadJavaScript=Det gick inte att läsa in JavaScript-koden. -embeddedJavaScriptFrom=Inbäddad JavaScript från -undoBeautifyJavaScript=Ångra försköning av JavaScript -# Visa Link Information -linkInformation=Länkinformation -# Visa Meta Tag Information -metaTag=metatagg -metaTags=Metataggar -# Visa Response Headers -couldNotLoadResponseHeaders=Det gick inte att läsa in svarshuvudena. -responseHeaders=Svarshuvuden -# Visa Responsive Layouts -reloadLayouts=Uppdatera layouter -responsiveLayouts=Layouter för anpassningsbar webbdesign -# Visa källkod With -viewSourceWith=Visa källkod med diff --git a/source/firefox/locales/zh-CN/dashboard/dashboard.dtd b/source/firefox/locales/zh-CN/dashboard/dashboard.dtd deleted file mode 100644 index 273eb24..0000000 --- a/source/firefox/locales/zh-CN/dashboard/dashboard.dtd +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/zh-CN/dashboard/dashboard.properties b/source/firefox/locales/zh-CN/dashboard/dashboard.properties deleted file mode 100644 index 5cf26d5..0000000 --- a/source/firefox/locales/zh-CN/dashboard/dashboard.properties +++ /dev/null @@ -1,33 +0,0 @@ -# Common -ancestors=祖节点 -attribute=属性 -children=子节点 -dom=DOM -layout=布局 -position=位置 -text=文本 -value=值 - -# Element Information -ancestorPathCopied=节点路径已被复制到剪贴板 -copyAncestorPath=复制节点路径 -elementInformation=元素信息 -selectAnElementDisplayInformation=选择一个元素,显示它的相关信息 - -# Style Information -inlineStyles=行内样式 -line=行 -noStyleInformation=没有样式信息 -selectAnElementDisplayStyles=选择一个元素,显示应用于其上的样式信息 - -# Edit CSS -editCSS=编辑 CSS -embeddedStyles=内部样式 -openStyleSheet=打开样式表 -pinCSS=固定 CSS -saveStyleSheet=保存样式表 -styleSheetDescription=样式表文件 -unpinCSS=取消固定 - -# Edit HTML -saveHTML=保存 HTML diff --git a/source/firefox/locales/zh-CN/dialogs/cookie.dtd b/source/firefox/locales/zh-CN/dialogs/cookie.dtd deleted file mode 100644 index bb78924..0000000 --- a/source/firefox/locales/zh-CN/dialogs/cookie.dtd +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/source/firefox/locales/zh-CN/dialogs/cookie.properties b/source/firefox/locales/zh-CN/dialogs/cookie.properties deleted file mode 100644 index 6e84d18..0000000 --- a/source/firefox/locales/zh-CN/dialogs/cookie.properties +++ /dev/null @@ -1,2 +0,0 @@ -# Cookie -addCookieError=发生错误 diff --git a/source/firefox/locales/zh-CN/dialogs/message.dtd b/source/firefox/locales/zh-CN/dialogs/message.dtd deleted file mode 100644 index 67ada36..0000000 --- a/source/firefox/locales/zh-CN/dialogs/message.dtd +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/source/firefox/locales/zh-CN/dialogs/outline-custom-elements.dtd b/source/firefox/locales/zh-CN/dialogs/outline-custom-elements.dtd deleted file mode 100644 index c38202f..0000000 --- a/source/firefox/locales/zh-CN/dialogs/outline-custom-elements.dtd +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/source/firefox/locales/zh-CN/dialogs/resize-window.dtd b/source/firefox/locales/zh-CN/dialogs/resize-window.dtd deleted file mode 100644 index 24beda4..0000000 --- a/source/firefox/locales/zh-CN/dialogs/resize-window.dtd +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/source/firefox/locales/zh-CN/dialogs/resize-window.properties b/source/firefox/locales/zh-CN/dialogs/resize-window.properties deleted file mode 100644 index 75a9f7a..0000000 --- a/source/firefox/locales/zh-CN/dialogs/resize-window.properties +++ /dev/null @@ -1,4 +0,0 @@ -# Resize window -invalidHeight=必须指定一个有效的高度 -invalidWidth=必须指定一个有效的宽度 -resizeWindow=提示 diff --git a/source/firefox/locales/zh-CN/options/options.dtd b/source/firefox/locales/zh-CN/options/options.dtd deleted file mode 100644 index 36ae1a7..0000000 --- a/source/firefox/locales/zh-CN/options/options.dtd +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/zh-CN/options/options.properties b/source/firefox/locales/zh-CN/options/options.properties deleted file mode 100644 index a3a2772..0000000 --- a/source/firefox/locales/zh-CN/options/options.properties +++ /dev/null @@ -1,54 +0,0 @@ -# Common -delete=删除 -no=否 -yes=是 - -# Keyboard -deleteKeyboardShortcut=删除快捷键 -deleteKeyboardShortcutConfirmation=确定要删除「%S」的快捷键吗? -# Disable All Styles -extensions.webdeveloper.keyboard.1.key=A -# Edit CSS -extensions.webdeveloper.keyboard.2.key=D -# Validate Local HTML -extensions.webdeveloper.keyboard.3.key=L -# View CSS -extensions.webdeveloper.keyboard.4.key=C -# View JavaScript -extensions.webdeveloper.keyboard.5.key=J -# View Source -extensions.webdeveloper.keyboard.6.key=U -# View Style Information -extensions.webdeveloper.keyboard.7.key=Y - -# Resize -deleteResizeOption=删除缩放选项 -deleteResizeOptionConfirmation=确定要删除「%S」这个缩放选项吗? -extensions.webdeveloper.resize.1.description=1024x768 - -# Responsive layouts -deleteResponsiveLayout=删除响应布局 -deleteResponsiveLayoutConfirmation=确定要删除「%S」这个响应布局吗? -extensions.webdeveloper.responsive.layout.1.description=手机竖屏 -extensions.webdeveloper.responsive.layout.2.description=手机横屏 -extensions.webdeveloper.responsive.layout.3.description=小平板竖屏 -extensions.webdeveloper.responsive.layout.4.description=小平板横屏 -extensions.webdeveloper.responsive.layout.5.description=大平板竖屏 -extensions.webdeveloper.responsive.layout.6.description=大平板横屏 - -# Tools -chooseApplication=选择应用程序 -deleteTool=删除工具 -deleteToolConfirmation=确定要删除「%S」这个工具吗? -extensions.webdeveloper.tool.1.description=验证 CSS -extensions.webdeveloper.tool.2.description=验证 Feed -extensions.webdeveloper.tool.3.description=验证 HTML -extensions.webdeveloper.tool.3.key=V -extensions.webdeveloper.tool.4.description=验证 链接 -extensions.webdeveloper.tool.5.description=验证 508规范 -extensions.webdeveloper.tool.6.description=验证 WAI -invalidApplication=%S 不是一个有效的应用程序 - -# View Source With -deleteViewSourceWithOption=删除查看选项 -deleteViewSourceWithOptionConfirmation=确定要删除「%S」这个查看选项吗? diff --git a/source/firefox/locales/zh-CN/overlay/overlay.dtd b/source/firefox/locales/zh-CN/overlay/overlay.dtd deleted file mode 100644 index 0731993..0000000 --- a/source/firefox/locales/zh-CN/overlay/overlay.dtd +++ /dev/null @@ -1,479 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/firefox/locales/zh-CN/overlay/overlay.properties b/source/firefox/locales/zh-CN/overlay/overlay.properties deleted file mode 100644 index 041e66f..0000000 --- a/source/firefox/locales/zh-CN/overlay/overlay.properties +++ /dev/null @@ -1,341 +0,0 @@ -# Common -about=关于 -action=动作 -alt=Alt -anchor=锚点 -anchors=锚点 -author=作者 -bytes=字节 -cancel=取消 -clear=清除 -color=颜色 -colors=颜色 -content=内容 -cookie=Cookie -cookies=Cookies -css=CSS -dark=Dark -delete=删除 -depth=深度 -document=文档 -documents=文档 -edit=编辑... -elements=元素 -errors=错误 -expires=到期 -file=文件 -files=文件 -form=表格 -forms=表格 -from=来自 -heading=标题 -headings=标题 -height=高度 -host=主机/域名 -id=Id -image=图像 -images=图像 -invalid=无效 -javaScript=JavaScript -kilobytes=KB -label=标签 -layouts=布局 -light=Light -link=链接 -links=链接 -loading=正在载入 -method=方法 -name=名称 -no=否 -none=不使用 -object=对象 -objects=对象 -password=密码 -path=路径 -position=位置 -property=属性 -save=保存 -script=脚本 -scripts=脚本 -secure=安全的 -size=大小 -src=来源 -styleSheet=样式表 -styleSheets=样式表 -type=类型 -validating=验证中... -value=值 -version=版本号 -warning=警告 -warnings=警告 -width=宽度 -yes=是 - -# CSS Status -cssErrorLabel=E -cssErrorTooltip=CSS 错误: %S -cssNoErrorsLabel=N -cssNoErrorsTooltip=无 CSS 错误 -cssWarningLabel=W -cssWarningTooltip=CSS 警告: %S - -# JavaScript Status -javaScriptDisabledLabel=D -javaScriptDisabledTooltip=JavaScript 已禁用 -javaScriptErrorLabel=E -javaScriptErrorTooltip=JavaScript 错误: %S -javaScriptNoErrorsLabel=N -javaScriptNoErrorsTooltip=无 JavaScript 错误 -javaScriptWarningLabel=W -javaScriptWarningTooltip=JavaScript 警告: %S - -# Render Mode Status -quirksModeLabel=Q -quirksModeTooltip=怪癖模式 -standardsComplianceModeLabel=S -standardsComplianceModeTooltip=标准模式 - -# About -buildDate=生成日期 -extensionDescription=一款能在浏览器中添加各种Web开发功能的工具 -followOnAppNet=在 App.net 上关注我 -followOnTwitter=在 Twitter 上关注我 - -# Applications -launchApplicationFailed=无法启动应用程序:%S. -openApplication=打开应用程序 -temporaryDirectoryFailed=无法写入临时文件的目录:%S - -# DOM Inspector -domInspectorRequired=此功能需要安装插件「DOM Inspector」 - -# Frames -framesNotSupported=存在框架的网页不支持该功能 - -# Generated Pages -collapseAll=全部收起 -expandAll=全部展开 -extensionName=Web Developer - -# Prompts -stopConfirmation=以后不再询问 - -# Add User Style Sheet -addUserStyleSheet=添加自定义样式表 - -# Clear Cache -clearCache=清理缓存 -clearCacheConfirmation=确定要清理缓存吗? -clearCacheResult=缓存已被清理 - -# Clear Form Fields -clearFormFieldsMultipleResult=已在 %S 表单里清除表单字段 -clearFormFieldsSingleResult=已在 1 表单中清理表单字段 - -# Clear History -clearHistory=清除历史记录 -clearHistoryConfirmation=你确定要清除历史记录么? -clearHistoryResult=已成功清除历史记录 - -# Clear HTTP Authentication -clearHTTPAuthentication=清除 HTTP 认证 -clearHTTPAuthenticationConfirmation=确定要清除 HTTP 认证吗? -clearHTTPAuthenticationResult=已成功清除 HTTP 认证 - -# Clear Radio Buttons -clearRadioButtonsMultipleResult=清除单选按钮 %S -clearRadioButtonsSingleResult=单选按钮 1 已成功清除 - -# Convert Form Methods -convertFormMethodsMultipleResult=已将 %S 份表单的传送方式转换为 %S -convertFormMethodsSingleResult=已将 1 份表单的发送方式转换为 %S - -# Convert Select Elements To Text Inputs -convertSelectElementsToTextInputsMultipleResult=已将 %S 个选取元素转换为文本输入框 -convertSelectElementsToTextInputsSingleResult=已将 1 个选取元素转换为文本输入框 - -# Convert Text Inputs To Textareas -convertTextInputsToTextareasMultipleResult=已将 %S 个文本输入转换为文本域 -convertTextInputsToTextareasSingleResult=已将 1 个文本输入转换为文本域 - -# Delete Domain Cookies -deleteDomainCookies=刪除此域名下的 Cookie -deleteDomainCookiesMultipleConfirmation=确定要删除 %S 个属于该域名下的 Cookies 吗? -deleteDomainCookiesMultipleResult=已删除 %S 个属于该域名下的 Cookies -deleteDomainCookiesNoneFound=没有找到需要删除的 属于该域名下的 Cookie -deleteDomainCookiesSingleConfirmation=确定要删除 1 个属于该域名下的 Cookie 吗? -deleteDomainCookiesSingleResult=已删除 1 个属于该域名下的 Cookie - -# Delete Path Cookies -deletePathCookies=刪除此路径下的 Cookie -deletePathCookiesMultipleConfirmation=确定要删除 %S 个属于该路径下的 Cookie 吗? -deletePathCookiesMultipleResult=已删除 %S 个属于该路径下的 Cookie -deletePathCookiesNoneFound=没有找到需要删除的 属于该路径下的 Cookie -deletePathCookiesSingleConfirmation=确定要删除 1 个属于该路径下的 Cookie 吗? -deletePathCookiesSingleResult=已删除 1 个属于该路径下的 Cookie - -# Delete Session Cookies -deleteSessionCookies=删除此会话期的 Cookie -deleteSessionCookiesMultipleConfirmation=确定要删除 %S 个属于该会话期的 Cookie 吗? -deleteSessionCookiesMultipleResult=已删除 %S 个属于该会话期的 Cookie -deleteSessionCookiesNoneFound=没有找到可以删除的 属于该会话期的 Cookies -deleteSessionCookiesSingleConfirmation=确定要删除 1 个属于该会话期的 Cookie 吗? -deleteSessionCookiesSingleResult=已删除 1 个属于该会话期的 Cookie - -# Disable Individual Style Sheets -noStyleSheets=没有样式表 - -# Display Element Information -elementInformation=元素信息 - -# Display Line Guides -displayLineGuides=显示辅助线 - -# Display Page Magnifier -displayPageMagnifier=显示页面放大镜 -invalidMagnificationLevel=必须指定一个有效的放大级别 - -# Display Passwords -displayPasswordsSingleResult=成功显示 1 个密码 -displayPasswordsMultipleResult=成功显示 %S 个密码 - -# Display Ruler -displayRuler=显示标尺 -invalidHeight=必须指定一个有效的高度 -invalidWidth=必须指定一个有效的宽度 - -# Display Style Information -styleInformation=样式信息 - -# Display Window Size -displayWindowSizeResult=窗口: %Spx x %Spx,可视范围: %Spx x %Spx - -# Edit CSS -editCSS=编辑 CSS - -# Edit HTML -editHTML=编辑 HTML - -# Enable Auto Completion -enableAutoCompletionMultipleResult=已为 %S 个元素启用自动完成功能 -enableAutoCompletionSingleResult=已为 1 个元素启用自动完成功能 - -# Enable Form Fields -enableFormFieldsMultipleResult=已启用 %S 个表单字段 -enableFormFieldsSingleResult=已启用 1 个表单字段 - -# Expand Select Elements -expandSelectElementsMultipleResult=已展开 %S 个被选择元素 -expandSelectElementsSingleResult=已展开 1 个被选择元素 - -# Find Broken Images -brokenImage=已损坏的图像 -brokenImages=已损坏的图像 - -# Find Duplicate Ids -duplicateId=重复的 ID -duplicateIds=重复的 ID - -# Make Form Fields Writable -makeFormFieldsWritableMultipleResult=已让 %S 个表单字段可编辑 -makeFormFieldsWritableSingleResult=已让 1 个表单字段可编辑 - -# Make Frames Resizable -makeFramesResizableMultipleResult=已让 %S 个框架可调整大小 -makeFramesResizableSingleResult=已让 1 个框架可调整大小 - -# Make Images Full Size -makeImagesFullSizeMultipleResult=%S 个图像已显示全尺寸 -makeImagesFullSizeSingleResult=1 个图像已显示全尺寸 - -# Populate Form Fields -populateFormFieldsMultipleResult=已填充 %S 份表单字段 -populateFormFieldsSingleResult=已填充 1 份表单字段 - -# Reload Images -reloadImagesResult=已重新加载图像 - -# Reload Linked Style Sheets -reloadLinkedStyleSheetsResult=已重新加载链接样式表 - -# Remove Form Validation -removeFormValidationMultipleResult=Removed validation from %S form fields. -removeFormValidationSingleResult=Removed validation from 1 form field. - -# Remove Maximum Lengths -removeMaximumLengthsMultipleResult=已移除 %S 个表单字段最大长度 -removeMaximumLengthsSingleResult=已移除 1 个表单字段最大长度 - -# Validate CSS -validateCSS=验证 CSS - -# Validate HTML -validateHTML=验证 HTML - -# View Anchor Information -anchorInformation=锚点信息 - -# View Color Information -colorInformation=颜色信息 - -# View Cookie Information -atEndOfSession=在会话结束时 -cookieInformation=Cookie 信息 -cannotEdit=不可编辑 -cannotEditHTTPOnlyCookies=不可编辑 HttpOnly Cookies -cannotEditLocalhostCookies=不可编辑本地(localhost)的 Cookies 更多信息 -cookieDeleted=已删除 Cookie %S -cookieEdited=已编辑 Cookie %S -deleteConfirmation=删除... -deleteCookie=删除 Cookie -deleteCookieConfirmation=确定要删除cookie %S? -editCookie=编辑 Cookie -expiresCannotBeEmpty=有效期不能为空 -expiresNotValid=有效期不是一个有效的日期 -hostCannotBeEmpty=主机不能为空 -httpOnly=HttpOnly -nameCannotBeEmpty=名称不能为空 -pathCannotBeEmpty=路径不能为空 -secureCookie=安全的 Cookie -sessionCookie=会话期 Cookie - -# View CSS -couldNotLoadCSS=不能载入 CSS -embeddedCSSFrom=内嵌的 CSS -syntaxHighlighting=语法高亮 - -# View Document Outline -documentOutline=文档大纲 -missingHeading=(缺少标题) -noHeadingText=(没有标题的文字) - -# View Document Size -documentSize=文档大小 -uncompressedSize=未压缩的大小 - -# View Form Information -maximumLength=最大长度 - -# View JavaScript -beautifyJavaScript=格式化 JavaScript -couldNotLoadJavaScript=不能加载 JavaScript -embeddedJavaScriptFrom=内嵌的 JavaScript 来自于 -undoBeautifyJavaScript=还原已格式化的 Javascript - -# View Link Information -linkInformation=链接信息 - -# View Meta Tag Information -metaTag=Meta标签 -metaTags=Meta标签 - -# View Response Headers -couldNotLoadResponseHeaders=响应头信息不能被加载 -responseHeaders=响应头信息 - -# View Responsive Layouts -reloadLayouts=重新加载 -responsiveLayouts=响应布局 - -# View Source With -viewSourceWith=查看源代码选项 diff --git a/source/firefox/style-sheets/dashboard/dashboard.css b/source/firefox/style-sheets/dashboard/dashboard.css deleted file mode 100644 index 726592f..0000000 --- a/source/firefox/style-sheets/dashboard/dashboard.css +++ /dev/null @@ -1,28 +0,0 @@ -/* Common styles */ - -#web-developer-syntax-highlight-dashboard { -moz-box-orient: horizontal; } -#web-developer-search-dashboard-text { font-size: 13px; } - -/* Element information styles */ - -#web-developer-element-information-dashboard > browser { border: 1px solid #999; } - -/* Style information styles */ - -#web-developer-style-information-dashboard > browser { border: 1px solid #999; } - -/* Edit CSS styles */ - -#web-developer-edit-css-dashboard > toolbar { -webkit-box-align: center; -ms-box-align: center; -moz-box-align: center; box-align: center; } /* csslint allow: known-properties */ -#web-developer-edit-css-tab-box { margin: 0; } -#web-developer-edit-css-tab-panels { -webkit-appearance: none; -moz-appearance: none; padding: 0; } -#web-developer-edit-css-tab-panels browser { border: 1px solid #999; } -#web-developer-edit-css-tabs { display: block; padding: 0; } -#web-developer-edit-css-tabs > .tabs-left, #web-developer-edit-css-tabs > .tabs-right { -webkit-box-flex: 0; -ms-box-flex: 0; -moz-box-flex: 0; box-flex: 0; } /* csslint allow: known-properties */ -#web-developer-edit-css-tabs > .tabs-right { display: none; } - -/* Edit HTML styles */ - -#web-developer-edit-html-dashboard > browser { border: 1px solid #999; } -#web-developer-edit-html-dashboard > description { margin: 0.5em; } -#web-developer-edit-html-dashboard > toolbar { -webkit-box-align: center; -ms-box-align: center; -moz-box-align: center; box-align: center; } /* csslint allow: known-properties */ diff --git a/source/firefox/style-sheets/dashboard/html/common.css b/source/firefox/style-sheets/dashboard/html/common.css deleted file mode 100644 index 39badf2..0000000 --- a/source/firefox/style-sheets/dashboard/html/common.css +++ /dev/null @@ -1,2 +0,0 @@ -html.vertical body { padding: 0; } -html.vertical #web-developer-copy-ancestor-path { float: none; margin: 0 0 5px 0; } diff --git a/source/firefox/style-sheets/dashboard/html/style-information.css b/source/firefox/style-sheets/dashboard/html/style-information.css deleted file mode 100644 index ca5a6c8..0000000 --- a/source/firefox/style-sheets/dashboard/html/style-information.css +++ /dev/null @@ -1,2 +0,0 @@ -body { padding-top: 0; } -.CodeMirror { margin-bottom: 20px; } diff --git a/source/firefox/style-sheets/dialogs/message.css b/source/firefox/style-sheets/dialogs/message.css deleted file mode 100644 index 51f7930..0000000 --- a/source/firefox/style-sheets/dialogs/message.css +++ /dev/null @@ -1,5 +0,0 @@ -separator, #web-developer-message-dialog { margin: 0; padding: 0; } -#web-developer-message { font-weight: bold; } -#web-developer-message-details { background: #fff url("chrome://web-developer/content/icons/48.png") 0.5em 0.5em no-repeat; color: #333; font-size: 1.1em; min-height: 60px; padding: 0.5em 0.5em 0.5em 60px; } -.url { color: #08c; cursor: pointer; } -.url:hover { color: #005580; text-decoration: underline; } diff --git a/source/firefox/style-sheets/dialogs/outline-custom-elements.css b/source/firefox/style-sheets/dialogs/outline-custom-elements.css deleted file mode 100644 index 9a7f381..0000000 --- a/source/firefox/style-sheets/dialogs/outline-custom-elements.css +++ /dev/null @@ -1,2 +0,0 @@ -#web-developer-outline-custom-elements-dialog > groupbox { margin: 0; } -#web-developer-outline-custom-elements-dialog .groupbox-body { -webkit-appearance: none; -moz-appearance: none; padding-left: 0; padding-right: 0; } diff --git a/source/firefox/style-sheets/features/images/display-image-file-sizes.css b/source/firefox/style-sheets/features/images/display-image-file-sizes.css deleted file mode 100644 index 6c729af..0000000 --- a/source/firefox/style-sheets/features/images/display-image-file-sizes.css +++ /dev/null @@ -1 +0,0 @@ -img { outline: 1px solid #b94a48 !important; } diff --git a/source/firefox/style-sheets/generated/view-document-size.css b/source/firefox/style-sheets/generated/view-document-size.css deleted file mode 100644 index 1b92917..0000000 --- a/source/firefox/style-sheets/generated/view-document-size.css +++ /dev/null @@ -1,9 +0,0 @@ -tbody > .odd { background-color: #f9f9f9; } -td:first-child { max-width: 500px; padding-left: 14px; word-wrap: break-word; } -td:nth-child(2), td:nth-child(3), th:nth-child(2), th:nth-child(3) { text-align: right; width: 150px; white-space: nowrap; } -#web-developer-total > td, .web-developer-section > td:first-child { font-weight: bold; } -#web-developer-total td:first-child { padding-left: 10px; } -.table { margin-top: 60px; width: auto; } -.web-developer-section { cursor: pointer; } -.web-developer-section > td > i { margin-right: 5px; } -.web-developer-section > td:first-child { padding-left: 0; } diff --git a/source/firefox/style-sheets/options/options.css b/source/firefox/style-sheets/options/options.css deleted file mode 100644 index 4a9493e..0000000 --- a/source/firefox/style-sheets/options/options.css +++ /dev/null @@ -1,5 +0,0 @@ -prefpane > groupbox { margin: 0; } -prefpane .groupbox-body { -webkit-appearance: none; -moz-appearance: none; padding-left: 0; padding-right: 0; } -#web-developer-options { min-width: 45em; } -#web-developer-options-tools-pane spacer { width: 2em; } -#web-developer-syntax-highlight-browser { border: 1px solid #999; height: 150px !important; } diff --git a/source/firefox/style-sheets/overlay/overlay.css b/source/firefox/style-sheets/overlay/overlay.css index 1751bf8..6b85567 100644 --- a/source/firefox/style-sheets/overlay/overlay.css +++ b/source/firefox/style-sheets/overlay/overlay.css @@ -1,37 +1,3 @@ -/* Dashboard styles */ +/* Overlay styles */ -#web-developer-dashboard-spacer { width: 1em; } -#web-developer-dashboard-splitter { border-color: #999; border-style: solid; border-width: 0; } -#web-developer-dashboard-splitter.bottom { border-top-width: 1px; } -#web-developer-dashboard-splitter.left { border-right-width: 1px; } -#web-developer-dashboard-splitter.right { border-left-width: 1px; } -#web-developer-dashboard-splitter.top { border-bottom-width: 1px; } -#web-developer-dashboard-tab-box { margin: 0; } -#web-developer-dashboard-tab-panels { -webkit-appearance: none; -moz-appearance: none; padding: 0; } -#web-developer-dashboard-tabs { padding: 0; } -#web-developer-dashboard-tabs > .tabs-left, #web-developer-dashboard-tabs > .tabs-right { -webkit-box-flex: 0; -ms-box-flex: 0; -moz-box-flex: 0; box-flex: 0; } /* csslint allow: known-properties */ -#web-developer-dashboard-tabs > .tabs-right { display: none; } - -/* Feature toolbar styles */ - -.web-developer-toolbar description { margin: 0; } -.web-developer-toolbar spacer { width: 2em; } -.web-developer-toolbar .web-developer-name { margin: 0 5px; } -.web-developer-toolbar .web-developer-small { width: 1em; } - -/* Element ancestors styles */ - -#web-developer-element-ancestors-browser { border: 1px solid #999; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; height: 28px; } - -/* Line guide styles */ - -#web-developer-line-guide-position, #web-developer-next-line-guide-position, #web-developer-previous-line-guide-position { margin-left: 5px; } - -/* Page magnifier styles */ - -#web-developer-page-magnifier { display: block; } -#web-developer-page-magnifier-container { border: 1px solid #999; cursor: crosshair; position: fixed; } - -/* Ruler styles */ - -#web-developer-ruler-end-x, #web-developer-ruler-end-y, #web-developer-ruler-start-x, #web-developer-ruler-start-y { margin-left: 5px; } +#clear-cache, #disable-cookies, #disable-images, #disable-menu, #disable-toolbar, #view-source { display: none; } diff --git a/source/firefox/style-sheets/skin/common.css b/source/firefox/style-sheets/skin/common.css deleted file mode 100644 index eb0c6f9..0000000 --- a/source/firefox/style-sheets/skin/common.css +++ /dev/null @@ -1,177 +0,0 @@ -/* Web Developer menus */ - -#web-developer-app-menu, #web-developer-context, #web-developer-menu, #web-developer-seamonkey { list-style-image: url(chrome://web-developer/skin/menu.png); } - -@media (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) -{ - #web-developer-app-menu, #web-developer-context, #web-developer-menu, #web-developer-seamonkey { list-style-image: url(chrome://web-developer/skin/menu-2x.png); } - #web-developer-app-menu .menu-iconic-icon, #web-developer-context .menu-iconic-icon, #web-developer-menu .menu-iconic-icon, #web-developer-seamonkey .menu-iconic-icon { height: 16px; width: 16px; } -} - -/* Web Developer button */ - -#web-developer-button { -moz-box-orient: horizontal; list-style-image: url(chrome://web-developer/skin/button.png); } -#web-developer-button[cui-areatype="menu-panel"], toolbarpaletteitem[place="palette"] > #web-developer-button { -moz-box-orient: horizontal; list-style-image: url(chrome://web-developer/skin/button-2x.png); } - -@media (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) -{ - #web-developer-button { list-style-image: url(chrome://web-developer/skin/button-2x.png); } - #web-developer-button .toolbarbutton-icon { height: 20px; width: 20px; } -} - -/* Toolbar buttons */ - -#web-developer-cookies-toolbar, #web-developer-css-toolbar, #web-developer-disable-toolbar, #web-developer-forms-toolbar, #web-developer-images-toolbar, #web-developer-information-toolbar, #web-developer-miscellaneous-toolbar, #web-developer-options-toolbar, #web-developer-outline-toolbar, #web-developer-resize-toolbar, #web-developer-tools-toolbar, #web-developer-view-source-toolbar { -moz-box-orient: horizontal; list-style-image: url(chrome://web-developer/skin/toolbar.png); } -#web-developer-disable-toolbar { -moz-image-region: rect(0, 16px, 16px, 0); } -#web-developer-cookies-toolbar { -moz-image-region: rect(0, 32px, 16px, 16px); } -#web-developer-css-toolbar { -moz-image-region: rect(0, 48px, 16px, 32px); } -#web-developer-forms-toolbar { -moz-image-region: rect(0, 64px, 16px, 48px); } -#web-developer-images-toolbar { -moz-image-region: rect(0, 80px, 16px, 64px); } -#web-developer-information-toolbar { -moz-image-region: rect(0, 96px, 16px, 80px); } -#web-developer-miscellaneous-toolbar { -moz-image-region: rect(0, 112px, 16px, 96px); } -#web-developer-options-toolbar { -moz-image-region: rect(0, 192px, 16px, 176px); } -#web-developer-outline-toolbar { -moz-image-region: rect(0, 128px, 16px, 112px); } -#web-developer-resize-toolbar { -moz-image-region: rect(0, 144px, 16px, 128px); } -#web-developer-tools-toolbar { -moz-image-region: rect(0, 160px, 16px, 144px); } -#web-developer-view-source-toolbar { -moz-image-region: rect(0, 176px, 16px, 160px); } - -@media (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) -{ - #web-developer-cookies-toolbar, #web-developer-css-toolbar, #web-developer-disable-toolbar, #web-developer-forms-toolbar, #web-developer-images-toolbar, #web-developer-information-toolbar, #web-developer-miscellaneous-toolbar, #web-developer-options-toolbar, #web-developer-outline-toolbar, #web-developer-resize-toolbar, #web-developer-tools-toolbar, #web-developer-view-source-toolbar { list-style-image: url(chrome://web-developer/skin/toolbar-2x.png); } - #web-developer-cookies-toolbar .toolbarbutton-icon, #web-developer-css-toolbar .toolbarbutton-icon, #web-developer-disable-toolbar .toolbarbutton-icon, #web-developer-forms-toolbar .toolbarbutton-icon, #web-developer-images-toolbar .toolbarbutton-icon, #web-developer-information-toolbar .toolbarbutton-icon, #web-developer-miscellaneous-toolbar .toolbarbutton-icon, #web-developer-options-toolbar .toolbarbutton-icon, #web-developer-outline-toolbar .toolbarbutton-icon, #web-developer-resize-toolbar .toolbarbutton-icon, #web-developer-tools-toolbar .toolbarbutton-icon, #web-developer-view-source-toolbar .toolbarbutton-icon { height: 16px; width: 16px; } - #web-developer-disable-toolbar { -moz-image-region: rect(0, 32px, 32px, 0); } - #web-developer-cookies-toolbar { -moz-image-region: rect(0, 64px, 32px, 32px); } - #web-developer-css-toolbar { -moz-image-region: rect(0, 96px, 32px, 64px); } - #web-developer-forms-toolbar { -moz-image-region: rect(0, 128px, 32px, 96px); } - #web-developer-images-toolbar { -moz-image-region: rect(0, 160px, 32px, 128px); } - #web-developer-information-toolbar { -moz-image-region: rect(0, 192px, 32px, 160px); } - #web-developer-miscellaneous-toolbar { -moz-image-region: rect(0, 224px, 32px, 192px); } - #web-developer-options-toolbar { -moz-image-region: rect(0, 384px, 32px, 352px); } - #web-developer-outline-toolbar { -moz-image-region: rect(0, 256px, 32px, 224px); } - #web-developer-resize-toolbar { -moz-image-region: rect(0, 288px, 32px, 256px); } - #web-developer-tools-toolbar { -moz-image-region: rect(0, 320px, 32px, 288px); } - #web-developer-view-source-toolbar { -moz-image-region: rect(0, 352px, 32px, 320px); } -} - -/* Dark theme support */ - -window[lwthemetextcolor="dark"] #web-developer-cookies-toolbar, window[lwthemetextcolor="dark"] #web-developer-css-toolbar, window[lwthemetextcolor="dark"] #web-developer-disable-toolbar, window[lwthemetextcolor="dark"] #web-developer-forms-toolbar, window[lwthemetextcolor="dark"] #web-developer-images-toolbar, window[lwthemetextcolor="dark"] #web-developer-information-toolbar, window[lwthemetextcolor="dark"] #web-developer-miscellaneous-toolbar, window[lwthemetextcolor="dark"] #web-developer-options-toolbar, window[lwthemetextcolor="dark"] #web-developer-outline-toolbar, window[lwthemetextcolor="dark"] #web-developer-resize-toolbar, window[lwthemetextcolor="dark"] #web-developer-tools-toolbar, window[lwthemetextcolor="dark"] #web-developer-view-source-toolbar { text-shadow: none; } - -/* Statusbar buttons */ - -#web-developer-css-statusbar, #web-developer-javascript-statusbar, #web-developer-render-mode-statusbar { list-style-image: url(chrome://web-developer/skin/statusbar.png); } -#web-developer-css-statusbar { -moz-image-region: rect(0, 64px, 16px, 48px); } -#web-developer-css-statusbar.error { -moz-image-region: rect(0, 48px, 16px, 32px); } -#web-developer-css-statusbar.valid { -moz-image-region: rect(0, 16px, 16px, 0); } -#web-developer-javascript-statusbar { -moz-image-region: rect(0, 64px, 16px, 48px); } -#web-developer-javascript-statusbar.disabled { -moz-image-region: rect(0, 64px, 16px, 48px); } -#web-developer-javascript-statusbar.error { -moz-image-region: rect(0, 48px, 16px, 32px); } -#web-developer-javascript-statusbar.valid { -moz-image-region: rect(0, 16px, 16px, 0); } -#web-developer-javascript-statusbar.warning { -moz-image-region: rect(0, 32px, 16px, 16px); } -#web-developer-render-mode-statusbar { -moz-image-region: rect(0, 16px, 16px, 0); } -#web-developer-render-mode-statusbar.quirks { -moz-image-region: rect(0, 48px, 16px, 32px); } - -@media (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) -{ - #web-developer-css-statusbar, #web-developer-javascript-statusbar, #web-developer-render-mode-statusbar { list-style-image: url(chrome://web-developer/skin/statusbar-2x.png); } - #web-developer-css-statusbar .toolbarbutton-icon, #web-developer-javascript-statusbar .toolbarbutton-icon, #web-developer-render-mode-statusbar .toolbarbutton-icon { height: 16px; width: 16px; } - #web-developer-css-statusbar { -moz-image-region: rect(0, 128px, 32px, 96px); } - #web-developer-css-statusbar.error { -moz-image-region: rect(0, 96px, 32px, 64px); } - #web-developer-css-statusbar.valid { -moz-image-region: rect(0, 32px, 32px, 0); } - #web-developer-javascript-statusbar { -moz-image-region: rect(0, 128px, 32px, 96px); } - #web-developer-javascript-statusbar.disabled { -moz-image-region: rect(0, 128px, 32px, 96px); } - #web-developer-javascript-statusbar.error { -moz-image-region: rect(0, 96px, 32px, 64px); } - #web-developer-javascript-statusbar.valid { -moz-image-region: rect(0, 32px, 32px, 0); } - #web-developer-javascript-statusbar.warning { -moz-image-region: rect(0, 64px, 32px, 32px); } - #web-developer-render-mode-statusbar { -moz-image-region: rect(0, 32px, 32px, 0); } - #web-developer-render-mode-statusbar.quirks { -moz-image-region: rect(0, 96px, 32px, 64px); } -} - -/* Dashboard buttons */ - -#web-developer-clear-dashboard, #web-developer-move-dashboard, #web-developer-open-dashboard, #web-developer-pin-dashboard, #web-developer-reset-dashboard, #web-developer-save-dashboard, #web-developer-search-dashboard, #web-developer-syntax-highlight-dashboard { list-style-image: url(chrome://web-developer/skin/dashboard.png); } -#web-developer-clear-dashboard { -moz-image-region: rect(0, 64px, 16px, 48px); } -#web-developer-move-dashboard { -moz-image-region: rect(0, 16px, 16px, 0); } -#web-developer-open-dashboard { -moz-image-region: rect(0, 32px, 16px, 16px); } -#web-developer-pin-dashboard { -moz-image-region: rect(0, 96px, 16px, 80px); } -#web-developer-reset-dashboard { -moz-image-region: rect(0, 80px, 16px, 64px); } -#web-developer-save-dashboard { -moz-image-region: rect(0, 48px, 16px, 32px); } -#web-developer-search-dashboard { -moz-image-region: rect(0, 128px, 16px, 112px); } -#web-developer-syntax-highlight-dashboard { -moz-image-region: rect(0, 112px, 16px, 96px); } - -@media (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) -{ - #web-developer-clear-dashboard, #web-developer-move-dashboard, #web-developer-open-dashboard, #web-developer-pin-dashboard, #web-developer-reset-dashboard, #web-developer-save-dashboard, #web-developer-search-dashboard, #web-developer-syntax-highlight-dashboard { list-style-image: url(chrome://web-developer/skin/dashboard-2x.png); } - #web-developer-clear-dashboard .toolbarbutton-icon, #web-developer-move-dashboard .toolbarbutton-icon, #web-developer-open-dashboard .toolbarbutton-icon, #web-developer-pin-dashboard .toolbarbutton-icon, #web-developer-reset-dashboard .toolbarbutton-icon, #web-developer-save-dashboard .toolbarbutton-icon, #web-developer-search-dashboard .toolbarbutton-icon, #web-developer-syntax-highlight-dashboard .toolbarbutton-icon { height: 16px; width: 16px; } - #web-developer-clear-dashboard { -moz-image-region: rect(0, 128px, 32px, 96px); } - #web-developer-move-dashboard { -moz-image-region: rect(0, 32px, 32px, 0); } - #web-developer-open-dashboard { -moz-image-region: rect(0, 64px, 32px, 32px); } - #web-developer-pin-dashboard { -moz-image-region: rect(0, 192px, 32px, 160px); } - #web-developer-reset-dashboard { -moz-image-region: rect(0, 160px, 32px, 128px); } - #web-developer-save-dashboard { -moz-image-region: rect(0, 96px, 32px, 64px); } - #web-developer-search-dashboard { -moz-image-region: rect(0, 256px, 32px, 224px); } - #web-developer-syntax-highlight-dashboard { -moz-image-region: rect(0, 224px, 32px, 192px); } -} - -/* Options styles */ - -#web-developer-options radio { list-style-image: url(chrome://web-developer/skin/options.png); } -#web-developer-options radio[pane="web-developer-options-advanced-pane"] { -moz-image-region: rect(0, 256px, 32px, 224px); } -#web-developer-options radio[pane="web-developer-options-colors-pane"] { -moz-image-region: rect(0, 64px, 32px, 32px); } -#web-developer-options radio[pane="web-developer-options-general-pane"] { -moz-image-region: rect(0, 32px, 32px, 0); } -#web-developer-options radio[pane="web-developer-options-keyboard-pane"] { -moz-image-region: rect(0, 224px, 32px, 192px); } -#web-developer-options radio[pane="web-developer-options-resize-pane"] { -moz-image-region: rect(0, 96px, 32px, 64px); } -#web-developer-options radio[pane="web-developer-options-responsive-layouts-pane"] { -moz-image-region: rect(0, 128px, 32px, 96px); } -#web-developer-options radio[pane="web-developer-options-tools-pane"] { -moz-image-region: rect(0, 160px, 32px, 128px); } -#web-developer-options radio[pane="web-developer-options-view-source-pane"] { -moz-image-region: rect(0, 192px, 32px, 160px); } - -@media (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) -{ - #web-developer-options radio { list-style-image: url(chrome://web-developer/skin/options-2x.png); } - #web-developer-options radio .paneButtonIcon { height: 32px; width: 32px; } - #web-developer-options radio[pane="web-developer-options-advanced-pane"] { -moz-image-region: rect(0, 512px, 64px, 448px); } - #web-developer-options radio[pane="web-developer-options-colors-pane"] { -moz-image-region: rect(0, 128px, 64px, 64px); } - #web-developer-options radio[pane="web-developer-options-general-pane"] { -moz-image-region: rect(0, 64px, 64px, 0); } - #web-developer-options radio[pane="web-developer-options-keyboard-pane"] { -moz-image-region: rect(0, 448px, 64px, 384px); } - #web-developer-options radio[pane="web-developer-options-resize-pane"] { -moz-image-region: rect(0, 192px, 64px, 128px); } - #web-developer-options radio[pane="web-developer-options-responsive-layouts-pane"] { -moz-image-region: rect(0, 256px, 64px, 192px); } - #web-developer-options radio[pane="web-developer-options-tools-pane"] { -moz-image-region: rect(0, 320px, 64px, 256px); } - #web-developer-options radio[pane="web-developer-options-view-source-pane"] { -moz-image-region: rect(0, 384px, 64px, 320px); } -} - -/* Menu item icons */ - -#web-developer-button.color menuitem.menuitem-iconic, #web-developer-context menuitem.menuitem-iconic, #web-developer-menu menuitem.menuitem-iconic, #web-developer-seamonkey menuitem.menuitem-iconic, #web-developer-toolbar menuitem.menuitem-iconic { list-style-image: url(chrome://web-developer/skin/disabled.png); } - -@media (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) -{ - #web-developer-button menuitem.menuitem-iconic, #web-developer-context menuitem.menuitem-iconic, #web-developer-menu menuitem.menuitem-iconic, #web-developer-seamonkey menuitem.menuitem-iconic, #web-developer-toolbar menuitem.menuitem-iconic { height: 16px; list-style-image: url(chrome://web-developer/skin/disabled-2x.png); width: 16px; } -} - -/* Feature toolbar buttons */ - -.web-developer-close { list-style-image: url(chrome://web-developer/skin/close.png); } -.web-developer-name { background: url(chrome://web-developer/skin/button.png) 0 50% no-repeat; padding-left: 25px; } - -@media (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) -{ - .web-developer-close { list-style-image: url(chrome://web-developer/skin/close-2x.png); } - .web-developer-close .toolbarbutton-icon { height: 16px; width: 16px; } - .web-developer-name { background-image: url(chrome://web-developer/skin/button-2x.png); background-size: 20px 20px; } -} - -/* Page validation toolbar buttons */ - -#web-developer-css-validation[class], #web-developer-html-validation[class] { list-style-image: url(chrome://web-developer/skin/validation.png); } -#web-developer-css-validation.invalid, #web-developer-html-validation.invalid { -moz-image-region: rect(0, 48px, 16px, 32px); } -#web-developer-css-validation.loading, #web-developer-html-validation.loading { -moz-image-region: rect(0, 16px, 16px, 0); } -#web-developer-css-validation.valid, #web-developer-html-validation.valid { -moz-image-region: rect(0, 32px, 16px, 16px); } - -@media (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) -{ - #web-developer-css-validation[class], #web-developer-html-validation[class] { list-style-image: url(chrome://web-developer/skin/validation-2x.png); } - #web-developer-css-validation[class] .toolbarbutton-icon, #web-developer-html-validation[class] .toolbarbutton-icon { height: 16px; width: 16px; } - #web-developer-css-validation.invalid, #web-developer-html-validation.invalid { -moz-image-region: rect(0, 96px, 32px, 64px); } - #web-developer-css-validation.loading, #web-developer-html-validation.loading { -moz-image-region: rect(0, 32px, 32px, 0); } - #web-developer-css-validation.valid, #web-developer-html-validation.valid { -moz-image-region: rect(0, 64px, 32px, 32px); } -} diff --git a/source/firefox/style-sheets/skin/mac.css b/source/firefox/style-sheets/skin/mac.css deleted file mode 100644 index 1870e51..0000000 --- a/source/firefox/style-sheets/skin/mac.css +++ /dev/null @@ -1,102 +0,0 @@ -/* Mac styles */ - -/* Toolbar styles */ - -.web-developer-name { padding-left: 20px; } - -/* Dashboard styles */ - -#web-developer-dashboard-tab-panels { padding-top: 1.5em; } - -/* Edit CSS styles */ - -#web-developer-edit-css-tab-box { margin-top: 0.5em; } -#web-developer-edit-css-tab-panels { padding-top: 1em; } - -/* Options styles */ - -prefpane .groupbox-title { border-bottom: 1px solid #ccc; } - -/* Outline custom elements styles */ - -#web-developer-outline-custom-elements-dialog .groupbox-title { border-bottom: 1px solid #ccc; } - -/* Mac color styles */ - -/* Web Developer menus */ - -#web-developer-app-menu, #web-developer-context, #web-developer-menu, #web-developer-seamonkey { list-style-image: url(chrome://web-developer/skin/menu.png); } -#web-developer-app-menu.color, #web-developer-context.color, #web-developer-menu.color, #web-developer-seamonkey.color { list-style-image: url(chrome://web-developer/skin/color/menu.png); } - -@media (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) -{ - #web-developer-app-menu, #web-developer-context, #web-developer-menu, #web-developer-seamonkey { list-style-image: url(chrome://web-developer/skin/menu-2x.png); } - #web-developer-app-menu.color, #web-developer-context.color, #web-developer-menu.color, #web-developer-seamonkey.color { list-style-image: url(chrome://web-developer/skin/color/menu-2x.png); } -} - -/* Web Developer button */ - -#web-developer-button.color { list-style-image: url(chrome://web-developer/skin/color/button.png); } - -@media (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) -{ - #web-developer-button .toolbarbutton-icon { height: 16px; width: 16px; } - #web-developer-button.color { list-style-image: url(chrome://web-developer/skin/color/button-2x.png); } -} - -/* Toolbar buttons */ - -#web-developer-cookies-toolbar.color, #web-developer-css-toolbar.color, #web-developer-disable-toolbar.color, #web-developer-forms-toolbar.color, #web-developer-images-toolbar.color, #web-developer-information-toolbar.color, #web-developer-miscellaneous-toolbar.color, #web-developer-options-toolbar.color, #web-developer-outline-toolbar.color, #web-developer-resize-toolbar.color, #web-developer-tools-toolbar.color, #web-developer-view-source-toolbar.color { list-style-image: url(chrome://web-developer/skin/color/toolbar.png); } - -@media (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) -{ - #web-developer-cookies-toolbar.color, #web-developer-css-toolbar.color, #web-developer-disable-toolbar.color, #web-developer-forms-toolbar.color, #web-developer-images-toolbar.color, #web-developer-information-toolbar.color, #web-developer-miscellaneous-toolbar.color, #web-developer-options-toolbar.color, #web-developer-outline-toolbar.color, #web-developer-resize-toolbar.color, #web-developer-tools-toolbar.color, #web-developer-view-source-toolbar.color { list-style-image: url(chrome://web-developer/skin/color/toolbar-2x.png); } -} - -/* Statusbar buttons */ - -#web-developer-css-statusbar[web-developer-color="true"], #web-developer-javascript-statusbar[web-developer-color="true"], #web-developer-render-mode-statusbar[web-developer-color="true"] { list-style-image: url(chrome://web-developer/skin/color/statusbar.png); } - -@media (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) -{ - #web-developer-css-statusbar[web-developer-color="true"], #web-developer-javascript-statusbar[web-developer-color="true"], #web-developer-render-mode-statusbar[web-developer-color="true"] { list-style-image: url(chrome://web-developer/skin/color/statusbar-2x.png); } -} - -/* Dashboard buttons */ - -.color #web-developer-clear-dashboard, .color #web-developer-move-dashboard, .color #web-developer-open-dashboard, .color #web-developer-pin-dashboard, .color #web-developer-reset-dashboard, .color #web-developer-save-dashboard, .color #web-developer-search-dashboard, .color #web-developer-syntax-highlight-dashboard { list-style-image: url(chrome://web-developer/skin/color/dashboard.png); } - -@media (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) -{ - .color #web-developer-clear-dashboard, .color #web-developer-move-dashboard, .color #web-developer-open-dashboard, .color #web-developer-pin-dashboard, .color #web-developer-reset-dashboard, .color #web-developer-save-dashboard, .color #web-developer-search-dashboard, .color #web-developer-syntax-highlight-dashboard { list-style-image: url(chrome://web-developer/skin/color/dashboard-2x.png); } -} - -/* Menu item icons */ - -#web-developer-button.color menuitem.menuitem-iconic, #web-developer-context.color menuitem.menuitem-iconic, #web-developer-menu.color menuitem.menuitem-iconic, #web-developer-seamonkey.color menuitem.menuitem-iconic, #web-developer-toolbar.color menuitem.menuitem-iconic { list-style-image: url(chrome://web-developer/skin/color/disabled.png); } - -@media (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) -{ - #web-developer-button.color menuitem.menuitem-iconic, #web-developer-context.color menuitem.menuitem-iconic, #web-developer-menu.color menuitem.menuitem-iconic, #web-developer-seamonkey.color menuitem.menuitem-iconic, #web-developer-toolbar.color menuitem.menuitem-iconic { list-style-image: url(chrome://web-developer/skin/color/disabled-2x.png); } -} - -/* Feature toolbar buttons */ - -.color .web-developer-close { list-style-image: url(chrome://web-developer/skin/color/close.png); } -.color .web-developer-name { background-image: url(chrome://web-developer/skin/color/button.png); } - -@media (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) -{ - .color .web-developer-close { list-style-image: url(chrome://web-developer/skin/color/close-2x.png); } - .color .web-developer-name { background-image: url(chrome://web-developer/skin/color/button-2x.png); } - .web-developer-name { background-size: 16px 16px; } -} - -/* Page validation toolbar buttons */ - -.color #web-developer-css-validation[class], .color #web-developer-html-validation[class] { list-style-image: url(chrome://web-developer/skin/color/validation.png); } - -@media (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) -{ - .color #web-developer-css-validation[class], .color #web-developer-html-validation[class] { list-style-image: url(chrome://web-developer/skin/color/validation-2x.png); } -} diff --git a/source/firefox/xul/dashboard/edit-css.xul b/source/firefox/xul/dashboard/edit-css.xul deleted file mode 100644 index 574ddf9..0000000 --- a/source/firefox/xul/dashboard/edit-css.xul +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - -

@url@/@browser@/