From d54c794cab708a40fad75550f0eae00352064faf Mon Sep 17 00:00:00 2001 From: "karol@jagiello.it" <1cyfraikilkaliter> Date: Tue, 13 Mar 2018 14:39:34 +0100 Subject: [PATCH] bump to v 1.5 --- ..TODO/TODO.txt | 72 +- ..Themes/Light and blue (by Guibuu).tt_theme | 1 + .../dark flat with colors by kroppy.tt_theme | 1 + ..Themes/legacy2 by luetage.tt_theme | 1 + ..files_ForTesting/manifest.json | 2 +- ..files_firefox/manifest.json | 4 +- ..files_opera/manifest.json | 2 +- ..files_vivaldi/manifest.json | 2 +- ..legacy when needed/legacy.js | 347 +++++ Tree Tabs.zip | Bin 873796 -> 0 bytes _locales/en/messages.json | 285 ++++- _locales/ru/messages.json | 48 +- background.html | 3 +- bg_ch.js | 240 ++-- bg_ff.js | 476 ++++--- download.html | 9 + download.js | 18 + legacy.js | 6 +- lib_jquery/jquery-3.2.1.min.js | 4 - manifest.json | 33 +- options.html | 267 ++-- options/donate_ltc.png | Bin 0 -> 15061 bytes options/options.css | 577 ++++++++- options/options.js | 773 +++++------ options/options_color_border_hover - Copy.svg | 64 - options/options_tabs_margin_indicator.svg | 129 ++ options/refresh.js | 40 +- options/sample_tabs.js | 159 +-- options/theme.js | 186 ++- options/theme_size_settings_0.css | 168 --- options/theme_size_settings_1.css | 168 --- options/theme_size_settings_2.css | 168 --- options/theme_size_settings_3.css | 168 --- options/theme_size_settings_4.css | 168 --- scripts/IO.js | 72 -- scripts/backup.js | 107 +- scripts/chrome.js | 265 ++-- scripts/drag_and_drop.js | 412 ------ scripts/events.js | 590 +++++++++ scripts/folders.js | 489 +++++-- scripts/global.js | 166 ++- scripts/groups.js | 543 ++++---- scripts/menu.js | 902 +++++++++---- scripts/refresh.js | 243 ++-- scripts/tabs.js | 1129 +++++++++++------ scripts/toolbar.js | 854 ++++++++----- scripts/utils.js | 358 ++++-- sidebar.html | 188 ++- sidebar.js | 91 +- theme/icon_audio.svg | 146 ++- theme/icon_audio_muted.svg | 33 +- theme/icon_folder_closed.svg | 30 +- theme/icon_folder_open.svg | 26 +- theme/media.gif | Bin 1614 -> 0 bytes theme/media_muted.gif | Bin 128 -> 0 bytes theme/theme.css | 388 +++--- theme/theme_size_preset_0.css | 12 +- theme/theme_size_preset_1.css | 10 +- theme/theme_size_preset_2.css | 18 +- theme/theme_size_preset_3.css | 14 +- theme/theme_size_preset_4.css | 12 +- theme/theme_tabs_margin_0.css | 35 + theme/theme_tabs_margin_1.css | 35 + theme/theme_tabs_margin_2.css | 35 + .../{toolbar_move.svg => toolbar_detach.svg} | 0 ...toolbar_discard.svg => toolbar_unload.svg} | 0 66 files changed, 7298 insertions(+), 4494 deletions(-) create mode 100644 ..Themes/Light and blue (by Guibuu).tt_theme create mode 100644 ..Themes/dark flat with colors by kroppy.tt_theme create mode 100644 ..Themes/legacy2 by luetage.tt_theme create mode 100644 ..legacy when needed/legacy.js delete mode 100644 Tree Tabs.zip create mode 100644 download.html create mode 100644 download.js delete mode 100644 lib_jquery/jquery-3.2.1.min.js create mode 100644 options/donate_ltc.png delete mode 100644 options/options_color_border_hover - Copy.svg create mode 100644 options/options_tabs_margin_indicator.svg delete mode 100644 options/theme_size_settings_0.css delete mode 100644 options/theme_size_settings_1.css delete mode 100644 options/theme_size_settings_2.css delete mode 100644 options/theme_size_settings_3.css delete mode 100644 options/theme_size_settings_4.css delete mode 100644 scripts/IO.js delete mode 100644 scripts/drag_and_drop.js create mode 100644 scripts/events.js delete mode 100644 theme/media.gif delete mode 100644 theme/media_muted.gif create mode 100644 theme/theme_tabs_margin_0.css create mode 100644 theme/theme_tabs_margin_1.css create mode 100644 theme/theme_tabs_margin_2.css rename theme/{toolbar_move.svg => toolbar_detach.svg} (100%) rename theme/{toolbar_discard.svg => toolbar_unload.svg} (100%) diff --git a/..TODO/TODO.txt b/..TODO/TODO.txt index 4e2bdfd..e62b767 100644 --- a/..TODO/TODO.txt +++ b/..TODO/TODO.txt @@ -1,49 +1,71 @@ -TOP PRIORITY: -Add a shortcut to open tree tabs sidebar undo close to restore trees (will work ONLY in firefox) - - - -Loading data using message - Close tab on Middle mouse click and not On Middle mouse down - Split Pin size in theme +add groups scrolling arrows add textbox for ungrouped name in options - - - - - -LOW PRIORITY: - option for scrollbar on the left -folders - unread state? -menu: collapse entire tree -menu: expand tree menu: copy urls of the selected tabs menu: bookmark selected tabs/tree menu: select all menu: invert selection menu: close above/close below - -options: Customising the context menu +menu: Customising the context menu +menu: move to group +menu: Unload other click on active to return to previous tab - sort tabs/tree - maybe filter tabs on search +make tabs border width configurable, including size 0 +make tab spacing configurable, including 0 size -make tabs border width configurable, including size 0 +font size +hibernate group -make tab spacing confiogurable, including 0 size \ No newline at end of file +double click on tab actions selection like double click to be able to expand child tab. + I want you to be able to display the tab number count on the right end +customizable menu + +import session to unload tabs immediately +bind groups to FF containers + +Unread Tabs Color/Style +Give back group color (like it was before) + + +- When a pinned tab refreshes, it constantly blinks red. Suggest changing that to match Firefox's solid little blue indicator. It's less eye-catching (annoying) and more consistent. + +folders collapsed by default or make this optional + + +when actived tab located in folder, all tabs operation related with creating new tab (such as clone of tab in folder, new tab) must work only in current folder. + +New tab in selected folder! + + +separate option for close folder (close or promote children) +menu: unload tabs in folders + +menu: unload tabs must close real FF tabs, but your tabs must markeds like unloads and stay in list. + +Also all your tabs you can save in special folder of FF bookmarks and working from this place, where subdirs first level = groups for tab in left... Option for set base bookmark dir for addon can add to addon config. + +Whilst themes are apparently available, i couldn't just grab one via a drop-down which would make it easier. +Accept BCH (BitcoinCash) donations as the FEES make it FAR more palatable to donate (a few cents vs a few dollars). I bet you're missing out on plenty of micro donations because Bitcoin fees are so high it's no longer micro, and ETH is too high too (though not as bad). + +- I also support the suggestion of integrating Tree Tabs with Firefox sync. I definitely would have a great use for this possibility. +- Like many other commenters suggested, it would be wonderful to see some indication of the container a tab was opened in, if any. Getting an option to directly be able to chose to open a new tab in a container would also be very useful. + + +I don't understand those from comments +- add possibility open all tabs in folder in new left tab group with deleting this folder; +- for economy memory your tabs must to makings (html code) during activating left tab group or during unfold folders/trees; +- real FF tabs must creating and linking only after activate your tabs; \ No newline at end of file diff --git a/..Themes/Light and blue (by Guibuu).tt_theme b/..Themes/Light and blue (by Guibuu).tt_theme new file mode 100644 index 0000000..47d2b07 --- /dev/null +++ b/..Themes/Light and blue (by Guibuu).tt_theme @@ -0,0 +1 @@ +{"ToolbarShow":false,"ColorsSet":{"tab_border":"#fafafa","tab_hover_border":"#d7d7d7","tab_discarded_hover_border":"#d7d7d7","tab_discarded_border":"#fafafa","tabs_menu_hover_border":"#d7d7d7","tabs_menu_hover_background":"#d7d7d7","close_hover_border":"#939394","tab_selected_border":"#70c0e7","tab_selected_hover_border":"#70c0e7","tab_active_border":"#70c0e7","tab_discarded_background":"#fafafa","tab_background":"#fafafa","tab_discarded_title_font_color":"#353535","tab_discarded_hover_title_font_color":"#353535","tab_selected_discarded_title_font_color":"#353535","tab_selected_discarded_hover_title_font_color":"#353535","tab_title_font_color":"#353535","tab_hover_title_font_color":"#353535","tab_selected_title_font_color":"#353535","tab_selected_hover_title_font_color":"#353535","tab_active_title_font_color":"#353535","tab_active_hover_title_font_color":"#353535","tab_active_selected_title_font_color":"#353535","tab_selected_active_hover_title_font_color":"#353535","tab_filtered_title_font_color":"#353535","tab_filtered_hover_title_font_color":"#353535","tab_filtered_active_title_font_color":"#353535","tab_filtered_active_hover_title_font_color":"#353535","tab_filtered_selected_title_font_color":"#353535","tab_filtered_selected_hover_title_font_color":"#353535","tab_filtered_selected_active_title_font_color":"#353535","tab_filtered_selected_active_hover_title_font_color":"#353535","tab_filtered_highlighted_search_title_font_color":"#353535","tab_filtered_highlighted_search_hover_title_font_color":"#353535","tab_filtered_active_highlighted_search_title_font_color":"#353535","tab_filtered_active_highlighted_search_hover_title_font_color":"#353535","tab_filtered_selected_highlighted_search_title_font_color":"#353535","tab_filtered_selected_highlighted_search_hover_title_font_color":"#353535","tab_filtered_selected_active_highlighted_search_title_font_color":"#353535","tab_filtered_selected_active_highlighted_search_hover_title_font_color":"#353535","tab_filtered_background":"#f8ea45","tab_filtered_active_background":"#f8ea45","tab_filtered_selected_background":"#b4e817","tab_filtered_selected_hover_background":"#96c113","tab_filtered_selected_active_background":"#b4e817","tab_filtered_selected_active_hover_background":"#96c113","tab_filtered_selected_hover_border":"#96c113","tab_filtered_selected_active_hover_border":"#96c113","tab_filtered_selected_border":"#b4e817","tab_filtered_selected_active_border":"#b4e817","tab_filtered_border":"#f8ea45","tab_filtered_active_border":"#f8ea45","tab_filtered_hover_border":"#d2cb00","tab_filtered_active_hover_border":"#d2cb00","tab_filtered_highlighted_search_background":"#ffa500","tab_filtered_highlighted_search_border":"#ffa500","tab_filtered_active_highlighted_search_border":"#ffa500","tab_filtered_active_highlighted_search_background":"#ffa500","tab_filtered_selected_highlighted_search_background":"#ffa500","tab_filtered_selected_highlighted_search_border":"#ffa500","tab_filtered_selected_active_highlighted_search_background":"#ffa500","tab_filtered_selected_active_highlighted_search_border":"#ffa500","tab_filtered_highlighted_search_hover_background":"#d78b00","tab_filtered_highlighted_search_hover_border":"#d78b00","tab_filtered_active_highlighted_search_hover_background":"#d78b00","tab_filtered_active_highlighted_search_hover_border":"#d78b00","tab_filtered_selected_highlighted_search_hover_background":"#d78b00","tab_filtered_selected_highlighted_search_hover_border":"#d78b00","tab_filtered_selected_active_highlighted_search_hover_background":"#d78b00","tab_filtered_selected_active_highlighted_search_hover_border":"#d78b00","children_padding_left":"8px","tab_list_background":"#fafafa"},"TabsSizeSetNumber":2,"theme_name":"Light and blue (by Guibuu)","theme_version":2,"toolbar":"
","unused_buttons":"
"} \ No newline at end of file diff --git a/..Themes/dark flat with colors by kroppy.tt_theme b/..Themes/dark flat with colors by kroppy.tt_theme new file mode 100644 index 0000000..10ed3bc --- /dev/null +++ b/..Themes/dark flat with colors by kroppy.tt_theme @@ -0,0 +1 @@ +{"ColorsSet":{"active_font_weight":"normal","attention_background":"#cf4010","attention_border":"#cf4010","button_background":"#484848","button_border":"#484848","button_hover_background":"#292929","button_hover_border":"#353535","button_icons":"#9e9e9e","button_icons_hover":"#9e9e9e","children_padding_left":"11px","close_hover_background":"#939394","close_hover_border":"#757676","close_hover_x":"#fbfcfe","close_x":"#dddddd","drag_indicator":"#d1d1d1","expand_closed_background":"#818181","expand_closed_border":"#818181","expand_lines":"#9d9d9d","expand_open_background":"#339bf3","expand_open_border":"#339bf3","filter_box_background":"#3c3c3c","filter_box_border":"#616161","filter_box_font":"#adadad","filter_clear_icon":"#adadad","group_list_background":"#3c3c3c","group_list_borders":"#616161","group_list_button_hover_background":"#292929","group_list_default_font_color":"#b1b1b1","pin_list_background":"#3b3b3b","pin_list_border_bottom":"#616161","scrollbar_height":"11px","scrollbar_thumb":"#484848","scrollbar_thumb_hover":"#353535","scrollbar_track":"#3b3b3b","scrollbar_width":"12px","tab_active_background":"#d8751b","tab_active_border":"#d8751b","tab_active_hover_background":"#b86316","tab_active_hover_border":"#b86316","tab_active_hover_title_font_color":"#e8e8e8","tab_active_hover_title_font_weight":"bold","tab_active_selected_background":"#3f7ebe","tab_active_selected_border":"#3f7ebe","tab_active_selected_title_font_color":"#e8e8e8","tab_active_selected_title_font_weight":"bold","tab_active_title_font_color":"#e8e8e8","tab_active_title_font_weight":"bold","tab_background":"#3b3b3b","tab_border":"#3b3b3b","tab_discarded_background":"#3b3b3b","tab_discarded_border":"#3b3b3b","tab_discarded_hover_background":"#292929","tab_discarded_hover_border":"#292929","tab_discarded_hover_title_font_color":"#646464","tab_discarded_title_font_color":"#646464","tab_filtered":"#827e00","tab_filtered_active_border":"#d2cb00","tab_filtered_active_highlighted_search_border":"#ed9900","tab_filtered_active_highlighted_search_hover_border":"#c68100","tab_filtered_active_hover_border":"#d2cb00","tab_filtered_active_hover_title_font_color":"#000000","tab_filtered_active_hover_title_font_weight":"bold","tab_filtered_active_title_font_color":"#000000","tab_filtered_active_title_font_weight":"bold","tab_filtered_border":"#e8e000","tab_filtered_highlighted":"#b37400","tab_filtered_highlighted_search_border":"#ed9900","tab_filtered_highlighted_search_hover_border":"#c68100","tab_filtered_hover_border":"#d2cb00","tab_filtered_selected":"#0f8079","tab_filtered_selected_active":"#1299a9","tab_filtered_selected_active_border":"#0f8079","tab_filtered_selected_active_highlighted_search_border":"#ed9900","tab_filtered_selected_active_highlighted_search_hover_background":"#c68100","tab_filtered_selected_active_highlighted_search_hover_border":"#c68100","tab_filtered_selected_active_hover_border":"#0d6d67","tab_filtered_selected_active_hover_title_font_color":"#cfcfcf","tab_filtered_selected_active_hover_title_font_weight":"normal","tab_filtered_selected_active_title_font_color":"#cfcfcf","tab_filtered_selected_active_title_font_weight":"normal","tab_filtered_selected_border":"#0f8079","tab_filtered_selected_highlighted_search_border":"#ed9900","tab_filtered_selected_highlighted_search_hover_border":"#c68100","tab_filtered_selected_hover_border":"#0d6d67","tab_header_border_radius":"0px","tab_hover_background":"#292929","tab_hover_border":"#292929","tab_hover_title_font_color":"#9f9f9f","tab_hover_title_font_weight":"normal","tab_list_background":"#3b3b3b","tab_selected_active_hover_background":"#356a9f","tab_selected_active_hover_border":"#356a9f","tab_selected_active_hover_title_font_color":"#e8e8e8","tab_selected_active_hover_title_font_weight":"bold","tab_selected_background":"#3f7ebe","tab_selected_border":"#3f7ebe","tab_selected_discarded_background":"#3f7ebe","tab_selected_discarded_border":"#3f7ebe","tab_selected_discarded_hover_background":"#356a9f","tab_selected_discarded_hover_border":"#356a9f","tab_selected_discarded_hover_title_font_color":"#3f3f3f","tab_selected_discarded_title_font_color":"#3f3f3f","tab_selected_hover_background":"#356a9f","tab_selected_hover_border":"#356a9f","tab_selected_hover_title_font_color":"#c7c7c7","tab_selected_hover_title_font_weight":"normal","tab_selected_title_font_color":"#c1c1c1","tab_selected_title_font_weight":"normal","tab_title":"#adadad","tab_title_active":"#cacaca","tab_title_discarded":"#7e7e7e","tab_title_font_color":"#9f9f9f","tab_title_font_style":"normal","tab_title_font_weight":"normal","tabs_menu_background":"#484848","tabs_menu_border":"#616161","tabs_menu_font":"#bfbfbf","tabs_menu_hover_background":"#292929","tabs_menu_hover_border":"#353535","tabs_menu_separator":"#616161","toolbar_background":"#484848","toolbar_border_bottom":"#616161"},"TabsMargins":"1","TabsSizeSetNumber":2,"ToolbarShow":true,"theme_name":"dark flat with colors by kroppy","theme_version":3,"toolbar":"
","unused_buttons":""} \ No newline at end of file diff --git a/..Themes/legacy2 by luetage.tt_theme b/..Themes/legacy2 by luetage.tt_theme new file mode 100644 index 0000000..ea339a2 --- /dev/null +++ b/..Themes/legacy2 by luetage.tt_theme @@ -0,0 +1 @@ +{"ToolbarShow":true,"ColorsSet":{"scrollbar_thumb":"#c4c4c4","scrollbar_thumb_hover":"#787878","scrollbar_track":"#ffffff","toolbar_background":"#f6f6f6","toolbar_border_bottom":"#cccccc","button_border":"#f6f6f6","button_background":"#f6f6f6","button_hover_border":"#ecebee","button_hover_background":"#ecebee","button_icons":"#000000","filter_box_background":"#fafafa","filter_box_border":"#cccccc","filter_box_font":"#333333","filter_clear_icon":"#000000","pin_list_border_bottom":"#cccccc","pin_list_background":"#ffffff","tab_list_background":"#ffffff","tab_background":"#f6f6f6","tab_border":"#d2d2d2","tab_hover_background":"#d6d5d8","tab_hover_border":"#878787","tab_selected_background":"#f6f6f6","tab_selected_border":"#00caa7","tab_selected_hover_border":"#00caa7","tab_selected_hover_background":"#d6d5d8","tab_filtered":"#ffa53b","tab_filtered_highlighted":"#ff8628","tab_filtered_selected":"#fff422","tab_filtered_selected_active":"#fff422","active_font_weight":"bold","tab_title":"#000000","tab_title_active":"#000000","tab_title_discarded":"#7e7e7e","drag_indicator":"#00caa7","close_x":"#3b3b3d","close_hover_x":"#000000","close_hover_border":"#939394","close_hover_background":"#b0adbd","expand_open_border":"#129071","expand_open_background":"#00caa7","expand_closed_border":"#969696","expand_closed_background":"#020202","expand_lines":"#129071","tabs_menu_font":"#333333","tabs_menu_background":"#fafafa","tabs_menu_border":"#bebebe","tabs_menu_hover_background":"#efefef","tabs_menu_hover_border":"#bebebe","tabs_menu_separator":"#efefef","scrollbar_height":"4px","scrollbar_width":"8px","tab_filtered_selected_border":"#00caa7","tab_filtered_selected_active_border":"#00caa7","tab_filtered_selected_hover_border":"#00caa7","tab_filtered_selected_active_hover_border":"#00caa7","tab_filtered_selected_background":"#e8e000","tab_filtered_selected_active_hover_background":"#d2cb00","tab_filtered_selected_hover_background":"#d2cb00","tab_filtered_selected_active_background":"#e8e000","tab_filtered_selected_highlighted_search_border":"#00caa7","tab_filtered_selected_highlighted_search_hover_border":"#00caa7","tab_filtered_selected_active_highlighted_search_border":"#00caa7","tab_filtered_selected_active_highlighted_search_hover_border":"#00caa7","tab_active_hover_background":"#1de6b4","tab_active_background":"#c7f4e2","tab_active_border":"#bebebe","tab_active_hover_border":"#bebebe","tab_active_selected_background":"#c7f4e2","tab_selected_active_hover_background":"#1de6b4","tab_active_selected_border":"#00caa7","tab_selected_active_hover_border":"#00caa7","tab_selected_discarded_border":"#00caa7","tab_selected_discarded_hover_border":"#00caa7","tab_selected_discarded_background":"#f6f6f6","tab_selected_discarded_hover_background":"#d7d7d7","tab_discarded_background":"#f6f6f6","children_padding_left":"8px"},"TabsSizeSetNumber":2,"theme_name":"legacy by luetage","theme_version":2,"toolbar":"
","unused_buttons":""} \ No newline at end of file diff --git a/..files_ForTesting/manifest.json b/..files_ForTesting/manifest.json index 64c5cec..925573d 100644 --- a/..files_ForTesting/manifest.json +++ b/..files_ForTesting/manifest.json @@ -14,7 +14,7 @@ "19": "icons/16.png", "16": "icons/16.png" }, - "permissions": [ "tabs", "sessions", "", "storage" ], + "permissions": [ "tabs", "sessions", "", "storage", "bookmarks" ], "sidebar_action": { "default_icon": { diff --git a/..files_firefox/manifest.json b/..files_firefox/manifest.json index 46fd2a4..0b90591 100644 --- a/..files_firefox/manifest.json +++ b/..files_firefox/manifest.json @@ -14,7 +14,7 @@ "19": "icons/16.png", "16": "icons/16.png" }, - "permissions": [ "tabs", "sessions", "", "storage" ], + "permissions": [ "tabs", "sessions", "", "storage", "bookmarks" ], "sidebar_action": { "default_icon": { "16": "icons/16.png", @@ -44,5 +44,5 @@ "page": "options.html", "open_in_tab": true }, - "version": "1.3" + "version": "1.5" } \ No newline at end of file diff --git a/..files_opera/manifest.json b/..files_opera/manifest.json index 21972c4..9c297d5 100644 --- a/..files_opera/manifest.json +++ b/..files_opera/manifest.json @@ -15,7 +15,7 @@ "19": "icons/16.png", "16": "icons/16.png" }, - "permissions": [ "tabs", "sessions", "", "storage" ], + "permissions": [ "tabs", "sessions", "", "storage", "bookmarks" ], "sidebar_action": { "default_icon": { "19": "icons/16.png", diff --git a/..files_vivaldi/manifest.json b/..files_vivaldi/manifest.json index 7acbade..47600e2 100644 --- a/..files_vivaldi/manifest.json +++ b/..files_vivaldi/manifest.json @@ -14,7 +14,7 @@ "19": "icons/16.png", "16": "icons/16.png" }, - "permissions": [ "tabs", "sessions", "", "storage" ], + "permissions": [ "tabs", "sessions", "", "storage", "bookmarks" ], "options_ui": { "page": "options.html", "open_in_tab": false diff --git a/..legacy when needed/legacy.js b/..legacy when needed/legacy.js new file mode 100644 index 0000000..b781c36 --- /dev/null +++ b/..legacy when needed/legacy.js @@ -0,0 +1,347 @@ +// Copyright (c) 2017 kroppy. All rights reserved. +// Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license +// that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ + +function OldHashTab(tab){ + if (tabs[tab.id] == undefined){ + tabs[tab.id] = {ttid: "", hash: 0, h: 0, parent: tab.pinned ? "pin_list" : "tab_list", index: tab.index, expand: "n"}; + } + var hash = 0; + if (tab.url.length === 0){ + return 0; + } + for (var i = 0; i < tab.url.length; i++){ + hash = (hash << 5)-hash; + hash = hash+tab.url.charCodeAt(i); + hash |= 0; + } + tabs[tab.id].h = hash; +} + + +function LoadV015(retry){ + var loaded_options = {}; + for (var parameter in DefaultPreferences) { + opt[parameter] = DefaultPreferences[parameter]; + } + // set loaded options + if (localStorage.getItem("current_options") !== null){ + loaded_options = JSON.parse(localStorage["current_options"]); + } + for (var parameter in opt) { + if (loaded_options[parameter] != undefined && opt[parameter] != undefined){ + opt[parameter] = loaded_options[parameter]; + } + } + SavePreferences(); + if (localStorage.getItem("current_options") !== null){ + localStorage.removeItem("current_options"); + + } + + chrome.tabs.query({windowType: "normal"}, function(qtabs){ + // create current tabs object + qtabs.forEach(function(Tab){ + OldHashTab(Tab); + }); + + var reference_tabs = {}; + var tabs_to_save = []; + var tabs_matched = 0; + + // compare saved tabs from storage to current session tabs, but can be skipped if set in options + qtabs.forEach(function(Tab){ + for (var t = 0; t < 9999; t++){ + if (localStorage.getItem("t"+t) !== null){ + var LoadedTab = JSON.parse(localStorage["t"+t]); + if (LoadedTab[1] === tabs[Tab.id].h && reference_tabs[LoadedTab[0]] == undefined){ + reference_tabs[LoadedTab[0]] = Tab.id; + tabs[Tab.id].parent = LoadedTab[2]; + tabs[Tab.id].index = LoadedTab[3]; + tabs[Tab.id].expand = LoadedTab[4]; + tabs_matched++; + break; + } + + } else { + break; + } + + } + }); + + // replace parents tabIds to new ones, for that purpose reference_tabs was made before + for (var tabId in tabs){ + if (reference_tabs[tabs[tabId].parent] != undefined){ + tabs[tabId].parent = reference_tabs[tabs[tabId].parent]; + } + } + + if (browserId == "F") { + // append ids to firefox tabs + qtabs.forEach(function(Tab){ + AppendTabTTId(Tab.id); + }); + qtabs.forEach(function(Tab){ + tabs_to_save.push({id: Tab.id, ttid: tabs[tabId].ttid, parent: tabs[Tab.id].parent, index: tabs[Tab.id].index, expand: tabs[Tab.id].expand}); + }); + } else { + // create new hashes + qtabs.forEach(function(Tab){ + ChromeHashURL(Tab); + }); + qtabs.forEach(function(Tab){ + tabs_to_save.push({id: Tab.id, hash: tabs[Tab.id].hash, parent: tabs[Tab.id].parent, index: tabs[Tab.id].index, expand: tabs[Tab.id].expand}); + }); + } + localStorage["t_count"] = JSON.stringify(qtabs.length); + localStorage["tabs"] = JSON.stringify(tabs_to_save); + for (var t = 0; t < 9999; t++){ + if (localStorage.getItem("t"+t) !== null){ + localStorage.removeItem("t"+t); + } + } + window.location.reload(); + }); +} + +function FirefoxLoadV100(retry) { + chrome.windows.getAll({windowTypes: ["normal"], populate: true}, function(w) { + + var refTabs = {}; + var tabs_matched = 0; + var tabs_count = 0; + for (var wIndex = 0; wIndex < w.length; wIndex++) { + tabs_count += w[wIndex].tabs.length; + } + + // load tabs and windows from hdd + var LoadedWindows = LoadData("windows", []); + var LoadedTabs = LoadData("tabs", []); + + // if loaded tabs mismatch by 50%, then try to load back + if (LoadedTabs.length < tabs_count*0.5 || retry > 0) { + LoadedTabs = LoadData("tabs_BAK"+retry, []); + } + // if loaded windows mismatch, then try to load back + if (LoadedWindows.length < w.length || retry > 0) { + LoadedWindows = LoadData("windows_BAK"+retry, []); + } + // CACHED COUNTS AND STUFF + var lastWinId = w[w.length-1].id; + var lastTabId = w[w.length-1].tabs[w[w.length-1].tabs.length-1].id; + var LoadedWinCount = LoadedWindows.length; + var LoadedTabsCount = LoadedTabs.length; + var WinCount = w.length; + + for (var wIndex = 0; wIndex < WinCount; wIndex++) { + let winIndex = wIndex; + let winId = w[winIndex].id; + let tabsCount = w[winIndex].tabs.length; + + let win = Promise.resolve(browser.sessions.getWindowValue(winId, "TTId")).then(function(TTId) { // LOAD TTID FROM FIREFOX GET WINDOW VALUE + if (TTId != undefined) { + windows[winId] = {ttid: TTId, group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, activetab: 0, activetab_ttid: "", name: caption_ungrouped_group, font: ""}}, folders: {}}; + } else { + windows[winId] = {ttid: "", group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, activetab: 0, activetab_ttid: "", name: caption_ungrouped_group, font: ""}}, folders: {}}; + } + for (var tIndex = 0; tIndex < tabsCount; tIndex++) { + + let tabIndex = tIndex; + let tabId = w[winIndex].tabs[tabIndex].id; + let tabPinned = w[winIndex].tabs[tabIndex].pinned; + + let tab = Promise.resolve(browser.sessions.getTabValue(tabId, "TTId")).then(function(TTId) { // LOAD TTID FROM FIREFOX GET TAB VALUE + if (TTId != undefined) { + tabs[tabId] = {ttid: TTId, parent_ttid: "", parent: tabPinned ? "pin_list" : "tab_list", index: tabIndex, expand: "n"}; + } else { + tabs[tabId] = {ttid: "", parent_ttid: "", parent: tabPinned ? "pin_list" : "tab_list", index: tabIndex, expand: "n"}; + } + // IF ON LAST TAB AND LAST WINDOW, START MATCHING LOADED DATA + if (tabId == lastTabId && winId == lastWinId) { + for (var ThisSessonWinId in windows) { + if (windows[ThisSessonWinId].ttid != ""){ + for (var LwIndex = 0; LwIndex < LoadedWinCount; LwIndex++) { + if (LoadedWindows[LwIndex].ttid == windows[ThisSessonWinId].ttid) { + if (LoadedWindows[LwIndex].group_bar) { windows[ThisSessonWinId].group_bar = LoadedWindows[LwIndex].group_bar; } + if (LoadedWindows[LwIndex].search_filter) { windows[ThisSessonWinId].search_filter = LoadedWindows[LwIndex].search_filter; } + if (LoadedWindows[LwIndex].active_shelf) { windows[winId].active_shelf = LoadedWindows[LwIndex].active_shelf; } + if (LoadedWindows[LwIndex].active_group) { windows[ThisSessonWinId].active_group = LoadedWindows[LwIndex].active_group; } + if (Object.keys(LoadedWindows[LwIndex].groups).length > 0) { windows[ThisSessonWinId].groups = Object.assign({}, LoadedWindows[LwIndex].groups); } + if (Object.keys(LoadedWindows[LwIndex].folders).length > 0) { windows[ThisSessonWinId].folders = Object.assign({}, LoadedWindows[LwIndex].folders); } + LoadedWindows[LwIndex].ttid = ""; + break; + } + } + } else { + AppendWinTTId(parseInt(ThisSessonWinId)); + } + } + // OK, DONE WITH WINDOWS, START TABS LOOP + for (var ThisSessonTabId in tabs) { + if (tabs[ThisSessonTabId].ttid != ""){ + for (var LtabIndex = 0; LtabIndex < LoadedTabsCount; LtabIndex++) { + if (LoadedTabs[LtabIndex].ttid == tabs[ThisSessonTabId].ttid) { + refTabs[LoadedTabs[LtabIndex].id] = ThisSessonTabId; + if (LoadedTabs[LtabIndex].parent) { tabs[ThisSessonTabId].parent = LoadedTabs[LtabIndex].parent; } + if (LoadedTabs[LtabIndex].index) { tabs[ThisSessonTabId].index = LoadedTabs[LtabIndex].index; } + if (LoadedTabs[LtabIndex].expand) { tabs[ThisSessonTabId].expand = LoadedTabs[LtabIndex].expand; } + LoadedTabs[LtabIndex].ttid = ""; + tabs_matched++; + break; + } + } + } else { + AppendTabTTId(parseInt(ThisSessonTabId)); + } + } + // OK, DONE, NOW REPLACE OLD PARENTS IDS WITH THIS SESSION IDS + for (var ThisSessonTabId in tabs) { + if (refTabs[tabs[ThisSessonTabId].parent] != undefined) { + tabs[ThisSessonTabId].parent = refTabs[tabs[ThisSessonTabId].parent]; + } + } + // OK, SAME THING FOR ACTIVE TABS IN GROUPS + + for (var ThisSessonWinId in windows) { + for (var group in windows[ThisSessonWinId].groups) { + if (refTabs[windows[ThisSessonWinId].groups[group].activetab]) { + windows[ThisSessonWinId].groups[group].activetab = refTabs[windows[ThisSessonWinId].groups[group].activetab]; + } + } + } + + + if (localStorage.getItem("t_count") !== null){ + localStorage.removeItem("t_count"); + } + if (localStorage.getItem("tabs_BAK1") !== null){ + localStorage.removeItem("tabs_BAK1"); + } + if (localStorage.getItem("tabs_BAK2") !== null){ + localStorage.removeItem("tabs_BAK2"); + } + if (localStorage.getItem("tabs_BAK3") !== null){ + localStorage.removeItem("tabs_BAK3"); + } + if (localStorage.getItem("tabs") !== null){ + localStorage.removeItem("tabs"); + } + if (localStorage.getItem("windows") !== null){ + localStorage.removeItem(windows); + } + + + // will try to find tabs for 3 times + if (opt.skip_load == true || retry > 2 || (tabs_matched > tabs_count*0.5)) { + + running = true; + FirefoxAutoSaveData(); + FirefoxListeners(); + } else { + setTimeout(function() {FirefoxLoadTabs(retry+1);}, 2000); + } + + } + }); + } + }); + } + }); +} + + +function ConvertLegacyStorage() { + if (localStorage.getItem("current_theme") != null || localStorage.getItem("preferences") != null || localStorage.getItem("tabs") != null || localStorage.getItem("windows") != null) { + let current_theme = ""; + if (localStorage.getItem("current_theme") != null) { + current_theme = localStorage["current_theme"]; + } + let LSthemes = []; + if (localStorage.getItem("themes") != null) { + LSthemes = LoadData("themes", []); + } + SLThemes = {}; + LSthemes.forEach(function(themeName) { + let them = LoadData("theme"+themeName, {"TabsSizeSetNumber": 2, "ToolbarShow": true, "toolbar": DefaultToolbar}); + SLThemes[themeName] = them; + }); + + let LSpreferences = Object.assign({}, DefaultPreferences); + if (localStorage.getItem("preferences") != null) { + LSpreferences = LoadData("preferences", {}); + } + + if (browserId != "F") { + let LStabs = {}; + if (localStorage.getItem("tabs") != null) { + LStabs = LoadData("tabs", {}); + } + let LSwindows = {}; + if (localStorage.getItem("windows") != null) { + LSwindows = LoadData("windows", {}); + } + let LStabs_BAK1 = {}; + if (localStorage.getItem("tabs_BAK1") != null) { + LStabs_BAK1 = LoadData("tabs_BAK1", {}); + } + let LStabs_BAK2 = {}; + if (localStorage.getItem("tabs_BAK2") != null) { + LStabs_BAK2 = LoadData("tabs_BAK2", {}); + } + let LStabs_BAK3 = {}; + if (localStorage.getItem("tabs_BAK3") != null) { + LStabs_BAK3 = LoadData("tabs_BAK3", {}); + } + + let LSwindows_BAK1 = {}; + if (localStorage.getItem("windows_BAK1") != null) { + LSwindows_BAK1 = LoadData("windows_BAK1", {}); + } + let LSwindows_BAK2 = {}; + if (localStorage.getItem("windows_BAK2") != null) { + LSwindows_BAK2 = LoadData("windows_BAK2", {}); + } + let LSwindows_BAK3 = {}; + if (localStorage.getItem("windows_BAK3") != null) { + LSwindows_BAK3 = LoadData("windows_BAK3", {}); + } + + + let LSt_count = 0; + if (localStorage.getItem("t_count") != null) { + LSt_count = LoadData("t_count", {}); + } + let LSw_count = 0; + if (localStorage.getItem("w_count") != null) { + LSw_count = LoadData("w_count", {}); + } + chrome.storage.local.set({tabs: LStabs}); + chrome.storage.local.set({windows: LSwindows}); + chrome.storage.local.set({tabs_BAK1: LStabs_BAK1}); + chrome.storage.local.set({tabs_BAK2: LStabs_BAK2}); + chrome.storage.local.set({tabs_BAK3: LStabs_BAK3}); + + chrome.storage.local.set({windows_BAK1: LSwindows_BAK1}); + chrome.storage.local.set({windows_BAK2: LSwindows_BAK2}); + chrome.storage.local.set({windows_BAK3: LSwindows_BAK3}); + chrome.storage.local.set({t_count: LSt_count}); + chrome.storage.local.set({w_count: LSw_count}); + } + chrome.storage.local.set({preferences: LSpreferences}); + chrome.storage.local.set({current_theme: current_theme}); + chrome.storage.local.set({themes: SLThemes}); + localStorage.clear(); + window.location.reload(); + } +} + +function LoadData(KeyName, ExpectReturnDefaultType) { + var data = ExpectReturnDefaultType; + try { + data = JSON.parse(localStorage[KeyName]); + return data; + } catch(e) { + return ExpectReturnDefaultType; + } +} diff --git a/Tree Tabs.zip b/Tree Tabs.zip deleted file mode 100644 index 63f01db5db2ee666d9fd75e143ff21cb2308fb4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 873796 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�l=4&2BY}`KTO| z3;|+X*k2$WkPtyt-;r&e6b;TtX+zv)7TN|@Uun1`u z4oV3jJ0VvYaE3TJi5k{IN-j@AzO)(( zF)Ch$YGa0plsh&xZxL@)W9u_lASi!q1%JanZRx#OV7G#>CEFx1MCJfEvo1&wxD=d7 z)DQ$5Nt~#`p)IhYQpt##qfVUEcs&cr^giUC%Bdz}JXKx+Dj4FLAc4?JP%i*WYfmr< z$2sb9l|_CP6&Pv8lgT#7&$+Ii2!*0NODZam9HJ11C~SEM!Uz?@_*SZ$4S@z+xWkG( zXzX}U2X6|-LM=9yCh#$^O!8(;7v%JKXS6BOguZw9&w_D9)dp*^-Qz|I3k0%0peua9 zQKuYz02Z6+(SE`Nn=wdE14xpb;VSHvgM@Z@9GjX0PaOZ!DH5*1Kj-Q#=o5aa@1R4L z3HTrzPEd|sz#hpe;G^+re7n40K8q?aW@u!A6&BHR?!I$(hp_Hz>d@i>tNbxDrq457kHuCj$b zQWLd8ADn{eEhCaYf#?Cy9)C#L#WGSUGF`r;IQ$^`7#qGi)rBBXOo!lr5EU;tU?!M8 zY94bHMzVj>lWvq_#~CH(aO57t20eL{EC9YtNL~&)5HI*I)>o0J|7BIZml94WZ3Pj@ zqfHGTC4wy^VI!9WN>JovA_ZMsa}aZk1JYuMIPQ-N=?#|vQ{*mskr%8fJMU4e7oIsc z3X@Pmb2O!jTSY-}Es!O_Bt&iq1A-GFt5Ow%k;<_mH?%aqgodC`5`k)Y956)g1&s(x zc?Id>lzs)AhUx*GV<;-b=W4CgD9!?xx{+!E)YWgn9XzdQ$q8WVb`ejAHFTfV1UBs+ zvUma)jO)x3m8(oCqJod4(4i#4@Z|hge1sf-8Y{u#VmZ7vm@H`nou7)~Fzv=oIuqd} zNd+DUmYF3Iq|%YpNb92D4GDylUeXb45LmOICHm?PK5NA^Uq~@Q25uwBzdoA27Ucq* zl&(;Qa{cmi7~bQHfc6kV zK@sY$FD^tmWvvm;Ay^MV(ljba0Ssv6fC8;5k<#B}wnE~B7ph$prP88;JBcJokU z^$wv7EJtEpy-W82ZTOp$q&x%^R94cIPA)b`QC0mE6zSJ6jp}|e(@>w2tX!=cdm-08W&K>1 zZy?#k6(E$*Hrj46-iN-PhQM50r04Wym#m!Nr0O*z=1|2|XG0{wPGgOpldECL;ZW5nNgQ&`Cy-Tv39{ssQ|E+WHwgVV z>>Hv$c6=y>A7=~9;rGx_4bRB*PUH~5H~5#eO|#Ybj5dA!IxGwM#^^bLML?(j^fDs= z!je!knxsBavJ)yP+N~*=$CIFYoaXv5z!guh-KlJrqP_uJH{RpC1N8Br`NNC{cm`095TdKZ;Fn#7f3qL-e@u zn!HggtgTqfmGI%3a&6Q;Bo8GdG$5}bLP5x3;&g&Q7fN>J3J3CL-l^&uaD_%tKV?;D z+Pnf9Vh9ehfHOg;F?g>7olMAOi%-_klsq+I$%P;Vu52|R1zUKZfi1v#*Qsk?Bqqsp zghVr_?2P(}_!v}jR;*5)_4x{x%?m(qZ`-$ZV-S5GC+z4hdK@uy~E`counvLDC>2<%C9dIrn1C2%yv}&mNaU%#>@IAW(>TWg)UUoahi_2v19<8AuM|HGrBUF56YGDmX5V zWjcs%>q$Y60CMmUG{})db^MB@iP3mxc^<^tH9-Y42}*}+ffyfJda^c%QleBI2;G{z zE}4Q&iKL`aK|SSu(hAQ(G!U^)g8U)!7EU!SQdysZTblv_Lo*(0@qJSIhl&A9n$ijA z7vlbik|O30!U$EO;=O1=GLA;AxTYSySSt=fsC%x3O$rrtj~d71wof>eX<7v)&v3>#7JyD_~E(01#3ytkj$4vrAo0Y zS;GTHK(Wn^CQGjiMhpQ!eoh>NTtkEj7;8xW8jF{h$@u5?k@HmQ!6_S}Ea?&n zJd$)mPook!Zd*C^^DR(k%bfN=#6$>RnRo+d7$q*i(o$ec$kLAC6;h|;4aXy?^a)Ky zRa#~H0@wRQ;G--{VJPZIHA0olX{c7I)q_MK(4e&FbX%G=2&E5U{^fW{N`>anRBu6A za`^*^hbTZa2qp!h)C77|`INsxMXgIZCzx#jDvp9(s(O^#+=QixJR4*RK$QmA_>HKQ zrKVy_111W#O}$joZQ2z;MjJPsY$phQ1n8u`OhyozpPUgc>43*LI=F3`XP`WEHr%H_ z50%ESM)7c~sI}wDGup3_#w%?Sf#ooE1w`to?lIHXk7bl4=LF~l7CR`L3i7bK!fYj) zpj8-GWWiFbych%>GNq~qYyrrzfplkB-Lk;VhFODG-;DB{G7OHlsH8bWWO*xkP?ti( ze+%sl+N$^n5ajG=+96h0_$`?*qLXn2J1dAzvI7$}TxlZkokB9z&X8-9s=LA)V5obQ z=FMk>XO6+-q;c({g9DI9vl}7~K#~YDB0Cc;-uhiKVHV0K(Rzp*aEwm&7AJ@RQAko& zQQuY)6dJ+Dx=1mVKwP0K)54&$P%=?c&Xa~UNPiZEWeH+D)nv1nF(5&M;;on)cYa3I zSB|PA;$<`Nw)C=$g*g?N8$vcjfUZ&(LCcMGu*)II@`C_$2(!QquV&ChS0!tcSV+7K z1?s@ENL+xjWANO-97sz=y#hl}r9f&n;O`IwoZFhnHE-V|w}6-@;Ob9*=K zX`Dn17xk1zkpkIvP1Gr{Q=xHKx^-6oywo5X*?ER@u#FeXAk-eLtWl*eq4v^)-uf>T zR6H*;tw}(KkJybIMu&EC5El;3MXe_doK_9s3aTgpr4B6udR7F@h;o3e+v_5)Zs7nf z@HI#RX;jD*8Naa2i$hpyIB8#e0ZT{ng7^Rp_G(o`IR}LBqq{7na~fVKp4$wovBWP;-#~p0e6pW;y8Ky1GqisQ9SCaiG{2yVl*!XOma0O`&atGP3$p?hL z;#xVcB21!A9q!y7hJI&IY^hfbBOiGcF$g3DZKBechm9g4@V!xvTt(Ee*;sZAE&SZM zsc^yod6DAn}tH$;dK(zGIU5023+6N3^57F zD=v$f-gubh@H?QS>iQ9f-)aqhwuc5^6aKG^LyyHN{+i zi0?;+sR;0ma)pLQnUiU3qRQAb^l75&0MC>!@t5Knz7_dLxRf^I9$Y}(x6|cMjGd1*A;6<>M1nXTAvKgijgblDFc^3{Y*%^vrnf0IS zfMvr~;}(02RJ6 z0xI-u8V3EAAmM44PB_LVbXZapwFXBA!;$7iX%Y^|L6jJQ-i5#g`d3cY>xVugvqE?E zQ2;#TE^J$hK~FGAiwvSD$bf~0XJm~5fE3L)@N*(ycpswS`L9kBz(ObxO!>cr(H=&I za#}H{zAgfs%DpDHw<2S(VYle8IG_~fu`KE?Ali&Jr; zNd(;~KNDaD;qBwmLy5!~z(t%Nl%Hp~z$1wZav+Vos^MS=_XZS$#tuDF2OoRljZ|HI zB`lYMMDub8Y^2zGj3Mm9`Y3{cVJRTgQ&TB%Gvlgm2L@`W&SQ)rcHli^5`=Y%;8(G2 zg;N+Qs6b6177UgG^=XT;$0I8nnx$@OR?`7Z(&s~Vd^riBh=6Ix$06`i^&9@BY~HrW zwua04Fl2HEA#s3ifG9$vRS&Z0t-+9P6A|Ka6qXolzy-uzb%;O^mOVGm+6D)j^8g{B zlHr2b+l%y9GJlY(K^FAnLh0$@F##|1Sb#Rjt#-&>D=4`j@P-cbyr_bIdKv4f5=4~H z74&z)a4%xW<3QO_zYJPEP}+bxa(T-JwsWNj*o+-zFNunRxJC_5jlth#qT``hz{Lsv z8--XEDsG_HM}t|6lk5k1kT5{_5e5%MzKg77*?F-bSx&0QMIJH!utGbjX#I zfd%4GY^(A;_cBqF$~hQ@(FP%sB&ebR^HioOJtPDkW?h1UN?E(iyfhhvgBo(*9uds3!B?ci0PD@9|ej=HU z<|O0pyvr{D!C4K|%2N}O7FK&yRm^b6>fTWP3}F(&plfrA_;4?n5PzVO*D7ochuVYW zs$uW5D3OBxi&hE@GS=+Chags+^gbR0{(mywVG!XEMj$bUpr`0X8kq5fBwAo-2HI_VJAH+CtdT#KvVB$)3*qxoC~{9qInh&=8A#&y z#vak-PEI-;U17q}vqRfNv_ukmnGU9~h6Rk`Q#!50&7=h}X{CG*PDkpWRiGm572v5u z018@D%nv9B{^iyK0%?$y&!a@Aa03K+9VTD|GzoI!kxpV!iAPYk63QSIHGA^WWzWO? zo3iAM_7b{6r@ToLZAYKA^d(7j%YPzCgT06OXObk<7a~^)f*|yC7s5A$c*8_ZxRa!* z%>4fENRvOg#mb>HM6&4>Gy!Ivz+Z7j(w;;wGVuMn)K6zuO%m zZo2$H6dwXY6^l4NSBn()cSLhIVINN(1kuO{v(+Q@Cqc`ps11awtgY15LaT?u34hr4Csee6^ zM6F$;hC{NfLSmKyy!wkLvdU%*`pbp~NC&y1)MP5ufG%4)AnvkMkwO2l{FtN;-h5rg zzv=W_A_s5`eVafnb-NM1J%$j*Ky>6>NS6?vI4WZVO%bfa%X+29Nt7e$kSrx4@2K`4 zzXJSAuQuecVE*(RRRL#ngtC?BvI;%}qB_vf3nq$LF}-pVzapMy!*F0LXch~~;xvR- zpg?vAAnZaYEx=byX+>g$WP}(X^ElCLXzY!9lleZ*$4&~diCx>e z39r?n2w{Ug7#@gnwi0agYAYFL>9y2OZ8wpuNYx|m-b5Pm5N&Jk)kTs=u@D#Kt6V(y$Z+lFKJ>QxbPre3a%E5+$H4m03MGnXqDoWN7 zC@iMYqn(POjULUSFoVb_^h>L$@sx(gum{*d5n%mAgotj`^BtEdBT*uhqm!RiK1C#p znT=2m20?$5O2lNEF5rSq<4b~q=zb6oCQ*V8X$d?I?sg}rctC{2E)+wTf@Kcm#ZfsZ zk?2LVp;VVYJBUjJ9g4XpW#n$#om3t#v@6fPEL}scDEb_RxgOaGdYgohMV*{GQKW(H zF_Xd%y9-=DLWgoi!#)71M0#;F;*Rqnbiq4r!v&i@tD96M1xTt{y)+3{jB2OV#0r?m zsYpU2-fD;jr_IX2Ti&N>{$=Y2B0fXcHgTw-DM=(EdK~-3grV|XoMXkX;Gfi-STHXY zR{_b!Fd0-TEHe`q^QOB^L+Y!>X^_8wHCBBRW{Qb`x+bkFI^B^}ic&QcdCYMTEtj3! zkgbShMX)I^dxL@!*($k+#D6E|N{A>SMd(Tt5Diq9^`#&pKxP$!oo|w*mzV)!Bi^0M zgvVPHM24z35emPxF!s=gQeBHC@mC0OE<5QsvK zT5JqfbrUTx%&Rw{6d|c3z`p>*Vz_guUI7IP;g>?1qQ+D;D_DL|0j;_G}0M zB0wM!+X0>>r6Whl#u*@r@)X)#_$t)`G%SC40fqtu(p{oE59quhoK>((>QhhAtk7X8 zz(CpCu-Rp`867tzxEZmia3hl;e6N%0zN;lA%1p|;FxIhLZUgtVB$M^QVDpz|Io%GJ zsBc}8h82Qw3IsBc%6>1_#G4YpIHQTSs)DECJ0LMj&@ur9l4+JlR&u=GNMC6%3HT5b zfEd>e;+#b6XcMfQFkbLaa0a33=SmG;wx{4fCHyZevD|wCap0O069-gp72yqt5khM` zoovHUMQm6sHHr<&NMddjXiI?W60ro?=)lS}7JHa59vSaY5pe*E@>s()4>XfpL{N(x zv|sEv%L_7vQMwklPfE49Z7zy}O|p>PP|%_{3@8kU#@_+CQX9=iUs+MaTYiI!+ka@f!g{(u4y43LrrGD+eNcv+kPuPqt%$J^qJ1_MkX4gEhE2sp3zP6AQYZi=Q9 ztD&xx9);OKdJ{DDpvu9;#Hh+dsji#hZkJg}(z9mz2DoeGL-=<78^~3d4b`6-&Fq-nu)^uf|-tDJl`tuB3`Z@UcgvU#*v6xgq|V>v~Dm0fFc z@qr`5u)Jt~CJgvJmF(mK8WCF~kx#<{d;ll`eVQAGbimljG@ZLCX?xw4jYN*@L~LP& zo%$sqD(OSGNg9LXLEXTJ@5`1QI?*FLsuprYJDt0g7#a?NC<^O3vK4c+W*k(f0D$u* zLnr`78;Z0Y=0yghhMb|-do`lZ;+tq0DmT=Zb&ftWeCvAAod^clnD{EPp38B=b*lWQYUqlt7&c{rMKw`o;6^8KKLu}K4)33v@5prL`J?{>kBh&EKg-Rf6BwQ? zUZQ=nNl|$y+&ZUcaFCutwpLwqrv+E6+{gUTIYQ{WSss{0c`@PGk*cc%I%4?BEN?1( z+CMBV1BAbo#00&i1oi0@v2aShtZORyw)Dc|505J)FFQTP&E zLRx5nTG9Y2*&>_=gqZa49<;Sp%O*HA7#ooTAQKF5uZ4oGBFrHaKdstb>X80lUmO}4 z<%;$i9@P^dnF?FM-DV@MVtYddBsnvREXH|c2h7MqZWnydmV8pPkiH12G>$anXcD== zta4rOTk5!{R)cIE0a$#cC~4tX4z*Va`M46L(-uVJ$R5^x(15`-V2)V~+!K-Hu|P^s z3YL$H#)lVXW|+*f%p`nFs!g^M?BTM5_5eYk2SRlK_}p$qarTsfkkx{a3P(e`a&ln0 zSMBx~teH@&4A)N zXa@k8l#~>J({V+9cw2#UzyKOC#FStPDch7obJV&Z{XuUHF(sNHCR2C>5P{7|L}Ia& zQWk{Z16>p1AP9w-#wT>o$aR5=%IGzRS$m(0hjSp#OpM4lW6#tPMyKeoBy-tH?Q`@? zc%i{~0^=6~O{|WnB*c~q-4nh;j}x|rVMF`GAQ}`(EBrooe2dK#QqC2^Jy^k{YF-w) zR4Tz9mWG&-oFd7`2WQyb9?=dF15@`{3cm8H>EU8~49mE}y2EOW21NpoOs)ZVoG9u~ zi7HqfrTZmGxj7IhPGK^-%K(Urc7WhaM#3N|yo9KDw|1k@Sh1U->B?vMR5=4MclN1~ zOZ%Tn$C6WpM}|x%w-gM%inkz`K^LhJtV|=7BC6e;0j6inEfd4>iwJSl0DOW}0)nwL zX1Nh0YgJ0W2~yN}iOk|=X-^{Qsz}3f$Wwe(YORpVw4M}XEy5%X1%QoMCEtm4LJ*7m zDuo;L*T+`oM5_}X%n(LIaa3G{t(ZQeeH# zTZxt-7E4m(ZXhJB+C+f*#Nen!7&^IFy5lG)Av!S8JldAp7w_vqRkgIapixl!Sx!ow|n5VBBe>C6B2gW)zf+@w;35#w*R^e-n8 z3auBT`lJ3k+^)7f@mHsY1B_lbjX1DWTb8>36=1xBT1)R@HU`r>f->NG@(!ZGI*K#{ z_WFUsd65`YIg;)W7~fswvNC~|AdwAr-e?%PVCv!SsgWQQc#}nBw^23%4QJLe3@{Gj zWhnnlzs4#YSp?O$_z(1@_XI(B1MtGW4jm9FP=h$E!mV)Cg&JHGc&DflesaEp8X5FS zK7!0FFi|4v^4T(=OGD^(Nr?;1Xrq&(1E8y2|W3pQ0YM+MWmlX80<-{-O zqlyKCSL-)Z0w8uH648+mj<9F+6UPovv-2Os-z^1t@{xez*wgHVv8W9Ru8-!WXg@ee zWOI>PE+Ts=?Z9EyZN?y@SaoPrsA6KbQdCJ2;Ab}DH;fy|YE#gHaS?zL3J`$C?Nbar zI|j>DkRlhEid0Jq;d#!5){V|t=)l2{keτr^DYnzd3DQz!ec7!mP8g<{wMBE@f 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⪻WZLi1FFT04*w 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


!MXnH9?#kP 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
v!^eX)Q1<^Srx{l)LNaDkssIBQ(D-)eVy zhm+N|)6oGu06+N3$6t6Ex1(0{eD!CWjgu#ztr$<7`Ss+u+ry^mXf!(6TwHwo_;KxV zv(_IRE;gW5FQRg_68q|wmMXYEyIMIJB*SFzD7iX3fg$pKYt-pqsXn>WX@3cyYGuFM z8lv6PPIqB=(&<6UOR9hh{2r(bhKRq-v2SV4`3KoHReg9}`n|+8wD+*e(Ja!<&M$|R z;CQ!u?Y2hA{K`^g1;@5CB?kQwUoTzMYEl-L-kYL&*sDUP40`8&8~+S&@1+IBSn8$S zRuA{tjgm@hgfr!^wRv6!z~4J`PYuwt z_+EQose5f&a(cJ9$k$rQfzMS|LO1h-|qgN3m5qLF1NWkPTHMT?XYw3>ej9Gjn)enUbygcAGvVr)~&C8 z^{YSgGe7e?zw2M5vy|N8XreC+Pco$c#a-?-VREq(ag_~`%p_PG}>eB{DqzGw9d zAO4rW_$&Y97r*xP*Z$KF?f=H-Kl9f=^i#(V)}G#9|HU79@}Km{%8ODH|OF`e(!~EM<;XW}kY|NM8pXZzOQ z`p7T;+IJuPl^=NeqkrmY^7@q@&TYC9!Fqi2m*zkD=7mrG(}kb=m2YnUN@M@6&*Z@~ z86{~X{z1U?+h3o%_M!i<{pY^z(f9rOXMXYz&)xk;^EYnh0`+|ks9*Ty_0OEX_4TXY zI85fh`P2X7&;I<+efhu4uS1xCqgVg)3*Y&x-&6e$E*yR0%YXZ){?TW?^Z)3)@ST4l zcVZ{vDm|~?!$B_V|tKa|dYxR!~|F5mhU-&z}as8zIslR&k@BE^UF%5uV@wYy5 z?FT;bu|M<8zxUVw;%C15!9RZIQ?Io?A7SxB7nG(xHh<%9Uit73{p??Qargsyvq-A4 zwDQT{|I5F2;pKMcFUnZb{gxW|1q>UD@x$o$YV(Kczc+bS`L?`n|A0=E67$?of9Kaa zcRSxW%AX=kY6?C7)*m?7{q;Y2<0o&O{M7kOYFWzscA3?Wn!)`Gc_aITjO-`A=lB1? z5C7_n-J9zwi&! zJWhF2iGin=$HalBE0khqY4V-~*h{hKx%r!K{pKHqc;M$#_>7K{<781p&#qqVl@>sd zK9E6906`3)8vYarpj)v3`hA!Y^3Dt3ou44@JotP^r!G~HLgcrXes$~N?F#|OKmLio z{QCd!_uu-}$A9U<1%AA=6u@iy!{OrRD%;oZ-@ASL+SU8pmCr4H{0073J47aglg-VA z$I0Hq&S+t{Kj?S6d#%CckH7FD>~Xu@&Ty3Ty7KJfFU+YeZnN^JHJD%URd@CI#g|Y- zOn2E5@|XqQ84JY1=;-u#ZvrSz0FE%4;SFT@=EAO{gchg5~4luy_+12+z&&dur7aw?|iQ@4VfNNP|fZ22Z(uH z*z1o*{o~C_{p3kSF5NMd=W0nY44%b;;aI?Tk6WEy3i?3;^K<8sK%WBAuDr&o4k#Sl zSs|KopW zNNm6p0(BZ%u%^Yvj1vu!3K6RFXD7j#~qG5*7xX!z0kSJ`6{RWjmU$^?Mg(97Pmwy7R9E zB%P=%rQ6a%=#Ih-zLY&q)vfT}{MA<2xv3L^kPpBs=J9Ul_^=EPItaWPra88b7-*Ch zO3kBPuO6pUFq!PI?b_2hNpqL<7)wE@vOG;`0lcJ5E6~GYhT(;eNS8rP&zHf5Eh`S* zM^eDFBZzm@^zj$c?El)EJ3II8T7Bk4Q){o^e~2~kaG06rNQS{bcZji^4!ZNT+M=p> z9;K!UI#Gr2MY>H@MV6d}seeM5^c)bG2Fk;est`dlOhzMkh@S%-+d_GG(lsK0j=`8K zX^Jg9TdZ9kkg#+F1Qg!0Qw%DX2O%gNL2v|hyFYk(b|_2(q&IxN_3Yay4^_5K1Qv9U{nns;_9-(Blm{qP zA%dotJU%-lC*9NG?p{Y?Sjw^Abd3lWvi0X6pvQxxw|`U~Ephn>l3~&s>>r&SFI8My3TVsuaKnYTlJ*&kmJP z=w7UgAiR&Xu3uKQs?-jKX`8J zXe;IM6PE`#p1>)?u%CHYKRW@rCdvbpsS=>bzH2-`M2+boa#eC5YCbRib(0 z4(0UZ>;Mg0)99vQ=?IMEiO@3$=zRypEUn{YaF~#y&km3@QGTML;sMzhfSwDKc;(Jb z-0j8X^QP)KrA0^ylfel~N5JSYuIG^O+Cce9ipvWuo(WQlYJsy8O;#jMMo+d*Kt3Wy zpBJi7GERmkEFC~%3Y~Q?k|N3j!?tRf(-i^rxq1Z?svdiG& z8Vo9DpIy@s+L(gmwDX{jz;9K{5H?MfbY???ZHft(riM@YwzU*O)1E5nyNCTEEpYe zagL*7a}KshoLEwQ7eF>pp0wIL&a$AO8@kB>wGO+ofNI@i^>rOq zKx2`S*-RxMFLE@fFOOb5HH?QfoSR{;sL_LdZ$yA1GDdHk2mSrip-gc9bVN51U9CNO z`m|`wRQJ2E8A$1AC%&`+)r?DentCb3wS?Gk1YS{Zd{D~~eHq^6$j|Q|Pz``fX(vS>xiZ%+&;o~kv={|vF|$}njWQIrkXMnc| zG>?=gW_+%Ng+As8sRtPiQ6Wqi5MZa^TsUYQce)tq)j_A#y|%SPT`43p=4ljTA%0G<0(u;da3C{3DxStrnTg!c*)iZ*hGrBW zyE>XnhLExm88HAktUE3c@yOlwpmms|e})8LAu_zuLS#dz6#4}NzAORz!=uRtK4d^K zsIp+xjxaBXm^m6HZNSz)*&QLe1)Sv>CMi2~Rnw$0PRoK?zGB^V_wFHj{r=e4j4f!!dnQ8?CNV`62Uo(ZeQbLzOulx$KXbo<0USSe9quGte1agoFSWQ zSUzVdXQeq_QOBr;yT?iIG_7Sg&SiQ0W8i4v@c=1Kp-~UuYay_Yk8orf=gV9BP_%h| z8Uy3=cZUF zT6cjuI*U`xC|Kqo;;2H2b|m7>PHG)H$9EIUb^>E&KEh^x!P8;V?RHLvogo47%qPvG z=cJYi%-aXwMjl*LNK5!*gba$-;3RRV=s8+U>xIGr%^tz3IF@hmX3JisGG zvCwO)C@?5IH(NzMk|r80)M~vOV>M^sb)d&_DwsM|!bvqUv9nBuVBMhFDE%?w>%^{K zV;0vFiBDIdqS;~H(wt2wh-sg^0Mo+^)<6(uybc;N>X#g8Fe7Ek)F(S3{j51ceWd;ly#3DR5khnxodsGn1lfC9z(Xj_s1EXn$F* zV(lJhqHf!INd?1<+1JXQ3-_9g##Bi`SC067L({H;yqYB^Ca-G2y0As<+yo26zM^C; zz(J|i;@XMGtsGM-sC(8qE47&N`z*hzCf1)cixV42&*iC{eXtsl**_-;@yE<%wE0{y z?dp_VMM3%8xp4187$&S3S4TY*r6fjfok{r3tyGB9U`4o!;iyWj0asH?PmN_GYRcof z6s4!3Do^8MYL>_TMET+9+OCKk(cvHo=cKIi?<$v^5DSO3i^ALBWq#3yfX9VtM2#2Z zgvF54Q~B8$UwP65jjvs}PHeSGuwd*n5h1x~D7AWAGp>oLmQiu_-1X#&Q|`GQL-H!M zxLh-?2?O+V&0}WGoMARIZKUT^qs)+2b_gft|IgmL#>kazhj~<_z~b1~iWS9?Vmmmu zZ=}o7bQSBIQ_m(jHym>2UTQeQ0m*wuSK~>ey1SaJJJnt7s%mn0M+3x=U^s$o7;+pZ zff68b9zX&FF_eFCke7}8@golyjsZhI0wi!E#E26oKx_fYx7L1~eO^`7&E~vV&FSf? zefHjG@3q%nd#$zC!|XYuSXobF9*66&Vh_0{XE;x)nyi9wRh#7y z4R(lY98PPkJ>eRjX(tpLtqtk5Fuu_H`gmU7aBbM15vM~*#J#sl>ciJFnEi~jZ<=U9(&%e5Dz+;sV#F!jU3!@;O#_GjBAb~px2&bLOk?Ri$}Y}+R{ z*7L7gX-k}S?MfXiUqN@^RWNC8DMKo^?!I!}p7j{X+EuQYe=Mhb)%e!kU0FwKOZe_} zyH#!1UZtwWYp#&4?3(LzwteOYWp~S3%CRy$Z0qx_+}UyU-G+Gm=m@z~$$iuNCgent`8rd)k3N&-#|TIQs&Z`&hnbO?}K{?WNbM zty=@GbM9h0+UMKM`A#bLw4(sIOP!@tIq&+HHrR^$9yhX#R_CS@pwqc=p){oB7!lYy z=4G>-6{L~j&U4@f{WEC^L~+)mx2lKb%U*5~j(pvy6%2or?2NhhBNMZdkzGnGMnF0quhxZRI)ob z+)e8q`Hs#7rq$;o2TMAtM2)jgXO#?|L?JE!nM!>wN2!eM43Mg1cje{h6$jJ0l*hf5 zFiRel&&i4`?Wz)me2X*ely&Kk@4I4R=Rln`yIUJ=*6i;bD5Ge%Ogb$CBs{XtMv0b9 z<6N|8jSepimCi)A1Gt!~ecashFB&Sf|!ovWYU^O3ui{Z>-F3xUA} zB4mlUtSbR}(yn}qShsS6<$DL_5+Kvb(8WFo(Ogad+FxMCpBp#Mj1CwWwIP8HU_*78y z;0LGF37j->yC;eA#};>-OIzfedlj29{D}*mzada`J{AH7986AD-+6;(Yh+4vNrIuc znDT*_?qi%*cSlDji)TKnO=i{AFrK4kWQW5iT3O%q zstfmH3xgpC%^jHB&|MdbaodsiBef1)tlsVWH@_W;GuQ3=_ugYK-~Tqb=@iO1J`|nX zv+e_@TpX{*;-1!`Php&w{zOBmmfiuvV4(;^hjyu*&o2AgKM^5LD8ud!!PA6@YOt%kLi@HIXHTGAf1XndnJ|8fIQ=K(0us&I&yfM(B9~ zm?-ISA&D*uhFLlu=ML%Ku#z(8AZc2y0H#S0 zd+)vZu2TJ5ckexT^S0@pc)k)Y=@XX2uTHWownq7cEifEr(x%^v9Bh{4+vnz(6J+4O zT$s4**vWM$aS;tKmG4N)9Wlyv6rQg3ty(#E!iEomQ&yueK6eMtF%?}=aKx=*#(3xV zfG%M6o{%M~;!)k!DRHNs@obWD!`0Hx-JY=gWL9y%P!VHflX=R;LUAn(p5z)DE=zpD zUvHWvXsSpeK|**YgQ%;bg9^AH6}cP>WS7&*rbQXjcFw@dov+jF{$x5Y+2z;ABejDu ztvvsi!_g|9(KT}|GQd?rWu1XfPe#WD?asviHH5Z&R>4P> zdVk4tomUkO`yO_4au#6ovX;JGB~%k)$nm%V(RDbEFVF-uoC_hW!zvqDLUK_Sp!lg{ zo^2H)1m}qAM(QQ4=W?kR(3@RsD1NrUqAUo4oV}=E3t*yIKZA2Ve`82ZJ$3W(_g;k5 zZHDo>9gcOd(^2_D`U@!q8%F4J4d&rMmvP2lIq|c0iYu6038k{W1X_N}S4Ie}o7x)i zJDVI@`JzA|dJb*K7fBRdGR+kry$EU4lkJQVb(Av@n?3`n)PceA6zh)SOfYiX^b3?t z?Xi=AbIEyF#hJPJS4kJP@AbqB1JLH#B@Fi#TADuW5h~24?Gz?D_ekd$aDJIE6+k+t zT15jOvD1ngR@belaq~y^YPmXim0^~#PFcKqH6Z}L;fdS;tc-d!G5TvwB%QCJ+Fuc@ ztx_-lG?Tj>KINa={-u3M26kh}3DB;v*f0Yl;-Aa5nv;D(rqK1Ws_R?_Rj)8|M}|MS zrS>Z?OO!h8X( zP3}rQ!xdLGG{ALb)xa)d&vKBT1uOh}YZPuP!0!ywETLPy2 zd-&=#n+TzDt=+C-0GA~Oa7C|%SPmED8J4K_Iki_^*FkMdQ{)BxWiJqB=RBj9Q1A7_ zK4-5&FC;OxpGT-C)+HDob7l!VcCw{Onw>d8y$>a>x6SAvy=Z-Qt$Y+t=j;X(=4j5C zoJws}G1jxQp=j7((%g&)FQ=C`)*_9T8UxH6>eVHX0H+|`_r0^i&X|%v7!-it*F%54!`PAhI5~%*@iKX zD9I5DnM{opXkWY%&?o^i+z2f+%4_W|eXD@w?lLW~AP0gkRzKlU#fIE1UC6q1ERJ@C zWGf0On@%gc={6{+JyoPmC<7%>r(|$ZQ;~JyqL^WVpcl;@LZo>CATncL2TIoN?3`c< zRiGJ=WQCW&sBo`qzgh&b-zxY2Gosy3p9Unr9&YcD;o+u|GvycM(nn-_Bk7t;K>2(` z4DO*5gQQO3zAINpcfY|;U8{_M86t(`Y}d`)(dgU!8?<#b2t4gsleBuU4hA{n26HoS zb7Ps&R=7i>TX62aF0$g zaQs4oc2|eyMti{kUN!A=fmb`N0J4&fyZ3J1zVq(4qqlB;@6N4z?^>GDluY8V$>9np zHm_Jz+sr{n*HT}jhB7v@nR|z7Fifu{#wUL+W(GBbfdtggk~lcah-%8C2e;XH`Z8~0 zXU~A}krw61Lin_9rLWWw+XwYn3(?)eLmpV6Vj{k!*8j4O$1rd-2%l&~{DQCt3P%4a{rwmHLXhQ>>|%XI&MSyLtIcdqXX}}`R;e! z{+IMmX7#*%K#15?z5{*{+-uI19mF z+HIg~f=F5?}5ONjCrZ^k{D<`o{i&{F4!s zo*KGJoncr0mFmn`DxQwo@=u-$%rEoacW&N!HeXkMc+1ktIh1A>&&ZcZo%3&x#xCya-*opOUO7BPWxu8`C6`@y^;LO)ewOYKa+3t zTk@~`$b;BdFtdE{=FR)$D0<`GFS<#Y7&m|=Ot&o{9Lhh_b6Cd>%7YKU1kZ&k6~<+s zW{IN1=Vn+ogRV)S`|#d9!7VqyFxR5r!-WBcb##CNn-FY4g>tUYa6HT=sGDDp@a=xp z%mg0Zdw4H0IULK08%>og`84m~7%t|>Eleq^p%bdWTe=bUs9=B@c4NmTIjTg9ZW~l3 zlTtco7CWzNqPsL5>>Z}^(DWCiud+S5!zBlD8C!m<#E1MdFOi4E8w*|qLFA{hiXKH_ z{zx&h&%$f$d*{njWLbyg!p=uzh|J>1LY=4%C`uA5#}T|2|^0-d|1ZnEfA zRZEl1BbsXx-0fMsb59Jl3ufFOjz(%?Y>=c_FP!&5Ym^)YC|9U^mf4q9Zxswm4N8#6 zEw^!t4j0=xO8fm+Tx$0`oN#fWZJjkHTCQ1x#^s7`VlI($)w~oM6|*x?%H~*DT>COx zE1YR@X>&E#pKocEme0CWed*jCy19HX0e!N=bu|L?E^O#h#SjQJ%k6tz9}ZPbYB0Pw zqTnTGf`-B}Lo6WC( z@eD6j3@2SY&5M=KH1*Q1UkQLxi&bE7h*G&9vcY>`6b}Q}z77eBl%k^k8X#HTYSkXd zrV+fV1Q^R7_&wm>xr9T=Ixe70uW+2Wz5*!O7CGFh;~I+Z38qoEe`?gfJQPN7c20c{msdn;$azzQ>?$%?_%nTEY-RLGn{n z$b_56_f$lQ!`@!y;HnTI*A&f*WFcIYx!;E zvw))9WECvREgUfNEN31iOsg{4@R(t{T^B*})kEkU)Zt04$vI$DLV`6RRccp&SJe)3 zl&TVW+{29dXzg|OI##_W%!h|+Ry71s>#*PIskMNS+RD|>0v`X4ppgYlQ6^pbA_tZN zbCSm+_p&9J;M~%Yo{kd(aI;`tl4)%e#{N6b5)6u$5lA7VzvQ zbnjn|Tz0#7615t~T#Fq1R-&416+mHq0G8XXjdKQN`_ddWY4V zMMdD<5Md7whn;mBo&~fOgAJOmI!czec0gT9IfE{i5YM2NgJ}VEhyCvUx&W%c-u-T$ z+qg`o^#rx{%>kHJQigRpIR~t3(ReAuEwu>7REfrJw^ksgBNw$WU(z;2>e0bqPzm(< z_Gf|mTD`0S`&ykiO!qW;36&1vt_yfZ=&y_S^#eZ(`mgHcV%DRC$md^`Qdgz5F?79Z zh1}^_if>$dj0TJ8=#uA5YIlcwO=Yz8wf4ud9?r5NYxZMTV>R1c0ghleZY2WhwDv0K zvR3YtWpl8YzLH+8(MPy0wTH#(egbf;JT=bL+w-hZ?Vee8r3{r=f7{ekl{4&~C7pze zReQ*I@YZ*9uGLzryS0~Vt=`8ErJy#(_wn552F*!2_lecs=3_#AplXn&_*WBZUB)@;8V388m_NY2k?LEtc+b7~^AYLFlkzc>? zNf9>TGq*S%C&GvJjpmuYP)*@nVCUd<%n3aFBhi=;D-GM#vhyU`gzukED z=l}0N!OoT6WxF^2YQwE#xnR}ZbUii?y z(LB=^X4^DREwXZl$LHI=9;0&Gw@~WFeE#j5wUourHerDP6t{P{Wb1F>zsd3Yx4!X{ z_kWemE5FM&aPrx1V87~eCOfd&gUxKl@c6a6)Ii15wi`Hiz6ZjAJ%0-np<-WJ6!oW1 z&7K4~-S+iEuc=zQePc5Xou1pJZr%O%aSt3!EPuhGyC)$ognQAq@X)e5%5C3er>}p1 zxCb9@lOa|no^LOp-yJ}Ac+t;JsS+{Qz94u}xx^?%Rx(9CVb=x*&+tW5d?5q{fWgzX!wceYUx8vQb4rTOh!vwMU6QnS}A zhI%BdsRnMk!`Gi}HC1a5-wWNn1|s2Bbhw!T%Wf#Um)hoJ2%BWP*H0?kghkkd&)nNQ z;KGM1cdvh4dG`hs{0xV$XAp9`w@~WF92d&%a9y#%rQGiHEo-)?>!IfH`F8JL{qf)Z zh2Qf>|F8e$cYg1sOY-}NGS$^|IuYmCz3KELymddCOT2~a-}?Ay65-cBCwAJ6t+?6R ziblu#QwiE}W9z#Q-)i)?P?eF8W;mH1k8W%oPq)7H`YYGJ-e^R($TmfEl}JJ$M0buq z!tnoO6kU0|Se)!!z54X&(!Tyac+u-DM zHqnX)`&UO3+<(bpb~SFsSGTh2`&spUdHeVYI=!PK{7|*!@%$S><=MfZ?_5UnG}THm z;ef8TlB-G5phjcaL(UpPtV4M~47t z)I1(7uHJrl`>K1`Xf+QO2iePZ96WtDB_JP5bixyqrSq$4&rDQr@f@3H56TMY$b_)Gsx|~J{gamzA^py##Sq8MM=VcTFcF3=U}=o zL%Xq+c|r$Rxb-?qeEn#&7#<84Ls{-9k`cR-H0`8Xhgz)J&i&hONelV8zQ4co{&e<{ z{Yr^c8179^7dN(S8?AS+zXOyB68O4C5t3zm4II3FHGAOuxK5b_9PkCUTQt79Tps=* z&K~R^jiu4m2aEA!az}CwZbet!I2oyQDy(8wc>Ss!y{UEmYB0I$SKaItICu=t&2R)T z@(rNG_665HoCU}SvKXfB34>5I`i-q`9O{oQOJqX?x<_68$vv8aL`(;gV2h`FKN#&3 z9DXvI4UhL($+%^oJerLUD$7sD2cxP74l{RTc>YDMyWG?HW0a6?X@%wAj)PQQG^lxrX)`&1;_>4L=?qaTURU-7018J)MyV zZqb+wpN(euy&sHjemp#B$SSZgXQ!nZ>tho{XGw*l@qy-^oG+=fhi`xNV|l_57LRM1 z>+|F3!KmiBj!`R(4jzpf>kejBMT73Sfth`Kea1F0yGyT-Ko++9j&rw`FAa;+JMlIB zIy;?=b|fw5^x)vyd@-ATG}>{YAIw*S$2%?iv>^#jIZb!uPADw<0XaT*ATy(xE7dO( z&|tCCc4Y@cw#{rde72*}IqWO^pd1#0HZqqq?HU3fagrY_9^csNHaQ{(ZdbSslrLp9 zJ56<jAIKe1=e-pbzTpyw?#%c9kkwg{cD#l$?wmUWCZI$xRDSx z5&|;e=OZBmIJl7yl;POO2O`ON7FYPzi-k~F(XuU#Pt2p7<8_KAiS zmm~ozCbS1>%n@e=y@Dtp?FVt)(~Y1Yg2Wd>P$(>)N+{!Fn074CBu7C`swh;pa>uH9 z%#Wti#pB#`t#~4$l<} z>Vb{pHs2AhemIj_ykdM{117p@n6hjf=aRuf>Bz_wu@j-3Ofj3D9y^&$r81Sk_7LVK zuIl;{n8;<*!$YhFGf6L-f`Jl3J0bYdzV0YMRaez06hib)M#Vxgx+|8Aj)$y9BZz=D z+}}SvI%Ub6tPiPsCyL`Jjc!JL{)zss#W#w=0=~wBe954qP8$6%qPw(-CmZUJsMqYY z;z1{kqgzrs==WN!u9ha9R+>a{y9vGPwL4PQi~F5UTgs9_x8IYpUaQwi<3w7wo1Jbu z?Y1c$U`N{<^n$W}v)$?s`bj@%-EVe#y&S~O3i$AAO*N+uUeJ{5DZ)QngFufGw(+&){OHw6!D&y_P-8QRy%l8RhHQRCAYbCO#`tE^X z0qdCb2LpYNS?6%Y%{up4eQ7i3wE1M`-Ig|5#wargWvz42MEjOFJn-x62ds$M?(~vW zkr2e|_dvq5*-e3QpBI6`?UpWN39Ek?xwD#mB$T(Ewzx1s>su*w{hjH*^w-}1{g*Du zZ~0;dede(kF>fwrHWxFndY_lr6=LB=@KRRl9D)pUbuI`!9yyYx=S*V3DWu-FR7QJl7#v6}`K( zx}GtUDtS2~7k8XqPl|JDa2xA)Z8f;9pI3t;L3JE^C7hTtT{%|FvrT>~QKYO)zbR}4 zM0}g0I!$|Nhg7XeGimiWYC79`6Vr;*q|3RXHT&)D231=ePrZJ$A2s48{78F1dD7(a zv(;@4w2=E94utJavl~+ZZm7{6HG129Uc(bOpI|7Oc0#Tjxx*YTX5){q&~3ck;-7vn z-(C$`_?5s%1>Ha4#2fpkvnRvF>5R)6ZsqMwBG-b7QfI-h_%1j2vxR@#^I=%Aw-<$D zsT0Qq$8>E0U)0%dbXX2@yXlusB!$1^r}hG{F+TBEFjZJrUg}n}uPZHoV}|#<%ghxu z*S&fRyt(IH{q=7rOb=h;M9W?H4lm-XOdu*Jp1Drq3m;N9#5O}&e`1j=1yUEU+S-_b7yYcO!d;2 zyhyfueZ7W%wI##Cj0oq@?Iupqse8xWZ&_uhzR&FyY!td8)F$mg+g(* zKfNf?g8cVJy508d#45(XB7rq9W8Ja2!3qhCG1(FJ_p9a6lizB;{fmG5+JEz#B;kJ=Z#uZX?CKesl7S$u*^|Rv&4V%Db*O0M z(XuU^CmFs!e}7|1Ipf?LdYi6`u#3Y~ws1`3&DpA-*Irl|>#{UPYuQixj>cuXUzm?J z6mrn+JH|MB2=jq9u04p`i6gT9A&@;4W7@_kd5|FsCm$Ebji3?QimAz%>!#W!uC^=7 z=~z@+%PcQr*FKZ`EePdcQ}*O zY*V?Cp0%}oS?zPxrajQ`Oon@-$&IbMVtyI9&E)r_k~O&^yRoIa&Fx62RBrbL!lizc zi<>K=LujR~X4*}XR~^{x`xya!JZi_@rZ0+uPOLHlw#3B!NUfmizhZK3jDfq!c6ZS1 z54f!ExtCzWoUvr8`KjeP?1ZF}pLC68!{CzEWa#n&M(-dd#grZ)_s6YvU*{|gR2mJo z8-pm_PNT+Pd*HbxssDxI3!UEP46xgOUf?;V+XF8a=%tt_gE0!TWV?|F7-Mu}^09$# z>WdG<>sK*j1Ca8k@_yx)`@ixJKj3afe*bXEsErHK(XsfsY%W+f7c8IO1xp?cH#aOw z|Icy5Vp)^WRtEWhsrv=^@rRcP8Bp7ETPv)fp-iIY*4 zS5bvpv#8X}U8DNT)vugITdUdb59GcU3oE(I#ggY%G-!6Q^ueS{OS_$3TTGJ%ok0hc z3uS|(+iG`GE$ekrMswTS>$T#f--{-4(})%qdWQKCSISsWwcFh;j5C+UEzH-t32)&m zUk3d?&)PJg2G_=2xj}BV@dAv|3d^T%JV>=qI+CktOyty@s?&|>67_IGw=_@0C@$R| zV5v50v?=LhH-}R$bzQq<~W@+Bkc(-Q;dy)CKI$Kr`9A`bQj*oR4-4mN8Hi$-NImH6LqcAaJqzo9h z`rH6xa)xDAj6^5{N;@qq)|wa{_OPcjWf*|TeEV|8A*&+bm1*?4sX&`K4#dpQPR!1W zCc&b2WK6&!m5XOt8d-4pY{#FR!tGt9sVinlaeL3iL*>&hRnMNB7WmkiapgLD9rH$^)0sO5|+;{o}&w(seMr1r? z?lxsU-{0py5|QiGivE!z`C5I+BA!-1_jmsGul~mGxpYZ>|JjmI%7qn%;k%lcdUM(G z(p|P#Z*u2jYrp2ADa0VTF*mT6Eu0DF`-R@O6cMrZs)ZBDUC?IxBp-G_2KuGHZNc!D zlbH(_r<`@%uUubaJeKx4skc$`bme8gZCQCyfc1Rrl-5DG3(-}+EU`R3^Sgp>{;nVs zsLXYN>fC!>XVa9|psPrsW))QehxfiMlr>;(b5f!-0o|A>|w z%gkPMBzy{9DBDf}vHCW`;%}{r`M3YdM-Tt2AHQ@-e!p3Fnww-@yN{;3$7uUD$NI~2 ztlJ~{0^%$cI0I{yQREC(##yq*dKn`(isy~u**g??_C>VjwI(XhW!&*Risz+1)m&>1 zaP;feS;fTYpF8dV@Dtr=pz$HyS!D+D#nC|9bJ?*@VAG=%y_e<9D@+_jbofLVva8fa6@NSf~VjR-^5sb>-P8$0#W$<;_Md z_oLRj{??zly%XVmB3d4P)X@@m*%rE!t|`J%g|SoA!b~Hp=ky+{xg4Xye%D}w$d&SB!v<~GptE~5z9=@xVdRDl+OR=i7B;B%{=L5X* zm;PTerBA(6aNrA6UrCsouc9ON5{t-+=y_*W9I2;n51SVs#KEXq2AHD6m71c;m?ut! zB5~P_x`k{5JDQsTFBi!jJA2}SusOZc6fZsf>>}q$lHSIX;cPrSUgXMbZe|-`Ppjd) zJX-8O&Q;TNaB5lg>@F*De~`s-(}X`930(RlJ~=fUuJevJTqCR+y?on;&+qy6#W zc;7_#(;6CLZa5h~I^NNMBG)FP1;#5>C076u>m)(sQ*s993ufa54^2S8$*i&1yJq@1 z-hVuu*^Wdj=Ka#^RbxnaGo$ME&5+V*w+ zGPoK~mf!x*fAhB@SWEdWd$QP5T@t3?e7nivvdQ71xal_VXO+VxkA@r8a>H7FSy;O%b)mDfBfyI|JG0a&VPOR(k1!* z>9PUabVB&)4Oh8QS$=*hOOJvZj&j3Mepxt5r>ra)nkh%wZgvMmIxn-EawFb-l~&W3nT9#F-V)`O>bj~7>nl8YFDyWzO-_e%Br*2ohr9`x z#aVkZagDUe>ckaPOz4A0F3PbmKcksy7=sDe{c)s=}xT9Dd;+lwOsD#x)BS~?`!cj6SsMzTky9|gv2dNiF z&IiOAKg7Rr`O(||^KV@F$^V#aZ}MAa{7j&|4deInFn(X$aF2q8hWGmlM|u=rW`Y2C zQsBJ{xkpIwE|j!5UfT2zgD!a0RYp6A@BO4KrKA&pIMxmU`KHBD_R_ zb4<2-lYcvNw>S&CUF03B1LvI6iS>(^3eH??3))Di7=PPs`2@-KJs9{KlPK~r3rLv4 zO-kFHWU8%9Q*pTId*^wht!#C0VCisj8RC&+_Jg;FeOVdcCBj^l5Lz3|btw?nNMdMR zz_HKqQBEbGX=__T+3?|q>Ish1lok>i#}!KS(^x7>kPRp7cC~(+sIskX0yo)kH>Q+t z4f>I!Gc=+niT|Wd=7@q}2vyI=ES2K|I}^EiDg^F#0sQ5!4LReiiYgtme)lgvdi(GH zgMY5^z2A4~lKlRWl6v2UQ-3@@7;Qwoji{$IKIc+S$p@h!bg{!7)G>VqmUX%?xmz%*S6DG5plSA9PK&hJ_*GU|9PoE zBH=H8`O!aWKEc*Vet)JUkUSofcXsw{BaFN}!iW_tE+9nK1^Gw@IJmJmQqFCYjUlJG z|AGd^!nmL}XqB!3)!>Nm&O}=-Cxg?}n<*I^I&B|3$%~=cb=(UO%?e58xZ?E`AYkFv zxsY0!ysdauWu*~!{OLQsLIy`)(qynCOYSF*i?=CZ`?y`UoswgDO4#Q$4l3ol6&Jt# z;mOYGtgq*fRjQ0(923V&xHXcdz_7X8ubqf}NrZh(JU>X{4FN zyF2EU%gVEr5@`KDzxC+t|NejfcYpMQpCo}6zhxVt@zKe2wh3qY5+%?2V%Z4E&YT|a z8Z_M98-Das7z#NL=WNT1wwO!TK`-_0$Js*+W{3!wNcsjxT>Zn1wm8SvZM4OoiMH6I zpTc{7G$o~dW3{85Xe^gyr(K83do-Eu4N1dlf@Ew=mO%eyvfUR+NiAvuwMD_S+UtKS ztwC(`i)WKjF80OqhRrx4>GlccF?)N9JWl~?qlbg z_a2M|>SRgXnJi}4_9oN)j~XYl=_4YRNbb}f;&(hPhxCwaA2RmF{PFm3vE#m4D1@Ot zo<1Hgs7A;Tzg+v1@rg-i#>{^>noX}AjOQmLLf#o4OQ+YS+&>>qrcZaCjOXLM$>^H? z9Z$xKXTB&?T#o^g0rBv3F}-#){(I!<-IQhHxTyP;msNp|yF@qblY<3CdK-5O{O(CLg@Z+_*Y1hk4Ikr< zr0$Z8UgYoMdx9rbTfcWnL=`vVwq#|K6kq*rU$VBP-B!}!mPtO4{3<0KSxX!{(7X3Y zWJVWh(rIflwKQ&P7Ok|^9gqNx1XpoPA~inX(jhs#27U4KAhse-9%KhgTWPZE_S`1hGWpsP$6)eTUB}e*li8C`;f0O%ktGoXSg5q)N>Z#$@^4=_I`r z7Z%1QdB*tDLdNWA0SVQl0F%FtrXnMrmZYB}Y-B>xJDPM719EKt^t%870JjtMis9wN z!plGLnO3&TX| zk?HA@l}8zqnT?Ef)IlqzsqO#{`SY}7AZhJFa3mzzlZO6+Dp|>?Jwj!z zCS5vIvX*n2xvxb+J(I+bOm)1O>2@)+izQEf>wt@X3jTB$) zplx+l)%Hpoak65hIy|W@`ZN_%bGU_RNoO#S%z*-xb{iaEp>d)k0j2btwCOh` zxD{C@!6TGIZBUWAB&LKa=?C^1n1*$&={M#_O3?Ur0J=PjW7?2dKOx!Gc z_i-;3JDQLwuk*RIC5E& z!jQvA#ie)$*(GAF-`;tB`ZiaHTT25dyuifnl~HE%(N-&~)T#VRu@W-NzSLPjhc|pR z>2p47GetJpI}w)JEz&Lz;H&W(!SJfbHGF3~B^7jP|IdS8f|F0Tkz3MjGCoge1(!v( z9{5c7H{mgnB*-x;yexmTude-n3cK3r5a1LeGB#QZ`Dq}Z=~jdiZ3{Om3^raU-oz{0 zpwnaSGBK=buw|YM7pF5qn3iIo<}U?vjG6i3C~;;x>Q@Oiwc+SOrBZIA(>XY>iW{R> zvymwDMr|j4>2x~moTG>=_IR$7cmlxXMZL6xWP(0K{0Lhl zl}B`wirkLJQr1G8k+?a0R++DxBKxRD0A&P98qpS!ISUa_JSsFJdq3{PXlF#qAE5RS z$&k0UCH;Hc=_l+p)Cb&}@x2`ASQ*A%%#=haRd5sgcBS zS5nOLH))H!NlQj9B_u^B1)0=E@{>lSXUDl;#j>=Yh+?MG?sxh+{W-fFjLH%Ltpuv{v7Mmu0Hz1k?>oN8#B?`6S&VBBmW&*bsRKOiGF{u;}-xhKx-Y zyb=+Y3^9z0hY88y(RA?%*}AV1Bf2eeuS*e2XY^r%ek*CIk_eqpw@*thBbj|iTS6JE zW-aaa21LO5O$ zSELo{t$sgIliajB0NfQtsw5D&#R+u!zMi0V+b2Rf4unoKD| zJ(KE=X~R%!LlWJInr8siBpnbts}D5TjUCE51N2t}JeQZURD=U!2ZFyi9BrqV9rxH$ z1MoytDFZ3tNh^&h!zCEZ<=7+9P&*xfxs;)!>=0atGC+#TF_ICnpfVE5T76NC!CazW zWnH8!1!Ea8L+Z7e10$gxy>uvQOKu~5L!X4(>;zTvusM3FOV!N*0D&4C0nC-XfnAND zHCsdUv${2;D3zU|7%AhI%_;i=V>c@4#t@~G>ls8b|hn3|o-jpeEZv zsZhQE-Id)81_Rw@Q1unN!Qimj4N|7tL0>7`L6{R%K}IQS_k$oZ)l^5O+ks|gKgcGM z-2mk-7s+<8yFu4R_JZ3Az=3pyPFnGTMm48W&mJZ%XVtJ_JLLK+Hjd(Jh7fxh*^YPM zlX35sixgDrVs^)me8CP+jso#8!Vg?n>5h49{l#M*83x<$p7r4M8kn`g1ZXxxS=i@z6Pg)X^dufz!3SL>zG#$#5Pd-PWe2zXg*){ zvDLPKzl!ShAN)r@|0jM4wX6Krt6r0h>UE=f{oGZriiI21>qhlDvgQ|=y2C3)F4~LZ zVpOj-zir?GA-Y$D1!SzUS{BV|+=WBMxYLE(@$=g#UcXHF%&UA-)Ea4Stgjl@{IOE2 zx>3At6t7&hZ6u(L1T@67v9UMY|42eR9Utrr_xDeaPO*P<>B=^W*Nx&;EPXbL*Nx(J zqj=pYUQLeAof^NpWG5ivqzg8 zOfOL=O>vzJgC3tFrP6t#ae6O$Vn2$1_>C=>ami!gMoGH~dhWf0y<+pC&1JJpP;7*A zM=EF&^c>&7)cGF!;cC=#$(u|RE+049vsNf+`^0F%t*aaqHPg~=qMp}>+?06f%Yt^Q zc2g^j4&Y)PImQz+R`RN857qE_ak zCvKuvx-gWRsFjPIwo?*IqU7OhMl4W`ifUEIU&QpuYG_MTMhSXI)DMCav?Pur&eEJZ zIP~IM+~4M^5U*tQ;g&BZ5}t&$lt6olRuu1XQ;8z=B^S?Q_0q+?SfeA@KDNc(dfUIj ze3pPBYIoBY;~V~mCpC@ufOj>H)E#lh<}wq9Y{FpTbjU#Yxr>Zp$h3Yo1YF5sn|C?l?mvk-jGn~L z+z@Zyo-)Ek`HJR?MuSR)gvvR>|77@3TEcL+8A@beGY4i)Zvudj(wdm*T^H>s6OhhI zX@$OeDl61>LuohR*f-(WU((QBP#waz42X|K@FB?;E8)QpO z-B~G;s@^wLXhVfIROqFoLWJIg-)Rwd2i~hKe37t11Ie4fSC}OI-VqU3zDV6v!fVQB z338=03WC*>pj(&4$vvl$3^`h-i*P zi|xG^wS@ne$;PeP-3gM=@pf%(!XAl+u4L_H)4Dw(lKVCI-4 z93-46QT>g9IZkXlYVEzmj{9XdFt3v<&Xq;}8>;o#cMO?HI@WSuMdv3>+urG75tcoV ziI@+W7ivr}xFYqB{167NnTV-?SjECYVNF1$A4x<-;&sw`aRoeD6GvTu4OWk<2-+TyoWrmd8BplC+3yRwRth_u3~Bjda_M6Ouxai6a|L zQNK>cE2sAHwCa3}n^}Y#KP+pvNx)eW zQki8VUlqx(Nl(_6+*boEk0sYQX%k7zLVlEd8F{=}s}ATuUN1ore14=`>8re0iAxuG z5sRfaB9*N6zw+aM;p@$xz?+lbpDD50)04$`dOY87+Z%5CbK|xH9NaM68;1MK;?cR3 z;U?K!t4GE{m-8*7@#@i;b~-V(&_!;1!*FjH?o7_C^XRk;x7f>DtE|Pd3I6eUx5P~z z;|s`Ryf=C>nm9>AeNZN2{(Kp|{6xKLTr9ksxed$UGdVpTjUPQ;ki^N-CGt5rk94S( z=bD}M%?1HY3QI3RzJQFDUr_{X#1_RI3OYQiKtUIs78D$8P;ciOMpE6N-Wg*0hqSK| zHyq#Pkk4sNDv-~~=%Oa=)C<|S+JF83{YkF3*dTpUv?)i*R z?aX0%?X=x+Y8-1L`(?iV;9{%Oi(B}^68NOu>uR7DJkt`nscM=Ja=De_uhvPqx!^Nl zR0i#sdlU14TMqIbr8tjC$d>`vR;f6q=?AIa!~VFF=$)5-lFP7uLK2EzpN9IWkFQ9x z(~i4wSA5ubRfqetX51pUblMg}C0?KQ23(h!mZX?>A1hyBU*94hy&Dp3Wsu#0T*0}q z%c#sO)FRr=lbahmcWG~+(9JGwp3hyyU8m{adM5Hme)jFgPhGxrNq+yCG7~vDo$v0A zA8k0v4JY}zagxWQr-FYQPIALZzIaaZV)E24y{6$XNcw&JrpxiYgr$r*%KC(kDDs;b zOW7zjw9jZ>`|N1=Fx5}giz~ucoys%gOxIvSO|(IcJZN!O9l<)z%td0Ms11x5 zw&(|Cl3LrH$XLWQI+3-2L9EgrF=sJ0F|GyvzNT_e;64h=RWx}?`@Pamx&Zs6lGV!} z_zxbvee3`H&d>Z~@KN&nhpTz1`O$DP*>F=Y4>x7iz4qGODSPeLC*#r6H-y$<4;Ep_ zWs5}$gyAt7<8wql_r4LODCYCWqsig!Bm7TJ=DRt*>R@y@&!~ocYda#~yYq3Vvxr;lc`%7?>=hhJ@1_HcI>2ZN*p1Y5&lSKP|Nhr5F{;~ri>-0t;` z{tFH}y@E>+r)E~BmJv}_VqI>eu}+xoRm_P(X$AkZJV^G@XfZq(E{56ub0s~Mj-u!~ zly&F+?YCYxRif+r`#bMXXCK+Gcoay5;okI=D|g#QQ?MTF?+9lwT)eKSRm6YlwU3V` z*RN&|d>_{-6Mu1EV7r}-=F`*JKK$Y1#o}b=>eZ9e*`zt0J)#r-!-j!IS060KlgS;) z-(m@jyq}Rvr{l$BWGqdz=&BvPnawhf5XbR2be|0OMw1&`cZH#i+`jW0UkTt52y$af zH>TUX?8w|ktz?+6wuN4_nrT-UB|Ef?QG#Kn8~KiDwd1^^Xbt{J6nu@@>14En0SM^p z0+QxpIV%;|@lhDO8GxNa6!CHbqY&e%)iz_qWZ1G$o^^6XE+tLdF<@|J0S^`M{!3XV zW>*(Vz-gh}S#lMxyb|y9*Z-48Z~vK}`v3mQJHPMJCHXBo=go&3=e%T-{)Mx=X*RRp z%AP$E1#C3qoKKA2{5*`8N8=jCX>Yjy(do%X8O4FJnk1JwNdp;!>d4btX7st(IH&iDWIlAM)pxfVg=T$S1t2jM?|9_ zCD{hox9v8rbmR_^D5Dyhlro;m?J$pcKw!X_09!Pd$X#7i+K+fdk`F4%2W^esQBsP~ zP>M}+4JXL|ei$85u_1nzi3S*?UP9?R^h*>~30BYl`g|jR7j=nx)zZOA=+lNov6mjC zv3xERHY9w0p_EWyUD1vbpuJxWq;>idZV z@|TeO8qmvxfaQXl5p_v^LT8MmHAu)MhEpm&h@C-C*T>GG-9!v(r`*D$h8Y3sezT1m zN@pO;D5_kqv2~~DQduM88?vBf5_?~NoU~E-cPORGev||di4M~J?VtMTzxcIFm*n@S zOUm2%XgJ${yiwe~Jc?VZgoW8MszEPkd~PC$N5RcaxN4r3>4P@Hhbq-PQ~w1MKGG&O zT4b0k3Q*RjvX>^kLFwTORbdzO^{7An&JWaJ>!@%ySKwA?vQmIk%_0IkN-*iOYhI~a z#Y}F{@5H3~!Gc1sh|^bX{WTP*;RSSsUiOSVIPJDksFHdJ|5a8RJt?IG5DC9vpwK75?zG( z5YdOW@=7dJ)tr(}VB;uBVrIchxll_btALbY28p?)HkAx|JvEd}y8|-hiM1t`nDBvo zN(fycqXRmfPG9=N3Z_q)8hiE$ePYVm@T1sl@{~Kf7S^FaENOK>8W~-icqo1PYfJVg zf~YX2LE1IUaxd=nDCiK6h%g&;5W_u-1i`Ykdom~1h#(v-xaMY@47!OLgvOnoOr1G( znTf7nx7!0l;geZ-%XoKsT^5{%(5+raSmPFPQBrNzZ*^rw1j1ri3O*#%VDbqzK4gVq z#;tC*C3X6|ge(hkU5WOkjo<^hp9ho2uV!KQq16dXwd(uW~q#C;!yl07c z5euq22m!M{5Ym9*@t~~)sW;$qxW^KSUQnRT1-L1KFv)ggg1V%{ldo{tub@$sWgXqwGk)8}~C6d>V7)Z2)9 zFW%@mGZ%WUd!`--f^%B(lBXD1;U*VzoK;>mnN)f0#FZs9tLer;qtG+-L_ma?nC3 zqCN2*xiFA2`spCl$h$jOR}wUG0)H37(zb;?C+_4Rk-T#~eBasxFO+;KgF&3~Cd%+} zhyjaCL1YFvabytWK`w15lEATYIRiJ_1qiT++!Uz1-9uDn&OikQ-v}#Ggs8|nQyeQ8 zuP~|o1S!P~DeOUROORg>uHc=8=@tgP4G?6;3_68@70I!Oa4zh($m@u|0(-_%oSe}B z5XiQJ1R)%MU!<6JN4Rd9O740Dc*ezd6`2x10+Vh4)k+d8WeTWFdc7_ShQQ9?kUFG0 zIA+lk7?C1Q6)p^laE~1oW{|V`u+a>U`5+teTEQh1V&JD??HO2?4>0Hqq|ZVq_bnwN ziU?xC!?)-`EZbaTdJ{bXoH}I)VTrkELefoC-a!OHu#@&O5|!)yNCZwYH-Tq1GxR#C zLJ6G+@&QfT{WL}rvsW}lyNj6LM!AI9}u{Wpr^>AgW%3hC31seGI7LN70*;Ma|lJb??JLnvp}dZ zBm>X@>_gy@G8|9k!mTd~4Fqk5haUu>W*ym$q6J{VgZ(12bQ>n_s!Ikalx;Ve3!9al zm2FFTHNq{*i);g1H1*(5(J%?65WPWyDum6*K-pV)nWe7BLq=&AVRI6X*5ie7RnDt=VZnev`?={l~!?c3TdPxuxN-B$cX!p z1cXm$SB%(+Njx`%`UDA5i%}tIu-clch^x|;8M)d^`gN5%AmAF+ZP#J#OjdOkpP-nN zR6QHBL{2T;L$?0FqqqOtzxCUH?=SolmoCX~SwKZ=I)A)B+=O;{i3HU1STfq%%NOlJ zG8^Ty7L>2uzB*nc<(-XWgC-7M2_0AEO%_j6xz8v*{Gz*$WKOWoCLwLO# z9$81uTj%Dn#(BhCWcdS0d#W(nD^y$4n6T(UWA(4jFU58$vXJ#%`3iZeysq9c>a=36 z8}VZK^17@T`^>g;qVp~*8w<^ih35W8;xcu7u!9lZ>Cve;j@vWMIvh0+FuF+P;z+LY zkhPWMRvKy3+CU;-@VSLCp)bVRk&8FJ8>en=rtGJN+?s1`L=t|;k)Yp1TOt;qv_tCP zT9Qxj=19KUxfokwb!qZw@Q9l(1aqmK1=d-8iDanO8g5P2&~WYz4!uj;_0S`1W9y9T zA5LrM@o;--Y@Kx{k!e^>c12@{)~QYGDs*L%=_O%fu*bOa$7Z;V`VJdklxBK&-k?)`e%U}h^FOwo6!SkxBw}i!G%%fXX-HKu zBIeqczU5;}BF*y|W8=0IiHWc%Lu8Di0pSl<=%g+|(S!06+h|Fm>_&^?NQ_>z4{e8f zqNR4uJW0_Epo64S`J}H%c?D`pex=}+{zV-ln#}=bWZWt9`mlR>T^EyVHTLecQ8M&s z)`65HX%8WufMo4<%!RpF001Pc(YCP?=%J}YIcUC2WQi1vi~ z+6Ssc{nEpqMqdL&rA20BSY<$7JB+xX()w;GxI@pKm2tz)+VKNM)ORCEOAfm-TUr;_vxQ~o!A)iTlVqfc$sbttTzVMpPP@T zL%_|QyAqU*d9|2Od$IY;Zoz%pJjaB;@EnMJj6&P6nQ~(%w`5(p$mD7aBUm^wq&T_9 z!=MzN3!6slvAHqA9Fl7~0=Ei3oWyX=a*M=ea%%5?F$v|4liNsc1-smp-ine=6U$R{ zv#_h!mvU_!OIw(`RIicYqC4143d@VxcbjW!KO8RDq;rfk>9Qpjy={ztu>j}#5j#e% z9Wl1$9ukREMrO;rlN*{ajSYekW^w=3+!Pt^uFCH%$9R=4lf>Hb-+B6X|HuD<9DMRy zc4~V{(7%mS+a|8Y@#kmjDA_91+IGWqZJ4evi=pGv=&qbgxI4$y7lK$sU@!fI5ww&4upJQgc8Ho|g<71eeFwGrGoc1i2IwkdVwcBw+Cyd*7vS0Sk> zB3Yc_m#|=KZznx5p0fc4NE(cKQO)6CnZ$k#B^RbkVgV-C*W$*Jm84>vBl>i#&2ZpQ zXCb_AL`NoeTxnOL6!2+)eULb;=_eeeqzvmA;sdB-3Y-`oI$9B@988W(%>hP`T8M!d znWwc7=d7NZLt;K<9LP}7@nYVF-65(^OsDV_!%9zz#PLfF)bJC-w2dNhs8fSF%o1^v z5(~E;m-gCudjKEC%>iyM-LCcbv1QUwtuN^UGq8?2&k*PUmpREun)PXGn;vQ=cfm^I+%&^Cb2Rjw}iOWi4hx&FH0mg zUpNzqHWCXq@$=EL9(=D^UJU)v&B{nHG8N|}%p==OUuOpvV3b8C%)gUrJ_ii^27o|K z5-}meKaV*haKg1?Fp1qCY&+(f`bpde^~GqJWpgkDIBs0t;GMA)6+22kfnj*d2?W&t ziNBbN%2#3DWnh32Cn@LfTbHwdNN&hBmpv{9+Sn`Q2I;yERwDfesC({u&QD_%s_Ni+XgXYrHyx`D7D4V z6ND0vQN@{*8OU7m(#w@#M5@-D@-P-tUS^rJaD1actY5idFi5M`nqs4esiMpq^EN^7 zE?Z5ZFSu{(h~sJ2O7{m?0G$vsQud^dfOYSJTccfK*pJ+uVz=c+<0min_E6|8Ywo-zZt~haG28tekV?LQvQ@Q}Q*b-Fmj4D2fQFZ%RruUx*qH$8a9cl{&Z=liqq$s&@7 zuY>~_eZ08(gW;2*Dcy?Zv;7-e&E{3}eSY=PWV$z;G=DJPq7PHZAlB_=GI})Je|Fy1 zdyjTef}Hc!G(J2mHU=yL#rNL+(H|onsu$ayWuz2OwYdpC-9Ui_mu-)8Gt1^=y3dZF-z&$blSxqDR0L$>Csk&^e_vRL`l z4z#%bL6sar)l`27)LoaQ#WZ~rBR#qznEmw5@xkb0-B#}N^~k;Nnk{hKExYXv5?-E+7E%E9y%A-j93PlT zU)JZ0HO@T_CQ+!Dle(Yc0U8x$&rqvRU zwNR5KJ?lJWbp%oKi)WTfp0SKIZ}iQtMTT(kwq>u&t#ZXHbI5Rfv%Oa#RsUXnyz;$TtN7k~dp{WMFPa~Xp3Uv~Rl*-_H-FWg1?KRoTy8n2ZHL48 zeEjJ6$|s=wvelozdX53vJ+xv(w$@pOO-Q2nmDzy!5n@6Y61bnpIL?I|Ba_$XRfx`ES>=o~{XBq;*2#W0>Uc z;F$Q``*(|noNMr*vfXU(aDGBtgs#s&8lUV=ge!#rX-=Hz=YGy2&cp1uu#A(Oi3k=a z!`Ud3#1NKS3;9=J(5%G?hXc3>FV9Hk+YyqGlUn4hC$wf1NVQn{$QeV;xj7U)T-FD^ zjLdM1G8sECd&Hh)NwOosfe#F7WzdJQ6tLLyz|{%YBdu+PMzPf`Y=*d6Kb)~1j z^pfWeD4BoYI{&blF$*CPm(D-%-G11743@|u`^E>hjP zlgSXJh5_r`te)Y4$y*jpk4J1~*`lh4Akomt6pe@zgrCCe9INV_Y=A_YLd^9rDzVajzO-(4ZC-UWrthd8) zP9&?o5DEWPKk2#XT*&0KE9VolitVD$PLGde6>5 z`1EKGNel+$SQMDE$Z8->kHRlZPgFnVo*zB4EroE*Mx$5hU*0wv&c`GfgX8$Y>3pFB zIes(}UD1&YOp_mKM~Vw$Wi(W|=hRX<;hV=K(V!bx!#OWUd{@F|*y-qCiiVaN(TUXp z+ivN9Ulozt(VcICX?r74P$6TQ);xY|%;ueb%uwmG8NC7fb4M7UZ=#!@$#~^8sFa8E zXUF?qDQOj-Ih;ftCCvQvL>68|KIjf;pgQ9x!$}DbWJ~4u!Rv(cUDMOf8n}6P9@bzCKTCnIxxWeJxb*2)uH-Fn0i-|2?ZTNwTB?ZNCFo7oMxK zqWQ;xCSgUzoM6AI*H9Q=v#vQbR}4Zc%~$p4gwwDyhpf0za~XO(SM*CnbM+8MO78n+D8C6!vCVh+?^A7(Xeg}Nc6eN_ch>HW5< zKFoA-h5ihL165k#xrMDcQUIpIX%%B+Lpc?1C6pX@=63+lzLTkX{kPQ;nCt|pzOK|H zJA?X;?JS{C@XUx&A@az+2`gA(Wmy$-3@)o-1%|LnfTWin3iU83DymXmf9GI366rv{ zxQXasxd2n4D*wck$vLf>)o=n@w2gjSB$<3GQy1|FX3g;Cjjn_hm?P zFdKVBxHH+@zHz)=`NY;`45m@=;`&DRzGTN=2?VVyMOMyQ&O)Tx>^=y5UD7L1;grx` z3uV%pz9?~Whl1YLq1kCfK+HQHV5)RGlb zO9L!k0(wg&1^VeZr$)PromyHkHM@HDPmbklGz@jNt)zT^2UhXngx2cb-bnbKQaf= z3|gIvGK&7_5qq0E+1ZnQ{LC$z+h(0PA{bV5QCqTC)MN0^NxIe315hCcibNK8A71oN} zn-mii1F9B1kY3Fl>U=SrA)BEJkPAOG_F&qU5Xg&~n8t|F3idU_g9Fz-6Kbeq$8}2u zt`MzsEVi!|^owqG)i`E!0O>M&@{T#*tau`4D7Ey+(@*a4_`u?QZcmsq&pgRb=f1{f ztDla%$i#2Eb9^|pldF;It(4hZV|J#?{Oq#Vqi{e?DfDXet%>L$2sj+nYNmvXb& zETlY7W$2J2ga&SF0_gT=4FHh_7buniv<3p0riEE&{WaOx9Z34 z4jQ>OL2KynFxVfShz3WICy>PfX}q$Mbn$h%v-(^2f-@mH7baYtEvIS4l~!=A|CUp; z;>+JrqMLa!+457L?Wn_J!^R)bf_`fgz!0_fj(d zAOu!$o1xD#u!@yZxw`JXqRQNA#Y>EX7gE>X33hDDcY^G;a1stCj_X-t#VZdmftO=k z6nYAL{Uoox))zg2YND4OS`moie(sK^F zS%>+#>x|XTOkO5-eag&m4&+8{;I)#;G}Y{Ww{1i>hpg`;5!HSf<=t1*B5oBe&0u+d z8Ha1CdFp9#Fb~vqSxdK7rpFIX=O<_;s$~SbaMZS!d}_)f#6XeZ)5|5{v}}N`*D3{U zogUkI)vx6aQ>@rUXN#~nGk@=o<|ml4IBsDweRPEotXfg7sxto%BvwQFq>8O!`N^ka zjGtXu(<)&+cQE8OkfiPtZuz!$gz>p-Z+g{uT)2Uzd1}n?FJBI90QR*pjP@=UTF!>w z^&-=7!x!@)OPWi~WkWPOxn|a-BZU=OzhGQDQP9$C>zc_}?5doIeO5Oa zfrZsvyXJC$JA8E`FyFyjw+!&hA-HPmH@$J2St>(xt6^Fg$I3pJLc8$ZirrlUOrz(2 zF~Bf=+qJM41l6#}kD?wFrruIWbLfO7XwZbbDk$yE=4k}E$mRC2A|ATAaxxmQ%d1){6_*$~tKTl6l@ z4XPe87VcU*08ChXX1Iin-3TrgEa4lfpi%&dZam?c+-U0I;j0F~@MUL)gm39ye6e8g z-PghZOB#b2_?^zD*duYsyRpbKQ_6wukN)P7?Tp7IiYTzTrkQ z_tZa!d+Pss_ecKm|M1$SOY&>oQ`NB*G}ySOhVH58QPyxzwPsfjGXWgtj{mV3tfG=pj<3=#SYnf z7;71;?k!>6`27PlxA4>Qbhy%T%{y?G947^{tR3A_(=~;+5UbEvG`flB`h$nxed{ej z4jI{GIA6SMFqR{@FABuL$-L6v+y{(bv1RxB-$U-vR6g(RqZpBHOSp?_|~B@ zI>$RhF6#-hKJ3X`P$QT7_=K$Cs6NHT)bnItXpdFPK(q9_+0dWQjnxpmz{x^UQ1^d? zk+7IttJ#A0TGBFat^kD-G-5=qooVElEBCO7;kqMTs|?|NZ|@l+4c*8&ln-2&%oUw` z({kj0c=L?_^Zjeq#QlfEJ%ji%;$?_W#T?d~i-~%?xAkj~-Zm_RWVk zmE6&r6+7gFxS?kX@Z*ayUd~FPBwhinqwu8vA#qzCKoqCPT1RA(r(-ql%Se@dk1hY8 z&;+K7<&gJpNuU5XG8)~)tMORw*dgBsSAgZ5tIEZdLi<-8ag%}B&71qgKDdX)|LuG4 zz6r^H_#I34A2|2`x(C4K-h2Ml6|*yNVRo|kxnWum&VzYr++_y* zGdC@*NU$4&kGa)Z&#BG9sdQ|t=h!A>U77g2Z=3X*U2z3|Z1MoiK|HJV36d(8FIyQc z=Uo(1BRW9{5(hZvBo;Pvws|(@lRhePXcR7$5_A34xT#5TX)1nSu>isn$n$fqdGJJtEl58ha6$5sF=GHSXDVxm9JUX5ae}6`@DWmR+pTKhiqCFrcOL` z2D3gwP!xHx;kKj537n~+q^oRUPDkaqT#q7)Ozb#Yn1zB^61*yqFEY$=jH6?zODn=a z+%v=96_+8bV3>xbeE>`ZuVtOAaPp~IBH(MJ7!}t7F-DDm-1xJ#@u!$wB>N{vOR8=A zof9-Iyz1-QV!e%l&b!`v_VyJ+$V7L8O)WYLnBu3qTd%pQ_i-MX9^Ijyth}psaMO8_ z$mwnUu{}zd4Gs+`vF3&C54NI7@Z7i#z!6sYl6#G}2rmt!GVI*GGoIMbxy$K1*r0j&)9oVz6c1fP=8FKfrFNsrU`=zS z_-3P3LAq4QBAkJ@dsPwSrB(&NyLK}|4yk*=M%VcS zZF|QbgGZiB>&_J#EgPtY`q*<4Rf+4)Rt!~AnGHSE_@V55!52rS8KMx)+iyP9`-NQ* zf_Ha!-#C3l9BIO-CwzJT;aj_?4|czQ@4LIV?;$nszH{%F?%ch5Q}9Z>y+k;w@*>FnZ8LZt<;`uO=dR0_hfYcIxGQn}*G1)fi7LV@RdPFhQsWgk9E?;gsTX35xDTw^OatkR3> z93@M9w{!@TkuPLM&uF1%$=73k0x>i&*^^4MKR$9q8`de$>Ak5`jwr!zS*-5RuN2ON!K}*9( z?V_&|TyqrKG!~cF`)6>|%+TAmx9+dZN154*vs2&7(3}M6Y-7vj(;MH)yt82D2w8H} z*!WiJZGX-g!(pWJ0x{pg%#Cm5$e*a*TF1zqR`96CFJqtM9AE0eYwA_fGq)C|iaWo& zcGz5HXE%7>O(*)r&LK=m*9-l_hfX4U6rd)*FF1M1_sr2xMJqm&EB# z*7k-D-{7#u9B*Y*-T0e|zS_XWp;HN4HvXm=NOb3H{7qj5vL*@Nc_4l<+>D+e6vz!f)IJSPT6?cqVt_}zLi^~&=Nvw$ADtWqS zZt~swSpo3O$^W)V4;lDeTS`Xrz@4Hy2v=FWuz z+*yo{u58&1WNx^)>3p4)k#xQWzNOjx!h?J73R#+uay@=f>ghuTZ*DXc?*%yh?#U;yLF_!*)Fuw z&FY(d5DRs;0UTKnwP$!N`yjs#Sw=b{8B`qz()02rVv|nyy5dq>mh1!fN^?vwiELzv zRpu9~I#w~Onby?wY+qKjov&Kqvl$4#8T%uc#J9XVXIPUBu61OiI~yj8ezWQ{Zg{z1 zWw#`Yn@Q_#c0ollw+yG$D8rfmnO!DirLY1o0g6MLqe(`ofLyt!tdA!Mq>6g}23mSUS5{LaovouN zK_U;+8<%eC)GmVx&A2m5WPM^PJ7zkc%H#iU?@PesII1*Dmamp=d?0RiNtKVWv8r3$ zEz6?S5+GT&Maidxyk22ys;jEI%c`y_>QJj~fo*(%Pkf8P#xrKXfLU`G7#Iv6*LYcO z%rV%&z$_R(?|M0h!v{0$|6W97Mr1}-W>r>69zNO*byrrr|GkKK@5Pxf)OW13-g~(Q zolsM;bKokEp=+MoC6%G^g1oaWx|TK=VVWV1tQy5G8i8c(P(>sS5AQr2!*HwA1TUdqtnYT=seQ{mk@Uz-m%-gxh@N0 zM{sau9zk(-)4J5lnf54?+_LPC$PQI6uC|286>h^OrW{r3`$2MPkxsq7vVwE5;`7#p zdI^z=x2uuC1<}EBs99uJ4u$i^s9qoL@2TA`e6L4LkxsgTYT-cyUsES*!r}XLXNyHu zAkmMU2V)i&mCr5C4C}Octv9G z4qxQSswzr}8%s`Ef6^2&6jI@3ItbaJ&O3_w42p##Y8wSn5pmoHq)mEs98-17>|{{> zyc(veN;nKs4%bt4`2wii+TS$zI6H|B5y&?yHWhbgq1pk0g|&=vNo^x+pKqg>cga5Yf!!C8b^MEB^mc9 z1mk!^Eaaumdb`Z&z4EMlo)>ZkS!oJQGe{qtHe?Inx%;NncZGtwx#YO5B;QHU1aq?( zx7njO9SUPaRp=;ykuzKfBU=}O$fF6op{~n;3ZXjHzYb@v=jxs}*PqTi(6SPrGe%0m zxolF%SL$|@7MgMxZ`TR^QfImA-BydB*ok3?*$HY~RB}W0`&TVzPGWX=3 zO(Ls&xl*;Z=IH#wh+dYI)Gm(r-nD5vxnCDOzv|DAKBKfNoEv`~%8b8_&r7T&hBFH; zi5tx%zV@>dX67$eh?P;5T9(zhS&~~IgrJe0Eu7UT_s=tKwQi3KlK5u>W6tB`lho~Jb`gzQa~8sh>Umiag&VX|^z^VBj$^%Y z1YvI+$9v@n!tOct!mL|9Qd_%ZC8?}s!qIA1N8wxdbyP-ImhkwD*5H9&bE(jb$zm+3 zFeVthz{NMkZVQFsw}w+xQY&*%n{(1D;3F)HGEoM7f5+Y3*-)z@u3~F*X(nG-kf%aq z=#+3l&i1>b0+pdeNR^4enxD8nipfO5D6-3^axEjxk8BKotT{oWm0Yx>nJCsyLZt z+JkDUAvCK%&{~Qt#}h^R0l`jMODv9ImNf*X9*)OXB$D&Ini{APf##~@cLrybKfqZYHl@ppa62m>SE(S< zZR_}p$%ZDVN5yZ|dxYnfbxZ{E&uAKDrK5@sn@W7TF`aHKKHa!ZH_mk2{*k3)`LrU& zlvmR~7FqusEwz@L1=l}EQ%jZO5(}M)rjg3R1vO}RoE2V6S|?4k+DFMVoYWZeO_)Q< zNMat!Kv&h+MiLl3e4$dxH{>0^q6R~bW^tfL?NFBM^0TD{F(TWzt6nO!&gH7018p3w)}pQ7R&;Br`>(*^+}3R$v4~tUV$6 zJl@_amfLeqt>Iv83STbSicAPFiD-~`R>)VYwH8*|cGh+#ooEg-Fg9EdT zS{?GXN^}UnSZ-mzxKZ1QTi2XC#H{Y1vtfiRSuW>NV`;36rbLMSX-7m>YC7{2a(@nI z#)g+T#t(DMFE~Yn;IFA_!CjTOq$NL9A(|>8PcL`SZVpw3thjlQv}W@yr`evF!CiGt zO$^i=u41WS!$edKKBI;jP8)Y*EioG2D>L8-9a$L2Z6{hXq&v8UqB!+-qh13p;pi$u zt-fiR8v-j{5jfend6c+10_M*RTdn2|EwYufy8K)3bWN3E*?euRG@tMW*Z=)A~`Ea6sl80 z!#0}YL}IZ zja9+yu!<(EO&hgCZB5EmZ%;wLfH;@O6A;Yv1rDlBopMtO(L!b6^kN>ih0>#pq(G%z zg%ZEHM3j{>WM!-7%AC(P&`hl|>VRyQl)gIbY}HDq+J@}`9G!fnqU7X~i!0V}upT9E z=HUmaL@ZjlilDA^ypr|qR4VAMJZb^cTCQ5BQJ$GashjP>ELpKAX1TRMMh0h8z#kx* z!$_v0@{%}Q1_!fbRvy2`4twtKi-%m1UH{pGUi9t7sT8Hd;0|F<`30OV#vpeBoVUkB2}QO4l*cq72?QB5Eyi<4b~V zq9$6%LX&zpdV-5RlV1?9EO;RX9OEIvT!&&%3`z=w4i}QDWyiP*;-)j;1K(=V$^qZT){1a zt5C9Bvdv@@NJ{dwxHZ6SUNn8F&~BC7`;QGs)Sz(wcsUWL8K|-x#fC&abu5j5hFncW z=#QpXt=h~CT!U98sv0SSbR8tRE5}T!u%kx!3|20x3L(9H#fABqatWR9aJj{*2eH^K z=jO^)&8pHTojklEtuc}>Gv?Z5iR>DZ{6@1P3h?1oYtt}}v@?r6wYBNt;SnjE`aR5~<>FfSC=`9FR$R#OBf&f=H}ouXr4jx& z*TiyU4&!^2Ft@_vOOKoG^Ry#NouG(eOh-eQjt-LPSO`;?&EQHp9>R2dkW5#GFkPvb z_EVV(7+^J;9!H^K;;G^{*&iM9F%jrV%c9IsGY!~93j@HW-#BvK7yT$%C(b?#@i_Oz zL^^TynTf}_FLu(2v(HvM&V4bKPMm!P<8gK^W|G}`z_YI#IvNwj+-!NK!lT>VOfAQw z^^5uSAv$N=6B}B)3noU6u8T%l&5kR z@=N6-;#X#Tcx-rd7+o($xM_4vf`Tw7M^v9SNqq_416`Y@KhpFi8%?pi6L&?Rms*Rr ztBS4JiPa~qsP9^XF@JfcI#DT2x7Gj>5?9S^c)9J^H5m9;TN&yyCdQZw)46&jzc5j* z!q`ihDU76d;Pq>CiWvcjSw5!dYn=2tcOU|Jfex`Dil~RF27a@2mcv-ucL-Qnd0s{kHbXgnmb!GLI%rjjKV`GvFSoTO zN0f@hRvE-cft7FrN9&6SrjjOkg8HJG)~fZAg-@H5QV1I_%wmu|Roj(T8VfbesfW(g z3TTbI%5I9%UpW{|TB;VQk? zLVYSUhRU^h=31y=1!}LCIA;;SQrb{`6sJihm4>QD4mdG!GCa0Us_b!8a;M>m`>T^e z4!pEpqcaRSIf>uvt<)4DA?fY;fFPFE>XU9Zu^1&bRX{&x& zEEeJmvpHIh&tZg&y`z1htyUohS7`1yMVZeyWBooTa8Q836*gbN7FjbVoZ>ziF*Gq` zu*fjDB3J36?|oZhn+Ss|u+S&oOv<&ekHQn)z1-_sWf)wMc_Ez2nyXcFvo$pMKColE z5YdGWAN#aw^@+?$JO`08<*p}1joMrdJ0*o#>@+v9R~I%Hjv++ixsgSd=-TOdI_Tp@ z`y>eNh4~@ZMGqCx@A6wDimr}`b{b8hEX^I|I(ByR#U3h$Rh76WttCT<==$hYJ?8Se z*g58kI1z|{YV{rpowTfWA^e4=g+B40SZ~vp-g+&*F)LD|@4ehdSY_}Ret<>Bax{*Y z?1N?x6x@@iAA zRcp0sb1onG5oPW_tNb(;?BzunE<@vCfGt+^xw2I|j<^kpJwR0rlQEmL)~L_s#VG){ zO@*dlc|O>vdiKPv>VXZiSv4+3y(%p-9tJAAcXiVE4qTr!UiqdRq`2i%4+3TDlOnMO z)1V#ux$4RnbPMDhg^#f6Qz%sewF<$c9mBTgHu6&#` zdDJYoq^si1RRt)I3(%G^4!4!7YttE=OTnmrZJMI4@bUC68bi?*w!P#qqp|>KoM0%;Dkl&?LGm43ez^A zxz_a2k2ttQJH#%tIvty@&Sdz=^~5SMcQ!_5#DFxzqxZ!NTN=3k!JpyP$&i8|S!KIz9Yuy_L|lB>!fD{U^{m?>9f0nX)& zlOrOJ7)$oV5tS2z-7AYliXYzxej+GH43_6|RO&u(EYHj!k<1NLDHxFLagPP#QZsW$S#}h>q+;?$h(sR=u6CY}$2EbS_LB?2%_{ zR*wp!6E04jH6gWEJJrIX)vo-IVUOwNQ=i&{6=-E8*lD-fb}@79#sGm^_CAPSjcwfZyZf z6JcFIOtlL;=oGz%LxOmf-3^vFs}R6)k1%Kr(WzLvOhQ?El!wdasEU_+JS?7sVe!heXy;>SQfqT|5B+X=;d7F>WIy-jUkpenzGBa1Y=C8DV5kb!He2`_9zNBv1_pb^`c!p;Mf(+2Gom= zb%hh5W-eADP4iGpWsB4uR?&fJP{0^j(Ou2fOrcX309+!?ijNjo zzXW1`v`k`|x~8?JPbN8c6pl^MdhRWpOdq=IwDP%SpyT7Kcl8E9zOaMNy;u1l5d<)2 zJ$lbA?k?!Jfe6&Z4mJqWi$QdaVmE{!OfLq|1xkm;rlFZcN~G`#!&LMzrz&zI#0e%~ z1JW2_JW0oVvRDDI1lrRrR!1EQfF;nR_*n7uN#ONEt0Yo9-BNv^Bb6+{m@haD!lFOI zm*m(*Vu3X19c@0^HW`(QrG)L5gR|i!(A6H`I;yJ;FM-B(1s6|gUC5YiD^*0OraRa7 zx2~@r4s(l&xl&!$`y~ERS77U+oYd#8Ox32&N^;eg2*9M?HxjiM)lLd(SMW&GUevsI z&11D1X5XcCh-LBFh^<*=1UCG6Im(*&0iz8;CY)XwoB!xU)^u*pd9R^6SbZABD zMR|JxvMa0=sTU>f4k$t~J+PSVX7|4uOk4#_>}xw~P=6evSFQkFGHvP>E=s2Yc*!&? zK3r`55|Dk;G6@z}*OaeJ(zV;vP2uJ|JxS`hIz#rNbcqn{de<4U7uD+#F+%$+sEHKN zhG*)aZ8{R{FZsnO8Ppf&AJlSDV3_Lm){609X7CDKQ{#XG;6k{PYQ-(;Qt$Y<-7C4k?zgH-R8!#tIxFsr#o2%+VhQ!z;fgapeHb9xfFd+T z>bSYd+yjnX^K3x9Xj)e|5t`*W1gx(o|K=7g0GCLYxs`=g)nVY}8+0o`X^m7rZ|tmqmY)$)T^S=kr&ZDgq= zSDT6&aDS9GC~yRBT&)cP_eX8J!0lRZC3c?`SD_}-T-N@*roRE-&?nC;t0Dj&p>yKv zu%W8oM!H4sQlkU#ebwvu=)G#U;4l~+m)KotI<8Te<$Dy8ZGm^3@M}B};v?TcSXj-I zCR6Ut*oibd5p;xFcg9Yn(>+4RRcH%*f3(>K+_NgPDGbbETSN_bj=rmPfJ48PyITg` zt9XDzzZE?`g9Pd>m<&wmC45(^FM4)I)60SBz8XY${YKw?dMp-+w7(x5BGf+?i$waL zj6+-l2zTXm|MwHzioA+$)=sBmaNUqis6xm)B4J}F4&mFsMDSs)0j-E!Xe*rWn{X^!%_9&jIyg&U zI)Tde9Q0_>NWv>|adjkq>1OANCMdPf;Y1M(`63U4+EYWV)_e}XNxep? z+Cs=`Tr1dz9>fF;3e~Akvi2M%pubwZGHTJ1RaZy0k64%p(o`)q87FD~sKfQ8Y@T%8 zm#kl%KJH4T;X_}_!$@I8@u{KfV^w>Jh}O2Apu-?9-)cdBNqfWGoS|}lB+buhNXD2< zh#eQjEtQCEVvmZfI|IK&+5o}B3Ix=Vb*a79C!QD%%^&@hr$T}7rJ;QUBX$#MmuCfQ z)ACLbYv6k+k|ks=->L=&W(k(-_PmrQXR1pesIM6qpW_+xC5AGbaCfcAE`+(7p=x5F zXzi$>SQ@eumcLW;kmws<7t;wyHod0q9+Yh&5(CRxz_2+~3_PoB%@Xd25|bLk*Gt70 zu(&NyMLPEG=5x#E#(l=y|Mg0KVWM2cEfJ**yPGw^`vE8vG^veEYbs@(QLfx7;r>19 zQ&~qu;l*_XE?1#A6Ao?;b(*zGxrnP%8pmfcu6%09!{t9=jpO;T47b`u7=f!xCvb#r z?N&W~oMNv)+yr4M3YnjGH(x(cyo-qV-Uewt&Hu&!2Vw@Paq zHqp#UE7;4E-KxL+5$qjY+|kI0HS!6>QLlnHGgrGP6MQaO-|ccv!R5J|=JGQoR}SSy zB#h|oSOOVSpZ@k-GuJQ%@8x<+UZF*oER9@~VB}mTISwj3F^HH@^$a6B{gFm#8X*g26XU2mW0Dk2$;83_6H6q~{5WDj z=c;3|R?WBgT1a?jp%mn%sS6Tc;ZDVcdcKlY{S-gt;W5vzJ-yT>Opvy1m%lA@nqTz6-7$)a`te(7JO zQj`wGvt}9IEZ-QW%)fl#)04|iIcvk#^UvPsNa{)XduVdDlowaXP0p2Cd8dG@p>Tb~ z+H|`$omrh85jDn}Zt%$Bw=ht;n@z0lz}DsRHhnWh(98KRlG?eL{~QulKe}SYv1`Nw zY5Up}+3~Zp5qYFHTp>y1-E0%;^ZYEv6Pac`UnosfYx9kKU1s!qGl51Uz|3@hu3TA| zcx9uUugKh)`O?&ma?5aSnh?g<6yXNE;0_t{_4F?;6{N}#RYmt{>29mg#Bv&j*tm6x zGBsyQbRW-LsaVdhP3J4nyIGhhdownR5pfd+&kO6YT-^GxVwgclW$AGK4^ z*R@NHg%R;9Gd?^vJUWaG48Mzq#VNNn$v%cmgZ^;6sq}wXOu$2SoSOGeJVKFUF>SbS zy;w*%1b4-OU4`m<%wQp&m=%WPHDuurgK$s008zFk(-OY?x`yf_InrsS21^YIL zS7`4qF1mjAE1Q{w;hS*cj?mF7dP8*eL3W{Z=aT9?>2H5$=jyvR$wzO~LJ+ikr8Xm^ z5$ZvYRV@p#Wt(aFbNsis(v-~1qm=iYwifER=alb3b?0nCLHrFTptL&CumYBoa3$in~a_8rPwng#mEIciYe!X=F=x)mA#NYQ%U|q*L~%wRFVpnoFlt zvP8C*uerRnH@L-Sjz3CO!(tPy3uNdNO%0bsleb_l#2PX6BaJ^L(vCGwHG99l3GOx}!yc}_X zMQJS1y_E_3uQhQqM0A-bZy!_u)65obJ;#tI%HZ9cUKP5%QN*@F2iJz%!lPMJCXcJp z9d}_|vAk$d5SqJV>SN_r^`$xYd2>)X5c43c}XR4Ijz*bVM7tKK@@v!$NX9ri_9 zo}1HSDhG(6+9+=QO4jjT^syFwv3k7Ya2e-5}f_-%Yo9Lo3qu%?LoxjZK zF?HP>-DVr=>}VR0Yt`hj_fBhmDkuD&+6S_CI9^vAB=N+Ho-lWw$ZKWqtj1Hd+79g8 z?{F(oqts3S>Q7ygZp00`E{4n*OHeu&Z@pB18o96~Q00=9^0GRD9aj?QC9-S3WeqDD zT_cL-V2p;lEkR$_wL~47wjEtakw3b8V)8X#ZXqHeZ`?^ciOC`7QAYD>wwv`5uCb0^ zjfz6Yj&e_~DIT^2_s)_tVTTfLD_!IYKNi;mRKJeK6=oZ?xl&+5f2hlodPz^UsTyjx z$`#8|y&fuvufC!yeT$7+J#qQyNOLiaWS>%KwF^(|C#4wxAN(@1rt{)_BldF?; zfwQK3?$CZxZ_$2BQ{t@N=w-_`XRj!q_^~5XDN5ogo#JyG`qw+TcVYAFtVg%;u6Mmk zd@ueTaz7m5q*6ZuQm#@f=XxC7mCPz`+j=2WVTeP6TIi1o-3&-(4mqEw2~VJ;0d(!aShqhqUw>(v>( zyhM7;Up<(;1SFKa@)GHlw<>m{t8A3#o%-PZ*MN$WNjZF*q8wXkqdcXx`wMr0ijqnB zW0!K=D(zvnJ@|JY1r;Te^4{AO&y`lnvwm~&gO7lUl1X{>9!0q-Anme6pENY$5KxOB zYLM&Rno4O0!TeQw!k?bK^zw5Tr6~PZMaLTXQIpVef=tJH=zvPrCC48JyB|o1*5iv( z>Zr0#^)GMOmc8@#YyRc#=ciJXUg%O$DiOcT0j1^<5MY0FEKDb@IWYLqmB0hd`=N$2{fzAY{@&Dq?}i(rWMba@;xJ5gh?BYyznqz)wq!HseQfhT0*}&iqtvfIAr7Wp z+WmHI&ZeJp&h4LuYEpWUfqdzzFyvi+5uXpBLm#?l_jZ6#T4n(4dSxh(U9QL4+p;@; zzWZzI;72IofB8d3c+_SaTzw(OmFMe5FTeM+>^lyezv)VJy_8H}e{DGk<-PamFXgJg zg?Vf%TzffiC>^7uVr$+!-wDfJ(C5GRwCt7t>ql?i^Q=^gl4&DHUKxVO=l`+(k*|~s zej!hXke|B!oX7409HkQtAs@db2Bclqe}2zt*=}L;3%2)^ZWl721x-W{Nn9|YJT-O-#O#e z@DP;DR{7W8cfztu_pKW@XU}`$OaJ~Px_L^=jaHdobU?s`i&N>rz)gNxH(kCd`@47F z^ZqYj97Ac?K>oziATlqVT0?sHvFo3NB`w^4{X3yYluW6=nhC-70#>-eLj1^8)bOo; zDBSx1B&LLSxa1Ex&Icw#kogs%P|$0yyEeP}h<|uEwLh?s%puhSul7K_wG@3w_Thss z%YOTkzrNr{&}~ZQAocO{J$m!aKpkWH#`j|OH(@BcK|o~sb8$H!(IHj&T#xXlppRR zPd@%_J6z`Ho#FUJCqLXHi_?Fw!~N)a2f8+)y&vWlmS17=!{z?^E4SO>Zd%_Nj$cmF z;m*0~qO58<`VE&Se`vn6VeY_`T2Rxe7F~NsHoxwDFMh)bsT8Fn6%qHmWsS;R?$XIO zzTvLyJx_kc=kD>Cx{HcB`3#m?KHt9n*8g#ODn$u~C4WfymVLq__b=V) zD055h$liPZnLm34w2zW$MvE68HiaZpUaUMad+;@@$P9j;2lvFgiII@#0%wbNoYSFiIHyXm#+CH+tl}s-}~+ zufH?ygUUG@ba=n{LQ%`@s8$&qT9PGHdOSk9x#*=hMJ^ z@UpvaT=%O&Dn-d;e)V@fdbz@>GvEBIJF-U&-cYNVJ+usdpO6I!C$3GfGu#YR| zfOE#;7k{aR;SMDeXAcZORJ|t&Zxt5(CE5s_uYdmS=iLSjN{&&Y4ZjM*u}eiug1*u+L59v~s=IX7$qQN(=xh(s^8z1?@t)Qm#Vnd##FE9|~86j4cK*>G< zq_@2E>Q!$B3MI3Kew?-;)v(*;uOTYanwjuYJkS z&V+GLGWGqEmnm|7OL};wJgplT@!t5$^L}|LYJn2g0OSw(^`~BL5X%PkLA>tBJF?&Z z@_ApHe`_j5$>e|ED-?tnmH5`G{^_2#WQq8tPDDWMm#sKs9l8ff=IZO` z96ykJHOOWMKd4>()$=f&pk&H(@^ApAHeV%^3dmFc@XG9edt}WQ?!^3zlBttlnDhhD z+lw|~cCWttsqGMilIdmkoEE^?g*b9eyqp%0hHB@yA3So!%~%Si1Q)7R^YU$eByrO< z-gv>Cf;Ops_~4GMpF__?$($QKbwLQ0yq<8Th8HV#S&MqtXEvSpNdQtZK^M(Lg2EVg z+9bW~@pt^+qf!5q%u?@H4*|6bmlWVS{Aq7bZhBd}O=`1O}%=kH$n z_~+s6DVd|-2d)SpapYKk*}gtBll|$<#~<}U=sG16>f>5W;$GVu#U6|{Ti>EWFy5+&0BPkgT*YPQ@&oaaE#`uh*h zWWV|IcP-wIK@TOfTo2#xhbhn1YmI<9-EhtM*^$S0-nJfH5hc@%%Mbcd$b=DmamT2? zR967#x9@-HRsS6zluV#UzZV8H<_FpdpyO%}e7yw_N+!_!ufl-F{XmC*awfa#*Dv_a z@Gurrke;V3nP&mV9C(PY$>vIp8Ea$RdE&2DoD7#s$@ETdS{VSr2|2$Y)Zn)t{P)X- z(N|M48~isf_hYDyCZ7rt%!ZX;d-5n46(!V-=96 zKLCL>wcJ!WFbF#G-kI!%-<^jGjFfoRX<$%{13spDVdh=u3Z5PzW>!$H|2N#(~ryOKPZ`XbKO-z6!F@jA7{mp zGudx^_lLjud(6EknK+r-{5Y*fzB!8*_x(83+_{Hdf6F@5FD0{P4!*~aLnn`I81I~a z?BQ=g>nNEubI}L<81p!CTL|o{J^RhA?E2~}KlSQGSVctwkfwN-fBKM=7sZgHHtA!$ z8?U)DJ6s(;VPPVbqJ%C>BR=4>Af7=iJ>TU2HcTVPk*u)$QYOiAbn5jaU2RLsJM2m@h2&$f%}&djAuz{TY@TDZ$J&vOipSXlnDO z4I9tgvT?YztEHFii-%m1UH{pGUi57YI4ME*G{OVxho2nnjMksi=GRIQl>D%2J-OOVnW;`2j?83DA;&K|(C_&28BnELF|snpyk H3Hkp49i5~s diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 79881a0..1513461 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -19,6 +19,9 @@ "button_undo": { "message": "Reopen last closed" }, + "button_detach": { + "message": "Detach tab" + }, "button_move": { "message": "Detach tab" }, @@ -55,6 +58,9 @@ "button_extensions": { "message": "Extensions" }, + "button_unload": { + "message": "Unload tabs" + }, "button_discard": { "message": "Unload tabs" }, @@ -128,83 +134,102 @@ - "tabs_menu_expand_all": { + "menu_expand_all": { "message": "Expand all trees" }, - "tabs_menu_collapse_all": { + "menu_collapse_all": { "message": "Collapse all trees" }, - "tabs_menu_new": { + "menu_expand_tree": { + "message": "Expand tree" + }, + "menu_collapse_tree": { + "message": "Collapse tree" + }, + "menu_new_tab": { "message": "New tab" }, - "tabs_menu_clone": { + "menu_new_pin": { + "message": "New pinned tab" + }, + "menu_duplicate_tab": { "message": "Duplicate" }, - "tabs_menu_move": { + "menu_detach_tab": { "message": "Detach" }, - "tabs_menu_reload": { + "menu_reload_tab": { "message": "Reload" }, - "tabs_menu_pin": { + "menu_pin_tab": { "message": "Pin" }, - "tabs_menu_mute": { + "menu_mute_tab": { "message": "Mute" }, - "tabs_menu_unmute": { + "menu_mute_tree": { + "message": "Mute tree" + }, + "menu_unmute_tree": { + "message": "Unmute tree" + }, + "menu_unmute_tab": { "message": "Unmute" }, - "tabs_menu_mute_other": { + "menu_mute_other": { "message": "Mute other" }, - "tabs_menu_unmute_other": { + "menu_unmute_other": { "message": "Unmute other" }, - "tabs_menu_unpin": { + "menu_unpin_tab": { "message": "Unpin" }, - "tabs_menu_close_tree": { + "menu_close_tree": { "message": "Close tree" }, - "tabs_menu_close": { + "menu_close": { "message": "Close" }, - "tabs_menu_close_other": { + "menu_close_other": { "message": "Close other" }, - "tabs_menu_undo": { + "menu_undo_close_tab": { "message": "Undo close" }, - "tabs_menu_settings": { + "menu_treetabs_settings": { "message": "Settings" }, - "tabs_menu_discard": { + "menu_unload": { "message": "Unload" }, + "menu_bookmark_tree": { + "message": "Bookmark tree" + }, - "folders_menu_new_folder": { + + "menu_new_folder": { "message": "New folder" }, - "folders_menu_rename_folder": { + "menu_rename_folder": { "message": "Rename folder" }, - "folders_menu_delete": { + "menu_delete_folder": { "message": "Delete" }, - "groups_menu_new_group": { + "menu_new_group": { "message": "New group" }, - "groups_menu_rename": { + "menu_rename_group": { "message": "Rename group" }, - "groups_menu_delete": { + "menu_delete_group": { "message": "Delete group" }, - "groups_menu_delete_tabs_close": { + "menu_delete_group_tabs_close": { "message": "Delete group with tabs" }, @@ -212,6 +237,10 @@ "message": "Unload group" }, + "menu_bookmark_group": { + "message": "Bookmark group" + }, + @@ -238,38 +267,88 @@ "message": " Tabs " }, "options_syncro_tabbar_tabs_order": { - "message": "Synchronize browser tabs order with Tree Tabs, tabs can be unresponsive for a second after drag&drop. This option is needed for correct ctrl+tab switching" + "message": "Synchronize browser tabs order with Tree Tabs, tabs can be unresponsive for a second after drag&drop. This option is needed for correct ctrl+tab switching. You can disable this option if you don't use keyboard shortcuts." }, "options_switch_with_scroll": { "message": "Switch tabs with mouse wheel" }, - "options_close_with_MMB": { - "message": "Close tabs with middle mouse button" - }, + "options_always_show_close": { - "message": "Show close button on all tabs" + "message": "Show close button on all tabs and folders" }, "options_never_show_close": { - "message": "Don't show close button (option above will be ignored)" + "message": "Never show close button (option above will be ignored)" }, - "options_close_other_trees": { + "options_collapse_other_trees": { "message": "Automatically collapse other trees on expand" }, "options_open_tree_on_hover": { "message": "Auto expand collapsed trees when dragging and holding for a second over them" }, "options_promote_children": { - "message": "Promote children tabs on close, if disabled, when closing the parent of a tree structure, all tabs will be closed (be careful, because undo close tab will not recover the trees structure)" + "message": "Promote children on close, if disabled, when closing the parent of a tree structure, all tabs and folders will be closed (be careful, because undo close tab will not recover the trees structure)" }, "options_promote_children_in_first_child": { - "message": "Promote first child tab as a parent" + "message": "Promote first child as a parent" }, "options_skip_load": { "message": "Discard tree structure after browser's restart, this option is for those who don't use browser's session. Basically it disables loading database at startup." }, + + "options_midclick_tab": { + "message": "Action for middle mouse click on tab" + }, + "options_dbclick_tab": { + "message": "Action for double click on tab" + }, + + "options_action_tab_none": { + "message": "nothing" + }, + "options_action_tab_new": { + "message": "open new tab" + }, + "options_action_tab_expand_collapse": { + "message": "expand/collapse tree" + }, + "options_action_tab_close": { + "message": "close tab" + }, + "options_action_tab_reload": { + "message": "reload tab" + }, + "options_action_tab_unload": { + "message": "unload tab" + }, + "options_action_tab_activate_previous_active": { + "message": "go back to previous active tab (works only on unpinned tabs)" + }, + + + + + "options_midclick_group": { + "message": "Action for middle click on empty space on the left side or below the tabs" + }, + "options_dbclick_group": { + "message": "Action for double click on empty space on the left side or below the tabs" + }, + "options_action__group_none": { + "message": "nothing" + }, + "options_action__group_new": { + "message": "open new tab" + }, + "options_action__group_activate_previous_active": { + "message": "go back to previous active tab (works only on unpinned tabs)" + }, + + + + "options_append_child_tab": { "message": "Append children tabs at the" }, @@ -330,19 +409,22 @@ "options_append_child_tab_after_limit_bottom": { "message": "at the bottom" }, - "options_max_tree_drag_drop": { - "message": "Limit Drag&Drop to tree's maximum depth as well" - }, "options_show_counter_tabs": { - "message": "Show children tabs count on tab's title" + "message": "Show children tabs count on tabs and folders titles" }, "options_show_counter_tabs_hints": { - "message": "Show children tabs count in tab's hint" + "message": "Show children tabs count in tabs and folders hints" }, "options_max_tree_depth": { "message": "Maximum tree depth: set it to -1 for unlimited branches, 0 for flat tabs placement (no trees), any number above 0 will be its maximum" }, + "options_max_tree_drag_drop": { + "message": "Limit Drag&Drop to tree's maximum depth, so you can't drop tabs beyond maximum depth" + }, + "options_max_tree_drag_drop_folders": { + "message": "Limit Drag&Drop to tree's maximum depth, so you can't drop folders beyond maximum depth" + }, @@ -358,12 +440,47 @@ "message": "Show groups toolbar in new windows" }, "options_syncro_tabbar_groups_tabs_order": { - "message": "Synchronize browser tabs order after drag&drop of the group tabs. Tabs will sort for a long time, if browser has a lot of tabs open. This option is needed for correct ctrl+tab switching" + "message": "Synchronize browser tabs order after drag&drop of the group tabs. Tabs will sort for a long time, if browser has a lot of tabs open. This option is needed for correct ctrl+tab switching. You can disable this option if you don't use keyboard shortcuts." }, + "options_folders": { + "message": "Folders" + }, + + + "options_midclick_folder": { + "message": "Action for middle mouse click on folder" + }, + "options_dbclick_folder": { + "message": "Action for double click on folder" + }, + + "options_action_folder_none": { + "message": "nothing" + }, + "options_action_folder_rename": { + "message": "rename folder" + }, + "options_action_folder_new_folder": { + "message": "open new folder" + }, + "options_action_folder_new_tab": { + "message": "open new tab" + }, + "options_action_folder_expand_collapse": { + "message": "expand/collapse tree" + }, + "options_action_folder_close": { + "message": "close folder" + }, + "options_action_folder_unload": { + "message": "unload tabs in folder" + }, + + @@ -371,6 +488,13 @@ + + "options_global": { + "message": "Global" + }, + + + "options_theme": { "message": "Theme" }, @@ -424,6 +548,16 @@ + "options_tabs_margin_overlap": { + "message": "Tabs spacing:\nOverlap 1px, best for themes with borders" + }, + "options_tabs_margin_0": { + "message": "Tabs spacing:\nNo spacing, best for flat look" + }, + "options_tabs_margin_1": { + "message": "Tabs spacing:\nDefault, 1px between tabs" + }, + @@ -532,19 +666,82 @@ - "options_color_pick_filter_clear_icon": { - "message": "Clear search result x button color" - }, "close_x": { "message": "x inside the close button" }, "close_hover_x": { - "message": "x inside the close button on hover" + "message": "x inside the close button, on mouse hover" }, + + + "button_background": { + "message": "Toolbar buttons background" + }, + "button_hover_background": { + "message": "Toolbar buttons background, on mouse hover" + }, + + + "button_icons": { + "message": "Toolbar buttons icon color" + }, + "button_icons_hover": { + "message": "Toolbar buttons icon color, on mouse hover" + }, + "button_border": { + "message": "Toolbar buttons border color" + }, + "button_hover_border": { + "message": "Toolbar buttons border color, on mouse hover" + }, + + + "filter_box_font": { + "message": "Search box, font color" + }, + "filter_box_background": { + "message": "Search box, font background color" + }, + "filter_box_border": { + "message": "Search box, border color" + }, + "filter_clear_icon": { + "message": "Clear search result x button color" + }, + + + "toolbar_background": { + "message": "Toolbar background color" + }, + "toolbar_border_bottom": { + "message": "Toolbar borders color" + }, + + + + "attention_background": { + "message": "Tabs blinking for attention, background color" + }, + "attention_border": { + "message": "Tabs blinking for attention, border color" + }, + + + "pin_list_border_bottom": { + "message": "Pinned tabs list, border at the bottom color" + }, + "pin_list_background": { + "message": "Pinned tabs list, background color" + }, + + "options_color_pick_hover": { "message": "On hover" }, + + + "options_color_pick_border": { "message": "Border color" }, diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index 395a78f..1e8c132 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -2,6 +2,9 @@ "button_bookmarks": { "message": "Закладки" }, + "button_unload": { + "message": "Выгрузить все вкладки" + }, "button_discard": { "message": "Выгрузить все вкладки" }, @@ -20,6 +23,9 @@ "button_move": { "message": "Отсоединить текущую вкладку" }, + "button_detach": { + "message": "Отсоединить текущую вкладку" + }, "button_new": { "message": "ЛКМ - открыть новую вкладку \nСКМ - дублировать активную вкладку \nПКМ - прокрутка списка к активной вкладке" }, @@ -119,12 +125,10 @@ "options_append_orphan_tab_top": { "message": "в начале списка" }, - "options_close_other_trees": { + "options_collapse_other_trees": { "message": "автоматически сворачивать другие деревья при раскрывании дерева" }, - "options_close_with_MMB": { - "message": "закрывать вкладки средней кнопкой мыши" - }, + "options_color_button_background": { "message": " фон кнопки" }, @@ -374,55 +378,55 @@ "opt_url_for_web_panel": { "message": "Вставить этот URL в веб-панель" }, - "tabs_menu_clone": { + "menu_duplicate_tab": { "message": "Дублировать вкладку" }, - "tabs_menu_close": { + "menu_close": { "message": "Закрыть вкладку" }, - "tabs_menu_close_other": { + "menu_close_other": { "message": "Закрыть другие вкладки" }, - "tabs_menu_collapse_all": { + "menu_collapse_all": { "message": "Свернуть все деревья" }, - "tabs_menu_discard": { + "menu_unload": { "message": "Выгрузить вкладку" }, - "tabs_menu_expand_all": { + "menu_expand_all": { "message": "Раскрыть все деревья" }, - "tabs_menu_move": { + "menu_detach_tab": { "message": "Отсоединить вкладку" }, - "tabs_menu_mute": { + "menu_mute_tab": { "message": "Выключить звук на вкладке" }, - "tabs_menu_mute_other": { + "menu_mute_other": { "message": "Выключить звук (на других)" }, - "tabs_menu_new": { + "menu_new_tab": { "message": "Новая вкладка" }, - "tabs_menu_pin": { + "menu_pin_tab": { "message": "Закрепить вкладку" }, - "tabs_menu_reload": { + "menu_reload_tab": { "message": "Обновить вкладку" }, - "tabs_menu_settings": { + "menu_treetabs_settings": { "message": "Настройки Tree Tabs" }, - "tabs_menu_undo": { + "menu_undo_close_tab": { "message": "Отменить закрытие" }, - "tabs_menu_unmute": { + "menu_unmute_tab": { "message": "Включить звук на вкладке" }, - "tabs_menu_unmute_other": { + "menu_unmute_other": { "message": "Включить звук (на других)" }, - "tabs_menu_unpin": { + "menu_unpin_tab": { "message": "Открепить вкладку" }, "options_active_tab_font_bold": { @@ -434,7 +438,7 @@ "options_never_show_close": { "message": "не показывать кнопку закрытия (опция выше будет проигнорирована)" }, - "tabs_menu_close_tree": { + "menu_close_tree": { "message": "Закрыть дерево" } } diff --git a/background.html b/background.html index c97bdfc..f1c0516 100644 --- a/background.html +++ b/background.html @@ -3,6 +3,5 @@ - - + \ No newline at end of file diff --git a/bg_ch.js b/bg_ch.js index 3e7d97c..4d14af1 100644 --- a/bg_ch.js +++ b/bg_ch.js @@ -3,18 +3,31 @@ // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ if (browserId != "F") { - ConvertLegacyStorage(); - LoadPreferences(); - GetCurrentTheme(); + // ConvertLegacyStorage(); ChromeLoadTabs(0); ChromeMessageListeners(); } function ChromeLoadTabs(retry) { chrome.windows.getAll({windowTypes: ['normal'], populate: true}, function(w) { chrome.storage.local.get(null, function(storage) { + // LOAD PREFERENCES + opt = Object.assign({}, DefaultPreferences); + if (storage["preferences"]) { + for (var parameter in storage["preferences"]) { + if (opt[parameter] != undefined) { + opt[parameter] = storage["preferences"][parameter]; + } + } + } + // LOAD THEME + if (storage["current_theme"] && storage["themes"] && storage["themes"][storage["current_theme"]]) { + theme = storage["themes"][storage["current_theme"]]; + } else { + theme = Object.assign({}, DefaultTheme); + } + // load tabs and windows from storage var refTabs = {}; var tabs_matched = 0; - // load tabs and windows from storage.local var w_count = storage.w_count ? storage.w_count : 0; var t_count = storage.t_count ? storage.t_count : 0; var LoadedWindows = storage.windows ? storage.windows : []; @@ -36,7 +49,7 @@ function ChromeLoadTabs(retry) { let winId = w[wIndex].id; let url1 = w[wIndex].tabs[0].url; let url2 = w[wIndex].tabs[w[wIndex].tabs.length-1].url; - windows[winId] = {group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, active_tab: 0, name: caption_ungrouped_group, font: ""}}, folders: {}}; + windows[winId] = {group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, active_tab: 0, prev_active_tab: 0, name: caption_ungrouped_group, font: ""}}, folders: {}}; for (var LwIndex = 0; LwIndex < LoadedWinCount; LwIndex++) { if (LoadedWindows[LwIndex].url1 == url1 || LoadedWindows[LwIndex].url2 == url2) { if (LoadedWindows[LwIndex].group_bar) { windows[winId].group_bar = LoadedWindows[LwIndex].group_bar; } @@ -89,6 +102,9 @@ function ChromeLoadTabs(retry) { if (refTabs[windows[windowId].groups[group].active_tab]) { windows[windowId].groups[group].active_tab = refTabs[windows[windowId].groups[group].active_tab]; } + if (refTabs[windows[windowId].groups[group].prev_active_tab]) { + windows[windowId].groups[group].prev_active_tab = refTabs[windows[windowId].groups[group].prev_active_tab]; + } } } // will try to find tabs for 3 times @@ -170,7 +186,7 @@ async function ChromeAutoSaveData(BAK, LoopTimer) { } function ChromeHashURL(tab) { if (tabs[tab.id] == undefined) { - tabs[tab.id] = {hash: 0, parent: tab.pinned ? "pin_list" : "tab_list", index: tab.index, expand: "n"}; + tabs[tab.id] = {hash: 0, parent: tab.pinned ? "pin_list" : (windows[tab.windowId] ? windows[tab.windowId].active_group : "tab_list"), index: tab.index, expand: "n"}; } var hash = 0; for (var charIndex = 0; charIndex < tab.url.length; charIndex++) { @@ -246,7 +262,7 @@ function ChromeListeners() { // start all listeners chrome.runtime.sendMessage({command: "tab_activated", windowId: activeInfo.windowId, tabId: activeInfo.tabId}); }); chrome.windows.onCreated.addListener(function(window) { - windows[window.id] = {group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, active_tab: 0, name: caption_ungrouped_group, font: ""}}, folders: {}}; + windows[window.id] = {group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, active_tab: 0, prev_active_tab: 0, name: caption_ungrouped_group, font: ""}}, folders: {}}; schedule_save++; }); chrome.windows.onRemoved.addListener(function(windowId) { @@ -259,99 +275,151 @@ function ChromeListeners() { // start all listeners } function ChromeMessageListeners() { chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { - log("message to background: "); - log(message); - switch(message.command) { - case "reload": - window.location.reload(); - break; - case "get_preferences": - sendResponse(opt); - break; - case "save_preferences": - opt = Object.assign({}, message.opt); - chrome.storage.local.set({preferences: message.opt}); - break; - case "get_windows": - sendResponse(windows); - break; - case "get_folders": - if (windows[message.windowId]) { - sendResponse(windows[message.windowId].folders); - } - break; - case "save_folders": + if (opt.debug) console.log("message to background:"); + if (opt.debug) console.log(message); + if (message.command == "reload") { + window.location.reload(); + return; + } + if (message.command == "get_preferences") { + sendResponse(opt); + return; + } + if (message.command == "save_preferences") { + opt = Object.assign({}, message.opt); + chrome.storage.local.set({preferences: message.opt}); + return; + } + if (message.command == "get_windows") { + sendResponse(windows); + return; + } + if (message.command == "get_folders") { + if (windows[message.windowId]) { + sendResponse(windows[message.windowId].folders); + } + return; + } + if (message.command == "save_folders") { + if (windows[message.windowId]) { windows[message.windowId].folders = Object.assign({}, message.folders); schedule_save++; - break; - case "get_groups": - if (windows[message.windowId]) { - sendResponse(windows[message.windowId].groups); - } - break; - case "save_groups": + } + return; + } + if (message.command == "get_groups") { + if (windows[message.windowId]) { + sendResponse(windows[message.windowId].groups); + } + return; + } + if (message.command == "save_groups") { + if (windows[message.windowId]) { windows[message.windowId].groups = Object.assign({}, message.groups); schedule_save++; - break; - case "set_active_group": + } + return; + } + if (message.command == "set_active_group") { + if (windows[message.windowId]) { windows[message.windowId].active_group = message.active_group; schedule_save++; - break; - case "get_active_group": - if (windows[message.windowId]) { - sendResponse(windows[message.windowId].active_group); - } - break; - case "set_search_filter": + } + return; + } + if (message.command == "get_active_group") { + if (windows[message.windowId]) { + sendResponse(windows[message.windowId].active_group); + } + return; + } + if (message.command == "set_search_filter") { + if (windows[message.windowId]) { windows[message.windowId].search_filter = message.search_filter; schedule_save++; - break; - case "get_search_filter": - if (windows[message.windowId]) { - sendResponse(windows[message.windowId].search_filter); - } - break; - case "set_active_shelf": + } + return; + } + if (message.command == "get_search_filter") { + if (windows[message.windowId]) { + sendResponse(windows[message.windowId].search_filter); + } + return; + } + if (message.command == "set_active_shelf") { + if (windows[message.windowId]) { windows[message.windowId].active_shelf = message.active_shelf; schedule_save++; - break; - case "get_active_shelf": - if (windows[message.windowId]) { - sendResponse(windows[message.windowId].active_shelf); - } - break; - case "set_group_bar": + } + return; + } + if (message.command == "get_active_shelf") { + if (windows[message.windowId]) { + sendResponse(windows[message.windowId].active_shelf); + } + return; + } + if (message.command == "set_group_bar") { + if (windows[message.windowId]) { windows[message.windowId].group_bar = message.group_bar; schedule_save++; - break; - case "get_group_bar": - if (windows[message.windowId]) { - sendResponse(windows[message.windowId].group_bar); + } + return; + } + if (message.command == "get_group_bar") { + if (windows[message.windowId]) { + sendResponse(windows[message.windowId].group_bar); + } + return; + } + if (message.command == "get_browser_tabs") { + sendResponse(tabs); + return; + } + if (message.command == "is_bg_ready") { + sendResponse(running); + return; + } + if (message.command == "update_tab") { + if (tabs[message.tabId]) { + if (message.tab.index) { + tabs[message.tabId].index = message.tab.index; } - break; - // case "console_log": - // console.log(message.m); - // break; - case "get_browser_tabs": - sendResponse(tabs); - break; - case "is_bg_ready": - sendResponse(running); - break; - case "update_tab": - if (tabs[message.tabId]) { - for (var parameter in message.tab) { - tabs[message.tabId][parameter] = message.tab[parameter]; - } - schedule_save++; + if (message.tab.expand) { + tabs[message.tabId].expand = message.tab.expand; } - break; - case "get_theme": - sendResponse(theme); - break; - case "reload_theme": - GetCurrentTheme(); - break; + if (message.tab.parent) { + tabs[message.tabId].parent = message.tab.parent; + } + schedule_save++; + } + return; + } + if (message.command == "update_all_tabs") { + for (let i = 0; i < message.pins.length; i++) { + if (tabs[message.pins[i].id]) { + tabs[message.pins[i].id].parent = "pin_list"; + tabs[message.pins[i].id].expand = ""; + tabs[message.pins[i].id].index = message.pins[i].index; + } + } + for (let j = 0; j < message.tabs.length; j++) { + if (tabs[message.tabs[j].id]) { + tabs[message.tabs[j].id].parent = message.tabs[j].parent; + tabs[message.tabs[j].id].expand = message.tabs[j].expand; + tabs[message.tabs[j].id].index = message.tabs[j].index; + } + } + schedule_save++; + return; + } + if (message.command == "get_theme") { + sendResponse(theme); + return; + } + if (message.command == "reload_theme") { + GetCurrentTheme(); + return; } }); } \ No newline at end of file diff --git a/bg_ff.js b/bg_ff.js index 2675db5..ba3703a 100644 --- a/bg_ff.js +++ b/bg_ff.js @@ -3,10 +3,7 @@ // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ if (browserId == "F") { - ConvertLegacyStorage(); FirefoxStart(0); - LoadPreferences(); - GetCurrentTheme(); FirefoxMessageListeners(); } function FirefoxStart(retry) { @@ -28,85 +25,105 @@ function FirefoxStart(retry) { } function FirefoxLoadTabs(retry) { chrome.windows.getAll({windowTypes: ["normal"], populate: true}, function(w) { - var tt_ids = {}; - var tabs_matched = 0; - var tabs_count = 0; - for (var wIndex = 0; wIndex < w.length; wIndex++) { - tabs_count += w[wIndex].tabs.length; - } - // CACHED COUNTS AND STUFF - var lastWinId = w[w.length-1].id; - var lastTabId = w[w.length-1].tabs[w[w.length-1].tabs.length-1].id; - var WinCount = w.length; - for (var wIndex = 0; wIndex < WinCount; wIndex++) { - let winIndex = wIndex; - let winId = w[winIndex].id; - let tabsCount = w[winIndex].tabs.length; - - // LOAD TTID FROM FIREFOX GET WINDOW VALUE - let win = Promise.resolve(browser.sessions.getWindowValue(winId, "TTdata")).then(function(WindowData) { - if (opt.skip_load == false && WindowData != undefined) { - windows[winId] = Object.assign({}, WindowData); - } else { - windows[winId] = {ttid: "", group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, active_tab: 0, active_tab_ttid: "", name: caption_ungrouped_group, font: ""}}, folders: {}}; + chrome.storage.local.get(null, function(storage) { + // LOAD PREFERENCES + opt = Object.assign({}, DefaultPreferences); + if (storage["preferences"]) { + for (var parameter in storage["preferences"]) { + if (opt[parameter] != undefined) { + opt[parameter] = storage["preferences"][parameter]; + } } - for (var tIndex = 0; tIndex < tabsCount; tIndex++) { - let tabIndex = tIndex; - let tabId = w[winIndex].tabs[tabIndex].id; - let tabPinned = w[winIndex].tabs[tabIndex].pinned; - // LOAD TTID FROM FIREFOX GET TAB VALUE - let tab = Promise.resolve(browser.sessions.getTabValue(tabId, "TTdata")).then(function(TabData) { - if (opt.skip_load == false && TabData != undefined) { - tabs[tabId] = Object.assign({}, TabData); - tt_ids[tabs[tabId].ttid] = tabId; - tabs_matched++; - } else { - tabs[tabId] = {ttid: "", parent_ttid: "", parent: tabPinned ? "pin_list" : "tab_list", index: tabIndex, expand: "n"}; - } - // IF ON LAST TAB AND LAST WINDOW, START MATCHING LOADED DATA - if (tabId == lastTabId && winId == lastWinId) { - for (var ThisSessonWinId in windows) { - if (windows[ThisSessonWinId].ttid == "") { - AppendWinTTId(parseInt(ThisSessonWinId)); - } + } + // LOAD THEME + if (storage["current_theme"] && storage["themes"] && storage["themes"][storage["current_theme"]]) { + theme = storage["themes"][storage["current_theme"]]; + } else { + theme = Object.assign({}, DefaultTheme); + } + // CACHED COUNTS AND STUFF + // var tt_ids = {}; + var tabs_matched = 0; + var tabs_count = 0; + for (var wIndex = 0; wIndex < w.length; wIndex++) { + tabs_count += w[wIndex].tabs.length; + } + var lastWinId = w[w.length-1].id; + var lastTabId = w[w.length-1].tabs[w[w.length-1].tabs.length-1].id; + var WinCount = w.length; + for (var wIndex = 0; wIndex < WinCount; wIndex++) { + let winIndex = wIndex; + let winId = w[winIndex].id; + let tabsCount = w[winIndex].tabs.length; + + // LOAD TTID FROM FIREFOX GET WINDOW VALUE + let win = Promise.resolve(browser.sessions.getWindowValue(winId, "TTdata")).then(function(WindowData) { + if (opt.skip_load == false && WindowData != undefined) { + windows[winId] = Object.assign({}, WindowData); + } else { + windows[winId] = {ttid: "", group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, active_tab: 0, active_tab_ttid: "", prev_active_tab: 0, prev_active_tab_ttid: "", name: caption_ungrouped_group, font: ""}}, folders: {}}; + } + for (var tIndex = 0; tIndex < tabsCount; tIndex++) { + let tabIndex = tIndex; + let tabId = w[winIndex].tabs[tabIndex].id; + let tabPinned = w[winIndex].tabs[tabIndex].pinned; + // LOAD TTID FROM FIREFOX GET TAB VALUE + let tab = Promise.resolve(browser.sessions.getTabValue(tabId, "TTdata")).then(function(TabData) { + if (opt.skip_load == false && TabData != undefined) { + tabs[tabId] = Object.assign({}, TabData); + tt_ids[tabs[tabId].ttid] = tabId; + tabs_matched++; + } else { + tabs[tabId] = {ttid: "", parent_ttid: "", parent: tabPinned ? "pin_list" : "tab_list", index: tabIndex, expand: ""}; } - // OK, DONE WITH WINDOWS, START TABS LOOP - for (var ThisSessonTabId in tabs) { - if (tabs[ThisSessonTabId].ttid == "") { - AppendTabTTId(parseInt(ThisSessonTabId)); - } - } - // OK, DONE, NOW REPLACE OLD PARENTS IDS WITH THIS SESSION IDS - for (var ThisSessonTabId in tabs) { - if (tt_ids[tabs[ThisSessonTabId].parent_ttid] != undefined) { - tabs[ThisSessonTabId].parent = tt_ids[tabs[ThisSessonTabId].parent_ttid]; - } - } - // OK, SAME THING FOR ACTIVE TABS IN GROUPS - for (var ThisSessonWinId in windows) { - for (var group in windows[ThisSessonWinId].groups) { - if (tt_ids[windows[ThisSessonWinId].groups[group].active_tab_ttid] != undefined) { - windows[ThisSessonWinId].groups[group].active_tab = tt_ids[windows[ThisSessonWinId].groups[group].active_tab_ttid]; + // IF ON LAST TAB AND LAST WINDOW, START MATCHING LOADED DATA + if (tabId == lastTabId && winId == lastWinId) { + for (var ThisSessonWinId in windows) { + if (windows[ThisSessonWinId].ttid == "") { + AppendWinTTId(parseInt(ThisSessonWinId)); } } + // OK, DONE WITH WINDOWS, START TABS LOOP + for (var ThisSessonTabId in tabs) { + if (tabs[ThisSessonTabId].ttid == "") { + AppendTabTTId(parseInt(ThisSessonTabId)); + } + } + // OK, DONE, NOW REPLACE OLD PARENTS IDS WITH THIS SESSION IDS + for (var ThisSessonTabId in tabs) { + if (tt_ids[tabs[ThisSessonTabId].parent_ttid] != undefined) { + tabs[ThisSessonTabId].parent = tt_ids[tabs[ThisSessonTabId].parent_ttid]; + } + } + // OK, SAME THING FOR ACTIVE TABS IN GROUPS + for (var ThisSessonWinId in windows) { + for (var group in windows[ThisSessonWinId].groups) { + if (tt_ids[windows[ThisSessonWinId].groups[group].active_tab_ttid] != undefined) { + windows[ThisSessonWinId].groups[group].active_tab = tt_ids[windows[ThisSessonWinId].groups[group].active_tab_ttid]; + } + if (tt_ids[windows[ThisSessonWinId].groups[group].prev_active_tab_ttid] != undefined) { + windows[ThisSessonWinId].groups[group].prev_active_tab = tt_ids[windows[ThisSessonWinId].groups[group].prev_active_tab_ttid]; + } + } + } + // will try to find tabs for 3 times + if (opt.skip_load == true || retry > 2 || (tabs_matched > tabs_count*0.5)) { + running = true; + // setInterval(function() { + FirefoxAutoSaveData(); + // }, 10000); + FirefoxListeners(); + } else { + setTimeout(function() { + FirefoxLoadTabs(retry+1); + }, 2000); + } } - // will try to find tabs for 3 times - if (opt.skip_load == true || retry > 2 || (tabs_matched > tabs_count*0.5)) { - running = true; - // setInterval(function() { - FirefoxAutoSaveData(); - // }, 10000); - FirefoxListeners(); - } else { - setTimeout(function() { - FirefoxLoadTabs(retry+1); - }, 2000); - } - } - }); - } - }); - } + }); + } + }); + } + }); }); } // save every second if there is anything to save obviously @@ -153,10 +170,13 @@ function GenerateNewWindowID() { function GenerateNewTabID() { var newID = "t_"+GenerateRandomID(); var newIdAvailable = true; - for (var tabId in tabs) { - if (tabs[tabId].ttid == newID) { - newIdAvailable = false; - } + // for (var tabId in tabs) { + // if (tabs[tabId].ttid == newID) { + // newIdAvailable = false; + // } + // } + if (tt_ids[newID] != undefined) { + newIdAvailable = false; } if (newIdAvailable) { return newID; @@ -169,8 +189,10 @@ function AppendTabTTId(tabId) { if (tabs[tabId] != undefined) { tabs[tabId].ttid = NewTTTabId; } else { - tabs[tabId] = {ttid: NewTTTabId, parent: "tab_list", parent_ttid: "", index: 0, expand: "n"}; + tabs[tabId] = {ttid: NewTTTabId, parent: "tab_list", parent_ttid: "", index: 0, expand: ""}; } + tt_ids[NewTTTabId] = tabId; + return NewTTTabId; // if (schedule_save > 0) browser.sessions.setTabValue( tabId, "TTdata", tabs[tabId] ); } @@ -179,7 +201,7 @@ function AppendWinTTId(windowId) { if (windows[windowId] != undefined) { windows[windowId].ttid = NewTTWindowId; } else { - windows[windowId] = {ttid: NewTTWindowId, group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, active_tab: 0, active_tab_ttid: "", name: caption_ungrouped_group, font: ""}}, folders: {}}; + windows[windowId] = {ttid: NewTTWindowId, group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, active_tab: 0, active_tab_ttid: "", prev_active_tab: 0, prev_active_tab_ttid: "", name: caption_ungrouped_group, font: ""}}, folders: {}}; } // if (schedule_save > 0) browser.sessions.setWindowValue( windowId, "TTdata", windows[windowId] ); } @@ -190,7 +212,7 @@ function ReplaceParents(oldTabId, newTabId) { } } } -var DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA = {}; +var DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA = {}; // MOZILLA BUG 1398272 // start all listeners function FirefoxListeners() { browser.browserAction.onClicked.addListener(function() { @@ -198,25 +220,29 @@ function FirefoxListeners() { browser.sidebarAction.open(); }); chrome.tabs.onCreated.addListener(function(tab) { - let t = Promise.resolve(browser.sessions.getTabValue(tab.id, "TTdata")).then(function(TabData) { - if (TabData != undefined) { - tabs[tab.id] = Object.assign({}, TabData); - } else { - AppendTabTTId(tab.id); - } - schedule_save++; + chrome.tabs.get(tab.id, function(NewTab) { // for some reason firefox sends tab with "active == false" even if tab is active (THIS IS POSSIBLY A NEW BUG IN FF 60.01!) + let t = Promise.resolve(browser.sessions.getTabValue(NewTab.id, "TTdata")).then(function(TabData) { + if (TabData != undefined) { + tabs[NewTab.id] = Object.assign({}, TabData); + let originalParent = TabData.parent_ttid == "" ? undefined : (tt_ids[TabData.parent_ttid] ? tt_ids[TabData.parent_ttid] : TabData.parent_ttid); + chrome.runtime.sendMessage({command: "tab_created", windowId: NewTab.windowId, tab: NewTab, tabId: NewTab.id, parentTabId: originalParent, index: TabData.index}); + } else { + AppendTabTTId(NewTab.id); + chrome.runtime.sendMessage({command: "tab_created", windowId: NewTab.windowId, tab: NewTab, tabId: NewTab.id}); + } + schedule_save++; + }); }); - chrome.runtime.sendMessage({command: "tab_created", windowId: tab.windowId, tab: tab, tabId: tab.id}); - schedule_save++; }); chrome.tabs.onAttached.addListener(function(tabId, attachInfo) { let oldId = tabId; chrome.tabs.get(oldId, function(tab) { ReplaceParents(oldId, tab.id); - tabs[tab.id] = tabs[oldId]; - DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA[oldId] = tab.id; - DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA[tab.id] = oldId; - browser.sessions.setTabValue( tab.id, "TTdata", tabs[oldId] ); + tt_ids[tabs[oldId].ttid] = tab.id; // MOZILLA BUG 1398272 + tabs[tab.id] = tabs[oldId]; // MOZILLA BUG 1398272 + DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA[oldId] = tab.id; // MOZILLA BUG 1398272 + DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA[tab.id] = oldId; // MOZILLA BUG 1398272 + browser.sessions.setTabValue( tab.id, "TTdata", tabs[oldId] ); // MOZILLA BUG 1398272 chrome.runtime.sendMessage({command: "tab_attached", windowId: attachInfo.newWindowId, tab: tab, tabId: tab.id, ParentId: tabs[tab.id].parent}); schedule_save++; }); @@ -225,17 +251,17 @@ function FirefoxListeners() { chrome.tabs.onDetached.addListener(function(tabId, detachInfo) { chrome.runtime.sendMessage({command: "tab_detached", windowId: detachInfo.oldWindowId, tabId: tabId}); let detachTabId = tabId; - if (DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA[tabId] != undefined) { - detachTabId = DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA[tabId]; - chrome.runtime.sendMessage({command: "tab_detached", windowId: detachInfo.oldWindowId, tabId: DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA[tabId]}); - } + if (DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA[tabId] != undefined) { // MOZILLA BUG 1398272 + detachTabId = DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA[tabId]; // MOZILLA BUG 1398272 + chrome.runtime.sendMessage({command: "tab_detached", windowId: detachInfo.oldWindowId, tabId: DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA[tabId]}); // MOZILLA BUG 1398272 + } // MOZILLA BUG 1398272 }); chrome.tabs.onRemoved.addListener(function(tabId, removeInfo) { setTimeout(function() { - if (DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA[tabId] != undefined) { - chrome.runtime.sendMessage({command: "tab_removed", windowId: removeInfo.windowId, tabId: DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA[tabId]}); - } + if (DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA[tabId] != undefined) { // MOZILLA BUG 1398272 + chrome.runtime.sendMessage({command: "tab_removed", windowId: removeInfo.windowId, tabId: DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA[tabId]}); // MOZILLA BUG 1398272 + } // MOZILLA BUG 1398272 chrome.runtime.sendMessage({command: "tab_removed", windowId: removeInfo.windowId, tabId: tabId}); }, 5); // setTimeout(function() { @@ -244,10 +270,12 @@ function FirefoxListeners() { schedule_save++; }); chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { - if (changeInfo.pinned == true) { + if (changeInfo.pinned == true && tabs[tabId]) { tabs[tabId].parent = "pin_list"; tabs[tabId].parent_ttid = ""; schedule_save++; + } else { + AppendTabTTId(tabId); } if (changeInfo.title != undefined && !tab.active) { chrome.runtime.sendMessage({command: "tab_attention", windowId: tab.windowId, tabId: tabId}); @@ -265,6 +293,7 @@ function FirefoxListeners() { ReplaceParents(tabId, tab.id); chrome.runtime.sendMessage({command: "tab_removed", windowId: tab.windowId, tabId: removedTabId}); chrome.runtime.sendMessage({command: "tab_attached", windowId: tab.windowId, tab: tab, tabId: addedTabId, ParentId: tabs[addedTabId].parent}); + // delete ttid[tabs[removedTabId].ttid]; // delete tabs[removedTabId]; } setTimeout(function() { @@ -280,7 +309,7 @@ function FirefoxListeners() { chrome.windows.onCreated.addListener(function(window) { let win = Promise.resolve(browser.sessions.getWindowValue(window.id, "TTdata")).then(function(WindowData) { if (WindowData != undefined) { - windows[winId] = Object.assign({}, WindowData); + windows[window.id] = Object.assign({}, WindowData); } else { AppendWinTTId(window.id); } @@ -294,115 +323,170 @@ function FirefoxListeners() { } function FirefoxMessageListeners() { chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { - log("message to background: "); - log(message); - switch(message.command) { - case "reload": - window.location.reload(); - break; - case "get_preferences": - sendResponse(opt); - break; - case "save_preferences": - opt = Object.assign({}, message.opt); - chrome.storage.local.set({preferences: message.opt}); - break; - case "get_windows": - sendResponse(windows); - break; - case "get_folders": - if (windows[message.windowId]) { - sendResponse(windows[message.windowId].folders); - } - break; - case "save_folders": + if (opt.debug) console.log("message to background:"); + if (opt.debug) console.log(message); + if (message.command == "reload") { + window.location.reload(); + return; + } + if (message.command == "get_preferences") { + sendResponse(opt); + return; + } + if (message.command == "save_preferences") { + opt = Object.assign({}, message.opt); + chrome.storage.local.set({preferences: message.opt}); + return; + } + if (message.command == "get_windows") { + sendResponse(windows); + return; + } + if (message.command == "get_folders") { + if (windows[message.windowId]) { + sendResponse(windows[message.windowId].folders); + } + return; + } + if (message.command == "save_folders") { + if (windows[message.windowId]) { windows[message.windowId].folders = Object.assign({}, message.folders); schedule_save++; - break; - case "get_groups": - if (windows[message.windowId]) { - sendResponse(windows[message.windowId].groups); - } - break; - case "save_groups": + } + return; + } + if (message.command == "get_groups") { + if (windows[message.windowId]) { + sendResponse(windows[message.windowId].groups); + } + return; + } + if (message.command == "save_groups") { + if (windows[message.windowId]) { windows[message.windowId].groups = Object.assign({}, message.groups); for (var group in windows[message.windowId].groups) { if (tabs[windows[message.windowId].groups[group].active_tab]) { windows[message.windowId].groups[group].active_tab_ttid = tabs[windows[message.windowId].groups[group].active_tab].ttid; } + if (tabs[windows[message.windowId].groups[group].prev_active_tab]) { + windows[message.windowId].groups[group].prev_active_tab_ttid = tabs[windows[message.windowId].groups[group].prev_active_tab].ttid; + } } schedule_save++; - break; - case "set_active_group": + } + return; + } + if (message.command == "set_active_group") { + if (windows[message.windowId]) { windows[message.windowId].active_group = message.active_group; schedule_save++; - break; - case "get_active_group": - if (windows[message.windowId]) { - sendResponse(windows[message.windowId].active_group); - } - break; - case "set_search_filter": + } + return; + } + if (message.command == "get_active_group") { + if (windows[message.windowId]) { + sendResponse(windows[message.windowId].active_group); + } + return; + } + if (message.command == "set_search_filter") { + if (windows[message.windowId]) { windows[message.windowId].search_filter = message.search_filter; schedule_save++; - break; - case "get_search_filter": - if (windows[message.windowId]) { - sendResponse(windows[message.windowId].search_filter); - } - break; - case "set_active_shelf": + } + return; + } + if (message.command == "get_search_filter") { + if (windows[message.windowId]) { + sendResponse(windows[message.windowId].search_filter); + } + return; + } + if (message.command == "set_active_shelf") { + if (windows[message.windowId]) { windows[message.windowId].active_shelf = message.active_shelf; schedule_save++; - break; - case "get_active_shelf": - if (windows[message.windowId]) { - sendResponse(windows[message.windowId].active_shelf); - } - break; - case "set_group_bar": + } + return; + } + if (message.command == "get_active_shelf") { + if (windows[message.windowId]) { + sendResponse(windows[message.windowId].active_shelf); + } + return; + } + if (message.command == "set_group_bar") { + if (windows[message.windowId]) { windows[message.windowId].group_bar = message.group_bar; schedule_save++; - break; - case "get_group_bar": - if (windows[message.windowId]) { - sendResponse(windows[message.windowId].group_bar); + } + return; + } + if (message.command == "get_group_bar") { + if (windows[message.windowId]) { + sendResponse(windows[message.windowId].group_bar); + } + return; + } + if (message.command == "get_browser_tabs") { + sendResponse(tabs); + return; + } + if (message.command == "is_bg_ready") { + sendResponse(running); + return; + } + if (message.command == "update_tab") { + if (tabs[message.tabId]) { + if (message.tab.index) { + tabs[message.tabId].index = message.tab.index; } - break; - // case "console_log": - // console.log(message.m); - // break; - case "get_browser_tabs": - sendResponse(tabs); - break; - case "is_bg_ready": - sendResponse(running); - break; - case "update_tab": - if (tabs[message.tabId]) { - if (message.tab.index) { - tabs[message.tabId].index = message.tab.index; - } - if (message.tab.expand) { - tabs[message.tabId].expand = message.tab.expand; - } - if (message.tab.parent) { - tabs[message.tabId].parent = message.tab.parent; - if (tabs[message.tab.parent]) { - tabs[message.tabId].parent_ttid = tabs[message.tab.parent].ttid; - } else { - tabs[message.tabId].parent_ttid = ""; - } - } - schedule_save++; + if (message.tab.expand) { + tabs[message.tabId].expand = message.tab.expand; } - break; - case "get_theme": - sendResponse(theme); - break; - case "reload_theme": - GetCurrentTheme(); - break; + if (message.tab.parent) { + tabs[message.tabId].parent = message.tab.parent; + if (tabs[message.tab.parent]) { + tabs[message.tabId].parent_ttid = tabs[message.tab.parent].ttid; + } else { + tabs[message.tabId].parent_ttid = ""; + } + } + schedule_save++; + } + return; + } + if (message.command == "update_all_tabs") { + for (let i = 0; i < message.pins.length; i++) { + if (tabs[message.pins[i].id]) { + tabs[message.pins[i].id].parent = "pin_list"; + tabs[message.pins[i].id].parent_ttid = ""; + tabs[message.pins[i].id].expand = ""; + tabs[message.pins[i].id].index = message.pins[i].index; + } + } + for (let j = 0; j < message.tabs.length; j++) { + if (tabs[message.tabs[j].id]) { + tabs[message.tabs[j].id].parent = message.tabs[j].parent; + tabs[message.tabs[j].id].expand = message.tabs[j].expand; + tabs[message.tabs[j].id].index = message.tabs[j].index; + if (tabs[message.tabs[j].parent]) { + tabs[message.tabs[j].id].parent_ttid = tabs[message.tabs[j].parent].ttid; + } else { + tabs[message.tabs[j].id].parent_ttid = AppendTabTTId(message.tabs[j].parent); + } + } + } + schedule_save++; + return; + } + if (message.command == "get_theme") { + sendResponse(theme); + return; + } + if (message.command == "reload_theme") { + GetCurrentTheme(); + return; } }); } \ No newline at end of file diff --git a/download.html b/download.html new file mode 100644 index 0000000..004bf9d --- /dev/null +++ b/download.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/download.js b/download.js new file mode 100644 index 0000000..4aeb12b --- /dev/null +++ b/download.js @@ -0,0 +1,18 @@ +chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { + if (message.command == "show_save_file_dialog") { + let file = new File([JSON.stringify(message.data)], message.filename, {type: "text/csv;charset=utf-8"} ); + let body = document.getElementById("body"); + let savelink = document.createElement("a"); + savelink.target = "_blank"; + savelink.style.display = "none"; + savelink.type = "file"; + savelink.download = message.filename; + savelink.href = URL.createObjectURL(file); + body.appendChild(savelink); + savelink.click(); + setTimeout(function() { + chrome.tabs.update(message.currentTabId, { active: true }); + chrome.tabs.remove(message.selfTabId, null); + }, 50); + } +}); diff --git a/legacy.js b/legacy.js index b781c36..ae4358b 100644 --- a/legacy.js +++ b/legacy.js @@ -4,7 +4,7 @@ function OldHashTab(tab){ if (tabs[tab.id] == undefined){ - tabs[tab.id] = {ttid: "", hash: 0, h: 0, parent: tab.pinned ? "pin_list" : "tab_list", index: tab.index, expand: "n"}; + tabs[tab.id] = {ttid: "", hash: 0, h: 0, parent: tab.pinned ? "pin_list" : "tab_list", index: tab.index, expand: ""}; } var hash = 0; if (tab.url.length === 0){ @@ -153,9 +153,9 @@ function FirefoxLoadV100(retry) { let tab = Promise.resolve(browser.sessions.getTabValue(tabId, "TTId")).then(function(TTId) { // LOAD TTID FROM FIREFOX GET TAB VALUE if (TTId != undefined) { - tabs[tabId] = {ttid: TTId, parent_ttid: "", parent: tabPinned ? "pin_list" : "tab_list", index: tabIndex, expand: "n"}; + tabs[tabId] = {ttid: TTId, parent_ttid: "", parent: tabPinned ? "pin_list" : "tab_list", index: tabIndex, expand: ""}; } else { - tabs[tabId] = {ttid: "", parent_ttid: "", parent: tabPinned ? "pin_list" : "tab_list", index: tabIndex, expand: "n"}; + tabs[tabId] = {ttid: "", parent_ttid: "", parent: tabPinned ? "pin_list" : "tab_list", index: tabIndex, expand: ""}; } // IF ON LAST TAB AND LAST WINDOW, START MATCHING LOADED DATA if (tabId == lastTabId && winId == lastWinId) { diff --git a/lib_jquery/jquery-3.2.1.min.js b/lib_jquery/jquery-3.2.1.min.js deleted file mode 100644 index 644d35e..0000000 --- a/lib_jquery/jquery-3.2.1.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), -a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), -null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("
Tree Tabs

+ +
@@ -38,6 +38,8 @@
+ +
@@ -54,6 +56,8 @@
+ +
@@ -73,10 +77,94 @@
+
    +
  • + + +
  • +
  • + + +
  • +
+ + +
+ +
    +
  • + + +
  • +
  • + + +
  • +
+ + + + + + +
-
+
+ + +
+
    +
  • + + +
  • +
  • + + +
  • +
@@ -88,68 +176,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
  • @@ -196,21 +223,86 @@ + + + + + + +
    -
- + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
-
-
-
-
-
-
-
-
-
+
+ + + + +
- - - - - - + + + + + +

@@ -240,11 +332,13 @@
- +
+ +
@@ -295,9 +389,11 @@
-
-
-
+
+
+
+
+
@@ -315,6 +411,14 @@
+
+
+ + + +
+
+
@@ -383,7 +487,7 @@ - + @@ -398,6 +502,7 @@ + diff --git a/options/donate_ltc.png b/options/donate_ltc.png new file mode 100644 index 0000000000000000000000000000000000000000..5563402db88249a74807f3a017c042f8c0c4692a GIT binary patch literal 15061 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 literal 0 HcmV?d00001 diff --git a/options/options.css b/options/options.css index 4ac5c07..0b8bdf5 100644 --- a/options/options.css +++ b/options/options.css @@ -8,22 +8,37 @@ #donate { position:absolute; top:17px; - left:700px; + left:640px; width: 100px; height: 20px; background-image: url(../options/donate_title.svg); } +/* buttons are 35px apart */ #donate_paypal { position:absolute; top:14px; - left:790px; + left:755px; width: 32px; height: 32px; background-image: url(../options/donate_paypal.png); background-size: 30px 30px; } #donate_paypal:hover { + top: 13px; + left:754px; + background-size: 32px 32px; +} +#donate_litecoin { + position:absolute; + top:14px; + left:790px; + width: 32px; + height: 32px; + background-image: url(../options/donate_ltc.png); + background-size: 30px 30px; +} +#donate_litecoin:hover { top: 13px; left:789px; background-size: 32px 32px; @@ -98,4 +113,560 @@ ul:not(.menu) li { .label { padding-left: 6px; padding-right: 6px; -} \ No newline at end of file +} + + + + + + + + + + + + + + + + + + + + +/* THEME DEPARTMENT */ + + + +/* OPTIONS IMAGES */ +.font_color, +.font_weight_normal, +.font_weight_bold, +.font_style_normal, +.font_style_italic, +.color_toolbar_icon, +.color_bucket, +.color_brush, +.color_border, +.color_x, +.options_button_minus, +.options_button_plus { + z-index: 9000; + position: absolute; + display: float; + height: 20px; + width: 20px; + background-size: 20px 20px; +} + +.font_color { + background-image: url(../options/options_font_color.svg); +} +.font_color:hover { + background-image: url(../options/options_font_color_hover.svg); +} +.font_weight_normal { + background-image: url(../options/options_font_style_normal.svg); +} +.font_weight_normal:hover { + background-image: url(../options/options_font_style_normal_hover.svg); +} +.font_weight_bold { + background-image: url(../options/options_font_weight_bold.svg); +} +.font_weight_bold:hover { + background-image: url(../options/options_font_weight_bold_hover.svg); +} +.font_style_normal { + background-image: url(../options/options_font_style_normal.svg); +} +.font_style_normal:hover { + background-image: url(../options/options_font_style_normal_hover.svg); +} +.font_style_italic { + background-image: url(../options/options_font_style_italic.svg); +} +.font_style_italic:hover { + background-image: url(../options/options_font_style_italic_hover.svg); +} +.color_toolbar_icon { + background-image: url(../options/options_color_toolbar_icon.svg); +} +.color_toolbar_icon:hover { + background-image: url(../options/options_color_toolbar_icon_hover.svg); +} +.color_bucket { + background-image: url(../options/options_color_bucket.svg); +} +.color_bucket:hover { + background-image: url(../options/options_color_bucket_hover.svg); +} +.color_brush { + background-image: url(../options/options_color_brush.svg); +} +.color_brush:hover { + background-image: url(../options/options_color_brush_hover.svg); +} +.color_border { + background-image: url(../options/options_color_border.svg); +} +.color_border:hover { + background-image: url(../options/options_color_border_hover.svg); +} +.color_x { + background-image: url(../options/options_color_x.svg); +} +.color_x:hover { + background-image: url(../options/options_color_x_hover.svg); +} +.options_button_minus { + top: 5px; + left: 6px; + background-image: url(../options/options_scale_minus.svg); +} +.options_button_minus:hover { + background-image: url(../options/options_scale_minus_hover.svg); +} +.options_button_plus { + top: 5px; + left: 54px; + background-image: url(../options/options_scale_plus.svg); +} +.options_button_plus:hover { + background-image: url(../options/options_scale_plus_hover.svg); +} + +@keyframes hover_blinking { + 0% {background-color: transparent;} + 100% {background-color: blue;} +} +.hover_blinking { + animation: hover_blinking 1s infinite; +} + +@keyframes hover_border_blinking { + 0% {border: 1px solid transparent;} + 100% {border: 1px solid blue;} +} +.hover_border_blinking { + animation: hover_border_blinking 1s infinite; +} + +/* MAIN TOOLBAR */ +#toolbar_background { + top: 0px; + left: 307px; +} +#toolbar_border_bottom { + top: 0px; + left: 328px; +} + +#button_icons { + top: 0px; + left: 59px; +} +#button_icons_hover { + top: 0px; + left: 80px; +} + +#button_background { + top: 0px; + left: 4px; +} +#button_hover_background { + top: 0px; + left: 25px; +} + +#button_border { + top: 0px; + left: 115px; +} +#button_hover_border { + top: 0px; left: 136px; +} + +#filter_box_font { + top: 0px; + left: 175px; +} +#filter_clear_icon { + top: 0px; + left: 238px; +} +#filter_box_background { + top: 0px; + left: 196px; +} +#filter_box_border { + top: 0px; + left: 217px; +} + + +/* BIG OPTIONS BUTTONS */ +#options_tabs_margins_indicator { + z-index: 3000; + display: float; + position: absolute; + top: 25px; + left: 460px; + height: 30px; + width: 80px; + background-size: 80px 30px; + background-image: url(../options/options_tabs_margin_indicator.svg); +} +#options_tabs_indentation_indicator { + z-index: 3000; + display: float; + position: absolute; + top: 25px; + left: 550px; + height: 30px; + width: 80px; + background-size: 80px 30px; + background-image: url(../options/options_tabs_indentation_indicator.svg); +} +#options_tabs_roundness_indicator { + z-index: 3000; + display: float; + position: absolute; + top: 25px; + left: 640px; + height: 30px; + width: 80px; + background-size: 80px 30px; + background-image: url(../options/options_tabs_roundness_indicator.svg); +} +#options_tabs_size_indicator { + z-index: 3000; + display: float; + position: absolute; + top: 25px; left: 730px; + height: 30px; + width: 80px; + background-size: 80px 30px; + background-image: url(../options/options_tabs_size_indicator.svg); +} + +/* SCROLLBAR RESIZE */ +#scrollbar_size_indicator { + z-index: 3000; + display: float; + position: absolute; + top: 20px; + left: 335px; + height: 80px; + width: 80px; + background-size: 80px 80px; + background-image: url(../options/options_scrollbar_size_indicator.svg); +} +#options_tab_list_scrollbar_width_down { + left: 3px; + top: 30px; +} +#options_tab_list_scrollbar_width_up { + left: 57px; + top: 30px; +} +#options_tab_list_scrollbar_height_up { + left: 30px; + top: 3px; +} +#options_tab_list_scrollbar_height_down { + left: 30px; + top: 57px; +} + + +/* PIN LIST AND SCROLLBAR */ +#pin_list { + position: absolute; + height: calc(var(--scrollbar_height) + var(--pin_height) + 2px - var(--pin_list_padding_top) - var(--pin_list_padding_bottom)); + width: 788px; + top: 30px; + left: 20px; + padding: none; +} + +#pin_list_scrollbar { + position: absolute; + height: var(--scrollbar_height); + width: 790px; + top: calc(var(--pin_height) + 32px ); + left: 20px; z-index: 1000; + background-color: var(--scrollbar_track); +} +#pin_list_scrollbar_thumb { + position: relative; + height: 100%; + width: 100px; + top: 0px; + left: 0px; + z-index: 1200; + background-color: var(--scrollbar_thumb); +} +#pin_list_scrollbar_thumb:hover { + background-color: var(--scrollbar_thumb_hover); +} + + + +/* PINS */ +#pin_list_options_block { + z-index: 2000; + position:absolute; + width: 500px; + height: var(--pin_height); + top: 30px; + left: 20px; + margin: 0; + /* background:rgba(0,0,255,0.1); */ +} +#pin_list_background { + top: 1px; + left: 187px; +} +#pin_list_border_bottom { + top: 1px; + left: 164px; +} + + +/* ATTENTION PIN */ +#attention_background { + top: 1px; + left: 72px; +} +#attention_border { + top: 1px; + left: 93px; +} + + + +/* TAB LIST AND SCROLLBAR */ +#groups { + position: absolute; + height: 800px; + width: calc(771px - var(--scrollbar_width)); + top: calc(var(--scrollbar_height) + var(--pin_height) + 33px); + left: 40px; + z-index: 1000 +} + +#group_scrollbar { + position: absolute; + height: 800px; + width: var(--scrollbar_width); + top: calc(var(--scrollbar_height) + var(--pin_height) + 33px); + left: calc(810px - var(--scrollbar_width)); + z-index: 1000; + background-color: var(--scrollbar_track); +} +#group_scrollbar_thumb { + position: relative; + height: 200px; + width: 100%; + top: 140px; + left: 0px; + z-index: 1000; + background-color: var(--scrollbar_thumb); +} +#group_scrollbar_thumb:hover { + background-color: var(--scrollbar_thumb_hover); +} +#scrollbar_thumb { + position: absolute; + top: 370px; + left: 790px; +} +#scrollbar_thumb_hover { + position: absolute; + top: 390px; + left: 790px; +} +#scrollbar_track { + position: absolute; + top: 410px; + left: 790px; +} + +/* TABS */ +#tabs_options_block { + z-index: 2000; + position:absolute; + width: 740px; + height: auto; + top: calc(var(--scrollbar_height) + var(--pin_height) + 35px); + left: 50px; + margin: 0; + /* background:rgba(0,255,0,0.5); */ +} + +.tab_color_options_row { + z-index: 2000; + position:relative; + margin-top: var(--margin_top_tab); + width: 740px; + height: calc(var(--tab_height) + 2px); + /* background:rgba(255,0,0,0.1); */ +} +.tab_color_options_row .color_x, +.tab_color_options_row .color_border, +.tab_color_options_row .color_border, +.tab_color_options_row .color_bucket, +.tab_color_options_row .font_color, +.tab_color_options_row .font_weight_normal, +.tab_color_options_row .font_weight_bold, +.tab_color_options_row .font_style_normal, +.tab_color_options_row .font_style_italic { + top: 0px; + height: var(--tab_height); + width: var(--tab_height); + background-size: var(--tab_height) var(--tab_height); +} + +.tab_color_options_row>.color_border { + left: 659px; +} +.tab_color_options_row>.color_bucket { + left: 680px; +} +.tab_color_options_row>.font_color { + left: 509px; +} +.tab_color_options_row>.font_weight_normal { + left: 538px; +} +.tab_color_options_row>.font_weight_bold { + left: 559px; +} +.tab_color_options_row>.font_style_normal { + left: 588px; +} +.tab_color_options_row>.font_style_italic { + left: 609px; +} + + +/* DRAG AND DROP INDICATOR */ +#dd19 { + display: inline-block; + border-bottom: 2px solid var(--drag_indicator); +} +#drag_indicator { + top: calc(var(--tab_height) / 2); + left: 350px; +} + + +/* CLOSE TAB BUTTON OPTIONS */ +#close_x { + top: 0px; + left: calc(753px - var(--scrollbar_width)); +} +#close_hover_x { + top: calc(-1* var(--tab_height)); + left: calc(753px - var(--scrollbar_width)); +} +#close_hover_border { + top: 0px; + left: calc(753px - var(--scrollbar_width)); +} +#close_hover_background { + top: var(--tab_height); + left: calc(753px - var(--scrollbar_width)); +} + + +/* CLOSE TAB BUTTON OPTIONS */ +#expand_hover_background { + top: 0px; + left: calc(var(--children_padding_left) - 18px); +} +#expand_closed_background { + top: 0px; + left: calc(var(--children_padding_left) - 18px); +} +#expand_open_background { + top: 0px; left: -12px; +} + + +#tab_list_background { + top: 835px; + left: 50px; +} + + + +#toolbar_groups_block { + position: absolute; + left: 20px; + top: calc(var(--scrollbar_height) + var(--pin_height) + 33px); + width: 19px; + height: 800px; + background-color: var(--group_list_background); + border-right: 1px solid var(--group_list_borders); + overflow: visible; +} +#_gtetab_list { + width: 200px; + height: 20px; +} +#_gtetab_list2 { + width: 200px; + height: 20px; +} +#_tab_list2:hover { + background-color: var(--group_list_button_hover_background); +} + +#group_list_background { + top: 835px; + left: 20px; +} +#group_list_borders { + top: 631px; + left: 20px; +} +#group_list_default_font_color { + top: 652px; + left: 20px; +} +#group_list_button_hover_background { + top: 610px; + left: 20px; +} + + +/* MENU */ +#tabs_menu_border { + top: 59px; + left: 80px; +} +#tabs_menu_background { + top: 59px; + left: 102px; +} +#tabs_menu_font { + top: 36px; + left: 102px; +} +#tabs_menu_hover_border { + top: 14px; + left: 80px; +} +#tabs_menu_hover_background { + top: 14px; + left: 102px; +} +#tabs_menu_separator { + top: 36px; + left: 80px; +} + + diff --git a/options/options.js b/options/options.js index 854135d..d2267bc 100644 --- a/options/options.js +++ b/options/options.js @@ -10,6 +10,9 @@ var SelectedTheme = Object.assign({}, DefaultTheme); var dragged_button; active_group = "tab_list"; +// options for all drop down menus +let DropDownList = ["dbclick_folder", "midclick_folder", "midclick_tab", "dbclick_group", "midclick_group", "dbclick_tab", "append_child_tab", "append_child_tab_after_limit", "append_orphan_tab", "after_closing_active_tab"]; + document.addEventListener("DOMContentLoaded", function() { document.title = "Tree Tabs"; chrome.runtime.sendMessage({command: "get_preferences"}, function(response) { @@ -27,9 +30,8 @@ document.addEventListener("DOMContentLoaded", function() { GetOptions(); RefreshFields(); SetEvents(); - SetToolbarShelfToggle("click"); - AppendGroupToList("tab_list", caption_ungrouped_group, ""); - AppendGroupToList("tab_list2", caption_noname_group, ""); + AppendGroupToList("tab_list", caption_ungrouped_group, "", false); + AppendGroupToList("tab_list2", caption_noname_group, "", false); AppendSampleTabs(); }); }); @@ -38,567 +40,626 @@ document.addEventListener("DOMContentLoaded", function() { // document events function GetOptions() { // get language labels - $(".label").each(function() { - $(this).text(chrome.i18n.getMessage(this.id)); - }); - // get language for color pick labels - $(".cpl").each(function() { - $(this).text(chrome.i18n.getMessage(this.id)); - }); + document.querySelectorAll(".label, .set_button, .bg_opt_drop_down_menu").forEach(function(s){ + s.textContent = chrome.i18n.getMessage(s.id); + }); + // get language for menu labels - $(".menu_item").each(function() { - $(this).text(chrome.i18n.getMessage("options_example_menu_item")); - }); + document.querySelectorAll(".menu_item").forEach(function(s){ + s.textContent = chrome.i18n.getMessage("options_example_menu_item"); + }); // get checkboxes from saved states - $(".opt_checkbox").each(function() { - $(this)[0].checked = opt[this.id]; - }); - $(".set_button").each(function() { - $(this)[0].textContent = chrome.i18n.getMessage(this.id); - }); - - // get language dropdown menus - $(".bg_opt_drop_down_menu").each(function() { - $(this)[0].textContent = chrome.i18n.getMessage(this.id); - }); - - // get language for color pick labels - $("#close_x, #close_hover_x").each(function() { - $(this).attr("title", chrome.i18n.getMessage(this.id)); - }); - $(".color_border").each(function() { - $(this).attr("title", chrome.i18n.getMessage("options_color_pick_border")); - }); - $(".color_bucket").each(function() { - $(this).attr("title", chrome.i18n.getMessage("options_color_pick_background")); - }); - $(".pick_col_hover").each(function() { - $(this).attr("title", chrome.i18n.getMessage("options_color_pick_hover")); - }); - $(".font_color").each(function() { - $(this).attr("title", chrome.i18n.getMessage("options_color_pick_font")); - }); - - $(".options_button_minus, .options_button_plus").each(function() { - $(this).attr("title", chrome.i18n.getMessage(this.id)); - }); - $("#filter_clear_icon").each(function() { - $(this).attr("title", chrome.i18n.getMessage("options_color_pick_filter_clear_icon")); - }); - - // get options for append child tab - for (var i = 0; i < $("#append_child_tab")[0].options.length; i++) { - if ($("#append_child_tab")[0].options[i].value === opt.append_child_tab) { - $("#append_child_tab")[0].selectedIndex = i; - break; + document.querySelectorAll(".opt_checkbox").forEach(function(s){ + s.checked = opt[s.id]; + if (s.checked) { + if (s.id == "never_show_close") { + document.getElementById("always_show_close").disabled = true; + } + } else { + if (s.id == "promote_children") { + document.getElementById("promote_children_in_first_child").disabled = true; + } } - } + }); + + // get language labels + document.querySelectorAll(".pick_col, #close_x, #close_hover_x, .options_button_minus, .options_button_plus, .tabs_margin_spacing").forEach(function(s){ + s.title = chrome.i18n.getMessage(s.id); + }); + - // get options for append child tab after limit - for (var i = 0; i < $("#append_child_tab_after_limit")[0].options.length; i++) { - if ($("#append_child_tab_after_limit")[0].options[i].value === opt.append_child_tab_after_limit) { - $("#append_child_tab_after_limit")[0].selectedIndex = i; - break; - } - } - - // get options for append orphan tab - for (var i = 0; i < $("#append_orphan_tab")[0].options.length; i++) { - if ($("#append_orphan_tab")[0].options[i].value === opt.append_orphan_tab) { - $("#append_orphan_tab")[0].selectedIndex = i; - break; - } - } - - // get options for action after closing active tab - for (var i = 0; i < $("#after_closing_active_tab")[0].options.length; i++) { - if ($("#after_closing_active_tab")[0].options[i].value === opt.after_closing_active_tab) { - $("#after_closing_active_tab")[0].selectedIndex = i; - break; + + + + // get options for all drop down menus (loop through all drop down items that are in DropDownList array) + for (let i = 0; i < DropDownList.length; i++) { + let DropDownOption = document.getElementById(DropDownList[i]); + for (let j = 0; j < DropDownOption.options.length; j++) { + if (DropDownOption.options[j].value == opt[DropDownList[i]]) { + DropDownOption.selectedIndex = j; + break; + } } } // get options for tabs tree depth option - $("#max_tree_depth")[0].value = opt.max_tree_depth; + document.getElementById("max_tree_depth").value = opt.max_tree_depth; + // append themes to dropdown menu + let ThemeList = document.getElementById("theme_list"); for (var i = 0; i < themes.length; i++) { - var t_list = document.getElementById("theme_list"); - var theme_name = document.createElement("option"); - theme_name.value = themes[i]; - theme_name.text = themes[i]; - t_list.add(theme_name); + let theme_name = document.createElement("option"); + theme_name.value = themes[i]; + theme_name.text = themes[i]; + ThemeList.add(theme_name); } - // select current theme in dropdown list - for (var i = 0; i < $("#theme_list")[0].options.length; i++) { - if ($("#theme_list")[0].options[i].value == current_theme) { - $("#theme_list")[0].selectedIndex = i; + for (var i = 0; i < ThemeList.options.length; i++) { + if (ThemeList.options[i].value == current_theme) { + ThemeList.selectedIndex = i; break; } } } -function RemoveRedPreview() { +function RemovePreview() { if (document.styleSheets[document.styleSheets.length-1].cssRules.length) { document.styleSheets[document.styleSheets.length-1].deleteRule(document.styleSheets[document.styleSheets.length-1].cssRules.length-1); } + document.querySelectorAll(".hover_blinking").forEach(function(s){s.classList.remove("hover_blinking");}); + document.querySelectorAll(".hover_border_blinking").forEach(function(s){s.classList.remove("hover_border_blinking");}); } // document events function SetEvents() { -// --------------------------------DONATIONS------------------------------------------------------------------------------ +// --------------------------------DONATIONS----------------------------------------------------------------------------- - // Donate - $(document).on("click", "#options_share_theme_link", function(event) { - chrome.tabs.create({url: "https://drive.google.com/drive/folders/0B3jXQpRtOfvSelFrTEVHZEx3Nms?usp=sharing"}); - }); - - $(document).on("click", "#donate_paypal", function(event) { + document.getElementById("donate_paypal").onclick = function(event) {if (event.which == 1) { chrome.tabs.create({url: "https://www.paypal.me/KarolJagiello/1"}); - }); - - $(document).on("click", "#donate_bitcoin", function(event) { + }} + document.getElementById("donate_litecoin").onclick = function(event) {if (event.which == 1) { + copyStringToClipboard("LdQ1ZH1CgSneBbmmVBFrg5BFDFHZMa6h76"); + alert(chrome.i18n.getMessage("options_copied_wallet_address")); + }} + document.getElementById("donate_bitcoin").onclick = function(event) {if (event.which == 1) { copyStringToClipboard("19Z8w1RJEcBQpKSdiWa3UTBuKRJUkr96nJ"); alert(chrome.i18n.getMessage("options_copied_wallet_address")); - }); - - $(document).on("click", "#donate_ethereum", function(event) { + }} + document.getElementById("donate_ethereum").onclick = function(event) {if (event.which == 1) { copyStringToClipboard("0x70B05eAD03bF08220d5aF4E1E868C351bfe145D6"); alert(chrome.i18n.getMessage("options_copied_wallet_address")); - }); - + }} // --------------------------------COPY VIVALDI LINK---------------------------------------------------------------------- - $(document).on("click", "#copy_vivaldi_url_for_web_panel", function(event) { - copyStringToClipboard(chrome.runtime.getURL("sidebar.html")); - alert(chrome.i18n.getMessage("options_vivaldi_copied_url")); - }); + document.getElementById("copy_vivaldi_url_for_web_panel").onclick = function(event) {if (event.which == 1) { + copyStringToClipboard(chrome.runtime.getURL("sidebar.html")); + alert(chrome.i18n.getMessage("options_vivaldi_copied_url")); + }} -// --------------------------------ADD RED PREVIEW------------------------------------------------------------------------ - - $(document).on("mouseenter", ".pick_col, #filter_box_font", function(event) { +// --------------------------------ADD RED AND BLUE PREVIEWS--------------------------------------------------------------- + // document.body.onmousedown = function(event) { + // if (event.which == 1 && (event.target.id || event.target.classList)) { + // console.log(event.target); + // } + // } + document.querySelectorAll(".pick_col, #filter_box_font").forEach(function(s){s.onmouseenter = function(event) { document.styleSheets[document.styleSheets.length-1].insertRule("body { --"+this.id+": red; }", document.styleSheets[document.styleSheets.length-1].cssRules.length); - }); - $(document).on("mouseenter", ".font_weight_normal", function(event) { + }}); + document.querySelectorAll(".font_weight_normal").forEach(function(s){s.onmouseenter = function(event) { document.styleSheets[document.styleSheets.length-1].insertRule("body { --"+this.id+": normal; }", document.styleSheets[document.styleSheets.length-1].cssRules.length); - }); - $(document).on("mouseenter", ".font_weight_bold", function(event) { + }}); + document.querySelectorAll(".font_weight_bold").forEach(function(s){s.onmouseenter = function(event) { document.styleSheets[document.styleSheets.length-1].insertRule("body { --"+this.id+": bold; }", document.styleSheets[document.styleSheets.length-1].cssRules.length); - }); - - $(document).on("mouseenter", ".font_style_normal", function(event) { + }}); + document.querySelectorAll(".font_style_normal").forEach(function(s){s.onmouseenter = function(event) { document.styleSheets[document.styleSheets.length-1].insertRule("body { --"+this.id+": normal; }", document.styleSheets[document.styleSheets.length-1].cssRules.length); - }); - $(document).on("mouseenter", ".font_style_italic", function(event) { + }}); + document.querySelectorAll(".font_style_italic").forEach(function(s){s.onmouseenter = function(event) { document.styleSheets[document.styleSheets.length-1].insertRule("body { --"+this.id+": italic; }", document.styleSheets[document.styleSheets.length-1].cssRules.length); - }); + }}); + document.querySelectorAll(".pick_col, .font_weight_normal, .font_weight_bold, .font_style_normal, .font_style_italic, #filter_box_font").forEach(function(s){s.onmouseleave = function(event) { + RemovePreview(); + }}); - $(document).on("mouseleave", ".pick_col, .font_weight_normal, .font_weight_bold, .font_style_normal, .font_style_italic, #filter_box_font", function(event) { - RemoveRedPreview(); - }); - - $(document).on("mouseenter", "#scrollbar_thumb_hover", function(event) { - $("#group_scrollbar_thumb, #pin_list_scrollbar_thumb").addClass("hover_blinking"); - }); - - $(document).on("mouseleave", "#scrollbar_thumb_hover", function(event) { - $("#group_scrollbar_thumb, #pin_list_scrollbar_thumb").removeClass("hover_blinking"); - }); - - $(document).on("mouseenter", "#group_list_button_hover_background", function(event) { - $("#_tab_list2").addClass("hover_blinking"); - }); - - $(document).on("mouseleave", "#group_list_button_hover_background", function(event) { - $("#_tab_list2").removeClass("hover_blinking"); - }); - - $(document).on("mouseenter", "#button_hover_background", function(event) { - $(".button").addClass("hover_blinking"); - }); - $(document).on("mouseleave", "#button_hover_background", function(event) { - $(".button").removeClass("hover_blinking"); - }); - - $(document).on("mouseenter", "#button_icons_hover", function(event) { - $(".button_img").addClass("hover_blinking"); - }); - $(document).on("mouseleave", "#button_icons_hover", function(event) { - $(".button_img").removeClass("hover_blinking"); - }); - - $(document).on("mouseenter", "#button_hover_border", function(event) { - $(".button").addClass("hover_border_blinking"); - }); - $(document).on("mouseleave", "#button_hover_border", function(event) { - $(".button").removeClass("hover_border_blinking"); - }); - - - - // filter_box_font - $(document).on("mouseenter", "#options_tab_list_scrollbar_width_up, #options_tab_list_scrollbar_width_down", function(event) { - $("#group_scrollbar, #group_scrollbar_thumb").css({ "background-color": "red" }); - }); - $(document).on("mouseleave", "#options_tab_list_scrollbar_width_up, #options_tab_list_scrollbar_width_down", function(event) { - $("#group_scrollbar, #group_scrollbar_thumb").css({ "background-color": "" }); - }); + document.getElementById("group_list_default_font_color").onmouseenter = function(event) { + document.getElementById("_gtetab_list").style.color = "red"; + document.getElementById("_gtetab_list2").style.color = "red"; + + } + document.getElementById("group_list_default_font_color").onmouseleave = function(event) { + document.getElementById("_gtetab_list").style.color = ""; + document.getElementById("_gtetab_list2").style.color = ""; + } + - $(document).on("mouseenter", "#options_tab_list_scrollbar_height_up, #options_tab_list_scrollbar_height_down", function(event) { - $("#pin_list_scrollbar, #pin_list_scrollbar_thumb").css({ "background-color": "red" }); - }); - $(document).on("mouseleave", "#options_tab_list_scrollbar_height_up, #options_tab_list_scrollbar_height_down", function(event) { - $("#pin_list_scrollbar, #pin_list_scrollbar_thumb").css({ "background-color": "" }); - }); + document.getElementById("scrollbar_thumb_hover").onmouseenter = function(event) { + RemovePreview(); + document.getElementById("group_scrollbar_thumb").classList.add("hover_blinking"); + document.getElementById("pin_list_scrollbar_thumb").classList.add("hover_blinking"); + } + document.getElementById("scrollbar_thumb_hover").onmouseleave = function(event) { + RemovePreview(); + } + document.getElementById("group_list_button_hover_background").onmouseenter = function(event) { + RemovePreview(); + document.getElementById("_tab_list2").classList.add("hover_blinking"); + } + document.getElementById("group_list_button_hover_background").onmouseleave = function(event) { + RemovePreview(); + } + + document.getElementById("button_hover_background").onmouseenter = function(event) { + RemovePreview(); + document.querySelectorAll(".button").forEach(function(s){s.classList.add("hover_blinking");}); + } + document.getElementById("button_hover_background").onmouseleave = function(event) { + RemovePreview(); + } + + + + document.getElementById("button_icons_hover").onmouseenter = function(event) { + RemovePreview(); + document.querySelectorAll(".button_img").forEach(function(s){s.classList.remove("hover_blinking");}); + } + document.getElementById("button_icons_hover").onmouseleave = function(event) { + RemovePreview(); + } + + document.getElementById("button_hover_border").onmouseenter = function(event) { + RemovePreview(); + document.querySelectorAll(".button").forEach(function(s){s.classList.add("hover_border_blinking");}); + } + document.getElementById("button_hover_border").onmouseleave = function(event) { + RemovePreview(); + } + + document.getElementById("options_tab_list_scrollbar_width_up").onmouseenter = function(event) { + document.getElementById("group_scrollbar").style.backgroundColor = "red"; + document.getElementById("group_scrollbar_thumb").style.backgroundColor = "red"; + } + document.getElementById("options_tab_list_scrollbar_width_down").onmouseenter = function(event) { + document.getElementById("group_scrollbar").style.backgroundColor = "red"; + document.getElementById("group_scrollbar_thumb").style.backgroundColor = "red"; + } + + document.getElementById("options_tab_list_scrollbar_width_up").onmouseleave = function(event) { + document.getElementById("group_scrollbar").style.backgroundColor = ""; + document.getElementById("group_scrollbar_thumb").style.backgroundColor = ""; + } + document.getElementById("options_tab_list_scrollbar_width_down").onmouseleave = function(event) { + document.getElementById("group_scrollbar").style.backgroundColor = ""; + document.getElementById("group_scrollbar_thumb").style.backgroundColor = ""; + } + + + + document.getElementById("options_tab_list_scrollbar_height_up").onmouseenter = function(event) { + document.getElementById("pin_list_scrollbar").style.backgroundColor = "red"; + document.getElementById("pin_list_scrollbar_thumb").style.backgroundColor = "red"; + } + document.getElementById("options_tab_list_scrollbar_height_down").onmouseenter = function(event) { + document.getElementById("pin_list_scrollbar").style.backgroundColor = "red"; + document.getElementById("pin_list_scrollbar_thumb").style.backgroundColor = "red"; + } + + document.getElementById("options_tab_list_scrollbar_height_up").onmouseleave = function(event) { + document.getElementById("pin_list_scrollbar").style.backgroundColor = ""; + document.getElementById("pin_list_scrollbar_thumb").style.backgroundColor = ""; + } + document.getElementById("options_tab_list_scrollbar_height_down").onmouseleave = function(event) { + document.getElementById("pin_list_scrollbar").style.backgroundColor = ""; + document.getElementById("pin_list_scrollbar_thumb").style.backgroundColor = ""; + } + // --------------------------------------COLOR PICKER--------------------------------------------------------------------- - // change fonts weight - $(document).on("mousedown", ".font_weight_normal, .font_weight_bold", function(event) { + // change fonts weight && style + document.querySelectorAll(".font_weight_normal, .font_weight_bold, .font_style_normal, .font_style_italic").forEach(function(s){s.onmousedown = function(event) { event.stopPropagation(); - SelectedTheme["ColorsSet"][this.id] = $(this).is(".font_weight_normal") ? "normal" : "bold"; + // if this.classList.contains("font_weight_normal") || this.classList.contains("font_style_normal") + let FontStyle = "normal"; + if (this.classList.contains("font_weight_bold")) { + FontStyle = "bold"; + } + if (this.classList.contains("font_style_italic")) { + FontStyle = "italic"; + } + SelectedTheme["ColorsSet"][this.id] = FontStyle; ApplyColorsSet(SelectedTheme["ColorsSet"]); - SaveTheme($("#theme_list").val()); - }); - - // change fonts style - $(document).on("mousedown", ".font_style_normal, .font_style_italic", function(event) { - event.stopPropagation(); - SelectedTheme["ColorsSet"][this.id] = $(this).is(".font_style_normal") ? "normal" : "italic"; - ApplyColorsSet(SelectedTheme["ColorsSet"]); - SaveTheme($("#theme_list").val()); - }); - - + SaveTheme(document.getElementById("theme_list").value); + }}); + // show color picker - $(document).on("click", ".pick_col", function(event) { - RemoveRedPreview(); + document.querySelectorAll(".pick_col").forEach(function(s){s.onclick = function(event) {if (event.which == 1) { + RemovePreview(); event.stopPropagation(); - PickColor = this.id; let bod = document.getElementById("body"); let color = window.getComputedStyle(bod, null).getPropertyValue("--"+this.id); - $("#color_picker")[0].value = color.replace(" ", ""); - $("#color_picker").click(); - }); - $(document).on("input", "#color_picker", function(event) { - event.stopPropagation(); - SelectedTheme["ColorsSet"][PickColor] = $("#color_picker")[0].value; + let ColorPicker = document.getElementById("color_picker"); + ColorPicker.setAttribute("PickColor", this.id); + ColorPicker.value = color.replace(" ", ""); + ColorPicker.click(); + }}}); + + document.getElementById("color_picker").oninput = function(event) { + let ColorPicker = document.getElementById("color_picker"); + SelectedTheme["ColorsSet"][this.getAttribute("PickColor")] = ColorPicker.value; ApplyColorsSet(SelectedTheme["ColorsSet"]); - SaveTheme($("#theme_list").val()); - }); - - + // SaveTheme(document.getElementById("theme_list").value); + } + document.getElementById("color_picker").onchange = function(event) { + SaveTheme(document.getElementById("theme_list").value); + } + + // ----------------------------------EVENTS FOR CHECKBOXES AND DROPDOWN MENUS--------------------------------------------- + // set checkbox options on/off and save - $(document).on("click", ".bg_opt", function(event) { - opt[this.id] = $(this)[0].checked ? true : false; + document.querySelectorAll(".bg_opt").forEach(function(s){s.onclick = function(event) {if (event.which == 1) { + opt[this.id] = this.checked ? true : false; + if (this.checked) { + if (this.id == "never_show_close") { + document.getElementById("always_show_close").disabled = true; + } + if (this.id == "promote_children") { + document.getElementById("promote_children_in_first_child").disabled = false; + } + } else { + if (this.id == "never_show_close") { + document.getElementById("always_show_close").disabled = false; + } + if (this.id == "promote_children") { + document.getElementById("promote_children_in_first_child").disabled = true; + } + } SavePreferences(); - }); + }}}); + // options that need reload - $(document).on("click", "#syncro_tabbar_tabs_order, #allow_pin_close, #switch_with_scroll, #always_show_close, #never_show_close, #close_other_trees, #show_counter_tabs, #show_counter_tabs_hints, #syncro_tabbar_tabs_order, #syncro_tabbar_groups_tabs_order", function(event) { - chrome.runtime.sendMessage({command: "reload_sidebar"}); - }); - - // options that need a total reload - $(document).on("click", "#groups_toolbar_default", function(event) { - chrome.runtime.sendMessage({command: "reload"}); - chrome.runtime.sendMessage({command: "reload_sidebar"}); - location.reload(); - }); + document.onclick = function(event) {if (event.which == 1) { + if (event.target.id == "show_toolbar" || event.target.id == "syncro_tabbar_tabs_order" || event.target.id == "allow_pin_close" || event.target.id == "switch_with_scroll" || event.target.id == "always_show_close" || event.target.id == "never_show_close" || + event.target.id == "collapse_other_trees" || event.target.id == "show_counter_tabs" || event.target.id == "show_counter_tabs_hints" || event.target.id == "syncro_tabbar_tabs_order" || event.target.id == "syncro_tabbar_groups_tabs_order" || event.target.id == "groups_toolbar_default") { + chrome.runtime.sendMessage({command: "reload_sidebar"}); + } + if (event.target.id == "groups_toolbar_default") { + chrome.runtime.sendMessage({command: "reload"}); + setTimeout(function() { + location.reload(); + }, 300); + } + }} // set dropdown menu options - $("#append_child_tab, #append_child_tab_after_limit, #after_closing_active_tab, #append_orphan_tab").change(function() { - opt[this.id] = $(this).val(); - SavePreferences(); - }); + for (let i = 0; i < DropDownList.length; i++) { + document.getElementById(DropDownList[i]).onchange = function(event) { +console.log(opt[this.id]); +console.log(this.value); + opt[this.id] = this.value; + SavePreferences(); + chrome.runtime.sendMessage({command: "reload_sidebar"}); + } + } - // set tabs tree depth option - $(document).on("input", "#max_tree_depth", function(event) { - opt.max_tree_depth = $(this)[0].value; + document.getElementById("max_tree_depth").oninput = function(event) { + opt.max_tree_depth = parseInt(this.value); SavePreferences(); - }); - + chrome.runtime.sendMessage({command: "reload_sidebar"}); + } // set toolbar on/off and show/hide all toolbar options - $(document).on("click", "#show_toolbar", function(event) { - SelectedTheme.ToolbarShow = $("#show_toolbar")[0].checked ? true : false; - SaveTheme($("#theme_list").val()); - LoadTheme($("#theme_list").val()); - }); + document.getElementById("show_toolbar").onclick = function(event) {if (event.which == 1) { + SelectedTheme.ToolbarShow = this.checked ? true : false; + RefreshFields(); + SaveTheme(document.getElementById("theme_list").value); + }} // ------------------------------OTHER------------------------------------------------------------------------------------ // block system dragging - $(document).bind("drop dragover", function(event) { + document.ondrop = function(event) { event.preventDefault(); - }); + } + document.ondragover = function(event) { + event.preventDefault(); + } -// ----------------------------TOOLBAR CUSTOMIZATION---------------------------------------------------------------------- - - - $(document).on("mousedown", ".button", function(event) { - $("#button_filter_clear").css({"opacity": "1", "position": "absolute"}); - if ($(this).is("#button_filter_type, #filter_search_go_prev, #filter_search_go_next")) { - return; - } - $(this).attr("draggable", "true"); - dragged_button = this; - }); +// ----------------------------RESET TOOLBAR BUTTON----------------------------------------------------------------------- - // set dragged button node - $(document).on("dragstart", ".button", function(event) { - event.originalEvent.dataTransfer.setData(" "," "); - event.originalEvent.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0); - }); - - // remove draggable attribute to clean html which will be saved in the toolbar - $(document).on("mouseleave", ".button", function(event) { - $(".button").removeAttr("draggable"); - }); - - - - // drag&drop buttons to lists - $(document).on("dragenter", "#toolbar_main, .toolbar_shelf, #toolbar_unused_buttons", function(event) { - if ($(dragged_button).is("#button_tools, #button_search, #button_groups, #button_backup, #button_folders") && $(this).is(".toolbar_shelf")) { - return; - } - if (dragged_button.parentNode.id != this.id) { - // if ($(dragged_button).is("#button_tools, #button_search, #button_groups, #button_backup, #button_folders") && $(this).is("#toolbar_unused_buttons")) { - // $(".on").removeClass("on"); - // } - $("#"+dragged_button.id).appendTo($(this)); - } - }); - - // move (flip) buttons - $(document).on("dragenter", ".button", function(event) { - if ($(dragged_button).is("#button_tools, #button_search, #button_groups, #button_backup, #button_folders") && $(this).parent().is(".toolbar_shelf")) { - return; - } - if ($(this).parent().is("#toolbar_search, #toolbar_search_buttons")) { - return; - } - if ( $(this).index() <= $("#"+dragged_button.id).index()) { - $("#"+dragged_button.id).insertBefore($(this)); - } else { - $("#"+dragged_button.id).insertAfter($(this)); - } - }); - - // save toolbar - $(document).on("dragend", ".button", function(event) { - $("#button_filter_clear").css({"opacity": "0"}); - - SelectedTheme.toolbar = $("#toolbar").html(); - SelectedTheme.unused_buttons = $("#toolbar_unused_buttons").html(); - SaveTheme($("#theme_list").val()); - $("#button_filter_clear").css({"opacity": "1"}); - }); - - // reset toolbar - $(document).on("click", "#options_reset_toolbar_button", function(event) { + document.getElementById("options_reset_toolbar_button").onclick = function(event) {if (event.which == 1) { + SetToolbarEvents(true, false, false, ""); + RemoveToolbarEditEvents(); SelectedTheme["toolbar"] = DefaultToolbar; SelectedTheme["unused_buttons"] = ""; - $("#toolbar").html(DefaultToolbar); - $("#toolbar_unused_buttons").html(""); - SaveTheme($("#theme_list").val()); - $(".on").removeClass("on"); + document.getElementById("toolbar").innerHTML = DefaultToolbar; + document.getElementById("toolbar_unused_buttons").innerHTML = ""; + SaveTheme(document.getElementById("theme_list").value); + document.querySelectorAll(".on").forEach(function(s){s.classList.remove("on");}); RefreshGUI(); - }); + SetToolbarEvents(false, false, true, "click"); + AddEditToolbarEditEvents(); + }} // --------------------------------------THEME BUTTONS-------------------------------------------------------------------- // add new theme preset button - $(document).on("click", "#options_add_theme_button", function(event) { + document.getElementById("options_add_theme_button").onclick = function(event) {if (event.which == 1) { AddNewTheme(); - }); + }} // remove theme preset button - $(document).on("click", "#options_remove_theme_button", function(event) { + document.getElementById("options_remove_theme_button").onclick = function(event) {if (event.which == 1) { DeleteSelectedTheme(); - }); + }} // select theme from list - $("#theme_list").change(function() { - LoadTheme($(this).val()); - chrome.storage.local.set({current_theme: $(this).val()}); - }); + document.getElementById("theme_list").onchange = function(event) { + LoadTheme(this.value, true); + chrome.storage.local.set({current_theme: this.value}); + } // import theme preset button - $(document).on("click", "#options_import_theme_button", function(event) { - ShowOpenFileDialog("import_theme", ".tt_theme"); - }); - $(document).on("change", "#import_theme", function(event) { - ImportTheme(); - }); - + document.getElementById("options_import_theme_button").onclick = function(event) {if (event.which == 1) { + let inputFile = ShowOpenFileDialog("import_theme", ".tt_theme"); + inputFile.onchange = function(event) { + ImportTheme(); + } + }} + // export theme preset button - $(document).on("click", "#options_export_theme_button", function(event) { - if ($("#theme_list")[0].options.length == 0) { + document.getElementById("options_export_theme_button").onclick = function(event) {if (event.which == 1) { + if (document.getElementById("theme_list").options.length == 0) { alert(chrome.i18n.getMessage("options_no_theme_to_export")); } else { - SaveFile($("#theme_list").val() + ".tt_theme", SelectedTheme); + SaveFile(document.getElementById("theme_list").value + ".tt_theme", SelectedTheme); } - }); + }} // rename theme preset button - $(document).on("click", "#options_rename_theme_button", function(event) { + document.getElementById("options_rename_theme_button").onclick = function(event) {if (event.which == 1) { RenameSelectedTheme(); - }); + }} + // get themes + document.getElementById("options_share_theme_link").onclick = function(event) {if (event.which == 1) { + chrome.tabs.create({url: "https://drive.google.com/drive/folders/0B3jXQpRtOfvSelFrTEVHZEx3Nms?usp=sharing"}); + }} // -------------------------------INDENTATION ADJUSTMENT------------------------------------------------------------------ // change tabs size preset(down) - $(document).on("click", "#options_tabs_indentation_down", function(event) { + document.getElementById("options_tabs_indentation_down").onmousedown = function(event) { let bod = document.getElementById("body"); var indentation = parseInt((window.getComputedStyle(bod, null).getPropertyValue("--children_padding_left")).replace("p","").replace("x","")); if (indentation > 0) { indentation--; SelectedTheme["ColorsSet"]["children_padding_left"] = indentation+"px"; ApplyColorsSet(SelectedTheme["ColorsSet"]); - SaveTheme($("#theme_list").val()); + SaveTheme(document.getElementById("theme_list").value); } - }); + } // change tabs size preset(up) - $(document).on("click", "#options_tabs_indentation_up", function(event) { + document.getElementById("options_tabs_indentation_up").onmousedown = function(event) { let bod = document.getElementById("body"); var indentation = parseInt((window.getComputedStyle(bod, null).getPropertyValue("--children_padding_left")).replace("p","").replace("x","")); if (indentation < 50) { indentation++; SelectedTheme["ColorsSet"]["children_padding_left"] = indentation+"px"; ApplyColorsSet(SelectedTheme["ColorsSet"]); - SaveTheme($("#theme_list").val()); + SaveTheme(document.getElementById("theme_list").value); } - }); + } // --------------------------TABS ROUNDNESS ADJUSTMENT-------------------------------------------------------------------- // change tabs roundness preset(down) - $(document).on("click", "#options_tabs_roundness_down", function(event) { + document.getElementById("options_tabs_roundness_down").onmousedown = function(event) { let bod = document.getElementById("body"); var border_radius = parseInt((window.getComputedStyle(bod, null).getPropertyValue("--tab_header_border_radius").replace("p","").replace("x",""))); if (border_radius > 0) { border_radius--; SelectedTheme["ColorsSet"]["tab_header_border_radius"] = border_radius+"px"; ApplyColorsSet(SelectedTheme["ColorsSet"]); - SaveTheme($("#theme_list").val()); + SaveTheme(document.getElementById("theme_list").value); } - }); + } // change tabs roundness preset(up) - $(document).on("click", "#options_tabs_roundness_up", function(event) { + document.getElementById("options_tabs_roundness_up").onmousedown = function(event) { let bod = document.getElementById("body"); var border_radius = parseInt((window.getComputedStyle(bod, null).getPropertyValue("--tab_header_border_radius")).replace("p","").replace("x","")); if (border_radius < 25) { border_radius++; SelectedTheme["ColorsSet"]["tab_header_border_radius"] = border_radius+"px"; ApplyColorsSet(SelectedTheme["ColorsSet"]); - SaveTheme($("#theme_list").val()); + SaveTheme(document.getElementById("theme_list").value); } - }); + } // -------------------------------SIZE ADJUSTMENT------------------------------------------------------------------------- + // set tabs margins + document.getElementById("tabs_margin_spacing").onchange = function(event) { + let size = "0"; + if (this[1].checked) { + size = "1"; + } else { + if (this[2].checked) { + size = "2"; + } + } + SelectedTheme["TabsMargins"] = size; + ApplyTabsMargins(size); + SaveTheme(document.getElementById("theme_list").value); + } + + // change tabs size preset(down) - $(document).on("click", "#options_tabs_size_down", function(event) { + document.getElementById("options_tabs_size_down").onmousedown = function(event) { if (SelectedTheme["TabsSizeSetNumber"] > 0) { SelectedTheme["TabsSizeSetNumber"]--; ApplySizeSet(SelectedTheme["TabsSizeSetNumber"]); - ApplySizeOptionsSet(SelectedTheme["TabsSizeSetNumber"]); - SaveTheme($("#theme_list").val()); + SaveTheme(document.getElementById("theme_list").value); } - }); + } // change tabs size preset(up) - $(document).on("click", "#options_tabs_size_up", function(event) { + document.getElementById("options_tabs_size_up").onmousedown = function(event) { if (SelectedTheme["TabsSizeSetNumber"] < 4) { SelectedTheme["TabsSizeSetNumber"]++; ApplySizeSet(SelectedTheme["TabsSizeSetNumber"]); - ApplySizeOptionsSet(SelectedTheme["TabsSizeSetNumber"]); - SaveTheme($("#theme_list").val()); + SaveTheme(document.getElementById("theme_list").value); } - }); + } // -------------------------------TABS SCROLLBAR SIZE ADJUSTMENT---------------------------------------------------------- // change tab list scrollbar preset(down) - $(document).on("mousedown", "#options_tab_list_scrollbar_width_down", function(event) { + document.getElementById("options_tab_list_scrollbar_width_down").onmousedown = function(event) { let bod = document.getElementById("body"); var border_radius = parseInt((window.getComputedStyle(bod, null).getPropertyValue("--scrollbar_width").replace("p","").replace("x",""))); if (border_radius > 0) { border_radius--; SelectedTheme["ColorsSet"]["scrollbar_width"] = border_radius+"px"; ApplyColorsSet(SelectedTheme["ColorsSet"]); - SaveTheme($("#theme_list").val()); + SaveTheme(document.getElementById("theme_list").value); } - }); + } // change tab list scrollbar preset(up) - $(document).on("mousedown", "#options_tab_list_scrollbar_width_up", function(event) { + document.getElementById("options_tab_list_scrollbar_width_up").onmousedown = function(event) { let bod = document.getElementById("body"); var border_radius = parseInt((window.getComputedStyle(bod, null).getPropertyValue("--scrollbar_width")).replace("p","").replace("x","")); if (border_radius < 20) { border_radius++; SelectedTheme["ColorsSet"]["scrollbar_width"] = border_radius+"px"; ApplyColorsSet(SelectedTheme["ColorsSet"]); - SaveTheme($("#theme_list").val()); + SaveTheme(document.getElementById("theme_list").value); } - }); + } // change pin list scrollbar preset(down) - $(document).on("mousedown", "#options_tab_list_scrollbar_height_down", function(event) { + document.getElementById("options_tab_list_scrollbar_height_down").onmousedown = function(event) { let bod = document.getElementById("body"); var border_radius = parseInt((window.getComputedStyle(bod, null).getPropertyValue("--scrollbar_height").replace("p","").replace("x",""))); if (border_radius > 0) { border_radius--; SelectedTheme["ColorsSet"]["scrollbar_height"] = border_radius+"px"; ApplyColorsSet(SelectedTheme["ColorsSet"]); - SaveTheme($("#theme_list").val()); + SaveTheme(document.getElementById("theme_list").value); } - }); + } // change pin list scrollbar preset(up) - $(document).on("mousedown", "#options_tab_list_scrollbar_height_up", function(event) { + document.getElementById("options_tab_list_scrollbar_height_up").onmousedown = function(event) { let bod = document.getElementById("body"); var border_radius = parseInt((window.getComputedStyle(bod, null).getPropertyValue("--scrollbar_height")).replace("p","").replace("x","")); if (border_radius < 20) { border_radius++; SelectedTheme["ColorsSet"]["scrollbar_height"] = border_radius+"px"; ApplyColorsSet(SelectedTheme["ColorsSet"]); - SaveTheme($("#theme_list").val()); + SaveTheme(document.getElementById("theme_list").value); } - }); + } // ----------------------CLEAR DATA BUTTON-------------------------------------------------------------------------------- // clear data - $(document).on("click", "#options_clear_data", function(event) { + document.getElementById("options_clear_data").onclick = function(event) {if (event.which == 1) { chrome.storage.local.clear(); chrome.runtime.sendMessage({command: "reload"}); chrome.runtime.sendMessage({command: "reload_sidebar"}); - location.reload(); + setTimeout(function() { + location.reload(); + }, 300); + }} +} + +function RemoveToolbarEditEvents() { + document.querySelectorAll("#button_filter_clear").forEach(function(s){ + s.style.opacity = "0"; + }); + document.querySelectorAll(".button").forEach(function(s){ + s.removeAttribute("draggable"); }); } +function AddEditToolbarEditEvents() { + document.querySelectorAll("#button_filter_clear").forEach(function(s){ + s.style.opacity = "1"; + }); + document.querySelectorAll(".button_img").forEach(function(s){ + if (s.parentNode.id != "button_filter_type" || s.parentNode.id != "filter_search_go_prev" || s.parentNode.id != "filter_search_go_next") { + s.setAttribute("draggable", true); + s.onmousedown = function(event) { + if (event.which == 1) { + dragged_button = document.getElementById(this.parentNode.id); + } + } + s.ondragstart = function(event) { + event.dataTransfer.setData(" "," "); + event.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0); + } + // move (flip) buttons + s.ondragenter = function(event) { + if ((dragged_button.id == "button_tools" || dragged_button.id == "button_search" || dragged_button.id == "button_groups" || dragged_button.id == "button_backup" || dragged_button.id == "button_folders") && this.parentNode.parentNode.classList.contains("toolbar_shelf")) { + return; + } + let dragged_buttonIndex = Array.from(dragged_button.parentNode.children).indexOf(dragged_button); + let Index = Array.from(this.parentNode.parentNode.children).indexOf(this.parentNode); + + if (Index <= dragged_buttonIndex) { + this.parentNode.parentNode.insertBefore(dragged_button, this.parentNode); + } else { + if (this.parentNode.nextSibling != null) { + this.parentNode.parentNode.insertBefore(dragged_button, this.parentNode.nextSibling); + } else { + this.parentNode.parentNode.appendChild(dragged_button); + } + } + } + // save toolbar + s.ondragend = function(event) { + RemoveToolbarEditEvents(); + + SelectedTheme.toolbar = document.getElementById("toolbar").innerHTML; + SelectedTheme.unused_buttons = document.getElementById("toolbar_unused_buttons").innerHTML; + SaveTheme(document.getElementById("theme_list").value); + + AddEditToolbarEditEvents(); + } + } + }); + + + document.querySelectorAll("#toolbar_main, .toolbar_shelf:not(#toolbar_search), #toolbar_unused_buttons").forEach(function(s){s.ondragenter = function(event) { + if ((dragged_button.id == "button_tools" || dragged_button.id == "button_search" || dragged_button.id == "button_groups" || dragged_button.id == "button_backup" || dragged_button.id == "button_folders") && this.classList.contains("toolbar_shelf")) { + return; + } + if (dragged_button.parentNode.id != this.id) { + this.appendChild(dragged_button); + } + + }}); +} function copyStringToClipboard(string) { function handler (event){ diff --git a/options/options_color_border_hover - Copy.svg b/options/options_color_border_hover - Copy.svg deleted file mode 100644 index fa4efc9..0000000 --- a/options/options_color_border_hover - Copy.svg +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/options/options_tabs_margin_indicator.svg b/options/options_tabs_margin_indicator.svg new file mode 100644 index 0000000..4621692 --- /dev/null +++ b/options/options_tabs_margin_indicator.svg @@ -0,0 +1,129 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/options/refresh.js b/options/refresh.js index 0e1f5e7..23e76a8 100644 --- a/options/refresh.js +++ b/options/refresh.js @@ -4,28 +4,46 @@ // shrink or expand theme field function RefreshFields() { - if ($("#theme_list")[0].options.length == 0) { - $("#field_theme").css({"height": "45px"}); + if (document.getElementById("theme_list").options.length == 0) { + document.getElementById("field_theme").style.height = "45px"; } else { - $("#field_theme").css({"height": ""}); + document.getElementById("field_theme").style.height = ""; } if (browserId == "F") { - $("#scrollbar_size_indicator, #scrollbar_thumb, #scrollbar_thumb_hover, #scrollbar_track").hide(); + document.querySelectorAll("#scrollbar_size_indicator, #scrollbar_thumb, #scrollbar_thumb_hover, #scrollbar_track").forEach(function(s){ + s.style.display = "none"; + }); } if (browserId == "V") { - $("#url_for_web_panel").val(chrome.runtime.getURL("sidebar.html")); - $("#url_for_web_panel").prop("readonly", true); + let WebPanelUrlBox = document.getElementById("url_for_web_panel"); + WebPanelUrlBox.value = (chrome.runtime.getURL("sidebar.html")); + WebPanelUrlBox.setAttribute("readonly", true); } else{ - $("#field_vivaldi").hide(); + document.getElementById("field_vivaldi").style.display = "none"; + } + if (document.getElementById("show_toolbar").checked) { + document.querySelectorAll("#options_available_buttons, #sample_toolbar_block, #options_reset_toolbar_button").forEach(function(s){ + s.style.display = ""; + }); + document.getElementById("field_show_toolbar").style.height = ""; + } else{ + document.querySelectorAll("#options_available_buttons, #sample_toolbar_block, #options_reset_toolbar_button").forEach(function(s){ + s.style.display = "none"; + }); + document.getElementById("field_show_toolbar").style.height = "6"; } } function RefreshGUI() { - $("#button_filter_type").addClass("url").removeClass("title"); - if ($(".button").is(".on")) { - $("#toolbar").css({ "height": 53 }); + let button_filter_type = document.getElementById("button_filter_type"); + if (button_filter_type != null) { + button_filter_type.classList.add("url"); + button_filter_type.classList.remove("title"); + } + if (document.querySelector(".on") != null) { + document.getElementById("toolbar").style.height = "53px"; } else { - $("#toolbar").css({ "height": 26 }); + document.getElementById("toolbar").style.height = "26px"; } } diff --git a/options/sample_tabs.js b/options/sample_tabs.js index c5441c1..b4593a6 100644 --- a/options/sample_tabs.js +++ b/options/sample_tabs.js @@ -4,122 +4,123 @@ function AppendSampleTabs() { // pins - AppendTab({tab: {id: 0, pinned: true}, Append: true}); - AppendTab({tab: {id: 1, pinned: true, active: false}, Append: true}); + AppendTab({id: 0, pinned: true}, false, false, false, true, false, false, false, true, false, false); + AppendTab({id: 1, pinned: true, active: false}, false, false, false, true, false, false, false, true, false, false); - AppendTab({tab: {id: 10, pinned: true, active: false}, Append: true}); - $(".pin#10").addClass("attention"); + AppendTab({id: 10, pinned: true, active: false}, false, false, false, true, false, false, false, true, false, false); + document.getElementById("10").classList.add("attention"); - // regular tabs - AppendTab({tab: {id: 2, pinned: false}, Append: true}); - $("#tab_title2")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_normal"); + AppendTab({id: 2, pinned: false}, false, false, false, true, false, false, false, true, false, true); + document.getElementById("tab_title2").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_normal"); - AppendTab({tab: {id: 11, pinned: false}, Append: true, ParentId: "2"}); - $("#tab_title11")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_normal_hover"); - $("#tab_header11").addClass("tab_header_hover").addClass("close_show"); + AppendTab({id: 11, pinned: false}, "2", false, false, true, false, false, false, false, false, false); + document.getElementById("tab_title11").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_normal_hover"); + document.getElementById("tab_header11").classList.add("tab_header_hover"); + document.getElementById("tab_header11").classList.add("close_show"); - AppendTab({tab: {id: 12, pinned: false}, Append: true, ParentId: "2", AdditionalClass: "selected_tab"}); - $("#tab_title12")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_normal_selected"); + AppendTab({id: 12, pinned: false}, "2", false, false, true, false, false, "selected_tab", false, false, false); + document.getElementById("tab_title12").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_normal_selected"); - AppendTab({tab: {id: 13, pinned: false}, Append: true, ParentId: "2", AdditionalClass: "selected_tab"}); - $("#tab_title13")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_normal_selected_hover"); - $("#tab_header13").addClass("tab_header_hover").addClass("close_show"); - $("#close13").addClass("close_hover"); + AppendTab({id: 13, pinned: false}, "2", false, false, true, false, false, "selected_tab", false, false, false); + document.getElementById("tab_title13").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_normal_selected_hover"); + document.getElementById("tab_header13").classList.add("tab_header_hover") + document.getElementById("tab_header13").classList.add("close_show"); + document.getElementById("close13").classList.add("close_hover"); // regular active tabs - AppendTab({tab: {id: 3, pinned: false}, Append: true, ParentId: "2", AdditionalClass: "active_tab"}); - $("#tab_title3")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_active"); + AppendTab({id: 3, pinned: false}, "2", false, false, true, false, false, "active_tab", false, false, false); + document.getElementById("tab_title3").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_active"); - AppendTab({tab: {id: 15, pinned: false}, Append: true, ParentId: "2", AdditionalClass: "active_tab"}); - $("#tab_title15")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_active_hover"); - $("#tab_header15").addClass("tab_header_hover"); + AppendTab({id: 15, pinned: false}, "2", false, false, true, false, false, "active_tab", false, false, false); + document.getElementById("tab_title15").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_active_hover"); + document.getElementById("tab_header15").classList.add("tab_header_hover"); - AppendTab({tab: {id: 14, pinned: false}, Append: true, ParentId: "2", AdditionalClass: "c selected_tab active_tab"}); - $("#tab_title14")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_active_selected"); + AppendTab({id: 14, pinned: false}, "2", false, false, true, false, false, "c selected_tab active_tab", false, false, false); + document.getElementById("tab_title14").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_active_selected"); - AppendTab({tab: {id: 16, pinned: false}, Append: true, ParentId: "2", AdditionalClass: "c selected_tab active_tab"}); - $("#tab_title16")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_active_selected_hover"); - $("#tab_header16").addClass("tab_header_hover"); - $("#exp16").addClass("hover"); + AppendTab({id: 16, pinned: false}, "2", false, false, true, false, false, "c selected_tab active_tab", false, false, false); + document.getElementById("tab_title16").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_active_selected_hover"); + document.getElementById("tab_header16").classList.add("tab_header_hover"); + document.getElementById("exp16").classList.add("hover"); // discarded tabs - AppendTab({tab: {id: 5, pinned: false, discarded: true}, Append: true}); - $("#tab_title5")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_discarded"); + AppendTab({id: 5, pinned: false, discarded: true}, false, false, false, true, false, false, false, false, false, false); + document.getElementById("tab_title5").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_discarded"); - AppendTab({tab: {id: 17, pinned: false, discarded: true}, Append: true, ParentId: "5"}); - $("#tab_title17")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_discarded_hover"); - $("#tab_header17").addClass("tab_header_hover"); + AppendTab({id: 17, pinned: false, discarded: true}, "5", false, false, true, false, false, false, false, false, false); + document.getElementById("tab_title17").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_discarded_hover"); + document.getElementById("tab_header17").classList.add("tab_header_hover"); - AppendTab({tab: {id: 19, pinned: false, discarded: true}, Append: true, ParentId: "5", AdditionalClass: "selected_tab"}); - $("#tab_title19")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_discarded_selected"); + AppendTab({id: 19, pinned: false, discarded: true}, "5", false, false, true, false, false, "selected_tab", false, false, false); + document.getElementById("tab_title19").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_discarded_selected"); - AppendTab({tab: {id: 20, pinned: false, discarded: true}, Append: true, ParentId: "5", AdditionalClass: "selected_tab"}); - $("#tab_title20")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_discarded_selected_hover"); - $("#tab_header20").addClass("tab_header_hover"); + AppendTab({id: 20, pinned: false, discarded: true}, "5", false, false, true, false, false, "selected_tab", false, false, false); + document.getElementById("tab_title20").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_discarded_selected_hover"); + document.getElementById("tab_header20").classList.add("tab_header_hover"); // search result - AppendTab({tab: {id: 6, pinned: false}, Append: true, AdditionalClass: "filtered"}); - $("#tab_title6")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result"); + AppendTab({id: 6, pinned: false}, false, false, false, true, false, false, "filtered", false, false, false); + document.getElementById("tab_title6").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result"); - AppendTab({tab: {id: 21, pinned: false}, Append: true, ParentId: "6", AdditionalClass: "filtered"}); - $("#tab_title21")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_hover"); - $("#tab_header21").addClass("tab_header_hover"); + AppendTab({id: 21, pinned: false}, "6", false, false, true, false, false, "filtered", false, false, false); + document.getElementById("tab_title21").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_hover"); + document.getElementById("tab_header21").classList.add("tab_header_hover"); - AppendTab({tab: {id: 22, pinned: false}, Append: true, ParentId: "6", AdditionalClass: "filtered active_tab"}); - $("#tab_title22")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_active"); + AppendTab({id: 22, pinned: false}, "6", false, false, true, false, false, "filtered active_tab", false, false, false); + document.getElementById("tab_title22").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_active"); - AppendTab({tab: {id: 23, pinned: false}, Append: true, ParentId: "6", AdditionalClass: "filtered active_tab"}); - $("#tab_title23")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_active_hover"); - $("#tab_header23").addClass("tab_header_hover"); + AppendTab({id: 23, pinned: false}, "6", false, false, true, false, false, "filtered active_tab", false, false, false); + document.getElementById("tab_title23").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_active_hover"); + document.getElementById("tab_header23").classList.add("tab_header_hover"); // search result selected - AppendTab({tab: {id: 8, pinned: false}, Append: true, ParentId: "6", AdditionalClass: "selected_tab filtered"}); - $("#tab_title8")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_selected"); + AppendTab({id: 8, pinned: false}, "6", false, false, true, false, false, "selected_tab filtered", false, false, false); + document.getElementById("tab_title8").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_selected"); - AppendTab({tab: {id: 18, pinned: false}, Append: true, ParentId: "6", AdditionalClass: "selected_tab filtered"}); - $("#tab_title18")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_selected_hover"); - $("#tab_header18").addClass("tab_header_hover"); + AppendTab({id: 18, pinned: false}, "6", false, false, true, false, false, "selected_tab filtered", false, false, false); + document.getElementById("tab_title18").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_selected_hover"); + document.getElementById("tab_header18").classList.add("tab_header_hover"); - AppendTab({tab: {id: 25, pinned: false}, Append: true, ParentId: "6", AdditionalClass: "selected_tab filtered active_tab"}); - $("#tab_title25")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_selected_active"); + AppendTab({id: 25, pinned: false}, "6", false, false, true, false, false, "selected_tab filtered active_tab", false, false, false); + document.getElementById("tab_title25").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_selected_active"); - AppendTab({tab: {id: 26, pinned: false}, Append: true, ParentId: "6", AdditionalClass: "selected_tab filtered active_tab"}); - $("#tab_title26")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_selected_active_hover"); - $("#tab_header26").addClass("tab_header_hover"); + AppendTab({id: 26, pinned: false}, "6", false, false, true, false, false, "selected_tab filtered active_tab", false, false, false); + document.getElementById("tab_title26").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_selected_active_hover"); + document.getElementById("tab_header26").classList.add("tab_header_hover"); // search result highlighted - AppendTab({tab: {id: 30, pinned: false}, Append: true, AdditionalClass: "filtered highlighted_search"}); - $("#tab_title30")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_highlighted"); + AppendTab({id: 30, pinned: false}, false, false, false, true, false, false, "filtered highlighted_search", false, false, false); + document.getElementById("tab_title30").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_highlighted"); - AppendTab({tab: {id: 31, pinned: false}, Append: true, ParentId: "30", AdditionalClass: "filtered highlighted_search"}); - $("#tab_title31")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_highlighted_hover"); - $("#tab_header31").addClass("tab_header_hover"); + AppendTab({id: 31, pinned: false}, "30", false, false, true, false, false, "filtered highlighted_search", false, false, false); + document.getElementById("tab_title31").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_highlighted_hover"); + document.getElementById("tab_header31").classList.add("tab_header_hover"); - AppendTab({tab: {id: 32, pinned: false}, Append: true, ParentId: "30", AdditionalClass: "filtered highlighted_search active_tab"}); - $("#tab_title32")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_highlighted_active"); + AppendTab({id: 32, pinned: false}, "30", false, false, true, false, false, "filtered highlighted_search active_tab", false, false, false); + document.getElementById("tab_title32").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_highlighted_active"); - AppendTab({tab: {id: 33, pinned: false}, Append: true, ParentId: "30", AdditionalClass: "filtered highlighted_search active_tab"}); - $("#tab_title33")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_highlighted_active_hover"); - $("#tab_header33").addClass("tab_header_hover"); + AppendTab({id: 33, pinned: false}, "30", false, false, true, false, false, "filtered highlighted_search active_tab", false, false, false); + document.getElementById("tab_title33").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_highlighted_active_hover"); + document.getElementById("tab_header33").classList.add("tab_header_hover"); - AppendTab({tab: {id: 34, pinned: false}, Append: true, ParentId: "30", AdditionalClass: "selected_tab filtered highlighted_search"}); - $("#tab_title34")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_highlighted_selected"); + AppendTab({id: 34, pinned: false}, "30", false, false, true, false, false, "selected_tab filtered highlighted_search", false, false, false); + document.getElementById("tab_title34").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_highlighted_selected"); - AppendTab({tab: {id: 35, pinned: false}, Append: true, ParentId: "30", AdditionalClass: "selected_tab filtered highlighted_search"}); - $("#tab_title35")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_highlighted_selected_hover"); - $("#tab_header35").addClass("tab_header_hover"); + AppendTab({id: 35, pinned: false}, "30", false, false, true, false, false, "selected_tab filtered highlighted_search", false, false, false); + document.getElementById("tab_title35").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_highlighted_selected_hover"); + document.getElementById("tab_header35").classList.add("tab_header_hover"); - AppendTab({tab: {id: 36, pinned: false}, Append: true, ParentId: "30", AdditionalClass: "selected_tab filtered highlighted_search active_tab"}); - $("#tab_title36")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_highlighted_selected_active"); + AppendTab({id: 36, pinned: false}, "30", false, false, true, false, false, "selected_tab filtered highlighted_search active_tab", false, false, false); + document.getElementById("tab_title36").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_highlighted_selected_active"); - AppendTab({tab: {id: 37, pinned: false}, Append: true, ParentId: "30", AdditionalClass: "selected_tab filtered highlighted_search active_tab"}); - $("#tab_title37")[0].textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_highlighted_selected_active_hover"); - $("#tab_header37").addClass("tab_header_hover"); - - $("#_tab_list").addClass("active_group"); + AppendTab({id: 37, pinned: false}, "30", false, false, true, false, false, "selected_tab filtered highlighted_search active_tab", false, false, false); + document.getElementById("tab_title37").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_highlighted_selected_active_hover"); + document.getElementById("tab_header37").classList.add("tab_header_hover"); + + document.getElementById("_tab_list").classList.add("active_group"); } \ No newline at end of file diff --git a/options/theme.js b/options/theme.js index e4c977e..e31faed 100644 --- a/options/theme.js +++ b/options/theme.js @@ -2,7 +2,12 @@ // Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ -function LoadTheme(themeName) { +function LoadTheme(themeName, reloadSidebar) { + + document.querySelectorAll(".theme_buttons").forEach(function(s){ + s.disabled = true; + }); + chrome.storage.local.get(null, function(items) { if (items.themes[themeName]) { SelectedTheme = Object.assign({}, items.themes[themeName]); @@ -12,22 +17,52 @@ function LoadTheme(themeName) { current_theme = ""; } setTimeout(function() { - $("#new_theme_name")[0].value = themeName; + document.getElementById("new_theme_name").value = themeName; setTimeout(function() { + + SetToolbarEvents(true, false, false, ""); + RemoveToolbarEditEvents(); + ApplySizeSet(SelectedTheme["TabsSizeSetNumber"]); ApplyColorsSet(SelectedTheme["ColorsSet"]); - ApplySizeOptionsSet(SelectedTheme["TabsSizeSetNumber"]); - $("#toolbar").html(SelectedTheme.toolbar); - $("#toolbar_unused_buttons").html(SelectedTheme.unused_buttons); + + document.getElementById("_gtetab_list").style.color = ""; + document.getElementById("_gtetab_list2").style.color = ""; + + document.getElementById("toolbar").innerHTML = SelectedTheme.toolbar; + document.getElementById("toolbar_unused_buttons").innerHTML = SelectedTheme.unused_buttons; + if (browserId == "F") { - $(".button#button_load_bak1, .button#button_load_bak2, .button#button_load_bak3").remove(); + document.querySelectorAll("#button_load_bak1, #button_load_bak2, #button_load_bak3").forEach(function(s){ + s.parentNode.removeChild(s); + }); } - SelectedTheme.ToolbarShow = $("#show_toolbar")[0].checked = SelectedTheme.ToolbarShow; - $("#field_show_toolbar").css({"height": $("#show_toolbar")[0].checked ? "" : "6"}); - SelectedTheme.ToolbarShow ? $("#options_available_buttons, #toolbar, #toolbar_colors").show() : $("#options_available_buttons, #toolbar, #toolbar_colors").hide(); - $(".on").removeClass("on"); + + document.getElementById("show_toolbar").checked = SelectedTheme.ToolbarShow; + + if (SelectedTheme["TabsMargins"]) { + document.getElementById("tabs_margin_spacing")[SelectedTheme["TabsMargins"]].checked = true; + ApplyTabsMargins(SelectedTheme["TabsMargins"]); + } else { + document.getElementById("tabs_margin_spacing")["2"].checked = true; + } + + document.querySelectorAll(".on").forEach(function(s){ + s.classList.remove("on"); + }); + + SetToolbarEvents(false, false, true, "click"); + AddEditToolbarEditEvents(); + RefreshFields(); RefreshGUI(); - chrome.runtime.sendMessage({command: "reload_theme", themeName: "theme"+themeName}); + if (reloadSidebar) { + chrome.runtime.sendMessage({command: "reload_theme", themeName: "theme"+themeName}); + } + + document.querySelectorAll(".theme_buttons").forEach(function(s){ + s.disabled = false; + }); + }, 200); }, 200); }); @@ -42,45 +77,72 @@ function SaveTheme(themeName) { }); } function AddNewTheme() { - if (themes.indexOf($("#new_theme_name")[0].value) != -1) { - alert(chrome.i18n.getMessage("options_there_is_a_theme_with_this_name")); - return; - } - if ($("#new_theme_name")[0].value == "") { + + let ThemeList = document.getElementById("theme_list"); + let ThemeNameBox = document.getElementById("new_theme_name"); + let NewName = ThemeNameBox.value; + + if (ThemeNameBox.value == "") { alert(chrome.i18n.getMessage("options_theme_name_cannot_be_empty")); return; } - $("#toolbar").html(DefaultToolbar); + + document.getElementById("toolbar").innerHTML = DefaultToolbar; + SelectedTheme = Object.assign({}, DefaultTheme); SelectedTheme["ColorsSet"] = {}; DefaultTheme["ColorsSet"] = {}; - themes.push($("#new_theme_name")[0].value); - var t_list = document.getElementById("theme_list"); - var theme_name = document.createElement("option"); - theme_name.value = $("#new_theme_name")[0].value; - theme_name.text = theme_name.value; - t_list.add(theme_name); - $("#theme_list")[0].selectedIndex = $("#theme_list")[0].options.length-1; - SaveTheme(theme_name.value); + + if (themes.indexOf(NewName) != -1) { + while (themes.indexOf(NewName) != -1) { + let matched = NewName.match(/\(\d+\)+/); + if (matched != null && matched.length > 0) { + NewName = NewName.replace(matched[0], ("(" + (parseInt(matched[0].match(/\d+/)[0]) + 1 ) + ")") ); + } else { + NewName = NewName + "(1)"; + } + } + } + + + ThemeNameBox.value = NewName; + SelectedTheme["theme_name"] = NewName; + + themes.push(NewName); + + let ThemeNameOption = document.createElement("option"); + + ThemeNameOption.value = NewName; + ThemeNameOption.text = NewName; + + ThemeList.add(ThemeNameOption); + ThemeList.selectedIndex = ThemeList.options.length-1; + + SaveTheme(NewName); setTimeout(function() { - LoadTheme(theme_name.value); - }, 500); - chrome.storage.local.set({current_theme: $("#theme_list").val()}); + LoadTheme(NewName, true); + }, 50); + + chrome.storage.local.set({current_theme: NewName}); RefreshFields(); } function DeleteSelectedTheme() { chrome.storage.local.get(null, function(items) { let LSthemes = items.themes ? Object.assign({}, items.themes) : {}; - themes.splice(themes.indexOf($("#theme_list").val()), 1); + + let ThemeList = document.getElementById("theme_list"); + + themes.splice(ThemeList.selectedIndex, 1); if (LSthemes[current_theme]) { delete LSthemes[current_theme]; } chrome.storage.local.set({themes: LSthemes}); - var x = document.getElementById("theme_list"); - x.remove(x.selectedIndex); - current_theme = ($("#theme_list")[0].options.length > 0) ? $("#theme_list").val() : "Default"; + + ThemeList.remove(ThemeList.selectedIndex); + + current_theme = (ThemeList.options.length > 0) ? ThemeList.value : "Default"; chrome.storage.local.set({current_theme: current_theme}); - if ($("#theme_list")[0].options.length == 0) { + if (ThemeList.options.length == 0) { SelectedTheme = Object.assign({}, DefaultTheme); SelectedTheme["ColorsSet"] = {}; chrome.storage.local.set({themes: {}}); @@ -88,29 +150,34 @@ function DeleteSelectedTheme() { chrome.runtime.sendMessage({command: "reload_theme", themeName: ""}); }, 500); } - LoadTheme(current_theme); + LoadTheme(current_theme, true); RefreshFields(); }); } function RenameSelectedTheme() { - if (themes.indexOf($("#new_theme_name")[0].value) != -1) { + + let ThemeNameBox = document.getElementById("new_theme_name"); + + if (themes.indexOf(ThemeNameBox.value) != -1) { alert(chrome.i18n.getMessage("options_there_is_a_theme_with_this_name")); return; } - if ($("#new_theme_name")[0].value == "") { + if (ThemeNameBox.value == "") { alert(chrome.i18n.getMessage("options_theme_name_cannot_be_empty")); return; } chrome.storage.local.get(null, function(items) { let LSthemes = items.themes ? Object.assign({}, items.themes) : {}; - SelectedTheme["theme_name"] = $("#new_theme_name")[0].value; - let t_list = document.getElementById("theme_list"); - t_list.options[t_list.selectedIndex].value = t_list.options[t_list.selectedIndex].text = SelectedTheme["theme_name"]; - LSthemes[SelectedTheme["theme_name"]] = SelectedTheme; + SelectedTheme["theme_name"] = ThemeNameBox.value; + let ThemeList = document.getElementById("theme_list"); + ThemeList.options[ThemeList.selectedIndex].value = ThemeNameBox.value; + ThemeList.options[ThemeList.selectedIndex].text = ThemeNameBox.value; + LSthemes[ThemeNameBox.value] = SelectedTheme; if (LSthemes[current_theme]) { delete LSthemes[current_theme]; } - current_theme = SelectedTheme["theme_name"]; + current_theme = ThemeNameBox.value; + themes[ThemeList.selectedIndex] = ThemeNameBox.value; chrome.storage.local.set({themes: LSthemes}); chrome.storage.local.set({current_theme: current_theme}); }); @@ -122,7 +189,7 @@ function ImportTheme() { fr.readAsText(file.files[0]); fr.onload = function() { var data = fr.result; - file.remove(); + file.parentNode.removeChild(file); var themeObj = JSON.parse(data); if (themeObj.theme_version > DefaultTheme["theme_version"]) { alert(chrome.i18n.getMessage("options_loaded_theme_newer_version")); @@ -146,38 +213,39 @@ function ImportTheme() { if (themeObj.theme_version == 2) { SelectedTheme["unused_buttons"] = themeObj["unused_buttons"]; } + if (themeObj.theme_version == 3) { + SelectedTheme["TabsMargins"] = themeObj["TabsMargins"]; + } if (themes.indexOf(themeObj.theme_name) == -1) { SelectedTheme["theme_name"] = themeObj.theme_name; } else { - SelectedTheme["theme_name"] = themeObj.theme_name + "(1)"; + let NewName = themeObj.theme_name; + while (themes.indexOf(NewName) != -1) { + let matched = NewName.match(/\(\d+\)+/); + if (matched != null && matched.length > 0) { + NewName = NewName.replace(matched[0], ("(" + (parseInt(matched[0].match(/\d+/)[0]) + 1 ) + ")") ); + } else { + NewName = NewName + "(1)"; + } + } + SelectedTheme["theme_name"] = NewName; } themes.push(SelectedTheme["theme_name"]); SaveTheme(SelectedTheme["theme_name"]); - var t_list = document.getElementById("theme_list"); + var ThemeList = document.getElementById("theme_list"); var theme_name = document.createElement("option"); theme_name.value = SelectedTheme["theme_name"]; theme_name.text = theme_name.value; - t_list.add(theme_name); - $("#theme_list")[0].selectedIndex = $("#theme_list")[0].options.length-1; + ThemeList.add(theme_name); + ThemeList.selectedIndex = ThemeList.options.length-1; current_theme = SelectedTheme["theme_name"]; - $("#new_theme_name")[0].value = current_theme; + document.createElement("new_theme_name").value = current_theme; setTimeout(function() { - LoadTheme(current_theme); + LoadTheme(current_theme, true); }, 500); RefreshFields(); DefaultTheme["ColorsSet"] = {}; chrome.storage.local.set({current_theme: current_theme}); } } -} -function ApplySizeOptionsSet(size){ - for (let si = 0; si < document.styleSheets.length; si++) { - if ((document.styleSheets[si].ownerNode.id).match("size_settings") != null) { - if (document.styleSheets[si].ownerNode.id == "size_settings_"+size) { - document.styleSheets.item(si).disabled = false; - } else { - document.styleSheets.item(si).disabled = true; - } - } - } } \ No newline at end of file diff --git a/options/theme_size_settings_0.css b/options/theme_size_settings_0.css deleted file mode 100644 index ae48b6f..0000000 --- a/options/theme_size_settings_0.css +++ /dev/null @@ -1,168 +0,0 @@ -/* OPTIONS IMAGES */ -.font_color {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_color.svg);} -.font_color:hover {background-image: url(../options/options_font_color_hover.svg);} -.font_weight_normal {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_style_normal.svg);} -.font_weight_normal:hover {background-image: url(../options/options_font_style_normal_hover.svg);} -.font_weight_bold {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_weight_bold.svg);} -.font_weight_bold:hover {background-image: url(../options/options_font_weight_bold_hover.svg);} -.font_style_normal {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_style_normal.svg);} -.font_style_normal:hover {background-image: url(../options/options_font_style_normal_hover.svg);} -.font_style_italic {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_style_italic.svg);} -.font_style_italic:hover {background-image: url(../options/options_font_style_italic_hover.svg);} - -.color_toolbar_icon {z-index: 10000; position: absolute; display: block; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_toolbar_icon.svg);} -.color_toolbar_icon:hover {background-image: url(../options/options_color_toolbar_icon_hover.svg);} - -.color_bucket {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_bucket.svg);} -.color_bucket:hover {background-image: url(../options/options_color_bucket_hover.svg);} - -.color_brush {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_brush.svg);} -.color_brush:hover {background-image: url(../options/options_color_brush_hover.svg);} - -.color_border {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_border.svg);} -.color_border:hover {background-image: url(../options/options_color_border_hover.svg);} - -.color_x {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_x.svg);} -.color_x:hover {background-image: url(../options/options_color_x_hover.svg);} - -.options_button_minus {z-index: 10000; display: float; position: absolute; top: 5px; left: 6px; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_scale_minus.svg);} -.options_button_minus:hover {background-image: url(../options/options_scale_minus_hover.svg);} -.options_button_plus {z-index: 10000; display: float; position: absolute; top: 5px; left: 54px; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_scale_plus.svg);} -.options_button_plus:hover {background-image: url(../options/options_scale_plus_hover.svg);} - -@keyframes hover_blinking { - 0% {background-color: transparent;} - 100% {background-color: blue;} -} -.hover_blinking { - animation: hover_blinking 1s infinite; -} - -@keyframes hover_border_blinking { - 0% {border: 1px solid transparent;} - 100% {border: 1px solid blue;} -} -.hover_border_blinking { - animation: hover_border_blinking 1s infinite; -} - -/* MAIN TOOLBAR */ -#toolbar_background { top: 0px; left: 307px; } -#toolbar_border_bottom { top: 0px; left: 328px; } - -#button_icons { top: 0px; left: 59px; } -#button_icons_hover { top: 0px; left: 80px; } - -#button_background { top: 0px; left: 4px; } -#button_hover_background { top: 0px; left: 25px; } - -#button_border { top: 0px; left: 115px; } -#button_hover_border { top: 0px; left: 136px; } - -#filter_box_font { top: 0px; left: 175px; } -#filter_clear_icon { top: 0px; left: 238px; } -#filter_box_background { top: 0px; left: 196px; } -#filter_box_border { top: 0px; left: 217px; } - - -/* BIG OPTIONS BUTTONS */ -#options_tabs_indentation_indicator { z-index: 3000; display: float; position: absolute; top: 25px; left: 550px; height: 30px; width: 80px; background-size: 80px 30px; background-image: url(../options/options_tabs_indentation_indicator.svg);} -#options_tabs_roundness_indicator { z-index: 3000; display: float; position: absolute; top: 25px; left: 640px; height: 30px; width: 80px; background-size: 80px 30px; background-image: url(../options/options_tabs_roundness_indicator.svg);} -#options_tabs_size_indicator { z-index: 3000; display: float; position: absolute; top: 25px; left: 730px; height: 30px; width: 80px; background-size: 80px 30px; background-image: url(../options/options_tabs_size_indicator.svg);} - -/* SCROLLBAR RESIZE */ -#scrollbar_size_indicator {z-index: 3000; display: float; position: absolute; top: 20px; left: 335px; height: 80px; width: 80px; background-size: 80px 80px; background-image: url(../options/options_scrollbar_size_indicator.svg); } -#options_tab_list_scrollbar_width_down { left: 3px; top: 30px; } -#options_tab_list_scrollbar_width_up { left: 57px; top: 30px; } -#options_tab_list_scrollbar_height_up { left: 30px; top: 3px; } -#options_tab_list_scrollbar_height_down { left: 30px; top: 57px; } - - -/* PIN LIST AND SCROLLBAR */ -#pin_list { position: absolute; height: calc(var(--scrollbar_height) + var(--pin_height)); width: 788px; top: 30px; left: 20px;} - -#pin_list_scrollbar { position: absolute; height: var(--scrollbar_height); width: 790px; top: calc(var(--pin_height) + 31px); left: 20px; z-index: 1000; background-color: var(--scrollbar_track); } -#pin_list_scrollbar_thumb { position: relative; height: 100%; width: 100px; top: 0px; left: 0px; z-index: 1200; background-color: var(--scrollbar_thumb); } -#pin_list_scrollbar_thumb:hover { background-color: var(--scrollbar_thumb_hover); } - - - -/* PINS */ -#pin_list_options_block {z-index: 2000; position:absolute; width: 500px; height: var(--pin_height); top: 30px; left: 20px; margin: 0; /* background:rgba(0,0,255,0.1); */ } -#pin_list_background { top: 1px; left: 187px; } -#pin_list_border_bottom { top: 1px; left: 164px; } - - -/* ATTENTION PIN */ -#attention_background { top: 1px; left: 72px; } -#attention_border { top: 1px; left: 93px; } - - - -/* TAB LIST AND SCROLLBAR */ -#tab_list { position: absolute; height: 800px; width: calc(770px - var(--scrollbar_width)); top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); left: 40px; z-index: 1000 } - -#group_scrollbar { position: absolute; height: 800px; width: var(--scrollbar_width); top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); left: calc(810px - var(--scrollbar_width)); z-index: 1000; background-color: var(--scrollbar_track); } -#group_scrollbar_thumb { position: relative; height: 200px; width: 100%; top: 140px; left: 0px; z-index: 1000; background-color: var(--scrollbar_thumb); } -#group_scrollbar_thumb:hover { background-color: var(--scrollbar_thumb_hover); } -#scrollbar_thumb { position: absolute; top: 370px; left: 790px; } -#scrollbar_thumb_hover { position: absolute; top: 390px; left: 790px; } -#scrollbar_track { position: absolute; top: 410px; left: 790px; } - -#Tabs { - --row_image_size: 16px 16px; -} -/* TABS */ -#tabs_options_block {z-index: 2000; position:absolute; width: 740px; height: auto; top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); left: 50px; margin: 0; /* background:rgba(0,255,0,0.5); */ } - -.tab_color_options_row {z-index: 2000; position:relative; width: 740px; height: 18px; /* background:rgba(255,0,0,0.1); */ } -.tab_color_options_row>.color_border {top: 1px; left: 659px; background-size: var(--row_image_size);} -.tab_color_options_row>.color_bucket {top: 1px; left: 680px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_color {top: 1px; left: 509px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_weight_normal {top: 1px; left: 538px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_weight_bold {top: 1px; left: 559px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_style_normal {top: 1px; left: 588px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_style_italic {top: 1px; left: 609px; background-size: var(--row_image_size);} - - -/* DRAG AND DROP INDICATOR */ -#dd19 { display: inline-block; border-bottom: 2px solid var(--drag_indicator); } -#drag_indicator { top: 8px; left: 350px; background-size: var(--row_image_size);} - - -/* CLOSE TAB BUTTON OPTIONS */ -#close_x { top: 0px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} -#close_hover_x { top: -14px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} -#close_hover_border { top: 2px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} -#close_hover_background { top: 18px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} - - -/* CLOSE TAB BUTTON OPTIONS */ -#expand_hover_background { top: 1px; left: calc(var(--children_padding_left) - 18px); background-size: var(--row_image_size);} -#expand_closed_background { top: 1px; left: calc(var(--children_padding_left) - 18px); background-size: var(--row_image_size);} -#expand_open_background { top: 1px; left: -12px; background-size: var(--row_image_size);} - - -#tab_list_background { top: 835px; left: 50px; } - - - -#toolbar_groups_block { position: absolute; left: 20px; top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); width: 19px; height: 800px; background-color: var(--group_list_background); border-right: 1px solid var(--group_list_borders); overflow: visible; } -#_gtetab_list { width: 200px; height: 20px; } -#_gtetab_list2 { width: 200px; height: 20px; } -#_tab_list2:hover { background-color: var(--group_list_button_hover_background); } - -#group_list_background { top: 835px; left: 20px; } -#group_list_borders { top: 631px; left: 20px; } -#group_list_default_font_color { top: 652px; left: 20px; } -#group_list_button_hover_background { top: 610px; left: 20px; } - - -/* MENU */ -#tabs_menu_border { top: 59px; left: 80px; } -#tabs_menu_background { top: 59px; left: 102px; } -#tabs_menu_font { top: 36px; left: 102px; } -#tabs_menu_hover_border { top: 14px; left: 80px; } -#tabs_menu_hover_background { top: 14px; left: 102px; } -#tabs_menu_separator { top: 36px; left: 80px; } - diff --git a/options/theme_size_settings_1.css b/options/theme_size_settings_1.css deleted file mode 100644 index b18a0f4..0000000 --- a/options/theme_size_settings_1.css +++ /dev/null @@ -1,168 +0,0 @@ -/* OPTIONS IMAGES */ -.font_color {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_color.svg);} -.font_color:hover {background-image: url(../options/options_font_color_hover.svg);} -.font_weight_normal {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_style_normal.svg);} -.font_weight_normal:hover {background-image: url(../options/options_font_style_normal_hover.svg);} -.font_weight_bold {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_weight_bold.svg);} -.font_weight_bold:hover {background-image: url(../options/options_font_weight_bold_hover.svg);} -.font_style_normal {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_style_normal.svg);} -.font_style_normal:hover {background-image: url(../options/options_font_style_normal_hover.svg);} -.font_style_italic {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_style_italic.svg);} -.font_style_italic:hover {background-image: url(../options/options_font_style_italic_hover.svg);} - -.color_toolbar_icon {z-index: 10000; position: absolute; display: block; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_toolbar_icon.svg);} -.color_toolbar_icon:hover {background-image: url(../options/options_color_toolbar_icon_hover.svg);} - -.color_bucket {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_bucket.svg);} -.color_bucket:hover {background-image: url(../options/options_color_bucket_hover.svg);} - -.color_brush {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_brush.svg);} -.color_brush:hover {background-image: url(../options/options_color_brush_hover.svg);} - -.color_border {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_border.svg);} -.color_border:hover {background-image: url(../options/options_color_border_hover.svg);} - -.color_x {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_x.svg);} -.color_x:hover {background-image: url(../options/options_color_x_hover.svg);} - -.options_button_minus {z-index: 10000; display: float; position: absolute; top: 5px; left: 6px; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_scale_minus.svg);} -.options_button_minus:hover {background-image: url(../options/options_scale_minus_hover.svg);} -.options_button_plus {z-index: 10000; display: float; position: absolute; top: 5px; left: 54px; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_scale_plus.svg);} -.options_button_plus:hover {background-image: url(../options/options_scale_plus_hover.svg);} - -@keyframes hover_blinking { - 0% {background-color: transparent;} - 100% {background-color: blue;} -} -.hover_blinking { - animation: hover_blinking 1s infinite; -} - -@keyframes hover_border_blinking { - 0% {border: 1px solid transparent;} - 100% {border: 1px solid blue;} -} -.hover_border_blinking { - animation: hover_border_blinking 1s infinite; -} - -/* MAIN TOOLBAR */ -#toolbar_background { top: 0px; left: 307px; } -#toolbar_border_bottom { top: 0px; left: 328px; } - -#button_icons { top: 0px; left: 59px; } -#button_icons_hover { top: 0px; left: 80px; } - -#button_background { top: 0px; left: 4px; } -#button_hover_background { top: 0px; left: 25px; } - -#button_border { top: 0px; left: 115px; } -#button_hover_border { top: 0px; left: 136px; } - -#filter_box_font { top: 0px; left: 175px; } -#filter_clear_icon { top: 0px; left: 238px; } -#filter_box_background { top: 0px; left: 196px; } -#filter_box_border { top: 0px; left: 217px; } - - -/* BIG OPTIONS BUTTONS */ -#options_tabs_indentation_indicator { z-index: 3000; display: float; position: absolute; top: 25px; left: 550px; height: 30px; width: 80px; background-size: 80px 30px; background-image: url(../options/options_tabs_indentation_indicator.svg);} -#options_tabs_roundness_indicator { z-index: 3000; display: float; position: absolute; top: 25px; left: 640px; height: 30px; width: 80px; background-size: 80px 30px; background-image: url(../options/options_tabs_roundness_indicator.svg);} -#options_tabs_size_indicator { z-index: 3000; display: float; position: absolute; top: 25px; left: 730px; height: 30px; width: 80px; background-size: 80px 30px; background-image: url(../options/options_tabs_size_indicator.svg);} - -/* SCROLLBAR RESIZE */ -#scrollbar_size_indicator {z-index: 3000; display: float; position: absolute; top: 20px; left: 335px; height: 80px; width: 80px; background-size: 80px 80px; background-image: url(../options/options_scrollbar_size_indicator.svg); } -#options_tab_list_scrollbar_width_down { left: 3px; top: 30px; } -#options_tab_list_scrollbar_width_up { left: 57px; top: 30px; } -#options_tab_list_scrollbar_height_up { left: 30px; top: 3px; } -#options_tab_list_scrollbar_height_down { left: 30px; top: 57px; } - - -/* PIN LIST AND SCROLLBAR */ -#pin_list { position: absolute; height: calc(var(--scrollbar_height) + var(--pin_height)); width: 788px; top: 30px; left: 20px;} - -#pin_list_scrollbar { position: absolute; height: var(--scrollbar_height); width: 790px; top: calc(var(--pin_height) + 31px); left: 20px; z-index: 1000; background-color: var(--scrollbar_track); } -#pin_list_scrollbar_thumb { position: relative; height: 100%; width: 100px; top: 0px; left: 0px; z-index: 1200; background-color: var(--scrollbar_thumb); } -#pin_list_scrollbar_thumb:hover { background-color: var(--scrollbar_thumb_hover); } - - - -/* PINS */ -#pin_list_options_block {z-index: 2000; position:absolute; width: 500px; height: var(--pin_height); top: 30px; left: 20px; margin: 0; /* background:rgba(0,0,255,0.1); */ } -#pin_list_background { top: 1px; left: 187px; } -#pin_list_border_bottom { top: 1px; left: 164px; } - - -/* ATTENTION PIN */ -#attention_background { top: 1px; left: 72px; } -#attention_border { top: 1px; left: 93px; } - - - -/* TAB LIST AND SCROLLBAR */ -#tab_list { position: absolute; height: 800px; width: calc(770px - var(--scrollbar_width)); top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); left: 40px; z-index: 1000 } - -#group_scrollbar { position: absolute; height: 800px; width: var(--scrollbar_width); top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); left: calc(810px - var(--scrollbar_width)); z-index: 1000; background-color: var(--scrollbar_track); } -#group_scrollbar_thumb { position: relative; height: 200px; width: 100%; top: 140px; left: 0px; z-index: 1000; background-color: var(--scrollbar_thumb); } -#group_scrollbar_thumb:hover { background-color: var(--scrollbar_thumb_hover); } -#scrollbar_thumb { position: absolute; top: 370px; left: 790px; } -#scrollbar_thumb_hover { position: absolute; top: 390px; left: 790px; } -#scrollbar_track { position: absolute; top: 410px; left: 790px; } - -#Tabs { - --row_image_size: 18px 18px; -} -/* TABS */ -#tabs_options_block {z-index: 2000; position:absolute; width: 740px; height: auto; top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); left: 50px; margin: 0; /* background:rgba(0,255,0,0.5); */ } - -.tab_color_options_row {z-index: 2000; position:relative; width: 740px; height: 20px; /* background:rgba(255,0,0,0.1); */ } -.tab_color_options_row>.color_border {top: 1px; left: 659px; background-size: var(--row_image_size);} -.tab_color_options_row>.color_bucket {top: 1px; left: 680px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_color {top: 1px; left: 509px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_weight_normal {top: 1px; left: 538px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_weight_bold {top: 1px; left: 559px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_style_normal {top: 1px; left: 588px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_style_italic {top: 1px; left: 609px; background-size: var(--row_image_size);} - - -/* DRAG AND DROP INDICATOR */ -#dd19 { display: inline-block; border-bottom: 2px solid var(--drag_indicator); } -#drag_indicator { top: 8px; left: 350px; background-size: var(--row_image_size);} - - -/* CLOSE TAB BUTTON OPTIONS */ -#close_x { top: 0px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} -#close_hover_x { top: -16px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} -#close_hover_border { top: 2px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} -#close_hover_background { top: 20px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} - - -/* CLOSE TAB BUTTON OPTIONS */ -#expand_hover_background { top: 1px; left: calc(var(--children_padding_left) - 18px); background-size: var(--row_image_size);} -#expand_closed_background { top: 1px; left: calc(var(--children_padding_left) - 18px); background-size: var(--row_image_size);} -#expand_open_background { top: 1px; left: -12px; background-size: var(--row_image_size);} - - -#tab_list_background { top: 835px; left: 50px; } - - - -#toolbar_groups_block { position: absolute; left: 20px; top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); width: 19px; height: 800px; background-color: var(--group_list_background); border-right: 1px solid var(--group_list_borders); overflow: visible; } -#_gtetab_list { width: 200px; height: 20px; } -#_gtetab_list2 { width: 200px; height: 20px; } -#_tab_list2:hover { background-color: var(--group_list_button_hover_background); } - -#group_list_background { top: 835px; left: 20px; } -#group_list_borders { top: 631px; left: 20px; } -#group_list_default_font_color { top: 652px; left: 20px; } -#group_list_button_hover_background { top: 610px; left: 20px; } - - -/* MENU */ -#tabs_menu_border { top: 59px; left: 80px; } -#tabs_menu_background { top: 59px; left: 102px; } -#tabs_menu_font { top: 36px; left: 102px; } -#tabs_menu_hover_border { top: 14px; left: 80px; } -#tabs_menu_hover_background { top: 14px; left: 102px; } -#tabs_menu_separator { top: 36px; left: 80px; } - diff --git a/options/theme_size_settings_2.css b/options/theme_size_settings_2.css deleted file mode 100644 index bd8011c..0000000 --- a/options/theme_size_settings_2.css +++ /dev/null @@ -1,168 +0,0 @@ -/* OPTIONS IMAGES */ -.font_color {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_color.svg);} -.font_color:hover {background-image: url(../options/options_font_color_hover.svg);} -.font_weight_normal {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_style_normal.svg);} -.font_weight_normal:hover {background-image: url(../options/options_font_style_normal_hover.svg);} -.font_weight_bold {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_weight_bold.svg);} -.font_weight_bold:hover {background-image: url(../options/options_font_weight_bold_hover.svg);} -.font_style_normal {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_style_normal.svg);} -.font_style_normal:hover {background-image: url(../options/options_font_style_normal_hover.svg);} -.font_style_italic {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_style_italic.svg);} -.font_style_italic:hover {background-image: url(../options/options_font_style_italic_hover.svg);} - -.color_toolbar_icon {z-index: 10000; position: absolute; display: block; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_toolbar_icon.svg);} -.color_toolbar_icon:hover {background-image: url(../options/options_color_toolbar_icon_hover.svg);} - -.color_bucket {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_bucket.svg);} -.color_bucket:hover {background-image: url(../options/options_color_bucket_hover.svg);} - -.color_brush {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_brush.svg);} -.color_brush:hover {background-image: url(../options/options_color_brush_hover.svg);} - -.color_border {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_border.svg);} -.color_border:hover {background-image: url(../options/options_color_border_hover.svg);} - -.color_x {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_x.svg);} -.color_x:hover {background-image: url(../options/options_color_x_hover.svg);} - -.options_button_minus {z-index: 10000; display: float; position: absolute; top: 5px; left: 6px; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_scale_minus.svg);} -.options_button_minus:hover {background-image: url(../options/options_scale_minus_hover.svg);} -.options_button_plus {z-index: 10000; display: float; position: absolute; top: 5px; left: 54px; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_scale_plus.svg);} -.options_button_plus:hover {background-image: url(../options/options_scale_plus_hover.svg);} - -@keyframes hover_blinking { - 0% {background-color: transparent;} - 100% {background-color: blue;} -} -.hover_blinking { - animation: hover_blinking 1s infinite; -} - -@keyframes hover_border_blinking { - 0% {border: 1px solid transparent;} - 100% {border: 1px solid blue;} -} -.hover_border_blinking { - animation: hover_border_blinking 1s infinite; -} - -/* MAIN TOOLBAR */ -#toolbar_background { top: 0px; left: 307px; } -#toolbar_border_bottom { top: 0px; left: 328px; } - -#button_icons { top: 0px; left: 59px; } -#button_icons_hover { top: 0px; left: 80px; } - -#button_background { top: 0px; left: 4px; } -#button_hover_background { top: 0px; left: 25px; } - -#button_border { top: 0px; left: 115px; } -#button_hover_border { top: 0px; left: 136px; } - -#filter_box_font { top: 0px; left: 175px; } -#filter_clear_icon { top: 0px; left: 238px; } -#filter_box_background { top: 0px; left: 196px; } -#filter_box_border { top: 0px; left: 217px; } - - -/* BIG OPTIONS BUTTONS */ -#options_tabs_indentation_indicator { z-index: 3000; display: float; position: absolute; top: 25px; left: 550px; height: 30px; width: 80px; background-size: 80px 30px; background-image: url(../options/options_tabs_indentation_indicator.svg);} -#options_tabs_roundness_indicator { z-index: 3000; display: float; position: absolute; top: 25px; left: 640px; height: 30px; width: 80px; background-size: 80px 30px; background-image: url(../options/options_tabs_roundness_indicator.svg);} -#options_tabs_size_indicator { z-index: 3000; display: float; position: absolute; top: 25px; left: 730px; height: 30px; width: 80px; background-size: 80px 30px; background-image: url(../options/options_tabs_size_indicator.svg);} - -/* SCROLLBAR RESIZE */ -#scrollbar_size_indicator {z-index: 3000; display: float; position: absolute; top: 20px; left: 335px; height: 80px; width: 80px; background-size: 80px 80px; background-image: url(../options/options_scrollbar_size_indicator.svg); } -#options_tab_list_scrollbar_width_down { left: 3px; top: 30px; } -#options_tab_list_scrollbar_width_up { left: 57px; top: 30px; } -#options_tab_list_scrollbar_height_up { left: 30px; top: 3px; } -#options_tab_list_scrollbar_height_down { left: 30px; top: 57px; } - - -/* PIN LIST AND SCROLLBAR */ -#pin_list { position: absolute; height: calc(var(--scrollbar_height) + var(--pin_height)); width: 788px; top: 30px; left: 20px;} - -#pin_list_scrollbar { position: absolute; height: var(--scrollbar_height); width: 790px; top: calc(var(--pin_height) + 31px); left: 20px; z-index: 1000; background-color: var(--scrollbar_track); } -#pin_list_scrollbar_thumb { position: relative; height: 100%; width: 100px; top: 0px; left: 0px; z-index: 1200; background-color: var(--scrollbar_thumb); } -#pin_list_scrollbar_thumb:hover { background-color: var(--scrollbar_thumb_hover); } - - - -/* PINS */ -#pin_list_options_block {z-index: 2000; position:absolute; width: 500px; height: var(--pin_height); top: 30px; left: 20px; margin: 0; /* background:rgba(0,0,255,0.1); */ } -#pin_list_background { top: 3px; left: 187px; } -#pin_list_border_bottom { top: 3px; left: 164px; } - - -/* ATTENTION PIN */ -#attention_background { top: 3px; left: 72px; } -#attention_border { top: 3px; left: 93px; } - - - -/* TAB LIST AND SCROLLBAR */ -#tab_list { position: absolute; height: 800px; width: calc(770px - var(--scrollbar_width)); top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); left: 40px; z-index: 1000 } - -#group_scrollbar { position: absolute; height: 800px; width: var(--scrollbar_width); top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); left: calc(810px - var(--scrollbar_width)); z-index: 1000; background-color: var(--scrollbar_track); } -#group_scrollbar_thumb { position: relative; height: 200px; width: 100%; top: 140px; left: 0px; z-index: 1000; background-color: var(--scrollbar_thumb); } -#group_scrollbar_thumb:hover { background-color: var(--scrollbar_thumb_hover); } -#scrollbar_thumb { position: absolute; top: 370px; left: 790px; } -#scrollbar_thumb_hover { position: absolute; top: 390px; left: 790px; } -#scrollbar_track { position: absolute; top: 410px; left: 790px; } - -#Tabs { - --row_image_size: 20px 20px; -} -/* TABS */ -#tabs_options_block {z-index: 2000; position:absolute; width: 740px; height: auto; top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); left: 50px; margin: 0; /* background:rgba(0,255,0,0.5); */ } - -.tab_color_options_row {z-index: 2000; position:relative; width: 740px; height: 22px; /* background:rgba(255,0,0,0.1); */ } -.tab_color_options_row>.color_border {top: 1px; left: 659px; background-size: var(--row_image_size);} -.tab_color_options_row>.color_bucket {top: 1px; left: 680px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_color {top: 1px; left: 509px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_weight_normal {top: 1px; left: 538px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_weight_bold {top: 1px; left: 559px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_style_normal {top: 1px; left: 588px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_style_italic {top: 1px; left: 609px; background-size: var(--row_image_size);} - - -/* DRAG AND DROP INDICATOR */ -#dd19 { display: inline-block; border-bottom: 2px solid var(--drag_indicator); } -#drag_indicator { top: 8px; left: 350px; background-size: var(--row_image_size);} - - -/* CLOSE TAB BUTTON OPTIONS */ -#close_x { top: 0px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} -#close_hover_x { top: -18px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} -#close_hover_border { top: 2px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} -#close_hover_background { top: 22px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} - - -/* CLOSE TAB BUTTON OPTIONS */ -#expand_hover_background { top: 1px; left: calc(var(--children_padding_left) - 18px); background-size: var(--row_image_size);} -#expand_closed_background { top: 1px; left: calc(var(--children_padding_left) - 18px); background-size: var(--row_image_size);} -#expand_open_background { top: 1px; left: -12px; background-size: var(--row_image_size);} - - -#tab_list_background { top: 835px; left: 50px; } - - - -#toolbar_groups_block { position: absolute; left: 20px; top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); width: 19px; height: 800px; background-color: var(--group_list_background); border-right: 1px solid var(--group_list_borders); overflow: visible; } -#_gtetab_list { width: 200px; height: 20px; } -#_gtetab_list2 { width: 200px; height: 20px; } -#_tab_list2:hover { background-color: var(--group_list_button_hover_background); } - -#group_list_background { top: 835px; left: 20px; } -#group_list_borders { top: 631px; left: 20px; } -#group_list_default_font_color { top: 652px; left: 20px; } -#group_list_button_hover_background { top: 610px; left: 20px; } - - -/* MENU */ -#tabs_menu_border { top: 59px; left: 80px; } -#tabs_menu_background { top: 59px; left: 102px; } -#tabs_menu_font { top: 36px; left: 102px; } -#tabs_menu_hover_border { top: 14px; left: 80px; } -#tabs_menu_hover_background { top: 14px; left: 102px; } -#tabs_menu_separator { top: 36px; left: 80px; } - diff --git a/options/theme_size_settings_3.css b/options/theme_size_settings_3.css deleted file mode 100644 index 8c77241..0000000 --- a/options/theme_size_settings_3.css +++ /dev/null @@ -1,168 +0,0 @@ -/* OPTIONS IMAGES */ -.font_color {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_color.svg);} -.font_color:hover {background-image: url(../options/options_font_color_hover.svg);} -.font_weight_normal {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_style_normal.svg);} -.font_weight_normal:hover {background-image: url(../options/options_font_style_normal_hover.svg);} -.font_weight_bold {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_weight_bold.svg);} -.font_weight_bold:hover {background-image: url(../options/options_font_weight_bold_hover.svg);} -.font_style_normal {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_style_normal.svg);} -.font_style_normal:hover {background-image: url(../options/options_font_style_normal_hover.svg);} -.font_style_italic {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_style_italic.svg);} -.font_style_italic:hover {background-image: url(../options/options_font_style_italic_hover.svg);} - -.color_toolbar_icon {z-index: 10000; position: absolute; display: block; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_toolbar_icon.svg);} -.color_toolbar_icon:hover {background-image: url(../options/options_color_toolbar_icon_hover.svg);} - -.color_bucket {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_bucket.svg);} -.color_bucket:hover {background-image: url(../options/options_color_bucket_hover.svg);} - -.color_brush {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_brush.svg);} -.color_brush:hover {background-image: url(../options/options_color_brush_hover.svg);} - -.color_border {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_border.svg);} -.color_border:hover {background-image: url(../options/options_color_border_hover.svg);} - -.color_x {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_x.svg);} -.color_x:hover {background-image: url(../options/options_color_x_hover.svg);} - -.options_button_minus {z-index: 10000; display: float; position: absolute; top: 5px; left: 6px; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_scale_minus.svg);} -.options_button_minus:hover {background-image: url(../options/options_scale_minus_hover.svg);} -.options_button_plus {z-index: 10000; display: float; position: absolute; top: 5px; left: 54px; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_scale_plus.svg);} -.options_button_plus:hover {background-image: url(../options/options_scale_plus_hover.svg);} - -@keyframes hover_blinking { - 0% {background-color: transparent;} - 100% {background-color: blue;} -} -.hover_blinking { - animation: hover_blinking 1s infinite; -} - -@keyframes hover_border_blinking { - 0% {border: 1px solid transparent;} - 100% {border: 1px solid blue;} -} -.hover_border_blinking { - animation: hover_border_blinking 1s infinite; -} - -/* MAIN TOOLBAR */ -#toolbar_background { top: 0px; left: 307px; } -#toolbar_border_bottom { top: 0px; left: 328px; } - -#button_icons { top: 0px; left: 59px; } -#button_icons_hover { top: 0px; left: 80px; } - -#button_background { top: 0px; left: 4px; } -#button_hover_background { top: 0px; left: 25px; } - -#button_border { top: 0px; left: 115px; } -#button_hover_border { top: 0px; left: 136px; } - -#filter_box_font { top: 0px; left: 175px; } -#filter_clear_icon { top: 0px; left: 238px; } -#filter_box_background { top: 0px; left: 196px; } -#filter_box_border { top: 0px; left: 217px; } - - -/* BIG OPTIONS BUTTONS */ -#options_tabs_indentation_indicator { z-index: 3000; display: float; position: absolute; top: 25px; left: 550px; height: 30px; width: 80px; background-size: 80px 30px; background-image: url(../options/options_tabs_indentation_indicator.svg);} -#options_tabs_roundness_indicator { z-index: 3000; display: float; position: absolute; top: 25px; left: 640px; height: 30px; width: 80px; background-size: 80px 30px; background-image: url(../options/options_tabs_roundness_indicator.svg);} -#options_tabs_size_indicator { z-index: 3000; display: float; position: absolute; top: 25px; left: 730px; height: 30px; width: 80px; background-size: 80px 30px; background-image: url(../options/options_tabs_size_indicator.svg);} - -/* SCROLLBAR RESIZE */ -#scrollbar_size_indicator {z-index: 3000; display: float; position: absolute; top: 20px; left: 335px; height: 80px; width: 80px; background-size: 80px 80px; background-image: url(../options/options_scrollbar_size_indicator.svg); } -#options_tab_list_scrollbar_width_down { left: 3px; top: 30px; } -#options_tab_list_scrollbar_width_up { left: 57px; top: 30px; } -#options_tab_list_scrollbar_height_up { left: 30px; top: 3px; } -#options_tab_list_scrollbar_height_down { left: 30px; top: 57px; } - - -/* PIN LIST AND SCROLLBAR */ -#pin_list { position: absolute; height: calc(var(--scrollbar_height) + var(--pin_height)); width: 788px; top: 30px; left: 20px;} - -#pin_list_scrollbar { position: absolute; height: var(--scrollbar_height); width: 790px; top: calc(var(--pin_height) + 31px); left: 20px; z-index: 1000; background-color: var(--scrollbar_track); } -#pin_list_scrollbar_thumb { position: relative; height: 100%; width: 100px; top: 0px; left: 0px; z-index: 1200; background-color: var(--scrollbar_thumb); } -#pin_list_scrollbar_thumb:hover { background-color: var(--scrollbar_thumb_hover); } - - - -/* PINS */ -#pin_list_options_block {z-index: 2000; position:absolute; width: 500px; height: var(--pin_height); top: 30px; left: 20px; margin: 0; /* background:rgba(0,0,255,0.1); */ } -#pin_list_background { top: 3px; left: 187px; } -#pin_list_border_bottom { top: 3px; left: 164px; } - - -/* ATTENTION PIN */ -#attention_background { top: 3px; left: 72px; } -#attention_border { top: 3px; left: 93px; } - - - -/* TAB LIST AND SCROLLBAR */ -#tab_list { position: absolute; height: 800px; width: calc(770px - var(--scrollbar_width)); top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); left: 40px; z-index: 1000 } - -#group_scrollbar { position: absolute; height: 800px; width: var(--scrollbar_width); top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); left: calc(810px - var(--scrollbar_width)); z-index: 1000; background-color: var(--scrollbar_track); } -#group_scrollbar_thumb { position: relative; height: 200px; width: 100%; top: 140px; left: 0px; z-index: 1000; background-color: var(--scrollbar_thumb); } -#group_scrollbar_thumb:hover { background-color: var(--scrollbar_thumb_hover); } -#scrollbar_thumb { position: absolute; top: 370px; left: 790px; } -#scrollbar_thumb_hover { position: absolute; top: 390px; left: 790px; } -#scrollbar_track { position: absolute; top: 410px; left: 790px; } - -#Tabs { - --row_image_size: 20px 20px; -} -/* TABS */ -#tabs_options_block {z-index: 2000; position:absolute; width: 740px; height: auto; top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); left: 50px; margin: 0; /* background:rgba(0,255,0,0.5); */ } - -.tab_color_options_row {z-index: 2000; position:relative; width: 740px; height: 24px; /* background:rgba(255,0,0,0.1); */ } -.tab_color_options_row>.color_border {top: 2px; left: 659px; background-size: var(--row_image_size);} -.tab_color_options_row>.color_bucket {top: 2px; left: 680px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_color {top: 2px; left: 509px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_weight_normal {top: 2px; left: 538px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_weight_bold {top: 2px; left: 559px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_style_normal {top: 2px; left: 588px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_style_italic {top: 2px; left: 609px; background-size: var(--row_image_size);} - - -/* DRAG AND DROP INDICATOR */ -#dd19 { display: inline-block; border-bottom: 2px solid var(--drag_indicator); } -#drag_indicator { top: 8px; left: 350px; background-size: var(--row_image_size);} - - -/* CLOSE TAB BUTTON OPTIONS */ -#close_x { top: 0px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} -#close_hover_x { top: -18px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} -#close_hover_border { top: 2px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} -#close_hover_background { top: 22px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} - - -/* CLOSE TAB BUTTON OPTIONS */ -#expand_hover_background { top: 2px; left: calc(var(--children_padding_left) - 18px); background-size: var(--row_image_size);} -#expand_closed_background { top: 2px; left: calc(var(--children_padding_left) - 18px); background-size: var(--row_image_size);} -#expand_open_background { top: 2px; left: -12px; background-size: var(--row_image_size);} - - -#tab_list_background { top: 835px; left: 50px; } - - - -#toolbar_groups_block { position: absolute; left: 20px; top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); width: 19px; height: 800px; background-color: var(--group_list_background); border-right: 1px solid var(--group_list_borders); overflow: visible; } -#_gtetab_list { width: 200px; height: 20px; } -#_gtetab_list2 { width: 200px; height: 20px; } -#_tab_list2:hover { background-color: var(--group_list_button_hover_background); } - -#group_list_background { top: 835px; left: 20px; } -#group_list_borders { top: 631px; left: 20px; } -#group_list_default_font_color { top: 652px; left: 20px; } -#group_list_button_hover_background { top: 610px; left: 20px; } - - -/* MENU */ -#tabs_menu_border { top: 59px; left: 80px; } -#tabs_menu_background { top: 59px; left: 102px; } -#tabs_menu_font { top: 36px; left: 102px; } -#tabs_menu_hover_border { top: 14px; left: 80px; } -#tabs_menu_hover_background { top: 14px; left: 102px; } -#tabs_menu_separator { top: 36px; left: 80px; } - diff --git a/options/theme_size_settings_4.css b/options/theme_size_settings_4.css deleted file mode 100644 index 1c8910a..0000000 --- a/options/theme_size_settings_4.css +++ /dev/null @@ -1,168 +0,0 @@ -/* OPTIONS IMAGES */ -.font_color {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_color.svg);} -.font_color:hover {background-image: url(../options/options_font_color_hover.svg);} -.font_weight_normal {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_style_normal.svg);} -.font_weight_normal:hover {background-image: url(../options/options_font_style_normal_hover.svg);} -.font_weight_bold {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_weight_bold.svg);} -.font_weight_bold:hover {background-image: url(../options/options_font_weight_bold_hover.svg);} -.font_style_normal {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_style_normal.svg);} -.font_style_normal:hover {background-image: url(../options/options_font_style_normal_hover.svg);} -.font_style_italic {z-index: 1000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_font_style_italic.svg);} -.font_style_italic:hover {background-image: url(../options/options_font_style_italic_hover.svg);} - -.color_toolbar_icon {z-index: 10000; position: absolute; display: block; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_toolbar_icon.svg);} -.color_toolbar_icon:hover {background-image: url(../options/options_color_toolbar_icon_hover.svg);} - -.color_bucket {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_bucket.svg);} -.color_bucket:hover {background-image: url(../options/options_color_bucket_hover.svg);} - -.color_brush {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_brush.svg);} -.color_brush:hover {background-image: url(../options/options_color_brush_hover.svg);} - -.color_border {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_border.svg);} -.color_border:hover {background-image: url(../options/options_color_border_hover.svg);} - -.color_x {z-index: 10000; position: absolute; display: float; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_color_x.svg);} -.color_x:hover {background-image: url(../options/options_color_x_hover.svg);} - -.options_button_minus {z-index: 10000; display: float; position: absolute; top: 5px; left: 6px; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_scale_minus.svg);} -.options_button_minus:hover {background-image: url(../options/options_scale_minus_hover.svg);} -.options_button_plus {z-index: 10000; display: float; position: absolute; top: 5px; left: 54px; height: 20px; width: 20px; background-size: 20px 20px; background-image: url(../options/options_scale_plus.svg);} -.options_button_plus:hover {background-image: url(../options/options_scale_plus_hover.svg);} - -@keyframes hover_blinking { - 0% {background-color: transparent;} - 100% {background-color: blue;} -} -.hover_blinking { - animation: hover_blinking 1s infinite; -} - -@keyframes hover_border_blinking { - 0% {border: 1px solid transparent;} - 100% {border: 1px solid blue;} -} -.hover_border_blinking { - animation: hover_border_blinking 1s infinite; -} - -/* MAIN TOOLBAR */ -#toolbar_background { top: 0px; left: 307px; } -#toolbar_border_bottom { top: 0px; left: 328px; } - -#button_icons { top: 0px; left: 59px; } -#button_icons_hover { top: 0px; left: 80px; } - -#button_background { top: 0px; left: 4px; } -#button_hover_background { top: 0px; left: 25px; } - -#button_border { top: 0px; left: 115px; } -#button_hover_border { top: 0px; left: 136px; } - -#filter_box_font { top: 0px; left: 175px; } -#filter_clear_icon { top: 0px; left: 238px; } -#filter_box_background { top: 0px; left: 196px; } -#filter_box_border { top: 0px; left: 217px; } - - -/* BIG OPTIONS BUTTONS */ -#options_tabs_indentation_indicator { z-index: 3000; display: float; position: absolute; top: 25px; left: 550px; height: 30px; width: 80px; background-size: 80px 30px; background-image: url(../options/options_tabs_indentation_indicator.svg);} -#options_tabs_roundness_indicator { z-index: 3000; display: float; position: absolute; top: 25px; left: 640px; height: 30px; width: 80px; background-size: 80px 30px; background-image: url(../options/options_tabs_roundness_indicator.svg);} -#options_tabs_size_indicator { z-index: 3000; display: float; position: absolute; top: 25px; left: 730px; height: 30px; width: 80px; background-size: 80px 30px; background-image: url(../options/options_tabs_size_indicator.svg);} - -/* SCROLLBAR RESIZE */ -#scrollbar_size_indicator {z-index: 3000; display: float; position: absolute; top: 20px; left: 335px; height: 80px; width: 80px; background-size: 80px 80px; background-image: url(../options/options_scrollbar_size_indicator.svg); } -#options_tab_list_scrollbar_width_down { left: 3px; top: 30px; } -#options_tab_list_scrollbar_width_up { left: 57px; top: 30px; } -#options_tab_list_scrollbar_height_up { left: 30px; top: 3px; } -#options_tab_list_scrollbar_height_down { left: 30px; top: 57px; } - - -/* PIN LIST AND SCROLLBAR */ -#pin_list { position: absolute; height: calc(var(--scrollbar_height) + var(--pin_height)); width: 788px; top: 30px; left: 20px;} - -#pin_list_scrollbar { position: absolute; height: var(--scrollbar_height); width: 790px; top: calc(var(--pin_height) + 31px); left: 20px; z-index: 1000; background-color: var(--scrollbar_track); } -#pin_list_scrollbar_thumb { position: relative; height: 100%; width: 100px; top: 0px; left: 0px; z-index: 1200; background-color: var(--scrollbar_thumb); } -#pin_list_scrollbar_thumb:hover { background-color: var(--scrollbar_thumb_hover); } - - - -/* PINS */ -#pin_list_options_block {z-index: 2000; position:absolute; width: 500px; height: var(--pin_height); top: 30px; left: 20px; margin: 0; /* background:rgba(0,0,255,0.1); */ } -#pin_list_background { top: 4px; left: 187px; } -#pin_list_border_bottom { top: 4px; left: 164px; } - - -/* ATTENTION PIN */ -#attention_background { top: 4px; left: 72px; } -#attention_border { top: 4px; left: 93px; } - - - -/* TAB LIST AND SCROLLBAR */ -#tab_list { position: absolute; height: 800px; width: calc(770px - var(--scrollbar_width)); top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); left: 40px; z-index: 1000 } - -#group_scrollbar { position: absolute; height: 800px; width: var(--scrollbar_width); top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); left: calc(810px - var(--scrollbar_width)); z-index: 1000; background-color: var(--scrollbar_track); } -#group_scrollbar_thumb { position: relative; height: 200px; width: 100%; top: 140px; left: 0px; z-index: 1000; background-color: var(--scrollbar_thumb); } -#group_scrollbar_thumb:hover { background-color: var(--scrollbar_thumb_hover); } -#scrollbar_thumb { position: absolute; top: 370px; left: 790px; } -#scrollbar_thumb_hover { position: absolute; top: 390px; left: 790px; } -#scrollbar_track { position: absolute; top: 410px; left: 790px; } - -#Tabs { - --row_image_size: 20px 20px; -} -/* TABS */ -#tabs_options_block {z-index: 2000; position:absolute; width: 740px; height: auto; top: calc(var(--scrollbar_height) + var(--pin_height) + 36px); left: 50px; margin: 0; /* background:rgba(0,255,0,0.5); */ } - -.tab_color_options_row {z-index: 2000; position:relative; width: 740px; height: 26px; /* background:rgba(255,0,0,0.1); */ } -.tab_color_options_row>.color_border {top: 0px; left: 659px; background-size: var(--row_image_size);} -.tab_color_options_row>.color_bucket {top: 0px; left: 680px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_color {top: 0px; left: 509px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_weight_normal {top: 0px; left: 538px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_weight_bold {top: 0px; left: 559px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_style_normal {top: 0px; left: 588px; background-size: var(--row_image_size);} -.tab_color_options_row>.font_style_italic {top: 0px; left: 609px; background-size: var(--row_image_size);} - - -/* DRAG AND DROP INDICATOR */ -#dd19 { display: inline-block; border-bottom: 2px solid var(--drag_indicator); } -#drag_indicator { top: 8px; left: 350px; background-size: var(--row_image_size);} - - -/* CLOSE TAB BUTTON OPTIONS */ -#close_x { top: 0px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} -#close_hover_x { top: -20px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} -#close_hover_border { top: 0px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} -#close_hover_background { top: 20px; left: calc(753px - var(--scrollbar_width)); background-size: var(--row_image_size);} - - -/* CLOSE TAB BUTTON OPTIONS */ -#expand_hover_background { top: 0px; left: calc(var(--children_padding_left) - 18px); background-size: var(--row_image_size);} -#expand_closed_background { top: 0px; left: calc(var(--children_padding_left) - 18px); background-size: var(--row_image_size);} -#expand_open_background { top: 0px; left: -12px; background-size: var(--row_image_size);} - - -#tab_list_background { top: 835px; left: 50px; } - - - -#toolbar_groups_block { position: absolute; left: 20px; top: calc(var(--scrollbar_height) + var(--pin_height) + 32px); width: 19px; height: 800px; background-color: var(--group_list_background); border-right: 1px solid var(--group_list_borders); overflow: visible; } -#_gtetab_list { width: 200px; height: 20px; } -#_gtetab_list2 { width: 200px; height: 20px; } -#_tab_list2:hover { background-color: var(--group_list_button_hover_background); } - -#group_list_background { top: 835px; left: 20px; } -#group_list_borders { top: 631px; left: 20px; } -#group_list_default_font_color { top: 652px; left: 20px; } -#group_list_button_hover_background { top: 610px; left: 20px; } - - -/* MENU */ -#tabs_menu_border { top: 59px; left: 80px; } -#tabs_menu_background { top: 59px; left: 102px; } -#tabs_menu_font { top: 36px; left: 102px; } -#tabs_menu_hover_border { top: 14px; left: 80px; } -#tabs_menu_hover_background { top: 14px; left: 102px; } -#tabs_menu_separator { top: 36px; left: 80px; } - diff --git a/scripts/IO.js b/scripts/IO.js deleted file mode 100644 index f885d81..0000000 --- a/scripts/IO.js +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) 2017 kroppy. All rights reserved. -// Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license -// that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ - -// ********** KEYBOARD AND MOUSE *************** - -function BindTabsSwitchingToMouseWheel() { - // switch tabs with mouse scroll - $("#pin_list, .group").bind("mousewheel DOMMouseScroll", function(event) { - let prev = event.originalEvent.wheelDelta > 0 || event.originalEvent.detail < 0; - if (prev) { - ActivatePrevTab(); - } else { - ActivateNextTab(); - } - event.preventDefault(); - }); -} - -function SetIOEvents() { - if (!opt.switch_with_scroll) { - $("#pin_list").bind("mousewheel DOMMouseScroll", function(event) { - let direction = (event.originalEvent.wheelDelta > 0 || event.originalEvent.detail < 0) ? -1 : 1; - let speed = 0.1; - for (let t = 1; t < 40; t++) { - setTimeout(function() { - if (t < 30) { - speed = speed+0.1; // accelerate - } else { - speed = speed-0.3; // decelerate - } - $("#pin_list").scrollLeft($("#pin_list").scrollLeft()+(direction*speed)); - }, t); - } - }); - } - - // catch keyboard keys - $(document).keydown(function(event) { - if (MouseHoverOver == "pin_list") { - // ctrl+a to select all - if (event.ctrlKey && event.which == 65) { - $(".pin").addClass("selected_tab"); - } - // ctrl+i to invert selection - if (event.ctrlKey && event.which == 73) { - $(".pin").toggleClass("selected_tab"); - } - } - if (MouseHoverOver.match("g_|tab_list") !== null) { - // ctrl+a to select all - if (event.ctrlKey && event.which == 65) { - $("#ch"+active_group).children(".tab:visible").addClass("selected_tab"); - } - // ctrl+i to invert selection - if (event.ctrlKey && event.which == 73) { - $(".tab:visible").toggleClass("selected_tab"); - } - } - RefreshGUI(); - }); - - // remove middle mouse and set hiding menu - document.body.onmousedown = function(event) { - if (event.button == 1 && opt.close_with_MMB == true) { - event.preventDefault(); - } - if (event.button == 0 && !$(event.target).is(".menu_item")) { - $(".menu").hide(300); - } - }; -} diff --git a/scripts/backup.js b/scripts/backup.js index b14d465..f60b42b 100644 --- a/scripts/backup.js +++ b/scripts/backup.js @@ -3,31 +3,41 @@ // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ function ExportGroup(filename) { + if (opt.debug) { + console.log("function: ExportGroup, filename "+filename); + } let GroupToSave = { group: bggroups[active_group], folders: {}, tabs: [] }; - let lastId = parseInt($("#"+active_group+" .tab").last()[0].id); - $("#"+active_group+" .folder").each(function() { - if (bgfolders[this.id]) { - GroupToSave.folders[this.id] = bgfolders[this.id]; + document.querySelectorAll("#"+active_group+" .folder").forEach(function(s){ + if (bgfolders[s.id]) { + GroupToSave.folders[s.id] = bgfolders[s.id]; } - }) - $("#"+active_group+" .tab").each(function() { - chrome.tabs.get(parseInt(this.id), function(tab) { - if ((tab.url).startsWith("www") || (tab.url).startsWith("http") || (tab.url).startsWith("ftp")) { - (GroupToSave.tabs).push( - { - id: tab.id, - parent: $("#"+tab.id).parent().parent()[0].id, - index: $("#"+tab.id).index(), - expand: ($("#"+tab.id).is(".n") ? "n" : ($("#"+tab.id).is(".c") ? "c" : "o")), - url: tab.url - } - ); - } - if (tab.id == lastId) { - SaveFile(filename, GroupToSave); - } + }); + let Tabs = document.querySelectorAll("#"+active_group+" .tab"); + if (Tabs.length > 0) { + let lastId = parseInt(Tabs[Tabs.length-1].id); + Tabs.forEach(function(s){ + chrome.tabs.get(parseInt(s.id), function(tab) { + if ((tab.url).startsWith("www") || (tab.url).startsWith("http") || (tab.url).startsWith("ftp")) { + (GroupToSave.tabs).push( + { + id: tab.id, + parent: s.parentNode.parentNode.id, + index: Array.from(s.parentNode.children).indexOf(s), + expand: (s.classList.contains("c") ? "c" : (s.classList.contains("o") ? "o" : "")), + url: tab.url + } + ); + } + + if (tab.id == lastId) { + // if (opt.debug) { + // console.log(GroupToSave); + // } + SaveFile(filename, GroupToSave); + } + }); }); - }) + } } function ImportGroup() { let file = document.getElementById("file_import_group"); @@ -36,12 +46,12 @@ function ImportGroup() { fr.readAsText(file.files[0]); fr.onload = function() { let data = fr.result; - file.remove(); + file.parentNode.removeChild(file); let LoadedGroup = JSON.parse(data); let NewFolders = {}; let RefsTabs = {}; let NewTabs = []; - let NewGroupId = AddNewGroup({name: LoadedGroup.group.name, font: LoadedGroup.group.font}); + let NewGroupId = AddNewGroup(LoadedGroup.group.name, LoadedGroup.group.font); SetActiveGroup(NewGroupId, false, false); for (var folder in LoadedGroup.folders) { let newId = GenerateNewFolderID(); @@ -58,6 +68,13 @@ function ImportGroup() { RefsTabs[Tab.id] = new_tab.id; Tab.id = new_tab.id; NewTabs.push(Tab); + setTimeout(function() { + let nt = document.getElementById(new_tab.id); + let NewGroupTabs = document.getElementById("ct"+NewGroupId); + if (nt != null && NewGroupTabs != null) { + NewGroupTabs.appendChild(nt); + } + }, 1000); } if (NewTabs.length == LoadedGroup.tabs.length-1) { setTimeout(function() { @@ -89,10 +106,10 @@ function ExportSession(filename) { let ExportWindows = []; w.forEach(function(CWin) { if (CWin.tabs.length > 0) { - if (CWin.tabs.length > 100 && warn) { - alert(chrome.i18n.getMessage("warning_exporting_big_amount_of_tabs")); - warn = false; - } + // if (CWin.tabs.length > 100 && warn) { + // alert(chrome.i18n.getMessage("warning_exporting_big_amount_of_tabs")); + // warn = false; + // } windows[CWin.id]["id"] = CWin.id; windows[CWin.id]["tabs"] = []; CWin.tabs.forEach(function(CTab) { @@ -115,10 +132,10 @@ function ImportSession() { fr.readAsText(file.files[file.files.length-1]); fr.onload = function() { let data = fr.result; - file.remove(); + file.parentNode.removeChild(file); let LoadedWindows = JSON.parse(data); let RefsTabs = {}; - log(LoadedWindows); + if (opt.debug) console.log(LoadedWindows); LoadedWindows.forEach(function(LWin) { let NewTabs = []; let urls = []; @@ -152,15 +169,15 @@ function ImportSession() { } } function RearrangeTreeStructure(groups, folders, tabs) { // groups and folders are in object, just like bggroups and bgfolders, but tabs are in array of bgtreetabs objects - log("function: RearrangeTreeStructure"); + if (opt.debug) console.log("function: RearrangeTreeStructure"); chrome.tabs.query({currentWindow: true}, function(ChromeTabs) { - if (Object.keys(groups).length > 0) { + if (groups && Object.keys(groups).length > 0) { for (var group in groups) { bggroups[groups[group].id] = Object.assign({}, groups[group]); } AppendGroups(bggroups); } - if (Object.keys(folders).length > 0) { + if (folders && Object.keys(folders).length > 0) { for (var folder in folders) { bgfolders[folders[folder].id] = Object.assign({}, folders[folder]); } @@ -171,9 +188,13 @@ function RearrangeTreeStructure(groups, folders, tabs) { // groups and folders a if (Tab.parent == "pin_list") { chrome.tabs.update(Tab.id, {pinned: true}); } - if ($("#"+Tab.id)[0] && $("#ch"+Tab.parent)[0]) { - $("#ch"+Tab.parent).append($("#"+Tab.id)); - $("#"+Tab.id).addClass(Tab.expand); + let tb = document.getElementById(Tab.id); + let tbp = document.getElementById("ct"+Tab.parent); + if (tb != null && tbp != null) { + tbp.appendChild(tb); + if (Tab.expand != "") { + tb.classList.add(Tab.expand); + } } bgtabs[Tab.id] = {index: Tab.index, parent: Tab.parent, expand: Tab.expand}; }); @@ -189,21 +210,21 @@ function RearrangeTreeStructure(groups, folders, tabs) { // groups and folders a }); } function ImportMergeTabs() { - log("function: ImportMergeTabs"); + if (opt.debug) console.log("function: ImportMergeTabs"); let file = document.getElementById("file_import_merge_backup"); let fr = new FileReader(); if (file.files[0] == undefined) return; fr.readAsText(file.files[0]); fr.onload = function() { let data = fr.result; - file.remove(); + file.parentNode.removeChild(file); let lw = JSON.parse(data); let RefsWins = {}; let RefsTabs = {}; for (let LWI = 0; LWI < lw.length; LWI++) { // clear previous window ids lw[LWI].id = ""; } - log(lw); + if (opt.debug) console.log(lw); chrome.windows.getAll({windowTypes: ['normal'], populate: true}, function(cw) { for (let CWI = 0; CWI < cw.length; CWI++) { // loop Windows for (let LWI = 0; LWI < lw.length; LWI++) { // loop Loaded Windows @@ -219,17 +240,17 @@ function ImportMergeTabs() { } } } - log(tabsMatch); + if (opt.debug) console.log(tabsMatch); if (tabsMatch > lw[LWI].tabs.length*0.8) { lw[LWI].id = cw[CWI].id; break; } } } - log(lw); + if (opt.debug) console.log(lw); lw.forEach(function(w) { if (w.id == "") { // missing window, lets make one - log("missing window"); + if (opt.debug) console.log("missing window"); let NewTabs = []; let urls = []; (w.tabs).forEach(function(Tab) { @@ -261,7 +282,7 @@ function ImportMergeTabs() { } else { // window exists, lets add missing tabs - log("window exists"); + if (opt.debug) console.log("window exists"); let NewTabs = []; (w.tabs).forEach(function(Tab) { if (Tab.url != "") { // missing tab, lets make one diff --git a/scripts/chrome.js b/scripts/chrome.js index 455e7e6..3aa49ad 100644 --- a/scripts/chrome.js +++ b/scripts/chrome.js @@ -13,12 +13,13 @@ function StartChromeListeners() { }); } chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { - log("message to sidebar "+CurrentWindowId+": "); - log(message); if (message.command == "backup_available") { - $("#button_load_bak"+message.bak).removeClass("disabled"); + if (opt.debug) console.log("message to sidebar "+CurrentWindowId+": message: "+message.command); + document.getElementById("button_load_bak"+message.bak).classList.remove("disabled"); } if (message.command == "drag_drop") { + if (opt.debug) console.log("message to sidebar "+CurrentWindowId+": message: "+message.command); + if (opt.debug) console.log(message); DragAndDrop.ComesFromWindowId = message.ComesFromWindowId; DragAndDrop.DragNodeClass = message.DragNodeClass; DragAndDrop.Depth = message.Depth; @@ -27,8 +28,11 @@ function StartChromeListeners() { DragAndDrop.TabsIds = message.TabsIds; DragAndDrop.TabsIdsParents = message.TabsIdsParents; DragAndDrop.TabsIdsSelected = message.TabsIdsSelected; + DropTargetsFront(undefined, true, false); } if (message.command == "dropped") { + if (opt.debug) console.log("message to sidebar "+CurrentWindowId+": message: "+message.command); + if (opt.debug) console.log(message); DragAndDrop.DroppedToWindowId = message.DroppedToWindowId; if (Object.keys(DragAndDrop.Folders).length > 0 && message.DroppedToWindowId != CurrentWindowId) { for (var folder in DragAndDrop.Folders) @@ -37,18 +41,25 @@ function StartChromeListeners() { } } } + if (message.command == "dragend") { + CleanUpDragClasses(); + } if (message.command == "reload_sidebar") { + if (opt.debug) console.log("message to sidebar "+CurrentWindowId+": message: "+message.command); + if (opt.debug) console.log(message); window.location.reload(); } if (message.command == "reload_options") { + if (opt.debug) console.log("message to sidebar "+CurrentWindowId+": message: "+message.command); chrome.runtime.sendMessage({command: "get_preferences"}, function(response) { opt = Object.assign({}, response); setTimeout(function() { RestorePinListRowSettings(); - }, 200); + }, 200); }); } if (message.command == "reload_theme") { + if (opt.debug) console.log("message to sidebar "+CurrentWindowId+": message: "+message.command); setTimeout(function() { chrome.runtime.sendMessage({command: "get_theme", windowId: CurrentWindowId}, function(response) { RestorePinListRowSettings(); @@ -58,110 +69,150 @@ function StartChromeListeners() { }, 300); } if (message.windowId == CurrentWindowId) { - switch(message.command) { - case "tab_created": // if set to treat unparented tabs as active tab's child - if (opt.append_orphan_tab == "as_child" && message.tab.openerTabId == undefined && $("#"+active_group+" .active_tab")[0]) { - message.tab.openerTabId = $("#"+active_group+" .active_tab")[0].id; + + // I WANT TO MOVE THIS LOGIC TO THE BACKGROUND SCRIPT! + + if (message.command == "tab_created") { // if set to treat unparented tabs as active tab's child + + if (opt.debug) console.log("tab_created: "+message.tabId); + if (opt.debug) console.log("tab is pinned: "+message.tab.pinned); + + if (message.parentTabId != undefined) { + AppendTab(message.tab, message.parentTabId, false, false, true, message.index, true, false, false, true, false); + } else { + if (opt.append_orphan_tab == "as_child" && message.tab.openerTabId == undefined && document.querySelector("#"+active_group+" .active_tab")) { + if (opt.debug) console.log("ignore orphan case, append tab as child"); + message.tab.openerTabId = document.querySelector("#"+active_group+" .active_tab").id; } if (message.tab.openerTabId) { // child case if (opt.append_child_tab == "after_active") { - AppendTab({ tab: message.tab, InsertAfterId: $("#"+active_group+" .active_tab")[0] ? $("#"+active_group+" .active_tab")[0].id : undefined, Append: false, Scroll: true }); + if (opt.debug) console.log("child case, tab will append after active"); + AppendTab(message.tab, false, false, document.querySelector("#"+active_group+" .active_tab") != null ? document.querySelector("#"+active_group+" .active_tab").id : false, false, false, true, false, false, true, false); } else { - if (opt.max_tree_depth < 0 || (opt.max_tree_depth > 0 && $("#"+message.tab.openerTabId).parents(".tab").length < opt.max_tree_depth)) { // append to tree + let Parents = GetParentsByClass(document.getElementById(message.tab.openerTabId), "tab"); + if (opt.max_tree_depth < 0 || (opt.max_tree_depth > 0 && Parents.length < opt.max_tree_depth)) { // append to tree if (opt.append_child_tab == "top") { - AppendTab({ tab: message.tab, ParentId: message.tab.openerTabId, Append: false, Scroll: true }); + if (opt.debug) console.log("child case, in tree limit, tab will append on top"); + AppendTab(message.tab, message.tab.openerTabId, false, false, (message.tab.pinned ? true : false), false, true, false, false, true, false); } if (opt.append_child_tab == "bottom") { - AppendTab({ tab: message.tab, ParentId: message.tab.openerTabId, Append: true, Scroll: true }); + if (opt.debug) console.log("child case, in tree limit, tab will append on bottom"); + AppendTab(message.tab, message.tab.openerTabId, false, false, true, false, true, false, false, true, false); } } - if (opt.max_tree_depth > 0 && $("#"+message.tab.openerTabId).parents(".tab").length >= opt.max_tree_depth) { // if reached depth limit of the tree + if (opt.max_tree_depth > 0 && Parents.length >= opt.max_tree_depth) { // if reached depth limit of the tree + if (opt.debug) console.log("child case, surpassed tree limit"); if (opt.append_child_tab_after_limit == "after") { - AppendTab({ tab: message.tab, InsertAfterId: message.tab.openerTabId, Append: true, Scroll: true }); + if (opt.debug) console.log("tab will append after active"); + AppendTab(message.tab, false, false, message.tab.openerTabId, true, false, true, false, false, true, false); } if (opt.append_child_tab_after_limit == "top") { - AppendTab({ tab: message.tab, ParentId: $("#"+message.tab.openerTabId).parent().parent()[0].id, Append: false, Scroll: true }); + if (opt.debug) console.log("tab will append on top"); + AppendTab(message.tab, document.getElementById(message.tab.openerTabId).parentNode.parentNode.id, false, false, (message.tab.pinned ? true : false), false, true, false, false, true, false); } if (opt.append_child_tab_after_limit == "bottom") { - AppendTab({ tab: message.tab, ParentId: $("#"+message.tab.openerTabId).parent().parent()[0].id, Append: true, Scroll: true }); + if (opt.debug) console.log("tab will append on bottom"); + AppendTab(message.tab, document.getElementById(message.tab.openerTabId).parentNode.parentNode.id, false, false, true, false, true, false, false, true, false); } } } - if (opt.max_tree_depth == 0) { // place tabs flat, (should I merge it with orphans case?) + if (opt.max_tree_depth == 0) { // place tabs flat + if (opt.debug) console.log("max_tree_depth is 0, tabs are placed on the same level"); if (opt.append_child_tab_after_limit == "after") { - AppendTab({ tab: message.tab, InsertAfterId: message.tab.openerTabId, Append: false, Scroll: true }); + if (opt.debug) console.log("tab will append after active"); + AppendTab(message.tab, false, false, message.tab.openerTabId, false, false, true, false, false, true, false); } if (opt.append_child_tab_after_limit == "top") { - AppendTab({ tab: message.tab, Append: false, Scroll: true }); + if (opt.debug) console.log("tab will append on top"); + AppendTab(message.tab, false, false, false, false, false, true, false, false, true, false); } if (opt.append_child_tab_after_limit == "bottom") { - AppendTab({ tab: message.tab, Append: true, Scroll: true }); + if (opt.debug) console.log("tab will append on bottom"); + AppendTab(message.tab, false, false, false, true, false, true, false, false, true, false); } } } else { // orphan case if (opt.append_orphan_tab == "after_active") { - AppendTab({ tab: message.tab, InsertAfterId: $("#"+active_group+" .active_tab")[0] ? $("#"+active_group+" .active_tab")[0].id : undefined, Append: false }); + AppendTab(message.tab, false, false, (document.querySelector("#"+active_group+" .active_tab") != null ? document.querySelector("#"+active_group+" .active_tab").id : undefined), (message.tab.pinned ? true : false), false, true, false, false, true, false); } if (opt.append_orphan_tab == "top") { - AppendTab({ tab: message.tab, Append: false }); + AppendTab(message.tab, false, false, false, false, false, true, false, false, true, false); } if (opt.append_orphan_tab == "bottom" || opt.append_orphan_tab == "as_child") { - AppendTab({ tab: message.tab, Append: true }); + AppendTab(message.tab, false, false, false, true, false, true, false, false, true, false); } } - if ($("#"+message.tab.openerTabId).is(".c")) { - $("#"+message.tab.openerTabId).removeClass("c").addClass("o"); + } + + if (message.tab.openerTabId) { // check if openerTabId is defined, if it's in DOM and if it's closed, then change it to open + let openerTab = document.querySelector(".c[id='"+message.tab.openerTabId+"']"); + if (openerTab != null) { + openerTab.classList.remove("c"); + openerTab.classList.add("o"); } - if (opt.syncro_tabbar_tabs_order) { - let TTtabsIndexes = $(".pin, .tab").map(function(){return parseInt(this.id);}).toArray(); - chrome.tabs.move(message.tab.id, {index: TTtabsIndexes.indexOf(message.tab.id)}); + } + if (opt.syncro_tabbar_tabs_order) { + let tabIds = Array.prototype.map.call(document.querySelectorAll(".pin, .tab"), function(s){ + return parseInt(s.id); + }); + chrome.tabs.move(message.tab.id, {index: tabIds.indexOf(message.tab.id)}); + } + RefreshExpandStates(); + schedule_update_data++; + RefreshGUI(); + RefreshCounters(); + return; + } + if (message.command == "tab_attached") { + if (opt.debug) console.log(message); + AppendTab(message.tab, message.ParentId, false, false, true, false, true, false, false, true, false); + RefreshGUI(); + return; + } + if (message.command == "tab_detached") { + let ctDetachedParent = document.getElementById(message.tabId).childNodes[4]; + if (ctDetachedParent != null) { + if (opt.promote_children_in_first_child == true && ctDetachedParent.childNodes.length > 1) { + let ctNewParent = document.getElementById(ctDetachedParent.firstChild.id).childNodes[4]; + ctDetachedParent.parentNode.parentNode.insertBefore(ctDetachedParent.firstChild, ctDetachedParent.parentNode); + while (ctDetachedParent.firstChild) { + ctNewParent.appendChild(ctDetachedParent.firstChild); + } + } else { + while (ctDetachedParent.firstChild) { + ctDetachedParent.parentNode.parentNode.insertBefore(ctDetachedParent.firstChild, ctDetachedParent.parentNode); + } } - RefreshExpandStates(); + } + RemoveTabFromList(message.tabId); + setTimeout(function() { schedule_update_data++; - RefreshGUI(); - RefreshCounters(); - break; - case "tab_attached": - AppendTab({tab: message.tab, ParentId: message.ParentId, Append: true}); - RefreshGUI(); - break; - case "tab_detached": - if ($(".tab#"+message.tabId)[0]) { - if (opt.promote_children == true) { - if (opt.promote_children_in_first_child == true && $("#ch"+message.tabId).children().length > 1) { - let FirstChild = $("#ch"+message.tabId).children()[0]; - $(FirstChild).insertAfter($("#"+message.tabId)); - $("#ch"+FirstChild.id).append($("#ch"+message.tabId).children()); - } else { - $("#ch"+message.tabId).children().insertAfter($("#"+message.tabId)); + }, 300); + RefreshGUI(); + return; + } + if (message.command == "tab_removed") { + if (opt.debug) console.log("tab_removed: "+message.tabId); + let mTab = document.getElementById(message.tabId); + if (mTab != null) { + let ctParent = mTab.childNodes[4]; + if (opt.debug) console.log("tab_removed, promote children: " +opt.promote_children); + if (opt.promote_children == true) { + if (opt.promote_children_in_first_child == true && ctParent.childNodes.length > 1) { + let ctNewParent = document.getElementById(ctParent.firstChild.id).childNodes[4]; + ctParent.parentNode.parentNode.insertBefore(ctParent.firstChild, ctParent.parentNode); + while (ctParent.firstChild) { + ctNewParent.appendChild(ctParent.firstChild); } } else { - $("#ch"+message.tabId).find(".tab").each(function() { - RemoveTabFromList(this.id); - }); - } - } - RemoveTabFromList(message.tabId); - setTimeout(function() { - schedule_update_data++; - }, 300); - RefreshGUI(); - break; - case "tab_removed": - if ($(".tab#"+message.tabId)[0]) { - if (opt.promote_children == true) { - if (opt.promote_children_in_first_child == true && $("#ch"+message.tabId).children().length > 1) { - let FirstChild = $("#ch"+message.tabId).children()[0]; - $(FirstChild).insertAfter($("#"+message.tabId)); - $("#ch"+FirstChild.id).append($("#ch"+message.tabId).children()); - } else { - $("#ch"+message.tabId).children().insertAfter($("#"+message.tabId)); + while (ctParent.firstChild) { + ctParent.parentNode.parentNode.insertBefore(ctParent.firstChild, ctParent.parentNode); } - } else { - $("#ch"+message.tabId).find(".tab").each(function() { - chrome.tabs.remove(parseInt(this.id)); - }); } + } else { + document.querySelectorAll("[id='"+message.tabId+"'] .tab").forEach(function(s) { + chrome.tabs.remove(parseInt(s.id)); + }); } RemoveTabFromList(message.tabId); RefreshExpandStates(); @@ -170,44 +221,48 @@ function StartChromeListeners() { }, 300); RefreshGUI(); RefreshCounters(); - break; - case "tab_activated": + } + return; + } + if (message.command == "tab_activated") { + SetActiveTab(message.tabId); + return; + } + if (message.command == "tab_attention") { + SetAttentionIcon(message.tabId); + return; + } + if (message.command == "tab_updated") { + if (message.changeInfo.favIconUrl != undefined || message.changeInfo.url != undefined) { setTimeout(function() { - SetActiveTab(message.tabId); - }, 200); - break; - case "tab_attention": - SetAttentionIcon(message.tabId); - break; - case "tab_updated": - if (message.changeInfo.favIconUrl != undefined || message.changeInfo.url != undefined) { - setTimeout(function() { - GetFaviconAndTitle(message.tabId, true); - }, 100); + GetFaviconAndTitle(message.tabId, true); + }, 100); + } + if (message.changeInfo.title != undefined) { + setTimeout(function() { + GetFaviconAndTitle(message.tabId, true); + }, 1000); + } + if (message.changeInfo.audible != undefined || message.changeInfo.mutedInfo != undefined) { + RefreshMediaIcon(message.tabId); + } + if (message.changeInfo.discarded != undefined) { + RefreshDiscarded(message.tabId); + } + if (message.changeInfo.pinned != undefined) { + let updateTab = document.getElementById(message.tabId); + if (updateTab != null && ( (message.tab.pinned && updateTab.classList.contains("tab")) || (!message.tab.pinned && updateTab.classList.contains("pin")) ) ) { + SetTabClass(message.tabId, message.tab.pinned); + schedule_update_data++; } - if (message.changeInfo.title != undefined) { - setTimeout(function() { - GetFaviconAndTitle(message.tabId, true); - }, 1000); - } - if (message.changeInfo.audible != undefined || message.changeInfo.mutedInfo != undefined) { - RefreshMediaIcon(message.tabId); - } - if (message.changeInfo.discarded != undefined) { - RefreshDiscarded(message.tabId); - } - if (message.changeInfo.pinned != undefined) { - if ((message.tab.pinned && $("#"+message.tabId).is(".tab")) || (!message.tab.pinned && $("#"+message.tabId).is(".pin"))) { - SetTabClass({ id: message.tabId, pin: message.tab.pinned }); - schedule_update_data++; - } - RefreshExpandStates(); - } - break; - case "remote_update": - RearrangeTreeStructure(message.groups, message.folders, message.tabs); - sendResponse(true); - break; + RefreshExpandStates(); + } + return; + } + if (message.command == "remote_update") { + RearrangeTreeStructure(message.groups, message.folders, message.tabs); + sendResponse(true); + return; } } diff --git a/scripts/drag_and_drop.js b/scripts/drag_and_drop.js deleted file mode 100644 index 45e8f0e..0000000 --- a/scripts/drag_and_drop.js +++ /dev/null @@ -1,412 +0,0 @@ -// Copyright (c) 2017 kroppy. All rights reserved. -// Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license -// that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ - -// ********** TABS EVENTS *************** - -function GetSelectedFolders() { - log("function: GetSelectedFolders"); - let res = {Folders: {}, FoldersSelected: [], TabsIds: [], TabsIdsParents: []}; - $("#"+active_group+" .selected_folder").each(function() { - res.FoldersSelected.push(this.id); - res.Folders[this.id] = Object.assign({}, bgfolders[this.id]); - if ($("#cf" + this.id).children().length > 0) { - $($("#cf" + this.id).find(".folder")).each(function() { - res.Folders[this.id] = Object.assign({}, bgfolders[this.id]); - }); - } - $($(this).find(".tab")).each(function() { - res.TabsIds.push(parseInt(this.id)); - res.TabsIdsParents.push($(this).parent()[0].id); - }); - }); - log(res); - return res; -} -function GetSelectedTabs() { - log("function: GetSelectedTabs"); - let res = {TabsIds: [], TabsIdsParents: [], TabsIdsSelected: []}; - $("#"+active_group+" .selected_tab").each(function() { - res.TabsIds.push(parseInt(this.id)); - res.TabsIdsParents.push($(this).parent()[0].id); - res.TabsIdsSelected.push(parseInt(this.id)); - if ($("#ch" + this.id).children().length > 0) { - $($("#ch" + this.id).find(".tab")).each(function() { - res.TabsIds.push(parseInt(this.id)); - res.TabsIdsParents.push($(this).parent()[0].id); - }); - } - }); - log(res); - return res; -} -function SetDragAndDropEvents() { - $(document).on("mouseleave", window, function(event) { - MouseHoverOver = ""; - }); - $(document).on("dragleave", window, function(event) { - MouseHoverOver = ""; - }); - $(document).on("dragleave", "body", function(event) { - MouseHoverOver = ""; - }); - $(document).on("dragover", "#toolbar_groups, #toolbar, #pin_list, .group", function(event) { - MouseHoverOver = this.id; - }); - $(document).on("mouseover", "#toolbar_groups, #toolbar, #pin_list, .group", function(event) { - MouseHoverOver = this.id; - }); - $(document).bind("drop dragover", function(event) { // PREVENT THE DEFAULT BROWSER DROP ACTION - event.preventDefault(); - }); - $(document).on("mousedown", ".drop_target", function(event) { // deny drag enter on drop_targets and allow clicks below them - $(".drop_target").css({"pointer-events": "none"}); - }); - $(document).on("dragenter", ".tab_header, .folder_header", function(event) { // allow drag enter on drop_targets - $(".drop_target").css({"pointer-events": "all"}); - }); - $(document).on("dragstart", ".tab_header, .folder_header", function(event) { // SET DRAG SOURCE - event.stopPropagation(); - event.originalEvent.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0); - event.originalEvent.dataTransfer.setData("text", ""); - DragAndDrop.DroppedToWindowId = 0; - DragAndDrop.ComesFromWindowId = CurrentWindowId; - DragAndDrop.Depth = 0; - if ($(this)[0].classList[0] == "folder_header") { - DragAndDrop.DragNodeClass = "folder"; - if ($(this).parent().is(":not(.selected_folder)")) { - $(".selected_folder").addClass("selected_folder_frozen").removeClass("selected_folder"); - $(this).parent().addClass("selected_folder_temporarly").addClass("selected_folder"); - } - $(".selected_folder:not(:visible)").addClass("selected_folder_frozen").removeClass("selected_folder"); - let Folders = GetSelectedFolders(); - DragAndDrop.TabsIds = Object.assign([], Folders.TabsIds); - DragAndDrop.TabsIdsParents = Object.assign([], Folders.TabsIdsParents); - DragAndDrop.TabsIdsSelected = Object.assign([], []); - DragAndDrop.Folders = Object.assign({}, Folders.Folders); - DragAndDrop.FoldersSelected = Object.assign([], Folders.FoldersSelected); - } - if ($(this)[0].classList[0] == "tab_header") { - DragAndDrop.DragNodeClass = "tab"; - if ($(this).parent().is(".active_tab")) { - $(this).parent().addClass("selected_temporarly").addClass("selected_tab"); - } - $(".close").removeClass("show"); - $(".tab_header_hover").removeClass("tab_header_hover"); - if ($(this).parent().is(":not(.selected_tab)")) { - $(".selected_tab").addClass("selected_frozen").removeClass("selected_tab"); - $(this).parent().addClass("selected_temporarly").addClass("selected_tab"); - } - $(".selected_tab:not(:visible)").addClass("selected_frozen").removeClass("selected_tab"); - $("#"+active_group+" .selected_tab").find(".pin, .tab").each(function() { - if ($(this).parents(".pin, .tab").length > DragAndDrop.Depth) { - DragAndDrop.Depth = $(this).parents(".pin, .tab").length; - } - }); - DragAndDrop.Depth -= $(this).parents(".pin, .tab").length-1; - if (DragAndDrop.Depth < 0) { - DragAndDrop.Depth = 0; - } - let Tabs = GetSelectedTabs(); - DragAndDrop.TabsIds = Object.assign([], Tabs.TabsIds); - DragAndDrop.TabsIdsParents = Object.assign([], Tabs.TabsIdsParents); - DragAndDrop.TabsIdsSelected = Object.assign([], Tabs.TabsIdsSelected); - DragAndDrop.Folders = Object.assign({}, {}); - DragAndDrop.FoldersSelected = Object.assign([], []); - } - chrome.runtime.sendMessage({ - command: "drag_drop", - DragNodeClass: DragAndDrop.DragNodeClass, - TabsIds: DragAndDrop.TabsIds, - TabsIdsParents: DragAndDrop.TabsIdsParents, - TabsIdsSelected: DragAndDrop.TabsIdsSelected, - ComesFromWindowId: CurrentWindowId, - Depth: DragAndDrop.Depth, - Folders: DragAndDrop.Folders, - FoldersSelected: DragAndDrop.FoldersSelected - }); - }); - $(document).on("dragleave", ".highlighted_drop_target", function(event) { // REMOVE DROP TARGET WHEN DRAG LEAVES - $(".highlighted_drop_target").removeClass("highlighted_drop_target"); - }); - $(document).on("dragenter", ".pin>.drag_entered_top:not(.highlighted_drop_target), .pin>.drag_entered_bottom:not(.highlighted_drop_target)", function(event) { // SET DROP TARGET WHEN ENTERING PINS - event.stopPropagation(); - if (DragAndDrop.DragNodeClass == "tab") { - $(".highlighted_drop_target").removeClass("highlighted_drop_target"); - $(this).addClass("highlighted_drop_target"); - } - }); - $(document).on("dragenter", ".tab>.drag_entered_top:not(.highlighted_drop_target), .tab>.drag_entered_bottom:not(.highlighted_drop_target)", function(event) { // SET DROP TARGET WHEN ENTERING TABS - event.stopPropagation(); - if (DragAndDrop.DragNodeClass == "tab") { - if ($(".selected_tab:visible").find($(this)).length == 0) { - if (opt.max_tree_drag_drop && opt.max_tree_depth >= 0) { - if ($(this).parents(".tab").length + DragAndDrop.Depth-1 > opt.max_tree_depth) { - return; - } - } - $(".highlighted_drop_target").removeClass("highlighted_drop_target"); - $(this).addClass("highlighted_drop_target"); - } - } - }); - $(document).on("dragenter", ".tab>.drag_enter_center:not(.highlighted_drop_target)", function(event) { - event.stopPropagation(); - if (DragAndDrop.DragNodeClass == "tab") { - if ($(".selected_tab:visible").find($(this)).length == 0 && opt.max_tree_depth != 0) { - if (opt.max_tree_drag_drop && opt.max_tree_depth > 0) { - if ($(this).parents(".tab").length + DragAndDrop.Depth > opt.max_tree_depth) { - return; - } - } - $(".highlighted_drop_target").removeClass("highlighted_drop_target"); - $(this).addClass("highlighted_drop_target"); - } - } - }); - $(document).on("dragenter", ".folder>.drag_entered_top:not(.highlighted_drop_target), .folder>.drag_entered_bottom:not(.highlighted_drop_target), .folder>.drag_enter_center:not(.highlighted_drop_target)", function(event) { // SET DROP TARGET WHEN ENTERING FOLDERS - event.stopPropagation(); - if (DragAndDrop.DragNodeClass == "folder") { - $(".highlighted_drop_target").removeClass("highlighted_drop_target"); - $(this).addClass("highlighted_drop_target"); - } - }); - $(document).on("dragenter", ".folder>.drag_enter_center:not(.highlighted_drop_target)", function(event) { - event.stopPropagation(); - if (DragAndDrop.DragNodeClass == "tab") { - $(".highlighted_drop_target").removeClass("highlighted_drop_target"); - $(this).addClass("highlighted_drop_target"); - } - }); - $(document).on("dragover", "#pin_list, .group, .group_drag_box", function(event) { // SET DROP TARGET, PIN_LIST, TAB_LIST, GROUP OR GROUP_BUTTON - if (DragAndDrop.DragNodeClass != "group") { - if ($(".highlighted_drop_target").length == 0 && event.target.className == $(this)[0].className) { - $(this).addClass("highlighted_drop_target"); - } - } - }); - $(document).on("dragenter", ".drag_enter_center", function(event) { // TIMER FOR FOR AUTO EXPAND - event.stopPropagation(); - DragAndDrop.timeout = false; - setTimeout(function() { - DragAndDrop.timeout = true; - }, 1800); - }); - $(document).on("dragleave", ".drag_enter_center", function(event) { - DragAndDrop.timeout = false; - }); - $(document).on("dragover", ".c > .drag_enter_center", function(event) { - if (DragAndDrop.timeout && opt.open_tree_on_hover) { - $(this).parent().addClass("o").removeClass("c"); - DragAndDrop.timeout = false; - } - }); - $(document).on("drop", "*", function(event) { // DROP - chrome.runtime.sendMessage({command: "dropped", DroppedToWindowId: CurrentWindowId}); - event.stopPropagation(); - if (DragAndDrop.ComesFromWindowId == CurrentWindowId) { - DropToTarget($(".highlighted_drop_target")); - } else { - if (Object.keys(DragAndDrop.Folders).length > 0) { - for (var folder in DragAndDrop.Folders) { - bgfolders[DragAndDrop.Folders[folder].id] = Object.assign({}, DragAndDrop.Folders[folder]); - } - AppendFolders(bgfolders); - } - $(".selected_tab").addClass("selected_frozen").removeClass("selected_tab"); - let target = $(".highlighted_drop_target"); - let counter = 0; - (DragAndDrop.TabsIds).forEach(function(TabId) { - chrome.tabs.move(TabId, { windowId: CurrentWindowId, index: -1 }, function(MovedTab) { - if (browserId == "F") { // FIRFOX BUG 1398272 - HAVE TO REPLACE ORIGINAL ID - if ((DragAndDrop.TabsIdsParents).indexOf("ch"+DragAndDrop.TabsIds[counter]) != -1) { - DragAndDrop.TabsIdsParents[(DragAndDrop.TabsIdsParents).indexOf("ch"+DragAndDrop.TabsIds[counter])] = "ch"+MovedTab[0].id; - } - if ((DragAndDrop.TabsIdsSelected).indexOf(DragAndDrop.TabsIds[counter]) != -1) { - DragAndDrop.TabsIdsSelected[(DragAndDrop.TabsIdsSelected).indexOf(DragAndDrop.TabsIds[counter])] = MovedTab[0].id; - } - DragAndDrop.TabsIds[counter] = MovedTab[0].id; - } - counter++; - if (counter == DragAndDrop.TabsIds.length) { - setTimeout(function() { - (DragAndDrop.TabsIdsSelected).forEach(function(selectedTabId) { - if ($("#"+selectedTabId)[0]) { - $("#"+selectedTabId).addClass("selected_temporarly").addClass("selected_tab"); - } - }); - for (var tabsIdsIndex = 1; tabsIdsIndex < (DragAndDrop.TabsIds).length; tabsIdsIndex++) { - if ($("#"+DragAndDrop.TabsIds[tabsIdsIndex])[0] && $("#"+DragAndDrop.TabsIdsParents[tabsIdsIndex])[0]) { - $("#"+DragAndDrop.TabsIdsParents[tabsIdsIndex]).append($("#"+DragAndDrop.TabsIds[tabsIdsIndex])); - } - } - for (var FolderSelectedIndex = 0; FolderSelectedIndex < (DragAndDrop.FoldersSelected).length; FolderSelectedIndex++) { - if ($("#"+DragAndDrop.FoldersSelected[FolderSelectedIndex])[0]) { - $("#"+DragAndDrop.FoldersSelected[FolderSelectedIndex]).addClass("selected_folder_temporarly").addClass("selected_folder"); - } - } - DropToTarget(target); - }, 300); - } - }); - }); - } - $(".drop_target").css({"pointer-events": "none"}); - }); - $(document).on("dragend", ".tab_header, .folder_header", function(event) { // DETACH TABS - setTimeout(function() { - if (DragAndDrop.ComesFromWindowId == CurrentWindowId && DragAndDrop.DroppedToWindowId == 0) { - if ( (browserId == "F" && (event.screenX < event.view.mozInnerScreenX || event.screenX > (event.view.mozInnerScreenX + $(window).width()) || (event.screenY < event.view.mozInnerScreenY || event.screenY > (event.view.mozInnerScreenY + $(window).height())))) - || (browserId != "F" && (event.pageX < 0 || event.pageX > $(window).width() || event.pageY < 0 || event.pageY > $(window).height())) - ) { - if (DragAndDrop.DragNodeClass == "tab") { - DetachTabs(DragAndDrop.TabsIds, {}); - } - if (DragAndDrop.DragNodeClass == "folder") { - DetachTabs(DragAndDrop.TabsIds, DragAndDrop.Folders); - setTimeout(function() { - SaveFolders(); - }, 500); - } - } - } - }, 200); - $(".drop_target").css({"pointer-events": "none"}); - }); - $(document).on("dragstart", ".group_drag_box", function(event) { // DRAGGING GROUPS - event.originalEvent.dataTransfer.setData("null", "null"); - event.originalEvent.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0); - DragAndDrop.DragNodeClass = "group"; - DragAndDrop.DragNode = $(this).parent(); - $(".highlighted_drop_target").removeClass("highlighted_drop_target"); - }); - $(document).on("dragenter", ".group_drag_box", function(event) { // WHEN DRAGGING THE GROUP, MOVE IT UP OR DOWN - if (DragAndDrop.DragNodeClass == "group") { - if (DragAndDrop.DragNode != undefined && $(this).parent() != DragAndDrop.DragNode) { - if ($(this).parent().index() <= DragAndDrop.DragNode.index()) { - DragAndDrop.DragNode.insertBefore($(this).parent()); - } else { - if ($(this).parent().index() > DragAndDrop.DragNode.index()) { - DragAndDrop.DragNode.insertAfter($(this).parent()); - } - } - $(".highlighted_drop_target").removeClass("highlighted_drop_target"); - } - } - }); - $(document).on("dragend", ".group_drag_box", function(event) { // WHEN FINISHED DRAGGING THE GROUP - DragAndDrop.DragNode = undefined; - UpdateBgGroupsOrder(); - $(".highlighted_drop_target").removeClass("highlighted_drop_target"); - RearrangeGroupsLists(); - $(".drop_target").css({"pointer-events": "none"}); - if (opt.syncro_tabbar_groups_tabs_order) { - schedule_rearrange_tabs++; - } - }); -} -function DropToTarget(TargetNode) { - if (DragAndDrop.DragNodeClass == "tab") { - if (TargetNode.parent().is(".pin")) { // dropped on pin - $(".selected_tab").each(function() { - SetTabClass({ id: this.id, pin: true }); - if (TargetNode.is(".drag_entered_top")) { - $(this).insertBefore(TargetNode.parent()); - } else { - $(this).insertAfter(TargetNode.parent()); - } - }); - } - if (TargetNode.is("#pin_list")) { // dropped on pin_list - $(".selected_tab").each(function() { - SetTabClass({ id: this.id, pin: true }); - }); - TargetNode.append($(".selected_tab")); - } - if (TargetNode.parent().is(".tab, .folder")) { // dropped on tab or folder - if (TargetNode.parent().is(".selected_tab")) { - TargetNode.parent().addClass("highlighted_selected").removeClass("selected_tab"); - } - $(".selected_tab").each(function() { - SetTabClass({ id: this.id, pin: false }); - }); - if (TargetNode.is(".drag_entered_top")) { - $($(".selected_tab").get().reverse()).insertBefore(TargetNode.parent()); - } - if (TargetNode.is(".drag_entered_bottom")) { - $($(".selected_tab").get().reverse()).insertAfter(TargetNode.parent()); - } - if (TargetNode.is(".drag_enter_center")) { - if (opt.append_child_tab == "bottom") { - $("#ch" + TargetNode[0].id.substr(2)).append($($(".selected_tab").get().reverse())); - } else { - $("#ch" + TargetNode[0].id.substr(2)).prepend($($(".selected_tab").get().reverse())); - } - } - } - if (TargetNode.is(".group")) { // dropped on group (tab list) - $(".selected_tab").each(function() { - SetTabClass({ id: this.id, pin: false }); - }); - $("#ch"+TargetNode[0].id).append($($(".selected_tab").get().reverse())); - } - if (TargetNode.is(".group_drag_box")) { // dropped on group button (group list) - $(".selected_tab").each(function() { - SetTabClass({ id: this.id, pin: false }); - }); - $("#ch"+TargetNode[0].id.substr(1)).append($($(".selected_tab").get().reverse())); - } - $(".highlighted_selected").addClass("selected_tab").removeClass("highlighted_selected"); - $(".selected_frozen").addClass("selected_tab").removeClass("selected_frozen"); - $(".selected_temporarly").removeClass("selected_tab").removeClass("selected_temporarly"); - } - if (DragAndDrop.DragNodeClass == "folder") { // dropped on group button (group list) - if (TargetNode.is(".group_drag_box")) { - $("#cf"+TargetNode[0].id.substr(1)).append($($(".selected_folder").get().reverse())); - } - if (TargetNode.parent().is(".folder")) { // dropped on folder - if (TargetNode.parent().is(".selected_folder")) { - TargetNode.parent().addClass("highlighted_selected").removeClass("selected_folder"); - } - if (TargetNode.is(".drag_entered_top")) { - $($(".selected_folder").get().reverse()).insertBefore(TargetNode.parent()); - } - if (TargetNode.is(".drag_entered_bottom")) { - $($(".selected_folder").get().reverse()).insertAfter(TargetNode.parent()); - } - if (TargetNode.is(".drag_enter_center")) { - if (opt.append_child_tab == "bottom") { - $("#cf" + TargetNode[0].id.substr(2)).append($($(".selected_folder").get().reverse())); - } else { - $("#cf" + TargetNode[0].id.substr(2)).prepend($($(".selected_folder").get().reverse())); - } - } - } - $(".highlighted_selected").addClass("selected_folder").removeClass("highlighted_selected"); - $(".selected_folder_frozen").addClass("selected_folder").removeClass("selected_folder_frozen"); - $(".selected_folder_temporarly").removeClass("selected_folder").removeClass("selected_folder_temporarly"); - setTimeout(function() { - SaveFolders(); - }, 300); - } - RefreshExpandStates(); - DragAndDrop.timeout = false; - RefreshGUI(); - RefreshCounters(); - - if (opt.syncro_tabbar_tabs_order) { - let TTtabsIndexes = $(".pin, .tab").map(function(){return parseInt(this.id);}).toArray(); - chrome.tabs.move(DragAndDrop.TabsIds, {index: TTtabsIndexes.indexOf(DragAndDrop.TabsIds[0])}); - setTimeout(function() { - schedule_rearrange_tabs++; - }, 500); - } - - setTimeout(function() { - schedule_update_data++; - }, 500); - TargetNode.removeClass("highlighted_drop_target"); - $(".tab_header_hover").removeClass("tab_header_hover"); - $(".folder_header").removeClass("folder_header_hover"); - $(".dragover_highlight").removeClass("dragover_highlight"); // this is group dragover indicator -} \ No newline at end of file diff --git a/scripts/events.js b/scripts/events.js new file mode 100644 index 0000000..9bbdc11 --- /dev/null +++ b/scripts/events.js @@ -0,0 +1,590 @@ +// Copyright (c) 2017 kroppy. All rights reserved. +// Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license +// that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ + +function SetEvents() { + let PinList = document.getElementById("pin_list"); + + if (!opt.switch_with_scroll) { + PinList.onmousewheel = function(event) { + let pinList = document.getElementById("pin_list"); + let direction = (event.wheelDelta > 0 || event.detail < 0) ? -1 : 1; + let speed = 0.1; + for (let t = 1; t < 40; t++) { + setTimeout(function() { + if (t < 30) { + speed = speed+0.1; // accelerate + } else { + speed = speed-0.3; // decelerate + } + pinList.scrollLeft = pinList.scrollLeft+(direction*speed); + }, t); + } + } + } + document.oncontextmenu = function(event){ + if (!event.ctrlKey) { + event.preventDefault(); + } + } + document.body.onresize = function(event) { + RefreshGUI(); + } + + // MOUSE DOWN EVENTS + document.body.onmousedown = function(event) { + if (event.which == 2) { + event.preventDefault(); + } + + if (event.which == 1 && event.target.classList.contains("menu_item") == false) { + HideMenus(); + } + event.stopImmediatePropagation(); + + if (event.which == 1) { + RemoveHeadersHoverClass(); + } + + } + // MOUSE DOWN EVENTS + document.body.onmousedown = function(event) { + + if (event.which == 2) { + event.preventDefault(); + } + + if (event.which == 1 && event.target.classList.contains("menu_item") == false) { + HideMenus(); + } + event.stopImmediatePropagation(); + + if (event.which == 1) { + RemoveHeadersHoverClass(); + } + + } + + // CONFIRM EDIT FOLDER + document.getElementById("folder_edit_confirm").onmousedown = function(event) { + if (event.which == 1) { + FolderRenameConfirm(); + } + } + + // DISCARD EDIT FOLDER + document.getElementById("folder_edit_discard").onmousedown = function(event) { + if (event.which == 1) { + HideRenameDialogs(); + } + } + + // CONFIRM EDIT GROUP + document.getElementById("group_edit_confirm").onmousedown = function(event) { + if (event.which == 1) { + GroupEditConfirm(); + } + } + // DISCARD EDIT GROUP + document.getElementById("group_edit_discard").onmousedown = function(event) { + if (event.which == 1) { + HideRenameDialogs(); + } + } + document.getElementById("folder_edit_name").onkeydown = function(event) { + if (event.keyCode == 13) { + FolderRenameConfirm(); + } + if (event.which == 27) { + HideRenameDialogs(); + } + } + document.getElementById("group_edit_name").onkeydown = function(event) { + if (event.keyCode == 13) { + GroupEditConfirm(); + } + if (event.which == 27) { + HideRenameDialogs(); + } + } + + PinList.onmousedown = function(event) { + if (event.which == 1 && event.target == this) { + DeselectFolders(); + DeselectTabs(); + HideMenus(); + } + if (event.which == 2 && event.target == this) { + ActionClickGroup(this, opt.midclick_group); + } + if (event.which == 3 && event.target == this) { + ShowFGlobalMenu(event); + } + } + PinList.ondragenter = function(event) { + // PIN,TAB==>PINLIST + if (event.target.id == "pin_list" && DragAndDrop.DragNodeClass == "tab") { + HighlightNode(this); + } + } + + // DOUBLE CLICK ACTION + PinList.ondblclick = function(event) { + if (event.target == this) { + ActionClickGroup(this, opt.dbclick_group); + } + } + + + // SHOW COLOR PICKER + document.getElementById("group_edit_font").onclick = function(event) { + if (event.which == 1) { + event.stopPropagation(); + let ColorPicker = document.getElementById("color_picker"); + ColorPicker.setAttribute("PickColor", this.id); + ColorPicker.value = "#"+RGBtoHex(this.style.backgroundColor); + ColorPicker.focus(); + ColorPicker.click(); + } + } + document.getElementById("color_picker").oninput = function(event) { + document.getElementById(this.getAttribute("PickColor")).style.backgroundColor = this.value; + } + + + + // CATCH KEYBOARD GLOBAL KEYS + document.body.onkeydown = function(event) { + // ctrl+a to select all + if (event.ctrlKey && event.which == 65) { + if (document.querySelector(".pin>.tab_header_hover") != null) { + document.querySelectorAll(".pin").forEach(function(s){ + s.classList.add("selected_tab"); + }); + } + if (document.querySelector("#"+active_group+" .tab>.tab_header_hover") != null) { + let rootId = document.querySelector("#"+active_group+" .tab>.tab_header_hover").parentNode.parentNode.parentNode.id; + document.querySelectorAll("#ct"+rootId+">.tab").forEach(function(s){ + s.classList.add("selected_tab"); + }); + } + } + // ctrl+i to invert selection + if (event.ctrlKey && event.which == 73) { + if (document.querySelector(".pin>.tab_header_hover") != null) { + document.querySelectorAll(".pin").forEach(function(s){ + s.classList.toggle("selected_tab"); + }); + } + if (document.querySelector("#"+active_group+" .tab>.tab_header_hover") != null) { + let rootId = document.querySelector("#"+active_group+" .tab>.tab_header_hover").parentNode.parentNode.parentNode.id; + document.querySelectorAll("#ct"+rootId+">.tab").forEach(function(s){ + s.classList.toggle("selected_tab"); + }); + } + } + // esc to deselect tabs + if (event.which == 27) { + DeselectTabs(); + DeselectFolders(); + } + // alt+g to toggle group bar + if (event.altKey && event.which == 71) { + GroupsToolbarToggle(); + } + RefreshGUI(); + } + + + document.body.ondragover = function(event) { + event.preventDefault(); + if (event.target.parentNode.classList.contains("c") && event.target.parentNode.classList.contains("dragged_tree") == false) { + if (DragAndDrop.timeout && opt.open_tree_on_hover) { + event.target.parentNode.classList.add("o"); + event.target.parentNode.classList.remove("c"); + DragAndDrop.timeout = false; + } + } + } + + document.ondrop = function(event) { + if (opt.debug) { + console.log("drop"); + } + DragAndDrop.DroppedToWindowId = CurrentWindowId; + let target = document.querySelector(".highlighted_drop_target"); + event.preventDefault(); + if (DragAndDrop.ComesFromWindowId == CurrentWindowId) { + let selected = (document.querySelectorAll(".selected_tab").length > 0 ? document.querySelectorAll(".selected_tab") : (document.querySelectorAll(".selected_folder").length > 0 ? document.querySelectorAll(".selected_folder") : document.querySelectorAll(".dragged_group_button"))); + DropToTarget(target, selected); + } else { + if (Object.keys(DragAndDrop.Folders).length > 0) { + for (var folder in DragAndDrop.Folders) { + bgfolders[DragAndDrop.Folders[folder].id] = Object.assign({}, DragAndDrop.Folders[folder]); + } + AppendFolders(bgfolders); + } + let currentlySelected = document.querySelectorAll(".selected_tab"); + currentlySelected.forEach(function(s){ + s.classList.add("selected_frozen"); + s.classList.remove("selected_tab"); + s.classList.remove("selected_last"); + }); + let counter = 0; + (DragAndDrop.TabsIds).forEach(function(TabId) { + if (opt.debug) console.log("DragAndDrop: will now move tab: "+TabId); + chrome.tabs.move(TabId, { windowId: CurrentWindowId, index: -1 }, function(MovedTab) { + if (browserId == "F") { // MOZILLA BUG 1398272 + let MovedTabId = MovedTab[0] != undefined ? MovedTab[0].id : (MovedTab.id != undefined ? MovedTab.id : TabId); + if ((DragAndDrop.TabsIdsParents).indexOf("ct"+DragAndDrop.TabsIds[counter]) != -1) { // MOZILLA BUG 1398272 + DragAndDrop.TabsIdsParents[(DragAndDrop.TabsIdsParents).indexOf("ct"+DragAndDrop.TabsIds[counter])] = "ct"+MovedTabId; // MOZILLA BUG 1398272 + } // MOZILLA BUG 1398272 + if ((DragAndDrop.TabsIdsSelected).indexOf(DragAndDrop.TabsIds[counter]) != -1) { // MOZILLA BUG 1398272 + DragAndDrop.TabsIdsSelected[(DragAndDrop.TabsIdsSelected).indexOf(DragAndDrop.TabsIds[counter])] = MovedTabId; // MOZILLA BUG 1398272 + } // MOZILLA BUG 1398272 + DragAndDrop.TabsIds[counter] = MovedTabId; // MOZILLA BUG 1398272 + } // MOZILLA BUG 1398272 + counter++; + if (counter == DragAndDrop.TabsIds.length) { + console.log(DragAndDrop); + setTimeout(function() { + (DragAndDrop.TabsIdsSelected).forEach(function(selectedTabId) { + let selectedTab = document.getElementById(selectedTabId); + if (selectedTab != null) { + selectedTab.classList.add("selected_temporarly"); + selectedTab.classList.add("selected_tab"); + } + }); + for (var tabsIdsIndex = 1; tabsIdsIndex < (DragAndDrop.TabsIds).length; tabsIdsIndex++) { + let DTab = document.getElementById(DragAndDrop.TabsIds[tabsIdsIndex]); + let DTabParent = document.getElementById(DragAndDrop.TabsIdsParents[tabsIdsIndex]); + if (DTab != null && DTabParent != null) { + DTabParent.appendChild(DTab); + } + } + for (var FolderSelectedIndex = 0; FolderSelectedIndex < (DragAndDrop.FoldersSelected).length; FolderSelectedIndex++) { + let Folder = document.getElementById(DragAndDrop.FoldersSelected[FolderSelectedIndex]); + if (Folder != null) { + Folder.classList.add("selected_folder_temporarly"); + Folder.classList.add("selected_folder"); + } + } + let selected = (document.querySelectorAll(".selected_tab").length > 0 ? document.querySelectorAll(".selected_tab") : (document.querySelectorAll(".selected_folder").length > 0 ? document.querySelectorAll(".selected_folder") : document.querySelectorAll(".dragged_group_button"))); + DropToTarget(target, selected); + }, 300); + } + }); + }); + } + // event.dataTransfer.setData("folders", test_data); + // let folders = event.dataTransfer.getData("folders"); + } + document.ondragleave = function(event) { + if (opt.debug) { + console.log("global dragleave"); + } + if (event.target.classList) { + if (event.target.classList.contains("highlighted_drop_target") || event.target.classList.contains("drop_target")) { + event.target.classList.remove("highlighted_drop_target"); + } + if (event.target.classList.contains("drag_enter_center")) { + DragAndDrop.timeout = false; + } + } + } + + document.ondragend = function(event) { + if (opt.debug) { + console.log("document dragend"); + console.log(event); + } + + + // DETACHING TEMPORARILY DISABLED PLEASE USE MENU OR TOOLBAR! + + // if (DragAndDrop.ComesFromWindowId == CurrentWindowId && DragAndDrop.DroppedToWindowId == 0) { + // if ((browserId == "F" && ( event.screenX < event.view.mozInnerScreenX || event.screenX > (event.view.mozInnerScreenX + window.innerWidth) || event.screenY < event.view.mozInnerScreenY || event.screenY > (event.view.mozInnerScreenY + window.innerHeight)))|| (browserId != "F" && (event.pageX < 0 || event.pageX > window.outerWidth || event.pageY < 0 || event.pageY > window.outerHeight))) { + // if (opt.debug) console.log("dragged outside sidebar"); + // if (DragAndDrop.DragNodeClass == "tab") { + // Detach(DragAndDrop.TabsIds, {}); + // } + // if (DragAndDrop.DragNodeClass == "folder") { + // Detach(DragAndDrop.TabsIds, DragAndDrop.Folders); + // setTimeout(function() { + // SaveFolders(); + // }, 500); + // } + // } + // } + CleanUpDragClasses(); + chrome.runtime.sendMessage({command: "dragend"}); + } +} + + +function BindTabsSwitchingToMouseWheel(Id) { + document.getElementById(Id).onmousewheel = function(event) { + event.preventDefault(); + let prev = event.wheelDelta > 0 || event.detail < 0; + if (prev) { + ActivatePrevTab(); + } else { + ActivateNextTab(); + } + } +} + +function RemoveHeadersHoverClass() { + document.querySelectorAll(".folder_header_hover, .tab_header_hover").forEach(function(s){ + s.classList.remove("folder_header_hover"); + s.classList.remove("tab_header_hover"); + }); +} + +function DropToTarget(TargetNode, selected) { + if (opt.debug) console.log("function: DropToTarget"); + if (TargetNode != null && selected.length > 0) { + if (DragAndDrop.DragNodeClass == "tab") { + if (TargetNode.parentNode.classList.contains("pin")) { // dropped on pin + if (TargetNode.classList.contains("drag_entered_top")) { + selected.forEach(function(s){ + SetTabClass(s.id, true); + TargetNode.parentNode.parentNode.insertBefore(s, TargetNode.parentNode); + }); + } else { + if (TargetNode.parentNode.nextSibling != null) { + for (let i = selected.length-1; i >= 0; i--) { + SetTabClass(selected[i].id, true); + TargetNode.parentNode.parentNode.insertBefore(selected[i], TargetNode.parentNode.nextSibling); + } + } else { + selected.forEach(function(s){ + SetTabClass(s.id, true); + TargetNode.parentNode.parentNode.appendChild(s); + }); + } + } + } + if (TargetNode.id == "pin_list") { // dropped on pin_list + document.querySelectorAll(".selected_tab").forEach(function(s){ + SetTabClass(s.id, true); + TargetNode.appendChild(s); + }); + } + if (TargetNode.parentNode.classList.contains("tab") || TargetNode.parentNode.classList.contains("folder")) { // dropped on tab or folder + selected.forEach(function(s){ + SetTabClass(s.id, false); + }); + if (TargetNode.classList.contains("drag_entered_top")) { + selected.forEach(function(s){ + TargetNode.parentNode.parentNode.insertBefore(s, TargetNode.parentNode); + }); + } + if (TargetNode.classList.contains("drag_entered_bottom")) { + if (TargetNode.parentNode.nextSibling != null) { + for (let i = selected.length-1; i >= 0; i--) { + TargetNode.parentNode.parentNode.insertBefore(selected[i], TargetNode.parentNode.nextSibling); + } + } else { + selected.forEach(function(s){ + TargetNode.parentNode.parentNode.appendChild(s); + }); + } + } + if (TargetNode.classList.contains("drag_enter_center")) { + let newParent = document.getElementById("ct" + TargetNode.id.substr(2)); + if (opt.append_child_tab == "bottom") { + selected.forEach(function(s){ + newParent.appendChild(s); + }); + } else { + for (let i = selected.length-1; i >= 0; i--) { + newParent.prepend(selected[i]); + } + } + } + } + if (TargetNode.classList.contains("group")) { // dropped on group (tab list) + selected.forEach(function(s){ + SetTabClass(s.id, false); + }); + let newParent = document.getElementById("ct" + TargetNode.id); + selected.forEach(function(s){ + newParent.appendChild(s); + }); + } + if (TargetNode.classList.contains("group_drag_box")) { // dropped on group button (group list) + selected.forEach(function(s){ + SetTabClass(s.id, false); + }); + + let newParent = document.getElementById("ct" + TargetNode.id.substr(1)); + selected.forEach(function(s){ + newParent.appendChild(s); + }); + } + } + if (DragAndDrop.DragNodeClass == "folder") { // dropped on group button (group list) + if (opt.debug) console.log("DragNodeClass is folder"); + if (TargetNode.classList.contains("group")) { // dropped on group (tab list) + let newParent = document.getElementById("cf" + TargetNode.id); + selected.forEach(function(s){ + newParent.appendChild(s); + }); + } + if (TargetNode.classList.contains("group_drag_box")) { // dropped on group button (group list) + let newParent = document.getElementById("cf" + TargetNode.id.substr(1)); + selected.forEach(function(s){ + newParent.appendChild(s); + }); + } + if (TargetNode.parentNode.classList.contains("folder")) { // dropped on folder + if (TargetNode.classList.contains("drag_entered_top")) { + selected.forEach(function(s){ + TargetNode.parentNode.parentNode.insertBefore(s, TargetNode.parentNode); + }); + } + if (TargetNode.classList.contains("drag_entered_bottom")) { + if (TargetNode.parentNode.nextSibling != null) { + for(let i = selected.length-1; i >= 0; i--) { + TargetNode.parentNode.parentNode.insertBefore(selected[i], TargetNode.parentNode.nextSibling); + } + } else { + selected.forEach(function(s){ + TargetNode.parentNode.parentNode.appendChild(s); + }); + } + } + if (TargetNode.classList.contains("drag_enter_center")) { + let newParent = document.getElementById("cf" + TargetNode.id.substr(2)); + if (opt.append_child_tab == "bottom") { + selected.forEach(function(s){ + newParent.appendChild(s); + }); + } else { + for (let i = selected.length-1; i >= 0; i--) { + newParent.prepend(selected[i]); + } + } + } + } + setTimeout(function() { + SaveFolders(); + }, 300); + } + + if (TargetNode.parentNode.classList.contains("group_button") && DragAndDrop.DragNodeClass == "group") { + if (TargetNode.classList.contains("group_button_drag_entered_top")) { + TargetNode.parentNode.parentNode.insertBefore(selected[0], TargetNode.parentNode); + } else { + if (TargetNode.parentNode.nextSibling != null) { + TargetNode.parentNode.parentNode.insertBefore(selected[0], TargetNode.parentNode.nextSibling); + } else { + TargetNode.parentNode.parentNode.appendChild(selected[0]); + } + } + UpdateBgGroupsOrder(); + RearrangeGroupsLists(); + if (opt.syncro_tabbar_groups_tabs_order) { + schedule_rearrange_tabs++; + } + } + + if (opt.syncro_tabbar_tabs_order && DragAndDrop.TabsIds[0] != undefined) { + let tabIds = Array.prototype.map.call(document.querySelectorAll(".pin, .tab"), function(s){ + return parseInt(s.id); + }); + if (opt.debug) console.log("After DropToTarget, will Syncro tabbar tabs order, TabsIds array is:"); + if (opt.debug) console.log(DragAndDrop.TabsIds); + chrome.tabs.move(DragAndDrop.TabsIds, {index: tabIds.indexOf(DragAndDrop.TabsIds[0])}); + setTimeout(function() { + schedule_rearrange_tabs++; + }, 500); + } + } + DragAndDrop.timeout = false; + setTimeout(function() { + EmptyDragAndDrop(); + RefreshExpandStates(); + RefreshCounters(); + RefreshGUI(); + schedule_update_data++; + }, 100); + + CleanUpDragClasses(); + +} + +function DropTargetsFront(ExcludeNode, tabs, groups) { + if (ExcludeNode == undefined) { + ExcludeNode = {parentNode: {childNodes: [{id: "x"}, {id: "x"}, {id: "x"}], id: "x"}}; + } + if (tabs) { + document.querySelectorAll("#"+active_group+" .drag_enter_center:not(#"+ExcludeNode.parentNode.childNodes[0].id+")").forEach(function(s){ + s.style.zIndex = 9911; + }); + document.querySelectorAll("#"+active_group+" .drag_enter_center:not(#"+ExcludeNode.parentNode.childNodes[0].id+")").forEach(function(s){ + s.style.zIndex = 9911; + }); + document.querySelectorAll(".drag_entered_top:not(#"+ExcludeNode.parentNode.childNodes[1].id+")").forEach(function(s){ + s.style.zIndex = 9915; + }); + document.querySelectorAll(".drag_entered_bottom:not(#"+ExcludeNode.parentNode.childNodes[2].id+")").forEach(function(s){ + s.style.zIndex = 9920; + }); + } + if (groups) { + document.querySelectorAll(".group_button:not(#"+ExcludeNode.parentNode.id+") .group_drag_box").forEach(function(s){ + s.style.zIndex = -1; + }); + } +} + + +function CleanUpDragClasses() { + document.querySelectorAll(".highlighted_drop_target").forEach(function(s){ + s.classList.remove("highlighted_drop_target"); + }); + document.querySelectorAll(".highlighted_selected").forEach(function(s){ + s.classList.add("selected_tab"); + s.classList.remove("highlighted_selected"); + }); + document.querySelectorAll(".selected_frozen").forEach(function(s){ + s.classList.add("selected_tab"); + s.classList.remove("selected_frozen"); + }); + document.querySelectorAll(".selected_temporarly").forEach(function(s){ + s.classList.remove("selected_tab"); + s.classList.remove("selected_temporarly"); + }); + document.querySelectorAll(".highlighted_selected").forEach(function(s){ + s.classList.add("selected_folder"); + s.classList.remove("highlighted_selected"); + }); + document.querySelectorAll(".selected_folder_frozen").forEach(function(s){ + s.classList.add("selected_folder"); + s.classList.remove("selected_folder_frozen"); + }); + document.querySelectorAll(".selected_folder_temporarly").forEach(function(s){ + s.classList.remove("selected_folder"); + s.classList.remove("selected_folder_temporarly"); + }); + document.querySelectorAll(".tab_header_hover").forEach(function(s){ + s.classList.remove("tab_header_hover"); + }); + document.querySelectorAll(".folder_header").forEach(function(s){ + s.classList.remove("folder_header_hover"); + }); + document.querySelectorAll(".dragged_group_button").forEach(function(s){ // dragged group button + s.classList.remove("dragged_group_button"); + }); + document.querySelectorAll(".dragged_tree").forEach(function(s){ + s.classList.remove("dragged_tree"); + }); + document.querySelectorAll(".dragged_selected").forEach(function(s){ + s.classList.remove("dragged_selected"); + }); + document.querySelectorAll(".drop_target").forEach(function(s){ + s.style.zIndex = ""; + }); +} diff --git a/scripts/folders.js b/scripts/folders.js index bd86d59..d7d8f33 100644 --- a/scripts/folders.js +++ b/scripts/folders.js @@ -2,194 +2,413 @@ // Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ - -function AddNewFolder(p) { +function AddNewFolder(ParentId, Name, Index, ExpandState) { var newId = GenerateNewFolderID(); - bgfolders[newId] = { id: newId, parent: (p.ParentId ? p.ParentId : ""), index: (p.index ? p.index : 0), name: (p.name ? p.name : caption_noname_group), expand: (p.expand ? p.expand : "n") }; - AppendFolder({id: newId, ParentId: (p.ParentId ? p.ParentId : ""), name: caption_noname_group}); + bgfolders[newId] = { id: newId, parent: (ParentId ? ParentId : ""), index: (Index ? Index : 0), name: (Name ? Name : caption_noname_group), expand: (ExpandState ? ExpandState : "") }; + AppendFolder(newId, caption_noname_group, (ParentId ? ParentId : ""), undefined, true); SaveFolders(); RefreshCounters(); + RefreshExpandStates(); return newId; } -function AppendFolder(param) { - if ($("#"+param.id).length == 0) { - var fd = document.createElement("div"); fd.className = "folder "; if (param.expand) { fd.className += param.expand } fd.id = param.id;// FOLDER - var dc = document.createElement("div"); dc.className = "drop_target drag_enter_center"; dc.id = "dc"+param.id; fd.appendChild(dc); // DROP TARGET CENTER - var dt = document.createElement("div"); dt.className = "drop_target drag_entered_top"; dt.id = "du"+param.id; fd.appendChild(dt); // DROP TARGET TOP - var db = document.createElement("div"); db.className = "drop_target drag_entered_bottom"; db.id = "dd"+param.id; fd.appendChild(db); // DROP TARGET BOTTOM - var fh = document.createElement("div"); fh.className = opt.always_show_close ? "folder_header close_show" : "folder_header"; fh.id = "folder_header"+param.id; fh.draggable = true; fd.appendChild(fh); // HEADER - var ex = document.createElement("div"); ex.className = "folder_icon"; ex.id = "fop"+param.id; fh.appendChild(ex); - var ft = document.createElement("div"); ft.className = "folder_title"; ft.id = "folder_title"+param.id; ft.textContent = param.name; fh.appendChild(ft); // TITLE - var cf = document.createElement("div"); cf.className = "children"; cf.id = "cf"+param.id; fd.appendChild(cf); - var ch = document.createElement("div"); ch.className = "children"; ch.id = "ch"+param.id; fd.appendChild(ch); + +function AppendFolder(folderId, Name, ParentId, Expand, SetEvents) { + if (document.getElementById(folderId) == null) { + var fd = document.createElement("div"); fd.className = "folder "; if (Expand) { fd.className += Expand } fd.id = folderId;// FOLDER + var dc = document.createElement("div"); dc.className = "drop_target drag_enter_center"; dc.id = "dc"+folderId; fd.appendChild(dc); // DROP TARGET CENTER + var du = document.createElement("div"); du.className = "drop_target drag_entered_top"; du.id = "du"+folderId; fd.appendChild(du); // DROP TARGET TOP + var dd = document.createElement("div"); dd.className = "drop_target drag_entered_bottom"; dd.id = "dd"+folderId; fd.appendChild(dd); // DROP TARGET BOTTOM + var fh = document.createElement("div"); fh.className = (opt.always_show_close && !opt.never_show_close) ? "folder_header close_show" : "folder_header"; fh.id = "folder_header"+folderId; if (SetEvents) {fh.draggable = true;} fd.appendChild(fh); // HEADER + var ex = document.createElement("div"); ex.className = "folder_icon"; ex.id = "fop"+folderId; fh.appendChild(ex); + var ft = document.createElement("div"); ft.className = "folder_title"; ft.id = "folder_title"+folderId; ft.textContent = Name; fh.appendChild(ft); // TITLE + var cf = document.createElement("div"); cf.className = "children_folders"; cf.id = "cf"+folderId; fd.appendChild(cf); + var ct = document.createElement("div"); ct.className = "children_tabs"; ct.id = "ct"+folderId; fd.appendChild(ct); if (!opt.never_show_close) { - var cl = document.createElement("div"); cl.className = "close"; cl.id = "close"+param.id; fh.appendChild(cl); // CLOSE BUTTON - var ci = document.createElement("div"); ci.className = "close_img"; ci.id = "close_img"+param.id; cl.appendChild(ci); + var cl = document.createElement("div"); cl.className = "close"; cl.id = "close"+folderId; fh.appendChild(cl); // CLOSE BUTTON + var ci = document.createElement("div"); ci.className = "close_img"; ci.id = "close_img"+folderId; cl.appendChild(ci); } - if (param.ParentId == "" || param.ParentId == undefined || $("#cf"+param.ParentId).length == 0) { - $("#cf"+active_group).append(fd); + + if (SetEvents) { + ct.ondblclick = function(event) { + if (event.target == this) { + ActionClickGroup(this.parentNode, opt.dbclick_group); + } + } + cf.ondblclick = function(event) { + if (event.target == this) { + ActionClickGroup(this.parentNode, opt.dbclick_group); + } + } + + cf.onmousedown = function(event) { + if (event.target == this) { + if (event.which == 1) { + DeselectFolders(); + DeselectTabs(); + } + if (event.which == 2 && event.target == this) { + event.stopImmediatePropagation(); + ActionClickGroup(this.parentNode, opt.midclick_group); + } + if (event.which == 3) { + ShowFGlobalMenu(event); + } + } + } + ct.onmousedown = function(event) { + if (event.target == this) { + if (event.which == 1) { + DeselectFolders(); + DeselectTabs(); + } + if (event.which == 2 && event.target == this) { + event.stopImmediatePropagation(); + ActionClickGroup(this.parentNode, opt.midclick_group); + } + if (event.which == 3) { + ShowFGlobalMenu(event); + } + } + } + + if (!opt.never_show_close) { + cl.onmousedown = function(event) { + event.stopImmediatePropagation(); + if (event.which != 3) { + RemoveFolder(this.parentNode.parentNode.id); + } + } + cl.onmouseenter = function(event) { + this.classList.add("close_hover"); + } + cl.onmouseleave = function(event) { + this.classList.remove("close_hover"); + } + } + fh.onmousedown = function(event) { + if (document.getElementById("main_menu").style.top != "-1000px") { + HideMenus(); + } + // SELECT FOLDER + if (event.which == 1 && !event.shiftKey) { + DeselectTabs(); + if (!event.ctrlKey) { + DeselectFolders(); + } + event.target.parentNode.parentNode.classList.toggle("selected_folder"); + } + if (event.which == 2) { + event.preventDefault(); + ActionClickFolder(this.parentNode, opt.midclick_folder); + } + // SHOW FOLDER MENU + if (event.which == 3) { + ShowFolderMenu(this.parentNode, event); + } + } + // edit folder + fh.ondblclick = function(event) { + if (event.which == 1 && !event.shiftKey && !event.ctrlKey && (event.target.classList.contains("folder_title") || event.target.classList.contains("folder_header"))) { + // if (event.which == 1) { + // ShowRenameFolderDialog(this.parentNode.id); + ActionClickFolder(this.parentNode, opt.dbclick_folder); + } + } + fh.ondragstart = function(event) { // DRAG START + event.stopPropagation(); + event.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0); + event.dataTransfer.setData("text", ""); + // event.dataTransfer.setData("TTSourceWindowId", CurrentWindowId); + CleanUpDragClasses(); + EmptyDragAndDrop(); + + if (opt.debug) console.log("started dragging folder"); + if (opt.debug) console.log(DragAndDrop.DragNodeClass); + + DropTargetsFront(this, true, false); + + if (this.parentNode.classList.contains("selected_folder") == false) { + if (opt.debug) console.log(this.parentNode.classList); + document.querySelectorAll(".selected_folder").forEach(function(s){ + s.classList.add("selected_folder_frozen"); + s.classList.remove("selected_folder"); + }); + this.parentNode.classList.add("selected_folder_temporarly"); + this.parentNode.classList.add("selected_folder"); + } else { + document.querySelectorAll(".group:not(#"+active_group+") .selected_folder").forEach(function(s){ + s.classList.add("selected_folder_frozen"); + s.classList.remove("selected_folder"); + }); + } + RemoveHeadersHoverClass(); + // let test_data = []; + document.querySelectorAll("[id='"+this.parentNode.id+"'], [id='"+this.parentNode.id+"'] .folder, [id='"+this.parentNode.id+"'] .tab").forEach(function(s){ + s.classList.add("dragged_tree"); + }); + document.querySelectorAll(".selected_tab, .selected_tab .tab, .selected_folder, .selected_folder .folder").forEach(function(s){ + s.classList.add("dragged_selected"); + // test_data.push(s.id); + }); + let Folders = GetSelectedFolders(); + + document.querySelectorAll("[id='"+this.parentNode.id+"'], [id='"+this.parentNode.id+"'] .folder, [id='"+this.parentNode.id+"'] .tab").forEach(function(s){ + s.classList.add("dragged_tree"); + }); + document.querySelectorAll(".selected_tab, .selected_tab .tab, .selected_folder, .selected_folder .folder").forEach(function(s){ + s.classList.add("dragged_selected"); + }); + + if (opt.max_tree_drag_drop_folders) { + document.querySelectorAll(".dragged_tree .folder").forEach(function(s){ + let parents = GetParentsByClass(s.parentNode, "dragged_tree"); + if (parents.length > DragAndDrop.Depth) { + DragAndDrop.Depth = parents.length; + } + }); + } else { + DragAndDrop.Depth = -1; + } + + DragAndDrop.DragNodeClass = "folder"; + DragAndDrop.TabsIds = Object.assign([], Folders.TabsIds); + DragAndDrop.TabsIdsParents = Object.assign([], Folders.TabsIdsParents); + DragAndDrop.Folders = Object.assign({}, Folders.Folders); + DragAndDrop.FoldersSelected = Object.assign([], Folders.FoldersSelected); + DragAndDrop.ComesFromWindowId = CurrentWindowId; + + chrome.runtime.sendMessage({ + command: "drag_drop", + DragNodeClass: DragAndDrop.DragNodeClass, + TabsIds: DragAndDrop.TabsIds, + TabsIdsParents: DragAndDrop.TabsIdsParents, + TabsIdsSelected: DragAndDrop.TabsIdsSelected, + ComesFromWindowId: CurrentWindowId, + Depth: DragAndDrop.Depth, + Folders: DragAndDrop.Folders, + FoldersSelected: DragAndDrop.FoldersSelected + }); + } + fh.ondragenter = function(event) { + this.classList.remove("folder_header_hover"); + } + fh.onmouseover = function(event) { + this.classList.add("folder_header_hover"); + if (opt.never_show_close == false && opt.always_show_close == false) { + this.classList.add("close_show"); + } + } + fh.onmouseleave = function(event) { + this.classList.remove("folder_header_hover"); + if (opt.never_show_close == false && opt.always_show_close == false) { + this.classList.remove("close_show"); + } + } + dc.ondragenter = function(event) { + // DRAGENTER PIN,TAB,FOLDER==>DROP ZONES + DragAndDrop.timeout = false; + setTimeout(function() { + DragAndDrop.timeout = true; + }, 1000); + if (DragAndDrop.DragNodeClass == "tab" || DragAndDrop.DragNodeClass == "folder") { + HighlightDragEnter(this, 0, "folder"); + } + } + du.ondragenter = function(event) { + // FOLDER==>FOLDER + if (DragAndDrop.DragNodeClass == "tab" || DragAndDrop.DragNodeClass == "folder") { + HighlightDragEnter(this, 1, "folder"); + } + } + dd.ondragenter = function(event) { + // FOLDER==>FOLDER + if (DragAndDrop.DragNodeClass == "tab" || DragAndDrop.DragNodeClass == "folder") { + HighlightDragEnter(this, 1, "folder"); + } + } + ex.onmousedown = function(event) { + if (document.getElementById("main_menu").style.top != "-1000px") { + HideMenus(); + } + // EXPAND/COLLAPSE FOLDER + if (event.which == 1 && !event.shiftKey && !event.ctrlKey) { + event.stopPropagation(); + EventExpandBox(this.parentNode.parentNode); + RefreshExpandStates(); + RefreshCounters(); + } + } + } + if (ParentId == "" || ParentId == undefined || document.getElementById("cf"+ParentId) == null) { + document.getElementById("cf"+active_group).appendChild(fd); } else { - $("#cf"+param.ParentId).append(fd); + document.getElementById("cf"+ParentId).appendChild(fd); } } } + function GenerateNewFolderID() { var newID = "f_"+GenerateRandomID(); - if ($("#"+newID)[0]) { - GenerateNewFolderID(); - } else { + if (document.getElementById(newID) == null) { return newID; + } else { + GenerateNewFolderID(); } } + function AppendFolders(Folders) { for (var folderId in Folders) { - AppendFolder({id: folderId, ParentId: Folders[folderId].parent, name: Folders[folderId].name, expand: Folders[folderId].expand}); + AppendFolder(folderId, Folders[folderId].name, Folders[folderId].parent, Folders[folderId].expand, true); } - // APPEND FOLDERS TO PARENTS for (var folderId in Folders) { - if ($("#"+folderId)[0] && Folders[folderId].parent != $("#"+folderId).parent().parent()[0].id) { - $("#cf"+Folders[folderId].parent).append($("#"+folderId)); + let f = document.getElementById(folderId); + let parent = document.getElementById("cf"+Folders[folderId].parent); + if (f != null && parent != null && Folders[folderId].parent != f.parentNode.parentNode.id) { + parent.appendChild(f); } } } + function SaveFolders() { - $(".folder").each(function() { - bgfolders[this.id].parent = $(this).parent().parent()[0].id; - bgfolders[this.id].index = $(this).index(); - bgfolders[this.id].expand = ($(this).is(".n") ? "n" : ($(this).is(".c") ? "c" : "o")); + document.querySelectorAll(".folder").forEach(function(s){ + bgfolders[s.id].parent = s.parentNode.parentNode.id; + bgfolders[s.id].index = Array.from(s.parentNode.children).indexOf(s); + bgfolders[s.id].expand = (s.classList.contains("c") ? "c" : (s.classList.contains("o") ? "o" : "")); }); chrome.runtime.sendMessage({command: "save_folders", folders: bgfolders, windowId: CurrentWindowId}); } + function RearrangeFolders(first_loop) { - $(".folder").each(function() { - if (bgfolders[this.id] && $(this).parent().children().eq(bgfolders[this.id].index)[0]) { - if ($(this).index() > bgfolders[this.id].index) { - $(this).insertBefore($(this).parent().children().eq(bgfolders[this.id].index)); + document.querySelectorAll(".folder").forEach(function(s){ + if (bgfolders[s.id] && s.parentNode.childNodes[bgfolders[s.id].index]) { + let Ind = Array.from(s.parentNode.children).indexOf(s); + if (Ind > bgfolders[s.id].index) { + s.parentNode.childNodes[bgfolders[s.id].index].parentNode.insertBefore(s, s.parentNode.childNodes[bgfolders[s.id].index]); } else { - $(this).insertAfter($(this).parent().children().eq(bgfolders[this.id].index)); + if (s.parentNode.childNodes[bgfolders[s.id].index].nextSibling != null) { + s.parentNode.childNodes[bgfolders[s.id].index].parentNode.insertBefore(s, s.parentNode.childNodes[bgfolders[s.id].index].nextSibling); + } else { + s.parentNode.childNodes[bgfolders[s.id].index].parentNode.appendChild(s); + } } } - if (bgfolders[this.id] && $(this).index() != bgfolders[this.id].index && first_loop) { + let newInd = Array.from(s.parentNode.children).indexOf(s); + if (bgfolders[s.id] && newInd != bgfolders[s.id].index && first_loop) { RearrangeFolders(false); } }); } + function RemoveFolder(FolderId) { - if ($("#"+FolderId)[0]) { + let folder = document.getElementById(FolderId); + if (folder != null) { + let CF = folder.childNodes[4]; // CF stands for DIV with children folders + let CT = folder.childNodes[5]; // CT stands for DIV with children tabs if (opt.promote_children == true) { - if (opt.promote_children_in_first_child == true && $("#cf"+FolderId).children().length > 0) { - let FirstChild = $("#cf"+FolderId).children()[0]; - $(FirstChild).insertAfter($("#"+FolderId)); - $("#cf"+FirstChild.id).append($("#cf"+FolderId).children()); - if ($("#ch"+FolderId).children().length > 0) { - $("#ch"+FirstChild.id).append($("#ch"+FolderId).children()); - } + if (opt.promote_children_in_first_child == true && CF.children.length > 0) { + let FirstFolderChild = CF.firstChild; + folder.parentNode.insertBefore(FirstFolderChild, folder); + let NewCF = FirstFolderChild.childNodes[4]; + while (CF.firstChild) { + NewCF.appendChild(CF.firstChild); + } + if (CT.childNodes.length > 0) { + let NewCT = FirstFolderChild.childNodes[5]; + while (CT.firstChild) { + NewCT.appendChild(CT.firstChild); + } + } } else { - $("#ch"+($("#"+FolderId).parent().parent()[0].id)).append($("#ch"+FolderId).children()); - $("#cf"+FolderId).children().insertAfter($("#"+FolderId)); + let NewCT = document.getElementById("ct"+folder.parentNode.parentNode.id); + // let NewCT = folder.parentNode.parentNode.childNodes[5]; + while (CT.firstChild) { + NewCT.appendChild(CT.firstChild); + } + while (CF.lastChild) { + folder.parentNode.insertBefore(CF.lastChild, folder); + } } } else { - $("#"+FolderId+" .tab").each(function() { - chrome.tabs.remove(parseInt(this.id), null); + document.querySelectorAll("#"+FolderId+" .tab").forEach(function(s){ + chrome.tabs.remove(parseInt(s.id), null); }); - $("#"+FolderId+" .folder").each(function() { - delete bgfolders[this.id]; + + document.querySelectorAll("#"+FolderId+" .folder").forEach(function(s){ + delete bgfolders[s.id]; }); } - $("#"+FolderId).remove(); + folder.parentNode.removeChild(folder); delete bgfolders[FolderId]; RefreshExpandStates(); chrome.runtime.sendMessage({command: "save_folders", folders: bgfolders, windowId: CurrentWindowId}); } } + function SetActiveFolder(FolderId) { - if ($("#"+FolderId).length > 0) { - $(".selected_folder").removeClass("selected_folder"); - $("#"+FolderId).addClass("selected_folder"); + let folder = document.getElementById(FolderId); + if (folder != null) { + document.querySelectorAll(".selected_folder").forEach(function(s){ + s.classList.remove("selected_folder"); + }); + folder.classList.add("selected_folder"); } } -// Rename folder popup -function ShowRenameFolderDialog(FolderId) { - $("#folder_edit_name")[0].value = bgfolders[FolderId].name; - $("#folder_edit_name").data("FolderId", FolderId); - $("#folder_edit").css({"display": "block", "top": $("#toolbar_groups").offset().top + 8, "left": 22}); + +function ShowRenameFolderDialog(FolderId) { // Rename folder popup + HideRenameDialogs(); + if (bgfolders[FolderId]) { + let name = document.getElementById("folder_edit_name"); + name.value = bgfolders[FolderId].name; + let folderEditDialog = document.getElementById("folder_edit"); + folderEditDialog.setAttribute("FolderId", FolderId); + folderEditDialog.style.display = "block"; + folderEditDialog.style.top = document.getElementById("toolbar").getBoundingClientRect().height + document.getElementById("pin_list").getBoundingClientRect().height + 8 + "px"; + folderEditDialog.style.left = "22px"; + setTimeout(function(){ + document.getElementById("folder_edit_name").select(); + },5); + } } -// when pressed OK in folder popup -function FolderRenameConfirm() { - $("#folder_edit_name")[0].value = $("#folder_edit_name")[0].value.replace(/[\f\n\r\v\t\<\>\+\-\(\)\.\,\;\:\~\/\|\?\@\!\"\'\£\$\%\&\^\#\=\*\[\]]?/gi, ""); - bgfolders[$("#folder_edit_name").data("FolderId")].name = $("#folder_edit_name")[0].value; - $("#folder_title"+$("#folder_edit_name").data("FolderId"))[0].innerText = $("#folder_edit_name")[0].value; - $(".edit_dialog").hide(0); + +function FolderRenameConfirm() { // when pressed OK in folder popup + let name = document.getElementById("folder_edit_name"); + let FolderId = document.getElementById("folder_edit").getAttribute("FolderId"); + name.value = name.value.replace(/[\f\n\r\v\t\<\>\+\-\(\)\.\,\;\:\~\/\|\?\@\!\"\'\£\$\%\&\^\#\=\*\[\]]?/gi, ""); + bgfolders[FolderId].name = name.value; + document.getElementById("folder_title" + FolderId).textContent = name.value; + HideRenameDialogs(); chrome.runtime.sendMessage({command: "save_folders", folders: bgfolders, windowId: CurrentWindowId}); RefreshCounters(); } -function SetFolderEvents() { - // EXPAND BOX - EXPAND / COLLAPSE - $(document).on("click", ".folder_icon", function(event) { - event.stopPropagation(); - if (event.button == 0) { - if ($(this).parent().parent().is(".o")) { - $(this).parent().parent().removeClass("o").addClass("c"); - } else { - if ($(this).parent().parent().is(".c")) { - $(this).parent().parent().removeClass("c").addClass("o"); - } - } - RefreshExpandStates(); - RefreshCounters(); - SaveFolders(); - } + +function DeselectFolders() { + document.querySelectorAll("#"+active_group+" .selected_folder").forEach(function(s){ + s.classList.remove("selected_folder"); }); - // SINGLE CLICK TO ACTIVATE FOLDER - $(document).on("click", ".folder_header", function(event) { - event.stopPropagation(); - if (event.button == 0 && !event.shiftKey) { - $("#"+active_group+" .tab").removeClass("selected_tab"); - if (!event.ctrlKey) { - $(".selected_folder:not(#"+($(this).parent()[0].id)+")").removeClass("selected_folder"); - } - // SetActiveFolder(); - $(this).parent().toggleClass("selected_folder"); - } - }); - // CLOSE TAB/PIN - $(document).on("mousedown", ".folder_header", function(event) { - if ((event.button == 1 && opt.close_with_MMB == true) || (event.button == 0 && $(event.target).is(".close, .close_img"))) { - RemoveFolder($(this).parent()[0].id); - } - if (event.button == 2) { - event.stopPropagation(); - ShowFolderMenu($(this).parent(), event); - } - }); - // edit folder dialog box - $(document).on("mousedown", "#folder_edit_discard", function(event) { - $(".edit_dialog").hide(0); - }); - $("#folder_edit_name").keyup(function(e) { - if (e.keyCode == 13) { - FolderRenameConfirm(); - } - }); - $(document).on("mousedown", "#folder_edit_confirm", function(event) { - FolderRenameConfirm(); - }); - // edit folder - $(document).on("dblclick", ".folder_title", function(event) { - if (event.button == 0) { - ShowRenameFolderDialog($(this).parent().parent()[0].id); - } - }); - $(document).on("mouseover", ".folder_header", function(event) { - $(this).addClass("folder_header_hover"); - if (opt.always_show_close == false) { - $(this).addClass("close_show"); - } - }); - $(document).on("mouseleave", ".folder_header", function(event) { - $(this).removeClass("folder_header_hover"); - if (opt.always_show_close == false) { - $(this).removeClass("close_show"); - } - }); -} \ No newline at end of file +} + +function ActionClickFolder(FolderNode, bgOption) { + if (bgOption == "rename_folder") { + ShowRenameFolderDialog(FolderNode.id); + } + if (bgOption == "new_folder") { + AddNewFolder(FolderNode.id, undefined, undefined, undefined); + } + if (bgOption == "new_tab") { + OpenNewTab(false, FolderNode.id); + } + if (bgOption == "expand_collapse") { + EventExpandBox(FolderNode); + } + if (bgOption == "close_folder") { + RemoveFolder(FolderNode.id); + } + if (bgOption == "unload_folder") { + let tabsArr = []; + document.querySelectorAll("#"+FolderNode.id+" .tab").forEach(function(s){ + tabsArr.push(parseInt(s.id)); + }); + DiscardTabs(tabsArr); + } +} + diff --git a/scripts/global.js b/scripts/global.js index 33c0fc0..4876e51 100644 --- a/scripts/global.js +++ b/scripts/global.js @@ -11,25 +11,24 @@ var schedule_rearrange_tabs = 0; var schedule_rearrange_reverse = false; var windows = {}; var tabs = {}; -var MouseHoverOver = ""; +var tt_ids = {}; var DragAndDrop = { timeout: false, - DragNode: undefined, + Depth: 0, + // DragNode: undefined, DragNodeClass: "", TabsIds: [], TabsIdsParents: [], TabsIdsSelected: [], Folders: {}, FoldersSelected: [], - ComesFromWindowId: 0, - DroppedToWindowId: 0, - Depth: 0 + ComesFromWindowId: undefined, + DroppedToWindowId: 0 }; -var menuItemId = 0; +var menuItemNode; var CurrentWindowId = 0; var SearchIndex = 0; var active_group = "tab_list"; -var PickColor = ""; var opt = {}; var browserId = navigator.userAgent.match("Opera") !== null ? "O" : ( navigator.userAgent.match("Vivaldi") !== null ? "V" : (navigator.userAgent.match("Firefox") !== null ? "F" : "C" ) ); var bgtabs = {}; @@ -40,7 +39,7 @@ var caption_loading = chrome.i18n.getMessage("caption_loading"); var caption_searchbox = chrome.i18n.getMessage("caption_searchbox"); var caption_ungrouped_group = chrome.i18n.getMessage("caption_ungrouped_group"); var caption_noname_group = chrome.i18n.getMessage("caption_noname_group"); -var DefaultToolbar = +const DefaultToolbar = '
'+ '
'+ '
'+ @@ -71,8 +70,8 @@ var DefaultToolbar = '
'+ '
' : '')+ - '
'+ - '
'+ + '
'+ + '
'+ '
'+ '
'+ '
'+ @@ -101,28 +100,30 @@ var DefaultTheme = { "ToolbarShow": true, "ColorsSet": {}, "TabsSizeSetNumber": 2, + "TabsMargins": "2", "theme_name": "untitled", - "theme_version": 2, + "theme_version": 3, "toolbar": DefaultToolbar, "unused_buttons": "" }; var DefaultPreferences = { "skip_load": false, - "pin_list_multi_row": false, - "close_with_MMB": true, + "pin_list_multi_row": true, "always_show_close": false, + "never_show_close": false, "allow_pin_close": false, "append_child_tab": "bottom", "append_child_tab_after_limit": "after", "append_orphan_tab": "bottom", "after_closing_active_tab": "below_seek_in_parent", - "close_other_trees": false, + "collapse_other_trees": false, + "open_tree_on_hover": true, "promote_children": true, "promote_children_in_first_child": true, - "open_tree_on_hover": true, "max_tree_depth": -1, + // "max_tree_depth_folders": 0, "max_tree_drag_drop": true, - "never_show_close": false, + "max_tree_drag_drop_folders": false, "switch_with_scroll": false, "syncro_tabbar_tabs_order": true, "show_counter_groups": true, @@ -130,10 +131,17 @@ var DefaultPreferences = { "show_counter_tabs_hints": true, "groups_toolbar_default": true, "syncro_tabbar_groups_tabs_order": true, + "midclick_tab": "close_tab", + "dbclick_tab": "new_tab", + "dbclick_group": "new_tab", + "midclick_group": "nothing", + "midclick_folder": "nothing", + "dbclick_folder": "rename_folder", "debug": false }; var theme = { "TabsSizeSetNumber": 2, + "TabsMargins": "2", "ToolbarShow": true, "toolbar": DefaultToolbar }; @@ -159,35 +167,69 @@ function HexToRGB(hex, alpha){ if (alpha) { return 'rgba('+r+', '+g+', '+b+', '+alpha+')'; } else { return 'rgb('+r+', '+g+', '+b+')'; } } - function GetCurrentTheme() { chrome.storage.local.get(null, function(items) { if (items["current_theme"] && items["themes"] && items["themes"][items["current_theme"]]) { theme = items["themes"][items["current_theme"]]; + if (theme.theme_version == 1) { + theme["ColorsSet"]["scrollbar_height"] = theme.ScrollbarPinList + "px"; + theme["ColorsSet"]["scrollbar_width"] = theme.ScrollbarTabList + "px"; + theme["toolbar"] = DefaultToolbar; + theme["unused_buttons"] = ""; + } + if (theme.theme_version == 2) { + SelectedTheme["TabsMargins"] = "2"; + } } else { theme = Object.assign({}, DefaultTheme); } }); } + function ApplyTheme(theme) { + if (theme.theme_version == 1) { + theme["ColorsSet"]["scrollbar_height"] = theme.ScrollbarPinList + "px"; + theme["ColorsSet"]["scrollbar_width"] = theme.ScrollbarTabList + "px"; + theme["toolbar"] = DefaultToolbar; + theme["unused_buttons"] = ""; + } + if (theme.theme_version == 2) { + theme["TabsMargins"] = "2"; + } RestoreStateOfGroupsToolbar(); ApplySizeSet(theme["TabsSizeSetNumber"]); ApplyColorsSet(theme["ColorsSet"]); - if (theme.ToolbarShow) { + ApplyTabsMargins(theme["TabsMargins"]); + if (theme.ToolbarShow == true) { + SetToolbarEvents(true, false, false, ""); if (theme.theme_version == DefaultTheme.theme_version) { - $("#toolbar").html(theme.toolbar); + document.getElementById("toolbar").innerHTML = theme.toolbar; if (browserId == "F") { - $(".button#button_load_bak1, .button#button_load_bak2, .button#button_load_bak3").remove(); + document.querySelectorAll(".button#button_load_bak1, .button#button_load_bak2, .button#button_load_bak3").forEach(function(s){ + s.parentNode.removeChild(s); + }); } } else { - $("#toolbar").html(DefaultToolbar); + document.getElementById("toolbar").innerHTML = DefaultToolbar; } - } - RestoreToolbarShelf(); - RestoreToolbarSearchFilter(); + SetToolbarEvents(false, true, true, "mousedown"); + RestoreToolbarShelf(); + RestoreToolbarSearchFilter(); + } else { + document.getElementById("toolbar").innerHTML = ""; + RefreshGUI(); + } + + for (var groupId in bggroups) { + let groupTitle = document.getElementById("_gte"+groupId); + if (groupTitle != null && bggroups[groupId].font == "") { + groupTitle.style.color = ""; + } + } Loadi18n(); } -/* theme colors is an object with css variables (but without --), for example; {"button_background": "#f2f2f2", "filter_box_border": "#cccccc"} */ + +// theme colors is an object with css variables (but without --), for example; {"button_background": "#f2f2f2", "filter_box_border": "#cccccc"} function ApplyColorsSet(ThemeColors){ let css_variables = ""; for (let css_variable in ThemeColors) { @@ -221,21 +263,22 @@ function ApplySizeSet(size){ } } -function LoadPreferences() { - opt = Object.assign({}, DefaultPreferences); - chrome.storage.local.get(null, function(items) { - if (items["preferences"]) { - for (var parameter in items["preferences"]) { - if (opt[parameter] != undefined) { - opt[parameter] = items["preferences"][parameter]; - } +function ApplyTabsMargins(size){ + for (let si = 0; si < document.styleSheets.length; si++) { + if ((document.styleSheets[si].ownerNode.id).match("tabs_margin") != null) { + if (document.styleSheets[si].ownerNode.id == "tabs_margin_"+size) { + document.styleSheets.item(si).disabled = false; + } else { + document.styleSheets.item(si).disabled = true; } } - }); + } } + function LoadDefaultPreferences() { opt = Object.assign({}, DefaultPreferences); } + function SavePreferences() { chrome.runtime.sendMessage({command: "save_preferences", opt: opt}, function(response) { setTimeout(function() { @@ -243,6 +286,7 @@ function SavePreferences() { }, 300); }); } + function ShowOpenFileDialog(id, extension) { let body = document.getElementById("body"); let inp = document.createElement("input"); @@ -251,23 +295,43 @@ function ShowOpenFileDialog(id, extension) { inp.accept = extension; inp.style.display = "none"; body.appendChild(inp); - $("#"+id).click(); -} -function SaveFile(filename, data) { - let d = JSON.stringify(data); - let body = document.getElementById("body"); - let link = document.createElement("a"); - link.target = "_self"; - link.download = filename; - link.href = "data:text/csv;charset=utf-8," + encodeURIComponent(d); - body.appendChild(link); - link.click(); - link.remove(); + inp.click(); + return inp; } -function log(m) { - if (opt.debug) { - console.log(m); - } - // chrome.runtime.sendMessage({command: "console_log", m: m}); +function SaveFile(filename, data) { + chrome.tabs.query({currentWindow: true, active: true}, function(activeTab) { + chrome.tabs.create({url: "download.html"}, function(tab) { + setTimeout(function() { + chrome.runtime.sendMessage({command: "show_save_file_dialog", currentTabId: activeTab[0].id, selfTabId: tab.id, data: data, filename: filename}); + }, 100); + }); + }); +} + +// function SaveFile(filename, data) { + // let file = new File([JSON.stringify(data)], filename, {type: "text/csv;charset=utf-8"} ); + // let body = document.getElementById("body"); + // let savelink = document.createElement("a"); + // savelink.target = "_blank"; + // savelink.style.display = "none"; + // savelink.type = "file"; + // savelink.download = filename; + // savelink.href = URL.createObjectURL(file); + // body.appendChild(savelink); + // savelink.click(); + // savelink.parentNode.removeChild(savelink); +// } + +function EmptyDragAndDrop() { + DragAndDrop.timeout = false; + DragAndDrop.DragNodeClass = ""; + DragAndDrop.DroppedToWindowId = 0; + DragAndDrop.ComesFromWindowId = undefined; + DragAndDrop.Depth = 0; + DragAndDrop.TabsIds = []; + DragAndDrop.TabsIdsParents = []; + DragAndDrop.TabsIdsSelected = []; + DragAndDrop.Folders = {}; + DragAndDrop.FoldersSelected = []; } \ No newline at end of file diff --git a/scripts/groups.js b/scripts/groups.js index a54858b..ba26f21 100644 --- a/scripts/groups.js +++ b/scripts/groups.js @@ -7,151 +7,291 @@ function SaveGroups() { chrome.runtime.sendMessage({command: "save_groups", groups: bggroups, windowId: CurrentWindowId}); } + function AppendGroups(Groups) { - // var scroll = $("#group_list").scrollTop(); + // let GroupList = document.getElementById("group_list"); + // let scroll = GroupList.scrollTop; + + AppendGroupToList("tab_list", caption_ungrouped_group, "", true); + for (var group in Groups) { - AppendGroupToList(Groups[group].id, Groups[group].name, Groups[group].font); + AppendGroupToList(Groups[group].id, Groups[group].name, Groups[group].font, true); + if (document.querySelectorAll(".group").length == Object.keys(Groups).length) { + RearrangeGroupsButtons(); + setTimeout(function() { + RearrangeGroupsLists(); + }, 50); + } } - setTimeout(function() { - RearrangeGroupsButtons(0); - }, 1000); } -function RearrangeGroupsButtons(stack) { - $(".group_button").each(function() { - let groupId = (this.id).substr(1); +function RearrangeGroupsButtons(first_loop) { + document.querySelectorAll(".group_button").forEach(function(s){ + let groupId = (s.id).substr(1); if (bggroups[groupId]) { - if ($("#group_list").children().eq(bggroups[groupId].index)[0] && $(this).index() > bggroups[groupId].index) { - $(this).insertBefore($("#group_list").children().eq(bggroups[groupId].index)[0]); - } else { - if ($("#group_list").children().eq(bggroups[groupId].index)[0] && $(this).index() < bggroups[groupId].index) { - $(this).insertAfter($("#group_list").children().eq(bggroups[groupId].index)[0]); + if (s.parentNode.childNodes[bggroups[groupId].index] != undefined) { + let Ind = Array.from(s.parentNode.children).indexOf(s); + if (Ind > bggroups[groupId].index) { + s.parentNode.childNodes[bggroups[groupId].index].parentNode.insertBefore(s, s.parentNode.childNodes[bggroups[groupId].index]); + } else { + if (s.parentNode.childNodes[bggroups[groupId].index].nextSibling != null) { + s.parentNode.childNodes[bggroups[groupId].index].parentNode.insertBefore(s, s.parentNode.childNodes[bggroups[groupId].index].nextSibling); + } else { + s.parentNode.childNodes[bggroups[groupId].index].parentNode.appendChild(s); + } + } + let newInd = Array.from(s.parentNode.children).indexOf(s); + if (newInd != bggroups[groupId].index && first_loop) { + RearrangeGroupsButtons(false); } } - if ($(this).index() != bggroups[groupId].index && stack < 10) { - RearrangeGroupsButtons(stack+1); - } } }); } -function RearrangeGroupsLists() { - let scroll = $("#"+active_group).scrollTop(); - $(".group_button").each(function() { - let groupId = (this.id).substr(1); - if ($("#"+groupId)[0]) { - $("#groups").append($("#"+groupId)); - } - }); - $("#"+active_group).scrollTop(scroll); -} -function AppendGroupToList(groupId, group_name, font_color) { - if ($("#"+groupId).length == 0 && $("#groups")[0]) { - var grp = document.createElement("div"); grp.className = "group"; grp.id = groupId; $("#groups")[0].appendChild(grp); - var gcf = document.createElement("div"); gcf.className = "children_folders"; gcf.id = "cf"+groupId; grp.appendChild(gcf); - var gct = document.createElement("div"); gct.className = "children_tabs"; gct.id = "ch"+groupId; grp.appendChild(gct); +function RearrangeGroupsLists() { + let activegroup = document.getElementById(active_group); + let scroll = activegroup.scrollTop; + let groups = document.getElementById("groups"); + document.querySelectorAll(".group_button").forEach(function(s){ + let group = document.getElementById((s.id).substr(1)); + if (group != null) { + groups.appendChild(group); + } + }); + activegroup.scrollTop = scroll; +} + +function AppendGroupToList(groupId, group_name, font_color, SetEvents) { + if (document.getElementById(groupId) == null) { + let grp = document.createElement("div"); grp.className = "group"; grp.id = groupId; grp.style.display = "none"; document.getElementById("groups").appendChild(grp); + let gcf = document.createElement("div"); gcf.className = "children_folders"; gcf.id = "cf"+groupId; grp.appendChild(gcf); + let gct = document.createElement("div"); gct.className = "children_tabs"; gct.id = "ct"+groupId; grp.appendChild(gct); + if (SetEvents) { + grp.onmousedown = function(event) { + event.stopImmediatePropagation(); + if (event.which == 1 && event.target == this) { + DeselectFolders(); + DeselectTabs(); + HideMenus(); + } + if (event.which == 2) { + event.preventDefault(); + ActionClickGroup(this, opt.midclick_group); + } + if (event.which == 3 && event.target.id == this.id) { + // SHOW MENU + ShowFGlobalMenu(event); + } + } + grp.ondragenter = function(event) { + // PIN,TAB==>GROUP + if (event.target.id == this.id && (DragAndDrop.DragNodeClass == "tab" || DragAndDrop.DragNodeClass == "folder")) { + HighlightNode(this); + } + } + // DOUBLE CLICK ACTION + grp.ondblclick = function(event) { + if (event.target.id == this.id) { + ActionClickGroup(this, opt.dbclick_group); + } + } + + if (opt.switch_with_scroll) { + BindTabsSwitchingToMouseWheel(groupId); + } + + } + } - if ($("#_"+groupId).length == 0) { - var gbn = document.createElement("div"); gbn.className = "group_button"; gbn.id = "_"+groupId; $("#group_list")[0].appendChild(gbn); - var gte = document.createElement("span"); gte.className = "group_title"; gte.id = "_gte"+groupId; gte.textContent = group_name; if (font_color != "") {gte.style.color = "#"+font_color;} gbn.appendChild(gte); - var gtd = document.createElement("div"); gtd.className = "group_drag_box"; gtd.draggable = true; gtd.id = "-"+groupId; gbn.appendChild(gtd); - } - if (groupId != active_group) { - $("#"+groupId).hide(); + + if (document.getElementById("_"+groupId) == null) { + let gbn = document.createElement("div"); gbn.className = "group_button"; gbn.id = "_"+groupId; document.getElementById("group_list").appendChild(gbn); + let gte = document.createElement("span"); gte.className = "group_title"; gte.id = "_gte"+groupId; gte.textContent = group_name; + if (font_color != "") { + gte.style.color = "#"+font_color; + } else { + gte.style.color = window.getComputedStyle(document.getElementById("body"), null).getPropertyValue("--group_list_default_font_color"); + } + gbn.appendChild(gte); + let gtd = document.createElement("div"); gtd.className = "drop_target group_drag_box"; if (SetEvents) {gtd.draggable = true;} gtd.id = "-"+groupId; gbn.appendChild(gtd); + let gdd = document.createElement("div"); gdd.className = "drop_target group_button_drag_entered_bottom"; gdd.id = "dd"+groupId; gbn.appendChild(gdd); + let gdu = document.createElement("div"); gdu.className = "drop_target group_button_drag_entered_top"; gdu.id = "du"+groupId; gbn.appendChild(gdu); + + if (SetEvents) { + + // ACTIVATE GROUP + gtd.onclick = function(event) { + SetActiveGroup(this.id.substr(1), true, true); + } + + // SHOW GROUP MENU + gbn.onmousedown = function(event) { + // event.stopImmediatePropagation(); + if (event.which == 3) { + ShowFGroupMenu(document.getElementById(this.id.substr(1)), event); + } + } + + // EDIT GROUP + gtd.ondblclick = function(event) { + if (event.which == 1 && this.id != "-tab_list") { + ShowGroupEditWindow((this.id).substr(1)); + } + } + + // DRAGGING GROUPS + gtd.ondragstart = function(event) { // DRAG START + event.stopPropagation(); + event.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0); + event.dataTransfer.setData("text", ""); + // event.dataTransfer.setData("text/plain", ""); + // event.dataTransfer.setData("TTSourceWindowId", CurrentWindowId); + CleanUpDragClasses(); + EmptyDragAndDrop(); + + DragAndDrop.ComesFromWindowId = CurrentWindowId; + DragAndDrop.DragNodeClass = "group"; + // DragAndDrop.DragNode = event.target.parentNode; + + this.parentNode.classList.add("dragged_group_button"); + // event.dataTransfer.setData("null", "null"); + DropTargetsFront(this, false, true); + } + + gtd.ondragenter = function(event) { // DRAG START + if (DragAndDrop.DragNodeClass == "tab" || DragAndDrop.DragNodeClass == "folder") { + HighlightNode(this); + } + } + + gdu.ondragenter = function(event) { // DRAG START + if (DragAndDrop.DragNodeClass == "group") { + HighlightNode(this); + } + } + + gdd.ondragenter = function(event) { // DRAG START + // GROUP BUTTON==>GROUP BUTTON + if (DragAndDrop.DragNodeClass == "group") { + HighlightNode(this); + } + } + // scroll groups + // $(document).on("mousedown", "#scroll_group_up, #scroll_group_down", function(event) { + // IOKeys.LMB = true; + // ScrollGroupList($(this).is("#scroll_group_up")); + // }); + // $(document).on("mouseleave", "#scroll_group_up, #scroll_group_down", function(event) { + // IOKeys.LMB = false; + // }); + } } RefreshGUI(); - - if (opt.switch_with_scroll) { - BindTabsSwitchingToMouseWheel(); - } } function GenerateNewGroupID(){ - var newID = "g_"+GenerateRandomID(); - if ($("#"+newID)[0]) { - GenerateNewGroupID(); - } else { + let newID = "g_"+GenerateRandomID(); + if (document.getElementById(newID) == null) { return newID; + } else { + GenerateNewGroupID(); } } -function AddNewGroup(p) { - var newId = GenerateNewGroupID(); - bggroups[newId] = { id: newId, index: 0, active_tab: 0, active_tab_ttid: "", name: (p.name ? p.name : caption_noname_group), font: (p.font ? p.font : "") }; - AppendGroupToList(newId, bggroups[newId].name, bggroups[newId].font); +function AddNewGroup(Name, FontColor) { + let newId = GenerateNewGroupID(); + bggroups[newId] = { id: newId, index: 0, active_tab: 0, prev_active_tab: 0, active_tab_ttid: "", name: (Name ? Name : caption_noname_group), font: (FontColor ? FontColor : "") }; + AppendGroupToList(newId, bggroups[newId].name, bggroups[newId].font, true); UpdateBgGroupsOrder(); return newId; } -// function AppendTabsToGroup(p) { -// } - // remove group, delete tabs if close_tabs is true function GroupRemove(groupId, close_tabs) { if (close_tabs) { - CloseTabs($("#"+groupId).find(".tab").map(function() {return parseInt(this.id);}).toArray()); - $("#"+groupId+" .folder").each(function() { - RemoveFolder(this.id); + let tabIds = Array.prototype.map.call(document.querySelectorAll("#"+groupId+" .tab"), function(s){ + return parseInt(s.id); + }); + CloseTabs(tabIds); + document.querySelectorAll("#"+groupId+" .folder").forEach(function(s){ + RemoveFolder(s.id); }); } else { - $("#cf"+groupId).children().each(function() { - $("#cftab_list").append(this); - }); - $("#ch"+groupId).children().each(function() { - $("#chtab_list").append(this); - }); + let TabListFolders = document.getElementById("cftab_list"); + let GroupFolders = document.getElementById("cf"+groupId); + while (GroupFolders.firstChild) { + TabListFolders.appendChild(GroupFolders.firstChild); + } + let TabListTabs = document.getElementById("cttab_list"); + let GroupTabs = document.getElementById("ct"+groupId); + while (GroupTabs.firstChild) { + TabListTabs.appendChild(GroupTabs.firstChild); + } RefreshExpandStates(); RefreshCounters(); } delete bggroups[groupId]; - - if ($("#"+groupId)[0].id == active_group) { - if ($("#_"+groupId).prev(".group_button")[0]) { - SetActiveGroup(($("#_"+groupId).prev(".group_button")[0].id).substr(1), true, true); + if (groupId == active_group) { + if (document.getElementById("_"+groupId).previousSibling) { + SetActiveGroup((document.getElementById("_"+groupId).previousSibling.id).substr(1), true, true); } else { - if ($("#_"+groupId).next(".group_button")[0]) { - SetActiveGroup(($("#_"+groupId).next(".group_button")[0].id).substr(1), true, true); + if (document.getElementById("_"+groupId).nextSibling) { + SetActiveGroup((document.getElementById("_"+groupId).nextSibling.id).substr(1), true, true); } else { SetActiveGroup("tab_list", true, true); } } } SaveGroups(); - $("#"+groupId).remove(); - $("#_"+groupId).remove(); + let group = document.getElementById(groupId); + group.parentNode.removeChild(group); + let groupButton = document.getElementById("_"+groupId); + groupButton.parentNode.removeChild(groupButton); schedule_update_data++; } function UpdateBgGroupsOrder() { - $(".group_button").each(function() { - if (bggroups[(this.id).substr(1)]) { - bggroups[(this.id).substr(1)].index = $(this).index(); + document.querySelectorAll(".group_button").forEach(function(s){ + if (bggroups[(s.id).substr(1)]) { + bggroups[(s.id).substr(1)].index = Array.from(s.parentNode.children).indexOf(s); } }); SaveGroups(); } function SetActiveGroup(groupId, switch_to_active_in_group, scroll_to_active) { - log("function: SetActiveGroup"); - if ($("#"+groupId)[0]) { + if (opt.debug) console.log("function: SetActiveGroup"); + let group = document.getElementById(groupId); + if (group != null) { active_group = groupId; - $(".group_button").removeClass("active_group"); - $("#_"+groupId).addClass("active_group"); - $(".tab, .group").hide(); - $("#"+groupId).show(); - $("#"+groupId+" .tab").show(); + document.querySelectorAll(".group_button").forEach(function(s){ + s.classList.remove("active_group"); + }); + document.getElementById("_"+groupId).classList.add("active_group"); + document.querySelectorAll(".group").forEach(function(s){ + s.style.display = "none"; + }); + group.style.display = ""; RefreshGUI(); - $("#group_edit").hide(); - if (switch_to_active_in_group && $("#"+groupId+" .active_tab")[0]){ - chrome.tabs.update(parseInt($("#"+groupId+" .active_tab")[0].id), {active: true}); - } - if (scroll_to_active && $("#"+groupId+" .active_tab")[0]){ - ScrollToTab($("#"+groupId+" .active_tab")[0].id); + HideRenameDialogs() + let activeTab = document.querySelector("#"+groupId+" .active_tab"); + if (activeTab != null ){ + if (switch_to_active_in_group){ + chrome.tabs.update(parseInt(activeTab.id), {active: true}); + } + if (scroll_to_active){ + ScrollToTab(activeTab.id); + } } if (groupId == "tab_list") { - $("#button_remove_group, #button_edit_group").addClass("disabled"); + document.querySelectorAll("#button_remove_group, #button_edit_group").forEach(function(s){ + s.classList.add("disabled"); + }); } else { - $("#button_remove_group, #button_edit_group").removeClass("disabled"); + document.querySelectorAll("#button_remove_group, #button_edit_group").forEach(function(s){ + s.classList.remove("disabled"); + }); } chrome.runtime.sendMessage({command: "set_active_group", active_group: groupId, windowId: CurrentWindowId}); RefreshExpandStates(); @@ -160,20 +300,109 @@ function SetActiveGroup(groupId, switch_to_active_in_group, scroll_to_active) { } function SetActiveTabInGroup(groupId, tabId) { - if ($(".tab#"+tabId)[0] /* && $("#"+tabId).parents(".group")[0] */ && bggroups[groupId] != undefined) { - // bggroups[$("#"+tabId).parents(".group")[0].id].active_tab = parseInt(tabId); - // if ($("#"+tabId).parents(".group")[0].id != active_group) { + if (document.querySelector("#"+groupId+" [id='"+tabId+"']") != null && bggroups[groupId] != undefined) { if (groupId != active_group) { - // SetActiveGroup($("#"+tabId).parents(".group")[0].id, false, true); SetActiveGroup(groupId, false, true); } if (bggroups[groupId]) { + bggroups[groupId].prev_active_tab = bggroups[groupId].active_tab; bggroups[groupId].active_tab = parseInt(tabId); } SaveGroups(); } } +// Edit group popup +function ShowGroupEditWindow(groupId) { + HideRenameDialogs(); + if (bggroups[groupId]) { + let name = document.getElementById("group_edit_name"); + name.value = bggroups[groupId].name; + let groupEditDialog = document.getElementById("group_edit"); + groupEditDialog.setAttribute("groupId", groupId); + groupEditDialog.style.display = "block"; + groupEditDialog.style.top = document.getElementById("toolbar").getBoundingClientRect().height + document.getElementById("pin_list").getBoundingClientRect().height + 8 + "px"; + groupEditDialog.style.left = "22px"; + let DefaultGroupButtonFontColor = window.getComputedStyle(document.getElementById("body"), null).getPropertyValue("--group_list_default_font_color"); + let GroupEditFont = document.getElementById("group_edit_font"); + GroupEditFont.style.backgroundColor = (bggroups[groupId].font == "" ? DefaultGroupButtonFontColor : "#"+bggroups[groupId].font); + setTimeout(function(){ + document.getElementById("group_edit_name").select(); + },5); + } +} + +// when pressed OK in group popup +function GroupEditConfirm() { + let groupId = document.getElementById("group_edit").getAttribute("groupId"); + if (bggroups[groupId]) { + let GroupEditName = document.getElementById("group_edit_name"); + GroupEditName.value = GroupEditName.value.replace(/[\f\n\r\v\t\<\>\+\-\(\)\.\,\;\:\~\/\|\?\@\!\"\'\£\$\%\&\^\#\=\*\[\]]?/gi, ""); + bggroups[groupId].name = GroupEditName.value; + let GroupEditFont = document.getElementById("group_edit_font"); + let DefaultGroupButtonFontColor = window.getComputedStyle(document.getElementById("body"), null).getPropertyValue("--group_list_default_font_color"); + let ThisGroupButtonFontColor = RGBtoHex(GroupEditFont.style.backgroundColor); + if ("#"+ThisGroupButtonFontColor != DefaultGroupButtonFontColor) { + bggroups[groupId].font = ThisGroupButtonFontColor; + document.getElementById("_gte"+groupId).style.color = "#"+ThisGroupButtonFontColor; + } + HideRenameDialogs(); + RefreshGUI(); + SaveGroups(); + } +} + +function RestoreStateOfGroupsToolbar() { + chrome.runtime.sendMessage({command: "get_group_bar", windowId: CurrentWindowId}, function(response) { + let toolbarGroups = document.getElementById("toolbar_groups"); + if (response == true) { + toolbarGroups.style.display = "inline-block"; + toolbarGroups.style.width = "19px"; + toolbarGroups.style.borderRight = "1px solid var(--group_list_borders)"; + toolbarGroups.classList.remove("hidden"); + } else { + toolbarGroups.style.display = "none"; + toolbarGroups.style.width = "0px"; + toolbarGroups.style.borderRight = "none"; + toolbarGroups.classList.add("hidden"); + } + }); +} + +function GroupsToolbarToggle() { + let toolbarGroups = document.getElementById("toolbar_groups"); + toolbarGroups.classList.toggle("hidden"); + if (toolbarGroups.classList.contains("hidden")) { + toolbarGroups.style.display = "none"; + toolbarGroups.style.width = "0px"; + toolbarGroups.style.borderRight = "none"; + chrome.runtime.sendMessage({command: "set_group_bar", group_bar: false, windowId: CurrentWindowId}); + } else { + toolbarGroups.style.display = "inline-block"; + toolbarGroups.style.width = "19px"; + toolbarGroups.style.borderRight = "1px solid var(--group_list_borders)"; + chrome.runtime.sendMessage({command: "set_group_bar", group_bar: true, windowId: CurrentWindowId}); + } + RefreshGUI(); +} + +function ActionClickGroup(Node, bgOption) { + console.log(Node.id) + if (bgOption == "new_tab") { + if (Node.id == "pin_list") { + OpenNewTab(true, undefined); + } + if (Node.classList.contains("tab") || Node.classList.contains("folder") || Node.classList.contains("group")) { + OpenNewTab(false, Node.id); + } + } + if (bgOption == "activate_previous_active") { + chrome.tabs.update(parseInt(bggroups[active_group].prev_active_tab), {active: true}); + } +} +// function AppendTabsToGroup(p) { +// } + // direction == true goes up, false goes down // function ScrollGroupList(direction) { // if (direction) { @@ -197,28 +426,6 @@ function SetActiveTabInGroup(groupId, tabId) { // } // } -// Edit group popup -function ShowGroupEditWindow() { - if (bggroups[menuItemId]) { - $("#group_edit_name")[0].value = bggroups[menuItemId].name; - $("#group_edit").css({"display": "block", "top": $("#toolbar_groups").offset().top + 8, "left": 22}); - $("#group_edit_font").css({"background-color": bggroups[menuItemId].font == "" ? "var(--button_icons, #808080)" : "#"+bggroups[menuItemId].font}); - } -} - -// when pressed OK in group popup -function GroupEditConfirm() { - if (bggroups[menuItemId]) { - $("#group_edit_name")[0].value = $("#group_edit_name")[0].value.replace(/[\f\n\r\v\t\<\>\+\-\(\)\.\,\;\:\~\/\|\?\@\!\"\'\£\$\%\&\^\#\=\*\[\]]?/gi, ""); - bggroups[menuItemId].name = $("#group_edit_name")[0].value; - bggroups[menuItemId].font = RGBtoHex($("#group_edit_font").css("background-color")); - $(".edit_dialog").hide(0); - $(".group_title#_gte" +menuItemId).css({"color": "#"+bggroups[menuItemId].font}); - RefreshGUI(); - SaveGroups(); - } -} - // "Move to group" popup // function ShowMoveToGroupWindow(x, y) { // $(".move_to_group_menu_entry").remove(); @@ -240,111 +447,3 @@ function GroupEditConfirm() { // $("#move_to_group_menu").css({"display": "block", "top": y-24, "left": x-20}); // } - -// ********** GROUPS EVENTS *************** - -function RestoreStateOfGroupsToolbar() { - chrome.runtime.sendMessage({command: "get_group_bar", windowId: CurrentWindowId}, function(response) { - $("#toolbar_groups").css({"display": "inline-block"}); - if (response == true) { - $("#toolbar_groups").removeClass("hidden"); - $("#toolbar_groups").css({"width": "19px", "border-right": "1px solid var(--group_list_borders)"}); - } else { - $("#toolbar_groups").addClass("hidden"); - $("#toolbar_groups").css({"width": "0px", "border-right": "none"}); - } - }); -} - -function SetGroupEvents() { - - // activate group - $(document).on("click", ".group_button", function(event) { - // menuGroupId = (this.id).substr(1); - if (event.button == 0) { - SetActiveGroup((this.id).substr(1), true, true); - } - }); - - // show/hide groups toolbar - $(document).on("mousedown", "#button_groups_toolbar_hide", function(event) { - if (event.button == 0) { - $("#toolbar_groups").toggleClass("hidden"); - if ($("#toolbar_groups").is(".hidden")) { - $("#toolbar_groups").css({"width": "0px", "border-right": "none"}); - chrome.runtime.sendMessage({command: "set_group_bar", group_bar: false, windowId: CurrentWindowId}); - } else { - $("#toolbar_groups").css({"width": "19px", "border-right": "1px solid var(--group_list_borders)"}); - chrome.runtime.sendMessage({command: "set_group_bar", group_bar: true, windowId: CurrentWindowId}); - } - RefreshGUI(); - } - }); - - - // edit group dialog box - $(document).on("mousedown", "#group_edit_discard", function(event) { - $(".edit_dialog").hide(0); - }); - $("#group_edit_name").keyup(function(e) { - if (e.keyCode == 13) { - GroupEditConfirm(); - } - }); - $(document).on("mousedown", "#group_edit_confirm", function(event) { - GroupEditConfirm(); - }); - - // show color picker - $(document).on("mousedown", "#group_edit_font, #group_edit_background", function(event) { - event.stopPropagation(); - PickColor = this.id; - $("#color_picker")[0].value = "#"+RGBtoHex($(this).css("background-color")); - $("#color_picker").focus(); - $("#color_picker").click(); - }); - - $(document).on("input", "#color_picker", function(event) { - $("#"+PickColor).css({"background-color": $("#color_picker")[0].value}); - }); - - - // edit group - $(document).on("dblclick", ".group_button:not(#_tab_list)", function(event) { - if (event.button == 0) { - menuItemId = (this.id).substr(1); - ShowGroupEditWindow(); - } - }); - - - - // scroll groups - // $(document).on("mousedown", "#scroll_group_up, #scroll_group_down", function(event) { - // IOKeys.LMB = true; - // ScrollGroupList($(this).is("#scroll_group_up")); - // }); - // $(document).on("mouseleave", "#scroll_group_up, #scroll_group_down", function(event) { - // IOKeys.LMB = false; - // }); - - // remove tabs from group button - // $(document).on("mousedown", "#remove_tabs_from_group", function(event) { - // if (event.button == 0 && vt.ActiveGroup.match("at|ut") == null) { - // AppendTabsToGroup({tabsIds: $(".tab.selected_tab:visible").map(function() {return parseInt(this.id);}).toArray(), groupId: "ut", SwitchTabIfHasActive: true, insertAfter: true, moveTabs: true}); - // } - // }); - - - // remove group - // $(document).on("mousedown", ".group", function(event) { - // if (event.button == 1 || IOKeys.Shift) { - // if (IOKeys.Shift) { - // GroupRemove($(this)[0].id, true); - // } else { - // GroupRemove($(this)[0].id, false); - // } - // } - // }); - -} \ No newline at end of file diff --git a/scripts/menu.js b/scripts/menu.js index 6283c06..bee47ce 100644 --- a/scripts/menu.js +++ b/scripts/menu.js @@ -4,287 +4,681 @@ // ********** MENU *************** +function HideMenus() { + document.querySelectorAll(".separator, .menu_item").forEach(function(s){s.style.display = "none";}); + document.querySelectorAll(".menu").forEach(function(s){ + s.style.top = "-1000px"; + s.style.left = "-1000px"; + }); +} + +function ShowMenu(MenuNode, event) { + MenuNode.style.display = "block"; + let x = event.pageX >= (document.body.clientWidth - MenuNode.getBoundingClientRect().width - 5) ? (document.body.clientWidth - MenuNode.getBoundingClientRect().width - 5) : (event.pageX - 5); + let y = event.pageY >= (document.body.clientHeight - MenuNode.getBoundingClientRect().height - 16) ? (document.body.clientHeight - MenuNode.getBoundingClientRect().height - 16) : (event.pageY - 16); + MenuNode.style.top = y + "px"; + MenuNode.style.left = x + "px"; +} + function ShowTabMenu(TabNode, event) { - $(".menu").hide(0); - menuItemId = parseInt(TabNode[0].id); + HideMenus(); + menuItemNode = TabNode; + // $(".menu").hide(0); + // MUTE TABS - if (TabNode.is(".muted")) { - $("#tabs_menu_mute").css({ "display": "none" }); - $("#tabs_menu_unmute").css({ "display": "" }); + // if (TabNode.classList.contains("audible") && !TabNode.classList.contains("muted")) { + // document.querySelector("#menu_mute_tab").style.display = ""; + // } + if (TabNode.classList.contains("muted")) { + document.querySelector("#menu_unmute_tab").style.display = ""; } else { - $("#tabs_menu_mute").css({ "display": "" }); - $("#tabs_menu_unmute").css({ "display": "none" }); + document.querySelector("#menu_mute_tab").style.display = ""; } - if (TabNode.is(".pin")) { - if (!opt.allow_pin_close) { - $("#tabs_menu_close").css({ "display": "none" }); - } - // show contextmenu with correct size position - if ($("#pins_menu").outerWidth() > $(window).width() - 10) { - $("#pins_menu").css({ "width": $(window).width() - 10 }); - } else { - $("#pins_menu").css({ "width": "" }); - } - var x = event.pageX >= $(window).width() - $("#pins_menu").outerWidth() ? $(window).width() - $("#pins_menu").outerWidth() : event.pageX; - var y = event.pageY >= $(window).height() - $("#pins_menu").outerHeight() - 10 ? $(window).height() - $("#pins_menu").outerHeight() - 10 : event.pageY; - $("#pins_menu").css({ "display": "block", "top": y - 15, "left": x - 5 }); + if (!TabNode.classList.contains("discarded")) { + document.querySelector("#menu_unload").style.display = ""; } - if (TabNode.is(".tab")) { - if ($("#" + menuItemId).is(".o, .c")) { - $("#tabs_menu_close_tree").css({ "display": "" }); - } else { - $("#tabs_menu_close_tree").css({ "display": "none" }); + + if (TabNode.classList.contains("pin")) { + if (opt.allow_pin_close) { + document.getElementById("menu_close").style.display = ""; } - if ($("#tabs_menu").outerWidth() > $(window).width() - 10) { - $("#tabs_menu").css({ "width": $(window).width() - 10 }); - } else { - $("#tabs_menu").css({ "width": "" }); - } - var x = event.pageX >= $(window).width() - $("#tabs_menu").outerWidth() ? $(window).width() - $("#tabs_menu").outerWidth() : event.pageX; - var y = event.pageY >= $(window).height() - $("#tabs_menu").outerHeight() - 10 ? $(window).height() - $("#tabs_menu").outerHeight() - 10 : event.pageY; - $("#tabs_menu").css({ "display": "block", "top": y - 15, "left": x - 5 }); + + document.querySelectorAll("#menu_new_pin, #separator_unpt, #menu_unpin_tab, #separator_dupt, #menu_duplicate_tab, #separator_undclo, #menu_undo_close_tab, #separator_deta, #menu_detach_tab, #menu_reload_tab, #separator_clo, #menu_close_other, #separator_mutot, #menu_mute_other, #menu_unmute_other, #separator_tts, #menu_treetabs_settings").forEach(function(s){ + s.style.display = ""; + }); } + + if (TabNode.classList.contains("tab")) { + + document.querySelectorAll("#menu_new_tab, #separator_pit, #menu_pin_tab, #separator_newf, #menu_new_folder, #separator_dupt, #menu_duplicate_tab, #separator_undclo, #menu_undo_close_tab, #separator_expaa, #menu_expand_all, #menu_collapse_all, #separator_deta, #menu_detach_tab, #menu_reload_tab, #separator_clo, #menu_close, #menu_close_other, #separator_mut, #separator_mutot, #menu_mute_other, #menu_unmute_other, #separator_tts, #menu_treetabs_settings").forEach(function(s){ + s.style.display = ""; + }); + + if (TabNode.classList.contains("o")) { + document.querySelector("#separator_collt").style.display = ""; + document.querySelector("#menu_collapse_tree").style.display = ""; + } + if (TabNode.classList.contains("c")) { + document.querySelector("#separator_expat").style.display = ""; + document.querySelector("#menu_expand_tree").style.display = ""; + } + if (TabNode.classList.contains("c") || TabNode.classList.contains("o")) { + document.querySelector("#menu_close_tree").style.display = ""; + document.querySelector("#separator_bkt").style.display = ""; + document.querySelector("#menu_bookmark_tree").style.display = ""; + document.querySelector("#separator_mutt").style.display = ""; + document.querySelector("#menu_mute_tree").style.display = ""; + document.querySelector("#menu_unmute_tree").style.display = ""; + } + } + ShowMenu(document.getElementById("main_menu"), event); } function ShowFolderMenu(FolderNode, event) { - $(".menu").hide(0); - menuItemId = FolderNode[0].id; - if ($("#folders_menu").outerWidth() > $(window).width() - 10) { - $("#folders_menu").css({ "width": $(window).width() - 10 }); - } else { - $("#folders_menu").css({ "width": "" }); + HideMenus(); + menuItemNode = FolderNode; + + document.querySelectorAll("#menu_mute_tab, #menu_unmute_tab, #menu_unload, #menu_new_tab, #menu_new_folder, #separator_renf, #menu_rename_folder, #menu_delete_folder, #separator_bkt, #menu_bookmark_tree, #separator_expaa, #menu_expand_all, #separator_colla, #menu_collapse_all, #menu_new_group, #separator_tts, #menu_treetabs_settings").forEach(function(s){ + s.style.display = ""; + }); + + if (FolderNode.classList.contains("o")) { + document.querySelector("#folders_menu, #menu_collapse_tree").style.display = ""; } - var x = event.pageX >= $(window).width() - $("#folders_menu").outerWidth() ? $(window).width() - $("#folders_menu").outerWidth() : event.pageX; - var y = event.pageY >= $(window).height() - $("#folders_menu").outerHeight() - 10 ? $(window).height() - $("#folders_menu").outerHeight() - 10 : event.pageY; - $("#folders_menu").css({ "display": "block", "top": y - 15, "left": x - 5 }); + if (FolderNode.classList.contains("c")) { + document.querySelector("#folders_menu, #menu_expand_tree").style.display = ""; + } + + ShowMenu(document.getElementById("main_menu"), event); +} + +function ShowFGlobalMenu(event) { + menuItemNode = event.target; + HideMenus(); + + + document.querySelectorAll("#menu_new_pin, #menu_new_tab, #menu_new_folder, #separator_undclo, #menu_undo_close_tab, #separator_expaa, #menu_expand_all, #menu_collapse_all, #separator_newg, #menu_new_group, #separator_gbk, #menu_bookmark_group, #separator_tts, #menu_treetabs_settings").forEach(function(s){ + s.style.display = ""; + }); + ShowMenu(document.getElementById("main_menu"), event); +} + +function ShowFGroupMenu(GroupNode, event) { + HideMenus(); + menuItemNode = GroupNode; + + document.querySelectorAll("#menu_new_group, #menu_rename_group, #menu_delete_group, #menu_delete_group_tabs_close, #separator_gunlo, #groups_menu_unload, #separator_gbk, #separator_tts, #menu_bookmark_group, #separator_tts, #menu_treetabs_settings").forEach(function(s){ + s.style.display = ""; + }); + if (menuItemNode.id == "tab_list") { + document.querySelectorAll("#menu_rename_group, #menu_delete_group, #menu_delete_group_tabs_close").forEach(function(s){ + s.style.display = "none"; + }); + } + ShowMenu(document.getElementById("main_menu"), event); } function SetMenu() { - // trigger action when the contexmenu is about to be shown - $(document).bind("contextmenu", function(event) { - if (!event.ctrlKey) { - event.preventDefault(); - } - }); - - // show global menu - $(document).on("mousedown", "#pin_list, .group", function(event) { - event.stopPropagation(); - if (event.button == 2) { - $(".menu").hide(0); - menuItemId = active_group; - - var x = event.pageX >= $(window).width() - $("#global_menu").outerWidth() ? $(window).width() - $("#global_menu").outerWidth() : event.pageX; - var y = event.pageY >= $(window).height() - $("#global_menu").outerHeight() - 10 ? $(window).height() - $("#global_menu").outerHeight() - 10 : event.pageY; - $("#global_menu").css({ "display": "block", "top": y - 15, "left": x - 5 }); - } - }); - - // show global menu - $(document).on("mousedown", ".group_drag_box", function(event) { - // event.stopPropagation(); - if (event.button == 2) { - $(".menu").hide(0); - if (this.id == "-tab_list") { - menuItemId = "tab_list"; - $("#groups_menu_rename, #groups_menu_delete, #groups_menu_delete_tabs_close").hide(); - } else { - menuItemId = (this.id).substr(1); - $("#groups_menu_rename, #groups_menu_delete, #groups_menu_delete_tabs_close").show(); - } - var x = event.pageX >= $(window).width() - $("#groups_menu").outerWidth() ? $(window).width() - $("#groups_menu").outerWidth() : event.pageX; - var y = event.pageY >= $(window).height() - $("#groups_menu").outerHeight() - 10 ? $(window).height() - $("#groups_menu").outerHeight() - 10 : event.pageY; - $("#groups_menu").css({ "display": "block", "top": y - 15, "left": x - 5 }); - } - }); - - - - // if the menu element is clicked - $(document).on("mousedown", ".menu li", function(event) { - event.stopPropagation(); - if (event.button != 0) { - return; - } - switch ($(this).attr("data-action")) { - case "tab_new": - chrome.tabs.create({}); - break; - case "tab_clone": - if ($("#" + menuItemId).is(".selected_tab")) { - $(".selected_tab:visible").each(function() { - chrome.tabs.duplicate(parseInt(this.id)); - }); - } else { - chrome.tabs.duplicate(menuItemId); + document.querySelectorAll(".menu_item").forEach(function(m){ + if (m.id == "menu_new_pin") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + if (menuItemNode.classList.contains("pin")) { + OpenNewTab(true, menuItemNode.id); + } else { + OpenNewTab(true, undefined); + } + HideMenus(); } - break; - case "tab_move": - if ($("#" + menuItemId).is(".selected_tab, .active_tab")) { + } + } + if (m.id == "menu_new_tab") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + if (menuItemNode.classList.contains("folder")) { + OpenNewTab(false, menuItemNode.id); + } else { + if (menuItemNode.classList.contains("pin")) { + OpenNewTab(true, menuItemNode.id); + } else { + if (menuItemNode.classList.contains("tab")) { + OpenNewTab(false, menuItemNode.id); + } else { + OpenNewTab(); + } + } + } + HideMenus(); + } + } + } + + if (m.id == "menu_unpin_tab" || m.id == "menu_pin_tab") { + m.onmousedown = function(event) { + event.stopPropagation(); + if (event.which == 1) { + if (menuItemNode.classList.contains("selected_tab")) { + document.querySelectorAll(".pin.selected_tab, #"+active_group+" .selected_tab").forEach(function(s){ + chrome.tabs.update(parseInt(s.id), { pinned: (menuItemNode.classList.contains("tab")) }); + }); + } else { + chrome.tabs.update(parseInt(menuItemNode.id), { pinned: (menuItemNode.classList.contains("tab")) }); + } + HideMenus(); + } + } + } + + if (m.id == "menu_duplicate_tab") { + m.onmousedown = function(event) { + event.stopPropagation(); + if (event.which == 1) { + if (menuItemNode.classList.contains("selected_tab")) { + document.querySelectorAll(".pin.selected_tab, #"+active_group+" .selected_tab").forEach(function(s){ + chrome.tabs.duplicate(parseInt(s.id), function(tab) { + setTimeout(function() { + let tb = document.getElementById(tab.id); + if (s != null && tb != null) { + s.parentNode.insertBefore(tb, s); + } + }, 10); + }); + }); + } else { + chrome.tabs.duplicate(parseInt(menuItemNode.id), function(tab) { + setTimeout(function() { + let tb = document.getElementById(tab.id); + if (menuItemNode != null && tb != null) { + menuItemNode.parentNode.insertBefore(tb, menuItemNode); + } + }, 10); + }); + } + HideMenus(); + } + } + } + + if (m.id == "menu_detach_tab") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + + if (menuItemNode.classList.contains("selected_tab")) { + let tabsArr = []; + document.querySelectorAll(".pin.selected_tab, #"+active_group+" .selected_tab").forEach(function(s){ + tabsArr.push(parseInt(s.id)); + if (s.childNodes[4].childNodes.length > 0) { + document.querySelectorAll("#"+s.childNodes[4].id+" .tab").forEach(function(t){ + tabsArr.push(parseInt(t.id)); + }); + } + }); + Detach(tabsArr); + } else { + Detach([parseInt(menuItemNode.id)]); + } + HideMenus(); + } + } + } + + if (m.id == "menu_reload_tab") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + if (menuItemNode.classList.contains("selected_tab")) { + document.querySelectorAll(".pin.selected_tab, #"+active_group+" .selected_tab").forEach(function(s){ + chrome.tabs.reload(parseInt(s.id)); + }); + } else { + chrome.tabs.reload(parseInt(menuItemNode.id)); + } + HideMenus(); + } + } + } + + if (m.id == "menu_unload") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + if (menuItemNode.classList.contains("pin") || menuItemNode.classList.contains("tab")) { + if (menuItemNode.classList.contains("selected_tab")) { + let tabsArr = []; + document.querySelectorAll(".pin.selected_tab, #"+active_group+" .selected_tab").forEach(function(s){ + tabsArr.push(parseInt(s.id)); + if (s.childNodes[4].childNodes.length > 0) { + document.querySelectorAll("#"+s.childNodes[4].id+" .tab").forEach(function(t){ + tabsArr.push(parseInt(t.id)); + }); + } + }); + DiscardTabs(tabsArr); + } else { + DiscardTabs([parseInt(menuItemNode.id)]); + } + } + if (menuItemNode.classList.contains("folder")) { + let tabsArr = []; + document.querySelectorAll("#"+menuItemNode.id+" .tab").forEach(function(s){ + tabsArr.push(parseInt(s.id)); + }); + DiscardTabs(tabsArr); + } + HideMenus(); + } + } + } + + if (m.id == "menu_close") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + if (menuItemNode.classList.contains("selected_tab")) { + let tabsArr = []; + document.querySelectorAll(".pin.selected_tab, #"+active_group+" .selected_tab").forEach(function(s){ + tabsArr.push(parseInt(s.id)); + if (s.childNodes[4].childNodes.length > 0) { + document.querySelectorAll("#"+s.childNodes[4].id+" .tab").forEach(function(t){ + tabsArr.push(parseInt(t.id)); + }); + } + }); + CloseTabs(tabsArr); + } else { + CloseTabs([parseInt(menuItemNode.id)]); + } + HideMenus(); + } + } + } + + if (m.id == "menu_mute_tab") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + if (menuItemNode.classList.contains("pin") || menuItemNode.classList.contains("tab")) { + if (menuItemNode.classList.contains("selected_tab")) { + document.querySelectorAll(".pin.selected_tab, #"+active_group+" .selected_tab").forEach(function(s){ + chrome.tabs.update(parseInt(s.id), { muted: true }); + }); + } else { + chrome.tabs.update(parseInt(menuItemNode.id), { muted: true }); + } + } + if (menuItemNode.classList.contains("folder")) { + document.querySelectorAll("#"+menuItemNode.id+" .tab").forEach(function(s){ + chrome.tabs.update(parseInt(s.id), { muted: true }); + }); + } + HideMenus(); + } + } + } + + if (m.id == "menu_mute_tree") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + document.querySelectorAll("[id='"+menuItemNode.id+"'], [id='"+menuItemNode.id+"'] .tab").forEach(function(s){ + chrome.tabs.update(parseInt(s.id), { muted: true }); + }); + HideMenus(); + } + } + } + + if (m.id == "menu_unmute_tab") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + if (menuItemNode.classList.contains("pin") || menuItemNode.classList.contains("tab")) { + if (menuItemNode.classList.contains("selected_tab")) { + document.querySelectorAll(".pin.selected_tab, #"+active_group+" .selected_tab").forEach(function(s){ + chrome.tabs.update(parseInt(s.id), { muted: false }); + }); + } else { + chrome.tabs.update(parseInt(menuItemNode.id), { muted: false }); + } + } + if (menuItemNode.classList.contains("folder")) { + document.querySelectorAll("#"+menuItemNode.id+" .tab").forEach(function(s){ + chrome.tabs.update(parseInt(s.id), { muted: false }); + }); + } + HideMenus(); + } + } + } + + if (m.id == "menu_unmute_tree") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + document.querySelectorAll("[id='"+menuItemNode.id+"'], [id='"+menuItemNode.id+"'] .tab").forEach(function(s){ + chrome.tabs.update(parseInt(s.id), { muted: false }); + }); + HideMenus(); + } + } + } + + + if (m.id == "menu_mute_other") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + if (menuItemNode.classList.contains("selected_tab")) { + document.querySelectorAll(".pin:not(.selected_tab), #"+active_group+" .tab:not(.selected_tab)").forEach(function(s){ + chrome.tabs.update(parseInt(s.id), { muted: true }); + }); + } else { + document.querySelectorAll(".pin:not([id='"+menuItemNode.id+"']), #"+active_group+" .tab:not([id='"+menuItemNode.id+"'])").forEach(function(s){ + chrome.tabs.update(parseInt(s.id), { muted: true }); + }); + } + + HideMenus(); + } + } + } + + + if (m.id == "menu_unmute_other") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + if (menuItemNode.classList.contains("selected_tab")) { + document.querySelectorAll(".pin:not(.selected_tab), #"+active_group+" .tab:not(.selected_tab)").forEach(function(s){ + chrome.tabs.update(parseInt(s.id), { muted: false }); + }); + } else { + document.querySelectorAll(".pin:not([id='"+menuItemNode.id+"']), #"+active_group+" .tab:not([id='"+menuItemNode.id+"'])").forEach(function(s){ + chrome.tabs.update(parseInt(s.id), { muted: false }); + }); + } + HideMenus(); + } + } + } + + + + + if (m.id == "menu_undo_close_tab") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + chrome.sessions.getRecentlyClosed(null, function(sessions) { + if (sessions.length > 0) { + chrome.sessions.restore(null, function() {}); + } + }); + HideMenus(); + } + } + } + + + if (m.id == "menu_new_folder") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + if (menuItemNode.classList.contains("folder")) { + AddNewFolder(menuItemNode.id, undefined, undefined, undefined); + } else { + if (menuItemNode.classList.contains("tab")) { + let folders = GetParentsByClass(menuItemNode, "folder"); + if (folders.length > 0) { + AddNewFolder(folders[0].id, undefined, undefined, undefined); + } else { + AddNewFolder(); + } + } else { + AddNewFolder(); + } + } + HideMenus(); + } + } + } + + + if (m.id == "menu_expand_tree") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + document.querySelectorAll("[id='"+menuItemNode.id+"'], [id='"+menuItemNode.id+"'] .folder.c, [id='"+menuItemNode.id+"'] .tab.c").forEach(function(s){ + s.classList.add("o"); + s.classList.remove("c"); + }); + + schedule_update_data++; + HideMenus(); + } + } + } + + if (m.id == "menu_collapse_tree") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + document.querySelectorAll("[id='"+menuItemNode.id+"'], [id='"+menuItemNode.id+"'] .folder.c, [id='"+menuItemNode.id+"'] .tab.c").forEach(function(s){ + s.classList.add("c"); + s.classList.remove("o"); + }); + schedule_update_data++; + HideMenus(); + } + } + } + + if (m.id == "menu_expand_all") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + document.querySelectorAll("#"+active_group+" .folder.c, #"+active_group+" .tab.c").forEach(function(s){ + s.classList.add("o"); + s.classList.remove("c"); + }); + schedule_update_data++; + HideMenus(); + } + } + } + + if (m.id == "menu_collapse_all") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + document.querySelectorAll("#"+active_group+" .folder.o, #"+active_group+" .tab.o").forEach(function(s){ + s.classList.add("c"); + s.classList.remove("o"); + }); + schedule_update_data++; + HideMenus(); + } + } + } + + + + if (m.id == "menu_close_tree") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + let tabsArr = []; - $(".active_tab:visible, .selected_tab:visible").each(function() { - tabsArr.push(parseInt(this.id)); - if ($("#ch"+this.id).children().length > 0) { - $($("#ch"+this.id).find(".tab")).each(function() { - tabsArr.push(parseInt(this.id)); + document.querySelectorAll("[id='"+menuItemNode.id+"'] .tab, [id='"+menuItemNode.id+"']").forEach(function(s){ + tabsArr.push(parseInt(s.id)); + if (s.childNodes[4].childNodes.length > 0) { + document.querySelectorAll("#"+s.childNodes[4].id+" .tab").forEach(function(t){ + tabsArr.push(parseInt(t.id)); }); } }); - DetachTabs(tabsArr); - } else { - DetachTabs([menuItemId]); + CloseTabs(tabsArr); + HideMenus(); } - break; - case "tab_reload": - if ($("#" + menuItemId).is(".selected_tab")) { - $(".selected_tab:visible").each(function() { - chrome.tabs.reload(parseInt(this.id)); - }); - } else { - chrome.tabs.reload(menuItemId); - } - break; - case "tab_pin": - if ($("#" + menuItemId).is(".selected_tab")) { - $(".selected_tab:visible").each(function() { - chrome.tabs.update(parseInt(this.id), { pinned: ($("#" + menuItemId).is(".pin") ? false : true) }); - }); - } else { - chrome.tabs.update(menuItemId, { pinned: ($("#" + menuItemId).is(".pin") ? false : true) }); - } - break; - case "tab_mute": - if ($("#" + menuItemId).is(".selected_tab")) { - $(".selected_tab:visible").each(function() { - chrome.tabs.get(parseInt(this.id), function(tab) { - if (tab) { - chrome.tabs.update(tab.id, { muted: true }); - } - }); - }); - } else { - chrome.tabs.get(menuItemId, function(tab) { - if (tab) { - chrome.tabs.update(tab.id, { muted: true }); - } - }); - } - break; - case "tab_unmute": - if ($("#" + menuItemId).is(".selected_tab")) { - $(".selected_tab:visible").each(function() { - chrome.tabs.get(parseInt(this.id), function(tab) { - if (tab) { - chrome.tabs.update(tab.id, { muted: false }); - } - }); - }); - } else { - chrome.tabs.get(menuItemId, function(tab) { - chrome.tabs.update(tab.id, { muted: false }); - }); - } - break; - case "tab_mute_other": - if ($("#" + menuItemId).is(".selected_tab")) { - $(".tab:visible:not(.selected_tab)").each(function() { - chrome.tabs.update(parseInt(this.id), { muted: true }); - }); - } else { - $(".tab:visible:not(#" + menuItemId + ")").each(function() { - chrome.tabs.update(parseInt(this.id), { muted: true }); - }); - } - break; - case "tab_unmute_other": - if ($("#" + menuItemId).is(".selected_tab")) { - $(".tab:visible:not(.selected_tab)").each(function() { - chrome.tabs.update(parseInt(this.id), { muted: false }); - }); - } else { - $(".tab:visible:not(#" + menuItemId + ")").each(function() { - chrome.tabs.update(parseInt(this.id), { muted: false }); - }); - } - break; - case "tab_close": - CloseTabs($("#" + menuItemId).is(".selected_tab") ? $(".selected_tab:visible").map(function() { return parseInt(this.id); }).toArray() : [menuItemId]); - break; - case "tab_close_tree": - CloseTabs($("#" + menuItemId).find(".tab").map(function() { return parseInt(this.id); }).toArray()); - CloseTabs([menuItemId]); - break; - case "tab_close_other": - CloseTabs($(".tab:visible:not(#" + menuItemId + ")").map(function() { return parseInt(this.id); }).toArray()); - break; - case "tab_undo_close": - chrome.sessions.getRecentlyClosed(null, function(sessions) { - if (sessions.length > 0) { - chrome.sessions.restore(null, function() {}); - } - }); - break; - case "tab_discard": - DiscardTabs($("#" + menuItemId).is(".selected_tab") ? $(".tab.selected_tab:visible").map(function() { return parseInt(this.id); }).toArray() : [menuItemId]); - break; - case "tab_settings": - chrome.tabs.create({ "url": "options.html" }); - break; - case "tab_expand_all": - $(".tab.c").addClass("o").removeClass("c"); - schedule_update_data++; - break; - case "tab_collapse_all": - $(".tab.o").addClass("c").removeClass("o"); - schedule_update_data++; - break; - case "folder_new": - AddNewFolder({}); - break; - case "folder_rename": - if ($("#" + menuItemId).is(".selected_folder")) { - $(".selected_folder:visible").each(function() { - ShowRenameFolderDialog(this.id); - }); - } else { - ShowRenameFolderDialog(menuItemId); - } - break; - case "folder_delete": - if ($("#" + menuItemId).is(".selected_folder")) { - $(".selected_folder:visible").each(function() { - RemoveFolder(this.id); - }); - } else { - RemoveFolder(menuItemId); - } - break; - case "group_new": - AddNewGroup({}); - break; - case "group_rename": - ShowGroupEditWindow(); - break; - case "group_delete": - GroupRemove(menuItemId, false); - break; - case "group_delete_tabs_close": - GroupRemove(menuItemId, true); - break; - case "group_unload": - DiscardTabs($("#"+menuItemId+" .tab").map(function() { return parseInt(this.id); }).toArray()); - break; + } } - $(".menu").hide(0); + + if (m.id == "menu_rename_folder") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + ShowRenameFolderDialog(menuItemNode.id); + HideMenus(); + } + } + } + + + if (m.id == "menu_delete_folder") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + if (menuItemNode.classList.contains("selected_folder")) { + document.querySelectorAll("#"+menuItemNode.id+" .selected_folder, #"+menuItemNode.id).forEach(function(s){ + RemoveFolder(s.id); + }); + } else { + RemoveFolder(menuItemNode.id); + } + HideMenus(); + } + } + } + + if (m.id == "menu_close_other") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + let tabsArr = []; + if (menuItemNode.classList.contains("selected_tab")) { + document.querySelectorAll(".pin:not(.selected_tab), #"+active_group+" .tab:not(.selected_tab)").forEach(function(s){ + let children = document.querySelectorAll("[id='"+s.id+"'] .selected_tab"); + if (children.length == 0 || opt.promote_children) { + tabsArr.push(parseInt(s.id)); + } + }); + CloseTabs(tabsArr); + } else { + if (menuItemNode.classList.contains("tab")) { + document.getElementById(active_group).appendChild(menuItemNode); + } + document.querySelectorAll(".pin:not([id='"+menuItemNode.id+"']), #"+active_group+" .tab:not([id='"+menuItemNode.id+"'])").forEach(function(s){ + tabsArr.push(parseInt(s.id)); + }); + + CloseTabs(tabsArr); + } + HideMenus(); + } + } + } + + if (m.id == "menu_bookmark_tree") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + Bookmark(menuItemNode); + HideMenus(); + } + } + } + + + if (m.id == "menu_rename_group") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + ShowGroupEditWindow(menuItemNode.id); + HideMenus(); + } + } + } + + if (m.id == "menu_delete_group") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + GroupRemove(menuItemNode.id, false); + HideMenus(); + } + } + } + + + if (m.id == "menu_delete_group_tabs_close") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + GroupRemove(menuItemNode.id, true); + HideMenus(); + } + } + } + + + if (m.id == "groups_menu_unload") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + let tabsArr = []; + document.querySelectorAll("[id='"+menuItemNode.id+"'] .tab").forEach(function(s){ + tabsArr.push(parseInt(s.id)); + }); + DiscardTabs(tabsArr); + HideMenus(); + } + } + } + + + if (m.id == "menu_bookmark_group") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + Bookmark(menuItemNode); + HideMenus(); + } + } + } + + if (m.id == "menu_new_group") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + AddNewGroup(); + HideMenus(); + } + } + } + + + if (m.id == "menu_treetabs_settings") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + chrome.tabs.create({ "url": "options.html" }); + HideMenus(); + } + } + } + + }); - // move tabs to group - // $(document).on("mousedown", "#tabs_menu_move_to_new_group, .move_to_group_menu_entry", function(event) { + // $(document).on("mousedown", "#menu_detach_tab_to_new_group, .move_to_group_menu_entry", function(event) { // var tabsIds - // if ($(this).is("#tabs_menu_move_to_new_group")) { + // if ($(this).is("#menu_detach_tab_to_new_group")) { // bg.dt.DropToGroup = AddNewGroup(575757); // GetColorFromMiddlePixel(vt.menuItemId, bg.dt.DropToGroup); // } else { diff --git a/scripts/refresh.js b/scripts/refresh.js index 83775f1..4553196 100644 --- a/scripts/refresh.js +++ b/scripts/refresh.js @@ -4,64 +4,80 @@ // ********** REFRESH GUI *************** -function SetTRefreshEvents() { - $(window).on("resize", function(event) { - RefreshGUI(); - }); - - // click on media icon - $(document).on("mousedown", ".tab_mediaicon", function(event) { - event.stopPropagation(); - if (event.button == 0 && $(this).parent().parent().is(".audible, .muted")) { - chrome.tabs.get(parseInt(this.parentNode.parentNode.id), function(tab) { - if (tab) { - chrome.tabs.update(tab.id, {muted:!tab.mutedInfo.muted}); - } - }); - } - }); -} - function RefreshGUI() { - if ($("#toolbar").children().length > 0) { - $("#toolbar").css({ "height": "", "width": "", "display": "", "padding": "", "border": "" }); - if ($(".button").is(".on")) { - $("#toolbar").css({ "height": 53 }); + let toolbar = document.getElementById("toolbar"); + if (toolbar.children.length > 0) { + toolbar.style.height = ""; + toolbar.style.width = ""; + toolbar.style.display = ""; + toolbar.style.border = ""; + toolbar.style.padding = ""; + if (document.querySelector(".on.button") != null) { + toolbar.style.height = "53px"; } else { - $("#toolbar").css({ "height": 26 }); + toolbar.style.height = "26px"; } } else { - $("#toolbar").css({ "height": 0, "width": "0px", "display": "none", "padding": "0", "border": "none" }); + toolbar.style.height = "0px"; + toolbar.style.width = "0px"; + toolbar.style.display = "none"; + toolbar.style.border = "none"; + toolbar.style.padding = "0"; } - - if ($("#pin_list").children().length > 0) { - $("#pin_list").css({ "top": $("#toolbar")[0].getBoundingClientRect().height, "height": "", "width":"", "display": "", "padding": "", "border": "" }); + let pin_list = document.getElementById("pin_list"); + if (pin_list.children.length > 0) { + pin_list.style.top = toolbar.getBoundingClientRect().height + "px"; + pin_list.style.height = ""; + pin_list.style.width = document.body.clientWidth + "px";; + pin_list.style.display = ""; + pin_list.style.border = ""; + pin_list.style.padding = ""; } else { - $("#pin_list").css({ "height": "0px", "width": "0px", "display": "none", "padding": "0", "border": "none" }); + pin_list.style.top = "0px"; + pin_list.style.height = "0px"; + pin_list.style.width = "0px"; + pin_list.style.display = "none"; + pin_list.style.border = "none"; + pin_list.style.padding = "0"; } - - $("#toolbar_groups").css({ "top": $("#toolbar").outerHeight() + $("#pin_list")[0].getBoundingClientRect().height, "height": $(window).height() - $("#toolbar").outerHeight() - $("#pin_list")[0].getBoundingClientRect().height}); - - $(".group_title").each(function(){ - $(this)[0].innerText = (bggroups[(this.id).substr(4)] ? bggroups[(this.id).substr(4)].name : caption_noname_group) + (opt.show_counter_groups ? " (" + $("#" + (this.id).substr(4) +" .tab").length + ")" : ""); + let toolbar_groups = document.getElementById("toolbar_groups"); + toolbar_groups.style.top = toolbar.getBoundingClientRect().height + pin_list.getBoundingClientRect().height + "px"; + toolbar_groups.style.height = document.body.clientHeight - toolbar.getBoundingClientRect().height - pin_list.getBoundingClientRect().height + "px"; + if (opt.show_counter_groups) { + document.querySelectorAll(".group").forEach(function(s){ + let groupLabel = document.getElementById("_gte"+s.id); + if (groupLabel) { + groupLabel.textContent = (bggroups[s.id] ? bggroups[s.id].name : caption_noname_group) + " (" + document.querySelectorAll("#"+s.id+" .tab").length + ")"; + } + }); + } else { + document.querySelectorAll(".group").forEach(function(s){ + let groupLabel = document.getElementById("_gte"+s.id); + if (groupLabel) { + groupLabel.textContent = bggroups[s.id] ? bggroups[s.id].name : caption_noname_group; + } + }); + } + document.querySelectorAll(".group_button").forEach(function(s){ + s.style.height = s.firstChild.getBoundingClientRect().height + "px"; }); - - $(".group_button").each(function(){ - $(this).css({ "height": $(this).children(0).innerWidth() }); - }); - - $("#groups").css({ "top": $("#toolbar")[0].getBoundingClientRect().height + $("#pin_list")[0].getBoundingClientRect().height, "left": $("#toolbar_groups").outerWidth(), "height": $(window).height() - $("#pin_list")[0].getBoundingClientRect().height - $("#toolbar").outerHeight(), "width": $(window).width() - $("#toolbar_groups").outerWidth() }); + let groups = document.getElementById("groups"); + groups.style.top = toolbar.getBoundingClientRect().height + pin_list.getBoundingClientRect().height + "px"; + groups.style.left = toolbar_groups.getBoundingClientRect().width + "px"; + groups.style.height = document.body.clientHeight - pin_list.getBoundingClientRect().height - toolbar.getBoundingClientRect().height + "px"; + groups.style.width = document.body.clientWidth - toolbar_groups.getBoundingClientRect().width + 1 + "px"; } // set discarded class function RefreshDiscarded(tabId) { - if ($("#" + tabId).length > 0) { + let t = document.getElementById(tabId); + if (t != null) { chrome.tabs.get(parseInt(tabId), function(tab) { if (tab) { if (tab.discarded) { - $("#" + tabId).addClass("discarded"); + t.classList.add("discarded"); } else { - $("#" + tabId).removeClass("discarded"); + t.classList.remove("discarded"); } } }); @@ -70,24 +86,29 @@ function RefreshDiscarded(tabId) { // set discarded class function SetAttentionIcon(tabId) { - if ($("#" + tabId).length > 0) { - $("#" + tabId).addClass("attention"); + let t = document.getElementById(tabId); + if (t != null) { + t.classList.add("attention"); } } // change media icon function RefreshMediaIcon(tabId) { - if ($("#" + tabId).length > 0) { + let t = document.getElementById(tabId); + if (t != null) { chrome.tabs.get(parseInt(tabId), function(tab) { if (tab) { if (tab.mutedInfo.muted) { - $("#" + tabId).removeClass("audible").addClass("muted"); + t.classList.remove("audible"); + t.classList.add("muted"); } if (!tab.mutedInfo.muted && tab.audible) { - $("#" + tabId).removeClass("muted").addClass("audible"); + t.classList.remove("muted"); + t.classList.add("audible"); } if (!tab.mutedInfo.muted && !tab.audible) { - $("#" + tabId).removeClass("audible").removeClass("muted"); + t.classList.remove("audible"); + t.classList.remove("muted"); } } }); @@ -99,68 +120,73 @@ function RefreshMediaIcon(tabId) { function VivaldiRefreshMediaIcons() { setInterval(function() { chrome.tabs.query({currentWindow: true}, function(tabs) { - $(".audible, .muted").removeClass("audible").removeClass("muted"); + document.querySelectorAll(".audible, .muted").forEach(function(s){ + s.classList.remove("audible"); + s.classList.remove("muted"); + }); let tc = tabs.length; for (var ti = 0; ti < tc; ti++) { if (tabs[ti].audible) { - $("#" + tabs[ti].id).addClass("audible"); + document.getElementById(tabs[ti].id).classList.add("audible"); } if (tabs[ti].mutedInfo.muted) { - $("#" + tabs[ti].id).addClass("muted"); + document.getElementById(tabs[ti].id).classList.add("muted"); } } }); - }, 1400); + // }, 1400); + }, 1000); } function GetFaviconAndTitle(tabId, addCounter) { - if ($("#" + tabId)[0]) { + let t = document.getElementById(tabId); + if (t != null) { chrome.tabs.get(parseInt(tabId), function(tab) { if (tab){ let title = tab.title ? tab.title : tab.url; + let tHeader = t.childNodes[3]; + let tTitle = tHeader.childNodes[1]; if (tab.status == "complete") { - $("#" + tabId).removeClass("loading"); + t.classList.remove("loading"); // change title - $("#tab_title" + tab.id)[0].textContent = title; - $("#tab_header" + tab.id).attr("title", title); - $("#"+tabId).data("title", title); - + tTitle.textContent = title; + tHeader.title = title; + tHeader.setAttribute("tabTitle", title); // compatibility with various Tab suspender extensions if (tab.favIconUrl != undefined && tab.favIconUrl.match("data:image/png;base64") != null) { - $("#tab_header" + tab.id).css({ "background-image": "url(" + tab.favIconUrl + ")" }); + tHeader.style.backgroundImage = "url(" + tab.favIconUrl + ")"; } else { // case for internal pages, favicons don't have access, but can be loaded from url if (tab.url.match("opera://|vivaldi://|browser://|chrome://|chrome-extension://") != null) { - $("#tab_header" + tab.id).css({ "background-image": "url(chrome://favicon/" + tab.url + ")" }); + tHeader.style.backgroundImage = "url(chrome://favicon/" + tab.url + ")"; } else { // change favicon - var img = new Image(); + let img = new Image(); img.src = tab.favIconUrl; img.onload = function() { - $("#tab_header" + tab.id).css({ "background-image": "url(" + tab.favIconUrl + ")" }); + tHeader.style.backgroundImage = "url(" + tab.favIconUrl + ")"; }; img.onerror = function() { - $("#tab_header" + tab.id).css({ "background-image": ((tab.url == "" || browserId == "F") ? "url(./theme/icon_empty.svg)" : ("url(chrome://favicon/" + tab.url + ")")) }); - // $("#tab_header" + tab.id).css({ "background-image": "url(" + tab.url + ")" }); + tHeader.style.backgroundImage = ((tab.url == "" || browserId == "F") ? "url(./theme/icon_empty.svg)" : ("url(chrome://favicon/" + tab.url + ")")); + // "url(" + tab.url + ")" } } } } if (tab.status == "loading") { - $("#tab_header" + tab.id).css({ "background-image": "" }); - $("#" + tabId).addClass("loading"); title = tab.title ? tab.title : caption_loading; - $("#tab_title" + tab.id)[0].textContent = title; - $("#tab_header" + tab.id).attr("title", title); - $("#"+tabId).data("title", title); + t.classList.add("loading"); + tHeader.style.backgroundImage = ""; + tHeader.title = caption_loading; + tHeader.setAttribute("tabTitle", caption_loading); + tTitle.textContent = caption_loading; setTimeout(function() { - if ($("#" + tabId)[0]) GetFaviconAndTitle(tabId, addCounter); + if (document.getElementById(tab.id) != null) GetFaviconAndTitle(tab.id, addCounter); }, 1000); } if (addCounter && (opt.show_counter_tabs || opt.show_counter_tabs_hints)) { RefreshTabCounter(tabId); } - } }); } @@ -168,22 +194,23 @@ function GetFaviconAndTitle(tabId, addCounter) { // refresh open closed trees states function RefreshExpandStates() { - $(".folder:visible").each(function() { - if ($("#ch"+this.id).children().length == 0 && $("#cf"+this.id).children().length == 0) { - $(this).removeClass("o").removeClass("c").addClass("n"); + document.querySelectorAll("#"+active_group+" .folder").forEach(function(s){ + if (s.childNodes[4].children.length == 0 && s.childNodes[5].children.length == 0) { + s.classList.remove("o"); + s.classList.remove("c"); } else { - if ($(this).is(":not(.o, .c)")) { - $(this).addClass("o").removeClass("n"); + if (s.classList.contains("o") == false && s.classList.contains("c") == false) { + s.classList.add("o"); } } }); - - $(".tab:visible").each(function() { - if ($("#ch"+this.id).children().length == 0) { - $(this).removeClass("o").removeClass("c").addClass("n"); + document.querySelectorAll("#"+active_group+" .tab").forEach(function(s){ + if (s.childNodes[4].children.length == 0) { + s.classList.remove("o"); + s.classList.remove("c"); } else { - if ($(this).is(":not(.o, .c)")) { - $(this).addClass("o").removeClass("n"); + if (s.classList.contains("o") == false && s.classList.contains("c") == false) { + s.classList.add("o"); } } }); @@ -191,48 +218,50 @@ function RefreshExpandStates() { function RefreshCounters() { if (opt.show_counter_tabs || opt.show_counter_tabs_hints) { - $(".tab.n:visible").each(function() { - if ($("#tab_title"+this.id)[0]) { - $("#tab_title"+this.id)[0].textContent = $(this).data("title"); - $("#tab_header"+this.id).attr("title", $(this).data("title")); + document.querySelectorAll("#"+active_group+" .tab").forEach(function(s){ + let title = s.childNodes[3].getAttribute("tabTitle"); + if (title != null) { + s.childNodes[3].title = title; + s.childNodes[3].childNodes[1].textContent =title; } }); - $(".tab.c:visible, .tab.o:visible").each(function() { - if (opt.show_counter_tabs) { - $("#tab_title"+this.id)[0].textContent = ("("+$("#"+this.id+" .tab").length+") ") + $(this).data("title"); + document.querySelectorAll("#"+active_group+" .o.tab, #"+active_group+" .c.tab").forEach(function(s){ + let title = s.childNodes[3].getAttribute("tabTitle"); + + if (opt.show_counter_tabs && title != null) { + s.childNodes[3].childNodes[1].textContent = ("("+ document.querySelectorAll("[id='" + s.id + "'] .tab").length +") ") + title; } if (opt.show_counter_tabs_hints) { - $("#tab_header"+this.id).attr("title", ("("+$("#"+this.id+" .tab").length+") ") + $(this).data("title")); + s.childNodes[3].title = ("("+ document.querySelectorAll("[id='" + s.id + "'] .tab").length +") ") + title; } }); - $(".folder:visible").each(function() { - if (opt.show_counter_tabs) { - $("#folder_title"+this.id)[0].textContent = ("("+$("#"+this.id+" .tab").length+") ") + bgfolders[this.id].name; + + + document.querySelectorAll("#"+active_group+" .folder").forEach(function(s){ + if (opt.show_counter_tabs && bgfolders[s.id]) { + s.childNodes[3].childNodes[1].textContent = ("("+ document.querySelectorAll("[id='" + s.id + "'] .tab").length +") ") + bgfolders[s.id].name; } - if (opt.show_counter_tabs_hints) { - $("#folder_header"+this.id).attr("title", ("("+$("#"+this.id+" .tab").length+") ") + bgfolders[this.id].name); + if (opt.show_counter_tabs_hints && bgfolders[s.id]) { + s.childNodes[3].title = ("("+ document.querySelectorAll("[id='" + s.id + "'] .tab").length +") ") + bgfolders[s.id].name; } }); } } function RefreshTabCounter(tabId) { - if (opt.show_counter_tabs || opt.show_counter_tabs_hints) { - if ($("#"+tabId).data("title")) { + let t = document.getElementById(tabId); + let title = t.childNodes[3].getAttribute("tabTitle"); + if (t != null && title != null) { + if (t.classList.contains("o") || t.classList.contains("c")) { if (opt.show_counter_tabs) { - if ($(".c#"+tabId+", .o#"+tabId)[0]) { - $("#tab_title"+tabId)[0].textContent = ("("+$("#ch"+tabId+" .tab").length+") ") + $("#"+tabId).data("title"); - } else { - $("#tab_title"+tabId)[0].textContent = $("#"+tabId).data("title"); - } + t.childNodes[3].childNodes[1].textContent = ("("+ document.querySelectorAll("[id='" + t.id + "'] .tab").length +") ") + title; } if (opt.show_counter_tabs_hints) { - if ($(".c#"+tabId+", .o#"+tabId)[0]) { - $("#tab_header"+tabId).attr("title", ("("+$("#ch"+tabId+" .tab").length+") ") + $("#"+tabId).data("title")); - } else { - $("#tab_header"+tabId).attr("title", $("#"+tabId).data("title")); - } + t.childNodes[3].title = ("("+ document.querySelectorAll("[id='" + t.id + "'] .tab").length +") ") + title; } + } else { + t.childNodes[3].title = title; + t.childNodes[3].childNodes[1].textContent = title; } } } diff --git a/scripts/tabs.js b/scripts/tabs.js index 4f790e1..b80df43 100644 --- a/scripts/tabs.js +++ b/scripts/tabs.js @@ -10,283 +10,553 @@ async function UpdateData() { schedule_update_data = 1; } if (schedule_update_data > 0) { - $(".pin").each(function() { - chrome.runtime.sendMessage({ - command: "update_tab", - tabId: parseInt(this.id), - tab: { - parent: "pin_list", - index: $(this).index(), - expand: "n" - } - }); + if (opt.debug) console.log("function: update tabs"); + let pins_data = []; + document.querySelectorAll(".pin").forEach(function(pin){ + pins_data.push({id: pin.id, index: Array.from(pin.parentNode.children).indexOf(pin)}); }); - $(".tab").each(function() { - chrome.runtime.sendMessage({ - command: "update_tab", - tabId: parseInt(this.id), - tab: { - parent: $(this).parent().parent()[0].id, - index: $(this).index(), - expand: ($(this).is(".n") ? "n" : ($(this).is(".c") ? "c" : "o")) - } - }); + let tabs_data = []; + document.querySelectorAll(".tab").forEach(function(tab){ + tabs_data.push({id: tab.id, parent: tab.parentNode.parentNode.id, index: Array.from(tab.parentNode.children).indexOf(tab), expand: (tab.classList.contains("c") ? "c" : (tab.classList.contains("o") ? "o" : ""))}); }); + chrome.runtime.sendMessage({command: "update_all_tabs", pins: pins_data, tabs: tabs_data}); schedule_update_data--; } }, 1000); } + function RearrangeBrowserTabs() { setInterval(function() { if (schedule_rearrange_tabs > 0) { schedule_rearrange_tabs--; - let tabIds = $(".pin, .tab").map(function(){return parseInt(this.id);}).toArray(); + let tabIds = Array.prototype.map.call(document.querySelectorAll(".pin, .tab"), function(s){ + return parseInt(s.id); + }); RearrangeBrowserTabsLoop(tabIds, tabIds.length-1); } }, 1000); } + async function RearrangeBrowserTabsLoop(tabIds, tabIndex) { if (tabIndex >= 0 && schedule_rearrange_tabs == 0){ - chrome.tabs.get(tabIds[tabIndex], function(tab1) { - if (tabIndex != tab1.index) { + chrome.tabs.get(tabIds[tabIndex], function(tab) { + if (tab && tabIndex != tab.index) { chrome.tabs.move(tabIds[tabIndex], {index: tabIndex}); } RearrangeBrowserTabsLoop( tabIds, (tabIndex-1) ); }); } } + function RearrangeTreeTabs(tabs, bgtabs, first_loop) { tabs.forEach(function(Tab) { - if (bgtabs[Tab.id] && $("#"+Tab.id)[0] && $("#"+Tab.id).parent().children().eq(bgtabs[Tab.id].index)[0]) { - if ($("#"+Tab.id).index() > bgtabs[Tab.id].index) { - $("#"+Tab.id).insertBefore($("#"+Tab.id).parent().children().eq(bgtabs[Tab.id].index)); + let t = document.getElementById(Tab.id); + if (bgtabs[Tab.id] && t != null && t.parentNode.childNodes[bgtabs[Tab.id].index]) { + let tInd = Array.from(t.parentNode.children).indexOf(t); + if (tInd > bgtabs[Tab.id].index) { + t.parentNode.childNodes[bgtabs[Tab.id].index].parentNode.insertBefore(t, t.parentNode.childNodes[bgtabs[Tab.id].index]); } else { - $("#"+Tab.id).insertAfter($("#"+Tab.id).parent().children().eq(bgtabs[Tab.id].index)); + if (t.parentNode.childNodes[bgtabs[Tab.id].index].nextSibling != null) { + t.parentNode.childNodes[bgtabs[Tab.id].index].parentNode.insertBefore(t, t.parentNode.childNodes[bgtabs[Tab.id].index].nextSibling); + } else { + t.parentNode.childNodes[bgtabs[Tab.id].index].parentNode.appendChild(t); + } + } + let newtInd = Array.from(t.parentNode.children).indexOf(t); + if (bgtabs[Tab.id] && newtInd != bgtabs[Tab.id].index && first_loop) { + RearrangeTreeTabs(tabs, bgtabs, false); } - } - if (bgtabs[Tab.id] && $("#"+Tab.id).index() != bgtabs[Tab.id].index && first_loop) { - RearrangeTreeTabs(tabs, bgtabs, false); } }); } -// param - tuple object with paramenters: param.tab - tab object, param.ParentId - Parent tabId, param.InsertAfterId - insert tab after this tabId (on same level), -// param.Append - if true Appends tab at the end of tree if false or prepends -function AppendTab(param) { - if ($("#"+param.tab.id).length > 0) { - GetFaviconAndTitle(param.tab.id, param.addCounter); + +function AppendTab(tab, ParentId, InsertBeforeId, InsertAfterId, Append, Index, SetEvents, AdditionalClass, SkipSetActive, Scroll, addCounter) { + if (document.getElementById(tab.id) != null) { + GetFaviconAndTitle(tab.id, addCounter); return; } - var ClassList = param.tab.pinned ? "pin" : "tab n"; - if (param.tab.discarded) { + var ClassList = tab.pinned ? "pin" : "tab"; + if (tab.discarded) { ClassList = ClassList + " discarded"; } - if (param.AdditionalClass) { - ClassList = ClassList +" "+ param.AdditionalClass; + if (AdditionalClass != false) { + ClassList = ClassList +" "+ AdditionalClass; } - var tb = document.createElement("div"); tb.className = ClassList; tb.id = param.tab.id; // TAB - var dc = document.createElement("div"); dc.className = "drop_target drag_enter_center"; dc.id = "dc"+param.tab.id; tb.appendChild(dc); // DROP TARGET CENTER - var dt = document.createElement("div"); dt.className = "drop_target drag_entered_top"; dt.id = "du"+param.tab.id; tb.appendChild(dt); // DROP TARGET TOP - var db = document.createElement("div"); db.className = "drop_target drag_entered_bottom"; db.id = "dd"+param.tab.id; tb.appendChild(db); // DROP TARGET BOTTOM - var th = document.createElement("div"); th.className = opt.always_show_close ? "tab_header close_show" : "tab_header"; th.id = "tab_header"+param.tab.id; th.draggable = true; tb.appendChild(th); // HEADER - var ex = document.createElement("div"); ex.className = "expand"; ex.id = "exp"+param.tab.id; th.appendChild(ex); // EXPAND ARROW - var tt = document.createElement("div"); tt.className = "tab_title"; tt.id = "tab_title"+param.tab.id; th.appendChild(tt); // TITLE - // var tc = document.createElement("div"); tc.className = "tab_counter"; tc.id = "tab_counter"+param.tab.id; th.appendChild(tc); // TABS COUNTER + var tb = document.createElement("div"); tb.className = ClassList; tb.id = tab.id; // TAB + var dc = document.createElement("div"); dc.className = "drop_target drag_enter_center"; dc.id = "dc"+tab.id; tb.appendChild(dc); // DROP TARGET CENTER + var du = document.createElement("div"); du.className = "drop_target drag_entered_top"; du.id = "du"+tab.id; tb.appendChild(du); // DROP TARGET TOP + var dd = document.createElement("div"); dd.className = "drop_target drag_entered_bottom"; dd.id = "dd"+tab.id; tb.appendChild(dd); // DROP TARGET BOTTOM + var th = document.createElement("div"); th.className = (opt.always_show_close && !opt.never_show_close) ? "tab_header close_show" : "tab_header"; th.id = "tab_header"+tab.id; if (SetEvents) {th.draggable = true;} tb.appendChild(th); // HEADER + var ex = document.createElement("div"); ex.className = "expand"; ex.id = "exp"+tab.id; th.appendChild(ex); // EXPAND ARROW + var tt = document.createElement("div"); tt.className = "tab_title"; tt.id = "tab_title"+tab.id; th.appendChild(tt); // TITLE if (!opt.never_show_close) { - var cl = document.createElement("div"); cl.className = "close"; cl.id = "close"+param.tab.id; th.appendChild(cl); // CLOSE BUTTON - var ci = document.createElement("div"); ci.className = "close_img"; ci.id = "close_img"+param.tab.id; cl.appendChild(ci); + var cl = document.createElement("div"); cl.className = "close"; cl.id = "close"+tab.id; th.appendChild(cl); // CLOSE BUTTON + var ci = document.createElement("div"); ci.className = "close_img"; ci.id = "close_img"+tab.id; cl.appendChild(ci); } - var mi = document.createElement("div"); mi.className = "tab_mediaicon"; mi.id = "tab_mediaicon"+param.tab.id; th.appendChild(mi); - var ch = document.createElement("div"); ch.className = "children"; ch.id = "ch"+param.tab.id; tb.appendChild(ch); - if (param.tab.pinned) { - param.ParentId = "pin_list"; - } else { - if (param.ParentId == undefined || $("#"+param.ParentId).is(".pin, #pin_list") || $("#"+param.ParentId).length == 0) { - param.ParentId = "ch"+active_group; - } else { - if ($("#ch"+param.ParentId).children().length == 0) { - $("#"+param.ParentId).addClass("o").removeClass("n").removeClass("c"); + var mi = document.createElement("div"); mi.className = "tab_mediaicon"; mi.id = "tab_mediaicon"+tab.id; th.appendChild(mi); + var ct = document.createElement("div"); ct.className = "children_tabs"; ct.id = "ct"+tab.id; tb.appendChild(ct); + + if (SetEvents) { + ct.onmousedown = function(event) { + if (event.target == this) { + if (event.which == 1) { + DeselectFolders(); + DeselectTabs(); + } + if (event.which == 2 && event.target == this) { + event.stopImmediatePropagation(); + ActionClickGroup(this.parentNode, opt.midclick_group); + } + if (event.which == 3) { + ShowFGlobalMenu(event); + } + } + } + ct.ondblclick = function(event) { + if (event.target == this) { + ActionClickGroup(this.parentNode, opt.dbclick_group); + } + } + ex.onmousedown = function(event) { + if (document.getElementById("main_menu").style.top != "-1000px") { + HideMenus(); + } + if (event.which == 1 && !event.shiftKey && !event.ctrlKey) { + EventExpandBox(this.parentNode.parentNode); + } + } + ex.onmouseenter = function(event) { + this.classList.add("hover"); + } + ex.onmouseleave = function(event) { + this.classList.remove("hover"); + } + + if (!opt.never_show_close) { + cl.onmousedown = function(event) { + event.stopImmediatePropagation(); + if (event.which != 3) { + CloseTabs([parseInt(this.parentNode.parentNode.id)]); + } + } + cl.onmouseenter = function(event) { + this.classList.add("close_hover"); + } + cl.onmouseleave = function(event) { + this.classList.remove("close_hover"); + } + } + tb.ondragenter = function(event) { + this.childNodes[1].style.zIndex = 99999; + } + + + th.onclick = function(event) { + event.stopImmediatePropagation(); + if (document.getElementById("main_menu").style.top != "-1000px") { + HideMenus(); + } else { + if (event.which == 1 && !event.shiftKey && !event.ctrlKey && (event.target.classList.contains("tab_title") || event.target.classList.contains("tab_header"))) { + DeselectTabs(); + // SetActiveTab(this.parentNode.id); + chrome.tabs.update(parseInt(this.parentNode.id), { active: true }); + } + } + } + th.ondblclick = function(event) { + if (event.target.classList && (event.target.classList.contains("tab_title") || event.target.classList.contains("tab_header"))) { + ActionClickTab(this.parentNode, opt.dbclick_tab); + } + } + + th.onmousedown = function(event) { + event.stopImmediatePropagation(); + if (event.which == 1) { + // SELECT TAB/PIN + EventSelectTab(event, this.parentNode); + } + if (event.which == 2) { + event.preventDefault(); + ActionClickTab(this.parentNode, opt.midclick_tab); + } + if (event.which == 3) { + ShowTabMenu(this.parentNode, event); + } + } + + th.onmouseover = function(event) { + this.classList.add("tab_header_hover"); + if (opt.never_show_close == false && opt.always_show_close == false) { + this.classList.add("close_show"); + } + } + th.onmouseleave = function(event) { + this.classList.remove("tab_header_hover"); + if (opt.never_show_close == false && opt.always_show_close == false) { + this.classList.remove("close_show"); + } + } + th.ondragstart = function(event) { // DRAG START + event.stopPropagation(); + event.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0); + event.dataTransfer.setData("text", ""); + // event.dataTransfer.setData("text/plain", ""); + // event.dataTransfer.setData("TTSourceWindowId", CurrentWindowId); + + CleanUpDragClasses(); + EmptyDragAndDrop(); + + DropTargetsFront(this, true, false); + + if (this.parentNode.classList.contains("selected_tab") == false) { + document.querySelectorAll(".selected_tab").forEach(function(s){ + s.classList.add("selected_frozen"); + s.classList.remove("selected_tab"); + s.classList.remove("selected_last"); + }); + this.parentNode.classList.add("selected_temporarly"); + this.parentNode.classList.add("selected_tab"); + } else { + document.querySelectorAll(".group:not(#"+active_group+") .selected_tab").forEach(function(s){ + s.classList.add("selected_frozen"); + s.classList.remove("selected_tab"); + s.classList.remove("selected_last"); + }); + } + let Tabs = GetSelectedTabs(); + + document.querySelectorAll("[id='"+this.parentNode.id+"'], [id='"+this.parentNode.id+"'] .folder, [id='"+this.parentNode.id+"'] .tab").forEach(function(s){ + s.classList.add("dragged_tree"); + }); + document.querySelectorAll(".selected_tab, .selected_tab .tab, .selected_folder, .selected_folder .folder").forEach(function(s){ + s.classList.add("dragged_selected"); + }); + + if (opt.max_tree_drag_drop) { + document.querySelectorAll(".dragged_tree .tab").forEach(function(s){ + let parents = GetParentsByClass(s.parentNode, "dragged_tree"); + if (parents.length > DragAndDrop.Depth) { + DragAndDrop.Depth = parents.length; + } + }); + } else { + DragAndDrop.Depth = -1; + } + + DragAndDrop.TabsIds = Object.assign([], Tabs.TabsIds); + DragAndDrop.TabsIdsParents = Object.assign([], Tabs.TabsIdsParents); + DragAndDrop.TabsIdsSelected = Object.assign([], Tabs.TabsIdsSelected); + DragAndDrop.DragNodeClass = "tab"; + DragAndDrop.ComesFromWindowId = CurrentWindowId; + + chrome.runtime.sendMessage({ + command: "drag_drop", + DragNodeClass: DragAndDrop.DragNodeClass, + TabsIds: DragAndDrop.TabsIds, + TabsIdsParents: DragAndDrop.TabsIdsParents, + TabsIdsSelected: DragAndDrop.TabsIdsSelected, + ComesFromWindowId: CurrentWindowId, + Depth: DragAndDrop.Depth, + Folders: DragAndDrop.Folders, + FoldersSelected: DragAndDrop.FoldersSelected + }); + } + + th.ondragenter = function(event) { + this.classList.remove("tab_header_hover"); + } + + dc.ondragenter = function(event) { + DragAndDrop.timeout = false; + setTimeout(function() { + DragAndDrop.timeout = true; + }, 1000); + if (DragAndDrop.DragNodeClass == "tab") { + HighlightDragEnter(this, 0, "tab"); + } + } + + du.ondragenter = function(event) { + if (DragAndDrop.DragNodeClass == "tab") { + HighlightDragEnter(this, 1, "tab"); + } + } + + dd.ondragenter = function(event) { + if (DragAndDrop.DragNodeClass == "tab") { + HighlightDragEnter(this, 1, "tab"); + } + } + + mi.onmousedown = function(event) { + event.stopImmediatePropagation(); + if (event.which == 1 && (this.parentNode.parentNode.classList.contains("audible") || this.parentNode.parentNode.classList.contains("muted")) ) { + chrome.tabs.get(parseInt(this.parentNode.parentNode.id), function(tab) { + if (tab) { + chrome.tabs.update(tab.id, {muted:!tab.mutedInfo.muted}); + } + }); } - param.ParentId = "ch"+param.ParentId; } } - if (param.Append) { - $("#"+param.ParentId).append(tb); + + let parent; + if (tab.pinned) { + parent = document.getElementById("pin_list"); + } else { + if (ParentId == false || ParentId == undefined || document.getElementById(ParentId) == null || document.querySelector(".pin[id='"+ParentId+"']") != null || ParentId == "pin_list") { + parent = document.getElementById("ct"+active_group); + } else { + parent = document.getElementById("ct"+ParentId); + if (parent.children.length == 0) { + parent.parentNode.classList.add("o"); + parent.parentNode.classList.remove("c"); + } + } + } + if (Append && parent) { + parent.appendChild(tb); } - if (!param.Append) { - $("#"+param.ParentId).prepend(tb); + if (!Append && parent) { + parent.prepend(tb); } - if (param.InsertBeforeId != undefined && $("#"+param.InsertBeforeId)[0]) { - if ((param.tab.pinned && $("#"+param.InsertBeforeId).is(".pin")) || (!param.tab.pinned && $("#"+param.InsertBeforeId).is(".tab"))) { - $("#"+param.tab.id).insertBefore($("#"+param.InsertBeforeId)); + + if (InsertBeforeId) { + let Before = document.getElementById(InsertBeforeId); + if (Before != null) { + if ((tab.pinned && Before.classList.contains("pin")) || (tab.pinned == false && Before.classList.contains("tab"))) { + Before.parentNode.insertBefore(tb, Before); + } } } - if (param.InsertAfterId != undefined && $("#"+param.InsertAfterId)[0]) { - if ((param.tab.pinned && $("#"+param.InsertAfterId).is(".pin")) || (!param.tab.pinned && $("#"+param.InsertAfterId).is(".tab"))) { - $("#"+param.tab.id).insertAfter($("#"+param.InsertAfterId)); + if (InsertAfterId) { + let After = document.getElementById(InsertAfterId); + if (After != null) { + if ((tab.pinned && After.classList.contains("pin")) || (tab.pinned == false && After.classList.contains("tab"))) { + if (After.nextSibling != null) { + After.parentNode.insertBefore(tb, After.nextSibling); + } else { + After.parentNode.appendChild(tb); + } + } } } - GetFaviconAndTitle(param.tab.id, param.addCounter); - RefreshMediaIcon(param.tab.id); - if (param.tab.active && param.SkipSetActive == undefined) { - SetActiveTab(param.tab.id); + if (Index) { + if (tb.parentNode.childNodes.length >= Index) { + tb.parentNode.insertBefore(tb, tb.parentNode.childNodes[Index]); + } else { + tb.parentNode.appendChild(tb); + } } - if (param.Scroll) { - ScrollToTab(param.tab.id); + GetFaviconAndTitle(tab.id, addCounter); + RefreshMediaIcon(tab.id); + if (tab.active && SkipSetActive == false) { + SetActiveTab(tab.id); } -} -function RemoveTabFromList(tabId) { - if ($("#"+tabId)[0]) { - $("#"+tabId).remove(); + if (Scroll) { + ScrollToTab(tab.id); } } -function SetTabClass(param) { // param - tuple object with paramenters: param.pin - true for pinned, param.id - tabId - if (param.pin) { - $("#pin_list").append($("#"+param.id)); - if ($("#ch"+param.id).children().length > 0) { // flatten out children - $($("#"+param.id).children().find(".pin, .tab").get().reverse()).each(function() { - $(this).removeClass("tab").removeClass("n").removeClass("o").removeClass("c").addClass("pin"); - $(this).insertAfter($("#"+param.id)); - chrome.tabs.update(parseInt(this.id), {pinned: true}); - }); - } - $("#"+param.id).removeClass("tab").removeClass("n").removeClass("o").removeClass("c").addClass("pin"); - } else { - $("#ch"+active_group).prepend($("#"+param.id)); - $("#"+param.id).removeClass("pin").removeClass("attention").addClass("tab"); - RefreshExpandStates(); - } - chrome.tabs.update(parseInt(param.id), {pinned: param.pin}); - RefreshGUI(); -} -function SetActiveTab(tabId) { - if ($("#"+tabId).length > 0) { - if ($("#"+tabId).is(".tab")) { - SetActiveTabInGroup($("#"+tabId).parents(".group")[0].id, tabId); - } - $(".selected_folder").removeClass("selected_folder"); - $(".pin, #"+active_group+" .tab").removeClass("active_tab").removeClass("selected_tab").removeClass("selected_frozen").removeClass("selected_temporarly").removeClass("tab_header_hover"); - $(".highlighted_drop_target").removeClass("highlighted_drop_target"); - $("#"+tabId).removeClass("attention").addClass("active_tab"); - ScrollToTab(tabId); +function RemoveTabFromList(tabId) { + let tab = document.getElementById(tabId); + if (tab != null) { + tab.parentNode.removeChild(tab); } } -function ScrollToTab(tabId) { - if ($("#"+tabId)[0]) { - if ($("#"+tabId).is(".pin")) { - if ($("#"+tabId).position().left+$("#"+tabId).outerWidth() > $("#pin_list").innerWidth()) { - $("#pin_list").scrollLeft($("#pin_list").scrollLeft()+$("#"+tabId).position().left+$("#"+tabId).outerWidth()-$("#pin_list").innerWidth()); - } else { - if ($("#"+tabId).position().left < 0) { - $("#pin_list").scrollLeft($("#pin_list").scrollLeft()+$("#"+tabId).position().left); - } + +function SetTabClass(tabId, pin) { + let PinList = document.getElementById("pin_list"); + let GroupList = document.getElementById("ct"+active_group); + let Tab = document.getElementById(tabId); + if (Tab != null) { + if (pin) { + if (Tab.parentNode.id != "pin_list") { + document.getElementById("pin_list").appendChild(Tab); } - } - if ($("#"+tabId).is(".tab")) { - if ($("#"+active_group+" #"+tabId)[0]) { - if ($("#"+tabId).is(":not(:visible)")) { - $("#"+tabId).parents(".folder, .tab").removeClass("c").addClass("o"); - } - if ($("#"+tabId).offset().top - $("#"+active_group).offset().top < 0) { - $("#"+active_group).scrollTop($("#"+active_group).scrollTop() + $("#"+tabId).offset().top - $("#"+active_group).offset().top); - } else { - if ($("#"+tabId).offset().top - $("#"+active_group).offset().top > $("#"+active_group).innerHeight() - $(".tab_header").outerHeight()) { - $("#"+active_group).scrollTop($("#"+active_group).scrollTop() + $("#"+tabId).offset().top - $("#"+active_group).offset().top - $("#"+active_group).innerHeight() + $(".tab_header").outerHeight() + 4); + Tab.classList.remove("tab"); + Tab.classList.remove("o"); + Tab.classList.remove("c"); + Tab.classList.add("pin"); + if (document.getElementById("ct"+tabId).childNodes.length > 0) { // flatten out children + let tabs = document.querySelectorAll("#ct"+tabId+" .pin, #ct"+tabId+" .tab"); + for (let i = tabs.length-1; i >= 0; i--) { + tabs[i].remove("tab"); + tabs[i].remove("o"); + tabs[i].remove("c"); + tabs[i].classList.add("pin"); + if(Tab.nextSibling != null) { + PinList.insertBefore(tabs[i], Tab.nextSibling); + } else { + PinList.appendChild(tabs[i]); } + chrome.tabs.update(parseInt(tabs[i].id), {pinned: true}); + } + } + + } else { + if (GroupList.childNodes.length > 0) { // flatten out children + GroupList.insertBefore(Tab, GroupList.childNodes[0]); + } else { + GroupList.appendChild(Tab); + } + Tab.classList.remove("pin"); + Tab.classList.remove("attention"); + Tab.classList.add("tab"); + RefreshExpandStates(); + } + chrome.tabs.update(parseInt(tabId), {pinned: pin}); + RefreshGUI(); + } +} + +function SetActiveTab(tabId) { + let Tab = document.getElementById(tabId); + if (Tab != null) { + document.querySelectorAll(".selected_folder").forEach(function(s){ + s.classList.remove("selected_folder"); + }); + document.querySelectorAll(".pin, #"+active_group+" .tab").forEach(function(s){ + s.classList.remove("active_tab"); + s.classList.remove("selected_tab"); + s.classList.remove("selected_last"); + s.classList.remove("selected_frozen"); + s.classList.remove("selected_temporarly"); + s.classList.remove("tab_header_hover"); + }); + document.querySelectorAll(".highlighted_drop_target").forEach(function(s){ + s.classList.remove("highlighted_drop_target"); + }); + Tab.classList.remove("attention"); + Tab.classList.add("active_tab"); + ScrollToTab(tabId); + if (Tab.classList.contains("tab")) { + SetActiveTabInGroup(active_group, tabId); + } + } +} + +function ScrollToTab(tabId) { + let Tab = document.getElementById(tabId); + if (Tab != null) { + if (Tab.classList.contains("pin")) { + if (Tab.getBoundingClientRect().left - document.getElementById("pin_list").getBoundingClientRect().left < 0) { + document.getElementById("pin_list").scrollLeft = document.getElementById("pin_list").scrollLeft + Tab.getBoundingClientRect().left - document.getElementById("pin_list").getBoundingClientRect().left - 2; + } else { + if (Tab.getBoundingClientRect().left - document.getElementById("pin_list").getBoundingClientRect().left > document.getElementById(active_group).getBoundingClientRect().width - document.querySelector(".tab_header").getBoundingClientRect().width) { + document.getElementById("pin_list").scrollLeft = document.getElementById("pin_list").scrollLeft + Tab.getBoundingClientRect().left - document.getElementById("pin_list").getBoundingClientRect().left - document.getElementById("pin_list").getBoundingClientRect().width + document.querySelector(".tab_header").getBoundingClientRect().width + 2; + } + } + } + if (Tab.classList.contains("tab") && document.querySelector("#"+active_group+" [id='"+tabId+"']") != null) { + let Parents = GetParentsByClass(Tab, "c"); + if (Parents.length > 0) { + Parents.forEach(function(s){ + s.classList.remove("c"); + s.classList.add("o"); + }); + } + if (Tab.getBoundingClientRect().top - document.getElementById(active_group).getBoundingClientRect().top < 0) { + document.getElementById(active_group).scrollTop = document.getElementById(active_group).scrollTop + Tab.getBoundingClientRect().top - document.getElementById(active_group).getBoundingClientRect().top - 2; + } else { + if (Tab.getBoundingClientRect().top - document.getElementById(active_group).getBoundingClientRect().top > document.getElementById(active_group).getBoundingClientRect().height - document.querySelector(".tab_header").getBoundingClientRect().height) { + document.getElementById(active_group).scrollTop = document.getElementById(active_group).scrollTop + Tab.getBoundingClientRect().top - document.getElementById(active_group).getBoundingClientRect().top - document.getElementById(active_group).getBoundingClientRect().height + document.querySelector(".tab_header").getBoundingClientRect().height + 10; } } } } } -function DetachTabs(tabsIds, Folders) { + +function Detach(tabsIds, Folders) { chrome.windows.get(CurrentWindowId, {populate : true}, function(window) { - if (window.tabs.length == 1 || tabsIds.length == 0 || tabsIds.length == window.tabs.length) { + if (window.tabs.length == 1 || tabsIds.length == 0) { return; } - chrome.windows.create({state:window.state}, function(new_window) { + if (tabsIds.length == window.tabs.length) { + if (opt.debug) console.log("You are trying to detach all tabs! Skipping!"); + return; + } + chrome.windows.create({tabId: tabsIds[0], state:window.state}, function(new_window) { let Indexes = []; let Parents = []; let Expands = []; - let NewIds = []; + let NewIds = []; // MOZILLA BUG 1398272 let NewTabs = []; - tabsIds.forEach(function(tabId) { - Indexes.push($("#"+tabId).index()); - Parents.push($("#"+tabId).parent().parent()[0].id); - Expands.push($("#"+tabId).is(".n") ? "n" : ($("#"+tabId).is(".c") ? "c" : "o")); - }); let Ind = 0; + tabsIds.forEach(function(tabId) { + let tab = document.getElementById(tabId); + NewIds.push(tabId); // MOZILLA BUG 1398272 + Indexes.push(Array.from(tab.parentNode.children).indexOf(tab)); + Parents.push(tab.parentNode.parentNode.id); + Expands.push( (tab.classList.contains("c") ? "c" : (tab.classList.contains("o") ? "o" : "")) ); + }); tabsIds.forEach(function(tabId) { chrome.tabs.move(tabId, {windowId: new_window.id, index:-1}, function(MovedTab) { - NewIds.push(MovedTab[0].id); - if (browserId == "F") { // AGAIN BUG 1398272 - MOZILLA! - NewTabs.push({id: NewIds[Ind], index: Indexes[Ind], parent: ((tabsIds.indexOf(parseInt(Parents[Ind])) != -1) ? NewIds[tabsIds.indexOf(parseInt(Parents[Ind]))] : Parents[Ind]), expand: Expands[Ind]}); - } else { - NewTabs.push({id: NewIds[Ind], index: Indexes[Ind], parent: Parents[Ind], expand: Expands[Ind]}); - } + if (browserId == "F") { // MOZILLA BUG 1398272 + if (Ind == 0) { // MOZILLA BUG 1398272 + NewIds[Ind] = new_window.tabs[0].id; // MOZILLA BUG 1398272 + } else { // MOZILLA BUG 1398272 + NewIds[Ind] = MovedTab[0].id; // MOZILLA BUG 1398272 + } // MOZILLA BUG 1398272 + NewTabs.push({id: NewIds[Ind], index: Indexes[Ind], parent: ((tabsIds.indexOf(parseInt(Parents[Ind])) != -1) ? NewIds[tabsIds.indexOf(parseInt(Parents[Ind]))] : Parents[Ind]), expand: Expands[Ind]}); // MOZILLA BUG 1398272 + } else { // MOZILLA BUG 1398272 + NewTabs.push({id: tabsIds[Ind], index: Indexes[Ind], parent: Parents[Ind], expand: Expands[Ind]}); // PUSH TAB FROM INDEX + } // MOZILLA BUG 1398272 Ind++; + if (Ind >= Parents.length-1) { + // chrome.tabs.remove(new_window.tabs[0].id, null); + let Confirmations = 0; + let GiveUpLimit = 600; + if (opt.debug) console.log("Detach - Remote Append and Update Loop, waiting for confirmations after attach tabs"); + var Append = setInterval(function() { + chrome.windows.get(new_window.id, function(confirm_new_window) { + chrome.runtime.sendMessage({command: "remote_update", groups: {}, folders: Folders, tabs: NewTabs, windowId: new_window.id}, function(response) { + if (response) { + Confirmations++; + } + }); + GiveUpLimit--; + if (opt.debug) console.log("Detach -> Attach in new window confirmed: "+Confirmations+" times. If sidebar is not open in new window this loop will give up in: "+GiveUpLimit+" seconds"); + if (Confirmations > 2 || GiveUpLimit < 0 || confirm_new_window == undefined) { + clearInterval(Append); + } + }); + }, 1000); + if (Folders && Object.keys(Folders).length > 0) { + for (var folder in Folders) { + RemoveFolder(Folders[folder].id); + } + } + } }); }); - chrome.tabs.remove(new_window.tabs[0].id, null); - let Loop = 0; - var Append = setInterval(function() { - chrome.runtime.sendMessage({command: "remote_update", groups: {}, folders: Folders, tabs: NewTabs, windowId: new_window.id}, function(response) { - log("Detach - Remote Append and Update Loop, giving half second to attach each tab"); - }); - Loop++; - if (Loop > tabsIds.length) { - clearInterval(Append); - } - }, 500); - - if (Object.keys(Folders).length > 0) { - for (var folder in Folders) { - RemoveFolder(Folders[folder].id); - } - } - - }); - }); -} -function FindTab(input) { // find and select tabs - $(".filtered").removeClass("filtered").removeClass("selected_tab"); - $(".highlighted_search").removeClass("highlighted_search"); - if (input.length == 0) { - $("#filter_box")[0].value = ""; - $("#button_filter_clear").css({"opacity": "0"}).attr("title", ""); - return; - } else { - $("#button_filter_clear").css({"opacity": "1"}); - $("#button_filter_clear").attr("title", caption_clear_filter); - } - SearchIndex = 0; - chrome.tabs.query({windowId: CurrentWindowId, pinned: false}, function(tabs) { - tabs.forEach(function(Tab) { - if ($("#button_filter_type").is(".url") && Tab.url.toLowerCase().match(input.toLowerCase())) { - $("#"+Tab.id).addClass("filtered").addClass("selected_tab"); - } - if ($("#button_filter_type").is(".title") && Tab.title.toLowerCase().match(input.toLowerCase())) { - $("#"+Tab.id).addClass("filtered").addClass("selected_tab"); - } }); }); } + function CloseTabs(tabsIds) { - if ($("#"+active_group+" .active_tab")[0] && tabsIds.indexOf(parseInt($("#"+active_group+" .active_tab")[0].id)) != -1) { - ActionBeforeTabsClose(); + let activeTab = document.querySelector(".pin.active_tab, #"+active_group+" .tab.active_tab"); + if (activeTab != null && tabsIds.indexOf(parseInt(activeTab.id)) != -1) { + SwitchActiveTabBeforeClose(active_group); } tabsIds.forEach(function(tabId) { - if ($("#"+tabId).is(".pin") && opt.allow_pin_close) { - $("#"+tabId).remove(); + let tab = document.getElementById(tabId); + if (tab.classList.contains("pin") && opt.allow_pin_close) { + tab.parentNode.removeChild(tab); chrome.tabs.update(tabId, {pinned: false}); } + if (tabId == tabsIds[tabsIds.length-1]) { + setTimeout(function() { + chrome.tabs.remove(tabsIds, null); + }, 10); + } }); - setTimeout(function() { - chrome.tabs.remove(tabsIds, null); - }, 50); } + function DiscardTabs(tabsIds) { var delay = 100; - if ($("#"+tabsIds[0]).is(".discarded")) { + let tabNode = document.getElementById(tabsIds[0]); + if (tabNode == null || tabNode.classList.contains("discarded") || tabNode.classList.contains("active_tab")) { delay = 5; } else { chrome.tabs.discard(tabsIds[0]); @@ -298,40 +568,40 @@ function DiscardTabs(tabsIds) { }, delay); } } -function ActionBeforeTabsClose() { - log("function: ActionBeforeTabsClose"); - if ($("#"+active_group+" .tab").length == 1) { - log("there is only one tab"); + +function SwitchActiveTabBeforeClose(ActiveGroupId) { + if (opt.debug) console.log("function: SwitchActiveTabBeforeClose"); + let activeGroup = document.getElementById(ActiveGroupId); + if (document.querySelectorAll("#"+ActiveGroupId+" .tab").length <= 1 && document.querySelector(".pin.active_tab") == null) { if (opt.after_closing_active_tab == "above" || opt.after_closing_active_tab == "above_seek_in_parent") { - log("activate group above"); - if ($("#"+active_group).prev(".group")[0]) { - SetActiveGroup(($("#"+active_group).prev(".group")[0].id), true, true); - } else { - if ($("#"+active_group).next(".group")[0]) { - SetActiveGroup(($("#"+active_group).next(".group")[0].id), true, true); + if (activeGroup.previousSibling != null) { + if (document.querySelectorAll("#"+activeGroup.previousSibling.id+" .tab").length > 0) { + SetActiveGroup(activeGroup.previousSibling.id, true, true); } else { - SetActiveGroup("tab_list", true, true); + SwitchActiveTabBeforeClose(activeGroup.previousSibling.id); + return; } + } else { + SetActiveGroup("tab_list", true, true); } } else { - log("activate group below"); - if ($("#"+active_group).next(".group")[0]) { - SetActiveGroup(($("#"+active_group).next(".group")[0].id), true, true); - } else { - if ($("#"+active_group).prev(".group")[0]) { - SetActiveGroup(($("#"+active_group).prev(".group")[0].id), true, true); + if (activeGroup.nextSibling != null) { + if (document.querySelectorAll("#"+activeGroup.nextSibling.id+" .tab").length > 0) { + SetActiveGroup(activeGroup.nextSibling.id, true, true); } else { - SetActiveGroup("tab_list", true, true); + SwitchActiveTabBeforeClose(activeGroup.nextSibling.id); + return; } + } else { + SetActiveGroup("tab_list", true, true); } } } else { - log("there are more tabs"); if (opt.after_closing_active_tab == "above") { - ActivatePrevTab(); + ActivatePrevTab(true); } if (opt.after_closing_active_tab == "below") { - ActivateNextTab(); + ActivateNextTab(true); } if (opt.after_closing_active_tab == "above_seek_in_parent") { ActivatePrevTabBeforeClose(); @@ -341,249 +611,314 @@ function ActionBeforeTabsClose() { } } } + function ActivateNextTabBeforeClose() { - log("function: ActivateNextTabBeforeClose"); - if ($(".pin.active_tab:visible")[0]) { - if ($(".pin.active_tab").next(".pin")[0]) { - chrome.tabs.update(parseInt($(".pin.active_tab").next(".pin")[0].id), { active: true }); + let activePin = document.querySelector(".pin.active_tab"); + if (activePin != null) { + if (activePin.nextSibling != null) { + chrome.tabs.update(parseInt(activePin.nextSibling.id), { active: true }); } else { - if ($(".pin.active_tab").prev(".pin")[0]) { - chrome.tabs.update(parseInt($(".pin.active_tab").prev(".pin")[0].id), { active: true }); + if (activePin.previousSibling != null) { + chrome.tabs.update(parseInt(activePin.previousSibling.id), { active: true }); } } } - if ($("#"+active_group+" .tab.active_tab")[0] && $("#"+active_group+" .tab").length > 1) { - if ($("#"+active_group+" .tab.active_tab").children().last().children(".tab")[0]) { - chrome.tabs.update(parseInt($("#"+active_group+" .tab.active_tab").children().last().children(".tab")[0].id), { active: true }); + let activeTab = document.querySelector("#"+active_group+" .tab.active_tab"); + if (activeTab != null && document.querySelectorAll("#"+active_group+" .tab").length > 1) { + if (opt.promote_children && activeTab.lastChild.firstChild != null) { + chrome.tabs.update(parseInt(activeTab.lastChild.firstChild.id), { active: true }); } else { - if ($("#"+active_group+" .tab.active_tab").next(".tab")[0]) { - chrome.tabs.update(parseInt($("#"+active_group+" .tab.active_tab").next(".tab")[0].id), { active: true }); + if (activeTab.nextSibling != null) { + chrome.tabs.update(parseInt(activeTab.nextSibling.id), { active: true }); } else { - if ($("#"+active_group+" .tab.active_tab").prev(".tab")[0]) { - chrome.tabs.update(parseInt($("#"+active_group+" .tab.active_tab").prev(".tab")[0].id), { active: true }); + if (activeTab.previousSibling != null) { + chrome.tabs.update(parseInt(activeTab.previousSibling.id), { active: true }); } else { - if ($("#"+active_group+" .tab.active_tab").parent().is(".children") && $("#"+active_group+" .tab.active_tab").parent().parent(".tab")[0]) { - chrome.tabs.update(parseInt($("#"+active_group+" .tab.active_tab").parent().parent(".tab")[0].id), { active: true }); + if (activeTab.parentNode.parentNode.classList.contains("tab")) { + chrome.tabs.update(parseInt(activeTab.parentNode.parentNode.id), { active: true }); } else { - if ($("#"+active_group+" .tab.active_tab").parents(".tab").last().next(".tab")[0]) { - chrome.tabs.update(parseInt($("#"+active_group+" .tab.active_tab").parents(".tab").last().next(".tab")[0].id), { active: true }); - } else { - ActivatePrevTab(); - } + ActivatePrevTab(); } } } } } } + function ActivatePrevTabBeforeClose() { - log("function: ActivatePrevTabBeforeClose"); - if ($(".pin.active_tab")[0]) { - log("active_tab is pin"); - if ($(".pin.active_tab").prev(".pin")[0]) { - chrome.tabs.update(parseInt($(".pin.active_tab").prev(".pin")[0].id), { active: true }); + let activePin = document.querySelector(".pin.active_tab"); + if (activePin != null) { + if (activePin.previousSibling != null) { + chrome.tabs.update(parseInt(activePin.previousSibling.id), { active: true }); } else { - if ($(".pin.active_tab").next(".pin")[0]) { - chrome.tabs.update(parseInt($(".pin.active_tab").next(".pin")[0].id), { active: true }); + if (activePin.nextSibling != null) { + chrome.tabs.update(parseInt(activePin.nextSibling.id), { active: true }); } } } - if ($("#"+active_group+" .tab.active_tab")[0] && $("#"+active_group+" .tab").length > 1) { - log("active_group tabs length is > 1"); - if ($("#"+active_group+" .tab.active_tab").children().last().children(".tab")[0]) { - log("activating first child, because active tab is root"); - chrome.tabs.update(parseInt($("#"+active_group+" .tab.active_tab").children().last().children(".tab")[0].id), { active: true }); + let activeTab = document.querySelector("#"+active_group+" .tab.active_tab"); + if (activeTab != null && document.querySelectorAll("#"+active_group+" .tab").length > 1) { + if (opt.promote_children && activeTab.lastChild.firstChild != null) { + chrome.tabs.update(parseInt(activeTab.lastChild.firstChild.id), { active: true }); } else { - if ($("#"+active_group+" .tab.active_tab").prev(".tab")[0]) { - log("activating previous tab on same level"); - chrome.tabs.update(parseInt($("#"+active_group+" .tab.active_tab").prev(".tab")[0].id), { active: true }); + if (activeTab.previousSibling != null) { + chrome.tabs.update(parseInt(activeTab.previousSibling.id), { active: true }); } else { - if ($("#"+active_group+" .tab.active_tab").next(".tab")[0]) { - log("previous tab not found, activating next one on same level"); - chrome.tabs.update(parseInt($("#"+active_group+" .tab.active_tab").next(".tab")[0].id), { active: true }); + if (activeTab.nextSibling != null) { + chrome.tabs.update(parseInt(activeTab.nextSibling.id), { active: true }); } else { - if ($("#"+active_group+" .tab.active_tab").parent().is(".children") && $(".tab.active_tab").parent().parent(".tab")[0]) { - log("previous and next tab not found, which means active tab is last on same level, activating parent"); - chrome.tabs.update(parseInt($("#"+active_group+" .tab.active_tab").parent().parent(".tab")[0].id), { active: true }); + if (activeTab.parentNode.parentNode.classList.contains("tab")) { + chrome.tabs.update(parseInt(activeTab.parentNode.parentNode.id), { active: true }); } else { - if ($("#"+active_group+" .tab.active_tab").parents(".tab").last().prev(".tab")[0]) { - log("parent tab not found, which means we are on top in hierarchy, activating previous on top level"); - chrome.tabs.update(parseInt($("#"+active_group+" .tab.active_tab").parents(".tab").last().prev(".tab")[0].id), { active: true }); - } else { - log("all attempts to find previous tab failed, lets activate next tab"); - ActivateNextTab(); - } + ActivateNextTab(); } } } } } } -function ActivateNextTab() { - log("function: ActivateNextTab"); - if ($(".pin.active_tab")[0]) { - log("active_tab is pin"); - if ($(".pin.active_tab").next(".pin")[0]) { - chrome.tabs.update(parseInt($(".pin.active_tab").next(".pin")[0].id), { active: true }); + +function ActivateNextTab(allow_reverse) { + let activePin = document.querySelector(".pin.active_tab"); + if (activePin != null) { + if (activePin.nextSibling != null) { + chrome.tabs.update(parseInt(activePin.nextSibling.id), { active: true }); } else { - if ($(".pin.active_tab").prev(".pin")[0]) { - chrome.tabs.update(parseInt($(".pin.active_tab").prev(".pin")[0].id), { active: true }); + if (activePin.previousSibling != null && allow_reverse) { + chrome.tabs.update(parseInt(activePin.previousSibling.id), { active: true }); } } } - if ($("#"+active_group+" .tab.active_tab")[0] && $("#"+active_group+" .tab").length > 1) { - if ($("#"+active_group+" .tab.active_tab").children().last().children(".tab")[0]) { - chrome.tabs.update(parseInt($("#"+active_group+" .tab.active_tab").children().last().children(".tab")[0].id), { active: true }); + let activeTab = document.querySelector("#"+active_group+" .tab.active_tab"); + if (activeTab != null && document.querySelectorAll("#"+active_group+" .tab").length > 1) { + let FirstChild = activeTab.lastChild.firstChild; + if (FirstChild != null) { + chrome.tabs.update(parseInt(FirstChild.id), { active: true }); } else { - if ($("#"+active_group+" .tab.active_tab").next(".tab")[0]) { - chrome.tabs.update(parseInt($("#"+active_group+" .tab.active_tab").next(".tab")[0].id), { active: true }); + if (activeTab.nextSibling != null) { + chrome.tabs.update(parseInt(activeTab.nextSibling.id), { active: true }); } else { - if ($("#"+active_group+" .tab.active_tab").parent().parent().next("#"+active_group+" .tab")[0]) { - chrome.tabs.update(parseInt($("#"+active_group+" .tab.active_tab").parent().parent().next(".tab")[0].id), { active: true }); + let Next = null; + while (Next == null && activeTab.parentNode != null && activeTab.parentNode.parentNode != null) { + if (activeTab.parentNode.parentNode.classList != undefined && activeTab.parentNode.parentNode.classList.contains("tab") && activeTab.parentNode.parentNode.nextSibling != null && activeTab.parentNode.parentNode.nextSibling.classList.contains("tab")) { + Next = activeTab.parentNode.parentNode.nextSibling; + } + activeTab = activeTab.parentNode.parentNode; + } + if (Next != null) { + chrome.tabs.update(parseInt(Next.id), { active: true }); } else { - if ($("#"+active_group+" .tab.active_tab").parents(".tab").last().next(".tab")[0]) { - chrome.tabs.update(parseInt($("#"+active_group+" .tab.active_tab").parents(".tab").last().next(".tab")[0].id), { active: true }); + if (allow_reverse) { + ActivatePrevTab(); } } } } } } -function ActivatePrevTab() { - log("function: ActivatePrevTab"); - if ($(".pin.active_tab")[0]) { - log("active_tab is pin"); - if ($(".pin.active_tab").prev(".pin")[0]) { - chrome.tabs.update(parseInt($(".pin.active_tab").prev(".pin")[0].id), { active: true }); + +function ActivatePrevTab(allow_reverse) { + let activePin = document.querySelector(".pin.active_tab"); + if (activePin != null) { + if (activePin.previousSibling != null) { + chrome.tabs.update(parseInt(activePin.previousSibling.id), { active: true }); } else { - if ($(".pin.active_tab").next(".pin")[0]) { - chrome.tabs.update(parseInt($(".pin.active_tab").next(".pin")[0].id), { active: true }); + if (activePin.nextSibling != null && allow_reverse) { + chrome.tabs.update(parseInt(activePin.nextSibling.id), { active: true }); } } } - if ($("#"+active_group+" .tab.active_tab")[0] && $("#"+active_group+" .tab").length > 1) { - if ($("#"+active_group+" .tab.active_tab").prev().find(".tab").length > 0) { - chrome.tabs.update(parseInt($("#"+active_group+" .tab.active_tab").prev().find(".tab").last()[0].id), { active: true }); + let activeTab = document.querySelector("#"+active_group+" .tab.active_tab"); + if (activeTab != null && document.querySelectorAll("#"+active_group+" .tab").length > 1) { + let pSchildren = activeTab.previousSibling != null ? document.querySelectorAll("#ct"+activeTab.previousSibling.id+" .tab") : null; + if (activeTab.previousSibling != null && pSchildren.length > 0) { + chrome.tabs.update(parseInt(pSchildren[pSchildren.length-1].id), { active: true }); } else { - if ($("#"+active_group+" .tab.active_tab").prev(".tab")[0]) { - chrome.tabs.update(parseInt($("#"+active_group+" .tab.active_tab").prev(".tab")[0].id), { active: true }); + if (activeTab.previousSibling != null) { + chrome.tabs.update(parseInt(activeTab.previousSibling.id), { active: true }); } else { - if ($("#"+active_group+" .tab.tab.active_tab").parent().is(".children") && $("#"+active_group+" .tab.active_tab").parent().parent(".tab")[0]) { - chrome.tabs.update(parseInt($("#"+active_group+" .tab.active_tab").parent().parent(".tab")[0].id), { active: true }); + if (activeTab.parentNode.parentNode.classList.contains("tab")) { + chrome.tabs.update(parseInt(activeTab.parentNode.parentNode.id), { active: true }); + } else { + if (allow_reverse) { + ActivateNextTab(); + } } } } } } -// ********** TABS EVENTS *************** -function SetTabEvents() { - $(document).on("dblclick", ".group, #pin_list, .tab", function(event) { // double click to create tab - if (event.button == 0 && $(event.target).is(this)) { - if (event.target.id == "pin_list") { - chrome.tabs.create({ pinned: true }); + +function DeselectTabs() { + document.querySelectorAll(".pin.selected_tab, #"+active_group+" .selected_tab").forEach(function(s){ + s.classList.remove("selected_tab"); + s.classList.remove("selected_last"); + }); +} + +function HighlightNode(Node) { + document.querySelectorAll(".highlighted_drop_target").forEach(function(s){ + s.classList.remove("highlighted_drop_target"); + }); + Node.classList.add("highlighted_drop_target"); +} + +function HighlightDragEnter(Node, addDepth, Class) { // Class == "tab" or "folder" + // PIN,TAB==>TAB OR PIN,TAB==>FOLDER + // AND AVOID ENTERING INSIDE OWN CHILDREN + if (Node.classList.contains("highlighted_drop_target") == false && Node.parentNode.classList.contains("dragged_tree") == false && Node.parentNode.classList.contains("dragged_selected") == false) { + if (opt.max_tree_depth >= 0 && DragAndDrop.Depth >= 0 && DragAndDrop.DragNodeClass == Class) { + let Parents = GetParentsByClass(Node, Class); + if ((Parents.length + DragAndDrop.Depth <= opt.max_tree_depth + addDepth) || (Node.parentNode.parentNode.parentNode.classList.contains("group") && Node.classList.contains("drag_enter_center") == false)) { + HighlightNode(Node); + } + } else { + HighlightNode(Node); + } + } +} + +function EventExpandBox(Node) { + if (Node.classList.contains("o")) { + Node.classList.remove("o"); + Node.classList.add("c"); + + if (Node.classList.contains("tab")) { + chrome.runtime.sendMessage({ command: "update_tab", tabId: parseInt(Node.id), tab: { expand: "c" } }); + } + + if (Node.classList.contains("folder")) { + SaveFolders(); + } + + } else { + if (Node.classList.contains("c")) { + if (opt.collapse_other_trees) { + let thisTreeTabs = GetParentsByClass(Node.childNodes[0], "tab"); // start from tab's first child, instead of tab, important to include clicked tab as well + let thisTreeFolders = GetParentsByClass(Node.childNodes[0], "folder"); + document.querySelectorAll("#"+active_group+" .o.tab").forEach(function(s){ + s.classList.remove("o"); + s.classList.add("c"); + chrome.runtime.sendMessage({ command: "update_tab", tabId: parseInt(s.id), tab: { expand: "c" } }); + }); + + document.querySelectorAll("#"+active_group+" .o.folder").forEach(function(s){ + s.classList.remove("o"); + s.classList.add("c"); + }); + thisTreeTabs.forEach(function(s){ + s.classList.remove("c"); + s.classList.add("o"); + chrome.runtime.sendMessage({ command: "update_tab", tabId: parseInt(s.id), tab: { expand: "o" } }); + }); + thisTreeFolders.forEach(function(s){ + s.classList.remove("c"); + s.classList.add("o"); + }); + SaveFolders(); + if (Node.classList.contains("tab")) { + ScrollToTab(Node.id); + } } else { - chrome.tabs.create({}); + Node.classList.remove("c"); + Node.classList.add("o"); + + if (Node.classList.contains("tab")) { + chrome.runtime.sendMessage({ command: "update_tab", tabId: parseInt(Node.id), tab: { expand: "o" } }); + } + + if (Node.classList.contains("folder")) { + SaveFolders(); + } + } } - }); - $(document).on("mouseenter", ".close", function(event) { - $(this).addClass("close_hover"); - }); - $(document).on("mouseleave", ".close", function(event) { - $(".close_hover").removeClass("close_hover"); - }); - $(document).on("mouseenter", ".expand", function(event) { - $(this).addClass("hover"); - }); - $(document).on("mouseleave", ".expand", function(event) { - $(".expand.hover").removeClass("hover"); - }); - $(document).on("mouseover", ".tab_header", function(event) { - $(this).addClass("tab_header_hover"); - if (opt.always_show_close == false) { - $(this).addClass("close_show"); + } +} + + +function OpenNewTab(pin, parentId) { + if (pin) { + chrome.tabs.create({pinned: true}, function(tab) { + if (parentId) { + AppendTab(tab, "pin_list", false, parentId, true, false, true, false, false, true, false); + schedule_update_data++; + } + }); + } else { + chrome.tabs.create({}, function(tab) { + if (parentId) { + AppendTab(tab, parentId, false, false, (opt.append_orphan_tab == "top" ? false : true), false, true, false, false, true, false); + schedule_update_data++; + } + }); + } +} + + +function EventSelectTab(event, TabNode) { + DeselectFolders(); + if (event.shiftKey) { // SET SELECTION WITH SHIFT + let activeTab = document.querySelector("#"+active_group+" .selected_tab.selected_last"); + if (activeTab == null) { + activeTab = document.querySelector(".pin.active_tab, #"+active_group+" .tab.active_tab"); } - }); - $(document).on("mouseleave", ".tab_header", function(event) { - $(this).removeClass("tab_header_hover"); - if (opt.always_show_close == false) { - $(this).removeClass("close_show"); - } - }); - $(document).on("mousedown", ".expand", function(event) { // EXPAND BOX - EXPAND / COLLAPSE - if (event.button == 0) { - if ($(this).parent().parent().is(".o")) { - $(this).parent().parent().removeClass("o").addClass("c"); - chrome.runtime.sendMessage({ command: "update_tab", tabId: parseInt($(this).parent().parent()[0].id), tab: { expand: "c" } }); - } else { - if ($(this).parent().parent().is(".c")) { - $(this).parent().parent().removeClass("c").addClass("o"); - chrome.runtime.sendMessage({command: "update_tab", tabId: parseInt($(this).parent().parent()[0].id), tab: { expand: "o" } }); - if (opt.close_other_trees) { - $(".o:visible:not(#"+$(this).parent().parent()[0].id+")").removeClass("o").addClass("c"); - $(this).parents(".tab").each(function() { - $(this).removeClass("n").removeClass("c").addClass("o"); - chrome.runtime.sendMessage({ command: "update_tab", tabId: parseInt(this.id), tab: { expand: "o" } }); - }); - $(".c").each(function() { - chrome.runtime.sendMessage({ command: "update_tab", tabId: parseInt(this.id), tab: { expand: "c" } }); - }); - } + if (activeTab != null && TabNode.parentNode.id == activeTab.parentNode.id) { + + if (!event.ctrlKey) { + document.querySelectorAll(".pin.selected_tab, #"+active_group+" .selected_tab").forEach(function(s){ + s.classList.remove("selected_frozen"); + s.classList.remove("selected_temporarly"); + s.classList.remove("selected_tab"); + s.classList.remove("selected_last"); + }); + } + let ChildrenArray = Array.from(TabNode.parentNode.children); + let activeTabIndex = ChildrenArray.indexOf(activeTab); + let thisTabIndex = ChildrenArray.indexOf(TabNode); + let fromIndex = thisTabIndex >= activeTabIndex ? activeTabIndex : thisTabIndex; + let toIndex = thisTabIndex >= activeTabIndex ? thisTabIndex : activeTabIndex; + for (let i = fromIndex; i <= toIndex; i++) { + activeTab.parentNode.childNodes[i].classList.add("selected_tab"); + if (i == toIndex && event.ctrlKey) { + activeTab.parentNode.childNodes[i].classList.add("selected_last"); } } } - }); - $(document).on("mousedown", ".tab, .pin", function(event) { // SELECT TAB/PIN - if ($(".menu").is(":visible")) { - return; + } + if (event.ctrlKey && !event.shiftKey) { // TOGGLE SELECTION WITH CTRL + TabNode.classList.toggle("selected_tab"); + if (TabNode.classList.contains("selected_tab")) { + document.querySelectorAll(".selected_last").forEach(function(s){ + s.classList.remove("selected_last"); + }); + TabNode.classList.add("selected_last"); + } else { + TabNode.classList.remove("selected_last"); } - event.stopPropagation(); - if (event.button == 0) { - $("#"+active_group+" .folder").removeClass("selected_folder"); - let tabId = parseInt(this.id); - if (event.shiftKey) { // SET SELECTION WITH SHIFT - $(".pin, .tab:visible").removeClass("selected_tab").removeClass("selected_frozen").removeClass("selected_temporarly"); - if ($(this).index() >= $(".active_tab:visible").index()) { - $(".active_tab:visible").nextUntil($(this), ":visible").add($(".active_tab:visible")).add($(this)).addClass("selected_tab"); - } else { - $(".active_tab:visible").prevUntil($(this), ":visible").add($(".active_tab:visible")).add($(this)).addClass("selected_tab"); - } - } - if (event.ctrlKey) { // TOGGLE SELECTION WITH CTRL - // if ($(".active_tab:visible").is(":not(.selected_tab)")) { - // $(".active_tab:visible").addClass("selected_tab"); - // } - $(this).toggleClass("selected_tab"); - } + } +} + +function ActionClickTab(TabNode, bgOption) { + if (bgOption == "new_tab") { + OpenNewTab(TabNode.classList.contains("pin"), TabNode.id); + } + if (bgOption == "expand_collapse") { + EventExpandBox(TabNode); + } + if (bgOption == "close_tab") { + if ((TabNode.classList.contains("pin") && opt.allow_pin_close) || TabNode.classList.contains("tab")) { + CloseTabs([parseInt(TabNode.id)]); } - }); - $(document).on("mousedown", ".tab_header", function(event) { // CLOSE TAB/PIN - let tabId = parseInt($(this).parent()[0].id); - if ((event.button == 1 && opt.close_with_MMB == true && $(this).parent().is(".tab")) || (event.button == 1 && opt.close_with_MMB == true && $(this).parent().is(".pin") && opt.allow_pin_close == true) || (event.button == 0 && $(event.target).is(".close, .close_img"))) { - if ($(this).parent().is(".active_tab:visible") && opt.after_closing_active_tab != "browser") { - ActionBeforeTabsClose(); - } // hide pin before it will be closed by listener - $(".pin#"+tabId).css({ "width": "0px", "height": "0px", "border": "none", "overflow": "hidden" }); - chrome.tabs.update(tabId, {pinned: false}); - setTimeout(function() { - if ($("#"+tabId)[0]) { - chrome.tabs.remove(tabId); - } - }, 100); - } - if (event.button == 2) { - event.stopPropagation(); - ShowTabMenu($(this).parent(), event); - } - }); - $(document).on("click", ".tab_header", function(event) { // SINGLE CLICK TO ACTIVATE TAB - if ($(".menu").is(":visible") || ($(this).parent().is(".c, .o") && $(event.target).is(".expand")) || $(event.target).is(".close, .close_img, .tab_mediaicon")) { - return; - } - event.stopPropagation(); - if (event.button == 0 && !event.shiftKey && !event.ctrlKey) { - SetActiveTab($(this).parent()[0].id); - chrome.tabs.update(parseInt($(this).parent()[0].id), { active: true }); - } - }); -} \ No newline at end of file + } + if (bgOption == "reload_tab") { + chrome.tabs.reload(parseInt(TabNode.id)); + } + if (bgOption == "unload_tab") { + SwitchActiveTabBeforeClose(active_group); + DiscardTabs([parseInt(TabNode.id)]); + } + if (bgOption == "activate_previous_active" && TabNode.classList.contains("active_tab")) { + chrome.tabs.update(parseInt(bggroups[active_group].prev_active_tab), {active: true}); + } +} diff --git a/scripts/toolbar.js b/scripts/toolbar.js index 132f90f..0581af2 100644 --- a/scripts/toolbar.js +++ b/scripts/toolbar.js @@ -4,366 +4,572 @@ // ********** TOOLBAR *************** +// RESTORE LAST USED SEARCH TYPE (URL OR TITLE) IN TOOLBAR SEARCH function RestoreToolbarSearchFilter() { chrome.runtime.sendMessage({command: "get_search_filter", windowId: CurrentWindowId}, function(response) { + let ButtonFilter = document.getElementById("button_filter_type"); if (response == "url") { - $("#button_filter_type").addClass("url").removeClass("title"); + ButtonFilter.classList.add("url"); + ButtonFilter.classList.remove("title"); } else { - $("#button_filter_type").addClass("title").removeClass("url"); + ButtonFilter.classList.add("title"); + ButtonFilter.classList.remove("url"); } }); } +// RESTORE LAST ACTIVE SHELF (SEARCH, TOOLS, GROUPS, SESSION OR FOLDER) IN TOOLBAR function RestoreToolbarShelf() { chrome.runtime.sendMessage({command: "get_active_shelf", windowId: CurrentWindowId}, function(response) { - $("#filter_box").attr("placeholder", caption_searchbox); - $("#filter_box").css({"opacity": 1}); - $(".on").removeClass("on"); - $(".toolbar_shelf").addClass("hidden"); - if (response == "search" && $("#button_search").length != 0) { - $("#toolbar_search").removeClass("hidden"); - $("#button_search").addClass("on"); + let filterBox = document.getElementById("filter_box"); + filterBox.setAttribute("placeholder", caption_searchbox); + filterBox.style.opacity = "1"; + + document.querySelectorAll(".on").forEach(function(s){ + s.classList.remove("on"); + }); + document.querySelectorAll(".toolbar_shelf").forEach(function(s){ + s.classList.add("hidden"); + }); + + if (response == "search" && document.getElementById("button_search") != null) { + document.getElementById("toolbar_search").classList.remove("hidden"); + document.getElementById("button_search").classList.add("on"); } - if (response == "tools" && $("#button_tools").length != 0) { - $("#toolbar_shelf_tools").removeClass("hidden"); - $("#button_tools").addClass("on"); + + if (response == "tools" && document.getElementById("button_tools") != null) { + document.getElementById("toolbar_shelf_tools").classList.remove("hidden"); + document.getElementById("button_tools").classList.add("on"); } - if (response == "groups" && $("#button_groups").length != 0) { - $("#toolbar_shelf_groups").removeClass("hidden"); - $("#button_groups").addClass("on"); + + if (response == "groups" && document.getElementById("button_groups") != null) { + document.getElementById("toolbar_shelf_groups").classList.remove("hidden"); + document.getElementById("button_groups").classList.add("on"); } - if (response == "backup" && $("#button_backup").length != 0) { - $("#toolbar_shelf_backup").removeClass("hidden"); - $("#button_backup").addClass("on"); + + if (response == "backup" && document.getElementById("button_backup") != null) { + document.getElementById("toolbar_shelf_backup").classList.remove("hidden"); + document.getElementById("button_backup").classList.add("on"); } - if (response == "folders" && $("#button_folders").length != 0) { - $("#toolbar_shelf_folders").removeClass("hidden"); - $("#button_folders").addClass("on"); + + if (response == "folders" && document.getElementById("button_folders") != null) { + document.getElementById("toolbar_shelf_folders").classList.remove("hidden"); + document.getElementById("button_folders").classList.add("on"); } if (browserId != "F") { - let bak1 = LoadData("windows_BAK1", []); - let bak2 = LoadData("windows_BAK2", []); - let bak3 = LoadData("windows_BAK3", []); - - if (bak1.length && $(".button#button_load_bak1")[0]) { - $(".button#button_load_bak1").removeClass("disabled"); - } else { - $(".button#button_load_bak1").addClass("disabled"); - } - - if (bak2.length && $(".button#button_load_bak2")[0]) { - $(".button#button_load_bak2").removeClass("disabled"); - } else { - $(".button#button_load_bak2").addClass("disabled"); - } - - if (bak3.length && $(".button#button_load_bak3")[0]) { - $(".button#button_load_bak3").removeClass("disabled"); - } else { - $(".button#button_load_bak3").addClass("disabled"); - } + chrome.storage.local.get(null, function(storage) { + let bak1 = storage["windows_BAK1"] ? storage["windows_BAK1"] : []; + let bak2 = storage["windows_BAK2"] ? storage["windows_BAK2"] : []; + let bak3 = storage["windows_BAK3"] ? storage["windows_BAK3"] : []; + + if (bak1.length && document.getElementById("#button_load_bak1") != null) { + document.getElementById("button_load_bak1").classList.remove("disabled"); + } else { + document.getElementById("button_load_bak1").classList.add("disabled"); + } + + if (bak2.length && document.getElementById("#button_load_bak2") != null) { + document.getElementById("button_load_bak2").classList.remove("disabled"); + } else { + document.getElementById("button_load_bak2").classList.add("disabled"); + } + + if (bak3.length && document.getElementById("#button_load_bak3") != null) { + document.getElementById("button_load_bak3").classList.remove("disabled"); + } else { + document.getElementById("button_load_bak3").classList.add("disabled"); + } + + }); } RefreshGUI(); }); } -function SetToolbarShelfToggle(click_type) { - // tools and search buttons toggle - $(document).on(click_type, "#button_tools, #button_search, #button_groups, #button_backup, #button_folders", function(event) { - if (event.button == 0) { - if ($(this).is(".on")) { - $(".on").removeClass("on"); - $(".toolbar_shelf").addClass("hidden"); - chrome.runtime.sendMessage({command: "set_active_shelf", active_shelf: "", windowId: CurrentWindowId}); - } else { - $(".toolbar_shelf").addClass("hidden"); - if ($(this).is("#button_tools")) { - $("#toolbar_shelf_tools").removeClass("hidden"); - chrome.runtime.sendMessage({command: "set_active_shelf", active_shelf: "tools", windowId: CurrentWindowId}); - } - if ($(this).is("#button_search")) { - $("#toolbar_search").removeClass("hidden"); - chrome.runtime.sendMessage({command: "set_active_shelf", active_shelf: "search", windowId: CurrentWindowId}); - } - if ($(this).is("#button_groups")) { - $("#toolbar_shelf_groups").removeClass("hidden"); - chrome.runtime.sendMessage({command: "set_active_shelf", active_shelf: "groups", windowId: CurrentWindowId}); - } - if ($(this).is("#button_backup")) { - $("#toolbar_shelf_backup").removeClass("hidden"); - chrome.runtime.sendMessage({command: "set_active_shelf", active_shelf: "backup", windowId: CurrentWindowId}); - } - if ($(this).is("#button_folders")) { - $("#toolbar_shelf_folders").removeClass("hidden"); - chrome.runtime.sendMessage({command: "set_active_shelf", active_shelf: "folders", windowId: CurrentWindowId}); - } - $(".button").removeClass("on"); - $(this).addClass("on"); - } - RefreshGUI(); +// FUNCTION TO TOGGLE SHELFS AND SAVE IT +function ShelfToggle(mousebutton, button, toolbarId, SendMessage) { + if (mousebutton == 1) { + if (button.classList.contains("on")) { + document.querySelectorAll(".on").forEach(function(s){ + s.classList.remove("on"); + }); + document.querySelectorAll(".toolbar_shelf").forEach(function(s){ + s.classList.add("hidden"); + }); + } else { + document.querySelectorAll(".toolbar_shelf:not(#"+toolbarId+")").forEach(function(s){ + s.classList.add("hidden"); + }); + document.getElementById(toolbarId).classList.remove("hidden"); + chrome.runtime.sendMessage({command: "set_active_shelf", active_shelf: SendMessage, windowId: CurrentWindowId}); + document.querySelectorAll(".on:not(#"+button.id+")").forEach(function(s){ + s.classList.remove("on"); + }); + button.classList.add("on"); } - }); + RefreshGUI(); + } } +// ASSIGN MOUSE EVENTS FOR TOOLBAR BUTTONS, Buttons AND ToolbarShelfToggle, PARAMETERS DECIDE IF BUTTONS ARE CLICKABLE +// IN OPTIONS PAGE - TOOLBAR BUTTONS SAMPLES, MUST NOT CALL FUNCTIONS ON CLICKS, BUT STILL SHELFS BUTTONS MUST TOGGLE AND MOREOVER ON CLICK AND NOT ON MOUSEDOWN THIS IS WHERE ToolbarShelfToggleClickType="Click" IS NECESSARY +function SetToolbarEvents(CleanPreviousBindings, Buttons, ToolbarShelfToggle, ToolbarShelfToggleClickType) { -function SetToolbarEvents() { - // go to previous or next search result - $(document).on("mousedown", "#filter_search_go_prev, #filter_search_go_next", function(event) { - if (event.button != 0 || $(".tab.filtered").length == 0) { - return; - } - - $(".highlighted_search").removeClass("highlighted_search"); - if ($(this).is("#filter_search_go_prev")){ - if (SearchIndex == 0) { - SearchIndex = $(".tab.filtered").length-1; - } else { - SearchIndex--; + let ClearSearch = document.getElementById("button_filter_clear"); + let FilterBox = document.getElementById("filter_box"); + + if (ClearSearch != null && FilterBox != null) { + if (CleanPreviousBindings) { + FilterBox.removeEventListener("oninput", function(){}); + ClearSearch.removeEventListener("onmousedown", function(){}); + } + if (Buttons) { + // FILTER ON INPUT + FilterBox.oninput = function(event) { + FindTab(this.value); } - } else { - if (SearchIndex == $(".tab.filtered").length-1) { - SearchIndex = 0; - } else { - SearchIndex++; - } - } - ScrollToTab($(".tab.filtered")[SearchIndex].id); - $($(".tab.filtered")[SearchIndex]).addClass("highlighted_search"); - }); - // new tab - $(document).on("mousedown", "#button_new", function(event) { - if (event.button == 1 && $(".active_tab:visible")[0]) { - chrome.tabs.duplicate(parseInt($(".active_tab:visible")[0].id), function(tab) { - setTimeout(function() { - $("#"+tab.id).insertAfter($(".active_tab:visible")[0]); - RefreshExpandStates(); - schedule_update_data++; - RefreshCounters(); - }, 100); - }); - } - if (event.button == 2 && $("#"+active_group+" .active_tab")[0]) { - ScrollToTab($("#"+active_group+" .active_tab")[0].id); - } - }); - $(document).on("click", "#button_new", function(event) { - if (event.button == 0) { - chrome.tabs.create({}); - } - }); - // pin tab - $(document).on("mousedown", "#button_pin", function(event) { - if (event.button == 0) { - $(".active_tab:visible, .selected_tab:visible").each(function() { - chrome.tabs.update(parseInt(this.id), { pinned: ($(this).is(".pin") ? false : true) }); - }); - } - }); - // undo close - $(document).on("mousedown", "#button_undo", function(event) { - if (event.button == 0) { - chrome.sessions.getRecentlyClosed( null, function(sessions) { - if (sessions.length > 0) { - chrome.sessions.restore(null, function(restored) { - // if (browserId == "F") { - // if (restored.tab != undefined) { - // let t = Promise.resolve(browser.sessions.getTabValue(restored.tab.id, "TTId")).then(function(TTId) { - // TODO RESTORE TREE IF POSSIBLE - // console.log(TTId); - // }); - // } - // } - }); + // CLEAR FILTER BUTTON + ClearSearch.onmousedown = function(event) { + if (event.which == 1) { + this.style.opacity = "0"; + this.style.opacity = "0"; + this.setAttribute("title", ""); + FindTab(""); } - }); - } - }); - // move tab to new window (detach) - $(document).on("mousedown", "#button_move", function(event) { - if (event.button == 0) { - if ($("#"+active_group+" .selected_tab")[0]){ - let detach = GetSelectedTabs(); - DetachTabs(detach.TabsIds, {}); - } else { - if ($("#"+active_group+" .selected_folder")[0]){ - let detach = GetSelectedFolders(); - DetachTabs(detach.TabsIds, detach.Folders); - } } } - }); - // move tab to new window (detach) - $(document).on("mousedown", "#repeat_search", function(event) { - if (event.button == 0) { - FindTab($("#filter_box")[0].value); - } - }); - // filter on input - $("#filter_box").on("input", function() { - FindTab($("#filter_box")[0].value); - }); - // change filtering type - $(document).on("mousedown", "#button_filter_type", function(event) { - if (event.button == 0) { - if ($("#button_filter_type").is(".url")) { - $("#button_filter_type").removeClass("url").addClass("title"); - } else { - $("#button_filter_type").addClass("url").removeClass("title"); - } - FindTab($("#filter_box")[0].value); - chrome.runtime.sendMessage({command: "set_search_filter", search_filter: ($(this).is(".url") ? "url" : "title"), windowId: CurrentWindowId}); - } - }); - // clear filter button - $(document).on("mousedown", "#button_filter_clear", function(event) { - if (event.button == 0) { - $("#button_filter_clear").css({"opacity": "0"}).attr("title", ""); - FindTab(""); - } - }); - // sort tabs - // $(document).on("mousedown", "#button_sort", function(event) { - // if (event.button == 0) { - // SortTabs(); - // } - // }); - // vertical tabs options - $(document).on("mousedown", "#button_options", function(event) { - if (event.button == 0) { - chrome.tabs.create({url: "options.html" }); - } - }); - // new group - $(document).on("mousedown", "#button_new_group", function(event) { - if (event.button == 0) { - AddNewGroup({}); - } - }); - // remove group - $(document).on("mousedown", "#button_remove_group", function(event) { - let close_tabs = event.shiftKey; - if (event.button == 0) { - if (active_group != "tab_list") { - GroupRemove(active_group, close_tabs); - } - } - }); - // edit group - $(document).on("mousedown", "#button_edit_group", function(event) { - if (event.button == 0 && active_group != "tab_list") { - menuItemId = active_group; - ShowGroupEditWindow(); - } - }); - // import-export group - $(document).on("mousedown", "#button_export_group", function(event) { - if (event.button == 0) { - ExportGroup(bggroups[active_group].name+".tt_group"); - } - }); - $(document).on("mousedown", "#button_import_group", function(event) { - if (event.button == 0) { - ShowOpenFileDialog("file_import_group", ".tt_group"); - } - }); - $(document).on("change", "#file_import_group", function(event) { - ImportGroup(); - }); - - - // new folder - $(document).on("mousedown", "#button_new_folder", function(event) { - if (event.button == 0) { - AddNewFolder({}); - } - }); - // rename folder - $(document).on("mousedown", "#button_edit_folder", function(event) { - if (event.button == 0 && $(".selected_folder:visible")[0]) { - ShowRenameFolderDialog($(".selected_folder:visible")[0].id); - } - }); - // remove folder - $(document).on("mousedown", "#button_remove_folder", function(event) { - // let close_tabs = event.shiftKey; - if (event.button == 0 && $(".selected_folder:visible")[0]) { - $("#"+active_group+" .selected_folder").each(function() { - RemoveFolder(this.id); - }); - // RemoveFolder($(".selected_folder:visible")[0].id); - } - }); - // discard tabs - $(document).on("mousedown", "#button_discard", function(event) { - if (event.button == 0) { - DiscardTabs($(".selected_tab")[0] ? ($(".selected_tab").map(function() { return parseInt(this.id); }).toArray()) : ($(".pin, .tab").map(function() { return parseInt(this.id); }).toArray()) ); - } - }); - - if (browserId != "F") { - // bookmarks - $(document).on("mousedown", "#button_bookmarks", function(event) { - if (event.button == 0) { - chrome.tabs.create({url: "chrome://bookmarks/"}); - } - }); - // downloads - $(document).on("mousedown", "#button_downloads", function(event) { - if (event.button == 0) { - chrome.tabs.create({url: "chrome://downloads/"}); - } - }); - // history - $(document).on("mousedown", "#button_history", function(event) { - if (event.button == 0) { - chrome.tabs.create({url: "chrome://history/"}); - } - }); - // extensions - $(document).on("mousedown", "#button_extensions", function(event) { - if (event.button == 0) { - chrome.tabs.create({url: "chrome://extensions"}); - } - }); - // settings - $(document).on("mousedown", "#button_settings", function(event) { - if (event.button == 0) { - chrome.tabs.create({url: "chrome://settings/"}); - } - }); - // load backups - $(document).on("mousedown", "#button_load_bak1:not(.disabled), #button_load_bak2:not(.disabled), #button_load_bak3:not(.disabled)", function(event) { - if (event.button == 0) { - let BakN = (this.id).substr(15); - chrome.storage.local.get(null, function(items) { - if (Object.keys(items["windows_BAK"+BakN]).length > 0) { chrome.storage.local.set({"windows": items["windows_BAK"+BakN]}); } - if (Object.keys(items["tabs_BAK"+BakN]).length > 0) { chrome.storage.local.set({"tabs": items["tabs_BAK"+BakN]}); alert("Loaded backup"); } - chrome.runtime.sendMessage({command: "reload"}); chrome.runtime.sendMessage({command: "reload_sidebar"}); location.reload(); - }); - } - }); } - // import-export backups - $(document).on("mousedown", "#button_export_bak", function(event) { - ExportSession("Session.tt_session"); - }); + document.querySelectorAll(".button").forEach(function(s){ + + if (CleanPreviousBindings) { + s.removeEventListener("onmousedown", function(){}); + s.removeEventListener("onclick", function(){}); + s.removeEventListener("click", function(){}); + } + + if (ToolbarShelfToggle) { + if (s.id == "button_search") { + s.addEventListener(ToolbarShelfToggleClickType, function(event) { + if (event.which == 1) { + ShelfToggle(event.which, this, "toolbar_search", "search"); + } + }); + } + if (s.id == "button_tools") { + s.addEventListener(ToolbarShelfToggleClickType, function(event) { + if (event.which == 1) { + ShelfToggle(event.which, this, "toolbar_shelf_tools", "tools"); + } + }); + } + if (s.id == "button_groups") { + s.addEventListener(ToolbarShelfToggleClickType, function(event) { + if (event.which == 1) { + ShelfToggle(event.which, this, "toolbar_shelf_groups", "groups"); + } + }); + } + if (s.id == "button_backup") { + s.addEventListener(ToolbarShelfToggleClickType, function(event) { + if (event.which == 1) { + ShelfToggle(event.which, this, "toolbar_shelf_backup", "backup"); + } + }); + } + if (s.id == "button_folders") { + s.addEventListener(ToolbarShelfToggleClickType, function(event) { + if (event.which == 1) { + ShelfToggle(event.which, this, "toolbar_shelf_folders", "folders"); + } + }); + } + } + + if (Buttons) { + // NEW TAB + if (s.id == "button_new") { + s.onclick = function(event) { + if (event.which == 1) { + OpenNewTab(); + } + } + s.onmousedown = function(event) { + // DUPLICATE TAB + if (event.which == 2) { + event.preventDefault(); + let activeTab = document.querySelector("#"+active_group+" .active_tab") != null ? document.querySelector("#"+active_group+" .active_tab") : document.querySelector(".pin.active_tab") != null ? document.querySelector(".pin.active_tab") : null; + if (activeTab != null) { + chrome.tabs.duplicate(parseInt(activeTab.id), function(tab) { + setTimeout(function() { + if (activeTab.nextSibling != null) { + activeTab.parentNode.insertBefore(document.getElementById(tab.id), activeTab.nextSibling); + } else { + activeTab.parentNode.appendChild(document.getElementById(tab.id)); + } + RefreshExpandStates(); + schedule_update_data++; + RefreshCounters(); + }, 300); + }); + } + } + // SCROLL TO TAB + if (event.which == 3) { + let activeTab = document.querySelector("#"+active_group+" .active_tab") != null ? document.querySelector("#"+active_group+" .active_tab") : document.querySelector(".pin.active_tab") != null ? document.querySelector(".pin.active_tab") : null; + if (activeTab != null) { + ScrollToTab(activeTab.id); + } + } + } + } + // PIN TAB + if (s.id == "button_pin") { + s.onmousedown = function(event) { + if (event.which == 1) { + let Tabs = document.querySelectorAll(".pin.active_tab, .pin.selected_tab, #"+active_group+" .active_tab, #"+active_group+" .selected_tab"); + Tabs.forEach(function(s){ + chrome.tabs.update(parseInt(s.id), { pinned: Tabs[0].classList.contains("tab") }); + }) + } + } + } + // VERTICAL TABS OPTIONS + if (s.id == "button_options") { + s.onmousedown = function(event) { + if (event.which == 1) { + chrome.tabs.create({url: "options.html"}); + } + } + } + + // UNDO CLOSE + if (s.id == "button_undo") { + s.onmousedown = function(event) { + if (event.which == 1) { + chrome.sessions.getRecentlyClosed( null, function(sessions) { + if (sessions.length > 0) { + chrome.sessions.restore(null, function(restored) {}); + } + }); + } + } + } + + // MOVE TAB TO NEW WINDOW (DETACH) + if (s.id == "button_detach" || s.id == "button_move") { + s.onmousedown = function(event) { + if (event.which == 1) { + if (document.querySelectorAll("#"+active_group+" .selected_folder").length > 0){ + let detach = GetSelectedFolders(); + Detach(detach.TabsIds, detach.Folders); + } else { + let tabsArr = []; + document.querySelectorAll(".pin.selected_tab, .pin.active_tab, #"+active_group+" .selected_tab, #"+active_group+" .active_tab").forEach(function(s){ + tabsArr.push(parseInt(s.id)); + if (s.childNodes[4].childNodes.length > 0) { + document.querySelectorAll("#"+s.childNodes[4].id+" .tab").forEach(function(t){ + tabsArr.push(parseInt(t.id)); + }); + } + }); + Detach(tabsArr); + } + } + } + } + + // SHOW/HIDE GROUPS TOOLBAR + if (s.id == "button_groups_toolbar_hide") { + s.onmousedown = function(event) { + if (event.which == 1) { + GroupsToolbarToggle(); + } + } + } + + // GO TO PREVIOUS SEARCH RESULT + if (s.id == "filter_search_go_prev") { + s.onmousedown = function(event) { + if (event.which == 1) { + let filtered = document.querySelectorAll("#"+active_group+" .tab.filtered"); + if (filtered.length > 0) { + document.querySelectorAll(".highlighted_search").forEach(function(s){ + s.classList.remove("highlighted_search"); + }); + if (SearchIndex == 0) { + SearchIndex = filtered.length-1; + } else { + SearchIndex--; + } + filtered[SearchIndex].classList.add("highlighted_search"); + ScrollToTab(filtered[SearchIndex].id); + } + } + } + } - $(document).on("mousedown", "#button_import_bak", function(event) { - ShowOpenFileDialog("file_import_backup", ".tt_session"); - }); - $(document).on("change", "#file_import_backup", function(event) { - ImportSession(); - }); + // GO TO NEXT SEARCH RESULT + if (s.id == "filter_search_go_next") { + s.onmousedown = function(event) { + if (event.which == 1) { + let filtered = document.querySelectorAll("#"+active_group+" .tab.filtered"); + if (filtered.length > 0) { + document.querySelectorAll(".highlighted_search").forEach(function(s){ + s.classList.remove("highlighted_search"); + }); + if (SearchIndex == filtered.length-1) { + SearchIndex = 0; + } else { + SearchIndex++; + } + filtered[SearchIndex].classList.add("highlighted_search"); + ScrollToTab(filtered[SearchIndex].id); + } + } + } + } + + // NEW GROUP + if (s.id == "button_new_group") { + s.onmousedown = function(event) { + if (event.which == 1) { + AddNewGroup(); + } + } + } + // REMOVE GROUP + if (s.id == "button_remove_group") { + s.onmousedown = function(event) { + if (event.which == 1) { + if (active_group != "tab_list") { + GroupRemove(active_group, event.shiftKey); + } + } + } + } + + + + // EDIT GROUP + if (s.id == "button_edit_group") { + s.onmousedown = function(event) { + if (event.which == 1) { + if (active_group != "tab_list") { + ShowGroupEditWindow(active_group); + } + } + } + } + + // EXPORT GROUP + if (s.id == "button_export_group") { + s.onmousedown = function(event) { + if (event.which == 1) { + ExportGroup(bggroups[active_group].name+".tt_group"); + } + } + } + + // IMPORT GROUP + if (s.id == "button_import_group") { + s.onmousedown = function(event) { + if (event.which == 1) { + let inputFile = ShowOpenFileDialog("file_import_group", ".tt_group"); + inputFile.onchange = function(event) { + ImportGroup(); + // this.parentNode.removeChild(this); + } + } + } + } + + // NEW FOLDER + if (s.id == "button_new_folder") { + s.onmousedown = function(event) { + if (event.which == 1) { + AddNewFolder(); + } + } + } + + // RENAME FOLDER + if (s.id == "button_edit_folder") { + s.onmousedown = function(event) { + if (event.which == 1) { + if (document.querySelectorAll("#"+active_group+" .selected_folder").length > 0) { + ShowRenameFolderDialog(document.querySelectorAll("#"+active_group+" .selected_folder")[0].id); + } + } + } + } + // REMOVE FOLDERS + if (s.id == "button_remove_folder") { + s.onmousedown = function(event) { + if (event.which == 1) { + document.querySelectorAll("#"+active_group+" .selected_folder").forEach(function(s){ + RemoveFolder(s.id); + }); + } + } + } + // DISCARD TABS + if (s.id == "button_unload" || s.id == "button_discard") { + s.onmousedown = function(event) { + if (event.which == 1) { + if (document.querySelectorAll(".pin.selected_tab:not(.active_tab), #"+active_group+" .selected_tab:not(.active_tab)").length > 0) { + DiscardTabs( + Array.prototype.map.call(document.querySelectorAll(".pin:not(.active_tab), #"+active_group+" .selected_tab:not(.active_tab)"), function(s){ + return parseInt(s.id); + }) + ); + } else { + DiscardTabs( + Array.prototype.map.call(document.querySelectorAll(".pin:not(.active_tab), .tab:not(.active_tab)"), function(s){ + return parseInt(s.id); + }) + ); + } + } + } + } + // IMPORT BACKUP + if (s.id == "button_import_bak") { + s.onmousedown = function(event) { + if (event.which == 1) { + let inputFile = ShowOpenFileDialog("file_import_backup", ".tt_session"); + inputFile.onchange = function(event) { + ImportSession(); + // this.remove(); + } + } + } + } + // EXPORT BACKUP + if (s.id == "button_export_bak") { + s.onmousedown = function(event) { + if (event.which == 1) { + ExportSession("Session.tt_session"); + } + } + } + // MERGE BACKUP + if (s.id == "button_import_merge_bak") { + s.onmousedown = function(event) { + if (event.which == 1) { + let inputFile = ShowOpenFileDialog("file_import_merge_backup", ".tt_session"); + inputFile.onchange = function(event) { + ImportMergeTabs(); + // this.remove(); + } + } + } + } + + // CHANGE FILTERING TYPE + if (s.id == "button_filter_type") { + s.onmousedown = function(event) { + if (event.which == 1) { + if (this.classList.contains("url")) { + this.classList.remove("url"); + this.classList.add("title"); + chrome.runtime.sendMessage({command: "set_search_filter", search_filter: "title", windowId: CurrentWindowId}); + } else { + this.classList.remove("title"); + this.classList.add("url"); + chrome.runtime.sendMessage({command: "set_search_filter", search_filter: "url", windowId: CurrentWindowId}); + } + FindTab(document.getElementById("filter_box").value); + } + } + } + + // SORT TABS + // if (s.id == "button_sort") { + // s.onmousedown = function(event) { + // if (event.which == 1) { + // SortTabs(); + // } + // } + // } + // REPEAT SEARCH + // if (s.id == "repeat_search") { + // s.onmousedown = function(event) { + // if (event.which == 1) { + // FindTab(document.getElementById("filter_box").value); + // } + // } + // } + + + if (browserId != "F") { + // BOOKMARKS + if (s.id == "button_bookmarks") { + s.onmousedown = function(event) { + if (event.which == 1) { + chrome.tabs.create({url: "chrome://bookmarks/"}); + } + } + } + + // DOWNLOADS + if (s.id == "button_downloads") { + s.onmousedown = function(event) { + if (event.which == 1) { + chrome.tabs.create({url: "chrome://downloads/"}); + } + } + } + + // HISTORY + if (s.id == "button_history") { + s.onmousedown = function(event) { + if (event.which == 1) { + chrome.tabs.create({url: "chrome://history/"}); + } + } + } + + // EXTENSIONS + if (s.id == "button_extensions") { + s.onmousedown = function(event) { + if (event.which == 1) { + chrome.tabs.create({url: "chrome://extensions"}); + } + } + } + + // SETTINGS + if (s.id == "button_settings") { + s.onmousedown = function(event) { + if (event.which == 1) { + chrome.tabs.create({url: "chrome://settings/"}); + } + } + } + + // LOAD BACKUPS + if (s.id == "button_load_bak1" || s.id == "button_load_bak2" || s.id == "button_load_bak3") { + s.onmousedown = function(event) { + if (event.which == 1 && this.classList.contains("disabled") == false) { + let BakN = (this.id).substr(15); + chrome.storage.local.get(null, function(items) { + if (Object.keys(items["windows_BAK"+BakN]).length > 0) { chrome.storage.local.set({"windows": items["windows_BAK"+BakN]}); } + if (Object.keys(items["tabs_BAK"+BakN]).length > 0) { chrome.storage.local.set({"tabs": items["tabs_BAK"+BakN]}); alert("Loaded backup"); } + chrome.runtime.sendMessage({command: "reload"}); chrome.runtime.sendMessage({command: "reload_sidebar"}); location.reload(); + }); + } + } + } + + + } + + } - $(document).on("mousedown", "#button_import_merge_bak", function(event) { - ShowOpenFileDialog("file_import_merge_backup", ".tt_session"); - }); - $(document).on("change", "#file_import_merge_backup", function(event) { - ImportMergeTabs(); }); } \ No newline at end of file diff --git a/scripts/utils.js b/scripts/utils.js index b2ccb3e..7a1b2e8 100644 --- a/scripts/utils.js +++ b/scripts/utils.js @@ -3,112 +3,282 @@ // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ -// sort tabs main function -function SortTabs(){ - if ($(".tab").find(":visible:first")[0]){ - chrome.tabs.query({windowId: vt.windowId}, function(tabs){ - tabs.sort(function(tab_a, tab_b){ - return SplitUrl(tab_a).localeCompare( SplitUrl(tab_b) ); - }); - var first_tabId; - if ($(".selected:visible")[0]){ - first_tabId = parseInt($(".selected:visible")[0].id); - } else { - first_tabId = parseInt($(".tab").find(":visible:first")[0].parentNode.id); - } - chrome.tabs.get(first_tabId, function(tab){ - var new_index = tab.index; - tabs.forEach(function(Tab){ - // sort selected when more than 1 tab is selected - if (($(".selected:visible").length > 1 && $("#"+Tab.id).is(":visible") && !Tab.pinned && $("#"+Tab.id).is(".selected")) || ($(".selected:visible").length < 2 && $("#"+Tab.id).is(":visible") && !Tab.pinned)){ - chrome.tabs.move(Tab.id, {"index": new_index}); - new_index++; - } - }); - }); - if (bg.opt.scroll_to_active){ - setTimeout(function(){ - ScrollTabList($(".active:visible")[0].id); - },1000); - } - }); +function HideRenameDialogs() { + document.querySelectorAll(".edit_dialog").forEach(function(s){ + s.style.display = "none"; + s.style.top = "-500px"; + s.style.left = "-500px"; + }); +} +function GetParentsByClass(Node, Class) { + let Parents = []; + let ParentNode = Node; + while (ParentNode.parentNode != null) { + if (ParentNode.parentNode.classList != undefined && ParentNode.parentNode.classList.contains(Class)) { + Parents.push(ParentNode.parentNode); + } + ParentNode = ParentNode.parentNode; } + return Parents; +} +function GetParentsBy2Classes(Node, ClassA, ClassB) { + let Parents = []; + let ParentNode = Node; + while (ParentNode.parentNode != null) { + if (ParentNode.parentNode.classList != undefined && ParentNode.parentNode.classList.contains(ClassA) && ParentNode.parentNode.classList.contains(ClassB)) { + Parents.push(ParentNode.parentNode); + } + ParentNode = ParentNode.parentNode; + } + return Parents; } -// sort tabs sub function -function SplitUrl(tab){ - var tmp_url = new URL(tab.url); - if (tmp_url.protocol != "http:"){ - tmp_url.protocol == "http:"; - } - var url_parts = []; - if (tab.pinned){ - url_parts.push("#"+tab.index); + +function GetSelectedFolders() { + if (opt.debug) console.log("function: GetSelectedFolders"); + let res = {Folders: {}, FoldersSelected: [], TabsIds: [], TabsIdsParents: []}; + document.querySelectorAll("#"+active_group+" .selected_folder").forEach(function(s){ + res.FoldersSelected.push(s.id); + res.Folders[s.id] = Object.assign({}, bgfolders[s.id]); + let Fchildren = document.querySelectorAll("#cf"+s.id+" .folder"); + Fchildren.forEach(function(fc){ + res.Folders[fc.id] = Object.assign({}, bgfolders[fc.id]); + }); + let Tchildren = document.querySelectorAll("#ct"+s.id+" .tab"); + Tchildren.forEach(function(tc){ + res.TabsIds.push(parseInt(tc.id)); + res.TabsIdsParents.push(tc.parentNode.id); + }); + }); + if (opt.debug) console.log(res); + return res; +} + +function GetSelectedTabs() { + if (opt.debug) console.log("function: GetSelectedTabs"); + // let res = {urls: [], TabsIds: [], TabsIdsParents: [], TabsIdsSelected: []}; + let res = {TabsIds: [], TabsIdsParents: [], TabsIdsSelected: []}; + document.querySelectorAll(".pin.selected_tab, #"+active_group+" .selected_tab").forEach(function(s){ + // chrome.tabs.get(parseInt(s.id), function(tab) { + // res.urls.push(tab.url); + // }); + + res.TabsIds.push(parseInt(s.id)); + res.TabsIdsParents.push(s.parentNode.id); + res.TabsIdsSelected.push(parseInt(s.id)); + let Tchildren = document.querySelectorAll("#ct"+s.id+" .tab"); + Tchildren.forEach(function(tc){ + + // chrome.tabs.get(parseInt(tc.id), function(tab) { + // res.urls.push(tab.url); + // }); + + res.TabsIds.push(parseInt(tc.id)); + res.TabsIdsParents.push(tc.parentNode.id); + }); + }); + if (opt.debug) console.log(res); + return res; +} + + + + + +function FindTab(input) { // find and select tabs + let ButtonFilterClear = document.getElementById("button_filter_clear"); + document.querySelectorAll(".filtered, .highlighted_search").forEach(function(s){ + s.classList.remove("filtered"); + s.classList.remove("selected_tab"); + s.classList.remove("selected_last"); + s.classList.remove("highlighted_search"); + }) + if (input.length == 0) { + document.getElementById("filter_box").value = ""; + ButtonFilterClear.style.opacity = "0"; + ButtonFilterClear.title = ""; + return; } else { - url_parts.push("~"); + ButtonFilterClear.style.opacity = "1"; + ButtonFilterClear.title = caption_clear_filter; } - var parts = tmp_url.host.split("."); - parts.reverse(); - if (parts.length > 1){ - parts = parts.slice(1); - } - parts.join("."); - url_parts.push(parts); - url_parts.push(tab.title.toLowerCase()); - return url_parts.join(" ! "); -} - - -// bookmark main function -function BookmarkTabs(tabs_array, FolderName){ - var rootId; - var vertical_tabs_folderId; - chrome.bookmarks.getRootByName("bookmarks_bar", function(tree){ - rootId = tree.id; - chrome.bookmarks.search("VerticalTabs", function(list){ - for (var elem in list) { - if (list[elem].parentId == rootId){ - vertical_tabs_folderId = list[elem].id; - break; + SearchIndex = 0; + let FilterType = document.getElementById("button_filter_type"); + let searchUrl = FilterType.classList.contains("url"); + let searchTitle = FilterType.classList.contains("title"); + chrome.tabs.query({windowId: CurrentWindowId, pinned: false}, function(tabs) { + tabs.forEach(function(Tab) { + if (searchUrl) { + if (Tab.url.toLowerCase().match(input.toLowerCase())) { + document.getElementById(Tab.id).classList.add("filtered"); + document.getElementById(Tab.id).classList.add("selected_tab"); } } - if (vertical_tabs_folderId == undefined){ - chrome.bookmarks.create({parentId: rootId, title: "VerticalTabs"}, function(vertical_tabs_new){ - vertical_tabs_folderId = vertical_tabs_new.id; - }); - } - chrome.bookmarks.search(FolderName, function(list){ - for (var elem in list) { - if (list[elem].parentId == vertical_tabs_folderId){ - SlowlyBookmarkTabs(tabs_array, list[elem].id); - return; - } + if (searchTitle) { + if (Tab.title.toLowerCase().match(input.toLowerCase())) { + document.getElementById(Tab.id).classList.add("filtered"); + document.getElementById(Tab.id).classList.add("selected_tab"); } - chrome.bookmarks.create({parentId: vertical_tabs_folderId, title: FolderName}, function(active_group_folderId_new){ - SlowlyBookmarkTabs(tabs_array, active_group_folderId_new.id); - }); - }); + } }); }); } +// sort tabs main function +// function SortTabs() { + // if ($(".tab").find(":visible:first")[0]){ + // chrome.tabs.query({windowId: vt.windowId}, function(tabs){ + // tabs.sort(function(tab_a, tab_b){ + // return SplitUrl(tab_a).localeCompare( SplitUrl(tab_b) ); + // }); + // var first_tabId; + // if ($(".selected:visible")[0]){ + // first_tabId = parseInt($(".selected:visible")[0].id); + // } else { + // first_tabId = parseInt($(".tab").find(":visible:first")[0].parentNode.id); + // } + // chrome.tabs.get(first_tabId, function(tab){ + // var new_index = tab.index; + // tabs.forEach(function(Tab){ + // // sort selected when more than 1 tab is selected + // if (($(".selected:visible").length > 1 && $("#"+Tab.id).is(":visible") && !Tab.pinned && $("#"+Tab.id).is(".selected")) || ($(".selected:visible").length < 2 && $("#"+Tab.id).is(":visible") && !Tab.pinned)){ + // chrome.tabs.move(Tab.id, {"index": new_index}); + // new_index++; + // } + // }); + // }); + // if (bg.opt.scroll_to_active){ + // setTimeout(function(){ + // ScrollTabList($(".active:visible")[0].id); + // },1000); + // } + // }); + // } +// } -// bookmark sub function -function SlowlyBookmarkTabs(tabs_array, group_folderId){ - if (tabs_array.length > 0){ - chrome.tabs.get(tabs_array[0], function(tab){ - chrome.bookmarks.search({url: tab.url}, function(list){ - tabs_array.splice(0, 1); - setTimeout(function(){ - SlowlyBookmarkTabs(tabs_array, group_folderId); - },10); - for (var elem in list){ - if (list[elem].parentId == group_folderId){ - bookmarkId = list[elem].id; - return; - } +// sort tabs sub function +// function SplitUrl(tab) { + // var tmp_url = new URL(tab.url); + // if (tmp_url.protocol != "http:"){ + // tmp_url.protocol == "http:"; + // } + // var url_parts = []; + // if (tab.pinned){ + // url_parts.push("#"+tab.index); + // } else { + // url_parts.push("~"); + // } + // var parts = tmp_url.host.split("."); + // parts.reverse(); + // if (parts.length > 1){ + // parts = parts.slice(1); + // } + // parts.join("."); + // url_parts.push(parts); + // url_parts.push(tab.title.toLowerCase()); + // return url_parts.join(" ! "); +// } + +function Bookmark(rootNode) { + let ToolbarId = browserId == "F" ? "toolbar_____" : "1"; + chrome.bookmarks.get(ToolbarId, function(list) { + chrome.bookmarks.search("TreeTabs", function(list) { + let TreeTabsId; + for (var elem in list) { + if (list[elem].parentId == ToolbarId) { + TreeTabsId = list[elem].id; + break; } - chrome.bookmarks.create({parentId: group_folderId, title: tab.title, url: tab.url}); - }); + } + if (TreeTabsId == undefined) { + chrome.bookmarks.create({parentId: ToolbarId, title: "TreeTabs"}, function(TreeTabsNew) { + TreeTabsId = TreeTabsNew.id; + }); + Bookmark(rootNode); + return; + } else { + if (rootNode.classList.contains("tab")) { + chrome.tabs.get(parseInt(rootNode.id), function(tab) { + if (tab) { + chrome.bookmarks.create({parentId: TreeTabsId, title: tab.title}, function(root) { + document.querySelectorAll("[id='"+rootNode.id+"'], [id='"+rootNode.id+"'] .tab").forEach(function(s){ + chrome.tabs.get(parseInt(s.id), function(tab){ + if (tab) { + chrome.bookmarks.create({parentId: root.id, title: tab.title, url: tab.url }); + } + }); + }); + }); + } + }); + } + + if (rootNode.classList.contains("folder") || rootNode.classList.contains("group")) { + let rootName = caption_noname_group; + if (rootNode.classList.contains("folder") && bgfolders[rootNode.id]) { + rootName = bgfolders[rootNode.id].name; + } + if (rootNode.classList.contains("group") && bggroups[rootNode.id]) { + rootName = bggroups[rootNode.id].name; + } + + chrome.bookmarks.create({parentId: TreeTabsId, title: rootName}, function(root) { + let foldersRefs = {}; + + let folders = document.querySelectorAll("#cf"+rootNode.id+" .folder"); + folders.forEach(function(s){ + if (bgfolders[s.id]) { + let ttId = s.id; + chrome.bookmarks.create({parentId: root.id, title: bgfolders[ttId].name}, function(Bkfolder) { + foldersRefs[ttId] = {ttid: ttId, id: Bkfolder.id, ttparent: bgfolders[ttId].parent, parent: root.id}; + + let elemInd = 0; + if (ttId == folders[folders.length-1].id) { + for (var elem in foldersRefs) { + let FolderTTId = foldersRefs[elem].ttid; + let BookmarkFolderId = foldersRefs[elem].id; + let TTParentId = foldersRefs[elem].ttparent; + if (foldersRefs[TTParentId]) { + foldersRefs[FolderTTId].parent = foldersRefs[TTParentId].id; + } + + elemInd++; + + if (elemInd == Object.keys(foldersRefs).length) { + elemInd = 0; + for (var elem in foldersRefs) { + let BookmarkFolderId = foldersRefs[elem].id; + let BookmarkFolderParentId = foldersRefs[elem].parent; + chrome.bookmarks.move(BookmarkFolderId, {parentId: BookmarkFolderParentId}, function(BkFinalfolder) { + document.querySelectorAll("#ct"+foldersRefs[elem].ttid+" .tab").forEach(function(s){ + chrome.tabs.get(parseInt(s.id), function(tab){ + if (tab) { + chrome.bookmarks.create({parentId: BkFinalfolder.id, title: tab.title, url: tab.url }); + } + }); + }); + + elemInd++; + + }); + } + } + } + } + }); + } + }); + + document.querySelectorAll("#ct"+rootNode.id+" .tab").forEach(function(s){ + chrome.tabs.get(parseInt(s.id), function(tab){ + if (tab) { + chrome.bookmarks.create({parentId: root.id, title: tab.title, url: tab.url }); + } + }); + }); + + }); + } + } }); - } + }); } \ No newline at end of file diff --git a/sidebar.html b/sidebar.html index bba730b..35b8311 100644 --- a/sidebar.html +++ b/sidebar.html @@ -23,36 +23,29 @@ + + + + + - -
-
+
-
-
-
-
-
-
+
+
+
-
-
- -
-
-
-
-
-
+
+
@@ -71,100 +64,82 @@
- -