PK 6content/PK 6content/tabmixplus/PK t5pHEEcontent/tabmixplus/about.xul %aboutDTD; %miscDTD; ]> PK 3+w00 content/tabmixplus/contents.rdf chrome://tabmixplus/content/pref/preferencesOverlay.xul chrome://tabmixplus/content/tabmix.xul chrome://tabmixplus/content/links/links.xul chrome://tabmixplus/content/bookmarks/bookmarks.xul chrome://tabmixplus/content/bookmarks/bookmarksManager.xul chrome://tabmixplus/content/links/links.xul chrome://tabmixplus/content/links/links.xul chrome://tabmixplus/content/history/history-panel.xul PK }d6zۺ}OOcontent/tabmixplus/tabmix.js/* * tabmix.js * * original code by Hemiola SUN, further developed by onemen and CPU */ var gPref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); var gIsOldBrowser = typeof(Components.interfaces.nsIXULAppInfo) == "undefined"; var gIsFirefox2 = typeof(BrowserOpenAddonsMgr) == "function"; var gIsPlaces = typeof(PlacesController) == "function" && typeof(BookmarksCommand) != "object"; var gChromeDir; function TM_init() { // move this to TMP_Places.init() when places will land if (typeof(PlacesController) == "function") document.getElementById("goPopup").addEventListener("popupshowing", setHistoryMenuItemsTitle, false); var historyMenu = document.getElementById("goPopup").parentNode; if (gIsPlaces) { TMP_Places.init(); // history menu open in new tab if the curren tab is locked if (historyMenu) historyMenu.setAttribute("oncommand", "TMP_Places.historyMenu(event);"); } else { Click2TabLoadBookmark.init(); if (historyMenu) historyMenu.setAttribute("oncommand", "var url = event.target.getAttribute('statustext'); if (url) {openUILinkIn(url, whereToOpenLinkTabmix(event, prefStringTMHistory)); content.focus();}"); } // disable the "Open New Window action in Single Window Mode... var cmdNewWindow = document.getElementById("cmd_newNavigator"); var originalNewNavigator = cmdNewWindow.getAttribute("oncommand"); cmdNewWindow.setAttribute("oncommand","if (gSingleWindowMode) BrowserOpenTab(); else {" + originalNewNavigator + "}"); // replace browser handlers with ours so it recognizes when tabs are acted on gBrowser.onTabBarDblClick = TM_onTabBarDblClick; gBrowser.onTabClick = TM_checkClick; if (gIsOldBrowser) gBrowser.updateContextTab = TMupdateContextTab; gBrowser.mTabBox.insertBefore(document.getElementById('vide-bar'), gBrowser.mTabBox.firstChild); gBrowser.closedTabs = []; document.getElementById("content").onresize = tabBarWidthChange; document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", TM_checkContentMenu, false); var tabContextMenu = gBrowser.mStrip.firstChild.nextSibling; tabContextMenu.setAttribute("onpopuphidden", tabContextMenu.getAttribute("onpopuphidden") + "if (event.target == this) TM_hidePopup();"); tabContextMenu.addEventListener("popupshowing", Tm_checkTabClick, false); tabContextMenu.addEventListener("popupshown", TMP_tabContextMenuShown, false); // override some of All-in-One Gestures function // override the duplicate tab function if (typeof aioDupTab == 'function') aioDupTab = function() { gBrowser.duplicateTab(gBrowser.mCurrentTab); }; //override the duplicate in new window function if (typeof aioDupWindow == 'function') aioDupWindow = function() { gBrowser.duplicateInWindow(gBrowser.mCurrentTab); }; //override the aioCloseWindow function if (typeof aioCloseWindow == 'function') aioCloseWindow = BrowserTryToCloseWindow; // for session manager window.setTimeout( function () { SessionManager.init(); gBrowser.mTabContainer.nextTab = 1; if (gIsFirefox2) getClosedTabs(); // XXX temp -- get closed-tabs from nsSessionStore var aTab = gBrowser.mTabContainer.firstChild; if (aTab != gBrowser.mCurrentTab) { aTab.removeAttribute("selected"); aTab.removeAttribute("flst_id"); }; }, 0 ); //Browser:Home open in new tab if the curren tab is locked window.BrowserHome = TM_BrowserHome; // add tooltip to close tab button on tab for firefox 1.5 + if (typeof(Components.interfaces.nsIXULAppInfo) != "undefined") gBrowser.mStrip.firstChild.setAttribute("onpopupshowing","return this.parentNode.parentNode.parentNode.TMP_createTooltip(event);"); //fix Typo: extensions.tabmix.cloesedWinToolsMenu should be extensions.tabmix.closedWinToolsMenu. //version tabmix 0.3 befor 2005-11-28 var oldPref = "extensions.tabmix.cloesedWinToolsMenu"; var newPref = "extensions.tabmix.closedWinToolsMenu"; if (gPref.prefHasUserValue(oldPref)) { gPref.setBoolPref(newPref, false); // default is true gPref.clearUserPref(oldPref) } // add call to TMP_Sanitizer // nsBrowserGlue.js use loadSubScript to load Sanitizer so we need to add this here var cmd = document.getElementById("Tools:Sanitize"); if (cmd) cmd.setAttribute("oncommand", cmd.getAttribute("oncommand") + " TMP_Sanitizer.tryToSanitize();"); // if sessionStore disabled use TMP command cmd = document.getElementById("History:UndoCloseTab"); if (cmd) cmd.setAttribute("oncommand", "TMP_ClosedTabs.undoCloseTab();"); // Look for RSS/Atom News Reader TMP_LookForRSS(); } function TM_deinit () { if (!gBrowser.mStrip.hasAttribute("ondraggesture")) { gBrowser.mStrip.removeEventListener("draggesture", TMP_TabDragGesture, true); gBrowser.mStrip.removeEventListener("dragover", TMP_TabDragOver, true); gBrowser.mStrip.removeEventListener("dragdrop", TMP_TabDragDrop, true); gBrowser.mStrip.removeEventListener("dragexit", TMP_TabDragExit, true); } if ("mTabDropIndicatorBar" in gBrowser) { gBrowser.mTabDropIndicatorBar.removeEventListener('dragover', TMP_TabDragOver, true); gBrowser.mTabDropIndicatorBar.removeEventListener('dragdrop', TMP_TabDragDrop, true); } if (typeof(PlacesController) == "function") document.getElementById("goPopup").removeEventListener("popupshowing", setHistoryMenuItemsTitle, false); SessionManager.deinit(numberOfWindows() == 0, false); document.getElementById("contentAreaContextMenu").removeEventListener("popupshowing", TM_checkContentMenu, false); var tabContextMenu = gBrowser.mStrip.firstChild.nextSibling; tabContextMenu.removeEventListener("popupshowing", Tm_checkTabClick, false); tabContextMenu.removeEventListener("popupshown", TMP_tabContextMenuShown, false); TMP_LastTab.deinit(); tabxOnClose(); TMP_TBP_exit(); tabxPrefObserver.removeObserver(); window.removeEventListener("unload", TM_deinit, false); } // Create new items in the context menu of tab bar var newMenuItems = ["tm-duplicateTab","tm-duplicateinWin","tm-detachTab","tm-mergeWindowsTab","tm-renameTab", "tm-copyTabUrl", "tm-autoreloadTab_menu", "tm-reloadOther","tm-reloadLeft","tm-reloadRight","tm-separator", "tm-undoCloseTab","tm-undoCloseList","tm-separator-2", "tm-closeAllTabs","tm-closeSimilar","tm-closeLeftTabs","tm-closeRightTabs", "tm-docShell","tm-freezeTab","tm-protectTab","tm-lockTab"]; var newMenuOrders = [ 1, 2, 3, 4, 5, 6, 9, 11, 12, 13, 14, 15, 16, 17, 19, 20, 22, 23, 25, 26, 27, 28]; function TM_creatMenuItems () { var tabContextMenu = window.getBrowser().mStrip.firstChild.nextSibling; tabContextMenu.setAttribute("id", "menuedit-tabContextMenu"); var menuItems = tabContextMenu.childNodes; var i, separator = 0; for ( i = 0; i < menuItems.length; i++ ) { if (menuItems[i].hasAttribute("id")) continue; else if (menuItems[i].localName == "menuseparator") menuItems[i].setAttribute("id", "original-separator-" + separator++); else if (menuItems[i].hasAttribute("xbl:inherits")) { if (menuItems[i].getAttribute("xbl:inherits") == "oncommand=onnewtab") { menuItems[i].setAttribute("id", "tm-newtab"); // menuItems[i].setAttribute("oncommand", "var tabbrowser = this.parentNode.parentNode.parentNode.parentNode; TMP_BrowserOpenTab(tabbrowser.mContextTab);"); menuItems[i].setAttribute("oncommand", "TMP_BrowserOpenTab();"); menuItems[i].setAttribute("_newtab", menuItems[i].getAttribute("label")); menuItems[i].setAttribute("_afterthis", document.getElementById("tm-separator").getAttribute("_afterthis")); menuItems[i].removeAttribute("xbl:inherits"); } } else { var aCommand = menuItems[i].getAttribute("oncommand"); if (aCommand.indexOf("reloadTab") != -1 ) menuItems[i].setAttribute("id", "tm-reloadTab"); else if (aCommand.indexOf("reloadAllTabs") != -1 ) menuItems[i].setAttribute("id", "tm-reloadAllTabs"); else if (aCommand.indexOf("removeAllTabsBut") != -1 ) menuItems[i].setAttribute("id", "tm-removeAllTabsBut"); else if (aCommand.indexOf("removeTab") != -1 ) menuItems[i].setAttribute("id", "tm-removeTab"); else if (aCommand.indexOf("BookmarkThisTab") != -1 ) menuItems[i].setAttribute("id", "tm-addBookmarkAs"); else if (menuItems[i].hasAttribute("command")) if (menuItems[i].getAttribute("command") == "Browser:BookmarkAllTabs") menuItems[i].setAttribute("id", "tm-bookmarkAllTabs"); } } // group the close-tab options together var closeTab = document.getElementById("tm-removeTab"); var closeOther = document.getElementById("tm-removeAllTabsBut"); tabContextMenu.insertBefore( closeTab, closeOther ); // insert new menuitems and separators for ( i = 0; i < newMenuItems.length; i++ ) { var newMenuItem = document.getElementById(newMenuItems[i]); var item; if (tabContextMenu.childNodes.length < newMenuOrders[i]+1) item = null; else item = tabContextMenu.childNodes[newMenuOrders[i]]; tabContextMenu.insertBefore( newMenuItem, item); } // restore original-separator-2 to its original position var origSep2 = document.getElementById("original-separator-2"); var addBookmark = document.getElementById("tm-addBookmarkAs"); if (origSep2 && addBookmark) tabContextMenu.insertBefore(origSep2, addBookmark); // insret IE Tab menu-items befor Bookmakrs menu-items or at the end if origSep2 is null if (window.gIeTab) { var aFunction = "createTabbarMenu" in IeTab.prototype ? "createTabbarMenu" : "init"; if (aFunction in IeTab.prototype) { eval("IeTab.prototype." + aFunction +" ="+IeTab.prototype[aFunction].toString().replace( 'tabbarMenu.insertBefore(document.getElementById("ietab-tabbar-sep"), separator);', 'separator = document.getElementById("original-separator-2"); $&' )); } } } function TMP_openDialog(panel) { var WindowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'] .getService(Components.interfaces.nsIWindowMediator); var tabmixOptionsWin = WindowManager.getMostRecentWindow("mozilla:tabmixopt"); if (tabmixOptionsWin) { var appearanceWin = WindowManager.getMostRecentWindow("mozilla:tabmixopt-appearance"); var filetypeWin = WindowManager.getMostRecentWindow("mozilla:tabmixopt-filetype"); if (!appearanceWin && !filetypeWin && panel > -1) tabmixOptionsWin.TM_selectTab(panel); var incompatibleBox = tabmixOptionsWin.document.getElementById("incompatible"); var incompatibleStatus = incompatibleBox.collapsed; incompatibleBox.collapsed = getExtensions().length == 0; if (incompatibleStatus != incompatibleBox.collapsed) tabmixOptionsWin.sizeToContent(); (appearanceWin || filetypeWin || tabmixOptionsWin).focus(); } else { if(panel > -1) gPref.setIntPref('extensions.tabmix.selected_tab', panel); window.openDialog("chrome://tabmixplus/content/pref/pref-tabmix.xul", "Tab Mix Plus", "chrome,titlebar,toolbar,close,dialog=no"); } } /* functions to disable incompatible extensions original code by mrtech local_install.js , code modified by onemen 2006-01-13 */ function disableExtensions(aWindow) { var warning_list = getExtensions(); if (warning_list.length == 0) { return true; } try { warning_list.sort(); } catch(ex) { } var outStr = ""; for (var w in warning_list) { outStr += " - " + warning_list[w]._name + " " + warning_list[w]._version + "\n"; } var defaultButton = gIsOldBrowser ? BUTTON_OK : BUTTON_EXTRA1; var showatStart = gPref.getBoolPref("extensions.tabmix.disableIncompatible") var chkBoxState = showatStart ? CHECKBOX_CHECKED : CHECKBOX_UNCHECKED; var bundleID = "tmp-string-bundle" var _stingBundle = document.getElementById(bundleID); var title = _stingBundle.getString("incompatible.title"); var msg = _stingBundle.getString("incompatible.msg0") + "\n" + _stingBundle.getString("incompatible.msg1") + "\n\n" + outStr + "\n\n"; var chkBoxLabel = _stingBundle.getString("incompatible.chkbox.label"); var buttons = [SessionManager.setLabel("incompatible.button0", bundleID), SessionManager.setLabel("incompatible.button1", bundleID)]; if (!gIsOldBrowser) buttons.push(SessionManager.setLabel("incompatible.button2", bundleID)); var result = TM_PromptService([defaultButton, HIDE_MENUANDTEXT, chkBoxState],[title, msg, "", chkBoxLabel, buttons.join("\n")], aWindow); if (result.checked != showatStart) { gPref.setBoolPref("extensions.tabmix.disableIncompatible", result.checked); nsIPrefServiceObj.savePrefFile(null); // store the pref immediately } if (result.button != BUTTON_CANCEL) { var extensionManager = Components.classes["@mozilla.org/extensions/manager;1"] .getService(Components.interfaces.nsIExtensionManager); var _Function = gIsOldBrowser ? "disableExtension" : "disableItem"; for (w in warning_list) { try{ extensionManager[_Function](warning_list[w]._guid); } catch(e) { tmLog("error while disabled " + warning_list[w]._name) } } var dataSource = extensionManager.datasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource); if (dataSource) dataSource.Flush(); if (!gIsOldBrowser && result.button == BUTTON_EXTRA1 && canQuitApplication()) { var appStartup = Components.interfaces.nsIAppStartup; Components.classes["@mozilla.org/toolkit/app-startup;1"] .getService(appStartup).quit(appStartup.eRestart | appStartup.eAttemptQuit); } else { msg = _stingBundle.getString("incompatible.msg2"); buttons = ["", SessionManager.setLabel("sm.button.continue")].join("\n"); TM_PromptService([BUTTON_CANCEL, HIDE_MENUANDTEXT, HIDE_CHECKBOX],[title, msg, "", "", buttons], aWindow); } return true; } return false; } function getExtensions() { var guid_list = {}; /* The following extensions are integrated or incompatible with Tab Mix Plus add extensions ID in lowercase. */ guid_list['{00bdd586-51fb-4b06-9c23-af2fb7609bf3}'] = true; // Basics guid_list['{b98719b3-76d6-4bec-aeed-3ab542b23bd7}'] = true; // BlankLast guid_list['{47921160-3085-4023-a145-8ec466babfba}'] = true; // Click2Tab guid_list['{b0f9cad2-ebae-4685-b518-d3d9b41ea183}'] = true; // Close Tab On Double Click guid_list['ctc@clav.mozdev.org'] = true; // CTC guid_list['{61ed2a9a-39eb-4aaf-bd14-06dfbe8880c3}'] = true; // Duplicate Tab guid_list['flowtabs'] = true; // Flowing Tabs guid_list['{cd2b821e-19f9-40a7-ac5c-08d6c197fc43}'] = true; // FLST guid_list['{68e5dd30-a659-4987-99f9-eaf21f9d4140}'] = true; // LastTab guid_list['minit@dorando'] = true; // MiniT guid_list['minit-drag'] = true; // miniT-drag guid_list['minit-tabscroll@dorando'] = true; // miniT-tabscroll guid_list['new-tab-button-on-tab-bar@mikegoodspeed.com'] = true; // new tab button on tab bar guid_list['{66E978CD-981F-47DF-AC42-E3CF417C1467}'] = true; // new tab homepage guid_list['newtaburl@sogame.cat'] = true; // NewTabURL guid_list['{4b2867d9-2973-42f3-bd9b-5ad30127c444}'] = true; // Petite Tabbrowser Extensions guid_list['{888d99e7-e8b5-46a3-851e-1ec45da1e644}'] = true; // ReloadEvery guid_list['{aede9b05-c23c-479b-a90e-9146ed62d377}'] = true; // Reload Tab On Double-Click guid_list['{492aa940-beaa-11d8-9669-0800200c9a66}'] = true; // Scrollable Tabs guid_list['{eb922232-fd76-4eb0-bd5a-c1cba4238343}'] = true; // Single Window guid_list['{149C6CC6-EC62-4ebd-B719-3C2E867930C7}'] = true; // Stack style tabs guid_list['supert@studio17.wordpress.com'] = true; // superT guid_list['tabbin'] = true; // Tab Bin guid_list['{43520b8f-4107-4351-ac64-9bcc5eea24b9}'] = true; // Tab Clicking Options guid_list['{bea6d1a7-882d-425f-bc75-944e0063ff3b}'] = true; // Tab Mix [original one] guid_list['tabtowindow@sogame.cat'] = true; // Tab to window guid_list['tabx@clav.mozdev.org'] = true; // Tab X guid_list['{0b0b0da8-08ba-4bc6-987c-6bc9f4d8a81e}'] = true; // Tabbrowser Extensions guid_list['{9b9d2aaa-ae26-4447-a7a1-633a32b19ddd}'] = true; // Tabbrowser Preferences guid_list['tabdrag'] = true; // tabdrag-for-tablib guid_list['tabfx@chaosware.net'] = true; // TabFX guid_list['tabsopenrelative@jomel.me.uk'] = true; // Tabs open ralative guid_list['tablib'] = true; // tablib guid_list['{328bbe91-cb86-40b0-a3fd-2b39969f9faa}'] = true; // Undo Close Tab guid_list['undoclosetab@dorando'] = true; // Undo Close Tab guid_list['{99ec6690-8bb1-11da-a72b-0800200c9a66}'] = true; // Unread Tabs function prop(elm, str) { var arc = RDFService.GetResource("http://www.mozilla.org/2004/em-rdf#" + str); var target = extensionDS.GetTarget(elm, arc, true); if (target instanceof Components.interfaces.nsIRDFLiteral || target instanceof Components.interfaces.nsIRDFInt) return target.Value; return null; } var RDFService = Components.classes["@mozilla.org/rdf/rdf-service;1"] .getService(Components.interfaces.nsIRDFService); var Container = Components.classes["@mozilla.org/rdf/container;1"] .getService(Components.interfaces.nsIRDFContainer); var extensionDS = Components.classes["@mozilla.org/extensions/manager;1"] .getService(Components.interfaces.nsIExtensionManager).datasource; var root = gIsOldBrowser ? "urn:mozilla:extension:" : "urn:mozilla:item:"; var disabledString = gIsOldBrowser ? "disabled" : "userDisabled"; try { // in ff 1.0.x we can get error at startup Container.Init(extensionDS, RDFService.GetResource(root + "root")); } catch (e) { tmLog("error in getExtensions " + e); return []; } var elements = Container.GetElements(); var extensionsArray = []; while (elements.hasMoreElements()) { var element=elements.getNext().QueryInterface(Components.interfaces.nsIRDFResource); var id = element.Value.replace(root, ""); if (typeof guid_list[id.toLowerCase()] != "undefined") { var opType = prop(element, "opType"); var disabled = prop(element, disabledString); if ((!disabled && opType != "needs-disable" && opType != "needs-uninstall") || ( disabled && opType == "needs-enable")) { var name = prop(element, "name"); name = name.charAt(0).toUpperCase() + name.substr(1); extensionsArray.push({_name: name, _guid: id, _version:prop(element, "version")}); } } } return extensionsArray; } PK ~6qNXXcontent/tabmixplus/tabmix.xul %tabmixDTD; %tabBrowserDTD; ]> PK 6content/tabmixplus/tab/PK 86@ʧʧcontent/tabmixplus/tab/tab.js// code based on Tab X 0.5 enhanced version by Morac, modified by Hemiola SUN, later CPU & onemen var nsIPrefServiceObj = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService); var tabxBranch = "extensions.tabmix."; var tabxPrefs = nsIPrefServiceObj.getBranch(tabxBranch); var tabBarWidth = -1; var tabx; var addtabx; var tabxleft; var tabscroll; var hidebutton; var max_width; var min_width; var flexTabs; var gTabbarPosition; var gSingleWindowMode; var progress; var tabBarSpace; var unreadTab; var optionsToolsMenu; var alwaysNewTab; var showIcons; var showNewTabButton; var noprogress; var boldUnread; var italicUnread; var underlineUnread; var useUnreadColor; var useCurrentColor; var useProgressColor; var boldCurrent; var italicCurrent; var underlineCurrent; var gFirefox2DefaultTheme; function TMupdateSettings(start) { var _Browser = getBrowser(); if (!_Browser || tabxPrefs.prefHasUserValue("setDefault")) return; var i; tabx = TMP_getBoolPref(tabxBranch, "tabXMode.enable", true); addtabx = TMP_getIntPref (tabxBranch, "tabXMode", 1); // in old version we use tabXMode = 0 to disable the button if (tabx && (addtabx < 1 || addtabx > 5)) { addtabx = 1; tabxPrefs.setIntPref("tabXMode", 1); return; } tabxleft = TMP_getBoolPref(tabxBranch, "tabXLeft", false); tabscroll = TMP_getIntPref (tabxBranch, "tabBarMode", 2); hidebutton = TMP_getBoolPref(tabxBranch, "hideTabBarButton", true); max_width = TMP_getIntPref (tabxBranch, "maxWidth", 250); min_width = TMP_getIntPref (tabxBranch, "minWidth", 30); flexTabs = TMP_getBoolPref(tabxBranch, "flexTabs", false); progress = TMP_getBoolPref(tabxBranch, "progressMeter", true); tabBarSpace = TMP_getBoolPref(tabxBranch, "tabBarSpace", false); unreadTab = TMP_getBoolPref(tabxBranch, "unreadTab", false); currentTab = TMP_getBoolPref(tabxBranch, "currentTab", false); noprogress = TMP_getBoolPref(tabxBranch, "noprogress", false); optionsToolsMenu = TMP_getBoolPref(tabxBranch, "optionsToolMenu", true); alwaysNewTab = TMP_getIntPref (tabxBranch, "speLink", 0); showIcons = TMP_getBoolPref(tabxBranch, "extraIcons", true); showNewTabButton = TMP_getBoolPref(tabxBranch, "newTabButton", true); boldUnread = TMP_getBoolPref(tabxBranch, "boldUnread", true); italicUnread = TMP_getBoolPref(tabxBranch, "italicUnread", true); underlineUnread = TMP_getBoolPref(tabxBranch, "underlineUnread", true); boldCurrent = TMP_getBoolPref(tabxBranch, "boldCurrent", true); italicCurrent = TMP_getBoolPref(tabxBranch, "italicCurrent", true); underlineCurrent = TMP_getBoolPref(tabxBranch, "underlineCurrent", true); useCurrentColor = TMP_getBoolPref(tabxBranch, "useCurrentColor", true); useUnreadColor = TMP_getBoolPref(tabxBranch, "useUnreadColor", true); useProgressColor = TMP_getBoolPref(tabxBranch, "useProgressColor", false); var allTabs = _Browser.mTabContainer.childNodes; var tabBar = _Browser.mTabContainer; var tabBox = _Browser.mTabBox; var currentVisible = tabBar.isTabVisible(_Browser.mCurrentTab._tPos); tabBox.setAttribute("dir", gTabbarPosition == 1 ? "rtl" : "ltr"); if (gIsFirefox2) tabBar.mAllTabsPopup.setAttribute("position", gTabbarPosition == 1 ? "before_start" : "after_end"); switch ( tabscroll ) { case 0: tabBar.setAttribute("flowing", "singlebar"); break; case 1: if (tabBar.getAttribute("flowing") != "scrollbutton") tabBar.setAttribute("flowing", "scrollbutton"); break; case 2: if (tabBar.getAttribute("flowing") != "multibar") { tabBar.setAttribute("flowing", "multibar"); tabBar.collapsedTabs = 0; } break; } if (!flexTabs) tabBar.collapsedTabs = 0; var tabxOptions = ["no-button","always","showhover","current","current_hover","always"]; for (i = 0; i < allTabs.length; i++) { var aTab = allTabs[i]; aTab.maxWidth = max_width; aTab.minWidth = min_width; if (flexTabs && min_width != max_width) { if (aTab.hasAttribute("width")) aTab.removeAttribute("width"); if (aTab.hasAttribute("flex")) aTab.removeAttribute("flex"); } else { aTab.setAttribute("width", "0"); aTab.setAttribute("flex", "100"); } if ( alwaysNewTab == 1 ) aTab.setAttribute("locked", "true"); else if ( tabBar.getAttribute("lockAllTab") == "true" ) aTab.removeAttribute("locked"); SessionManager.updateTabProp(aTab); if (tabx) aTab.setAttribute("tabx", tabxOptions[addtabx]); else aTab.removeAttribute("tabx"); if (tabxleft) aTab.setAttribute("tabxleft", "on"); else aTab.removeAttribute("tabxleft"); } tabBar.setAttribute("closebutton", !hidebutton); tabBar.setAttribute("hideAllTabsButton", TMP_getBoolPref(tabxBranch, "hideAllTabsButton", false)); tabBar.setAttribute("progressMeter", progress); tabBar.setAttribute("tabBarSpace", tabBarSpace); tabBar.setAttribute("unreadTab", unreadTab); tabBar.setAttribute("extraIcons", showIcons ); tabBar.setAttribute("lockAllTab", alwaysNewTab == 1 ); tabBar.setAttribute("newTabButton", showNewTabButton ); tabBar.setAttribute("boldUnread", boldUnread); tabBar.setAttribute("italicUnread", italicUnread); tabBar.setAttribute("underlineUnread", underlineUnread); tabBar.setAttribute("boldCurrent", boldCurrent); tabBar.setAttribute("italicCurrent", italicCurrent); tabBar.setAttribute("underlineCurrent", underlineCurrent); tabBar.setAttribute("currentTab", currentTab); tabBar.setAttribute("useCurrentColor", useCurrentColor); tabBar.setAttribute("useUnreadColor", useUnreadColor); tabBar.setAttribute("useProgressColor", useProgressColor); document.getElementById("statusbar-progresspanel").setAttribute("hidden", noprogress && progress); var tabhbox = document.getElementById("scroll-tabs-frame"); if (tabhbox.style.maxHeight != "none" && !gBrowser.mStrip.collapsed && tabBar.childNodes[0].collapsed) { var currentMaxRow = tabhbox.style.maxHeight.replace("px", "") / getRowHeight(); var rowDiff = tabBar.maxRow - currentMaxRow; while (tabBar.childNodes[0].collapsed && rowDiff > 0) { tabBar.rowScroll(-1); rowDiff--; } } if (start && "isLoadHomePage" in window) { window.setTimeout(tabBarScrollStatus, 0); delete window.isLoadHomePage; } else tabBarScrollStatus(); tabBar.canScrollTabsLeft = tabBar.childNodes[0].collapsed; window.setTimeout( function() { if (currentVisible) tabBar.ensureTabIsVisible( _Browser.mCurrentTab._tPos ); tabBar.canScrollTabsRight = !tabBar.rightEnd; checkBeforeAndAfter(); }, 50 ); if ( tabBarWidth == -1 ) // initialize the value of "tabBarWidth" window.setTimeout( function () { tabBarWidth = gBrowser.mTabContainer.boxObject.width; }, 100 ); // if the current Browser has SafeBrowsing problem and message is showing we need to // repaint the "safebrowsing-dim-area-canvas" window.setTimeout(adjustSafebrowsingDimArea, 0); // set some items document.getElementById("tabmix-menu").hidden = !optionsToolsMenu; var undocloseButton = document.getElementById("btn_undoclose"); if (undocloseButton) closedTabBtnType(undocloseButton); TMP_LastTab.ReadPreferences(); SessionManager.updateSettings(); // this update all open windows, if we fix here we need to change in SessionManager } // make btn_undoclose single-functionality or dual-functionality function closedTabBtnType(undocloseButton) { var menuOnly = TMP_getBoolPref(tabxBranch, "undoCloseButton.menuonly", false); if (!menuOnly) undocloseButton.removeAttribute("orient"); else if (!undocloseButton.hasAttribute("orient")) undocloseButton.setAttribute("orient", "vertical"); var buttonType = menuOnly ? "menu" : "menu-button"; if (undocloseButton.getAttribute("type") != buttonType) undocloseButton.setAttribute("type", buttonType); } //overlay BrowserToolboxCustomizeDone function TMP_BrowserToolboxCustomizeDone() { var undocloseButton = document.getElementById("btn_undoclose"); if (undocloseButton) { closedTabBtnType(undocloseButton); undocloseButton.setAttribute("disabled",gBrowser.closedTabs.length < 1); } var managerButten = document.getElementById("btn_sessionmanager"); if (managerButten) { managerButten.setAttribute("disabled", !tabxPrefs.getBoolPref("sessions.manager")); var hiddenPref = document.getElementById("btn_closedwindows") ? true : false; document.getElementById("tm-sm-closedwindows1").hidden = hiddenPref; } fixTabmixButtons(); } // fix Tabmix toolbarbutton in Firefox 2.0+ theme //(check to see if they change this) function fixTabmixButtons() { function setAttrib(id, attrib) { var button = document.getElementById(id); if (button && (!button.hasAttribute(attrib) || !button.getAttribute(attrib))) button.setAttribute(attrib,true); } var buttons = ["tabslist","closedwindows","undoclose","sessionmanager"]; if (gIsFirefox2) Array.forEach(buttons, function(id) {setAttrib("btn_"+id, "firefox2");}); } function TMP_SSTabRestoring(event){ var aTab = event.target; if (aTab.hasAttribute("_locked")) { if (aTab.getAttribute("_locked") == "true") aTab.setAttribute("locked", "true"); else aTab.removeAttribute("locked"); } // this function ren befor tab load, so onTabReloaded will run at onStateChange get STATE_STOP var reloadData = aTab.getAttribute("reload-data"); if (reloadData) { reloadData = reloadData.split(" "); gBrowser.setupAutoReload(aTab); aTab.autoReloadEnabled = true; aTab.autoReloadURI = reloadData[0]; aTab.autoReloadTime = reloadData[1]; } } // Function to catch when a new window is created and update icons if needed // function tabxOnLoad(event) { var tabBar = getBrowser().mTabContainer; if (gIsFirefox2) { tabBar.setAttribute("firefox2", "true"); if (/^Mac/.test(navigator.platform)) tabBar.setAttribute("firefox2Mac", "true"); else tabBar.setAttribute("firefox2notMac", "true"); var skin = gPref.getCharPref("general.skins.selectedSkin"); if (skin=="classic/1.0") { gFirefox2DefaultTheme = true; if (/^Mac/.test(navigator.platform)) tabBar.setAttribute("firefox2MacDefaultTheme", "true"); else tabBar.setAttribute("firefox2DefaultTheme", "true"); } } // add event for update tab when restoring from nsSessionStore tabBar.addEventListener("SSTabRestoring", TMP_SSTabRestoring, true); // add event for creating a new tab tabBar.addEventListener("DOMNodeInserted", tabxTabAdded, true); // call tabxTabClosed from gBrowser.removeTab (eval) untile we will use "TabClose" event // tabBar.addEventListener("DOMNodeRemoved", tabxTabClosed, true); // don't show close tab button if there is only one blank tab or we keep last tab adjustCloseButtons(1); // add event for mouse scrolling on tab bar, necessary for linux tabBar.addEventListener("DOMMouseScroll", TMtabBarScroll, false); if (window.navigator.platform.search("Linux") != -1) document.getElementById("navigator-toolbox").addEventListener("DOMMouseScroll", TMtabBarScroll, false); if (gSingleWindowMode) tabxPrefObserver.setSingleWindowUI(); tabxPrefObserver.setMenuIcons(); tabxPrefObserver.toggleKey("key_tm_slideShow", "extensions.tabmix.disableF8Key"); tabxPrefObserver.toggleKey("key_tm_toggleFLST", "extensions.tabmix.disableF9Key"); tabxPrefObserver.setNewColorCode("currentTab", "extensions.tabmix.currentColor", "#000000"); tabxPrefObserver.setNewColorCode("unreadTab", "extensions.tabmix.unreadColor", "#CC0000"); tabxPrefObserver.setNewColorCode("progress", "extensions.tabmix.progressColor", "#AAAAFF"); tabxPrefObserver.tabCloseButton(); tabxPrefObserver.maxTabsUndo(); // disable/enable tabmix buttons at startup var managerButten = document.getElementById("btn_sessionmanager"); if (managerButten) { var hiddenPref = document.getElementById("btn_closedwindows") ? true : false; document.getElementById("tm-sm-closedwindows1").hidden = hiddenPref; } // fix Tabmix toolbarbutton in Firefox 2.0+ theme fixTabmixButtons(); gTabbarPosition = TMP_getIntPref (tabxBranch, "tabBarPosition", 0); // update icons if needed TMupdateSettings(true); // xxx we need diff function that call one on new window(s) and one for pref changed } function tabxOnClose() { var tabBar = getBrowser().mTabContainer; tabBar.removeEventListener("SSTabRestoring", TMP_SSTabRestoring, true); tabBar.removeEventListener("DOMNodeInserted", tabxTabAdded, true); tabBar.removeEventListener("DOMMouseScroll", TMtabBarScroll, false); if (window.navigator.platform.search("Linux") != -1) document.getElementById("navigator-toolbox").removeEventListener("DOMMouseScroll", TMtabBarScroll, false); } function tabxTabClosed(aTab) { var tabs = getBrowser().mTabContainer.childNodes; var tabBar = getBrowser().mTabContainer; var firstTab = tabs[0]; // don't show close tab button if there is only one blank tab or we keep last tab adjustCloseButtons(2, aTab); if ( tabscroll != 2 ) { tabBar.collapsedTabs--; tabBar.canScrollTabsLeft = firstTab.collapsed; window.setTimeout( function() { tabBar.canScrollTabsRight = !tabBar.rightEnd; setTabBarHeight(); }, 50 ); } else { window.setTimeout( function() { if ( tabBar.getAttribute("multibar") == "scrollbar" && firstTab.collapsed ) { if ((tabBar.lastChild.baseY + tabBar.lastChild.boxObject.height/2) < (tabBar.boxObject.y + tabBar.boxObject.height)) { tabBar.rowScroll(-1); } } tabBarScrollStatus(); checkBeforeAndAfter(); }, 0); } // if the current Browser has SafeBrowsing problem and message is showing we need to // repaint the "safebrowsing-dim-area-canvas" window.setTimeout(adjustSafebrowsingDimArea, 0); } // Function to catch when new tabs are created and update tab icons if needed // In addition clicks and doubleclick events are trapped. // function tabxTabAdded(event) { if (event.target.localName != "tab" || event.target.hasAttribute("tabmoved")) return; var aTab = event.target; // XXX splice, appendChild, insertBefore from gBrowser.moveTabTo // trigger tabxTabClosed and tabxTabAdded if (aTab._added) { delete aTab._added; return; } aTab._added = true; //XXX when we drop support for Fx 1.0 - 1.5 add chromedir="&locale.dir;" to tab content binding if (gIsFirefox2) aTab.setAttribute("chromedir", gChromeDir); // don't show close tab button if there is only one blank tab or we keep last tab adjustCloseButtons(1); var tabxOptions = ["no-button","always","showhover","current","current_hover","always"]; if (tabx) aTab.setAttribute("tabx", tabxOptions[addtabx]); else aTab.removeAttribute("tabx"); if (tabxleft) aTab.setAttribute("tabxleft", "on"); else aTab.removeAttribute("tabxleft"); aTab.maxWidth = max_width; aTab.minWidth = min_width; if (flexTabs && min_width != max_width) { if (aTab.hasAttribute("width")) aTab.removeAttribute("width"); if (aTab.hasAttribute("flex")) aTab.removeAttribute("flex"); } else { aTab.setAttribute("width", "0"); aTab.setAttribute("flex", "100"); } if ( alwaysNewTab == 1 ) aTab.setAttribute("locked", "true"); // XXX SessionManager.updateTabProp(aTab); // tab is blank at this stage tabBarScrollStatus(); // if the current Browser has SafeBrowsing problem and message is showing we need to // repaint the "safebrowsing-dim-area-canvas" adjustSafebrowsingDimArea(); } function tabBarScrollStatus () { var allTabs = getBrowser().mTabContainer.childNodes; var tabBar = getBrowser().mTabContainer; tabBar.canScrollTabsLeft = allTabs[0].collapsed; if ( tabscroll == 2 ) { tabBar.setAttribute("multibar", "true"); setMultibarAttribute(); } else tabBar.removeAttribute("multibar"); setTabBarHeight(); tabBar.canScrollTabsRight = !tabBar.rightEnd; } function setMultibarAttribute () { var tabBar = getBrowser().mTabContainer; if (tabBar.collapsedTabs > 0) tabBar.setAttribute("multibar", "scrollbar"); else if (gBrowser.mStrip.collapsed || inSameRow(tabBar.firstChild, tabBar.lastChild)) tabBar.removeAttribute("multibar"); else { var tabhbox = document.getElementById("scroll-tabs-frame"); var maxY = tabhbox.boxObject.y + getRowHeight() * tabBar.maxRow; // if the top of the last tab is on or below the max line then enter scrollbar var lastTabY = tabBar.lastChild.boxObject.y; if (lastTabY >= maxY) tabBar.setAttribute("multibar", "scrollbar"); else if (tabBar.getAttribute("multibar") != "true") tabBar.setAttribute("multibar", "true"); } } function checkBeforeAndAfter() { var tab = getBrowser().mTabContainer.selectedItem; var prev = tab.previousSibling, next = tab.nextSibling; if (prev) { if ( !inSameRow(prev, tab) ) prev.removeAttribute("beforeselected"); else prev.setAttribute("beforeselected", "true"); } if (next) { if ( !inSameRow(next, tab) ) next.removeAttribute("afterselected"); else next.setAttribute("afterselected", "true"); } } function getRowHeight () { var tabBar = getBrowser().mTabContainer; var tabs = getBrowser().mTabContainer.childNodes; var i, j; i = j = tabBar.collapsedTabs; if ( tabs[j] && tabs[j].getAttribute("selected") == "true" ) j++; while ( inSameRow( tabs.item(i), tabs.item(j) ) ) i++; if ( !tabs[i] ) // only one row if ( tabs[j] ) return tabs[j].baseY - tabs[j].boxObject.y; else return tabs[0].baseY - tabs[0].boxObject.y; if ( tabs[i].getAttribute("selected") == "true" ) i++; if ( !tabs[i] ) return tabs[i-1].baseY - tabs[i-1].boxObject.y; return tabs[i].baseY - tabs[j].baseY; } function setTabBarHeight () { var tabBar = getBrowser().mTabContainer; var tabhbox = document.getElementById("scroll-tabs-frame"); if ( tabBar.getAttribute("flowing") == "multibar" && tabBar.getAttribute("multibar") == "scrollbar" ) { tabhbox.style.maxHeight = tabhbox.style.height = getRowHeight() * tabBar.maxRow + "px"; document.getElementById("tabmix-tabs-closebutton-box").pack = "start"; } else { if ( tabBar.getAttribute("flowing") == "multibar" && tabBar.getAttribute("multibar") == "true") document.getElementById("tabmix-tabs-closebutton-box").pack = "start"; else document.getElementById("tabmix-tabs-closebutton-box").pack = "center"; tabhbox.style.maxHeight = "none"; tabhbox.style.height = "auto"; } } function inSameRow (tab1, tab2) { if ( !tab1 || !tab2 ) return false; if ( !tabscroll || tabscroll != 2 ) return true; var top1 = tab1.boxObject.y, top2 = tab2.boxObject.y; var base1 = tab1.baseY, base2 = tab2.baseY; var topH = Math.min(top1, top2), topL = Math.max(top1, top2); var baseH = Math.min(base1, base2), baseL = Math.max(base1, base2); if ( topH == topL || baseH == baseL ) return true; return ( baseH > (top1+base1)/2 && baseH > (top2+base2)/2 && topL < (top1+base1)/2 && topL < (top2+base2)/2 ) ? true : false; } function tabBarWidthChange () { var tabBar = getBrowser().mTabContainer; var tabhbox = document.getElementById("scroll-tabs-frame"); var tabs = getBrowser().mTabContainer.childNodes; if (addtabx == 5 && !flexTabs) adjustCloseButtons(1); if ( tabBarWidth == tabBar.boxObject.width ) return; var oldCollapsed = tabBar.collapsedTabs; var i = 0; if ( tabscroll != 2 && tabBarWidth < tabBar.boxObject.width ) { while ( tabs[ oldCollapsed + i ] && tabs[ oldCollapsed + i ].boxObject.x + tabs[ oldCollapsed + i ].boxObject.width < tabhbox.boxObject.x + tabhbox.boxObject.width ) i++; tabBar.collapsedTabs = 0; tabBar.ensureTabIsVisible( oldCollapsed + i - 1 ); tabBarScrollStatus(); } else if ( tabscroll == 2 ) { tabBar.collapsedTabs = 0; tabBarScrollStatus(); tabBar.ensureTabIsVisible( tabs.length - 1); tabBar.ensureTabIsVisible( oldCollapsed ); checkBeforeAndAfter(); } else tabBarScrollStatus(); tabBarWidth = tabBar.boxObject.width; } // Function to catch changes to Tab Mix preferences and update existing windows and tabs // function tabxPrefObserver() { var pref = "setDefault" if (tabxPrefs.prefHasUserValue(pref)) tabxPrefs.clearUserPref(pref) pref = "PrefObserver.error"; if (tabxPrefs.prefHasUserValue(pref)) tabxPrefs.clearUserPref(pref) try { var prefSvc = nsIPrefServiceObj.getBranch(null); this.tabxBranch = tabxBranch; if (!Components.interfaces.nsIPrefBranch2) this.pbi = prefSvc.QueryInterface(Components.interfaces.nsIPrefBranchInternal); // for 1.0.7 else this.pbi = prefSvc.QueryInterface(Components.interfaces.nsIPrefBranch2); // add Observer for (var i = 0; i < this.OBSERVING.length; ++i) this.pbi.addObserver(this.OBSERVING[i], this, true); } catch(e) { tmLog("prefs-Observer failed to attach:" + "\n" + e); tabxPrefs.setBoolPref(pref, true); } } tabxPrefObserver.prototype = { tabxBranch: null, // nsISupports interface implementation -- for weak-reference by pref-observer service QueryInterface: function(iid) { if (!iid.equals(Components.interfaces.nsISupports) && !iid.equals(Components.interfaces.nsISupportsWeakReference) && !iid.equals(Components.interfaces.nsIObserver)) { dump("Tab Mix Plus pref-observer factory object: QI unknown interface: " + iid + "\n"); throw Components.results.NS_ERROR_NO_INTERFACE; } return this; }, OBSERVING: ["extensions.tabmix.", "browser.tabs.tabClipWidth", "browser.sessionstore.max_tabs_undo", "browser.sessionstore.enabled", "browser.link.open_external", "browser.link.open_newwindow.restriction", "browser.link.open_newwindow"], // removes the observer-object from service -- called when the window is no longer open removeObserver: function() { for (var i = 0; i < this.OBSERVING.length; ++i) this.pbi.removeObserver(this.OBSERVING[i], this); this.pbi = null; }, /* Observer-function */ /* subject: [wrapped nsISupports :: nsIPrefBranch], nsIPrefBranch Internal topic: "changed"*/ observe: function TMP_pref_observer(subject, topic, prefName) { // if we don't have a valid window (closed) if ( !(typeof(document) == 'object' && document) ) { this.removeObserver(); // remove the observer.. return; // ..and don't continue } switch (prefName) { case "extensions.tabmix.warnAboutClosingTabs.timeout": case "extensions.tabmix.sessions.crashed": case "extensions.tabmix.disableIncompatible": case "extensions.tabmix.selected_tab": case "extensions.tabmix.selected_sub_tab1": case "extensions.tabmix.selected_sub_tab2": case "extensions.tabmix.selected_sub_tab3": case "extensions.tabmix.selected_sub_tab4": case "extensions.tabmix.selected_sub_tab5": case "extensions.tabmix.selected_sub_tab6": case "extensions.tabmix.reload_time": case "extensions.tabmix.custom_reload_time": case "extensions.tabmix.resume_session_once": break; case "extensions.tabmix.focusTab": if (gIsFirefox2) gPref.setBoolPref("browser.tabs.selectOwnerOnClose", gPref.getIntPref(prefName) == 2); break; case "extensions.tabmix.disableF9Key": this.toggleKey("key_tm_toggleFLST", prefName); break; case "extensions.tabmix.disableF8Key": this.toggleKey("key_tm_slideShow", prefName); break; case "extensions.tabmix.hideIcons": this.setMenuIcons(); break; case "extensions.tabmix.currentColorCode": this.setColor("currentTab", prefName, "#009900"); break; case "extensions.tabmix.unreadColorCode": this.setColor("unreadTab", prefName, "#FF0000"); break; case "extensions.tabmix.progressColorCode": this.setColor("progress", prefName, "#AAAAFF"); break; case "extensions.tabmix.flexTabs": case "extensions.tabmix.tabXMode": TMupdateSettings(false); case "extensions.tabmix.keepLastTab": case "browser.tabs.tabClipWidth": // don't show close tab button if there is only one blank tab or we keep last tab // or if tab width is smaller then pref and not in flexTabs mode. adjustCloseButtons(1); break; case "extensions.tabmix.tabBarPosition": gTabbarPosition = TMP_getIntPref (tabxBranch, "tabBarPosition", 0); adjustSafebrowsingDimArea(); break; case "extensions.tabmix.useGreyCloseButton": this.tabCloseButton(); break; case "extensions.tabmix.undoClose": if (!tabxPrefs.getBoolPref("undoClose")) { gPref.setIntPref("browser.sessionstore.max_tabs_undo", 0); tabxPrefs.setIntPref("undoCloseCache", 0); } break; case "extensions.tabmix.undoCloseCache": var cache = gPref.getIntPref(prefName); if (cache > 0 && !tabxPrefs.getBoolPref("undoClose")) tabxPrefs.setBoolPref("undoClose", true); gPref.setIntPref("browser.sessionstore.max_tabs_undo", cache); SessionManager.updateSettings(); break; case "browser.sessionstore.max_tabs_undo": var cache = gPref.getIntPref(prefName); if (cache > 0 && !tabxPrefs.getBoolPref("undoClose")) tabxPrefs.setBoolPref("undoClose", true); tabxPrefs.setIntPref("undoCloseCache", cache); break; case "browser.sessionstore.enabled": TMP_SessionStore.setService(1, false); // initialize nsISessionStore if necessary if (gIsFirefox2 && TMP_getBoolPref("", prefName, true) && !window.__SSi) { TMP_SessionStore.init(true); } break; case "extensions.tabmix.sessions.manager": case "extensions.tabmix.sessions.crashRecovery": TMP_SessionStore.setService(2, false); SessionManager.updateSettings(); break; case "browser.link.open_external": case "browser.link.open_newwindow.restriction": case "browser.link.open_newwindow": this.setLink_openPrefs(); break; case "extensions.tabmix.singleWindow": this.setSingleWindowUI(); break; default: TMupdateSettings(false); } }, tabCloseButton: function() { var useNewCloseIcon; try { useNewCloseIcon = tabxPrefs.getBoolPref("useGreyCloseButton"); } catch(er) { useNewCloseIcon = true; } if (useNewCloseIcon && !(/^Mac/.test(navigator.platform)) ) getBrowser().mTabContainer.removeAttribute("dontUseNewCloseIcon"); else getBrowser().mTabContainer.setAttribute("dontUseNewCloseIcon", "true"); }, toggleKey: function(keiID, prefName) { var key = document.getElementById(keiID); if (TMP_getBoolPref("", prefName, false)) { if (key.hasAttribute("oncommand")) key.removeAttribute("oncommand"); } else key.setAttribute("oncommand", key.getAttribute("TM_oncommand")); }, // in 0.3.0.605 we changed tab color from old pref to new pref // old pref "extensions.tabmix.currentColor" type integer // new pref "extensions.tabmix.currentColorCode" type string setNewColorCode: function(colorType, OldprefName, defaultPref) { var prefName = OldprefName + "Code"; if (gPref.prefHasUserValue(OldprefName)) { var colorCodes = ["#CF1919", "#0E36EF", "#DDDF0D", "#3F8F3E", "#E066FF", "#86E7EF", "#FFFFFF", "#7F7F7F", "#000000", "#EF952C", "#FF82AB", "#7F4C0F", "#AAAAFF"]; var colorCode = colorCodes[gPref.getIntPref(OldprefName)]; gPref.clearUserPref(OldprefName); if (gPref.getCharPref(prefName) != colorCode) { gPref.setCharPref(prefName , colorCode); // this trigger call to setColor for this prefName return; } } this.setColor(colorType, prefName, defaultPref); }, colorRules: {}, setColor: function(colorType, prefName, defaultPref) { var colorCode = TMP_getCharPref("", prefName, defaultPref); var colorRule, _style; switch (colorType) { case "currentTab": _style = "color"; colorRule = 'tabs[currentTab=true][useCurrentColor=true] tab[selected="true"] .tab-text { color:' + colorCode + '}'; break; case "unreadTab": _style = "color"; colorRule = 'tabs[unreadTab=true][useUnreadColor=true] tab:not([selected]) .tab-text { color:' + colorCode + '}'; break; case "progress": _style = "backgroundColor"; colorRule = 'tabs[useProgressColor=true] tab .progress-bar { background-color:' + colorCode + '}'; break; } var ss = document.styleSheets[0]; if (this.colorRules[colorType]) this.colorRules[colorType].style[_style] = colorCode; else { var index = ss.insertRule(colorRule, ss.cssRules.length); this.colorRules[colorType] = ss.cssRules[index]; } }, // sync between "browser.sessionstore.max_tabs_undo" // and "extensions.tabmix.undoCloseCache" maxTabsUndo: function() { var TMP_cache = tabxPrefs.getIntPref("undoCloseCache"); var max_tabs_undo = "browser.sessionstore.max_tabs_undo"; var Fx_cache = 0; if (gIsFirefox2) Fx_cache = gPref.getIntPref(max_tabs_undo); var cache = Math.max(TMP_cache, Fx_cache); if (cache != TMP_cache) tabxPrefs.setIntPref("undoCloseCache", cache) if (gIsFirefox2 && cache != Fx_cache) gPref.setIntPref(max_tabs_undo, cache); if (cache > 0 && !tabxPrefs.getBoolPref("undoClose")) tabxPrefs.setBoolPref("undoClose", true); }, setLink_openPrefs: function() { if (!gSingleWindowMode) return; function updateStatus(pref, testVal, test, newVal) { try { var prefValue = gPref.getIntPref(pref); test = test ? prefValue == testVal : prefValue != testVal } catch(e){ test = true; } if (test) gPref.setIntPref(pref, newVal); } updateStatus("browser.link.open_external", 2, true, 3); updateStatus("browser.link.open_newwindow.restriction", 0, false, 0); updateStatus("browser.link.open_newwindow", 2, true, 3); }, // code for Single Window Mode... // disable the "Open New Window action //disable & hides some menuitem setSingleWindowUI: function() { gSingleWindowMode = TMP_getBoolPref(tabxBranch, "singleWindow", false); var newWindowButton = document.getElementById("new-window-button"); if (newWindowButton) newWindowButton.setAttribute("disabled", gSingleWindowMode); var openLink = document.getElementById("context-openlink"); if (openLink) openLink.setAttribute("disabled", gSingleWindowMode); var menuItem; var menuFile = document.getElementById("menu_FilePopup"); if (menuFile) { menuItem = menuFile.getElementsByAttribute("command", "cmd_newNavigator")[0]; if (menuItem) menuItem.setAttribute("hidden", gSingleWindowMode); } var frameMenu = document.getElementById("frame"); if (frameMenu) { menuItem = frameMenu.getElementsByAttribute("oncommand", "gContextMenu.openFrame();")[0]; if (menuItem) menuItem.setAttribute("hidden", gSingleWindowMode); } document.getElementById("tmOpenInNewWindow").hidden = gSingleWindowMode; }, setMenuIcons: function() { function setClass(items, hideIcons) { if (hideIcons) for (var i = 0; i < items.length; ++i) items[i].removeAttribute("class"); else for ( i = 0; i < items.length; ++i) items[i].setAttribute("class", items[i].getAttribute("tmp_iconic")); } var hideIcons = TMP_getBoolPref(tabxBranch, "hideIcons", false); var iconicItems = document.getElementsByAttribute("tmp_iconic", "*"); setClass(iconicItems, hideIcons); iconicItems = document.getElementById("menuedit-tabContextMenu").getElementsByAttribute("tmp_iconic", "*"); setClass(iconicItems, hideIcons); } } function TMtabBarScroll (event) { var tabs = getBrowser().mTabContainer.childNodes; var tabBar = getBrowser().mTabContainer; for (var i = 0; i < tabs.length; i++) tabs[i].setAttribute("showbutton","off"); var ScrollDirection = event.detail > 0 ? 1 : -1; if (gPref.getBoolPref("extensions.tabmix.reversedScroll")) ScrollDirection = -1 * ScrollDirection; var shouldMoveFocus = gPref.getBoolPref("extensions.tabmix.enableScrollSwitch"); if (shouldMoveFocus) tabBar.advanceSelectedTab(ScrollDirection, true); else if ( gPref.getIntPref("extensions.tabmix.tabBarMode") != 2 ) tabBar.collapsedTabs += ScrollDirection; else if ( gPref.getIntPref("extensions.tabmix.tabBarMode") == 2 ) tabBar.rowScroll(ScrollDirection); } function adjustCloseButtons (aNumTabs, oldTab) { // don't show close tab button if there is only one blank tab or we keep last tab var tabBar = getBrowser().mTabContainer; var tabs = tabBar.childNodes; var aTab = aNumTabs == 2 && tabs[0] == oldTab ? tabs[1] : tabs[0]; if (tabs.length == aNumTabs && (TMP_getBoolPref(tabxBranch, "keepLastTab", false) || getBrowser().isBlankTab(aTab))) tabBar.setAttribute("hidebutton", "true"); else if (tabBar.hasAttribute("hidebutton")) tabBar.removeAttribute("hidebutton"); // don't show close tab button if tab width is smaller then pref and not in flexTabs mode setTimeout( function(tabBar) { // make sure not to check collapsed tab for width var width = tabBar.lastChild.boxObject.width; // 0 width is an invalid value and indicates an item without display, // so ignore. var tabClipWidth = TMP_getIntPref("", "browser.tabs.tabClipWidth", 140); var attributeChanged = false; if (addtabx != 5 || flexTabs || width > tabClipWidth || width == 0) { if (tabBar.hasAttribute("tinywidth")) { tabBar.removeAttribute("tinywidth"); attributeChanged = true; } } else if (!tabBar.hasAttribute("tinywidth")) { tabBar.setAttribute("tinywidth", "true"); attributeChanged = true; } if (attributeChanged) { tabBarScrollStatus(); checkBeforeAndAfter(); } }, 0, tabBar); } // in Firefox 2.0 + with safebrowsing // if the current Browser has problem and message is showing we need to // repaint the "safebrowsing-dim-area-canvas" if we add or remove tabs and // if we change tabbar position function adjustSafebrowsingDimArea() { if (!gIsFirefox2) return; var sbC = safebrowsing.controller; if (sbC == null) return; var browser = getBrowser().selectedBrowser; if (sbC.browserView_.hasProblem(browser)) { var displayer = sbC.browserView_.getCurrentProblem_(browser).displayer_; if (displayer.messageShowing_) { displayer.hideMessage_(); displayer.showMessage_(); } } } function TMP_getBoolPref(branch, prefname, def ) { try { if (!gPref) gPref = getPref(); return gPref.getBoolPref(branch+prefname); } catch(er) { gPref.setBoolPref(branch+prefname, def); return def; } } function TMP_getIntPref(branch, prefname, def ) { try { if (!gPref) gPref = getPref(); return gPref.getIntPref(branch+prefname); } catch(er) { gPref.setIntPref(branch+prefname, def); return def; } } function TMP_getCharPref(branch, prefname, def ) { try { if (!gPref) gPref = getPref(); return gPref.getCharPref(branch+prefname); } catch(er) { gPref.setCharPref(branch+prefname, def); return def; } } function getPref() { return Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); } var TMP_ProgressListener = { init: function TMP_PL_init(progressListener) { var _this = "TMP_ProgressListener." /* // XXX this is not working in firefox 1.0.x ??? eval("progressListener.onProgressChange = " + progressListener.onProgressChange.toString() .replace(/}$/, 'this.onStateChange(aWebProgress, aRequest);' + _this + 'setTabProgress(this.mTab, aMaxTotalProgress, aCurTotalProgress); \ $&')); */ function addToTheEnd(fnName, newString) { var fnString = progressListener[fnName].toString(); fnString = fnString.substr(0, fnString.length - 2) + newString + "}"; eval("progressListener." + fnName + " = " + fnString); } addToTheEnd('onProgressChange', 'this.onStateChange(aWebProgress, aRequest);' + _this + 'setTabProgress(this.mTab, aMaxTotalProgress, aCurTotalProgress);'); // we need to be compatible with XHTML Ruby Support var fnName = "onStateChange"; var ruby = "__rubysupport__" + fnName; if (ruby in progressListener) fnName = ruby; eval("progressListener." + fnName + " = " + progressListener[fnName].toString().replace( 'this.mTab.setAttribute("busy", "true");', '$&' + _this + "setTabWidth(this.mTab, this.mBrowser);" ).replace( 'var location = aRequest.QueryInterface(nsIChannel).URI;', _this + 'setUnreadTab(this.mTab); \ $&')); addToTheEnd(fnName, _this + 'setAutoReload(this.mTab, this.mBrowser, aStateFlags);'); // XXX how to do this with Regexp and replace ? var string = "if (this.mTabBrowser.mCurrentTab == this.mTab)"; var split_fn = progressListener[fnName].toString().split(string); split_fn[1] += _this + 'updateSessionManager(this.mTab);' eval("progressListener." + fnName + " = " + split_fn.join(string)); addToTheEnd('onLocationChange', _this + 'adjustCloseButtons(this.mTab, aLocation.spec);' + (gIsFirefox2 ? _this + 'fixBug355253(this.mBrowser);' : '')); return progressListener; }, setTabProgress: function TMP_PL_setTabProgress(aTab, aMaxTotalProgress, aCurTotalProgress) { if (aMaxTotalProgress < 1) return; var percentage = parseInt((aCurTotalProgress * 100) / aMaxTotalProgress); if (percentage > 0 && percentage < 100) { aTab.setAttribute("tab-progress", percentage); this.adjustCloseButtons(aTab); } }, setTabWidth: function TMP_PL_setTabWidth(aTab, aBrowser) { if (flexTabs && max_width != min_width && !aTab.hasAttribute("width") && aTab.label != gBrowser.mStringBundle.getString("tabs.untitled")) { var uri = aBrowser.currentURI; if (uri && uri.spec != aTab.label && uri.spec != "about:blank") aTab.setAttribute("width", aTab.boxObject.width); } }, setUnreadTab: function TMP_PL_setUnreadTab(aTab) { aTab.removeAttribute("tab-progress"); if (gPref.getBoolPref("extensions.tabmix.unreadTab") && aTab.hasAttribute("selected") && gPref.getBoolPref("extensions.tabmix.unreadTabreload") && aTab.getAttribute("selected") == "false") aTab.removeAttribute("selected"); }, updateSessionManager: function TMP_PL_updateSessionManager(aTab) { if (aTab.label != gBrowser.mStringBundle.getString("tabs.loading")) SessionManager.tabLoaded(aTab); }, setAutoReload: function TMP_PL_setAutoReload(aTab, aBrowser, aStateFlags) { const nsIWebProgressListener = Components.interfaces.nsIWebProgressListener; if ((aStateFlags & nsIWebProgressListener.STATE_IS_WINDOW) && (aStateFlags & nsIWebProgressListener.STATE_STOP)) { if (aTab.autoReloadURI) gBrowser.onTabReloaded(aTab, aBrowser); // disabled name for locked tab, so locked tab don't get reuse if (aTab.getAttribute("locked") && aBrowser.contentWindow.name) aBrowser.contentWindow.name = ""; } }, adjustCloseButtons: function TMP_PL_adjustCloseButtons(aTab, aUri) { if (typeof(aUri) == "undefined") aUri = aTab.parentNode.parentNode.parentNode.parentNode.getBrowserForTab(aTab).currentURI.spec; if (aUri == "about:blank") return; var tabBar = aTab.parentNode; if (tabBar.childNodes.length == 1 && !TMP_getBoolPref(tabxBranch, "keepLastTab", false) && tabBar.hasAttribute("hidebutton")) tabBar.removeAttribute("hidebutton"); }, // XXX temp fix to bug 355253 // recently closed tabs doesn't saved closed tab if it have "about:blank" first in history. fixBug355253: function TMP_PL_fixBug355253(aBrowser) { var history = aBrowser.webNavigation.sessionHistory; if (history && history.count == 2 && history.index == 1 && history.getEntryAtIndex(0, false).URI.spec == "about:blank") { aBrowser.observe(null, "browser:purge-session-history", null); var backCommand = document.getElementById("Browser:Back"); if (backCommand) backCommand.setAttribute("disabled", "true"); } } } PK {6OKXKX!content/tabmixplus/tab/tabmix.xml %identityDTD; %tabmixDTD; ]> false false 0 0 0 0 0 this._collapsedTabs && this.rightEnd ) { this.canScrollTabsRight = false; val = this._collapsedTabs; return val; } if ( val < 0 ) val = 0; for(i = 0; i < val; i++) tabs[i].collapsed = true; for(i = val; i < tabs.length; i++) tabs[i].collapsed = false; this._collapsedTabs = val; this.canScrollTabsLeft = (val != 0); this.canScrollTabsRight = !this.rightEnd; return val; ]]> tabs.length - 1) return false; var tab = tabs[aIndex]; var tabhbox = document.getElementById("scroll-tabs-frame"); if (this.collapsedTabs > aIndex) return false; if ( gPref.getIntPref("extensions.tabmix.tabBarMode") != 2 ) { if (tab.boxObject.x + tab.boxObject.width > tabhbox.boxObject.x + tabhbox.boxObject.width) return false; } else if ( this.getAttribute("multibar") == "scrollbar" ) { if ( tab.baseY > this.parentNode.boxObject.y + this.parentNode.boxObject.height + 2) return false; } return true; ]]> tabs.length - 1) return; var tab = tabs[aIndex]; var amount, i, j; var tabhbox = document.getElementById("scroll-tabs-frame"); if ( tabhbox.boxObject.width < 250 ) return; if ( gPref.getIntPref("extensions.tabmix.tabBarMode") != 2 ) { if(aIndex < this.collapsedTabs) this.collapsedTabs = aIndex; else { var amountToCollapse = tab.boxObject.x + tab.boxObject.width - tabhbox.boxObject.x - tabhbox.boxObject.width; if(amountToCollapse > 0) { amount = 0; i = this.collapsedTabs; while(amount < amountToCollapse) { amount += tabs[i].boxObject.width; i++; } this.collapsedTabs = i; } } } else if ( this.getAttribute("multibar") == "scrollbar" ) { if (aIndex < this.collapsedTabs) { while (aIndex < this.collapsedTabs) this.rowScroll(-1); } else { var bottom = this.parentNode.boxObject.y + this.parentNode.boxObject.height + 2; while (tab.baseY > bottom ) this.rowScroll(+1); } } ]]> 0 && inSameRow(tabs[i], tabs[j]) ) tabs[--i].collapsed = false; } else { while ( inSameRow(tabs[i], tabs[j]) ) i++; } if (i != j) this.collapsedTabs = i; ]]> PK ֌=6Oba00%content/tabmixplus/tab/tabmix_old.xml %identityDTD; %tabmixDTD; ]> 0 this._collapsedTabs && this.rightEnd ) { this.canScrollTabsRight = false; val = this._collapsedTabs; return val; } if ( val < 0 ) val = 0; for(i = 0; i < val; i++) tabs[i].collapsed = true; for(i = val; i < tabs.length; i++) tabs[i].collapsed = false; this._collapsedTabs = val; this.canScrollTabsLeft = (val != 0); this.canScrollTabsRight = !this.rightEnd; return val; ]]> tabs.length - 1) return false; var tab = tabs[aIndex]; var tabhbox = document.getElementById("scroll-tabs-frame"); if (this.collapsedTabs > aIndex) return false; if ( gPref.getIntPref("extensions.tabmix.tabBarMode") != 2 ) { if (tab.boxObject.x + tab.boxObject.width > tabhbox.boxObject.x + tabhbox.boxObject.width) return false; } else if ( this.getAttribute("multibar") == "scrollbar" ) { if ( tab.baseY > this.parentNode.boxObject.y + this.parentNode.boxObject.height + 2) return false; } return true; ]]> tabs.length - 1) return; var tab = tabs[aIndex]; var amount, i, j; var tabhbox = document.getElementById("scroll-tabs-frame"); if ( tabhbox.boxObject.width < 250 ) return; if ( gPref.getIntPref("extensions.tabmix.tabBarMode") != 2 ) { if(aIndex < this.collapsedTabs) this.collapsedTabs = aIndex; else { var amountToCollapse = tab.boxObject.x + tab.boxObject.width - tabhbox.boxObject.x - tabhbox.boxObject.width; if(amountToCollapse > 0) { amount = 0; i = this.collapsedTabs; while(amount < amountToCollapse) { amount += tabs[i].boxObject.width; i++; } this.collapsedTabs = i; } } } else if ( this.getAttribute("multibar") == "scrollbar" ) { if (aIndex < this.collapsedTabs) { while (aIndex < this.collapsedTabs) this.rowScroll(-1); } else { var bottom = this.parentNode.boxObject.y + this.parentNode.boxObject.height + 2; while (tab.baseY > bottom ) this.rowScroll(+1); } } ]]> 0 && inSameRow(tabs[i], tabs[j]) ) tabs[--i].collapsed = false; } else { while ( inSameRow(tabs[i], tabs[j]) ) i++; } if (i != j) this.collapsedTabs = i; ]]> PK 6content/tabmixplus/session/PK 35R7##+content/tabmixplus/session/promptservice.js var dialogParams, gHideElmParam, gSavedName, gCancelLabel, gOrigName; function prompt_init() { dialogParams = window.arguments[0].QueryInterface(Components.interfaces.nsIDialogParamBlock); document.title = dialogParams.GetString(0); // display the main text var i, messageText = dialogParams.GetString(1); var messageParent = document.getElementById("tm_info"); var messageParagraphs = messageText.split("\n"); gHideElmParam = dialogParams.GetInt(1); for (i = 0; i < messageParagraphs.length; i++) { var descriptionNode = document.createElement("description"); var text = document.createTextNode(messageParagraphs[i]); descriptionNode.appendChild(text); messageParent.appendChild(descriptionNode); } // display the menulist gHideElmParam = dialogParams.GetInt(1); var menuList = document.getElementById("tm_prompt"); if (gHideElmParam == SHOW_MENULIST) { var index, isDisabled, popup = document.getElementById("tm_prompt_menu"); SessionManager.createMenuForDialog(popup, dialogParams.GetInt(3)); switch ( dialogParams.GetInt(3) ) { case SELECT_CRASH: index = popup.childNodes.length - 1; break; case SHOW_CLOSED_WINDOW_LIST: index = 1; // 0 is menuseparator break; default: index = menuList.defaultIndex; if (index >= popup.childNodes.length || index < 0) index = 1; isDisabled = popup.childNodes[index].getAttribute("disabled") == "true"; // select the first entry that isn't menuseparator and not "disabled" if (!isDisabled) break; var item; for (i = 1; i < popup.childNodes.length; ++i) { item = popup.childNodes[i]; if (item.localName == "menuseparator") continue; if (item.getAttribute("disabled") != "true") { index = i; break; } } } menuList.selectedIndex = index; } else menuList.hidden = true; // display the textBox var textBox = document.getElementById("tm_textbox"); if (gHideElmParam == SHOW_TEXTBOX) { messageParent.lastChild.setAttribute("style","height:3em"); gSavedName = dialogParams.GetString(2).split("\n"); textBox.value = gSavedName.shift(); gOrigName = textBox.value.toLowerCase(); } else textBox.hidden = true; // display the checkbox var checkBox = document.getElementById("tm_checkbox"); var check = dialogParams.GetInt(2); if (check != HIDE_CHECKBOX) { document.getElementById("checkboxContainer").removeAttribute("collapsed"); checkBox.checked = check == CHECKBOX_CHECKED; setLabelForNode(checkBox, dialogParams.GetString(3)); } // display the command buttons var aButtons, buttons = ["accept", "cancel", "extra1"]; var btnLabels = dialogParams.GetString(4).split("\n"); var maxWidth = 0; for (i = 0; i < buttons.length; ++i) { aButtons = document.documentElement.getButton(buttons[i]); if (i < btnLabels.length && btnLabels[i] != "") { setLabelForNode(aButtons, btnLabels[i]); } else aButtons.hidden = true; // hide extra button } // Set and focus default button var dButton = buttons[dialogParams.GetInt(0)]; var dialog = document.documentElement; dialog.defaultButton = dButton; if (gHideElmParam == HIDE_MENUANDTEXT) { // hide menulist & text box and set focus to default Button document.getElementById("space_befor_checkbox").hidden = true; dialog.getButton(dButton).focus(); } if (gHideElmParam == SHOW_TEXTBOX) { dialog.getButton("extra1").hidden = true; gCancelLabel = dialog.getButton("cancel").label; inputText(textBox); } } function prompt_deinit(button) { dialogParams.SetInt(4, button); // ok = 0; cancel = 1; extra1 = 2; dialogParams.SetInt(5, document.getElementById("tm_checkbox").checked); if (gHideElmParam < HIDE_MENUANDTEXT) { if (gHideElmParam == SHOW_MENULIST) { var item = document.getElementById("tm_prompt").selectedItem; dialogParams.SetString(5, item.session); dialogParams.SetInt(6, item.getAttribute("value")); } else dialogParams.SetString(5, document.getElementById("tm_textbox").value); } } function prompt_extra1(button) { prompt_deinit(button); window.close(); } function inputText(textBox) { var btnOK = document.documentElement.getButton("accept"); var btnCancel = document.documentElement.getButton("cancel"); var btnExt = document.documentElement.getButton("extra1"); var msg = []; var bundle_session = document.getElementById("bundle_session_manager"); msg[0] = ""; /* var msg1 = "Name must be at least one letter or number." var msg2 = "This name already in use!" var msg3 = "Are you sure you want to replace the session?" var cLabel = "&Don't Replace"; */ msg[1] = bundle_session.getString("sm.sessionName.msg1"); msg[2] = bundle_session.getString("sm.sessionName.msg2"); msg[3] = msg[2] + ", " + bundle_session.getString("sm.sessionName.msg3"); var cLabel = SessionManager.setLabel("sm.replaceStartup.button1"); var description = document.getElementById("tm_info").lastChild.firstChild; textBox.value = textBox.value.replace(/^[\s]+/g,""); var name = textBox.value.toLowerCase(); var msgReplace, validName = 0; if (name == "") validName = 1; if (validName==0) { for (var i = 0; i < gSavedName.length; i++) { if (name == gSavedName[i].toLowerCase() && gSavedName[i] != "" ) { if (dialogParams.GetInt(3) == DLG_RENAME) { if (gOrigName != name) validName = 2; continue; } validName = 3; dialogParams.SetInt(6, i); break; } } } switch ( validName ) { case 0: if (btnOK.disabled) btnOK.disabled = false; if (btnOK.hidden) btnOK.hidden = false; if (!btnExt.hidden) { btnExt.hidden = true; if (dialogParams.GetInt(3) == DLG_SAVE) setLabelForNode(btnCancel,gCancelLabel); } description.replaceData(0,description.length, ""); document.documentElement.defaultButton = "accept"; break; case 1: case 2: if (btnOK.hidden) btnOK.hidden = false; if (!btnOK.disabled) btnOK.disabled = true; if (!btnExt.hidden) { btnExt.hidden = true; if (dialogParams.GetInt(3) == DLG_SAVE) setLabelForNode(btnCancel,gCancelLabel); } document.documentElement.defaultButton = "cancel"; break; case 3: if (!btnOK.hidden) btnOK.hidden = true; btnExt.hidden = false; if (dialogParams.GetInt(3) == DLG_SAVE) setLabelForNode(btnCancel,cLabel); document.documentElement.defaultButton = "cancel"; break; } description.replaceData(0,description.length, msg[validName]); } function TM_PromptService(intParam, strParam, aWindow) { var dpb = Components.classes["@mozilla.org/embedcomp/dialogparam;1"] .createInstance(Components.interfaces.nsIDialogParamBlock); // intParam[0] - default button accept=0, cancel=1, extra1=2 // intParam[1] - show menuList= 1 , show textBox= 0, hide_both= 2 // intParam[2] - set checkbox checked true=1 , false=0, hide=2 // intParam[3] - flag - for menuList contents: flag to set menu selected item // - for textBox rename: 1 , save: 0 var i; for (i = 0; i < intParam.length; i++) dpb.SetInt(i, intParam[i]); // strParam labels for: title, msg, testbox.value, checkbox.label, buttons[] // buttons[]: labels array for each button for (i = 0; i < strParam.length; i++) dpb.SetString(i, strParam[i]); var ww = Components.classes["@mozilla.org/embedcomp/window-watcher;1"] .getService(Components.interfaces.nsIWindowWatcher); if (typeof(aWindow) == "undefined") { try { aWindow = window; } catch (e) { aWindow = null; } } ww.openWindow(aWindow, "chrome://tabmixplus/content/session/promptservice.xul","",'centerscreen,modal',dpb); return {button: dpb.GetInt(4), checked: (dpb.GetInt(5) == CHECKBOX_CHECKED), label: dpb.GetString(5), value: dpb.GetInt(6)}; } PK !4VV,content/tabmixplus/session/promptservice.xul PK 沼6~+==%content/tabmixplus/session/session.jsconst gRDFRoot = "rdf://tabmix"; const HSitems = 3; // in history we have title, url, scrollpos var NC_TM = []; var gSessionPath = ["", "", "", ""]; var nsIPrefServiceObj = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService); var SessionPref = nsIPrefServiceObj.getBranch("extensions.tabmix.sessions."); var gThisWin = null; var gThisWinTabs = null; var gThisWinClosedtabs = null; var tmSHEntry = Components.interfaces.nsISHEntry; var tmSHistory = Components.interfaces.nsISHistory; var tmRDFResource = Components.interfaces.nsIRDFResource; const BUTTON_OK = 0; const BUTTON_CANCEL = 1; const BUTTON_EXTRA1 = 2; const SHOW_MENULIST = 1; const SHOW_TEXTBOX = 0; const HIDE_MENUANDTEXT = 2; const CHECKBOX_UNCHECKED = 0; const CHECKBOX_CHECKED = 1; const HIDE_CHECKBOX = 2; const SELECT_DEFAULT = 0; const SELECT_LASTSESSION = 1; const SELECT_CRASH = 2; const SHOW_CLOSED_WINDOW_LIST = 3; const DLG_SAVE = 0; const DLG_RENAME = 1; const NO_NEED_TO_REPLACE = -1; function tmLog(aMessage) { var tmConsoleService = Components.classes['@mozilla.org/consoleservice;1'] .getService(Components.interfaces.nsIConsoleService); tmConsoleService.logStringMessage('TabMix: \n' + aMessage); } function object2String(_obj, aMessage) { aMessage = aMessage ? aMessage : ""; var _objS = _obj.toString() + ":\n"; for (var item in _obj) try { _objS += item + " = " + _obj[item] + "\n"; } catch (er) { _objS += item + " = " + "error in this item" + "\n";} tmLog(aMessage + "\n=============== object to string ===============\n" + _objS); return _objS; } /* sanitize privte data by delete the files session.rdf session.old */ var TMP_Sanitizer = { addSanitizeItem: function () { window.removeEventListener('load', TMP_Sanitizer.addSanitizeItem, true); if (typeof Sanitizer != 'function') return; // Sanitizer will execute this Sanitizer.prototype.items['extensions-tabmix'] = { clear : function() { try { TMP_Sanitizer.sanitize(); } catch (ex) { try { Components.utils.reportError(ex); } catch(ex) {} } }, get canClear() { return true; } } }, addMenuItem: function () { var prefs = document.getElementsByTagName('preferences')[0]; var firstCheckbox = document.getElementsByTagName('checkbox')[0]; if (prefs && firstCheckbox) // if this isn't true we are lost :) { var pref = document.createElement('preference'); pref.setAttribute('id', 'privacy.item.extensions-tabmix'); pref.setAttribute('name', 'privacy.item.extensions-tabmix'); pref.setAttribute('type', 'bool'); prefs.appendChild(pref); var check = document.createElement('checkbox'); check.setAttribute('label', tabmixSanitize.label); check.setAttribute('accesskey', tabmixSanitize.accesskey); check.setAttribute('preference', 'privacy.item.extensions-tabmix'); firstCheckbox.parentNode.insertBefore(check, firstCheckbox); if (typeof(gSanitizePromptDialog) == 'object') { pref.setAttribute('readonly', 'true'); check.setAttribute('onsyncfrompreference', 'return gSanitizePromptDialog.onReadGeneric();'); } } }, tryToSanitize: function () { var prefService = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); try { var promptOnSanitize = prefService.getBoolPref("privacy.sanitize.promptOnSanitize"); } catch (e) { promptOnSanitize = true;} // if promptOnSanitize is true we call TMP_Sanitizer.sanitize from Firefox Sanitizer if (promptOnSanitize) return false; try { var sanitizeTabmix = prefService.getBoolPref("privacy.item.extensions-tabmix"); } catch (e) { sanitizeTabmix = false;} if (!sanitizeTabmix) return false; this.sanitize(); return true; }, // XXX need to add test if we fail to delete then alert the user or ....? sanitize: function () { // get file references var dirService = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties); var sessionFile = dirService.get("ProfD", Components.interfaces.nsILocalFile); var sessionFileBackup = sessionFile.clone(); sessionFile.append("session.rdf"); sessionFileBackup.append("session.old"); // remove the files from the disk this.clearDisk(sessionFile); this.clearDisk(sessionFileBackup); // init new DATASource for all open window var enumerator = windowEnumerator(); var wnd, _sessionManager, broadcaster, btn; while ( enumerator.hasMoreElements() ) { wnd = enumerator.getNext(); // clear DATASource delete wnd.gBrowser.windowID; _sessionManager = wnd.SessionManager; _sessionManager.corruptedFile = false; _sessionManager.RDFService.UnregisterDataSource(_sessionManager.DATASource); // init new DATASource _sessionManager.initDATASource(); // disable closed window list button broadcaster = wnd.document.getElementById("tmp_closedwindows"); if (broadcaster) broadcaster.setAttribute("disabled",true); // clear closed tabs and disable the button wnd.gBrowser.closedTabs = []; btn = wnd.document.getElementById("btn_undoclose"); if (btn) btn.setAttribute("disabled", true); } }, clearDisk: function (file) { if (file.exists()) { try { file.remove(false); } catch (ex) { dump(ex + '\n'); } // couldn't remove the file - what now? } } } var SessionData = { docShellItems: ["allowImages","allowSubframes","allowMetaRedirects","allowPlugins","allowJavascript"], tabAttribute: ["protected","locked"], getTabProperties: function(aTab, checkPref) { if (typeof(checkPref) == "undefined") checkPref = false; // pref check is only for session manager var tabProperties = "", temp; for ( var j = 0; j < this.tabAttribute.length; j++ ){ temp = aTab.hasAttribute(this.tabAttribute[j]) ? aTab.getAttribute(this.tabAttribute[j]) : "false"; tabProperties += (temp=="true") ? "1" : "0"; } // if save.permissions is false we save all Permissions as on, so if we change this pref after session // was saved, the session will load with Permissions as on. if (checkPref && !SessionPref.getBoolPref("save.permissions")) return tabProperties + "11111"; var aTabDocShell = gBrowser.getBrowserForTab(aTab).docShell; for ( j = 0; j < this.docShellItems.length; j++ ){ tabProperties += aTabDocShell[this.docShellItems[j]] ? "1" : "0"; } return tabProperties; }, setTabProperties: function(aTab, tabProperties, checkPref) { if (typeof(checkPref) == "undefined") checkPref = false; // pref check is only for session manager var aPermission; var k = this.tabAttribute.length; for ( var j = 0; j < k; j++ ){ //extensions.tabmix.sessions.save.protected && extensions.tabmix.sessions.save.locked if (!checkPref || SessionPref.getBoolPref("save." + this.tabAttribute[j])) { if (tabProperties.charAt(j) == "1") aTab.setAttribute(this.tabAttribute[j], "true"); else if (aTab.hasAttribute(this.tabAttribute[j])) aTab.removeAttribute(this.tabAttribute[j]); } } if (checkPref && !SessionPref.getBoolPref("save.permissions")) return; var aTabDocShell = gBrowser.getBrowserForTab(aTab).docShell; for ( j = 0; j < this.docShellItems.length; j++ ) { aPermission = tabProperties.charAt(j + k) == "1"; if (aTabDocShell[this.docShellItems[j]] != aPermission) aTabDocShell[this.docShellItems[j]] = aPermission; } } } function windowEnumerator() { var WindowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'] .getService(Components.interfaces.nsIWindowMediator); return WindowManager.getEnumerator("navigator:browser"); } function numberOfWindows(all) { var enumerator = windowEnumerator(); var count = 0; while ( enumerator.hasMoreElements() ) { var win = enumerator.getNext(); if (win.SessionManager.windowClosed) continue; count++; if (!all && count == 2) break; } return count; } var SessionManager = { RDFService: null, CONUtils: null, DATASource: null, IOService: null, overwriteWindow: false, saveThisWindow: true, NC_NS : "http://home.netscape.com/NC-rdf#", enableBackup: null, enableManager: null, enableSaveHistory: null, saveClosedtabs: null, corruptedFile: false, // call by TM_init init: function SM_init() { this.enableManager = SessionPref.getBoolPref("manager"); this.enableBackup = SessionPref.getBoolPref("crashRecovery"); this.enableSaveHistory = SessionPref.getBoolPref("save.history"); this.saveClosedtabs = SessionPref.getBoolPref("save.closedtabs") && tabxPrefs.getBoolPref("undoClose"); if (!this.DATASource) this.initService(); var isFirstWindow = numberOfWindows() == 1 && !window.duplicat; var path, status, caller, crashed; if (isFirstWindow) { path = gRDFRoot + "/closedSession/thisSession"; status = this.getLiteralValue(path, "status"); crashed = status.indexOf("crash") != -1; // if this isn't delete on exit, we know next time that firefox crash SessionPref.setBoolPref("crashed" , true); // we use this in setup.js; nsIPrefServiceObj.savePrefFile(null); // store the pref immediately this.setLiteral(path, "status", "crash"); // check if we after restart var afterRestart = false; if (tabxPrefs.prefHasUserValue("resume_session_once")) { afterRestart = tabxPrefs.getBoolPref("resume_session_once"); tabxPrefs.clearUserPref("resume_session_once"); } if (!this.enableManager && (!this.enableBackup || !crashed)) { // we not after crash and session manager not enabled ... // we delete previous closed session this.removeAllClosedSession(); this.dataFlush(); return; } if (crashed) this.openAfterCrash(status); else if (this.enableManager) // this.openFirstWindow(false, afterRestart); // XXX don't do auto restore after restart until we fix some bugs.... this.openFirstWindow(false, false); if (tabxPrefs.prefHasUserValue("warnAboutClosingTabs.timeout")) tabxPrefs.clearUserPref("warnAboutClosingTabs.timeout") } else if (this.enableManager && "tabmixdata" in window) { path = window.tabmixdata.path; caller = window.tabmixdata.caller; if (caller == "concatenatewindows") this.loadSession(path, caller, false); else this.loadOneWindow(path, "windowopenebytabmix"); } if (this.enableManager) this.updateClosedWindowsMenu("check"); this.dataFlush(); }, // call by TM_deinit deinit: function SM_deinit(isLastWindow, askBeforSave, startTime) { // When Exit Firefox: // pref "extensions.tabmix.sessions.onClose" // 0 - Save // 1 - Ask me Befor Save // 2 (or else) - Don't Save // we check this when last window is about to close for all other window the session is saved // in closed window list. // in the last window if the user pref in not to save we delete the closed window list. if (this.windowClosed) return; this.windowClosed = true; // check if we need to sanitize on exit without prompt to user try { if (!gIsOldBrowser && isLastWindow && gPref.getBoolPref("privacy.sanitize.sanitizeOnShutdown")) { // if tryToSanitize is false and privacy.sanitize.promptOnSanitize is true // we call TMP_Sanitizer.sanitize from Firefox Sanitizer if (TMP_Sanitizer.tryToSanitize()) return; } } catch (err) {} var closedWinList = document.getElementById("tmp_closedwindows").getAttribute("disabled"); if (this.enableManager && this.saveThisWindow) { for (var i = 0; i < gBrowser.mTabs.length; i++) gBrowser.mTabs[i].removeAttribute("inrestore"); this.saveOneWindow(gSessionPath[0], "windowclosed"); } if (isLastWindow) { if ( this.enableManager ) { var result = {}, saveClosedTabs; result.button = SessionPref.getIntPref("onClose"); result.checked = saveClosedTabs = this.saveClosedtabs; // firefox closed by restart, always save the session // XXX don't do auto restore after restart until we fix some bugs.... // if (!askBeforSave) { // tabxPrefs.setBoolPref("resume_session_once", true); if (result.button == 1 && !askBeforSave) { result.button = BUTTON_OK; } // delete closed windows var pref = "extensions.tabmix.warnAboutClosingTabs.timeout"; var delay = gPref.prefHasUserValue(pref) ? gPref.getCharPref(pref)*1 : 0; var curTime = !startTime ? new Date().valueOf() - delay : startTime - delay; var rdfNodeClosedWindows = this.RDFService.GetResource(gSessionPath[0]); var sessionContainer = this.initContainer(rdfNodeClosedWindows); this.checkTime(sessionContainer, curTime); this.deleteWithProp(sessionContainer, "dontLoad"); // count windows and tabs in this session var count = this.countWinsAndTabs(sessionContainer); if (count.win > 0 && count.tab > 0 && result.button == 1) { // Ask me Befor Save document.getElementById("tmp_closedwindows").setAttribute("disabled", closedWinList); window.focus(); var bundle_session = document.getElementById("bundle_session_manager"); var title = bundle_session.getString("sm.askBeforSave.title"); var msg = bundle_session.getString("sm.askBeforSave.msg0") + "\n\n" + bundle_session.getString("sm.askBeforSave.msg1"); var chkBoxLabel = bundle_session.getString("sm.saveClosedTab.chkbox.label"); var chkBoxState = saveClosedTabs ? CHECKBOX_CHECKED : HIDE_CHECKBOX; var buttons = [this.setLabel("sm.askBeforSave.button0"), this.setLabel("sm.askBeforSave.button1")].join("\n"); result = TM_PromptService([BUTTON_CANCEL, HIDE_MENUANDTEXT, chkBoxState], [title, msg, "", chkBoxLabel, buttons]); } if (result.button == BUTTON_OK) { this.setLiteral(rdfNodeClosedWindows, "nameExt", this.getNameData(count.win, count.tab)); // delete closed tab list for this session if (saveClosedTabs && !result.checked) this.deleteAllClosedtabs(sessionContainer); } else // delete the closed window list. this.deleteSubtree(gSessionPath[0]); } if (this.enableBackup) this.deleteSession(gSessionPath[3]); if (tabxPrefs.prefHasUserValue("warnAboutClosingTabs.timeout")) tabxPrefs.clearUserPref("warnAboutClosingTabs.timeout"); if (SessionPref.prefHasUserValue("crashed")) SessionPref.clearUserPref("crashed"); // we use this in setup.js; nsIPrefServiceObj.savePrefFile(null); // store the pref immediately this.setLiteral(gRDFRoot + "/closedSession/thisSession", "status", ""); if (!this.enableManager && !this.enableBackup) this.deleteSession(gSessionPath[0]); this.dataFlush(); } }, // XXX split this for each pref that has change // XXX need to update after permissions, locked, locked updateSettings: function() { // list of session manager pref // sessions.manager - ok // sessions.crashRecovery - ok // sessions.save.closedtabs - ok // sessions.save.history - ok // sessions.save.permissions - ok (update evry time this function run because lock is change) // sessions.save.locked - ok (update evry time this function run because lock is change) // sessions.save.protected - ok (update evry time this function run because lock is change) // sessions.save.selectedtab - ok // xxx sessions.save.scrollposition - ok (update with history) // xxx need to divide it // undoClose - // undoCloseCache - // var sessionManager = tabxPrefs.getBoolPref("sessions.manager"); var crashRecovery = tabxPrefs.getBoolPref("sessions.crashRecovery"); var enableClosedtabs = tabxPrefs.getBoolPref("sessions.save.closedtabs"); var enableSaveHistory = tabxPrefs.getBoolPref("sessions.save.history"); var undoClose = tabxPrefs.getBoolPref("undoClose"); var cache = tabxPrefs.getIntPref("undoCloseCache"); // hide or show session manager buttons & menus document.getElementById("tm-sessionmanager").hidden = !sessionManager || !tabxPrefs.getBoolPref("sessionToolsMenu"); var hiddenPref = !sessionManager || !tabxPrefs.getBoolPref("closedWinToolsMenu"); document.getElementById("tm-sm-closedwindows").hidden = hiddenPref; document.getElementById("tm-sm-closedwindows2").hidden = !hiddenPref; var button = document.getElementById("btn_sessionmanager"); if (button) button.setAttribute("disabled",!sessionManager); // we dont need this function to run befor sessionmanager init // this.enableBackup=null so we dont past the next if if (!this.DATASource) return; var windowSaved = false, closedTabSaved = false; if (this.enableBackup != crashRecovery) { if (crashRecovery) { // save all open window and tab this.saveAllWindows(gSessionPath[0], "windowbackup"); windowSaved = true; } else { // remove all backup this.deleteSession(gSessionPath[0], "status", "backup"); this.deleteSession(gSessionPath[3]); this.initSession(gSessionPath[0], gThisWin); this.dataFlush(); } this.enableBackup = crashRecovery; } var winPath = gThisWin; if (crashRecovery) this.tabSelected(); // this is fast so we dont check if the pref is changed ( just for now) if (this.enableManager != sessionManager) { this.enableManager = sessionManager; } if (undoClose) { while ( gBrowser.closedTabs.length > cache ) getClosedTab('delete', 0); // delete extra closedTabs from closedtabs list and session.RDF } else if (gBrowser.closedTabs.length > 0) delayRestoreTab("original", -1); // flush closedtabs list and session.RDF if (this.saveClosedtabs != enableClosedtabs && undoClose) { this.saveClosedtabs = enableClosedtabs && undoClose; if (enableClosedtabs) { // save if gBrowser.closedTabs.length > 0 and we save backup and save closedtab backup if (crashRecovery && gBrowser.closedTabs.length > 0 && undoClose) { this.initSession(gSessionPath[0], winPath); this.copyClosedTabsToRDF(winPath); } closedTabSaved = true; } else { // if undoClose = false we delete all above if (undoClose) this.deleteWinClosedtabs(winPath); // flush only closedTabs list in session.RDF } } if (this.enableSaveHistory != enableSaveHistory) { this.enableSaveHistory = enableSaveHistory; if (crashRecovery) { if (!windowSaved) this.saveAllTab(winPath, 0); if (!closedTabSaved && enableClosedtabs && gBrowser.closedTabs.length > 0 && undoClose) { this.initSession(gSessionPath[0], winPath); this.deleteWinClosedtabs(winPath); this.copyClosedTabsToRDF(winPath); closedTabSaved = true; } } } if (closedTabSaved) { this.initSession(gSessionPath[0], gThisWin); this.dataFlush(); } }, loadHomePage: function() { var homePage = gHomeButton.getHomePage(); if (homePage == window.arguments[0]) { this.setStripVisibility(homePage.split("|").length); BrowserHome(); if (!gBrowser.isBlankBrowser(gBrowser.mCurrentBrowser)) content.focus(); } else if (gBrowser.mCurrentTab.loadOnStartup) for (var i = 0; i < gBrowser.mTabs.length ; i++) delete gBrowser.mTabs[i].loadOnStartup; else gBrowser.mCurrentBrowser.reload(); }, // init common services initService: function() { this.RDFService = Components.classes["@mozilla.org/rdf/rdf-service;1"] .getService(Components.interfaces.nsIRDFService); this.CONUtils = Components.classes["@mozilla.org/rdf/container-utils;1"] .getService(Components.interfaces.nsIRDFContainerUtils); this.IOService = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); this.setNC_TM(); this.initDATASource(); }, initDATASource: function SM_initDATASource() { var file = this.profileDir; file.append("session.rdf"); var uri = this.IOService.newFileURI(file).spec; try { this.DATASource = this.RDFService.GetDataSourceBlocking(uri); } catch (e) { // corrupted session.rdf var bundle_session = document.getElementById("bundle_session_manager"); var title = bundle_session.getString("sm.corrupted.title"); var msg = bundle_session.getString("sm.corrupted.msg0") + "\n" + bundle_session.getString("sm.corrupted.msg1"); var buttons = ["", this.setLabel("sm.button.continue")].join("\n"); TM_PromptService([BUTTON_CANCEL, HIDE_MENUANDTEXT, HIDE_CHECKBOX],[title, msg, "", "", buttons]); tmLog(e); file.moveTo(this.profileDir, "session.old"); this.DATASource = this.RDFService.GetDataSourceBlocking(uri); this.corruptedFile = true; } // set path to session type var path = gRDFRoot + "/closedSession/"; var sessionType = ["thisSession", "lastSession", "previoustolastSession", "crashedsession"]; var closedSession = this.initContainer(path); var i, aEntry; if (closedSession.GetCount()==0) { // create the list for (i = 0; i < sessionType.length; i++) { aEntry = this.RDFService.GetResource(path + sessionType[i]); this.setResource(aEntry, "session", gRDFRoot + "/closed" + i + "/window"); closedSession.AppendElement(aEntry); } } for (i = 0; i < sessionType.length; i++) { gSessionPath[i] = this.getResourceValue(path + sessionType[i], "session"); } if (typeof(gBrowser) == "object" && !gBrowser.windowID) { gBrowser.windowID = this.RDFService.GetAnonymousResource().Value.split("rdf:")[1]; gThisWin = gSessionPath[0] + "/" + gBrowser.windowID; gThisWinTabs = gThisWin + "/tabs"; gThisWinClosedtabs = gThisWin + "/closedtabs"; } }, get profileDir() { return Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get("ProfD", Components.interfaces.nsILocalFile); }, setNC_TM: function() { var rdfLabels = ["tabs","closedtabs","index","history","properties","selectedIndex", "timestamp","title","url","dontLoad","reOpened","name","nameExt","session", "status","tabPos","image","scroll","winFeatures"]; for (var i = 0; i < rdfLabels.length; i++) { NC_TM[rdfLabels[i]] = this.RDFService.GetResource(this.NC_NS + rdfLabels[i]); } }, setLabel: function(property, bundleID) { var strimgBundle = bundleID ? document.getElementById(bundleID) : document.getElementById("bundle_session_manager"); var label = strimgBundle.getString(property + ".label"); var key = strimgBundle.getString(property + ".accesskey"); var accessKeyIndex = label.toLowerCase().indexOf(key.toLowerCase()); if (accessKeyIndex > -1) label = label.substr(0, accessKeyIndex) + "&" + label.substr(accessKeyIndex); return label; }, deleteNode: function(rdfNode) { var arcOut = this.DATASource.ArcLabelsOut(rdfNode); while (arcOut.hasMoreElements()) { var aLabel = arcOut.getNext(); if (aLabel instanceof tmRDFResource) { var aTarget = this.DATASource.GetTarget(rdfNode, aLabel, true); this.DATASource.Unassert(rdfNode, aLabel, aTarget); } } }, deleteSubtree: function(labelRoot) { var allElements = this.DATASource.GetAllResources(); while (allElements.hasMoreElements()) { var aResource = allElements.getNext(); if ((aResource instanceof tmRDFResource) && (aResource.Value.indexOf(labelRoot) == 0)) this.deleteNode(aResource); } }, initContainer: function(node) { var pNode = node; if (typeof(node) == "string") node = this.RDFService.GetResource(node); try{ return this.CONUtils.MakeSeq(this.DATASource, node); } catch (e) { tmLog("Error in initContainer" + "\n" + "node = " + pNode + "\n\n" + "caller " + this.initContainer.caller.name); return "error" } }, // return true if node is empty container or node is not container containerEmpty: function(node) { var pNode = node; try{ if (typeof(node) == "string") node = this.RDFService.GetResource(node); if (!this.CONUtils.IsContainer(this.DATASource, node)) return true; return this.CONUtils.IsEmpty(this.DATASource, node); } catch (e) { tmLog("Error in containerEmpty" + "\n" + "node = " + pNode + "\n\n" + "caller " + this.containerEmpty.caller.toString().split(";")[0]); return "error" } }, wrapContainer: function SM_wrapContainer(path, prop) { var root = this.getResource(path, prop); var container = this.initContainer(root); if (container == "error") { tmLog("wrapContainer error path " + path + "\n" + "prop " + prop); return "error"} return { Root: root, Container: container, Enum: container.GetElements(), Count: container.GetCount() } }, getValue: function(node, label, typeID, def) { if (typeof(node) == "string") node = this.RDFService.GetResource(node); label = NC_TM[label]; var rdfNode = this.DATASource.GetTarget(node, label, true); return (rdfNode instanceof Components.interfaces[typeID]) ? rdfNode.Value : def; }, getLiteralValue: function(node, arc, def) { if (typeof(def) == "undefined") def = ""; return this.getValue(node, arc, "nsIRDFLiteral", def); }, getIntValue: function(node, arc, def) { if (typeof(def) == "undefined") def = 0; return this.getValue(node, arc, "nsIRDFInt", def); }, getResourceValue: function(node, arc, def) { if (typeof(def) == "undefined") def = null; return this.getValue(node, arc, "nsIRDFResource", def); }, getResource: function(node, arc) { if (typeof(node) == "string") node = this.RDFService.GetResource(node); arc = NC_TM[arc]; return this.DATASource.GetTarget(node, arc, true); }, nodeHasArc: function(node, arc) { if (typeof(node) == "string") node = this.RDFService.GetResource(node); arc = NC_TM[arc]; return this.DATASource.hasArcOut(node, arc); }, setLiteral: function SM_setLiteral(node, arc, value) { if (typeof(node) == "string") node = this.RDFService.GetResource(node); arc = NC_TM[arc]; value = this.RDFService.GetLiteral(value); this.changeValue(node, arc, value); }, setIntLiteral: function(node, arc, value) { if (typeof(node) == "string") node = this.RDFService.GetResource(node); arc = NC_TM[arc]; value = this.RDFService.GetIntLiteral(value); this.changeValue(node, arc, value); }, setResource: function(node, arc, value) { if (typeof(node) == "string") node = this.RDFService.GetResource(node); arc = NC_TM[arc]; if (typeof(value) == "string") value = this.RDFService.GetResource(value); this.changeValue(node, arc, value); }, changeValue: function(node, arc, newValue) { if (this.DATASource.hasArcOut(node, arc)) { var oldValue = this.DATASource.GetTarget(node, arc, true); if (newValue != oldValue) this.DATASource.Change(node, arc, oldValue, newValue); } else this.DATASource.Assert(node, arc, newValue, true); }, dataFlush: function() { this.DATASource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush(); }, promptReplaceStartup: function(caller, path) { var loadsession = SessionPref.getIntPref("onStart.loadsession"); var sessionpath = SessionPref.getCharPref("onStart.sessionpath"); var result = {button: NO_NEED_TO_REPLACE}; if (loadsession < 0 || sessionpath != path) return result; var label = this.getLiteralValue(path, "name"); var selectionFlag = SELECT_DEFAULT; var title, msg, buttons; var bundle_session = document.getElementById("bundle_session_manager"); var areYouSure = bundle_session.getString("sm.areYouSure.msg"); var chooseStartup = bundle_session.getString("sm.canChooseStartup.msg"); switch ( caller ) { case "addWinToSession": title = bundle_session.getString("sm.addtoStartup.title"); var msgType = caller=="addWinToSession" ? "windows" : "tabs"; msg = bundle_session.getString("sm.addtoStartup.msg." + msgType) + "\n" + label + "\n" + areYouSure + "\n\n" + chooseStartup; buttons = [this.setLabel("sm.addtoStartup.button0"), this.setLabel("sm.addtoStartup.button1")].join("\n"); break; case "replaceSession": title = bundle_session.getString("sm.replaceStartup.title"); msg = bundle_session.getString("sm.replaceStartup.msg") + "\n" + label + "\n" + areYouSure + "\n\n" + chooseStartup; buttons = [this.setLabel("sm.replaceStartup.button0"), this.setLabel("sm.replaceStartup.button1")].join("\n"); break; case "removeSavedSession": title = bundle_session.getString("sm.removeStartup.title"); msg = bundle_session.getString("sm.removeStartup.msg0") + "\n" + label + "\n" + areYouSure + "\n\n" + bundle_session.getString("sm.removeStartup.msg1"); buttons = [this.setLabel("sm.removeStartup.button0"), this.setLabel("sm.removeStartup.button1")].join("\n"); selectionFlag = SELECT_LASTSESSION; break; } return TM_PromptService([BUTTON_OK, SHOW_MENULIST, HIDE_CHECKBOX, selectionFlag], [title, msg, "", "", buttons]); }, addWinToSession: function SM_addWinToSession(action) { if (!this.isValidtoSave()) return; var path = document.popupNode.session; var result = this.promptReplaceStartup("addWinToSession", path); if (result.button == BUTTON_CANCEL) return; else if (result.button == BUTTON_OK) this.replaceStartupPref(result, ""); var saveClosedTabs = this.saveClosedtabs; var rdfNodeSession = this.RDFService.GetResource(path); var sessionContainer = this.initContainer(rdfNodeSession); var oldCount = this.countWinsAndTabs(sessionContainer); var newCount = this.saveOneOrAll(action, path, saveClosedTabs); if (newCount) { var numTabs = oldCount.tab + newCount.tab; var numWindows = oldCount.win + newCount.win; this.setLiteral(rdfNodeSession, "nameExt", this.getNameData(numWindows, numTabs)); this.dataFlush(); } }, saveClosedSession: function SM_saveClosedSession() { var oldPath = document.popupNode.session; var id = this.RDFService.GetAnonymousResource().Value.split("rdf:")[1]; var path = gRDFRoot + "/saved/" + id + "/window"; var pathToReplace = ""; var session = this.getSessionName("saveprevious", this.getLiteralValue(oldPath, "name")); if (session.button == BUTTON_CANCEL) return; // user cancel else if (session.button == BUTTON_EXTRA1) { // we replace exist session, BUTTON_OK - save new session var result = this.promptReplaceStartup("replaceSession", session.path); if (result.button == BUTTON_CANCEL) return; // user cancel else if (result.button == BUTTON_OK) { // we replace startup session this.replaceStartupPref(result, path); } pathToReplace = session.path; } container = this.initContainer(path) var pathNode, container, extID = ""; var node = document.popupNode.parentNode.parentNode; if (node.id.indexOf("tm-sm-closedwindows")==0 || node.id == "btn_closedwindows") extID = "/" + id; this.copySubtree(oldPath, path + extID); if (node.id.indexOf("tm-sm-closedwindows")==0 || node.id == "btn_closedwindows") { node = this.RDFService.GetResource(path + extID); container.InsertElementAt(node, 1, true); this.DATASource.Unassert(node, NC_TM["dontLoad"], this.RDFService.GetLiteral("true")); } var count = this.countWinsAndTabs(container); // we need it just to fix the date if (!session.saveClosedTabs) this.deleteAllClosedtabs(container); if (count) this.insertSession(count, session.name, path, pathToReplace); else tmLog("Error in saveClosedSession"); }, copyNode: function(oldNode, newNode, oldRoot, newRoot) { var newTarget; var arcOut = this.DATASource.ArcLabelsOut(oldNode); while (arcOut.hasMoreElements()) { var aLabel = arcOut.getNext(); if (aLabel instanceof tmRDFResource) { var aTarget = this.DATASource.GetTarget(oldNode, aLabel, true); if (aTarget instanceof tmRDFResource) { newTarget = aTarget.Value.replace(oldRoot, newRoot); aTarget = this.RDFService.GetResource(newTarget); } this.DATASource.Assert(newNode, aLabel, aTarget, true); } } }, copySubtree: function (oldRoot, newRoot) { var allElements = this.DATASource.GetAllResources(); while (allElements.hasMoreElements()) { var aResource = allElements.getNext(); if ((aResource instanceof tmRDFResource) && (aResource.Value.indexOf(oldRoot) == 0)) { var newNodeLabel = aResource.Value.replace(oldRoot, newRoot); this.copyNode(aResource, this.RDFService.GetResource(newNodeLabel), oldRoot, newRoot); } } }, replaceStartupPref: function(result, newPath) { var sessionpath = !newPath ? "--" : SessionPref.getCharPref("onStart.sessionpath"); SessionPref.setIntPref("onStart.loadsession", result.value); if (result.value > -1) { if (result.label == sessionpath ) SessionPref.setCharPref("onStart.sessionpath", newPath); else SessionPref.setCharPref("onStart.sessionpath", result.label); } nsIPrefServiceObj.savePrefFile(null); // store the pref immediately }, sessionUtil: function(action, what) { // action = save , replace // type = thiswindow , allwindows if (!this.isValidtoSave()) return; if (numberOfWindows() == 1) what = "thiswindow"; var oldPath = "", name, saveClosedTabs; var id = this.RDFService.GetAnonymousResource().Value.split("rdf:")[1]; var newPath = gRDFRoot + "/saved/" + id + "/window"; if (action == "save") { // ask the user for new name or for exist name if the user want to replace var session = this.getSessionName("save"+what); if (session.button == BUTTON_CANCEL) return; // user cancel else if (session.button == BUTTON_EXTRA1) oldPath = session.path; name = session.name; saveClosedTabs = session.saveClosedTabs; } else { oldPath = document.popupNode.session; name = this.getLiteralValue(oldPath, "name"); saveClosedTabs = this.saveClosedtabs; } if (oldPath != "") { // oldPath is "" if we save to a new name // check if the user want to replace startup session var result = this.promptReplaceStartup("replaceSession", oldPath); if (result.button == BUTTON_CANCEL) return; // user cancel else if (result.button == BUTTON_OK) this.replaceStartupPref(result, newPath); } var count = this.saveOneOrAll("save"+what, newPath, saveClosedTabs); if (count) this.insertSession(count, name, newPath, oldPath); else tmLog("Error in " + action + " " + what); }, isValidtoSave: function() { if ( !this.enableManager ) return false; var bundle_session = document.getElementById("bundle_session_manager"); if (gBrowser.isBlankWindow()) { var title = bundle_session.getString("sm.title"); var msg = bundle_session.getString("sm.dontSaveBlank.msg"); var buttons = ["", this.setLabel("sm.button.continue")].join("\n"); TM_PromptService([BUTTON_CANCEL, HIDE_MENUANDTEXT, HIDE_CHECKBOX],[title, msg, "", "", buttons]); return false; } return true; }, saveOneOrAll: function(action, path, saveClosedTabs) { var numTabs, numWindows; switch ( action ) { case "savethiswindow": numTabs = this.saveOneWindow(path, "", false, saveClosedTabs); numWindows = 1; break; case "saveallwindows": var didSaved = this.saveAllWindows(path, "", saveClosedTabs); numTabs = didSaved.tab; numWindows = didSaved.win; break; default: return false; } if (numTabs > 0) return {win: numWindows, tab: numTabs}; bundle_session = document.getElementById("bundle_session_manager"); alert(bundle_session.getString("sm.sessoinSave.error")); return false; }, insertSession: function SM_insertSession(count, name, path, oldPath) { var container = this.initContainer(gRDFRoot + "/windows"); var index = 0; if (oldPath != "") index = container.IndexOf(this.RDFService.GetResource(oldPath)); var node = this.RDFService.GetResource(path); container.InsertElementAt(node, index+1, true); if (oldPath != "") { // remove the session we replace container.RemoveElementAt(index, true); this.removeSession(oldPath, gRDFRoot+'/windows'); } this.setLiteral(node, "name", name); this.setLiteral(node, "nameExt", this.getNameData(count.win, count.tab)); this.dataFlush(); return true; }, getSessionName: function(action, old) { var bundle_session = document.getElementById("bundle_session_manager"); var showChebox, closedtabMsg, saveClosedTabs = this.saveClosedtabs; if (action != "rename" && saveClosedTabs) { closedtabMsg = bundle_session.getString("sm.saveClosedTab.chkbox.label"); showChebox = CHECKBOX_CHECKED; } else showChebox = HIDE_CHECKBOX; var msg = bundle_session.getString("sm.sessionName.msg0") + "\n"; var title = bundle_session.getString("sm.sessionName.title." + action); var label, buttons, actionFlag; var sessionList = this.getSessionList("saved"); if (action=="rename") { label = old; buttons = [this.setLabel("sm.sessionName.button0"), this.setLabel("sm.sessionName.button1")].join("\n"); actionFlag = DLG_RENAME; } else { label = action == "saveprevious" ? old : gBrowser.mCurrentTab.label; buttons = [this.setLabel("sm.askBeforSave.button0"), this.setLabel("sm.askBeforSave.button1"), this.setLabel("sm.replaceStartup.button0")+"..."].join("\n"); actionFlag = DLG_SAVE; for (var i = 0; i < sessionList.list.length; i++) { if (label == sessionList.list[i]) { label = ""; break; } } } label = unescape(label + "\n" + sessionList.list.join("\n")); var result = TM_PromptService([BUTTON_OK, SHOW_TEXTBOX, showChebox, actionFlag],[title, msg, label, closedtabMsg, buttons]); switch (result.button) { case BUTTON_CANCEL: return {button: result.button}; case BUTTON_OK: case BUTTON_EXTRA1 : var trimResult = result.label.replace(/^[\s]+/g,"").replace(/[\s]+$/g,""); return {button: result.button, name: escape(trimResult), path: sessionList.path[result.value], saveClosedTabs: result.checked}; } return {}; }, countWinsAndTabs: function SM_countWinsAndTabs(container) { // count windows and tabs in this session var numTabs = 0, numWindows = 0; var windowEnum = container.GetElements(); while (windowEnum.hasMoreElements()) { var rdfNodeWindow = windowEnum.getNext(); numWindows += 1; var rdfNodeTabs = this.getResource(rdfNodeWindow, "tabs"); if (rdfNodeTabs instanceof tmRDFResource) { var tabContainer = this.initContainer(rdfNodeTabs); numTabs += tabContainer.GetCount(); } } return {win: numWindows, tab: numTabs}; }, getNameData: function(numWindows, numTabs) { var d = new Date(); var date = [d.getFullYear(), '/', d.getMonth()<9 ? "0":"", d.getMonth()+1, '/', d.getDate()<10 ? "0":"", d.getDate()].join(''); var time = [d.getHours()<10 ? "0":"", d.getHours(), ':', d.getMinutes()<10 ? "0":"", d.getMinutes(), ':', d.getSeconds()<10 ? "0":"", d.getSeconds()].join(''); var bundle_session = document.getElementById("bundle_session_manager"); var empty = bundle_session.getString("sm.session.empty"); var T = bundle_session.getString("sm.session.tabs"); var W = bundle_session.getString("sm.session.windows"); if (numWindows == 0) return ", (" + empty + ") (" + date + " " + time + ")"; else if (numWindows < 2) return ", (" + numTabs + " "+ T + ") (" + date + " " + time + ")"; return ", (" + numWindows + " " + W + ", " + numTabs + " " + T + ") (" + date + " " + time + ")"; }, updateSessionMenu: function(menu) { var overwriteWindows = SessionPref.getBoolPref("restore.overwritewindows") || gSingleWindowMode; document.getElementById("tm-sm-OpenInCurrenWindow").setAttribute("default",overwriteWindows); document.getElementById("tm-sm-OpenInNewWindow").setAttribute("default",!overwriteWindows); document.getElementById("tm-sm-OpenInNewWindow").hidden = gSingleWindowMode; var mValue = document.popupNode.getAttribute("value"); if (mValue <= -1) document.getElementById("tm-sm-Rename").setAttribute("disabled",true); else document.getElementById("tm-sm-Rename").removeAttribute("disabled"); var node = document.popupNode.parentNode.parentNode; var mItem = document.getElementById("tm-sm-SetAsStartup"); if (node.id == "tm-sessionmanager" || node.id == "btn_sessionmanager") { mItem.removeAttribute("disabled"); if (document.popupNode.hasAttribute("default")) mItem.setAttribute("checked", "true"); else mItem.removeAttribute("checked"); } else { mItem.removeAttribute("checked"); mItem.setAttribute("disabled",true); } var mShowext = document.getElementById("tm-sm-showext"); var showext = SessionPref.getBoolPref("menu.showext"); if (!showext && mShowext.hasAttribute("checked")) mShowext.removeAttribute("checked"); else if (showext && !mShowext.hasAttribute("checked")) mShowext.setAttribute("checked", "true"); var obsAll = document.getElementById("tmp_contextmenu_AllWindows"); var obsThis = document.getElementById("tmp_contextmenu_ThisWindow"); var mSave = document.getElementById("tm-sm-Save"); if (node.id.indexOf("tm-sm-closedwindows")==0 || node.id == "btn_closedwindows" || mValue <= -1) { if (obsAll.hidden != true) obsAll.hidden = true; if (obsThis.hidden != true) obsThis.hidden = true; if (mSave.hidden != false) mSave.hidden = false; if (document.popupNode.hasAttribute("disabled")) mSave.setAttribute("disabled", true); else mSave.removeAttribute("disabled"); } else { var isOneWindow = (numberOfWindows() == 1); if (obsAll.hidden != isOneWindow) obsAll.hidden = isOneWindow; if (obsThis.hidden != false) obsThis.hidden = false; if (mSave.hidden != true) mSave.hidden = true; } return typeof(document.popupNode.session) != "undefined"; }, restoreSession: function(node, overwriteWindows) { // call restoreSession after delay to let the popup menu time to hide window.setTimeout( function () { SessionManager.delayRestoreSession(node, overwriteWindows); }, 0 ); }, delayRestoreSession: function(node, overwriteWindows) { var path = node.session; var id = node.parentNode.parentNode.id; if (id == "tm-sessionmanager" || id == "btn_sessionmanager") this.loadSession(path,'sessionrestore', overwriteWindows); else if (id.indexOf("tm-sm-closedwindows")==0 || id == "btn_closedwindows") this.openclosedwindow(path, overwriteWindows); }, setSessionAsStartup: function(popup) { if (popup.getAttribute("checked")) { var aValue = document.popupNode.getAttribute("value"); // -1, -2 for for closed session, 1,2.... for saved session var loadsession = aValue && aValue <= -1 ? aValue : 0; SessionPref.setIntPref("onStart.loadsession", loadsession); if (loadsession > -1) SessionPref.setCharPref("onStart.sessionpath", document.popupNode.session); nsIPrefServiceObj.savePrefFile(null); // store the pref immediately } }, setShowNameExt: function() { SessionPref.setBoolPref("menu.showext", !SessionPref.getBoolPref("menu.showext")); nsIPrefServiceObj.savePrefFile(null); // store the pref immediately }, renameSession: function SM_renameSession() { var thisSession = document.popupNode.session; var node = this.RDFService.GetResource(thisSession); var oldName = this.getLiteralValue(node, "name"); var result = this.getSessionName("rename", oldName); if (result.button == BUTTON_OK) { this.setLiteral(node, "name", result.name); this.dataFlush(); } }, removeFromMenu: function(event, popup, root) { if (!tabxPrefs.getBoolPref("middleclickDelete")) return; if ( event.button == 1 && ("session" in event.target)) { document.popupNode = event.target; SessionManager.removeSavedSession(); if (root == gSessionPath[0] && this.isClosedWindowsEmpty()) popup.hidePopup(); else SessionManager.createMenu(popup, root); } }, removeSavedSession: function() { var node = document.popupNode.parentNode.parentNode; var path = document.popupNode.session; if (node.id == "tm-sessionmanager" || node.id == "btn_sessionmanager") { // befor we remove this session check if it is the startup session // and let the user cancel the delete or choose diffrent startup session var result = this.promptReplaceStartup("removeSavedSession", path); switch (result.button) { case BUTTON_CANCEL: return; case BUTTON_OK: this.replaceStartupPref(result, ""); case NO_NEED_TO_REPLACE : this.removeSession(path, gRDFRoot+'/windows'); } } else if (node.id.indexOf("tm-sm-closedwindows")==0 || node.id == "btn_closedwindows") { this.removeSession(path, gSessionPath[0]); this.updateClosedWindowsMenu("check"); } }, removeAllSavedSession: function SM_removeAllSavedSession() { var node = document.popupNode.parentNode.parentNode; var result, title, msg; var bundle_session = document.getElementById("bundle_session_manager"); var buttons = [this.setLabel("sm.removeStartup.button0"), this.setLabel("sm.removeStartup.button1")].join("\n"); if (node.id == "tm-sessionmanager" || node.id == "btn_sessionmanager") { title = bundle_session.getString("sm.removeAll.title.session"); msg = bundle_session.getString("sm.removeAll.msg0") + "\n\n"; if (SessionPref.getIntPref("onStart.loadsession") > -1) msg += bundle_session.getString("sm.removeAll.msg1"); result = TM_PromptService([BUTTON_CANCEL, HIDE_MENUANDTEXT, HIDE_CHECKBOX], [title, msg, "", "", buttons]); if (result.button == BUTTON_OK) { this.deleteSubtree(gSessionPath[1]); this.deleteSubtree(gSessionPath[2]); this.deleteSubtree(gSessionPath[3]); this.deleteSubtree(gRDFRoot+'/saved'); this.deleteSubtree(gRDFRoot+'/windows'); this.dataFlush(); SessionPref.setIntPref("onStart.loadsession", -1); nsIPrefServiceObj.savePrefFile(null); // store the pref immediately } } else if (node.id.indexOf("tm-sm-closedwindows")==0 || node.id == "btn_closedwindows") { title = bundle_session.getString("sm.removeAll.title.closedwindow"); msg = bundle_session.getString("sm.removeAll.msg2"); result = TM_PromptService([BUTTON_CANCEL, HIDE_MENUANDTEXT, HIDE_CHECKBOX], [title, msg, "", "", buttons]); if (result.button == BUTTON_OK) { var sessionContainer = this.initContainer(gSessionPath[0]); this.deleteWithProp(sessionContainer, "status", "saved"); this.updateClosedWindowsMenu(true); this.dataFlush(); } } }, // xxx need to check if we need all this functions removeSession: function SM_removeSession(value, container) { if (value==null) return; var node = this.RDFService.GetResource(value); var rdfNodeWindows = this.RDFService.GetResource(container); var windowsContainer = this.initContainer(rdfNodeWindows); this.deleteSubtree(value); windowsContainer.RemoveElement(node, true); if (!windowsContainer.GetCount()) this.deleteNode(rdfNodeWindows); this.dataFlush(); }, removeAllClosedSession: function SM_removeAllClosedSession() { for (var i = 0; i < gSessionPath.length; i++) { var rdfNode = this.RDFService.GetResource(gSessionPath[i]); var container = this.initContainer(rdfNode); if (!this.containerEmpty(gSessionPath[i])) this.deleteWithProp(container); if (!container.GetCount()) this.deleteNode(rdfNode); } }, deleteSession: function SM_deleteSession(nodLabel, prop, value) { var rdfNode = this.RDFService.GetResource(nodLabel); var container = this.initContainer(rdfNode); if (!this.containerEmpty(nodLabel)) this.deleteWithProp(container, prop, value); if (!container.GetCount()) this.deleteNode(rdfNode); }, deleteWithProp: function(container, prop, value) { var containerEnum = container.GetElements(); var nodeToDelete = []; var noProp = typeof(prop) == "undefined"; var valueExist = typeof(value) == "string"; while(containerEnum.hasMoreElements()) { var node = containerEnum.getNext(); var propExist = noProp ? true : this.nodeHasArc(node, prop); if (valueExist && !noProp && propExist && this.getLiteralValue(node, prop) != value) propExist = false; if (propExist) nodeToDelete.push(node); } this.deleteArrayNodes(container, nodeToDelete, true); }, deleteArrayNodes: function(container, nodeToDelete, deleteSubTree) { for (var i = 0; i < nodeToDelete.length; i++) { var nodeValue = nodeToDelete[i].QueryInterface(tmRDFResource).Value if (deleteSubTree) this.deleteSubtree(nodeValue); container.RemoveElement(nodeToDelete[i], true); } }, destroyMenuItems: function(menu) { // Destroy the items. var destroy = false, endSeparator; for (var i = 0; i < menu.childNodes.length; i++) { var item = menu.childNodes[i]; if (item.id.indexOf("-endSeparator") != -1) { endSeparator = item if (menu.parentNode.id != "tm-sessionmanager" && menu.parentNode.id != "btn_sessionmanager") break; else continue; } if (destroy) { i--; menu.removeChild(item); } else if (item.id.indexOf("-startSeparator") != -1) destroy = true; } return endSeparator; }, createMenuForDialog: function(popup, contents) { if (contents == SHOW_CLOSED_WINDOW_LIST) { // create closed window list popup menu this.createMenu(popup, window.opener.gSessionPath[0], contents); } else { // create saved Session popup menu this.createMenu(popup, gRDFRoot+'/windows', contents); // check if sessionpath and loadsessions valid for saved session var loadsession = SessionPref.getIntPref("onStart.loadsession"); if (loadsession > -1 && contents != 1 && loadsession != popup.parentNode.sessionIndex) { SessionPref.setIntPref("onStart.loadsession", popup.parentNode.sessionIndex); var pref = "onStart.sessionpath"; if (popup.parentNode.sessionIndex < 0 && SessionPref.prefHasUserValue(pref)) SessionPref.clearUserPref(pref); } } }, createMenu: function SM_createMenu(popup, container, contents) { if (!this.DATASource) this.initService(); // initService if we call from pref dialog if (typeof(contents) == "undefined") contents = 0; var endSeparator = this.destroyMenuItems(popup); // Remove any existing menu items var parentId = popup.parentNode.id if (parentId == "btn_sessionmanager" || parentId == "btn_closedwindows") popup.parentNode.removeAttribute("tooltiptext"); var parentID = (contents != SHOW_CLOSED_WINDOW_LIST) ? popup.parentNode.id : ""; var aContainer = this.initContainer(container); var containerEnum = aContainer.GetElements(); var mi, i = -1, node, name, nameExt, accessKey; var showNameExt = SessionPref.getBoolPref("menu.showext"); var loadsession = SessionPref.getIntPref("onStart.loadsession"); var sessionpath = SessionPref.getCharPref("onStart.sessionpath"); var showTooltip = parentId == "btn_sessionmanager" || parentId == "tm-sessionmanager" || parentId.indexOf("tm-sm-closedwindows")==0 || parentId == "btn_closedwindows"; while(containerEnum.hasMoreElements()) { node = containerEnum.getNext(); if (this.nodeHasArc(node, "status") && this.getLiteralValue(node, "status") != "saved") continue; name = unescape(this.getLiteralValue(node, "name")); nameExt = this.getLiteralValue(node, "nameExt"); // Insert a menu item for session in the container mi = document.createElement("menuitem"); mi.session = node.QueryInterface(tmRDFResource).Value; mi.setAttribute("session", mi.session); if (contents == 1 && loadsession > -1 && mi.session && mi.session == sessionpath) continue; ++i; mi.setAttribute("value", i); mi.value = i; if (parentID != "onStart.loadsession") { accessKey = (i > 26) ? "" : String.fromCharCode(65+i) + " " ; mi.setAttribute("accesskey", accessKey); mi.setAttribute("label", accessKey + name + (showNameExt ? nameExt : "")); if (showTooltip) mi.setAttribute("tooltiptext", accessKey + name + nameExt); } else { mi.setAttribute("label", name); } popup.insertBefore(mi, endSeparator); } switch ( parentID ) { case "tm-sessionmanager": case "btn_sessionmanager": var observer = document.getElementById("tmp_menu_AllWindows"); var isOneWindow = (numberOfWindows() == 1); if (observer.hidden != isOneWindow) observer.hidden = isOneWindow; case "tm_prompt": endSeparator.hidden = endSeparator.previousSibling.localName == "menuseparator"; var sessionLabel; var afterCrash = !this.containerEmpty(gSessionPath[3]); // if Crashed is empty don't show 'Crashed Session' menu item var bundle_session = document.getElementById("bundle_session_manager"); if (afterCrash && contents != 1) sessionLabel = [bundle_session.getString("sm.sessionMenu.lastgood"), bundle_session.getString("sm.sessionMenu.previous"), bundle_session.getString("sm.sessionMenu.crashed")]; else sessionLabel = [bundle_session.getString("sm.sessionMenu.last"), bundle_session.getString("sm.sessionMenu.previous")]; var menu; var empty = ", (" + bundle_session.getString("sm.session.empty") + ")"; for (i = 0; i < sessionLabel.length; i++ ){ menu = document.createElement("menuitem"); menu.session = gSessionPath[i+1]; if (this.containerEmpty(menu.session) && contents != 1) menu.setAttribute("disabled", "true"); nameExt = this.getLiteralValue(menu.session, "nameExt", empty); menu.setAttribute("label", sessionLabel[i] + (showNameExt && contents != 1 ? nameExt : "")); if (showTooltip) menu.setAttribute("tooltiptext", sessionLabel[i] + nameExt); menu.setAttribute("value", (-1 - i)); popup.appendChild (menu); } if (afterCrash && contents != 1) { // add separator befor Crashed menu item menu = document.createElement("menuseparator"); popup.insertBefore(menu, popup.lastChild); } if (contents == 1) loadsession = -1; //set "Last Sessoin" as default in the list this.setDefaultIndex(popup, loadsession, sessionpath); break; case "onStart.loadsession": endSeparator.hidden = this.containerEmpty(container); this.setDefaultIndex(popup, loadsession, sessionpath); break; default: endSeparator.hidden = true; break; } }, // set defaultIndex, sessionIndex and default Attribute setDefaultIndex : function(popup, loadsession, sessionpath) { popup.parentNode.defaultIndex = -1; // index with menuseparator popup.parentNode.sessionIndex = -1; // index without menuseparator var i, item, value, checked; for (i = 0; i < popup.childNodes.length; i++) { item = popup.childNodes[i]; if (item.localName == "menuseparator") continue; value = item.getAttribute("value"); checked = ((loadsession > -1 && item.session && item.session == sessionpath) || (loadsession <= -1 && value && value == loadsession)); if (checked) { item.setAttribute("default", "true"); popup.parentNode.defaultIndex = i; popup.parentNode.sessionIndex = value; } else item.removeAttribute("default"); } }, // update disable/enable to closed window list in tool menu and toolbar updateClosedWindowsMenu: function(action) { var disabled = (action == "check") ? this.isClosedWindowsEmpty(): action; var wnd, enumerator = windowEnumerator(); while ( enumerator.hasMoreElements() ) { wnd = enumerator.getNext(); var broadcaster = wnd.document.getElementById("tmp_closedwindows"); if (broadcaster) broadcaster.setAttribute("disabled",disabled); } }, isClosedWindowsEmpty: function SM_isClosedWindowsEmpty() { if ( !this.enableManager ) return true; var node, disabled = true; var aContainer = this.initContainer(gSessionPath[0]); var containerEnum = aContainer.GetElements(); while(containerEnum.hasMoreElements()) { node = containerEnum.getNext(); if (this.getLiteralValue(node, "status") == "saved") { disabled = false; break; } } return disabled; }, // call by init on first window load after crash openAfterCrash: function SM_openAfterCrash(status) { var sessionContainer = this.initContainer(gSessionPath[0]); if (this.enableBackup) { var path = gRDFRoot + "/closedSession/thisSession"; this.setLiteral(path, "status", "crash2"); // restore to were we was befor the crash var crashedContainer = this.initContainer(gSessionPath[3]); if (status != "crash2") { // delete old crash data if (!this.containerEmpty(gSessionPath[3])) this.deleteWithProp(crashedContainer); var windowEnum = sessionContainer.GetElements(); var nodeToDelete = []; while (windowEnum.hasMoreElements()) { var rdfNodeWindow = windowEnum.getNext(); if (this.getLiteralValue(rdfNodeWindow, "status") == "backup") { var tabs = this.getResource(rdfNodeWindow, "tabs"); var subTree = rdfNodeWindow.QueryInterface(tmRDFResource).Value; if (!this.containerEmpty(tabs)) { // copy "backup" subtree to crashed session if it not empty var newSubTree = subTree.replace(gSessionPath[0], gSessionPath[3]); this.copySubtree(subTree, newSubTree); crashedContainer.AppendElement(this.RDFService.GetResource(newSubTree)); } this.deleteSubtree(subTree); // delete the crashed subtree nodeToDelete.push(rdfNodeWindow);// remove the window from the crash session } else this.setLiteral(rdfNodeWindow, "dontLoad", "true"); // we can see this session in the close window list } this.deleteArrayNodes(sessionContainer, nodeToDelete, false); } // if firefox was crashed in middle of crash Recovery try again to restore the same data else if (!this.containerEmpty(gSessionPath[0])) this.deleteWithProp(sessionContainer); var bundle_session = document.getElementById("bundle_session_manager"); var title = bundle_session.getString("sm.afterCrash.title"); var msg; if (status != "crash2") msg = bundle_session.getString("sm.afterCrash.msg0"); else msg = bundle_session.getString("sm.afterCrash.msg0.again"); var chkBoxLabel = !this.enableManager ? bundle_session.getString("sm.afterCrash.chkbox.label") : ""; var buttons, result, whattoLoad = "session"; var chkBoxState = !this.enableManager ? CHECKBOX_UNCHECKED : HIDE_CHECKBOX; var closedWinList = this.initContainer(gSessionPath[0]).GetCount(); var lastSession = this.containerEmpty(gSessionPath[1]) // last session var prevtoLast = this.containerEmpty(gSessionPath[2]) // previous to last var savedSession = this.containerEmpty(gRDFRoot+'/windows') // saved session var isAllEmpty = lastSession && prevtoLast && savedSession; if (!this.containerEmpty(gSessionPath[3])) { // if Crashed Session is not empty var count = this.countWinsAndTabs(crashedContainer); this.setLiteral(gSessionPath[3], "nameExt", this.getNameData(count.win, count.tab)); if (this.enableManager && !isAllEmpty) { msg += "\n\n" + bundle_session.getString("sm.afterCrash.msg1"); buttons = [this.setLabel("sm.afterCrash.button0"), this.setLabel("sm.afterCrash.button1")].join("\n"); result = TM_PromptService([BUTTON_OK, SHOW_MENULIST, HIDE_CHECKBOX, SELECT_CRASH], [title, msg, "", "", buttons]); } else { msg += " " + bundle_session.getString("sm.afterCrash.msg2") + "....."; if (!this.enableManager) msg += "\n" + bundle_session.getString("sm.afterCrash.msg3"); else msg += "\n" + bundle_session.getString("sm.afterCrash.msg4"); buttons = [this.setLabel("sm.afterCrash.button0.crashed"), this.setLabel("sm.afterCrash.button1")].join("\n"); result = TM_PromptService([BUTTON_OK, HIDE_MENUANDTEXT, chkBoxState], [title, msg, "", chkBoxLabel, buttons]); result.label = gSessionPath[3]; } } else { if (this.enableManager && !isAllEmpty) { msg += " " + bundle_session.getString("sm.afterCrash.msg5") + "\n\n" + bundle_session.getString("sm.afterCrash.msg1"); buttons = [this.setLabel("sm.afterCrash.button0"), this.setLabel("sm.afterCrash.button1")].join("\n"); result = TM_PromptService([BUTTON_OK, SHOW_MENULIST, HIDE_CHECKBOX, SELECT_DEFAULT], [title, msg, "", "", buttons]); } else if (closedWinList != 0) { msg += " " + bundle_session.getString("sm.afterCrash.msg6"); if (!this.enableManager) msg += "\n" + bundle_session.getString("sm.afterCrash.msg3") + "\n\n" + bundle_session.getString("sm.afterCrash.msg7") + ":"; else msg += "\n\n" + bundle_session.getString("sm.afterCrash.msg7") + " " + bundle_session.getString("sm.afterCrash.msg8") + ":"; buttons = [this.setLabel("sm.afterCrash.button0"), this.setLabel("sm.afterCrash.button1")].join("\n"); result = TM_PromptService([BUTTON_OK, SHOW_MENULIST, chkBoxState, SHOW_CLOSED_WINDOW_LIST], [title, msg, "", chkBoxLabel, buttons]); whattoLoad = "closedwindow"; } else {// nothing to restore msg = bundle_session.getString("sm.afterCrash.msg9") + "\n" + bundle_session.getString("sm.afterCrash.msg10"); if (!this.enableManager) msg += "\n\n" + bundle_session.getString("sm.afterCrash.msg3"); buttons = ["", this.setLabel("sm.button.continue")].join("\n"); result = TM_PromptService([BUTTON_CANCEL, HIDE_MENUANDTEXT, chkBoxState], [title, msg, "", chkBoxLabel, buttons]); } } if (result.checked && !this.enableManager) { SessionPref.setBoolPref("manager", true); // enable session manager try { nsIPrefServiceObj.savePrefFile(null); // store the pref immediately } catch(ex) { } } if (result.button == BUTTON_OK) { switch ( whattoLoad ) { case "session": this.loadSession(result.label, "firstwindowopen"); break; case "closedwindow": this.openclosedwindow(result.label, true); break; default: } } else this.loadHomePage(); } else { // crash recovery is off, delete any remains from the crashed session if (!this.containerEmpty(gSessionPath[0])) this.deleteWithProp(sessionContainer); if (this.enableManager) this.openFirstWindow(true, false); // openFirstWindow with flag openAfterCrash // else BrowserHome(); // we never get to here... } }, // call by init or by openAfterCrash on first window load openFirstWindow: function SM_openFirstWindow(afterCrash, afterRestart) { var path = gRDFRoot + "/closedSession/"; var sessionType = ["thisSession", "lastSession", "previoustolastSession", "crashedsession"]; // swap 0 --> 1 --> 2 --> 0 var i; var sessions = [], subTree, aSession; for (i = 0; i < sessionType.length-1; i++) { sessions.push(this.getResource(path + sessionType[i], "session")); } for (i = 0; i < sessionType.length-1; i++) { if (i == 0) { // delete oldest session subtree aSession = sessions[sessionType.length-2]; subTree = aSession.QueryInterface(tmRDFResource).Value; this.deleteSubtree(subTree); } else aSession = sessions[i-1]; this.setResource(path + sessionType[i], "session", aSession) } for (i = 0; i < sessionType.length; i++) { gSessionPath[i] = this.getResourceValue(path + sessionType[i], "session"); } gThisWin = gSessionPath[0] + "/" + gBrowser.windowID; gThisWinTabs = gThisWin + "/tabs"; gThisWinClosedtabs = gThisWin + "/closedtabs"; // When Firefox Starts: // pref "onStart" // 0 - Restore // 1 - Ask me Befor Restore // 2 (or else) - Don't Restore // // pref "onStart.loadsession" // 0 , 1 , 2 ..... index of saved sessions // -1, -2 ........ index of previous sessions // // if loadsession >= 0 the session path is saved in pref "onStart.sessionpath" // else if loadsession < 0 the session path is saved in gSessionPath var restoreFlag = SessionPref.getIntPref("onStart"); if (restoreFlag > 1 && !afterRestart) { return; // Don't Restore } var loadSession = SessionPref.getIntPref("onStart.loadsession"); // after last session end with restart load the last session without any prompt // unless we are after crash var askifempty = restoreFlag > 1 ? false : SessionPref.getBoolPref("onStart.askifempty"); var startupEmpty = false, savePref = false ; var result = {}, title, msg = "", buttons; var bundle_session = document.getElementById("bundle_session_manager"); if (afterCrash) title = bundle_session.getString("sm.afterCrash.title"); else title = bundle_session.getString("sm.start.title"); var chkBoxLabel = afterCrash ? bundle_session.getString("sm.start.chkbox.label") : ""; var chkBoxState = afterCrash ? CHECKBOX_UNCHECKED : HIDE_CHECKBOX; // get saved session list var sessionList = this.getSessionList(); if (sessionList == null) { if ((askifempty || restoreFlag == 1) && !this.corruptedFile) { msg = bundle_session.getString("sm.start.msg0") + "\n" + bundle_session.getString("sm.afterCrash.msg10"); if (afterCrash) msg += "\n\n" + bundle_session.getString("sm.start.msg1"); buttons = ["", this.setLabel("sm.button.continue")].join("\n"); result = TM_PromptService([BUTTON_CANCEL, HIDE_MENUANDTEXT, chkBoxState], [title, msg, "", chkBoxLabel, buttons]); if (result.checked && afterCrash) { SessionPref.setBoolPref("crashRecovery", true); // enable Crash Recovery nsIPrefServiceObj.savePrefFile(null); // store the pref immediately } } this.loadHomePage(); return; } if (afterRestart) { restoreFlag = 0; loadSession = -1; } var aList = sessionList.list; var sessionPath = sessionList.path; var loadSessionIsValid = true, sessionIndex, thisPath; switch ( (loadSession > 0) ? 0 : loadSession ) { case 0: sessionIndex = null; if (SessionPref.prefHasUserValue("onStart.sessionpath")) { thisPath = SessionPref.getCharPref("onStart.sessionpath"); // check if sessionpath is valid for (i = 0; i < aList.length; i++) { if (sessionPath[i] == thisPath) { sessionIndex = i; break; } } } if ((thisPath && this.containerEmpty(thisPath)) || sessionIndex == null) { // error in pref.js or in session.rdf ask the user what to do loadSessionIsValid = false; thisPath = gSessionPath[1]; // load last session SessionPref.setIntPref("onStart.loadsession", -1); savePref = true; } break; default: // just in case that somehow onStart.loadsession is invalid loadSession = -1; SessionPref.setIntPref("onStart.loadsession", -1); savePref = true; case -2: case -1: var indx = -1 * loadSession; thisPath = gSessionPath[indx]; if (this.containerEmpty(gSessionPath[indx])) startupEmpty = true; sessionIndex = aList.length + indx - 3; break; } if (restoreFlag > 0 || afterCrash || (startupEmpty && askifempty) || !loadSessionIsValid) { try{ if (afterCrash) msg += bundle_session.getString("sm.afterCrash.msg0") + " " + bundle_session.getString("sm.start.msg1"); if (startupEmpty) msg += bundle_session.getString("sm.start.msg0"); if (!loadSessionIsValid) msg += bundle_session.getString("sm.start.msg2"); msg += "\n\n" + bundle_session.getString("sm.afterCrash.msg1"); buttons = [this.setLabel("sm.afterCrash.button0"), this.setLabel("sm.afterCrash.button1")].join("\n"); result = TM_PromptService([BUTTON_OK, SHOW_MENULIST, chkBoxState, SELECT_DEFAULT], [title, msg, "", chkBoxLabel, buttons]); if (result.checked && afterCrash) { SessionPref.setBoolPref("crashRecovery", true); // enable Crash Recovery savePref = true; } } catch (e) {tmLog("error " + e);} } else { result.button = startupEmpty ? BUTTON_CANCEL : BUTTON_OK; result.label = thisPath; } if (savePref) nsIPrefServiceObj.savePrefFile(null); // store the pref immediately if (result.button == BUTTON_OK) this.loadSession(result.label, "firstwindowopen"); else this.loadHomePage(); }, getSessionList: function SM_getSessionList(flag) { var aList = [], sessionPath = []; var aContainer = this.initContainer(gRDFRoot+'/windows'); var containerEnum = aContainer.GetElements(); var node, aName; while(containerEnum.hasMoreElements()) { node = containerEnum.getNext(); aName = this.getLiteralValue(node, "name"); aList.push(aName); sessionPath.push(node.QueryInterface(tmRDFResource).Value); } var bundle_session = document.getElementById("bundle_session_manager"); if (flag == "saved") return {list: aList, path: sessionPath}; else if (flag == "replace") { aList.push(bundle_session.getString("sm.sessionMenu.lastDefault")); aList.push(bundle_session.getString("sm.sessionMenu.previous")); } else { var empty = ", (" + bundle_session.getString("sm.session.empty") + ")"; var empty1 = this.containerEmpty(gSessionPath[1]); var empty2 = this.containerEmpty(gSessionPath[2]); if (empty1 && empty2 && aList.length == 0) return null; if (flag == "afterCrash") aList.push(bundle_session.getString("sm.sessionMenu.lastgood") + (empty1 ? empty : "")); else aList.push(bundle_session.getString("sm.sessionMenu.last") + (empty1 ? empty : "")); aList.push(bundle_session.getString("sm.sessionMenu.previous") + (empty2 ? empty : "")); } sessionPath.push(gSessionPath[1]); sessionPath.push(gSessionPath[2]); return {list: aList, path: sessionPath}; }, saveAllWindows: function(path, caller, saveClosedTabs) { var enumerator = windowEnumerator(); var wnd, savedTabs = 0 , savedWin = 0, thisWin; while ( enumerator.hasMoreElements() ) { wnd = enumerator.getNext(); thisWin = wnd.SessionManager.saveOneWindow(path, caller, false, saveClosedTabs); savedTabs += thisWin; if (thisWin > 0) savedWin += 1; } return {win: savedWin, tab: savedTabs}; }, checkTime: function SM_checkTime(container, curTime) { // check the timestamp for each saved window // if the time diff is more than 10sec set dontLoad=true to the saved window var windowEnum = container.GetElements(); while (windowEnum.hasMoreElements()) { var rdfNodeLastWindow = windowEnum.getNext(); var lastSaved = this.getLiteralValue(rdfNodeLastWindow, "timestamp", 0); if ((curTime - lastSaved) > 10000) { if (!this.nodeHasArc(rdfNodeLastWindow, "dontLoad")) this.setLiteral(rdfNodeLastWindow, "dontLoad", "true"); } } }, saveOneWindow: function SM_saveOneWindow(path, caller, overwriteWindow, saveClosedTabs) { if (gBrowser.isBlankWindow()) return 0; // dont save window without any tab if (!path) path = gSessionPath[0]; if (!caller) caller = ""; if (!overwriteWindow) overwriteWindow = false; if (typeof(saveClosedTabs) == "undefined") saveClosedTabs = this.saveClosedtabs; // if we going to delete close window from the list we can't use GetCount as ID, // we need to save unink ID var winID; if (caller == "windowclosed" || caller == "windowbackup") winID = gBrowser.windowID; else winID = this.RDFService.GetAnonymousResource().Value.split("rdf:")[1]; var winPath = path + "/" + winID; this.initSession(path, winPath); var savedTabs; if (caller == "windowclosed" && this.enableBackup) { var tabContainer = this.initContainer(gThisWinTabs); // save busy tabs this.saveAllTab(winPath, 0, true); savedTabs = tabContainer.GetCount() > 0 ? tabContainer.GetCount() : this.saveAllTab(winPath, 0); this.setTabsScroll(); } else { savedTabs = this.saveAllTab(winPath, 0); if (((gThisWin == winPath && !this.enableBackup) || gThisWin != winPath) && saveClosedTabs) this.copyClosedTabsToRDF(winPath); } var rdfNodeThisWindow = this.RDFService.GetResource(winPath); if (SessionPref.getBoolPref("save.selectedtab")) // save selected tab index this.setIntLiteral(rdfNodeThisWindow, "selectedIndex", this.getTabPosition()); if (caller == "windowbackup") { this.dataFlush(); return savedTabs; } if (path == gSessionPath[0]) { // save current tab title. we will use it later in closed windows list as menu entry label // if current tab is blank get label from first saved tab that isn't blank var label; if (gBrowser.isBlankTab(gBrowser.mCurrentTab)) { for (var i = 0; i < gBrowser.mTabs.length; i++) { var aTab = gBrowser.mTabs[i]; if (!gBrowser.isBlankTab(aTab)) { label = aTab.label; break; } } } else label = gBrowser.mCurrentTab.label; this.setLiteral(rdfNodeThisWindow, "name", escape(label)); this.setLiteral(rdfNodeThisWindow, "nameExt", this.getNameData(-1, savedTabs)); var pref = "extensions.tabmix.warnAboutClosingTabs.timeout"; var delay = gPref.prefHasUserValue(pref) ? gPref.getCharPref(pref)*1 : 0; var newTime = new Date().valueOf() - delay; this.setLiteral(rdfNodeThisWindow, "timestamp", newTime); // if we overwrite window we don't load it again on restart if (this.overwriteWindow || overwriteWindow) this.setLiteral(rdfNodeThisWindow, "dontLoad", "true"); this.setLiteral(rdfNodeThisWindow, "status", "saved"); this.updateClosedWindowsMenu(false); } else this.setLiteral(rdfNodeThisWindow, "status", ""); this.dataFlush(); return savedTabs; }, // end of "saveOneWindow : function ()" // if this session is not in the container add it to the last place and init prop // else move it to the last place initSession: function SM_initSession(path, winPath) { var container = this.initContainer(path); var rdfNode = this.RDFService.GetResource(winPath); var index = container.IndexOf(rdfNode); if (index == -1) { container.AppendElement(rdfNode); this.setLiteral(rdfNode, "status", "backup"); this.setResource(rdfNode, "tabs", winPath + "/tabs"); this.setResource(rdfNode, "closedtabs", winPath + "/closedtabs"); } else if (index != container.GetCount()) { container.RemoveElementAt(index, true); container.AppendElement(rdfNode); } }, // xxx need to fix this to save only history, image and history index // and save the rest when tab added tabLoaded: function SM_tabLoaded(aTab) { if (!this.enableBackup || aTab.hasAttribute("inrestore")) return; if (gBrowser.isBlankTab(aTab)) return; // if this window is not in the container add it to the last place this.initSession(gSessionPath[0], gThisWin); var tabContainer = this.initContainer(gThisWinTabs); var result = this.saveTab(aTab, gThisWinTabs, tabContainer, true, 0); if (result) this.dataFlush(); }, updateTabPos: function(aTab, label, add0_1) { var tab, node; if (!add0_1) add0_1 = 0; for (var i = aTab._tPos + add0_1; i < gBrowser.mTabs.length; i++) { tab = gBrowser.mTabs[i]; node = (typeof(label) == "undefined") ? this.getNodeForTab(tab) : label + "/" + tab.linkedPanel; this.setIntLiteral(node, "tabPos", tab._tPos); } }, tabClosed: function SM_tabClosed(aTab) { // delete tab from container and save to closed tab list backup // we don't check aTab.hasAttribute("inrestore") , in case tab is closed befor // its finish to restore. if (!this.enableBackup) return; this.initSession(gSessionPath[0], gThisWin); var tabContainer = this.initContainer(gThisWinTabs); var panelPath = this.getNodeForTab(aTab); var nodeToClose = this.RDFService.GetResource(panelPath); this.updateTabPos(aTab); // update _tPos for the tab right to the deleted tab if (this.saveClosedtabs) { // move closedtabs to closedtabs container var closedTabContainer = this.initContainer(gThisWinClosedtabs); var tabExist = true; if (tabContainer.IndexOf(nodeToClose) == -1) { tabExist = this.saveTab(aTab, gThisWinTabs, closedTabContainer, false, 0); } else tabContainer.RemoveElement(nodeToClose, true); if (tabExist) { closedTabContainer.AppendElement(nodeToClose); if (closedTabContainer.GetCount() > tabxPrefs.getIntPref("undoCloseCache")) this.deleteClosedtabAt(1, gThisWin); } } else if (tabContainer.IndexOf(nodeToClose) > -1) { // xxx try to use deleteSession ???? this.deleteSubtree(panelPath); tabContainer.RemoveElement(nodeToClose, true); // xxx is it necessary to delete this ??? if (!tabContainer.GetCount()) { // if no tab in the container remove it from the tree var winContainer = this.initContainer(gSessionPath[0]); var rdfNode = this.RDFService.GetResource(gThisWin); winContainer.RemoveElement(rdfNode, true); this.deleteSubtree(gThisWin); } } this.dataFlush(); }, updateTabProp: function SM_updateTabProp(aTab, needFlush) { // we dont need this function to run befor sessionmanager init // this.enableBackup=null so we dont past the next if if (!this.enableBackup || aTab.hasAttribute("inrestore")) return; if (gBrowser.isBlankTab(aTab)) return; // dont write blank tab to the file this.initSession(gSessionPath[0], gThisWin); this.setLiteral(this.getNodeForTab(aTab), "properties", SessionData.getTabProperties(aTab, true)); if (needFlush) this.dataFlush(); }, tabMoved: function SM_tabMoved(aTab, oldPos, newPos) { if (!this.enableBackup || aTab.hasAttribute("inrestore")) return; this.initSession(gSessionPath[0], gThisWin); // can't use aTab._tPos after group of tab delete // we pass old position and new position from TMmoveTabTo // we need to fix tabPos for all tab between old position and new position var first = Math.min(oldPos, newPos); var last = Math.max(oldPos, newPos); for (var i = first; i < last + 1; i++) { var tab = gBrowser.mTabs[i]; if (!gBrowser.isBlankTab(tab)) this.setIntLiteral(this.getNodeForTab(tab), "tabPos", i); } this.dataFlush(); }, setTabsScroll: function() { if (SessionPref.getBoolPref("save.scrollposition")) for (var i = 0; i < gBrowser.mTabs.length; i++) this.tabScrolled(gBrowser.mTabs[i]); }, // xxx need to find the right event to trigger this function.. tabScrolled: function SM_tabScrolled(aTab) { if (!this.enableBackup || aTab.hasAttribute("inrestore")) return; var aBrowser = gBrowser.getBrowserForTab(aTab); if (gBrowser.isBlankBrowser(aBrowser)) return; var bContent = aBrowser.contentWindow; var zoomFactor = aBrowser.docShell.contentViewer ? aBrowser.markupDocumentViewer.textZoom : 1; this.setLiteral(this.getNodeForTab(aTab), "scroll", bContent.scrollX + "," + bContent.scrollY + "," + zoomFactor); }, tabSelected: function(needFlush) { if (!this.enableBackup || gBrowser.mCurrentTab.hasAttribute("inrestore")) return; if (typeof(needFlush) == "undefined") needFlush = false; this.initSession(gSessionPath[0], gThisWin); this.setTabsScroll(); // until i find proper event to update tab scroll do it from here if (SessionPref.getBoolPref("save.selectedtab")) { this.setIntLiteral(gThisWin, "selectedIndex", this.getTabPosition()); } if (needFlush) this.dataFlush(); }, getTabPosition: function() { // calc selected tab position if blank tab not restore if (gBrowser.isBlankTab(gBrowser.mCurrentTab)) return 0; // if the current tab is blank we don't resore the index var blankTab = 0; for (var i = 0; i < gBrowser.mCurrentTab._tPos; i++) { if (gBrowser.isBlankTab(gBrowser.mTabs[i])) blankTab++; } return gBrowser.mCurrentTab._tPos - blankTab; }, getNodeForTab: function(aTab) { return gThisWinTabs + "/" + aTab.linkedPanel; }, saveAllTab: function SM_saveAllTab(winPath, offset, saveBusy) { var savedTabs = 0 ; var rdfNodeTabs = this.getResource(winPath, "tabs"); var rdfLabelTabs = rdfNodeTabs.QueryInterface(tmRDFResource).Value; var tabContainer = this.initContainer(rdfNodeTabs); for (var i = 0; i < gBrowser.mTabs.length; i++) { var aTab = gBrowser.mTabs[i]; if (saveBusy && !aTab.hasAttribute("busy")) continue; // save only busy tabs if (this.saveTab(aTab, rdfLabelTabs, tabContainer, true, offset)) savedTabs ++; } return savedTabs; }, // call from tabloaded, tabClosed, saveAllTab // xxx add flag what to save : all, history, property, scrollPosition saveTab: function(aTab, rdfLabelTabs, tabContainer, needToAppend, offset) { var aBrowser = gBrowser.getBrowserForTab(aTab); if (gBrowser.isBlankBrowser(aBrowser)) return false; var sessionHistory = aBrowser.webNavigation.sessionHistory; var rdfLabelTab = rdfLabelTabs + "/" + aTab.linkedPanel; var index = sessionHistory.index < 0 ? 0 : sessionHistory.index; var historyIndex = this.enableSaveHistory ? index : 0; var rdfNodeTab = this.RDFService.GetResource(rdfLabelTab); var bContent = aBrowser.contentWindow; var zoomFactor = aBrowser.docShell.contentViewer ? aBrowser.markupDocumentViewer.textZoom : 1; var scrollPos = bContent.scrollX + "," + bContent.scrollY + "," + zoomFactor; try { var curHistory = sessionHistory.getEntryAtIndex(index, false); curHistory.QueryInterface(tmSHEntry).setScrollPosition(bContent.scrollX, bContent.scrollY); } catch (e) {tmLog("saveTab error index " + sessionHistory.index + "\n" + e); } this.saveTabData(rdfNodeTab, historyIndex, aTab._tPos + offset, aTab.getAttribute("image"), SessionData.getTabProperties(aTab, true), this.saveTabHistory(sessionHistory), scrollPos); // dont append if we call from tabClosed function //XXX move this to the caller function if (tabContainer.IndexOf(rdfNodeTab) == -1 && needToAppend) { tabContainer.AppendElement(rdfNodeTab); this.updateTabPos(aTab, rdfLabelTabs, 1); // update _tPos for the tab right to the new tab } return true; }, saveTabData: function SM_saveTabData(node, index, tabPos, image, properties, history, scroll) { this.setIntLiteral(node, "index", index); this.setIntLiteral(node, "tabPos", tabPos); this.setLiteral (node, "image", image || ""); // for use in closed tab list this.setLiteral (node, "properties", properties); this.setLiteral (node, "history", history); this.setLiteral (node, "scroll", scroll); }, // xxx save text size (zoom), char type ? saveTabHistory: function(sessionHistory) { var historyStart = this.enableSaveHistory ? 0 : sessionHistory.index; var historyEnd = this.enableSaveHistory ? sessionHistory.count : sessionHistory.index+1; var j, historyEntry, history = []; for (j = historyStart; j < historyEnd; j++) { try { historyEntry = sessionHistory.getEntryAtIndex(j, false).QueryInterface(tmSHEntry); history.push(escape(historyEntry.title)); history.push(historyEntry.URI.spec); history.push(this.getScrollPosHs(historyEntry)); // not in use yet } catch (e) {tmLog("saveTabHistory error index " + j + "\n" + e); } } // generate unique separator and combine the array to one string var separator = "][", extraSeparator = "@"; for (var i = 0; i < history.length; ++i) { while (history[i].indexOf(separator) > -1) separator += extraSeparator; } // insert the separator to history so we can extract it in loadTabHistory return separator + "|-|" + history.join(separator); }, getScrollPosHs: function(historyEntry) { if (SessionPref.getBoolPref("save.scrollposition")) { var x={}, y={}; historyEntry.getScrollPosition(x, y); return x.value + "," + y.value; } return "0,0"; }, loadSession: function SM_loadSession(path, caller, overwriteWindows) { var sessionContainer = this.initContainer(path); var sessionEnum = sessionContainer.GetElements(); var sessionCount = 0, concatenate; var windowEnum = windowEnumerator(); if (typeof(overwriteWindows) == "undefined") overwriteWindows = SessionPref.getBoolPref("restore.overwritewindows"); // don't concatenate window after crash if (caller == "firstwindowopen" && this.getLiteralValue(gSessionPath[0], "status") == "crash2") concatenate = false; else concatenate = SessionPref.getBoolPref("restore.concatenate"); var saveBeforOverwrite = SessionPref.getBoolPref("restore.saveoverwrite"); var overwriteTabs = SessionPref.getBoolPref("restore.overwritetabs"); // in single window mode we restore ALL window into this window if (gSingleWindowMode) concatenate = true; // if this window is blank use it when reload session var wnd, blankWindow; if (!gSingleWindowMode && concatenate && !overwriteWindows && !gBrowser.isBlankWindow() && caller != "firstwindowopen" && caller != "concatenatewindows") { this.openNewWindow(path, "concatenatewindows"); return; } // if we join all window to one window // call the same window for all saved window with overwritewindows=false and overwritetabs=false if this not the first saved // for first saved window overwritetabs determined by user pref while (sessionEnum.hasMoreElements()) { sessionCount++; var rdfNodeSession = sessionEnum.getNext(); if (rdfNodeSession instanceof tmRDFResource) { var windowPath = rdfNodeSession.QueryInterface(tmRDFResource).Value; if (this.nodeHasArc(windowPath, "dontLoad")) continue; if (concatenate) { if (caller != "concatenatewindows" && caller != "firstwindowopen" && sessionCount == 1 && saveBeforOverwrite && overwriteTabs) this.saveOneWindow(gSessionPath[0], "", true); var newCaller = (sessionCount != 1) ? caller+"-concatenate" : caller; this.loadOneWindow(windowPath, newCaller); } else { wnd = null; blankWindow = false; if (windowEnum.hasMoreElements()) { wnd = windowEnum.getNext(); blankWindow = wnd.gBrowser.isBlankWindow(); } if (wnd != null && (overwriteWindows || blankWindow || (caller == "firstwindowopen" && sessionCount == 1 ))) { // if we save overwrite windows in the closed windows list don't forget to set dontLoad==true if (caller != "firstwindowopen" && saveBeforOverwrite && overwriteTabs) wnd.SessionManager.saveOneWindow(gSessionPath[0], "", true); wnd.SessionManager.loadOneWindow(windowPath, caller); } else this.openNewWindow(windowPath, caller); } } } // cloes extra windows if we overwrite open windows and set dontLoad==true if (numberOfWindows() > 1 && overwriteWindows) { while (windowEnum.hasMoreElements()) { wnd = windowEnum.getNext(); if (concatenate && wnd == window) continue; if (saveBeforOverwrite) wnd.SessionManager.overwriteWindow = true; else wnd.SessionManager.saveThisWindow = false; wnd.close(); } } }, openclosedwindow: function SM_openclosedwindow(path, overwriteWindows) { // 1. check if to overwrite the opener window // if 1 is true call loadOneWindow // if 1 is false open new window and pass the path // 2. delete the window from closedwindow list (after new window is opend and load) var rdfNodeClosedWindow = this.RDFService.GetResource(path); // don't reopen same window again. the window removed from closed window list after it finish to load if (this.nodeHasArc(rdfNodeClosedWindow, "reOpened")) return; this.setLiteral(rdfNodeClosedWindow, "reOpened", "true"); if (typeof(overwriteWindows) == "undefined") overwriteWindows = SessionPref.getBoolPref("restore.overwritewindows"); var saveBeforOverwrite = SessionPref.getBoolPref("restore.saveoverwrite"); var overwriteTabs = SessionPref.getBoolPref("restore.overwritetabs"); if (overwriteWindows || gBrowser.isBlankWindow() || gSingleWindowMode) { if (saveBeforOverwrite && overwriteTabs) this.saveOneWindow(gSessionPath[0], "", true); this.loadOneWindow(path, "openclosedwindow"); } else this.openNewWindow(path, "openclosedwindow"); this.dataFlush(); }, openNewWindow: function SM_openNewWindow(path, caller) { var newWindow = window.openDialog( getBrowserURL(), "_blank", "chrome,all,dialog=no", null); newWindow.tabmixdata = { path: path, caller: caller }; }, loadOneWindow: function SM_loadOneWindow(path, caller) { var overwrite = true, restoreSelect = SessionPref.getBoolPref("save.selectedtab"); switch ( caller ) { case "firstwindowopen": if (window.arguments && window.arguments.length > 0) { overwrite = window.arguments[0] == gHomeButton.getHomePage() ? true : false ; if (!overwrite && window.arguments[0] != "about:blank") restoreSelect = false; } else overwrite = false; break; case "windowopenebytabmix": case "concatenatewindows": overwrite = true; break; case "openclosedwindow": case "sessionrestore": overwrite = SessionPref.getBoolPref("restore.overwritetabs"); break; case "firstwindowopen-concatenate": case "openclosedwindow-concatenate": case "sessionrestore-concatenate": case "concatenatewindows-concatenate": overwrite = false; break; default: tmLog("SessionManager \n error unidentifid caller " + caller); } /* 1. when open first windows overwrite tab only if they are home page, if firefox open from link or with pages that are not the home page append the new tab to the end. simple solution is to set browser.startup.page = 0 , when we activate session manager, in this case if we have any tabs in the first window we don't overwrite. 2. when open window by session manager other than the first window (caller = "windowopenebytabmix" and tabmix in the name) overwrite=true 3. when loadOneWindow call by openclosedwindow or loadSession we reuse window check user pref for overwrite. 4. if we open all closed windows to one window append tab to the end and select the selected tab from first window in the session. */ var cTab = gBrowser.mCurrentTab; var concatenate = caller.indexOf("-concatenate") != -1 || (caller == "firstwindowopen" && gBrowser.mTabContainer.childNodes.length > 1); var rdfNodeWindow = this.RDFService.GetResource(path); var rdfNodeTabs = this.getResource(rdfNodeWindow, "tabs"); if (!(rdfNodeTabs instanceof tmRDFResource) || this.containerEmpty(rdfNodeTabs)) { var bundle_session = document.getElementById("bundle_session_manager"); alert(bundle_session.getString("sm.restoreError.msg0") + "\n" + bundle_session.getString("sm.restoreError.msg1")); var stringBundle = document.getElementById("tmp-string-bundle"); var tabmix_loading = stringBundle.getString("session.loading.label") + "..."; if (gBrowser.mCurrentTab.label == tabmix_loading) gBrowser.mCurrentBrowser.reload(); return; } var tabContainer = this.initContainer(rdfNodeTabs); var newtabsCount = tabContainer.GetCount(); gBrowser.tabsToLoad = newtabsCount; this.setStripVisibility(newtabsCount); var lastSelectedIndex = restoreSelect ? this.getIntValue(rdfNodeWindow, "selectedIndex") : 0; if (lastSelectedIndex < 0 || lastSelectedIndex >= newtabsCount) lastSelectedIndex = 0; var i, newIndex, aTab, tabPos; if (overwrite) { gBrowser.mTabContainer.collapsedTabs = 0; for ( i = 0; i < gBrowser.mTabContainer.childNodes.length; i++) { aTab = gBrowser.mTabContainer.childNodes[i]; var aBrowser = gBrowser.getBrowserForTab(aTab); // reset old history aBrowser.webNavigation.sessionHistory = Components.classes["@mozilla.org/browser/shistory;1"] .createInstance(tmSHistory); // reset old text zoom setTextZoom(aBrowser, 1); // remove selected and flst_id from all tabs but the current if (aTab != cTab) { aTab.removeAttribute("selected"); aTab.removeAttribute("flst_id"); } } while (newtabsCount > gBrowser.mTabContainer.childNodes.length) { gBrowser.addTab(); } // move selected tab to place gBrowser.TMmoveTabTo(cTab, lastSelectedIndex); // remove extra tab while (newtabsCount < gBrowser.mTabContainer.childNodes.length) { gBrowser.removeTab(gBrowser.mTabContainer.lastChild); } newIndex = 0; } else { // reuse blank tabs and move tabs to the right place var openTabNext = gPref.getBoolPref("extensions.tabmix.openTabNext"); // catch blank tab for reuse var blankTabs = [], blankTabsCount = 0, currentTabIsBalnk = false; for (i = 0; i < gBrowser.mTabContainer.childNodes.length ; i++) { aTab = gBrowser.mTabContainer.childNodes[i]; if (!aTab.loadOnStartup) { // make sure we not overwrite tab that loads from apps if (gBrowser.isBlankTab(aTab) && (aTab.hasAttribute("tabmix_busy") || !aTab.hasAttribute("busy"))) { aTab.removeAttribute("tabmix_busy"); if (aTab != cTab) { blankTabs.push(aTab); aTab.removeAttribute("selected"); aTab.removeAttribute("flst_id"); } else { blankTabs.unshift(aTab); currentTabIsBalnk = true; } } } else delete aTab.loadOnStartup; } // remove extra tabs var blankTab; while (blankTabs.length > newtabsCount) { blankTab = blankTabs.pop(); if (blankTab) gBrowser.removeTab(blankTab); } var newPos = (openTabNext && cTab._tPos < gBrowser.mTabContainer.childNodes.length - 1 && !concatenate) ? cTab._tPos + 1 : gBrowser.mTabContainer.childNodes.length - 1; // move blank tabs to new position blankTabsCount = blankTabs.length; while (blankTabs.length > 0) { blankTab = blankTabs.shift(); tabPos = (blankTab._tPos < newPos && newPos < gBrowser.mTabContainer.childNodes.length - 1) ? newPos - 1 : newPos; gBrowser.TMmoveTabTo(blankTab, tabPos); } var tabsCount = gBrowser.mTabContainer.childNodes.length; var newTotalTabsCount = tabsCount - blankTabsCount + newtabsCount; while (newTotalTabsCount > gBrowser.mTabContainer.childNodes.length) { var newTab = gBrowser.addTab(); // in concatenate mode move tab to the end of the list if (concatenate && openTabNext) { gBrowser.TMmoveTabTo(newTab, gBrowser.mTabContainer.childNodes.length-1); } } if (tabsCount == blankTabsCount) newPos = 0; else newPos = (openTabNext && cTab._tPos < gBrowser.mTabContainer.childNodes.length - 1 && !concatenate) ? cTab._tPos + 1 : tabsCount - blankTabsCount; if (!concatenate && restoreSelect) { // in concatenate mode we select tab only from first window if (currentTabIsBalnk) { // if the current tab is not blank select new tab if (openTabNext && newPos > 0) newPos--; // move selected tab to place gBrowser.TMmoveTabTo(cTab, newPos + lastSelectedIndex); } else { // Set newly selected tab after quick timeout, like in firefox code function TM_selectNewTab(browser, tabs, newIndex, oldIndex, updateSelected) { browser.selectedTab = tabs[newIndex]; if (updateSelected) { tabs[oldIndex].removeAttribute("selected"); tabs[oldIndex].removeAttribute("flst_id"); } } var cIndex = gBrowser.mTabContainer.selectedIndex; if ((newPos + lastSelectedIndex) != cIndex) { var updateSelected = (caller=="firstwindowopen" || caller=="windowopenebytabmix") ; setTimeout(TM_selectNewTab, 0, gBrowser, gBrowser.mTabContainer.childNodes, newPos + lastSelectedIndex, cIndex, updateSelected); } } } newIndex = newPos; } // call ensureTabIsVisible befor and after we reload the tab gBrowser.mTabContainer.ensureTabIsVisible(gBrowser.mTabContainer.selectedIndex); var tabsEnum = tabContainer.GetElements(); // sort the tab by "tabPos" var rdfTabs = [], rdfNodeTab; while (tabsEnum.hasMoreElements()) { rdfNodeTab = tabsEnum.getNext(); if (rdfNodeTab instanceof tmRDFResource) { tabPos = this.getIntValue(rdfNodeTab, "tabPos"); rdfTabs.push([tabPos, rdfNodeTab]); } } rdfTabs.sort(this.sortByColumn(0 ,true)); this.initSession(gSessionPath[0], gThisWin); // init the new container befor we start to load data // restore the selected tab first var selectedTabLoaded; if (restoreSelect && lastSelectedIndex in rdfTabs) { selectedTabLoaded = true; aTab = gBrowser.mTabContainer.childNodes[newIndex + lastSelectedIndex]; this.loadOneTab(rdfTabs[lastSelectedIndex][1], aTab); } for (i = 0; i < rdfTabs.length ; i++) { if (selectedTabLoaded && lastSelectedIndex == i) continue; aTab = gBrowser.mTabContainer.childNodes[newIndex + i]; this.loadOneTab(rdfTabs[i][1], aTab); } if (this.saveClosedtabs) this.saveClosedTabs(path, gThisWin, "closedtabs", true); // load prev saved closed tabs and save to current backup gBrowser.mTabContainer.nextTab = 1; // if we open closed window delete this window from closed window list var caller1; if ("tabmixdata" in window) { caller1 = window.tabmixdata.caller; delete window.tabmixdata; } if (caller == "openclosedwindow" || caller1 == "openclosedwindow"){ if (this.nodeHasArc(rdfNodeWindow, "reOpened")) { this.removeSession(path, gSessionPath[0]); this.updateClosedWindowsMenu("check"); } } }, setStripVisibility: function(tabCount) { if (tabCount > 1 && gPref.getBoolPref("browser.tabs.autoHide") && gBrowser.mStrip.collapsed) { // unhide the tab bar gBrowser.setStripVisibilityTo(true); gPref.setBoolPref("browser.tabs.forceHide", false); } }, sortByColumn: function(nCol, bDescending) { var c = nCol; var d = bDescending; return function (n1, n2) { if (n1[c] < n2[c]) return (d) ? -1 : +1; if (n1[c] > n2[c]) return (d) ? +1 : -1; return 0; } }, saveClosedTabs: function(fromPath, toPath, conPath, updateClosedTabsList) { var isClosedTabs = conPath == "closedtabs"; if (isClosedTabs && !(this.saveClosedtabs)) return; var fromOld = this.wrapContainer(fromPath, conPath); if (!(fromOld.Root instanceof tmRDFResource)) return; var toNew = this.wrapContainer(toPath, conPath); var rdfNodeTabs = this.getResource(toPath, "tabs"); var rdfLabelTabs = rdfNodeTabs.QueryInterface(tmRDFResource).Value; var newIndex = -1; while (fromOld.Enum.hasMoreElements()) { var rdfNodeSession = fromOld.Enum.getNext(); if (!(rdfNodeSession instanceof tmRDFResource)) continue; newIndex++; if (isClosedTabs && (fromOld.Count - newIndex > gPref.getIntPref("extensions.tabmix.undoCloseCache"))) continue; var uniqueId = "panel" + Date.now() + newIndex; var rdfLabelSession = rdfLabelTabs + "/" + uniqueId; var newNode = this.RDFService.GetResource(rdfLabelSession); var tabPos = this.getIntValue(rdfNodeSession, "tabPos"); var image = this.getLiteralValue(rdfNodeSession, "image"); var prop = this.getLiteralValue(rdfNodeSession, "properties"); var history = this.getLiteralValue(rdfNodeSession, "history"); var index = this.getIntValue(rdfNodeSession, "index"); var scrollPos = this.getLiteralValue(rdfNodeSession, "scroll"); // including zoom factor var maxCache = gPref.getIntPref("extensions.tabmix.undoCloseCache"); if (this.enableBackup) { // save only if backup enabled toNew.Container.AppendElement(newNode); this.saveTabData(newNode, index, tabPos, image, prop, history, scrollPos); // delete old entry if closedTabs container wasn't empty if (isClosedTabs && (toNew.Container.GetCount() > maxCache)) this.deleteClosedtabAt(1, toPath); } if(updateClosedTabsList) { var savedHistory = this.loadTabHistory(rdfNodeSession); if (savedHistory == null) { tmLog("closed tab at index " + newIndex + " failed to load data from the saved session"); continue; } try { var title = savedHistory.history.getEntryAtIndex(savedHistory.index, true).title; if (!SessionPref.getBoolPref("save.scrollposition")) scrollPos = "0,0,1"; else if (scrollPos.split(",").length < 3) // version befor 0.3.0.603 don't include zoomfactor scrollPos += ",1" gBrowser.closedTabs.push([tabPos, savedHistory.history, title, image, prop, scrollPos]); } catch (e) {tmLog("saveClosedTabs error index " + savedHistory.index + "\n" + e); } // delete old entry if gBrowser.closedTabs wasn't empty if (gBrowser.closedTabs.length > maxCache) gBrowser.closedTabs.shift(); } } if (updateClosedTabsList && gBrowser.closedTabs.length > 0 && document.getElementById("btn_undoclose")) document.getElementById("btn_undoclose").setAttribute("disabled", "false"); }, copyClosedTabsToRDF: function SM_copyClosedTabsToRDF(winPath) { var rdfNodeTo = this.getResource(winPath, "closedtabs"); var toContainer = this.initContainer(rdfNodeTo); var rdfNodeTabs = this.getResource(winPath, "tabs"); var rdfLabelTabs = rdfNodeTabs.QueryInterface(tmRDFResource).Value; var ctabs = gBrowser.closedTabs; var tabCount = ctabs.length; var maxCache = gPref.getIntPref("extensions.tabmix.undoCloseCache"); var aTab, uniqueId, rdfLabelSession, newNode, historyEntry, scrollPos, history; for (var i = 0; i < tabCount; i++) { aTab = ctabs[i]; if (tabCount - i <= maxCache) { uniqueId = "panel" + Date.now() + i; rdfLabelSession = rdfLabelTabs + "/" + uniqueId; newNode = this.RDFService.GetResource(rdfLabelSession); toContainer.AppendElement(newNode); history = this.saveTabHistory(aTab[1]) scrollPos = SessionPref.getBoolPref("save.scrollposition") ? aTab[5] : "0,0,1"; this.saveTabData(newNode, aTab[1].index, aTab[0], aTab[3], aTab[4], history, scrollPos); // delete old entry if closedTabs container wasn't empty if (toContainer.GetCount() > maxCache) this.deleteClosedtabAt(1, winPath); } } this.dataFlush(); }, fixClosedtabTabPos: function(aPos) { if (!(this.saveClosedtabs)) return; var closedTabs = this.wrapContainer(gThisWin, "closedtabs"); while (closedTabs.Enum.hasMoreElements()) { var node = closedTabs.Enum.getNext(); var tabPos = this.getIntValue(node, "tabPos"); if (tabPos >= aPos) this.setIntLiteral(node, "tabPos", tabPos++); } this.dataFlush(); }, deleteAllClosedtabs: function(sessionContainer) { // delete all closed tabs in this session var windowEnum = sessionContainer.GetElements(); while (windowEnum.hasMoreElements()) { var rdfNodeWindow = windowEnum.getNext(); this.deleteWinClosedtabs(rdfNodeWindow.QueryInterface(tmRDFResource).Value); } }, deleteWinClosedtabs: function SM_deleteWinClosedtabs(winPath) { var rdfNodeTabs = this.getResource(winPath, "closedtabs"); var container = this.initContainer(rdfNodeTabs); this.deleteWithProp(container); this.dataFlush(); }, deleteClosedtabAt: function SM_deleteClosedtabAt(index, winPath) { if (!SessionPref.getBoolPref("save.closedtabs")) return; if (typeof(winPath) == 'undefined') winPath = gThisWin; var rdfNodeTabs = this.getResource(winPath, "closedtabs"); var container = this.initContainer(rdfNodeTabs); if (index == "last") index = container.GetCount(); if (index < 1 || index > container.GetCount()) return; var nodeToDelete = container.RemoveElementAt(index, true); var nodeValue = nodeToDelete.QueryInterface(tmRDFResource).Value this.deleteSubtree(nodeValue); if (!container.GetCount()) this.deleteNode(rdfNodeTabs); this.dataFlush(); }, loadOneTab: function SM_loadOneTab(rdfNodeSession, aTab) { aTab.setAttribute("inrestore", "true"); // flag. dont save tab that are in restore phase // load Properties befor we load History var tabProperties = this.getLiteralValue(rdfNodeSession, "properties"); if (tabProperties != "") SessionData.setTabProperties(aTab, tabProperties, true); var aBrowser = gBrowser.getBrowserForTab(aTab); var webNav = aBrowser.webNavigation; var savedHistory = this.loadTabHistory(rdfNodeSession, webNav.sessionHistory); if (savedHistory == null) { tmLog("loadOneTab() - tab at index " + aTab._tPos + " failed to load data from the saved session"); gBrowser.removeTab(aTab); return; } aBrowser._sessionData = { tabPos: aTab._tPos, node: rdfNodeSession }; try { // if url is file and file don't exist it throws an exception, we don't need to reload loacl file var url = webNav.sessionHistory.getEntryAtIndex(savedHistory.index, false).URI.spec; var needToReload = SessionPref.getBoolPref("restore.reloadall") && url.indexOf("file:")!=0; if (needToReload) { window.setTimeout( function (browser) { browser.addEventListener('load', SessionManager.afterTabLoad, true); const nsIWebNavigation = Components.interfaces.nsIWebNavigation; var _webNav = browser.webNavigation; try { var sh = _webNav.sessionHistory; if (sh) _webNav = sh.QueryInterface(nsIWebNavigation); } catch (e) { } try { const flags = nsIWebNavigation.LOAD_FLAGS_BYPASS_PROXY | nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE; _webNav.reload(flags); } catch (e) { } }, 0, aBrowser); } else aBrowser.addEventListener('load', SessionManager.afterTabLoad, true); webNav.gotoIndex(savedHistory.index); } catch (e) {tmLog("error in loadOneTab gotoIndex ? ")} }, // end of "loadOneTab : function(...............)" afterTabLoad: function SM_afterTabLoad(event) { var aBrowser = this; var data = aBrowser._sessionData; // restore scroll position if (SessionPref.getBoolPref("save.scrollposition")) { var XYZ = SessionManager.getLiteralValue(data.node, "scroll", "0,0,1"); if (XYZ != "0,0,1") { XYZ = XYZ.split(","); try { var sHistory = aBrowser.webNavigation.sessionHistory; var curHistory = sHistory.getEntryAtIndex(sHistory.index, false); curHistory.QueryInterface(tmSHEntry).setScrollPosition(XYZ[0], XYZ[1]); } catch (e) {tmLog("loadOneTab error index " + sHistory.index + "\n" + e); } var zoomFactor = XYZ.length == 3 ? XYZ[2] : 1; SessionManager.setScrollPosition(data.tabPos, XYZ[0], XYZ[1], 15, null, zoomFactor); } } gBrowser.mTabs[data.tabPos].removeAttribute("inrestore"); aBrowser.removeEventListener('load', SessionManager.afterTabLoad, true); delete aBrowser._sessionData; // call ensureTabIsVisible for the current tab gBrowser.mTabContainer.ensureTabIsVisible(gBrowser.mTabContainer.selectedIndex); if (aBrowser == gBrowser.mCurrentBrowser && !gBrowser.isBlankBrowser(aBrowser)) window.content.focus(); // check if we restore all tabs if (--gBrowser.tabsToLoad == 0) { delete gBrowser.tabsToLoad; checkBeforeAndAfter(); // just in case (we do it also in setTabTitle if (SessionManager.enableBackup){ var result = SessionManager.saveOneWindow(gSessionPath[0], "windowbackup"); if (result > 0) SessionManager.dataFlush(); } SessionManager.setLiteral(gRDFRoot + "/closedSession/thisSession", "status", "crash"); } }, setScrollPosition: function SM_setScrollPosition(tabPos, x, y, attempts, href, zoom) { // xxx only work for the current index in history. // need to find way to make it work for all pages in history var tab = gBrowser.mTabs[tabPos]; var aBrowser = gBrowser.getBrowserForTab(tab); var bContent = aBrowser.contentWindow; var docViewer; if (aBrowser.docShell.contentViewer) docViewer = aBrowser.markupDocumentViewer; if (!tab.hasAttribute("busy")) { if (bContent.scrollX != x || bContent.scrollY != y) bContent.scrollTo(x, y); if (zoom && docViewer && docViewer.textZoom != zoom) docViewer.textZoom = zoom; } if (attempts && ( bContent.scrollX != x || bContent.scrollY != y || (zoom && docViewer && docViewer.textZoom != zoom) )) { window.setTimeout(SessionManager.setScrollPosition, 25, tabPos, x, y, --attempts, href, zoom); return; } else { // if we save this befor timeout sometimes scroll is not ready yet if (SessionManager.enableBackup) SessionManager.setLiteral(SessionManager.getNodeForTab(tab), "scroll", x + "," + y + "," + zoom); // call by openLinkWithHistory if (href) window.setTimeout( function(aBrowser, aURI) { aBrowser.loadURI(aURI, null, null); }, 0, aBrowser, href); } }, loadTabHistory: function(rdfNodeSession, sHistoryInternal) { var history = this.getLiteralValue(rdfNodeSession, "history"); var tmpData = history.split("|-|"); var sep = tmpData.shift(); // remove seperator from data var historyData = tmpData.join("|-|").split(sep); if (historyData.length < HSitems) { tmLog("error in loadTabHistory" + "\n" + "historyData.length " + historyData.length + "\n" + "historyData " + historyData + "\n" + "history " + history); return null; // if it les then 3 no data !! } if (typeof(sHistoryInternal) == "undefined") sHistoryInternal = Components.classes["@mozilla.org/browser/shistory;1"] .createInstance(tmSHistory); sHistoryInternal = sHistoryInternal.QueryInterface(Components.interfaces.nsISHistoryInternal); var sessionIndex = this.getIntValue(rdfNodeSession, "index"); var historyCount = historyData.length/HSitems; if ( sessionIndex < 0 || sessionIndex >= historyCount ) sessionIndex = historyCount - 1; var index, historyEntry, entryTitle, uriStr, newURI, XY; for ( var i = 0; i < historyCount; i++ ){ index = i * HSitems; if (!this.enableSaveHistory && sessionIndex != i) continue; historyEntry = Components.classes["@mozilla.org/browser/session-history-entry;1"] .createInstance(tmSHEntry); entryTitle = unescape(historyData[index]); uriStr = historyData[index + 1]; if (uriStr == "") uriStr = "about:blank"; newURI = this.IOService.newURI(uriStr, null, null); ("setTitle" in historyEntry) ? historyEntry.setTitle(entryTitle) : historyEntry.SetTitle(entryTitle); ("setURI" in historyEntry) ? historyEntry.setURI(newURI) : historyEntry.SetURI(newURI); historyEntry.saveLayoutStateFlag = true; // xxx check if we can use this to reload tab not from Cache; // is it good to reload ALL the history ??? /* var needToReload = SessionPref.getBoolPref("restore.reloadall") && uriStr.indexOf("file:")!=0; historyEntry.loadType = needToReload ? Components.interfaces.nsIDocShellLoadInfo.loadReloadBypassCache // http://lxr.mozilla.org/seamonkey/source/docshell/base/nsIDocShellLoadInfo.idl#73 : Components.interfaces.nsIDocShellLoadInfo.loadHistory; */ if (SessionPref.getBoolPref("save.scrollposition")) { if (historyData[index + 2] != "0,0") { XY = historyData[index + 2].split(","); historyEntry.setScrollPosition(XY[0], XY[1]); // XY is array [x,y] } } sHistoryInternal.addEntry(historyEntry, true); } if (!this.enableSaveHistory) sessionIndex = 0; return {history: sHistoryInternal, index: sessionIndex}; } }; PK أ6`$$*content/tabmixplus/session/sessionStore.js/* * chrome://tabmixplus/content/session/sessionStore.js * * original code by onemen * */ /* XUL Tab attributes to (re)store Restored in nsSessionStore restoreHistory() */ const _xulAttributes = ["image", "protected", "_locked", "fixed-label", "label-uri", "reload-data"]; var TMP_SessionStore = { /** * @brief - Init nsISessionStore if user enable browser.sessionstore.enabled from about:config * or from Tabmix Options > session. * - Add attribute to nsSessionStore persistTabAttribute. * * @param doInit a Boolean value - true when we need to init nsISessionStore. * * @returns Nothing. */ init: function TMP_ss_init(doInit) { var ss = Cc["@mozilla.org/browser/sessionstore;1"]. getService(Ci.nsISessionStore); if(doInit) { try { ss.init(window); } catch(ex) { dump("nsSessionStore could not be initialized: " + ex + "\n"); return; } } try { _xulAttributes.forEach(function(aAttr) { ss.persistTabAttribute(aAttr); }); } catch(ex) { dump("nsSessionStore could not add Attribute to persistTabAttribute: " + ex + "\n"); } }, /** * @brief make sure that we don't enable both sessionStore and session manager * * @param msgNo a Integer value - msg no. to show. * * @param start a Boolean value - true if we call this function befor startup. * * @returns Nothing. */ setService: function TMP_ss_setSessionService(msgNo, start, win) { if (!gIsFirefox2) return; if(window.setSession || gPref.prefHasUserValue("extensions.tabmix.setDefault")) return; window.setSession = true; var sessionStore = TMP_getBoolPref("", "browser.sessionstore.enabled", true); var sessionManager = gPref.getBoolPref("extensions.tabmix.sessions.manager"); var crashRecovery = gPref.getBoolPref("extensions.tabmix.sessions.crashRecovery"); if (sessionStore && (sessionManager || crashRecovery)) { var promptService = Cc["@mozilla.org/embedcomp/prompt-service;1"] .getService(Ci.nsIPromptService); var bundle_session = document.getElementById("bundle_session_manager"); var msg = start ? bundle_session.getString("sm.disable.msg") + "\n\n" : ""; msg += bundle_session.getString("sm.disable.msg" + msgNo) var buttonPressed = promptService.confirmEx(win || window, "TabMix " + bundle_session.getString("sm.title"), msg, (promptService.BUTTON_TITLE_YES * promptService.BUTTON_POS_0) + (promptService.BUTTON_TITLE_NO * promptService.BUTTON_POS_1), null, null, null, null, {}); if ((msgNo == 1 && buttonPressed == 1) || ((msgNo == 2 && buttonPressed == 0))) gPref.setBoolPref("browser.sessionstore.enabled", false); else { gPref.setBoolPref("extensions.tabmix.sessions.manager", false); gPref.setBoolPref("extensions.tabmix.sessions.crashRecovery", false); } } delete window.setSession; }, /** * @brief remove closed tab from sessionStore list without restore * * @param aIndex a Integer value - 0 or grater index to remove * other value empty the list. * * @returns Nothing. */ removeClosedTab: function TMP_ss_removeClosedTab(aIndex) { if (!gIsFirefox2 || !window.__SSi) return; var ss = Cc["@mozilla.org/browser/sessionstore;1"]. getService(Ci.nsISessionStore); var state = { windows: [], _firstTabs: true }; state.windows[0] = { _closedTabs: [] }; if (aIndex >= 0) { // get closed-tabs from nsSessionStore var closedTabs = eval("(" + ss.getClosedTabData(window) + ")"); // purge closed tab at aIndex closedTabs.splice(aIndex, 1); state.windows[0]._closedTabs = closedTabs; } // replace existing _closedTabs ss.setWindowState(window, state.toSource(), false); }, /** * @brief get imange url from tab xultab data * * @param xultab an object value - xultab from nsSessionStore * * @returns image url or empty string. */ getImage: function TMP_ss_getImage(xultab) { var image; if (xultab) { xultab.split(" ").forEach(function(aAttr) { if (/^([^\s=]+)=(.*)/.test(aAttr) && RegExp.$1 == "image") { image = decodeURI(RegExp.$2); } }); } return image || ""; } } /* ::::::::::::::::::::::::::::::::::::::::::::::::::::: */ // get closed-tabs from nsSessionStore function getClosedTabs() { var ssEnabled = true; try { ssEnabled = gPref.getBoolPref("browser.sessionstore.enabled"); } catch (ex) {} if (!ssEnabled) return; var ss = Cc["@mozilla.org/browser/sessionstore;1"]. getService(Ci.nsISessionStore); if (ss.getClosedTabCount(window) == 0) return; var undoItems = eval("(" + ss.getClosedTabData(window) + ")"); var tab, tabData; for (var i = undoItems.length - 1; i >= 0 ; i--) { tab = undoItems[i]; tabData = tab.state; var history = Components.classes["@mozilla.org/browser/shistory;1"] .createInstance(tmSHistory); history = history.QueryInterface(Components.interfaces.nsISHistoryInternal); var aIdMap = { used: {} }; for (var j in tabData.entries) history.addEntry(TMP_deserializeHistoryEntry(tabData.entries[j], aIdMap), true); // set history index var activeIndex = (tabData.index || tabData.entries.length) - 1; var _blank = history.getEntryAtIndex(activeIndex, true); var scrollPos = (tabData.entries[activeIndex].scroll || "0,0").split(","); scrollPos = [parseInt(scrollPos[0]) || 0, parseInt(scrollPos[1]) || 0]; gBrowser.closedTabs.push([tab.pos, history, tab.title, TMP_SessionStore.getImage(tabData.xultab), "0011111", scrollPos[0] + "," + scrollPos[1] + "," + parseFloat(tabData.zoom || 1) ]); if (gBrowser.closedTabs.length > tabxPrefs.getIntPref("undoCloseCache")) gBrowser.closedTabs.shift(); } if (gBrowser.closedTabs.length > 0 && document.getElementById("btn_undoclose")) document.getElementById("btn_undoclose").setAttribute("disabled", "false"); } function TMP_deserializeHistoryEntry(aEntry, aIdMap) { var shEntry = Cc["@mozilla.org/browser/session-history-entry;1"]. createInstance(Ci.nsISHEntry); var ioService = Cc["@mozilla.org/network/io-service;1"]. getService(Ci.nsIIOService); shEntry.setURI(ioService.newURI(aEntry.url, null, null)); shEntry.setTitle(aEntry.title || aEntry.url); shEntry.setIsSubFrame(aEntry.subframe || false); shEntry.loadType = Ci.nsIDocShellLoadInfo.loadHistory; if (aEntry.cacheKey) { var cacheKey = Cc["@mozilla.org/supports-PRUint32;1"]. createInstance(Ci.nsISupportsPRUint32); cacheKey.data = aEntry.cacheKey; shEntry.cacheKey = cacheKey; } if (aEntry.ID) { // get a new unique ID for this frame (since the one from the last // start might already be in use) var id = aIdMap[aEntry.ID] || 0; if (!id) { for (id = Date.now(); aIdMap.used[id]; id++); aIdMap[aEntry.ID] = id; aIdMap.used[id] = true; } shEntry.ID = id; } var scrollPos = (aEntry.scroll || "0,0").split(","); scrollPos = [parseInt(scrollPos[0]) || 0, parseInt(scrollPos[1]) || 0]; shEntry.setScrollPosition(scrollPos[0], scrollPos[1]); if (aEntry.postdata) { var stream = Cc["@mozilla.org/io/string-input-stream;1"]. createInstance(Ci.nsIStringInputStream); stream.setData(aEntry.postdata, -1); shEntry.postData = stream; } if (aEntry.children && shEntry instanceof Ci.nsISHContainer) { for (var i in aEntry.children) { shEntry.AddChild(TMP_deserializeHistoryEntry(aEntry.children[i], aIdMap), i); } } return shEntry; } /* ::::::::::::::::::::::::::::::::::::::::::::::::::::: */ var TMP_ClosedTabs = { /** * check to see if nsISessionStore is initialized */ get ssIsON() { return gIsFirefox2 && "__SSi" in window; }, setButtonState: function ct_setButtonState(value) { var btn = document.getElementById("btn_undoclose"); if (!btn) return; if (!value) btn.removeAttribute("disabled"); else if (btn.getAttribute("disabled") != "true") btn.setAttribute("disabled", "true"); }, undoCloseTab: function ct_undoCloseTab() { if (this.ssIsON) undoCloseTab(); else gBrowser.undoRemoveTab(); } } PK 6content/tabmixplus/pref/PK ܔf5H-content/tabmixplus/pref/overlaySanitizeUI.xul %tabmixDTD; ]> PK x4+ZZ*content/tabmixplus/pref/pref-appearance.jsvar gPref = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefBranch); var WindowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator); var mainOptions = WindowManager.getMostRecentWindow("mozilla:tabmixopt"); function Appearance_Init() { var allColorPickers = document.getElementsByTagName("colorpicker"); for (var i = 0; i < allColorPickers.length; i++) { var prefstring = allColorPickers[i].getAttribute("prefstring"); allColorPickers[i].color = gPref.getCharPref(allColorPickers[i].getAttribute("prefstring")); } var allCheckboxes = document.getElementsByTagName("checkbox"); for (i = 0; i < allCheckboxes.length; i++) { allCheckboxes[i].checked = gPref.getBoolPref(allCheckboxes[i].getAttribute("prefstring")); } setDisabled("currentTab"); setDisabled("unreadTab"); setDisabled("progressMeter"); } function Appearance_Save() { var allColorPickers = document.getElementsByTagName("colorpicker"); for (var i = 0; i < allColorPickers.length; i++) { gPref.setCharPref(allColorPickers[i].getAttribute("prefstring"), allColorPickers[i].color); } var allCheckboxes = document.getElementsByTagName("checkbox"); for (i = 0; i < allCheckboxes.length; i++) { gPref.setBoolPref(allCheckboxes[i].getAttribute("prefstring"), allCheckboxes[i].checked); } } function setDisabled(id) { if (mainOptions.document.getElementById(id).checked) document.getElementById(id).removeAttribute("disabled"); else setColorpicker(id, false); } function setColorpicker(id, checked) { var cP = document.getElementById(id+"-colorpicker"); cP.disabled = !checked; cP.setAttribute("style", checked ? "opacity: 1.0" : "opacity: 0.5"); } PK v4+y+content/tabmixplus/pref/pref-appearance.xul &incompatible.extensions; PK 5e@y -content/tabmixplus/pref/preferencesOverlay.jsvar preferencesOverlay = { init: function() { var prefWindow = document.getElementById('BrowserPreferences'); this.onPaneLoad(prefWindow.lastSelected); eval("prefWindow.showPane ="+prefWindow.showPane.toString().replace( 'this._outer._selectPane(this._pane);', '$& preferencesOverlay.onPaneLoad(this._pane.id);' )); }, onPaneLoad: function (aPaneID) { switch (aPaneID) { case "paneTabs": this.addButton(); break; case "panePrivacy": this.onPanePrivacyLoad(); break; default: } }, /* ........ paneTabs .............. */ addButton: function () { var radiogroup = document.getElementById('linkTargeting'); if (radiogroup) { radiogroup.removeAttribute('onsyncfrompreference'); var radio = document.createElement('radio'); radio.setAttribute('label', current.label.toLowerCase()); radio.setAttribute('accesskey', current.accesskey); radio.setAttribute('value', '1'); radiogroup.appendChild(radio); radiogroup.value = document.getElementById("browser.link.open_external").value; } var item = document.getElementById('linksOpenInBox') || document.getElementById("paneTabs").childNodes[2]; if (!item) // we are lost :) return; var separator = document.createElement('separator'); item.parentNode.insertBefore(separator, item); var hbox = document.createElement('hbox'); item.parentNode.insertBefore(hbox, separator); var button = document.createElement('button'); button.setAttribute('id', 'btn_tabmixplus'); button.setAttribute('label', tmpOptions); button.setAttribute('oncommand', 'preferencesOverlay.showTabmixOptions();'); hbox.appendChild(button); }, showTabmixOptions: function () { var windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(Components.interfaces.nsIWindowMediator); var anyWindow = windowMediator.getMostRecentWindow('navigator:browser'); if (!anyWindow) { var tabmixopt = windowMediator.getMostRecentWindow("mozilla:tabmixopt"); if (tabmixopt) tabmixopt.close(); var stringBundle = Components.classes["@mozilla.org/intl/stringbundle;1"] .getService(Components.interfaces.nsIStringBundleService) .createBundle("chrome://tabmixplus/locale/tabmix.properties"); var title = stringBundle.GetStringFromName("tabmixoption.error.title"); var msg = stringBundle.GetStringFromName("tabmixoption.error.msg"); var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] .getService(Components.interfaces.nsIPromptService); promptService.alert(window, title, msg); } else anyWindow.TMP_openDialog(-1); }, /* ........ panePrivacy .............. */ onPanePrivacyLoad: function () { if(gPrivacyPane.clearPrivateDataNow) {// clearPrivateDataNow not exist in firefox 1.5 eval("gPrivacyPane.clearPrivateDataNow ="+gPrivacyPane.clearPrivateDataNow.toString().replace( 'glue.sanitize(window || null);', '$& TMP_Sanitizer.tryToSanitize();' )); } } } PK ־H5wձ.content/tabmixplus/pref/preferencesOverlay.xul %pref-tabmixDTD; %tabmixplusDTD; ]> PK 6content/tabmixplus/places/PK t6ٿJ#content/tabmixplus/places/places.js// code by onemen var TMP_Places = { init : function () { window.removeEventListener('load', function () { TMP_Places.init(); }, false); PlacesController.prototype.openLinksInTabs = this.openLinksInTabs; PlacesController.prototype.openSelectedNodeWithEvent = this.openSelectedNodeWithEvent; eval("PlacesController.prototype.buildContextMenu ="+PlacesController.prototype.buildContextMenu.toString().replace( 'return anyVisible;', 'if (anyVisible) TMP_Places.buildContextMenu(); \ $&' )); eval("PlacesController.prototype.openSelectedNodeIn ="+PlacesController.prototype.openSelectedNodeIn.toString().replace( 'openUILinkIn(node.uri, aWhere);', 'if (aWhere == "current" && !TMP_Places.isBookmarklet(node.uri)) aWhere = TMP_Places.fixWhereToOpen(null, aWhere);\ $&' )); // use tab label for bookmark name when user renamed the tab if ("PlacesCommandHook" in window) { eval("PlacesCommandHook.bookmarkPage ="+PlacesCommandHook.bookmarkPage.toString().replace( 'title = webNav.document.title;', 'title = TMP_Places.getTabFixedTitle(aBrowser, url) || webNav.document.title;' )); eval("PlacesCommandHook._getUniqueTabInfo ="+PlacesCommandHook._getUniqueTabInfo.toString().replace( 'tabList.push(uri);', 'tabList.push({uri: uri, title: TMP_Places.getTabFixedTitle(browsers[i], uri)});' ).replace( 'seenURIs.uri.spec = true;', 'seenURIs[uri.spec] = true;' )); } }, buildContextMenu : function() { var _open = document.getElementById("placesContext_open"); var _openInWindow = document.getElementById("placesContext_open:newwindow"); var _openInTab = document.getElementById("placesContext_open:newtab"); TMP_updateContextMenu(_open, _openInWindow, _openInTab, prefStringTMBookmark); }, historyMenu : function (aEvent) { var url = aEvent.target.getAttribute('statustext'); if (url) { var where = this.isBookmarklet(url) ? "current" : this.fixWhereToOpen(aEvent, whereToOpenLink(aEvent, false, true)); openUILinkIn(url, where, false, null); } }, isBookmarklet : function (url) { var jsURL = /^ *javascript:/; return jsURL.test(url) ? true : false; }, // Check whether the node is a bookmark which should be opened as a web panel isOpenInWebPanel : function (node) { if (PlacesUtils.nodeIsBookmark(node)) return PlacesUtils.annotations.itemHasAnnotation(node.itemId, LOAD_IN_SIDEBAR_ANNO); return false; }, fixWhereToOpen: function (aEvent, aWhere, aPref) { var w = getTopWin(); if (!w) return aWhere; var tabBrowser = w.getBrowser(); var aTab = tabBrowser.mCurrentTab; if (typeof(aPref) == "undefined") aPref = prefStringTMBookmark; if ((getBoolPref(aPref) || aTab.hasAttribute("locked"))) if (aEvent && getBoolPref(prefStringTMUseMiddleClick) && (aEvent.button == 1 || aEvent.button == 0 && (aEvent.ctrlKey || aEvent.metaKey))) aWhere = "current"; else if (aWhere == "current" && !( tabBrowser.isBlankNotBusyTab(aTab) )) aWhere = "tab"; return aWhere; }, openSelectedNodeWithEvent: function TMP_PC_openSelectedNodeWithEvent(aEvent) { var node = this._view.selectedURINode; if (node && PlacesUtils.checkURLSecurity(node)) { var where = whereToOpenLink(aEvent); if (TMP_Places.isOpenInWebPanel(node) && where == "current") { var w = getTopWin(); if (w) { w.openWebPanel(node.title, node.uri); return; } } where = TMP_Places.isBookmarklet(node.uri) ? "current" : TMP_Places.fixWhereToOpen(aEvent, where); openUILinkIn(node.uri, where, false, null); } }, openLinksInTabs: function TMP_PC_openLinksInTabs() { var bmGroup = []; var node = this._view.selectedNode; var selectionIsFolder = this._view.hasSingleSelection && PlacesUtils.nodeIsFolder(node); if (selectionIsFolder) { var contents = PlacesUtils.getFolderContents(node.itemId, false, false); for (var i = 0; i < contents.childCount; ++i) { var child = contents.getChild(i); if (PlacesUtils.nodeIsURI(child)) bmGroup.push(child.uri); } } else { var nodes = this._view.getSelectionNodes(); for (i = 0; i < nodes.length; ++i) { if (PlacesUtils.nodeIsURI(nodes[i])) bmGroup.push(nodes[i].uri); } } // If the bookmark group was completely invalid, just bail. if (bmGroup.length != 0) { if (!this._confirmOpenTabs(bmGroup.length)) return; var browserWindow = getTopWin(); if (browserWindow) browserWindow.TMP_Bookmark.openGroup(bmGroup, "tab", selectionIsFolder); else TMP_Places._openBrowserWith(bmGroup.join("|")); } }, _openBrowserWith: function TMP_PC__openBrowserWith(url) { var win = openDialog("chrome://browser/content/browser.xul", "_blank", "chrome,all,dialog=no", url); win.openFromPlaces = true; }, _getBookmarkTitle: function TMP_PC__getBookmarkTitle(url) { var _uri = PlacesUtils._uri(url); var _id = PlacesUtils.bookmarks.getBookmarkIdsForURI(_uri, {})[0]; return _id ? PlacesUtils.bookmarks.getItemTitle(_id): null; }, // start showAddBookmarkUI with user defined title if exist getTabFixedTitle: function TMP_PC_getTabFixedTitle(aBrowser, aURI) { var tabBrowser = getBrowser(); if (tabBrowser == aBrowser) aBrowser = tabBrowser.mCurrentBrowser; var aTab = getBrowser().getTabForBrowser(aBrowser); if (aTab.getAttribute("label-uri") == aURI.spec) return aTab.getAttribute("fixed-label"); return null; } } PK ^~6$content/tabmixplus/places/places.xul PK W6>0content/tabmixplus/places/bookmarkProperties.xul PK 6content/tabmixplus/minit/PK H53 'content/tabmixplus/minit/autoReload.xul %tabmixDTD; %miscDTD; ]> PK y6cRhh!content/tabmixplus/minit/minit.js//code from Dorando and Sboulema's MiniT+, modified by Hemiola SUN // modified by onemen window.addEventListener("load", TMP_miniT_init, false); function TMP_miniT_init() { if (typeof(tablib)=="undefined") return; window.removeEventListener("load", TMP_miniT_init, false); // don't load tabmix into undock sidebar opened by ezsidebar extension var wintype = window.document.documentElement.getAttribute("windowtype"); if (wintype == "mozilla:sidebar") return; // init tabmix functions tablib.init(); TM_init(); flst.init(); TMP_LastTab.init(); TMP_TBP_init(); tabxOnLoad(); window.addEventListener("unload", TM_deinit, false); //this window open form duplicateInWindow or delayRestoreTab if (window.duplicat) NW_waitForSessionHistory(); // dragging tab if (gBrowser.mStrip.hasAttribute("ondraggesture")) { gBrowser.mStrip.setAttribute("ondraggesture", "TMP_TabDragGesture(event);"); gBrowser.mStrip.setAttribute("ondragover", "TMP_TabDragOver(event);"); gBrowser.mStrip.setAttribute("ondragdrop", "TMP_TabDragDrop(event);"); gBrowser.mStrip.setAttribute("ondragexit", "TMP_TabDragExit(event);"); } else { // we are in 1.0.7 gBrowser.mStrip.addEventListener("draggesture", TMP_TabDragGesture, true); gBrowser.mStrip.addEventListener("dragover", TMP_TabDragOver, true); gBrowser.mStrip.addEventListener("dragdrop", TMP_TabDragDrop, true); gBrowser.mStrip.addEventListener("dragexit", TMP_TabDragExit, true); } // check if we can use Firefox Dragmark if ("mTabDropIndicatorBar" in gBrowser) { gBrowser.mTabDropIndicatorBar.addEventListener('dragover', TMP_TabDragOver, true); gBrowser.mTabDropIndicatorBar.addEventListener('dragdrop', TMP_TabDragDrop, true); // always enable tab Drag & Drop in FF 1.5 and above gPref.setBoolPref("extensions.tabmix.enableTabDrag", true); } else // we are in 1.0.7 gPref.setBoolPref("extensions.tabmix.useFirefoxDragmark", false); var stringBundle = document.getElementById("tmp-string-bundle"); TabDNDObserver.draglink = stringBundle.getString("droplink.label") /* don't add it for now // fix from bug 248612 add this to gBrowser // so we add this if the user is on Firefox befor the bug landed if (!gBrowser.mDragOverDelay) { gBrowser.mDragTime = 0; gBrowser.mDragOverDelay = 350; } */ } /////////////////////////////////////////////////////////////////////////// //// Drag and Drop observers function TMP_TabDragGesture(aEvent) { nsDragAndDrop.startDrag(aEvent, TabDNDObserver); aEvent.stopPropagation(); } function TMP_TabDragOver(aEvent) { nsDragAndDrop.dragOver(aEvent, TabDNDObserver); aEvent.stopPropagation(); } function TMP_TabDragDrop(aEvent) { nsDragAndDrop.drop(aEvent, TabDNDObserver); aEvent.stopPropagation(); } function TMP_TabDragExit(aEvent) { nsDragAndDrop.dragExit(aEvent, TabDNDObserver); aEvent.stopPropagation(); } var TabDNDObserver = { gBackupLabel: "", gMsg: null, draglink: "", lastTime: 0, onDragStart: function (event, transferData, action) { if (!gPrefService.getBoolPref("extensions.tabmix.enableTabDrag")) return; if(event.target.localName != "tab" || event.originalTarget.localName == "toolbarbutton") return; for ( var i = 0; i < gBrowser.mTabs.length; i++ ) gBrowser.mTabs[i].setAttribute("showbutton","off"); transferData.data = new TransferData(); var URI = gBrowser.getBrowserForTab(event.target).currentURI; if (URI) { transferData.data.addDataForFlavour("text/x-moz-url", URI.spec + "\n" + event.target.label); transferData.data.addDataForFlavour("text/unicode", URI.spec); transferData.data.addDataForFlavour("text/html", '' + event.target.label + ''); } else { transferData.data.addDataForFlavour("text/unicode", "about:blank"); } }, getSupportedFlavours : function () { var flavourSet = new FlavourSet(); flavourSet.appendFlavour("text/x-moz-url"); flavourSet.appendFlavour("text/unicode"); flavourSet.appendFlavour("application/x-moz-file", "nsIFile"); return flavourSet; }, canDrop: function (aEvent, aDragSession) { if (aDragSession.sourceNode && aDragSession.sourceNode.parentNode == gBrowser.mTabContainer) { var sourceBo = aDragSession.sourceNode.boxObject; if (aEvent.screenX >= sourceBo.screenX && aEvent.screenX <= (sourceBo.screenX +sourceBo.width) && aEvent.screenY >= sourceBo.screenY && aEvent.screenY <= (sourceBo.screenY +sourceBo.height)) return false; } return true; }, onDragOver: function (event, flavours, session) { if (!gPrefService.getBoolPref("extensions.tabmix.enableTabDrag")) session.canDrop = false; var isTabReorder = session.sourceNode && session.sourceNode.parentNode == gBrowser.mTabContainer; var newIndex = this.getNewIndex(event); var oldIndex = session.sourceNode && "_tPos" in session.sourceNode ? session.sourceNode._tPos : -1; var left_right; // 1:right, 0: left, -1: drop link on tab to replace tab if (newIndex < gBrowser.mTabs.length) left_right = this.getLeft_Right(event, newIndex, oldIndex, isTabReorder); else { newIndex = !isTabReorder && gPrefService.getBoolPref("extensions.tabmix.openTabNext") ? gBrowser.mTabContainer.selectedIndex : gBrowser.mTabs.length - 1; left_right = 1; } var replaceTab = false; if (left_right == -1) { // check if tab is lock replaceTab = true; var aTab = gBrowser.mTabs[newIndex]; var isLocked = aTab.hasAttribute("locked") && aTab.getAttribute("locked"); // don't allow to drop on lock tab unless the tab is blanck or the user press Ctrl/Meta Key if (!event.ctrlKey && !event.metaKey && isLocked) { if (!gBrowser.isBlankNotBusyTab(aTab)) session.canDrop = false; } } if (isTabReorder && oldIndex == newIndex) session.canDrop = false; if (session.canDrop && !this.isValidTarget(event, session)) return; // show Drag & Drop message if (!isTabReorder) { // no gNavigatorBundle.getString("droponnewtabbutton") in 1.0.7 this.gMsg = event.originalTarget.id == "tabs-newbutton" && "mTabDropIndicatorBar" in gBrowser ? gNavigatorBundle.getString("droponnewtabbutton") : this.draglink; var statusTextFld = document.getElementById("statusbar-display"); if (statusTextFld.label != this.gMsg) { if (this.gBackupLabel=="") this.gBackupLabel = statusTextFld.label; statusTextFld.label = this.gMsg; } } if(!session.canDrop) { this.clearDragmark(); return; } var hideIndicator = false; var tabhbox = document.getElementById("scroll-tabs-frame"); var index = newIndex+left_right-1; var newTime; if ( event.clientX <= tabhbox.boxObject.x && !gBrowser.mTabContainer.hasAttribute("disableScrollTabsLeft") ) { newTime = new Date().getTime(); if (newTime - this.lastTime > 100) { gBrowser.mTabContainer.tabsScroll(-1); this.lastTime = newTime; } hideIndicator = true; } else if( event.target.localName != "tab" && event.clientX >= (tabhbox.boxObject.x + tabhbox.boxObject.width) && !gBrowser.mTabContainer.hasAttribute("disableScrollTabsRight") ) { newTime = new Date().getTime(); if (newTime - this.lastTime > 100) { gBrowser.mTabContainer.tabsScroll(1); this.lastTime = newTime; } hideIndicator = true; } //xxx check later if we need this else if (!isTabReorder && !replaceTab && event.target.localName != "tab") { // only drop if tab is visible var dropLinkonTabbar = gBrowser.mTabContainer.isTabVisible(newIndex) && (event.target.localName == "tabs" || event.target == gBrowser.mTabDropIndicatorBar.firstChild ); hideIndicator = !dropLinkonTabbar; session.canDrop = dropLinkonTabbar; } // xxx check later if we need this else if (index > 0 && !gBrowser.mTabContainer.isTabVisible(index) && !gBrowser.mTabs[index].collapsed && !gBrowser.mTabContainer.hasAttribute("disableScrollTabsRight")) { newTime = new Date().getTime(); if (newTime - this.lastTime > 100) { gBrowser.mTabContainer.tabsScroll(1); this.lastTime = newTime; } hideIndicator = true; } if ( replaceTab || hideIndicator ) { this.clearDragmark(); return; } this.setDragmark(newIndex, left_right); /* don't add it for now // start fix from bug 248612 if (!isTabReorder && event.target.localName == "tab") { if (!gBrowser.mDragTime) gBrowser.mDragTime = Date.now(); if (Date.now() >= gBrowser.mDragTime + gBrowser.mDragOverDelay) gBrowser.mTabContainer.selectedItem = event.target; return; } // end fix from bug 248612 */ }, onDrop: function (event, dropData, session) { this.clearDragmark(); var isTabReorder = session.sourceNode && session.sourceNode.parentNode == gBrowser.mTabContainer; var newIndex = this.getNewIndex(event); var oldIndex = session.sourceNode && "_tPos" in session.sourceNode ? session.sourceNode._tPos : -1; var left_right; if (newIndex < gBrowser.mTabs.length) left_right = this.getLeft_Right(event, newIndex, oldIndex, isTabReorder); else { newIndex = !isTabReorder && gPrefService.getBoolPref("extensions.tabmix.openTabNext") ? gBrowser.mTabContainer.selectedIndex : gBrowser.mTabs.length - 1; left_right = 1; } if (isTabReorder) { // ctrl key and drop to duplicate tab if ((event.ctrlKey || event.metaKey) && !event.shiftKey && !event.altKey) { gBrowser.TMmoveTabTo(gBrowser.duplicateTab(session.sourceNode), newIndex + left_right); return; } try { var isTabFocused = document.commandDispatcher.focusedElement == gBrowser.mCurrentTab && gBrowser.mTabs[oldIndex] == gBrowser.mCurrentTab; } catch (e) { isTabFocused = false; } newIndex += left_right - (newIndex > oldIndex); gBrowser.TMmoveTabTo(gBrowser.mTabs[oldIndex], newIndex); // move focus to content after draging the selected tab if (isTabFocused) gBrowser.mCurrentBrowser.contentWindow.focus(); gBrowser.mTabs[newIndex].collapsed = false; if ( gBrowser.mTabContainer.getAttribute("flowing") == "multibar" && gBrowser.mTabContainer.getAttribute("multibar") == "scrollbar" && oldIndex < gBrowser.mTabContainer.collapsedTabs ) gBrowser.mTabs[gBrowser.mTabContainer.collapsedTabs-1].collapsed = true; gBrowser.mTabContainer.ensureTabIsVisible(newIndex); checkBeforeAndAfter(); } else { var url = transferUtils.retrieveURLFromData(dropData.data, dropData.flavour.contentType); // valid urls don't contain spaces ' '; if we have a space it isn't a valid url. // Also disallow dropping javascript: or data: urls--bail out if (!url || !url.length || url.indexOf(" ", 0) != -1 || /^\s*(javascript|data):/.test(url)) return; gBrowser.dragDropSecurityCheck(event, session, url); var bgLoad = true; try { bgLoad = gPrefService.getBoolPref("browser.tabs.loadInBackground"); } catch (e) { } if (event.shiftKey) bgLoad = !bgLoad; // shift Key reverse the pref url = getShortcutOrURI(url); var aTab = null; if (left_right > -1) { try { aTab = gBrowser.addTab(url); gBrowser.TMmoveTabTo(aTab, newIndex + left_right); } catch(ex) { // Just ignore invalid urls return; } } else { // Load in an existing tab. aTab = event.target; try { gBrowser.getBrowserForTab(aTab).loadURI(url); } catch(ex) { // Just ignore invalid urls return; } } if (gBrowser.mCurrentTab != aTab) gBrowser.TMP_selectNewForegroundTab(aTab, bgLoad, url); } }, onDragExit: function (event, session) { gBrowser.mDragTime = 0; this.isValidTarget(event, session); }, isValidTarget: function (event, session) { if ( event.clientY <= gBrowser.mStrip.boxObject.y+1 || event.clientX < gBrowser.mStrip.boxObject.x || event.clientY >= gBrowser.mStrip.boxObject.y + gBrowser.mStrip.boxObject.height) { if (document.getElementById("statusbar-display").label == this.gMsg) { document.getElementById("statusbar-display").label = this.gBackupLabel; this.gBackupLabel=""; } this.clearDragmark(event); session.canDrop = false; return false; } return true; }, getNewIndex: function (event) { // start to chack after collapsedTabs // if X is less then the first tab return 0 // check if the tab is visible... if not return gBrowser.mTabs.length // check if Y is below the tab.... if yes go to next row // in the row find the closest tab by X, // if no tab is match return gBrowser.mTabs.length var mX = event.clientX, mY = event.clientY; var i, aTab, tabs = gBrowser.mTabContainer.childNodes; var collapsed = gBrowser.mTabContainer.collapsedTabs; if ( !gBrowser.mTabContainer.hasAttribute("multibar") ) { for (i = event.target.localName == "tab" ? event.target._tPos : collapsed; i < gBrowser.mTabs.length; i++) if (mX < tabs[i].boxObject.x + tabs[i].boxObject.width) return i; } else { for (i = collapsed; i < tabs.length; i++) { if (!gBrowser.mTabContainer.isTabVisible(i)) return tabs.length; aTab = tabs[i]; if (mY >= aTab.baseY) { while (i < tabs.length - 1 && inSameRow(aTab, tabs[i+1]) ) i++; } else if (mX < aTab.boxObject.x + aTab.boxObject.width ) return i; else if (i == tabs.length - 1 || !inSameRow(aTab, tabs[i+1]) ) return i; } } return tabs.length; }, getLeft_Right: function (event, newIndex, oldIndex, isTabReorder) { var clientX = event.clientX; var left_right, aTab = gBrowser.mTabs[newIndex]; if (isTabReorder) { left_right = ( clientX < aTab.boxObject.x + aTab.boxObject.width / 2 ) ? 0 : 1; var isCtrlKey = ((event.ctrlKey || event.metaKey) && !event.shiftKey && !event.altKey); if (!isCtrlKey) { if (newIndex == oldIndex - 1) left_right = 0; else if (newIndex == oldIndex + 1) left_right = 1; } } else { left_right = (clientX < aTab.boxObject.x + aTab.boxObject.width / 4 ) ? 0 : 1; if (left_right == 1 && clientX < aTab.boxObject.x + aTab.boxObject.width * 3 / 4 ) left_right = -1; } return left_right; }, setDragmark: function (index, left_right) { var newIndex = index + left_right; if (gBrowser.hasAttribute("dragmarkindex") && gBrowser.getAttribute("dragmarkindex") == newIndex) return; this.clearDragmark();// clear old dragmark if one exist if (!gPrefService.getBoolPref("extensions.tabmix.useFirefoxDragmark")) { var sameRow = newIndex != 0 && newIndex != gBrowser.mTabs.length && inSameRow(gBrowser.mTabs[newIndex-1], gBrowser.mTabs[newIndex]); if (sameRow || left_right==0) this.setDragmarkAttribute(gBrowser.mTabs[newIndex], "atLeft"); if (sameRow || left_right==1) this.setDragmarkAttribute(gBrowser.mTabs[newIndex-1], "atRight"); } else { // code for firefox indicator var ib = gBrowser.mTabDropIndicatorBar; var ind = ib.firstChild; ib.setAttribute("dragging", "true"); var tabStripBoxObject = document.getElementById("scroll-tabs-frame").boxObject; var halfIndWidth = Math.floor((ind.boxObject.width + 1) / 2); var newMarginLeft; var minMarginLeft = tabStripBoxObject.x - halfIndWidth - ib.boxObject.x; var maxMarginLeft = Math.min((minMarginLeft + tabStripBoxObject.width), (ib.boxObject.x + ib.boxObject.width - ind.boxObject.width)); if (gTabbarPosition == 0) ib.setAttribute("dragging", "false"); if ( left_right == 0 ) newMarginLeft = gBrowser.mTabs[newIndex].boxObject.screenX - gBrowser.boxObject.screenX - halfIndWidth; else newMarginLeft = gBrowser.mTabs[index].boxObject.screenX + gBrowser.mTabs[index].boxObject.width - gBrowser.boxObject.screenX - halfIndWidth; // ensure we never place the drop indicator beyond our limits if (newMarginLeft < minMarginLeft) newMarginLeft = minMarginLeft; else if (newMarginLeft > maxMarginLeft) newMarginLeft = maxMarginLeft; ind.style.marginLeft = newMarginLeft + 'px'; if ( gTabbarPosition == 1) { ind.style.marginTop = gBrowser.mTabs[index].boxObject.screenY - ib.boxObject.screenY + "px"; ind.style.backgroundPosition = "50% 0%"; } else { var offset = gFirefox2DefaultTheme ? -3 : 0; ind.style.marginBottom = gBrowser.mTabContainer.boxObject.screenY - gBrowser.mTabs[index].boxObject.screenY + offset + "px"; ind.style.backgroundPosition = "50% 100%"; ib.setAttribute("dragging", "true"); } } gBrowser.setAttribute("dragmarkindex", newIndex); }, clearDragmark: function () { if (!gBrowser.hasAttribute("dragmarkindex")) return; if (!gPrefService.getBoolPref("extensions.tabmix.useFirefoxDragmark")) { var index = gBrowser.getAttribute("dragmarkindex"); if (index != gBrowser.mTabs.length && gBrowser.mTabs[index].hasAttribute("dragmark")) this.removetDragmarkAttribute(gBrowser.mTabs[index]); if (index != 0 && gBrowser.mTabs[index-1].hasAttribute("dragmark")) this.removetDragmarkAttribute(gBrowser.mTabs[index-1]); } else gBrowser.mTabDropIndicatorBar.setAttribute('dragging','false'); gBrowser.removeAttribute("dragmarkindex"); }, removetDragmarkAttribute: function (tab) { tab.removeAttribute("dragmark"); if (TMP_getBoolPref(tabxBranch, "flexTabs", false) && TMP_getIntPref(tabxBranch, "maxWidth", 250) != TMP_getIntPref(tabxBranch, "minWidth", 30) && tab.hasAttribute("width")) window.setTimeout( function () {tab.removeAttribute("width");}, 0); }, setDragmarkAttribute: function (tab, markSide) { if (TMP_getBoolPref(tabxBranch, "flexTabs", false) && TMP_getIntPref(tabxBranch, "maxWidth", 250) != TMP_getIntPref(tabxBranch, "minWidth", 30)) tab.setAttribute("width", tab.boxObject.width); tab.setAttribute("dragmark", markSide); } } // TabDNDObserver end function TMP_goButtonClick(event) { // if go-Button has oncommand attribute we are befor bug 279687 landed if (!event.target.hasAttribute('oncommand') && event.button == 0) handleURLBarCommand(event); else if(event.button == 1) { // when user middle-click on go-Button duplicate current tab // unless the user typed value into the address bar var postData = { }; canonizeUrl(event, postData); var url = gURLBar.value; if (url == gBrowser.currentURI.spec) gBrowser.duplicateTab(gBrowser.mCurrentTab); else { gURLBar.value = gBrowser.currentURI.spec; gBrowser.userTypedValue = null; openUILink(url, event, false, false, true, postData.value); } } } function TM_BrowserHome() { var homePage = gHomeButton.getHomePage(); if (TMP_whereToOpen(false).inNew) { var urls = homePage.split("|"); var firstTabAdded = gBrowser.addTab(urls[0]); var bgLoad = getBoolPref("browser.tabs.loadBookmarksInBackground", false); content.focus(); gBrowser.TMP_selectNewForegroundTab(firstTabAdded, bgLoad, urls[0]); for (var i = 1; i < urls.length; ++i) gBrowser.addTab(urls[i]); } else loadOneOrMoreURIs(homePage); } var undocloseTabButtonObserver = { onDragOver: function(aEvent, aFlavour, aDragSession) { var aLocalName = aDragSession.sourceNode ? aDragSession.sourceNode.localName : null; if (aLocalName!="tab") { aDragSession.canDrop = false; return true; } var statusTextFld = document.getElementById("statusbar-display"); var stringBundle = document.getElementById("tmp-string-bundle"); statusTextFld.label = stringBundle.getString("droptoclose.label"); aEvent.target.setAttribute("dragover", "true"); return true; }, onDragExit: function (aEvent, aDragSession) { var aLocalName = aDragSession.sourceNode ? aDragSession.sourceNode.localName : null; if (aLocalName!="tab") return; var statusTextFld = document.getElementById("statusbar-display"); statusTextFld.label = ""; aEvent.target.removeAttribute("dragover"); }, onDrop: function (aEvent, aXferData, aDragSession) { var aLocalName = aDragSession.sourceNode ? aDragSession.sourceNode.localName : null; if (aLocalName=="tab") gBrowser.removeTab(aDragSession.sourceNode); }, getSupportedFlavours: function () { var flavourSet = new FlavourSet(); flavourSet.appendFlavour("text/x-moz-url"); return flavourSet; } } const prefStringTMHistory = "extensions.tabmix.opentabfor.history"; const NC_NS_TM = "http://home.netscape.com/NC-rdf#"; const prefStringTMUseMiddleClick = "extensions.tabmix.middlecurrent"; const prefStringTMBookmark = "extensions.tabmix.opentabfor.bookmarks"; function isBookmarkletTM(aSelection, aDS) { if (aSelection && (aSelection.length == 1) && ((aSelection.type[0] == "Bookmark") || (aSelection.type[0] == "ImmutableBookmark"))) { var jsURL = /^ *javascript:/; return jsURL.test(BookmarksUtils.getProperty(aSelection.item[0], NC_NS_TM+"URL", aDS)); } else return false; } function openInWebPanelTM(aSelection, aDS) { if (aSelection && (aSelection.length == 1) && ((aSelection.type[0] == "Bookmark") || (aSelection.type[0] == "ImmutableBookmark"))) return BMDS.GetTarget(aSelection.item[0], RDF.GetResource(NC_NS_TM + "WebPanel"), true); else return false; } function whereToOpenLinkTabmix(aEvent, prefString, aSelection, aDS) { var w = getTopWin(); if (!w) return "window"; var browserTarget = aEvent ? whereToOpenLink(aEvent) : "current"; var topBrowser = w.document.getElementById("content"); var prefService = Components.classes['@mozilla.org/preferences-service;1'] .getService(Components.interfaces.nsIPrefService).getBranch(null); if ((prefService.getBoolPref(prefString) || topBrowser.mCurrentTab.hasAttribute("locked")) && !isBookmarkletTM(aSelection, aDS) && !openInWebPanelTM(aSelection, aDS)) { var _button = aEvent instanceof MouseEvent ? aEvent.button : 0; if (aEvent && prefService.getBoolPref(prefStringTMUseMiddleClick) && (_button == 1 || _button == 0 && (aEvent.ctrlKey || aEvent.metaKey))) browserTarget = "current"; else { if ((browserTarget == "current") && (topBrowser.mCurrentBrowser.webProgress.isLoadingDocument || (topBrowser.mCurrentBrowser.currentURI.spec != "about:blank"))) browserTarget = "tab"; } } return browserTarget; } function TMP_whereToOpen(pref, altKey) { var aTab = gBrowser.mCurrentTab; var isBlankTab = gBrowser.isBlankNotBusyTab(aTab); var isLockTab = !isBlankTab && aTab.hasAttribute("locked"); var openTabPref = typeof(pref) == "string" ? gPref.getBoolPref(pref) : pref; if (typeof(altKey) != "undefined") { // don't reuse balnk tab if the user press alt key when the pref is to open in current tab if (altKey && !openTabPref) isBlankTab = false; // see bug 315034 If search is set to open in a new tab, // Alt+Enter should open the search result in the current tab // so here we reverse the pref if user press Alt key openTabPref = (altKey ^ openTabPref) == 1; } return { inNew: !isBlankTab && (isLockTab || openTabPref), lock: isLockTab }; } // update context menu for bookmarks manager and sidebar // for bookmarks/places, history, sage and more..... function TMP_updateContextMenu(open, openInWindow, openInTab, pref) { // if all 3 was hidden ... probably "Open all in Tabs" is visible if (open.hidden && openInWindow.hidden && openInTab.hidden) return; var w = getTopWin(); if (w) { var where = w.TMP_whereToOpen(pref); if (!openInWindow.hidden && w.gSingleWindowMode) openInWindow.hidden = true; else if (openInWindow.hasAttribute("default")) openInWindow.removeAttribute("default"); TMP_setItem(openInTab, "default", where.inNew ? "true" : null); if (open.hidden != where.lock) open.hidden = where.lock; if (!open.hidden) TMP_setItem(open, "default", !where.inNew ? "true" : null); } else { open.hidden = true; openInTab.hidden = true; openInWindow.hidden = false; openInWindow.setAttribute("default", true); } } // Show/hide one item (specified via name or the item element itself). function TMP_showItem ( itemOrId, show ) { var item = typeof(itemOrId) == "string" ? document.getElementById(itemOrId) : itemOrId; if (item) item.hidden = !show; } function TMP_setItem(itemOrId, attrib, val) { var item = typeof(itemOrId) == "string" ? document.getElementById(itemOrId) : itemOrId; if (val == null) item.removeAttribute(attrib); else if (!item.hasAttribute(attrib) || item.getAttribute(attrib) != val); item.setAttribute(attrib, val); } PK ab5ʎ*content/tabmixplus/minit/setFixedLabel.xul %tabmixDTD; %miscDTD; ]> PK X6PVG"content/tabmixplus/minit/tablib.js// code modified by Hemiola SUN, 2005-04-14 and fixed by onemen if(!window.tablib || tablib.version < 20051128) var tablib = { version : [20051128], init : function(){ if(getBrowser().TMmoveTabTo) return; if(!getBrowser().moveTabTo) { // prevent click on close tab button to select tab in FF 1.0.x if (gIsOldBrowser){ var _setter = gBrowser.mTabContainer.__lookupSetter__("selectedItem"); eval("_setter ="+_setter.toString().replace( 'if (!val.selected) {', 'if (val.onclosebutton) { delete val.onclosebutton; return this.selectedItem; } \ $&' )); gBrowser.mTabContainer.__defineGetter__("selectedItem", gBrowser.mTabContainer.__lookupGetter__("selectedItem")); gBrowser.mTabContainer.__defineSetter__("selectedItem", _setter); } gBrowser.__defineGetter__("mTabs", function(){return gBrowser.mTabContainer.childNodes;}); gBrowser.__defineGetter__("browsers", function(){ var browsers = new Array(); for(var i=0; i < this.mTabs.length; i++) browsers.push(this.getBrowserForTab(this.mTabs[i])); return browsers; }); gBrowser.mPanelContainer.__defineSetter__("selectedIndex", gBrowser.mPanelContainer.__lookupSetter__("selectedIndex") ); gBrowser.mPanelContainer.__defineGetter__("selectedIndex", function(){ return gBrowser.mTabContainer.selectedIndex; }); gBrowser.getBrowserAtIndex = function(aIndex){ return this.getBrowserForTab(this.mTabs[aIndex]); } try {eval("bengoodger.com.tabdownloader._saveSubsequentTabs ="+bengoodger.com.tabdownloader._saveSubsequentTabs.toString().replace( 'var startBrowser = this._findNextBrowser(tabbrowser.selectedBrowser);', 'try{var startBrowser = tabbrowser.getBrowserAtIndex(tabbrowser.mCurrentTab._tPos+1);}catch(e){return;}')); } catch(e){} for(var i = 0; i < gBrowser.mTabs.length; i++) { var uniqueId = "panel"+(new Date()).getTime()+i; gBrowser.mPanelContainer.childNodes[i].id = uniqueId; gBrowser.mTabs[i].linkedPanel = uniqueId; gBrowser.mTabs[i]._tPos = i; } if(gBrowser.mTabs.length > 0) gBrowser.mCurrentTab.selected = true; gBrowser.mTabContainer.nextTab = 1; eval("gBrowser.addTab ="+gBrowser.addTab.toString().replace( 'if (!blank)', 'var uniqueId = "panel"+(new Date()).getTime()+position; \ this.mPanelContainer.lastChild.id = uniqueId; \ t.linkedPanel = uniqueId; \ t.linkedBrowser = b; \ t._tPos = position; \ if (t.previousSibling.selected) t.setAttribute("afterselected", true); \ this.TMP_openTabNext(t, blank);\ $&' )); eval("gBrowser.removeTab ="+gBrowser.removeTab.toString().replace( 'var l = this.mTabContainer.childNodes.length;', 'if (aTab.hasAttribute("protected")) return; $&' ).replace( 'this.mPanelContainer.removeChild(this.mPanelContainer.childNodes[index]);', 'this.mPanelContainer.removeChild(oldBrowser.parentNode);' ).replace( 'this.mPanelContainer.selectedIndex = newIndex;', 'newIndex = (this.mCurrentTab._tPos == 0 ? 0 : this.mCurrentTab._tPos-1); \ for(var i = oldTab._tPos; i < this.mTabs.length; i++){this.mTabs[i]._tPos = i;} \ this.mTabBox.selectedPanel = this.getBrowserForTab(this.mCurrentTab).parentNode; \ this.mCurrentTab.selected = true; \ SessionManager.tabClosed(oldTab);' ).replace( 'var oldTab = aTab;', '$& saveClosedTab(oldTab, oldBrowser);' ).replace( 'this.selectedTab = this.mTabContainer.childNodes[newIndex];', 'this.mTabContainer.nextTab = 1; newIndex = this.selectAfterRemove(oldTab, newIndex); $&' )); eval("gBrowser.onTitleChanged ="+gBrowser.onTitleChanged.toString().replace( 'var tab = tabBrowser.mTabContainer.childNodes[i];', 'var tab = document.getAnonymousElementByAttribute(tabBrowser, "linkedpanel", this.parentNode.id);')); gBrowser.getBrowserForTab = function (aTab) { var panel = document.getElementById(aTab.linkedPanel); return panel ? panel.firstChild.nextSibling : null; } } // end if(!getBrowser().moveTabTo) else { // we in FF 1.5+ after bug 179656 Allow drag-and-drop reordering of tabs landed if(gBrowser.mTabs.length > 0) gBrowser.mCurrentTab.__selected = true; gBrowser.mTabContainer.nextTab = 1; eval("gBrowser.addTab ="+gBrowser.addTab.toString().replace( 'if (!blank)', 'var _caller = this.addTab.caller.name; \ if (_caller != "sss_restoreWindow" && _caller != "sss_undoCloseTab") this.TMP_openTabNext(t, blank);\ $&' )); eval("gBrowser.removeTab ="+gBrowser.removeTab.toString().replace( 'var l = this.mTabContainer.childNodes.length;', 'if (aTab.hasAttribute("protected")) return; $&' ).replace( 'var oldTab = aTab;', '$& saveClosedTab(oldTab, oldBrowser);' ).replace( 'this.selectedTab = this.mTabContainer.childNodes[newIndex];', 'this.mTabContainer.nextTab = 1; newIndex = this.selectAfterRemove(oldTab, newIndex); $&' ).replace( 'oldBrowser.focusedElement = null;', '$& SessionManager.tabClosed(oldTab);' )); // Fx 3.0 after bug 370742 "selectNewTab" method replaced by "_selectNewTab" if ("_selectNewTab" in gBrowser.mTabContainer) eval("gBrowser.mTabContainer._selectNewTab ="+gBrowser.mTabContainer._selectNewTab.toString().replace( '{', '{ if(!gPref.getBoolPref("extensions.tabmix.mouseDownSelect") && this._selectNewTab.caller.name == "setTab") return; ' )); else eval("gBrowser.mTabContainer.selectNewTab ="+gBrowser.mTabContainer.selectNewTab.toString().replace( '{', '{ if(!gPref.getBoolPref("extensions.tabmix.mouseDownSelect") && this.selectNewTab.caller.name == "setTab") return; ' )); eval("gBrowser.moveTabTo ="+gBrowser.moveTabTo.toString().replace( 'return aTab;', 'this.mTabContainer.ensureTabIsVisible(aTab._tPos); \ $&' )); } // end of new eval after bug 179656 Allow drag-and-drop reordering of tabs landed // bug 281012 - Closing the last tab loads an untitled page (about:blank) fixed in Firefox 2.0 if (gIsFirefox2) { eval("gBrowser.removeTab ="+gBrowser.removeTab.toString().replace( 'this.addTab("about:blank");', 'if (this.mPrefs.getBoolPref("extensions.tabmix.keepLastTab")) \ return; \ $& \ setURLBarFocus();' ).replace( // update image and label that we use in closed tabs list 'var evt = document.createEvent("Events")', 'if (aTab.getAttribute("image") != this.getBrowserForTab(aTab).mIconURL) aTab.setAttribute("image", this.getBrowserForTab(aTab).mIconURL); \ if (aTab.label == this.mStringBundle.getString("tabs.loading")) \ this.setTabTitle(aTab); \ tabxTabClosed(aTab); \ $&' )); } else { eval("gBrowser.removeTab ="+gBrowser.removeTab.toString().replace( '(l == 1)', '(l == 1 && this.mPrefs.getBoolPref("browser.tabs.autoHide"))' ).replace( '(l == 2)', '(l == 1) { \ if (this.mPrefs.getBoolPref("extensions.tabmix.keepLastTab")) \ return; \ this.addTab("about:blank"); l++; \ setURLBarFocus();} else if $&' ).replace( // update image and label that we use in closed tabs list 'var index = -1;', 'if (aTab.getAttribute("image") != this.getBrowserForTab(aTab).mIconURL) aTab.setAttribute("image", this.getBrowserForTab(aTab).mIconURL); \ if (aTab.label == this.mStringBundle.getString("tabs.loading")) \ this.setTabTitle(aTab); \ tabxTabClosed(aTab); \ $&' )); } if (gIsFirefox2) eval("BrowserCloseTabOrWindow ="+BrowserCloseTabOrWindow.toString().replace( 'gBrowser.removeCurrentTab();', 'closeLastTab();' ).replace( 'gBrowser.removeCurrentTab();', 'closeLastTab();' )); eval("BrowserCloseTabOrWindow ="+BrowserCloseTabOrWindow.toString().replace( 'BrowserCloseWindow();', 'closeLastTab();' )); function closeLastTab() { if (gBrowser.tabContainer.childNodes.length > 1 || gPref.getBoolPref("extensions.tabmix.keepWindow")) gBrowser.removeCurrentTab(); else BrowserCloseWindow(); } //don't open link from external application in new window when in single window mode //don't open link from external application in current tab if the tab is locked eval("nsBrowserAccess.prototype.openURI ="+nsBrowserAccess.prototype.openURI.toString().replace( 'switch (aWhere) {', 'const _Ci = Components.interfaces;\ if (gSingleWindowMode && aWhere == _Ci.nsIBrowserDOMWindow.OPEN_NEWWINDOW) {;\ aWhere = _Ci.nsIBrowserDOMWindow.OPEN_NEWTAB;}\ if (aWhere != _Ci.nsIBrowserDOMWindow.OPEN_NEWWINDOW && aWhere != _Ci.nsIBrowserDOMWindow.OPEN_NEWTAB){\ var isLockTab = TMP_whereToOpen(null).lock; if(isLockTab) aWhere = _Ci.nsIBrowserDOMWindow.OPEN_NEWTAB;}\ $&' )); // reuse current tab if it's blank tab for external link set to open new tab if (gIsFirefox2) { eval("nsBrowserAccess.prototype.openURI ="+nsBrowserAccess.prototype.openURI.toString().replace( 'var newTab = gBrowser.loadOneTab("about:blank", null, null, null, loadInBackground, false);', 'var currentIsBlank = gBrowser.isBlankNotBusyTab(gBrowser.mCurrentTab);\ var newTab = currentIsBlank ? gBrowser.mCurrentTab : gBrowser.loadOneTab("about:blank", null, null, null, loadInBackground, false);\ if (currentIsBlank) content.focus();' )); } else { eval("nsBrowserAccess.prototype.openURI ="+nsBrowserAccess.prototype.openURI.toString().replace( 'var newTab = gBrowser.addTab("about:blank");', 'var currentIsBlank = gBrowser.isBlankNotBusyTab(gBrowser.mCurrentTab);\ var newTab = currentIsBlank ? gBrowser.mCurrentTab : gBrowser.addTab("about:blank");' ).replace( 'gBrowser.selectedTab = newTab;', '{ if (currentIsBlank) content.focus();\ else gBrowser.selectedTab = newTab; }' )); } //inverse focus of middle/ctrl/meta clicked links eval("openNewTabWith ="+openNewTabWith.toString().replace( 'if (event && event.shiftKey)', 'if (event && (event.button == 1 || event.button == 0 && ( event.ctrlKey || event.metaKey )) && (prefSvc.getBoolPref("extensions.tabmix.inversefocusLinks") || !prefSvc.getBoolPref("extensions.tabmix.inversefocusLinks") && event.shiftKey))' )); // for Firefox 3.0 eval("openNewTabWith ="+openNewTabWith.toString().replace( 'if (aEvent && aEvent.shiftKey)', 'if (aEvent && (aEvent.button == 1 || aEvent.button == 0 && ( aEvent.ctrlKey || aEvent.metaKey )) && (prefSvc.getBoolPref("extensions.tabmix.inversefocusLinks") || !prefSvc.getBoolPref("extensions.tabmix.inversefocusLinks") && aEvent.shiftKey))' )); //inverse focus of middle/ctrl/meta clicked bookmarks/history eval("whereToOpenLink ="+whereToOpenLink.toString().replace( 'var middle = !ignoreButton && e.button == 1;', 'var middle = "button" in e && !ignoreButton && e.button == 1;' ).replace( 'if (shift)', 'if (getBoolPref("extensions.tabmix.inversefocusOther", true) || (!getBoolPref("extensions.tabmix.inversefocusOther", true) && shift))' )); //use bookmark labels when needed to if ("constructGoMenuItem" in window) eval("constructGoMenuItem ="+constructGoMenuItem.toString().replace( 'menuitem.setAttribute("statustext", url);', 'menuitem.setAttribute("statustext", url); \ if ( gPref.getBoolPref("extensions.tabmix.titlefrombookmark") ) { \ var bookMarkName = getTitleFromBookmark(url); \ if (bookMarkName) title = bookMarkName;} ' )); eval("FillHistoryMenu ="+FillHistoryMenu.toString().replace( /entry.title/g, 'menuItemTitle(entry)' )); eval("gBrowser.updateTitlebar ="+gBrowser.updateTitlebar.toString().replace( 'if (!docTitle)', 'var aUrl = this.contentDocument.baseURI; aUrl = (aUrl) ? aUrl : this.currentURI.spec ; \ if ( gPref.getBoolPref("extensions.tabmix.titlefrombookmark") ) { \ var bookMarkName = getTitleFromBookmark(aUrl); \ if (bookMarkName) docTitle = bookMarkName;} \ var aTab = this.mCurrentTab; if (aTab.hasAttribute("label-uri") && aTab.getAttribute("label-uri") == aUrl) docTitle =aTab.getAttribute("fixed-label"); \ if (!docTitle)' )); eval("gBrowser.setTabTitle ="+gBrowser.setTabTitle.toString().replace( 'if (!title) {', 'var cIndex = this.mTabContainer.selectedIndex;\ var currentTabVisible = this.mTabContainer.isTabVisible(cIndex);\ var aUrl = browser.contentDocument.baseURI; aUrl = (aUrl) ? aUrl : browser.currentURI.spec ;\ if ( gPref.getBoolPref("extensions.tabmix.titlefrombookmark") ) { \ var bookMarkName = getTitleFromBookmark(aUrl); \ if (bookMarkName) title = bookMarkName;} \ if (aTab.hasAttribute("label-uri") && aTab.getAttribute("label-uri") == aUrl) title = aTab.getAttribute("fixed-label"); \ if (!title) {' ).replace( 'aTab.setAttribute("crop", crop);', '$& \ if (aTab.hasAttribute("mergeselected")) aTab.label = "(*) "+aTab.label; \ if (TMP_getBoolPref(tabxBranch, "flexTabs", false) && TMP_getIntPref(tabxBranch, "maxWidth", 250) != TMP_getIntPref(tabxBranch, "minWidth", 30)) { \ if (aTab.hasAttribute("width")) aTab.removeAttribute("width"); \ tabBarScrollStatus(); checkBeforeAndAfter(); \ if (currentTabVisible != this.mTabContainer.isTabVisible(cIndex)) this.mTabContainer.ensureTabIsVisible(cIndex);}' )); // XXX content.focus(); here is to fix bug in FF trunk..... eval("BrowserHomeClick ="+BrowserHomeClick.toString().replace( 'var where = whereToOpenLink(aEvent);', '$& \ if (where == "current" && TMP_whereToOpen(false).inNew) where = "tab";' ).replace( 'gBrowser.loadTabs(urls, loadInBackground);', 'window.content.focus(); \ $&' )); var searchbar = document.getElementById("searchbar"); // for firefox up to 1.5 if(searchbar && "mTextbox" in searchbar) { eval("searchbar.mTextbox.onTextEntered ="+searchbar.mTextbox.onTextEntered.toString().replace( 'SearchLoadURL(searchURL, (evt && evt.altKey));', 'SearchLoadURL(searchURL, evt);' ).replace( 'SearchLoadURL(searchURL, (evt && evt.altKey || openInTab));', 'SearchLoadURL(searchURL, evt);' ).replace( 'SearchLoadURL(searchURL, ((evt && evt.altKey) ^ openInTab));', 'SearchLoadURL(searchURL, evt);' )); // open new tab from "Add Engines.." if tab is lock or pref "extensions.tabmix.opentabfor.search" is true // we dont need this in Firefox2 if (!gIsFirefox2) eval("searchbar.mTextbox.onEnginePopupCommand ="+searchbar.mTextbox.onEnginePopupCommand.toString().replace( 'loadURI(regionBundle.getString("searchEnginesURL"), null, null);', 'var openNewTab = TMP_whereToOpen("extensions.tabmix.opentabfor.search").inNew; \ if (openNewTab) { \ var newTab = getBrowser().addTab(regionBundle.getString("searchEnginesURL")); \ getBrowser().TMP_selectNewForegroundTab(newTab, false); \ content.focus(); \ } \ else loadURI(regionBundle.getString("searchEnginesURL"), null, null);' )); } // XXX need to fix TMP_SearchLoadURL to work like in Fx 3.0 // #351253 [Firefox:Search]-Search button misinterprets modifiers when clicked [All] // // for firefox 2.0 + // new handleSearchCommand in search.xml version 1.47 from bug 335441 2006-05-06 // Bug 336925: Middle clicking search button should open new tab search.xml version 1.67 if(searchbar && "handleSearchCommand" in searchbar) eval("searchbar.handleSearchCommand ="+searchbar.handleSearchCommand.toString().replace( 'this.doSearch', 'TMP_SearchLoadURL(textValue, aEvent, true); if (aEvent) aEvent.stopPropagation(); return; \ $&' )); // fix webSearch to open new tab if tab is lock if("BrowserSearch" in window) eval("BrowserSearch.webSearch ="+BrowserSearch.webSearch.toString().replace( 'loadURI(searchForm, null, null, false);', 'gBrowser.TMP_openURI(searchForm);' )); gBrowser.TMP_openURI = function (uri) { var openNewTab = TMP_whereToOpen(true).lock; if (openNewTab) this.loadOneTab(uri, null, null, null, false, false); else loadURI(uri, null, null, false); } eval("BrowserCloseWindow ="+BrowserCloseWindow.toString().replace( 'closeWindow', 'SessionManager.deinit(numberOfWindows() == 1, true); $&' )); eval("WindowIsClosing ="+WindowIsClosing.toString().replace( 'var reallyClose = browser.warnAboutClosingTabs(true);', 'var pref = "extensions.tabmix.warnAboutClosingTabs.timeout"; \ var startTime = new Date().valueOf(); \ var oldTime = gPref.prefHasUserValue(pref) ? gPref.getCharPref(pref) : 0; \ var reallyClose = browser.warnAboutClosingTabs("All_onExit"); \ gPref.setCharPref(pref, oldTime*1 + (new Date().valueOf() - startTime));' ).replace( 'return closeWindow(false);', '{ \ var _close = closeWindow(false); \ if (_close) SessionManager.deinit(numberOfWindows() == 1, WindowIsClosing.caller.name != "restartApp"); \ return _close; \ }' )); window.tryToClose = WindowIsClosing; //overlay BrowserToolboxCustomizeDone eval("BrowserToolboxCustomizeDone ="+BrowserToolboxCustomizeDone.toString().replace( 'if (aToolboxChanged) {', '$&\ TMP_BrowserToolboxCustomizeDone();' )); // with MR Tech's local install // don't open trober in current tab when tab is locked // or trober is to diffrent site then the current if (typeof(Local_Install) == "object") eval("Local_Install.openThrobber ="+Local_Install.openThrobber.toString().replace( 'local_common.openURL(local_common.getThrobberURL(), inNewTab);', 'var url = local_common.getThrobberURL(); \ local_common.openURL(url, inNewTab ? inNewTab : TMP_checkCurrent(url) == "tab");' )); // for firefox 2.0 + // XXX this is temporary untile we use the build-in closedtabs list if(gIsFirefox2){ eval("undoCloseTab ="+undoCloseTab.toString().replace( '!gPrefService.getBoolPref("browser.tabs.autoHide") &&', '' ).replace( 'ss.undoCloseTab(window, aIndex || 0);', 'aIndex = aIndex || 0; var ctabs = gBrowser.closedTabs; \ ctabs.splice(ctabs.length - 1 - aIndex, 1); \ if (ctabs.length < 1) TMP_ClosedTabs.setButtonState(true); \ $&' )); // patch for bug 352524 [SessionStore] Exception when History menu clicked while SessionStore disabled eval("HistoryMenu.toggleRecentlyClosedTabs ="+HistoryMenu.toggleRecentlyClosedTabs.toString().replace( 'var undoPopup = document.getElementById("historyUndoPopup");', '$& \ document.getElementById("historyUndoMenu").setAttribute("hidden", !window.__SSi); \ document.getElementById("endUndoSeparator").setAttribute("hidden", !window.__SSi); \ if (!window.__SSi) return;' )); // add tab image and url in statustext to closed tab list eval("HistoryMenu.populateUndoSubmenu ="+HistoryMenu.populateUndoSubmenu.toString().replace( 'var m = undoPopup.appendChild(document.createElement("menuitem"));', '$& \ m.setAttribute("class", "menuitem-iconic bookmark-item"); \ var tabData = undoItems[i].state; \ var activeIndex = (tabData.index || tabData.entries.length) - 1; \ var url = tabData.entries[activeIndex].url; \ m.setAttribute("statustext", url); \ if (!url.match(/^https/)) \ m.setAttribute("image", TMP_SessionStore.getImage(tabData.xultab));' ).replace( 'undoPopup.appendChild(document.createElement("menuseparator"));', '$& \ var _string = document.getElementById("tmp-string-bundle");\ m = undoPopup.appendChild(document.createElement("menuitem")); \ m.setAttribute("label", _string.getString("undoclosetab.clear.label")); \ m.setAttribute("accesskey", _string.getString("undoclosetab.clear.accesskey")); \ m.setAttribute("oncommand", "getClosedTab(null, -1);");' )); var undoPopup = document.getElementById("historyUndoPopup") undoPopup.setAttribute("oncommand", "event.stopPropagation();"); undoPopup.setAttribute("onclick", "closeMenus(event.target); event.stopPropagation();"); } // make ChromaTabs extension compatible with Tabmix Plus if (gIsFirefox2 && "CHROMATABS" in window) eval("CHROMATABS.colorizeTab ="+CHROMATABS.colorizeTab.toString().replace( 'node = doc.getAnonymousElementByAttribute(tab, "class", "tab-image-left");', 'node = doc.getAnonymousElementByAttribute(tab, "class", "tab-image-left tab-startcap tab-left tab-left-border");' ).replace( 'node = doc.getAnonymousElementByAttribute(tab, "class", "tab-image-middle");', 'node = doc.getAnonymousElementByAttribute(tab, "class", "tab-middle box-inherit tab-image-middle tab-body");' ).replace( 'node = doc.getAnonymousElementByAttribute(tab, "class", "tab-close-button");', 'node = doc.getAnonymousElementByAttribute(tab, "anonid", "tmp-close-button");' ).replace( 'node = doc.getAnonymousElementByAttribute(tab, "class", "tab-image-right");', 'node = doc.getAnonymousElementByAttribute(tab, "class", "tab-image-right tab-endcap tab-right tab-right-border");' )); gBrowser.TMP_openTabNext = function (aTab, blank) { if (this.mPrefs.getBoolPref("extensions.tabmix.openTabNext")) { this.TMmoveTabTo(aTab, this.mCurrentTab._tPos + this.mTabContainer.nextTab,1); } if (this.mPrefs.getBoolPref("extensions.tabmix.openTabNextInverse")) this.mTabContainer.nextTab++; } gBrowser.TMmoveTabTo = function (aTab, aIndex, flag) { if ( aTab._tPos == aIndex ) return aTab; // splice, appendChild, insertBefore trigger tabxTabClosed and tabxTabAdded // we add this "tabmoved" attribute to test if it exsit in those function aTab.setAttribute("tabmoved", true); if(!(flag & 1)) this.mTabContainer.nextTab = 1; this._browsers = null; // invalidate cache this.mTabFilters.splice(aIndex,0,this.mTabFilters.splice(aTab._tPos, 1)[0]); this.mTabListeners.splice(aIndex,0,this.mTabListeners.splice(aTab._tPos, 1)[0]); var tabCount = this.mTabContainer.childNodes.length; var newPos = tabCount - 1 < aIndex ? tabCount - 1 : aIndex; var oldPosition = aTab._tPos; aIndex = aIndex < aTab._tPos ? aIndex: aIndex+1; if (aTab == this.mTabContainer.firstChild || aIndex == 0) this.mTabContainer.firstChild.removeAttribute("first-tab"); if (aTab == this.mTabContainer.lastChild || tabCount <= aIndex) this.mTabContainer.lastChild.removeAttribute("last-tab"); this.mCurrentTab.__selected = false; // use .item() instead of [] because dragging to the end of the strip goes out of // bounds: .item() returns null (so it acts like appendChild), but [] throws this.mTabContainer.insertBefore(aTab, this.mTabContainer.childNodes.item(aIndex)); // invalidate cache, because mTabContainer is about to change this._browsers = null; // Update "first-tab" and "last-tab" attributes if (!this.mTabContainer.firstChild.hasAttribute("first-tab")) this.mTabContainer.firstChild.setAttribute("first-tab", "true"); if (!this.mTabContainer.lastChild.hasAttribute("last-tab")) this.mTabContainer.lastChild.setAttribute("last-tab", "true"); var i; for (i = 0; i < tabCount; i++) { this.mTabContainer.childNodes[i]._tPos = i; /* we don't need this if we update first-tab and last-tab here this line interfere with our "unreadTab" because it add "selected" false attribute to all tab even befor they selected this.mTabContainer.childNodes[i].__selected = false; */ } this.mCurrentTab.__selected = true; if (gIsFirefox2) { var evt = document.createEvent("UIEvents"); evt.initUIEvent("TabMove", true, false, window, oldPosition); aTab.dispatchEvent(evt); } SessionManager.tabMoved(aTab, oldPosition, newPos); aTab.removeAttribute("tabmoved"); this.mTabContainer.ensureTabIsVisible(aTab._tPos); return aTab; } gBrowser.duplicateTab = function (aTab, href) { if (aTab.localName != "tab") aTab = this.mCurrentTab; var aBrowser = this.getBrowserForTab(aTab); var originalHistory = aBrowser.webNavigation.sessionHistory; var newTab = this.addTab(); var newBrowser = this.getBrowserForTab(newTab); //try to set zoom factor befor we load content var zoomFactor = aBrowser.docShell.contentViewer ? aBrowser.markupDocumentViewer.textZoom : 1; setTextZoom(newBrowser, zoomFactor); var prop = SessionData.getTabProperties(aTab); SessionData.setTabProperties(newTab, prop); newBrowser.addEventListener('load', dupScrollPosition, true); //save scroll data and href to load after we clone tab history var bContent = aBrowser.contentWindow; newBrowser._scrollData = { tabPos: newTab._tPos, href: href, _scrollX: bContent.scrollX, _scrollY: bContent.scrollY, zoom: zoomFactor }; dtMergeWindows.cloneTabHistory(newBrowser.webNavigation, dtMergeWindows.copyHistory(originalHistory)); content.focus(); var bgPref = this.mPrefs.getBoolPref("extensions.tabmix.loadNewInBackground"); if (gIsFirefox2 && !bgPref) newTab.owner = aTab; this.TMP_selectNewForegroundTab(newTab, bgPref, aBrowser.currentURI.spec, false); if (this.mPrefs.getBoolPref("extensions.tabmix.openDuplicateNext")) { var pos = newTab._tPos > aTab._tPos ? 1 : 0; this.TMmoveTabTo(newTab, aTab._tPos+pos); } return newTab; } gBrowser.duplicateInWindow = function (aTab, removeTab) { if (aTab.localName != "tab") aTab = this.mCurrentTab; if (!gSingleWindowMode) { var aBrowser = this.getBrowserForTab(aTab); var bContent = aBrowser.contentWindow; var zoomFactor = aBrowser.docShell.contentViewer ? aBrowser.markupDocumentViewer.textZoom : 1; var duplicatData = { scroll: bContent.scrollX + "," + bContent.scrollY + "," + zoomFactor, oldHistory: aBrowser.webNavigation.sessionHistory, prop: SessionData.getTabProperties(aTab) } if (removeTab) { // if we want to remove the tab as well if (aTab.hasAttribute("protected")) aTab.removeAttribute("protected"); // if we move the last tab close the window if (this.mTabContainer.childNodes.length == 1) window.needToClose = true; this.removeTab(aTab); } // if we remove the current tab we need time to get the new tab selected // befor we move the focus to the new window setTimeout(function() { var newWindow = window.openDialog( getBrowserURL(), "_blank", "chrome,all,dialog=no"); newWindow.duplicat = true; newWindow.duplicatData = duplicatData; }, 0); } else { this.duplicateTab(aTab); } } gBrowser.openLinkWithHistory = function (aTab) { var href = typeof(gContextMenu.linkURL) == "function" ? gContextMenu.linkURL() : gContextMenu.linkURL; var linkNode = gContextMenu.link; var newTab = this.duplicateTab(aTab, href); // in Firefox 1.5, markLinkVisited() has been removed if (linkNode && "markLinkVisited" in window) TMP_markLinkVisited(href, linkNode); return true; } gBrowser.openHereWith = function () { var href = typeof(gContextMenu.linkURL) == "function" ? gContextMenu.linkURL() : gContextMenu.linkURL; var referrerURI = ("makeURI" in window) ? makeURI(gContextMenu.docURL) : getReferrer(document); //also works with getRefferrer loadURI(href, referrerURI, null, false); } gBrowser.openInverseLink = function (aTab) { var href = typeof(gContextMenu.linkURL) == "function" ? gContextMenu.linkURL() : gContextMenu.linkURL; var linkNode = gContextMenu.link; var newTab = this.addTab(href); var bgPref = this.mPrefs.getBoolPref("browser.tabs.loadInBackground"); this.TMP_selectNewForegroundTab(newTab, !bgPref, href); // in Firefox 1.5, markLinkVisited() has been removed if (linkNode && "markLinkVisited" in window) TMP_markLinkVisited(href, linkNode); return true; } gBrowser.closeAllTabs = function () { if (this.warnAboutClosingTabs("All")) { var childNodes = this.mTabContainer.childNodes; if (this.mTabContainer.collapsedTabs > 0) this.mTabContainer.collapsedTabs = 0; for (var i = childNodes.length - 1; i >= 0; --i) { if (childNodes[i] != this.mCurrentTab) this.removeTab(childNodes[i]); } this.removeTab(this.mCurrentTab); this.mTabContainer.ensureTabIsVisible(this.mCurrentTab._tPos); } } gBrowser.closeGroupTabs = function (aTab) { if (aTab.localName != "tab") aTab = this.mCurrentTab; var URL = this.getBrowserForTab(aTab).currentURI.spec; var matches = URL.match(/(^.*\/)(.*)/); var aDomain = matches ? matches[1] : URL; if (this.warnAboutClosingTabs("Group", null, null, aDomain)) { var childNodes = this.mTabContainer.childNodes; if (this.mTabContainer.collapsedTabs > 0) this.mTabContainer.collapsedTabs = 0; for ( i = childNodes.length - 1; i > -1; --i) { if (childNodes[i] != aTab && this.getBrowserForTab(childNodes[i]).currentURI.spec.indexOf(aDomain) != -1) this.removeTab(childNodes[i]); } this.removeTab(aTab); this.mTabContainer.ensureTabIsVisible(this.mCurrentTab._tPos); } } gBrowser.closeRightTabs = function (aTab) { if (aTab.localName != "tab") aTab = this.mCurrentTab; if (this.warnAboutClosingTabs("Right", aTab._tPos)) { if ( aTab._tPos < this.mCurrentTab._tPos ) this.mTabContainer.selectedItem = aTab; var childNodes = this.mTabContainer.childNodes; for ( i = childNodes.length - 1; i > aTab._tPos; i-- ) this.removeTab(childNodes[i]); } } gBrowser.closeLeftTabs = function (aTab) { if (aTab.localName != "tab") aTab = this.mCurrentTab; if (this.warnAboutClosingTabs("Left", aTab._tPos)) { if ( aTab._tPos > this.mCurrentTab._tPos ) this.mTabContainer.selectedItem = aTab; var childNodes = this.mTabContainer.childNodes; if (this.mTabContainer.collapsedTabs > 0) this.mTabContainer.collapsedTabs = 0; for ( i = aTab._tPos - 1; i >= 0; i-- ) this.removeTab(childNodes[i]); this.mTabContainer.ensureTabIsVisible(this.mCurrentTab._tPos); } } gBrowser.removeAllTabsBut = function (aTab) { if (aTab.localName != "tab") aTab = this.mCurrentTab; if (this.warnAboutClosingTabs("AllBut", null, aTab.hasAttribute("protected"))) { if (aTab != this.mCurrentTab) this.mTabContainer.selectedItem = aTab; var childNodes = this.mTabContainer.childNodes; if (this.mTabContainer.collapsedTabs > 0) this.mTabContainer.collapsedTabs = 0; for (var i = childNodes.length - 1; i >= 0; --i) { if (childNodes[i] != aTab) this.removeTab(childNodes[i]); } this.mTabContainer.ensureTabIsVisible(this.mCurrentTab._tPos); } } gBrowser.reloadLeftTabs = function (aTab) { if (aTab.localName != "tab") aTab = this.mCurrentTab; var childNodes = this.mTabContainer.childNodes; if ( aTab._tPos > this.mCurrentTab._tPos ) this.mTabContainer.selectedItem = aTab; for ( i = aTab._tPos - 1; i >= 0; i-- ) this.reloadTab(childNodes[i]); } gBrowser.reloadRightTabs = function (aTab) { if (aTab.localName != "tab") aTab = this.mCurrentTab; var childNodes = this.mTabContainer.childNodes; if ( aTab._tPos < this.mCurrentTab._tPos ) this.mTabContainer.selectedItem = aTab; for ( i = childNodes.length - 1; i > aTab._tPos; i-- ) this.reloadTab(childNodes[i]); } gBrowser.reloadAllTabsBut = function (aTab) { if (aTab.localName != "tab") aTab = this.mCurrentTab; else this.mTabContainer.selectedItem = aTab; var childNodes = this.mTabContainer.childNodes; for (var i = childNodes.length - 1; i >= 0; --i) { if (childNodes[i] != aTab) this.reloadTab(childNodes[i]); } } gBrowser.undoRemoveTab = function () { if( !this.mPrefs.getBoolPref("extensions.tabmix.undoClose" ) || !this.closedTabs.length ) return null; var aTab = getClosedTab("original", this.closedTabs.length-1); return this.restoreTab(aTab[0], aTab[1], aTab[4], aTab[5]); } gBrowser.delayUndoRemoveAllTab = function () { // call undoRemoveAllTab after delay to let the popup menu time to hide var _this = this; window.setTimeout( function () { _this.undoRemoveAllTab(); }, 0 ); } gBrowser.undoRemoveAllTab = function () { var btn = document.getElementById("btn_undoclose"); if (btn) btn.setAttribute("disabled", true); var aTab, blankTab, newTab, selectTab = true; // catch blank tab for reuse var blankTabs = []; for (var i = 0; i < this.mTabs.length ; i++) { aTab = this.mTabs[i]; if (this.isBlankNotBusyTab(aTab)) { aTab.reuse = true; blankTabs.push(aTab); } } while (this.closedTabs.length > 0) { aTab = getClosedTab("original", this.closedTabs.length-1); blankTab = blankTabs.pop(); newTab = (blankTab) ? blankTab : this.addTab(); this.restoreTabData(newTab, aTab[0], aTab[1], aTab[4], aTab[5], selectTab); selectTab = false; } // remove unused blank tabs while(blankTabs.length > 0){ blankTab = blankTabs.pop(); this.removeTab(blankTab); } this.mTabContainer.nextTab = 1 } gBrowser.restoreTab = function TMP_restoreTab(ord, hist, prop, zoom) { var btn = document.getElementById("btn_undoclose"); if (btn) btn.setAttribute("disabled", this.closedTabs.length < 1); // reuse blanke tab var newTab = this.mCurrentTab; if (!this.isBlankNotBusyTab(newTab)) newTab = this.addTab(); this.restoreTabData(newTab, ord, hist, prop, zoom, true); return newTab; } gBrowser.restoreTabData = function TMP_restoreTabData(newTab, ord, hist, prop, zoom, selectTab) { var newBrowser = this.getBrowserForTab(newTab); if (zoom && zoom != "0,0,1") { //try to set zoom factor befor we load content var XYZ = zoom.split(","); setTextZoom(newBrowser, XYZ[2]); } var restorePosition = getBoolPref("extensions.tabmix.undoClosePosition", true ); var newPos; if ( restorePosition ) { newPos = ord > this.mTabs.length - 1 ? this.mTabs.length - 1 : ord; this.TMmoveTabTo(newTab, newPos); } else if (newTab.reuse) { // move reuse tabs to the end when restore all closed tabs list var openTabNext = this.mPrefs.getBoolPref("extensions.tabmix.openTabNext"); newPos = openTabNext ? this.mCurrentTab._tPos + this.mTabContainer.nextTab++ : this.mTabs.length - 1; this.TMmoveTabTo(newTab, newPos, 1); if (newTab != this.mCurrentTab) newTab.removeAttribute("flst_id"); delete newTab.reuse; } SessionData.setTabProperties(newTab, prop); var oldHistory = hist; var newHistory = newBrowser.webNavigation.sessionHistory; // reset old history if (newHistory.count > 0) { newHistory.PurgeHistory(newHistory.count); } newHistory.QueryInterface(Components.interfaces.nsISHistoryInternal); for (var i = 0; i < oldHistory.count; i++) { newHistory.addEntry(oldHistory.getEntryAtIndex(i, false), true); } if( oldHistory.count ) { try { newBrowser.webNavigation.gotoIndex(oldHistory.index); } catch (e) {} } // call to set scroll Position for restored closed tab from prev session if (zoom && zoom != "0,0,1") { newBrowser.addEventListener('load', dupScrollPosition, true); newBrowser._scrollData = { tabPos: newTab._tPos, href: null, _scrollX: XYZ[0], _scrollY: XYZ[1], zoom: XYZ[2] } } if (selectTab) { content.focus(); this.TMP_selectNewForegroundTab(newTab, false, null, false); } return newTab; } gBrowser.lockTab = function (aTab) { if (aTab.localName != "tab") aTab = this.mCurrentTab; if ( aTab.hasAttribute("locked") ) { aTab.removeAttribute("locked"); aTab.setAttribute("_locked", "false"); } else { aTab.setAttribute("locked", "true"); aTab.setAttribute("_locked", "true"); } SessionManager.updateTabProp(aTab); } gBrowser.protectTab = function (aTab) { if (aTab.localName != "tab") aTab = this.mCurrentTab; if ( aTab.hasAttribute("protected") ) aTab.removeAttribute("protected"); else aTab.setAttribute("protected", "true"); SessionManager.updateTabProp(aTab); } gBrowser.freezeTab = function (aTab) { if (aTab.localName != "tab") aTab = this.mCurrentTab; if ( !aTab.hasAttribute("protected") || !aTab.hasAttribute("locked")){ aTab.setAttribute("protected", "true"); aTab.setAttribute("locked", "true"); aTab.setAttribute("_locked", "true"); } else { aTab.removeAttribute("protected"); aTab.removeAttribute("locked"); aTab.setAttribute("_locked", "false"); } SessionManager.updateTabProp(aTab); } gBrowser.SelectToMerge = function(aTab) { if (gSingleWindowMode && numberOfWindows() == 1) return; if (aTab.localName != "tab") aTab = this.mCurrentTab; if (aTab.hasAttribute("mergeselected")) { aTab.removeAttribute("mergeselected"); aTab.label = aTab.label.substr(4); } else { aTab.setAttribute("mergeselected", "true") aTab.label = "(*) "+aTab.label; } } gBrowser.onSetReloadTime = function(aTab, aReloadTime) { if (aTab.localName != "tab") aTab = this.mCurrentTab; aTab.autoReloadTime = aReloadTime; gPref.setIntPref("extensions.tabmix.reload_time", aTab.autoReloadTime); this.enableAutoReload(aTab); } gBrowser.setupAutoReload = function (aTab) { if (aTab.localName != "tab") aTab = this.mCurrentTab; aTab.autoReloadEnabled = false; aTab.autoReloadTime = gPref.getIntPref("extensions.tabmix.reload_time"); aTab.autoReloadTimerID = null; aTab.postDataAcceptedByUser = false; aTab.id = "ActiveReloadTab" + autoReloadTabID; autoReloadTabID++; } gBrowser.onAutoReloadEnable = function (aTab) { if (aTab.localName != "tab") aTab = this.mCurrentTab; if (aTab.autoReloadEnabled) this.disableAutoReload(aTab); else this.enableAutoReload(aTab); } gBrowser.enableAutoReload = function(aTab) { aTab.autoReloadEnabled = true; aTab.autoReloadURI = this.getBrowserForTab(aTab).currentURI.spec; clearTimeout(aTab.autoReloadTimerID); aTab.autoReloadTimerID = setTimeout(reloadPage, aTab.autoReloadTime*1000, aTab.id); if (gIsFirefox2) aTab.setAttribute("reload-data", aTab.autoReloadURI + " " + aTab.autoReloadTime); } gBrowser.disableAutoReload = function (aTab) { aTab.autoReloadEnabled = false; aTab.autoReloadURI = null; aTab.postDataAcceptedByUser = false; clearTimeout(aTab.autoReloadTimerID); if (gIsFirefox2) aTab.removeAttribute("reload-data"); } gBrowser.onEnableAutoReloadAllTabs = function () { var tabs = this.mTabContainer.childNodes; for(var i=0; i max_id ) { max_id = temp_id; tempIndex = i; } } return tempIndex; } gBrowser.previousTab = function (aTab) { if (this.mTabs.length == 1) return; var tempIndex = this.previousTabIndex(aTab); // if no flst_id go to previousTab tab, from first tab go to the next tab if (tempIndex == -1) tempIndex = aTab._tPos == 0 ? 1 : aTab._tPos - 1; this.selectedTab = this.mTabs[tempIndex]; this.mCurrentTab.focus(); } gBrowser.selectAfterRemove = function (oldTab, index) { if (this.mCurrentTab != oldTab) return index; var l = this.mTabs.length; var currentIndex = oldTab._tPos; var mode = gPrefService.getIntPref("extensions.tabmix.focusTab"); switch ( mode ) { case 0: // first tab return 0; break; case 1: // left tab return currentIndex == 0 ? 0 : currentIndex-1 ; break; case 2: // opener / right (default ) return index; break; case 3: // last tab return l - 1; break; case 4: // last selected if (l==1) return index; var tempIndex = this.previousTabIndex(); return tempIndex > -1 ? tempIndex : index; break; case 5: // right tab return currentIndex == l ? currentIndex - 1 : currentIndex; break; default: } return index; } gBrowser.TMP_createTooltip = function (event) { event.stopPropagation(); var tn = document.tooltipNode; if (tn.localName != "tab") return false; // Not a tab, so cancel the tooltip if ("tmp_mOverCloseButton" in tn && tn.tmp_mOverCloseButton) { event.target.setAttribute("label", tn.getAttribute("closetabtext")); return true; } if (tn.hasAttribute("label")) { event.target.setAttribute("label", tn.getAttribute("label")); return true; } return false; } // return true if all tabs in the window are blank gBrowser.isBlankWindow = function() { for (var i = 0; i < this.mTabs.length; i++) if (!this.isBlankBrowser(this.getBrowserAtIndex(i))) return false; return true; } gBrowser.isBlankTab = function(aTab) { return this.isBlankBrowser(this.getBrowserForTab(aTab)); } gBrowser.isBlankNotBusyTab = function _isBlankNotBusyTab(aTab) { if (aTab.hasAttribute("busy")) return false; return this.isBlankBrowser(this.getBrowserForTab(aTab)); } gBrowser.isBlankBrowser = function(aBrowser) { try{ if (!aBrowser) return true; return (!aBrowser.sessionHistory || aBrowser.sessionHistory.index < 0 || (aBrowser.sessionHistory.count < 2 && (!aBrowser.currentURI || aBrowser.currentURI.spec == 'about:blank'))); } catch (e) {return true;} } gBrowser.closeTab = function(aTab) { // throws exception when rapid click on close tab button // we call this after delay if (!aTab.parentNode) return; if (this.mTabContainer.childNodes.length == 1 && this.isBlankNotBusyTab(aTab) && !this.mPrefs.getBoolPref("extensions.tabmix.keepLastTab")) { var urlBar = document.getElementById("urlbar"); if (urlBar) { urlBar.value = ""; urlBar.focus(); } } else { // clear all timeouts befor we remove the tab if (aTab.isClosing) clearTimeout(aTab.isClosing); if (aTab.mSelect) clearTimeout(aTab.mSelect); if (aTab.mouseHoverSelect && aTab.mFocusId) { clearTimeout(aTab.mFocusId); } if (aTab.mButtonId) clearTimeout(aTab.mButtonId); if (aTab.hasAttribute("busy")) this.getBrowserForTab(aTab).stop(); this.removeTab(aTab); if (this.mTabContainer.childNodes.length == 1 && this.isBlankTab(this.mCurrentTab)) setURLBarFocus(); this.stopMouseHoverSelect(aTab); } } gBrowser.stopMouseHoverSelect = function(aTab) { // add extra delay after tab removed or after tab flip befor we select by hover // to let the user time to move the mouse if (aTab.mouseHoverSelect) { function removeDelayAfterClose(browser) { browser.removeAttribute("preventMouseHoverSelect"); } this.setAttribute("preventMouseHoverSelect",true); var delay = aTab.mouseHoverSelectDelay + 50; setTimeout(removeDelayAfterClose, delay, this); } } gBrowser.warnAboutClosingTabs = function (whatToClose, tabPos, protectedTab, aDomain) { // try to cach call from other extensions to warnAboutClosingTabs if (typeof(whatToClose) == "boolean") { if (!whatToClose) protectedTab = this.mCurrentTab.hasAttribute("protected"); whatToClose = whatToClose ? "All_onExit" : "AllBut"; } var childNodes = this.mTabContainer.childNodes; var numTabs = childNodes.length; var shouldPrompt = 0; const tabsPref = "browser.tabs.warnOnClose"; if (this.mPrefs.getBoolPref(tabsPref) && numTabs > 1) shouldPrompt = 1; // calc the number of tab to close when there is protected tabs. var protectedTabs = this.mTabContainer.getElementsByAttribute("protected", true); var numProtected = protectedTabs.length; const protectedTabsPref = "extensions.tabmix.protectedtabs.warnOnClose"; if (numProtected > 0 && whatToClose == "All_onExit" && this.mPrefs.getBoolPref(protectedTabsPref)) shouldPrompt = 2; if (shouldPrompt == 0) return true; var i, tabsToClose = 0; switch (whatToClose) { case "All": tabsToClose = numTabs - numProtected; break; case "All_onExit": tabsToClose = numTabs; break; case "AllBut": if (protectedTab) --numProtected; tabsToClose = numTabs - 1 - numProtected; break; case "Group": for ( i = numTabs - 1; i > -1; --i) { if (this.getBrowserForTab(childNodes[i]).currentURI.spec.indexOf(aDomain) != -1 && !childNodes[i].hasAttribute("protected")) tabsToClose++; } break; case "Right": for ( i = 0; i < protectedTabs.length; i++ ) if (protectedTabs[i]._tPos <= tabPos) --numProtected; tabsToClose = numTabs - tabPos - 1 - numProtected; break; case "Left": for ( i = 0; i < protectedTabs.length; i++ ) if (protectedTabs[i]._tPos >= tabPos) --numProtected; tabsToClose = tabPos - numProtected; break; } if (tabsToClose <= 1 && shouldPrompt < 2) return true; var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] .getService(Components.interfaces.nsIPromptService); //default to true: if it were false, we wouldn't get this far var warnOnClose = { value:true }; var bundle = this.mStringBundle; var message, messageKey, chkBoxLabel; if (shouldPrompt != 2) { try { messageKey = (tabsToClose == 1) ? "tabs.closeWarningOne" : "tabs.closeWarningMultiple"; message = bundle.getFormattedString(messageKey, [tabsToClose]); } catch (er) { messageKey = (tabsToClose == 1) ? "tabs.closeWarningOneTab" : "tabs.closeWarningMultipleTabs"; message = bundle.getFormattedString(messageKey, [tabsToClose]); } chkBoxLabel = bundle.getString('tabs.closeWarningPromptMe'); } else { var tmp_bundle = document.getElementById("tmp-string-bundle"); messageKey = "protectedtabs.closeWarning."; messageKey += (numProtected < tabsToClose) ? "3" : (numProtected == 1) ? "1" : "2"; message = tmp_bundle.getFormattedString(messageKey, [tabsToClose, numProtected]); chkBoxLabel = tmp_bundle.getString('protectedtabs.closeWarningPromptMe'); } var closeKey = (tabsToClose == 1) ? "tabs.closeButtonOne" : "tabs.closeButtonMultiple"; window.focus(); var buttonPressed = promptService.confirmEx(window, bundle.getString('tabs.closeWarningTitle'), message, (promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_0) + (promptService.BUTTON_TITLE_CANCEL * promptService.BUTTON_POS_1), bundle.getString(closeKey), null, null, chkBoxLabel, warnOnClose); var reallyClose = (buttonPressed == 0); // don't set the pref unless they press OK and it's false if (reallyClose && !warnOnClose.value) { var pref = shouldPrompt != 2 ? tabsPref : protectedTabsPref; this.mPrefs.setBoolPref(pref, false); } return reallyClose; } gBrowser.TMP_selectNewForegroundTab = function (aTab, aLoadInBackground, aUrl, addOwner) { var bgLoad = (aLoadInBackground != null) ? aLoadInBackground : this.mPrefs.getBoolPref("browser.tabs.loadInBackground"); if (!bgLoad) { function _selectNewForegroundTab(browser, tab) { browser.selectedTab = tab; if (aUrl && aUrl == "about:blank") setURLBarFocus(); } // set new tab owner addOwner = addOwner != null ? addOwner : true; if (gIsFirefox2 && addOwner) aTab.owner = this.selectedTab; setTimeout(_selectNewForegroundTab, 0, getBrowser(), aTab); } if (!bgLoad) this.selectedTab = aTab; } gBrowser.getTabForBrowser = function (aBrowser) { return document.getAnonymousElementByAttribute(this, "linkedpanel", aBrowser.parentNode.id); } }} // end tablib function setURLBarFocus() { var urlBar = document.getElementById("urlbar"); if (urlBar) setTimeout(function() { urlBar.focus(); }, 10); } function dupScrollPosition(event) { var aBrowser = this; var data = aBrowser._scrollData; aBrowser.removeEventListener('load', dupScrollPosition, true); SessionManager.setScrollPosition(data.tabPos, data._scrollX, data._scrollY, 15, data.href, data.zoom); delete aBrowser._scrollData; } function setTextZoom(browser, zoomFactor) { try { if (browser.docShell.contentViewer == null) return; // probebly 1.0.7 if (zoomFactor && browser.markupDocumentViewer.textZoom != zoomFactor) browser.markupDocumentViewer.textZoom = zoomFactor; } catch (e) {} } function menuItemTitle(entry) { if (gPref.getBoolPref("extensions.tabmix.titlefrombookmark") && entry.URI) { var bookMarkName = getTitleFromBookmark(entry.URI.spec); return bookMarkName ? bookMarkName : entry.title; } return entry.title; } function setHistoryMenuItemsTitle(aEvent) { var aMenuPopup = aEvent.target; if (aMenuPopup.id == "goPopup" && gPref.getBoolPref("extensions.tabmix.titlefrombookmark")) { var historyItems = false; for (var i = 0; i < aMenuPopup.childNodes.length ; i++) { var item = aMenuPopup.childNodes[i]; if (historyItems) { if (item.id == "endHistorySeparator") break; var bookMarkName = getTitleFromBookmark(item.getAttribute("url")); if (bookMarkName) item.setAttribute("label", bookMarkName); } else if (item.id == "startHistorySeparator") historyItems = true; } } } function saveClosedTab(tab, browser) { if (tabxPrefs.getBoolPref("undoClose") && !gBrowser.isBlankBrowser(browser)) { var btn = document.getElementById("btn_undoclose"); if (btn) btn.setAttribute("disabled","false"); var bContent = browser.contentWindow; var zoomFactor = browser.docShell.contentViewer ? browser.markupDocumentViewer.textZoom : 1; gBrowser.closedTabs.push([tab._tPos, browser.sessionHistory, tab.getAttribute("label"), tab.getAttribute("image"), SessionData.getTabProperties(tab), bContent.scrollX + "," + bContent.scrollY + "," + zoomFactor ]); } if (gBrowser.closedTabs.length > tabxPrefs.getIntPref("undoCloseCache")) gBrowser.closedTabs.shift(); SessionManager.tabScrolled(tab); } var autoReloadTabID = 0; var gAutoReloadDialogAccepted; function autoReloadDialogResult(accepted){ gAutoReloadDialogAccepted = accepted; } function reloadPage(autoReloadTabID){ var aTab = document.getElementById(autoReloadTabID); if (aTab == null) return; var browser = gBrowser.getBrowserForTab(aTab); if (aTab.autoReloadEnabled == false ){ aTab.postDataAcceptedByUser = false; return; } var loadFlags = nsIWebNavigation.LOAD_FLAGS_BYPASS_HISTORY | nsIWebNavigation.LOAD_FLAGS_BYPASS_PROXY | nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE; var entry = browser.webNavigation.sessionHistory.getEntryAtIndex(browser.webNavigation.sessionHistory.index, false); var postData = entry.QueryInterface(Components.interfaces.nsISHEntry).postData; var referrer = entry.QueryInterface(Components.interfaces.nsISHEntry).referrerURI; if ((postData!=null) && (aTab.postDataAcceptedByUser==false)){ var params = Components.classes['@mozilla.org/embedcomp/dialogparam;1'].createInstance(Components.interfaces.nsIDialogParamBlock); var stringBundle = document.getElementById("tmp-string-bundle"); params.SetString(12, stringBundle.getString('confirm_autoreloadPostData_title')); params.SetString(0, stringBundle.getString('confirm_autoreloadPostData')); params.SetString(2, 'alert-icon'); params.SetInt(2, 2); window.openDialog('chrome://global/content/commonDialog.xul', '_blank', 'chrome,modal,centerscreen', params); if (params.GetInt(0) == 0) aTab.postDataAcceptedByUser = true; else { aTab.autoReloadEnabled = false; return; } } browser.curScrollX = browser.contentWindow.scrollX; browser.curScrollY = browser.contentWindow.scrollY; var notifyFlags = Components.interfaces.nsIWebProgress.NOTIFY_ALL; browser.webNavigation.loadURI(browser.webNavigation.currentURI.spec, loadFlags, referrer, entry.postData, null); } PK 6content/tabmixplus/links/PK S6btiti(content/tabmixplus/links/contentLinks.js/* * chrome://tabmixplus/content/links/contentLinks.js * * original code by Bradley Chapman * modified and developped by Hemiola SUN * modified again by Bradley Chapman * */ var gIOService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); var gPref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); var gWindowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator); /** * @brief Open the given link node in the current window. * * @param event A valid event union. * @param linkNode The DOM node containing the URL to open. * @param currentTab A Boolean value. If true, the URL will be opened * within the current tab. If false, it will be * opened in a new tab. * @returns True if the function opened a URL, or the value * of handleLinkClick() if it chose not to. * */ function TMP_howToOpen(event, linkNode, currentTab) { // this helper function parses the event union for us // and makes a better determination of how a link will // be opened var where = whereToOpenLink(event); if (where == "save" || where == "window" ) { handleLinkClick(event, linkNode.href, linkNode); return true; } if ("webPanelSecurityCheck" in window) { // webPanelSecurityCheck was removed at 18/02/2007 if (!webPanelSecurityCheck(linkNode.ownerDocument.location.href, linkNode.href)) return false; } else { // for Firefox 3.0 after bug 370765 landed try { urlSecurityCheck(linkNode.href, linkNode.ownerDocument.nodePrincipal); } catch(ex) { return false; } } var postData = { }; var url = getShortcutOrURI(linkNode.href, postData); if (!url) return true; // if where is "tab", "tabshifted", "current" callers will control the inversion of currentTab var docURL = event.target.ownerDocument.location.href; // referrer header if (currentTab) { var referrerURI = gIOService.newURI(docURL, null, null); window.loadURI(url, referrerURI, null, false); event.preventDefault(); return false; } else { try{ var f = window.openNewTabWith.toString(); if (f.indexOf("aEvent") > -1 ) window.openNewTabWith(url, event.target.ownerDocument, null, event, false); // firefox 3.0 + else if (f.indexOf("event") > f.indexOf("postData")) window.openNewTabWith(url, docURL, null, event, false); // firefox 1.5 + else window.openNewTabWith(url, linkNode, event, true, null); // firefox 1.0.x } catch (e) {} event.preventDefault(); return true; } } /** * @brief Check for certain JavaScript strings inside an attribute. * * @param attr The attribute to check. * @param string The string to check for. * @returns true if the strings are present, false if they aren't. * */ function TMP_checkAttr(attr, string) { if (typeof(attr) == "string") return attr.indexOf(string) == 0; return false; } /** * @brief Check if link refers to external domain. * * @param target The target link. * @param curpage The current page url * @returns current domain and target domain * */ function checkDomain(curpage, target) { function getDomain(url) { if (typeof(url) != "string") url = url.toString(); if (url.match(/^file:/)) return "local_file"; if (url.match(/^http/)) { url = gIOService.newURI(url, null, null); // catch redirect if (url.path.match(/^\/r\/\?http/)) url = gIOService.newURI(url.path.substr("/r/?".length), null, null); var host = url.hostPort.split("."); while (host.length > 2) host.shift(); return host.join("."); } return null; } return {current: getDomain(curpage), target: getDomain(target)}; } /** * @brief Handle left-clicks inside a browser viewport. * * This function is the primary entry point for all left-clicks on a browser * page; we triage and sort such clicks and handle the ones we want and pass * on the ones that we don't. * * @param event A valid event union. * @param fieldNormalClicks A Boolean value. If true, we will handle all left-clicks * that invoke this function. If false, we will only handle * the ones that require additional legwork (i.e. locked tabs). * @returns Either the return value of __contentAreaClick(), or the * return value of handleLinkClick(), or true if the function * was passed an event it could not handle. */ function TMP_contentAreaClick(event, fieldNormalClicks) { try { var targetPref = gPref.getIntPref("extensions.tabmix.speLink"); var linkTarget = gPref.getBoolPref("extensions.tabmix.linkTarget"); var suppressTabs = gPref.getBoolPref("extensions.tabmix.enablefiletype") } catch(e) {} // use the default if either of these are activated if (!event.isTrusted || event.getPreventDefault()) { return true; } var target = event.target; var linkNode; var where = whereToOpenLink(event); if (target instanceof HTMLButtonElement || target instanceof HTMLInputElement) { if (typeof(SubmitToTab)!='undefined' && SubmitToTab.contentAreaClick(event) == false) { return false; } } if (target instanceof HTMLAnchorElement || target instanceof HTMLAreaElement || target instanceof HTMLLinkElement) { if (target.hasAttribute("href")) linkNode = target; // xxxmpc: this is kind of a hack to work around a Gecko bug (see bug 266932) // we're going to walk up the DOM looking for a parent link node, // this shouldn't be necessary, but we're matching the existing behaviour for left click var parent = target.parentNode; while (parent) { if (parent instanceof HTMLAnchorElement || parent instanceof HTMLAreaElement || parent instanceof HTMLLinkElement) { if (parent.hasAttribute("href")) linkNode = parent; } parent = parent.parentNode; } } else { linkNode = event.originalTarget; while (linkNode && !(linkNode instanceof HTMLAnchorElement)) linkNode = linkNode.parentNode; // cannot be nested. So if we find an anchor without an // href, there is no useful around the target if (linkNode && !linkNode.hasAttribute("href")) linkNode = null; else if (linkNode && linkNode.hasAttribute("href")) target = linkNode; } if (!linkNode) return __contentAreaClick(event, fieldNormalClicks); // Check if new tab already opened from onclick event // 2006-09-26 if (target.hasAttribute("onclick") && gBrowser.contentDocument.location.href != document.commandDispatcher.focusedWindow.top.location.href) return true; // Check if link refers to external domain. // Get current page url var curpage = linkNode.ownerDocument.location.href; // 2006-09-29 var domain = checkDomain(curpage, target); var targetDomain = domain.target; var currentDomain = domain.current; var openT = linkNode.getAttribute("target"); // If link has no target attribute, check if there is a with a target attribute if (!openT) { var b = document.commandDispatcher.focusedWindow.document.getElementsByTagName("base"); if (b.length > 0) openT = b[0].getAttribute("target"); } if (linkNode.getAttribute("rel") == "sidebar" || openT == "_search" || linkNode.getAttribute("href").indexOf("mailto:") > -1) { return __contentAreaClick(event, fieldNormalClicks); } /* * prevent tabs from opening if left-clicked link ends with given filetype or matches regexp; * portions were taken from disable target for downloads by cusser * */ if (TMP_suppressTabsOnFileDownload(event, target, linkNode, suppressTabs)) { return TMP_howToOpen(event, linkNode, true); } /* * force a middle-clicked link to open in the current tab if certain conditions * are true. See the function comment for more details. * */ if (TMP_divertMiddleClick(event, linkNode, gBrowser.mCurrentTab, currentDomain, targetDomain, targetPref, gPref.getBoolPref("extensions.tabmix.middlecurrent"))) { return TMP_howToOpen(event, linkNode, true); } // catch other middle & right click if (event.button != 0) { handleLinkClick(event, linkNode.href, linkNode); return true; } // the rest of the code if for left-click only /* * open targeted links in the current tab only if certain conditions are met. * See the function comment for more details. * */ if (TMP_divertTargetedLink(event, target, linkNode, openT, document.commandDispatcher.focusedWindow.top.frames, gBrowser.mCurrentTab, currentDomain, targetDomain, targetPref, linkTarget)) { return TMP_howToOpen(event, linkNode, true); } /* * open links to other sites in a tab only if certain conditions are met. See the * function comment for more details. * */ if (TMP_openExSiteLink(event, target, linkNode, currentDomain, targetDomain, targetPref)) { return TMP_howToOpen(event, linkNode, false); } if (gBrowser.mCurrentTab.hasAttribute("locked")) { // tab is locked var href = null, onclick = null; if (target.hasAttribute("href")) href = target.getAttribute("href").toLowerCase(); if (target.hasAttribute("onclick")) onclick = target.getAttribute("onclick"); if (TMP_checkAttr(href, "javascript:") || TMP_checkAttr(href, "data:") || TMP_checkAttr(onclick, "window.open") || TMP_checkAttr(onclick, "NewWindow") || TMP_checkAttr(onclick, "PopUpWin") || (onclick && onclick.indexOf('this.target="_Blank"') != -1) || TMP_checkAttr(onclick, "return ")) { ; // javascript links, do nothing! } else { var current = TMP_checkAttr(href, "#"); return TMP_howToOpen(event, linkNode, current); } } // use whereToOpenLink() to determine if no modifiers were used else if (where == "current") { if (fieldNormalClicks && (!openT || openT == "_content" || openT == "_main")) return __contentAreaClick(event, fieldNormalClicks); else if (linkNode.hasAttribute("onclick")) return __contentAreaClick(event, fieldNormalClicks); else if (openT) handleLinkClick(event, linkNode.href, linkNode); } else handleLinkClick(event, linkNode.href, linkNode); return true; } /** * @brief Suppress tabs that may be created by downloading a file. * * This code borrows from Cusser's Disable Targets for Downloads extension. * * @param event A valid event union. * @param target The target of the event. * @param linkNode The DOM node containing the URL to be opened. * @param suppressTabs A Boolean value that controls controlling how the link should be opened. * @returns true if the link was handled by this function. * */ function TMP_suppressTabsOnFileDownload(event, target, linkNode, suppressTabs) { // prevent link with "custombutton" protocol to open new tab when custombutton extension exist if (typeof(custombuttons) !='undefined'){ if (TMP_checkAttr(linkNode.toString(), "custombutton://")) return true; } if (event.button != 0 || event.ctrlKey || event.metaKey || !suppressTabs) return false; // lets try not to look into links that start with javascript (from 2006-09-02) if (TMP_checkAttr(linkNode.toString(), "javascript:")) return false; if (target.hasAttribute("onclick")) { var onclick = target.getAttribute("onclick"); if (TMP_checkAttr(onclick, "return install") || TMP_checkAttr(onclick, "return installTheme") || TMP_checkAttr(onclick, "return note") || TMP_checkAttr(onclick, "return log")) // click on link in http://tinderbox.mozilla.org/showbuilds.cgi return true; } // prevent links in tinderbox.mozilla.org with linkHref to *.gz from open in this function if (TMP_checkAttr(linkNode.toString() , "http://tinderbox.mozilla.org/showlog") || TMP_checkAttr(linkNode.toString() , "http://tinderbox.mozilla.org/addnote")) return false; var filetype = gPref.getCharPref("extensions.tabmix.filetype"); filetype = filetype.toLowerCase(); filetype = filetype.split(" "); var linkHrefExt = "", linkHref = target.getAttribute("href"); if (linkHref) { linkHref = linkHref.toLowerCase(); linkHrefExt = linkHref.substring(linkHref.lastIndexOf("/"),linkHref.length); linkHrefExt = linkHrefExt.substring(linkHrefExt.indexOf("."),linkHrefExt.length); } var testString, hrefExt, testExt; for (var l = 0; l < filetype.length; l++) { if (filetype[l].indexOf("/") != -1){ testString = filetype[l].substring(1,filetype[l].length-1); hrefExt = linkHref; } else { testString = "\\." + filetype[l]; hrefExt = linkHrefExt; // prevent filetype catch if it is in the middle of a word testExt = new RegExp(testString + "[a-z0-9?\.]+", 'i'); if (testExt.test(hrefExt)) continue; } testExt = new RegExp(testString, 'i'); if (testExt.test(hrefExt)) return true; } return false; } /** * @brief Divert middle-clicked links into the current tab. * * This function forces a middle-clicked link to open in the current tab if * the following conditions are true: * * - links to other sites are not configured to open in new tabs AND the current * page domain and the target page domain do not match OR the current * tab is locked * - middle-clicks are configured to open in the current tab AND the middle * mouse button was pressed OR the left mouse button and one of the Ctrl/Meta keys * was pressed * * @param event A valid event union. * @param linkNode The DOM node containing the URL to open. * @param currentTab A scripted tab object from the tabbrowser. * @param currentDomain The domain name of the website URL in the current tab. * @param targetDomain The domain name of the website URL in the link node. * @param targetPref An integer value that specifies whether or not links should * be forced into new tabs. * @param middlePref A Boolean value that controls how middle clicks are handled. * @returns true if the function handled the click, false if it didn't. * */ function TMP_divertMiddleClick(event, linkNode, currentTab, currentDomain, targetDomain, targetPref, middlePref) { if (!middlePref) return false; var isTabLocked = currentTab.hasAttribute("locked"); var isDifDomain = targetPref == 2 && targetDomain && targetDomain != currentDomain; if (!isTabLocked && !isDifDomain) return false; if (event.button == 1 || event.button == 0 && (event.ctrlKey || event.metaKey)) return true; return false; } /** * @brief Divert links that contain targets to the current tab. * * This function forces a link with a target attribute to open in the * current tab if the following conditions are true: * * - linkTarget is set * - neither of the Ctrl/Meta keys were used AND the linkNode has a target attribute * AND the content of the target attribute is not one of the special frame targets * AND it is not present in the document frame pool * - links to other sites are not configured to open in new tabs AND the domain name * of the current page and the domain name of the target page do not match * - the current tab is not locked * - the domain name of the current page and the domain name of the target page * do not match * - the target of the event has an onclick attribute that does not contain the * function call 'window.open' or the function call 'return top.js.OpenExtLink' * * @param event A valid event union. * @param target The target of the event. * @param linkNode The DOM node containing the URL to be opened. * @param targetAttr The target attribute of the link node. * @param frames The frame pool of the current document. * @param currentTab A scripted tab object from the tabbrowser. * @param currentDomain The domain name of the website URL loaded in the current tab. * @param targetDomain The domain name of the website URL to be loaded. * @param targetPref An integer value that specifies whether or not links should * be forced into new tabs. * @param linkTarget An integer value that specifies how normal links * that spawn new windows are handled. * @returns true if the function handled the click, false if it didn't. * */ function TMP_divertTargetedLink(event, target, linkNode, targetAttr, frames, currentTab, currentDomain, targetDomain, targetPref, linkTarget) { if (!linkTarget) return false; if (TMP_checkAttr(linkNode.toString(), "javascript:") || // 2005-11-28 some link in Bloglines start with javascript TMP_checkAttr(linkNode.toString(), "data:")) return false; if (event.ctrlKey || event.metaKey) return false; if (!targetAttr) return false; var targetString = /^(_self|_parent|_top|_content|_main)$/; if (targetString.test(targetAttr.toLowerCase())) return false; if (TMP_existsFrameName(frames, targetAttr)) return false; if (targetPref == 2 && targetDomain && targetDomain != currentDomain) return false; if (currentTab.hasAttribute("locked")) return false; if (targetDomain && targetDomain == currentDomain) return false; if (target.hasAttribute("onclick")) { var onclick = target.getAttribute("onclick"); if (TMP_checkAttr(onclick, "window.open") || TMP_checkAttr(onclick, "NewWindow") || TMP_checkAttr(onclick, "PopUpWin") || TMP_checkAttr(onclick, "return ")) return false; } return true; } /** * @brief Open links to other sites in tabs as directed. * * This function opens links to external sites in tabs as long as the following * conditions are met: * * - links to other sites are configured to open in tabs * - the link node does not have an 'onclick' attribute that contains either the function call * 'window.open' or the function call 'return top.js.OpenExtLink'. * - the domain name of the current page and the domain name of the target page do not match * OR the link node has an 'onmousedown' attribute that contains the text 'return rwt' * * @param event A valid event union. * @param target The target of the event. * @param linkNode The DOM node containing the URL to be opened. * @param currentDomain The domain name of the website URL loaded in the current tab. * @param targetDomain The domain name of the website URL to be loaded. * @param targetPref An integer value that specifies whether or not links should * be forced into new tabs. * @returns true if the function handled the click, false if it didn't. * */ function TMP_openExSiteLink(event, target, linkNode, currentDomain, targetDomain, targetPref) { if (targetPref != 2) return false; if (target.hasAttribute("onclick")) { var onclick = target.getAttribute("onclick"); if (TMP_checkAttr(onclick, "window.open") || TMP_checkAttr(onclick, "NewWindow") || TMP_checkAttr(onclick, "PopUpWin") || TMP_checkAttr(onclick, "return ")) return false; } if (targetDomain && targetDomain != currentDomain || TMP_checkAttr(target.getAttribute("onmousedown"), "return rwt")) return true; return false; } /** * @brief Check a document's frame pool and determine if * |targetFrame| is located inside of it. * * @param containerFrame The frame pool of the current document. * @param targetFrame The name of the frame that we are seeking. * @returns true if the frame exists within the given frame pool, * false if it does not. */ function TMP_existsFrameName(containerFrame, targetFrame) { for (var i = 0; i < containerFrame.length; ++i) { if (containerFrame[i].name == targetFrame) return true; if (containerFrame[i].frames.length) var return_var = TMP_existsFrameName(containerFrame[i].frames,targetFrame); } if (return_var) return return_var; return false; } /** * @brief Handle left-clicks on links within a help browser * * NOTE: Shift, Ctrl, and Meta are all ignored * * @param event A valid event union. * @return true if the event was not handled; * false if it was handled and a URI was * loaded. * */ function TMP_helpContentClick(event) { var helpBrowser = document.getElementById("help-content"); if (!helpBrowser) { return true; } if (event.button != 0) return true; // shall we ignore this? if (is_ignorable(event.target) || is_ignorable(event.originalTarget)) { return true; } var linkNode; var target = event.target; if (target instanceof HTMLAnchorElement || target instanceof HTMLAreaElement || target instanceof HTMLLinkElement) { if (target.hasAttribute("href")) { linkNode = target; } } else { linkNode = event.originalTarget; while (linkNode && !(linkNode instanceof HTMLAnchorElement)) { linkNode = linkNode.parentNode; } // cannot be nested. So if we find an anchor without an // href, there is no useful around the target if (linkNode && !linkNode.hasAttribute("href")) { return true; } } var uriSpec; if (linkNode instanceof Node && linkNode.hasAttribute("href")) { uriSpec = linkNode.href; } if (!uriSpec || uriSpec == undefined) { return true; } // do not handle URIs that are not http, ftp or https var URI = gIOService.newURI(uriSpec, null, null); if (!URI.schemeIs("http") && !URI.schemeIs("ftp") && !URI.schemeIs("https")) { helpBrowser.loadURI(URI.spec); return false; } TMP_openURL(URI.spec, event); return false; } /** * Determine if a node should be ignored by the iterator functions. * * @param nod An object implementing the DOM1 |Node| interface. * @return true if the node is: * 1) A |Text| node that is all whitespace * 2) A |Comment| node * and otherwise false. */ function is_ignorable(nod) { return (nod.nodeType == 8) || // A comment node ((nod.nodeType == 3) && is_all_ws(nod)); // a text node, all ws } /** * @brief Locate a browser window. * * @param aExclude A scripted window object that we do not * want to use. * @returns A scripted window object representing a browser * window that is not the same as aExclude, and is * additionally not a popup window. * */ function TMP_getBrowserWindow(aExclude) { var windows = gWindowManager.getEnumerator('navigator:browser'); while (windows.hasMoreElements()) { var win = windows.getNext().QueryInterface(Components.interfaces.nsIDOMWindow); if (TMP_checkForPopup(win.QueryInterface(Components.interfaces.nsIDOMWindowInternal))) continue; // this returns the first window that we find; it is not exhaustive if (win != aExclude) return win; } return null; } /** * @brief Checks to see if a given nsIDOMWindowInternal window is a popup or not. * * @param domWindow A scripted nsIDOMWindowInternal object. * @return true if the domWindow is a popup, false otherwise. * */ function TMP_checkForPopup(domWindow) { if (!(domWindow instanceof Components.interfaces.nsIDOMWindowInternal)) return false; // FIXME: locationbar, menubar, toolbar - // if these are hidden the window is probably a popup var locbarHidden = !domWindow.locationbar.QueryInterface(Components.interfaces.nsIDOMBarProp).visible; var menubarHidden = !domWindow.menubar.QueryInterface(Components.interfaces.nsIDOMBarProp).visible; try { var toolbarHidden = !domWindow.toolbar.QueryInterface(Components.interfaces.nsIDOMBarProp).visible; } catch (e) { toolbarHidden = "hidden" in domWindow.toolbar ? domWindow.toolbar.hidden : false; } // the following logic, while possibly slow, is designed // to catch all reasonable permutations of hidden UI if ((locbarHidden && menubarHidden) || (menubarHidden && toolbarHidden) || (locbarHidden && menubarHidden && toolbarHidden)) { return true; } return false; } /* * handle all DOM window open events and catch attempts to open new windows * * PRECONDITION: None. * POSTCONDITION: None. * */ var TMP_DOMWindowOpenObserver = { Tbplite: 'tbpl', observe : function(aSubject, aTopic, aData) { if (aTopic != 'domwindowopened') return; this.onObserve(aSubject, this); return; }, onObserve : function(aSubject, aThis) { gSingleWindowMode = TMP_getBoolPref(tabxBranch, "singleWindow", false); tabxPrefObserver.setLink_openPrefs(); if (!gSingleWindowMode) return; var newWindow = aSubject; var existingWindow = TMP_getBrowserWindow(newWindow); // no navigator:browser window open yet? if (!existingWindow) return; // if the href is missing, try again later (xxx) if (!newWindow.location.href) { existingWindow.setTimeout(aThis.onObserve, 0, newWindow, aThis); return; } // we don't want to open non-browser windows in a tab if(newWindow.location.href != "chrome://browser/content/browser.xul") return; if ( !('arguments' in newWindow) || newWindow.arguments.length == 0 ) return; var _Browser = existingWindow.getBrowser(); existingWindow.tablib.init(); // just incase tablib isn't init yet var newTab = _Browser.addTab(newWindow.arguments[0], null, null); _Browser.TMP_selectNewForegroundTab(newTab, false, newWindow.arguments[0]); setTimeout(newWindow.close, 0); return; } } // end of TMP_DOMWindowOpenObserver PK @?U5o-FF"content/tabmixplus/links/links.xul PK `3׹qͼ"content/tabmixplus/links/search.js/* * This was modified from Tab Browser Preferences by Bradley Chapman * * it contains specific code for the search bar dialog * */ function TMP_onLoad() { eval("onAfterLoad ="+onAfterLoad.toString().replace( 'var tabChecked = false;', 'gDialog.newtabFocus = document.getElementById("searchTabFocus");\ var tabChecked = false, focusChecked = false;' ).replace( 'tabChecked = pref.getBoolPref(kTabPref);', 'tabChecked = pref.getBoolPref("extensions.tabmix.opentabfor.search");\ focusChecked = pref.getBoolPref("extensions.tabmix.loadSearchInBackground");' ).replace( 'gDialog.newtab.setAttribute("checked", tabChecked);', 'gDialog.newtab.setAttribute("checked", tabChecked);\ gDialog.newtabFocus.setAttribute("checked", focusChecked);\ gDialog.newtabFocus.setAttribute("disabled", !gDialog.newtab.checked);' )); eval("setPrefs ="+setPrefs.toString().replace( 'pref.setBoolPref(kTabPref, gDialog.newtab.checked);', 'pref.setBoolPref("extensions.tabmix.opentabfor.search", gDialog.newtab.checked); \ pref.setBoolPref("extensions.tabmix.loadSearchInBackground", gDialog.newtabFocus.checked);' )); onLoad(); return true; }PK @"4{ )content/tabmixplus/links/SearchDialog.xul %searchDTD; %miscDTD; ]> PK ~6a%content/tabmixplus/history/history.jsvar Click2TabHistoryPanel = { init : function () { window.removeEventListener('load', function () { Click2TabHistoryPanel.init(); }, false); if (typeof(PlacesController) == "function") { TMP_Places.init(); return; } eval("openURL = " + openURL.toString().replace( 'openURLIn(whereToOpenLink(aEvent));', 'openURLIn(whereToOpenLinkTabmix(aEvent, prefStringTMHistory));' )); eval("buildContextMenu ="+buildContextMenu.toString() .replace('openItemInNewTab.hidden = false;', '$& TMP_updateContextMenu(openItem, openItemInNewWindow, openItemInNewTab, prefStringTMHistory);' )); } } PK 6content/tabmixplus/flst/PK H5@Sokttcontent/tabmixplus/flst/flst.js//////////////////////////////////////// // flst.js // Daniel Lindkvist, 04-08-09 // modified by logixoul, 2005-04-18 , modified again by onemen //////////////////////////////////////// var flst = { tb: null, tabBox: null, //for slideshow slideshow: null, // init init: function() { flst.tb = document.getElementById('content'); flst.tabBox = flst.tb.mTabBox; this.onTabFocus(); }, onTabFocus: function() { flst.tb.mCurrentTab.setAttribute('flst_id', new Date().getTime()); }, showAlert: function(msg) { try { var alerts = Components.classes["@mozilla.org/alerts-service;1"] .getService(Components.interfaces.nsIAlertsService); alerts.showAlertNotification("chrome://tabmixplus/skin/tmp.png", "Tab Mix Plus", msg, false, "", null); } catch (e) { var statusTextFld = document.getElementById("statusbar-display"); statusTextFld.label = msg; setTimeout(function() { statusTextFld.removeAttribute("label"); }, 2500); } }, //toggle flst on/off toggle: function(event) { var msg; var setting = TMP_getIntPref(tabxBranch, "focusTab", 2) var stringBundle = document.getElementById("tmp-string-bundle"); if ( setting != 4 ) { gPref.setIntPref("extensions.tabmix.focusTab",4); msg = stringBundle.getString("flstOn.label"); } else { gPref.setIntPref("extensions.tabmix.focusTab",2); msg = stringBundle.getString("flstOff.label"); } this.showAlert(msg); }, //for slideshow toggleSlideshow: function() { var stringBundle = document.getElementById("tmp-string-bundle"); if(flst.slideshow != null) { window.clearInterval(flst.slideshow); flst.slideshow = null; this.showAlert(stringBundle.getString("slideshowOff.label")); return; } if (flst.tb.mTabContainer.childNodes.length < 2) return; var time = 4; try { time = gPref.getIntPref("extensions.tabmix.slideDelay"); } catch(e){ } time = time * 1000; // to get seconds flst.slideshow = window.setInterval(flst.focusNext, time); this.showAlert(stringBundle.getString("slideshowOn.label")); }, focusNext: function() { window.getBrowser().selectedTab = flst.getNextTab(); }, getNextTab: function() { var index = flst.tabBox.selectedIndex; var tabs = flst.tb.mTabContainer.childNodes; if (tabs.length < 2 || tabs.length-1 == index) return tabs[0]; else return tabs[index+1]; } }; /*//////////////////////////////////////////////////////////////////// // The Original Code is the Merge Window function of "Duplicate Tab"// // extension for Mozilla Firefox.// // version 0.5.1// // The Initial Developer of the Original Code is Twanno. // // Modfied for TMP by CPU// *///////////////////////////////////////////////////////////////////// var dtMergeWindows = { // merge several windows to one window, or only selected tabs to previous focussed window, // or only current window with previous window mergeWindows: function() { var mergePopups = gPref.getBoolPref("extensions.tabmix.mergePopups"); var placePopupNextToOpener = gPref.getBoolPref("extensions.tabmix.placePopupNextToOpener"); var mergeAllWindows = gPref.getBoolPref("extensions.tabmix.mergeAllWindows"); var openTabNext = gPref.getBoolPref("extensions.tabmix.openTabNext"); var stringBundle = document.getElementById("tmp-string-bundle"); // other variables used in this function var currentIndex, tabs, browsers = new Array(), i, j; // get browser windows listed and add them to an array var windowsArrayList = dtMergeWindows.listWindows(); var windowsArray = windowsArrayList.windowsArray; var popupsArray = windowsArrayList.popupsArray; var currentWindowIsPopup = windowsArrayList.isCurrentWindowPopup; // force the merging of windows when the current window is a popup // and the popup would be merged with one other (non popup) window var forceMergeWindows = (currentWindowIsPopup && (windowsArray.length == 1 || !mergeAllWindows)); // foreground window is not a popup other window(s) is/are popup(s) var mergeBackGround = (windowsArray.length == 0 && popupsArray.length > 0 && !currentWindowIsPopup && mergePopups); // alert if just one window is open; no need to merge one window if (!forceMergeWindows && ((!mergePopups && windowsArray.length < 1 && !currentWindowIsPopup) || windowsArray.length+popupsArray.length < 1)) { var errorMessage = stringBundle.getString('tmp.merge.error'); const errorimage = "chrome://tabmixplus/skin/tmpsmall.png"; var browser = getBrowser().selectedBrowser; if (getBrowser().showMessage) { getBrowser().showMessage(browser, errorimage, errorMessage, '', null, null, null, "top", true); } else if (getBrowser().getNotificationBox) { var notificationBox = getBrowser().getNotificationBox(browser); if (!notificationBox.getNotificationWithValue("mergeWindows")) { const priority = notificationBox.PRIORITY_INFO_MEDIUM; notificationBox.appendNotification(errorMessage, "mergeWindows", errorimage, priority, null); } } else window.alert(errorMessage); return; } // check if one or more tabs are selected to be merged var selectedTabs = getBrowser().mTabContainer.getElementsByAttribute('mergeselected','true'); var tabsSelected = (selectedTabs.length > 0); // don't merge the current window if it is a popup and all windows are to be merged except popups var dontMergeCurrentWindow = (!forceMergeWindows && !mergePopups && currentWindowIsPopup && mergeAllWindows); // get currently focussed and previously focussed window // and get the window which has been out of focus longest var currentWindow = (dontMergeCurrentWindow)?windowsArray[windowsArray.length-1]:windowsArrayList.currentWindow; var previousWindow = (dontMergeCurrentWindow)?windowsArray[windowsArray.length-2]:windowsArray[windowsArray.length-1]; var firstWindow = windowsArray[0]; if (mergeBackGround) { // to correctly merge popup(s) when only the current window is not a popup currentWindow = popupsArray.pop(); firstWindow = windowsArrayList.currentWindow; previousWindow = windowsArrayList.currentWindow; currentWindowIsPopup = true; windowsArray[0] = windowsArrayList.currentWindow; } var previousWindowTabBar = previousWindow.getBrowser().mTabContainer; var firstWindowTabBar = firstWindow.getBrowser().mTabContainer; var previousWindowTabIndex = (openTabNext)?previousWindowTabBar.selectedIndex:previousWindowTabBar.childNodes.length; var firstWindowTabIndex = (openTabNext)?firstWindowTabBar.selectedIndex:firstWindowTabBar.childNodes.length; // get currently focussed tab, so it can be selected again after merging if (tabsSelected && !gBrowser.mCurrentTab.hasAttribute('mergeselected')) { i = 0, j = -1; while (i < gBrowser.mTabContainer.childNodes.length) { if (gBrowser.mTabContainer.childNodes[i].hasAttribute('mergeselected')) j++; if ((i >= gBrowser.mTabContainer.selectedIndex) && (j > -1)) { currentIndex = j; break; } i++; } } else currentIndex = (tabsSelected)?gBrowser.mTabContainer.selectedIndex:currentWindow.getBrowser().mTabContainer.selectedIndex; // If more then one window is opened and not all windows must be merged to one: // Either because of selected tabs or the pref is set to do so // Merge only the (selected) tabs of the currently focussed window and the previously focussed window if (tabsSelected || !mergeAllWindows) { var openerPosition = -1; tabs = currentWindow.getBrowser().mTabContainer.childNodes; // if tabs have been selected, list them in an array if (tabsSelected && !mergeBackGround) browsers = listTabs(selectedTabs, window); else if (tabsSelected && mergeBackGround) { var previousTabs = previousWindow.getBrowser().mTabContainer.childNodes; browsers = listTabs(tabs, currentWindow); for (i = 0; i < previousTabs.length; i++) { if (!previousTabs[i].hasAttribute('mergeselected')) previousTabs[i].setAttribute('mergeremove', 'true'); } } // if no tabs have been selected, list all tabs of the window in an array else if (!tabsSelected) { browsers = listTabs(tabs, currentWindow); } // if the current window is a popup window place the popup next to its opener // when that opener is found in the previous window. if (currentWindowIsPopup && placePopupNextToOpener) { var openerPositionArray = getPopupOpenerPosition(currentWindow, [previousWindow], previousWindowTabIndex); openerPosition = openerPositionArray[0]; if (openerPositionArray[1] == 'tabs') { currentIndex = (mergeBackGround)? currentIndex: openerPosition + currentIndex; // the popup opener was found in one of the tabs in the window that will remain. // place the tab(s) next to the opener setTabsInBrowser(previousWindow, browsers, openerPosition); } } // place all tabs in one window if (openerPosition == -1) { currentIndex = previousWindowTabIndex + currentIndex; setTabsInBrowser(previousWindow, browsers); } // prompt a warning if some tabs are selected and the window with remaining tabs is closed var promptpref = gPref.getBoolPref("extensions.tabmix.warnOnclose"); var closepref = gPref.getBoolPref("extensions.tabmix.closeOnSelect"); var askForPrompt = ((promptpref) && (tabsSelected) && (selectedTabs.length < tabs.length)); var promptOK = false, promptAgain = { value:true }; if (askForPrompt && closepref) { var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService); var promptTitle = stringBundle.getString('tmp.merge.warning.title'); var promptMessage = stringBundle.getString('tmp.merge.warning.message'); var promptCheckboxLabel = stringBundle.getString('tmp.merge.warning.checkboxLabel'); promptOK = promptService.confirmCheck(window, promptTitle, promptMessage, promptCheckboxLabel, promptAgain); } // select the tab which was selected in the top window previousWindowTabBar.selectedIndex = currentIndex; // close current window if all tabs are merged or if specified by user to do so with some tabs selected if ((promptOK || (!askForPrompt)) && closepref) { if (!promptAgain.value) { gPref.setBoolPref("exetnsions.tabmix.warnOnClose", false); } previousWindow.focus(); currentWindow.close(); } // If the window is not to be closed, remove the tabs that have been merged // if tab is protect remove mergeselected attribute else { // xxx if we close in one loop we get //Error: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMXULElement.boxObject] // Source file: chrome://global/content/bindings/browser.xml // we need to fix the flst select after remove and made the proper new tab index in gBrowser.removeTab //in the first loop we remove all the tab but the current tab //in the 2nd loop we remove the current tab for (i = selectedTabs.length - 1; i > -1; --i) { var tab = selectedTabs.item(i); if (tab.hasAttribute("protected")) { tab.removeAttribute("mergeselected"); tab.label = tab.label.substr(4); } else if (tab != currentWindow.getBrowser().mCurrentTab) currentWindow.getBrowser().removeTab(tab); } for (i = selectedTabs.length - 1; i > -1; --i) { tab = selectedTabs.item(i); currentWindow.getBrowser().removeTab(tab); } previousWindow.focus(); } if (mergeBackGround && tabsSelected) { // because the other windows are added to the window with selected tabs, the not selected tabs // have to be removed. (normally the selected tabs will be removed and placed in another window) for (i = 0; i < selectedTabs.length; i++) { selectedTabs.item(i).label = selectedTabs.item(i).label.substr(4); } for (i = 0; i < previousTabs.length; i++) { if (previousTabs[i].hasAttribute('mergeremove')) { if (i < currentIndex) currentIndex--; previousWindow.getBrowser().removeTab(previousTabs[i]); } if (previousTabs[i].hasAttribute('mergeselected')) previousTabs[i].removeAttribute('mergeselected'); previousTabs[i].label = previousTabs[i].label.substr(4); } } previousWindowTabBar.selectedIndex = currentIndex; } // Merge all windows to one window if more then one window is opened and // no tabs are selected and the pref is set to merge all windows. else if (!tabsSelected && mergeAllWindows) { // list all tabs on all windows with history scrollposition var addedTabsLength = 0, popupsList = new Array(); for (i = 1; i < windowsArray.length; i++) { tabs = windowsArray[i].getBrowser().mTabContainer.childNodes; browsers = browsers.concat(listTabs(tabs, windowsArray[i])); // the last window in the array is only the current window if merging of popups is disabled // and the current window is a popup window if (windowsArray[i] != currentWindow) addedTabsLength += tabs.length; } // the current window is a popup and popups should also be merged // or the current window is not a popup if (!dontMergeCurrentWindow) { tabs = currentWindow.getBrowser().mTabContainer.childNodes; if (!currentWindowIsPopup) { browsers = browsers.concat(listTabs(tabs, currentWindow)); currentIndex = firstWindowTabIndex + addedTabsLength + currentIndex; } else { var listedTabs = listTabs(tabs, currentWindow); if (placePopupNextToOpener) { openerPositionArray = getPopupOpenerPosition(currentWindow, windowsArray, firstWindowTabIndex); openerPosition = openerPositionArray[0]; switch (openerPositionArray[1]) { case 'browsers': // the popup opener was found in the list of browsers that will be added to the remaining window. currentIndex = openerPosition + 1 + currentIndex; popupsList[openerPosition] = listedTabs; currentIndexSet = true; break; case 'tabs': // the popup opener was found in one of the tabs in the window that will remain. setTabsInBrowser(firstWindow, listedTabs, openerPosition); // in this case current index is fixed because the to be focused tab // has now already been added to the remaining window currentIndex = openerPosition + 1 + currentIndex; break; case 'end': default: // no popup opener was found, the popup will be added at the end of the tab list. browsers = browsers.concat(listedTabs); currentIndex = firstWindowTabIndex + addedTabsLength + currentIndex; break; } } else { browsers = browsers.concat(listedTabs); currentIndex = firstWindowTabIndex + addedTabsLength + currentIndex; } } } else // the current window is a popup and should not be merged. currentIndex = firstWindowTabIndex + addedTabsLength + currentIndex; // add popup windows to the remaining window when popup windows should also be merged. if (mergePopups) { for (i = 0; i < popupsArray.length; i++) { tabs = popupsArray[i].getBrowser().mTabContainer.childNodes; if (placePopupNextToOpener) { listedTabs = listTabs(tabs, popupsArray[i]); var newWindowsArray = windowsArray; if (!currentWindowIsPopup && !mergeBackGround) newWindowsArray.push(currentWindow); openerPositionArray = getPopupOpenerPosition(popupsArray[i], newWindowsArray, firstWindowTabIndex); openerPosition = openerPositionArray[0]; switch (openerPositionArray[1]) { case 'browsers': // the popup opener was found in the list of browsers that will be added to the remaining window. if (openerPosition < currentIndex) currentIndex += tabs.length; if (popupsList[openerPosition] instanceof Array) popupsList[openerPosition] = popupsList[openerPosition].concat(listedTabs); else popupsList[openerPosition] = listedTabs; break; case 'tabs': // the popup opener was found in one of the tabs in the window that will remain. setTabsInBrowser(firstWindow, listedTabs, openerPosition); if (openerPosition < currentIndex) currentIndex += tabs.length; break; case 'end': default: // no popup opener was found, the pop up will be added at the end of the tab list. browsers = browsers.concat(listedTabs); break; } } else { browsers = browsers.concat(listTabs(tabs, popupsArray[i])); } } } // place all tabs in one window and select the tab which was selected in the top window setTabsInBrowser(firstWindow, browsers); // add popups which have openers next to their openers. while (popupsList.length > 0) { var popupTabs = popupsList.pop(); if (popupTabs instanceof Array) { var position = popupsList.length; setTabsInBrowser(firstWindow, popupTabs, position); } } // select the tab which was selected in the top window firstWindowTabBar.selectedIndex = currentIndex; // focus the window now containing the tabs and close all other windows firstWindow.focus(); // close windows from where tabs have been merged for (i = 1; i < windowsArray.length; i++) { windowsArray[i].close(); } // close popup windows if the popups have been merged if (mergePopups) { for (i = 0; i < popupsArray.length; i++) { popupsArray[i].close(); } } // if current window has been merged close it if (!dontMergeCurrentWindow) currentWindow.close(); // give focus again to the current window if it is a popup and popups should not be merged if (dontMergeCurrentWindow) setTimeout(windowsArrayList.currentWindow.focus, 0); } // retrieve the opener for a popup window, so it can be placed next to it function getPopupOpenerPosition(popupWindow, otherWindows, containerWindowTabsIndex) { var i, j, openerIndex = -1; var openerWindow = popupWindow.getBrowser().contentWindow.opener if (!openerWindow) { return [openerIndex, 'end']; } for (i = 0; i < otherWindows.length; i++) { if (otherWindows[i] == popupWindow) continue; var tabs = otherWindows[i].getBrowser().mTabContainer.childNodes; for (j = 0; j < tabs.length; j++) { openerIndex++; var possibleOpener = otherWindows[i].getBrowser().getBrowserForTab(tabs[j]).contentWindow; if (possibleOpener == openerWindow) { var where = (openerIndex >= containerWindowTabsIndex)? 'browsers': 'tabs'; return [openerIndex, where]; } } } return [-1, 'end']; } function listTabs(tabs, aWindow) { var x = 0, curBrowser, browsersArray = new Array(); for (x; x < tabs.length; x++) { curBrowser = aWindow.getBrowser().getBrowserForTab(tabs[x]); browsersArray[x] = [[dtMergeWindows.copyHistory(curBrowser.webNavigation.sessionHistory)], aWindow.SessionData.getTabProperties(tabs[x]), [curBrowser.contentWindow.scrollX, curBrowser.contentWindow.scrollY], curBrowser.markupDocumentViewer.textZoom]; } return browsersArray; } // add cloned tabs to a browser window function setTabsInBrowser(aWindow, pages) { var y = 0, openedBrowser, newTab; if (openTabNext) { var index = (aWindow == firstWindow)?firstWindowTabIndex:previousWindowTabIndex; } // add tabs to defined position in case of a popup: next to its opener var addToPosition = false; if (typeof(arguments[2]) == 'number') { addToPosition = true; var openerPosition = arguments[2]; var position = arguments[2]; } while (y < pages.length) { newTab = aWindow.getBrowser().addTab(); if (addToPosition && getBrowser().TMmoveTabTo) { var newTabPos = (aWindow.getBrowser().getTabIndex)? aWindow.getBrowser().getTabIndex(newTab): newTab._tPos; // the popup is placed next to its opener var newPosition = position + 1; if (newTabPos < newPosition) newPosition--; if (newTabPos != newPosition) aWindow.getBrowser().TMmoveTabTo((aWindow.getBrowser().getTabIndex)? newTabPos: newTab, newPosition); // set the opener again for the popup (this data will otherwise be lost) var openerBrowser = aWindow.getBrowser().getBrowserForTab(aWindow.getBrowser().mTabContainer.childNodes[openerPosition]); aWindow.getBrowser().getBrowserForTab(newTab).contentWindow.opener = openerBrowser.contentWindow; position++; } else if (openTabNext) { var firstArgument = (aWindow.getBrowser().getTabIndex)? aWindow.getBrowser().getTabIndex(newTab): newTab; aWindow.getBrowser().TMmoveTabTo(firstArgument, index + 1); index++; } openedBrowser = aWindow.getBrowser().getBrowserForTab(newTab); //we call setScrollPosition after load to make sure scrollPosition is set openedBrowser.addEventListener('load', aWindow.dupScrollPosition, true); openedBrowser._scrollData = { tabPos: newTab._tPos, href: null, _scrollX: pages[y][2][0], _scrollY: pages[y][2][1], zoom: pages[y][3] }; aWindow.SessionData.setTabProperties(newTab, pages[y][1]); dtMergeWindows.setClonedContent(openedBrowser, pages[y][0]); y++; } } }, // list all browser windows in een array from front to back (z-order on windows, on linux opening order); listWindows: function() { // function to check if a window is a popup or a normal window function isPopupWindow(domWin) { // the chrome flags are defined in the nsIWebBrowserChrome interface const webBrowserChrome = Components.interfaces.nsIWebBrowserChrome; var chromeBrowser = domWin.getBrowser().docShell.QueryInterface(Components.interfaces.nsIDocShellTreeItem) .treeOwner.QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(webBrowserChrome); // check if all chrome is enabled in the window, using chromeFlags from nsIWebBrowserChrome var chromeAll = chromeBrowser.chromeFlags & webBrowserChrome.CHROME_ALL; if (chromeAll == webBrowserChrome.CHROME_ALL) { return false; // no popup window (the window has all chrome enabled) } // in other cases some chrome is missing from the window: popup window return true; } var windowsArray = new Array(), popupsArray = new Array(); var i = 0, winEnumerator, currentWindow, isCurrentWindowPopup, win; var windowsMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator); currentWindow = windowsMediator.getMostRecentWindow('navigator:browser'); // on linux z enumerator does not work: use normal enumerator var platform = currentWindow.navigator.platform; if (platform.indexOf('Linux') != -1) { winEnumerator = windowsMediator.getEnumerator('navigator:browser'); while (winEnumerator.hasMoreElements()) { win = winEnumerator.getNext(); // list the currentWindow apart if (win == currentWindow.QueryInterface(Components.interfaces.nsIDOMWindow)) { currentWindow = win; isCurrentWindowPopup = isPopupWindow(win); continue; } if (isPopupWindow(win)) popupsArray.push(win); else windowsArray.push(win); } } else { // use getZOrderEnumerator on Windows and Mac; it does not work on linux winEnumerator = windowsMediator.getZOrderDOMWindowEnumerator('navigator:browser', false); while (winEnumerator.hasMoreElements()) { win = winEnumerator.getNext(); // list the current window apart if (win == currentWindow.QueryInterface(Components.interfaces.nsIDOMWindow)) { currentWindow = win; isCurrentWindowPopup = isPopupWindow(win); continue; } if (isPopupWindow(win)) popupsArray.push(win); else { windowsArray.push(win); } } } var windowsList = {windowsArray: windowsArray, popupsArray: popupsArray, currentWindow: currentWindow, isCurrentWindowPopup: isCurrentWindowPopup}; return windowsList; }, setClonedContent: function(aBrowser, aClonedContents) { if (aClonedContents[0].length == 0) return; this.clonedContents = aClonedContents; this.newBrowser = aBrowser; this.cloneTabHistory(aBrowser.webNavigation, aClonedContents[0]); }, cloneHistoryEntry: function(aEntry) { if (!aEntry) return null; aEntry = aEntry.QueryInterface(Components.interfaces.nsISHContainer); var newEntry = aEntry.clone(); newEntry = newEntry.QueryInterface(Components.interfaces.nsISHContainer); newEntry.loadType = Math.floor(aEntry.loadType); if (aEntry.childCount) { for (var j = 0; j < aEntry.childCount; j++) { var childEntry = dtMergeWindows.cloneHistoryEntry(aEntry.GetChildAt(j)); if (childEntry) newEntry.AddChild(childEntry, j); } } return newEntry; }, cloneTabHistory: function(webNav, originalHistory) { var newHistory = webNav.sessionHistory newHistory.QueryInterface(Components.interfaces.nsISHistoryInternal); // delete history entries if they are present if (newHistory.count > 0) newHistory.PurgeHistory(newHistory.count); for (var i = 0; i < originalHistory.length; i++) { var entry = originalHistory[i].QueryInterface(Components.interfaces.nsISHEntry); var newEntry = dtMergeWindows.cloneHistoryEntry(entry); newHistory.addEntry(newEntry, true); } // Goto current history location if (originalHistory.length > 0 && originalHistory.index < originalHistory.length) { try { webNav.gotoIndex(originalHistory.index); } catch(e) { window.setTimeout( function (webNav, index) { webNav.gotoIndex(index); }, 0, webNav, originalHistory.index); } } }, copyHistory: function(originalHistory, aOnlyBack) { // variables used in this function var pageCount, currentPageNum, firstPageNum, lastPageNum; currentPageNum = originalHistory.index; lastPageNum = originalHistory.count-1; firstPageNum = 0; pageCount = lastPageNum+1; currentPageNum = currentPageNum-firstPageNum; var copiedHistory = new Array(); for (var i = firstPageNum; i < pageCount; i++) { copiedHistory.push(originalHistory.getEntryAtIndex(i, false)); } copiedHistory.index = currentPageNum; return copiedHistory; } }; PK u\5"44"content/tabmixplus/flst/lasttab.js/*//////////////////////////////////////////////////////////////////// // The Original Code is the "LastTab" extension for Mozilla Firefox.// // version 1.5 - October 26, 2005 // // The Initial Developer of the Original Code is Timothy Humphrey. // *//////////////////////////////////////////////////////////////////// var TMP_LastTab = { CtrlKey : false, favorLeftToRightOrdering : true, handleCtrlTab : true, KeyboardNavigating : true, KeyLock : false, respondToMouseInTabList : true, showTabList : true, SuppressTabListReset : false, TabBar : null, TabBox : null, TabHistory : [], TabIndex : 0, TabList : null, TabListLock : false, DisplayTabList : function() { var element = document.documentElement; var tablist = TMP_LastTab.TabList; var menuitem, tab, imageUrl, x, y, i, activeIndex; createCommonList(tablist, this.handleCtrlTab ? 3 : 2); var item = tablist.childNodes[TMP_LastTab.TabIndexToMenuItem()]; item.setAttribute("_moz-menuactive", "true"); updateMenuItemActive(null, item); //moveTo() method introduces anomalies, e.g. hovering over location bar moves the popup; hiding and showing the popup works better document.popupNode = element; x = -element.boxObject.screenX; y = 10000; tablist.showPopup(element, x, y, "popup", null, null); //show offscreen to get popup measurements x = Math.round((window.outerWidth - tablist.boxObject.width) / 2) - (element.boxObject.screenX - window.screenX); y = Math.round((window.outerHeight - tablist.boxObject.height) / 2) - (element.boxObject.screenY - window.screenY); if(x + element.boxObject.screenX < 0) x = -element.boxObject.screenX; else if(x + element.boxObject.screenX + tablist.boxObject.width > window.screen.availWidth) x = window.screen.availWidth - tablist.boxObject.width - element.boxObject.screenX; if(y + element.boxObject.screenY < 0) y = -element.boxObject.screenY; else if(y + element.boxObject.screenY + tablist.boxObject.height > window.screen.availHeight) y = window.screen.availHeight - tablist.boxObject.height - element.boxObject.screenY; if(x == -1 && y == -1) //workaround special status of -1, -1 position in showPopup() method x = y = 0; TMP_LastTab.SuppressTabListReset = true; tablist.hidePopup(); TMP_LastTab.SuppressTabListReset = false; tablist.showPopup(element, x, y, "popup", null, null); var ietab = "chrome://ietab/content/reloaded.html?url=" if (gBrowser.currentURI.spec.indexOf(ietab) == 0) tablist.focus(); TMP_LastTab.TabListLock = true; }, init : function() { var browser = document.documentElement; TMP_LastTab.TabBox = getBrowser().mTabBox; TMP_LastTab.TabBar = getBrowser().mTabContainer; TMP_LastTab.TabList = document.getElementById("lasttabTabList"); TMP_LastTab.TabBox._eventNode.removeEventListener("keypress", TMP_LastTab.TabBox._keyEventHandler, true); browser.addEventListener("keydown", TMP_LastTab.OnKeyDown, true); browser.addEventListener("keypress", TMP_LastTab.OnKeyPress, true); browser.addEventListener("keyup", TMP_LastTab.OnKeyUp, true); TMP_LastTab.TabList.addEventListener("DOMMenuItemActive", TMP_LastTab.ItemActive, true); TMP_LastTab.TabList.addEventListener("DOMMenuItemInactive", TMP_LastTab.ItemInactive, true); TMP_LastTab.TabBar.childNodes[0].__LastTab = true; TMP_LastTab.TabHistory.push(TMP_LastTab.TabBar.childNodes[0]); // we change pref string in tabmixplus 0.3 if (tabxPrefs.prefHasUserValue("HandleCtrlTab")) { tabxPrefs.setBoolPref("lasttab.handleCtrlTab", tabxPrefs.getBoolPref("HandleCtrlTab")); tabxPrefs.clearUserPref("HandleCtrlTab"); } if (tabxPrefs.prefHasUserValue("CtrlTabLeftToRight")) { tabxPrefs.clearUserPref("CtrlTabLeftToRight"); } TMP_LastTab.ReadPreferences(); }, deinit : function() { var browser = document.documentElement; browser.removeEventListener("keydown", TMP_LastTab.OnKeyDown, true); browser.removeEventListener("keypress", TMP_LastTab.OnKeyPress, true); browser.removeEventListener("keyup", TMP_LastTab.OnKeyUp, true); TMP_LastTab.TabList.removeEventListener("DOMMenuItemActive", TMP_LastTab.ItemActive, true); TMP_LastTab.TabList.removeEventListener("DOMMenuItemInactive", TMP_LastTab.ItemInactive, true); }, ItemActive : function(event) { updateMenuItemActive(event); if(TMP_LastTab.respondToMouseInTabList) { if(TMP_LastTab.KeyboardNavigating) { if(event.target.value != TMP_LastTab.inverseIndex(TMP_LastTab.TabIndex)) TMP_LastTab.TabList.childNodes[TMP_LastTab.TabIndexToMenuItem()].setAttribute("_moz-menuactive", "false"); TMP_LastTab.KeyboardNavigating = false; } TMP_LastTab.TabIndex = TMP_LastTab.inverseIndex(event.target.value); } else { if(event.target.value != TMP_LastTab.inverseIndex(TMP_LastTab.TabIndex)) event.target.setAttribute("_moz-menuactive", "false"); } }, ItemInactive : function(event) { updateMenuItemInactive(event); if(!TMP_LastTab.respondToMouseInTabList && event.target.value == TMP_LastTab.inverseIndex(TMP_LastTab.TabIndex)) event.target.setAttribute("_moz-menuactive", "true"); }, MaintainTabHistory : function() { var newTabs = []; var tab, tabCount; var i; // Gather tab synchronization info tabCount = TMP_LastTab.TabBar.childNodes.length; for(i = 0; i < tabCount; i++) { tab = TMP_LastTab.TabBar.childNodes[i]; if(!tab.__LastTab) newTabs[newTabs.length] = tab; } // Purge old tab info from history i = 0; try{ while(i < TMP_LastTab.TabHistory.length) { if(!TMP_LastTab.TabHistory[i] || TMP_LastTab.TabHistory[i].parentNode != TMP_LastTab.TabBar) TMP_LastTab.TabHistory.splice(i, 1); else i++; } } catch (e) {tmLog("error from Ctrl+Tab in MaintainTabHistory " + typeof(TMP_LastTab.TabHistory[i]) + "\n" + e + "\n" + "TMP_LastTab.TabHistory.length " + TMP_LastTab.TabHistory.length + "\n" + "i " + i);} // Add new tabs to history if(newTabs.length > 0) { tab = TMP_LastTab.TabHistory.pop(); if(TMP_LastTab.favorLeftToRightOrdering) { for(i = newTabs.length - 1; i >= 0; i--) { newTabs[i].__LastTab = true; TMP_LastTab.TabHistory.push(newTabs[i]); } } else { for(i = 0; i < newTabs.length; i++) { newTabs[i].__LastTab = true; TMP_LastTab.TabHistory.push(newTabs[i]); } } TMP_LastTab.TabHistory.push(tab); } }, OnKeyDown : function(event) { TMP_LastTab.CtrlKey = event.ctrlKey && !event.altKey && !event.metaKey; }, OnKeyPress : function(event) { var tabCount = TMP_LastTab.handleCtrlTab ? TMP_LastTab.TabHistory.length : gBrowser.mTabs.length; if((TMP_LastTab.handleCtrlTab || TMP_LastTab.showTabList) && event.keyCode == event.DOM_VK_TAB && event.ctrlKey && !event.altKey && !event.metaKey) { if(!TMP_LastTab.KeyLock) { if (TMP_LastTab.handleCtrlTab) { TMP_LastTab.MaintainTabHistory(); tabCount = TMP_LastTab.TabHistory.length; TMP_LastTab.TabIndex = tabCount - 1; } else { TMP_LastTab.TabIndex = tabCount - 1 - gBrowser.mCurrentTab._tPos; } TMP_LastTab.KeyLock = true; } if(TMP_LastTab.TabListLock) TMP_LastTab.TabList.childNodes[TMP_LastTab.TabIndexToMenuItem()].setAttribute("_moz-menuactive", "false"); if(event.shiftKey) { TMP_LastTab.TabIndex++; if(TMP_LastTab.TabIndex >= tabCount) TMP_LastTab.TabIndex = 0; } else { TMP_LastTab.TabIndex--; if(TMP_LastTab.TabIndex < 0) TMP_LastTab.TabIndex = tabCount - 1; } if(TMP_LastTab.showTabList) { TMP_LastTab.KeyboardNavigating = true; if(!TMP_LastTab.TabListLock) { if(tabCount > 1) TMP_LastTab.DisplayTabList(); } else { var item = TMP_LastTab.TabList.childNodes[TMP_LastTab.TabIndexToMenuItem()]; item.setAttribute("_moz-menuactive", "true"); updateMenuItemActive(null, item); } } else { TMP_LastTab.TabBox.selectedTab = TMP_LastTab.TabHistory[TMP_LastTab.TabIndex]; TMP_LastTab.TabBar.ensureTabIsVisible(TMP_LastTab.TabBox.selectedTab._tPos); } event.stopPropagation(); event.preventDefault(); } else { if(TMP_LastTab.TabListLock) TMP_LastTab.TabList.hidePopup(); TMP_LastTab.TabBox._keyEventHandler.handleEvent(event); } }, OnKeyUp : function(event) { var keyReleased = event.keyCode == event.DOM_VK_CONTROL; TMP_LastTab.CtrlKey = event.ctrlKey && !event.altKey && !event.metaKey; if(keyReleased && TMP_LastTab.TabListLock) { if(TMP_LastTab.TabList.childNodes[TMP_LastTab.TabIndexToMenuItem()].getAttribute("_moz-menuactive") == "true") { TMP_LastTab.TabBox.selectedTab = TMP_LastTab.handleCtrlTab ? TMP_LastTab.TabHistory[TMP_LastTab.TabIndex] : gBrowser.mTabs[gBrowser.mTabs.length - 1 - TMP_LastTab.TabIndex]; TMP_LastTab.TabBar.ensureTabIsVisible(TMP_LastTab.TabBox.selectedTab._tPos); } updateMenuItemInactive(null); gBackupLabel==""; TMP_LastTab.PushSelectedTab(); TMP_LastTab.TabList.hidePopup(); } if(keyReleased && TMP_LastTab.KeyLock) { TMP_LastTab.PushSelectedTab(); TMP_LastTab.TabIndex = 0; TMP_LastTab.KeyLock = false; } }, OnMenuCommand : function(event) { if(TMP_LastTab.respondToMouseInTabList) { TMP_LastTab.TabBox.selectedTab = TMP_LastTab.handleCtrlTab ? TMP_LastTab.TabHistory[event.target.value] : gBrowser.mTabs[event.target.value]; TMP_LastTab.TabBar.ensureTabIsVisible(TMP_LastTab.TabBox.selectedTab._tPos); TMP_LastTab.PushSelectedTab(); } }, OnPopupHidden : function() { if(!TMP_LastTab.SuppressTabListReset) { var tablist = TMP_LastTab.TabList; while(tablist.childNodes.length > 0) tablist.removeChild(tablist.childNodes[0]); TMP_LastTab.TabListLock = false; TMP_LastTab.TabIndex = 0; TMP_LastTab.KeyLock = false; hideCommonList(tablist); } }, OnSelect : function(event) { var tabCount = TMP_LastTab.TabHistory.length; TMP_LastTab.MaintainTabHistory(); if(tabCount != TMP_LastTab.TabBar.childNodes.length) { if(tabCount > TMP_LastTab.TabBar.childNodes.length) { if(TMP_LastTab.TabBar.childNodes.length == 1) { TMP_LastTab.KeyLock = false; TMP_LastTab.TabIndex = 0; } } TMP_LastTab.PushSelectedTab(); } else if(!TMP_LastTab.KeyLock) { if(TMP_LastTab.CtrlKey) TMP_LastTab.KeyLock = true; //allow other tab navigation methods to work else TMP_LastTab.PushSelectedTab(); } }, PushSelectedTab : function() { var selectedTab = TMP_LastTab.TabBar.selectedItem; var tabCount, i; if(TMP_LastTab.TabHistory[TMP_LastTab.TabHistory.length - 1] != selectedTab) { tabCount = TMP_LastTab.TabHistory.length; for(i = 0; i < tabCount; i++) { if(TMP_LastTab.TabHistory[i] == selectedTab) { TMP_LastTab.TabHistory.push(TMP_LastTab.TabHistory.splice(i, 1)[0]); break; } } } }, ReadPreferences : function() { TMP_LastTab.handleCtrlTab = tabxPrefs.getBoolPref("lasttab.handleCtrlTab"); TMP_LastTab.favorLeftToRightOrdering = tabxPrefs.getBoolPref("lasttab.favorLeftToRightOrdering"); TMP_LastTab.respondToMouseInTabList = tabxPrefs.getBoolPref("lasttab.respondToMouseInTabList"); TMP_LastTab.showTabList = tabxPrefs.getBoolPref("lasttab.showTabList"); }, TabIndexToMenuItem : function() { var activeIndex; if (TMP_LastTab.handleCtrlTab) activeIndex = TMP_LastTab.TabHistory.length - 1 - TMP_LastTab.TabIndex; else activeIndex = gBrowser.mTabs.length - 1 - TMP_LastTab.TabIndex; return activeIndex; }, inverseIndex : function(index) { return TMP_LastTab.handleCtrlTab ? index : gBrowser.mTabs.length - 1 - index; } }; PK 6content/tabmixplus/click/PK ̸68oQ!content/tabmixplus/click/click.jsvar onDoubleClick = false; var gTab; // single click function // function TM_checkClick (event) { if (event && event.button == 2) return; // right click if (event && event.button == 0 && event.detail > 1) return; // double click (with left button) var target = event.originalTarget; // don't do anything if user click on close tab button , or on any other button on tab or tabbar if (target.getAttribute("anonid") == "tmp-close-button" || target.localName == "toolbarbutton") return; // the fix for bug 216899 will make autoscrolling override contentLoadURL if both are enabled // we don't need autoscrolling to override contentLoadURL if user click on tab or tabbar if (event.button == 1 && gPref.getBoolPref("middlemouse.contentLoadURL")) { if (!event.getPreventDefault()) { middleMousePaste(event); event.stopPropagation(); } return; } onDoubleClick = false; var aTab = target; while ( aTab.localName != "tabs" ) { if ( aTab.localName == "tab" ) break; if ( aTab.parentNode ) aTab = aTab.parentNode; else return; } gTab = aTab; var clickOutTabs = aTab.localName == "tabs"; // for tab flip if ( !clickOutTabs && event.button == 0 && aTab.hasAttribute("clickOnCurrent") ) { aTab.removeAttribute("clickOnCurrent"); var tabFlip = TMP_getBoolPref(tabxBranch, "tabFlip", false); var tabFlipDelay = TMP_getIntPref (tabxBranch, "tabFlipDelay", 250); if (tabFlip && !event.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey){ window.setTimeout(function () { if (!onDoubleClick) { gBrowser.previousTab(aTab); gBrowser.stopMouseHoverSelect(aTab); content.focus(); } }, tabFlipDelay ); return; } } var prefName /* middle click*/ if (event.button == 1) prefName = "middle" /* shift click*/ else if (event.button == 0 && event.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey) prefName = "shift" /* alt click*/ else if (event.button == 0 && event.altKey && !event.ctrlKey && !event.shiftKey && !event.metaKey) prefName = "alt" /* ctrl click*/ else if (event.button == 0 && (event.ctrlKey && !event.metaKey || !event.ctrlKey && event.metaKey) && !event.shiftKey && !event.altKey) prefName = "ctrl" TMclickAction(prefName, clickOutTabs, aTab); } // Double click function // function TM_onTabBarDblClick (e) { if ( !e || e.button != 0 || e.ctrlKey || e.shiftKey || e.altKey || e.metaKey ) return; onDoubleClick = true; var aTab = e.originalTarget; // don't do anything if user click on close tab button , or on any other button on tab or tabbar if (aTab.getAttribute("anonid") == "tmp-close-button" || aTab.localName == "toolbarbutton") return; while ( aTab.localName != "tabs" ) { if ( aTab.localName == "tab" ) break; aTab = aTab.parentNode; } // check if the 2 click was not on the same tab // it's look like only problem in 1.0.7 if (gTab != aTab) { gTab = aTab; return; } else gTab = null; TMclickAction( "dbl", aTab.localName == "tabs", aTab ); } // call action function from click on tabs or tabbar // function TMclickAction ( pref, clickOutTabs, aTab ) { if (!pref) return; // just in case we missed something var defaultPref = {middleClickTab:2, middleClickTabbar:10, shiftClickTab:5, shiftClickTabbar:0, altClickTab:6, altClickTabbar:0, ctrlClickTab:22, ctrlClickTabbar:0, dblClickTab:0, dblClickTabbar:1}; pref += clickOutTabs ? "ClickTabbar" : "ClickTab"; var action = TMP_getIntPref (tabxBranch, pref , defaultPref[pref]); switch ( action ) { case 0 : break; case 1 : BrowserOpenTab(); break; case 2 : // removeTab tab after delay, // if the tab is in the middle of selecting or we just add new tab // it can caused problem function _delayCloseTab(tab){ var b = tab.parentNode.parentNode.parentNode.parentNode; b.closeTab(tab); } if (aTab.localName != "tab") aTab = gBrowser.mCurrentTab; setTimeout(_delayCloseTab, 0, aTab); break; case 3 : gBrowser.duplicateTab(aTab); break; case 4 : gBrowser.reloadTab(aTab); break; case 5 : gBrowser.protectTab(aTab); break; case 6 : gBrowser.lockTab(aTab); break; case 7 : gBrowser.reloadAllTabs(aTab); break; case 8: gBrowser.removeAllTabsBut(aTab); break; case 9: gBrowser.closeAllTabs(); break; case 10: gBrowser.undoRemoveTab(); break; case 11: gBrowser.renameTab(aTab); break; case 12: //taken from tco if (SessionSaver && SessionSaver.snapBackTab) SessionSaver.snapBackTab(SessionSaver.snapback_noFX, SessionSaver.snapback_willFocus); break; case 13: gBrowser.undoRemoveAllTab(); break; case 14: gBrowser.duplicateInWindow(aTab, false); break; case 15: gBrowser.freezeTab(aTab); break; case 16: gBrowser.reloadAllTabsBut(aTab); break; case 17: gBrowser.closeLeftTabs(aTab); break; case 18: gBrowser.closeRightTabs(aTab); break; case 19: gBrowser.reloadLeftTabs(aTab); break; case 20: gBrowser.reloadRightTabs(aTab); break; case 21: // taken from tco if (aTab.localName != "tab") aTab = gBrowser.mCurrentTab; var href; if (window.IeView && window.IeView.ieViewLaunch) { href = gBrowser.getBrowserForTab(aTab).currentURI.spec; IeView.ieViewLaunch("Internet Explorer.lnk", href); } else if (window.gIeTab && window.gIeTab.switchTabEngine) { if (gBrowser.selectedTab != aTab) gBrowser.selectedTab = aTab; gIeTab.switchTabEngine(aTab, gIeTab.getBoolPref("ietab.alwaysNewTab", false)); } else if(window.ieview && window.ieview.launch) { href = gBrowser.getBrowserForTab(aTab).currentURI.spec; ieview.launch(href); } break; case 22: gBrowser.SelectToMerge(aTab); break; case 23: dtMergeWindows.mergeWindows(); break; case 24: gBrowser.closeGroupTabs(aTab); break; case 25: if (aTab.localName != "tab") aTab = gBrowser.mCurrentTab; var browserSpecs = gBrowser.getBrowserForTab(aTab).webNavigation; if (gIsPlaces) PlacesController.showAddBookmarkUI(browserSpecs.currentURI); else { if (BookmarksUtils.addBookmarkForBrowser) BookmarksUtils.addBookmarkForBrowser(browserSpecs); else if (addBookmarkForBrowser) addBookmarkForBrowser(browserSpecs); } break; case 26:// Bookmark All Tabs... (only in firefox) if (document.getElementById('Browser:BookmarkAllTabs')) { if (gIsPlaces) BrowserController.doCommand('Browser:BookmarkAllTabs'); else addBookmarkForTabBrowser(gBrowser, true); } break; case 27: gBrowser.duplicateInWindow(aTab, true); break; case 28: gBrowser.copyTabUrl(aTab); break; } } function Tm_checkTabClick(event) { var tabContextMenu = window.gBrowser.mStrip.firstChild.nextSibling; if (event.originalTarget != tabContextMenu) return true; var item; if (document.popupNode.parentNode) item = document.popupNode.parentNode.parentNode.id; if (item && (item == "btn_tabslist" || item == "btn_tabslistSorted")) gBrowser.mContextTab = document.popupNode.tab; var clickOutTabs = gBrowser.mContextTab ? gBrowser.mContextTab.localName == "tabs": true; var aTab = clickOutTabs ? gBrowser.mCurrentTab : gBrowser.mContextTab; var cIndex = aTab._tPos; var isOneWindow = numberOfWindows() == 1; var newTab = document.getElementById("tm-newtab"); TMP_showItem(newTab, tabxPrefs.getBoolPref("newTabMenu")); if (clickOutTabs) { TMP_setItem(newTab, "label", newTab.getAttribute("_newtab")); TMP_setItem(newTab, "oncommand", "TMP_BrowserOpenTab();"); } else { TMP_setItem(newTab, "label", newTab.getAttribute("_newtab") + " " + newTab.getAttribute("_afterthis")); TMP_setItem(newTab, "oncommand", "var tabbrowser = this.parentNode.parentNode.parentNode.parentNode; TMP_BrowserOpenTab(tabbrowser.mContextTab);"); } // Duplicate Commands TMP_showItem("tm-duplicateTab", tabxPrefs.getBoolPref("duplicateMenu")); TMP_showItem("tm-duplicateinWin", tabxPrefs.getBoolPref("duplicateinWinMenu") && !gSingleWindowMode); TMP_showItem("tm-detachTab", tabxPrefs.getBoolPref("detachTabMenu") && !gSingleWindowMode); TMP_showItem("tm-mergeWindowsTab", tabxPrefs.getBoolPref("showMergeWindow") && (!gSingleWindowMode || (gSingleWindowMode && !isOneWindow))); TMP_showItem("tm-renameTab", tabxPrefs.getBoolPref("renameTabMenu")); TMP_showItem("tm-copyTabUrl", tabxPrefs.getBoolPref("copyTabUrlMenu")); // ---------------- menuseparator ---------------- // // Reload Commands TMP_showItem("tm-reloadTab", tabxPrefs.getBoolPref("reloadTabMenu")); TMP_showItem("tm-reloadAllTabs", tabxPrefs.getBoolPref("reloadAllMenu")); TMP_showItem("tm-autoreloadTab_menu", tabxPrefs.getBoolPref("autoReloadMenu")); TMP_showItem("tm-reloadRight", tabxPrefs.getBoolPref("reloadRightMenu")); TMP_showItem("tm-reloadLeft", tabxPrefs.getBoolPref("reloadLeftMenu")); TMP_showItem("tm-reloadOther", tabxPrefs.getBoolPref("reloadOtherMenu")); // ---------------- menuseparator ---------------- // // Undo close tab Commands var undoClose = gPref.getBoolPref("extensions.tabmix.undoClose"); TMP_showItem("tm-undoCloseTab", tabxPrefs.getBoolPref("undoCloseTabMenu") && undoClose); TMP_showItem("tm-undoCloseList", tabxPrefs.getBoolPref("undoCloseListMenu") && undoClose); // ---------------- menuseparator ---------------- // // Close tab Commands TMP_showItem("tm-removeTab", tabxPrefs.getBoolPref("closeTabMenu")); TMP_showItem("tm-closeAllTabs", tabxPrefs.getBoolPref("closeAllMenu")); TMP_showItem("tm-closeSimilar", tabxPrefs.getBoolPref("closeSimilarTabs")); TMP_showItem("tm-removeAllTabsBut", tabxPrefs.getBoolPref("closeOtherMenu")); TMP_showItem("tm-closeLeftTabs", tabxPrefs.getBoolPref("closeLeftMenu")); TMP_showItem("tm-closeRightTabs", tabxPrefs.getBoolPref("closeRightMenu")); // ---------------- menuseparator ---------------- // TMP_showItem("tm-docShell", tabxPrefs.getBoolPref("docShellMenu")); TMP_showItem("tm-freezeTab", tabxPrefs.getBoolPref("freezeTabMenu")); TMP_showItem("tm-protectTab", tabxPrefs.getBoolPref("protectTabMenu")); TMP_showItem("tm-lockTab", tabxPrefs.getBoolPref("lockTabMenu")); // ---------------- menuseparator ---------------- // TMP_showItem("tm-addBookmarkAs", tabxPrefs.getBoolPref("bookmarkTabMenu")); TMP_showItem("tm-bookmarkAllTabs", tabxPrefs.getBoolPref("bookmarkTabsMenu")); // we call this again by popupshown to make sure we don't show 2 menuseparator together TMP_tabContextMenuShown(event); var protectedTab = aTab.hasAttribute("protected"); var lockedTab = aTab.hasAttribute("locked"); var tabsCount = gBrowser.mTabContainer.childNodes.length; var keeptab = tabxPrefs.getBoolPref("keepLastTab") TMP_setItem("tm-removeTab", "disabled", protectedTab || (keeptab && tabsCount == 1)); var closeTabsEmpty = gBrowser.closedTabs.length < 1; TMP_setItem("tm-undoCloseTab", "disabled", closeTabsEmpty); TMP_setItem("tm-undoCloseList", "disabled", closeTabsEmpty); TMP_setItem("tm-mergeWindowsTab", "disabled", isOneWindow); TMP_setItem("tm-closeRightTabs", "disabled", cIndex == tabsCount - 1); TMP_setItem("tm-closeLeftTabs", "disabled", cIndex == 0); TMP_setItem("tm-reloadRight", "disabled", cIndex == tabsCount - 1); TMP_setItem("tm-reloadLeft", "disabled", cIndex == 0); TMP_setItem("tm-docShell", "disabled", clickOutTabs); var freezeTabMenu = document.getElementById("tm-freezeTab"); if ( !freezeTabMenu.hidden ) TMP_setItem(freezeTabMenu, "checked", lockedTab && protectedTab); var lockTabMenu = document.getElementById("tm-lockTab"); if ( !lockTabMenu.hidden ) TMP_setItem(lockTabMenu, "checked", lockedTab); var protectTabMenu = document.getElementById("tm-protectTab"); if ( !protectTabMenu.hidden ) TMP_setItem(protectTabMenu, "checked", protectedTab); onAutoReloadPopup(false, aTab); return true; } // don't show 2 menuseparator together // this function is call by "popupshown" event // this is only to the case that other extensions popupshowing run after our Tm_checkTabClick function TMP_tabContextMenuShown(event) { var tabContextMenu = window.gBrowser.mStrip.firstChild.nextSibling; if (event.originalTarget != tabContextMenu) return; // don't show 2 menuseparator together var hideNextSeparator = true, lastVisible, hideMenu = true; for(var mi = tabContextMenu.firstChild; mi; mi = mi.nextSibling) { if (mi.localName == "menuseparator") { mi.hidden = hideNextSeparator; if (!hideNextSeparator) { hideNextSeparator = true; lastVisible = mi; } } else if(!mi.hidden && !mi.collapsed) { hideNextSeparator = false; hideMenu = false; } } // hide the last visible menuseparator if it is the last visible in the menu if (hideNextSeparator && lastVisible) lastVisible.hidden = true; // if all the menu are hidden don't show the popup if (hideMenu) tabContextMenu.hidePopup(); } function TM_checkContentMenu () { try { var showFreezeTab = gPref.getBoolPref("extensions.tabmix.freezeTabContent"); var showLockTab = gPref.getBoolPref("extensions.tabmix.lockTabContent"); var showProtectTab = gPref.getBoolPref("extensions.tabmix.protectTabContent"); var showTabsList = gPref.getBoolPref("extensions.tabmix.tabsList"); var showCloseTab = gPref.getBoolPref("extensions.tabmix.closeTabContent"); var showUndoCloseTab = gPref.getBoolPref("extensions.tabmix.undoCloseTabContent"); var showUndoCloseList = gPref.getBoolPref("extensions.tabmix.undoCloseListContent"); var undoClose = gPref.getBoolPref("extensions.tabmix.undoClose"); var autohide = gPref.getBoolPref("browser.tabs.autoHide"); var keeptab = gPref.getBoolPref("extensions.tabmix.keepLastTab"); var showDuplicateTab = gPref.getBoolPref("extensions.tabmix.duplicateTabContent"); var showDuplicateWin = gPref.getBoolPref("extensions.tabmix.duplicateWinContent"); var showDetachTab = gPref.getBoolPref("extensions.tabmix.detachTabContent"); var showLinkWithHist = gPref.getBoolPref("extensions.tabmix.linkWithHistory"); var showMerge = gPref.getBoolPref("extensions.tabmix.mergeWindowContent"); var showOpenHere = gPref.getBoolPref("extensions.tabmix.openLinkHere"); var showInverseLink = gPref.getBoolPref("extensions.tabmix.openInverseLink"); var showAutoReload = gPref.getBoolPref("extensions.tabmix.autoReloadContent"); var bgPref = gPref.getBoolPref("browser.tabs.loadInBackground"); var isOneWindow = numberOfWindows() == 1; } catch(e){} var tabsListMenu = document.getElementById("tm-tabsList"); var closeTabMenu = document.getElementById("tm-content-closetab"); var freezeTabMenu = document.getElementById("tm-content-freezeTab"); var lockTabMenu = document.getElementById("tm-content-lockTab"); var protectTabMenu = document.getElementById("tm-content-protectTab"); var undoCloseTabMenu = document.getElementById("tm-content-undoCloseTab"); var undoCloseListMenu = document.getElementById("tm-content-undoCloseList"); var undoCloseSep = document.getElementById("tm-content-undoCloseSep"); var duplicateTabMenu = document.getElementById("tm-duplicateTabContext"); var duplicateWinMenu = document.getElementById("tm-duplicateinWinContext"); var detachTabMenu = document.getElementById("tm-detachTabContext"); var linkWithHist = document.getElementById("tm-linkWithhistory"); var mergeMenu = document.getElementById("tm-mergeWindows"); var miscSep = document.getElementById("tm-content-miscSep"); var textSep = document.getElementById("tm-content-textSep"); var openHere = document.getElementById("tm-openlinkhere"); var inverseLink = document.getElementById("tm-openinverselink"); var autoReload = document.getElementById("tm-autoreload_menu"); var contentClick = gContextMenu.onTextInput || gContextMenu.onLink || gContextMenu.onImage; var intabmode = (gBrowser.localName == 'tabbrowser' && gBrowser.mTabs.length > 1); var focusType = bgPref ? "fg":"bg"; var closeTabsEmpty = gBrowser.closedTabs.length < 1; var protectedTab = gBrowser.mCurrentTab.hasAttribute("protected"); var lockedTab = gBrowser.mCurrentTab.hasAttribute("locked"); openHere.hidden = !gContextMenu.onLink || !showOpenHere; inverseLink.hidden = !gContextMenu.onLink || !showInverseLink; if (!inverseLink.hidden){ inverseLink.setAttribute("label", inverseLink.getAttribute(focusType+"label")); inverseLink.setAttribute("accesskey", inverseLink.getAttribute(focusType+"accesskey")); } linkWithHist.hidden = !gContextMenu.onLink || !showLinkWithHist; closeTabMenu.hidden = !showCloseTab || !intabmode && autohide || !intabmode && keeptab || contentClick; closeTabMenu.setAttribute("disabled", protectedTab); freezeTabMenu.hidden = !showFreezeTab || contentClick; lockTabMenu.hidden = !showLockTab || contentClick; lockTabMenu.setAttribute("checked", lockedTab); protectTabMenu.hidden = !showProtectTab || contentClick; protectTabMenu.setAttribute("checked", protectedTab); duplicateTabMenu.hidden = !showDuplicateTab || contentClick; detachTabMenu.hidden = !showDetachTab || contentClick || gSingleWindowMode; duplicateWinMenu.hidden = !showDuplicateWin || contentClick || gSingleWindowMode; freezeTabMenu.setAttribute("checked", protectedTab && lockedTab); tabsListMenu.hidden = !showTabsList || contentClick; undoCloseTabMenu.hidden = closeTabsEmpty || !showUndoCloseTab || !undoClose || contentClick; undoCloseListMenu.hidden = closeTabsEmpty || !showUndoCloseList || !undoClose || contentClick; undoCloseSep.hidden = undoCloseTabMenu.hidden && undoCloseListMenu.hidden || gContextMenu.isTextSelected && closeTabMenu.hidden && lockTabMenu.hidden && protectTabMenu.hidden && tabsListMenu.hidden && freezeTabMenu.hidden; mergeMenu.hidden = !showMerge || isOneWindow || contentClick; miscSep.hidden = mergeMenu.hidden && closeTabMenu.hidden && duplicateTabMenu.hidden && duplicateWinMenu.hidden && lockTabMenu.hidden && protectTabMenu.hidden && tabsListMenu.hidden && freezeTabMenu.hidden || gContextMenu.isTextSelected; textSep.hidden = !gContextMenu.isTextSelected || mergeMenu.hidden && duplicateTabMenu.hidden && duplicateWinMenu.hidden && closeTabMenu.hidden && lockTabMenu.hidden && protectTabMenu.hidden && tabsListMenu.hidden && freezeTabMenu.hidden && undoCloseTabMenu.hidden && undoCloseListMenu.hidden; autoReload.hidden = !showAutoReload || contentClick || gContextMenu.isTextSelected; var hideOpenAllLinks = gPref.getBoolPref("extensions.tabmix.openAllLinks") ? openMultipleLinks(true) : true; document.getElementById("tm-openAllLinks").hidden = hideOpenAllLinks; onAutoReloadPopup(true); } function onAutoReloadPopup(currentTab, aTab) { var tab = currentTab ? gBrowser.mCurrentTab : aTab; var id = currentTab ? "tm-autoreload" : "tm-autoreloadTab"; var element = ["1", "2", "3", "4", "5", "6", "7", "8"]; var time = [5, 15, 30, 60, 2*60, 5*60, 15*60, 30*60]; if (tab.autoReloadEnabled == null) gBrowser.setupAutoReload(tab); document.getElementById(id+"_enable").setAttribute("checked", tab.autoReloadEnabled); for(var i=0; i 0) { var range = nsISelectionObject.getRangeAt(0); var treeWalker = window._content.document.createTreeWalker( range.cloneContents(), NodeFilter.SHOW_ELEMENT, myNodeFilter, true); var nextEpisode = treeWalker.nextNode(); var newTab, firstTab, firstUrl; while(nextEpisode != null) { if (nextEpisode.nodeName == "li") nextEpisode = nextEpisode.firstChild; // if(nextEpisode.href && nextEpisode.href.indexOf('http') == 0) { if(nextEpisode.href) { // might change it to only accept certain protocols like it used to if (check) return false; newTab = gBrowser.addTab(nextEpisode.href); if (!firstTab) { firstTab = newTab; firstUrl = nextEpisode.href; gBrowser.TMP_selectNewForegroundTab(firstTab, null, firstUrl); } } nextEpisode = treeWalker.nextNode(); } } return true; } // Replace Tab Bar updateContextTab function to catch mouse down on tabs // function TMupdateContextTab (e) { var aTab = e.originalTarget; while ( aTab.localName != "tabs" ) { if ( aTab.localName == "tab" ) break; aTab = aTab.parentNode; } this.mContextTab = aTab; if ( aTab.localName == "tabs" ) this.mContextTab = document.popupNode; } function checkForCtrlClick (event) { if (event.button == 0 && (event.ctrlKey || event.metaKey)) { gBrowser.undoRemoveTab(); if (gBrowser.closedTabs.length > 0) event.target.setAttribute("afterctrlclick", true); } } function isAfterCtrlClick(popup) { if (popup.id == "btn_undoclose_menu") popup = popup.parentNode; if (popup.getAttribute("afterctrlclick")) { popup.removeAttribute("afterctrlclick"); if (popup.hasAttribute("open")) popup.removeAttribute("open"); return true; } return false; } function createUndoCloseList (popup) { if (isAfterCtrlClick(popup)) return false; beforeCommonList(popup); // Grab the list of closed tabs var ctabs = gBrowser.closedTabs; var mi, count; for(var i = ctabs.length - 1; i >= 0; i--) { var tab = ctabs[i]; var tabSH = tab[1]; // Grab the session history for the tab // Grab the title and uri (make the uri friendly text) var title = tab[2]; var uri, _uri = tabSH.getEntryAtIndex(tabSH.index, false).URI; if ( _uri.scheme == "about" && title == "" ) uri = title = "about:blank"; else try { uri = _uri.scheme + ":\/\/" + _uri.hostPort + _uri.path; } catch (e) { uri = title; } var label = title ? title : uri; // Insert a menu item for each closed tab in the cache mi = document.createElement("menuitem"); mi.setAttribute("class", "menuitem-iconic bookmark-item"); mi.setAttribute("statustext", uri) mi.setAttribute("tooltiptext", label); count = (ctabs.length - i) + (ctabs.length - i<10 ? " : " : ": "); mi.setAttribute("label", count + label); if (!uri.match(/^https/)) mi.setAttribute("image", tab[3]); mi.setAttribute("accesskey", "" + (ctabs.length - i)); mi.closeTabIndex = i; popup.appendChild(mi); } var stringBundle = document.getElementById("tmp-string-bundle"); mi = document.createElement("menuseparator"); popup.appendChild(mi); mi = document.createElement("menuitem"); mi.setAttribute("label", stringBundle.getString("undoclosetab.clear.label")); mi.setAttribute("accesskey", stringBundle.getString("undoclosetab.clear.accesskey")); mi.closeTabIndex = -1; popup.appendChild(mi); mi = document.createElement("menuitem"); mi.setAttribute("label", stringBundle.getString("restoreall.label")); mi.setAttribute("accesskey", stringBundle.getString("restoreall.accesskey")); mi.closeTabIndex = -2; popup.appendChild(mi); return true; } function removeCloseTab (event, popup) { if (!tabxPrefs.getBoolPref("middleclickDelete")) return; var index = event.originalTarget.closeTabIndex if (event.button == 1 && index > -1 ){ getClosedTab('delete', index); if (gBrowser.closedTabs.length > 0) createUndoCloseList(popup); else { popup.hidePopup(); if (popup.parentNode.id != "btn_undoclose") popup.parentNode.parentNode.hidePopup(); } } } // sometimes context popup stay "open", we hide it manually. function TM_hidePopup () { var node = document.popupNode; while (node && node.localName != "menubar" && node.localName != "toolbar") { if (node.localName == "menupopup" || node.localName == "popup") { if (node.hasAttribute("open")) node.removeAttribute("open"); node.hidePopup(); } node = node.parentNode; } } // return the indexd tab from the list and remove the tab from the list function getClosedTab(where, index) { var ctabs = gBrowser.closedTabs; var aTab = null; var updateRDF = SessionManager.enableBackup && SessionPref.getBoolPref("save.closedtabs"); if(index >= 0) { TMP_SessionStore.removeClosedTab(ctabs.length - 1 - index); aTab = ctabs.splice(index, 1)[0]; var ord=-1; switch (where) { // xxx need more work on this. when tab added and removed case "current": ord = gBrowser.mCurrentTab._tPos; break; case "tab": if (gPref.getBoolPref("extensions.tabmix.openTabNext")) ord = gBrowser.mCurrentTab._tPos+1; else ord = gBrowser.mTabs.length; break; case "original": ord = aTab[0]; break; default: } // don't change position on delete if (ord > -1 && where != "delete") { for (var i = index; i < ctabs.length; i++){ if (ctabs[i][0] >= ord) ctabs[i][0]++; } if (updateRDF) SessionManager.fixClosedtabTabPos(ord); } } else { if (index == -2) gBrowser.delayUndoRemoveAllTab(); else if (index == -1) { while(ctabs.length > 0) ctabs.pop(); TMP_SessionStore.removeClosedTab(); if (updateRDF) SessionManager.deleteWinClosedtabs(gSessionPath[0] + "/" + gBrowser.windowID); } } if(ctabs.length < 1){ if (document.getElementById("btn_undoclose")) document.getElementById("btn_undoclose").setAttribute("disabled","true"); } if (aTab != null && updateRDF) SessionManager.deleteClosedtabAt(index+1); return aTab; } function _restoreTab(where, index) { // call restoreTab after delay to let the popup menu time to hide window.setTimeout( function () { delayRestoreTab(where, index); }, 0 ); } // restore the tab function delayRestoreTab(where, index) { var ord, aTab = getClosedTab(where, index); if (!aTab) return; switch (where) { case "current": var cTab = gBrowser.mCurrentTab; ord = cTab._tPos; cTab.collapsed = true; var restoredTab = gBrowser.restoreTab(ord, aTab[1], aTab[4], aTab[5]); if (restoredTab != cTab) gBrowser.removeTab(cTab); else cTab.collapsed = false; break; case "window": var newWindow = window.openDialog( getBrowserURL(), "_blank", "chrome,all,dialog=no"); newWindow.duplicat = true; newWindow.duplicatData = { scroll: aTab[5], oldHistory: aTab[1], prop: aTab[4] } break; case "tab": if (gPref.getBoolPref("extensions.tabmix.openTabNext")) ord = gBrowser.mCurrentTab._tPos+1; else ord = gBrowser.mTabs.length; gBrowser.restoreTab(ord, aTab[1], aTab[4], aTab[5]); break; case "original": gBrowser.restoreTab(aTab[0], aTab[1], aTab[4], aTab[5]); } } function NW_waitForSessionHistory(event) { //try to set zoom factor befor we load content setTextZoom(getBrowser().selectedBrowser, window.duplicatData.scroll.split(",")[2]) waitForSessionHistory(20); } // wait For sessionHistory in new window function waitForSessionHistory(attempts) { var webNav = gBrowser.webNavigation; try{ webNav.sessionHistory; } // Test if sessionHistory exists yet catch (err) { // webNav.sessionHistory is not yet available, try again later if (attempts) window.setTimeout('waitForSessionHistory(' + --attempts + ')', 50); return; } if ((webNav.sessionHistory == null) && attempts){ window.setTimeout('waitForSessionHistory(' + --attempts + ')', 50); return; } gBrowser.restoreTab(gBrowser.selectedTab._tPos, window.duplicatData.oldHistory, window.duplicatData.prop, window.duplicatData.scroll); delete window.duplicatData; if (window.opener && window.opener.needToClose) setTimeout(function() {window.opener.close();}, 0); } function closeTabAddBookmarks(currentIndex) { var tab = gBrowser.closedTabs[currentIndex]; var tabSH = tab[1]; // history var _URI = tabSH.getEntryAtIndex(tabSH.index, false).URI; if (gIsPlaces) PlacesController.showAddBookmarkUI(_URI); else { var url = _URI.spec; var title = tab[2]; // title if ( gPref.getBoolPref("extensions.tabmix.titlefrombookmark") ) { var bookMarkName = getTitleFromBookmark(url); if (bookMarkName) title = bookMarkName; } BookmarksUtils.addBookmark(url, title, undefined); } } function closeTabcopyTabUrl(currentIndex) { var tab = gBrowser.closedTabs[currentIndex]; var tabSH = tab[1]; // history var URL = tabSH.getEntryAtIndex(tabSH.index, false).URI.spec; var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"] .getService(Components.interfaces.nsIClipboardHelper); clipboard.copyString(URL); } function removeTabFromList (event, popup, aType) { if (!tabxPrefs.getBoolPref("middleclickDelete")) return; if (event.target.id == "btn_tabslistSorted") return; if (event.button == 1) { var aTab = event.originalTarget.tab; if (popup.parentNode.id == "tm-tabsList" && (gBrowser.mCurrentTab == aTab || gBrowser.isBlankTab(gBrowser.mCurrentTab))) { popup.hidePopup(); gBrowser.removeTab(aTab); return; } gBrowser.removeTab(aTab); if (gBrowser.mTabs.length > 0) { createTabsList(popup, aType); var item = popup.parentNode.parentNode; if (item.parentNode.id == "btn_tabslist") createTabsList(item, aType); } else popup.hidePopup(); } } // called from tabmix.xml tabs scroll buttons function _createTabsList (event, side) { event.stopPropagation(); var tablist = document.getElementById("tabslist"); beforeCommonList(tablist); createCommonList(tablist, 2, side); if (tablist.hasChildNodes()) tablist.showPopup(event.target, -1, -1, "popup", "bottomleft","topleft"); } // show sort/unsort tabs list popup after click on sorted tab menu function showTabsListPopup (event) { event.stopPropagation(); setTimeout( function (popup){ popup.showPopup(popup.parentNode, -1, -1, "popup", "bottomleft", "topleft"); }, 0, event.target.parentNode); } function createTabsList (popup, aType) { // the context menu isn't visible if the strip is collapsed // uncollapsed the stip and collapsed the tabbar instead if (popup.id == "btn_tabslist_menu" && gBrowser.mStrip.collapsed) { var visibility = gBrowser.mTabContainer.collapsed; popup.setAttribute("tabBar_collapsed", visibility); if (!visibility) gBrowser.mTabContainer.collapsed = true; gBrowser.mStrip.collapsed = false; } var tabContextMenu = gBrowser.mStrip.firstChild.nextSibling; if (popup.hasAttribute("contextmenu") && popup.getAttribute("contextmenu") != tabContextMenu.id) popup.setAttribute("contextmenu", tabContextMenu.id); if (gPref.getBoolPref("extensions.tabmix.enableScrollSwitch")) popup.addEventListener("DOMMouseScroll", TMP_tabsListScroll, true); beforeCommonList(popup); createCommonList(popup, aType); } function beforeCommonList(popup) { var item = popup.parentNode; if (item.id == "btn_tabslist" || item.id == "btn_undoclose") item.removeAttribute("tooltiptext"); // clear out the menu popup if we show the popup after middle click while (popup.hasChildNodes()) { var menuItem = popup.firstChild; if (menuItem.id.indexOf("btn_tabslist") != -1) break; popup.removeChild(menuItem); } popup.addEventListener("DOMMenuItemActive", updateMenuItemActive, false); popup.addEventListener("DOMMenuItemInactive", updateMenuItemInactive, false); } function createCommonList (popup, aType, side) { var tabs = new Array(gBrowser.mTabs.length); var i; switch(aType) { case 1: for (i = 0; i < gBrowser.mTabs.length; i++) tabs[i] = new tabSorting(gBrowser.mTabs[i], i); tabs = tabs.sort(); for (i = 0; i < tabs.length; i++) createMenuItems(popup, tabs[i].Tab, tabs[i].Index, aType); break; case 2: for (i = 0; i < gBrowser.mTabs.length; i++) { if (side && side == "left" && !gBrowser.mTabs[i].collapsed) continue; else if (side && side == "right" && (gBrowser.mTabs[i].collapsed || gBrowser.mTabContainer.isTabVisible(gBrowser.mTabs[i]._tPos))) continue; createMenuItems(popup, gBrowser.mTabs[i], i, aType); } break; case 3: for (i = TMP_LastTab.TabHistory.length - 1; i >= 0; i--) createMenuItems(popup, TMP_LastTab.TabHistory[i], i, aType); break; } } function createMenuItems(popup, tab, value, aType) { var count, mi = document.createElement("menuitem"); mi.setAttribute("class", "menuitem-iconic bookmark-item alltabs-item"); mi.setAttribute("statustext", gBrowser.getBrowserForTab(tab).currentURI.spec); mi.setAttribute("tooltiptext", tab.label); count = aType != 3 ? (value + 1) + (value < 9 ? " : " : ": ") : ""; mi.setAttribute("count", count); mi.setAttribute("label", count + tab.label); mi.setAttribute("crop", tab.getAttribute("crop")); mi.setAttribute("image", tab.getAttribute("image")); if (tab.hasAttribute("busy")) mi.setAttribute("busy", tab.getAttribute("busy")); if (tab.selected) mi.setAttribute("selected", "true"); mi.value = value; tab.mCorrespondingMenuitem = mi; tab.addEventListener("DOMAttrModified", TMP_tabOnAttrModified, false); tab.addEventListener("TabClose", TMP_tabOnTabClose, false); mi.tab = tab; if (popup.id == "btn_tabslist_menu") popup.insertBefore(mi, document.getElementById("btn_tabslist_sep")); else popup.appendChild(mi); } function TMP_tabsListScroll(aEvent) { TMtabBarScroll(aEvent); } function TMP_tabOnAttrModified(aEvent) { var menuItem = aEvent.target.mCorrespondingMenuitem; if (menuItem) { var attrName = aEvent.attrName; var count = ""; switch (attrName) { case "label": count = menuItem.getAttribute("count"); case "crop": case "busy": case "image": case "selected": if (aEvent.attrChange == aEvent.REMOVAL) menuItem.removeAttribute(attrName); else menuItem.setAttribute(attrName, count + aEvent.newValue); } } } function TMP_tabOnTabClose(aEvent) { var menuItem = aEvent.target.mCorrespondingMenuitem; if (menuItem) menuItem.parentNode.removeChild(menuItem); } function TMP_TabsListOncommand(event) { gBrowser.selectedTab = event.originalTarget.tab; gBrowser.mTabContainer.ensureTabIsVisible(gBrowser.selectedTab._tPos); } var gBackupLabel = ""; function hideCommonList(popup) { // restore the strip collapsed status if (popup.id == "btn_tabslist_menu" && popup.hasAttribute("tabBar_collapsed")) { gBrowser.mStrip.collapsed = true; var visibility = gBrowser.mTabContainer.collapsed; if (popup.getAttribute("tabBar_collapsed") == "false") gBrowser.mTabContainer.collapsed = false; popup.removeAttribute("tabBar_collapsed"); } // clear out the menu popup and remove the listeners while (popup.hasChildNodes()) { var menuItem = popup.firstChild; if (menuItem.id.indexOf("btn_tabslist") != -1) break; if ("tab" in menuItem) { menuItem.tab.removeEventListener("DOMAttrModified", TMP_tabOnAttrModified, false); menuItem.tab.removeEventListener("TabClose", TMP_tabOnTabClose, false); menuItem.tab.mCorrespondingMenuitem = null; } popup.removeChild(menuItem); } var item = popup.parentNode; if (item.id == "btn_tabslist" || item.id == "btn_undoclose") item.setAttribute('tooltiptext', item.getAttribute('_tooltiptext')); popup.removeEventListener("DOMMenuItemActive", updateMenuItemActive, false); popup.removeEventListener("DOMMenuItemInactive", updateMenuItemInactive, false); popup.removeEventListener("DOMMouseScroll", TMP_tabsListScroll, true); gBackupLabel = ""; } function updateMenuItemActive(event, tab) { var statusTextFld = document.getElementById("statusbar-display"); if (gBackupLabel=="") gBackupLabel = statusTextFld.label; if (!tab) tab = event.target; updateStatusText(tab.getAttribute("statustext")); } function updateMenuItemInactive(event) { updateStatusText(""); } function updateStatusText(itemText) { var statusTextFld = document.getElementById("statusbar-display"); var newText = itemText ? itemText : gBackupLabel; if (newText != statusTextFld.label) statusTextFld.label = newText; } function tabSorting(tab, index) { this.Tab = tab; this.Index = index; } tabSorting.prototype.toString = function() { return this.Tab.label.toLowerCase(); } PK 6content/tabmixplus/bookmarks/PK ~6q)content/tabmixplus/bookmarks/bookmarks.jsvar Click2TabLoadBookmark = { init : function () { TMP_Bookmark.init(); eval("BookmarksMenu.loadBookmark = " + BookmarksMenu.loadBookmark.toString().replace( 'var browserTarget = whereToOpenLink(aEvent);', 'var browserTarget = whereToOpenLinkTabmix(aEvent, prefStringTMBookmark, selection, aDS);' )); } } // this code is call from browser window and from bookmark manager var TMP_Bookmark = { init : function () { BookmarksCommand.openGroupBookmark = this.TMP_openGroupBookmark; eval("BookmarksCommand.createContextMenu ="+BookmarksCommand.createContextMenu.toString().replace( 'popup.firstChild.setAttribute("default", "true");', '$& \ TMP_Bookmark.buildContextMenu(popup)' )); }, buildContextMenu : function (popup) { var _open = popup.getElementsByAttribute("command", "cmd_bm_open")[0]; var _openInWindow = popup.getElementsByAttribute("command", "cmd_bm_openinnewwindow")[0]; var _openInTab = popup.getElementsByAttribute("command", "cmd_bm_openinnewtab")[0]; TMP_updateContextMenu(_open, _openInWindow, _openInTab, prefStringTMBookmark); }, TMP_openGroupBookmark: function (aURI, aTargetBrowser) { var resource = RDF.GetResource(aURI); var urlArc = RDF.GetResource(NC_NS_TM+"URL"); // gNC_NS isn't for 1.0.7 RDFC.Init(BMDS, resource); var containerChildren = RDFC.GetElements(); var res, target, bmGroup = []; while (containerChildren.hasMoreElements()) { res = containerChildren.getNext().QueryInterface(kRDFRSCIID); target = BMDS.GetTarget(res, urlArc, true); if (target) bmGroup.push(target.QueryInterface(kRDFLITIID).Value); } // If the bookmark group was completely invalid, just bail. if (bmGroup.length != 0) { if ("_confirmOpenTabs" in this && !this._confirmOpenTabs(bmGroup.length)) return; TMP_Bookmark.openGroup(bmGroup, aTargetBrowser, true) } }, // fixed: reuse all blank tab not just in the end // fixed: if "browser.tabs.loadFolderAndReplace" is true don't reuse locked and protected tabs open bookmark after those tabs // fixed: focus the first tab if "extensions.tabmix.openTabNext" is true // fixed: remove "selected" and "flst_id" from reuse tab openGroup: function (bmGroup, aTargetBrowser, isFolder) { var w = getTopWin(); if (!w) // no browser window is open, we have to open the group into a new window aTargetBrowser = "window"; if (aTargetBrowser == "current" || aTargetBrowser == "tab" || aTargetBrowser == "tabshifted") { var browser = w.document.getElementById("content"); var tabs = browser.mTabContainer.childNodes; var _PREF = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); var doReplace = isFolder && _PREF.getBoolPref("browser.tabs.loadFolderAndReplace"); var loadInBackground = _PREF.getBoolPref("browser.tabs.loadBookmarksInBackground"); var openTabNext = _PREF.getBoolPref("extensions.tabmix.openTabNext"); // catch tab for reuse var aTab, reuseTabs = [], removeTabs = [], i; var tabIsBlank, canReplace; for (i = 0; i < tabs.length ; i++) { aTab = tabs[i]; tabIsBlank = browser.isBlankNotBusyTab(aTab); canReplace = (doReplace && !aTab.hasAttribute("locked")) || tabIsBlank; if (reuseTabs.length < bmGroup.length && canReplace) reuseTabs.push(aTab); else if ((doReplace && !aTab.hasAttribute("locked") && !aTab.hasAttribute("protected")) || tabIsBlank) removeTabs.push(aTab); } var tabToSelect = null; var prevTab = (!doReplace && openTabNext && browser.mCurrentTab._tPos < tabs.length - 1) ? browser.mCurrentTab : browser.mTabContainer.lastChild; var tabPos, index; for (i = 0; i < bmGroup.length ; i++) { try { // bug 300911 if (i < reuseTabs.length) { aTab = reuseTabs[i]; browser.getBrowserForTab(aTab).loadURI(bmGroup[i]); // reset selected & flst_id attribute if (aTab != browser.mCurrentTab) { aTab.removeAttribute("selected"); aTab.removeAttribute("flst_id"); } else aTab.setAttribute("reloadcurrent", true); } else aTab = browser.addTab(bmGroup[i]); } catch (er) { } if (!tabToSelect) tabToSelect = aTab; // move tab to place index = prevTab._tPos + 1; tabPos = aTab._tPos < index ? index - 1 : index; browser.TMmoveTabTo(aTab, tabPos); prevTab = aTab; } browser.mTabContainer.nextTab = 1; // focus the first tab if prefs say to if (!loadInBackground || doReplace) { // Select the first tab in the group. // Set newly selected tab after quick timeout, otherwise hideous focus problems // can occur because new presshell is not ready to handle events function selectNewForegroundTab(browser, tab) { var old = browser.selectedTab; browser.selectedTab = tab; var reloadCurrent = old.hasAttribute("reloadcurrent"); if (reloadCurrent) old.removeAttribute("reloadcurrent"); if (reloadCurrent && old != tab) { old.removeAttribute("selected"); old.removeAttribute("flst_id"); } } setTimeout(selectNewForegroundTab, 0, browser, tabToSelect); } // Close any remaining open tabs or blank tabs that are left over. while (removeTabs.length > 0) { browser.removeTab(removeTabs.pop()); } // and focus the content w.content.focus(); } else if (aTargetBrowser == "window") openDialog(getBrowserURL(), "_blank", "chrome,all,dialog=no", bmGroup.join("|")); }, _getBookmarkTitle: function (url) { if(! BMSVC || ! BMDS || ! RDF) return null; var urlArc = RDF.GetResource(NC_NS_TM+"URL"); var urlLiteral = RDF.GetLiteral(url); if (BMDS.hasArcIn(urlLiteral, urlArc)) { var bmResources, bmResource, title, type, ptype; bmResources = BMSVC.GetSources(urlArc, urlLiteral, true); while (bmResources.hasMoreElements()) { bmResource = bmResources.getNext(); type = BookmarksUtils.resolveType(bmResource); if (type != "ImmutableBookmark") { ptype = BookmarksUtils.resolveType(BMSVC.getParent(bmResource)); if ( (type == "Bookmark" || type == "IEFavorite") && ptype != "Livemark") { title = BookmarksUtils.getProperty(bmResource, NC_NS_TM+"Name"); if (title != "") return title; } } } } return null; } } PK T6/5-*content/tabmixplus/bookmarks/bookmarks.xul PK T6mxx1content/tabmixplus/bookmarks/bookmarksManager.xul PK 1T6[U//.content/tabmixplus/bookmarks/bookmarksPanel.jsvar BookmarksTreeClick2Tab = { bookmarksView : null, init : function () { window.removeEventListener('load', function () { BookmarksTreeClick2Tab.init(); }, false); if (typeof(PlacesController) == "function") { TMP_Places.init(); return; } TMP_Bookmark.init(); this.bookmarksView = document.getElementById("bookmarks-view"); eval("this.bookmarksView.openItemClick = " + this.bookmarksView.openItemClick.toString().replace( 'var browserTarget = whereToOpenLink(aEvent);', 'var browserTarget = whereToOpenLinkTabmix(aEvent, prefStringTMBookmark, selection, this.db);' )); eval("this.bookmarksView.openItemKey = " + this.bookmarksView.openItemKey.toString().replace( 'BookmarksCommand.openBookmark(this._selection, "current", this.db)', '{var browserTarget = whereToOpenLinkTabmix(null, prefStringTMBookmark, this._selection, this.db); BookmarksCommand.openBookmark(this._selection, browserTarget, this.db);}' )); } } PK 6content/tabmixplus/extensions/PK 6O%content/tabmixplus/extensions/sage.js// prevent Sage from load pages in locked tabs // code by onemen const OPEN_TAB_FOR_SAGE = "extensions.tabmix.opentabfor.sage"; var TMP_Sage = { init: function () { eval("updateItemContextMenu ="+updateItemContextMenu.toString().replace( 'readStateController.onCommandUpdate();', '$& TMP_Sage.buildContextMenu();' )); eval("bookmarksTreeClick ="+bookmarksTreeClick.toString().replace( 'const BOOKMARK_SEPARATOR', 'var where = TMP_Places.fixWhereToOpen(aEvent, CreateHTML._tabbed ? "tab" : "current", TMP_Sage.openTabPref); \ CreateHTML.tabbed = where == "tab"; \ $&' )); eval("bookmarksOpen ="+bookmarksOpen.toString().replace( 'getContentBrowser().loadURI(lastResource.url);', 'if (CreateHTML._tabbed) getContentBrowser().addTab(lastResource.url); \ else $&' )); eval("openURI ="+openURI.toString().replace( 'switch (windowType)', 'windowType = TMP_Places.fixWhereToOpen((oType instanceof Event)? oType : null, !windowType ? "current" : windowType, TMP_Sage.openTabPref); \ $&' )); if (typeof(PlacesController) != "function") TMP_Bookmark.init(); window.removeEventListener('load', function () { TMP_Sage.init(); }, false); }, buildContextMenu: function () { var _open = document.getElementById("rssOpenItem"); var _openInWindow = document.getElementById("rssOpenNewWindowItem"); var _openInTab = document.getElementById("rssOpenNewTabItem"); TMP_updateContextMenu(_open, _openInWindow, _openInTab, this.openTabPref); }, get openTabPref() { var prefSVC = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); if (prefSVC.prefHasUserValue(OPEN_TAB_FOR_SAGE)) return OPEN_TAB_FOR_SAGE; else return prefStringTMBookmark; } }PK p6@y&content/tabmixplus/extensions/sage.xul PK td6 ||(content/tabmixplus/extensions/wizzrss.js// code by onemen // Look for RSS/Atom News Reader function TMP_LookForRSS() { if ("gotoLink" in window) TMP_wizzrss.init(); if ("openNewsfox" in window) TMP_Newsfox.init(); } // prevent Wizz RSS from load pages in locked tabs var TMP_wizzrss = { init : function () { var codeToReplace = /getContentBrowser\(\).loadURI|contentBrowser.loadURI/; const newCode = "TMP_wizzrss.openURI"; var _functions = ["addFeedbase","validate","gohome","tryagain","promptStuff","promptStuff", "doSearch","viewLog","renderItem","playEnc","renderAllEnc","playAllEnc", "gotoLink","gotoLink","itemLinkClick","itemLinkClick","itemListClick"]; _functions.forEach( function(_function) { if (_function in window) eval("window." + _function + " ="+ window[_function].toString() .replace(codeToReplace,newCode)); } ); }, openURI : function (uri) { var w = Components.classes['@mozilla.org/appshell/window-mediator;1'] .getService(Components.interfaces.nsIWindowMediator) .getMostRecentWindow("navigator:browser"); var tabBrowser = w.getBrowser(); var openNewTab = w.TMP_whereToOpen(true).lock; if (openNewTab) { var newTab = tabBrowser.addTab(uri); var theBGPref = !readPref("WizzRSSFocusTab", false, 2); tabBrowser.TMP_selectNewForegroundTab(newTab, theBGPref); } else tabBrowser.loadURI(uri); } } // prevent Newsfox from load pages in locked tabs var TMP_Newsfox = { init : function () { eval("openNewsfox ="+openNewsfox.toString().replace( 'if (newTab) {', 'newTab = newTab || TMP_whereToOpen(null).lock; \ $&' )); } }PK d6PΎ)content/tabmixplus/extensions/wizzrss.xul PK 6skin/PK 6 skin/classic/PK 6skin/classic/tabmixplus/PK WY4b!skin/classic/tabmixplus/arrow.pngPNG  IHDR Ӻ& PLTEtRNS@f$IDATx^ǹ 8@<-W*ha.=; } 3tIENDB`PK 4::&skin/classic/tabmixplus/chevron-dn.gifGIF89a3Zchevron.gifًww@Tw.w2|$H @|8|2|||@8H|(Q|xm|P0 (?x(dE |x$DA|X|d|0Q|m| 8H^|p|m|b|||p|P8 (|x|p|| жtt|p|m|[|g|w@D|p|g|\WCw$ bj bjoEsT3Zgif*w 4|||| |wDDI HDsD!,@@  &D(A ;PK q2{Z633'skin/classic/tabmixplus/chevron-rtl.gifGIF89a!, Lj;PK 4ڭ99&skin/classic/tabmixplus/chevron-up.gifGIF89a3Zchevron.gifًww@Tw.w2|$H @|8|2|||@8H|(Q|xm|P0 (?x(dE |x$DA|X|d|0Q|m| 8H^|p|m|b|||p|P8 (|x|p|| жtt|p|m|[|g|w@D|p|g|\WCw$ bj bjoEsT3Zgif*w 4|||| |wDDI HDsD!,@ P (L0a;PK 0fV33#skin/classic/tabmixplus/chevron.gifGIF89a!, yꠒ;PK X3-$skin/classic/tabmixplus/contents.rdf
  • chrome://tabmixplus/skin/tab.css
  • PK WY4ڔ%skin/classic/tabmixplus/drag-left.pngPNG  IHDR !0GtRNS<IIDATx^m!0 CQRDV?KH -#54jzFOҘ3T=k-J?A!Cx3'IENDB`PK WY4)V &skin/classic/tabmixplus/drag-right.pngPNG  IHDR !0GtRNS<8IDATx^mA A4izZ$)WKԓ>j**9E05tIENDB`PK WY4c0skin/classic/tabmixplus/dropmarker-leftright.pngPNG  IHDR 䅪tRNS<mIDATx^ @ D66hK`$C ib%s,g|c.(];Pv6̛uaǠ{PbiKt(8JG_}HIENDB`PK 5a`s s 0skin/classic/tabmixplus/firefox2defaulttheme.css/* For TabX feature and multi row tabs on new default theme on FF 2.0 */ /****** if we put the new alltabs button on tabbar then all we have to fix is multi row tabs we include here fix only for default theme. ******/ .tabbrowser-tabs[firefox2] > .tabbrowser-tab .tab-close-button { background: transparent !important; } /* ..... For all tabs button ..... */ .tabbrowser-tabs:not([firefox2]) .tabs-alltabs-stack, .tabbrowser-tabs[firefox2][hideAllTabsButton=true] .tabs-alltabs-stack { display: none; } #alltabs-place-holder { width: 0px !important; } /* * for tabs close button for Win XP theme in firefox 2.0+ */ .tabbrowser-tabs[flowing=multibar][multibar][firefox2DefaultTheme] > .tabbrowser-tab { height: 25px !important; } .tabbrowser-tabs[flowing=multibar][multibar][firefox2DefaultTheme] #scroll-tabs-frame { margin-top: 2px !important; margin-bottom: 2px !important; } .tabbrowser-tabs[firefox2DefaultTheme] > .tabbrowser-tab .always-left, .tabbrowser-tabs[firefox2DefaultTheme] > .tabbrowser-tab .always-right { margin: 2px 0px !important; } .tabbrowser-tabs[firefox2DefaultTheme] > .tabbrowser-tab .showhover { margin: -4px 0 -3px 0 !important; } .tabbrowser-tabs[firefox2DefaultTheme] > .tabbrowser-tab[tabx=showhover][showbutton=on] .tab-progress, .tabbrowser-tabs[firefox2DefaultTheme] > .tabbrowser-tab[tabx=current_hover][showbutton=on]:not([selected="true"]) .tab-progress, .tabbrowser-tabs[firefox2DefaultTheme] > .tabbrowser-tab[tabx=showhover][showbutton=on] .tab-text, .tabbrowser-tabs[firefox2DefaultTheme] > .tabbrowser-tab[tabx=current_hover][showbutton=on]:not([selected="true"]) .tab-text { padding-top: 1px !important; } /* * for tabs close button for Mac theme in firefox 2.0+ */ .tabbrowser-tabs[firefox2MacDefaultTheme] > .tabbrowser-tab { margin: 0px !important; height: 23px !important; } .tabbrowser-tabs[firefox2MacDefaultTheme] #scroll-tabs-frame { margin-top: 2px !important; margin-bottom: 3px !important; } .tabbrowser-tabs[firefox2MacDefaultTheme] > .tabbrowser-tab .tab-close-button > .toolbarbutton-text { display: none; } .tabbrowser-tabs[firefox2MacDefaultTheme] > .tabbrowser-tab .tab-close-button:hover, .tabbrowser-tabs[firefox2MacDefaultTheme] > .tabbrowser-tab[tabx=always]:not([selected="true"]) .tab-close-button:hover { list-style-image: url("chrome://global/skin/icons/closetab-hover.png"); } .tabbrowser-tabs[firefox2MacDefaultTheme] > .tabbrowser-tab .tab-close-button:hover:active, .tabbrowser-tabs[firefox2MacDefaultTheme] > .tabbrowser-tab[tabx=always]:not([selected="true"]) .tab-close-button:hover:active { list-style-image: url("chrome://global/skin/icons/closetab-active.png"); } /* * Fix focus ring on tab */ .tabbrowser-tabs[firefox2="true"] > .tabbrowser-tab:focus .tab-middle { outline: none !important; } .tabbrowser-tabs[firefox2notMac] > .tabbrowser-tab .tab-middle .tab-text { border: 1px dotted transparent !important; } .tabbrowser-tabs[firefox2notMac] > .tabbrowser-tab:focus .tab-middle .tab-text { border: 1px dotted -moz-DialogText !important; } .tabbrowser-tabs[firefox2Mac] > .tabbrowser-tab .tab-middle .tab-text { border: 1.4pt solid transparent !important; } .tabbrowser-tabs[firefox2Mac] > .tabbrowser-tab:focus .tab-middle .tab-text { border: 1.4pt solid -moz-mac-focusring !important; } PK WY4U"skin/classic/tabmixplus/locked.pngPNG  IHDRaIDATx^AHaEї148 X 1ąLE4KS4ƈ(D$v@-Y̪{c@7A]Eu2b)%;D-/C2 7nz>z; o 7ljcƺw#d#gvB*Bmm-2 p,ΞIM8 ]Ő$ 7 ^Eg _(}MY2G18v5lEiI l~&ibOwz6֦} r ;\w@DO@bi(-hwS42v{ ;<::J::F2 Ik 8r$*z:2C&"Tr0MmPh ܚa,|]; i;WCDB`kY=>b9s8j?@.oxѺR %-߄\:CvFYNP8@W>>^ 0qDn^iE9L"#6ɛ&4Cv'#IENDB`PK 3nc5#v !skin/classic/tabmixplus/prefs.css#TM_ButtonBox { list-style-image: url(tmpoptions.png) !important; } #buttontabMixGeneralPrefs { -moz-image-region: rect(0px, 24px, 24px, 0px); } #buttontabMixEventsPrefs { -moz-image-region: rect(0px, 48px, 24px, 24px) } #buttontabMixAppearancePrefs { -moz-image-region: rect(0px, 72px, 24px, 48px) } #buttontabMixMousePrefs { -moz-image-region: rect(0px, 96px, 24px, 72px) } #buttontabMixMenuPrefs { -moz-image-region: rect(0px, 120px, 24px, 96px) } #buttontabMixSessionPrefs { list-style-image: url(sessionmanager.png) } #buttontabMixSessionPrefs { -moz-image-region: rect(0 24px 24px 0); } #buttontabMixSessionPrefs:hover { -moz-image-region: rect(24px 24px 48px 0); } .buttonBoxButton image { width: 24px !important; height: 24px !important; } tabpanels#tabpanId { -moz-appearance: none !important; margin: 0px !important; padding: 1px !important; border: none !important; /* background: transparent !important; background-image: none !important; */ } tabpanels#tabpanId tabbox { padding: 0px 1px !important; } #pref-tabmix { padding-top: 0px !important; padding-left: 0px !important; padding-right: 0px !important; margin: 0px !important; } #pref-tabmix #TMBox #TM_ButtonBox { margin-bottom: 1px !important; background: #EFEFEF !important; border: none !important; border-bottom: 1px solid ThreedShadow !important; } #pref-tabmix #TMBox #TM_ButtonBox button { -moz-appearance: none !important; max-width: 100% !important; min-width: 0px !important; height: auto !important; margin: 1px !important; border: none !important; background-color: transparent !important; background: none !important; padding: 3px 3px 1px 3px !important; color: #545454 !important; font-weight: bold !important; -moz-user-focus: none !important; } #pref-tabmix #TMBox #TM_ButtonBox button:hover { background-color: #E0E8F6 !important; border: none !important; } #pref-tabmix #TMBox #TM_ButtonBox button[checked="true"] { background-color: #C1D2EE !important; border: none !important; } #pref-tabmix #TMBox #TM_ButtonBox .button-box{ background: none !important; padding: 3px 3px 1px 3px !important; } /*lets fix some themes, mainly charamel 1.2 */ #pref-tabmix #TMBox #TM_ButtonBox button .button-endcap{ background: none !important; padding-right: 0px !important; height: auto !important; -moz-box-pack: start !important; -moz-box-align: stretch !important; } #pref-tabmix #TMBox #TM_ButtonBox button .button-body{ background: none !important; } #btn_undoclose { list-style-image: url(undoclosetab.png); -moz-image-region: rect(0 40px 16px 24px); } PK WY4bN%skin/classic/tabmixplus/protected.pngPNG  IHDRaIDATx^RMKP= FJq# TT越#PٹppQDE :eE*E]NIDKS.{y = |4=\" ;?8ܙs=Rrc,c" Agk $:6^+&,Go'-XWXBPqB<`uB7@n/7@@L4K (Fe)O7)nKPoh',_SA"zx,l ꅬh-! ? \B#^O)Y&B\ńh~.0蠚0:t% mft@ͿeO_"|IENDB`PK VY49L""*skin/classic/tabmixplus/sessionmanager.pngPNG  IHDR(H 7IDATx^ \Usg. #81s֜"s_6 Բ`eZଐ8s 'PAx_g{"b}l^{$Izlv۞@xbe'W|V'[ɗۖUK> Zs^^9EzԵ;x'{wm 6KhpK}=I%e#/d8 ^OX%Y>^ԩ}l&M~ZLSfCx N-6cC۴i쒍4iMר}-;5- t#$؈$%%[}Y$8`]::E_RRҨbmvL?'F6nzUT~}}{1iB:F4͝KC, ` G~-ya箽&kXD&q ЭG A$հ!]ܿo>"ڍnQ6;Тe @Vv.BڵR+]HT9Q;m>^:NǯLeˎ__??DB;j,6ť3.hGu UWTn@՛1 ƺEj_?ْ{W`P*:]RJaBN …|ҷnOԨߓчɈ+N ~sv>|mӎ)IƑAHx޸_4zG=3Y7[2iOұ|0e\o vypk0 yD"qaj@,/golDtFHO3oU6FJ`Jђsg/>{Qcfߩ[1~ҸkWo_OV:4:+M(2Y 6cpoBA4:s,'a0i qγawG䗴s`TR/"VN5nnyPVQN/@lnsmC7ތQR!;:7,ړ A}>ۑwuﵗ&>+rl6PQnTґrWuИFΌwsw[]dh臦>(.(+`Ap8@q;vJMDB*J-@F>lVq(---_pl 4 h}a7DdUfd^{KJe`GtҰv=w4 7 lj85׳ VNPndprv9H *q x}DH6v`eAT E;3V mKUq* ="w#)6CG?6 (Cio"|mh}l䇔J;yfO:.fs),Jv^@E*>z5Jv=AJSe9:9f9) fH\6"@#عr&zO^Aߋ` &@fsm&*An@3pUo3ITf2 E b%6f̘/-C<J 8GRHOUP.Sjq\.=LFN~1VP=WP)pGL_j;* doZ[VjA5kƝkdC7@LݹqO](AR+kUh IW'pU[VnBٔ\]r֟ 65^p/51[,|1ѺBs:.3W~@)c|6yM«*vV,r+,֡QJR VsvΩ l$pS p" Η3@G=T1,pawŀ}zx6U{7/kijsNner'K uHtɃ١z[( j\fiMPbȬ P%۰A F[%Aa1o[&Z51|wИϓ&@Ɍem6qf pS:R'2 \gʛU{r9鑱!&|펌Jk?"B !i>keA#lp5G1n1- <5Dun-x+udW;,I_Vdl}Bٸ vNI]$Ȕ\<nSzeAAVuܵ$ :u55Dy52tşEj t fjt>_q1ڗ&S!jEt&ƭD&m^HP>pX\P#.ъzey'捍BfZߴ5Ŵ{o\dNՁpֆ.熂,U)&O: m>LC `@7n칋^7Sɯws´~nqeYIDf8bAxsgj<@жd&Ekx >(2u mۢߓ׌{}KvXD\ߡCp[Rx;B8VfKwEhD[Ǡ!NNZ\co~89fTV_yOxu^>^Fg̛/J٫ƼY7GO0@qmHaQdz?B !,8O@+2C|mi}@866V~`:o=gfjŠ^OĬjtۣ{ Gy3{ϱo A p /Ѻ1{MZŁ:ņNL65W@zUN<@urGEI=lXuZZC"FX%.>amCm̛|t "0ea"UVO3͉SG6j73e]D5h71Y +'k,/k2ėvS)گV{rZvo_-D{vvg<+}qt2Kץyww~7tkoiޣҖmOXXx4ģސ|{c3o+nT0^kT*T*ƠӨ7޺q"s۠Ϋh8bݠftsҮg3&CYh,PTṹ"c줧׫_{s֨JOZu$JUw 2xwO{]W417P_ ͎Qou<Ļ+{yymq=9sW\i f)h|0BwaYQnݮsf.y }OMN3(TT$ج}› ڤ3+V4'Qaz0tІ @o߾<2L ~pbJ@ic`FQ;׾V.f@ٶޛSa` G]K/5 @SO=ŋ#F𭬬DbbbP^zЪU+GMI_}z \NT@)~~UuqcO J3wшHI"hTκjsv@ J S[W&\D1&>}#oZ]e<^ku:>.a*>Iǧ?.uQu7O%񺘆B݀V\|[l+ """w^בX 6 &G], cb;fg]6w5K㩓lE-pqƍC6m0IIIȟO`׮]?~@cw̐@(b.V9bH'y pLfF=Xx]L  l!n1n%QV 6̇~(֫WJ q#e9ǵ.a) 6nAH s{F]USC#227o۷eqQ&Ev&L:Ux_AS.AZXLHHl9Қ4i@Ppd}mUݱ|]<}1ӗ3 ;7|d] ";;{  hu=Y |M6bb_xqxXw=xL] &MzX\jh-o__YCC8,ܗQ d ja`ر/5"QO Ξf? #G4fee vf~n={643g4ǰ|( ;vءC@/^8BƤvxx z>jCJKK۴lْ6(]ܥKΞ=1fL"l)S0I-iB*,֭&OܒrFv g)//^ {뭷Z18Y`>} .>ݣG$Zȕrj֬Lywܑ.e1kRl:>PҘ0'Ay_x-[nnn(((@gϞ""-ncիQĥK󐧺jΝadP2B.]ºuR\l"wq؎#?]UVV3f >|))){l&n׆\ 2#GL'O7]s,K޴rOQcI(nܸtȿ]WXօBIr7B 71im?ÚǏXp͕FC5KdUd0 RESQDQP @G&3z, Q&v5zAju۶my6B*Ƴ:t&  C+(dg]liiO"(Ӧ[nɉ&,Ծ}{)::uEA?ʓG dq{ftanC~.4888qBEf8ODPXXO"i xXQQ,I÷.N:>_0L~guEti.U$"H$b .^ia~?;ccc8z8o>>>Chiڴ)d! ]rsQ~)_q3CnM:5BA/ߦA/Vn~ N(`֭ضm (&ufhFV+|qcNs;tZQF%p~K tBۏHpH%mM6qqc;-[%Kq /8bu|gy Vm< :> \җQ*[Xxr0Ev7% AIb.o32TNt "$P!Dܗ7#/@MG?ݚ#oMIENDB`PK c>6Ke;e;skin/classic/tabmixplus/tab.css.tabbrowser-tabs > tab { -moz-binding: url(chrome://tabmixplus/content/tab/tabmix.xml#browser-tab) !important; } /* .tabbrowser-tabs { -moz-binding: url(chrome://tabmixplus/content/tab/tabmix.xml#scroll-tabs) !important; }*/ .tabbrowser-tab { -moz-binding: url(chrome://tabmixplus/content/tab/tabmix.xml#browser-tab) !important; } tabs[flowing=multibar][multibar] .tabs-frame { display: block !important; } tabs[flowing=multibar][multibar] .tabs-frame .tabs-right { display: none !important; } /*we need to make multirow work on all themes, this should help a bit*/ tabs[flowing=multibar][multibar], .tabbrowser-tabs[flowing=multibar][multibar], tabs[flowing=multibar][multibar] .tabbrowser-strip, tabs[flowing=multibar][multibar] tab, tabs[flowing=multibar][multibar] .tabs-left, tabs[flowing=multibar][multibar] .tabs-right { max-height: none !important; } tabs[flowing=multibar][multibar=scrollbar] tab { min-height: 0px !important; min-width: 0px !important; } tabs[flowing=multibar][multibar=scrollbar] tab[collapsed=true] { display: none !important; } tabs[flowing=singlebar] .tabs-frame, tabs[flowing=scrollbutton] .tabs-frame, tabs[flowing=multibar]:not([multibar]) .tabs-frame { overflow: hidden !important; } /* For TabX feature*/ .tabbrowser-tabs > tab .tab-close-button { display: none; } .tabbrowser-tabs:not([firefox2]) > tab[tabxleft=on] .showhover-box { -moz-box-direction: reverse; } .tabbrowser-tabs[firefox2] > tab[tabxleft=on] .showhover-flex { display: none; } .tabbrowser-tabs > tab[tabx=always][tabxleft=on] .always-left , .tabbrowser-tabs > tab[tabx=always]:not([tabxleft=on]) .always-right , .tabbrowser-tabs > tab[tabx=showhover][showbutton=on] .showhover , .tabbrowser-tabs > tab[tabx=current][tabxleft=on][selected="true"] .always-left , .tabbrowser-tabs > tab[tabx=current]:not([tabxleft=on])[selected="true"] .always-right { display: -moz-box; padding: 0; } /* current & hover */ .tabbrowser-tabs > tab[tabx=current_hover][showbutton=on]:not([selected="true"]) .showhover , .tabbrowser-tabs > tab[tabx=current_hover][tabxleft=on][selected="true"] .always-left , .tabbrowser-tabs > tab[tabx=current_hover]:not([tabxleft=on])[selected="true"] .always-right { display: -moz-box; padding: 0; } .tabbrowser-tabs > tab .tabs-closebutton { padding: 0 !important; } .tabbrowser-tabs > tab .tabs-closebutton > .toolbarbutton-icon{ -moz-padding-end: 0px !important; -moz-padding-start: 0px !important; } .tabbrowser-tabs > tab .always-left, .tabbrowser-tabs > tab .always-right { margin: 1px 0 -1px 0; } .tabbrowser-tabs[firefox2="true"] > tab .showhover { margin: -1px 0 -3px 0; } .tabbrowser-tabs:not([firefox2]) > tab .showhover { margin: -1px 0 -1px 0; } .tabbrowser-tabs:not([firefox2]) > tab[tabx=showhover][showbutton=on] .tab-text, .tabbrowser-tabs:not([firefox2]) > tab[tabx=current_hover][showbutton=on]:not([selected="true"]) .tab-text { padding-top: 2px; } .tabbrowser-tabs > tab[protected] .tab-close-button { display: none !important; } .tabbrowser-tabs[hidebutton] > tab .tab-close-button{ display: none !important; } .tabbrowser-tabs[tinywidth] > tab:not([selected="true"]) .always-left, .tabbrowser-tabs[tinywidth] > tab:not([selected="true"]) .always-right { display: none !important; } /*support for new icons, hopefully it doesnt break themes*/ .tabbrowser-tabs:not([firefox2]) > tab .tab-close-button { -moz-appearance: none; /* -moz-margin-start: 2px;*/ margin-top: 2px; border: none !important; padding: 0px; opacity: 1.0; } .tabbrowser-tabs:not([firefox2]) > tab .tab-close-button:focus { outline: none !important; } /* .tabbrowser-tabs:not([firefox2]) > tab[selected="true"] .tab-close-button { -moz-margin-start: 2px; margin-top: 2px; -moz-user-focus: normal; } */ tab[selected="true"] .tab-close-button { -moz-user-focus: normal; } .tabbrowser-tabs:not([firefox2]) > tab[selected="true"] { -moz-padding-end: 4px; padding-top: 4px; padding-bottom: 1px; } .tabbrowser-tabs:not([firefox2]) > tab .tab-middle { padding-top: 1px; } .tabbrowser-tabs:not([firefox2]) > tab[selected="true"] .tab-middle { padding-bottom: 1px; padding-top: 0; /* -moz-padding-start: 0px;*/ -moz-margin-start: -2px; margin-bottom: 1px; } .tabbrowser-tabs:not([firefox2]) > tab[first-tab="true"][selected="true"] .tab-middle{ padding-left: 1px; } .tabbrowser-tabs[dontUseNewCloseIcon="true"][firefox2="true"] > tab[selected="true"] .tab-close-button { opacity: 1.0; } .tabbrowser-tabs:not([dontUseNewCloseIcon])[firefox2="true"] .tab-close-button { -moz-image-region: rect(0px, 16px, 16px, 0px); opacity: 1.0; } .tabbrowser-tabs:not([dontUseNewCloseIcon])[firefox2="true"] .tab-close-button:hover, .tabbrowser-tabs:not([dontUseNewCloseIcon])[firefox2="true"] tab[tabx=always]:not([selected="true"]) .tab-close-button:hover { -moz-image-region: rect(0px, 32px, 16px, 16px) ; opacity: 1.0 ; } .tabbrowser-tabs:not([dontUseNewCloseIcon])[firefox2="true"] .tab-close-button:hover:active, .tabbrowser-tabs:not([dontUseNewCloseIcon])[firefox2="true"] tab[tabx=always]:not([selected="true"]) .tab-close-button:hover:active { -moz-image-region: rect(0px, 48px, 16px, 32px) ; opacity: 1.0 ; } .tabbrowser-tabs:not([dontUseNewCloseIcon])[firefox2="true"] tab[tabx=always]:not([selected="true"]) .tab-close-button { -moz-image-region: rect(0px, 64px, 16px, 48px); /* opacity: 0.7;*/ } /* For Flowing tabs */ tabs[flowing=multibar] tab { vertical-align: bottom; } /* For hidding the default tabs-closebutton */ tabs[closebutton=false] .close-button { display: none; } /* ..... For Scrollable tabs ..... */ tabs:not([flowing=scrollbutton]) .tabs-scroll, tabs[disableScrollTabsLeft=true][disableScrollTabsRight=true][flowing=scrollbutton] .tabs-scroll{ display: none !important; } tabs[flowing=scrollbutton] .tabs-scroll { display: -moz-box; } tabs[flowing=scrollbutton] .tabs-scroll-left-button { list-style-image: url("chevron-rtl.gif"); } tabs[flowing=scrollbutton] .tabs-scroll-right-button { list-style-image: url("chevron.gif"); } tabs[flowing=scrollbutton] .tabs-scroll-left-button[disabled="true"], tabs[flowing=scrollbutton] .tabs-scroll-right-button[disabled="true"] { opacity: 0.5; } tabs[flowing=scrollbutton] .tabs-scroll-right-button .toolbarbutton-icon{ -moz-margin-end: 0px; -moz-padding-start: 6px; } tabs:not([flowing=multibar])[disableScrollTabsRight=true] .tabs-frame { border-right-width: 0px; } tabs:not([flowing=multibar])[disableScrollTabsLeft=true] .tabs-frame { border-left-width: 0px; } .tabs-scroll-up-button, .tabs-scroll-down-button { display: none; min-width: 0px; } tabs[flowing=multibar][multibar=scrollbar] .tabs-scroll-up-button { display: -moz-box; list-style-image: url("chevron-up.gif"); } tabs[flowing=multibar][multibar=scrollbar] .tabs-scroll-down-button { display: -moz-box; list-style-image: url("chevron-dn.gif"); } tabs[flowing=multibar][multibar=scrollbar] .tabs-scroll-up-button[disabled="true"], tabs[flowing=multibar][multibar=scrollbar] .tabs-scroll-down-button[disabled="true"] { opacity: 0.5; } .tabs-scroll-up-button .toolbarbutton-icon, .tabs-scroll-down-button .toolbarbutton-icon{ -moz-margin-end: 0px; -moz-padding-start: 4px; } /* for miniT drag indicator */ .tab-drag-indicator-left, .tab-drag-indicator-right { display: none; background: transparent no-repeat 50% 50%; width: 7px; height: 12px; } tab[dragmark=atLeft] .tab-drag-indicator-left { display: -moz-box; background-image: url("drag-left.png"); margin-right: 1px; } tab[dragmark=atRight] .tab-drag-indicator-right { display: -moz-box; background-image: url("drag-right.png"); } /* Space on tab bar */ tabs #tabs-right-space, tabs #tabs-left-space { display: none; } tabs[tabBarSpace=true] #tabs-right-space, tabs[tabBarSpace=true] #tabs-left-space { display: -moz-box; width: 15px; } tabs[tabBarSpace=true] #firefox2-tabs-left-space, tabs:not([firefox2DefaultTheme]) #firefox2-tabs-left-space { display: none; } /* for unread and current tab style*/ tabs[unreadTab=true][boldUnread=true] tab:not([selected]) .tab-text, tabs[currentTab=true][boldCurrent=true] tab[selected="true"] .tab-text { font-weight: bold !important; } tabs[currentTab=true][boldCurrent=false] tab[selected="true"] .tab-text { font-weight: normal !important; } tabs[unreadTab=true][italicUnread=true] tab:not([selected]) .tab-text, tabs[currentTab=true][italicCurrent=true] tab[selected="true"] .tab-text { font-style: italic !important; } tabs[unreadTab=true][italicUnread=false] tab:not([selected]) .tab-text { font-style: normal !important; } tabs[unreadTab=true][underlineUnread=true] tab:not([selected]) .tab-text, tabs[currentTab=true][underlineCurrent=true] tab[selected="true"] .tab-text { text-decoration: underline !important; } /* for progressmeter on tab tag */ tabs[progressMeter=true] tab[busy=true] progressmeter.tab-progress { display: -moz-box; } tab progressmeter.tab-progress { width: 100% !important; height: 100% !important; margin: 0px 0px 0px 0px !important; padding: 0px 0px 0px 0px !important; min-width: 0px !important; min-height: 0px !important; border: none; display: none; } tabs[useProgressColor=true] tab .tab-progress{ -moz-appearance: none; background-color: transparent; } tabs[useProgressColor=true] tab .progress-bar{ -moz-appearance: none; } /* for extra icons */ tabs[extraIcons=true] tab[protected] .tab-protect-icon { list-style-image: url("protected.png"); -moz-image-region: rect(0 16px 16px 0); display: -moz-box; height: 16px; width: 16px; } tabs[extraIcons=true] tab[locked] .tab-lock-icon { list-style-image: url("locked.png"); -moz-image-region: rect(0 16px 16px 0); display: -moz-box; height: 16px; width: 16px; } tab:not([protected]) .tab-protect-icon, tab:not([locked]) .tab-lock-icon, tabs[extraIcons=false] .tab-protect-icon, tabs[extraIcons=false] .tab-lock-icon { display: none; } #context-openlink[disabled=true]{ display: none !important; } /* new tab button on tab bar*/ .tabs-newbutton { display: -moz-box; list-style-image: url("newtab.png"); max-width: 26px; max-height: 26px; margin-top: 1px; margin-left: 1px; } tabs[newTabButton=false] .tabs-newTab { display: none; } #btn_undoclose, .closedtabs-icon { list-style-image: url(undoclosetab.png); } #btn_undoclose { -moz-image-region: rect(0 24px 24px 0); } #btn_undoclose:hover { -moz-image-region: rect(24px 24px 48px 0); } #btn_undoclose[disabled=true] { -moz-image-region: rect(48px 24px 72px 0); } toolbar[iconsize=small] #btn_undoclose, .closedtabs-icon .menu-iconic-left{ -moz-image-region: rect(0 40px 16px 24px); } toolbar[iconsize=small] #btn_undoclose:hover, .closedtabs-icon:hover .menu-iconic-left{ -moz-image-region: rect(16px 40px 32px 24px); } toolbar[iconsize=small] #btn_undoclose[disabled=true], .closedtabs-icon[disabled=true] .menu-iconic-left{ -moz-image-region: rect(32px 40px 48px 24px); } #btn_closedwindows , .closedwindows-icon { list-style-image: url(undoclosewindow.png); } #btn_closedwindows { -moz-image-region: rect(0 24px 24px 0); } #btn_closedwindows:hover { -moz-image-region: rect(24px 24px 48px 0); } #btn_closedwindows[disabled=true] { -moz-image-region: rect(48px 24px 72px 0); } toolbar[iconsize=small] #btn_closedwindows, .closedwindows-icon .menu-iconic-left{ -moz-image-region: rect(0 40px 16px 24px); } toolbar[iconsize=small] #btn_closedwindows:hover, .closedwindows-icon:hover .menu-iconic-left{ -moz-image-region: rect(16px 40px 32px 24px)!important; } toolbar[iconsize=small] #btn_closedwindows[disabled=true], .closedwindows-icon[disabled=true] .menu-iconic-left{ -moz-image-region: rect(32px 40px 48px 24px)!important; } #btn_tabslist, #tm-tabsList { list-style-image: url(tabslist.png); } #btn_tabslist { -moz-image-region: rect(0 24px 24px 0); } #btn_tabslist:hover { -moz-image-region: rect(24px 24px 48px 0); } #btn_tabslist[disabled=true] { -moz-image-region: rect(48px 24px 72px 0); } toolbar[iconsize=small] #btn_tabslist, #tm-tabsList .menu-iconic-left{ -moz-image-region: rect(0 40px 16px 24px); } toolbar[iconsize=small] #btn_tabslist:hover, #tm-tabsList:hover .menu-iconic-left{ -moz-image-region: rect(16px 40px 32px 24px); } toolbar[iconsize=small] #btn_tabslist[disabled=true], #tm-tabsList[disabled=true] .menu-iconic-left{ -moz-image-region: rect(32px 40px 48px 24px); } #tabmix-menu , #btn-sm-settings, #tm-sm-settings { list-style-image: url(tmpsmall.png); } #tm-sm-settings .menu-iconic-left { -moz-image-region: rect(0 16px 16px 0)!important; } #btn_sessionmanager, #tm-sessionmanager { list-style-image: url(sessionmanager.png); } #btn_sessionmanager { -moz-image-region: rect(0 24px 24px 0); } #btn_sessionmanager:hover { -moz-image-region: rect(24px 24px 48px 0); } #btn_sessionmanager[disabled=true] { -moz-image-region: rect(48px 24px 72px 0); } toolbar[iconsize=small] #btn_sessionmanager, #tm-sessionmanager .menu-iconic-left{ -moz-image-region: rect(0 40px 16px 24px); } toolbar[iconsize=small] #btn_sessionmanager:hover, #tm-sessionmanager:hover .menu-iconic-left{ -moz-image-region: rect(16px 40px 32px 24px); } toolbar[iconsize=small] #btn_sessionmanager[disabled=true], #tm-sessionmanager[disabled=true] .menu-iconic-left{ -moz-image-region: rect(32px 40px 48px 24px); } #current-underline span, #unread-underline span{ text-decoration: underline; } /* fix icon for menu item without image in tabmix menu list */ .fix-bookmark-item .menu-iconic-left { -moz-image-region: rect(0 16px 16px 0)!important; } #BrowserPreferences radio[pane=paneTabs]:hover, #BrowserPreferences radio[pane=paneTabs] { list-style-image: url(tmp.png); -moz-image-region: rect(0, 32px, 32px, 0); } #btn_tabmixplus { list-style-image: url(tmpsmall.png); } #btn_tabmixplus .button-icon { margin-top: 0px; margin-bottom: 0px; -moz-margin-start: 0px; -moz-margin-end: 5px; } /* fix dropmarker orient for toolbarbutton[type="menu"] in FF 2.0 + */ #btn_undoclose[firefox2][type="menu"] ,#btn_closedwindows[firefox2][type="menu"] , #btn_tabslist[firefox2][type="menu"] ,#btn_sessionmanager[firefox2][type="menu"] { -moz-binding: url("chrome://global/content/bindings/toolbarbutton.xml#menu-vertical"); } /* for hashcoulouredtabs */ #content[hashedtabs] .tabbrowser-tab:not([busy]) .tab-icon-image:not([src]) { list-style-image: none !important; } /* for all tab list in firefox 1.0, 1.5*/ /* we don't need this in FF 2.0 +*/ .alltabs-item[busy] > .menu-iconic-left > .menu-iconic-icon { list-style-image: url("chrome://global/skin/throbber/Throbber-small.gif"); opacity: 0.6; } .alltabs-item[selected="true"] { font-weight: bold; } PK WY44rr$skin/classic/tabmixplus/tabslist.pngPNG  IHDR(H 79IDATx^ݙ t3g < APDP"J%܀EQ\+%uѻ^E|"X5 h%X%D 7"/b !ydVNNVWk̷Ι'ih[^ѐ! j[ܩQGB$5i@Ud?UU}Djh 6_GVbEW# :V05_TC@ ̜_HYq!\$+5&;vh "'Ö~flE|~t]( cZsܢ'}0dx\}Q4`3C:P^#Zz`Ɵ>>-ދʆΝ~7& fR-XE "c̍9Vev^i*߃z_>"=UGL\躆g+P7'fi w~VV0jD@P!b x]TPx 2G5ƻ{(_0 MÛy'3E4݈xhBu֜a;i茓o%y%YoPJ?3nܚMU u_hHLpV-~wNEg=s ٸ ;V0%c8kxG7b_L,H&]坌Bk"m0vO\$; P\? հ07k`Ĺ2+|PPTY8ٵ폝jc5BZ݅rmF]}3S&$52c'\U7sU)؈2_9ꙕ|mwWAX?+A+b\N'.|U ׋7v;c@1ŤOc|RW8a˖-clСCq5`g5,)P2ύ-csBF={ȹvߧݎ3Buu(:qfK/q皚 a}.E |.>xD'탬 n\f ._*h큰b Fŵ޹sO),s }t"+-!%\6Ys΃<(ifOMXOp&q$wCGaĆ 5\#Gرc|laٵeܞ\lE0F9ãdS=.__|-Ig\  xmCjuf$D`m6 @[Ap}w޳(ye(_K$Xf~7PHiN'G B|l$zL@ (- xNpyMsiɒ%)(~ 29ǎ*geeͤ t8/.yWK {U;8p@>u=h6m4}t)n":UQQ bz]]-3fu%={ߣ{M>yH&R7mڔvT9FGExj*qM(;~b`},pcr=da``p#C9Ʒp_m f(ަu(CSUpPooh Bu6;\. M D?䌁F- RF?5wz{%k׽DQdۆ8< dHVđύQ t. r7fl(=u[oRTU 3U(,B2@ⷠ@DD΁:#'@miy[.Yv]3aDL&Ίu Qr6p뀹GtJBiۃ#yv2#JDmPU~ ?qT0mz+L6#p> {rjX-&KgT)ێ}}XDLjgLAXD&V8k־ݻ[72 ;r7mh`h=wmz:;v X [T_ ɓ'Ѿs MYfa̙1c`PT ۶]0Ƭ[^뛏BWj*]?vAH=χzBL&t:-I[ZZy,C2D4^+sy@'o*L4?zK\Ksɨe:Ƿo&K(qy~QL:M@$Г qw;ڎ>9TB9 A$>&U>W9+_8c$>!ֶ̊ڦ=lmJ)g8} *jС02$ :PT T9  ( CP̌^`}$08k}5ؽ{7r|TMD.05A!5<+y([aϽsB/eH>h祎3ܺ):(Pc1䈃R& >2LQb'7Ps7`!8qT"샭goپ>ogPLLoB𡹶3 M=Øp7w{ 89\Bփ(őEoa1&S[Zsu3 #2Ǡ*ll!0C!*o=qT-rAO 85ꢣ4RAgeH޽oKQ 8ucp]##E6= PHabV]7_Cj8Bdki\qPB(*8k'kvAOO/&#%ġkB@HI F`P.q YnkpY?D~dz[Ēe®KēbF@ +ʉ\,f@$ ,@}1.#p.ő`8PU?dLD@h:,z_8@LđNF<J% ʉ2gC^)\X(88n[z]taqt8|>i!r Ηfdp+rզ}llXإL_^}ҹFVJ[D5tS.&&,HL 3Dt { 88WBH%[.RK%B35v$$\aDIA X̳is44RPUB>/UdK MJapgF he Y:O+Y1'0315i=HhTvzEɿB'>9zui(:Q` 2ŐHY0 cb1 fp'{~kF,kjNE %Fsf*S΂ǖX\΂q #/r^YrLBͼ_=;[F[+@*] R\O U9GׁW`y6n802qÆGS^X}]ߝ D='mNU^su]{_= r.ƱG2GGS`ϡCwvzP=02-8>88(fοٳ{cs0I?˞_ŊFo0U\?[Wnſ^*^IENDB`PK WY4c4&skin/classic/tabmixplus/tmpoptions.pngPNG  IHDRx19IDATx^ tU; $@dEPGqmс3̨qDEdqPdl $,$! I'TջSOa=w=V}{eYLz9 4Má]]B)O^zFdy ub?%Qy&m3g' a%Dž݋0ˀ7侅<}E+'{ LIIɜ2eJqg}?䩧t F;gN7s"6XiY`4MKRB]Mm @sn .ìKXv) O+ !#_#_ `k:ёJL˒i\̹b6p !t]4&N6 W`HwIE'ۍu[ 3uM,^c1?C766n r?!a tLب̠rLĵ6~C7A#0  l$rylg?s4v逝^e0DP]we8f̘wژRSޛ_gYb?4hY8 O-0@ p:"IOÒro.Ml%u&тr,+HZJ@ o~v@[؄>BDGb{=xf@7h,u&^=?C̸|,kNb%Nypw_߷o߹fͺ{q꺤4Br]wO ^'C: A8#"hjncg4Hicebڑ׹@Sַψ _'gNӹDlYbCD5VhWCX: r!pC B'cԜ8zl5t@1SN4;;{jj*B ' Y;AR#'e!S2hѢM_xb]Gq̙3rz4m lfl ^>9nv ,S`jD@` + 6ɥZ t C~ iP,oNֿ[Xy/ /CL[o[C~^.N gtWm) ІyMs/dEZ=rLeZyɎfEB˨Q@1.V{< l&igwIf ɫxvc. ebtF/0܉5Ds5!4 N` 4^6Gxj8kۏ`oǓHG m馛e:#nZZJ2nHX<4Elݺ9U7_F8 BL1@VdWA|o^`ˎɤWB)!hT4yZd1!nxxgca~vJ=*=cНPHtyZ-sI)A PCx-y)hFk C -<CEd+F!A/UFWu:3E54Ud"W&~ бh÷ pe⚚![-+V$3)W.DtIC{)'7UD܍0jpĤn|S:lo *ڑ`#P]h%"$4^`!@t=ª9Txy M<+m@l)6B(1LZN܏i=g\ue2eEZn˞9s/SViY^@t*VVVgϞ|hfīam>oܺVC7'i9vGzラ8cy6a&m,p͏ɑ†C9<:RA{źr{ V`!hG6pD@Xvnp׏yw[$*? `5꜔Ȧ%Etp={hCl 3v)X≉fQ!MF2rUZ>_LS6T4p SS XXmy* &Tx)nl<m$ФQe'MSԠxx_Ϣ#xs \k~40Ly[aph7}~Ϲ?DF&Q4L24f "Kj>u-\DDښETbU*q}1 C-xȕ+V^ Ri7, Cg 'U/QZڇI&! [23P5زtϢԷq<N\\JJ)++gj2}hǷ%nA-pxF|zGrYYesMJLbF*!≠smAdi*\TәןZGciK#nyXաqS`|dFK>=`K P <*BHFj*1.Gd:gRT\ 0+Vއ)ATm'B:5r{j Usk !Dxb erϳ6fqK?qa\d Jnǁ@3m+D#>h;>.Bh-dw! -՝ 3T=Mq#STVɔqi ظ-G5SĺuSW:cCb2 tI3[BAMLؒBs ~7m(@ӡ)?q6~J܈31<4{ƨ90AtR:֡a(WzkW_ihh8*:} 8VJabAq/N[S淋 ّ2eyRS-kZNSZ<0f7`7Mٚ"6= y_Up@ XHCڑNڲf͚ƃudF;`G6\cEkAu8 $ \+ vگ2 gnx3 @jtjΫ]rrx7pZ& OKkj Z;7!o\2{-W1&$#[HAO -ytiKG! HDewV,m閖͠ &Kҝ])Pv1ꑪh~ߠ(ro p4߼l"@kA'y}y9izge3R5cƌ|,̓a#W0ڴiS; pڒ(75*Rt*qLp,N]ÐїÑuz1]ptEj-;jADrjy6ArYro֗'`y,.?Pf`Z¸EWp6KO7v'w(۵LkV6~0$nA?'3iW䘳G~U ^s'O"m^dV9 cAαU[u+>@G׎әs2v Zi@eBmmv5Ԉ:v6#~hoX;e#:Ȕ"qlZ6vLL"-}09LBNK8@Hq;ߏRkRs#CC?w\%M$'?$]9Y٥<gRy|@-P{jFDJ/]&s`"IR8mA@bXB@ `Qv.@x = )NIFxj _6aIENDB`PK WY4 $skin/classic/tabmixplus/tmpsmall.pngPNG  IHDRaVIDATx^uS}lu~AFײc˜D Y0da˦"q&0b -E0Y00CvLFmmƮ-+k^N|%{0<Kf/t<R5LHIdNNwz%A0tƴao# ÀB*_tEBVQ(Y^ e5Z=j>|XLB<GVtQe:XC(+m =`\ꣾ"э+-Mr`u0БR #"H񅪪wY;Ձ"08@Mb,*c(еYS"JTup|-{JQ2д,7ȅ9gv+ffgm/7웏%bDrom{Ώӯ~_zhRkimsUY~L&onlqW;Él_U~.qi;=.ÿ1eϾF#SR\]ފD_'IENDB`PK WY4(skin/classic/tabmixplus/undoclosetab.pngPNG  IHDR(H 7IDATx^̙ xeߪt:ҝIH!(,``pgeY@EQAGgEAw@$ g"p$$t:tFgOU5IտBY>`Naׇ-DIv"K+VMm߹sF}CD ٲupq^tw;*$F#W=ҥ-YկX qbs؂>_̙Ghɬ~qe7P gY9PXm.# ( o7+,4lܻ|Y|oRj nTq\Gڱɰ#@,E^#(*MuG{dӞuJ.Uןx P$C0]G\Uu}763ҳ5z脭RnY>WAAh CB$($CVd($$;_t n/{^kϟ?9 bT( jkkW($0ut8Wn -0b5!ASӦbc,t jjJz >?I&DyM$(Eƈ@QKVHyN@>bl{)9ISkfoZ`6 &SσŭnGm] Rl*DA$(>1XSptĬ  Ebu6<mD7d1ڽ!&2d\/B(DބQ?"B pf8ݙ.dߒn:`"̍[ 2ĨgYHPt'>aRkyX!9 9dK6W( o;N|00i BkG5QtSz1 L uЌhDF^t|~7FQT#H@-;"9},U: Og' f g$8v DHPD L!/ Q6LIVL݃~[P㪀iBO Ck@<)J`1[=AU-hmu]SHՙ辵8t  Q SS.A:W' 8Ha`um_A8{/E gpO,ؓ2ջps< ފqٙ A_\k_{h4~<%DeiKfL)No16VXp4He磩o}~d)ftq}0A=AXҚ#m H1\1L4^m OBY@8NyȠQ hL37U_6PQ7Mh]y1Ӱ(4 }20i葘+VjZ> jC}T6 LJMMN@YŖ(FՄ`*:ss G]es'.Bq(x IuI4r #O%9%ƭ>0cSiƑOJwB:\VYIrC?$3޾=+;pߕiӶٟ<|tۮv [vumqv C$$uvd #?^ 3spZeAe]z{'n u#Hr#ѕ8p@"VgQyp(;t.p^cd\-JpTc<;b5sɩg~t:( v3\.W־/.wp׿+ ‚MtjЂj;H-c/kLӔ?reddϐw{o>69bDT K$ f3\M'̚1.:HWH(I$iّUZe }THWBW_NJJz}];3ϛ $H"? /_n`NOFd:y7jsB<"%l>_3GWD!xȃb<(D8hdl?ڄ/h1!rmZaLC#bi:/<(TC )FA-?#`HiETl0#P]ĪP.Z]xߋO^pqk3z66zhzA bQʮpsUUUV0aIIzجb`(|2NSadvcÑ0.FJJV?u5dMbrssA7ˣSfN ru.l?QZb_[|.VaMb1ͰlR0dm(5> % 1D[.#e+8:(9UӷHG;I-3 ǰV( QiJpb.3bCIa-ڨg/~F_(HS.6P '_%r~u.Jb0LS %%%컟9"ko $^\ŸQ\8~.FuNvOMjjTF˂ k 'n欺<ϳ#AFhB{jv5[M\'߻Sgq`P8==16lCK1cƌAss3;9YX`\_bFyPEy\ *w9͸y5}մstUբ`!gC:Jݖ̙4}׸xQ\L;56,'O>sNOcϣ}/i„ e?ՙ;LSoƿx qB.laiXLH0D\\5iJ apaI*N6K?xO;sKg*NNRl'F̝ Yh]JSxO] d~bb"_(JhlM䉮Π'&)Img0\$l6FGGPv###F&aIH"?;aajOOOa+LOMMVQAi$>)ڧAWhYbZ]R$J'V_KV\*sQ~r$E86 "BmfjqBĺѺmdʖ$ bZR1jor>}eWZrGڠ6VyhR8?UyӬҟ5>2[8 ߮q ײ"_}+HN- 2Tc:gPDEV|V˷DRPL1}NuŴT| La1h !R)@Ta8@,˴ݦa6tק3(4)ȋ}+s7lok&=}^!3yQ|P[AnQף҆WfP/@d 뾃tR9@Qtb9fլ8ܫAJNt@@=sss~Hư?HkW^l& Jd#2եŋ X [`+>ptJR eG,]8%3#'&m,UR)o:?׼0hlh1vn#3MsEĘߌ%ΆJBIENDB`PK VY4C*+skin/classic/tabmixplus/undoclosewindow.pngPNG  IHDR(H 7[IDATx^̘ ys3;;3;{,05B)"@V, +Rl*C, ;+JdU)+)K(2RY K̞s=^2 h-z_Rװi7e!"v"n]۾7awV@BgS𘎵l.4 ?;U |R:fKLs'n9ܹܴ|Es Iup3[OIY(c;vF:iCʇW_%xǫ6,l}^BWudӃGZµ &"Ooz7,{G|Q{[fۋr&9ˍE.8cIv3 =EN̂7YL$i igǜO>)ȀR*) 9(U@e~G(JW"L5?%dLA%PY2{p*!K2E%xV4Q][-WEnlJeb&!>r/,7N8ʪAE!Pe9 HyJ5ӑ^ A 1{|,pD)>G&f}5n"G H>rwDKJP$OWC#Plh*Y0@ޚ` T(diL.dU[n+1K ~y1h, 6 Ո]QzQ64@*piԕu'nKBHrj/B/T"+…A$"ʑIg+ <xy.gLwÑ~  Rd:zPd6bۣ+fAvV_RYܪ˺h*U(ϩ ,\m14KpbJ52Vcߥtr>.'P$mѥIe$P%~;W-ڋ8~ 3^"$NlqŢpWUG0J=[ !3 ?FQPRrC,lN- K]΁de+e2!8dRl6Qv]ibW_>׉,alxp_BKoM1l]>W]L)@pAՃ~J*@o/(R?j;6}w~ׁZ1uC'A}Ŗ` .~H_PSpZqM=XJ$E"ҾOТم=#j4w~MDK;1£ߪƍ(=] Hk"(e!e9`0r88 f#F)|ziv`%8JdGM$֬{fSdcAJ)Nj"+ܵ;RB8)b61hᡚwϳ1q *d w?G))--VCOEP{qffы>k/?˖M$eYXZa(C <uYcs(Y,;2SW/[,L(]QCyʾV*BϮІzv5"D3mI(<BSK̦ f9cg{Ҏ_>$K9%gƆ0p*sg=h40#J@ Z=oMuUU[E < /`Nu9X4J|0_U[gW3c$!s2q\Fyʼnp}eŌhHqT;T>gɚoFC`DN׃;a(Esk7u]XKnCrt!TzK|ӧ1ac7j'|5dJF@m%n."A"VV7_h` ʼn8QS̖ã8/Sp+C5878zv d 7'&x{bG"&xx 8\8Y*\_\m֛kv} ?oPYRy>mGw)kr~³M!8b&eN$L$ꇶHz^v\?|,O%P = 1 ؊1^|~l舋P b\OS)jq_~tHC??.V'u񥫺xsW^ڻwk`LŎƦb /!dlXbzUUPb=P(K.ő#Gt}׋ i=Ʉ, 5Rr)d2$ : o2>[ RT}}6n&3TDa 44ivwe5Fno`."nN_|,жm۾lٲ}g[t`.6TB3WuG @ą}[p\0A,^.W;_knze.dt&..k` řm0ZBQBL%O3U:;;Y9~.VH* )n K]s`7qkՍA0RNDN#tۣSuVUb_ sJsPQVV7sU`8M(bZŽc` Fs{/NGlqʼn^lhˤ.ɋ(tqIIrxP\\G׋:̟?]cN^cQ\ AIZQ.޳K`>׍UZcub,2^n!IX2d/]S_(gxNF0rA+/to8.uwbd.R8y$b !I=Hl49~\o;;(.!PD29=>q] e\[ͦ(i"TG|hhtE9}JݮEeYϖBlB2#Eղ/ۼc-)^߻pxoƆZVvMkmMgVK؋-B$A @"@{{;TXdm޸)`z{[.%,b `fή⫲|cVjd ZZZ4T֛֫YTRJeku1(G <]Ο?_t{5TO̱mp~sy_:siU*e4QB$h9mqD8m,!8":k3!M%h8*V׽oihp,ykoKV JZ :f3c;@ACfn/yb۔$vϮA4,zw{m %}bqmK<.(_4-*nT l7CPЇ*ظH v:l"0dVl6Rn@n+c(Y&4M' p] PK i598 locale/zh-TW/tabmixplus/misc.dtd PK jm5F +locale/zh-TW/tabmixplus/pref-appearance.dtd PK jm5G])locale/zh-TW/tabmixplus/pref-filetype.dtd PK jm5+55'locale/zh-TW/tabmixplus/pref-tabmix.dtd PK jm5gڠ>>2locale/zh-TW/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label=同時保存 "已關閉分頁列表" sm.button.continue.label=繼續 sm.button.continue.accesskey=C sm.askBeforSave.title=瀏覽狀態管理 sm.askBeforSave.msg0=是否要儲存目前的瀏覽狀態? sm.askBeforSave.msg1=若不儲存則 "最後的瀏覽狀態" 將被清除! sm.askBeforSave.button0.label=儲存 sm.askBeforSave.button0.accesskey=S sm.askBeforSave.button1.label=不儲存 sm.askBeforSave.button1.accesskey=D sm.corrupted.title=瀏覽狀態管理 sm.corrupted.msg0=無法載入已毀損的 session.rdf 記錄檔。 sm.corrupted.msg1=檔案 session.rdf 將被刪除,您可以在 profile 中找到名為 session.old 的備份檔。 sm.areYouSure.msg=是否確定要繼續? sm.canChooseStartup.msg=請選擇一個作為新的起始瀏覽狀態: sm.addtoStartup.title=瀏覽狀態管理 sm.addtoStartup.msg.windows=加入視窗至起始瀏覽狀態: sm.addtoStartup.msg.tabs=加入分頁至起始瀏覽狀態: sm.addtoStartup.button0.label=加入 sm.addtoStartup.button0.accesskey=A sm.addtoStartup.button1.label=不加入 sm.addtoStartup.button1.accesskey=D sm.replaceStartup.title=瀏覽狀態管理 sm.replaceStartup.msg=取代起始瀏覽狀態: sm.replaceStartup.button0.label=取代 sm.replaceStartup.button0.accesskey=R sm.replaceStartup.button1.label=不取代 sm.replaceStartup.button1.accesskey=D sm.removeStartup.title=瀏覽狀態管理 sm.removeStartup.msg0=刪除起始瀏覽狀態: sm.removeStartup.msg1=請選擇一個作為新的起始瀏覽狀態: sm.removeStartup.button0.label=刪除 sm.removeStartup.button0.accesskey=D sm.removeStartup.button1.label=不刪除 sm.removeStartup.button1.accesskey=T sm.title=瀏覽狀態管理 sm.dontSaveBlank.msg=空白視窗沒有瀏覽狀態可儲存 sm.sessoinSave.error=發生錯誤,瀏覽狀態未被儲存 sm.sessionName.title.rename=瀏覽狀態管理 sm.sessionName.title.saveprevious=瀏覽狀態管理 sm.sessionName.title.savethiswindow=瀏覽狀態管理 sm.sessionName.title.saveallwindows=瀏覽狀態管理 sm.sessionName.msg0=請輸入瀏覽狀態名稱: sm.sessionName.msg1=名稱必須至少包含一個字元或數字。 sm.sessionName.msg2=這個名稱已存在 sm.sessionName.msg3=是否確定要取代這個瀏覽狀態? sm.sessionName.button0.label=重新命名 sm.sessionName.button0.accesskey=R sm.sessionName.button1.label=不重新命名 sm.sessionName.button1.accesskey=D sm.session.empty=空的 sm.session.tabs=頁 sm.session.windows=窗 sm.removeAll.title.session=瀏覽狀態管理 sm.removeAll.title.closedwindow=瀏覽狀態管理 sm.removeAll.msg0=是否確定要刪除所有已存的瀏覽狀態? sm.removeAll.msg1=若選擇刪除,您的起始瀏覽狀態將重設為 "最後的瀏覽狀態" sm.removeAll.msg2=是否確定要刪除所有已關閉的視窗? sm.sessionMenu.last=最後的瀏覽狀態 sm.sessionMenu.lastDefault=最後的瀏覽狀態 (預設) sm.sessionMenu.lastgood=最後完好的瀏覽狀態 sm.sessionMenu.previous=前次的瀏覽狀態 sm.sessionMenu.crashed=異常終止前的瀏覽狀態 sm.afterCrash.title=瀏覽狀態管理 sm.afterCrash.chkbox.label=啟用瀏覽狀態管理 sm.afterCrash.msg0=發現程式異常終止前的瀏覽狀態 sm.afterCrash.msg0.again= 您的異常終止前瀏覽狀態載入後仍然造成瀏覽器異常終止! sm.afterCrash.msg1=請從列表中選擇要還原的瀏覽狀態: sm.afterCrash.msg2=選擇要如何繼續 sm.afterCrash.msg3=瀏覽狀態管理目前是關閉狀態。啟用此功能,您將能還原已存的瀏覽狀態與已關閉的視窗。 sm.afterCrash.msg4=您也可以稍後從瀏覽狀態管理選單中回復異常終止前的瀏覽狀態。 sm.afterCrash.msg5=但並未儲存任何記錄。 sm.afterCrash.msg6=但並無任何已開啟的視窗在您異常終止前的瀏覽狀態中 sm.afterCrash.msg7=從已關閉視窗列表中選擇要還原的視窗 sm.afterCrash.msg8=(您也可以稍後從已關閉視窗列表中還原已關閉的視窗) sm.afterCrash.msg9=您的異常終止前瀏覽狀態是空的! sm.afterCrash.msg10=目前瀏覽狀態記錄檔裡沒有任何可供還原的記錄。 sm.afterCrash.button0.label=還原 sm.afterCrash.button0.accesskey=R sm.afterCrash.button0.crashed.label=回復異常終止前的瀏覽狀態 sm.afterCrash.button0.crashed.accesskey=R sm.afterCrash.button1.label=不還原 sm.afterCrash.button1.accesskey=D sm.start.title=瀏覽狀態管理 sm.start.chkbox.label=啟用瀏覽狀態管理 sm.start.msg0=您預設的起始瀏覽狀態內容是空的! sm.start.msg1=異常終止狀態回復功能目前是關閉狀態。啟用此功能,您將能回復程式異常終止前的瀏覽狀態。 sm.start.msg2=載入起始瀏覽狀態時發生錯誤,該瀏覽狀態並不存在。 sm.restoreError.msg0=瀏覽狀態記錄檔中有錯誤! sm.restoreError.msg1=記錄檔中錯誤的瀏覽狀態已刪除。 sm.disable.msg= 目前 Firefox 已經內建瀏覽狀態回復功能。 sm.disable.msg1= 您是否要使用 Firefox 內建的瀏覽狀態回復功能,並關閉 Tab Mix Plus 的瀏覽狀態管理? sm.disable.msg2= 您是否要使用 Tab Mix Plus 的瀏覽狀態管理,並關閉 Firefox 內建的瀏覽狀態回復功能? PK jm5U"locale/zh-TW/tabmixplus/tabmix.dtd PK jm5MG@ @ )locale/zh-TW/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description=強化瀏覽器的分頁瀏覽功能 tmp.merge.warning.title=即將關閉的視窗中仍有分頁 tmp.merge.warning.message=目前視窗中已標記的分頁將被合併至其他視窗,而未標記的分頁將隨目前視窗被關閉。\n\n確定要關閉目前視窗? tmp.merge.warning.checkboxLabel=關閉視窗時仍有分頁未被合併則要警告我 tmp.merge.error=您至少需要開啟兩個以上的視窗才能進行合併視窗的動作 tmp.importPref.error1=該檔案內容無效,無法匯入設定值。 tmp.importPref.error2=匯入設定值失敗。 tmp.sessionempty=選擇不儲存則 "最後的瀏覽狀態" 將在瀏覽器關閉時被清除! droptoclose.label=拖放分頁至此可關閉分頁 droplink.label=拖放到標籤上取代該分頁、拖放到標籤兩側建立新分頁 flstOn.label=切換至最後選取的分頁 flstOff.label=切換至右邊的分頁 slideshowOn.label=已啟動自動輪換分頁 slideshowOff.label=已停止自動輪換分頁 undoclosetab.clear.label=清除復原列表 undoclosetab.clear.accesskey=C restoreall.label=復原全部分頁 restoreall.accesskey=R session.loading.label=載入瀏覽狀態中 protectedtabs.closeWarning.1=您嘗試要關閉 %S 個被保護的分頁。 是否確定要繼續? protectedtabs.closeWarning.2=您嘗試要關閉 %S 個被保護的分頁。 是否確定要繼續? protectedtabs.closeWarning.3=您嘗試要關閉 %S 個分頁, 其中 %S 個被保護。 是否確定要繼續? protectedtabs.closeWarningPromptMe=關閉視窗時若仍有被保護的分頁則要警告我 confirm_autoreloadPostData_title=警告! confirm_autoreloadPostData=您嘗試要啟用自動更新的這個頁面中含有表單資訊(POSTDATA)。\n若您啟用頁面自動更新功能,則此頁面中的表單資訊(例如線上訂購資訊)將會被重複發送出去。\n\n您是否確定要啟用頁面自動更新功能? incompatible.title=Tab Mix Plus incompatible.msg0=偵測到下列這些擴充套件不相容於 Tab Mix Plus。 incompatible.msg1=您是否要停用這些擴充套件? incompatible.msg2=不相容的擴充套件在您重新啟動瀏覽器後將被停用。 incompatible.button0.label=停用 incompatible.button0.accesskey=D incompatible.button1.label=不停用 incompatible.button1.accesskey=O incompatible.button2.label=停用並重新啟動 incompatible.button2.accesskey=E incompatible.chkbox.label=重新啟動瀏覽器時顯示此資訊 tabmixoption.error.title=Tab Mix Plus 錯誤 tabmixoption.error.msg=您必須有一個瀏覽器視窗才能使用 Tab Mix Plus 選項 PK 6 locale/zh-CN/PK 6locale/zh-CN/tabmixplus/PK l5rq  $locale/zh-CN/tabmixplus/contents.rdf PK =5 locale/zh-CN/tabmixplus/misc.dtd PK l5W>+locale/zh-CN/tabmixplus/pref-appearance.dtd PK l5p)locale/zh-CN/tabmixplus/pref-filetype.dtd PK l5f44'locale/zh-CN/tabmixplus/pref-tabmix.dtd PK l5V2locale/zh-CN/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label=同时保存该进程所记录的已关闭标签页列表 sm.button.continue.label=继续 sm.button.continue.accesskey=C sm.askBeforSave.title=浏览进程管理器 - 保存浏览进程 sm.askBeforSave.msg0=是否要保存当前浏览进程? sm.askBeforSave.msg1=如果选择不保存下次启动 Firefox 时‘上一次浏览进程’将清空。 sm.askBeforSave.button0.label=保存 sm.askBeforSave.button0.accesskey=S sm.askBeforSave.button1.label=取消 sm.askBeforSave.button1.accesskey=D sm.corrupted.title=浏览进程管理器 - 数据库已被破坏 sm.corrupted.msg0=浏览进程管理器无法从已损坏的 session.rdf 中载入数据库。 sm.corrupted.msg1=session.rdf 将被删除且已经备份到 session.old 中 sm.areYouSure.msg=确定是否要继续? sm.canChooseStartup.msg=您可以从列表中选择一个作为新的起始浏览进程: sm.addtoStartup.title=浏览进程管理器 - 添加到起始浏览进程 sm.addtoStartup.msg.windows=您将要添加窗口到您的起始浏览进程: sm.addtoStartup.msg.tabs=您将要添加标签页到您的起始浏览进程: sm.addtoStartup.button0.label=添加 sm.addtoStartup.button0.accesskey=A sm.addtoStartup.button1.label=取消 sm.addtoStartup.button1.accesskey=D sm.replaceStartup.title=浏览进程管理器 - 替换起始浏览进程 sm.replaceStartup.msg=您将要替换您的起始浏览进程: sm.replaceStartup.button0.label=替换 sm.replaceStartup.button0.accesskey=R sm.replaceStartup.button1.label=取消 sm.replaceStartup.button1.accesskey=D sm.removeStartup.title=浏览进程管理器 - 删除起始浏览进程 sm.removeStartup.msg0=您将要删除您的起始浏览进程 sm.removeStartup.msg1=请从列表中选择一个作为新的起始浏览进程: sm.removeStartup.button0.label=删除 sm.removeStartup.button0.accesskey=D sm.removeStartup.button1.label=取消 sm.removeStartup.button1.accesskey=T sm.title=浏览进程管理器 sm.dontSaveBlank.msg=浏览进程管理器无法保存空白窗口 sm.sessoinSave.error=浏览进程管理器发生错误,无法保存浏览进程 sm.sessionName.title.rename=浏览进程管理器 - 重命名浏览进程 sm.sessionName.title.saveprevious=浏览进程管理器 - 保存浏览进程 sm.sessionName.title.savethiswindow=浏览进程管理器 - 保存当前窗口 sm.sessionName.title.saveallwindows=浏览进程管理器 - 保存所有窗口 sm.sessionName.msg0=请输入浏览进程名: sm.sessionName.msg1=浏览进程名必须至少包括一个字母或数字。 sm.sessionName.msg2=该进程名已被使用了! sm.sessionName.msg3=确定是否要替换当前浏览进程? sm.sessionName.button0.label=重命名 sm.sessionName.button0.accesskey=R sm.sessionName.button1.label=取消 sm.sessionName.button1.accesskey=D sm.session.empty=空白 sm.session.tabs=页 sm.session.windows=个窗口 sm.removeAll.title.session=浏览进程管理器 - 删除所有已保存的浏览进程 sm.removeAll.title.closedwindow=浏览进程管理器 - 删除所有已关闭的窗口 sm.removeAll.msg0=确定删除所有已保存的浏览进程? sm.removeAll.msg1=如果选择'删除'您的起始浏览进程将变为‘上一次的浏览进程’。 sm.removeAll.msg2=确定删除所有已关闭的窗口? sm.sessionMenu.last=上一次的浏览进程 sm.sessionMenu.lastDefault=上一次的浏览进程 - 默认 sm.sessionMenu.lastgood=上一次正常的浏览进程 sm.sessionMenu.previous=再上一次的浏览进程 sm.sessionMenu.crashed=已崩溃的浏览进程 sm.afterCrash.title=浏览进程管理器 - 崩溃后恢复原浏览进程 sm.afterCrash.chkbox.label=启用浏览进程管理器 sm.afterCrash.msg0=您上一次的浏览进程已崩溃! sm.afterCrash.msg0.again=您上次崩溃的进程再一次崩溃了! sm.afterCrash.msg1=请在列表中选择一个要恢复的进程: sm.afterCrash.msg2=请选择下一步操作 sm.afterCrash.msg3=浏览进程管理器当前处于禁用状态,如果启用浏览进程管理器,您将可以从浏览进程管理器菜单中恢复已崩溃,已关闭,已保存的进程和已关闭的窗口。 sm.afterCrash.msg4=稍候您可以从浏览进程管理器菜单中恢复已崩溃的进程。 sm.afterCrash.msg5=但是没有任何信息保存。 sm.afterCrash.msg6=但是其中没有任何已打开的窗口 sm.afterCrash.msg7=请从已关闭的窗口列表中选择一个窗口以恢复 sm.afterCrash.msg8=(稍候您也可以从已关闭的窗口菜单中恢复窗口) sm.afterCrash.msg9=没有任何已崩溃进程! sm.afterCrash.msg10=浏览进程管理器找不到任何可恢复的进程。 sm.afterCrash.button0.label=恢复 sm.afterCrash.button0.accesskey=R sm.afterCrash.button0.crashed.label=恢复 sm.afterCrash.button0.crashed.accesskey=R sm.afterCrash.button1.label=取消 sm.afterCrash.button1.accesskey=D sm.start.title=浏览进程管理器 - 恢复浏览进程 sm.start.chkbox.label=启用崩溃后进程恢复功能 sm.start.msg0=没有任何起始浏览进程! sm.start.msg1=崩溃后进程恢复功能当前处于禁用状态,如果启用该功能您将可以恢复已崩溃的浏览进程。 sm.start.msg2=查找您的起始浏览进程时发生错误, 您已保存的起始浏览进程不存在。 sm.restoreError.msg0=浏览进程管理器菜单发生错误! sm.restoreError.msg1=请删除您要恢复的浏览进程 sm.disable.msg=Firefox 内建浏览进程恢复特性。 sm.disable.msg1=您是否要启用内建的浏览进程恢复特性同时禁用 TabMix 浏览进程管理器? sm.disable.msg2=您是否要启用 TabMix 浏览进程管理器同时禁用内建的浏览进程恢复特性? PK l5B"locale/zh-CN/tabmixplus/tabmix.dtd PK l5>y8C C )locale/zh-CN/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description=加强标签页浏览功能。 tmp.merge.warning.title=关闭窗口且不合并标签页 tmp.merge.warning.message=该选择的标签页将和另一个窗口合并,同时关闭其它标签页和当前窗口。 tmp.merge.warning.checkboxLabel=当关闭窗口且不合并标签页时总是警告我。 tmp.merge.error=至少要有两个已打开的窗口才能合并 tmp.importPref.error1=该文件无效,无法导入。 tmp.importPref.error2=导入设置失败。 tmp.sessionempty=下一次您启动浏览器时,'上一次的浏览进程'将清空。 droptoclose.label=拖放并关闭标签页 droplink.label=拖放到中间并替换标签页或拖放到两侧并新建标签页 flstOn.label=激活上一次选中的标签页 flstOff.label=激活右边的标签页 slideshowOn.label=标签页滚动已打开 slideshowOff.label=标签页滚动已关闭 undoclosetab.clear.label=清空已关闭的标签页列表 undoclosetab.clear.accesskey=C restoreall.label=恢复所有标签页 restoreall.accesskey=R session.loading.label=正在载入浏览进程管理器 protectedtabs.closeWarning.1=您已选择关闭 %S 受保护标签页。您是否确定继续? protectedtabs.closeWarning.2=您已选择关闭 %S 受保护标签页。您是否确定继续? protectedtabs.closeWarning.3=您已选择关闭 %S 标签页,其中 %S 受保护。您是否确定继续? protectedtabs.closeWarningPromptMe=我试图关闭受保护标签页时警告我 confirm_autoreloadPostData_title=警告! confirm_autoreloadPostData=您启用自动重新载入的页面包含 POSTDATA。\n如果您启用自动重新载入,表单执行的任何操作(例如在线购买)将会被重复。\n\n您是否确定要启用自动重新载入? incompatible.title=Tab Mix Plus incompatible.msg0=下列扩展已被整合或与 Tab Mix Plus 不兼容。 incompatible.msg1=您是否要禁用这些扩展? incompatible.msg2=不兼容的扩展 incompatible.button0.label=禁用 incompatible.button0.accesskey=D incompatible.button1.label=不禁用 incompatible.button1.accesskey=O incompatible.button2.label=禁用并重新启动 incompatible.button2.accesskey=E incompatible.chkbox.label=浏览器启动时显示该提示 tabmixoption.error.title=Tabmix 错误 tabmixoption.error.msg=您必须为浏览窗口启用 TabMix 选项 PK 6 locale/sv-SE/PK 6locale/sv-SE/tabmixplus/PK jm5dQ  $locale/sv-SE/tabmixplus/contents.rdf PK c5 ׵ locale/sv-SE/tabmixplus/misc.dtd PK jm5<ۨT+locale/sv-SE/tabmixplus/pref-appearance.dtd PK jm5E)locale/sv-SE/tabmixplus/pref-filetype.dtd PK jm5}g4g4'locale/sv-SE/tabmixplus/pref-tabmix.dtd PK jm5nO2locale/sv-SE/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label=Spara lista Stängda flikar med denna session sm.button.continue.label=Fortsätt sm.button.continue.accesskey=F sm.askBeforSave.title=Aktivitetshanterare - Spara session sm.askBeforSave.msg0=Vill du spara sessionen? sm.askBeforSave.msg1=Om du inte sparar kommer listan 'Senaste sessioner' att vara tom. sm.askBeforSave.button0.label=Spara session sm.askBeforSave.button0.accesskey=S sm.askBeforSave.button1.label=Spara inte sm.askBeforSave.button1.accesskey=i sm.corrupted.title=Aktivitetshanterare - Trasig databas sm.corrupted.msg0=Databasen session.rdf är korrupt och kan därför inte laddas. sm.corrupted.msg1=Filen session.rdf tas bort och en kopia, session.old, skapas i mappen för din profil. sm.areYouSure.msg=Är du säker på att du vill fortstätta? sm.canChooseStartup.msg=Välj ny uppstartssession i listan: sm.addtoStartup.title=Aktivitetshanterare - Lägg till i uppstartssession sm.addtoStartup.msg.windows=Fönster att lägga till i uppstartssession: sm.addtoStartup.msg.tabs=Flik att lägga till i uppstartssession: sm.addtoStartup.button0.label=Lägg till i session sm.addtoStartup.button0.accesskey=L sm.addtoStartup.button1.label=Lägg inte till sm.addtoStartup.button1.accesskey=i sm.replaceStartup.title=Aktivitetshanterare - Åsidosätt uppstartssession sm.replaceStartup.msg=Ersätt din uppstartssession: sm.replaceStartup.button0.label=Erästt din session sm.replaceStartup.button0.accesskey=E sm.replaceStartup.button1.label=Ersätt inte sm.replaceStartup.button1.accesskey=i sm.removeStartup.title=Aktivitetshanterare - Ta bort uppstartssession sm.removeStartup.msg0=Ta bort uppstartssession: sm.removeStartup.msg1=Välj ny startuppsession i listan: sm.removeStartup.button0.label=Ta bort sm.removeStartup.button0.accesskey=T sm.removeStartup.button1.label=Ta inte bort sm.removeStartup.button1.accesskey=i sm.title=Aktivitetshanterare sm.dontSaveBlank.msg=Tomma fönster sparas ej i aktivitetshanteraren sm.sessoinSave.error=Fel i aktivitetshanteraren, sessionen sparades inte sm.sessionName.title.rename=Aktivitetshanterare - Byt namn på session sm.sessionName.title.saveprevious=Aktivitetshanterare - Spara session sm.sessionName.title.savethiswindow=Aktivitetshanterare - Spara detta fönster sm.sessionName.title.saveallwindows=Aktivitetshanterare - Spara alla fönster sm.sessionName.msg0=Ange sessionsnamn: sm.sessionName.msg1=Du måste ange ett namn. sm.sessionName.msg2=Detta namn existerar redan! sm.sessionName.msg3=Är du säker på att du vill ersätta sessionen? sm.sessionName.button0.label=Byt namn på session sm.sessionName.button0.accesskey=B sm.sessionName.button1.label=Byt inte namn sm.sessionName.button1.accesskey=i sm.session.empty=tom sm.session.tabs=T sm.session.windows=F sm.removeAll.title.session=Aktivitetshanteraren - Ta bort alla sparade sessioner sm.removeAll.title.closedwindow=Aktivitetshanteraren - Ta bort alla stängda fönster sm.removeAll.msg0=Är du säker på att du vill ta bort alla sparade sessioner? sm.removeAll.msg1=Om du väljer 'Ta bort' kommer uppstartsessionen att bli den 'Senaste sessionen' sm.removeAll.msg2=Är du säker på att du vill ta bort alla stängda fönster? sm.sessionMenu.last=Senaste session sm.sessionMenu.lastDefault=Senaste session - Standard sm.sessionMenu.lastgood=Senaste godkända session sm.sessionMenu.previous=Föregående till senaste sm.sessionMenu.crashed=Kraschade sessioner sm.afterCrash.title=Aktivitetshanterare - Återställ efter krasch sm.afterCrash.chkbox.label=Aktivera aktivitetshanterare sm.afterCrash.msg0=Den senaste sessionen kraschade! sm.afterCrash.msg0.again=Den senast kraschade sessionen kraschade igen! sm.afterCrash.msg1=Välj session att återställa från sm.afterCrash.msg2=Välj fortsättning sm.afterCrash.msg3=Aktivitetshanterare är f.n. avaktiverad. Om du aktiverar den kommer du att kunna återställa kraschade sessioner, stängda sessioner och fönster, från aktivitetshanterarens meny. sm.afterCrash.msg4=Du kan också återställa kraschade sessioner senare från aktivitetshanterarens meny. sm.afterCrash.msg5=men inget är sparat. sm.afterCrash.msg6=men det finns inget öppet fönster i din kraschade session sm.afterCrash.msg7=Välj fönster att återställa stängda fönster från sm.afterCrash.msg8=(du kan också återställa fönster senare från aktivitetshanterarens meny) sm.afterCrash.msg9=Den kraschade sessionen är tom! sm.afterCrash.msg10=Aktivitetshanterare hittade ingen session att återställa. sm.afterCrash.button0.label=Återställ session sm.afterCrash.button0.accesskey=Å sm.afterCrash.button0.crashed.label=Återställ kraschad session sm.afterCrash.button0.crashed.accesskey=k sm.afterCrash.button1.label=Återställ inte sm.afterCrash.button1.accesskey=i sm.start.title=Sessionhanterare - Återställ session sm.start.chkbox.label=Aktivera sessionshanterare sm.start.msg0=Uppsartssessionen är tom! sm.start.msg1=Återställning efter krasch är f.n. avaktiverad. Om du aktiverar återställning efter krasch, kan du återgå till där du var när det kraschade. sm.start.msg2=Fel i hantering av uppstartssession. Den sparade uppstartssessionen finns inte. sm.restoreError.msg0=Fel i aktivitetshanterarens fil! sm.restoreError.msg1=Ta bort sessionen du försökte återställa sm.disable.msg=Firefox har en inbyggd sessionshanterare. sm.disable.msg1=Vill du använda Firefox egna sessionshanterare och stänga av den i TabMix Plus? sm.disable.msg2=Vill du använda TabMix Plus sessionshanterare och stänga av den i Firefox ? PK jm5x"locale/sv-SE/tabmixplus/tabmix.dtd PK jm5^ )locale/sv-SE/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description=Öka kontrollen över din surfning med flikar tmp.merge.warning.title=Stänger fönster med ej sammanslagna flikar tmp.merge.warning.message=Valda flikar kommer slås samman med annat fönster, men övriga flikar stängs med detta fönster. tmp.merge.warning.checkboxLabel=Varna alltid vid stängninga av fönster med flikar som ej slås samman. tmp.merge.error=Minst två fönster måste vara öppna innan du kan slå ihop dom tmp.importPref.error1=Kan inte importera pga. ogiltig fil. tmp.importPref.error2=Fel vid import av inställningar. tmp.sessionempty=Nästa gång webbläsaren startas om, kommer listan med 'Senaste sessioner' att vara tom. droptoclose.label=Dra-och-släpp en flik för att stänga den droplink.label=Dra-och-släpp till mitten för att ersätta en flik eller till sidorna för att skapa en ny flstOn.label=Fokusera på senast vald flik flstOff.label=Fokusera på flik till höger slideshowOn.label=Flikrotation är på slideshowOff.label=Flikrotation är av undoclosetab.clear.label=Rensa listan med stängda flikar undoclosetab.clear.accesskey=R restoreall.label=Återställ alla flikar restoreall.accesskey=Å session.loading.label=Aktivitetshanteraren laddas protectedtabs.closeWarning.1=Stängning av %S skyddade flikar. Är du säker på att du vill fortsätta? protectedtabs.closeWarning.2=Stängning av %S skyddad flik. Är du säker på att du vill fortsätta? protectedtabs.closeWarning.3=Stängning av %S flikar vara %S är skyddade. Är du säker på att du vill fortsätta? protectedtabs.closeWarningPromptMe=Varna när jag försöker stänga skyddade flikar confirm_autoreloadPostData_title=Varning! confirm_autoreloadPostData=Sidan du automatiskt vill uppdatera innehåller POSTDATA.\nOm du slår på automatisk uppdatering så kommer alla formulär (såsom online-handel, anmälningar) att upprepas.\\Är du säker på att du vill slå på automatisk uppdatering? incompatible.title=Tab Mix Plus incompatible.msg0=Följande tillägg är integrerade eller inkompatibla med Tab Mix Plus. incompatible.msg1=Vill du avaktivera dessa tillägg? incompatible.msg2=De inkompatibla tilläggen kommer att vara avaktiverade efter omstart av webbläsaren. incompatible.button0.label=Stäng av incompatible.button0.accesskey=S incompatible.button1.label=Stäng inte av incompatible.button1.accesskey=i incompatible.button2.label=Stäng av och starta om incompatible.button2.accesskey=0 incompatible.chkbox.label=Visa detta meddelande när webbläsaren startar tabmixoption.error.title=Tabmix fel tabmixoption.error.msg=Du måste ha ett webbläsarfönster öppet för att använda TabMix nställningar PK 6 locale/sk-SK/PK 6locale/sk-SK/tabmixplus/PK jm5ؠ  $locale/sk-SK/tabmixplus/contents.rdf PK a5j locale/sk-SK/tabmixplus/misc.dtd PK jm500+locale/sk-SK/tabmixplus/pref-appearance.dtd PK jm5vI#)locale/sk-SK/tabmixplus/pref-filetype.dtd PK jm5Y;0606'locale/sk-SK/tabmixplus/pref-tabmix.dtd PK jm5ٸ2locale/sk-SK/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label=Uložiť zoznam zatvorených kariet s touto reláciou sm.button.continue.label=Pokračovať sm.button.continue.accesskey=C sm.askBeforSave.title=Manažér relácií - Uložiť reláciu sm.askBeforSave.msg0=Prajete si uložiť vašu reláciu? sm.askBeforSave.msg1=Ak ju neuložíte, pri ďalšom spustení prehliadača bude 'Posledná relácia' prázdna. sm.askBeforSave.button0.label=Uložiť reláciu sm.askBeforSave.button0.accesskey=S sm.askBeforSave.button1.label=Neukladať sm.askBeforSave.button1.accesskey=D sm.corrupted.title=Manažér relácií - Chybná databáza sm.corrupted.msg0=Manažér relácií nemôže načítať databázu z chybného session.rdf. sm.corrupted.msg1=Súbor session.rdf bude zmazaný, kópiu môžete nájsť v session.old vo svojom profile. sm.areYouSure.msg=Ste si istý,že chcete pokračovať? sm.canChooseStartup.msg=Môžete vybrať reláciu, ktorá má byť vašou novou Štartovacou reláciou zo zoznamu: sm.addtoStartup.title=Manažér relácií - Pridať do Štartovacia relácia sm.addtoStartup.msg.windows=Chystáte sa pridať okno(á)do štartovacej relácie: sm.addtoStartup.msg.tabs=Chystáte sa pridať kartu(y)do štartovacej relácie: sm.addtoStartup.button0.label=Pridať do relácie sm.addtoStartup.button0.accesskey=A sm.addtoStartup.button1.label=Nepridávať sm.addtoStartup.button1.accesskey=D sm.replaceStartup.title=Manažér relácií - Zrušiť Štartovaciu reláciu sm.replaceStartup.msg=Chystáte sa nahradiť vašu štartovaciu reláciu: sm.replaceStartup.button0.label=Nahradiť reláciu sm.replaceStartup.button0.accesskey=R sm.replaceStartup.button1.label=Nenahradzovať sm.replaceStartup.button1.accesskey=D sm.removeStartup.title=Manažér relácií - Zmazať Štartovaciu reláciu sm.removeStartup.msg0=Chystáte sa zmazať vašu štartovaciu reláciu: sm.removeStartup.msg1=Môžete vybrať reláciu, ktorá má byť vašou novou Štartovacou reláciou zo zoznamu: sm.removeStartup.button0.label=Zmazať sm.removeStartup.button0.accesskey=D sm.removeStartup.button1.label=Nezmazať sm.removeStartup.button1.accesskey=T sm.title=Manažér relácií sm.dontSaveBlank.msg=Manažér relácií neukladá prázdne okno sm.sessoinSave.error=Chyba, relácia nebola uložená sm.sessionName.title.rename=Manažér relácií - Premenovať reláciu sm.sessionName.title.saveprevious=Manažér relácií - Uložiť reláciu sm.sessionName.title.savethiswindow=Manažér relácií - Uložiť toto okno sm.sessionName.title.saveallwindows=Manažér relácií - Uložiť všetky okná sm.sessionName.msg0=Vložiť názov relácie: sm.sessionName.msg1=Názov musí obsahovať najmenej jedno písmeno alebo číslo. sm.sessionName.msg2=Tento názov sa už používa! sm.sessionName.msg3=Ste si istý,že chcete nahradiť reláciu? sm.sessionName.button0.label=Premenovať reláciu sm.sessionName.button0.accesskey=R sm.sessionName.button1.label=Nepremenovať sm.sessionName.button1.accesskey=D sm.session.empty=prázdny sm.session.tabs=T sm.session.windows=W sm.removeAll.title.session=Manažér relácií -Zmazať všetky uložené relácie sm.removeAll.title.closedwindow=Manažér relácií - Zmazať všetky zatvorené okná sm.removeAll.msg0=Ste si istý,že chcete zmazať všetky uložené relácie? sm.removeAll.msg1=Ak vyberete 'Zmazať' vaša Štartovacia relácia bude 'Posledná relácia'. sm.removeAll.msg2=Ste si istý,že chcete zmazať všetky uložené okná? sm.sessionMenu.last=Posledná relácia sm.sessionMenu.lastDefault=Posledná relácia - Pôvodná sm.sessionMenu.lastgood=Posledná známa relácia sm.sessionMenu.previous=Predchádzajúca sm.sessionMenu.crashed=Zlyhané relácie sm.afterCrash.title=Manažér relácií - Obnoviť po páde sm.afterCrash.chkbox.label=Zapnúť Manažér relácií sm.afterCrash.msg0=Vaša posledná relácia zlyhala! sm.afterCrash.msg0.again=Vaša posledná zlyhaná relácia zlyhala znova! sm.afterCrash.msg1=Vybrať reláciu pre obnovenie zo zoznamu: sm.afterCrash.msg2=Vybrať ako pokračovať sm.afterCrash.msg3=Manažér relácií je momentálne vypnutý, ak zapnete Manažér relácií, budete môcť obnoviť zlyhané relácie, zatvorené relácie, uložené relácie a zatvorené okná z ponuky Manažér relácií. sm.afterCrash.msg4=Môžete tiež obnoviť zlyhanú reláciu neskôr z ponuky Manažér relácií. sm.afterCrash.msg5=ale nebolo nič uložené. sm.afterCrash.msg6=ale nie sú otvorené žiadne okná v Zlyhané relácie sm.afterCrash.msg7=Vybrať okno na obnovenie zo zoznamu Zatvorené okná sm.afterCrash.msg8=(tiež môžete obnoviť zatvorené okná neskôr zo ponuky Zatvorené okná) sm.afterCrash.msg9=Priečinok Zlyhané relácie je prázdny! sm.afterCrash.msg10=Session Manager did not find any sessions to restore from. sm.afterCrash.button0.label=Obnoviť reláciu sm.afterCrash.button0.accesskey=R sm.afterCrash.button0.crashed.label=Obnoviť Zlyhaná relácia sm.afterCrash.button0.crashed.accesskey=R sm.afterCrash.button1.label=Neobnovovať sm.afterCrash.button1.accesskey=D sm.start.title=Manažér relácií - Obnoviť reláciu sm.start.chkbox.label=Zapnúť Manažér relácií sm.start.msg0=Priečinok Štartovacia relácia je prázdny! sm.start.msg1=Obnovenie je momentálne vypnuté, ak zapnete Obnovenie, budete môcť obnoviť zlyhané relácie. sm.start.msg2=Chyba pri hľadaní Štartovacej relácii, uložená štartovacia relácia neexistuje.. sm.restoreError.msg0=Chyba v súbore Manažér relácií! sm.restoreError.msg1=Zmazať reláciu,ktorú ste skúsili obnoviť sm.disable.msg=Firefox má zabudovanú obnovu relácie. sm.disable.msg1=Prajete si zapnúť zabudovanú obnovu relácie a vypnúť TabMix Manažér relácie? sm.disable.msg2=Prajete si zapnúť TabMix Manažér relácie a vypnúť zabudovanú obnovu relácie? PK jm5T"locale/sk-SK/tabmixplus/tabmix.dtd PK jm5\X )locale/sk-SK/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description=Prehliadavanie v kartách s podporou. tmp.merge.warning.title=Zatvoriť okno s nezlúčenými kartami tmp.merge.warning.message=Vybrané karty budú zlúčené v inom okne, ale ostatné karty budú teraz zatvorené s aktuálnym oknom. tmp.merge.warning.checkboxLabel=Vždy upozorniť pri zatváraní okna s kartami, ktoré nie sú zlúčené. tmp.merge.error=Najmenej 2 môžu byť otvorené predtým než ich môžete zlúčiť tmp.importPref.error1=Nie je možné importovať lebo je chybný súbor. tmp.importPref.error2=Zlyhanie v nastaveniach importovania. tmp.sessionempty=Pri ďalšom spustení prehliadača, 'Posledná relácia' bude prázdna. droptoclose.label=Pretiahnutím kartu zatvoriť droplink.label=Pretiahnutím do stredu kartu nahradiť alebo na stranu vytvoriť novú flstOn.label=Zmeniť kartu na Posledná zobrazená flstOff.label=Zmeniť kartu na Pravá slideshowOn.label=Rotácia kariet Zapnutá slideshowOff.label=Rotácia kariet Vypnutá undoclosetab.clear.label=Vyčistiť zoznam zatvorených kariet undoclosetab.clear.accesskey=C restoreall.label=Obnoviť všetky karty restoreall.accesskey=R session.loading.label=Načítava sa Manažér relácií protectedtabs.closeWarning.1=Chystáte sa zatvoriť %S chránenú kartu. Ste si istý,že chcete pokračovať? protectedtabs.closeWarning.2=Chystáte sa zatvoriť %S chránené karty. Ste si istý,že chcete pokračovať? protectedtabs.closeWarning.3=Chystáte sa zatvoriť %S karty, %S z nich sú chránené. Ste si istý,že chcete pokračovať? protectedtabs.closeWarningPromptMe=Upozorniť pri pokuse zatvoriť chránené karty confirm_autoreloadPostData_title=Upozornenie! confirm_autoreloadPostData=Stránka na ktorej sa pokúšate zapnúť automatické načítanie obsahuje POSTDATA.\nAk zapnete automatické načítanie, každá vykonaná forma úlohy (ako napr. online nákup) bude zopakovaná.\n\nSte si istý,že chcete zapnúť automatické načítanie? incompatible.title=Tab Mix Plus incompatible.msg0=Nasledujúce rozšírenia sú integrované alebo nekompatibilné s Tab Mix Plus. incompatible.msg1=Prajete si vypnúť tieto rozšírenia? incompatible.msg2=Nekompatibilné rozšírenia budú vypnuté po reštartovaní prehliadača. incompatible.button0.label=Vypnúť incompatible.button0.accesskey=V incompatible.button1.label=Nevypínať incompatible.button1.accesskey=N incompatible.button2.label=Vypnúť a reštartovať incompatible.button2.accesskey=R incompatible.chkbox.label=Zobraziť toto upozornenie pri spustení prehliadača tabmixoption.error.title=Chyba Tabmix tabmixoption.error.msg=Musíte mať mód jedného okna na požívanie Možností TabMix PK 6 locale/ru-RU/PK 6locale/ru-RU/tabmixplus/PK jm5w^  $locale/ru-RU/tabmixplus/contents.rdf PK ]5cI__ locale/ru-RU/tabmixplus/misc.dtd PK jm56oo+locale/ru-RU/tabmixplus/pref-appearance.dtd PK jm5_D@)locale/ru-RU/tabmixplus/pref-filetype.dtd PK jm5٢.#NN'locale/ru-RU/tabmixplus/pref-tabmix.dtd PK jm5)VR\!\!2locale/ru-RU/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label= Сохранить список закрытых вкладок данной сессии sm.button.continue.label= Продолжить sm.button.continue.accesskey= П sm.askBeforSave.title= Менеджер сессий - сохранение sm.askBeforSave.msg0= Желаете сохранить сессию? sm.askBeforSave.msg1= Если сессию не сохранить, при следующем запуске браузера ''Последняя сессия'' будет пустой. sm.askBeforSave.button0.label= Сохранить сессию sm.askBeforSave.button0.accesskey= С sm.askBeforSave.button1.label= Не сохранять sm.askBeforSave.button1.accesskey= Н sm.corrupted.title= Менеджер сессий - база данных повреждена sm.corrupted.msg0= Менеджер сессий не может загрузить базу данных из повреждённого session.rdf. sm.corrupted.msg1= Файл session.rdf будет удалён, копия с именем session.old находится в папке Вашего профиля. sm.areYouSure.msg= Вы действительно желаете продолжить? sm.canChooseStartup.msg= Вы можете выбрать стартовую сессию из списка: sm.addtoStartup.title= Менеджер сессий - добавить в список стартовых sm.addtoStartup.msg.windows= Вы собираетесь добавить окно в стартовую сессию: sm.addtoStartup.msg.tabs= Вы собираетесь добавить вкладки в стартовую сессию: sm.addtoStartup.button0.label= Добавить в сессию sm.addtoStartup.button0.accesskey= Д sm.addtoStartup.button1.label= Не добавлять sm.addtoStartup.button1.accesskey= Н sm.replaceStartup.title= Менеджер сессий - перезапись стартовой сессии sm.replaceStartup.msg= Вы собираетесь заменить стартовую сессию: sm.replaceStartup.button0.label= Заменить сессию sm.replaceStartup.button0.accesskey= З sm.replaceStartup.button1.label= Не заменять sm.replaceStartup.button1.accesskey= Н sm.removeStartup.title= Менеджер сессий - удаление стартовой сессии sm.removeStartup.msg0= Вы собираетесь удалить стартовую сессию: sm.removeStartup.msg1= Выберите из списка сессию, которую желаете сделать стартовой: sm.removeStartup.button0.label= Удалить sm.removeStartup.button0.accesskey= У sm.removeStartup.button1.label= Не удалять sm.removeStartup.button1.accesskey= Н sm.title= Менеджер сессий sm.dontSaveBlank.msg= Менеджер сессий не сохраняет пустые окна sm.sessoinSave.error= Ошибка менеджера сессий - данная сессия не сохранена sm.sessionName.title.rename= Менеджер сессий - переименование сессии sm.sessionName.title.saveprevious= Менеджер сессий - сохранение сессии sm.sessionName.title.savethiswindow= Менеджер сессий - сохранение текущего окна sm.sessionName.title.saveallwindows= Менеджер сессий - сохранение всех окон sm.sessionName.msg0= Введите имя сессии: sm.sessionName.msg1= Имя должно состоять, по крайней мере, из одной буквы или цифры. sm.sessionName.msg2= Это имя уже используется! sm.sessionName.msg3= Вы действительно желаете заменить сессию? sm.sessionName.button0.label= Переименовать сессию sm.sessionName.button0.accesskey= П sm.sessionName.button1.label= Не переименовывать sm.sessionName.button1.accesskey= Н sm.session.empty= пусто sm.session.tabs= В sm.session.windows= О sm.removeAll.title.session= Менеджер сессий - удаление всех сохранённых сессий sm.removeAll.title.closedwindow= Менеджер сессий - удаление всех закрытых окон sm.removeAll.msg0= Вы действительно желаете удалить все сохранённые сессии? sm.removeAll.msg1= При выборе ''Удалить'' стартовая сессия преобразуется в ''Последнюю сессию''. sm.removeAll.msg2= Вы действительно желаете удалить все закрытые окна? sm.sessionMenu.last= Последняя сессия sm.sessionMenu.lastDefault= Последняя сессия - по умолчанию sm.sessionMenu.lastgood= Последняя корректная сессия sm.sessionMenu.previous= Предшествующая последней sm.sessionMenu.crashed= Повреждённая сессия sm.afterCrash.title= Менеджер сессий - восстановление после краха sm.afterCrash.chkbox.label= Включить менеджер сессий sm.afterCrash.msg0= Последняя сессия потерпела крах! sm.afterCrash.msg0.again= При работе с Вашей последней сессией снова произошла ошибка! sm.afterCrash.msg1= Выберите из списка сессию для восстановления: sm.afterCrash.msg2= Выберите способ продолжения sm.afterCrash.msg3= Менеджер сессий сейчас заблокирован. Включив его, Вы сможете из меню восстанавливать повреждённые, закрытые и сохранённые сессии, а также закрытые окна. sm.afterCrash.msg4= Также повреждённую сессию можно восстановить позже из меню менеджера сессий. sm.afterCrash.msg5= но ничего не сохранено. sm.afterCrash.msg6= но нет никаких открытых окон в повреждённой сессии sm.afterCrash.msg7= Из списка закрытых окон выберите окно для восстановления sm.afterCrash.msg8= (также можно восстановить закрытые окна позже, из меню закрытых окон) sm.afterCrash.msg9= Повреждённая сессия пуста! sm.afterCrash.msg10= Менеджер сессий не нашёл сессий для восстановления. sm.afterCrash.button0.label= Восстановить сессию sm.afterCrash.button0.accesskey= В sm.afterCrash.button0.crashed.label= Восстановить повреждённую сессию sm.afterCrash.button0.crashed.accesskey= п sm.afterCrash.button1.label= Не восстанавливать sm.afterCrash.button1.accesskey= Н sm.start.title= Менеджер сессий - восстановление сессии sm.start.chkbox.label= Включить менеджер сессий sm.start.msg0= Стартовая сессия пуста! sm.start.msg1= Восстановление после краха сейчас заблокировано. Включив его, Вы сможете восстанавливать повреждённые сессии. sm.start.msg2= Ошибка поиска стартовой сессии. Не существует сохранённой стартовой сессии. sm.restoreError.msg0= Ошибка в файле менеджера сессий! sm.restoreError.msg1= Удалить сессию, которую Вы пытались восстановить sm.disable.msg= Firefox имеет встроенную функцию восстановления сессий. sm.disable.msg1= Вы хотите использовать встроенную функцию восстановления сессий и отключить менеджер сессий TabMix? sm.disable.msg2= Вы хотите использовать менеджер сессий TabMix и отключить встроенную функцию восстановления сессий? PK jm5(MMM"locale/ru-RU/tabmixplus/tabmix.dtd PK jm5ÊL)locale/ru-RU/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description= Расширение для управления вкладками. tmp.merge.warning.title= Закрытие окна с необъединёнными вкладками tmp.merge.warning.message= Выбранные вкладки будут объединены с другим окном, а оставшиеся будут закрыты вместе с текущим окном. tmp.merge.warning.checkboxLabel= Всегда предупреждать о закрытии окна с необъединёнными вкладками. tmp.merge.error= Чтобы функция объединения была доступна, должно быть открыто по меньшей мере 2 окна. tmp.importPref.error1= Импорт невозможен - некорректный файл. tmp.importPref.error2= Ошибка импорта настроек. tmp.sessionempty= При следующем запуске браузера ''Последняя сессия'' будет пустой. droptoclose.label= ''Бросить'' вкладку для её закрытия droplink.label= ''Бросать'' в центре для замены или с боков для создания вкладки flstOn.label= Фокус на последнюю вкладку flstOff.label= Фокус на правую вкладку slideshowOn.label= Цикличное листание вкладок включено slideshowOff.label= Цикличное листание вкладок отключено undoclosetab.clear.label= Очистить список закрытых вкладок undoclosetab.clear.accesskey= О restoreall.label= Восстановить все вкладки restoreall.accesskey= В session.loading.label= Загрузка менеджера сессий protectedtabs.closeWarning.1=Вы закрываете %S защищённую вкладку. Вы уверены, что хотите это сделать? protectedtabs.closeWarning.2=Вы закрываете несколько (%S) защищённых вкладок. Вы уверены, что хотите это сделать? protectedtabs.closeWarning.3=Вы закрываете несколько (%S) вкладок, %S из которых защищены. Вы уверены, что хотите это сделать? protectedtabs.closeWarningPromptMe=Предупреждать о закрытии окна с защищёнными вкладками confirm_autoreloadPostData_title=Предупреждение! confirm_autoreloadPostData=Страница, для которой Вы пытаетесь использовать автообновление содержит отправляемые данные.\nЕсли Вы будете использовать автообновление, любое выполняемое действие (такие как покупки в онлайн-магазинах) будет повторяться.\n\nВы уверены, что хотите использовать автообновление? incompatible.title= Tab Mix Plus incompatible.msg0= Следующие расширения интегрированы или несовместимы с Tab Mix Plus. incompatible.msg1= Вы хотите отключить эти расширения? incompatible.msg2= Несовместимые расширения будут отключены после того, как Вы перезапустите браузер. incompatible.button0.label= Отключить incompatible.button0.accesskey= О incompatible.button1.label= Не отключать incompatible.button1.accesskey= Н incompatible.button2.label= Отключить и перезапустить incompatible.button2.accesskey= п incompatible.chkbox.label= Показывать это уведомление, когда браузер начинает работу tabmixoption.error.title= Ошибка Tabmix tabmixoption.error.msg= По крайней мере одно окно браузера должно быть открыто для вызова настроек TabMix PK 6 locale/pt-BR/PK 6locale/pt-BR/tabmixplus/PK jm5di  $locale/pt-BR/tabmixplus/contents.rdf PK Z5RX locale/pt-BR/tabmixplus/misc.dtd PK jm5)+locale/pt-BR/tabmixplus/pref-appearance.dtd PK jm5W)locale/pt-BR/tabmixplus/pref-filetype.dtd PK jm5-b6b6'locale/pt-BR/tabmixplus/pref-tabmix.dtd PK jm5KYY2locale/pt-BR/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label=Salvar lista de abas fechadas com essa sessão sm.button.continue.label=Continuar sm.button.continue.accesskey=C sm.askBeforSave.title=Gerenciador de Sessões - Salvar Sessão sm.askBeforSave.msg0=Gostaria de salvar sua sessão? sm.askBeforSave.msg1=Caso não salve, a próxima vez que o navegador for iniciado terá a "Última sessão" vazia. sm.askBeforSave.button0.label=Salvar Sessão sm.askBeforSave.button0.accesskey=S sm.askBeforSave.button1.label=Não Salvar sm.askBeforSave.button1.accesskey=N sm.corrupted.title=Gerenciador de Sessões - Banco de Dados corrupto sm.corrupted.msg0=O Gerenciador de Sessões não pôde carregar seu banco de dados uma vez que o arquivo "session.rdf" está corrupto. sm.corrupted.msg1=O arquivo "session.rdf" será excluído. Uma cópia do arquivo, "session.old", pode ser encontrada em seu perfil. sm.areYouSure.msg=Tem certeza que quer continuar? sm.canChooseStartup.msg=Você pode selecionar uma sessão da lista como sua nova sessão inicial: sm.addtoStartup.title=Gerenciador de Sessões - Adicionar à Sessão Inicial sm.addtoStartup.msg.windows=Você está prestes a adicionar janela(s) à sua sessão inicial: sm.addtoStartup.msg.tabs=Você está prestes a adicionar aba(s) à sua sessão inicial: sm.addtoStartup.button0.label=Adicionar à Sessão sm.addtoStartup.button0.accesskey=A sm.addtoStartup.button1.label=Não Adicionar sm.addtoStartup.button1.accesskey=N sm.replaceStartup.title=Gerenciador de Sessões - Substituir Sessão Inicial sm.replaceStartup.msg=Você está prestes a substituir sua sessão inicial: sm.replaceStartup.button0.label=Substituir Sessão sm.replaceStartup.button0.accesskey=S sm.replaceStartup.button1.label=Não Substituir sm.replaceStartup.button1.accesskey=N sm.removeStartup.title=Gerenciador de Sessões - Excluir Sessão Inicial sm.removeStartup.msg0=Você está prestes a excluir sua sessão inicial: sm.removeStartup.msg1=Selecione uma sessão da lista como sua nova sessão inicial: sm.removeStartup.button0.label=Excluir sm.removeStartup.button0.accesskey=E sm.removeStartup.button1.label=Não Excluir sm.removeStartup.button1.accesskey=N sm.title=Gerenciador de Sessões sm.dontSaveBlank.msg=O Gerenciador de Sessões não salva páginas em branco sm.sessoinSave.error=Erro no Gerenciador de Sessões, a sessão não foi salva sm.sessionName.title.rename=Gerenciador de Sessões - Renomear Sessão sm.sessionName.title.saveprevious=Gerenciador de Sessões - Salvar Sessão sm.sessionName.title.savethiswindow=Gerenciador de Sessões - Salvar essa Janela sm.sessionName.title.saveallwindows=Gerenciador de Sessões - Salvar todas as Janelas sm.sessionName.msg0=Fornecer Nome da Sessão: sm.sessionName.msg1=Nome necessita conter no mínimo uma letra ou número. sm.sessionName.msg2=Esse nome já está em uso! sm.sessionName.msg3=Tem certeza que quer substituir a sessão? sm.sessionName.button0.label=Renomear Sessão sm.sessionName.button0.accesskey=R sm.sessionName.button1.label=Não Renomear sm.sessionName.button1.accesskey=N sm.session.empty=vazia sm.session.tabs=A sm.session.windows=J sm.removeAll.title.session=Gerenciador de Sessões - Excluir todas as Sessões Salvas sm.removeAll.title.closedwindow=Gerenciador de Sessões - Excluir todas as Janelas Fechadas sm.removeAll.msg0=Tem certeza que quer excluir todas as sessões salvas? sm.removeAll.msg1=Caso escolha "Excluir", sua sessão inicial será a "Última Sessão". sm.removeAll.msg2=Tem certeza que quer excluir todas as janelas fechadas? sm.sessionMenu.last=Última Sessão sm.sessionMenu.lastDefault=Última Sessão - Padrão sm.sessionMenu.lastgood=Última Sessão Válida sm.sessionMenu.previous=Anterior à última sm.sessionMenu.crashed=Sessão Travada sm.afterCrash.title=Gerenciador de Sessões - Restaurar após Falha sm.afterCrash.chkbox.label=Ativar Gerenciador de Sessões sm.afterCrash.msg0=Sua última sessão travou! sm.afterCrash.msg0.again=Sua última sessão travou novamente! sm.afterCrash.msg1=Selecione da lista sessão a ser restaurada: sm.afterCrash.msg2=Escolha como continuar sm.afterCrash.msg3=O Gerenciador de Sessões está desativado no momento, caso você o ative, você poderá restaurar sessões travadas, sessões fechadas, sessões salvas e janelas fechadas a partir do menu do Gerenciador de Sessões. sm.afterCrash.msg4=Você também poderá restaurar a sessão travada mais tarde, a partir do menu do Gerenciador de Sessões. sm.afterCrash.msg5=porém nada foi salvo. sm.afterCrash.msg6=porém não havia nenhuma janela aberta em sua sessão travada sm.afterCrash.msg7=Selecione janela a ser restaurada da lista de Janelas Fechadas sm.afterCrash.msg8=(você também poderá restaurar janelas fechadas mais tarde, a partir do menu das Janelas Fechadas) sm.afterCrash.msg9=Sua sessão travada está vazia! sm.afterCrash.msg10=O Gerenciador de Sessões não encontrou nenhuma sessão a ser restaurada. sm.afterCrash.button0.label=Restaurar Sessão sm.afterCrash.button0.accesskey=R sm.afterCrash.button0.crashed.label=Restaurar Sessão Travada sm.afterCrash.button0.crashed.accesskey=R sm.afterCrash.button1.label=Não Restaurar sm.afterCrash.button1.accesskey=D sm.start.title=Gerenciador de Sessões - Restaurar Sessão sm.start.chkbox.label=Ativar Gerenciador de Sessões sm.start.msg0=Sua sessão inicial está vazia! sm.start.msg1=A Recuperação de Falhas está desativada no momento, caso você a ative, você poderá restaurar sessões travadas. sm.start.msg2=Erro ao tentar localizar sua sessão inicial, sua sessão inicial não existe... sm.restoreError.msg0=Erro no arquivo do Gerenciador de Sessões! sm.restoreError.msg1=Exclua a sessão que você tentou restaurar sm.disable.msg=Firefox possue um restaurador de sessões nativo. sm.disable.msg1=Você gostaria de ativar o restaurador de sessões nativo e desativar o do Tab Mix Plus? sm.disable.msg2=Você gostaria de ativar o restaurador de sessões do Tab mix Plus e desativar o nativo? PK jm5'b"locale/pt-BR/tabmixplus/tabmix.dtd PK jm55  )locale/pt-BR/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description=Incrementando a navegação em abas. tmp.merge.warning.title=Fechando janela com abas não unidas tmp.merge.warning.message=As abas selecionadas serão unidas com outra janela, porém as abas restantes serão fechadas agora com a janela atual. tmp.merge.warning.checkboxLabel=Sempre perguntar ao fechar uma janela com abas não unidas. tmp.merge.error=No mínimo 2 janelas devem estar abertas antes de uni-las tmp.importPref.error1=Não pode importar - arquivo inválido. tmp.importPref.error2=Erro ao importar configurações. tmp.sessionempty=Na próxima vez que você reiniciar o navegador, 'Última Sessão' estará vazia. droptoclose.label=Solte a aba para fechá-la. droplink.label=Solte no centro para substituir ou nos lados para criar uma nova aba. flstOn.label=Focar a última aba selecionada - Pressione F9 para trocar preferência flstOff.label=Focar a aba da direita - Pressione F9 para trocar preferência slideshowOn.label=Modo visualizador de slide está ligado - Pressione F8 para desligar slideshowOff.label=Modo visualizador de slide está desligado - Pressione F8 para ligar undoclosetab.clear.label=Limpar lista de abas fechadas undoclosetab.clear.accesskey=C restoreall.label=Restaurar todas as abas restoreall.accesskey=R session.loading.label=Carregando Gerenciador de Sessões protectedtabs.closeWarning.1=Você está prestes a fechar %S aba protegida. Tem certeza que deseja continuar? protectedtabs.closeWarning.2=Você está prestes a fechar %S abas protegidas. Tem certeza que deseja continuar? protectedtabs.closeWarning.3=Você está prestes a fechar %S abas, das quais %S estão protegidas. Tem certeza que deseja continuar? protectedtabs.closeWarningPromptMe=Avise-me quando eu tentar fechar abas protegidas. confirm_autoreloadPostData_title=Atenção! confirm_autoreloadPostData=A página a qual você está querendo ativar o Auto Reload contêm POSTDATA.\n Ao ativar Auto Reload todas as informações de formulários (como online shopping) serão enviadas novamente.\n Tem certeza que deseja ativar o Auto Reload? incompatible.title=Tab Mix Plus incompatible.msg0=As seguintes extensões são integradas ou incompatíveis com a Tab Mix Plus. incompatible.msg1=Deseja desativar essas extensões? incompatible.msg2=As extensões incompatíveis serão desativadas após reiniciar o navegador. incompatible.button0.label=Desativar incompatible.button0.accesskey=D incompatible.button1.label=Não desativar incompatible.button1.accesskey=N incompatible.button2.label=Desative e reinicie incompatible.button2.accesskey=E incompatible.chkbox.label=Mostrar esse alerta quando o navegador iniciar tabmixoption.error.title=Erro do Tabmix tabmixoption.error.msg=Você deve ter no mínimo uma janela do navegador aberta para usar as Opções do Tab Mix Plus PK 6 locale/pl-PL/PK 6locale/pl-PL/tabmixplus/PK jm5D=_  $locale/pl-PL/tabmixplus/contents.rdf PK X5t locale/pl-PL/tabmixplus/misc.dtd PK jm5kN+locale/pl-PL/tabmixplus/pref-appearance.dtd PK jm5:p)locale/pl-PL/tabmixplus/pref-filetype.dtd PK .58@;;'locale/pl-PL/tabmixplus/pref-tabmix.dtd PK C5&&2locale/pl-PL/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label=Razem z sesją zapisz listę zamkniętych kart sm.button.continue.label=Kontynuuj sm.button.continue.accesskey=K sm.askBeforSave.title=Menedżer sesji - zapis sesji sm.askBeforSave.msg0=Czy chcesz zapisać sesję? sm.askBeforSave.msg1=Jeśli nie zapiszesz sesji, podczas następnego uruchomienia przeglądarka otworzy się z pustą sesją sm.askBeforSave.button0.label=Zapisz sm.askBeforSave.button0.accesskey=Z sm.askBeforSave.button1.label=Nie zapisuj sm.askBeforSave.button1.accesskey=N sm.corrupted.title=Menedżer sesji - uszkodzona baza danych sm.corrupted.msg0=Menedżer sesji nie może wczytać bazy danych z uszkodzonego pliku session.rdf. sm.corrupted.msg1=Zostanie utworzona kopia tego pliku o nazwie session.old, a sam plik zostanie usunięty sm.areYouSure.msg=Czy na pewno chcesz kontynuować? sm.canChooseStartup.msg=Możesz wybrać z listy nową sesję startową: sm.addtoStartup.title=Menedżer sesji - dodawanie kart i okien do sesji startowej sm.addtoStartup.msg.windows=Zamierzasz dodać okno(a) do sesji startowej: sm.addtoStartup.msg.tabs=Zamierzasz dodać kartę(y) do sesji startowej: sm.addtoStartup.button0.label=Dodaj sm.addtoStartup.button0.accesskey=D sm.addtoStartup.button1.label=Anuluj sm.addtoStartup.button1.accesskey=A sm.replaceStartup.title=Menedżer sesji - zmiana sesji startowej sm.replaceStartup.msg=Zamierzasz zmienić sesję startową: sm.replaceStartup.button0.label=Zmień sm.replaceStartup.button0.accesskey=Z sm.replaceStartup.button1.label=Anuluj sm.replaceStartup.button1.accesskey=A sm.removeStartup.title=Menedżer sesji - usuwanie sesji startowej sm.removeStartup.msg0=Zamierzasz usunąć sesję startową: sm.removeStartup.msg1=Wybierz z listy nową sesję startową sm.removeStartup.button0.label=Usuń sm.removeStartup.button0.accesskey=U sm.removeStartup.button1.label=Anuluj sm.removeStartup.button1.accesskey=A sm.title=Menedżer sesji sm.dontSaveBlank.msg=Menedżer sesji nie może zapisywać pustych okien sm.sessoinSave.error=Błąd menedżera sesji. Sesja nie została zapisana. sm.sessionName.title.rename=Menedżer sesji - zmiana nazwy sesji sm.sessionName.title.saveprevious=Menedżer sesji - zapis sesji sm.sessionName.title.savethiswindow=Menedżer sesji - zapis aktywnego okna sm.sessionName.title.saveallwindows=Menedżer sesji - zapis wszystkich okien sm.sessionName.msg0=Wprowadź nazwę sesji: sm.sessionName.msg1=Nazwa musi składać się minimum z jednej litery lub cyfry sm.sessionName.msg2=Ta nazwa jest już używana sm.sessionName.msg3=Czy na pewno chcesz zamienić nazwę sesji? sm.sessionName.button0.label=Zmień sm.sessionName.button0.accesskey=Z sm.sessionName.button1.label=Anuluj sm.sessionName.button1.accesskey=A sm.session.empty=pusta sm.session.tabs=K sm.session.windows=O sm.removeAll.title.session=Menedżer sesji - usuwanie zapisanych sesji sm.removeAll.title.closedwindow=Menedżer sesji - usuwanie zamkniętych okien sm.removeAll.msg0=Czy na pewno chcesz usunąć wszystkie zapisane sesje? sm.removeAll.msg1=Jeżeli wybierzesz \"Usuń\", sesją startową będzie ostatnia sesja sm.removeAll.msg2=Czy na pewno chcesz usunąć wszystkie zamknięte okna? sm.sessionMenu.last=Ostatnia sesja sm.sessionMenu.lastDefault=Ostatnia sesja (domyślna) sm.sessionMenu.lastgood=Ostatnia prawidłowa sesja sm.sessionMenu.previous=Przedostatnia sesja sm.sessionMenu.crashed=Uszkodzona sesja sm.afterCrash.title=Menedżer sesji - odtwarzanie po uszkodzeniu sm.afterCrash.chkbox.label=Włącz menedżera sesji sm.afterCrash.msg0=Ostatnia sesja Firefoksa została nieprawidłowo zakończona sm.afterCrash.msg0.again=Ostatnia nieprawidłowo zakończona sesja uległa ponownemu uszkodzeniu sm.afterCrash.msg1=Wybierz z listy sesję do odtworzenia sm.afterCrash.msg2=Wybierz jak kontynuować sm.afterCrash.msg3=Menedżer sesji jest wyłączony. Włączenie menedżera sesji pozwoli na odtwarzanie uszkodzonych, zamkniętych, zapisanych sesji i zamkniętych okien z poziomu menu Menedżera sesji. sm.afterCrash.msg4=Nieprawidłowo zamkniętą sesję można także odtworzyć w późniejszym czasie z poziomu menu menedżera sesji sm.afterCrash.msg5=ale nic nie zostało zapisane. sm.afterCrash.msg6=ale w sesji, która została nieprawidłowo zamknięta nie było żadnych otwartych okien sm.afterCrash.msg7=Z listy zamkniętych okien wybierz okno do odtworzenia sm.afterCrash.msg8=(zamknięte okna można także odtworzyć w późniejszym czasie z poziomu menu listy zamkniętych okien) sm.afterCrash.msg9=Nieprawidłowo zakończona sesja jest pusta. sm.afterCrash.msg10=Menedżer sesji nie znalazł żadnej sesji do odtworzenia sm.afterCrash.button0.label=Odtwórz sm.afterCrash.button0.accesskey=O sm.afterCrash.button0.crashed.label=Odtwórz nieprawidłowo zamkniętą sesję sm.afterCrash.button0.crashed.accesskey=W sm.afterCrash.button1.label=Anuluj sm.afterCrash.button1.accesskey=A sm.start.title=Menedżer sesji - odtwarzanie sesji sm.start.chkbox.label=Włącz menedżera sesji sm.start.msg0=Sesja startowa jest pusta sm.start.msg1=Odzyskiwanie sesji jest wyłączone. Włączenie odzyskiwania sesji pozwoli na odtwarzanie nieprawidłowo zakończonych sesji. sm.start.msg2=Błąd podczas szukania sesji startowej. Brak zapisanej sesji startowej. sm.restoreError.msg0=Błąd w pliku menedżera sesji sm.restoreError.msg1=Usuń sesję, którą próbujesz odtworzyć sm.disable.msg=Firefox posiada wbudowaną funkcję odtwarzania sesji. sm.disable.msg1=Włączyć wbudowaną funkcję odtwarzania sesji, a wyłączyć menedżera sesji Tab Mix Plusa? sm.disable.msg2=Włączyć menedżera sesji Tab Mix Plusa, a wyłączyć wbudowaną funkcję odtwarzania sesji? PK C5"TT"locale/pl-PL/tabmixplus/tabmix.dtd PK C5e )locale/pl-PL/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description=Rozszerzenie ułatwiające przeglądanie w kartach. tmp.merge.warning.title=Zamykanie okna z pozostałymi kartami tmp.merge.warning.message=Zaznaczone karty zostaną połączone z innym oknem. Pozostałe karty zostaną zamknięte razem z oknem. tmp.merge.warning.checkboxLabel=Zawsze ostrzegaj, gdy zamykasz okno z kartami, które nie są połączone tmp.merge.error=Muszą być otwarte minimum dwa okna, aby można było rozpocząć łączenie tmp.importPref.error1=Nie można zaimportować. Nieprawidłowy plik. tmp.importPref.error2=Nie udało się zaimportować ustawień tmp.sessionempty=Po kolejnym uruchomieniu przeglądarki element \"Ostatnia sesja\" będzie pusty droptoclose.label=Upuść kartę, aby ją zamknąć droplink.label=Upuść w centrum, aby zamienić kartę lub z boku, aby utworzyć kartę flstOn.label=Uaktywnij ostatnio otwartą kartę. Naciśnij klawisz F9, aby zmienić ustawienia. flstOff.label=Uaktywnij kartę po prawej stronie. Naciśnij klawisz F9, aby zmienić ustawienia. slideshowOn.label=Rotacja kart włączona. Naciśnij klawisz F8, aby ją wyłączyć. slideshowOff.label=Rotacja kart wyłączona undoclosetab.clear.label=Wyczyść listę zamkniętych kart undoclosetab.clear.accesskey=W restoreall.label=Odtwórz wszystkie karty restoreall.accesskey=R session.loading.label=Uruchamianie menedżera sesji protectedtabs.closeWarning.1=Zamierzasz zamknąć %S zabezpieczoną kartę. Czy na pewno chcesz kontynuować? protectedtabs.closeWarning.2=Zamierzasz zamknąć %S zabezpieczone karty. Czy napewno chcesz kontynuować? protectedtabs.closeWarning.3=Zamierzasz zamknąć %S otwarte karty, %S z nich są zabezpieczone. Czy na pewno chcesz kontynuować? protectedtabs.closeWarningPromptMe=Ostrzegaj, gdy następuje próba zamknięcia zabezpieczonych kart confirm_autoreloadPostData_title=Uwaga! confirm_autoreloadPostData=Strona dla, której próbujesz włączyć automatyczne odświeżanie zawiera dane typu POSTDATA.\nJeśli opcja ta zostanie włączona, to każda akcja jaką ma wykonać formularz (np: zakupy w sklepie internetowym) będzie powtarzana!.\n\nCzy napewno chcesz włączyć automatyczne odświeżanie? incompatible.title=Tab Mix Plus incompatible.msg0=Następujące rozszerzenie(a) są zintegrowane lub niekompatybilne z Tab Mix Plusem incompatible.msg1=Czy wyłączyć te rozszerzenie(a)? incompatible.msg2=Niekompatybilne rozszerzenie(a) zostanie(ą) wyłączone po ponownym uruchomieniu przeglądarki. incompatible.button0.label=Wyłącz incompatible.button0.accesskey=W incompatible.button1.label=Nie wyłączaj incompatible.button1.accesskey=N incompatible.button2.label=Wyłącz i uruchom ponownie przeglądarkę incompatible.button2.accesskey=U incompatible.chkbox.label=Wyświetlaj to ostrzeżenie podczas uruchamiania przeglądarki tabmixoption.error.title=Tabmix - błąd tabmixoption.error.msg=W trakcie dostosowywania opcji Tab Mix Plusa może być otwarte tylko jedno okno przeglądarki PK 6 locale/nl-NL/PK 6locale/nl-NL/tabmixplus/PK jm5>  $locale/nl-NL/tabmixplus/contents.rdf PK U5sl locale/nl-NL/tabmixplus/misc.dtd PK jm5k[+locale/nl-NL/tabmixplus/pref-appearance.dtd PK jm5v)locale/nl-NL/tabmixplus/pref-filetype.dtd PK jm5P77'locale/nl-NL/tabmixplus/pref-tabmix.dtd PK jm57$2locale/nl-NL/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label=Tijdens deze sessie gesloten tabbladen in lijst opslaan sm.button.continue.label=Doorgaan sm.button.continue.accesskey=D sm.askBeforSave.title=Sessiebeheerder - Sessie opslaan sm.askBeforSave.msg0=Wilt u uw sessie opslaan? sm.askBeforSave.msg1=Als u niets opslaat, zal de 'Laatste sessie' de volgende keer dat u uw browser opstart leeg zijn. sm.askBeforSave.button0.label=Sessie opslaan sm.askBeforSave.button0.accesskey=S sm.askBeforSave.button1.label=Niet opslaan sm.askBeforSave.button1.accesskey=N sm.corrupted.title=Sessiebeheerder - Beschadigde database sm.corrupted.msg0=De sessiebeheerder kan de database van de beschadigde session.rdf niet laden. sm.corrupted.msg1=Het bestand session.rdf zal worden verwijderd; een kopie kan worden gevonden in session.old in uw profiel. sm.areYouSure.msg=Weet u zeker dat u door wilt gaan? sm.canChooseStartup.msg=U kunt uit de lijst een sessie selecteren als uw nieuwe opstartsessie: sm.addtoStartup.title=Sessiebeheerder - toevoegen aan opstartsessie sm.addtoStartup.msg.windows=U staat op het punt om (een) venster(s) toe te voegen aan uw opstartsessie: sm.addtoStartup.msg.tabs=U staat op het punt om (een) tabblad(en) toe te voegen aan uw opstartsessie: sm.addtoStartup.button0.label=Aan sessie toevoegen sm.addtoStartup.button0.accesskey=A sm.addtoStartup.button1.label=Niet toevoegen sm.addtoStartup.button1.accesskey=N sm.replaceStartup.title=Sessiebeheerder - opstartsessie vervangen sm.replaceStartup.msg=U staat op het punt om uw opstartsessie te vervangen: sm.replaceStartup.button0.label=Sessie vervangen sm.replaceStartup.button0.accesskey=V sm.replaceStartup.button1.label=Niet vervangen sm.replaceStartup.button1.accesskey=N sm.removeStartup.title=Sessiebeheerder - opstartsessie verwijderen sm.removeStartup.msg0=U staat op het punt uw opstartsessie te verwijderen: sm.removeStartup.msg1=Kies s.v.p. een sessie als uw nieuwe opstartsessie uit de lijst: sm.removeStartup.button0.label=Verwijderen sm.removeStartup.button0.accesskey=V sm.removeStartup.button1.label=Niet verwijderen sm.removeStartup.button1.accesskey=N sm.title=Sessiebeheerder sm.dontSaveBlank.msg=Sessiebeheerder slaat geen lege vensters op sm.sessoinSave.error=Fout in de sessiebeheerder. De sessie is niet opgeslagen. sm.sessionName.title.rename=Sessiebeheerder - sessie hernoemen sm.sessionName.title.saveprevious=Sessiebeheerder - sessie opslaan sm.sessionName.title.savethiswindow=Sessiebeheerder - dit venster opslaan sm.sessionName.title.saveallwindows=Sessiebeheerder - alle vensters opslaan sm.sessionName.msg0=Voer sessienaam in: sm.sessionName.msg1=De naam dient uit tenminste één letter of cijfer te bestaan. sm.sessionName.msg2=Deze naam wordt al gebruikt! sm.sessionName.msg3=Weet u zeker dat u de sessie wilt vervangen? sm.sessionName.button0.label=Sessie hernoemen sm.sessionName.button0.accesskey=H sm.sessionName.button1.label=Niet hernoemen sm.sessionName.button1.accesskey=N sm.session.empty=leeg sm.session.tabs=T sm.session.windows=V sm.removeAll.title.session=Sessiebeheerder - alle opgeslagen sessies verwijderen sm.removeAll.title.closedwindow=Sessiebeheerder - alle gesloten venster verwijderen sm.removeAll.msg0=Weet u zeker dat u al uw opgeslagen sessies wilt verwijderen? sm.removeAll.msg1=Als u 'Verwijderen' kiest, zal uw opstartsessie de 'Laatste sessie' zijn. sm.removeAll.msg2=Weet u zeker dat u al uw gesloten vensters wilt verwijderen? sm.sessionMenu.last=Laatste sessie sm.sessionMenu.lastDefault=Laatste sessie - standaard sm.sessionMenu.lastgood=Laatste goede sessie sm.sessionMenu.previous=Voorlaatste sessie sm.sessionMenu.crashed=Gecrashte sessie sm.afterCrash.title=Sessiebeheerder - Herstellen na crash sm.afterCrash.chkbox.label=Sessiebeheerder inschakelen sm.afterCrash.msg0=Uw laatste sessie is gecrasht! sm.afterCrash.msg0.again=Uw laatste gecrashte sessie is weer gecrasht! sm.afterCrash.msg1=Kies een te herstellen sessie uit de lijst: sm.afterCrash.msg2=Kies hoe verder te gaan sm.afterCrash.msg3=De sessiebeheerder is momenteel uitgeschakeld. Als u de sessiebeheerder inschakelt kunt u gecrashte sessies, gesloten sessies, opgeslagen sessies en gesloten vensters herstellen vanuit het Sessiebeheerder menu. sm.afterCrash.msg4=U kunt ook de gecrashte sessie later herstellen vanuit het Sessiebeheerder menu. sm.afterCrash.msg5=maar er is niets opgeslagen. sm.afterCrash.msg6=maar er is geen open venster in uw gecrashte sessie. sm.afterCrash.msg7=Kies het te herstellen venster uit de Gesloten vensters-lijst sm.afterCrash.msg8=(u kunt ook gesloten vensters later herstellen vanuit het Gesloten vensters-menu) sm.afterCrash.msg9=Uw gecrashte sessie is leeg! sm.afterCrash.msg10=De sessiebeheerder heeft geen sessies gevonden die hersteld kunnen worden, sm.afterCrash.button0.label=Sessie herstellen sm.afterCrash.button0.accesskey=H sm.afterCrash.button0.crashed.label=Gecrashte sessie herstellen sm.afterCrash.button0.crashed.accesskey=H sm.afterCrash.button1.label=Niet herstellen sm.afterCrash.button1.accesskey=N sm.start.title=Sessiebeheerder - sessie herstellen sm.start.chkbox.label=Sessiebeheerder inschakelen sm.start.msg0=Uw opstartsessie is leeg! sm.start.msg1=Crash herstel is momenteel uitgeschakeld. Als u Crash herstel inschakelt kunt u gecrashte sessies herstellen. sm.start.msg2=Fout bij opzoeken opstartsessie. Uw opgeslagen opstartsessie bestaat niet. sm.restoreError.msg0=Fout in sessiebeheer-bestand! sm.restoreError.msg1=Vergeefs herstelde sessie verwijderen sm.disable.msg=Firefox heeft een ingebouwde mogelijkheid om sessies te herstellen. sm.disable.msg1=Wilt u de ingebouwde sessie-herstel mogelijkheid inschakelen en de Tab Mix Sessiebeheerder uitschakelen? sm.disable.msg2=Wilt u de Tab Mix Sessiebeheerder inschakelen en de ingebouwde sessie-herstel mogelijkheid uitschakelen? PK jm5 "locale/nl-NL/tabmixplus/tabmix.dtd PK jm5ʎ )locale/nl-NL/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description=Navigeren met tabbladen met heel veel extra mogelijkheden. tmp.merge.warning.title=Venster met niet samengevoegde tabbladen wordt afgesloten tmp.merge.warning.message=De geselecteerde tabbladen zullen samengevoegd worden met een ander venster, maar de overige tabbladen worden nu met het huidige venster afgesloten. tmp.merge.warning.checkboxLabel=Altijd waarschuwen wanneer een venster afgesloten wordt met niet samengevoegde tabbladen. tmp.merge.error=Er moeten tenminste twee vensters geopend zijn voordat u ze kunt samenvoegen tmp.importPref.error1=Kan niet importeren omdat het geen geldig bestand is. tmp.importPref.error2=Importeren van instellingen mislukt. tmp.sessionempty=Volgende keer dat de browser opgestart wordt zal 'Laatste sessie' leeg zijn. droptoclose.label=Tabblad laten vallen om deze te sluiten droplink.label=In het midden laten vallen om het tabblad te vervangen of aan de zijkanten om een nieuw tabblad te openen flstOn.label=Tabbladen focussen op laatst geselecteerd tabblad - F9 wisselt deze instelling om flstOff.label=Tabbladen focussen op rechter tabblad - F9 wisselt deze instelling om slideshowOn.label=Tabblad rotatie staat aan - F8 om uit te zetten slideshowOff.label=Tabblad rotatie staat uit - F8 om aan te zetten undoclosetab.clear.label=Lijst met gesloten tabbladen wissen undoclosetab.clear.accesskey=W restoreall.label=Alle tabbladen herstellen restoreall.accesskey=H session.loading.label=Sessiebeheerder wordt geladen protectedtabs.closeWarning.1=U staat op het punt om %S beschermde tabblad te sluiten. Weet u zeker dat u wilt doorgaan? protectedtabs.closeWarning.2=U staat op het punt om %S beschermde tabbladen te sluiten. Weet u zeker dat u wilt doorgaan? protectedtabs.closeWarning.3=U staat op het punt om %S tabbladen te sluiten, waarvan er %S beschermd zijn. Weet u zeker dat u wilt doorgaan? protectedtabs.closeWarningPromptMe=Mij waarschuwen wanneer ik probeer beschermde tabbladen te sluiten confirm_autoreloadPostData_title=Waarschuwing! confirm_autoreloadPostData=De pagina die automatisch wilt vernieuwen bevat POSTDATA.\nAls u Automatisch vernieuwen inschakelt, wordt elke actie die\nhet formulier uitvoert (zoals een online betaling) herhaald.\n\nWeet u zeker dat u Automatisch vernieuwen wilt inschakelen? incompatible.title=Tab Mix Plus incompatible.msg0=De volgende extensies zijn geïntegreerd in of gaan niet samen met Tab Mix Plus. incompatible.msg1=Wilt u deze extensies uitschakelen? incompatible.msg2=De ongeschikte extensies zullen worden uitgeschakeld als de browser wordt herstart. incompatible.button0.label=Uitschakelen incompatible.button0.accesskey=U incompatible.button1.label=Niet uitschakelen incompatible.button1.accesskey=N incompatible.button2.label=Uitschakelen en herstarten incompatible.button2.accesskey=E incompatible.chkbox.label=Deze waarschuwing tonen wanneer de browser start tabmixoption.error.title=Tab Mix fout tabmixoption.error.msg=U dient tenminste één browservenster geopend te hebben om de Tab Mix opties in te stellen PK 6 locale/ko-KR/PK 6locale/ko-KR/tabmixplus/PK jm5G~H  $locale/ko-KR/tabmixplus/contents.rdf PK R5 Bj   locale/ko-KR/tabmixplus/misc.dtd PK jm5F+locale/ko-KR/tabmixplus/pref-appearance.dtd PK jm5)locale/ko-KR/tabmixplus/pref-filetype.dtd PK jm5h(7(7'locale/ko-KR/tabmixplus/pref-tabmix.dtd PK jm5=[//2locale/ko-KR/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label=닫은 탭 목록을 이 세션에 저장 sm.button.continue.label=계속 sm.button.continue.accesskey=C sm.askBeforSave.title=세션 관리자 - 세션 저장 sm.askBeforSave.msg0=세션을 저장하시겠습니까? sm.askBeforSave.msg1=세션을 저장하지 않는다면 다음에 브라우저를 실행할 때 '마지막 세션'이 비어 있게 됩니다. sm.askBeforSave.button0.label=세션을 저장하기 sm.askBeforSave.button0.accesskey=S sm.askBeforSave.button1.label=저장 안하기 sm.askBeforSave.button1.accesskey=D sm.corrupted.title=세션 관리자 - 손상된 데이터베이스 sm.corrupted.msg0=세션 관리자는 손상된 session.rdf에서 데이터베이스를 불러올 수 없습니다. sm.corrupted.msg1=session.rdf파일이 지워집니다. 프로필 폴더에서 사본인 session.old를 찾을 수 있습니다. sm.areYouSure.msg=계속 하시겠습니까? sm.canChooseStartup.msg=아래의 목록에서 새 시작 세션으로 사용할 세션을 선택할 수 있습니다. sm.addtoStartup.title=세션 관리자 - 시작 세션 추가 sm.addtoStartup.msg.windows=창(들)을 시작 세션에 추가하시겠습니까? sm.addtoStartup.msg.tabs=탭(들)을 시작 세션에 추가하시겠습니까? sm.addtoStartup.button0.label=세션 추가하기 sm.addtoStartup.button0.accesskey=A sm.addtoStartup.button1.label=추가하지 않기 sm.addtoStartup.button1.accesskey=D sm.replaceStartup.title=세션 관리자 - 시작 세션 덮어쓰기 sm.replaceStartup.msg=아래의 시작 세션을 바꾸시겠습니까? sm.replaceStartup.button0.label=세션 바꾸기 sm.replaceStartup.button0.accesskey=R sm.replaceStartup.button1.label=바꾸지 않기 sm.replaceStartup.button1.accesskey=D sm.removeStartup.title=세션 관리자 - 시작 세션 지우기 sm.removeStartup.msg0=아래의 시작 세션을 지우시겠습니까? sm.removeStartup.msg1=아래의 목록에서 새 시작 세션으로 사용할 세션을 선택하십시오. sm.removeStartup.button0.label=지우기 sm.removeStartup.button0.accesskey=D sm.removeStartup.button1.label=지우지 않기 sm.removeStartup.button1.accesskey=T sm.title=세션 관리자 sm.dontSaveBlank.msg=세션 관리자는 비어있는 창은 저장하지 않습니다. sm.sessoinSave.error=세션 관리자의 오류로 인해 세션이 저장되지 않았습니다. sm.sessionName.title.rename=세션 관리자 - 세션 이름 바꾸기 sm.sessionName.title.saveprevious=세션 관리자 - 세션 저장 sm.sessionName.title.savethiswindow=세션 관리자 - 이 창을 저장 sm.sessionName.title.saveallwindows=세션 관리자 - 모든 창을 저장 sm.sessionName.msg0=세션 이름 입력: sm.sessionName.msg1=이름에는 반드시 한 개 이상의 글자나 숫자가 있어야 합니다. sm.sessionName.msg2=이 이름은 이미 사용 중입니다. sm.sessionName.msg3=정말 세션을 바꾸시겠습니까? sm.sessionName.button0.label=세션 이름 바꾸기 sm.sessionName.button0.accesskey=R sm.sessionName.button1.label=바꾸지 않기 sm.sessionName.button1.accesskey=D sm.session.empty=비어있음 sm.session.tabs=T sm.session.windows=W sm.removeAll.title.session=세션 관리자 - 모든 세션 지우기 sm.removeAll.title.closedwindow=세션 관리자 - 모든 닫은 창 목록 지우기 sm.removeAll.msg0=정말 저장된 모든 세션을 지우시겠습니까? sm.removeAll.msg1=만약 지우기를 선택하면 시작 세션은 '마지막 세션'이 됩니다. sm.removeAll.msg2=정말 모든 닫은 창 목록을 삭제 하시겠습니까? sm.sessionMenu.last=마지막 세션 sm.sessionMenu.lastDefault=마지막 세션 - 기본 sm.sessionMenu.lastgood=마지막 정상 세션 sm.sessionMenu.previous=끝에서 두번째 세션 sm.sessionMenu.crashed=충돌한 세션 sm.afterCrash.title=세션 관리자 - 충돌 후 복구 sm.afterCrash.chkbox.label=세션 관리자 사용 sm.afterCrash.msg0=마지막 세션이 충돌로 종료되었습니다. sm.afterCrash.msg0.again=마지막 충돌한 세션이 또 다시 충돌로 종료되었습니다! sm.afterCrash.msg1=목록에서 복구할 세션을 선택하십시오. sm.afterCrash.msg2=계속할 방법을 선택하십시오. sm.afterCrash.msg3=현재 세션 관리자를 쓰지 않고 있습니다. 세션 관리자를 사용하면 충돌한 세션, 닫은 세션, 저장된 세션들 및 닫은 창들을 세션 관리자 메뉴에서 복구할 수 있습니다. sm.afterCrash.msg4=나중에 세션 관리자 메뉴에서 충돌한 세션을 복구할 수 있습니다. sm.afterCrash.msg5=하지만 아무것도 저장되지 않았습니다. sm.afterCrash.msg6=하지만 충돌한 세션에 있는 어떤 창도 열 수 없습니다. sm.afterCrash.msg7=닫은 창 목록에서 복구할 창을 선택하십시오. sm.afterCrash.msg8=(나중에 닫은 창 메뉴에서 닫은 창을 복구할 수 있습니다.) sm.afterCrash.msg9=충돌한 세션이 비어있습니다. sm.afterCrash.msg10=세션관리자가 복구할 어떤 세션도 찾을 수 없습니다. sm.afterCrash.button0.label=세션을 복구하기 sm.afterCrash.button0.accesskey=R sm.afterCrash.button0.crashed.label=충돌한 세션을 복구하기 sm.afterCrash.button0.crashed.accesskey=R sm.afterCrash.button1.label=복구 안하기 sm.afterCrash.button1.accesskey=D sm.start.title=세션 관리자 - 세션 복구 sm.start.chkbox.label=세션 관리자 사용 sm.start.msg0=시작 세션이 비어 있습니다. sm.start.msg1=현재 충돌 후 복구를 쓰지 않고 있습니다. 충돌 후 복구를 사용하면 충돌로 종료된 세션을 복구할 수 있습니다. sm.start.msg2=시작 세션을 찾는 도중에 오류가 발생했습니다. 저장된 시작 세션이 존제하지 않습니다. sm.restoreError.msg0=세션 관리자 파일에서 오류 발생. sm.restoreError.msg1=복구를 시도한 세션을 지웁니다. sm.disable.msg=불여우는 세션 복구 기능을 내장하고 있습니다. sm.disable.msg1=탭믹스 세션 관리자를 끄고 내장된 세션 복구 기능을 쓰시겠습니까? sm.disable.msg2=내장된 세션 복구기능을 끄고 탭믹스 세션 관리자를 쓰시겠습니까? PK jm5"locale/ko-KR/tabmixplus/tabmix.dtd PK jm5a )locale/ko-KR/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description=탭 브라우징 기능을 향상시킵니다. tmp.merge.warning.title=창을 닫을 때 합쳐지지 않은 탭도 같이 닫기 tmp.merge.warning.message=선택된 탭은 다른 창에 합쳐지지만 나머지 탭들은 현재 창과 함께 닫힙니다. tmp.merge.warning.checkboxLabel=항상 합쳐지지 않은 탭이 있는 창을 닫을때 경고합니다. tmp.merge.error=합치기를 쓰기 위해선 2개 이상의 창이 열려 있어야 합니다. tmp.importPref.error1=유효한 파일이 아니므로 가져올 수 없습니다. tmp.importPref.error2=설정을 가져 오지 못했습니다. tmp.sessionempty=다음에 브라우저를 실행하면 '마지막 세션'이 비어있게 됩니다. droptoclose.label=이곳에 탭을 떨어뜨리면 탭을 닫습니다. droplink.label=가운데에 떨어뜨리면 이 탭에 열고 양 옆에 떨어 뜨리면 새 탭으로 엽니다. flstOn.label=마지막으로 선택됐던 탭 활성화 - F9로 기능을 바꿀 수 있습니다. flstOff.label=오른쪽 탭 활성화 - F9로 기능을 바꿀 수 있습니다. slideshowOn.label=탭 회전 켜기 - F8로 끌 수 있습니다. slideshowOff.label=탭 회전 끄기 - F8로 켤 수 있습니다. undoclosetab.clear.label=닫은 탭 목록 비우기 undoclosetab.clear.accesskey=C restoreall.label=모든 탭 복원하기 restoreall.accesskey=R session.loading.label=세션 관리자를 불러오는 중 protectedtabs.closeWarning.1=%S개의 보호받는 탭이 있습니다. 정말 끄시겠습니까? protectedtabs.closeWarning.2=%S개의 보호받는 탭이 있습니다. 정말 끄시겠습니까? protectedtabs.closeWarning.3=%S개의 탭 중 %S개의 보호받는 탭이 있습니다. 정말 끄시겠습니까? protectedtabs.closeWarningPromptMe=보호 받는 탭을 닫으려 할 때 경고하기 confirm_autoreloadPostData_title=경고! confirm_autoreloadPostData=자동으로 다시 읽기를 켠 이 페이지는 POST데이터를 포함하고 있습니다.\n만약 자동으로 다시 읽기를 켤 경우 데이터(온라인 구매와 같은)를 반복적으로 보내게 됩니다.\n정말 자동으로 다시 읽기를 켜시겠습니까? incompatible.title=탭 믹스 플러스 incompatible.msg0=아래의 확장 기능들은 탭 믹스 플러스와 통합되었거나 충돌합니다. incompatible.msg1=이 확장 기능들을 끄시겠습니까? incompatible.msg2=충돌하는 확장 기능들은 브라우저를 다시 시작해야 꺼집니다. incompatible.button0.label=끄기 incompatible.button0.accesskey=D incompatible.button1.label=끄지 않기 incompatible.button1.accesskey=O incompatible.button2.label=끈 뒤 다시 시작하기 incompatible.button2.accesskey=E incompatible.chkbox.label=브라우저가 시작될 때 이 경고를 띄우기 tabmixoption.error.title=탭믹스 에러 tabmixoption.error.msg=탭믹스 설정을 사용하는 브라우저창이 하나이상 켜져 있어야 합니다. PK 6 locale/ja-JP/PK 6locale/ja-JP/tabmixplus/PK jm5`<$locale/ja-JP/tabmixplus/contents.rdf PK P5Ag## locale/ja-JP/tabmixplus/misc.dtd PK jm51+locale/ja-JP/tabmixplus/pref-appearance.dtd PK jm5م)locale/ja-JP/tabmixplus/pref-filetype.dtd PK jm5VUAA'locale/ja-JP/tabmixplus/pref-tabmix.dtd PK jm5<2locale/ja-JP/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label= このセッションと「最近閉じたタブ」のリストも保存する sm.button.continue.label= 続行 sm.button.continue.accesskey= C sm.askBeforSave.title= セッションマネージャ - セッションを保存 sm.askBeforSave.msg0= セッションを保存しますか? sm.askBeforSave.msg1= 保存しない場合、次回ブラウザ起動時に「最後のセッション」は空になります sm.askBeforSave.button0.label= セッションを保存 sm.askBeforSave.button0.accesskey= S sm.askBeforSave.button1.label= 保存しない sm.askBeforSave.button1.accesskey= D sm.corrupted.title= セッションマネージャ - 破損したデータベース sm.corrupted.msg0= セッションマネージャは破損したsession.rdfからデータベースを読み込むことができませんでした sm.corrupted.msg1= session.rdfは削除され、プロファイルフォルダにsession.oldとしてコピーが残されます sm.areYouSure.msg= 本当に続行しますか sm.canChooseStartup.msg= 起動時に読み込むセッションを指定: sm.addtoStartup.title= セッションマネージャ - 起動時に読み込むセッションを追加 sm.addtoStartup.msg.windows= 起動時に読み込むセッションにウィンドウを追加しようとしています: sm.addtoStartup.msg.tabs= 起動時に読み込むセッションにタブを追加しようとしています: sm.addtoStartup.button0.label= セッションに追加 sm.addtoStartup.button0.accesskey= A sm.addtoStartup.button1.label= 追加しない sm.addtoStartup.button1.accesskey= D sm.replaceStartup.title= セッションマネージャ - 起動時に読み込むセッションを置き換え sm.replaceStartup.msg= 起動時に読み込むセッションを置き換えようとしています: sm.replaceStartup.button0.label= セッションを置き換える sm.replaceStartup.button0.accesskey= R sm.replaceStartup.button1.label= 置き換えない sm.replaceStartup.button1.accesskey= D sm.removeStartup.title= セッションマネージャ - 起動時に読み込むセッションを削除 sm.removeStartup.msg0= 起動時に読み込むセッションを削除しようとしています: sm.removeStartup.msg1= 新しく起動時に読み込むセッションを選択: sm.removeStartup.button0.label= 削除 sm.removeStartup.button0.accesskey= D sm.removeStartup.button1.label= 削除しない sm.removeStartup.button1.accesskey= T sm.title= セッションマネージャ sm.dontSaveBlank.msg= 空のウィンドウは保存出来ません sm.sessoinSave.error= セッションマネージャにエラーが発生しましたので、セッションは保存されません sm.sessionName.title.rename= セッションマネージャ - セッションをリネーム sm.sessionName.title.saveprevious= セッションマネージャ - セッションを保存 sm.sessionName.title.savethiswindow= セッションマネージャ - このウィンドウを保存 sm.sessionName.title.saveallwindows= セッションマネージャ - すべてのウィンドウを保存 sm.sessionName.msg0= セッション名を入力: sm.sessionName.msg1= セッション名には最低一つの文字が含まれていなければいけません sm.sessionName.msg2= このセッション名は既に使われています! sm.sessionName.msg3= 本当にセッションを置き換えますか? sm.sessionName.button0.label= セッションをリネーム sm.sessionName.button0.accesskey= R sm.sessionName.button1.label= リネームしない sm.sessionName.button1.accesskey= D sm.session.empty= 空 sm.session.tabs= T sm.session.windows= W sm.removeAll.title.session= セッションマネージャ - 保存されているすべてのセッションを削除 sm.removeAll.title.closedwindow=セッションマネージャ - 保存されているすべての「最近閉じたウィンドウ」を削除 sm.removeAll.msg0= 本当に保存されているすべてのセッションを削除しますか? sm.removeAll.msg1= 「削除」を選択した場合、起動時に読み込むセッションは「最後のセッション」になります sm.removeAll.msg2= 本当に保存されているすべての「最近閉じたウィンドウ」を削除を削除しますか? sm.sessionMenu.last= 最後のセッション sm.sessionMenu.lastDefault= 最後のセッション - デフォルト sm.sessionMenu.lastgood= 最後の有効なセッション sm.sessionMenu.previous= 最後の一つ前 sm.sessionMenu.crashed= クラッシュ時に保存されたセッション sm.afterCrash.title=セッションマネージャ - クラッシュ後の復元 sm.afterCrash.chkbox.label= セッションマネージャを有効にする sm.afterCrash.msg0= 最後のセッションはブラウザクラッシュ時に保存されたセッションです! sm.afterCrash.msg0.again= ブラウザクラッシュ時のセッションのため、再度クラッシュしました! sm.afterCrash.msg1= 復元するセッションを選択: sm.afterCrash.msg2= 続行する方法を選択 sm.afterCrash.msg3= セッションマネージャは現在無効となっています。セッションマネージャを有効にすると、クラッシュ時に保存されたセッション、閉じたセッション、保存されたセッション、及び最近閉じたウィンドウをセッションマネージャのメニューから復元できるようになります。 sm.afterCrash.msg4= 後でセッションマネージャのメニューから、クラッシュ時に保存されたセッションを復元することもできます sm.afterCrash.msg5= 何も保存されていません sm.afterCrash.msg6= クラッシュ時に保存されたセッションには、開いているウィンドウがありません sm.afterCrash.msg7= 最近閉じたウィンドウのリストから、復元したいウィンドウを選択 sm.afterCrash.msg8= (後で「最近閉じたウィンドウ」のメニューから復元することもできます) sm.afterCrash.msg9= クラッシュ時に保存されたセッションは空です! sm.afterCrash.msg10= セッションマネージャは復元するセッションを見つけることができませんでした sm.afterCrash.button0.label= セッションを復元 sm.afterCrash.button0.accesskey= R sm.afterCrash.button0.crashed.label= クラッシュ時に保存されたセッションから復元 sm.afterCrash.button0.crashed.accesskey= R sm.afterCrash.button1.label= 復元しない sm.afterCrash.button1.accesskey= D sm.start.title= セッションマネージャ - セッションを復元 sm.start.chkbox.label= セッションマネージャを有効にする sm.start.msg0= 起動時に読み込むセッションは空です! sm.start.msg1= 有効にすると、クラッシュ時に保存されたセッションを復元できるようになります sm.start.msg2= 起動時に読み込むセッションを探しているときにエラーが発生しました。保存されたはずの起動時に読み込むセッションが存在しません… sm.restoreError.msg0= セッションマネージャのファイルにエラーが発生しました! sm.restoreError.msg1= 復元しようとしたセッションを削除しました sm.disable.msg= Firefox はセッション復元機能を内蔵しています sm.disable.msg1= Firefox 内蔵のセッション復元機能を有効にし、Tab Mix Plusのセッションマネージャを無効にしますか? sm.disable.msg2= Tab Mix Plusのセッションマネージャを有効にし、Firefox 内蔵のセッション復元機能を無効にしますか? PK jm5~"locale/ja-JP/tabmixplus/tabmix.dtd PK jm5?i2  )locale/ja-JP/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description= タブブラウジングを強化する様々な機能を追加 tmp.merge.warning.title= マージされないタブとウィンドウを閉じる tmp.merge.warning.message= 選択されたタブはもう一方のウィンドウにマージされますが、その他のタブは現在のウィンドウと一緒に閉じられます tmp.merge.warning.checkboxLabel= マージされないタブのあるウィンドウを閉じる場合、常に警告する tmp.merge.error= ウィンドウをマージするためには、2つ以上のウィンドウが開いていなければなりません tmp.importPref.error1= 不正なファイルなためインポートできません tmp.importPref.error2= 設定のインポートに失敗しました tmp.sessionempty= ブラウザの次回起動時、「最後のセッション」が空になります droptoclose.label= 閉じたいタブをドロップ droplink.label= タブの中央にドロップするとそのタブを置き換え、タブの両サイドにドロップするとその位置に新しいタブとして読み込まれます flstOn.label= 現在のタブを閉じたとき、直前にフォーカスしていたタブにフォーカス - F9を押すと設定を変更します flstOff.label= 現在のタブを閉じたとき、右のタブにフォーカス - F9を押すと設定を変更します slideshowOn.label= タブの自動切り替え開始 - F8を押すと停止します slideshowOff.label= タブの自動切り替え停止 - F8を押すと開始します undoclosetab.clear.label= 「最近閉じたタブ」のリストをクリア undoclosetab.clear.accesskey= C restoreall.label= すべてのタブを復元 restoreall.accesskey= R session.loading.label= セッションを読み込み中 protectedtabs.closeWarning.1=保護されたタブ%Sを閉じようとしています。本当によろしいですか? protectedtabs.closeWarning.2=保護されたタブ%Sを閉じようとしています。本当によろしいですか? protectedtabs.closeWarning.3=タブ%Sを閉じようとしています、これらの中には保護されたタブ%Sがあります。本当によろしいですか? protectedtabs.closeWarningPromptMe=保護されたタブを閉じようとした場合、警告する confirm_autoreloadPostData_title=警告! confirm_autoreloadPostData=フォームデータを再送信しなければ、自動的に再読み込みできないページがあります。\n自動的に再読み込みを行うと、そのフォームが実行したオンライン購入などのアクションが繰り返されます。\n\n本当に自動的に再読み込みを行いますか? incompatible.title= Tab Mix Plus incompatible.msg0= 以下の拡張機能はTab Mix Plusに統合されているか、不整合を起こします incompatible.msg1= これらの拡張機能を無効にしますか? incompatible.msg2= 不整合を起こす拡張機能は、ブラウザの再起動後に無効にされます incompatible.button0.label= 無効 incompatible.button0.accesskey= D incompatible.button1.label= 無効にしない incompatible.button1.accesskey= O incompatible.button2.label= 無効にし再起動 incompatible.button2.accesskey= E incompatible.chkbox.label= ブラウザの起動時にこの警告を表示する tabmixoption.error.title= Tab Mix Plusエラー tabmixoption.error.msg= 一つのウィンドウにしかTab Mix Plusのオプションを適用できません PK 6 locale/it-IT/PK 6locale/it-IT/tabmixplus/PK 5  $locale/it-IT/tabmixplus/contents.rdf PK 5/ locale/it-IT/tabmixplus/misc.dtd PK 5*+locale/it-IT/tabmixplus/pref-appearance.dtd PK 5:)locale/it-IT/tabmixplus/pref-filetype.dtd PK 5t<<'locale/it-IT/tabmixplus/pref-tabmix.dtd PK 5[L022locale/it-IT/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label= Salva la lista delle schede chiuse insieme alla sessione sm.button.continue.label= Continua sm.button.continue.accesskey= C sm.askBeforSave.title= Gestione delle sessioni - Salva la sessione sm.askBeforSave.msg0= Salvare la sessione? sm.askBeforSave.msg1= In caso non si salvi la sessione, al prossimo riavvio del browser 'l'ultima sessione' sarà vuota sm.askBeforSave.button0.label= Salva la sessione sm.askBeforSave.button0.accesskey= S sm.askBeforSave.button1.label= Non salvare sm.askBeforSave.button1.accesskey= N sm.corrupted.title= Gestione delle sessioni - Database corrotto sm.corrupted.msg0= Impossibile recuperare il database dal file session.rdf poiché è corrotto sm.corrupted.msg1= Il file session.rdf verrà eliminato, e verrà salvata una copia col nome session.old nella cartella del proprio profilo sm.areYouSure.msg= Continuare? sm.canChooseStartup.msg= Si può selezionare una sessione da impostare come quella d'avvio dalla lista: sm.addtoStartup.title= Gestione delle sessioni - Aggiungi alla sessione d'avvio sm.addtoStartup.msg.windows= Si stanno per aggiungere alla sessione d'avvio le seguenti finestre: sm.addtoStartup.msg.tabs= Si stanno per aggiungere alla sessione d'avvio le seguenti schede: sm.addtoStartup.button0.label= Aggiungi alla sessione sm.addtoStartup.button0.accesskey= A sm.addtoStartup.button1.label= Non aggiungere sm.addtoStartup.button1.accesskey= N sm.replaceStartup.title= Gestione delle sessioni - Sovrascrivi la sessione d'avvio sm.replaceStartup.msg= Si sta per sovrascrivere la sessione d'avvio: sm.replaceStartup.button0.label= Sovrascrivi la sessione sm.replaceStartup.button0.accesskey= r sm.replaceStartup.button1.label= Non sovrascrivere sm.replaceStartup.button1.accesskey= N sm.removeStartup.title= Gestione delle sessioni - Elimina la sessione d'avvio sm.removeStartup.msg0= Si sta per eliminare la sessione d'avvio: sm.removeStartup.msg1= Seleziona una sessione da impostare come quella d'avvio dalla lista: sm.removeStartup.button0.label= Elimina la sessione d'avvio sm.removeStartup.button0.accesskey= E sm.removeStartup.button1.label= Non eliminare sm.removeStartup.button1.accesskey= T sm.title= Gestione delle sessioni sm.dontSaveBlank.msg= La gestione delle sessioni non salva finestre vuote sm.sessoinSave.error= Errore nella gestione delle sessioni, la sessione non è stata salvata sm.sessionName.title.rename= Gestione delle sessioni - Rinomina la sessione sm.sessionName.title.saveprevious= Gestione delle sessioni - Salva la sessione sm.sessionName.title.savethiswindow= Gestione delle sessioni - Salva questa finestra sm.sessionName.title.saveallwindows= Gestione delle sessioni - Salva tutte le finestre sm.sessionName.msg0= Inserisci il nome della sessione: sm.sessionName.msg1= Il nome deve contenere almeno una lettera o un numero sm.sessionName.msg2= Il nome è già in uso! sm.sessionName.msg3= Sovrascrivere la sessione? sm.sessionName.button0.label= Rinomima la sessione sm.sessionName.button0.accesskey= R sm.sessionName.button1.label= Non rinominare sm.sessionName.button1.accesskey= N sm.session.empty= vuoto sm.session.tabs= S sm.session.windows= F sm.removeAll.title.session= Gestione delle sessioni - Elimina tutte le sessioni salvate sm.removeAll.title.closedwindow= Gestione delle sessioni - Elimina tutte le finestre chiuse sm.removeAll.msg0= Eliminare tutte le sessioni salvate? sm.removeAll.msg1= Selezionando 'Elimina' la sessione d'avvio sarà 'l'ultima sessione' sm.removeAll.msg2= Eliminare tutte le finestre chiuse? sm.sessionMenu.last= Ultima sessione sm.sessionMenu.lastDefault= Ultima sessione - Predefinita sm.sessionMenu.lastgood= Ultima sessione valida sm.sessionMenu.previous= Penultima sm.sessionMenu.crashed= Sessione chiusa in modo inaspettato sm.afterCrash.title= Gestione delle sessioni - Ripristina dopo un crash sm.afterCrash.chkbox.label= Attiva la gestione delle sessioni sm.afterCrash.msg0= L'ultima sessione si è chiusa in modo inaspettato! sm.afterCrash.msg0.again= L'ultima sessione chiusasi in modo inaspettato si è richiusa in modo inaspettato! sm.afterCrash.msg1= Seleziona una sessione da ripristinare dalla lista: sm.afterCrash.msg2= Indica come continuare sm.afterCrash.msg3= La gestione delle sessioni è attualmente disattivata. Se la si attiva si potranno ripristinare le sessioni chiuse in modo inaspettato, quelle chiuse e quelle salvate, e le finestre chiuse dal menu della Gestione delle sessioni sm.afterCrash.msg4= Si può ripristinare la sessione chiusa in modo inaspettato anche in un secondo momento dal menu della Gestione delle sessioni sm.afterCrash.msg5= ma nulla è stato salvato sm.afterCrash.msg6= ma non c'è alcuna finestra aperta nelle sessioni chiuse in modo inaspettato sm.afterCrash.msg7= Seleziona la finestra da ripristinare dalla lista delle finestre chiuse sm.afterCrash.msg8= (si possono ripristinare le finestre chiuse anche in un secondo momento dal menu delle finestre chiuse) sm.afterCrash.msg9= La sessione chiusa in modo inaspettato è vuota! sm.afterCrash.msg10= La gestione delle sessioni non ha trovato alcuna sessione da ripristinare sm.afterCrash.button0.label= Ripristina la sessione sm.afterCrash.button0.accesskey= R sm.afterCrash.button0.crashed.label= Ripristina la sessione chiusa in modo inaspettato sm.afterCrash.button0.crashed.accesskey= i sm.afterCrash.button1.label= Non ripristinare sm.afterCrash.button1.accesskey= N sm.start.title= Gestione delle sessioni - Ripristina la sessione sm.start.chkbox.label= Attiva la gestione delle sessioni sm.start.msg0= La sessione d'avvio è vuota! sm.start.msg1= Il ripristino dopo crash è attualmente disattivata. Se la si attiva si potranno ripristinare le sessioni chiuse in modo inaspettato sm.start.msg2= Errore durante la ricerca della sessione d'avvio. La sessione d'avvio non esiste... sm.restoreError.msg0= Errore nel file della gestione delle sessioni! sm.restoreError.msg1= Eliminare la sessione che si è provato a ripristinare sm.disable.msg= In Firefox è stato aggiunto il ripristino delle sessioni integrato sm.disable.msg1= Attivare il ripristino delle sessioni integrato e disattivare la gestione delle sessioni di Tab Mix Plus? sm.disable.msg2= Attivare la gestione delle sessioni di Tab Mix Plus e disattivare il ripristino delle sessioni integrato? PK 5$55"locale/it-IT/tabmixplus/tabmix.dtd PK 5|D6 )locale/it-IT/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description=Permette la navigazione a schede con una marcia in più tmp.merge.warning.title=Chiusura finestra con schede non ancora incorporate tmp.merge.warning.message=Le schede selezionate verranno incorporate in un'altra finestra; ma quelle non selezionate verranno chiuse insieme alla finestra attuale tmp.merge.warning.checkboxLabel=Avvisa sempre quando si chiude una finestra con schede non ancora incorporate tmp.merge.error= Debbono essere aperte almeno 2 finestre prima di e per poterle incorporare! tmp.importPref.error1=Impossibile importare, file non valido tmp.importPref.error2=Importazione delle impostazioni non riuscita tmp.sessionempty=Al prossimo avvio del browser, 'l'ultima sessione' sarà vuota droptoclose.label=Rilascia una scheda per chiuderla droplink.label=Rilascia link al centro per aprirlo nella stessa scheda, ai lati per aprirne nuove flstOn.label=Porta in primo piano l'ultima scheda flstOff.label=Porta in primo piano la scheda a destra slideshowOn.label=Rotazione delle schede avviata slideshowOff.label=Rotazione delle schede fermata undoclosetab.clear.label= Svuota lista schede chiuse undoclosetab.clear.accesskey= C restoreall.label= Riapri tutte le schede restoreall.accesskey= R session.loading.label=Gestione delle sezioni in caricamento protectedtabs.closeWarning.1=Si sta per chiudere %S scheda protetta. Continuare? protectedtabs.closeWarning.2=Si stanno per chiudere %S schede protette. Continuare? protectedtabs.closeWarning.3=Si stanno per chiudere %S schede aperte, di cui %S sono protette. Continuare? protectedtabs.closeWarningPromptMe=Avvisa quando di chiudono schede protette confirm_autoreloadPostData_title=Attenzione! confirm_autoreloadPostData=La pagina che si sta per ricaricare contiene POSTDATA\nSe si ricarica la pagina, qualsiasi azione il modello abbia effettuato (come una ricerca o un acquisto in linea) verrà ripetuta!\n\nAttivare comunque Auto Reload? incompatible.title= Tab Mix Plus incompatible.msg0= Le seguenti estensioni sono già incorporate oppure sono incompatibili con Tab Mix Plus incompatible.msg1= Disattivare queste estensioni? incompatible.msg2= Le estensioni incompatibili verranno disattivate dopo il riavvio del browser incompatible.button0.label= Disattiva incompatible.button0.accesskey= D incompatible.button1.label= Non disattivare incompatible.button1.accesskey= O incompatible.button2.label= Disattiva e riavvia incompatible.button2.accesskey= E incompatible.chkbox.label= Mostra questo avviso all'avvio del browser tabmixoption.error.title= Errore di Tab Mix Plus tabmixoption.error.msg= È necessario avere una finestra del browser aperta per utilizzare le impostazioni di Tab Mix Plus PK 6 locale/hu-HU/PK 6locale/hu-HU/tabmixplus/PK jm5)  $locale/hu-HU/tabmixplus/contents.rdf PK N5g2 locale/hu-HU/tabmixplus/misc.dtd PK jm5q+locale/hu-HU/tabmixplus/pref-appearance.dtd PK jm5DK)locale/hu-HU/tabmixplus/pref-filetype.dtd PK jm50 B9B9'locale/hu-HU/tabmixplus/pref-tabmix.dtd PK jm5^2locale/hu-HU/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label=Bezárt lapok listájának mentése a munkamenettel sm.button.continue.label=Folytatás sm.button.continue.accesskey=F sm.askBeforSave.title=Munkamenet-kezelő - Munkamenet mentés sm.askBeforSave.msg0=Menteni kívánja a jelenlegi munkamenetet? sm.askBeforSave.msg1=Ha nem menti el, akkor a böngésző következő indításakor az "Utolsó munkamenet" bejegyzés üres lesz. sm.askBeforSave.button0.label=Munkamenet mentés sm.askBeforSave.button0.accesskey=m sm.askBeforSave.button1.label=Ne mentse sm.askBeforSave.button1.accesskey=N sm.corrupted.title=Munkamenet-kezelő - Hibás adatbázis sm.corrupted.msg0=Munkamenet-kezelő nem tudja betölteni az adatokat, mert a session.rdf adatbázisfájl hibás. sm.corrupted.msg1=A session.rdf fájl törlésre kerül. Egy biztonsági másolatot session.old néven a Profiljában talál. sm.areYouSure.msg=Valóban folytatni akarja? sm.canChooseStartup.msg=Választhat egy munkamenetet, ami az Ön indítási munkamenete lesz: sm.addtoStartup.title=Munkamenet-kezelő - Indítási munkamenet hozzáadása sm.addtoStartup.msg.windows=Ablakok hozzáadása az Indítási munkamenethez: sm.addtoStartup.msg.tabs=Lapok hozzáadása az Indítási munkamenethez: sm.addtoStartup.button0.label=Hozzáadás a munkamenethez sm.addtoStartup.button0.accesskey=H sm.addtoStartup.button1.label=Ne adja hozzá sm.addtoStartup.button1.accesskey=N sm.replaceStartup.title=Munkamenet-kezelő - Indítási munkamenetek felülbírálása sm.replaceStartup.msg=Munkamenet lecserélése a következőre: sm.replaceStartup.button0.label=Munkamenet lecserélése sm.replaceStartup.button0.accesskey=l sm.replaceStartup.button1.label=Ne cserélje le sm.replaceStartup.button1.accesskey=N sm.removeStartup.title=Munkamenet-kezelő - Indítási munkamenet törlése sm.removeStartup.msg0=Indítási munkamenet törlése: sm.removeStartup.msg1=Válasszon egy munkamenetet új Indítási munkamenetnek: sm.removeStartup.button0.label=Törlés sm.removeStartup.button0.accesskey=T sm.removeStartup.button1.label=Ne törölje sm.removeStartup.button1.accesskey=N sm.title=Munkamenet-kezelő sm.dontSaveBlank.msg=Munkamenet-kezelő nem ment el üres ablakokat sm.sessoinSave.error=Hiba a Munkamenet-kezelőben! A munkamenet nem menthető el. sm.sessionName.title.rename=Munkamenet-kezelő - Munkamenet átnevezése sm.sessionName.title.saveprevious=Munkamenet-kezelő - Munkamenet mentése sm.sessionName.title.savethiswindow=Munkamenet-kezelő - Aktuális ablak mentése sm.sessionName.title.saveallwindows=Munkamenet-kezelő - Összes ablak mentése sm.sessionName.msg0=Munkamenet név: sm.sessionName.msg1=A névnek legalább egy számot vagy betűt kell tartalmaznia. sm.sessionName.msg2=Ez a név már használatban van! sm.sessionName.msg3=Valóban le kívánja cserélni a munkamenetet? sm.sessionName.button0.label=Munkamenet átnevezése sm.sessionName.button0.accesskey=v sm.sessionName.button1.label=Ne nevezze át sm.sessionName.button1.accesskey=N sm.session.empty=üres sm.session.tabs=T sm.session.windows=W sm.removeAll.title.session=Munkamenet-kezelő - Összes mentett munkamenet törlése sm.removeAll.title.closedwindow=Munkamenet-kezelő - Összes Bezárt ablak törlése sm.removeAll.msg0=Valóban törölni kívánja az összes mentett munkamenetet? sm.removeAll.msg1=A 'Törlés'-t választva az Indítási munkamenet lesz az 'Utolsó munkamenet'. sm.removeAll.msg2=Valóban törölni kívánja az összes bezárt ablakot? sm.sessionMenu.last=Utolsó munkamenet sm.sessionMenu.lastDefault=Utolsó munkamenet - Alapértelmezett sm.sessionMenu.lastgood=Utolsó jó munkamenet sm.sessionMenu.previous=Előzőtől az utolsóig sm.sessionMenu.crashed=Hibával végződő munkamenetek sm.afterCrash.title=Munkamenet-kezelő - Visszaállítás hiba után sm.afterCrash.chkbox.label=Munkamenet-kezelő engedélyezése sm.afterCrash.msg0=Az utolsó munkamenet hibával végződött! sm.afterCrash.msg0.again=Az utolsó hibával végződött munkamenet ismét hibával végződött! sm.afterCrash.msg1=Válasszon egy visszaállítandó munkamenetet: sm.afterCrash.msg2=Válassza ki a folytatást sm.afterCrash.msg3=A Munkamenet-kezelő jelenleg nem engedélyezett. A Munkamenet-kezelő engedélyezésével lehetőség van a hibát okozó, bezárt, mentett munkamenetek és mentett ablakok visszaállítására a Munkamenet-kezelő menüből. sm.afterCrash.msg4=(Továbbá visszaállíthatja a hibát okozó munkamenetet később a Munkamenet-kezelő menüből) sm.afterCrash.msg5=de semmi sem került mentésre. sm.afterCrash.msg6=de nincsen egyetlen nyitott ablak sem a Hibát okozó munkamenetben sm.afterCrash.msg7=Válasszon egy visszaállítandó ablakot a Bezárt ablakok listájából sm.afterCrash.msg8=(Továbbá visszaállíthatja a bezárt ablakokat később, a Bezárt ablakok menüből) sm.afterCrash.msg9=A Hibát okozó munkamenetek listája üres! sm.afterCrash.msg10=A Munkamenet-kezelő nem talál egyetlen visszaállítható munkamenetet sem. sm.afterCrash.button0.label=Munkamenet visszaállítása sm.afterCrash.button0.accesskey=v sm.afterCrash.button0.crashed.label=Hibát okozó munkamenet visszaállítása sm.afterCrash.button0.crashed.accesskey=H sm.afterCrash.button1.label=Ne állítsa vissza sm.afterCrash.button1.accesskey=N sm.start.title=Munkamenet-kezelő - Munkamenet visszaállítása sm.start.chkbox.label=Munkamenet-kezelő engedélyezése sm.start.msg0=Az Indítási munkamenet üres! sm.start.msg1=A Hiba helyreállítása szolgáltatás nem engedélyezett. Hiba helyreállítása szolgáltatás engedélyezésével lehetősége van, hogy a hibát okozó munkameneteket visszaállítsa. sm.start.msg2=Hiba az Indítási munkamenet visszaállításakor! Az Indítási munkamenet nem létezik. sm.restoreError.msg0=Hiba a Munkamenet-kezelő adatfájlban! sm.restoreError.msg1=A betöltésre szánt hibás munkamenet eltávolítása sm.disable.msg=A Firefox beépített Munkamenet visszaállítás funkcióval rendelkezik. sm.disable.msg1=Engedélyezni kívánja a beépített Munkamenet visszaállítás funkciót és letiltja a TabMix Munkamenet-kezelőjét? sm.disable.msg2=Engedélyezni kívánja a TabMix Munkamenet-kezelőjét és letiltja a beépített Munkamenet visszaállítás funkciót? PK jm5`b,,"locale/hu-HU/tabmixplus/tabmix.dtd PK jm5<D D )locale/hu-HU/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description=Jelentősen továbbfejlesztett bögészőlap-kezelés. tmp.merge.warning.title=Nem összefűzött lapokat tartalmazó ablakok bezárása tmp.merge.warning.message=A kiválasztott lapok össze lesznek fűzve gey másik ablakkal, de a többi lap be lesz zárva az aktuális ablakkal. tmp.merge.warning.checkboxLabel=Mindig figyelmeztessen nem összefűzött lapokat tartalmazó ablakok bezárása esetén tmp.merge.error=Legalább két ablaknak kell megnyitva lennie az összefűzéshez tmp.importPref.error1=Nem importálható, mert a megadott fájl érvénytelen. tmp.importPref.error2=A beállítások importálása nem sikerült. tmp.sessionempty=Következő indításkor a "Utolsó munkamenet" üres lesz droptoclose.label=Bezáráshoz ejtse a lapot az állapotsorra droplink.label=Ejtse a közepére a lap lecseréléséhez vagy ejtse a szélére új lap létrehozásához flstOn.label=Lap fókusz az előző lapra flstOff.label=Lap fókusz jobb oldalra slideshowOn.label=Lap körkapcsolás bekapcsolva slideshowOff.label=Lap körkapcsolás kikapcsolva undoclosetab.clear.label=Bezárt lapok listájának törlése undoclosetab.clear.accesskey=B restoreall.label=Minden lap visszaállítása restoreall.accesskey=v session.loading.label=Munkamenet-kezelő indítása protectedtabs.closeWarning.1=Valóban be kívánja zárni a következő védett lapot: %S? protectedtabs.closeWarning.2=Valóban be kívánja zárni a következő védett lapokat: %S? protectedtabs.closeWarning.3=Valóban be kívánja zárni a következő védett lapokat: %S, amelyből %S védett? protectedtabs.closeWarningPromptMe=Figyelmeztetés védett lapok bezárása esetén confirm_autoreloadPostData_title=Figyelmeztetés! confirm_autoreloadPostData=Az automatikus újratöltés funkciót olyan oldalon engedélyezte, amelyen űrlap adatküldés van.\nHa az automatikus újratöltést engedélyezi űrlapokon (pédául: internetes vásárlás), akkor az űrlapok elküldése is ismétlődik.\n\nValóban engedélyezi az automatikus újratöltés funkciót? incompatible.title=Tab Mix Plus incompatible.msg0=A következő Kiterjesztések beépítésre kerültek vagy nem kompatibilisek a TabMix Plus-szal. incompatible.msg1=Le kívánja tiltani ezeket a Kiterjesztéseket? incompatible.msg2=A nem kompatibilis Kiterjesztések letiltásra kerülnek a böngésző újraindítása után. incompatible.button0.label=Letiltás incompatible.button0.accesskey=L incompatible.button1.label=Ne tiltsa le incompatible.button1.accesskey=N incompatible.button2.label=Letiltás és újraindítás incompatible.button2.accesskey=L incompatible.chkbox.label=Ez a figyelmeztetés jelenjen meg a böngésző indításakor tabmixoption.error.title=TabMix hiba tabmixoption.error.msg=Csak egy böngészőablak esetén választhatja ki a TabMix Beállításokat PK 6 locale/hr-HR/PK 6locale/hr-HR/tabmixplus/PK G57  $locale/hr-HR/tabmixplus/contents.rdf PK 5 locale/hr-HR/tabmixplus/misc.dtd PK G5`+locale/hr-HR/tabmixplus/pref-appearance.dtd PK G5')locale/hr-HR/tabmixplus/pref-filetype.dtd PK G5t6t6'locale/hr-HR/tabmixplus/pref-tabmix.dtd PK G5y2locale/hr-HR/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label= Spremi popis zatvorenih kartica u ovoj Prijavi sm.button.continue.label= Nastavi sm.button.continue.accesskey= N sm.askBeforSave.title= Upravitelj prijavama - Spremi Prijavu sm.askBeforSave.msg0= Želite li snimiti Vašu Prijavu? sm.askBeforSave.msg1= Ako ne snimite, slijedeći put kada pokrenete preglednik 'Posljednja Prijava' će biti prazna. sm.askBeforSave.button0.label= Spremi Prijavu sm.askBeforSave.button0.accesskey= S sm.askBeforSave.button1.label= Nemoj spremiti sm.askBeforSave.button1.accesskey= m sm.corrupted.title= Upravitelj prijavama - Oštećena baza podataka sm.corrupted.msg0= Upravitelj prijavama ne može učitati svoju bazu podataka iz oštećene datoteke session.rdf. sm.corrupted.msg1= Datoteka session.rdf će biti obrisana, kopija se nalazi u datoteci session.old u Vašem profilu. sm.areYouSure.msg= Sigurni ste da želite nastaviti? sm.canChooseStartup.msg= Iz popisa možete izabrati Prijavu za koju želite da bude početna: sm.addtoStartup.title= Upravitelj Prijavama - Dodaj u Početnu Prijavu sm.addtoStartup.msg.windows= Dodat ćete prozor(e) u Vašu Početnu Prijavu: sm.addtoStartup.msg.tabs= Dodat ćete karticu(e) u Vašu Početnu Prijavu: sm.addtoStartup.button0.label= Dodaj u Prijavu sm.addtoStartup.button0.accesskey= D sm.addtoStartup.button1.label= Nemoj dodati sm.addtoStartup.button1.accesskey= m sm.replaceStartup.title= Upravitelj Prijavama - Premosti Početnu Prijavu sm.replaceStartup.msg= Zamijenit ćete Vašu Početnu Prijavu: sm.replaceStartup.button0.label= Zamijeni Prijavu sm.replaceStartup.button0.accesskey= Z sm.replaceStartup.button1.label= Nemoj zamijeniti sm.replaceStartup.button1.accesskey= m sm.removeStartup.title= Upravitelj prijavama - Obriši Početnu Prijavu sm.removeStartup.msg0= Obrisat ćete Vašu Početnu Prijavu: sm.removeStartup.msg1= Izaberite prijavu koja će biti Vaša nova Početna Prijava: sm.removeStartup.button0.label= Obriši sm.removeStartup.button0.accesskey= O sm.removeStartup.button1.label= Nemoj obrisati sm.removeStartup.button1.accesskey= b sm.title= Upravitelj Prijavama sm.dontSaveBlank.msg= Upravitelj Prijavama ne može spremiti prazne prozore sm.sessoinSave.error= Greška u Upravitelju Prijavama, Prijava nije sačuvana sm.sessionName.title.rename= Upravitelj Prijavama - Preimenuj Prijavu sm.sessionName.title.saveprevious= Upravitelj Prijavama - Spremi prijavu sm.sessionName.title.savethiswindow= Upravitelj Prijavama - Spremi ovaj prozor sm.sessionName.title.saveallwindows= Upravitelj Prijavama - Spremi sve prozore sm.sessionName.msg0= Unesi ime Prijave: sm.sessionName.msg1= Ime mora biti najmanje jedno slovo ili broj. sm.sessionName.msg2= Ovo ime se već koristi! sm.sessionName.msg3= Sigurni ste da želite zamijeniti Prijavu? sm.sessionName.button0.label= Preimenuj Prijavu sm.sessionName.button0.accesskey= r sm.sessionName.button1.label= Nemoj preimenovati sm.sessionName.button1.accesskey= m sm.session.empty= Prazno sm.session.tabs= n sm.session.windows= P sm.removeAll.title.session= Upravitelj Prijavama - Obriši sve Sačuvane Prijave sm.removeAll.title.closedwindow= Upravitelj Prijavama - Obriši sve zatvorene prozore sm.removeAll.msg0= Sigurni ste da želite obrisati sve Vaše Spremljene Prijave? sm.removeAll.msg1= Ako izaberete 'Obriši' Vaša Početna Prijava će biti 'Poslijednja Prijava'. sm.removeAll.msg2= Sigurni ste da želite obrisati sve Vaše zatvorene prozore? sm.sessionMenu.last= Posljednja Prijava sm.sessionMenu.lastDefault= Posljednja Prijava - Zadana sm.sessionMenu.lastgood= Posljednja ispravna Prijava sm.sessionMenu.previous= Predposljednja sm.sessionMenu.crashed= Srušena Prijava sm.afterCrash.title= Upravitelj Prijavama - Vrati nakon rušenja sm.afterCrash.chkbox.label= Omoguči Upravitelja Prijavama sm.afterCrash.msg0= Vaša se Zadnja Prijava srušila! sm.afterCrash.msg0.again= Vaša se Zadnja Prijava ponovno srušila! sm.afterCrash.msg1= Izaberite sa liste Prijavu koju želite vratiti: sm.afterCrash.msg2= Izaberite kako nastaviti sm.afterCrash.msg3= Upravitelj Prijavama je trenutno onemogućen, ako omogućite Upravitelja Prijavama, bit ćete u mogućnosti iz izbornika Upravitelja Prijavama vratiti srušene Prijave, zatvorene Prijave, spremljene Prijave i zatvorene prozore. sm.afterCrash.msg4= Također, srušenu Prijavu možete vratiti i kasnije kroz izbornik Upravitelja Prijavama. sm.afterCrash.msg5= ali ništa nije spremljeno. sm.afterCrash.msg6= ali nema niti jednog otvorenog prozora u Vašim Srušenim Prijavama sm.afterCrash.msg7= Izaberite prozor koji želite vratiti iz popisa Zatvorenih prozora sm.afterCrash.msg8= (zatvorene prozore možete također vratiti i kasnije iz izbornika Zatvoreni prozori) sm.afterCrash.msg9= Vaše Srušene Prijave su prazne! sm.afterCrash.msg10= Upravitelj Prijavama nije našao niti jednu Prijavu koju bi vratio. sm.afterCrash.button0.label= Vrati Prijavu sm.afterCrash.button0.accesskey= r sm.afterCrash.button0.crashed.label= Vrati srušenu prijavu sm.afterCrash.button0.crashed.accesskey= r sm.afterCrash.button1.label= Nemoj vratiti sm.afterCrash.button1.accesskey= m sm.start.title= Upravitelj Prijavama - Vrati Prijavu sm.start.chkbox.label= Omogući Upravitelja Prijavama sm.start.msg0= Vaša Početna Prijava je prazna! sm.start.msg1= Vraćanje nakon rušenja je trenutno onemogućeno, ako omogućite Vraćanje nakon rušenja, bit ćete u mogućnosti vratiti srušene Prijave. sm.start.msg2= Greška prilikom traženja Vaše početne Prijave, Vaša spremljena početna Prijava ne postoji.. sm.restoreError.msg0= Greška u datoteci Upravitelja Prijavama! sm.restoreError.msg1= Obriši Prijavu koju ste pokušali vratiti sm.disable.msg= Firefox ima ugrađenu osobinu vraćanj Prijava. sm.disable.msg1= Želite li omogućiti ugrađeno vraćanje Prijava i onemogućiti TabMix Upravitelja Prijavama? sm.disable.msg2= Želite li omogućiti TabMix Upravitelj Prijavama i onemogućiti ugrađeno vražanje Prijava? PK G5 "locale/hr-HR/tabmixplus/tabmix.dtd PK G5/ )locale/hr-HR/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description= Surfanje s karticama uz dodatna pojačanja. tmp.merge.warning.title= Zatvaranje prozora s nespojenim karticama tmp.merge.warning.message= Odabrane kartice će biti spojene s drugim prozorom, no ostale će kartice biti zatvorene s trenutnim prozorom. tmp.merge.warning.checkboxLabel= Uvijek me upozori kada se zatvara prozor s karticama koje neće biti spojene. tmp.merge.error= Moraju biti otvorena najmanje 2 prozora prije nego li ih možete spojiti tmp.importPref.error1= Ne može se uvesti jer nije valjana datoteka. tmp.importPref.error2= Neuspjelo uvoženje postavki. tmp.sessionempty= Slijedeći put prilikom pokretanja preglednika, 'Posljednja Prijava' će biti prazna. droptoclose.label= Ispustite karticu da biste je zatvorili droplink.label= Ispustite u centru da bi se zamijenila kartica ili na rubu da bi se napravila nova kartica flstOn.label= Fokusiranje kartica prema zadnje odabranoj - Pritisnite F9 da biste zamijenili postavke flstOff.label= Fokusiranje kartica udesno - Pritisnite F9 da biste zamijenili postavke slideshowOn.label= Rotacija kartica je uključena - Pritisnite F8 da biste je isključili slideshowOff.label= Rotacija kartica je isključena undoclosetab.clear.label= Očisti popis zatvorenih kartica undoclosetab.clear.accesskey= č restoreall.label= Vrati sve kartice restoreall.accesskey= r session.loading.label= Učitava se Upravitelj prijavama protectedtabs.closeWarning.1=Zatvorit ćete %S zaštićenu karticu. Sigurni ste da želite nastaviti? protectedtabs.closeWarning.2=Zatvorit ćete %S zaštičene kartice. Sigurni ste da želite nastaviti? protectedtabs.closeWarning.3=Zatvorit ćete %S kartica, %S od njih su zaštićene. Sigurni ste da želite nastaviti? protectedtabs.closeWarningPromptMe=Upozori me kada pokušam zatvoriti zaštićene kartice confirm_autoreloadPostData_title=Upozorenje! confirm_autoreloadPostData=Stranica na kojoj ste pokušali omogućiti Automatsko ponovno učitavanje sadrži POSTDATA.\nAko omogućite Automatsko ponovno učutavanje, svaka akcija koju izvodi ta forma (kao što je mrežna kupovina) če biti ponovljena.\n\nSigurni ste da želite omogućiti Automatsko ponovno učitavanje? incompatible.title= Tab Mix Plus incompatible.msg0= Slijedeća proširenja su uključena ili nisu kompaktibilna s Tab Mix Plus. incompatible.msg1= Želite li onemogućiti ta proširenja? incompatible.msg2= Nekompaktibilna proširenja će biti onemogućena nakon što ponovno pokrenete Vaš preglednik. incompatible.button0.label= Onemogući incompatible.button0.accesskey= m incompatible.button1.label= Nemoj onemogućiti incompatible.button1.accesskey= N incompatible.button2.label= Onemogući i Ponovno pokreni incompatible.button2.accesskey= e incompatible.chkbox.label= Prikaži ovo upozorenje prilikom pokretanja preglednika tabmixoption.error.title= Tabmix greška tabmixoption.error.msg= Morate imati jedan prozor preglednika da biste koristili TabMix Opcije PK 6 locale/fr-FR/PK 6locale/fr-FR/tabmixplus/PK jm5L3]  $locale/fr-FR/tabmixplus/contents.rdf PK L5B locale/fr-FR/tabmixplus/misc.dtd PK jm5%X7+locale/fr-FR/tabmixplus/pref-appearance.dtd PK jm5_d>)locale/fr-FR/tabmixplus/pref-filetype.dtd PK jm5t6@<@<'locale/fr-FR/tabmixplus/pref-tabmix.dtd PK jm5ʪnn2locale/fr-FR/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label=Enregistrer la liste des onglets fermés dans cette session sm.button.continue.label=Continuer sm.button.continue.accesskey=C sm.askBeforSave.title=Gestionnaire de sessions - Enregistrer la session sm.askBeforSave.msg0=Voulez-vous enregistrer votre session ? sm.askBeforSave.msg1=Si vous n'enregistrez pas, au prochain démarrage la 'Dernière session' sera vide. sm.askBeforSave.button0.label=Enregistrer la session sm.askBeforSave.button0.accesskey=E sm.askBeforSave.button1.label=Ne pas enregistrer sm.askBeforSave.button1.accesskey=N sm.corrupted.title=Gestionnaire de sessions - Base de données corrompue sm.corrupted.msg0=Le gestionnaire de sessions ne peut pas charger sa base de données depuis un fichier session.rdf corrompu. sm.corrupted.msg1=Le fichier session.rdf sera effacé, une copie session.old se trouve dans votre profil. sm.areYouSure.msg=Voulez-vous vraiment continuer ? sm.canChooseStartup.msg=Vous pouvez choisir une session de la liste qui sera votre nouvelle session de démarrage : sm.addtoStartup.title=Gestionnaire de sessions - Ajouter à la session de démarrage sm.addtoStartup.msg.windows=Vous êtes sur le point d'ajouter les fenêtres suivantes à votre session de démarrage : sm.addtoStartup.msg.tabs=Vous êtes sur le point d'ajouter les onglets suivants à votre session de démarrage : sm.addtoStartup.button0.label=Ajouter à la session sm.addtoStartup.button0.accesskey=A sm.addtoStartup.button1.label=Ne pas ajouter sm.addtoStartup.button1.accesskey=N sm.replaceStartup.title=Gestionnaire de sessions - Écraser la session de démarrage sm.replaceStartup.msg=Vous êtes sur le point de remplacer votre session de démarrage : sm.replaceStartup.button0.label=Remplacer la session sm.replaceStartup.button0.accesskey=R sm.replaceStartup.button1.label=Ne pas remplacer sm.replaceStartup.button1.accesskey=N sm.removeStartup.title=Gestionnaire de sessions - Effacer la session de démarrage sm.removeStartup.msg0=Vous êtes sur le point d'effacer votre session de démarrage : sm.removeStartup.msg1=Choisissez dans la liste une session qui sera votre nouvelle session de démarrage : sm.removeStartup.button0.label=Effacer sm.removeStartup.button0.accesskey=E sm.removeStartup.button1.label=Ne pas effacer sm.removeStartup.button1.accesskey=N sm.title=Gestionnaire de sessions sm.dontSaveBlank.msg=Le gestionnaire de sessions n'enregistre pas les fenêtres vides sm.sessoinSave.error=Erreur dans le gestionnaire de session, session non enregistrée sm.sessionName.title.rename=Gestionnaire de sessions - Renommer la session sm.sessionName.title.saveprevious=Gestionnaire de sessions - Enregistrer la session sm.sessionName.title.savethiswindow=Gestionnaire de sessions - Enregistrer cette fenêtre sm.sessionName.title.saveallwindows=Gestionnaire de sessions - Enregistrer toutes les fenêtres sm.sessionName.msg0=Entrer le nom de la session : sm.sessionName.msg1=Le nom doit comporter au moins une lettre ou un nombre. sm.sessionName.msg2=Ce nom est déjà utilisé ! sm.sessionName.msg3=Voulez-vous vraiment remplacer cette session ? sm.sessionName.button0.label=Renommer la session sm.sessionName.button0.accesskey=R sm.sessionName.button1.label=Ne pas renommer sm.sessionName.button1.accesskey=N sm.session.empty=vide sm.session.tabs=T sm.session.windows=F sm.removeAll.title.session=Gestionnaire de sessions - Effacer toutes les sessions enregistrées sm.removeAll.title.closedwindow=Gestionnaire de sessions - Effacer toutes les fenêtres fermées sm.removeAll.msg0=Voulez-vous vraiment effacer toutes vos sessions enregistrées ? sm.removeAll.msg1=Si vous choisissez 'Effacer', votre session de démarrage sera la 'Dernière session'. sm.removeAll.msg2=Voulez-vous vraiment effacer toutes vos fenêtres fermées ? sm.sessionMenu.last=Dernière session sm.sessionMenu.lastDefault=Dernière session - Par défaut sm.sessionMenu.lastgood=Dernière session valide sm.sessionMenu.previous=Avant-dernière sm.sessionMenu.crashed=Session durant un crash sm.afterCrash.title=Gestionnaire de sessions - Restaurer après un crash sm.afterCrash.chkbox.label=Activer le gestionnaire de sessions sm.afterCrash.msg0=Votre dernière session a subi un crash ! sm.afterCrash.msg0.again=Votre dernière session crashée a subi de nouveau un crash ! sm.afterCrash.msg1=Choisissez une session à restaurer depuis la liste : sm.afterCrash.msg2=Choisissez comment continuer sm.afterCrash.msg3=Le gestionnaire de sessions est actuellement désactivé. Si vous activez le gestionnaire de sessions, vous pourrez restaurer des sessions crashées, fermées, enregistrées et des fenêtres fermées, depuis le menu du gestionnaire de sessions. sm.afterCrash.msg4=Vous pouvez également restaurer la session crashée par la suite depuis le menu du gestionnaire de sessions. sm.afterCrash.msg5=mais rien n'a été enregistré. sm.afterCrash.msg6=mais il n'y avait aucune fenêtre d'ouverte durant la session crashée sm.afterCrash.msg7=Choisissez une fenêtre à restaurer depuis la liste des fenêtres fermées sm.afterCrash.msg8=(vous pouvez également restaurer par la suite les fenêtres fermées depuis le menu des fenêtres fermées) sm.afterCrash.msg9=Votre session crashée est vide ! sm.afterCrash.msg10=Le gestionnaire de sessions n'a trouvé aucune session à restaurer. sm.afterCrash.button0.label=Restaurer la session sm.afterCrash.button0.accesskey=R sm.afterCrash.button0.crashed.label=Restaurer la session crashée sm.afterCrash.button0.crashed.accesskey=R sm.afterCrash.button1.label=Ne pas restaurer sm.afterCrash.button1.accesskey=N sm.start.title=Gestionnaire de sessions - Restaurer la session sm.start.chkbox.label=Activer le gestionnaire de sessions sm.start.msg0=Votre session de démarrage est vide ! sm.start.msg1=La restauration après crash est actuellement désactivée. Si vous activez la restauration après crash, vous pourrez restaurer les sessions crashées. sm.start.msg2=Erreur pendant le chargement de votre session de démarrage, elle n'existe pas. sm.restoreError.msg0=Erreur dans le fichier du gestionnaire de sessions ! sm.restoreError.msg1=Effacez la session que vous essayez de restaurer sm.disable.msg=Firefox a une fonction de restauration de sessions intégrée. sm.disable.msg1=Voulez-vous activer la restauration de sessions intégrée et désactiver le gestionnaire de sessions TabMix ? sm.disable.msg2=Voulez-vous activer le gestionnaire de sessions TabMix et désactiver la restauration de sessions intégrée ? PK jm5BK ]"locale/fr-FR/tabmixplus/tabmix.dtd PK jm5R}"G G )locale/fr-FR/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description=La navigation par onglet boostée. tmp.merge.warning.title=Fermeture d'une fenêtre comportant des onglets non fusionnés tmp.merge.warning.message=Les onglets sélectionnés seront fusionnés avec une autre fenêtre, mais les autres onglets seront fermés avec la fenêtre courante. tmp.merge.warning.checkboxLabel=Toujours m'avertir lors de la fermeture d'une fenêtre comportant des onglets non fusionnés. tmp.merge.error=Deux fenêtres au moins doivent être ouvertes avant de pouvoir les fusionner tmp.importPref.error1=Impossible d'importer, fichier non valide. tmp.importPref.error2=Échec lors de l'importation de la configuration. tmp.sessionempty=Au prochain démarrage du navigateur, la 'Dernière session' sera vide. droptoclose.label=Déposer un onglet pour le fermer droplink.label=Déposer au centre pour remplacer l'onglet, sur les côtés pour créer un nouvel onglet flstOn.label=Sélection de l'onglet précédemment sélectionné - Presser F9 pour intervertir les préférences flstOff.label=Sélection de l'onglet de droite - Presser F9 pour intervertir les préférences slideshowOn.label=Rotation des onglets activée - Presser F8 pour désactiver slideshowOff.label=Rotation des onglets désactivée - Presser F8 pour activer undoclosetab.clear.label=Effacer la liste des onglets récemment fermés undoclosetab.clear.accesskey=E restoreall.label=Restaurer tous les onglets restoreall.accesskey=R session.loading.label=Chargement du gestionnaire de sessions protectedtabs.closeWarning.1=Vous êtes sur le point de fermer %S onglet protégé. Voulez-vous vraiment continuer ? protectedtabs.closeWarning.2=Vous êtes sur le point de fermer %S onglets protégés. Voulez-vous vraiment continuer ? protectedtabs.closeWarning.3=Vous êtes sur le point de fermer %S onglets dont %S protégé(s). Voulez-vous vraiment continuer ? protectedtabs.closeWarningPromptMe=Me prévenir quand je tente de fermer des onglets protégés confirm_autoreloadPostData_title=Attention ! confirm_autoreloadPostData=La page sur laquelle vous tentez d'activer la réactualisation automatique contient des données POST.\nSi vous activez la réactualisation automatique, les contenus des champs du formulaire seront envoyés de nouveau (tel qu'un achat en ligne).\n\nVoulez-vous vraiment activer la réactualisation automatique ? incompatible.title=Tab Mix Plus incompatible.msg0=Les extensions suivantes sont intégrées ou incompatibles avec Tab Mix Plus. incompatible.msg1=Voulez-vous désactiver ces extensions ? incompatible.msg2=Les extensions incompatibles seront désactivées après le redémarrage de votre navigateur. incompatible.button0.label=Désactiver incompatible.button0.accesskey=D incompatible.button1.label=Ne pas désactiver incompatible.button1.accesskey=N incompatible.button2.label=Désactiver et redémarrer incompatible.button2.accesskey=r incompatible.chkbox.label=Afficher cette alerte quand le navigateur démarre tabmixoption.error.title=Erreur Tabmix tabmixoption.error.msg=Vous devez avoir une fenêtre de navigateur pour utiliser les options TabMix PK 6 locale/fa-IR/PK 6locale/fa-IR/tabmixplus/PK jm5b }  $locale/fa-IR/tabmixplus/contents.rdf PK J5g+;UU locale/fa-IR/tabmixplus/misc.dtd PK jm5WCv+locale/fa-IR/tabmixplus/pref-appearance.dtd PK jm5)locale/fa-IR/tabmixplus/pref-filetype.dtd PK jm5F2-C-C'locale/fa-IR/tabmixplus/pref-tabmix.dtd PK jm5~5sNgg2locale/fa-IR/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label=ذخیره لیست تب ها همراه با نشست sm.button.continue.label=ادامه sm.button.continue.accesskey=C sm.askBeforSave.title=مدیریت نشست-ذخیره نشست sm.askBeforSave.msg0=نشست ذخیره شود؟ sm.askBeforSave.msg1=اگر نشست را ذخیره نکنید در راه اندازی دوباره بخش آخرین نشست خالی خواهد بود sm.askBeforSave.button0.label=ذخیره نشست sm.askBeforSave.button0.accesskey=S sm.askBeforSave.button1.label=ذخیره نکن sm.askBeforSave.button1.accesskey=D sm.corrupted.title=مدیریت نشست-مشکل در دیتابیس sm.corrupted.msg0=Session Manager cannot load its database from corrupted session.rdf. sm.corrupted.msg1=The file session.rdf will be deleted, a copy can be found in session.old in your profile. sm.areYouSure.msg=آیا از ادامه کار اطمینان دارید؟ sm.canChooseStartup.msg=شما می توانید یک نشست را از لیست به عنوان نشست اولیه خود تعیین کنید sm.addtoStartup.title=مدیریت نشست-افزودن به نشست اولیه sm.addtoStartup.msg.windows=شما تصمیم به افزودن پنجره(ها) به نشست اولیه را دارید sm.addtoStartup.msg.tabs=شما تصمیم به افزودن تب(ها) به نشست اولیه را دارید sm.addtoStartup.button0.label=افزودن به نشست sm.addtoStartup.button0.accesskey=A sm.addtoStartup.button1.label=اضافه نکن sm.addtoStartup.button1.accesskey=D sm.replaceStartup.title=مدیریت نشست-متوقف کردن نشست اولیه sm.replaceStartup.msg=شما تصمیم دارید نشست اولیه را جایگزین کنید sm.replaceStartup.button0.label=جایگزینی نشست sm.replaceStartup.button0.accesskey=R sm.replaceStartup.button1.label=جایگزین نکن sm.replaceStartup.button1.accesskey=D sm.removeStartup.title=مدیریت نشست-پاک کردن نشست اولیه sm.removeStartup.msg0=شما تصمیم دارید نشست اولیه را پاک کنید sm.removeStartup.msg1=یک نشست را (از لیست ) بعنوان نشست اولیه تعیین کنید sm.removeStartup.button0.label=حذف sm.removeStartup.button0.accesskey=ِD sm.removeStartup.button1.label=حذف نکن sm.removeStartup.button1.accesskey=T sm.title=مدیریت نشست sm.dontSaveBlank.msg=مدیریت نشست صفحات خالی را ذخیره نمی کند sm.sessoinSave.error=خطا در مدیریت نشست،نشست ذخیره نشد sm.sessionName.title.rename=مدیریت نشست-تغییر نام نشست sm.sessionName.title.saveprevious=مدیریت نشست-ذخیره نشست sm.sessionName.title.savethiswindow=مدیریت نشست-ذخیره این پنجره sm.sessionName.title.saveallwindows=مدیریت نشست-ذخیره تمام پنجره ها sm.sessionName.msg0=نام نشست را وارد کنید sm.sessionName.msg1=نام نشست حداقل باید یک حرف یا عدد باشد sm.sessionName.msg2=قبلا از این نام استفاده شده sm.sessionName.msg3=آیا از جایگزین کردن نشست اطمینان دارید؟ sm.sessionName.button0.label=تغییر نام نشست sm.sessionName.button0.accesskey=R sm.sessionName.button1.label=نام را تغییر نده sm.sessionName.button1.accesskey=D sm.session.empty=خالی sm.session.tabs=T sm.session.windows=W sm.removeAll.title.session=مدیریت نشست-پاک کردن تمام نشست های ذخیره شده sm.removeAll.title.closedwindow=مدیریت نشست-پاک کردن لیست پنجره های بسته شده sm.removeAll.msg0=آیا از پاک کردن تمام نشست ها اطمینان دارید؟ sm.removeAll.msg1=اگر گزینه حذف را انتخاب کنید نشست اولیه آخرین نشست خواهد بود sm.removeAll.msg2=آیا از پاک کردن لیست پنجره های بسته شده اطمینان دارید؟ sm.sessionMenu.last=آخرین نشست sm.sessionMenu.lastDefault=آخرین نشست-پیشفرض sm.sessionMenu.lastgood=آخرین نشست مناسب sm.sessionMenu.previous=یکی مانده به آخر sm.sessionMenu.crashed=نشست قفل شده sm.afterCrash.title=مدیریت نشست-بازگردانی پس از قفل شدن sm.afterCrash.chkbox.label=فعال کردن مدیریت نشست sm.afterCrash.msg0=آخرین نشست شما خراب است sm.afterCrash.msg0.again=!آخرین نشست قفل شده شما دوباره قفل شد sm.afterCrash.msg1=نشستی را برای بازگردانی انتخاب کنید sm.afterCrash.msg2=روش ادامه کار را تعیین کنید sm.afterCrash.msg3=در حال حاضر مدیریت نشست غیر فعال است.در صورتی که آن را فعال کنید می توانید نشست های قفل شده،بسته شده،ذهیره شده و ... را بازگردانی کنید sm.afterCrash.msg4=شما می توانید نشست های قفل شده قبلی را نیز از منو بازگردانی کنید sm.afterCrash.msg5=چیزی ذخیره نشد sm.afterCrash.msg6=پنجره بازی در آخرین نشست قفل شده شما وجود ندارد sm.afterCrash.msg7=از لیست پنجره مورد نظر را برای بازگردانی انتخاب کنید sm.afterCrash.msg8=شما می توانید پنجره های بسته شده قبلی را نیز از منو بازگردانی کنید sm.afterCrash.msg9=نشست قفل شده شما خالی است sm.afterCrash.msg10=مدیریت نشست،نشستی را برای بازگردانی پیدا نکرد sm.afterCrash.button0.label=بازگردانی نشست sm.afterCrash.button0.accesskey=R sm.afterCrash.button0.crashed.label=بازگردانی نشست قفل شده sm.afterCrash.button0.crashed.accesskey=R sm.afterCrash.button1.label=نشست را باز گردانی نکن sm.afterCrash.button1.accesskey=D sm.start.title=مدیریت نشست-بازگردانی نشست sm.start.chkbox.label=مدیریت نشست را فعال کن sm.start.msg0=نشست اولیه شما خالی است sm.start.msg1=بازیافت نشست های قفل شده غیر فعال است در صورتی که آن را فعال کنید می توانید نشست های قفل شده را بازگردانی کنید sm.start.msg2=خطا در اجرای نشست اولیه.نشست اولیه ذخیره شده پیدا نشد sm.restoreError.msg0=خطا در فایل مدیریت نشست sm.restoreError.msg1=حذف نشستی که سعی کردید آن را بازگردانی کنید sm.disable.msg=آیا تصمیم به استفاده از این مدیر نشست دارید؟ sm.disable.msg1=.فایرفاکس از یک مدیر نشست داخلی استفاده می کند sm.disable.msg2=دارید؟ TabMix آیا تصمیم به استفاده از مدیر نشست PK jm5O\\"locale/fa-IR/tabmixplus/tabmix.dtd PK jm5&b )locale/fa-IR/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description=مدیریت قوی تب ها همراه با مدیریت نشست ها tmp.merge.warning.title=در حال بستن پنجره بدون تب های ترکیب شده tmp.merge.warning.message=تب های انتخاب شده با پنجره دیگری ترکیب خواهند شد،اما تب های دیگر با همین پنجره بسته می شوند tmp.merge.warning.checkboxLabel=همیشه هنگام بستن پنجره ای با تب های بسته نشده به من اخطار بده tmp.merge.error=حداقل دو پنجره باید باز باشند تا بتوانید آن ها را ترکیب کنید tmp.importPref.error1=نوشتن در فایل مقدور نیست زیرا این فایل مشکل دارد tmp.importPref.error2=ایمپورت تنظیمات با خطا مواجه شد tmp.sessionempty=دفعه بعد که شما مرورگر را اجرا می کنید آخرین نشست خالی خواهد بود droptoclose.label=تب را رها کنید تا بسته شود droplink.label=در وسط رها کنید تا تب جایگزین شود یا در کناره ها رها کنید تا تب جدید ایجاد شود flstOn.label=متمرکز کردن تب ها در آخرین تب انتخاب شده flstOff.label=متمرکز کردن تب ها در راست slideshowOn.label=چرخش تب روشن است slideshowOff.label=چرخش تب خاموش است undoclosetab.clear.label=پاک کردن لیست تب های بسته شده undoclosetab.clear.accesskey=C restoreall.label=بازگردانی تمام تب ها restoreall.accesskey=R session.loading.label=...مدیریت نشست در حال بارگذاری protectedtabs.closeWarning.1=تب محافظت شده دارید.ادامه؟ %S شما تصمیم به بستن protectedtabs.closeWarning.2=تب محافظت شده دارید.ادامه؟ %S شما تصمیم به بستن protectedtabs.closeWarning.3=تا از آن ها محافظت شده اند.ادامه؟ %S،تب دارید %S شما تصمیم به بستن protectedtabs.closeWarningPromptMe=هشدار هنگام بستن تب های بسته شده confirm_autoreloadPostData_title=!هشدار confirm_autoreloadPostData=\n.است POSTDATA صفحه ای که تصمیم به فعال کردن بارگذاری خودکار را برای آن دارید حاوی \nپس از بارگذاری تمام موارد موجود در فرم ها باید دوباره پر شوند \n\nآیااز فعال کردن بارگذاری خودکار برای آن مطمئن هستید؟ incompatible.title=Tab Mix Plus incompatible.msg0=.سازگار نیستند Tab Mix Plus اکستنشن های زیر با incompatible.msg1=آیا مایل به غیر فعال کردن آن ها هستید؟ incompatible.msg2=.اکستنشن های ناسازگار پس از راه اندازی مجدد فایرفاکس غیر فعال می شوند incompatible.button0.label=غیر فعال کن incompatible.button0.accesskey=D incompatible.button1.label=غیر فعال نکن incompatible.button1.accesskey=O incompatible.button2.label=غیرفعال کردن و راه اندازی مجدد incompatible.button2.accesskey=E incompatible.chkbox.label=نمایش این هشدار هنگام راه اندازی مرورگر tabmixoption.error.title=Tabmix خطای tabmixoption.error.msg=باید یک پنجره مرورگر داشته باشید TabMix برای استفاده از تنظیمات PK 6 locale/es-ES/PK 6locale/es-ES/tabmixplus/PK jm58M  $locale/es-ES/tabmixplus/contents.rdf PK H51^ locale/es-ES/tabmixplus/misc.dtd PK jm57MͰ+locale/es-ES/tabmixplus/pref-appearance.dtd PK jm57 B)locale/es-ES/tabmixplus/pref-filetype.dtd PK jm5\g77'locale/es-ES/tabmixplus/pref-tabmix.dtd PK jm5kJ2locale/es-ES/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label=Guardar lista pestañas cerradas en la sesión sm.button.continue.label=Continuar sm.button.continue.accesskey=C sm.askBeforSave.title=Administrador de sesiones - Guardar sesión sm.askBeforSave.msg0=¿Quiere guardar su sesión? sm.askBeforSave.msg1=Si no la guarda, la próxima vez que inicie el navegador la 'Última sesión' estará vacía. sm.askBeforSave.button0.label=Guardar sesión sm.askBeforSave.button0.accesskey=G sm.askBeforSave.button1.label=No guardar sm.askBeforSave.button1.accesskey=N sm.corrupted.title=Administrador de sesiones - Base de datos corrupta sm.corrupted.msg0=El Administrador de sesiones no pudo cargar su base de datos del archivo corrupto session.rdf sm.corrupted.msg1=Se eliminará el archivo session.rdf, pero se guardará una copia en su perfil como session.old sm.areYouSure.msg=¿Está seguro de querer continuar? sm.canChooseStartup.msg=Puede elegir una sesión de la lista como su nueva sesión de inicio. sm.addtoStartup.title=Administrador de sesiones - Añadir a sesión de inicio sm.addtoStartup.msg.windows=Va a añadir una(s) ventana(s) a su sesión de inicio: sm.addtoStartup.msg.tabs=Va a añadir una(s) pestaña(s) a su sesión de inicio: sm.addtoStartup.button0.label=Añadir a sesión sm.addtoStartup.button0.accesskey=A sm.addtoStartup.button1.label=No añadir sm.addtoStartup.button1.accesskey=N sm.replaceStartup.title=Administrador de sesiones - Reemplazar sesión de inicio sm.replaceStartup.msg=Va a cambiar su sesión de inicio: sm.replaceStartup.button0.label=Reemplazar sesión sm.replaceStartup.button0.accesskey=R sm.replaceStartup.button1.label=No reemplazar sm.replaceStartup.button1.accesskey=N sm.removeStartup.title=Administrador de sesiones - Eliminar sesión de inicio sm.removeStartup.msg0=Va a eliminar su sesión de inicio: sm.removeStartup.msg1=Elija una sesión de la lista como su nueva sesión de inicio: sm.removeStartup.button0.label=Eliminar sm.removeStartup.button0.accesskey=E sm.removeStartup.button1.label=No eliminar sm.removeStartup.button1.accesskey=N sm.title=Administrador de sesiones sm.dontSaveBlank.msg=El Administrador de sesiones no guarda ventanas vacías sm.sessoinSave.error=Error de Administrador de sesiones, no se guardó la sesión sm.sessionName.title.rename=Administrador de sesiones - Renombrar sesión sm.sessionName.title.saveprevious=Administrador de sesiones - Guardar sesión sm.sessionName.title.savethiswindow=Administrador de sesiones - Guardar esta ventana sm.sessionName.title.saveallwindows=Administrador de sesiones - Guardar todas las ventanas sm.sessionName.msg0=Introducir nombre sesión: sm.sessionName.msg1=Nombre debe contener al menos una letra o número. sm.sessionName.msg2=Este nombre ya está siendo utilizado sm.sessionName.msg3=¿Está seguro de querer reemplazar la sesión? sm.sessionName.button0.label=Renombrar sesión sm.sessionName.button0.accesskey=R sm.sessionName.button1.label=No renombrar sm.sessionName.button1.accesskey=D sm.session.empty=vacía sm.session.tabs=P sm.session.windows=V sm.removeAll.title.session=Administrador de sesiones - Eliminar todas las sesiones guardadas sm.removeAll.title.closedwindow=Administrador de sesiones - Eliminar todas las ventanas cerradas sm.removeAll.msg0=¿Está seguro de querer eliminar todas las sesiones guardadas? sm.removeAll.msg1=Si selecciona 'Eliminar' su sesión de inicio será la 'Última sesión'. sm.removeAll.msg2=¿Está seguro de querer eliminar todas las ventanas cerradas? sm.sessionMenu.last=Última sesión sm.sessionMenu.lastDefault=Última sesión - Predeterminada sm.sessionMenu.lastgood=Última sesión sin errores sm.sessionMenu.previous=Penúltima sm.sessionMenu.crashed=Sesión finalizada de forma anómala sm.afterCrash.title=Administrador de sesiones - Recuperación tras finalizar anómalamente sm.afterCrash.chkbox.label=Activar Administrador de sesiones sm.afterCrash.msg0=Su última sesión finalizó de forma anómala sm.afterCrash.msg0.again=¡Su última sesión finalizada anómalamente falló de nuevo! sm.afterCrash.msg1=Escoger de la lista la sesión a restaurar: sm.afterCrash.msg2=Elegir como continuar sm.afterCrash.msg3=El Administrador de sesiones está desactivado, si lo activa podrá recuperar sesiones finalizadas anómalamente, sesiones cerradas, sesiones guardadas y ventanas cerradas del menú del Administrador de sesiones sm.afterCrash.msg4=También puede recuperar más tarde la sesión finalizada de forma anómala a partir del menú del Administrador de sesiones sm.afterCrash.msg5=pero no se ha guardado nada. sm.afterCrash.msg6=pero no hay ninguna ventana abierta en la sesión que finalizó anómalamente. sm.afterCrash.msg7=Elegir ventana a recuperar en la lista de ventanas cerradas sm.afterCrash.msg8=(también puede recuperar más tarde las ventanas cerradas con el menú de ventanas cerradas) sm.afterCrash.msg9=La sesión que finalizó anómalamente está vacía! sm.afterCrash.msg10=El Administrador de sesiones no encontró ninguna sesión que restaurar. sm.afterCrash.button0.label=Restaurar sesión sm.afterCrash.button0.accesskey=R sm.afterCrash.button0.crashed.label=Restaurar sesión finalizada anómalamente sm.afterCrash.button0.crashed.accesskey=R sm.afterCrash.button1.label=No restaurar sm.afterCrash.button1.accesskey=N sm.start.title=Administrador de sesiones - Restaurar sesión sm.start.chkbox.label=Activar Administrador de sesiones sm.start.msg0=Su sesión de inicio está vacía sm.start.msg1=La función Restaurar tras cerrar de forma anómala está desactivada, si la activa podrá restaurar sesiones que terminaron incorrectamente o con problemas. sm.start.msg2=Error al buscar su sesión inicio, no existe sesión de inicio guardada. sm.restoreError.msg0=Error en archivo de Administrador de sesiones sm.restoreError.msg1=Eliminar la sesión que intentaba restaurar sm.disable.msg=Firefox tiene una funcionalidad estándard de restauración de sesión fallida. sm.disable.msg1=¿Desea habilitar la funcionalidad estándard de restauración de sesión de Firefox y deshabilitar el Administrador de sesiones de Tabmix? sm.disable.msg2=¿Quiere habilitar el Administrador de sesiones de Tabmix y deshabilitar la funcionalidad estándard de restauración de sesión de Firefox? PK jm5Xyy"locale/es-ES/tabmixplus/tabmix.dtd PK jm5@  )locale/es-ES/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description=Navegación con pestañas mejorada. tmp.merge.warning.title=Cerrar ventana con pestañas no fusionadas tmp.merge.warning.message=Las pestañas seleccionadas ser fusionarán en otra ventana, pero las restantes se cerrarán con la ventana actual. tmp.merge.warning.checkboxLabel=Avisar siempre al cerrrar una ventana con pestañas que no se han fusionado. tmp.merge.error=Tiene que haber al menos dos ventanas abiaertas para poder fusionarlas. tmp.importPref.error1=No se pudo importar por no ser un archivo válido. tmp.importPref.error2=No se pudieron importar las predisposiciones. tmp.sessionempty=La próxima vez que inicie el navegador, la 'Última sesión' estará vacía. droptoclose.label=Depositar sobre una pestaña para cerrarla droplink.label=Depositar en el centro para reemplazar pestaña o a los lados para crear una nueva flstOn.label=Poner en primer plano la última pestaña seleccionada flstOff.label=Foco pestañas a la derecha slideshowOn.label=Rotación pestañas activada slideshowOff.label=Rotación pestañas desactivada undoclosetab.clear.label=Cerrar lista de pestañas cerradas. undoclosetab.clear.accesskey=C restoreall.label=Reabrir todas las pestañas restoreall.accesskey=R session.loading.label=Cargar Administrador de sesiones protectedtabs.closeWarning.1=Va a cerrar %S pestaña protegida. ¿Está seguro de querer continuar? protectedtabs.closeWarning.2=Va a cerrar %S pestañas protegidas. ¿Está seguro de querer continuar? protectedtabs.closeWarning.3=Va a cerrar %S pestañas, de ellas %S protegidas. ¿Está seguro de querer continuar? protectedtabs.closeWarningPromptMe=Avisarme cuando intente cerrar pestañas protegidas confirm_autoreloadPostData_title=¡Atención! confirm_autoreloadPostData=La página en la que ha intentado activar la recarga automática contiene POSTDATA.\nSi activa la opción de recarga automática, cualquier acción que realice el formulario (por ejemplo, un compra online) se repetirá varias veces.\n\n¿Está seguro de querer activar la recarga automática? incompatible.title=Tab Mix Plus incompatible.msg0=Las siguientes extensiones están integradas con Tab Mix Plus o son incompatibles con ella. incompatible.msg1=¿Quiere desactivar esas extensiones? incompatible.msg2=Las extensiones incompatibles estarán desactivadas cuando reinicie su navegador. incompatible.button0.label=Desactivar incompatible.button0.accesskey=D incompatible.button1.label=No desactivar incompatible.button1.accesskey=N incompatible.button2.label=Desactivar y reiniciar incompatible.button2.accesskey=E incompatible.chkbox.label=Mostrar este aviso de alerta cuando se inicie el navegador tabmixoption.error.title=Error de Tabmix tabmixoption.error.msg=Debe tener una ventana de navegador para administrar las opciones de TabMix PK 6 locale/en-US/PK 6locale/en-US/tabmixplus/PK B4z _  $locale/en-US/tabmixplus/contents.rdf PK E59 locale/en-US/tabmixplus/misc.dtd PK H5~+locale/en-US/tabmixplus/pref-appearance.dtd PK B4û)locale/en-US/tabmixplus/pref-filetype.dtd PK t5K22'locale/en-US/tabmixplus/pref-tabmix.dtd PK Zq5޸<2locale/en-US/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label=Save closed tabs list with this session sm.button.continue.label=Continue sm.button.continue.accesskey=C sm.askBeforSave.title=Session Manager - Save Session sm.askBeforSave.msg0=Would you like to save your session? sm.askBeforSave.msg1=If you don't save, next time you start the browser the 'Last Session' will be empty. sm.askBeforSave.button0.label=Save Session sm.askBeforSave.button0.accesskey=S sm.askBeforSave.button1.label=Don't Save sm.askBeforSave.button1.accesskey=D sm.corrupted.title=Session Manager - Corrupted Database sm.corrupted.msg0=Session Manager cannot load its database from corrupted session.rdf. sm.corrupted.msg1=The file session.rdf will be deleted, a copy can be found in session.old in your profile. sm.areYouSure.msg=Are you sure you want to continue? sm.canChooseStartup.msg=You can choose a session to be your new startup session from the list: sm.addtoStartup.title=Session Manager - Add to Startup Session sm.addtoStartup.msg.windows=You are about to add window(s) to your startup session: sm.addtoStartup.msg.tabs=You are about to add tab(s) to your startup session: sm.addtoStartup.button0.label=Add to Session sm.addtoStartup.button0.accesskey=A sm.addtoStartup.button1.label=Don't Add sm.addtoStartup.button1.accesskey=D sm.replaceStartup.title=Session Manager - Override Startup Session sm.replaceStartup.msg=You are about to replace your startup session: sm.replaceStartup.button0.label=Replace Session sm.replaceStartup.button0.accesskey=R sm.replaceStartup.button1.label=Don't Replace sm.replaceStartup.button1.accesskey=D sm.removeStartup.title=Session Manager - Delete Startup Session sm.removeStartup.msg0=You are about to delete your startup session: sm.removeStartup.msg1=Choose a session to be your new startup session from the list: sm.removeStartup.button0.label=Delete sm.removeStartup.button0.accesskey=D sm.removeStartup.button1.label=Don't Delete sm.removeStartup.button1.accesskey=T sm.title=Session Manager sm.dontSaveBlank.msg=Session Manager doesn't save blank windows sm.sessoinSave.error=Error in Session Manager, session didn't save sm.sessionName.title.rename=Session Manager - Rename Session sm.sessionName.title.saveprevious=Session Manager - Save Session sm.sessionName.title.savethiswindow=Session Manager - Save This Window sm.sessionName.title.saveallwindows=Session Manager - Save All Windows sm.sessionName.msg0=Enter Session Name: sm.sessionName.msg1=Name must be at least one letter or number. sm.sessionName.msg2=This name is already in use! sm.sessionName.msg3=Are you sure you want to replace the session? sm.sessionName.button0.label=Rename Session sm.sessionName.button0.accesskey=R sm.sessionName.button1.label=Don't Rename sm.sessionName.button1.accesskey=D sm.session.empty=empty sm.session.tabs=T sm.session.windows=W sm.removeAll.title.session=Session Manager - Delete All Saved Sessions sm.removeAll.title.closedwindow=Session Manager - Delete All Closed Windows sm.removeAll.msg0=Are you sure you want to delete all your saved sessions? sm.removeAll.msg1=If you choose 'Delete' your startup session will be the 'Last Session'. sm.removeAll.msg2=Are you sure you want to delete all your closed windows? sm.sessionMenu.last=Last Session sm.sessionMenu.lastDefault=Last Session - Default sm.sessionMenu.lastgood=Last Good Session sm.sessionMenu.previous=Previous to Last sm.sessionMenu.crashed=Crashed Session sm.afterCrash.title=Session Manager - Restore after Crash sm.afterCrash.chkbox.label=Enable Session Manager sm.afterCrash.msg0=Your last session Crashed! sm.afterCrash.msg0.again=Your last Crashed session Crashed again! sm.afterCrash.msg1=Choose session to restore from the list: sm.afterCrash.msg2=Choose how to continue sm.afterCrash.msg3=Session Manager is currently disabled, if you enable Session Manager, you will be able to restore crashed sessions, closed sessions, saved sessions and closed windows from the Session Manager menu. sm.afterCrash.msg4=You can also restore the crashed session later from the Session Manager menu. sm.afterCrash.msg5=but nothing was saved. sm.afterCrash.msg6=but there isn't any open window in your Crashed session sm.afterCrash.msg7=Choose window to restore from Closed Windows list sm.afterCrash.msg8=(you can also restore closed windows later from the Closed Windows menu) sm.afterCrash.msg9=Your Crashed session is empty! sm.afterCrash.msg10=Session Manager did not find any sessions to restore from. sm.afterCrash.button0.label=Restore Session sm.afterCrash.button0.accesskey=R sm.afterCrash.button0.crashed.label=Restore Crashed Session sm.afterCrash.button0.crashed.accesskey=R sm.afterCrash.button1.label=Don't Restore sm.afterCrash.button1.accesskey=D sm.start.title=Session Manager - Restore Session sm.start.chkbox.label=Enable Crash Recovery sm.start.msg0=Your Startup session is empty! sm.start.msg1=Crash Recovery is currently disabled, if you enable Crash Recovery, you will be able to restore crashed sessions. sm.start.msg2=Error while looking for your startup session, your saved startup session does not exist.. sm.restoreError.msg0=Error in session manager file! sm.restoreError.msg1=Delete the session you tried to restore sm.disable.msg=Firefox has a built-in session restore feature. sm.disable.msg1=Would you like to enable built-in session restore and disable the TabMix Session Manager? sm.disable.msg2=Would you like to enable TabMix Session Manager and disable the built-in session restore? PK }c5?&"locale/en-US/tabmixplus/tabmix.dtd PK x5!9 )locale/en-US/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description= Tab browsing with an added boost. tmp.merge.warning.title= Closing window with non-merged tabs tmp.merge.warning.message= The selected tabs will be merged with another window, but the other tabs will now be closed with the current window. tmp.merge.warning.checkboxLabel= Always warn me when closing a window with tabs that aren't merging. tmp.merge.error = At least 2 windows have to be opened before you can merge them tmp.importPref.error1= Can not import because it is not a valid file. tmp.importPref.error2= Failed to import settings. tmp.sessionempty= Next time you start the browser, 'Last Session' will be empty. droptoclose.label= Drop a tab to close it droplink.label=Drop at the center to replace the tab or at the sides to create a new tab flstOn.label= Tabs Focus to Last Selected - Press F9 to swap preference flstOff.label= Tabs Focus to Right - Press F9 to swap preference slideshowOn.label= Tab Rotation is On - Press F8 to turn off slideshowOff.label= Tab Rotation Off - Press F8 to turn on undoclosetab.clear.label= Clear Closed Tabs List undoclosetab.clear.accesskey= C restoreall.label= Restore All Tabs restoreall.accesskey= R session.loading.label= Session Manager Loading protectedtabs.closeWarning.1=You are about to close %S protected tab. Are you sure you want to continue? protectedtabs.closeWarning.2=You are about to close %S protected tabs. Are you sure you want to continue? protectedtabs.closeWarning.3=You are about to close %S tabs, %S of them protected. Are you sure you want to continue? protectedtabs.closeWarningPromptMe=Warn me when I attempt to close protected tabs confirm_autoreloadPostData_title=Warning! confirm_autoreloadPostData=The page on which you tried to enable Auto Reload contains POSTDATA.\nIf you enable Auto Reload, any action the form carries out (such as an online purchase) will be repeated.\n\nAre you sure that you want to enable Auto Reload? incompatible.title = Tab Mix Plus incompatible.msg0 = The following extensions are integrated or incompatible with Tab Mix Plus. incompatible.msg1 = Would you like to disable these extensions? incompatible.msg2 = The incompatible extensions will be disabled after you restart your browser. incompatible.button0.label = Disable incompatible.button0.accesskey = D incompatible.button1.label = Don't Disable incompatible.button1.accesskey = O incompatible.button2.label = Disable and Restart incompatible.button2.accesskey = E incompatible.chkbox.label = Show this alert when browser starts tabmixoption.error.title = Tabmix Error tabmixoption.error.msg = You must have one browser window to use TabMix Options PK 6 locale/el-GR/PK 6locale/el-GR/tabmixplus/PK jm5##$locale/el-GR/tabmixplus/contents.rdf PK ;5·# locale/el-GR/tabmixplus/misc.dtd PK jm5w^>>+locale/el-GR/tabmixplus/pref-appearance.dtd PK jm5 &)locale/el-GR/tabmixplus/pref-filetype.dtd PK jm5E\|Q|Q'locale/el-GR/tabmixplus/pref-tabmix.dtd PK jm5::k & &2locale/el-GR/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label=Αποθήκευση της λίστας κλεισμένων καρτελών με την τρέχουσα συνεδρία sm.button.continue.label=Συνέχεια sm.button.continue.accesskey=Σ sm.askBeforSave.title=Διαχειριστής συνεδρίας - Αποθήκευση συνεδρίας sm.askBeforSave.msg0=Θέλετε να αποθηκευθεί η συνεδρία; sm.askBeforSave.msg1=Αν δεν αποθηκευθεί, την επόμενη φορά που θα ανοίξετε τον περιηγητή η «Τελευταία συνεδρία» θα είναι κενή. sm.askBeforSave.button0.label=Αποθήκευση συνεδρίας sm.askBeforSave.button0.accesskey=Α sm.askBeforSave.button1.label=Χωρίς αποθήκευση sm.askBeforSave.button1.accesskey=Δ sm.corrupted.title=Διαχειριστής συνεδρίας - Κατεστραμμένη βάση δεδομένων sm.corrupted.msg0=Ο διαχειριστής συνεδρίας δεν μπορεί να φορτώσει τα δεδομένα από το κατεστραμμένο αρχείο session.rdf. sm.corrupted.msg1=Το αρχείο session.rdf θα διαγραφεί, αντίγραφό του μπορείτε να βρείτε στο αρχείο session.old του προφίλ σας. sm.areYouSure.msg=Θέλετε να συνεχίσετε; sm.canChooseStartup.msg=Μπορείτε να επιλέξετε συνεδρία εκκίνησης από τη λίστα: sm.addtoStartup.title=Διαχειριστής συνεδρίας - Προσθήκη στη συνεδρία εκκίνησης sm.addtoStartup.msg.windows=Πρόκειται να προσθέσετε το/τα παράθυρο/α στη συνεδρία εκκίνησης: sm.addtoStartup.msg.tabs=Πρόκειται να προσθέσετε την/τις καρτέλα/ες στη συνεδρία εκκίνησης: sm.addtoStartup.button0.label=Προσθήκη στη συνεδρία sm.addtoStartup.button0.accesskey=Α sm.addtoStartup.button1.label=Να μη γίνει προσθήκη sm.addtoStartup.button1.accesskey=Φ sm.replaceStartup.title=Διαχειριστής συνεδρίας - Παράκαμψη συνεδρίας εκκίνησης sm.replaceStartup.msg=Πρόκειται να αντικαταστήσετε τη συνεδρία εκκίνησης sm.replaceStartup.button0.label=Αντικατάσταση συνεδρίας sm.replaceStartup.button0.accesskey=Α sm.replaceStartup.button1.label=Να μην αντικατασταθεί sm.replaceStartup.button1.accesskey=Μ sm.removeStartup.title=Διαχειριστής συνεδρίας - Διαγραφή συνεδρίας εκκίνησης sm.removeStartup.msg0=Πρόκειται να διαγράψετε τη συνεδρία εκκίνησης sm.removeStartup.msg1=Επιλέξτε από τη λίστα ποια συνεδρία θα φορτώνεται κατά την εκκίνηση: sm.removeStartup.button0.label=Διαγραφή sm.removeStartup.button0.accesskey=Δ sm.removeStartup.button1.label=Να μην γίνει διαγραφή sm.removeStartup.button1.accesskey=Τ sm.title=Διαχειριστής συνεδρίας sm.dontSaveBlank.msg=Ο διαχειριστής συνεδρίας δεν αποθηκεύει παράθυρα χωρίς περιεχόμενο sm.sessoinSave.error=Σφάλμα διαχειριστή συνεδρίας, η συνεδρία δεν αποθηκεύτηκε sm.sessionName.title.rename=Διαχειριστής συνεδρίας - Μετονομασία συνεδρίας sm.sessionName.title.saveprevious=Διαχειριστής συνεδρίας - Αποθήκευση συνεδρίας sm.sessionName.title.savethiswindow=Διαχειριστής συνεδρίας - Αποθήκευση αυτού του παραθύρου sm.sessionName.title.saveallwindows=Διαχειριστής συνεδρίας - Αποθήκευση όλων των παραθύρων sm.sessionName.msg0=Εισαγωγή ονόματος συνεδρίας: sm.sessionName.msg1=Το όνομα πρέπει να αποτελείται τουλάχιστον από ένα αλφαριθμητικό sm.sessionName.msg2=Το όνομα αυτό υπάρχει ήδη! sm.sessionName.msg3=Θέλετε να αντικαταστήσετε τη συνεδρία; sm.sessionName.button0.label=Μετονομασία συνεδρίας sm.sessionName.button0.accesskey=Μ sm.sessionName.button1.label=Να μη μετονομαστεί sm.sessionName.button1.accesskey=Ο sm.session.empty=Κενό sm.session.tabs=Κ sm.session.windows=Π sm.removeAll.title.session=Διαχειριστής συνεδρίας - Διαγραφή όλων των αποθηκευμένων συνεδριών sm.removeAll.title.closedwindow=Διαχειριστής συνεδρίας - Διαγραφή όλων των κλεισμένων παραθύρων sm.removeAll.msg0=Θέλετε να διαγραφούν όλες οι αποθηκευμένες συνεδρίες; sm.removeAll.msg1=Αν επιλέξετε «Διαγραφή», η συνεδρία εκκίνησης θα είναι η «Τελευταία συνεδρία» sm.removeAll.msg2=Θέλετε να διαγραφούν όλα τα κλεισμένα παράθυρα; sm.sessionMenu.last=Τελευταία συνεδρία sm.sessionMenu.lastDefault=Τελευταία συνεδρία - Αρχικό sm.sessionMenu.lastgood=Τελευταία έγκυρη συνεδρία sm.sessionMenu.previous=Προτελευταία sm.sessionMenu.crashed=Συνεδρία που κατέρρευσε sm.afterCrash.title=Διαχειριστής συνεδρίας - Αποκατάσταση μετά από κατάρρευση sm.afterCrash.chkbox.label=Ενεργοποίηση του διαχειριστή συνεδρίας sm.afterCrash.msg0=Η τελευταία σας συνεδρία κατέρρευσε! sm.afterCrash.msg0.again=Η τελευταία σας συνεδρία που κατέρρευσε, κατέρρευσε πάλι! sm.afterCrash.msg1=Επιλογή από τη λίστα συνεδρίας για αποκατάσταση: sm.afterCrash.msg2=Επιλογή για συνέχεια sm.afterCrash.msg3=Ο διαχειριστής συνεδρίας είναι απενεργοποιημένος. Αν τον ενεργοποιήσετε, θα μπορείτε να αποκαταστήσετε συνεδρίες που κατέρρευσαν, κλεισμένες και αποθηκευμένες συνεδρίες, καθώς και κλεισμένα παράθυρα από το μενού του. sm.afterCrash.msg4=Μπορείτε επίσης να αποκαταστήσετε τη συνεδρία που κατέρρευσε από το μενού του διαχειριστή συνεδρίας αργότερα. sm.afterCrash.msg5=αλλά δεν αποθηκεύτηκε τίποτα. sm.afterCrash.msg6=αλλά δεν υπάρχει κάποιο ανοιχτό παράθυρο στη συνεδρία που κατέρρευσε sm.afterCrash.msg7=Επιλέξτε παράθυρο που θα αποκατασταθεί από τη λίστα κλεισμένων παραθύρων sm.afterCrash.msg8=(μπορείτε επίσης να αποκαταστήσετε κλεισμένα παράθυρα από το μενού κλεισμένων παραθύρων αργότερα) sm.afterCrash.msg9=Η συνεδρία που κατέρρευσε είναι κενή! sm.afterCrash.msg10=Ο διαχειριστής συνεδρίας δε βρήκε συνεδρίες για αποκατάσταση. sm.afterCrash.button0.label=Αποκατάσταση συνεδρίας sm.afterCrash.button0.accesskey=κ sm.afterCrash.button0.crashed.label=Αποκατάσταση συνεδρίας που κατέρρευσε sm.afterCrash.button0.crashed.accesskey=σ sm.afterCrash.button1.label=Να μη γίνει αποκατάσταση sm.afterCrash.button1.accesskey=α sm.start.title=Διαχειριστής συνεδρίας - Αποκατάσταση συνεδρίας sm.start.chkbox.label=Ενεργοποίηση διαχειριστή συνεδρίας sm.start.msg0=Η συνεδρία εκκίνησης είναι κενή! sm.start.msg1=Η αποκατάσταση έπειτα από κατάρρευση δεν είναι ενεργοποιημένη. Αν την ενεργοποιήσετε θα μπορείτε να αποκαταστήσετε συνεδρίες που κατέρρευσαν. sm.start.msg2=Παρουσιάστηκε σφάλμα κατά την αναζήτηση συνεδρίας εκκίνησης, δεν υπάρχει αποθηκευμένη συνεδρία εκκίνησης.. sm.restoreError.msg0=Σφάλμα σε αρχείο του διαχειριστή συνεδρίας! sm.restoreError.msg1=Διαγραφή της συνεδρίας που προσπαθήσατε να αποκαταστήσετε sm.disable.msg=Ο Firefox έχει ενσωματωμένη δυνατότητα αποκατάστασης συνεδρίας. sm.disable.msg1=Θέλετε να ενεργοποιηθεί η ενσωματωμένη αποκατάσταση συνεδρίας και να απενεργοποιηθεί ο διαχειριστής συνεδρίας του TabMix; sm.disable.msg2=Θέλετε να ενεργοποιηθεί ο διαχειριστής συνεδρίας του TabMix και να απενεργοποιηθεί η ενσωματωμένη αποκατάσταση συνεδρίας; PK jm5Y"locale/el-GR/tabmixplus/tabmix.dtd PK jm5b)locale/el-GR/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description=Περιήγηση σε καρτέλες με πρόσθετη επιτάχυνση. tmp.merge.warning.title=Κλείσιμο παραθύρου με μη συνεπτυγμένες καρτέλες tmp.merge.warning.message=Οι επιλεγμένες καρτέλες θα συμπτυχθούν με άλλο παράθυρο, οι υπόλοιπες θα κλείσουν μαζί με αυτό το παράθυρο. tmp.merge.warning.checkboxLabel=Προειδοποίηση στο κλείσιμο παραθύρου με καρτέλες που δε θα συμπτυχθούν. tmp.merge.error=Για να γίνει σύμπτυξη παραθύρων πρέπει να έχετε ανοιχτά τουλάχιστον δυο tmp.importPref.error1=Η εισαγωγή δεν είναι δυνατή. Μη έγκυρο αρχείο. tmp.importPref.error2=Αποτυχία εισαγωγής ρυθμίσεων tmp.sessionempty=Την επόμενη φορά που θα εκκινηθεί ο περιηγητής, το «τελευταία συνεδρία» θα είναι κενό droptoclose.label=Αφήστε μια καρτέλα για να την κλείσετε droplink.label=Αφήστε στο κέντρο για να αντικαταστήσετε την καρτέλα, ή στα άκρα για να δημιουργήσετε νέα καρτέλα flstOn.label=Εστίαση καρτελών στην τελευταία επιλεγμένη flstOff.label=Εστίαση καρτελών στα δεξιά slideshowOn.label=Η περιστροφή καρτελών είναι ενεργοποιημένη slideshowOff.label=Απενεργοποίηση περιστροφής καρτελών undoclosetab.clear.label=Καθαρισμός λίστας κλεισμένων παραθύρων undoclosetab.clear.accesskey=κ restoreall.label=Επαναφορά όλων των καρτελών restoreall.accesskey=ε session.loading.label=Ο διαχειριστής συνεδρίας φορτώνεται protectedtabs.closeWarning.1=Πρόκειται να κλείσετε %S προστατευμένη καρτέλα. Θέλετε να συνεχίσετε; protectedtabs.closeWarning.2=Πρόκειται να κλείσετε %S προστατευμένες καρτέλες. Θέλετε να συνεχίσετε; protectedtabs.closeWarning.3=Πρόκειται να κλείσετε %S καρτέλες (προστατευμένες : %S). Θέλετε να συνεχίσετε; protectedtabs.closeWarningPromptMe=Ειδοποίηση όταν κλείνουν προστατευμένες καρτέλες confirm_autoreloadPostData_title=Ειδοποίηση! confirm_autoreloadPostData=Η σελίδα που προσπαθείτε να εφαρμόσετε την αυτόματη ανανέωση περιέχει δεδομένα αποστολής.\nΑν ενεργοποιήσετε την αυτόματη ανανέωση, οποιαδήποτε λειτουργία εκτελεί η φόρμα (π.χ. μια συναλλαγή) θα επαναληφθεί.\n\nΘέλετε να ενεργοποιηθεί η αυτόματη ανανέωση; incompatible.title=Tab Mix Plus incompatible.msg0=Οι παρακάτω επεκτάσεις δεν συνεργάζονται ή είναι ασύμβατες με το Tab Mix Plus. incompatible.msg1=Θέλετε να απενεργοποιήσετε αυτές τις επεκτάσεις; incompatible.msg2=Οι ασύμβατες επεκτάσεις θα απενεργεποιηθούν όταν επανεκκινήσετε τον περιηγητή incompatible.button0.label=Απενεργοποίηση incompatible.button0.accesskey=π incompatible.button1.label=Να μην απενεργοποιηθούν incompatible.button1.accesskey=θ incompatible.button2.label=Απενεργοποίηση και επανεκκίνηση incompatible.button2.accesskey=κ incompatible.chkbox.label=Προβολή της ειδοποίησης κατά την εκκίνηση tabmixoption.error.title=Σφάλμα του TabMix tabmixoption.error.msg=Για να κάνετε χρήση των επιλογών του TabMix, πρέπει να έχετε ανοιχτό ένα παράθυρο του περιηγητή PK 6 locale/de-DE/PK 6locale/de-DE/tabmixplus/PK jm5nB  $locale/de-DE/tabmixplus/contents.rdf PK 85@ x locale/de-DE/tabmixplus/misc.dtd PK jm50J+locale/de-DE/tabmixplus/pref-appearance.dtd PK jm5β!)locale/de-DE/tabmixplus/pref-filetype.dtd PK jm5=>2locale/de-DE/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label=Kürzlich geschlossene Tabs zusammen mit dieser Sitzung sichern sm.button.continue.label=Weiter sm.button.continue.accesskey=W sm.askBeforSave.title=Sitzungs-Manager - Sitzung sichern sm.askBeforSave.msg0=Möchten Sie Ihre Browser-Sitzung sichern? sm.askBeforSave.msg1=Wenn Sie nicht sichern, wird die "Letzte Sitzung" beim nächsten Start des Browsers leer sein. sm.askBeforSave.button0.label=Sitzung sichern sm.askBeforSave.button0.accesskey=S sm.askBeforSave.button1.label=Nicht sichern sm.askBeforSave.button1.accesskey=N sm.corrupted.title=Sitzungs-Manager - Beschädigte Datenbank sm.corrupted.msg0=Der Sitzungs-Manager kann seine Datenbank aus der Datei "session.rdf" nicht laden, da diese beschädigt ist. sm.corrupted.msg1=Die Datei "session.rdf" wird gelöscht, eine Sicherungskopie können Sie in Ihrem Profil unter "session.old" finden. sm.areYouSure.msg=Möchten Sie wirklich fortfahren? sm.canChooseStartup.msg=Sie können eine neue Startsitzung aus der Liste auswählen: sm.addtoStartup.title=Sitzungs-Manager - Zur Startsitzung hinzufügen sm.addtoStartup.msg.windows=Sie sind im Begriff, ein oder mehrere Fenster zu Ihrer Startsitzung hinzuzufügen. \nName der Sitzung: sm.addtoStartup.msg.tabs=Sie sind im Begriff, einen oder mehrere Tabs zu Ihrer Startsitzung hinzuzufügen. \nName der Sitzung: sm.addtoStartup.button0.label=Zur Sitzung hinzufügen sm.addtoStartup.button0.accesskey=h sm.addtoStartup.button1.label=Nicht hinzufügen sm.addtoStartup.button1.accesskey=N sm.replaceStartup.title=Sitzungs-Manager - Startsitzung überschreiben sm.replaceStartup.msg=Sie sind im Begriff, Ihre Startsitzung zu überschreiben. \nName der Sitzung: sm.replaceStartup.button0.label=Sitzung überschreiben sm.replaceStartup.button0.accesskey=ü sm.replaceStartup.button1.label=Nicht überschreiben sm.replaceStartup.button1.accesskey=N sm.removeStartup.title=Sitzungs-Manager - Startsitzung löschen sm.removeStartup.msg0=Sie sind im Begriff, Ihre Startsitzung zu löschen. \nName der Sitzung: sm.removeStartup.msg1=Bitte wählen Sie eine neue Startsitzung aus der Liste aus: sm.removeStartup.button0.label=Sitzung löschen sm.removeStartup.button0.accesskey=l sm.removeStartup.button1.label=Nicht löschen sm.removeStartup.button1.accesskey=N sm.title=Sitzungs-Manager sm.dontSaveBlank.msg=Der Sitzungs-Manager sichert keine leeren Fenster. sm.sessoinSave.error=Fehler im Sitzungs-Manager, die Sitzung wurde nicht gesichert. sm.sessionName.title.rename=Sitzungs-Manager - Sitzung umbenennen sm.sessionName.title.saveprevious=Sitzungs-Manager - Sitzung sichern sm.sessionName.title.savethiswindow=Sitzungs-Manager - Aktuelles Fenster sichern sm.sessionName.title.saveallwindows=Sitzungs-Manager - Alle Fenster sichern sm.sessionName.msg0=Bitte geben Sie einen Namen für die Sitzung ein. sm.sessionName.msg1=Der Name muss aus mindestens einem Buchstaben oder einer Zahl bestehen. sm.sessionName.msg2=Es existiert bereits eine Sitzung gleichen Namens! sm.sessionName.msg3=Sind Sie sicher, dass Sie diese Sitzung überschreiben möchten? sm.sessionName.button0.label=Sitzung umbenennen sm.sessionName.button0.accesskey=u sm.sessionName.button1.label=Nicht umbenennen sm.sessionName.button1.accesskey=N sm.session.empty=leer sm.session.tabs=T sm.session.windows=F sm.removeAll.title.session=Sitzungs-Manager - Alle gesicherten Sitzungen löschen sm.removeAll.title.closedwindow=Sitzungs-Manager - Alle geschlossenen Fenster löschen sm.removeAll.msg0=Sind Sie sicher, dass Sie alle Ihre gesicherten Sitzungen löschen möchten? sm.removeAll.msg1=Wenn Sie "Löschen" auswählen, wird die "Letzte Sitzung" zu Ihrer Startsitzung. sm.removeAll.msg2=Sind Sie sicher, dass Sie alle Ihre geschlossenen Fenster löschen möchten? sm.sessionMenu.last=Letzte Sitzung sm.sessionMenu.lastDefault=Letzte Sitzung - Standard sm.sessionMenu.lastgood=Letzte intakte Sitzung sm.sessionMenu.previous=Vorletzte Sitzung sm.sessionMenu.crashed=Abgestürzte Sitzung sm.afterCrash.title=Sitzungs-Manager - Wiederherstellung nach Absturz sm.afterCrash.chkbox.label=Sitzungs-Manager aktivieren sm.afterCrash.msg0=Ihre letzte Sitzung ist abgestürzt! sm.afterCrash.msg0.again=Ihre letzte abgestürzte Sitzung ist erneut abgestürzt! sm.afterCrash.msg1=Bitte wählen Sie eine Sitzung für die Wiederherstellung aus der Liste aus: sm.afterCrash.msg2=Bitte wählen Sie, wie Sie fortfahren möchten sm.afterCrash.msg3=Der Sitzungs-Manager ist momentan deaktiviert. Wenn Sie ihn aktivieren, werden Sie zukünftig abgestürzte, beendete oder gesicherte Sitzungen sowie geschlossene Fenster über das Menü des Sitzungs-Managers wiederherstellen können. sm.afterCrash.msg4=Sie können die abgestürzte Sitzung auch später über das Menü des Sitzungs-Managers wiederherstellen. sm.afterCrash.msg5=aber es wurde nichts gesichert. sm.afterCrash.msg6=aber es existiert kein offenes Fenster in Ihrer abgestürzten Sitzung sm.afterCrash.msg7=Bitte wählen Sie ein Fenster für die Wiederherstellung aus der Liste der geschlossenen Fenster aus sm.afterCrash.msg8=(Sie können geschlossene Fenster auch später über das Menü für kürzlich geschlossene Fenster wiederherstellen) sm.afterCrash.msg9=Ihre abgestürzte Sitzung ist leer! sm.afterCrash.msg10=Der Sitzungs-Manager konnte keine Sitzung für die Wiederherstellung finden. sm.afterCrash.button0.label=Sitzung wiederherstellen sm.afterCrash.button0.accesskey=w sm.afterCrash.button0.crashed.label=Abgestürzte Sitzung wiederherstellen sm.afterCrash.button0.crashed.accesskey=w sm.afterCrash.button1.label=Nicht wiederherstellen sm.afterCrash.button1.accesskey=N sm.start.title=Sitzungs-Manager - Sitzung wiederherstellen sm.start.chkbox.label=Sitzungs-Manager aktivieren sm.start.msg0=Ihre Startsitzung ist leer! sm.start.msg1=Die Wiederherstellung nach Absturz ist momentan deaktiviert. Wenn Sie diese aktivieren, werden Sie zukünftig abgestürzte Sitzungen wiederherstellen können. sm.start.msg2=Bei der Suche nach Ihrer Startsitzung ist ein Fehler aufgetreten. Es existiert keine gesicherte Startsitzung. sm.restoreError.msg0=Fehler in der Sitzungs-Manager-Datei! sm.restoreError.msg1=Bitte löschen Sie die Sitzung, die Sie versucht haben wiederherzustellen. sm.disable.msg=Firefox verfügt über eine eigene Funktion zur Sitzungs-Wiederherstellung. sm.disable.msg1=Möchten Sie die Sitzungs-Wiederherstellung von Firefox aktivieren und den Sitzungs-Manager von Tab Mix Plus deaktivieren? sm.disable.msg2=Möchten Sie den Sitzungs-Manager von Tab Mix Plus aktivieren und die Sitzungs-Wiederherstellung von Firefox deaktivieren? PK jm5))"locale/de-DE/tabmixplus/tabmix.dtd PK jm5rwĿ )locale/de-DE/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description=Eine Vielzahl zusätzlicher Einstellungsmöglichkeiten für das Tabbed-Browsing tmp.merge.warning.title=Fenster mit nicht übertragenen Tabs schließen tmp.merge.warning.message=Die ausgewählten Tabs wurden in ein anderes Fenster übertragen. Die restlichen nicht ausgewählten Tabs werden nun gemeinsam mit dem aktuellen Fenster geschlossen. tmp.merge.warning.checkboxLabel=Diese Meldung immer anzeigen, bevor ein Fenster mit offenen Tabs nach dem Zusammenfassen geschlossen wird. tmp.merge.error=Es müssen mindestens zwei Fenster für eine Zusammenfassung geöffnet sein! tmp.importPref.error1=Import nicht möglich, da es sich um keine gültige Datei handelt. tmp.importPref.error2=Die Einstellungen konnten nicht importiert werden. tmp.sessionempty=Bei Auswahl dieser Option wird die "Letzte Sitzung" beim nächsten Browser-Start leer sein! droptoclose.label=Tab zum Schließen auf die Schaltfläche ziehen droplink.label=Link mittig auf einen Tab ziehen ersetzt diesen, seitlich oder auf die Tab-Leiste öffnet einen neuen Tab flstOn.label=Tabs wechseln zum zuletzt aktiven Tab - mit F9 umschalten flstOff.label=Tabs wechseln zum rechten Tab - mit F9 umschalten slideshowOn.label=Automatischer Tab-Wechsel ist aktiviert - mit F8 deaktivieren slideshowOff.label=Automatischer Tab-Wechsel ist deaktiviert - mit F8 aktivieren undoclosetab.clear.label=Liste löschen undoclosetab.clear.accesskey=l restoreall.label=Alle Tabs wiederherstellen restoreall.accesskey=w session.loading.label=Sitzungs-Manager lädt protectedtabs.closeWarning.1=In diesem Browser-Fenster befindet sich noch %S geschützter Tab. Sind Sie sicher, dass Sie fortfahren möchten? protectedtabs.closeWarning.2=In diesem Browser-Fenster befinden sich noch %S geschützte Tabs. Sind Sie sicher, dass Sie fortfahren möchten? protectedtabs.closeWarning.3=In diesem Browser-Fenster befinden sich noch %S Tabs, %S davon geschützt. Sind Sie sicher, dass Sie fortfahren möchten? protectedtabs.closeWarningPromptMe=Warnen, wenn geschützte Tabs geschlossen werden confirm_autoreloadPostData_title=Warnung! confirm_autoreloadPostData=Die Seite, für die Sie ein automatische Neuladen aktivieren wollten, enthält POST-Daten.\nWenn Sie automatisches Neuladen aktivieren, wird jede Aktion, die das Formular ausgeführt hat (wie eine Suche oder ein Online-Einkauf), wiederholt.\nSind Sie sicher, dass Sie das automatische Neuladen aktivieren möchten? incompatible.title=Tab Mix Plus incompatible.msg0=Die folgenden Erweiterungen sind bereits in Tab Mix Plus integriert oder inkompatibel. incompatible.msg1=Möchten Sie diese Erweiterungen deaktivieren? incompatible.msg2=Die inkompatiblen Erweiterungen werden deaktiviert, wenn der Browser neu gestartet wird. incompatible.button0.label=Deaktivieren incompatible.button0.accesskey=D incompatible.button1.label=Nicht deaktivieren incompatible.button1.accesskey=N incompatible.button2.label=Deaktivieren und neustarten incompatible.button2.accesskey=u incompatible.chkbox.label=Diese Meldung beim Browser-Start anzeigen tabmixoption.error.title=Tab-Mix-Fehler tabmixoption.error.msg=Es muss mindestens ein Browser-Fenster offen sein, um die Einstellungen von Tab Mix benutzen zu können. PK U64l^;^;'locale/de-DE/tabmixplus/pref-tabmix.dtd PK 6 locale/da-DK/PK 6locale/da-DK/tabmixplus/PK jm5ra  $locale/da-DK/tabmixplus/contents.rdf PK 55G! locale/da-DK/tabmixplus/misc.dtd PK jm5P>+locale/da-DK/tabmixplus/pref-appearance.dtd PK jm5Lʵ)locale/da-DK/tabmixplus/pref-filetype.dtd PK jm5%` 5 5'locale/da-DK/tabmixplus/pref-tabmix.dtd PK jm5d2locale/da-DK/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label=Gem lukkede faneblade-lister med denne session sm.button.continue.label=Fortsæt sm.button.continue.accesskey=F sm.askBeforSave.title=Sessionsadministration - Gem session sm.askBeforSave.msg0=Ønsker du at gemme din session? sm.askBeforSave.msg1=Hvis du ikke gemmer, vil 'Sidste session' være tom næste gang du starter browseren. sm.askBeforSave.button0.label=Gem session sm.askBeforSave.button0.accesskey=s sm.askBeforSave.button1.label=Undlad at gemme sm.askBeforSave.button1.accesskey=U sm.corrupted.title=Sessionsadministration - Korrupt database sm.corrupted.msg0=Sessionsadministration kan ikke indlæse dens database fra den ødelagte session.rdf. sm.corrupted.msg1=Filen session.rdf vil blive slettet, en kopi kan findes i session.old i din profil. sm.areYouSure.msg=Er du sikker på at du vil fortsætte? sm.canChooseStartup.msg=Du kan vælge en session der skal være din nye opstartssession fra listen: sm.addtoStartup.title=Sessionsadministration - Tilføj til opstartssession sm.addtoStartup.msg.windows=Du er ved at tilføje vindue(r) til din opstartssession: sm.addtoStartup.msg.tabs=Du er ved at tilføje faneblad(e) til din opstartssession: sm.addtoStartup.button0.label=Tilføj til session sm.addtoStartup.button0.accesskey=t sm.addtoStartup.button1.label=Tilføj ikke sm.addtoStartup.button1.accesskey=i sm.replaceStartup.title=Sessionsadministration - Tilsidesæt opstartssession sm.replaceStartup.msg=Du er ved at erstatte din opstartssession: sm.replaceStartup.button0.label=Erstat session sm.replaceStartup.button0.accesskey=e sm.replaceStartup.button1.label=Erstat ikke sm.replaceStartup.button1.accesskey=i sm.removeStartup.title=Sessionsadministration - Slet opstartssession sm.removeStartup.msg0=Du er ved at slette din opstartssession: sm.removeStartup.msg1=Vælg en ny session der skal være din opstartssession fra listen: sm.removeStartup.button0.label=Slet sm.removeStartup.button0.accesskey=l sm.removeStartup.button1.label=Slet ikke sm.removeStartup.button1.accesskey=i sm.title=Sessionsadministration sm.dontSaveBlank.msg=Sessionsadministration gemmer ikke blanke vinduer sm.sessoinSave.error=Fejl i Sessionsadministration, session blev ikke gemt sm.sessionName.title.rename=Sessionsadministration - Omdøb session sm.sessionName.title.saveprevious=Sessionsadministration - Gem session sm.sessionName.title.savethiswindow=Sessionsadministration - Gem dette vindue sm.sessionName.title.saveallwindows=Sessionsadministration - Gem alle vinduer sm.sessionName.msg0=Indtast sessionsnavn: sm.sessionName.msg1=Navn skal være mindst et bogstav eller tal. sm.sessionName.msg2=Dette navn er allerede i brug! sm.sessionName.msg3=Er du sikker på at du vil erstatte sessionen? sm.sessionName.button0.label=Omdøb session sm.sessionName.button0.accesskey=d sm.sessionName.button1.label=Omdøb ikke sm.sessionName.button1.accesskey=i sm.session.empty=tom sm.session.tabs=T sm.session.windows=W sm.removeAll.title.session=Sessionsadministration - Slet alle gemte sessioner sm.removeAll.title.closedwindow=Sessionsadministration - Slet alle lukkede vinduer sm.removeAll.msg0=Er du sikker på at du vil slette alle dine gemte sessioner? sm.removeAll.msg1=HVis du vælger 'Slet' vil din opstartssession være 'Sidste session'. sm.removeAll.msg2=Er du sikker på at du vil slette alle dine lukkede vinduer? sm.sessionMenu.last=Sidste session sm.sessionMenu.lastDefault=Sidste session - Standard sm.sessionMenu.lastgood=Sidste gode session sm.sessionMenu.previous=Næstsidste session sm.sessionMenu.crashed=Afbrudt session sm.afterCrash.title=Sessionsadminstration - Genetabler efter afbrudt sm.afterCrash.chkbox.label=Slå Sessionsadminstration til sm.afterCrash.msg0=Din sidste session blev afbrudt! sm.afterCrash.msg0.again=Din sidste afbrudte session blev afbrudt igen! sm.afterCrash.msg1=Vælg session at genetablere fra listen: sm.afterCrash.msg2=Vælg hvordan der skal fortsættes sm.afterCrash.msg3=Sessionsadministration er slået fra i øjeblikket. Hvis du slår Sessionsadministration til kan du genetablere afbrudte sessioner, lukkede sessioner, gemte sessioner og lukkede vinduer fra Sessionsadministrationsmenuen. sm.afterCrash.msg4=Du kan også genetablere afbrudte sessioner senere fra Sessionsadministrationsmenuen. sm.afterCrash.msg5=men intet blev gemt. sm.afterCrash.msg6=men der er ingen åbne vinduer i din afbrudte session sm.afterCrash.msg7=Vælg vindue at genetablere fra Lukkede vinduer-liste sm.afterCrash.msg8=(du kan også genetablere lukkede vinduer senere fra Lukkede vinduer-menuen) sm.afterCrash.msg9=Din afbrudte session er tom! sm.afterCrash.msg10=Sessionsadministration fandt ingen sessioner at genetablere fra. sm.afterCrash.button0.label=Genetabler session sm.afterCrash.button0.accesskey=G sm.afterCrash.button0.crashed.label=Genetabler afbrudt session sm.afterCrash.button0.crashed.accesskey=a sm.afterCrash.button1.label=Genetabler ikke sm.afterCrash.button1.accesskey=i sm.start.title=Sessionsadministration - Genetabler session sm.start.chkbox.label=Slå Sessionsadministration til sm.start.msg0=Din opstartssession er tom! sm.start.msg1=Crash Recovery (genetablering af afbrudte sessioner) er slået fra i øjeblikket. Hvis du slår det til kan du genetablere afbrudte sessioner. sm.start.msg2=Fejl under opslag af din opstartssession, din gemte opstartssession findes ikke. sm.restoreError.msg0=Fejl i sessionsadministrationsfil! sm.restoreError.msg1=Slet den session du forsøgte at genetablere sm.disable.msg=Firefox har en indbygget genetabler sessions feature. sm.disable.msg1=Ønsker du at aktivere den indbyggede sessions-genetablering og deaktivere TabMix Sessionsadministration? sm.disable.msg2=Ønsker du at aktivere TabMix Sessionsadministration og deaktivere den indbyggede sessions-genetablering? PK jm56"locale/da-DK/tabmixplus/tabmix.dtd PK jm5ц )locale/da-DK/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description=Tabuleret browsing med et ekstra boost. tmp.merge.warning.title=Lukker vinduer med ikke-sammenlagte faneblade tmp.merge.warning.message=De valgte faneblade vil blive lagt sammen med et andet vindue, men de andre faneblade vil blive lukket sammen med nuværende vindue. tmp.merge.warning.checkboxLabel=Advar mig altid ved lukning af et vindue med faneblade der ikke lægges sammen. tmp.merge.error=Mindst to vinduer skal være åbne før du kan sammenlægge dem tmp.importPref.error1=Kan ikke importere da det ikke er en gyldig fil. tmp.importPref.error2=Import af indstillinger fejlede. tmp.sessionempty=Næste gang du starter browserem vil 'Sidste session' være tom. droptoclose.label=Slip et faneblad for at lukke det droplink.label=Slip i midten for at erstatte fanebladet eller til siderne for at oprette et nyt faneblad flstOn.label=Faneblade fokuserer på sidst valgte flstOff.label=Faneblade fokuserer til højre slideshowOn.label=Fanebladsrotation er Til slideshowOff.label=Fanebladsrotation er Fra undoclosetab.clear.label=Ryd liste over lukkede faneblade undoclosetab.clear.accesskey=y restoreall.label=Genetabler alle faneblade restoreall.accesskey=r session.loading.label=Sessionsadministration indlæses protectedtabs.closeWarning.1=Du er ved at lukke %S beskyttet faneblad. Er du sikker på at du vil fortsætte? protectedtabs.closeWarning.2=Du er ved at lukke %S beskyttede faneblade. Er du sikker på at du vil fortsætte? protectedtabs.closeWarning.3=Du er ved at lukke %S faneblade, heraf %S af dem beskyttede. Er du sikker på at du vil fortsætte? protectedtabs.closeWarningPromptMe=Advar mig når jeg forsøger at lukke beskyttede faneblade confirm_autoreloadPostData_title=Advarsel! confirm_autoreloadPostData=Den side hvorpå du forsøgte at aktivere Auto Genindlæs indeholder POSTDATA.\nHvis du aktiverer Auto Reload, vil handlingen som siden udfører (såsom et online køb) blive gentaget.\nEr du sikker på at du vil aktivere Auto Genindlæs? incompatible.title=Tab Mix Plus incompatible.msg0=De følgende udvidelser er integrerede i eller inkompatible med Tab Mix Plus. incompatible.msg1=Ønsker du at deaktivere disse udvidelser? incompatible.msg2=De inkompatible udvidelser vil være deaktiverede ved næste genstart af browseren. incompatible.button0.label=Deaktiver incompatible.button0.accesskey=D incompatible.button1.label=Deaktiver Ikke incompatible.button1.accesskey=I incompatible.button2.label=Deaktiver og genstart incompatible.button2.accesskey=e incompatible.chkbox.label=Vis denne alarm når browseren starter tabmixoption.error.title=Tabmix Fejl tabmixoption.error.msg=Du skal have et browservindue åbent for at bruge TabMix indstillinger PK 6 locale/cs-CZ/PK 6locale/cs-CZ/tabmixplus/PK jm5YC  $locale/cs-CZ/tabmixplus/contents.rdf PK 15 locale/cs-CZ/tabmixplus/misc.dtd PK jm5y+locale/cs-CZ/tabmixplus/pref-appearance.dtd PK jm5e)locale/cs-CZ/tabmixplus/pref-filetype.dtd PK jm5_Y7Y7'locale/cs-CZ/tabmixplus/pref-tabmix.dtd PK jm5E2locale/cs-CZ/tabmixplus/session-manager.propertiessm.saveClosedTab.chkbox.label=Uložit seznam zavřených panelů s touto relací sm.button.continue.label=Pokračovat sm.button.continue.accesskey=P sm.askBeforSave.title=Správce relací - Uložit relaci sm.askBeforSave.msg0=Chcete uložit vaši relaci? sm.askBeforSave.msg1=Pokud relaci neuložíte, při dalším spuštění prohlížeče bude 'Poslední relace' prázdná. sm.askBeforSave.button0.label=Uložit relaci sm.askBeforSave.button0.accesskey=U sm.askBeforSave.button1.label=Neukládat sm.askBeforSave.button1.accesskey=N sm.corrupted.title=Správce relací - Chyba v databázi sm.corrupted.msg0=Správce relací nemohl nahrát databázi z poškozeného souboru session.rdf. sm.corrupted.msg1=Soubor session.rdf bude smazám, kopii naleznele v session.old ve vašem profilu. sm.areYouSure.msg=Opravdu chcete pokračovat? sm.canChooseStartup.msg=Novou spouštěcí relaci můžete vybrat ze seznamu: sm.addtoStartup.title=Správce relací - Přidat spouštěcí relaci sm.addtoStartup.msg.windows=Hodláte přidat okno(a) do vaší spouštěcí relace: sm.addtoStartup.msg.tabs=Hodláte přidat panel(y) do vaší spouštěcí relace: sm.addtoStartup.button0.label=Přidat do relace sm.addtoStartup.button0.accesskey=R sm.addtoStartup.button1.label=Nepřidávat sm.addtoStartup.button1.accesskey=N sm.replaceStartup.title=Správce relací - Přepsat spouštěcí relaci sm.replaceStartup.msg=Hodláte nahradit vaší spouštěcí relaci: sm.replaceStartup.button0.label=Nahradit relaci sm.replaceStartup.button0.accesskey=N sm.replaceStartup.button1.label=Nenahrazovat sm.replaceStartup.button1.accesskey=N sm.removeStartup.title=Správce relací - Smazat spouštěcí relaci sm.removeStartup.msg0=Hodláte smazat vaší spouštěcí relaci: sm.removeStartup.msg1=Novou spouštěcí relaci vyberte ze seznamu: sm.removeStartup.button0.label=Smazat sm.removeStartup.button0.accesskey=S sm.removeStartup.button1.label=Nemazat sm.removeStartup.button1.accesskey=N sm.title=Správce relací sm.dontSaveBlank.msg=správce relací neukládá prázdná okna sm.sessoinSave.error=Chyba ve Správci relací, relace neuložena sm.sessionName.title.rename=Správce relací - Přejmenovat relaci sm.sessionName.title.saveprevious=Správce relací - Uložit relaci sm.sessionName.title.savethiswindow=Správce relací - Uložit toto okno sm.sessionName.title.saveallwindows=Správce relací - Uložit všechna okna sm.sessionName.msg0=Vložte název relace: sm.sessionName.msg1=Název musí být alespoň jedno písmeno nebo číslice. sm.sessionName.msg2=Název je již používán! sm.sessionName.msg3=Jste si jisti, že chcete nahradit tuto relaci? sm.sessionName.button0.label=Přejmenovat relaci sm.sessionName.button0.accesskey=J sm.sessionName.button1.label=Nepřejmenovat sm.sessionName.button1.accesskey=N sm.session.empty=prázdná sm.session.tabs=P sm.session.windows=O sm.removeAll.title.session=Správce relací - Smazat všechny uložené relace sm.removeAll.title.closedwindow=Správce relací - Smazat všechna zavřená okna sm.removeAll.msg0=Jste si jisti, že chcete smazat všechna uložení relace? sm.removeAll.msg1=Pokud zvolíte 'Smazat', vaše spouštěcí relace bude nyní 'Poslední relace'. sm.removeAll.msg2=Jste si jisti, že chcete smazat všechna zavřená okna? sm.sessionMenu.last=Poslední relace sm.sessionMenu.lastDefault=Poslední relace - Výchozí sm.sessionMenu.lastgood=Poslední funkční relace sm.sessionMenu.previous=Předposlední sm.sessionMenu.crashed=Chybná relace sm.afterCrash.title=Správce relací - Obnovit po pádu sm.afterCrash.chkbox.label=Povolit Správce relací sm.afterCrash.msg0=Ve vaší poslední relaci se objevila chyba! sm.afterCrash.msg0.again=Poslední chybná relace spadla znovu! sm.afterCrash.msg1=Vyberte ze seznamu relaci, která má být obnovena: sm.afterCrash.msg2=Zvolte si pokračování sm.afterCrash.msg3=Správce relací je momentálně vypnutý, pokud ho povolíte, budete moci obnovovat chybné relace, zavírat relace, ukládat relace a zavřená okna z nabídky Správce relací. sm.afterCrash.msg4=Můžete také obnovit chybnou relaci později z nabídky Správce relací. sm.afterCrash.msg5=ale nic se neuložilo. sm.afterCrash.msg6=ale není žádné otevřené okno ve vaší chybné relaci sm.afterCrash.msg7=Vyberte okno k obnově ze seznamu zavřených oken sm.afterCrash.msg8=(můžete také zavřená okna obnovit později z nabídky zavřených oken) sm.afterCrash.msg9=Vaše chybná relace je prázdná! sm.afterCrash.msg10=Správce relací nenalezl žádné relace k obnově. sm.afterCrash.button0.label=Obnovit relaci sm.afterCrash.button0.accesskey=O sm.afterCrash.button0.crashed.label=Obnovit chybnou relaci sm.afterCrash.button0.crashed.accesskey=O sm.afterCrash.button1.label=Neobnovovat sm.afterCrash.button1.accesskey=N sm.start.title=Správce relací - Obnovit relaci sm.start.chkbox.label=povolit Správce relací sm.start.msg0=Vaše spouštěcí relace je prázdná! sm.start.msg1=Obnova pádu je momentálně vypnuta, pokud ji povolíte, budete moci obnovovat chybné relace. sm.start.msg2=Chyba při hledání spouštěcí relace, vaše uložená spouštěcí relace neexistuje. sm.restoreError.msg0=Chyba v souboru Správce relací! sm.restoreError.msg1=Smazat relaci, kterou jste se pokoušeli obnovit sm.disable.msg=Firefox má zabudovanou obnovu relací. sm.disable.msg1=Chcete zapnout zabudouvanou obnovu relací a vypnout Správce relací? sm.disable.msg2=Chcete zapnout Správce relací a vypnout zabudouvanou obnovu relací? PK jm5b"locale/cs-CZ/tabmixplus/tabmix.dtd PK jm5˳t  )locale/cs-CZ/tabmixplus/tabmix.propertiesextensions.{dc572301-7619-498c-a57d-39143191b318}.description=Rozšiřuje možnosti nastavení a usnadňuje práci s panely. tmp.merge.warning.title=Zavíráte okno s nesloučenými panely tmp.merge.warning.message=Vybrané panely budou sloučeny s jiným oknem, ostatní panely budou zavřeny se současným oknem. tmp.merge.warning.checkboxLabel=Vždy upozornit, pokud je zavíráno okno s nesloučenými panely. tmp.merge.error=Musí být otevřena alespoň dvě okna, aby mohla být sloučena tmp.importPref.error1=Nemohu importovat, soubor není platný. tmp.importPref.error2=Import nastavení selhal. tmp.sessionempty=Při dalším spuštění prohlížeče bude 'Poslední relace' prázdná. droptoclose.label=Zavřít panel jeho opuštěním droplink.label=Odložením na střed panel nahradit, odložením na stranu vytvořit nový panel. flstOn.label=Přepínat na naposledy používaný panel flstOff.label=Přepínat na panel napravo slideshowOn.label=Přepínání mezi panely je zapnuto slideshowOff.label=Přepínání mezi panely je vypnuto undoclosetab.clear.label=Vymazat seznam zavřených panelů undoclosetab.clear.accesskey=V restoreall.label=Obnovit všechny panely restoreall.accesskey=O session.loading.label=Nahrávám Správce panelů protectedtabs.closeWarning.1=Chystáte se zavřít %S chráněný panel. Jste si jisti, že chcete pokračovat? protectedtabs.closeWarning.2=Chystáte se zavřít %S chráněné panely. Jste si jisti, že chcete pokračovat? protectedtabs.closeWarning.3=Chystáte se zavřít %S panelů, z toho %S chráněných. Jste si jisti, že chcete pokračovat? protectedtabs.closeWarningPromptMe=Upozornit při pokusu o zavírání chráněných panelů confirm_autoreloadPostData_title=Upozornění! confirm_autoreloadPostData=Stránka, na které se pokoušíte povolit automatické načítání, obsahuje POSTDATA.\nPokud povolíte automatické načítání, každá úloha provedená formulářem (jako např. online nákup) bude zopakovaná.\n\nJste si jisti, že chcete povolit automatické načítání? incompatible.title=Tab Mix Plus incompatible.msg0=Následující rozšíření jsou integrované v či nekompatibilní s rozšířením Tab Mix Plus. incompatible.msg1=Chcete vypnout tato rozšíření? incompatible.msg2=Nekompatibilní rozšíření budou po restartu prohlížeče vypnuty. incompatible.button0.label=Vypnout incompatible.button0.accesskey=V incompatible.button1.label=Nevypínat incompatible.button1.accesskey=N incompatible.button2.label=Vypnout a restartovat incompatible.button2.accesskey=R incompatible.chkbox.label=Zobrazit toto upozornění při startu prohlížeče tabmixoption.error.title=Chyba rozšíření Tab Mix Plus tabmixoption.error.msg=Musíte mít otevřené okno prohlížeče, abyste mohli používat Možnosti TabMix PK 60content/PK 60&content/tabmixplus/PK t5pHEE Wcontent/tabmixplus/about.xulPK 3+w00  content/tabmixplus/contents.rdfPK }d6zۺ}OO "content/tabmixplus/tabmix.jsPK ~6qNXX qcontent/tabmixplus/tabmix.xulPK 60lcontent/tabmixplus/tab/PK 86@ʧʧ content/tabmixplus/tab/tab.jsPK {6OKXKX! content/tabmixplus/tab/tabmix.xmlPK ֌=6Oba00% 0content/tabmixplus/tab/tabmix_old.xmlPK 60x.content/tabmixplus/session/PK 35R7##+ .content/tabmixplus/session/promptservice.jsPK !4VV, Rcontent/tabmixplus/session/promptservice.xulPK 沼6~+==% [content/tabmixplus/session/session.jsPK أ6`$$* Econtent/tabmixplus/session/sessionStore.jsPK 60?jcontent/tabmixplus/pref/PK ܔf5H- ujcontent/tabmixplus/pref/overlaySanitizeUI.xulPK x4+ZZ* mcontent/tabmixplus/pref/pref-appearance.jsPK v4+y+ sucontent/tabmixplus/pref/pref-appearance.xulPK `3/&&( ycontent/tabmixplus/pref/pref-filetype.jsPK 4u<<) content/tabmixplus/pref/pref-filetype.xulPK r6wJWee& hcontent/tabmixplus/pref/pref-tabmix.jsPK 62o55' 2content/tabmixplus/pref/pref-tabmix.xulPK 5e@y - content/tabmixplus/pref/preferencesOverlay.jsPK ־H5wձ. content/tabmixplus/pref/preferencesOverlay.xulPK 60content/tabmixplus/places/PK t6ٿJ# content/tabmixplus/places/places.jsPK ^~6$ content/tabmixplus/places/places.xulPK W6>0 !content/tabmixplus/places/bookmarkProperties.xulPK 60$content/tabmixplus/minit/PK H53 ' (%content/tabmixplus/minit/autoReload.xulPK y6cRhh! 2content/tabmixplus/minit/minit.jsPK ab5ʎ* *content/tabmixplus/minit/setFixedLabel.xulPK X6PVG" content/tabmixplus/minit/tablib.jsPK 60 content/tabmixplus/links/PK S6btiti( Acontent/tabmixplus/links/contentLinks.jsPK @?U5o-FF" content/tabmixplus/links/links.xulPK `3׹qͼ" content/tabmixplus/links/search.jsPK @"4{ ) }content/tabmixplus/links/SearchDialog.xulPK 6#$6$6! content/tabmixplus/links/setup.jsPK 4(P& 8content/tabmixplus/links/text_link.xulPK S6| &<&<) <;content/tabmixplus/links/userInterface.jsPK 60wcontent/tabmixplus/history/PK U6z%dd, wcontent/tabmixplus/history/history-panel.xulPK ~6a% zcontent/tabmixplus/history/history.jsPK 60}content/tabmixplus/flst/PK H5@Soktt }content/tabmixplus/flst/flst.jsPK u\5"44" content/tabmixplus/flst/lasttab.jsPK 60c& content/tabmixplus/click/PK ̸68oQ! & content/tabmixplus/click/click.jsPK 60 content/tabmixplus/bookmarks/PK ~6q) * content/tabmixplus/bookmarks/bookmarks.jsPK T6/5-* R content/tabmixplus/bookmarks/bookmarks.xulPK T6mxx1 m content/tabmixplus/bookmarks/bookmarksManager.xulPK 1T6[U//. 4 content/tabmixplus/bookmarks/bookmarksPanel.jsPK 60 content/tabmixplus/extensions/PK 6O% content/tabmixplus/extensions/sage.jsPK p6@y& content/tabmixplus/extensions/sage.xulPK td6 ||( 0 content/tabmixplus/extensions/wizzrss.jsPK d6PΎ) content/tabmixplus/extensions/wizzrss.xulPK 600 skin/PK 6 0S skin/classic/PK 60~ skin/classic/tabmixplus/PK WY4b! skin/classic/tabmixplus/arrow.pngPK 4::& r skin/classic/tabmixplus/chevron-dn.gifPK q2{Z633'  skin/classic/tabmixplus/chevron-rtl.gifPK 4ڭ99& h skin/classic/tabmixplus/chevron-up.gifPK 0fV33#  skin/classic/tabmixplus/chevron.gifPK X3-$ Y skin/classic/tabmixplus/contents.rdfPK WY4ڔ% skin/classic/tabmixplus/drag-left.pngPK WY4)V & ] skin/classic/tabmixplus/drag-right.pngPK WY4c0 $ skin/classic/tabmixplus/dropmarker-leftright.pngPK 5a`s s 0 * skin/classic/tabmixplus/firefox2defaulttheme.cssPK WY4U"  skin/classic/tabmixplus/locked.pngPK WY4?qϟ"  skin/classic/tabmixplus/newtab.pngPK 3nc5#v !  skin/classic/tabmixplus/prefs.cssPK WY4bN% * skin/classic/tabmixplus/protected.pngPK VY49L""* , skin/classic/tabmixplus/sessionmanager.pngPK c>6Ke;e; cC skin/classic/tabmixplus/tab.cssPK WY44rr$  skin/classic/tabmixplus/tabslist.pngPK `4:{vv% skin/classic/tabmixplus/text_link.cssPK WY4/L.   r skin/classic/tabmixplus/tmp.pngPK WY4c4& Ș skin/classic/tabmixplus/tmpoptions.pngPK WY4 $ skin/classic/tabmixplus/tmpsmall.pngPK WY4( ư skin/classic/tabmixplus/undoclosetab.pngPK VY4C*+ skin/classic/tabmixplus/undoclosewindow.pngPK 60 locale/PK 6 0 locale/zh-TW/PK 60 locale/zh-TW/tabmixplus/PK jm5'Q77$ ' locale/zh-TW/tabmixplus/contents.rdfPK i598 locale/zh-TW/tabmixplus/misc.dtdPK jm5F + locale/zh-TW/tabmixplus/pref-appearance.dtdPK jm5G]) locale/zh-TW/tabmixplus/pref-filetype.dtdPK jm5+55' locale/zh-TW/tabmixplus/pref-tabmix.dtdPK jm5gڠ>>2  locale/zh-TW/tabmixplus/session-manager.propertiesPK jm5U" ( locale/zh-TW/tabmixplus/tabmix.dtdPK jm5MG@ @ ) ? locale/zh-TW/tabmixplus/tabmix.propertiesPK 6 0@J locale/zh-CN/PK 60kJ locale/zh-CN/tabmixplus/PK l5rq  $ J locale/zh-CN/tabmixplus/contents.rdfPK =5 N locale/zh-CN/tabmixplus/misc.dtdPK l5W>+ /P locale/zh-CN/tabmixplus/pref-appearance.dtdPK l5p) R locale/zh-CN/tabmixplus/pref-filetype.dtdPK l5f44' S locale/zh-CN/tabmixplus/pref-tabmix.dtdPK l5V2 , locale/zh-CN/tabmixplus/session-manager.propertiesPK l5B" u locale/zh-CN/tabmixplus/tabmix.dtdPK l5>y8C C ) locale/zh-CN/tabmixplus/tabmix.propertiesPK 6 0 locale/sv-SE/PK 609 locale/sv-SE/tabmixplus/PK jm5dQ  $ o locale/sv-SE/tabmixplus/contents.rdfPK c5 ׵ locale/sv-SE/tabmixplus/misc.dtdPK jm5<ۨT+ locale/sv-SE/tabmixplus/pref-appearance.dtdPK jm5E) locale/sv-SE/tabmixplus/pref-filetype.dtdPK jm5}g4g4' locale/sv-SE/tabmixplus/pref-tabmix.dtdPK jm5nO2 ~ locale/sv-SE/tabmixplus/session-manager.propertiesPK jm5x" n locale/sv-SE/tabmixplus/tabmix.dtdPK jm5^ ) ) locale/sv-SE/tabmixplus/tabmix.propertiesPK 6 0Q4 locale/sk-SK/PK 60|4 locale/sk-SK/tabmixplus/PK jm5ؠ  $ 4 locale/sk-SK/tabmixplus/contents.rdfPK a5j 8 locale/sk-SK/tabmixplus/misc.dtdPK jm500+ G: locale/sk-SK/tabmixplus/pref-appearance.dtdPK jm5vI#) J< locale/sk-SK/tabmixplus/pref-filetype.dtdPK jm5Y;0606' V= locale/sk-SK/tabmixplus/pref-tabmix.dtdPK jm5ٸ2 s locale/sk-SK/tabmixplus/session-manager.propertiesPK jm5T" ܊ locale/sk-SK/tabmixplus/tabmix.dtdPK jm5\X )  locale/sk-SK/tabmixplus/tabmix.propertiesPK 6 0 locale/ru-RU/PK 60( locale/ru-RU/tabmixplus/PK jm5w^  $ ^ locale/ru-RU/tabmixplus/contents.rdfPK ]5cI__ locale/ru-RU/tabmixplus/misc.dtdPK jm56oo+ ] locale/ru-RU/tabmixplus/pref-appearance.dtdPK jm5_D@)  locale/ru-RU/tabmixplus/pref-filetype.dtdPK jm5٢.#NN' Y locale/ru-RU/tabmixplus/pref-tabmix.dtdPK jm5)VR\!\!2 ) locale/ru-RU/tabmixplus/session-manager.propertiesPK jm5(MMM" ' locale/ru-RU/tabmixplus/tabmix.dtdPK jm5ÊL) bE locale/ru-RU/tabmixplus/tabmix.propertiesPK 6 0>V locale/pt-BR/PK 60iV locale/pt-BR/tabmixplus/PK jm5di  $ V locale/pt-BR/tabmixplus/contents.rdfPK Z5RX Z locale/pt-BR/tabmixplus/misc.dtdPK jm5)+ C\ locale/pt-BR/tabmixplus/pref-appearance.dtdPK jm5W) /^ locale/pt-BR/tabmixplus/pref-filetype.dtdPK jm5-b6b6' I_ locale/pt-BR/tabmixplus/pref-tabmix.dtdPK jm5KYY2 locale/pt-BR/tabmixplus/session-manager.propertiesPK jm5'b" locale/pt-BR/tabmixplus/tabmix.dtdPK jm55  ) locale/pt-BR/tabmixplus/tabmix.propertiesPK 6 0 locale/pl-PL/PK 60: locale/pl-PL/tabmixplus/PK jm5D=_  $ p locale/pl-PL/tabmixplus/contents.rdfPK X5t locale/pl-PL/tabmixplus/misc.dtdPK jm5kN+ locale/pl-PL/tabmixplus/pref-appearance.dtdPK jm5:p) locale/pl-PL/tabmixplus/pref-filetype.dtdPK .58@;;' locale/pl-PL/tabmixplus/pref-tabmix.dtdPK C5&&2 Alocale/pl-PL/tabmixplus/session-manager.propertiesPK C5"TT" *locale/pl-PL/tabmixplus/tabmix.dtdPK C5e ) KBlocale/pl-PL/tabmixplus/tabmix.propertiesPK 6 0[Nlocale/nl-NL/PK 60Nlocale/nl-NL/tabmixplus/PK jm5>  $ Nlocale/nl-NL/tabmixplus/contents.rdfPK U5sl Rlocale/nl-NL/tabmixplus/misc.dtdPK jm5k[+ {Tlocale/nl-NL/tabmixplus/pref-appearance.dtdPK jm5v) jVlocale/nl-NL/tabmixplus/pref-filetype.dtdPK jm5P77' Wlocale/nl-NL/tabmixplus/pref-tabmix.dtdPK jm57$2 locale/nl-NL/tabmixplus/session-manager.propertiesPK jm5 " locale/nl-NL/tabmixplus/tabmix.dtdPK jm5ʎ ) locale/nl-NL/tabmixplus/tabmix.propertiesPK 6 0locale/ko-KR/PK 60locale/ko-KR/tabmixplus/PK jm5G~H  $ ;locale/ko-KR/tabmixplus/contents.rdfPK R5 Bj   locale/ko-KR/tabmixplus/misc.dtdPK jm5F+ locale/ko-KR/tabmixplus/pref-appearance.dtdPK jm5) locale/ko-KR/tabmixplus/pref-filetype.dtdPK jm5h(7(7' locale/ko-KR/tabmixplus/pref-tabmix.dtdPK jm5=[//2 U locale/ko-KR/tabmixplus/session-manager.propertiesPK jm5" #locale/ko-KR/tabmixplus/tabmix.dtdPK jm5a ) *;locale/ko-KR/tabmixplus/tabmix.propertiesPK 6 0.Glocale/ja-JP/PK 60YGlocale/ja-JP/tabmixplus/PK jm5`<$ Glocale/ja-JP/tabmixplus/contents.rdfPK P5Ag## UKlocale/ja-JP/tabmixplus/misc.dtdPK jm51+ Mlocale/ja-JP/tabmixplus/pref-appearance.dtdPK jm5م) Olocale/ja-JP/tabmixplus/pref-filetype.dtdPK jm5VUAA' Plocale/ja-JP/tabmixplus/pref-tabmix.dtdPK jm5<2 locale/ja-JP/tabmixplus/session-manager.propertiesPK jm5~" locale/ja-JP/tabmixplus/tabmix.dtdPK jm5?i2  ) locale/ja-JP/tabmixplus/tabmix.propertiesPK 6 02locale/it-IT/PK 60]locale/it-IT/tabmixplus/PK 5  $ locale/it-IT/tabmixplus/contents.rdfPK 5/ locale/it-IT/tabmixplus/misc.dtdPK 5*+ 1locale/it-IT/tabmixplus/pref-appearance.dtdPK 5:) 9locale/it-IT/tabmixplus/pref-filetype.dtdPK 5t<<' Ulocale/it-IT/tabmixplus/pref-tabmix.dtdPK 5[L022 j locale/it-IT/tabmixplus/session-manager.propertiesPK 5$55" 9locale/it-IT/tabmixplus/tabmix.dtdPK 5|D6 ) ?Qlocale/it-IT/tabmixplus/tabmix.propertiesPK 6 0V\locale/hu-HU/PK 60\locale/hu-HU/tabmixplus/PK jm5)  $ \locale/hu-HU/tabmixplus/contents.rdfPK N5g2 `locale/hu-HU/tabmixplus/misc.dtdPK jm5q+ ]blocale/hu-HU/tabmixplus/pref-appearance.dtdPK jm5DK) @dlocale/hu-HU/tabmixplus/pref-filetype.dtdPK jm50 B9B9' ]elocale/hu-HU/tabmixplus/pref-tabmix.dtdPK jm5^2 locale/hu-HU/tabmixplus/session-manager.propertiesPK jm5`b,," ̷locale/hu-HU/tabmixplus/tabmix.dtdPK jm5<D D ) 8locale/hu-HU/tabmixplus/tabmix.propertiesPK 6 0locale/hr-HR/PK 60locale/hr-HR/tabmixplus/PK G57  $ $locale/hr-HR/tabmixplus/contents.rdfPK 5 locale/hr-HR/tabmixplus/misc.dtdPK G5`+ locale/hr-HR/tabmixplus/pref-appearance.dtdPK G5') locale/hr-HR/tabmixplus/pref-filetype.dtdPK G5t6t6' locale/hr-HR/tabmixplus/pref-tabmix.dtdPK G5y2 locale/hr-HR/tabmixplus/session-manager.propertiesPK G5 " x2locale/hr-HR/tabmixplus/tabmix.dtdPK G5/ ) Ilocale/hr-HR/tabmixplus/tabmix.propertiesPK 6 0Ulocale/fr-FR/PK 60Ulocale/fr-FR/tabmixplus/PK jm5L3]  $ $Vlocale/fr-FR/tabmixplus/contents.rdfPK L5B Ylocale/fr-FR/tabmixplus/misc.dtdPK jm5%X7+ [locale/fr-FR/tabmixplus/pref-appearance.dtdPK jm5_d>) ]locale/fr-FR/tabmixplus/pref-filetype.dtdPK jm5t6@<@<' _locale/fr-FR/tabmixplus/pref-tabmix.dtdPK jm5ʪnn2 locale/fr-FR/tabmixplus/session-manager.propertiesPK jm5BK ]" Elocale/fr-FR/tabmixplus/tabmix.dtdPK jm5R}"G G ) locale/fr-FR/tabmixplus/tabmix.propertiesPK 6 0locale/fa-IR/PK 60locale/fa-IR/tabmixplus/PK jm5b }  $ locale/fa-IR/tabmixplus/contents.rdfPK J5g+;UU ^locale/fa-IR/tabmixplus/misc.dtdPK jm5WCv+ locale/fa-IR/tabmixplus/pref-appearance.dtdPK jm5) &locale/fa-IR/tabmixplus/pref-filetype.dtdPK jm5F2-C-C' Mlocale/fa-IR/tabmixplus/pref-tabmix.dtdPK jm5~5sNgg2 'locale/fa-IR/tabmixplus/session-manager.propertiesPK jm5O\\" vClocale/fa-IR/tabmixplus/tabmix.dtdPK jm5&b ) ^locale/fa-IR/tabmixplus/tabmix.propertiesPK 6 0.llocale/es-ES/PK 60Yllocale/es-ES/tabmixplus/PK jm58M  $ llocale/es-ES/tabmixplus/contents.rdfPK H51^ olocale/es-ES/tabmixplus/misc.dtdPK jm57MͰ+ *rlocale/es-ES/tabmixplus/pref-appearance.dtdPK jm57 B) #tlocale/es-ES/tabmixplus/pref-filetype.dtdPK jm5\g77' 8ulocale/es-ES/tabmixplus/pref-tabmix.dtdPK jm5kJ2 locale/es-ES/tabmixplus/session-manager.propertiesPK jm5Xyy" locale/es-ES/tabmixplus/tabmix.dtdPK jm5@  ) locale/es-ES/tabmixplus/tabmix.propertiesPK 6 0locale/en-US/PK 60locale/en-US/tabmixplus/PK B4z _  $ Klocale/en-US/tabmixplus/contents.rdfPK E59 locale/en-US/tabmixplus/misc.dtdPK H5~+ locale/en-US/tabmixplus/pref-appearance.dtdPK B4û) locale/en-US/tabmixplus/pref-filetype.dtdPK t5K22' locale/en-US/tabmixplus/pref-tabmix.dtdPK Zq5޸<2 $locale/en-US/tabmixplus/session-manager.propertiesPK }c5?&" :locale/en-US/tabmixplus/tabmix.dtdPK x5!9 ) Qlocale/en-US/tabmixplus/tabmix.propertiesPK 6 0[locale/el-GR/PK 60!\locale/el-GR/tabmixplus/PK jm5##$ W\locale/el-GR/tabmixplus/contents.rdfPK ;5·# _locale/el-GR/tabmixplus/misc.dtdPK jm5w^>>+ {blocale/el-GR/tabmixplus/pref-appearance.dtdPK jm5 &) elocale/el-GR/tabmixplus/pref-filetype.dtdPK jm5E\|Q|Q' Zflocale/el-GR/tabmixplus/pref-tabmix.dtdPK jm5::k & &2 locale/el-GR/tabmixplus/session-manager.propertiesPK jm5Y" vlocale/el-GR/tabmixplus/tabmix.dtdPK jm5b) locale/el-GR/tabmixplus/tabmix.propertiesPK 6 0locale/de-DE/PK 60 locale/de-DE/tabmixplus/PK jm5nB  $ Vlocale/de-DE/tabmixplus/contents.rdfPK 85@ x locale/de-DE/tabmixplus/misc.dtdPK jm50J+ locale/de-DE/tabmixplus/pref-appearance.dtdPK jm5β!) locale/de-DE/tabmixplus/pref-filetype.dtdPK jm5=>2 locale/de-DE/tabmixplus/session-manager.propertiesPK jm5))" 2locale/de-DE/tabmixplus/tabmix.dtdPK jm5rwĿ ) sJlocale/de-DE/tabmixplus/tabmix.propertiesPK U64l^;^;' yWlocale/de-DE/tabmixplus/pref-tabmix.dtdPK 6 0locale/da-DK/PK 60Glocale/da-DK/tabmixplus/PK jm5ra  $ }locale/da-DK/tabmixplus/contents.rdfPK 55G! ߖlocale/da-DK/tabmixplus/misc.dtdPK jm5P>+ locale/da-DK/tabmixplus/pref-appearance.dtdPK jm5Lʵ) locale/da-DK/tabmixplus/pref-filetype.dtdPK jm5%` 5 5' locale/da-DK/tabmixplus/pref-tabmix.dtdPK jm5d2 /locale/da-DK/tabmixplus/session-manager.propertiesPK jm56" *locale/da-DK/tabmixplus/tabmix.dtdPK jm5ц ) locale/da-DK/tabmixplus/tabmix.propertiesPK 6 0 locale/cs-CZ/PK 60# locale/cs-CZ/tabmixplus/PK jm5YC  $ Y locale/cs-CZ/tabmixplus/contents.rdfPK 15 locale/cs-CZ/tabmixplus/misc.dtdPK jm5y+ locale/cs-CZ/tabmixplus/pref-appearance.dtdPK jm5e) locale/cs-CZ/tabmixplus/pref-filetype.dtdPK jm5_Y7Y7' locale/cs-CZ/tabmixplus/pref-tabmix.dtdPK jm5E2 Jlocale/cs-CZ/tabmixplus/session-manager.propertiesPK jm5b" `locale/cs-CZ/tabmixplus/tabmix.dtdPK jm5˳t  ) wlocale/cs-CZ/tabmixplus/tabmix.propertiesPK))#^