[
  {
    "path": ".editorconfig",
    "content": "# EditorConfig is awesome: http://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n# Unix-style newlines with a newline ending every file\n[*]\nend_of_line = lf\ninsert_final_newline = true\n\n# Default charset\n[*]\ncharset = utf-8\n\n# Tab indentation (no size specified)\n[*]\nindent_style = tab"
  },
  {
    "path": ".gitignore",
    "content": "*~\nnbproject\n.DS_Store\n.idea\n"
  },
  {
    "path": "Gruntfile.js",
    "content": "module.exports = function(grunt) {\n\t\"use strict\";\n\n\tgrunt.initConfig({\n\t\tpkg: grunt.file.readJSON('package.json'),\n\t\tjshint: {\n\t\t\tfiles: ['Gruntfile.js', 'js/**/*.js', '!js/libs/*.js'],\n\t\t\toptions: {\n\t\t\t\tevil: true,\n\t\t\t\tcamelcase: true,\n\t\t\t\tcurly: true,\n\t\t\t\teqeqeq: true,\n\t\t\t\tnoempty: true,\n\t\t\t\tstrict: true,\n\t\t\t\tloopfunc: true,\n\t\t\t\tglobals: {\n\t\t\t\t\tjQuery: true,\n\t\t\t\t\tconsole: true,\n\t\t\t\t\tdocument: true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcsslint: {\n\t\t\tsrc: ['css/*.css'],\n\t\t\toptions: {\n\t\t\t\tids: false,\n\t\t\t\t'compatible-vendor-prefixes': false,\n\t\t\t\t'fallback-colors': false\n\t\t\t}\n\t\t},\n\t\tvalidation: {\n\t\t\toptions: {\n\t\t\t\treset: true,\n\t\t\t\treportpath: false\n\t\t\t},\n\t\t\tfiles: {\n\t\t\t\tsrc: ['*.html']\n\t\t\t}\n\t\t},\n\t\tzip: {\n\t\t\t'context-<%= pkg.version %>.zip': ['_locales/*/messages.json', 'css/**/*', 'screenshots/**/*.jpg', 'icons/**/*.png', 'js/**/*', 'other/**/*', '*.html', 'manifest.json']\n\t\t}\n\t});\n\n\tgrunt.loadNpmTasks('grunt-contrib-jshint');\n\tgrunt.loadNpmTasks('grunt-contrib-csslint');\n\tgrunt.loadNpmTasks('grunt-html-validation');\n\tgrunt.loadNpmTasks('grunt-zip');\n\n\tgrunt.registerTask('default', ['jshint', 'csslint', 'validation']);\n\tgrunt.registerTask('prod', ['zip']);\n};"
  },
  {
    "path": "README.md",
    "content": "Context\n======================\n\nChrome/Chromium extension that allows to sort other extensions into groups and easily switch between them.\n\nUsage\n-----\n\nYou may install this extension from its google chrome webstore page\n\nhttps://chrome.google.com/webstore/detail/aalnjolghjkkogicompabhhbbkljnlka\n\nor download it and manually load as an 'Unpacked extension' via chrome extensions page.\n\n\nBugs and Features\n-----------------\n\nIf you found a bug or have a feature request, please create an issue here on GitHub.\n\nhttps://github.com/kdzwinel/Context/issues\n\nChangelog\n---------\n\n### 0.410 ###\n\nNew features:\n+ Ability to manage individual extensions from the popup (#29)\n\nBug fixes:\n+ options page not responding - replacing webkitNotifications with Chrome notifications / HTML5 notifications\n\nOther:\n+ Grunt support\n\n### 0.400 ###\n\nNew features:\n+ syncing configuration via Chrome Sync\n+ displaying status of each context in the popup (enabled-green/disabled-red/partial-yellow)\n+ displaying status of extensions on the options page (enabled-red/disabled-green)\n+ possibility to use extension icon instead of context icon\n+ preserving state of 'highlight ungrouped extensions' checkbox\n\nBugs fixed:\n+ cloned context partially inactive until options page was refreshed\n\nOther:\n+ Thanks to Thiago Talma (@thiagomt) who contributed huge part of this update.\n+ Disabling 'ask what to do' option for browsers that no longer support HTML notifications (#23)\n+ Codebase improved thanks to the WebStorm\n\n### 0.300 ###\n\nNew features:\n+ importing/exporting configuration\n+ highlighting ungrouped extensions on options page\n+ new default action for new extensions: 'add to always-enabled'\n+ new action in notification window: 'add to always-enabled'\n\nBugs fixed:\n+ notification window showing up when no contexts are available\n+ formatting bug in notification window\n\nOther:\n+ core functionality was rewritten using OOP (still far from perfect though)\n\n### 0.200 ###\n\nNew features:\n+ enabling/disabling multiple contexts (\"+\" and \"-\" buttons in the popup)\n+ possibility to duplicate contexts on options page\n+ always enabled extensions\n\nAuthor\n------\n\n**Konrad Dzwinel**\n\n+ https://github.com/kdzwinel\n+ http://www.linkedin.com/pub/konrad-dzwinel/53/599/366/en\n\nLicense\n-------\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <http://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "_locales/cleanup.php",
    "content": "<?php\n/**\n* This script reads translation files and fixes them by:\n* - adding missing keys (basing on english translation)\n* - cleaning up file formatting\n* - checking for key duplicates\n* - maintaining the same key order in all translation files\n*\n* REQUIRES PHP 5 >= 5.4 to run\n*/\n\nfunction json_readable_encode($in, $indent = 0) {\n    $_myself = __FUNCTION__;\n    $_escape = function($str) {\n        return preg_replace(\"!([\\b\\t\\n\\r\\f\\\"])!\", \"\\\\\\\\\\\\1\", $str);\n    };\n    $indentWith = \"    \";\n\n    $out = '';\n\n    foreach($in as $key=>$value) {\n        $out .= str_repeat($indentWith, $indent + 1);\n        $out .= \"\\\"\" . $_escape((string)$key).\"\\\": \";\n\n        if(is_object($value) || is_array($value)) {\n            $out .= \"\\n\";\n            $out .= $_myself($value, $indent+1);\n        } elseif(is_null($value)) {\n            $out .= 'null';\n        } elseif(is_string($value)) {\n            $out .= \"\\\"\".$_escape($value) . \"\\\"\";\n        } else {\n            $out .= $value;\n        }\n\n        $out.= \",\\n\";\n    }\n\n    if(!empty($out)) {\n        $out = substr($out, 0, -2);\n    }\n\n    $out = str_repeat($indentWith, $indent) . \"{\\n\" . $out;\n    $out .= \"\\n\" . str_repeat($indentWith, $indent) . \"}\";\n\n    return $out;\n}\n\nclass Translation {\n\tprivate $filePath;\n\tprivate $messages;\n\n\tpublic function __construct($filePath) {\n\t\tif(!file_exists($filePath) || !is_readable($filePath)) {\n\t\t\tthrow new Exception('File doesn\\'t exist or is unreadable.');\n\t\t}\n\n\t\t$this->messages = array();\n\t\t$this->filePath = $filePath;\n\t\t$this->readJSON( json_decode( file_get_contents($filePath) ) );\n\t}\n\n\tpublic function readJSON($json) {\n\t\tif($json === NULL) {\n\t\t\tthrow new Exception('JSON cannot be decoded.');\n\t\t}\n\n\t\tforeach($json as $key => $jsonObj) {\n\t\t\t$messageObj = array();\n\t\t\t$messageObj['message'] = $jsonObj->message;\n\t\t\tif(isset($jsonObj->description)) {\n\t\t\t\t$messageObj['description'] = $jsonObj->description;\n\t\t\t}\n\n\t\t\tif($this->hasMessage($key)) {\n\t\t\t\tthrow new Exception('Duplicated translation key: ' . $key);\n\t\t\t}\n\n\t\t\t$this->messages[$key] = $messageObj;\n\t\t}\n\t}\n\n\tpublic function hasMessage($key) {\n\t\treturn isset($this->messages[$key]) && !empty($this->messages[$key]['message']);\n\t}\n\n\tpublic function getMessage($key) {\n\t\treturn isset($this->messages[$key]) ? $this->messages[$key] : NULL;\n\t}\n\n\tpublic function getMessages() {\n\t\treturn $this->messages;\n\t}\n\n\tpublic function merge(Translation $baseTranslation) {\n\t\t$newMessages = array();\n\t\t$missing = 0;\n\n\t\t$baseMessages = $baseTranslation->getMessages();\n\n\t\tforeach($baseMessages as $key => $messageObj) {\n\t\t\tif($this->hasMessage($key)) {\n\t\t\t\t$newMessages[$key] = $this->getMessage($key);\n\t\t\t} else {\n\t\t\t\t$missing++;\n\t\t\t\t$newMessages[$key] = $messageObj;\n\t\t\t}\n\t\t}\n\n\t\t$this->messages = $newMessages;\n\n\t\treturn $missing;\n\t}\n\n\tpublic function commit() {\n\t\tif(!is_writable($this->filePath)) {\n\t\t\tthrow new Exception('File is not writable.');\n\t\t}\n\n\t\t$json = json_readable_encode($this->messages);\n\n\t\tif($json === FALSE) {\n\t\t\tthrow new Exception('JSON cannot be encoded.');\n\t\t}\n\n\t\tif(file_put_contents($this->filePath, $json) === FALSE) {\n\t\t\tthrow new Exception('Writing into file failed.');\n\t\t}\n\t}\n}\n\n$baseTranslationFolder = 'en';\n$baseTranslation = new Translation($baseTranslationFolder . '/messages.json');\n\necho 'Number of messages: ' . count($baseTranslation->getMessages()) . PHP_EOL;\n\n$baseTranslation->commit();\n\n$currentFolder = new DirectoryIterator(dirname(__FILE__));\n\nforeach ($currentFolder as $subfolder) {\n\tif($subfolder->isDot() || !$subfolder->isDir() || $subfolder->getFilename() == $baseTranslationFolder) {\n\t\tcontinue;\n\t}\n\n\t$translation = new Translation($subfolder->getPathname() . '/messages.json');\n\t$missingMessages = $translation->merge($baseTranslation);\n\t$translation->commit();\n\n\techo 'Folder \"' . $subfolder->getFilename() . '\" has ' . $missingMessages . ' untranslated messages.' . PHP_EOL;\n}"
  },
  {
    "path": "_locales/de/messages.json",
    "content": "{\n    \"locale\": \n    {\n        \"message\": \"en\",\n        \"description\": \"There is build in @@_ui_locale variable but it shows language variations like en_GB, en_US etc. We don't want that.\"\n    },\n    \"application_description\": \n    {\n        \"message\": \"Sort extensions into groups and easily switch between them.\"\n    },\n    \"all_extensions\": \n    {\n        \"message\": \"All extensions\"\n    },\n    \"highlight_ungrouped_extensions\": \n    {\n        \"message\": \"highlight ungrouped extensions\"\n    },\n    \"create_new_context\": \n    {\n        \"message\": \"Create new context\"\n    },\n    \"edit_context\": \n    {\n        \"message\": \"Edit context\"\n    },\n    \"name_field_is_required\": \n    {\n        \"message\": \"Name field is required.\"\n    },\n    \"this_name_is_already_in_use\": \n    {\n        \"message\": \"This name is already in use.\"\n    },\n    \"pick_an_icon\": \n    {\n        \"message\": \"Pick an icon.\"\n    },\n    \"available_extensions\": \n    {\n        \"message\": \"Available extensions\"\n    },\n    \"always_enabled_extensions\": \n    {\n        \"message\": \"Always-enabled extensions\"\n    },\n    \"name\": \n    {\n        \"message\": \"Name\"\n    },\n    \"options\": \n    {\n        \"message\": \"Options\"\n    },\n    \"icon\": \n    {\n        \"message\": \"Icon\"\n    },\n    \"context_will_be_deleted\": \n    {\n        \"message\": \"Context will be deleted. Are you sure?\"\n    },\n    \"additional_options\": \n    {\n        \"message\": \"Additional options\"\n    },\n    \"new_context\": \n    {\n        \"message\": \"New Context\"\n    },\n    \"save\": \n    {\n        \"message\": \"Save\"\n    },\n    \"about\": \n    {\n        \"message\": \"About\"\n    },\n    \"configuration_import_export\": \n    {\n        \"message\": \"Configuration import/export\"\n    },\n    \"configuration_import\": \n    {\n        \"message\": \"Configuration import\"\n    },\n    \"configuration_export_description\": \n    {\n        \"message\": \"To export all your settings, copy encoded configuration string from the box below.\"\n    },\n    \"configuration_import_description\": \n    {\n        \"message\": \"Paste configuration string to the box below and click 'Import' to restore your configuration.\"\n    },\n    \"confirm_configuration_import\": \n    {\n        \"message\": \"Import will override your current configuration, be sure to make a backup if you don't want to lose it.\"\n    },\n    \"import\": \n    {\n        \"message\": \"Import\"\n    },\n    \"override_current_settings\": \n    {\n        \"message\": \"Override current settings?\"\n    },\n    \"import_failed\": \n    {\n        \"message\": \"Import failed\"\n    },\n    \"configuration_string_is_invalid\": \n    {\n        \"message\": \"Sorry, provided configuration string is invalid. Import failed.\"\n    },\n    \"successful_import\": \n    {\n        \"message\": \"Successful import\"\n    },\n    \"configuration_was_imported_successfuly\": \n    {\n        \"message\": \"Configuration was imported successfuly.\"\n    },\n    \"some_extensions_were_ignored\": \n    {\n        \"message\": \"Some extensions from imported configuration were ignored because they are not installed:\"\n    },\n    \"override_server_settings\": \n    {\n        \"message\": \"Override configuration on server?\"\n    },\n    \"confirm_chrome_sync_configuration_export\": \n    {\n        \"message\": \"This will override your current configuration kept in Chrome Sync. Do you want to proceed?\"\n    },\n    \"manual\": \n    {\n        \"message\": \"Manual\"\n    },\n    \"chrome_sync\": \n    {\n        \"message\": \"Chrome Sync\"\n    },\n    \"save_on_server\": \n    {\n        \"message\": \"Save on server\"\n    },\n    \"load_from_server\": \n    {\n        \"message\": \"Load from server\"\n    },\n    \"saved\": \n    {\n        \"message\": \"Saved\"\n    },\n    \"enable_apps_support\": \n    {\n        \"message\": \"enable apps support (by default only extensions are supported)\"\n    },\n    \"show_all_extensions_button\": \n    {\n        \"message\": \"show 'All extensions' button in popup\"\n    },\n    \"delay_after_enabling_extension\": \n    {\n        \"message\": \"delay in milliseconds after enabling each extension\"\n    },\n    \"context_options\": \n    {\n        \"message\": \"Context - Options\"\n    },\n    \"remove_context\": \n    {\n        \"message\": \"Remove context?\"\n    },\n    \"cancel\": \n    {\n        \"message\": \"Cancel\"\n    },\n    \"edit\": \n    {\n        \"message\": \"Edit\"\n    },\n    \"create\": \n    {\n        \"message\": \"Create\"\n    },\n    \"delete\": \n    {\n        \"message\": \"Delete\"\n    },\n    \"clone\": \n    {\n        \"message\": \"Clone\"\n    },\n    \"move\": \n    {\n        \"message\": \"Move\"\n    },\n    \"extension_is_loading\": \n    {\n        \"message\": \"Extension is loading ...\"\n    },\n    \"new_extension_installed_action\": \n    {\n        \"message\": \"after new extension is installed\"\n    },\n    \"ask_what_to_do\": \n    {\n        \"message\": \"ask what to do\"\n    },\n    \"add_to_all_contexts\": \n    {\n        \"message\": \"add extension to all contexts\"\n    },\n    \"add_to_always_enabled\": \n    {\n        \"message\": \"add to 'always-enabled'\"\n    },\n    \"do_nothing\": \n    {\n        \"message\": \"do nothing\"\n    },\n    \"extension_installed_1\": \n    {\n        \"message\": \"New extension\"\n    },\n    \"extension_installed_2\": \n    {\n        \"message\": \"installed\"\n    },\n    \"add_to_contexts\": \n    {\n        \"message\": \"Add it to the following contexts\"\n    },\n    \"or_add_it_to\": \n    {\n        \"message\": \"or add it to\"\n    },\n    \"font\": \n    {\n        \"message\": \"Font\"\n    },\n    \"icons\": \n    {\n        \"message\": \"Icons\"\n    },\n    \"icon_flip_animation\": \n    {\n        \"message\": \"Icon flip animation\"\n    },\n    \"programmer\": \n    {\n        \"message\": \"Programmer\"\n    },\n    \"source_code\": \n    {\n        \"message\": \"Source code\"\n    },\n    \"translations\": \n    {\n        \"message\": \"Translations\"\n    },\n    \"welcome\": \n    {\n        \"message\": \"Welcome\"\n    },\n    \"welcome_step_1\": \n    {\n        \"message\": \"Welcome! To start working with this extension, create contexts (extension groups). For each context choose a name and an icon.\"\n    },\n    \"welcome_step_2\": \n    {\n        \"message\": \"To connect extensions with contexts, drag them from top alphabetical list to a chosen box representing context.\"\n    },\n    \"welcome_step_3\": \n    {\n        \"message\": \"Move all extensions that should be enabled for every context from 'Available extensions' box to 'Always-enabled extensions' box.\"\n    },\n    \"welcome_step_4\": \n    {\n        \"message\": \"Save your configuration and you are done! You can easily switch between contexts using icon in the toolbar. Selecting context name or icon on the menu switches to selected context. Clicking on plus/minus button activates/deactivates chosen context allowing you to mix contexts with each other.\"\n    },\n    \"next\": \n    {\n        \"message\": \"Next\"\n    },\n    \"previous\": \n    {\n        \"message\": \"Previous\"\n    },\n    \"close\": \n    {\n        \"message\": \"Close\"\n    },\n    \"show_extension_icon\": \n    {\n        \"message\": \"In the popup use icon of the first extension instead of the context icon.\"\n    },\n    \"open_notification\": \n    {\n        \"message\": \"Click here to decide what contexts you want to add it to.\"\n    }\n}"
  },
  {
    "path": "_locales/en/messages.json",
    "content": "{\n    \"locale\": \n    {\n        \"message\": \"en\",\n        \"description\": \"There is build in @@_ui_locale variable but it shows language variations like en_GB, en_US etc. We don't want that.\"\n    },\n    \"application_description\": \n    {\n        \"message\": \"Sort extensions into groups and easily switch between them.\"\n    },\n    \"all_extensions\": \n    {\n        \"message\": \"All extensions\"\n    },\n    \"highlight_ungrouped_extensions\": \n    {\n        \"message\": \"highlight ungrouped extensions\"\n    },\n    \"create_new_context\": \n    {\n        \"message\": \"Create new context\"\n    },\n    \"edit_context\": \n    {\n        \"message\": \"Edit context\"\n    },\n    \"name_field_is_required\": \n    {\n        \"message\": \"Name field is required.\"\n    },\n    \"this_name_is_already_in_use\": \n    {\n        \"message\": \"This name is already in use.\"\n    },\n    \"pick_an_icon\": \n    {\n        \"message\": \"Pick an icon.\"\n    },\n    \"available_extensions\": \n    {\n        \"message\": \"Available extensions\"\n    },\n    \"always_enabled_extensions\": \n    {\n        \"message\": \"Always-enabled extensions\"\n    },\n    \"name\": \n    {\n        \"message\": \"Name\"\n    },\n    \"options\": \n    {\n        \"message\": \"Options\"\n    },\n    \"icon\": \n    {\n        \"message\": \"Icon\"\n    },\n    \"context_will_be_deleted\": \n    {\n        \"message\": \"Context will be deleted. Are you sure?\"\n    },\n    \"additional_options\": \n    {\n        \"message\": \"Additional options\"\n    },\n    \"new_context\": \n    {\n        \"message\": \"New Context\"\n    },\n    \"save\": \n    {\n        \"message\": \"Save\"\n    },\n    \"about\": \n    {\n        \"message\": \"About\"\n    },\n    \"configuration_import_export\": \n    {\n        \"message\": \"Configuration import/export/sync\"\n    },\n    \"configuration_import\": \n    {\n        \"message\": \"Configuration import\"\n    },\n    \"configuration_export_description\": \n    {\n        \"message\": \"To export all your settings, copy encoded configuration string from the box below.\"\n    },\n    \"configuration_import_description\": \n    {\n        \"message\": \"Paste configuration string to the box below and click 'Import' to restore your configuration.\"\n    },\n    \"confirm_configuration_import\": \n    {\n        \"message\": \"Import will override your current configuration, be sure to make a backup if you don't want to lose it.\"\n    },\n    \"import\": \n    {\n        \"message\": \"Import\"\n    },\n    \"override_current_settings\": \n    {\n        \"message\": \"Override current settings?\"\n    },\n    \"import_failed\": \n    {\n        \"message\": \"Import failed\"\n    },\n    \"configuration_string_is_invalid\": \n    {\n        \"message\": \"Sorry, provided configuration string is invalid. Import failed.\"\n    },\n    \"successful_import\": \n    {\n        \"message\": \"Successful import\"\n    },\n    \"configuration_was_imported_successfuly\": \n    {\n        \"message\": \"Configuration was imported successfully.\"\n    },\n    \"some_extensions_were_ignored\": \n    {\n        \"message\": \"Some extensions from imported configuration were ignored because they are not installed:\"\n    },\n    \"override_server_settings\": \n    {\n        \"message\": \"Override configuration on server?\"\n    },\n    \"confirm_chrome_sync_configuration_export\": \n    {\n        \"message\": \"This will override your current configuration kept in Chrome Sync. Do you want to proceed?\"\n    },\n    \"manual\": \n    {\n        \"message\": \"Manual\"\n    },\n    \"chrome_sync\": \n    {\n        \"message\": \"Chrome Sync\"\n    },\n    \"save_on_server\": \n    {\n        \"message\": \"Save on server\"\n    },\n    \"load_from_server\": \n    {\n        \"message\": \"Load from server\"\n    },\n    \"saved\": \n    {\n        \"message\": \"Saved\"\n    },\n    \"enable_apps_support\": \n    {\n        \"message\": \"enable apps support (by default only extensions are supported)\"\n    },\n    \"show_all_extensions_button\": \n    {\n        \"message\": \"show 'All extensions' button in popup\"\n    },\n    \"delay_after_enabling_extension\": \n    {\n        \"message\": \"delay in milliseconds after enabling each extension\"\n    },\n    \"context_options\": \n    {\n        \"message\": \"Context - Options\"\n    },\n    \"remove_context\": \n    {\n        \"message\": \"Remove context?\"\n    },\n    \"cancel\": \n    {\n        \"message\": \"Cancel\"\n    },\n    \"edit\": \n    {\n        \"message\": \"Edit\"\n    },\n    \"create\": \n    {\n        \"message\": \"Create\"\n    },\n    \"delete\": \n    {\n        \"message\": \"Delete\"\n    },\n    \"clone\": \n    {\n        \"message\": \"Clone\"\n    },\n    \"move\": \n    {\n        \"message\": \"Move\"\n    },\n    \"extension_is_loading\": \n    {\n        \"message\": \"Extension is loading ...\"\n    },\n    \"new_extension_installed_action\": \n    {\n        \"message\": \"after new extension is installed\"\n    },\n    \"ask_what_to_do\": \n    {\n        \"message\": \"ask what to do\"\n    },\n    \"add_to_all_contexts\": \n    {\n        \"message\": \"add extension to all contexts\"\n    },\n    \"add_to_always_enabled\": \n    {\n        \"message\": \"add to 'always-enabled'\"\n    },\n    \"do_nothing\": \n    {\n        \"message\": \"do nothing\"\n    },\n    \"extension_installed_1\": \n    {\n        \"message\": \"New extension\"\n    },\n    \"extension_installed_2\": \n    {\n        \"message\": \"installed\"\n    },\n    \"add_to_contexts\": \n    {\n        \"message\": \"Add it to the following contexts\"\n    },\n    \"or_add_it_to\": \n    {\n        \"message\": \"or add it to\"\n    },\n    \"font\": \n    {\n        \"message\": \"Font\"\n    },\n    \"icons\": \n    {\n        \"message\": \"Icons\"\n    },\n    \"icon_flip_animation\": \n    {\n        \"message\": \"Icon flip animation\"\n    },\n    \"programmer\": \n    {\n        \"message\": \"Programmer\"\n    },\n    \"source_code\": \n    {\n        \"message\": \"Source code\"\n    },\n    \"translations\": \n    {\n        \"message\": \"Translations\"\n    },\n    \"welcome\": \n    {\n        \"message\": \"Welcome\"\n    },\n    \"welcome_step_1\": \n    {\n        \"message\": \"Welcome! To start working with this extension, create contexts (extension groups). For each context choose a name and an icon.\"\n    },\n    \"welcome_step_2\": \n    {\n        \"message\": \"To connect extensions with contexts, drag them from top alphabetical list to a chosen box representing context.\"\n    },\n    \"welcome_step_3\": \n    {\n        \"message\": \"Move all extensions that should be enabled for every context from 'Available extensions' box to 'Always-enabled extensions' box.\"\n    },\n    \"welcome_step_4\": \n    {\n        \"message\": \"Save your configuration and you are done! You can easily switch between contexts using icon in the toolbar. Selecting context name or icon on the menu switches to selected context. Clicking on plus/minus button activates/deactivates chosen context allowing you to mix contexts with each other.\"\n    },\n    \"next\": \n    {\n        \"message\": \"Next\"\n    },\n    \"previous\": \n    {\n        \"message\": \"Previous\"\n    },\n    \"close\": \n    {\n        \"message\": \"Close\"\n    },\n    \"show_extension_icon\": \n    {\n        \"message\": \"In the popup use icon of the first extension instead of the context icon.\"\n    },\n    \"open_notification\": \n    {\n        \"message\": \"Click here to decide what contexts you want to add it to.\"\n    }\n}"
  },
  {
    "path": "_locales/es/messages.json",
    "content": "{\n    \"locale\": \n    {\n        \"message\": \"en\",\n        \"description\": \"There is build in @@_ui_locale variable but it shows language variations like en_GB, en_US etc. We don't want that.\"\n    },\n    \"application_description\": \n    {\n        \"message\": \"Extensiones para clasificar en grupos y cambiar fácilmente entre ellas.\"\n    },\n    \"all_extensions\": \n    {\n        \"message\": \"Todas las extensiones\"\n    },\n    \"highlight_ungrouped_extensions\": \n    {\n        \"message\": \"highlight ungrouped extensions\"\n    },\n    \"create_new_context\": \n    {\n        \"message\": \"Crear nuevo grupo\"\n    },\n    \"edit_context\": \n    {\n        \"message\": \"Editar grupo\"\n    },\n    \"name_field_is_required\": \n    {\n        \"message\": \"Campo nombre es obligatorio.\"\n    },\n    \"this_name_is_already_in_use\": \n    {\n        \"message\": \"Este nombre ya está en uso.\"\n    },\n    \"pick_an_icon\": \n    {\n        \"message\": \"Elige un icono.\"\n    },\n    \"available_extensions\": \n    {\n        \"message\": \"Extensiones disponibles\"\n    },\n    \"always_enabled_extensions\": \n    {\n        \"message\": \"Extensiones siempre activadas\"\n    },\n    \"name\": \n    {\n        \"message\": \"Nombre\"\n    },\n    \"options\": \n    {\n        \"message\": \"Opciones\"\n    },\n    \"icon\": \n    {\n        \"message\": \"Icono\"\n    },\n    \"context_will_be_deleted\": \n    {\n        \"message\": \"Los grupos serán borrados. ¿Está seguro?\"\n    },\n    \"additional_options\": \n    {\n        \"message\": \"Opciones adicionales\"\n    },\n    \"new_context\": \n    {\n        \"message\": \"Nuevo grupo\"\n    },\n    \"save\": \n    {\n        \"message\": \"Guardar\"\n    },\n    \"about\": \n    {\n        \"message\": \"Sobre\"\n    },\n    \"configuration_import_export\": \n    {\n        \"message\": \"Configuration import/export\"\n    },\n    \"configuration_import\": \n    {\n        \"message\": \"Configuration import\"\n    },\n    \"configuration_export_description\": \n    {\n        \"message\": \"To export all your settings, copy encoded configuration string from the box below.\"\n    },\n    \"configuration_import_description\": \n    {\n        \"message\": \"Paste configuration string to the box below and click 'Import' to restore your configuration.\"\n    },\n    \"confirm_configuration_import\": \n    {\n        \"message\": \"Import will override your current configuration, be sure to make a backup if you don't want to lose it.\"\n    },\n    \"import\": \n    {\n        \"message\": \"Import\"\n    },\n    \"override_current_settings\": \n    {\n        \"message\": \"Override current settings?\"\n    },\n    \"import_failed\": \n    {\n        \"message\": \"Import failed\"\n    },\n    \"configuration_string_is_invalid\": \n    {\n        \"message\": \"Sorry, provided configuration string is invalid. Import failed.\"\n    },\n    \"successful_import\": \n    {\n        \"message\": \"Successful import\"\n    },\n    \"configuration_was_imported_successfuly\": \n    {\n        \"message\": \"Configuration was imported successfuly.\"\n    },\n    \"some_extensions_were_ignored\": \n    {\n        \"message\": \"Some extensions from imported configuration were ignored because they are not installed:\"\n    },\n    \"override_server_settings\": \n    {\n        \"message\": \"Override configuration on server?\"\n    },\n    \"confirm_chrome_sync_configuration_export\": \n    {\n        \"message\": \"This will override your current configuration kept in Chrome Sync. Do you want to proceed?\"\n    },\n    \"manual\": \n    {\n        \"message\": \"Manual\"\n    },\n    \"chrome_sync\": \n    {\n        \"message\": \"Chrome Sync\"\n    },\n    \"save_on_server\": \n    {\n        \"message\": \"Save on server\"\n    },\n    \"load_from_server\": \n    {\n        \"message\": \"Load from server\"\n    },\n    \"saved\": \n    {\n        \"message\": \"Saved\"\n    },\n    \"enable_apps_support\": \n    {\n        \"message\": \"habilitar soporte de aplicaciones (por defecto, sólo las extensiones son compatibles)\"\n    },\n    \"show_all_extensions_button\": \n    {\n        \"message\": \"Mostrar el botón 'Todas las extensiones' en popup\"\n    },\n    \"delay_after_enabling_extension\": \n    {\n        \"message\": \"delay in milliseconds after enabling each extension\"\n    },\n    \"context_options\": \n    {\n        \"message\": \"Grupo - Opciones\"\n    },\n    \"remove_context\": \n    {\n        \"message\": \"Quitar grupo?\"\n    },\n    \"cancel\": \n    {\n        \"message\": \"Cancelar\"\n    },\n    \"edit\": \n    {\n        \"message\": \"Editar\"\n    },\n    \"create\": \n    {\n        \"message\": \"Crear\"\n    },\n    \"delete\": \n    {\n        \"message\": \"Borrar\"\n    },\n    \"clone\": \n    {\n        \"message\": \"Duplicar\"\n    },\n    \"move\": \n    {\n        \"message\": \"Mover\"\n    },\n    \"extension_is_loading\": \n    {\n        \"message\": \"La extensión se está cargando ...\"\n    },\n    \"new_extension_installed_action\": \n    {\n        \"message\": \"Después de que el grupo se instale\"\n    },\n    \"ask_what_to_do\": \n    {\n        \"message\": \"preguntarle qué hacer\"\n    },\n    \"add_to_all_contexts\": \n    {\n        \"message\": \"DAña extensión a todos los grupos\"\n    },\n    \"add_to_always_enabled\": \n    {\n        \"message\": \"add to 'always-enabled'\"\n    },\n    \"do_nothing\": \n    {\n        \"message\": \"no hacer nada\"\n    },\n    \"extension_installed_1\": \n    {\n        \"message\": \"Nuevo grupo\"\n    },\n    \"extension_installed_2\": \n    {\n        \"message\": \"instalado\"\n    },\n    \"add_to_contexts\": \n    {\n        \"message\": \"Añadir a los siguientes grupos\"\n    },\n    \"or_add_it_to\": \n    {\n        \"message\": \"or add it to\"\n    },\n    \"font\": \n    {\n        \"message\": \"Fuente\"\n    },\n    \"icons\": \n    {\n        \"message\": \"Iconos\"\n    },\n    \"icon_flip_animation\": \n    {\n        \"message\": \"Animación del icono\"\n    },\n    \"programmer\": \n    {\n        \"message\": \"Programador\"\n    },\n    \"source_code\": \n    {\n        \"message\": \"Source code\"\n    },\n    \"translations\": \n    {\n        \"message\": \"Traducciones\"\n    },\n    \"welcome\": \n    {\n        \"message\": \"Bienvenido\"\n    },\n    \"welcome_step_1\": \n    {\n        \"message\": \"Bienvenido! Puedes empezar a trabajar con esta extensión de crear grupos (grupos de extensiones). Para cada grupo elegir un nombre y un icono.\"\n    },\n    \"welcome_step_2\": \n    {\n        \"message\": \"Para conectar las extensiones de los mismos grupos hay que arrastrarlas desde la lista de arriba, por orden alfabético a una caja de elegidos que representan a su grupo.\"\n    },\n    \"welcome_step_3\": \n    {\n        \"message\": \"Mueve todas las extensiones que deberían estar activadas para cada contexto desde 'extensiones disponibles' a la caja 'extensiones siempre disponibles'.\"\n    },\n    \"welcome_step_4\": \n    {\n        \"message\": \"Guarda tu configuración y listo. Puede fácilmente alternar los contextos usando los iconos en la barra de tareas. Seleccionando el nombre del contexto o el icono en el menú, cambiar al contexto seleccionado. Pulsando en el botón más/menos activa/desactiva el contexto elegido permitiendo mezclar unos contextos con otros.\"\n    },\n    \"next\": \n    {\n        \"message\": \"Próximo\"\n    },\n    \"previous\": \n    {\n        \"message\": \"Anterior\"\n    },\n    \"close\": \n    {\n        \"message\": \"Cerrar\"\n    },\n    \"show_extension_icon\": \n    {\n        \"message\": \"In the popup use icon of the first extension instead of the context icon.\"\n    },\n    \"open_notification\": \n    {\n        \"message\": \"Click here to decide what contexts you want to add it to.\"\n    }\n}"
  },
  {
    "path": "_locales/fr/messages.json",
    "content": "{\n    \"locale\": \n    {\n        \"message\": \"en\",\n        \"description\": \"There is build in @@_ui_locale variable but it shows language variations like en_GB, en_US etc. We don't want that.\"\n    },\n    \"application_description\": \n    {\n        \"message\": \"Organisez vos extensions dans des groupes et basculez facilement entre eux.\"\n    },\n    \"all_extensions\": \n    {\n        \"message\": \"Toutes les extensions\"\n    },\n    \"highlight_ungrouped_extensions\": \n    {\n        \"message\": \"Mettre en évidence les extensions non groupées\"\n    },\n    \"create_new_context\": \n    {\n        \"message\": \"Créer un nouveau context\"\n    },\n    \"edit_context\": \n    {\n        \"message\": \"Editer le context\"\n    },\n    \"name_field_is_required\": \n    {\n        \"message\": \"Le champ Nom est obligatoire.\"\n    },\n    \"this_name_is_already_in_use\": \n    {\n        \"message\": \"Ce nom est déjà utilisé.\"\n    },\n    \"pick_an_icon\": \n    {\n        \"message\": \"Choisissez une icône.\"\n    },\n    \"available_extensions\": \n    {\n        \"message\": \"Extensions disponibles\"\n    },\n    \"always_enabled_extensions\": \n    {\n        \"message\": \"Extensions toujours activées\"\n    },\n    \"name\": \n    {\n        \"message\": \"Nom\"\n    },\n    \"options\": \n    {\n        \"message\": \"Options\"\n    },\n    \"icon\": \n    {\n        \"message\": \"Icône\"\n    },\n    \"context_will_be_deleted\": \n    {\n        \"message\": \"Ce context sera supprimé. Êtes-vous sûr ?\"\n    },\n    \"additional_options\": \n    {\n        \"message\": \"Options supplémentaires\"\n    },\n    \"new_context\": \n    {\n        \"message\": \"Nouveau Context\"\n    },\n    \"save\": \n    {\n        \"message\": \"Sauvegarder\"\n    },\n    \"about\": \n    {\n        \"message\": \"À propos\"\n    },\n    \"configuration_import_export\": \n    {\n        \"message\": \"Import/Export de la configuration\"\n    },\n    \"configuration_import\": \n    {\n        \"message\": \"Importer la configuration\"\n    },\n    \"configuration_export_description\": \n    {\n        \"message\": \"Pour exporter tous vos paramètres, copiez la chaîne de configuration codée à partir de la boîte ci-dessous.\"\n    },\n    \"configuration_import_description\": \n    {\n        \"message\": \"Collez la chaîne de configuration dans la boîte ci-dessous et cliquez sur \\\"Importer\\\" pour restaurer votre configuration.\"\n    },\n    \"confirm_configuration_import\": \n    {\n        \"message\": \"L'importation remplacera votre configuration actuelle. Pensez à faire une sauvegarde si vous ne voulez pas la perdre.\"\n    },\n    \"import\": \n    {\n        \"message\": \"Importer\"\n    },\n    \"override_current_settings\": \n    {\n        \"message\": \"Remplacer les paramètres actuels ?\"\n    },\n    \"import_failed\": \n    {\n        \"message\": \"Échec de l'importation\"\n    },\n    \"configuration_string_is_invalid\": \n    {\n        \"message\": \"Désolé, la chaîne de configuration fournie n'est pas valide. Échec de l'importation.\"\n    },\n    \"successful_import\": \n    {\n        \"message\": \"Importation réussie\"\n    },\n    \"configuration_was_imported_successfuly\": \n    {\n        \"message\": \"La configuration a été importée avec succès.\"\n    },\n    \"some_extensions_were_ignored\": \n    {\n        \"message\": \"Certaines extensions ont été ignorées lors de l'importation de la configuration, car elles ne sont pas installées:\"\n    },\n    \"override_server_settings\": \n    {\n        \"message\": \"Override configuration on server?\"\n    },\n    \"confirm_chrome_sync_configuration_export\": \n    {\n        \"message\": \"This will override your current configuration kept in Chrome Sync. Do you want to proceed?\"\n    },\n    \"manual\": \n    {\n        \"message\": \"Manual\"\n    },\n    \"chrome_sync\": \n    {\n        \"message\": \"Chrome Sync\"\n    },\n    \"save_on_server\": \n    {\n        \"message\": \"Save on server\"\n    },\n    \"load_from_server\": \n    {\n        \"message\": \"Load from server\"\n    },\n    \"saved\": \n    {\n        \"message\": \"Saved\"\n    },\n    \"enable_apps_support\": \n    {\n        \"message\": \"Activer le support des applications (par défaut, seules les extensions sont supportées)\"\n    },\n    \"show_all_extensions_button\": \n    {\n        \"message\": \"Afficher le bouton ‘Toutes les extensions’ dans le popup\"\n    },\n    \"delay_after_enabling_extension\": \n    {\n        \"message\": \"délai en millisecondes après l'activation de chaque extension\"\n    },\n    \"context_options\": \n    {\n        \"message\": \"Context - Options\"\n    },\n    \"remove_context\": \n    {\n        \"message\": \"Supprimer le context ?\"\n    },\n    \"cancel\": \n    {\n        \"message\": \"Annuler\"\n    },\n    \"edit\": \n    {\n        \"message\": \"Editer\"\n    },\n    \"create\": \n    {\n        \"message\": \"Créer\"\n    },\n    \"delete\": \n    {\n        \"message\": \"Supprimer\"\n    },\n    \"clone\": \n    {\n        \"message\": \"Dupliquer\"\n    },\n    \"move\": \n    {\n        \"message\": \"Déplacer\"\n    },\n    \"extension_is_loading\": \n    {\n        \"message\": \"Chargement de l’extension...\"\n    },\n    \"new_extension_installed_action\": \n    {\n        \"message\": \"après l’installation d’une nouvelle extension\"\n    },\n    \"ask_what_to_do\": \n    {\n        \"message\": \"demander ce qu'il faut faire\"\n    },\n    \"add_to_all_contexts\": \n    {\n        \"message\": \"ajouter l'extension à tous les contexts\"\n    },\n    \"add_to_always_enabled\": \n    {\n        \"message\": \"ajouter à ‘toujours activées’\"\n    },\n    \"do_nothing\": \n    {\n        \"message\": \"ne rien faire\"\n    },\n    \"extension_installed_1\": \n    {\n        \"message\": \"Nouvelle extension\"\n    },\n    \"extension_installed_2\": \n    {\n        \"message\": \"installée\"\n    },\n    \"add_to_contexts\": \n    {\n        \"message\": \"Ajoutez-la aux contexts suivants\"\n    },\n    \"or_add_it_to\": \n    {\n        \"message\": \"ou ajoutez-la à\"\n    },\n    \"font\": \n    {\n        \"message\": \"Police\"\n    },\n    \"icons\": \n    {\n        \"message\": \"Icônes\"\n    },\n    \"icon_flip_animation\": \n    {\n        \"message\": \"Icône de rotation animée\"\n    },\n    \"programmer\": \n    {\n        \"message\": \"Programmeur\"\n    },\n    \"source_code\": \n    {\n        \"message\": \"Code source\"\n    },\n    \"translations\": \n    {\n        \"message\": \"Traductions\"\n    },\n    \"welcome\": \n    {\n        \"message\": \"Bienvenue\"\n    },\n    \"welcome_step_1\": \n    {\n        \"message\": \"Bienvenue ! Pour commencer à travailler avec cette extension, créez des contexts (groupes d'extensions). Pour chaque context, choisissez un nom et une icône.\"\n    },\n    \"welcome_step_2\": \n    {\n        \"message\": \"Pour connecter des extensions aux différents contexts, glissez-les depuis la liste alphabétique supérieure jusqu'à la boîte représentant le context de votre choix.\"\n    },\n    \"welcome_step_3\": \n    {\n        \"message\": \"Déplacez, de la boîte ‘Extensions disponibles’ à la boîte ‘Extensions toujours activées’, les extensions que vous souhaitez activer dans tous les contexts.\"\n    },\n    \"welcome_step_4\": \n    {\n        \"message\": \"Sauvegardez votre configuration et vous avez terminé ! Vous pouvez facilement basculer d'un context à un autre en utilisant l'icône dans la barre d'outils. La sélection d'un context s'effectue en cliquant sur son nom ou son icône dans le menu. Un clic sur le bouton plus/moins (activer/désactiver) permet de mélanger les contexts entre eux.\"\n    },\n    \"next\": \n    {\n        \"message\": \"Suivant\"\n    },\n    \"previous\": \n    {\n        \"message\": \"Précédent\"\n    },\n    \"close\": \n    {\n        \"message\": \"Fermer\"\n    },\n    \"show_extension_icon\": \n    {\n        \"message\": \"In the popup use icon of the first extension instead of the context icon.\"\n    },\n    \"open_notification\": \n    {\n        \"message\": \"Click here to decide what contexts you want to add it to.\"\n    }\n}"
  },
  {
    "path": "_locales/it/description.txt",
    "content": "Dai un'occhiata alle tue estensioni. Davvero le usi tutte quante e per tutto il tempo? Non credo. Lo sai che queste estensioni non utilizzate sottraggono risorse e spazio? Inoltre possono distrarti con animazioni e notifiche. Con Context puoi porre fine a tutto ciò. Ti basta mettere le estensioni che usi per lavoro, divertimento, shopping, socializzazione, ecc. in gruppi (\"contesti\") differenti e con un solo click passare da un gruppo all'altro.\n\nExtra:\n- puoi miscelare i contesti tra di loro usando i pulsanti +/-\n- quando vengono installate nuove estensioni, Context ti permetterà di assegnarle ai gruppi più appropriati, tramite finestra di notifica - senza la necessità di aprire la pagina di configurazione\n- gruppi differenti - temi differenti (supporto limitato - Chrome memorizza solo gli ultimi 3 temi)\n- tutorial passo-passo al primo avvio\n"
  },
  {
    "path": "_locales/it/messages.json",
    "content": "{\n    \"locale\": \n    {\n        \"message\": \"en\",\n        \"description\": \"There is build in @@_ui_locale variable but it shows language variations like en_GB, en_US etc. We don't want that.\"\n    },\n    \"application_description\": \n    {\n        \"message\": \"Ordina le estensioni in gruppi e gestiscili facilmente.\"\n    },\n    \"all_extensions\": \n    {\n        \"message\": \"Tutte le estensioni\"\n    },\n    \"highlight_ungrouped_extensions\": \n    {\n        \"message\": \"evidenzia estensioni non raggruppate\"\n    },\n    \"create_new_context\": \n    {\n        \"message\": \"Crea nuovo contesto\"\n    },\n    \"edit_context\": \n    {\n        \"message\": \"Modifica contesto\"\n    },\n    \"name_field_is_required\": \n    {\n        \"message\": \"Il campo nome è richiesto.\"\n    },\n    \"this_name_is_already_in_use\": \n    {\n        \"message\": \"Questo nome è già in uso.\"\n    },\n    \"pick_an_icon\": \n    {\n        \"message\": \"Seleziona un'icona.\"\n    },\n    \"available_extensions\": \n    {\n        \"message\": \"Estensioni disponibili\"\n    },\n    \"always_enabled_extensions\": \n    {\n        \"message\": \"Estensioni sempre abilitate\"\n    },\n    \"name\": \n    {\n        \"message\": \"Nome\"\n    },\n    \"options\": \n    {\n        \"message\": \"Opzioni\"\n    },\n    \"icon\": \n    {\n        \"message\": \"Icona\"\n    },\n    \"context_will_be_deleted\": \n    {\n        \"message\": \"Il contesto verrà eliminato. Sei sicuro?\"\n    },\n    \"additional_options\": \n    {\n        \"message\": \"Opzioni aggiuntive\"\n    },\n    \"new_context\": \n    {\n        \"message\": \"Nuovo contesto\"\n    },\n    \"save\": \n    {\n        \"message\": \"Salva\"\n    },\n    \"about\": \n    {\n        \"message\": \"Informazioni\"\n    },\n    \"configuration_import_export\": \n    {\n        \"message\": \"Importa/esporta configurazione\"\n    },\n    \"configuration_import\": \n    {\n        \"message\": \"Importa configurazione\"\n    },\n    \"configuration_export_description\": \n    {\n        \"message\": \"Per esportare tutte le tue impostazioni, copia la stringa di configurazione codificata dal riquadro sottostante.\"\n    },\n    \"configuration_import_description\": \n    {\n        \"message\": \"Incolla la stringa di configurazione nel riquadro sottostante e clicca 'Importa' per ripristinare la tua configurazione.\"\n    },\n    \"confirm_configuration_import\": \n    {\n        \"message\": \"L'importazione sovrascriverà l'attuale configurazione, assicurati di fare una copia di sicurezza se non vuoi perderla.\"\n    },\n    \"import\": \n    {\n        \"message\": \"Importa\"\n    },\n    \"override_current_settings\": \n    {\n        \"message\": \"Sovrascrivere le impostazioni attuali?\"\n    },\n    \"import_failed\": \n    {\n        \"message\": \"Importazione fallita\"\n    },\n    \"configuration_string_is_invalid\": \n    {\n        \"message\": \"Spiacente, la stringa di configurazione fornita non è valida. Importazione fallita.\"\n    },\n    \"successful_import\": \n    {\n        \"message\": \"Importazione terminata\"\n    },\n    \"configuration_was_imported_successfuly\": \n    {\n        \"message\": \"La configurazione è stata importata con successo.\"\n    },\n    \"some_extensions_were_ignored\": \n    {\n        \"message\": \"Alcune estensioni presenti nella configurazione importata sono state ignorate perché non sono installate:\"\n    },\n    \"override_server_settings\": \n    {\n        \"message\": \"Sovrascrivere la configurazione sul server?\"\n    },\n    \"confirm_chrome_sync_configuration_export\": \n    {\n        \"message\": \"Questo sovrascriverà l'attuale configurazione sincronizzata in Chrome. Vuoi continuare?\"\n    },\n    \"manual\": \n    {\n        \"message\": \"Manuale\"\n    },\n    \"chrome_sync\": \n    {\n        \"message\": \"Sincronizza in Chrome\"\n    },\n    \"save_on_server\": \n    {\n        \"message\": \"Salva sul server\"\n    },\n    \"load_from_server\": \n    {\n        \"message\": \"Carica dal server\"\n    },\n    \"saved\": \n    {\n        \"message\": \"Salvato\"\n    },\n    \"enable_apps_support\": \n    {\n        \"message\": \"abilita supporto alle app (di default sono supportate solo le estensioni)\"\n    },\n    \"show_all_extensions_button\": \n    {\n        \"message\": \"mostra il pulsante 'Tutte le estensioni' nel popup\"\n    },\n    \"delay_after_enabling_extension\": \n    {\n        \"message\": \"ritardo in millisecondi dopo l'abilitazione di ogni estensione\"\n    },\n    \"context_options\": \n    {\n        \"message\": \"Context - Opzioni\"\n    },\n    \"remove_context\": \n    {\n        \"message\": \"Rimuovere contesto?\"\n    },\n    \"cancel\": \n    {\n        \"message\": \"Annulla\"\n    },\n    \"edit\": \n    {\n        \"message\": \"Modifica\"\n    },\n    \"create\": \n    {\n        \"message\": \"Crea\"\n    },\n    \"delete\": \n    {\n        \"message\": \"Elimina\"\n    },\n    \"clone\": \n    {\n        \"message\": \"Duplica\"\n    },\n    \"move\": \n    {\n        \"message\": \"Sposta\"\n    },\n    \"extension_is_loading\": \n    {\n        \"message\": \"Estensione in caricamento ...\"\n    },\n    \"new_extension_installed_action\": \n    {\n        \"message\": \"dopo che la nuova estensione viene installata\"\n    },\n    \"ask_what_to_do\": \n    {\n        \"message\": \"chiedi cosa fare\"\n    },\n    \"add_to_all_contexts\": \n    {\n        \"message\": \"aggiungi estensione a tutti i contesti\"\n    },\n    \"add_to_always_enabled\": \n    {\n        \"message\": \"aggiungi a 'sempre abilitate'\"\n    },\n    \"do_nothing\": \n    {\n        \"message\": \"non fare nulla\"\n    },\n    \"extension_installed_1\": \n    {\n        \"message\": \"Nuova estensione\"\n    },\n    \"extension_installed_2\": \n    {\n        \"message\": \"installata\"\n    },\n    \"add_to_contexts\": \n    {\n        \"message\": \"Aggiungila ai seguenti contesti\"\n    },\n    \"or_add_it_to\": \n    {\n        \"message\": \"o aggiungila a\"\n    },\n    \"font\": \n    {\n        \"message\": \"Font\"\n    },\n    \"icons\": \n    {\n        \"message\": \"Icone\"\n    },\n    \"icon_flip_animation\": \n    {\n        \"message\": \"Animazione icona\"\n    },\n    \"programmer\": \n    {\n        \"message\": \"Programmatore\"\n    },\n    \"source_code\": \n    {\n        \"message\": \"Codice sorgente\"\n    },\n    \"translations\": \n    {\n        \"message\": \"Traduzioni\"\n    },\n    \"welcome\": \n    {\n        \"message\": \"Benvenuto\"\n    },\n    \"welcome_step_1\": \n    {\n        \"message\": \"Benvenuto! Per iniziare ad usare questa estensione, crea dei contesti (gruppi estensione). Per ogni contesto scegli un nome ed un'icona.\"\n    },\n    \"welcome_step_2\": \n    {\n        \"message\": \"Per connettere le estensioni ai contesti, trascinale dall'elenco alfabetico in alto, ad un riquadro rappresentante un contesto.\"\n    },\n    \"welcome_step_3\": \n    {\n        \"message\": \"Sposta tutte le estensioni che dovrebbero essere abilitate per ogni contesto, dal riquadro 'Estensioni disponibili' al riquadro 'Estensioni sempre abilitate'.\"\n    },\n    \"welcome_step_4\": \n    {\n        \"message\": \"Salva la tua configurazione e sei pronto! Puoi facilmente passare tra i contesti usando l'icona nella barra strumenti. Seleziona il nome del contesto o l'icona nel menu per passare al contesto selezionato. Clicca il pulsante più/meno per attivare/disattivare il contesto scelto così da poter miscelare i contesti tra di loro.\"\n    },\n    \"next\": \n    {\n        \"message\": \"Avanti\"\n    },\n    \"previous\": \n    {\n        \"message\": \"Indietro\"\n    },\n    \"close\": \n    {\n        \"message\": \"Chiudi\"\n    },\n    \"show_extension_icon\": \n    {\n        \"message\": \"Nel popup, invece dell'icona del contesto, usa quella della prima estensione.\"\n    },\n    \"open_notification\": \n    {\n        \"message\": \"Click here to decide what contexts you want to add it to.\"\n    }\n}"
  },
  {
    "path": "_locales/ja/messages.json",
    "content": "{\n    \"locale\": \n    {\n        \"message\": \"en\",\n        \"description\": \"There is build in @@_ui_locale variable but it shows language variations like en_GB, en_US etc. We don't want that.\"\n    },\n    \"application_description\": \n    {\n        \"message\": \"Chrome拡張機能をグループ化し、用途によってカンタンに切り替えられます。\"\n    },\n    \"all_extensions\": \n    {\n        \"message\": \"すべての拡張機能\"\n    },\n    \"highlight_ungrouped_extensions\": \n    {\n        \"message\": \"グループに追加されていない拡張機能をハイライト表示する\"\n    },\n    \"create_new_context\": \n    {\n        \"message\": \"新しいグループを作成\"\n    },\n    \"edit_context\": \n    {\n        \"message\": \"グループを編集\"\n    },\n    \"name_field_is_required\": \n    {\n        \"message\": \"グループ名の入力は必須です。\"\n    },\n    \"this_name_is_already_in_use\": \n    {\n        \"message\": \"この名前はすでに使用されています。\"\n    },\n    \"pick_an_icon\": \n    {\n        \"message\": \"アイコンを選んで下さい。\"\n    },\n    \"available_extensions\": \n    {\n        \"message\": \"利用可能な拡張機能\"\n    },\n    \"always_enabled_extensions\": \n    {\n        \"message\": \"常時有効にする拡張機能\"\n    },\n    \"name\": \n    {\n        \"message\": \"グループ名\"\n    },\n    \"options\": \n    {\n        \"message\": \"オプション\"\n    },\n    \"icon\": \n    {\n        \"message\": \"アイコン\"\n    },\n    \"context_will_be_deleted\": \n    {\n        \"message\": \"Contextが消去されます。よろしいですか？\"\n    },\n    \"additional_options\": \n    {\n        \"message\": \"追加オプション\"\n    },\n    \"new_context\": \n    {\n        \"message\": \"新しいグループ\"\n    },\n    \"save\": \n    {\n        \"message\": \"保存\"\n    },\n    \"about\": \n    {\n        \"message\": \"Contextについて\"\n    },\n    \"configuration_import_export\": \n    {\n        \"message\": \"設定のインポート/エクスポート\"\n    },\n    \"configuration_import\": \n    {\n        \"message\": \"設定のインポート\"\n    },\n    \"configuration_export_description\": \n    {\n        \"message\": \"設定をすべてエクスポートするには、下記ボックスに表示されるエンコードされた文字列をコピーします。\"\n    },\n    \"configuration_import_description\": \n    {\n        \"message\": \"設定の文字列を下記ボックスに貼り付け、「インポート」をクリックすると設定が反映されます。\"\n    },\n    \"confirm_configuration_import\": \n    {\n        \"message\": \"インポートすると現在の設定が無効になります。現在の設定を残しておきたい場合はバックアップを取っておいてください。\"\n    },\n    \"import\": \n    {\n        \"message\": \"インポート\"\n    },\n    \"override_current_settings\": \n    {\n        \"message\": \"現在の設定を無効にしますか？\"\n    },\n    \"import_failed\": \n    {\n        \"message\": \"インポートに失敗しました\"\n    },\n    \"configuration_string_is_invalid\": \n    {\n        \"message\": \"ごめんなさい、いただいた設定の文字列は無効です。インポートに失敗しました。\"\n    },\n    \"successful_import\": \n    {\n        \"message\": \"インポートに成功しました\"\n    },\n    \"configuration_was_imported_successfuly\": \n    {\n        \"message\": \"設定のインポートに成功しました。\"\n    },\n    \"some_extensions_were_ignored\": \n    {\n        \"message\": \"設定がインポートされた拡張機能のうち、いくつかはインポートが無視されました。インポートが無視された設定は、拡張機能がインストールされていないようです。:\"\n    },\n    \"override_server_settings\": \n    {\n        \"message\": \"Override configuration on server?\"\n    },\n    \"confirm_chrome_sync_configuration_export\": \n    {\n        \"message\": \"This will override your current configuration kept in Chrome Sync. Do you want to proceed?\"\n    },\n    \"manual\": \n    {\n        \"message\": \"Manual\"\n    },\n    \"chrome_sync\": \n    {\n        \"message\": \"Chrome Sync\"\n    },\n    \"save_on_server\": \n    {\n        \"message\": \"Save on server\"\n    },\n    \"load_from_server\": \n    {\n        \"message\": \"Load from server\"\n    },\n    \"saved\": \n    {\n        \"message\": \"Saved\"\n    },\n    \"enable_apps_support\": \n    {\n        \"message\": \"Chrome WEBアプリも対象にする (デフォルトは拡張機能のみ対象)\"\n    },\n    \"show_all_extensions_button\": \n    {\n        \"message\": \"ポップアップメニューに「すべての拡張機能」を表示する\"\n    },\n    \"delay_after_enabling_extension\": \n    {\n        \"message\": \"各拡張機能を有効にした後、数ミリ秒間遅らせる\"\n    },\n    \"context_options\": \n    {\n        \"message\": \"Context - オプション\"\n    },\n    \"remove_context\": \n    {\n        \"message\": \"グループを削除しますか？\"\n    },\n    \"cancel\": \n    {\n        \"message\": \"キャンセル\"\n    },\n    \"edit\": \n    {\n        \"message\": \"編集\"\n    },\n    \"create\": \n    {\n        \"message\": \"作成\"\n    },\n    \"delete\": \n    {\n        \"message\": \"削除\"\n    },\n    \"clone\": \n    {\n        \"message\": \"複製する\"\n    },\n    \"move\": \n    {\n        \"message\": \"移動する\"\n    },\n    \"extension_is_loading\": \n    {\n        \"message\": \"拡張機能を読み込んでいます。 ...\"\n    },\n    \"new_extension_installed_action\": \n    {\n        \"message\": \"新しい拡張機能をインストールした直後の動作設定\"\n    },\n    \"ask_what_to_do\": \n    {\n        \"message\": \"何をしたら良いか通知する\"\n    },\n    \"add_to_all_contexts\": \n    {\n        \"message\": \"この拡張機能をすべてのグループへ追加\"\n    },\n    \"add_to_always_enabled\": \n    {\n        \"message\": \"「常時有効にする拡張機能」へ追加'\"\n    },\n    \"do_nothing\": \n    {\n        \"message\": \"何もしない\"\n    },\n    \"extension_installed_1\": \n    {\n        \"message\": \"新しい拡張機能がインストールされました\"\n    },\n    \"extension_installed_2\": \n    {\n        \"message\": \"インストールされました\"\n    },\n    \"add_to_contexts\": \n    {\n        \"message\": \"この拡張機能を以下のグループへ追加\"\n    },\n    \"or_add_it_to\": \n    {\n        \"message\": \"または追加\"\n    },\n    \"font\": \n    {\n        \"message\": \"フォント\"\n    },\n    \"icons\": \n    {\n        \"message\": \"アイコン\"\n    },\n    \"icon_flip_animation\": \n    {\n        \"message\": \"アイコンフリップ アニメーション\"\n    },\n    \"programmer\": \n    {\n        \"message\": \"プログラマー\"\n    },\n    \"source_code\": \n    {\n        \"message\": \"ソースコード\"\n    },\n    \"translations\": \n    {\n        \"message\": \"翻訳\"\n    },\n    \"welcome\": \n    {\n        \"message\": \"はじめに\"\n    },\n    \"welcome_step_1\": \n    {\n        \"message\": \"インストールしてくれてありがとう！ これからこの拡張機能で、拡張機能のグループ（コンテクスト）を作成します。いずれのグループも、作成する際に名前とアイコンを選ぶことができます。\"\n    },\n    \"welcome_step_2\": \n    {\n        \"message\": \"グループを作成したら、拡張機能をグループへ追加しましょう。グループへの追加はドラッグアンドドロップでおこなえます。Google Chromeに追加されている拡張機能は、上部のボックスにアルファベット順に並んでいます。ここから下にあるグループごとのボックスへ拡張機能を追加します。\"\n    },\n    \"welcome_step_3\": \n    {\n        \"message\": \"「利用可能な拡張機能」ボックスから「常時有効にする拡張機能」ボックスへ、すべての拡張機能を移動させることによって、すべてのグループで移動させた拡張機能を有効にすることができます。\"\n    },\n    \"welcome_step_4\": \n    {\n        \"message\": \"設定を保存することで、ツールバーのアイコンからカンタンにグループを変更することができます。メニューボタンに表示するグループ名とアイコンを選択し、＋/ーボタンを押すことで　有効/無効 を切り替えることができます。複数のグループを同時に選択することも可能です。\"\n    },\n    \"next\": \n    {\n        \"message\": \"次へ\"\n    },\n    \"previous\": \n    {\n        \"message\": \"前へ\"\n    },\n    \"close\": \n    {\n        \"message\": \"閉じる\"\n    },\n    \"show_extension_icon\": \n    {\n        \"message\": \"In the popup use icon of the first extension instead of the context icon.\"\n    },\n    \"open_notification\": \n    {\n        \"message\": \"Click here to decide what contexts you want to add it to.\"\n    }\n}"
  },
  {
    "path": "_locales/pl/messages.json",
    "content": "{\n    \"locale\": \n    {\n        \"message\": \"pl\",\n        \"description\": \"Istnieje wbudowana zmienna @@_ui_locale która zawiera tą informacje, ale jest ona zbyt dokładna jak na nasze potrzeby (en_GB, en_US).\"\n    },\n    \"application_description\": \n    {\n        \"message\": \"Połącz swoje rozszerzenia w grupy i wygodnie przełączaj się między nimi.\"\n    },\n    \"all_extensions\": \n    {\n        \"message\": \"Wszystkie dodatki\"\n    },\n    \"highlight_ungrouped_extensions\": \n    {\n        \"message\": \"podświetl niepogrupowane rozszerzenia\"\n    },\n    \"create_new_context\": \n    {\n        \"message\": \"Nowy kontekst\"\n    },\n    \"edit_context\": \n    {\n        \"message\": \"Edytuj kontekst\"\n    },\n    \"name_field_is_required\": \n    {\n        \"message\": \"Nazwa jest wymagana.\"\n    },\n    \"this_name_is_already_in_use\": \n    {\n        \"message\": \"Nazwa jest już zajęta.\"\n    },\n    \"pick_an_icon\": \n    {\n        \"message\": \"Wybierz ikonę.\"\n    },\n    \"available_extensions\": \n    {\n        \"message\": \"Dostępne rozszerzenia\"\n    },\n    \"always_enabled_extensions\": \n    {\n        \"message\": \"Zawsze aktywne rozszerzenia\"\n    },\n    \"name\": \n    {\n        \"message\": \"Nazwa\"\n    },\n    \"options\": \n    {\n        \"message\": \"Ustawienia\"\n    },\n    \"icon\": \n    {\n        \"message\": \"Ikona\"\n    },\n    \"context_will_be_deleted\": \n    {\n        \"message\": \"Kontekst zostanie usunięty. Kontynuować?\"\n    },\n    \"additional_options\": \n    {\n        \"message\": \"Opcje dodatkowe\"\n    },\n    \"new_context\": \n    {\n        \"message\": \"Nowy kontekst\"\n    },\n    \"save\": \n    {\n        \"message\": \"Zapisz\"\n    },\n    \"about\": \n    {\n        \"message\": \"O tym dodatku\"\n    },\n    \"configuration_import_export\": \n    {\n        \"message\": \"Import/export/synchronizacja konfiguracji\"\n    },\n    \"configuration_import\": \n    {\n        \"message\": \"Import konfiguracji\"\n    },\n    \"configuration_export_description\": \n    {\n        \"message\": \"Aby eksportować wszystkie ustawienia, skopiuj konfigurację z poniższego pola.\"\n    },\n    \"configuration_import_description\": \n    {\n        \"message\": \"Aby importować ustawienia wklej konfigurację do poniższego pola a następnie kliknij 'Import'.\"\n    },\n    \"confirm_configuration_import\": \n    {\n        \"message\": \"Import nadpisze obecne ustawienia, jeżeli nie chcesz ich stracić pamiętaj o zrobieniu kopii zapasowej.\"\n    },\n    \"import\": \n    {\n        \"message\": \"Import\"\n    },\n    \"override_current_settings\": \n    {\n        \"message\": \"Nadpisać obecne ustawienia?\"\n    },\n    \"import_failed\": \n    {\n        \"message\": \"Import nie powiódł się\"\n    },\n    \"configuration_string_is_invalid\": \n    {\n        \"message\": \"Podana konfiguracja nie jest prawidłowa, import nie powiódł się.\"\n    },\n    \"successful_import\": \n    {\n        \"message\": \"Import zakończony sukcesem\"\n    },\n    \"configuration_was_imported_successfuly\": \n    {\n        \"message\": \"Konfiguracja została zaimportowana poprawnie.\"\n    },\n    \"some_extensions_were_ignored\": \n    {\n        \"message\": \"Niektóre rozszerzenia z importowanej konfiguracji zostały pominięte ponieważ nie są zainstalowane:\"\n    },\n    \"override_server_settings\": \n    {\n        \"message\": \"Nadpisać konfigurację na serwerze?\"\n    },\n    \"confirm_chrome_sync_configuration_export\": \n    {\n        \"message\": \"Ta akcja spowoduje nadpisanie istniejących ustawień zapisanych na serwerze. Kontynuować?\"\n    },\n    \"manual\": \n    {\n        \"message\": \"Ręcznie\"\n    },\n    \"chrome_sync\": \n    {\n        \"message\": \"Chrome Sync\"\n    },\n    \"save_on_server\": \n    {\n        \"message\": \"Wyślij na swerwer\"\n    },\n    \"load_from_server\": \n    {\n        \"message\": \"Załaduj z serwera\"\n    },\n    \"saved\": \n    {\n        \"message\": \"Zapisano\"\n    },\n    \"enable_apps_support\": \n    {\n        \"message\": \"włącz obsługę aplikacji (domyślnie jedynie rozszerzenia są obsługiwane)\"\n    },\n    \"show_all_extensions_button\": \n    {\n        \"message\": \"pokaż przycisk 'Wszystkie dodatki' w popup'ie\"\n    },\n    \"delay_after_enabling_extension\": \n    {\n        \"message\": \"opóźnienie w milisekundach po uaktywnieniu każdego rozszerzenia\"\n    },\n    \"context_options\": \n    {\n        \"message\": \"Context - Ustawienia\"\n    },\n    \"remove_context\": \n    {\n        \"message\": \"Usunać kontekst?\"\n    },\n    \"cancel\": \n    {\n        \"message\": \"Anuluj\"\n    },\n    \"edit\": \n    {\n        \"message\": \"Edytuj\"\n    },\n    \"create\": \n    {\n        \"message\": \"Utwórz\"\n    },\n    \"delete\": \n    {\n        \"message\": \"Usuń\"\n    },\n    \"clone\": \n    {\n        \"message\": \"Duplikuj\"\n    },\n    \"move\": \n    {\n        \"message\": \"Przenieś\"\n    },\n    \"extension_is_loading\": \n    {\n        \"message\": \"Ładowanie rozszerzenia ...\"\n    },\n    \"new_extension_installed_action\": \n    {\n        \"message\": \"po instalacji nowego rozszerzenia\"\n    },\n    \"ask_what_to_do\": \n    {\n        \"message\": \"zapytaj co robić\"\n    },\n    \"add_to_all_contexts\": \n    {\n        \"message\": \"dodaj do wszystkich kontekstów\"\n    },\n    \"add_to_always_enabled\": \n    {\n        \"message\": \"dodaj do 'zawsze aktywnych'\"\n    },\n    \"do_nothing\": \n    {\n        \"message\": \"nie rób nic\"\n    },\n    \"extension_installed_1\": \n    {\n        \"message\": \"Nowe rozszerzenie\"\n    },\n    \"extension_installed_2\": \n    {\n        \"message\": \"zostało zainstalowane\"\n    },\n    \"add_to_contexts\": \n    {\n        \"message\": \"Dodaj je do wybranych kontekstów\"\n    },\n    \"or_add_it_to\": \n    {\n        \"message\": \"lub dodaj do\"\n    },\n    \"font\": \n    {\n        \"message\": \"Czcionka\"\n    },\n    \"icons\": \n    {\n        \"message\": \"Ikony\"\n    },\n    \"icon_flip_animation\": \n    {\n        \"message\": \"Animacja obrotu ikony\"\n    },\n    \"programmer\": \n    {\n        \"message\": \"Programista\"\n    },\n    \"source_code\": \n    {\n        \"message\": \"Kod źródłowy\"\n    },\n    \"translations\": \n    {\n        \"message\": \"Tłumaczenia\"\n    },\n    \"welcome\": \n    {\n        \"message\": \"Witaj\"\n    },\n    \"welcome_step_1\": \n    {\n        \"message\": \"Witaj! Pracę z tym dodatkiem zacznij od stworzenia kontekstów (grup dodatków). Dla każdego z kontekstów wybierz nazwę i ikonę.\"\n    },\n    \"welcome_step_2\": \n    {\n        \"message\": \"Aby dodać dodatki do kontekstów przeciągnij je z górnej, alfabetycznej listy do wybranego boksu reprezentującego kontekst.\"\n    },\n    \"welcome_step_3\": \n    {\n        \"message\": \"Przenieś dodatki które powinny być aktywne dla każdego z kontekstów z boksu 'Dostępne rozszerzenia' do boksu 'Zawsze aktywne rozszerzenia'.\"\n    },\n    \"welcome_step_4\": \n    {\n        \"message\": \"Zapisz ustawienia i gotowe! Możesz łatwo przełączać się pomiędzy kontekstami za pomocą ikony w pasku Twojej przeglądarki. Wybranie nazwy z menu przełącza do danego kontekstu. Wybranie przycisku plusa/minusa powoduje aktywację/dezaktywację kontekstu co pozwala na łączenie kontekstów ze sobą.\"\n    },\n    \"next\": \n    {\n        \"message\": \"Dalej\"\n    },\n    \"previous\": \n    {\n        \"message\": \"Wstecz\"\n    },\n    \"close\": \n    {\n        \"message\": \"Zamknij\"\n    },\n    \"show_extension_icon\": \n    {\n        \"message\": \"W popup'ie użyj ikony pierwszego dodatku zamiast ikony kontekstu.\"\n    },\n    \"open_notification\": \n    {\n        \"message\": \"Kliknij tutaj aby zadecydować do jakich kontekstów checsz je dodać.\"\n    }\n}"
  },
  {
    "path": "_locales/pt_BR/messages.json",
    "content": "{\n    \"locale\": \n    {\n        \"message\": \"en\",\n        \"description\": \"There is build in @@_ui_locale variable but it shows language variations like en_GB, en_US etc. We don't want that.\"\n    },\n    \"application_description\": \n    {\n        \"message\": \"Separe as extensões em grupos e facilmente alterne entre eles.\"\n    },\n    \"all_extensions\": \n    {\n        \"message\": \"Todas as extensões\"\n    },\n    \"highlight_ungrouped_extensions\": \n    {\n        \"message\": \"Destacar extensões sem grupo\"\n    },\n    \"create_new_context\": \n    {\n        \"message\": \"Criar novo contexto\"\n    },\n    \"edit_context\": \n    {\n        \"message\": \"Editar contexto\"\n    },\n    \"name_field_is_required\": \n    {\n        \"message\": \"O campo Nome é obrigatório.\"\n    },\n    \"this_name_is_already_in_use\": \n    {\n        \"message\": \"Esse nome já está em uso.\"\n    },\n    \"pick_an_icon\": \n    {\n        \"message\": \"Escolha um ícone.\"\n    },\n    \"available_extensions\": \n    {\n        \"message\": \"Extensões disponíveis\"\n    },\n    \"always_enabled_extensions\": \n    {\n        \"message\": \"Extensões sempre ativas\"\n    },\n    \"name\": \n    {\n        \"message\": \"Nome\"\n    },\n    \"options\": \n    {\n        \"message\": \"Opções\"\n    },\n    \"icon\": \n    {\n        \"message\": \"Ícone\"\n    },\n    \"context_will_be_deleted\": \n    {\n        \"message\": \"O contexto será excluído. Você tem certeza?\"\n    },\n    \"additional_options\": \n    {\n        \"message\": \"Opções adicionais\"\n    },\n    \"new_context\": \n    {\n        \"message\": \"Novo Contexto\"\n    },\n    \"save\": \n    {\n        \"message\": \"Salvar\"\n    },\n    \"about\": \n    {\n        \"message\": \"Sobre\"\n    },\n    \"configuration_import_export\": \n    {\n        \"message\": \"Importar/exportar as configurações\"\n    },\n    \"configuration_import\": \n    {\n        \"message\": \"Importar configuração\"\n    },\n    \"configuration_export_description\": \n    {\n        \"message\": \"Para exportar todas as suas configurações, copie o código de configuração na caixa abaixo.\"\n    },\n    \"configuration_import_description\": \n    {\n        \"message\": \"Cole o código de configuração na caixa abaixo e clique em 'Importar' para restaurar sua configuração.\"\n    },\n    \"confirm_configuration_import\": \n    {\n        \"message\": \"A importação irá sobrescrever a sua configuração atual, certifique-se de que fez um backup se você não quer perdê-la.\"\n    },\n    \"import\": \n    {\n        \"message\": \"Importar\"\n    },\n    \"override_current_settings\": \n    {\n        \"message\": \"Sobrescrever a configuração atual?\"\n    },\n    \"import_failed\": \n    {\n        \"message\": \"Falha na importação\"\n    },\n    \"configuration_string_is_invalid\": \n    {\n        \"message\": \"Desculpe, o código de configuração informado é inválido. A importação falhou.\"\n    },\n    \"successful_import\": \n    {\n        \"message\": \"Importação concluída\"\n    },\n    \"configuration_was_imported_successfuly\": \n    {\n        \"message\": \"A configuração foi importada com sucesso.\"\n    },\n    \"some_extensions_were_ignored\": \n    {\n        \"message\": \"Algumas extensões da configuração importada foram ignoradas porque não estão mais instaladas:\"\n    },\n    \"override_server_settings\": \n    {\n        \"message\": \"Sobrescrever a configuração no servidor?\"\n    },\n    \"confirm_chrome_sync_configuration_export\": \n    {\n        \"message\": \"Sua configuração atual mantida no Chrome Sync será substituída. Você deseja continuar?\"\n    },\n    \"manual\": \n    {\n        \"message\": \"Manual\"\n    },\n    \"chrome_sync\": \n    {\n        \"message\": \"Chrome Sync\"\n    },\n    \"save_on_server\": \n    {\n        \"message\": \"Salvar no servidor\"\n    },\n    \"load_from_server\": \n    {\n        \"message\": \"Carregar do servidor\"\n    },\n    \"saved\": \n    {\n        \"message\": \"Salvo\"\n    },\n    \"enable_apps_support\": \n    {\n        \"message\": \"Ativar suporte a aplicativos (por padrão, somente extensões são suportadas)\"\n    },\n    \"show_all_extensions_button\": \n    {\n        \"message\": \"Mostrar o botão 'Todas as extensões' no popup\"\n    },\n    \"delay_after_enabling_extension\": \n    {\n        \"message\": \"espera em milisegundos após ativar cada extensão\"\n    },\n    \"context_options\": \n    {\n        \"message\": \"Contexto - Opções\"\n    },\n    \"remove_context\": \n    {\n        \"message\": \"Remover contexto?\"\n    },\n    \"cancel\": \n    {\n        \"message\": \"Cancelar\"\n    },\n    \"edit\": \n    {\n        \"message\": \"Editar\"\n    },\n    \"create\": \n    {\n        \"message\": \"Criar\"\n    },\n    \"delete\": \n    {\n        \"message\": \"Excluir\"\n    },\n    \"clone\": \n    {\n        \"message\": \"Clonar\"\n    },\n    \"move\": \n    {\n        \"message\": \"Mover\"\n    },\n    \"extension_is_loading\": \n    {\n        \"message\": \"Carregando extensão...\"\n    },\n    \"new_extension_installed_action\": \n    {\n        \"message\": \"quando nova extensão for instalada\"\n    },\n    \"ask_what_to_do\": \n    {\n        \"message\": \"Perguntar o que fazer\"\n    },\n    \"add_to_all_contexts\": \n    {\n        \"message\": \"Incluir a extensão em todos os contextos\"\n    },\n    \"add_to_always_enabled\": \n    {\n        \"message\": \"Incluir em 'sempre ativas'\"\n    },\n    \"do_nothing\": \n    {\n        \"message\": \"Não fazer nada\"\n    },\n    \"extension_installed_1\": \n    {\n        \"message\": \"Nova extensão\"\n    },\n    \"extension_installed_2\": \n    {\n        \"message\": \"instalada\"\n    },\n    \"add_to_contexts\": \n    {\n        \"message\": \"Incluí-la nos seguintes contextos\"\n    },\n    \"or_add_it_to\": \n    {\n        \"message\": \"ou incluí-la em\"\n    },\n    \"font\": \n    {\n        \"message\": \"Fonte\"\n    },\n    \"icons\": \n    {\n        \"message\": \"Ícones\"\n    },\n    \"icon_flip_animation\": \n    {\n        \"message\": \"Animação do ícone\"\n    },\n    \"programmer\": \n    {\n        \"message\": \"Programador\"\n    },\n    \"source_code\": \n    {\n        \"message\": \"Código fonte\"\n    },\n    \"translations\": \n    {\n        \"message\": \"Traduções\"\n    },\n    \"welcome\": \n    {\n        \"message\": \"Bem vindo\"\n    },\n    \"welcome_step_1\": \n    {\n        \"message\": \"Bem vindo! Para começar a trabalhar com essa extensão, crie os contextos (grupos de extensões). Para cada contexto escolha um nome e um ícone.\"\n    },\n    \"welcome_step_2\": \n    {\n        \"message\": \"Para conectar extensões aos contextos, arraste-as da listagem alfabética no topo da página para a caixa representando o contexto escolhido.\"\n    },\n    \"welcome_step_3\": \n    {\n        \"message\": \"Mova todas as extensões que deverão estar ativas em todos os contextos da caixa 'Extensões disponíveis' para a caixa 'Extensões sempre ativas'.\"\n    },\n    \"welcome_step_4\": \n    {\n        \"message\": \"Salve suas configurações e você terminou! Você pode alterar facilmente entre os contextos usando o ícone na barra de tarefas. Selecionando no menu o nome ou o ícone do contexto alterna para o contexto. Clicando nos botões mais/menos é possível ativar/desativar os contextos, permitindo mesclar um contexto com outros.\"\n    },\n    \"next\": \n    {\n        \"message\": \"Próximo\"\n    },\n    \"previous\": \n    {\n        \"message\": \"Anterior\"\n    },\n    \"close\": \n    {\n        \"message\": \"Fechar\"\n    },\n    \"show_extension_icon\": \n    {\n        \"message\": \"Mostrar no menu o ícone da primeira extensão ao invés do ícone do contexto.\"\n    },\n    \"open_notification\": \n    {\n        \"message\": \"Clique aqui para selecionar o contexto para adicioná-la.\"\n    }\n}\n"
  },
  {
    "path": "_locales/zh_CN/messages.json",
    "content": "{\n    \"locale\": \n    {\n        \"message\": \"zh_CN\",\n        \"description\": \"浏览器内建 @@_ui_locale 变量，显示语言的变体如 en_GB 、en_US 等，我们并不需要。\"\n    },\n    \"application_description\": \n    {\n        \"message\": \"分组排序扩展并轻易切换。\"\n    },\n    \"all_extensions\": \n    {\n        \"message\": \"所有扩展\"\n    },\n    \"highlight_ungrouped_extensions\": \n    {\n        \"message\": \"高亮尚未分组的扩展\"\n    },\n    \"create_new_context\": \n    {\n        \"message\": \"建立新的 Context\"\n    },\n    \"edit_context\": \n    {\n        \"message\": \"编辑 Context\"\n    },\n    \"name_field_is_required\": \n    {\n        \"message\": \"必须填写名称。\"\n    },\n    \"this_name_is_already_in_use\": \n    {\n        \"message\": \"这个名称已被使用。\"\n    },\n    \"pick_an_icon\": \n    {\n        \"message\": \"选择一个图标。\"\n    },\n    \"available_extensions\": \n    {\n        \"message\": \"可用扩展\"\n    },\n    \"always_enabled_extensions\": \n    {\n        \"message\": \"保持启用扩展\"\n    },\n    \"name\": \n    {\n        \"message\": \"名称\"\n    },\n    \"options\": \n    {\n        \"message\": \"选项\"\n    },\n    \"icon\": \n    {\n        \"message\": \"图标\"\n    },\n    \"context_will_be_deleted\": \n    {\n        \"message\": \"Context 将被删除，是否确定？\"\n    },\n    \"additional_options\": \n    {\n        \"message\": \"附加选项\"\n    },\n    \"new_context\": \n    {\n        \"message\": \"新建 Context\"\n    },\n    \"save\": \n    {\n        \"message\": \"保存\"\n    },\n    \"about\": \n    {\n        \"message\": \"关于\"\n    },\n    \"configuration_import_export\": \n    {\n        \"message\": \"导入/导出配置\"\n    },\n    \"configuration_import\": \n    {\n        \"message\": \"配置导入\"\n    },\n    \"configuration_export_description\": \n    {\n        \"message\": \"要导出你的配置，从下面的文本框复制经过编码的配置字符串。\"\n    },\n    \"configuration_import_description\": \n    {\n        \"message\": \"粘帖配置字符串到下面的文本框并点击 ‘导入’ 来还原你的配置。\"\n    },\n    \"confirm_configuration_import\": \n    {\n        \"message\": \"导入操作会覆盖你当前配置，请确保执行备份以免丢失。\"\n    },\n    \"import\": \n    {\n        \"message\": \"导入\"\n    },\n    \"override_current_settings\": \n    {\n        \"message\": \"覆盖当前设置？\"\n    },\n    \"import_failed\": \n    {\n        \"message\": \"导入失败\"\n    },\n    \"configuration_string_is_invalid\": \n    {\n        \"message\": \"抱歉，所提供的配置字符串无效。导入失败！\"\n    },\n    \"successful_import\": \n    {\n        \"message\": \"导入成功\"\n    },\n    \"configuration_was_imported_successfuly\": \n    {\n        \"message\": \"配置成功导入。\"\n    },\n    \"some_extensions_were_ignored\": \n    {\n        \"message\": \"您所导入配置中的一些扩展由于还没有安装而被忽略：\"\n    },\n    \"override_server_settings\": \n    {\n        \"message\": \"Override configuration on server?\"\n    },\n    \"confirm_chrome_sync_configuration_export\": \n    {\n        \"message\": \"This will override your current configuration kept in Chrome Sync. Do you want to proceed?\"\n    },\n    \"manual\": \n    {\n        \"message\": \"Manual\"\n    },\n    \"chrome_sync\": \n    {\n        \"message\": \"Chrome Sync\"\n    },\n    \"save_on_server\": \n    {\n        \"message\": \"Save on server\"\n    },\n    \"load_from_server\": \n    {\n        \"message\": \"Load from server\"\n    },\n    \"saved\": \n    {\n        \"message\": \"Saved\"\n    },\n    \"enable_apps_support\": \n    {\n        \"message\": \"启用应用支持（默认仅仅支持扩展）\"\n    },\n    \"show_all_extensions_button\": \n    {\n        \"message\": \"弹出菜单显示‘所有扩展’\"\n    },\n    \"delay_after_enabling_extension\": \n    {\n        \"message\": \"启用每个扩展后等待的毫秒数\"\n    },\n    \"context_options\": \n    {\n        \"message\": \"Context - 选项\"\n    },\n    \"remove_context\": \n    {\n        \"message\": \"删除 Context ？\"\n    },\n    \"cancel\": \n    {\n        \"message\": \"取消\"\n    },\n    \"edit\": \n    {\n        \"message\": \"编辑\"\n    },\n    \"create\": \n    {\n        \"message\": \"建立\"\n    },\n    \"delete\": \n    {\n        \"message\": \"删除\"\n    },\n    \"clone\": \n    {\n        \"message\": \"克隆\"\n    },\n    \"move\": \n    {\n        \"message\": \"移动\"\n    },\n    \"extension_is_loading\": \n    {\n        \"message\": \"正在载入扩展。。。\"\n    },\n    \"new_extension_installed_action\": \n    {\n        \"message\": \"安装新的扩展之后\"\n    },\n    \"ask_what_to_do\": \n    {\n        \"message\": \"询问如何处理\"\n    },\n    \"add_to_all_contexts\": \n    {\n        \"message\": \"添加到所有的 Context\"\n    },\n    \"add_to_always_enabled\": \n    {\n        \"message\": \"添加到 '永远启用'\"\n    },\n    \"do_nothing\": \n    {\n        \"message\": \"什么也不要做\"\n    },\n    \"extension_installed_1\": \n    {\n        \"message\": \"新的扩展\"\n    },\n    \"extension_installed_2\": \n    {\n        \"message\": \"已经安装\"\n    },\n    \"add_to_contexts\": \n    {\n        \"message\": \"把它添加到以下 Context\"\n    },\n    \"or_add_it_to\": \n    {\n        \"message\": \"或者添加到\"\n    },\n    \"font\": \n    {\n        \"message\": \"字体\"\n    },\n    \"icons\": \n    {\n        \"message\": \"图标\"\n    },\n    \"icon_flip_animation\": \n    {\n        \"message\": \"图标翻转动画\"\n    },\n    \"programmer\": \n    {\n        \"message\": \"开发\"\n    },\n    \"source_code\": \n    {\n        \"message\": \"源代码\"\n    },\n    \"translations\": \n    {\n        \"message\": \"翻译\"\n    },\n    \"welcome\": \n    {\n        \"message\": \"欢迎\"\n    },\n    \"welcome_step_1\": \n    {\n        \"message\": \"欢迎！开始使用这个扩展之前，请先建立 Context （扩展组），并为每个 Context 选择一个名字和一个图标。\"\n    },\n    \"welcome_step_2\": \n    {\n        \"message\": \"分组扩展，请从顶部按字母顺序排列的列表中拖拽扩展到相应的 Context 框中。\"\n    },\n    \"welcome_step_3\": \n    {\n        \"message\": \"从 “可用扩展” 移动那些每个 Context 都应启用的扩展到 “保持启用扩展”。\"\n    },\n    \"welcome_step_4\": \n    {\n        \"message\": \"保存配置即可！你可以使用工具栏上的图标轻易地在 Contexts 之间进行切换。通过选择菜单上的 Context 名称或者图标来切换到相应的 Context。点击 + 或者 - 号按钮激活或者关闭相应的 Context，这允许你混合使用各个不同的 Contexts。\"\n    },\n    \"next\": \n    {\n        \"message\": \"前进\"\n    },\n    \"previous\": \n    {\n        \"message\": \"后退\"\n    },\n    \"close\": \n    {\n        \"message\": \"关闭\"\n    },\n    \"show_extension_icon\": \n    {\n        \"message\": \"In the popup use icon of the first extension instead of the context icon.\"\n    },\n    \"open_notification\": \n    {\n        \"message\": \"Click here to decide what contexts you want to add it to.\"\n    }\n}"
  },
  {
    "path": "background.html",
    "content": "<html>\n<head>\n\t<script src=\"js/libs/jquery-1.7.1.min.js\"></script>\n\n\t<script src=\"js/classes/Configuration.class.js\"></script>\n\t<script src=\"js/classes/ExtensionsManager.class.js\"></script>\n\t<script src=\"js/classes/ContextsManager.class.js\"></script>\n\t<script src=\"js/classes/IconAnimation.class.js\"></script>\n\t<script src=\"js/classes/ExtensionNotification.class.js\"></script>\n\n\t<script src='js/background.js' type='text/javascript'></script>\n</head>\n<body>\n\t<img id=\"image\" src=\"icons/context.png\" />\n\t<canvas id=\"canvas\" width=\"19\" height=\"19\"></canvas>\n</body>\n</html>"
  },
  {
    "path": "css/main.css",
    "content": "/*\n * HTML5 Boilerplate\n *\n * What follows is the result of much research on cross-browser styling.\n * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal,\n * Kroc Camen, and the H5BP dev community and team.\n */\n\n\n/* =============================================================================\n   Base\n   ========================================================================== */\n\n/*html { font-size: 100%; overflow-y: scroll; -webkit-overflow-scrolling: touch; -webkit-tap-highlight-color: rgba(0,0,0,0); -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }*/\n\nbody { margin: 0; font-size: 13px; line-height: 1.231; }\n\nbody, button, input, select, textarea { font-family: sans-serif; color: #222; }\n\n::selection { background: #f6a828; color: #fff; text-shadow: none; }\n\n\n/* =============================================================================\n   Links\n   ========================================================================== */\n\na { color: #00e; }\na:visited { color: #551a8b; }\na:focus { outline: thin dotted; }\n\n/* Improve readability when focused and hovered in all browsers: people.opera.com/patrickl/experiments/keyboard/test */\na:hover, a:active { outline: 0; }\n\n\n/* =============================================================================\n   Typography\n   ========================================================================== */\n\nabbr[title] { border-bottom: 1px dotted; }\n\nb, strong { font-weight: bold; }\n\nblockquote { margin: 1em 40px; }\n\ndfn { font-style: italic; }\n\nhr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }\n\nins { background: #ff9; color: #000; text-decoration: none; }\n\nmark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }\n\n/* Redeclare monospace font family: en.wikipedia.org/wiki/User:Davidgothberg/Test59 */\npre, code, kbd, samp { font-family: monospace, monospace; _font-family: 'courier new', monospace; font-size: 1em; }\n\n/* Improve readability of pre-formatted text in all browsers */\npre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; }\n\nq { quotes: none; }\nq:before, q:after { content: \"\"; content: none; }\n\nsmall { font-size: 85%; }\n\n/* Position subscript and superscript content without affecting line-height: gist.github.com/413930 */\nsub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }\nsup { top: -0.5em; }\nsub { bottom: -0.25em; }\n\n\n/* =============================================================================\n   Lists\n   ========================================================================== */\n\nul, ol { margin: 1em 0; padding: 0 0 0 40px; }\ndd { margin: 0 0 0 40px; }\nnav ul, nav ol { list-style: none; margin: 0; padding: 0; }\n\n\n/* =============================================================================\n   Figures\n   ========================================================================== */\n\nfigure { margin: 0; }\n\n\n/* =============================================================================\n   Forms\n   ========================================================================== */\n\nform { margin: 0; }\nfieldset { border: 0; margin: 0; padding: 0; }\n\n/* Indicate that 'label' will shift focus to the associated form element */\nlabel { cursor: pointer; }\n\n/*\n * 1. Correct font-size not inheriting in all browsers\n * 2. Remove margins in FF3/4 S5 Chrome\n * 3. Define consistent vertical alignment display in all browsers\n */\n\nbutton, input, select, textarea { font-size: 100%; margin: 0; vertical-align: baseline; *vertical-align: middle; }\n\n/*\n * 1. Display hand cursor for clickable form elements\n * 2. Allow styling of clickable form elements in iOS\n */\n\nbutton, input[type=\"button\"], input[type=\"reset\"], input[type=\"submit\"] { cursor: pointer; -webkit-appearance: button; }\n\n/*\n * Consistent box sizing and appearance\n */\n\ninput[type=\"checkbox\"], input[type=\"radio\"] { box-sizing: border-box; }\ninput[type=\"search\"] { -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; }\n\n/* \n * Remove inner padding and border in FF3/4\n * www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/ \n */\n\nbutton::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }\n\n/* Remove default vertical scrollbar in IE6/7/8/9 */\ntextarea { overflow: auto; vertical-align: top; }\n\n/* Colors for form validity */\ninput:valid, textarea:valid {  }\ninput:invalid, textarea:invalid { background-color: #f0dddd; }\n\n\n/* =============================================================================\n   Tables\n   ========================================================================== */\n\ntable { border-collapse: collapse; border-spacing: 0; }\n\n\n/* =============================================================================\n   Primary styles\n   ========================================================================== */\n\n/*Fonts*/\n@font-face {\n  font-family: 'Andika';\n  font-style: normal;\n  font-weight: normal;\n  src: local('Andika'), url('../other/Andika.woff') format('woff');\n}\n/*Fonts*/\n\n/*jQuery UI*/\n.ui-selecting { background: #FECA40; }\n.ui-selected { background: #F39814; color: white; }\n.ui-selectable-helper { border: none; }\n/*jQuery UI*/\n\nh1 {\n\tmargin-top: 0;\n\tfont-size: 36px;\n\tfont-family: 'Andika';\n}\n\nh2 {\n\tfont-family: 'Andika';\n\tfont-size: 18px;\n\tfont-weight: normal;\n\tmargin: 10px;\n}\n\na {\n\tcolor: inherit;\n}\n\na:visited {\n\tcolor: inherit;\n}\n\n.wrapper {\n\tmargin: 15px;\n\tpadding: 10px;\n\tbox-shadow: #b3b3b3 0 0 25px;\n\tborder-radius: 5px; \n\tposition: relative;\n}\n\n#content {\n\tdisplay: none;\n}\n\n#loader {\n\tfont-family: 'Andika';\n}\n\n#new-context-form {\n}\n\n\t#new-context-form .dialog-label {\n\t\tfont-weight: bold;\n\t\tdisplay: block;\n\t\tmargin-top: 15px;\n\t\tmargin-bottom: 5px;\n\t}\n\n\t#new-context-form input.text {\n\t\twidth: 100%;\n\t\tpadding: 5px;\n\t}\n\n\t#new-context-form .errors {\n\t\tdisplay: none;\n\t}\n\n\t#new-context-form .errors p {\n\t\tmargin: 5px;\n\t}\n\n#dialog-confirm, #dialog-import-success {\n\tdisplay:none;\n}\n\n\t#dialog-import-success ul {\n\t\tlist-style: disc;\n\t}\n\n#context-icons {\n\tlist-style: none;\n    padding: 0 5px 5px 0;\n}\n\n\t#context-icons li {\n\t\tfloat: left;\n\t\twidth: 40px;\n\t\theight: 40px;\n\t\tcursor: pointer;\n\t\tmargin-left: 5px;\n\t\tmargin-top: 5px;\n\t}\n\n\t\t#context-icons li img {\n\t\t\tmargin-left: 4px;\n\t\t\tmargin-top: 4px;\n\t\t}\n\n#available_extensions_wrapper {\n\tposition: relative;\n\tpadding-left: 5px;\n\tpadding-right: 5px;\n}\n\n#always_enabled_extensions_wrapper {\n\tmargin-top: 10px;\n\tposition: relative;\n\tpadding-left: 5px;\n\tpadding-right: 5px;\n}\n\n.top-right-box {\n\tposition: absolute;\n\tright: 16px;\n\ttop: 14px;\n}\n\n.extensions_list {\n\tlist-style: none;\n    padding: 5px 0;\n    margin: 0 0 10px;\n}\n\n\t.extensions_list li, ul.contextExtensions li {\n\t\tpadding: 5px;\n\t\tline-height: 16px;\n\t\twidth: auto;\n\t\tmargin-top: 2px;\n\t\tcursor: move;\n\t}\n\t\n\t.extensions_list.active, ul.contextExtensions.active {\n\t\tbackground: url('ui-lightness/images/ui-bg_diagonals-thick.png') top left repeat;\n\t\tpadding-bottom: 30px;\n\t\tpadding-top: 30px;\n\t}\n\t\n\t.extensions_list.active_dense {\n\t\tbackground: url('ui-lightness/images/ui-bg_diagonals-thick.png') top left repeat;\n\t}\n\t\n\t.extensions_list.active_hover, ul.contextExtensions.active_hover {\n\t\tbackground: url('ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png') top left repeat;\n\t}\n\n\tul.contextExtensions li:first-child {\n\t\tmargin-top: 0;\n\t}\n\n\t.extensions_list li {\n\t\tfloat: left;\n\t\tmargin-left: 2px;\n\t}\n\n\t\t.extensions_list img, ul.contextExtensions li img {\n\t\t\tvertical-align: -3px;\n\t\t\twidth: 16px;\n\t\t\theight: 16px;\n\t\t}\n\n\t\t.extensions_list span.extensionName, ul.contextExtensions li span.extensionName {\n\t\t\tmargin-left: 5px;\n\t\t\tfont-size: 14px;\n\t\t\ttext-overflow:ellipsis;\n\t\t\toverflow:hidden;\n\t\t\twhite-space:nowrap;\n\t\t\tdisplay: inline-block;\n\t\t}\n\n\t\t.extensions_list span.extensionName {\n\t\t\twidth: 270px;\n\t\t}\n\n\t\t.extensions_list div.removeBtn {\n\t\t\tdisplay: none;\n\t\t}\n\n\t.extensions_list li.ui-state-active {\n\t\tfont-weight: normal;\n\t}\n\n#contexts {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\twidth: 100%;\n}\n\n#contexts li.context {\n\tpadding: 5px;\n\tfloat: left;\n\tdisplay: block;\n}\n\n\t#contexts li.context {\n\t\tmargin-right: 10px;\n\t\tmargin-top: 10px;\n\t\tposition: relative;\n\t}\n\n\t#contexts li.context:last-child {\n\t\tmargin-right: 0;\n\t}\n\n\t#contexts li.context span.contextTitle {\n\t\tfont-family: 'Andika';\n\t\tfont-size: 18px;\n\t\tline-height: 24px;\n\t\tmargin-left: 5px;\n\t\tvertical-align: 8px;\n\t\ttext-overflow:ellipsis;\n\t\toverflow:hidden;\n\t\twhite-space:nowrap;\n\t\tdisplay: inline-block;\n\t\twidth: 240px;\n\t}\n\n\t.contextMenu {\n\t\tposition: absolute;\n\t\tright: 5px;\n\t\ttop: 2px;\n\t}\n\n\t\t.contextMenu a, .contextMenu div {\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\t\t\tdisplay: inline-block;\n\t\t}\n\n\t\t\t.contextMenu a .ui-button-text {\n\t\t\t\tpadding: 0;\n\t\t\t}\n\n\t.contextGrip {\n\t\tcursor: move;\n\t}\n\n\tul.contextExtensions{\n\t\tlist-style: none;\n\t\tmargin: 10px 10px 10px 0;\n\t\tmin-height: 16px;\n\t\tpadding: 5px;\n\t}\n\n\t\tul.contextExtensions li {\n\t\t\tposition: relative;\n\t\t}\n\n\t\tul.contextExtensions div.removeBtn {\n\t\t\tright: 5px;\n\t\t\ttop: 3px;\n\t\t\tposition: absolute;\n\t\t\tcolor: #1c94c4;\n\t\t\tborder: none;\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\t\t\tbackground-color: transparent;\n\t\t\tcursor: pointer;\n\t\t}\n\n\t\tul.contextExtensions li span.extensionName {\n\t\t\twidth: 210px;\n\t\t}\n\n#help-icon {\n\tposition: absolute;\n\tright: 5px;\n\ttop: 5px;\n\tcursor: pointer;\n}\n\n#accordion {\n\tmargin-top: 30px;\n}\n\t#accordion ul {\n\t\tlist-style: none;\n\t\tpadding: 0;\n\t}\n\n\t#accordion li {\n\t\tmargin-top: 10px;\n\t}\n\n\t.hidden_feature {\n\t\tdisplay: none;\n\t}\n\n#welcome {\n\tdisplay: none;\n}\n\n\t#welcome ul {\n\t\tlist-style: none;\n\t\tpadding: 0;\n\t}\n\n\t\t#welcome div.picture {\n\t\t\twidth: 480px;\n\t\t\theight: 320px;\n\t\t\tborder: solid black 1px;\n\t\t}\n\n\t\t#welcome li.step_1 div.picture{\n\t\t\tbackground-image: url('../screenshots/__MSG_locale__/step_1.jpg');\n\t\t}\n\n\t\t#welcome li.step_2 div.picture{\n\t\t\tbackground-image: url('../screenshots/__MSG_locale__/step_2.jpg');\n\t\t}\n\n\t\t#welcome li.step_3 div.picture{\n\t\t\tbackground-image: url('../screenshots/__MSG_locale__/step_3.jpg');\n\t\t}\n\t\t\n\t\t#welcome li.step_4 div.picture{\n\t\t\tbackground-image: url('../screenshots/__MSG_locale__/step_4.jpg');\n\t\t}\n\n#footer {\n\tborder-top: solid silver 1px;\n\tpadding-top: 20px;\n\tmargin-top: 10px;\n}\n\n#popup {\n\twidth: 222px;\n}\n\n\t#popup * {\n\t\tbox-sizing: border-box;\n\t}\n\n\t#popup .screenContainer {\n\t\twidth: 200%;\n\t\t-webkit-transition: -webkit-transform 0.3s;\n\t\ttransition: transform 0.3s;\n\t\t-webkit-transform: translateX(0);\n\t\ttransform: translateX(0);\n\t}\n\n\t\t#popup .screenContainer.showExtensions {\n\t\t\t-webkit-transform: translateX(-50%);\n\t\t\ttransform: translateX(-50%);\n\t\t}\n\n\t\t#popup .screenContainer > div {\n\t\t\tmargin: 5px;\n\t\t\tfloat: left;\n\t\t}\n\n\t\t#popup #extensionsScreen .back-to-contexts {\n\t\t\tcursor: pointer;\n\t\t}\n\n\tul.simple-list {\n\t\tposition: relative;\n\t\tlist-style: none;\n\t\tlist-style-position: inside;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t\toverflow: hidden;\n\t}\n\n\t\tul.simple-list li {\n\t\t\tmargin: 0;\n\t\t\tmargin-top: 2px;\n\t\t\tcolor: #363636;\n\t\t\tfont-family: 'Andika';\n\t\t}\n\n\t\tul.simple-list li:first-child{\n\t\t\tmargin-top: 0;\n\t\t}\n\t\t\n\t\t\tul.simple-list li div.list-context {\n\t\t\t\tpadding: 2px 2px 2px 4px;\n\t\t\t\tcursor: pointer;\n\t\t\t\tfloat: left;\n\t\t\t\twidth: 145px;\n\t\t\t}\n\t\t\t\n\t\t\t\tul.simple-list li div.list-context span {\n\t\t\t\t\tmargin-left: 5px;\n\t\t\t\t}\n\n\t\t\tul.simple-list li div.list-item {\n\t\t\t\tpadding: 2px 2px 2px 4px;\n\t\t\t\tcursor: pointer;\n\t\t\t\twidth: 211px;\n\t\t\t}\n\n\t\t\t\tul.simple-list li div.list-item span {\n\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t}\n\n\t\t\t\tul.simple-list li div.list-item span.extension-name {\n\t\t\t\t\twidth: 180px;\n\t\t\t\t\twhite-space: nowrap;\n\t\t\t\t\toverflow: hidden;\n\t\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\t\tvertical-align: bottom;\n\t\t\t\t}\n\n\t\t\t\tul.simple-list li div.list-item span.ui-icon {\n\t\t\t\t\tvertical-align: bottom;\n\t\t\t\t}\n\n\t\t\t\tul.simple-list li div.list-item img {\n\t\t\t\t\tmargin-right: 5px;\n\t\t\t\t}\n\t\t\t\n\t\t\tul.simple-list li div.list-context.all-context {\n\t\t\t\tpadding-left: 6px;\n\t\t\t}\n\t\t\t\n\t\t\tul.simple-list li div.list-context.single-context {\n\t\t\t\tborder-left: solid 3px #FFA6A6;\n\t\t\t}\n\t\t\t\n\t\t\tul.simple-list li.status-partial div.list-context {\n\t\t\t\tborder-left-color: #FFCE3B;\n\t\t\t}\n\t\t\t\n\t\t\tul.simple-list li.status-all  div.list-context {\n\t\t\t\tborder-left-color: #00C700;\n\t\t\t}\n\t\t\t\n\t\t\tul.simple-list li div.list-button {\n\t\t\t\tcursor: pointer;\n\t\t\t\tfloat: left;\n\t\t\t\tpadding: 2px;\n\t\t\t}\n\n\tul.simple-list img{\n\t\twidth: 16px;\n\t\theight: 16px;\n\t\tvertical-align: -3px;\n\t}\n\n#notification {\n\tmargin: 7px;\n\tmin-height: 50px;\n}\n\n\t#notification ul.simple-list {\n\t\tmargin-bottom: 10px;\n\t}\n\n\t\t#notification ul.simple-list li div.list-context {\n\t\t\tfloat: none;\n\t\t\twidth: auto;\n\t\t}\n\n.inline-selectable {\n\tdisplay: inline-block;\n\tpadding: 2px;\n\tcursor: pointer;\n}\n\n#extensionName {\n\tcolor: #1c94c4;\n\tfont-weight: bold;\n}\n\n#social-buttons {\n\tposition: absolute;\n\tright: 0;\n\tbottom: 5px;\n}\n\n\t#fb_share {\n\t\tdisplay: inline-block;\n\t\tmargin-right: 10px;\n\t\tvertical-align: top;\n\t\theight: 25px;\n\t}\n\n#import-export-panel h2 {\n\tmargin-top: 15px;\n\tmargin-left: -10px;\n}\n\n#import-export-panel h2:nth-child(1) {\n\tmargin-top: 0;\n}\n\n#import_box, #export_box {\n\twidth: 100%;\n\theight: 40px;\n\toverflow-x: scroll;\n\toverflow-y: hidden;\n\tdisplay: block;\n}\n\n/* =============================================================================\n   Non-semantic helper classes\n   Please define your styles before this section.\n   ========================================================================== */\n\n/* For image replacement */\n.ir { display: block; text-indent: -999em; overflow: hidden; background-repeat: no-repeat; text-align: left; direction: ltr; }\n.ir br { display: none; }\n\n/* Hide for both screenreaders and browsers:\n   css-discuss.incutio.com/wiki/Screenreader_Visibility */\n.hidden { display: none; visibility: hidden; }\n\n/* Hide only visually, but have it available for screenreaders: by Jon Neal.\n  www.webaim.org/techniques/css/invisiblecontent/  &  j.mp/visuallyhidden */\n.visuallyhidden { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }\n\n/* Extends the .visuallyhidden class to allow the element to be focusable when navigated to via the keyboard: drupal.org/node/897638 */\n.visuallyhidden.focusable:active, .visuallyhidden.focusable:focus { clip: auto; height: auto; margin: 0; overflow: visible; position: static; width: auto; }\n\n/* Hide visually and from screenreaders, but maintain layout */\n.invisible { visibility: hidden; }\n\n/* Contain floats: nicolasgallagher.com/micro-clearfix-hack/ */ \n.clearfix:before, .clearfix:after { content: \"\"; display: table; }\n.clearfix:after { clear: both; }\n.clearfix { zoom: 1; }\n\n/* Color by status */\n.status-enabled { border-left: solid 3px #00C700 !important; }\n.status-disabled { border-left: solid 3px #FFA6A6 !important; }\n.float-left { float: left; }\n\n\n\n/* =============================================================================\n   PLACEHOLDER Media Queries for Responsive Design.\n   These override the primary ('mobile first') styles\n   Modify as content requires.\n   ========================================================================== */\n\n@media only screen and (min-width: 480px) {\n  /* Style adjustments for viewports 480px and over go here */\n\n}\n\n@media only screen and (min-width: 768px) {\n  /* Style adjustments for viewports 768px and over go here */\n\n}\n\n\n/* =============================================================================\n   Print styles.\n   Inlined to avoid required HTTP connection: www.phpied.com/delay-loading-your-print-css/\n   ========================================================================== */\n \n@media print {\n  * { background: transparent !important; color: black !important; text-shadow: none !important; filter:none !important; -ms-filter: none !important; } /* Black prints faster: sanbeiji.com/archives/953 */\n  a, a:visited { color: #444 !important; text-decoration: underline; }\n  a[href]:after { content: \" (\" attr(href) \")\"; }\n  abbr[title]:after { content: \" (\" attr(title) \")\"; }\n  .ir a:after, a[href^=\"javascript:\"]:after, a[href^=\"#\"]:after { content: \"\"; }  /* Don't show links for images, or javascript/internal links */\n  pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }\n  thead { display: table-header-group; } /* css-discuss.incutio.com/wiki/Printing_Tables */\n  tr, img { page-break-inside: avoid; }\n  img { max-width: 100% !important; }\n  @page { margin: 0.5cm; }\n  p, h2, h3 { orphans: 3; widows: 3; }\n  h2, h3{ page-break-after: avoid; }\n}\n"
  },
  {
    "path": "css/ui-lightness/jquery-ui-1.8.17.custom.css",
    "content": "/*\n * jQuery UI CSS Framework 1.8.17\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Theming/API\n */\n\n/* Layout helpers\n----------------------------------*/\n.ui-helper-hidden { display: none; }\n.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }\n.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }\n.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: \"\"; display: table; }\n.ui-helper-clearfix:after { clear: both; }\n.ui-helper-clearfix { zoom: 1; }\n.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }\n\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-disabled { cursor: default !important; }\n\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Overlays */\n.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }\n\n\n/*\n * jQuery UI CSS Framework 1.8.17\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Theming/API\n *\n * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px\n */\n\n\n/* Component containers\n----------------------------------*/\n.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; }\n.ui-widget .ui-widget { font-size: 1em; }\n.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; }\n.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }\n.ui-widget-content a { color: #333333; }\n.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }\n.ui-widget-header a { color: #ffffff; }\n\n/* Interaction states\n----------------------------------*/\n.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; }\n.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; }\n.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; }\n.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; }\n.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; }\n.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; }\n.ui-widget :active { outline: none; }\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; }\n.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }\n.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }\n.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }\n.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }\n.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }\n.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }\n.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }\n.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }\n.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); }\n.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); }\n.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }\n.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }\n.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); }\n.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); }\n\n/* positioning */\n.ui-icon-carat-1-n { background-position: 0 0; }\n.ui-icon-carat-1-ne { background-position: -16px 0; }\n.ui-icon-carat-1-e { background-position: -32px 0; }\n.ui-icon-carat-1-se { background-position: -48px 0; }\n.ui-icon-carat-1-s { background-position: -64px 0; }\n.ui-icon-carat-1-sw { background-position: -80px 0; }\n.ui-icon-carat-1-w { background-position: -96px 0; }\n.ui-icon-carat-1-nw { background-position: -112px 0; }\n.ui-icon-carat-2-n-s { background-position: -128px 0; }\n.ui-icon-carat-2-e-w { background-position: -144px 0; }\n.ui-icon-triangle-1-n { background-position: 0 -16px; }\n.ui-icon-triangle-1-ne { background-position: -16px -16px; }\n.ui-icon-triangle-1-e { background-position: -32px -16px; }\n.ui-icon-triangle-1-se { background-position: -48px -16px; }\n.ui-icon-triangle-1-s { background-position: -64px -16px; }\n.ui-icon-triangle-1-sw { background-position: -80px -16px; }\n.ui-icon-triangle-1-w { background-position: -96px -16px; }\n.ui-icon-triangle-1-nw { background-position: -112px -16px; }\n.ui-icon-triangle-2-n-s { background-position: -128px -16px; }\n.ui-icon-triangle-2-e-w { background-position: -144px -16px; }\n.ui-icon-arrow-1-n { background-position: 0 -32px; }\n.ui-icon-arrow-1-ne { background-position: -16px -32px; }\n.ui-icon-arrow-1-e { background-position: -32px -32px; }\n.ui-icon-arrow-1-se { background-position: -48px -32px; }\n.ui-icon-arrow-1-s { background-position: -64px -32px; }\n.ui-icon-arrow-1-sw { background-position: -80px -32px; }\n.ui-icon-arrow-1-w { background-position: -96px -32px; }\n.ui-icon-arrow-1-nw { background-position: -112px -32px; }\n.ui-icon-arrow-2-n-s { background-position: -128px -32px; }\n.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }\n.ui-icon-arrow-2-e-w { background-position: -160px -32px; }\n.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }\n.ui-icon-arrowstop-1-n { background-position: -192px -32px; }\n.ui-icon-arrowstop-1-e { background-position: -208px -32px; }\n.ui-icon-arrowstop-1-s { background-position: -224px -32px; }\n.ui-icon-arrowstop-1-w { background-position: -240px -32px; }\n.ui-icon-arrowthick-1-n { background-position: 0 -48px; }\n.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }\n.ui-icon-arrowthick-1-e { background-position: -32px -48px; }\n.ui-icon-arrowthick-1-se { background-position: -48px -48px; }\n.ui-icon-arrowthick-1-s { background-position: -64px -48px; }\n.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }\n.ui-icon-arrowthick-1-w { background-position: -96px -48px; }\n.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }\n.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }\n.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }\n.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }\n.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }\n.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }\n.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }\n.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }\n.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }\n.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }\n.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }\n.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }\n.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }\n.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }\n.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }\n.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }\n.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }\n.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }\n.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }\n.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }\n.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }\n.ui-icon-arrow-4 { background-position: 0 -80px; }\n.ui-icon-arrow-4-diag { background-position: -16px -80px; }\n.ui-icon-extlink { background-position: -32px -80px; }\n.ui-icon-newwin { background-position: -48px -80px; }\n.ui-icon-refresh { background-position: -64px -80px; }\n.ui-icon-shuffle { background-position: -80px -80px; }\n.ui-icon-transfer-e-w { background-position: -96px -80px; }\n.ui-icon-transferthick-e-w { background-position: -112px -80px; }\n.ui-icon-folder-collapsed { background-position: 0 -96px; }\n.ui-icon-folder-open { background-position: -16px -96px; }\n.ui-icon-document { background-position: -32px -96px; }\n.ui-icon-document-b { background-position: -48px -96px; }\n.ui-icon-note { background-position: -64px -96px; }\n.ui-icon-mail-closed { background-position: -80px -96px; }\n.ui-icon-mail-open { background-position: -96px -96px; }\n.ui-icon-suitcase { background-position: -112px -96px; }\n.ui-icon-comment { background-position: -128px -96px; }\n.ui-icon-person { background-position: -144px -96px; }\n.ui-icon-print { background-position: -160px -96px; }\n.ui-icon-trash { background-position: -176px -96px; }\n.ui-icon-locked { background-position: -192px -96px; }\n.ui-icon-unlocked { background-position: -208px -96px; }\n.ui-icon-bookmark { background-position: -224px -96px; }\n.ui-icon-tag { background-position: -240px -96px; }\n.ui-icon-home { background-position: 0 -112px; }\n.ui-icon-flag { background-position: -16px -112px; }\n.ui-icon-calendar { background-position: -32px -112px; }\n.ui-icon-cart { background-position: -48px -112px; }\n.ui-icon-pencil { background-position: -64px -112px; }\n.ui-icon-clock { background-position: -80px -112px; }\n.ui-icon-disk { background-position: -96px -112px; }\n.ui-icon-calculator { background-position: -112px -112px; }\n.ui-icon-zoomin { background-position: -128px -112px; }\n.ui-icon-zoomout { background-position: -144px -112px; }\n.ui-icon-search { background-position: -160px -112px; }\n.ui-icon-wrench { background-position: -176px -112px; }\n.ui-icon-gear { background-position: -192px -112px; }\n.ui-icon-heart { background-position: -208px -112px; }\n.ui-icon-star { background-position: -224px -112px; }\n.ui-icon-link { background-position: -240px -112px; }\n.ui-icon-cancel { background-position: 0 -128px; }\n.ui-icon-plus { background-position: -16px -128px; }\n.ui-icon-plusthick { background-position: -32px -128px; }\n.ui-icon-minus { background-position: -48px -128px; }\n.ui-icon-minusthick { background-position: -64px -128px; }\n.ui-icon-close { background-position: -80px -128px; }\n.ui-icon-closethick { background-position: -96px -128px; }\n.ui-icon-key { background-position: -112px -128px; }\n.ui-icon-lightbulb { background-position: -128px -128px; }\n.ui-icon-scissors { background-position: -144px -128px; }\n.ui-icon-clipboard { background-position: -160px -128px; }\n.ui-icon-copy { background-position: -176px -128px; }\n.ui-icon-contact { background-position: -192px -128px; }\n.ui-icon-image { background-position: -208px -128px; }\n.ui-icon-video { background-position: -224px -128px; }\n.ui-icon-script { background-position: -240px -128px; }\n.ui-icon-alert { background-position: 0 -144px; }\n.ui-icon-info { background-position: -16px -144px; }\n.ui-icon-notice { background-position: -32px -144px; }\n.ui-icon-help { background-position: -48px -144px; }\n.ui-icon-check { background-position: -64px -144px; }\n.ui-icon-bullet { background-position: -80px -144px; }\n.ui-icon-radio-off { background-position: -96px -144px; }\n.ui-icon-radio-on { background-position: -112px -144px; }\n.ui-icon-pin-w { background-position: -128px -144px; }\n.ui-icon-pin-s { background-position: -144px -144px; }\n.ui-icon-play { background-position: 0 -160px; }\n.ui-icon-pause { background-position: -16px -160px; }\n.ui-icon-seek-next { background-position: -32px -160px; }\n.ui-icon-seek-prev { background-position: -48px -160px; }\n.ui-icon-seek-end { background-position: -64px -160px; }\n.ui-icon-seek-start { background-position: -80px -160px; }\n/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */\n.ui-icon-seek-first { background-position: -80px -160px; }\n.ui-icon-stop { background-position: -96px -160px; }\n.ui-icon-eject { background-position: -112px -160px; }\n.ui-icon-volume-off { background-position: -128px -160px; }\n.ui-icon-volume-on { background-position: -144px -160px; }\n.ui-icon-power { background-position: 0 -176px; }\n.ui-icon-signal-diag { background-position: -16px -176px; }\n.ui-icon-signal { background-position: -32px -176px; }\n.ui-icon-battery-0 { background-position: -48px -176px; }\n.ui-icon-battery-1 { background-position: -64px -176px; }\n.ui-icon-battery-2 { background-position: -80px -176px; }\n.ui-icon-battery-3 { background-position: -96px -176px; }\n.ui-icon-circle-plus { background-position: 0 -192px; }\n.ui-icon-circle-minus { background-position: -16px -192px; }\n.ui-icon-circle-close { background-position: -32px -192px; }\n.ui-icon-circle-triangle-e { background-position: -48px -192px; }\n.ui-icon-circle-triangle-s { background-position: -64px -192px; }\n.ui-icon-circle-triangle-w { background-position: -80px -192px; }\n.ui-icon-circle-triangle-n { background-position: -96px -192px; }\n.ui-icon-circle-arrow-e { background-position: -112px -192px; }\n.ui-icon-circle-arrow-s { background-position: -128px -192px; }\n.ui-icon-circle-arrow-w { background-position: -144px -192px; }\n.ui-icon-circle-arrow-n { background-position: -160px -192px; }\n.ui-icon-circle-zoomin { background-position: -176px -192px; }\n.ui-icon-circle-zoomout { background-position: -192px -192px; }\n.ui-icon-circle-check { background-position: -208px -192px; }\n.ui-icon-circlesmall-plus { background-position: 0 -208px; }\n.ui-icon-circlesmall-minus { background-position: -16px -208px; }\n.ui-icon-circlesmall-close { background-position: -32px -208px; }\n.ui-icon-squaresmall-plus { background-position: -48px -208px; }\n.ui-icon-squaresmall-minus { background-position: -64px -208px; }\n.ui-icon-squaresmall-close { background-position: -80px -208px; }\n.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }\n.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }\n.ui-icon-grip-solid-vertical { background-position: -32px -224px; }\n.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }\n.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }\n.ui-icon-grip-diagonal-se { background-position: -80px -224px; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Corner radius */\n.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; }\n.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; }\n.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }\n.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }\n\n/* Overlays */\n.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); }\n.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -khtml-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/*\n * jQuery UI Resizable 1.8.17\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Resizable#theming\n */\n.ui-resizable { position: relative;}\n.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; }\n.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }\n.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }\n.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }\n.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }\n.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }\n.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }\n.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }\n.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }\n.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*\n * jQuery UI Selectable 1.8.17\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Selectable#theming\n */\n.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }\n/*\n * jQuery UI Accordion 1.8.17\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Accordion#theming\n */\n/* IE/Win - Fix animation bug - #4615 */\n.ui-accordion { width: 100%; }\n.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }\n.ui-accordion .ui-accordion-li-fix { display: inline; }\n.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }\n.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }\n.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }\n.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }\n.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }\n.ui-accordion .ui-accordion-content-active { display: block; }\n/*\n * jQuery UI Autocomplete 1.8.17\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Autocomplete#theming\n */\n.ui-autocomplete { position: absolute; cursor: default; }\t\n\n/* workarounds */\n* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */\n\n/*\n * jQuery UI Menu 1.8.17\n *\n * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Menu#theming\n */\n.ui-menu {\n\tlist-style:none;\n\tpadding: 2px;\n\tmargin: 0;\n\tdisplay:block;\n\tfloat: left;\n}\n.ui-menu .ui-menu {\n\tmargin-top: -3px;\n}\n.ui-menu .ui-menu-item {\n\tmargin:0;\n\tpadding: 0;\n\tzoom: 1;\n\tfloat: left;\n\tclear: left;\n\twidth: 100%;\n}\n.ui-menu .ui-menu-item a {\n\ttext-decoration:none;\n\tdisplay:block;\n\tpadding:.2em .4em;\n\tline-height:1.5;\n\tzoom:1;\n}\n.ui-menu .ui-menu-item a.ui-state-hover,\n.ui-menu .ui-menu-item a.ui-state-active {\n\tfont-weight: normal;\n\tmargin: -1px;\n}\n/*\n * jQuery UI Button 1.8.17\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Button#theming\n */\n.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */\n.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */\nbutton.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */\n.ui-button-icons-only { width: 3.4em; } \nbutton.ui-button-icons-only { width: 3.7em; } \n\n/*button text element */\n.ui-button .ui-button-text { display: block; line-height: 1.4;  }\n.ui-button-text-only .ui-button-text { padding: .4em 1em; }\n.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }\n.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }\n.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }\n.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }\n/* no icon support for input elements, provide padding by default */\ninput.ui-button { padding: .4em 1em; }\n\n/*button icon element(s) */\n.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }\n.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }\n.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }\n.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }\n.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }\n\n/*button sets*/\n.ui-buttonset { margin-right: 7px; }\n.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }\n\n/* workarounds */\nbutton.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */\n/*\n * jQuery UI Dialog 1.8.17\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Dialog#theming\n */\n.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }\n.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }\n.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } \n.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }\n.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }\n.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }\n.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }\n.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }\n.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }\n.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }\n.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }\n.ui-draggable .ui-dialog-titlebar { cursor: move; }\n/*\n * jQuery UI Slider 1.8.17\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Slider#theming\n */\n.ui-slider { position: relative; text-align: left; }\n.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }\n.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }\n\n.ui-slider-horizontal { height: .8em; }\n.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }\n.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }\n.ui-slider-horizontal .ui-slider-range-min { left: 0; }\n.ui-slider-horizontal .ui-slider-range-max { right: 0; }\n\n.ui-slider-vertical { width: .8em; height: 100px; }\n.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }\n.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }\n.ui-slider-vertical .ui-slider-range-min { bottom: 0; }\n.ui-slider-vertical .ui-slider-range-max { top: 0; }/*\n * jQuery UI Tabs 1.8.17\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Tabs#theming\n */\n.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as \"fixed\") */\n.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }\n.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }\n.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }\n.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }\n.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }\n.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */\n.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }\n.ui-tabs .ui-tabs-hide { display: none !important; }\n/*\n * jQuery UI Datepicker 1.8.17\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Datepicker#theming\n */\n.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }\n.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }\n.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }\n.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }\n.ui-datepicker .ui-datepicker-prev { left:2px; }\n.ui-datepicker .ui-datepicker-next { right:2px; }\n.ui-datepicker .ui-datepicker-prev-hover { left:1px; }\n.ui-datepicker .ui-datepicker-next-hover { right:1px; }\n.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }\n.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }\n.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }\n.ui-datepicker select.ui-datepicker-month-year {width: 100%;}\n.ui-datepicker select.ui-datepicker-month, \n.ui-datepicker select.ui-datepicker-year { width: 49%;}\n.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }\n.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }\n.ui-datepicker td { border: 0; padding: 1px; }\n.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }\n.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }\n.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }\n.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }\n\n/* with multiple calendars */\n.ui-datepicker.ui-datepicker-multi { width:auto; }\n.ui-datepicker-multi .ui-datepicker-group { float:left; }\n.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }\n.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }\n.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }\n.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }\n.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }\n.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }\n.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }\n.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }\n\n/* RTL support */\n.ui-datepicker-rtl { direction: rtl; }\n.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }\n.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }\n.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }\n.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }\n.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }\n.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }\n.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }\n.ui-datepicker-rtl .ui-datepicker-group { float:right; }\n.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }\n.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }\n\n/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */\n.ui-datepicker-cover {\n    display: none; /*sorry for IE5*/\n    display/**/: block; /*sorry for IE5*/\n    position: absolute; /*must have*/\n    z-index: -1; /*must have*/\n    filter: mask(); /*must have*/\n    top: -4px; /*must have*/\n    left: -4px; /*must have*/\n    width: 200px; /*must have*/\n    height: 200px; /*must have*/\n}/*\n * jQuery UI Progressbar 1.8.17\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Progressbar#theming\n */\n.ui-progressbar { height:2em; text-align: left; overflow: hidden; }\n.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }"
  },
  {
    "path": "js/background.js",
    "content": "var contextsManager = new ContextsManager();\nvar extensionsManager = new ExtensionsManager();\nvar iconAnimation;\n\nfunction init() {\n\ticonAnimation = new IconAnimation({\n\t\tcanvasObj: document.getElementById('canvas'),\n\t\timageObj: document.getElementById('image'),\n\t\tdefaultIcon: \"icons/context.png\"\n\t});\n\n\tif(CONFIG.get('firstRun') == 'yes') {\n\t\topenConfig();\n\t}\n}\n\n/*CONTEXT CHANGING*/\nfunction reloadConfiguration(callback) {\n\t//show animation\n\ticonAnimation.animate(\"icons/context_cog.png\");\n\n\t//reload list of all extensions and always enabled extensions\n\textensionsManager.init(callback);\n}\n\nfunction enableAllExtensions() {\n\treloadConfiguration(function() {\n\t\textensionsManager.enableAllExtensions();\n\t});\n}\n\nfunction disableAllExtensions() {\n\treloadConfiguration(function() {\n\t\textensionsManager.disableAllExtensions();\n\t});\n}\n\nfunction changeContext(selectedContext) {\n\treloadConfiguration(function() {\n\t\t//change context\n\t\tvar context = contextsManager.getContext(selectedContext);\n\n\t\tif(context) {\n\t\t\tvar allExtensions = extensionsManager.getExtensionsList();\n\t\t\tvar enableList = [];\n\t\t\tvar disableList = [];\n\n\t\t\t//check which extensions should be enabled and which should be disabled\n\t\t\tfor(var i in allExtensions) {\n\t\t\t\tvar extension = allExtensions[i];\n\t\t\t\tvar found = false;\n\n\t\t\t\t//first, check if extension should be always enabled, if not, check if it is enabled in given context\n\t\t\t\tif(extensionsManager.isAlwaysEnabled(extension.id)) {\n\t\t\t\t\tfound = true;\n\t\t\t\t} else {\n\t\t\t\t\tfound = contextsManager.isInContext(context, extension);\n\t\t\t\t}\n\n\t\t\t\tif(found) {\n\t\t\t\t\tenableList.push(extension);\n\t\t\t\t} else {\n\t\t\t\t\tdisableList.push(extension);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//disable extensions first, then enable extensions\n\t\t\textensionsManager.disableExtensions(disableList, function(){\n\t\t\t\textensionsManager.enableExtensions(enableList);\n\t\t\t});\n\t\t}\n\t});\n}\n\nfunction activateContext(selectedContext) {\n\treloadConfiguration(function() {\n\t\t//activate context\n\t\tvar context = contextsManager.getContext(selectedContext);\n\n\t\tif(context){\n\t\t\tvar allExtensions = extensionsManager.getExtensionsList();\n\t\t\tvar enableList = [];\n\n\t\t\t//check which extensions should be enabled\n\t\t\tfor(var i in allExtensions) {\n\t\t\t\tvar extension = allExtensions[i];\n\t\t\t\tvar found = false;\n\n\t\t\t\t//first, check if extension should be always enabled, if not, check if it is enabled in given context\n\t\t\t\tif(extensionsManager.isAlwaysEnabled(extension.id)) {\n\t\t\t\t\tfound = true;\n\t\t\t\t} else {\n\t\t\t\t\tfound = contextsManager.isInContext(context, extension);\n\t\t\t\t}\n\n\t\t\t\tif(found) {\n\t\t\t\t\tenableList.push(extension);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//enable extensions\n\t\t\textensionsManager.enableExtensions(enableList);\n\t\t}\n\t});\n}\n\nfunction deactivateContext(selectedContext) {\n\treloadConfiguration(function() {\n\t\t//activate context\n\t\tvar context = contextsManager.getContext(selectedContext);\n\n\t\tif(context){\n\t\t\tvar allExtensions = extensionsManager.getExtensionsList();\n\t\t\tvar disableList = [];\n\n\t\t\t//check which extensions should be disabled\n\t\t\tfor(var i in allExtensions) {\n\t\t\t\tvar extension = allExtensions[i];\n\t\t\t\tvar found = false;\n\n\t\t\t\t//skip always enabled extensions\n\t\t\t\tif(extensionsManager.isAlwaysEnabled(extension.id)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\tfound = contextsManager.isInContext(context, extension);\n\t\t\t\t}\n\n\t\t\t\tif(found) {\n\t\t\t\t\tdisableList.push(extension);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//disable extensions\n\t\t\textensionsManager.disableExtensions(disableList);\n\t\t}\n\t});\n}\n\nfunction configUpdated() {\n\tcontextsManager.init();\n\textensionsManager.init();\n\n\ticonAnimation.animate(\"icons/context_wrench.png\");\n}\n\n/* NEW EXTENSION INSTALLATION */\nvar newestExtension;\n\nfunction getNewestExtension() {\n\treturn newestExtension;\n}\n\nchrome.management.onInstalled.addListener(function(extdata) {\n\t//ignore themes\n\tif(extdata.type === 'theme') {\n\t\treturn;\n\t}\n\n\t//if app support is disabled do nothing\n\tif(extdata.isApp && CONFIG.get('appsSupport') !== 'true') {\n\t\treturn;\n\t}\n\n\t//check if extension exist in list of known extensions - hack to distinguish between extension installation and update\n\tif( extensionsManager.getExtensionData( extdata.id ) ) {\n\t\treturn;//just an update\n\t}\n\n\tvar contexts = contextsManager.getContextsList();\n\n\tif(contexts.length > 0 && CONFIG.get('newExtensionAction') === 'add_to_all') {\n\t\tfor(var i in contexts) {\n\t\t\tcontextsManager.addExtensionToContext( contexts[i], extdata.id );\n\t\t}\n\n\t\tcontextsManager.save();\n\t\tconfigUpdated();\n\t} else if(CONFIG.get('newExtensionAction') === 'add_to_always_enabled') {\n\t\textensionsManager.addExtensionToAlwaysEnabled( extdata.id );\n\t\textensionsManager.save();\n\t\tconfigUpdated();\n\t} else if (CONFIG.get('newExtensionAction') === 'ask') {\n\t\t//fetching last (biggest) icon if it exists, otherwise using Context icon\n\t\tvar icon = (extdata.icons && extdata.icons.length) ? (extdata.icons[extdata.icons.length - 1].url) : ('icons/context-128.png');\n\n\t\tvar notification = new ExtensionNotification({\n\t\t\ticon: icon,\n\t\t\ttitle: chrome.i18n.getMessage(\"extension_installed_1\") + ' ' + extdata.name + ' ' + chrome.i18n.getMessage(\"extension_installed_2\"),\n\t\t\tbody: chrome.i18n.getMessage(\"open_notification\"),\n\t\t\tonclick: function () {\n\t\t\t\tvar w = 300,\n\t\t\t\t\th = 400,\n\t\t\t\t\tt = screen.height - h - 10,\n\t\t\t\t\tl = screen.width - w - 10;\n\n\t\t\t\tchrome.windows.create({\n\t\t\t\t\t'url': 'notification.html',\n\t\t\t\t\t'type': 'popup',\n\t\t\t\t\t'focused': true,\n\t\t\t\t\t'width': w,\n\t\t\t\t\t'height': h,\n\t\t\t\t\t'top': t,\n\t\t\t\t\t'left': l\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tnewestExtension = extdata;\n\t\tnotification.show();\n\t}\n});\n\nchrome.management.onUninstalled.addListener(function(extid) {\n\t//remove extension from all contexts\n\tvar contexts = contextsManager.getContextsList();\n\tfor(var i in contexts) {\n\t\tcontextsManager.removeExtensionFromContext( contexts[i], extid );\n\t}\n\tcontextsManager.save();\n\n\t//remove extension from always enabled extensions\n\textensionsManager.removeExtensionFromAlwaysEnabled( extid );\n\textensionsManager.save();\n\n\t//update list of known extensions\n\textensionsManager.init();\n});\n\n//open extension config page\nfunction openConfig() {\n\tchrome.tabs.getAllInWindow(null, function(tabs) {\n\n\t\tfor(var i= 0, l=tabs.length; i<l;i++) {\n\t\t\tvar tab = tabs[i];\n\t\t\tif(tab.url.indexOf(chrome.extension.getURL(\"options.html\")) === 0) {\n\t\t\t\tchrome.tabs.update(tab.id, {\n\t\t\t\t\turl: chrome.extension.getURL(\"options.html\"),\n\t\t\t\t\tselected: true\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tchrome.tabs.create({\n\t\t\turl:chrome.extension.getURL(\"options.html\"),\n\t\t\tselected: true\n\t\t});\n\t});\n}\n\n$(document).ready(function() {\n\tinit();\n});\n"
  },
  {
    "path": "js/classes/Configuration.class.js",
    "content": "function Configuration() {\n\t\"use strict\";\n\tvar constants = {\n\t\ticonsPath: 'icons/dortmund/',\n\t\ticons: ['home', 'search', 'world', 'heart', 'lightbulb', 'basket', 'customers', 'hire-me', 'administrative-docs', 'comment', 'config', 'finished-work', 'settings', 'star'],\n\t\textensionName: 'Context',\n\t\tconfigBackupFormatVersion: 1\n\t};\n\n\tvar defaults = {\n\t\tappsSupport: 'false',\n\t\textensionEnableDelay: 200,//ms\n\t\tshowLoadAllBtn: 'true',\n\t\tnewExtensionAction: 'ask',\n\t\tfirstRun: 'yes',\n\t\thighlightUngroupedExtensions: 'false'\n\t};\n\n\t/**\n\t * Returns value of a config parameter (constant, user setting or default setting) with provided name.\n\t * Returns null if no matching parameter is found.\n\t * @param {string} name\n\t * @returns {string|Array|number|null}\n\t */\n\tthis.get = function (name) {\n\t\treturn constants[name] || localStorage[name] || defaults[name] || null;\n\t};\n}\n\nvar CONFIG = new Configuration();"
  },
  {
    "path": "js/classes/ConfigurationBackupExporter.class.js",
    "content": "function ConfigurationBackupExporter() {\n\t\"use strict\";\n\tvar extensionsManager;\n\n\t/**\n\t * Creates dump (base64 encoded JSON) of whole configuration. Value is returned via callback.\n\t * @param {function(string)} callback\n\t */\n\tthis.exportConfig = function (callback) {\n\t\tvar contextsManager = new ContextsManager();\n\t\textensionsManager = new ExtensionsManager(function () {\n\t\t\tvar contexts = contextsManager.getContextsList();\n\t\t\tvar alwaysEnabledExtensions = extensionsManager.getAlwaysEnabledExtensionsIds();\n\t\t\tvar extensionsNamesDictionary = createExtensionsNamesDictionary(contexts, alwaysEnabledExtensions);\n\n\t\t\tvar cleanConfig = {\n\t\t\t\t\"version\": CONFIG.get(\"configBackupFormatVersion\"),\n\t\t\t\t\"contexts\": contexts,\n\t\t\t\t\"alwaysEnabledExtensions\": alwaysEnabledExtensions,\n\t\t\t\t\"extensionsNamesDictionary\": extensionsNamesDictionary,\n\t\t\t\t\"advancedOptions\": {\n\t\t\t\t\t\"appsSupport\": CONFIG.get(\"appsSupport\"),\n\t\t\t\t\t\"newExtensionAction\": CONFIG.get(\"newExtensionAction\"),\n\t\t\t\t\t\"showLoadAllBtn\": CONFIG.get(\"showLoadAllBtn\")\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar encodedConfig = Base64.encode(JSON.stringify(cleanConfig));\n\n\t\t\tif (typeof callback === 'function') {\n\t\t\t\tcallback(encodedConfig);\n\t\t\t}\n\t\t});\n\t};\n\n\tvar createExtensionsNamesDictionary = function (contexts, alwaysEnabledExtensions) {\n\t\tvar extid, cindex, eindex;\n\t\tvar extensionsNamesDictionary = {};\n\n\t\tfor (cindex in contexts) {\n\t\t\tvar context = contexts[cindex];\n\n\t\t\tfor (eindex in context.extensions) {\n\t\t\t\textid = context.extensions[eindex].id;\n\n\t\t\t\textensionsNamesDictionary[extid] = '';\n\t\t\t}\n\t\t}\n\n\t\tfor (var i = 0; i < alwaysEnabledExtensions.length; i++) {\n\t\t\textid = alwaysEnabledExtensions[i];\n\n\t\t\textensionsNamesDictionary[extid] = '';\n\t\t}\n\n\t\tfor (extid in extensionsNamesDictionary) {\n\t\t\tvar extension = extensionsManager.getExtensionData(extid);\n\n\t\t\tif (extension) {\n\t\t\t\textensionsNamesDictionary[extid] = extension.name;\n\t\t\t}\n\t\t}\n\n\t\treturn extensionsNamesDictionary;\n\t};\n}"
  },
  {
    "path": "js/classes/ConfigurationBackupImporter.class.js",
    "content": "function ConfigurationBackupImporter() {\n\t\"use strict\";\n\t/**\n\t * Array of errors that occurred during last import.\n\t * @type {Array.<string>}\n\t */\n\tvar errors = [];\n\t/**\n\t * List of extensions mentioned in imported configuration but not installed.\n\t * @type {Array.<Object>}\n\t */\n\tvar missingExtensions = [];\n\t/**\n\t * @type {ExtensionsManager}\n\t */\n\tvar extensionsManager;\n\n\t/**\n\t * Tries to import given encoded configuration. If no critical errors are found boolean 'true' is returned via callback as a first parameter and\n\t * imported configuration replaces current Context configuration.\n\t * Second parameter returned to the callback will contain list of extensions mentioned in imported config but currently not installed.\n\t * Third parameter returned to the callback will contain list of errors encountered during import.\n\t * @param {string} encodedConfig base64 encoded JSON\n\t * @param {function(boolean, Array.<Object>, Array.<string>): void=} callback\n\t */\n\tthis.importConfig = function (encodedConfig, callback) {\n\t\textensionsManager = new ExtensionsManager(function () {\n\t\t\tvar jsonString = Base64.decode(jQuery.trim(encodedConfig));\n\t\t\tvar json;\n\n\t\t\terrors = [];\n\t\t\tmissingExtensions = [];\n\n\t\t\ttry {\n\t\t\t\tjson = JSON.parse(jsonString);\n\t\t\t} catch (e) {\n\t\t\t\terrors.push('JSON parser error: ' + e.type);\n\t\t\t}\n\n\t\t\tif (typeof json === \"object\") {\n\t\t\t\tvalidateStructure(json);\n\n\t\t\t\t//we proceed only if there were no errors in the root structure\n\t\t\t\tif (errors.length === 0) {\n\t\t\t\t\tvalidateVersion(json.version);\n\t\t\t\t\tvalidateContexts(json.contexts, json.extensionsNamesDictionary);\n\t\t\t\t\tvalidateAlwaysEnabledExtensions(json.alwaysEnabledExtensions, json.extensionsNamesDictionary);\n\t\t\t\t\tvalidateAdvancedOptions(json.advancedOptions);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\terrors.push('Corrupted configuration string.');\n\t\t\t}\n\n\t\t\tif (errors.length === 0) {\n\t\t\t\tupdateConfiguration(json);\n\t\t\t}\n\n\t\t\tif (typeof callback === 'function') {\n\t\t\t\tvar status = (errors.length === 0);\n\t\t\t\tcallback(status, missingExtensions, errors);\n\t\t\t}\n\t\t});\n\t};\n\n\tthis.getMissingExtensions = function () {\n\t\treturn missingExtensions;\n\t};\n\n\tthis.getErrors = function () {\n\t\treturn errors;\n\t};\n\n\tvar validateStructure = function (config) {\n\t\tif (!config.hasOwnProperty(\"version\") || !config.hasOwnProperty(\"contexts\") || !config.hasOwnProperty(\"alwaysEnabledExtensions\") || !config.hasOwnProperty(\"extensionsNamesDictionary\") || !config.hasOwnProperty(\"advancedOptions\")) {\n\t\t\terrors.push('Configuration object is missing one or more root property.');\n\t\t}\n\t};\n\n\tvar validateVersion = function (version) {\n\t\tif (version !== 1) {\n\t\t\terrors.push('Unknown configuration file format version.');\n\t\t}\n\t};\n\n\tvar validateContexts = function (contexts, dictionary) {\n\t\tif (!jQuery.isArray(contexts)) {\n\t\t\terrors.push('List of contexts is not an object.');\n\t\t} else {\n\t\t\tfor (var index in contexts) {\n\t\t\t\tvar context = contexts[index];\n\n\t\t\t\tvalidateContext(context, dictionary);\n\t\t\t}\n\t\t}\n\t};\n\n\tvar validateContext = function (context, dictionary) {\n\t\tif (!context.hasOwnProperty(\"extensions\") || !context.hasOwnProperty(\"imgSrc\") || !context.hasOwnProperty(\"name\")) {\n\t\t\terrors.push('Context object is missing one or more properties.');\n\t\t} else {\n\t\t\tif (!jQuery.isArray(context.extensions)) {\n\t\t\t\terrors.push('List of extensions in context is not an array.');\n\t\t\t} else {\n\t\t\t\t//store only valid extensions\n\t\t\t\tcontext.extensions = context.extensions.filter(function (extension, idx, array) {\n\t\t\t\t\treturn validateExtension(extension.id, dictionary);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t};\n\n\tvar validateExtension = function (extid, dictionary) {\n\t\t//check if extension is currently installed\n\t\tvar index;\n\t\tvar extension = extensionsManager.getExtensionData(extid);\n\n\t\tif (!extension) {\n\t\t\t//check if extension is not already on a list of missing extensions\n\t\t\tfor (index in missingExtensions) {\n\t\t\t\tif (missingExtensions[index].id === extid) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmissingExtensions.push({\n\t\t\t\tid: extid,\n\t\t\t\tname: dictionary.hasOwnProperty(extid) ? dictionary[extid] : '-unknown-'\n\t\t\t});\n\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t};\n\n\tvar validateAlwaysEnabledExtensions = function (extensions, dictionary) {\n\t\tif (!jQuery.isArray(extensions)) {\n\t\t\terrors.push('Always enabled extensions is not an array.');\n\t\t} else {\n\t\t\tvar validExtensions = extensions.filter(function (extension, idx, array) {\n\t\t\t\treturn validateExtension(extension, dictionary);\n\t\t\t});\n\n\t\t\textensions.length = 0;\n\t\t\tfor (var i = 0; i < validExtensions.length; i++) {\n\t\t\t\textensions.push(validExtensions[i]);\n\t\t\t}\n\t\t}\n\t};\n\n\tvar validateAdvancedOptions = function (config) {\n\t\tif (config.hasOwnProperty(\"appsSupport\") && (jQuery.inArray(config.appsSupport, [\"true\", \"false\"]) === -1)) {\n\t\t\terrors.push('Invalid \"appsSupport\" value.');\n\t\t}\n\t\tif (config.hasOwnProperty(\"newExtensionAction\") && (jQuery.inArray(config.newExtensionAction, [\"ask\", \"add_to_all\", \"add_to_always_enabled\", \"do_nothing\"]) === -1)) {\n\t\t\terrors.push('Invalid \"newExtensionAction\" value.' + config.newExtensionAction);\n\t\t}\n\t\tif (config.hasOwnProperty(\"showLoadAllBtn\") && (jQuery.inArray(config.showLoadAllBtn, [\"true\", \"false\"]) === -1)) {\n\t\t\terrors.push('Invalid \"showLoadAllBtn\" value.' + config.showLoadAllBtn);\n\t\t}\n\t};\n\n\tvar updateConfiguration = function (config) {\n\t\tif (config.advancedOptions.hasOwnProperty(\"appsSupport\")) {\n\t\t\tlocalStorage.appsSupport = config.advancedOptions.appsSupport;\n\t\t}\n\t\tif (config.advancedOptions.hasOwnProperty(\"newExtensionAction\")) {\n\t\t\tlocalStorage.newExtensionAction = config.advancedOptions.newExtensionAction;\n\t\t}\n\t\tif (config.advancedOptions.hasOwnProperty(\"showLoadAllBtn\")) {\n\t\t\tlocalStorage.showLoadAllBtn = config.advancedOptions.showLoadAllBtn;\n\t\t}\n\n\t\t//import contexts\n\t\tlocalStorage.contexts = JSON.stringify(config.contexts);\n\n\t\t//import alwaysEnabledExtensions\n\t\tlocalStorage.alwaysEnabledExtensions = JSON.stringify(config.alwaysEnabledExtensions);\n\n\t\t//reload bg page settings\n\t\tchrome.extension.getBackgroundPage().configUpdated();\n\t};\n}"
  },
  {
    "path": "js/classes/ContextsManager.class.js",
    "content": "function ContextsManager() {\n\t\"use strict\";\n\tvar that = this;\n\t/**\n\t * List of all contexts.\n\t * @type {Array.<Object>}\n\t */\n\tvar contextsList = [];\n\n\tthis.init = function () {\n\t\tif (localStorage.contexts) {\n\t\t\tthat.setContextsList(JSON.parse(localStorage.contexts));\n\t\t}\n\t};\n\n\t/**\n\t * Returns list of contexts with current statuses (enabled/disabled/partial).\n\t * This operation is asynchronous - result list is returned to a callback.\n\t * @param {function(Array.<Object>): void} callback\n\t */\n\tthis.getContextsListWithStatuses = function (callback) {\n\t\tchrome.management.getAll(function (extensions) {\n\t\t\tvar contextsListsWithStatuses, activeExtensions = [];\n\n\t\t\t//make handy array of active extension ids\n\t\t\tactiveExtensions = extensions.filter(function (extension) {\n\t\t\t\treturn extension.enabled;\n\t\t\t}).map(function (extension) {\n\t\t\t\t\treturn extension.id;\n\t\t\t\t});\n\n\t\t\tcontextsListsWithStatuses = [];\n\n\t\t\t//check all contexts\n\t\t\tcontextsList.forEach(function (context) {\n\t\t\t\tvar countActive, status;\n\n\t\t\t\tcountActive = context.extensions.filter(function (extension) {\n\t\t\t\t\treturn ( activeExtensions.indexOf(extension.id) !== -1 );\n\t\t\t\t}).length;\n\n\t\t\t\tif (countActive === context.extensions.length) {//context is enabled (all extensions are active)\n\t\t\t\t\tstatus = \"enabled\";\n\t\t\t\t} else if (countActive === 0) {//context is disabled (no active extensions)\n\t\t\t\t\tstatus = \"disabled\";\n\t\t\t\t} else {//context is partially enabled (some active extensions)\n\t\t\t\t\tstatus = \"partial\";\n\t\t\t\t}\n\n\t\t\t\t//clone context object and add status\n\t\t\t\tcontextsListsWithStatuses.push({\n\t\t\t\t\tname: context.name,\n\t\t\t\t\timgSrc: context.imgSrc,\n\t\t\t\t\ticon: context.icon,\n\t\t\t\t\textensions: context.extensions,\n\t\t\t\t\tstatus: status\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tif (typeof callback === \"function\") {\n\t\t\t\tcallback(contextsListsWithStatuses);\n\t\t\t}\n\t\t});\n\t};\n\n\tthis.setContextsList = function (list) {\n\t\tcontextsList = list;\n\t};\n\n\t/**\n\t * Returns list of context objects.\n\t * @returns {Array.<Object>}\n\t */\n\tthis.getContextsList = function () {\n\t\treturn contextsList;\n\t};\n\n\t/**\n\t * Checks if given extension is part of given context.\n\t * @param {Object|string} context\n\t * @param {Object|string} extension\n\t * @returns {boolean}\n\t */\n\tthis.isInContext = function (context, extension) {\n\t\tvar extid, contextObj, j;\n\n\t\textid = (typeof extension === \"object\") ? extension.id : extension;\n\t\tcontextObj = (typeof context === \"string\") ? that.getContext(context) : context;\n\n\t\tfor (j in contextObj.extensions) {\n\t\t\tif (contextObj.extensions[j].id === extid) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Returns context by name or false if not found.\n\t * @param {string} name\n\t * @returns {Object|boolean}\n\t */\n\tthis.getContext = function (name) {\n\t\tvar cindex, context;\n\n\t\tfor (cindex in contextsList) {\n\t\t\tcontext = contextsList[cindex];\n\n\t\t\tif (context.name === name) {\n\t\t\t\treturn context;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Checks if given context exists.\n\t * @param {string} name\n\t * @returns {boolean}\n\t */\n\tthis.contextExists = function (name) {\n\t\treturn (this.getContext(name) !== false);\n\t};\n\n\t/**\n\t * Adds single extension to the given context.\n\t * @param {Object|string} context\n\t * @param {Object|string} extension\n\t */\n\tthis.addExtensionToContext = function (context, extension) {\n\t\tvar extid, contextName, contextObj;\n\n\t\textid = (typeof extension === \"object\") ? extension.id : extension;\n\t\tcontextName = (typeof context === \"object\") ? context.name : context;\n\n\t\tcontextObj = that.getContext(contextName);\n\n\t\tif (contextObj && !that.isInContext(contextObj, extid)) {\n\t\t\tcontextObj.extensions.push({\n\t\t\t\tid: extid\n\t\t\t});\n\t\t}\n\t};\n\n\t/**\n\t * Removes single extension form given context.\n\t * @param {Object|string} context\n\t * @param {Object|string} extension\n\t */\n\tthis.removeExtensionFromContext = function (context, extension) {\n\t\tvar extid, contextName, contextObj;\n\n\t\textid = (typeof extension === \"object\") ? extension.id : extension;\n\t\tcontextName = (typeof context === \"object\") ? context.name : context;\n\n\t\tcontextObj = that.getContext(contextName);\n\n\t\tif (contextObj) {\n\t\t\tcontextObj.extensions = contextObj.extensions.filter(function (item) {\n\t\t\t\treturn (item.id !== extid);\n\t\t\t});\n\t\t}\n\t};\n\n\t/**\n\t * Creates new, empty context.\n\t * @param {string} name\n\t * @param {string} img icon URL\n\t */\n\tthis.newContext = function (name, img) {\n\t\tvar contextObj = {\n\t\t\t'name': name,\n\t\t\t'imgSrc': img,\n\t\t\t'extensions': []\n\t\t};\n\t\tcontextsList.push(contextObj);\n\t\tthat.save();\n\t};\n\n\t/**\n\t * Saves current contexts to localStorage.\n\t */\n\tthis.save = function () {\n\t\tlocalStorage.contexts = JSON.stringify(contextsList);\n\t};\n\n\tthis.init(); //constructor\n}"
  },
  {
    "path": "js/classes/ExtensionNotification.class.js",
    "content": "function ExtensionNotification(options) {\n\t\"use strict\";\n\tvar useChromeNotifications = (chrome && chrome.notifications);\n\tvar defaults = { icon: 'icons/context-128.png', title: '', body: '' };\n\tvar settings = $.extend({}, defaults, options);\n\tvar notification = null;\n\n\tthis.show = function () {\n\t\t//ATM only osx, windows and chrome os support chrome.notifications\n\t\tif (useChromeNotifications) {\n\t\t\tnotification = chrome.notifications.create(settings.title, {\n\t\t\t\ttype: \"basic\",\n\t\t\t\ttitle: settings.title,\n\t\t\t\tmessage: settings.body,\n\t\t\t\ticonUrl: settings.icon\n\t\t\t}, function (notificationID) {\n\t\t\t\tnotification = notificationID;\n\t\t\t});\n\n\t\t\tif(settings.onclick) {\n\t\t\t\tchrome.notifications.onClicked.addListener(function(notificationID) {\n\t\t\t\t\tif(notification === notificationID) {\n\t\t\t\t\t\tsettings.onclick();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (window.Notification) {\n\t\t\t//we use default HTML5 notifications for Linux\n\t\t\tnotification = new Notification(settings.title, {body: settings.body, icon: settings.icon});\n\n\t\t\tif(settings.onclick) {\n\t\t\t\tnotification.onclick = settings.onclick;\n\t\t\t}\n\t\t}\n\t};\n}"
  },
  {
    "path": "js/classes/ExtensionsManager.class.js",
    "content": "function ExtensionsManager(onLoadCallback) {\n\t\"use strict\";\n\tvar that = this;\n\t/**\n\t * List of all installed extensions.\n\t * @type {Array.<Object>}\n\t */\n\tvar extensionsList = [];\n\t/**\n\t * List of IDs of 'always enabled' extensions.\n\t * @type {Array.<string>}\n\t */\n\tvar alwaysEnabledExtensionsIds = [];\n\n\tthis.init = function (callback) {\n\t\tchrome.management.getAll(function (list) {\n\t\t\tthat.setExtensionsList(list);\n\n\t\t\tif (typeof callback === 'function') {\n\t\t\t\tcallback();\n\t\t\t}\n\t\t});\n\n\t\tif (localStorage.alwaysEnabledExtensions) {\n\t\t\tthat.setAlwaysEnabledExtensionsIds(JSON.parse(localStorage.alwaysEnabledExtensions));\n\t\t}\n\t};\n\n\tthis.setExtensionsList = function (list) {\n\t\tvar contextExtensionId = chrome.i18n.getMessage(\"@@extension_id\");\n\n\t\textensionsList = list.sort(function (item1, item2) { //sort by name\n\t\t\tif (item1.name < item2.name) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\treturn 1;\n\t\t}).filter(function (element) {\n\t\t\t//remove Context itself from manageable extensions\n\t\t\t//remove themes as support for multiple themes is very unstable\n\t\t\treturn ( element.id !== contextExtensionId && element.type !== 'theme' );\n\t\t});\n\t};\n\n\t/**\n\t * Returns list of all extensions.\n\t * @returns {Array.<Object>}\n\t */\n\tthis.getExtensionsList = function () {\n\t\treturn extensionsList;\n\t};\n\n\tthis.setAlwaysEnabledExtensionsIds = function (list) {\n\t\talwaysEnabledExtensionsIds = list;\n\t};\n\n\t/**\n\t * Returns list of 'always enabled' extensions.\n\t * @returns {Array.<Object>}\n\t */\n\tthis.getAlwaysEnabledExtensionsIds = function () {\n\t\treturn alwaysEnabledExtensionsIds;\n\t};\n\n\t/**\n\t * Removes single extension from 'always enabled extensions'\n\t * @param {string} extid\n\t */\n\tthis.removeExtensionFromAlwaysEnabled = function (extid) {\n\t\talwaysEnabledExtensionsIds = alwaysEnabledExtensionsIds.filter(function (item) {\n\t\t\treturn (item !== extid);\n\t\t});\n\t};\n\n\t/**\n\t * Adds single exetnsion to 'always enabled extensions'\n\t * @param {string} extid\n\t */\n\tthis.addExtensionToAlwaysEnabled = function (extid) {\n\t\tif (!that.isAlwaysEnabled(extid)) {\n\t\t\talwaysEnabledExtensionsIds.push(extid);\n\t\t}\n\t};\n\n\t/**\n\t * Saves 'always enabled extensions' to localStorage\n\t */\n\tthis.save = function () {\n\t\tlocalStorage.alwaysEnabledExtensions = JSON.stringify(alwaysEnabledExtensionsIds);\n\t};\n\n\t/**\n\t * Returns extension details based on extension ID.\n\t * @param {string} extid\n\t * @returns {Object|boolean}\n\t */\n\tthis.getExtensionData = function (extid) {\n\t\tvar index;\n\n\t\tfor (index in extensionsList) {\n\t\t\tvar extension = extensionsList[index];\n\n\t\t\tif (extension.id === extid) {\n\t\t\t\treturn extension;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Returns true if extension is in 'always enabled' group.\n\t * @param {string} extid\n\t * @returns {boolean}\n\t */\n\tthis.isAlwaysEnabled = function (extid) {\n\t\treturn (jQuery.inArray(extid, alwaysEnabledExtensionsIds) !== -1);\n\t};\n\n\t/**\n\t * Enables all extensions.\n\t */\n\tthis.enableAllExtensions = function () {\n\t\tthat.enableExtensions(that.getExtensionsList());\n\t};\n\n\t/**\n\t * Enables list of extensions one by one. Calls optional callback when all extensions from the list are enabled.\n\t * @param {Array.<Object>} list\n\t * @param {function(): void=} callback\n\t */\n\tthis.enableExtensions = function (list, callback) {\n\t\tif (list.length > 0) {\n\t\t\tvar extension = list.pop();\n\n\t\t\tthat.enableExtension(extension, true, function () {\n\t\t\t\twindow.setTimeout(function () {\n\t\t\t\t\tthat.enableExtensions(list, callback);\n\t\t\t\t}, CONFIG.get('extensionEnableDelay'));\n\t\t\t});\n\t\t}\n\n\t\tif (typeof callback === \"function\") {\n\t\t\tcallback();\n\t\t}\n\t};\n\n\t/**\n\t * Enables or disables single extension. Calls optional callback when operation is finished.\n\t * @param {Object} extension\n\t * @param {boolean} enable\n\t * @param {function(): void=} callback\n\t */\n\tthis.enableExtension = function (extension, enable, callback) {\n\t\tif (\n\t\t\textension.type !== 'theme' && //do not touch themes\n\t\t\t(!extension.isApp || CONFIG.get('appsSupport') === 'true') && //check if extension is an app and continue only if we support apps\n\t\t\t((enable === true && !extension.enabled) || (enable === false && extension.enabled && extension.mayDisable)) && //enable extension if it is not already enabled, disable extension if it can be disabled and is not already disabled\n\t\t\t(extension.id !== chrome.i18n.getMessage(\"@@extension_id\")) //do not enable/disable current extension (Context)\n\t\t) {\n\t\t\tif (typeof callback === \"function\") {\n\t\t\t\tchrome.management.setEnabled(extension.id, enable, callback);\n\t\t\t} else {\n\t\t\t\tchrome.management.setEnabled(extension.id, enable);\n\t\t\t}\n\t\t} else if (typeof callback === \"function\") {\n\t\t\tcallback();\n\t\t}\n\t};\n\n\t/**\n\t * Disables all extensions.\n\t */\n\tthis.disableAllExtensions = function () {\n\t\tthat.disableExtensions(that.getExtensionsList());\n\t};\n\n\t/**\n\t * Disables list of extensions one by one. Calls optional callback when all extensions from the list are disabled.\n\t * @param {Array.<Object>} list\n\t * @param {function(): void=} callback\n\t */\n\tthis.disableExtensions = function (list, callback) {\n\t\tvar i;\n\n\t\tif (list.length > 0) {\n\t\t\tfor (i in list) {\n\t\t\t\tvar extension = list[i];\n\t\t\t\tthat.disableExtension(extension);\n\t\t\t}\n\t\t}\n\n\t\tif (typeof callback === \"function\") {\n\t\t\tcallback();\n\t\t}\n\t};\n\n\t/**\n\t * Disable single extension (alias method).\n\t * @param {Object} extension\n\t */\n\tthis.disableExtension = function (extension) {\n\t\tthat.enableExtension(extension, false);\n\t};\n\n\tthis.init(onLoadCallback);//constructor\n}\n"
  },
  {
    "path": "js/classes/HugeStorageSync.class.js",
    "content": "function HugeStorageSync() {\n\t\"use strict\";\n\n\tfunction getCacheKey(key, i) {\n\t\treturn (i === 0) ? key : key + \"_\" + i;\n\t}\n\n\t/**\n\t * Allows to save strings longer than QUOTA_BYTES_PER_ITEM in chrome.storage.sync by splitting them into smaller parts.\n\t * Please note that you still can't save more than QUOTA_BYTES.\n\t *\n\t * @param {string} key\n\t * @param {string} value\n\t * @param {function(): void=} callback\n\t */\n\tthis.set = function(key, value, callback) {\n\t\tvar i = 0,\n\t\t\tcache = {},\n\t\t\tsegment,\n\t\t\tcacheKey;\n\n\t\t// split value into chunks and store them in an object indexed by `key_i`\n\t\twhile(value.length > 0) {\n\t\t\tcacheKey = getCacheKey(key, i);\n\t\t\t//if you are wondering about -2 at the end see: https://code.google.com/p/chromium/issues/detail?id=261572\n\t\t\tsegment = value.substr(0, chrome.storage.sync.QUOTA_BYTES_PER_ITEM - cacheKey.length - 2);\n\t\t\tcache[cacheKey] = segment;\n\t\t\tvalue = value.substr(chrome.storage.sync.QUOTA_BYTES_PER_ITEM - cacheKey.length - 2);\n\t\t\ti++;\n\t\t}\n\n\t\t// store all the chunks\n\t\tchrome.storage.sync.set(cache, callback);\n\n\t\t//we need to make sure that after the last chunk we have an empty chunk. Why this is so important?\n\t\t// Saving v1 of our object. Chrome sync status: [chunk1v1] [chunk2v1] [chunk3v1]\n\t\t// Saving v2 of our object (a bit smaller). Chrome sync status: [chunk1v2] [chunk2v2] [chunk3v1]\n\t\t// When reading this configuration back we will end up with chunk3v1 being appended to the chunk1v2+chunk2v2\n\t\tchrome.storage.sync.remove(getCacheKey(key, i));\n\t};\n\n\n\t/**\n\t * Retrieves chunks of value stored in chrome.storage.sync and combines them.\n\t *\n\t * @param {string} key\n\t * @param {function(string):void=} callback\n\t */\n\tthis.get = function(key, callback) {\n\t\t//get everything from storage\n\t\tchrome.storage.sync.get(null, function(items) {\n\t\t\tvar i, value = \"\";\n\n\t\t\tfor(i=0; i<chrome.storage.sync.MAX_ITEMS; i++) {\n\t\t\t\tif(items[getCacheKey(key, i)] === undefined) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tvalue += items[getCacheKey(key, i)];\n\t\t\t}\n\n\t\t\tcallback(value);\n\t\t});\n\t};\n}"
  },
  {
    "path": "js/classes/IconAnimation.class.js",
    "content": "function IconAnimation(config) {\n\t\"use strict\";\n\tvar animationFrames = 36,\n\t\tanimationSpeed = 10,//ms\n\t\trotation = 0,\n\t\tcanvas = config.canvasObj,\n\t\tcanvasContext,\n\t\timage = config.imageObj,\n\t\tdefaultIcon = config.defaultIcon;\n\n\tthis.animate = function (icon) {\n\t\timage.src = icon;\n\n\t\tchrome.browserAction.setIcon({path: icon});\n\t\tsetTimeout(animateFlip, 1500);\n\t};\n\n\tvar ease = function (x) {\n\t\treturn (1 - Math.sin(Math.PI / 2 + x * Math.PI)) / 2;\n\t};\n\n\tvar animateFlip = function () {\n\t\trotation += 1 / animationFrames;\n\t\tdrawIconAtRotation();\n\t\tif (rotation <= 1) {\n\t\t\tsetTimeout(animateFlip, animationSpeed);\n\t\t} else {\n\t\t\trotation = 0;\n\t\t\tdrawIconAtRotation();\n\t\t\tchrome.browserAction.setIcon({path: defaultIcon});\n\t\t}\n\t};\n\n\tvar drawIconAtRotation = function () {\n\t\tcanvasContext.save();\n\t\tcanvasContext.clearRect(0, 0, canvas.width, canvas.height);\n\t\tcanvasContext.translate(\n\t\t\tMath.ceil(canvas.width / 2),\n\t\t\tMath.ceil(canvas.height / 2));\n\t\tcanvasContext.rotate(2 * Math.PI * ease(rotation));\n\t\tcanvasContext.drawImage(image,\n\t\t\t-Math.ceil(canvas.width / 2),\n\t\t\t-Math.ceil(canvas.height / 2));\n\t\tcanvasContext.restore();\n\n\t\tchrome.browserAction.setIcon({imageData: canvasContext.getImageData(0, 0, canvas.width, canvas.height)});\n\t};\n\n\tcanvasContext = canvas.getContext('2d');\n\n\tchrome.browserAction.setIcon({path: defaultIcon});\n}"
  },
  {
    "path": "js/libs/Base64.js",
    "content": "/**\n *\n *  Base64 encode / decode\n *  http://www.webtoolkit.info/\n *\n **/\n\nvar Base64 = {\n\n    // private property\n    _keyStr: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",\n\n    // public method for encoding\n    encode: function (input) {\n        var output = \"\";\n        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;\n        var i = 0;\n\n        input = Base64._utf8_encode(input);\n\n        while (i < input.length) {\n\n            chr1 = input.charCodeAt(i++);\n            chr2 = input.charCodeAt(i++);\n            chr3 = input.charCodeAt(i++);\n\n            enc1 = chr1 >> 2;\n            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n            enc4 = chr3 & 63;\n\n            if (isNaN(chr2)) {\n                enc3 = enc4 = 64;\n            } else if (isNaN(chr3)) {\n                enc4 = 64;\n            }\n\n            output = output +\n                this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +\n                this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);\n\n        }\n\n        return output;\n    },\n\n    // public method for decoding\n    decode: function (input) {\n        var output = \"\";\n        var chr1, chr2, chr3;\n        var enc1, enc2, enc3, enc4;\n        var i = 0;\n\n        input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\n        while (i < input.length) {\n\n            enc1 = this._keyStr.indexOf(input.charAt(i++));\n            enc2 = this._keyStr.indexOf(input.charAt(i++));\n            enc3 = this._keyStr.indexOf(input.charAt(i++));\n            enc4 = this._keyStr.indexOf(input.charAt(i++));\n\n            chr1 = (enc1 << 2) | (enc2 >> 4);\n            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n            chr3 = ((enc3 & 3) << 6) | enc4;\n\n            output = output + String.fromCharCode(chr1);\n\n            if (enc3 != 64) {\n                output = output + String.fromCharCode(chr2);\n            }\n            if (enc4 != 64) {\n                output = output + String.fromCharCode(chr3);\n            }\n\n        }\n\n        output = Base64._utf8_decode(output);\n\n        return output;\n\n    },\n\n    // private method for UTF-8 encoding\n    _utf8_encode: function (string) {\n        string = string.replace(/\\r\\n/g, \"\\n\");\n        var utftext = \"\";\n\n        for (var n = 0; n < string.length; n++) {\n\n            var c = string.charCodeAt(n);\n\n            if (c < 128) {\n                utftext += String.fromCharCode(c);\n            }\n            else if ((c > 127) && (c < 2048)) {\n                utftext += String.fromCharCode((c >> 6) | 192);\n                utftext += String.fromCharCode((c & 63) | 128);\n            }\n            else {\n                utftext += String.fromCharCode((c >> 12) | 224);\n                utftext += String.fromCharCode(((c >> 6) & 63) | 128);\n                utftext += String.fromCharCode((c & 63) | 128);\n            }\n\n        }\n\n        return utftext;\n    },\n\n    // private method for UTF-8 decoding\n    _utf8_decode: function (utftext) {\n        var string = \"\";\n        var i = 0;\n        var c = c1 = c2 = 0;\n\n        while (i < utftext.length) {\n\n            c = utftext.charCodeAt(i);\n\n            if (c < 128) {\n                string += String.fromCharCode(c);\n                i++;\n            }\n            else if ((c > 191) && (c < 224)) {\n                c2 = utftext.charCodeAt(i + 1);\n                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n                i += 2;\n            }\n            else {\n                c2 = utftext.charCodeAt(i + 1);\n                c3 = utftext.charCodeAt(i + 2);\n                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n                i += 3;\n            }\n\n        }\n\n        return string;\n    }\n};"
  },
  {
    "path": "js/notification.js",
    "content": "var contextsManager = new ContextsManager();\nvar extensionsManager = new ExtensionsManager();\n\n$(document).ready(function () {\n\t//load translations\n\t$('[data-i18n]').each(function (i, item) {\n\t\t$(item).text(chrome.i18n.getMessage($(item).data('i18n')));\n\t});\n\n\t//gather information about extension that was just installed\n\tvar extdata = chrome.extension.getBackgroundPage().getNewestExtension();\n\n\tif (!extdata || !extdata.name || !extdata.id) {\n\t\twindow.close();\n\t} else {\n\t\t$('#extensionName').text(extdata.name);\n\t\tdisplayContexts();\n\n\t\t$('ul').bind(\"mousedown\",function (e) {\n\t\t\te.metaKey = true;\n\t\t}).selectable({\n\t\t\t\tfilter: 'div',\n\t\t\t\tselected: function (event, ui) {\n\t\t\t\t\t$('#always_enabled').removeClass('ui-selected');\n\t\t\t\t}\n\t\t\t});\n\n\t\t$('#notification').bind(\"mousedown\",function (e) {\n\t\t\te.metaKey = true;\n\t\t}).selectable({\n\t\t\t\tfilter: '#always_enabled',\n\t\t\t\tselected: function (event, ui) {\n\t\t\t\t\t$('div.ui-selected').removeClass('ui-selected');\n\t\t\t\t}\n\t\t\t});\n\n\t\t$('#new_context').bind(\"click\", function () {\n\t\t\tvar input = $('<input>').attr({\n\t\t\t\ttype: 'text',\n\t\t\t\tclass: 'text ui-widget-content ui-corner-all'\n\t\t\t}).keydown(function (event) {\n\t\t\t\t//wait for ENTER\n\t\t\t\tif (event.keyCode === 13) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tvar contextName = $(this).val(),\n\t\t\t\t\t\tcontextImg = 'icons/dortmund/settings.png';\n\n\t\t\t\t\t//check if name provided isn't already in use\n\t\t\t\t\tif(contextsManager.contextExists(contextName) || contextName.length === 0) {\n\t\t\t\t\t\t$(this).addClass('ui-state-error');\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\t//create new context with default icon\n\t\t\t\t\tcontextsManager.newContext(contextName, contextImg);\n\t\t\t\t\t//save configuration\n\t\t\t\t\tchrome.extension.getBackgroundPage().configUpdated();\n\n\t\t\t\t\t//append new context\n\t\t\t\t\t$('ul').append(createContextLi(contextName, contextName, contextImg)).find(\"div:last\").addClass('ui-selected');\n\t\t\t\t\t//remove input field\n\t\t\t\t\t$(this).remove();\n\t\t\t\t\t//clear 'always enabled' selection\n\t\t\t\t\t$('#always_enabled').removeClass('ui-selected');\n\t\t\t\t\t//show 'new context' button\n\t\t\t\t\t$('#new_context').show();\n\t\t\t\t}\n\t\t\t\t$(this).removeClass('ui-state-error');\n\t\t\t});\n\n\t\t\t//show input and hide the button\n\t\t\tinput.insertBefore($(this)).focus();\n\t\t\t$(this).hide();\n\t\t});\n\n\t\t$('button').button();\n\n\t\t$('#do_nothing').click(function () {\n\t\t\twindow.close();\n\t\t});\n\n\t\t$('#save').click(function () {\n\t\t\tif ($('#always_enabled').is('.ui-selected')) {\n\t\t\t\textensionsManager.init();\n\t\t\t\textensionsManager.addExtensionToAlwaysEnabled(extdata.id);\n\t\t\t\textensionsManager.save();\n\n\t\t\t\tchrome.extension.getBackgroundPage().configUpdated();\n\t\t\t} else {\n\t\t\t\taddToContexts(extdata.id, $('div.ui-selected'));\n\t\t\t}\n\t\t\twindow.close();\n\t\t});\n\t}\n});\n\nfunction displayContexts() {\n\t//load and display available contexts\n\tvar contexts = contextsManager.getContextsList();\n\n\t$.each(contexts, function (i, context) {\n\t\t$('ul').append(createContextLi(context.name, context.name, context.imgSrc));\n\t});\n}\n\nfunction createContextLi(name, title, imgSrc) {\n\tvar img = $('<img>').attr('src', imgSrc);\n\tvar span = $('<span>').append(title);\n\n\tvar context = $('<div>').attr('class', 'list-context ui-widget-content ui-corner-all').append(img).append(span).data('contextName', name);\n\n\treturn $('<li>').append(context);\n}\n\n//add extension to selected contexts\nfunction addToContexts(extid, selectedContexts) {\n\t//reload contexts list - just in case\n\tcontextsManager.init();\n\n\tif (selectedContexts.length > 0) {\n\t\t$.each($(selectedContexts), function (idx, contextElem) {\n\t\t\tcontextsManager.addExtensionToContext($(contextElem).data('contextName'), extid);\n\t\t});\n\n\t\tcontextsManager.save();\n\t\tchrome.extension.getBackgroundPage().configUpdated();\n\t}\n}"
  },
  {
    "path": "js/options/dialogs.js",
    "content": "//open \"new context\" dialog\nfunction openNewContextDialog() {\n\tvar buttons = {};\n\tbuttons[chrome.i18n.getMessage(\"create\")] = function() {\n\t\t\t\tclearDialogErrors($(this));\n\t\t\t\t$(this).find('input, ul').removeClass(\"ui-state-error\");\n\n\t\t\t\tvar isValid = true;\n\n\t\t\t\tvar contextName = $('#context-name').val();\n\t\t\t\tif(contextName.length == 0) {\n\t\t\t\t\t$('#context-name').addClass(\"ui-state-error\");\n\t\t\t\t\tisValid = false;\n\t\t\t\t\taddDialogError($(this), chrome.i18n.getMessage(\"name_field_is_required\"));\n\t\t\t\t}\n\n\t\t\t\tvar contexts = $('.contextExtensions');\n\t\t\t\tfor(var i=0; i<contexts.length; i++) {\n\t\t\t\t\tvar context = contexts[i];\n\t\t\t\t\tif($(context).data('contextName') == contextName) {\n\t\t\t\t\t\t$('#context-name').addClass(\"ui-state-error\");\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t\taddDialogError($(this), chrome.i18n.getMessage(\"this_name_is_already_in_use\"));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar selectedIcon = $('#context-icons li.ui-selected img');\n\t\t\t\tif(selectedIcon.length == 0) {\n\t\t\t\t\t$('#context-icons').addClass(\"ui-state-error\");\n\t\t\t\t\tisValid = false;\n\t\t\t\t\taddDialogError($(this), chrome.i18n.getMessage(\"pick_an_icon\"));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar showIcon = $(\"#showExtensionIcon\").is(':checked') ? 'show_extension' : 'show_context';\n\n\t\t\t\tif ( isValid ) {\n\t\t\t\t\tvar context = newContext(contextName, selectedIcon.attr('src'), showIcon);\n\t\t\t\t\t$('#contexts').append(context);\n\t\t\t\t\tcontext.effect('highlight', {}, 'slow');\n\t\t\t\t\t$( this ).dialog( \"close\" );\n\t\t\t\t\tmarkDirty();\n\t\t\t\t}\n\t\t\t};\n\n\tbuttons[chrome.i18n.getMessage(\"cancel\")] = function() {\n\t\t$( this ).dialog( \"close\" );\n\t};\n\n\t$( '#new-context-form' )\n\t\t.dialog( \"option\", \"title\", chrome.i18n.getMessage(\"create_new_context\") )\n\t\t.dialog( \"option\", \"buttons\", buttons)\n\t\t.dialog( \"open\" );\n}\n\n//open \"edit context\" dialog\nfunction openEditContextDialog(context) {\n\tvar contextName = context.find('.contextExtensions').data('contextName');\n\tvar contextImg = context.find('.contextExtensions').data('contextImg');\n\tvar contextIcon = context.find('.contextExtensions').data('contextIcon') || 'show_context';\n\n\t$( '#new-context-form' ).find('input[name=context-name]').val(contextName);\n\t$( '#new-context-form' ).find('img[src=\"'+contextImg+'\"]').parent().addClass('ui-selected');\n\t$( '#new-context-form' ).find('#showExtensionIcon').prop('checked', (contextIcon === 'show_extension'));\n\n\tvar buttons = {};\n\tbuttons[chrome.i18n.getMessage(\"save\")] = function() {\n\t\t\t\tclearDialogErrors($(this));\n\t\t\t\t$(this).find('input, ul').removeClass(\"ui-state-error\");\n\n\t\t\t\tvar isValid = true;\n\n\t\t\t\tvar contextName = $('#context-name').val();\n\t\t\t\tif(contextName.length == 0) {\n\t\t\t\t\t$('#context-name').addClass(\"ui-state-error\");\n\t\t\t\t\tisValid = false;\n\t\t\t\t\taddDialogError($(this), chrome.i18n.getMessage(\"name_field_is_required\"));\n\t\t\t\t}\n\n\t\t\t\tvar contexts = $('.contextExtensions');\n\t\t\t\tfor(var i=0; i<contexts.length; i++) {\n\t\t\t\t\tvar otherContext = contexts[i];\n\t\t\t\t\tif($(otherContext).closest('.context')[0] != context[0] && $(otherContext).data('contextName') == contextName) {\n\t\t\t\t\t\t$('#context-name').addClass(\"ui-state-error\");\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t\taddDialogError($(this), chrome.i18n.getMessage(\"this_name_is_already_in_use\"));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar selectedIcon = $('#context-icons li.ui-selected img');\n\t\t\t\tif(selectedIcon.length == 0) {\n\t\t\t\t\t$('#context-icons').addClass(\"ui-state-error\");\n\t\t\t\t\tisValid = false;\n\t\t\t\t\taddDialogError($(this), chrome.i18n.getMessage(\"pick_an_icon\"));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar showIcon = $(\"#showExtensionIcon\").is(':checked') ? 'show_extension' : 'show_context';\n\n\t\t\t\tif ( isValid ) {\n\t\t\t\t\tcontext.find('.contextExtensions').data('contextName', contextName);\n\t\t\t\t\tcontext.find('.contextExtensions').data('contextImg', selectedIcon.attr('src'));\n\t\t\t\t\tcontext.find('.contextExtensions').data('contextIcon', showIcon);\n\n\t\t\t\t\tcontext.find('.contextTitle').text(contextName);\n\t\t\t\t\tcontext.find('.contextIcon').attr('src', selectedIcon.attr('src'));\n\n\t\t\t\t\tcontext.effect('highlight', {}, 'slow');\n\n\t\t\t\t\t$( this ).dialog( \"close\" );\n\t\t\t\t\tmarkDirty();\n\t\t\t\t}\n\t\t\t};\n\n\tbuttons[chrome.i18n.getMessage(\"cancel\")] = function() {\n\t\t\t$( this ).dialog( \"close\" );\n\t\t};\n\n\t$( '#new-context-form' )\n\t\t.dialog( \"option\", {\n\t\t\ttitle: chrome.i18n.getMessage(\"edit_context\"),\n\t\t\tbuttons: buttons,\n\t\t\twidth: 370\n\t\t})\n\t\t.dialog( \"open\" );\n}\n\n//remove errors from edit/new context form\nfunction clearDialogErrors(dialog) {\n\t$(dialog).find('.errors').empty().hide();\n}\n\n//append new context edit/new form error\nfunction addDialogError(dialog, error) {\n\tvar icon = $('<span />').attr('class', 'ui-icon ui-icon-info').attr('style', 'float: left; margin-right: .3em;');\n\tvar p = $('<p />').append(icon).append(error);\n\t$(dialog).find('.errors').append(p).show();\n}\n\n//init basic dialog for editing / adding new contexts\nfunction initNewContextDialog() {\n\tvar icons = CONFIG.get(\"icons\");\n\tfor(var index in icons) {\n\t\tvar iconName = icons[index];\n\t\tvar iconImg = $('<img/>').attr('src', CONFIG.get(\"iconsPath\") + iconName + '.png').attr('alt', iconName);\n\t\tvar iconBox = $('<li/>').addClass('ui-widget-content').addClass('ui-corner-all').append(iconImg);\n\n\t\t$( \"#context-icons\" ).append(iconBox);\n\t}\n\n\t//selectable icons\n\t$( \"#context-icons li\" ).click(function() {\n\t\t$(this).addClass(\"ui-selected\").siblings().removeClass(\"ui-selected\");\n\t});\n\n\t$( \"#new-context-form\" ).dialog({\n\t\tautoOpen: false,\n\t\tresizable: false,\n\t\twidth: 370,\n\t\tmodal: true,\n\t\tclose: function() {\n\t\t\tclearDialogErrors($(this));\n\t\t\t$(this).find('.ui-selected').removeClass(\"ui-selected\");\n\t\t\t$(this).find('input:text').val( \"\" ).removeClass(\"ui-state-error\");\n\t\t\t$(this).find('ul').removeClass( \"ui-state-error\" );\n\t\t\t$(this).find('#showExtensionIcon').prop('checked', false);\n\t\t}\n\t}).find('form').submit(function(){\n\t\treturn false;\n\t});\n}\n\nfunction showErrorDialog(config) {\n\tvar buttons = {};\n\tbuttons[chrome.i18n.getMessage(\"close\")] = function() {\n\t\t$( this ).dialog( \"close\" );\n\t};\n\n\t$( \"#dialog-confirm\" ).dialog({\n\t\ttitle: config.title,\n\t\tresizable: false,\n\t\theight: 200,\n\t\tmodal: true,\n\t\tbuttons: buttons\n\t}).find('span.dialog-content').text(config.content);\n}\n\nfunction importSuccessDialog(config) {\n\tvar dialogElem = $( \"#dialog-import-success\" );\n\tvar dialogHeight = 200;\n\tvar buttons = {};\n\tbuttons[chrome.i18n.getMessage(\"close\")] = function() {\n\t\t$( this ).dialog( \"close\" );\n\n\t\tif(typeof config.callback == \"function\") {\n\t\t\tconfig.callback();\n\t\t}\n\t};\n\n\tif(config.missingExtensions.length > 0) {\n\t\tdialogElem.find('p:eq(1), ul').show();\n\t\tvar extensionsList = dialogElem.find('ul');\n\t\textensionsList.empty();\n\n\t\t$.each(config.missingExtensions, function(i, item){\n\t\t\tvar extensionLink = $('<a>').text(item.name).attr('href', 'https://chrome.google.com/webstore/detail/' + item.id).attr('target', '_blank');\n\n\t\t\textensionsList.append($('<li>').append(extensionLink));\n\t\t});\n\n\t\tdialogHeight = 'auto';\n\t} else {\n\t\tdialogElem.find('p:eq(1), ul').hide();\n\t}\n\n\t$( \"#dialog-import-success\" ).dialog({\n\t\ttitle: chrome.i18n.getMessage(\"successful_import\"),\n\t\tresizable: false,\n\t\theight: dialogHeight,\n\t\tmodal: true,\n\t\tbuttons: buttons\n\t});\n}"
  },
  {
    "path": "js/options/firstrun.js",
    "content": "var welcomeTab;\nvar welcomeScreenReady = false;\n\n//display welcome screen and tutorial\nfunction showWelcomeScreen() {\n\twelcomeTab = 0;\n\t$('#welcome li:gt(0)').hide();\n\t$('#welcome li:eq(0)').show();\n\t$('#welcome .previous').button('option', 'disabled', true);\n\t$('#welcome .next').show().button('option', 'disabled', false);\n\t$('#welcome .close').hide();\n\n\tif(!welcomeScreenReady) {\n\t\tinitWelcomeScreen();\n\t\twelcomeScreenReady = true;\n\t}\n\n\t$('#welcome').dialog( \"open\" );\n}\n\nfunction initWelcomeScreen() {\n\t$('#welcome').show().dialog({\n\t\ttitle: chrome.i18n.getMessage(\"welcome\") + '!',\n\t\tresizable: false,\n\t\twidth: 510,\n\t\tmodal: true\n\t});\n\n\t$('#welcome .next').click(function() {\n\t\tif(welcomeTab + 1 == $('#welcome li').length) {\n\t\t\treturn;\n\t\t}\n\n\t\twelcomeTab++;\n\n\t\tif(welcomeTab + 1 == $('#welcome li').length) {\n\t\t\t$(this).button('option', 'disabled', true);\n\t\t\t$(this).hide();\n\t\t\t$('#welcome .close').show();\n\t\t}\n\n\t\t$('#welcome .previous').button('option', 'disabled', false);\n\n\t\t$('#welcome li').hide();\n\t\t$('#welcome li:eq(' + welcomeTab + ')').show();\n\t});\n\n\t$('#welcome .previous').click(function() {\n\t\tif(welcomeTab - 1 < 0) {\n\t\t\treturn;\n\t\t}\n\n\t\twelcomeTab--;\n\n\t\t$('#welcome .next').show();\n\t\t$('#welcome .close').hide();\n\n\t\tif(welcomeTab - 1 < 0) {\n\t\t\t$(this).button('option', 'disabled', true);\n\t\t}\n\n\t\t$('#welcome .next').button('option', 'disabled', false);\n\n\t\t$('#welcome li').hide();\n\t\t$('#welcome li:eq(' + welcomeTab + ')').show();\n\t});\n\n\t$('#welcome .close').click(function() {\n\t\t$('#welcome').dialog( \"close\" );\n\t});\n}"
  },
  {
    "path": "js/options/main.js",
    "content": "var extensionsManager;\nvar contextsManager;\nvar configurationBackupExporter = new ConfigurationBackupExporter();\nvar configurationBackupImporter = new ConfigurationBackupImporter();\nvar storageSync = new HugeStorageSync();\n\n//display list of all extensions\nfunction displayExtensions() {\n\t//get the processed list back from ExtensionsManager\n\tvar extensionsList = extensionsManager.getExtensionsList();\n\n\t$('#extensions, #always_enabled_extensions').empty();\n\n\tfor (var index in extensionsList) {\n\t\tvar extension = extensionsList[index];\n\n\t\tvar li = createExtensionLi(extension);\n\n\t\tif (extensionsManager.isAlwaysEnabled(extension.id)) {\n\t\t\t$('#always_enabled_extensions').append(li);\n\t\t} else {\n\t\t\t$('#extensions').append(li);\n\t\t}\n\t}\n\n\t$('#extensions li, #always_enabled_extensions li').draggable({\n\t\tzIndex: 1000,\n\t\thelper: 'clone',\n\t\topacity: 0.75,\n\t\trevert: 'invalid'\n\t});\n}\n\n//create list element representing an extension\nfunction createExtensionLi(extdata) {\n\t//use smallest extension icon if it exists\n\tvar icon = (extdata.icons && extdata.icons.length) ? (extdata.icons[0].url) : ('icons/plugin.png');\n\n\tvar img = $('<img>').attr('src', icon);\n\tvar span = $('<span/>').addClass('extensionName').text(extdata.name);\n\tvar removeImg = $('<span />').attr('class', 'ui-icon ui-icon-circle-close');\n\tvar removeBtn = $('<div />').addClass('removeBtn').append(removeImg);\n\tvar status = 'status-' + ((extdata.enabled == true) ? 'enabled' : 'disabled');\n\tvar li = $('<li>').addClass('ui-widget-content').addClass('ui-corner-all ' + status).attr('data-extid', extdata.id).attr('data-exticon', icon).append(img).append(span).append(removeBtn);\n\n\tif (extdata.isApp) {\n\t\tli.addClass('app');\n\n\t\t//if apps support is disabled don't show them\n\t\tif (CONFIG.get('appsSupport') === 'false') {\n\t\t\tli.hide();\n\t\t}\n\t}\n\n\treturn li;\n}\n\n//display available contexts\nfunction displayContexts() {\n\tvar contexts = contextsManager.getContextsList();\n\n\t$('#contexts').empty();\n\n\tfor (var gindex in contexts) {\n\t\tvar context = contexts[gindex];\n\t\tvar contextObj = newContext(context.name, context.imgSrc, context.icon);\n\n\t\tvar contextUl = contextObj.find('ul');\n\n\t\tfor (var eindex in context.extensions) {\n\t\t\tvar extension = context.extensions[eindex];\n\t\t\tvar extData = extensionsManager.getExtensionData(extension.id);\n\n\t\t\tif (extData) {\n\t\t\t\tvar extLi = createExtensionLi(extData);\n\t\t\t\tcontextUl.append(extLi);\n\t\t\t}\n\t\t}\n\n\t\t$('#contexts').append(contextObj);\n\t}\n\n\t$('#contexts').sortable({\n\t\tforcePlaceholderSize: true,\n\t\thandle: '.contextGrip',\n\t\tplaceholder: 'context ui-state-highlight',\n\t\ttolerance: 'pointer',\n\t\tchange: function (event, ui) {\n\t\t\tmarkDirty();\n\t\t}\n\t});\n}\n\n//check if extension is already in given context\nfunction isInContext(context, newExtension) {\n\tvar extensions = context.find('li');\n\tvar exists = false;\n\tvar newExtId = newExtension.data('extid');\n\n\t$.each(extensions, function (i, extension) {\n\t\tif ($(extension).data('extid') == newExtId) {\n\t\t\texists = true;\n\t\t}\n\t});\n\n\treturn exists;\n}\n\n//create new list object representing context\nfunction newContext(name, imgSrc, showIcon) {\n\tvar contextImg = $('<img/>').addClass('contextIcon').attr('src', imgSrc);\n\tvar contextSpan = $('<span/>').addClass('contextTitle').text(name);\n\tvar contextIcon = (showIcon || false);\n\tvar contextGrip = $('<div/>').attr('title', chrome.i18n.getMessage(\"move\")).addClass('contextGrip').append(contextImg).append(contextSpan);\n\tvar contextMenu = $('<div class=\"contextMenu\">' +\n\t\t'<a href=\"#\" class=\"contextDuplicate\"><span class=\"ui-icon ui-icon-copy\" title=\"' + chrome.i18n.getMessage(\"clone\") + '\"></span></a>' +\n\t\t'<a href=\"#\" class=\"contextEdit\"><span class=\"ui-icon ui-icon-wrench\" title=\"' + chrome.i18n.getMessage(\"edit\") + '\"></span></a>' +\n\t\t'<a href=\"#\" class=\"contextDelete\"><span class=\"ui-icon ui-icon-closethick\" title=\"' + chrome.i18n.getMessage(\"delete\") + '\"></span></a>' +\n\t\t'</div>');\n\tvar contextUl = $('<ul>').addClass('contextExtensions').data('contextName', name).data('contextImg', imgSrc).data('contextIcon', contextIcon);\n\tvar contextLi = $('<li>').addClass('ui-widget-content').addClass('ui-corner-all').addClass('context').append(contextGrip).append(contextMenu).append(contextUl);\n\n\tcontextUl.sortable({\n\t\tplaceholder: 'ui-widget-content ui-corner-all ui-state-highlight',\n\t\tforcePlaceholderSize: true,\n\t\ttolerance: 'pointer',\n\t\trevert: true,\n\t\tchange: function () {\n\t\t\tmarkDirty();\n\t\t}\n\t});\n\n\tcontextUl.droppable({\n\t\tactiveClass: 'active',\n\t\thoverClass: 'active_hover',\n\t\taccept: function (element) {\n\t\t\treturn element.is('#extensions li') && !isInContext($(this), element);\n\t\t},\n\t\tdrop: function (event, ui) {\n\t\t\tif (ui.draggable.parent().is(\"#extensions\")) {\n\t\t\t\tvar li = ui.draggable.clone();\n\t\t\t\t$(this).append(li);\n\t\t\t}\n\n\t\t\t$(this).sortable(\"refresh\");\n\n\t\t\tmarkDirty();\n\t\t}\n\t});\n\n\treturn contextLi;\n}\n\nfunction importConfiguration(configurationString) {\n\tvar buttons = {};\n\tbuttons[chrome.i18n.getMessage(\"import\")] = function () {\n\t\tconfigurationBackupImporter.importConfig(configurationString, function (status, missingExtensions, errors) {\n\t\t\tif (status) {\n\t\t\t\timportSuccessDialog({\n\t\t\t\t\tmissingExtensions: missingExtensions,\n\t\t\t\t\tcallback: function () {\n\t\t\t\t\t\tloadConfiguration();\n\t\t\t\t\t\t$('#import_box').val('');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\twindow.console.error(errors);\n\n\t\t\t\tshowErrorDialog({\n\t\t\t\t\ttitle: chrome.i18n.getMessage(\"import_failed\"),\n\t\t\t\t\tcontent: chrome.i18n.getMessage(\"configuration_string_is_invalid\")\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t$(this).dialog(\"close\");\n\t};\n\tbuttons[chrome.i18n.getMessage(\"cancel\")] = function () {\n\t\t$(this).dialog(\"close\");\n\t};\n\n\t$(\"#dialog-confirm\").dialog({\n\t\ttitle: chrome.i18n.getMessage(\"override_current_settings\"),\n\t\tresizable: false,\n\t\twidth: 300,\n\t\theight: 200,\n\t\tmodal: true,\n\t\tbuttons: buttons\n\t}).find('span.dialog-content').text(chrome.i18n.getMessage(\"confirm_configuration_import\"));\n}\n\n//mark config as modified\nfunction markDirty() {\n\t$(\"#save-button\").button(\"option\", \"disabled\", false);\n\thighlightUngrouped();\n}\n\n//mark config as saved\nfunction markClean() {\n\t$(\"#save-button\").button(\"option\", \"disabled\", true);\n\n\t//generates current configuration string - used for import/export\n\tconfigurationBackupExporter.exportConfig(function (exportedConfig) {\n\t\t$('#export_box').val(exportedConfig);\n\t});\n}\n\n//save context data and additional options in localStorage\nfunction save() {\n\tvar contextsData = [];\n\n\tvar contexts = $('.contextExtensions');\n\t$.each(contexts, function (i, context) {\n\t\tvar contextName = $(context).data('contextName');\n\t\tvar contextImg = $(context).data('contextImg');\n\t\tvar contextIcon = $(context).data('contextIcon');\n\t\tvar contextObj = {\n\t\t\t'name': contextName,\n\t\t\t'imgSrc': contextImg,\n\t\t\t'icon': contextIcon,\n\t\t\t'extensions': []\n\t\t};\n\n\t\tvar extensions = $(context).find('li:visible');\n\n\t\t$.each(extensions, function (i, extension) {\n\t\t\tvar extid = $(extension).data('extid');\n\t\t\tvar exticon = $(extension).data('exticon');\n\t\t\tvar extObj = {\n\t\t\t\tid: extid,\n\t\t\t\ticon: exticon\n\t\t\t};\n\n\t\t\tcontextObj.extensions.push(extObj);\n\t\t});\n\n\t\tcontextsData.push(contextObj);\n\t});\n\n\tlocalStorage.contexts = JSON.stringify(contextsData);\n\n\tvar alwaysEnabledExtensionsData = [];\n\tvar extensions = $('#always_enabled_extensions li');\n\n\t$.each(extensions, function (i, extension) {\n\t\tvar extid = $(extension).data('extid');\n\n\t\talwaysEnabledExtensionsData.push(extid);\n\t});\n\n\textensionsManager.setAlwaysEnabledExtensionsIds(alwaysEnabledExtensionsData);\n\tlocalStorage.alwaysEnabledExtensions = JSON.stringify(alwaysEnabledExtensionsData);\n\n\tsaveAdvancedOptions();\n\n\tchrome.extension.getBackgroundPage().configUpdated();\n\tmarkClean();\n}\n\nvar advancedOptions = ['appsSupport', 'newExtensionAction', 'showLoadAllBtn', 'extensionEnableDelay'];\n\nfunction saveAdvancedOptions() {\n\tfor (var i in advancedOptions) {\n\t\tvar option = advancedOptions[i];\n\n\t\tif ($('#' + option).is('[type=checkbox]')) {\n\t\t\tlocalStorage[option] = $('#' + option).is(':checked');\n\t\t} else {\n\t\t\tlocalStorage[option] = $('#' + option).val();\n\t\t}\n\t}\n}\n\nfunction displayAdvancedOptions() {\n\tfor (var i in advancedOptions) {\n\t\tvar option = advancedOptions[i];\n\t\tvar $option = $('#' + option);\n\n\t\tif ($option.is('[type=checkbox]')) {\n\t\t\tif (CONFIG.get(option) === 'true') {\n\t\t\t\t$option.attr('checked', 'checked');\n\t\t\t} else {\n\t\t\t\t$option.removeAttr('checked');\n\t\t\t}\n\t\t} else if ($option.is('select')) {\n\t\t\t$option.find('option').removeAttr('selected');\n\t\t\t$option.find('option[value=' + CONFIG.get(option) + ']').attr('selected', 'selected');\n\t\t} else {\n\t\t\t$option.val(CONFIG.get(option));\n\t\t}\n\t}\n}\n\n//actions performed after config page is fully loaded\nfunction pageLoaded() {\n\t$('#loader').slideUp('slow', function () {\n\t\t$('#content').slideDown('slow', function () {\n\t\t\t//display welcome screen if extension was just installed\n\t\t\tif (CONFIG.get('firstRun') == 'yes') {\n\t\t\t\tshowWelcomeScreen();\n\t\t\t\tlocalStorage.firstRun = 'no';\n\t\t\t}\n\t\t});\n\t});\n}\n\n//highlights not grouped extensions inside 'Available extensions' box\nfunction highlightUngrouped() {\n\tvar enabled = $('#highlightUngrouped').is(':checked');\n\n\t//remove .ui-state-active class from all extensions in contexts, always-enabled box and available extensions box\n\t$('.extensions_list li.ui-state-active, .contextExtensions li.ui-state-active').removeClass('ui-state-active');\n\n\tif (enabled) {\n\t\t$.each($('#extensions li'), function (i, extensionElem) {\n\t\t\tvar extid = $(extensionElem).data('extid');\n\n\t\t\tif ($('.context li[data-extid=' + extid + ']').length === 0) {\n\t\t\t\t$(extensionElem).addClass('ui-state-active');\n\t\t\t}\n\t\t});\n\t}\n}\n\nfunction loadConfiguration() {\n\tcontextsManager = new ContextsManager();\n\textensionsManager = new ExtensionsManager(function () {\n\t\tdisplayExtensions();\n\t\tdisplayContexts();\n\t\tdisplayAdvancedOptions();\n\t\tpageLoaded();\n\t\tif(localStorage.highlightUngroupedExtensions === 'true') {\n\t\t\thighlightUngrouped();\n\t\t}\n\t\tmarkClean();\n\t});\n}\n\nfunction loadTranslations() {\n\t$('[data-i18n]').each(function (i, item) {\n\t\t$(item).text(chrome.i18n.getMessage($(item).data('i18n')));\n\t});\n}\n\n$(document).ready(function () {\n\tloadConfiguration();\n\tloadTranslations();\n\tinitNewContextDialog();\n\n\t//remove social icons if user is offline\n\tif(!navigator.onLine) {\n\t\t$('#social-buttons').empty();\n\t}\n\n\t$('button, input[type=submit], input[type=button]').button();\n\n\t$('.removeBtn').live('click', function () {\n\t\t$(this).closest('li').effect('slide', {mode: 'hide'}, 'normal', function () {\n\t\t\t$(this).remove();\n\t\t\tmarkDirty();\n\t\t});\n\t});\n\n\t$('#help-icon').click(function () {\n\t\tshowWelcomeScreen();\n\t});\n\n\t$('.contextDelete').live('click', function () {\n\t\tvar context = $(this).closest('.context');\n\t\tvar buttons = {};\n\t\tbuttons[chrome.i18n.getMessage(\"delete\")] = function () {\n\t\t\tcontext.effect('puff', {}, 'slow', function () {\n\t\t\t\t$(this).remove();\n\t\t\t\tmarkDirty();\n\t\t\t});\n\n\t\t\t$(this).dialog(\"close\");\n\t\t};\n\t\tbuttons[chrome.i18n.getMessage(\"cancel\")] = function () {\n\t\t\t$(this).dialog(\"close\");\n\t\t};\n\n\t\t$(\"#dialog-confirm\").dialog({\n\t\t\ttitle: chrome.i18n.getMessage(\"remove_context\"),\n\t\t\tresizable: false,\n\t\t\theight: 200,\n\t\t\tmodal: true,\n\t\t\tbuttons: buttons\n\t\t}).find('span.dialog-content').text(chrome.i18n.getMessage(\"context_will_be_deleted\"));\n\n\t\treturn false;\n\t});\n\n\t$('.contextDuplicate').live('click', function () {\n\t\tvar original = $(this).closest('.context');\n\t\tvar contextsContainer = $('.contextExtensions');\n\n\t\tvar oldImageSrc = original.find('.contextExtensions').data('contextImg');\n\t\tvar oldName = original.find('.contextExtensions').data('contextName');\n\t\tvar oldIcon = original.find('.contextExtensions').data('contextIcon');\n\t\tvar newName;\n\n\t\t//generate new, unique name\n\t\tfor (var j = 1; ; j++) {\n\t\t\tvar isValid = true;\n\t\t\tvar checkName = oldName + j;\n\n\t\t\tfor (var i = 0; i < contextsContainer.length; i++) {\n\t\t\t\tvar otherContext = contextsContainer[i];\n\t\t\t\tif ($(otherContext).data('contextName') == checkName) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isValid) {\n\t\t\t\tnewName = checkName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tvar clone = newContext(newName, oldImageSrc, oldIcon);//create new context with same icon but new name\n\t\tclone.find('.contextExtensions').append(original.find('.contextExtensions li').clone());//copy extensions from original context to clone\n\t\t$('#contexts').append(clone);\n\n\t\tclone.effect('highlight', {}, 'slow');\n\t\tmarkDirty();\n\n\t\treturn false;\n\t});\n\n\t$('.contextEdit').live('click', function () {\n\t\topenEditContextDialog($(this).closest('.context'));\n\t\treturn false;\n\t});\n\n\t/* Additional options */\n\t$('#accordion').accordion({\n\t\tautoHeight: false,\n\t\tcollapsible: true,\n\t\tactive: false\n\t});\n\n\t$('#additional-options-panel').find('input, select, textarea').change(function () {\n\t\tmarkDirty();\n\t});\n\n\t$('#appsSupport').change(function () {\n\t\tif ($(this).is(':checked')) {\n\t\t\t$('li.app').effect('slide', {}, 'normal', markDirty);\n\t\t} else {\n\t\t\t$('li.app').effect('slide', {mode: 'hide'}, 'normal', markDirty);\n\t\t}\n\t});\n\n\t//moving extensions between 'available' section and 'always enabled' section\n\t$('#extensions').droppable({\n\t\tactiveClass: 'active_dense',\n\t\thoverClass: 'active_hover',\n\t\taccept: function (element) {\n\t\t\treturn element.is('#always_enabled_extensions li');\n\t\t},\n\t\tdrop: function (event, ui) {\n\t\t\tvar li = ui.draggable.detach();\n\t\t\t$(this).append(li);\n\n\t\t\t//if extension was moved back from 'always enabled' box to 'available' box there may be some copies of this extension hidden in the contexts, show them\n\t\t\t$('.context li[data-extid=' + li.data('extid') + ']').effect('slide');\n\n\t\t\tmarkDirty();\n\t\t}\n\t});\n\n\t$('#always_enabled_extensions').droppable({\n\t\tactiveClass: 'active_dense',\n\t\thoverClass: 'active_hover',\n\t\taccept: function (element) {\n\t\t\treturn element.is('#extensions li');\n\t\t},\n\t\tdrop: function (event, ui) {\n\t\t\tvar li = ui.draggable.detach();\n\t\t\t$(this).append(li);\n\n\t\t\t//HACK - contexts stay highlighted after object is dropped - AFAIK it is because draggable is detached not cloned\n\t\t\t$('.contextExtensions.active').removeClass('active');\n\n\t\t\t//remove this extension from all contexts as it is redundant there now\n\t\t\t$('.context li[data-extid=' + li.data('extid') + ']').effect('slide', {mode: 'hide'});\n\n\t\t\tmarkDirty();\n\t\t}\n\t});\n\n\t$('#highlightUngrouped').click(function () {\n\t\thighlightUngrouped();\n\t\tlocalStorage.highlightUngroupedExtensions = $(this).is(':checked') ? 'true' : 'false';\n\t});\n\tif(localStorage.highlightUngroupedExtensions === 'true') {\n\t\t$('#highlightUngrouped').attr('checked', 'checked');\n\t}\n\n\t$('#export_box, #import_box').click(function () {\n\t\tthis.select();\n\t});\n\n\t$('#import_button').click(function () {\n\t\timportConfiguration($('#import_box').val());\n\t\treturn false;\n\t});\n\n\t$('#chrome_sync_export_button').click(function(){\n\t\tvar configurationString = $('#export_box').val();\n\t\tvar $exportButton = $(this);\n\t\tvar buttons = {};\n\t\tbuttons[chrome.i18n.getMessage(\"save\")] = function () {\n\t\t\tstorageSync.set('configuration', configurationString, function() {\n\t\t\t\tvar originalText = $exportButton.find('span').text();\n\t\t\t\t$exportButton.find('span').text(chrome.i18n.getMessage(\"saved\"));\n\t\t\t\t$exportButton.effect('highlight', {}, 'slow');\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t$exportButton.find('span').text(originalText);\n\t\t\t\t}, 2500);\n\t\t\t});\n\n\t\t\t$(this).dialog(\"close\");\n\t\t};\n\t\tbuttons[chrome.i18n.getMessage(\"cancel\")] = function () {\n\t\t\t$(this).dialog(\"close\");\n\t\t};\n\n\t\t$(\"#dialog-confirm\").dialog({\n\t\t\ttitle: chrome.i18n.getMessage(\"override_server_settings\"),\n\t\t\tresizable: false,\n\t\t\twidth: 300,\n\t\t\theight: 200,\n\t\t\tmodal: true,\n\t\t\tbuttons: buttons\n\t\t}).find('span.dialog-content').text(chrome.i18n.getMessage(\"confirm_chrome_sync_configuration_export\"));\n\t\treturn false;\n\t});\n\n\t$('#chrome_sync_import_button').click(function(){\n\t\tstorageSync.get('configuration', function(value){\n\t\t\timportConfiguration(value);\n\t\t});\n\t\treturn false;\n\t});\n\n\t$('#new-context-button').click(function () {\n\t\topenNewContextDialog();\n\t});\n\t$('#save-button').click(function () {\n\t\tsave();\n\t});\n});"
  },
  {
    "path": "js/popup.js",
    "content": "function createListOfContexts() {\n\tcontextsManager.getContextsListWithStatuses(function(contexts){\n\t\t$('#contextsScreen ul').empty();\n\n\t\tcontexts.forEach(function(context) {\n\t\t\t$('#contextsScreen ul').append(createContextLi(context.name, context.name, getContextIcon(context), context.status));\n\t\t});\n\n\t\t//create a context activating all extensions\n\t\tif(CONFIG.get('showLoadAllBtn') === 'true') {\n\t\t\tallBtn = createContextLi('all', chrome.i18n.getMessage(\"all_extensions\"), 'icons/plugin.png');\n\t\t\t$('#contextsScreen ul').append(allBtn);\n\t\t}\n\t});\n}\n\nfunction createListOfExtensions(extid) {\n\tvar context, extensions;\n\n\tif(extid) {\n\t\tcontext = contextsManager.getContext(extid);\n\t\textensions = context.extensions;\n\t} else {\n\t\textensions = extensionsManager.getExtensionsList();\n\t}\n\n\t$('#extensionsScreen ul > li:gt(0)').remove();\n\tfor(var idx in extensions) {\n\t\tvar extId = extensions[idx].id;\n\t\tvar extension = extensionsManager.getExtensionData(extId);\n\n\t\tif(extension.isApp && CONFIG.get('appsSupport') !== 'true') {\n\t\t\tcontinue;\n\t\t}\n\n\t\t$('#extensionsScreen ul').append(createExtensionLi(extension));\n\t}\n}\n\nfunction createContextLi(name, title, imgSrc, status) {\n\tvar img = $('<img>').attr('src', imgSrc);\n\tvar span = $('<span>').append(title);\n\tvar all = ((name == 'all') ? 'all' : 'single') + '-context';\n\n\tvar activate = $(\"<div class='list-button activate ui-widget-content ui-corner-all'><span class='ui-icon ui-icon-plusthick'></span></div>\");\n\tvar deactivate = $(\"<div class='list-button deactivate ui-widget-content ui-corner-all'><span class='ui-icon ui-icon-minusthick'></span></div>\");\n\tvar showExtensions = $(\"<div class='list-button show-extensions ui-widget-content ui-corner-all'><span class='ui-icon ui-icon-triangle-1-e'></span></div>\");\n\n\tvar context = $('<div>').attr('class', 'list-context ui-widget-content ui-corner-all ' + all).append(img).append(span);\n\n\tvar li = $('<li>')\n\t\t.addClass('clearfix')\n\t\t.append(context)\n\t\t.append(activate)\n\t\t.append(deactivate)\n\t\t.append(showExtensions)\n\t\t.data('contextName', name);\n\n\tif(status === 'enabled') {\n\t\tli.addClass('status-all');\n\t} else if(status === 'partial') {\n\t\tli.addClass('status-partial');\n\t}\n\n\treturn li;\n}\n\nfunction createExtensionLi(extension) {\n\tvar imgSrc = (extension.icons && extension.icons.length) ? (extension.icons[0].url) : ('icons/plugin.png');\n\tvar img = $('<img>').attr('src', imgSrc);\n\tvar span = $('<span>').addClass('extension-name').append(extension.name);\n\n\tvar extensionDiv = $('<div>')\n\t\t.attr('class', 'list-item ui-widget-content ui-corner-all')\n\t\t.append(img)\n\t\t.append(span)\n\t\t.addClass(extension.enabled ? 'status-enabled' : 'status-disabled');\n\n\tvar li = $('<li>')\n\t\t.addClass('clearfix')\n\t\t.append(extensionDiv)\n\t\t.data('extensionID', extension.id);\n\n\treturn li;\n}\n\nfunction getContextIcon(context) {\n\tif (context.icon === 'show_extension' && context.extensions[0] && context.extensions[0].icon) {\n\t\treturn context.extensions[0].icon;\n\t}\n\n\treturn context.imgSrc;\n}\n\nvar contextsManager = new ContextsManager();\nvar extensionsManager = new ExtensionsManager();\nvar currentContextName = null;\nvar blocked = false;\nvar allBtn;\n\n$(document).ready(function(){\n\t//load translations\n\t$('[data-i18n]').each(function (i, item) {\n\t\t$(item).text(chrome.i18n.getMessage($(item).data('i18n')));\n\t});\n\n\tcreateListOfContexts();\n\n\t$('#contextsScreen').on('click', 'div.list-context, div.activate, div.deactivate', function(){\n\t\t//make sure that user won't change the context while other context is loading\n\t\tif(blocked) {\n\t\t\treturn false;\n\t\t}\n\t\tblocked = true;\n\n\t\t$('div.list-context, div.list-button').not($(this)).addClass('ui-state-disabled');\n\t\t$(this).addClass('ui-state-active');\n\n\t\tvar li = $(this).closest('li');\n\t\tvar buttonClicked = 'switch';\n\n\t\tif($(this).is('.activate')) {\n\t\t\tbuttonClicked = 'activate';\n\t\t} else if($(this).is('.deactivate')) {\n\t\t\tbuttonClicked = 'deactivate';\n\t\t}\n\n\t\tif(allBtn && li[0] == allBtn[0]) {//all extensions button clicked\n\t\t\tif(buttonClicked != 'deactivate') {\n\t\t\t\tchrome.extension.getBackgroundPage().enableAllExtensions();\n\t\t\t} else {\n\t\t\t\tchrome.extension.getBackgroundPage().disableAllExtensions();\n\t\t\t}\n\t\t} else {\n\t\t\tif(buttonClicked == 'switch') {\n\t\t\t\tchrome.extension.getBackgroundPage().changeContext(li.data('contextName'));\n\t\t\t} else if(buttonClicked == 'activate') {\n\t\t\t\tchrome.extension.getBackgroundPage().activateContext(li.data('contextName'));\n\t\t\t} else if(buttonClicked == 'deactivate') {\n\t\t\t\tchrome.extension.getBackgroundPage().deactivateContext(li.data('contextName'));\n\t\t\t}\n\t\t}\n\n\t\t//small timeout before closing the popup\n\t\tsetTimeout(function(){\n\t\t\twindow.close();\n\t\t}, 500);\n\n\t\treturn false;\n\t});\n\n\t$('#contextsScreen').on('click', 'div.show-extensions', function() {\n\t\t$('.screenContainer').addClass('showExtensions');\n\t\tvar li = $(this).closest('li');\n\n\t\tif(allBtn && li[0] === allBtn[0]) { // 'all extensions' button clicked\n\t\t\tcurrentContextName = null;\n\t\t\tcreateListOfExtensions();\n\t\t} else {\n\t\t\tcurrentContextName = li.data('contextName');\n\t\t\tcreateListOfExtensions(currentContextName);\n\t\t}\n\t});\n\n\t$('.back-to-contexts').on('click', function() {\n\t\t$('.screenContainer').removeClass('showExtensions');\n\t});\n\n\t$('#extensionsScreen').on('click', 'li', function(){\n\t\tvar li = $(this);\n\t\tvar extension = extensionsManager.getExtensionData( li.data('extensionID') );\n\n\t\tif(!extension) {\n\t\t\treturn;\n\t\t}\n\n\t\textensionsManager.enableExtension(extension, !extension.enabled, function() {\n\t\t\tcreateListOfContexts();\n\t\t\t//reload extensions manager before updating list of extensions\n\t\t\textensionsManager = new ExtensionsManager(function () {\n\t\t\t\tcreateListOfExtensions(currentContextName);\n\t\t\t});\n\t\t});\n\t});\n});"
  },
  {
    "path": "manifest.json",
    "content": "{\n   \"name\": \"Context\",\n   \"version\": \"0.414\",\n   \"manifest_version\": 2,\n   \"permissions\": [ \"management\", \"notifications\", \"tabs\", \"storage\" ],\n   \"background\": {\n      \"page\": \"background.html\"\n   },\n   \"options_page\": \"options.html\",\n   \"browser_action\": {\n      \"default_icon\": \"icons/context.png\",\n      \"default_popup\": \"popup.html\",\n      \"default_title\": \"Context\"\n   },\n   \"default_locale\": \"en\",\n   \"description\": \"__MSG_application_description__\",\n   \"icons\": {\n      \"128\": \"icons/context-128.png\",\n      \"19\": \"icons/context.png\",\n      \"48\": \"icons/context-48.png\",\n      \"64\": \"icons/context-64.png\"\n   },\n  \"content_security_policy\": \"script-src 'self' https://apis.google.com https://platform.twitter.com https://www.facebook.com; object-src 'self'\"\n}\n"
  },
  {
    "path": "notification.html",
    "content": "<html>\n<head>\n\t<meta charset=\"utf-8\">\n\n\t<title data-i18n=\"context_options\"></title>\n\t<link rel=\"stylesheet\" href=\"css/ui-lightness/jquery-ui-1.8.17.custom.css\" type=\"text/css\" />\n\t<link rel=\"stylesheet\" href=\"css/main.css\" type=\"text/css\" />\n\n\t<script src=\"js/libs/jquery-1.7.1.min.js\"></script>\n\t<script src=\"js/libs/jquery-ui-1.8.17.custom.min.js\"></script>\n\t\n\t<script src=\"js/classes/Configuration.class.js\"></script>\n\t<script src=\"js/classes/ExtensionsManager.class.js\"></script>\n\t<script src=\"js/classes/ContextsManager.class.js\"></script>\n\n\t<script src=\"js/notification.js\"></script>\n</head>\n<body id='notification'>\n\t<p><span data-i18n=\"extension_installed_1\"></span> \"<span id='extensionName'></span>\" <span data-i18n=\"extension_installed_2\"></span>. <span data-i18n=\"add_to_contexts\"></span>:</p>\n\t<ul class='simple-list'>\n\t</ul>\n\t<div id='new_context' class=\"inline-selectable list-context ui-widget-content ui-corner-all\"><span class='ui-icon ui-icon-plusthick float-left'></span><span data-i18n=\"new_context\"></span></div>\n\t<p><span data-i18n=\"or_add_it_to\"></span>: <span id='always_enabled' class=\"inline-selectable ui-widget-content ui-corner-all\" data-i18n=\"always_enabled_extensions\"></span></p>\n\t<button id='save' data-i18n=\"save\"></button>\n\t<button id='do_nothing' data-i18n=\"cancel\"></button>\n</body>\n</html>"
  },
  {
    "path": "options.html",
    "content": "<html>\n<head>\n\t<meta charset=\"utf-8\">\n\n\t<title data-i18n=\"context_options\"></title>\n\t<link rel=\"icon\" type=\"image/png\" href=\"icons/context_wrench.png\">\n\t<link rel=\"stylesheet\" href=\"css/ui-lightness/jquery-ui-1.8.17.custom.css\" type=\"text/css\"/>\n\t<link rel=\"stylesheet\" href=\"css/main.css\" type=\"text/css\"/>\n\n\t<script src=\"js/libs/jquery-1.7.1.min.js\"></script>\n\t<script src=\"js/libs/jquery-ui-1.8.17.custom.min.js\"></script>\n\t<script src=\"js/libs/Base64.js\"></script>\n\n\t<script src=\"js/classes/HugeStorageSync.class.js\"></script>\n\t<script src=\"js/classes/Configuration.class.js\"></script>\n\t<script src=\"js/classes/ExtensionsManager.class.js\"></script>\n\t<script src=\"js/classes/ContextsManager.class.js\"></script>\n\t<script src=\"js/classes/ConfigurationBackupExporter.class.js\"></script>\n\t<script src=\"js/classes/ConfigurationBackupImporter.class.js\"></script>\n\n\t<script src=\"js/options/main.js\"></script>\n\t<script src=\"js/options/firstrun.js\"></script>\n\t<script src=\"js/options/dialogs.js\"></script>\n</head>\n<body>\n\n<div class='wrapper'>\n\t<h1>Context <span data-i18n=\"options\"></span></h1>\n\n\t<div id='loader'>\n\t\t<p><img src='other/flower.gif'/> <span data-i18n=\"extension_is_loading\"></span></p>\n\t</div>\n\n\t<div id='content'>\n\t\t<div id='help-icon'><span class='ui-icon ui-icon-help'></span></div>\n\n\t\t<div class='ui-widget-content ui-corner-all' id='available_extensions_wrapper'>\n\t\t\t<h2 data-i18n=\"available_extensions\"></h2>\n\n\t\t\t<div class='top-right-box ui-widget'>\n\t\t\t\t<input type='checkbox' id='highlightUngrouped'/> <label for='highlightUngrouped'\n\t\t\t\t                                                        data-i18n=\"highlight_ungrouped_extensions\"></label>\n\t\t\t</div>\n\t\t\t<ul id=\"extensions\" class='extensions_list clearfix'>\n\t\t\t</ul>\n\t\t</div>\n\n\t\t<div class='ui-widget-content ui-corner-all' id='always_enabled_extensions_wrapper'>\n\t\t\t<h2 data-i18n=\"always_enabled_extensions\"></h2>\n\t\t\t<ul id=\"always_enabled_extensions\" class='extensions_list clearfix'>\n\t\t\t</ul>\n\t\t</div>\n\n\t\t<ul id=\"contexts\" class='clearfix'>\n\t\t</ul>\n\n\t\t<!-- FORMS AND DIALOGS -->\n\t\t<div id=\"new-context-form\">\n\t\t\t<div class=\"ui-state-highlight ui-corner-all errors\"></div>\n\t\t\t<form>\n\t\t\t\t<fieldset>\n\t\t\t\t\t<div class=\"dialog-label\" data-i18n=\"name\"></div>\n\t\t\t\t\t<input type=\"text\" name=\"context-name\" id=\"context-name\"\n\t\t\t\t\t       class=\"text ui-widget-content ui-corner-all\"/>\n\n\t\t\t\t\t<div class=\"dialog-label\" data-i18n=\"icon\"></div>\n\t\t\t\t\t<ul id='context-icons' class='clearfix'>\n\t\t\t\t\t</ul>\n\n\t\t\t\t\t<div class=\"dialog-label\" data-i18n=\"additional_options\"></div>\n\t\t\t\t\t<div><input type='checkbox' id='showExtensionIcon' /> <label\n\t\t\t\t\t\t\tfor='showExtensionIcon' data-i18n=\"show_extension_icon\"></label></div>\n\t\t\t\t</fieldset>\n\t\t\t</form>\n\t\t</div>\n\t\t<div id=\"dialog-confirm\">\n\t\t\t<p><span class=\"ui-icon ui-icon-alert\" style=\"float:left; margin:0 7px 20px 0;\"></span><span\n\t\t\t\t\tclass=\"dialog-content\"></span></p>\n\t\t</div>\n\t\t<div id=\"dialog-import-success\">\n\t\t\t<p><span class=\"ui-icon ui-icon-info\" style=\"float:left; margin:0 7px 20px 0;\"></span><span\n\t\t\t\t\tdata-i18n=\"configuration_was_imported_successfuly\"></span></p>\n\n\t\t\t<p><span class=\"ui-icon ui-icon-info\" style=\"float:left; margin:0 7px 20px 0;\"></span><span\n\t\t\t\t\tdata-i18n=\"some_extensions_were_ignored\"></span></p>\n\t\t\t<ul>\n\t\t\t</ul>\n\t\t</div>\n\t\t<div id=\"accordion\">\n\t\t\t<h3><a href=\"#\" data-i18n=\"additional_options\"></a></h3>\n\n\t\t\t<div id='additional-options-panel'>\n\t\t\t\t<ul>\n\t\t\t\t\t<li><input type='checkbox' id='appsSupport'/> <label for='appsSupport'\n\t\t\t\t\t                                                     data-i18n=\"enable_apps_support\"></label></li>\n\t\t\t\t\t<li><select id='newExtensionAction'>\n\t\t\t\t\t\t<option value='ask' data-i18n=\"ask_what_to_do\"></option>\n\t\t\t\t\t\t<option value='add_to_all' data-i18n=\"add_to_all_contexts\"></option>\n\t\t\t\t\t\t<option value='add_to_always_enabled' data-i18n=\"add_to_always_enabled\"></option>\n\t\t\t\t\t\t<option value='do_nothing' data-i18n=\"do_nothing\"></option>\n\t\t\t\t\t</select> <label for='newExtensionAction' data-i18n=\"new_extension_installed_action\"></label></li>\n\t\t\t\t\t<li><input type='checkbox' id='showLoadAllBtn'/> <label for='showLoadAllBtn'\n\t\t\t\t\t                                                        data-i18n=\"show_all_extensions_button\"></label>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li class='hidden_feature'><input type='number' id='extensionEnableDelay' min=\"0\" max=\"1000\"\n\t\t\t\t\t                                  step=\"100\"/> <label for='extensionEnableDelay'\n\t\t\t\t\t                                                      data-i18n=\"delay_after_enabling_extension\"></label>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\n\t\t\t</div>\n\t\t\t<h3><a href=\"#\" data-i18n=\"configuration_import_export\"></a></h3>\n\n\t\t\t<div id='import-export-panel'>\n\t\t\t\t<h2 data-i18n=\"chrome_sync\"></h2>\n\t\t\t\t<button data-i18n=\"save_on_server\" id='chrome_sync_export_button'></button>\n\t\t\t\t<button data-i18n=\"load_from_server\" id='chrome_sync_import_button'></button>\n\n\t\t\t\t<h2 data-i18n=\"manual\"></h2>\n\t\t\t\t<p data-i18n=\"configuration_export_description\"></p>\n\t\t\t\t<textarea id='export_box' readonly=\"true\" wrap=\"off\" class='ui-widget-content ui-corner-all'></textarea>\n\n\t\t\t\t<p data-i18n=\"configuration_import_description\"></p>\n\t\t\t\t<textarea id='import_box' wrap=\"off\" class='ui-widget-content ui-corner-all'></textarea>\n\n\t\t\t\t<p>\n\t\t\t\t\t<button data-i18n=\"import\" id='import_button'></button>\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t\t<h3><a href=\"#\" data-i18n=\"about\"></a></h3>\n\n\t\t\t<div id='about-panel'>\n\t\t\t\t<ul>\n\t\t\t\t\t<li><span data-i18n=\"font\"></span>: Andika - <a\n\t\t\t\t\t\t\thref='http://www.google.com/webfonts/specimen/Andika'>Google Web Fonts</a></li>\n\t\t\t\t\t<li><span data-i18n=\"icons\"></span>: Dortmund - <a href='http://pc.de/icons/'>pc.de</a>, silk icons\n\t\t\t\t\t\t- <a href='http://www.famfamfam.com/archive/silk-icons-thats-your-lot/'>famfamfam</a></li>\n\t\t\t\t\t<li><span data-i18n=\"icon_flip_animation\"></span>: <a\n\t\t\t\t\t\t\thref='https://chrome.google.com/webstore/detail/mihcahmgecmbnbcchbopgniflfhgnkff'>Google\n\t\t\t\t\t\tMail Checker</a></li>\n\t\t\t\t\t<li><span data-i18n=\"translations\"></span>: Português - <a href='http://thiagomt.com'>Thiago\n\t\t\t\t\t\tTalma</a>, Español - <a href='http://wwwhatsnew.com/'>Juan Diego Polo</a>, 日本語 - <a\n\t\t\t\t\t\t\thref='http://web-marketing.zako.org/'>Junichi Murashige</a>, 中文 - <a\n\t\t\t\t\t\t\thref='https://plus.google.com/u/0/107010653165528905049'>Techlive Zheng</a>, Français - <a\n\t\t\t\t\t\t\thref='http://www.passion-net.fr/'>Julien Lemonnier</a>, Italian - <a\n\t\t\t\t\t\t\thref='http://marcotrulla.it/'>Marco Trulla</a></li>\n\t\t\t\t\t<li><span data-i18n=\"programmer\"></span>: Konrad Dzwinel (<a href='mailto:kdzwinel@gmail.com'>kdzwinel@gmail.com</a>)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><span data-i18n=\"source_code\"></span>: <a\n\t\t\t\t\t\t\thref='https://github.com/kdzwinel/Context'>github.com</a></li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t\t<div id=\"welcome\" class='clearfix'>\n\t\t\t<ul>\n\t\t\t\t<li class='step_1'>\n\t\t\t\t\t<div class='picture'></div>\n\t\t\t\t\t<p data-i18n=\"welcome_step_1\"></p>\n\t\t\t\t</li>\n\t\t\t\t<li class='step_2'>\n\t\t\t\t\t<div class='picture'></div>\n\t\t\t\t\t<p data-i18n=\"welcome_step_2\"></p>\n\t\t\t\t</li>\n\t\t\t\t<li class='step_3'>\n\t\t\t\t\t<div class='picture'></div>\n\t\t\t\t\t<p data-i18n=\"welcome_step_3\"></p>\n\t\t\t\t</li>\n\t\t\t\t<li class='step_4'>\n\t\t\t\t\t<div class='picture'></div>\n\t\t\t\t\t<p data-i18n=\"welcome_step_4\"></p>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<div style='float: right'>\n\t\t\t\t<button class='previous' data-i18n=\"previous\"></button>\n\t\t\t\t<button class='next' data-i18n=\"next\"></button>\n\t\t\t\t<button class='close' data-i18n=\"close\"></button>\n\t\t\t</div>\n\t\t</div>\n\t\t<!-- FORMS AND DIALOGS -->\n\n\t\t<div id=\"footer\">\n\t\t\t<button id=\"new-context-button\" data-i18n=\"new_context\"></button>\n\t\t\t<button id=\"save-button\" data-i18n=\"save\"></button>\n\t\t</div>\n\n\t\t<div id=\"social-buttons\">\n\t\t\t<g:plusone size=\"medium\"\n\t\t\t           href=\"https://chrome.google.com/webstore/detail/aalnjolghjkkogicompabhhbbkljnlka\"></g:plusone>\n\t\t\t<a href=\"https://twitter.com/share\" class=\"twitter-share-button\"\n\t\t\t   data-url=\"https://chrome.google.com/webstore/detail/aalnjolghjkkogicompabhhbbkljnlka\"\n\t\t\t   data-text=\"Context - Sort extensions into groups and easily switch between them.\"\n\t\t\t   data-count=\"horizontal\">&nbsp;</a>\n\t\t\t<iframe src=\"https://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fchrome.google.com%2Fwebstore%2Fdetail%2Faalnjolghjkkogicompabhhbbkljnlka&amp;send=false&amp;layout=button_count&amp;width=50&amp;show_faces=false&amp;action=recommend&amp;colorscheme=light&amp;font&amp;height=21\"\n\t\t\t        scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden; width:130px; height:21px;\"\n\t\t\t        allowTransparency=\"true\"></iframe>\n\t\t</div>\n\t</div>\n</div>\n<script type=\"text/javascript\" src=\"https://apis.google.com/js/plusone.js\"></script>\n<script type=\"text/javascript\" src=\"https://platform.twitter.com/widgets.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "package.json",
    "content": "{\n\t\"name\": \"Context\",\n\t\"version\": \"0.414.0\",\n\t\"description\": \"Sort extensions into groups and easily switch between them.\",\n\t\"main\": \"Gruntfile.js\",\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git://github.com/kdzwinel/Context.git\"\n\t},\n\t\"author\": \"Konrad Dzwinel\",\n\t\"license\": \"GPL\",\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/kdzwinel/Context/issues\"\n\t},\n\t\"homepage\": \"https://github.com/kdzwinel/Context\",\n\t\"dependencies\": {\n\t\t\"grunt\": \"~0.4.4\",\n\t\t\"grunt-contrib-jshint\": \"~0.9.2\",\n\t\t\"grunt-contrib-watch\": \"~0.6.1\",\n\t\t\"grunt-contrib-csslint\": \"~0.2.0\",\n\t\t\"grunt-html-validation\": \"~0.1.14\",\n\t\t\"grunt-zip\": \"~0.13.0\"\n\t}\n}\n"
  },
  {
    "path": "popup.html",
    "content": "<html>\n<head>\n\t<meta charset=\"utf-8\">\n\n\t<link rel=\"stylesheet\" href=\"css/ui-lightness/jquery-ui-1.8.17.custom.css\" type=\"text/css\" />\n\t<link rel=\"stylesheet\" href=\"css/main.css\" type=\"text/css\" />\n\n\t<script src=\"js/libs/jquery-1.7.1.min.js\"></script>\n\t<script src=\"js/libs/jquery-ui-1.8.17.custom.min.js\"></script>\n\n\t<script src=\"js/classes/Configuration.class.js\"></script>\n\t<script src=\"js/classes/ContextsManager.class.js\"></script>\n\t<script src=\"js/classes/ExtensionsManager.class.js\"></script>\n\n\t<script src=\"js/popup.js\"></script>\n</head>\n<body id='popup'>\n\t<div class='screenContainer clearfix'>\n\t\t<div id='contextsScreen'>\n\t\t\t<ul class='simple-list'></ul>\n\t\t</div>\n\t\t<div id='extensionsScreen'>\n\t\t\t<ul class='simple-list'>\n\t\t\t\t<li><div class=\"back-to-contexts list-item ui-widget-content ui-corner-all\"><span class='ui-icon ui-icon-triangle-1-w'></span> <span data-i18n=\"cancel\"></span></div></li>\n\t\t\t</ul>\n\t\t</div>\n\t</div>\n</body>\n</html>"
  }
]