home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / AIMP2 / aimp_2.61.583.exe / $TEMP / YandexPackSetup.msi / filF0298B0202F77D777DC8C37B07F238F1 < prev    next >
Text File  |  2010-07-12  |  48KB  |  1,436 lines

  1. var Ya = {
  2.   observerService:    Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService),
  3.   nsIYa:              Cc["@yandex.ru/yasearch;1"].getService(Ci.nsIYaSearch).wrappedJSObject,
  4.   
  5.   sContextMenu:       null,
  6.   lastWord:           null,
  7.   
  8.   yaContextSearchId:         "yasearchMenuIdPrefix-yandex-search-menu",
  9.   yaContextSearchServicesId: "yasearchMenuIdPrefix-yandex-menu",
  10.   
  11.   onLoad: function() {
  12.     if (typeof(FeedHandler) === "object" && typeof(FeedHandler.updateFeeds) === "function") {
  13.       var origUpdateFeeds = FeedHandler.updateFeeds;
  14.       
  15.       FeedHandler.updateFeeds = function() {
  16.         Ya.updateFeedsAttribute();
  17.         return origUpdateFeeds.apply(this, arguments);
  18.       }
  19.     }
  20.     
  21.     if (typeof(BrowserToolboxCustomizeDone) === "function") {
  22.       var origBrowserToolboxCustomizeDone = BrowserToolboxCustomizeDone;
  23.       
  24.       BrowserToolboxCustomizeDone = function() {
  25.         Ya.realizeLoginBehaviour();
  26.         return origBrowserToolboxCustomizeDone.apply(this, arguments);
  27.       }
  28.     }
  29.     
  30.     this.stringBundleSet     = document.getElementById("yasearch-string-bundle-global");
  31.     this.sContextMenu        = document.getElementById("contentAreaContextMenu");
  32.     
  33.     if (this.nsIYa.getBoolPref("yasearch.default.search")) {
  34.       let menuElement = document.getElementById("context-searchselect");
  35.       if (menuElement)
  36.         menuElement.setAttribute("style", "display:none !important");
  37.     }
  38.     
  39.     this.realizeLoginBehaviour();
  40.     
  41.     this.observerService.addObserver(this, "Ya-Refresh-Services", false);
  42.     this.observerService.addObserver(this, "Ya-Refresh-Login-Status", false);
  43.     this.observerService.addObserver(this, "Ya-Refresh-Data", false);
  44.     this.observerService.addObserver(this, "Ya-Refresh-Busy-State", false);
  45.     
  46.     this.redrawContextMenu();
  47.     this.sContextMenu.addEventListener("popupshowing", function(e) { Ya.showContextMenu(e) }, false);
  48.     this.sContextMenu.addEventListener("popuphidden",  function(e) { Ya.hideContextMenu(e) }, false);
  49.     
  50.     setTimeout(function(){
  51.       Ya._mailIntegration.defaultOnClick =
  52.           document.getElementById("content").onclick ||
  53.           function() {
  54.             return window.contentAreaClick(event, false);
  55.           };
  56.       
  57.       Ya._mailIntegration.defaultWinObject = window.MailIntegration;
  58.       Ya.mailIntegration = Ya.nsIYa.getBoolPref("yasearch.general.ui.mail.integration");
  59.     }, 10);
  60.     
  61.     this.observerService.notifyObservers(null, "Ya-Browser-OpenClose", "open");
  62.     
  63.     let partnerPaletteNode =
  64.         Array.slice.call(document.getElementById("navigator-toolbox").palette.childNodes)
  65.              .filter(function(aNode){return aNode.id == "yasearch-partner"})[0];
  66.     
  67.     if (partnerPaletteNode) {
  68.       var partnerExists = false;
  69.       
  70.       if (this.nsIYa.yaPartner) {
  71.         let toolbaritemContent = this.nsIYa.yaPartner.toolbaritemContent(document);
  72.         if (toolbaritemContent) {
  73.           partnerExists = true;
  74.           
  75.           ["title", "label", "image"].forEach(function(aAttrName) {
  76.             if (toolbaritemContent.hasAttribute(aAttrName))
  77.               partnerPaletteNode.setAttribute(aAttrName, toolbaritemContent.getAttribute(aAttrName));
  78.           });
  79.         }
  80.       }
  81.       
  82.       if (!partnerExists)
  83.         partnerPaletteNode.parentNode.removeChild(partnerPaletteNode);
  84.     }
  85.   },
  86.   
  87.   unLoad: function() {
  88.     this.observerService.removeObserver(this, "Ya-Refresh-Services");
  89.     this.observerService.removeObserver(this, "Ya-Refresh-Login-Status");
  90.     this.observerService.removeObserver(this, "Ya-Refresh-Data");
  91.     this.observerService.removeObserver(this, "Ya-Refresh-Busy-State");
  92.     
  93.     this.observerService.notifyObservers(null, "Ya-Browser-OpenClose", "close");
  94.   },
  95.   
  96.   redrawSearchBoxPopup: function() {
  97.     let searchTB = document.getElementById("yasearch-textbox");
  98.     if (searchTB)
  99.       searchTB.rebuildPopupServices();
  100.   },
  101.   
  102.   focusSearch: function() {
  103.     let searchTB = document.getElementById("yasearchbox");
  104.     if (searchTB) {
  105.       searchTB.focus();
  106.       searchTB.select();
  107.     }
  108.   },
  109.   
  110.   get buttonsObject() {
  111.     let buttons = {
  112.       get navigElements() {
  113.         return !!(this.bloggers || this.cy || this.spam);
  114.       },
  115.       
  116.       get isAnyVisibleAuthElement() {
  117.       }
  118.     };
  119.     
  120.     ["cy", "spam", "bloggers", "lenta", "mail", "money", "fotki", "yaru", "translate", "moikrug"]
  121.     .forEach(function(aButtonName) {
  122.       this[aButtonName] = !!document.getElementById("yasearch-" + aButtonName);
  123.     }, buttons);
  124.     
  125.     return buttons;
  126.   },
  127.   
  128.   buildFeedsMenu: function() {
  129.     var XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  130.     
  131.     let addFeedsMenu = document.createElementNS(XULNS, "menulist");
  132.     addFeedsMenu.appendChild(document.createElementNS(XULNS, "menupopup"));
  133.     
  134.     let feeds = ("feeds" in gBrowser.mCurrentBrowser) ? gBrowser.mCurrentBrowser.feeds : null;
  135.     
  136.     if (!feeds || feeds.length == 0)
  137.       return false;
  138.     
  139.     for each (var feed in feeds) {
  140.       let newFeed = document.createElementNS(XULNS, "menuitem");
  141.       let baseTitle = feed.title || feed.href;
  142.       newFeed.setAttribute("label", baseTitle);
  143.       newFeed.setAttribute("tooltiptext", feed.href);
  144.       addFeedsMenu.firstChild.appendChild(newFeed);
  145.     }
  146.     
  147.     window.openDialog(YaUtils.CHROME_CONTENT + "feeds/add-dialog.xul", "",
  148.                       "centerscreen,chrome,dialog,resizable,dependent",
  149.                       addFeedsMenu, gBrowser.mCurrentBrowser.contentTitle);
  150.     
  151.     return true;
  152.   },
  153.   
  154.   updateFeedsAttribute: function() {
  155.     let lentaTBItem = document.getElementById("yasearch-lenta");
  156.     if (lentaTBItem) {
  157.       setTimeout(function(me) {
  158.         let feeds = ("feeds" in gBrowser.mCurrentBrowser) ? gBrowser.mCurrentBrowser.feeds : null;
  159.         lentaTBItem.setAttribute("hasFeeds", !(!feeds || feeds.length == 0));
  160.         
  161.         if (lentaTBItem.firstChild.open)
  162.           me.onLentaPopupshowing();
  163.       }, 0, this);
  164.     }
  165.   },
  166.   
  167.   onLentaPopupshowing: function() {
  168.     let lentaTBItem = document.getElementById("yasearch-lenta");
  169.     let lentaMenuPopup = document.getElementById("yasearch-lenta-menupopup");
  170.     
  171.     if (lentaTBItem && lentaMenuPopup)
  172.       lentaMenuPopup.lastChild.setAttribute("disabled", !(lentaTBItem.getAttribute("hasFeeds") == "true"));
  173.   },
  174.   
  175.   addBookmark: function(aFolderId, aExistId) {
  176.     window.openDialog(YaUtils.CHROME_CONTENT + "bookmarks/add-dialog.xul", "",
  177.                       "centerscreen,chrome,dialog,resizable,dependent",
  178.                       gBrowser.mCurrentBrowser, aFolderId, aExistId);
  179.   },
  180.   
  181.   loadCY: function(aEvent, aType) {
  182.     let location = gBrowser.selectedBrowser.webNavigation.currentURI;
  183.     
  184.     try {
  185.       if (location.scheme && (location.scheme == "http" || location.scheme == "https") && location.host.length >= 3) {
  186.         switch (aType) {
  187.           case "similar":
  188.             this.loadURI("http://yandex.ru/yandsearch?ds=" + encodeURIComponent(location.spec), aEvent);
  189.             break;
  190.           
  191.           case "all":
  192.             this.loadURI("http://yandex.ru/yandsearch?serverurl=" + encodeURIComponent(location.host), aEvent);
  193.             break;
  194.           
  195.           default:
  196.             this.loadURI("http://www.yandex.ru/cy?host=" + encodeURIComponent(location.host) + "&base=0",
  197.                           aEvent, {action:3200});
  198.             break;
  199.         }
  200.       }
  201.     } catch(e) {}
  202.   },
  203.   
  204.   setCY: function(aCYData) {
  205.     let spamButton = document.getElementById("yasearch-spam-button");
  206.     if (spamButton) {
  207.       if (aCYData && aCYData.spam) {
  208.         spamButton.disabled = false;
  209.         
  210.         let onCommandTxt = "Ya.confirmCYSpamPromt('" + aCYData.spam + "', event.target)";
  211.         spamButton.setAttribute("oncommand", "if (event.target == this) " + onCommandTxt);
  212.         document.getElementById("yasearch-spam-button-confirm-item").setAttribute("oncommand", onCommandTxt);
  213.       } else {
  214.         spamButton.disabled = true;
  215.       }
  216.     }
  217.     
  218.     let cyButton = document.getElementById("yasearch-cy-button");
  219.     if (cyButton)
  220.       cyButton.setCYData(aCYData);
  221.   },
  222.   
  223.   confirmCYSpamPromt: function(aUrl, aElement) {
  224.     let rv = this.nsIYa.promptService.confirm(window,
  225.                         this.stringBundleSet.getString("ConfirmCYSpamTitle"),
  226.                         this.stringBundleSet.getString("ConfirmCYSpamMessage"));
  227.     if (rv)
  228.       this.nsIYa.confirmCYSpam(aUrl, aElement);
  229.   },
  230.   
  231.   get personalToolbarItems() {
  232.     return YaUtils.evaluateXPath(document, "//xul:toolbaritem[starts-with(@class,'yasearch-login')]");
  233.   },
  234.   
  235.   _changeToolbaritemAuthState: function(aToolbarItem, aIsHasAuth) {
  236.     let reg  = aIsHasAuth ? /(\s|^)yasearch\-login\-not(\s|$)/ : /(\s|^)yasearch\-login(\s|$)/;
  237.     let repl = "$1yasearch-login" + (aIsHasAuth ? "" : "-not") + "$2";
  238.     
  239.     aToolbarItem.className = aToolbarItem.className.replace(reg, repl);
  240.     
  241.     Array.slice(aToolbarItem.childNodes)
  242.          .filter(function(ch) ch.hasAttribute("yaAuthDisabled"))
  243.          .concat(aToolbarItem)
  244.          .forEach(function(ch) {
  245.       ch.setAttribute("yaAuthDisabled", !aIsHasAuth);
  246.     });
  247.   },
  248.   
  249.   realizeLoginBehaviour: function() {
  250.     let isLogin = this.nsIYa.isLogin;
  251.     
  252.     this.personalToolbarItems.forEach(function(item) {
  253.       if (!/\-(mail|login)\-/.test(item.id))
  254.         this._changeToolbaritemAuthState(item, isLogin);
  255.     }, this);
  256.     
  257.     this.updateServicesWork();
  258.   },
  259.   
  260.   refreshLoginButton: function() {
  261.     let loginButton = document.getElementById("yasearch-login-button");
  262.     if (!loginButton)
  263.       return;
  264.     
  265.     let fullLogin = "";
  266.     let login = this.nsIYa.yaAuth.session.login;
  267.     
  268.     if (!login) {
  269.       let swapData = this.nsIYa.yaAuth.swapUsersData;
  270.       if (swapData) {
  271.         login = swapData.username;
  272.       } else {
  273.         let mfdAuthData = this.MFD.getTopAuth();
  274.         if (mfdAuthData) {
  275.           login = mfdAuthData.username;
  276.           fullLogin = mfdAuthData.boxname;
  277.         }
  278.       }
  279.     }
  280.     
  281.     let tooltiptext = login ? this.stringBundleSet.getString("user") + ": " + (fullLogin || login) :
  282.                               loginButton.getAttribute("_deftooltiptext");
  283.     
  284.     loginButton.setAttribute("yaLabel", login || "0");
  285.     loginButton.setAttribute("tooltiptext", tooltiptext);
  286.     
  287.     this._changeToolbaritemAuthState(document.getElementById("yasearch-login"), !!login);
  288.   },
  289.   
  290.   onLoginButtonPopupShowing: function() {
  291.     let loginButton = document.getElementById("yasearch-login-button");
  292.     if (!loginButton || loginButton.getAttribute("yaLabel") == "0")
  293.       return false;
  294.     
  295.     let menuseparators = loginButton.getElementsByTagName("menuseparator");
  296.     
  297.     let menuseparator = menuseparators.item(menuseparators.length - 1);
  298.     let menupopup = menuseparator.parentNode;
  299.     
  300.     while (menupopup.firstChild != menuseparator)
  301.       menupopup.removeChild(menupopup.firstChild);
  302.     
  303.     let loginsInfo = this.nsIYa.yaAuth.getAllLoginsInfo();
  304.     menuseparator.hidden = !loginsInfo.length;
  305.     
  306.     if (loginsInfo.length) {
  307.       loginsInfo.sort(function(a,b) {
  308.         return (a.type > b.type) ? -1 : (a.type < b.type) ? 1 :
  309.                     ((a.username > b.username) ? 1 : (a.username < b.username) ? -1 : 0);
  310.       });
  311.       
  312.       let frag = document.createDocumentFragment();
  313.       let loginType = loginsInfo[0].type;
  314.       
  315.       let XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  316.       let doc = document;
  317.       
  318.       for each (let [index, loginInfo] in Iterator(loginsInfo)) {
  319.         if (loginType != loginInfo.type) {
  320.           loginType = loginInfo.type;
  321.           frag.appendChild(doc.createElementNS(XULNS, "menuseparator"));
  322.         }
  323.         
  324.         let menuitem = doc.createElementNS(XULNS, "menuitem");
  325.         menuitem.setAttribute("oncommand", "Ya.doLoginButtonCommand(event, 'swap')");
  326.         menuitem.setAttribute("label", loginInfo.username);
  327.         
  328.         menuitem.setAttribute("disabled", loginInfo.hasAuth);
  329.         
  330.         frag.appendChild(menuitem);
  331.       }
  332.       
  333.       menupopup.insertBefore(frag, menuseparator);
  334.     }
  335.     
  336.     return true;
  337.   },
  338.   
  339.   doLoginButtonCommand: function(aEvent, aCommandType) {
  340.     let target = aEvent.target;
  341.     if (target && target.localName == "menuitem") {
  342.       switch (aCommandType) {
  343.         case "swap":
  344.           this.nsIYa.yaAuth.initLoginSwapProcess(target.getAttribute("label"));
  345.           break;
  346.         
  347.         case "logout":
  348.           this.nsIYa.yaAuth.dropAllAuth();
  349.           break;
  350.         
  351.         case "change":
  352.           this.openWelcomeWindow(null, null, {view:'auth'});
  353.           break;
  354.         
  355.         default:
  356.           return;
  357.       }
  358.       
  359.       aEvent.stopPropagation();
  360.     }
  361.   },
  362.   
  363.   checkOnCommandEvent: function(aEvent) {
  364.     let target = aEvent.target;
  365.     let currentTarget = aEvent.currentTarget;
  366.     
  367.     if (!(target == currentTarget || target.localName == "toolbarbutton"))
  368.       return false;
  369.     
  370.     if (currentTarget.localName !== "toolbaritem" && currentTarget.localName !== "toolbarbutton")
  371.         return false;
  372.     
  373.     if (target.disabled && !this.nsIYa.isLogin) {
  374.       let parentNode = target.parentNode;
  375.       
  376.       while (parentNode && parentNode.localName != "toolbaritem")
  377.         parentNode = parentNode.parentNode;
  378.       
  379.       if (parentNode && /yasearch\-login/.test(parentNode.getAttribute("class"))) {
  380.         let [,serviceType] = parentNode.getAttribute("id").split("-");
  381.         this.openWelcomeWindow(serviceType, target.getAttribute("id"));
  382.         return false;
  383.       }
  384.     }
  385.     
  386.     return true;
  387.   },
  388.   
  389.   updateServicesWork: function() {
  390.     this.refreshLoginButton();
  391.     this.redrawServicesButton();
  392.     this.refreshMailData();
  393.     this.refreshCounterData("fotki");
  394.     this.refreshCounterData("yaru");
  395.     this.refreshCounterData("moikrug");
  396.     this.refreshLentaData();
  397.     this.refreshMoneyData();
  398.   },
  399.   
  400.   redrawServices: function() {
  401.     this.redrawServicesButton();
  402.     this.redrawContextMenu();
  403.     this.redrawSearchBoxPopup();
  404.   },
  405.   
  406.   redrawServicesButton: function() {
  407.     let sButton = document.getElementById("yasearch-search");
  408.     if (!sButton)
  409.       return;
  410.     
  411.     if (sButton.firstChild)
  412.       sButton.removeChild(sButton.firstChild);
  413.     
  414.     this.nsIYa.DOMUtils.appendNode(this.nsIYa.getServicesDOMNode(), sButton);
  415.   },
  416.   
  417.   showQuickTranslateItems: function(aLabel) {
  418.     if (!this.nsIYa.getBoolPref("yasearch.general.ui.quick.search"))
  419.       aLabel = false;
  420.     
  421.     for each (var qtItemId in ["lingvo"]) {
  422.       var mItem = document.getElementById("yasearchQTranslateItem-" + qtItemId);
  423.       if (mItem) {
  424.         mItem.hidden = aLabel ? false : true;
  425.         if (aLabel)
  426.           mItem.setAttribute("label", this.stringBundleSet.getFormattedString("search_" + qtItemId, [aLabel]));
  427.       }
  428.     }
  429.   },
  430.   
  431.   redrawContextMenu: function() {
  432.     let oldMenu = document.getElementById(this.yaContextSearchServicesId);
  433.     if (oldMenu) {
  434.       let newMenu = this.nsIYa.getDOMDocContent("menu-popup");
  435.       this.nsIYa.DOMUtils.replaceNode(newMenu, oldMenu);
  436.     }
  437.   },
  438.   
  439.   getBrowserSelection: function() {
  440.     let focusedWindow = document.commandDispatcher.focusedWindow;
  441.     let selection = focusedWindow.getSelection().toString();
  442.     
  443.     return this._cropSelectionText(selection);
  444.   },
  445.   
  446.   _cropSelectionText: function(aString) {
  447.     const CHAR_LEN = 100;
  448.     
  449.     if (aString) {
  450.       if (aString.length > CHAR_LEN) {
  451.         var pattern = new RegExp("^(?:\\s*.){0," + CHAR_LEN + "}");
  452.         pattern.test(aString);
  453.         aString = RegExp.lastMatch;
  454.       }
  455.       
  456.       aString = aString.replace(/^\s+/, "").replace(/\s+$/, "").replace(/\s+/g, " ");
  457.       
  458.       if (aString.length > CHAR_LEN)
  459.         aString = aString.substr(0, CHAR_LEN);
  460.     }
  461.     
  462.     return aString;
  463.   },
  464.   
  465.   showContextMenu: function(evt) {
  466.     if (evt.target.id != this.sContextMenu.id)
  467.       return;
  468.     
  469.     let yaContextMenu = document.getElementById(this.yaContextSearchId);
  470.     let yaContextServicesMenu = document.getElementById(this.yaContextSearchServicesId);
  471.     
  472.     let selectedText = "";
  473.     
  474.     let target = gContextMenu.target;
  475.     
  476.     if (gContextMenu.isContentSelected) {
  477.       selectedText = this.getBrowserSelection();
  478.     } else if (gContextMenu.onTextInput && !target.readOnly && target.type != "password") {
  479.       if (target.value) {
  480.         selectedText = target.value.toString().slice(target.selectionStart, target.selectionEnd);
  481.         selectedText = this._cropSelectionText(selectedText);
  482.       }
  483.     }
  484.     
  485.     this.lastWord = selectedText;
  486.     
  487.     if (selectedText) {
  488.       if (selectedText.length > 15)
  489.         selectedText = selectedText.substr(0, 15) + "...";
  490.       
  491.       yaContextMenu.setAttribute("label", this.stringBundleSet.getFormattedString("search_yandex", [selectedText]));
  492.       yaContextServicesMenu.setAttribute("label", this.stringBundleSet.getFormattedString("search_services", [selectedText]));
  493.     }
  494.     
  495.     this.showQuickTranslateItems(selectedText || false);
  496.     
  497.     let hidden = !selectedText;
  498.     yaContextMenu.hidden = hidden;
  499.     yaContextServicesMenu.hidden = hidden;
  500.     
  501.     let sendToItemsType = "page";
  502.     if (!!this.pageDataSender.getImageDataForContextMenu()) {
  503.       sendToItemsType = "image";
  504.     } else if (gContextMenu.isTextSelected) {
  505.       sendToItemsType = "selected";
  506.     }
  507.     
  508.     let hiddenSendService = /^(chrome|file|about):$/.test(target.ownerDocument.location.protocol);
  509.     
  510.     ["Mail", "Yaru"].forEach(function(quickSendService) {
  511.       let item = document.getElementById("yasearchQSendTo" + quickSendService);
  512.       if (item) {
  513.         item.setAttribute("yaPageDataSendType", sendToItemsType);
  514.         item.setAttribute("label", item.getAttribute("yaLabelSend_" + sendToItemsType));
  515.         item.setAttribute("hidden", hiddenSendService || !document.getElementById("yasearch-" + quickSendService.toLowerCase()));
  516.       }
  517.     });
  518.   },
  519.   
  520.   hideContextMenu: function(aEvent) {
  521.     if (aEvent.target.id != this.sContextMenu.id)
  522.       return;
  523.     
  524.     this.lastWord = null;
  525.   },
  526.   
  527.   contentAreaClick: function(event, fieldNormalClicks) {
  528.     if (event.isTrusted && event.button == 0 &&
  529.         !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
  530.       
  531.       var linkNode,
  532.           target = event.target;
  533.       
  534.       if (target instanceof HTMLAnchorElement ||
  535.           target instanceof HTMLAreaElement ||
  536.           target instanceof HTMLLinkElement) {
  537.         if (target.hasAttribute("href"))
  538.           linkNode = target;
  539.       } else {
  540.         linkNode = event.originalTarget;
  541.         while (linkNode && !(linkNode instanceof HTMLAnchorElement))
  542.           linkNode = linkNode.parentNode;
  543.         if (linkNode && !linkNode.hasAttribute("href"))
  544.           linkNode = null;
  545.       }
  546.       
  547.       if (linkNode && linkNode.href) {
  548.         var hrefStr = linkNode.href;
  549.         if (hrefStr.indexOf("mailto:") > -1 && hrefStr.indexOf("mailto:") < 7 &&
  550.             this.composeEmail(hrefStr))
  551.           return false;
  552.       }
  553.     }
  554.     
  555.     return window.contentAreaClick(event, fieldNormalClicks);
  556.   },
  557.   
  558.   pageDataSender: {
  559.     _storedDataToSend: null,
  560.     
  561.     sendToService: function(aDestination, aEvent, aStatData) {
  562.       const LINE_BREAK = aDestination === "yaru" ? "<br/><br/>" : "\n\n";
  563.       
  564.       this._storedDataToSend = null;
  565.       
  566.       let sendType = "page";
  567.       
  568.       if (aEvent && aEvent.target && aEvent.target.hasAttribute("yaPageDataSendType"))
  569.         sendType = aEvent.target.getAttribute("yaPageDataSendType");
  570.       
  571.       let dataToSend = {
  572.         body: "",
  573.         subject: "",
  574.         title: "",
  575.         URL: ""
  576.       };
  577.       
  578.       switch (sendType) {
  579.         case "page":
  580.         case "page-link":
  581.           dataToSend.subject = window.content.document.title;
  582.           
  583.           if (sendType == "page") {
  584.             let metaNodes = window.content.document.getElementsByTagName("meta");
  585.             for (let i = 0, len = metaNodes.length; i < len; i++) {
  586.               let metaName = (metaNodes[i].name || "").toLowerCase();
  587.               if (metaName == "description" && metaNodes[i].content) {
  588.                 dataToSend.body = metaNodes[i].content + LINE_BREAK;
  589.                 break;
  590.               }
  591.             }
  592.           }
  593.           
  594.           dataToSend.body += window.content.location.href;
  595.           
  596.           break;
  597.         
  598.         case "selected":
  599.           dataToSend.body = this.getSelectedText(aEvent);
  600.           break;
  601.         
  602.         case "image":
  603.           let imgData = this.getImageDataForContextMenu();
  604.           if (imgData) {
  605.             dataToSend.body = '<img src="' + imgData.imageURL +
  606.                               '" alt="' + (imgData.imageName || imgData.imageURL) +
  607.                               '" title="' + imgData.imageName + '" />';
  608.             dataToSend.message_type = "html";
  609.           }
  610.           
  611.           break;
  612.         
  613.         default:
  614.           break;
  615.       }
  616.       
  617.       if (!(dataToSend.body || dataToSend.subject))
  618.         return false;
  619.       
  620.       if (!(sendType == "page" || sendType == "page-link")) {
  621.         let wp = gBrowser.currentURI;
  622.         if (wp && wp.spec && typeof wp.spec != "undefined" && !/^about/.test(wp.spec))
  623.           dataToSend.body = "╨ÿ╤ü╤é╨╛╤ç╨╜╨╕╨║: " + wp.spec + LINE_BREAK + dataToSend.body;
  624.       
  625.       } else if (/^about/.test(dataToSend.body)) {
  626.         dataToSend.body = null;
  627.       }
  628.       
  629.       if (aDestination == "yaru") {
  630.         if (sendType == "page") {
  631.           dataToSend.URL = window.content.location.href;
  632.           delete dataToSend.body;
  633.         }
  634.         
  635.         dataToSend.title = dataToSend.subject;
  636.         delete dataToSend.subject;
  637.       }
  638.       
  639.       let sendObject = {
  640.         sendType: sendType,
  641.         destination: aDestination,
  642.         dataToSend: dataToSend,
  643.         statData: aStatData,
  644.         sessionRestarted: false,
  645.         url: null
  646.       };
  647.       
  648.       if (aDestination == "mail" && !Ya.nsIYa.username) {
  649.         let topMFDAuth = Ya.MFD.getTopAuth();
  650.         if (topMFDAuth) {
  651.           sendObject.url = Ya.MFD.getComposeURLForDomain(topMFDAuth.domain);
  652.           if (sendObject.statData)
  653.             sendObject.statData.action = 1055;
  654.         }
  655.       }
  656.       
  657.       if (/^mfd:/.test(aDestination)) {
  658.         let mfdURL = Ya.MFD.getComposeURLForDomain(aDestination.replace(/^mfd:/, ""));
  659.         if (!mfdURL)
  660.           return false;
  661.         
  662.         aDestination = "mail";
  663.         sendObject.destination = aDestination;
  664.         sendObject.url = mfdURL;
  665.         
  666.         if (sendObject.statData)
  667.           sendObject.statData.action = 1055;
  668.       }
  669.       
  670.       if (Ya.nsIYa.username || sendObject.url) {
  671.         this._sendToServiceHepler(sendObject);
  672.       } else {
  673.         sendObject.sessionRestarted = true;
  674.         this._storedDataToSend = sendObject;
  675.         
  676.         let welcomeWindow = Ya.openWelcomeWindow(aDestination);
  677.         if (welcomeWindow) {
  678.           function addUnloadListener(aTarget) {
  679.             aTarget.addEventListener("unload", function(aUnloadEvent) {
  680.               aUnloadEvent.currentTarget.removeEventListener("unload", arguments.callee, false);
  681.               if (Ya && Ya.pageDataSender)
  682.                 Ya.pageDataSender.checkNeedSendData();
  683.             }, false);
  684.           }
  685.           
  686.           if (welcomeWindow.document instanceof Ci.nsIDOMXULDocument) {
  687.             addUnloadListener(welcomeWindow);
  688.           } else {
  689.             welcomeWindow.addEventListener("load", function(aLoadEvent) {
  690.               aLoadEvent.currentTarget.removeEventListener("load", arguments.callee, false);
  691.               addUnloadListener(aLoadEvent.currentTarget);
  692.             }, false);
  693.           }
  694.         }
  695.       }
  696.     },
  697.     
  698.     checkNeedSendData: function() {
  699.       if (this._storedDataToSend) {
  700.         this._sendToServiceHepler(this._storedDataToSend);
  701.         this._storedDataToSend = null;
  702.       }
  703.     },
  704.     
  705.     _sendToServiceHepler: function(aSendObject) {
  706.       if (typeof aSendObject !== "object" || !aSendObject.dataToSend)
  707.         return false;
  708.       
  709.       let url = aSendObject.url;
  710.       
  711.       let login = Ya.nsIYa.username;
  712.       
  713.       if (!(login || url))
  714.         return false;
  715.       
  716.       if (!url) {
  717.         switch (aSendObject.destination) {
  718.           case "mail":
  719.             url = "http://" + Ya.nsIYa.getLocaleDependedUrl("MailHost") + "/compose?mailto=";
  720.             break;
  721.  
  722.           case "yaru":
  723.             url = "http://" + login + ".ya.ru/posts_add_";
  724.             url += (aSendObject.sendType == "page" ? "link" : "text") + ".xml";
  725.             break;
  726.  
  727.           default:
  728.             break;
  729.         }
  730.  
  731.         if (!url)
  732.           return false;
  733.         
  734.         aSendObject.url = url;
  735.       }
  736.       
  737.       if (!url)
  738.         return false;
  739.       
  740.       if (aSendObject.destination == "yaru") {
  741.         if (aSendObject.sessionRestarted)
  742.           aSendObject.url = "http://my.ya.ru/request_to_session.xml";
  743.         
  744.         aSendObject.dataToSend.YARU_retpath = url;
  745.         
  746.         Ya.nsIYa.xmlHttpRequest(
  747.           "http://pass.yandex.ru/?retpath=" + encodeURIComponent("http://" + login + ".ya.ru/"),
  748.           { callbackFunc: function() { if (Ya && Ya.pageDataSender) Ya.pageDataSender._sendData(aSendObject); } }
  749.         );
  750.         
  751.         return true;
  752.       }
  753.       
  754.       return this._sendData(aSendObject);
  755.     },
  756.     
  757.     getSelectedText: function(aEvent) {
  758.       var focusedWindow = document.commandDispatcher.focusedWindow;
  759.       if (focusedWindow == window)
  760.         focusedWindow = content;
  761.       
  762.       if (!focusedWindow)
  763.         return false;
  764.       
  765.       var selection = focusedWindow.getSelection();
  766.       if (selection.isCollapsed || !selection.rangeCount)
  767.         return false;
  768.       
  769.       var range = selection.getRangeAt(0);
  770.       
  771.       var container = range && range.commonAncestorContainer ? range.commonAncestorContainer : null;
  772.       
  773.       var imgCollection = (container && container.getElementsByTagNameNS) ?
  774.                               Array.slice(container.getElementsByTagNameNS(container.namespaceURI, "img")) :
  775.                               [];
  776.       
  777.       const TMP_ALT_ATTR_NAME = "__yasearchTmpAlt";
  778.       
  779.       let i = 0;
  780.       
  781.       if (imgCollection.length) {
  782.         while (imgCollection[i]) {
  783.           let img = imgCollection[i];
  784.           img.setAttribute(TMP_ALT_ATTR_NAME, img.getAttribute("alt"));
  785.           img.setAttribute("alt", "[ ╨╕╨╖╨╛╨▒╤Ç╨░╨╢╨╡╨╜╨╕╨╡: " + img.src + " ]");
  786.           i++;
  787.         }
  788.       }
  789.       
  790.       let selectedText = selection.toString();
  791.       
  792.       if (imgCollection.length) {
  793.         i = 0;
  794.         while (imgCollection[i]) {
  795.           let img = imgCollection[i];
  796.           img.setAttribute("alt", img.getAttribute(TMP_ALT_ATTR_NAME));
  797.           img.removeAttribute(TMP_ALT_ATTR_NAME);
  798.           i++;
  799.         }
  800.       }
  801.       
  802.       return selectedText ? selectedText : false;
  803.     },
  804.     
  805.     getImageDataForContextMenu: function() {
  806.       return this.getImageDataForNode(document.popupNode);
  807.     },
  808.     
  809.     getImageDataForNode: function(aNode) {
  810.       if (aNode && aNode.nodeType == 1 && (aNode instanceof Ci.nsIImageLoadingContent) && aNode.currentURI) {
  811.         var imageURI = aNode.currentURI;
  812.         
  813.         if (/file|https?/.test(imageURI.scheme)) {
  814.           var altText = (aNode.hasAttribute && aNode.hasAttribute("alt")) ? aNode.getAttribute("alt") : "";
  815.           var titleText = (aNode.hasAttribute && aNode.hasAttribute("title")) ? aNode.getAttribute("title") : "";
  816.           
  817.           if (altText == imageURI.spec)   altText   = "";
  818.           if (titleText == imageURI.spec) titleText = "";
  819.           
  820.           var imageName = (titleText.length > altText.length) ? titleText : altText;
  821.           
  822.           if (imageName.length > 1000)
  823.             imageName = imageName.substr(0, 1000);
  824.           
  825.           return {imageURL: imageURI.spec, imageName: imageName};
  826.         }
  827.         
  828.         return null;
  829.       }
  830.       
  831.       return false;
  832.     },
  833.     
  834.     _sendData: function(aSendObject) {
  835.       if (!aSendObject)
  836.         return false;
  837.       
  838.       var url = aSendObject.url;
  839.       
  840.       var dataToSend = [];
  841.       
  842.       for (var [paramName, paramValue] in Iterator(aSendObject.dataToSend)) {
  843.         if (paramName && paramValue)
  844.           dataToSend.push(paramName + "=" + encodeURIComponent(paramValue.substr(0, 1000000)));
  845.       }
  846.       
  847.       var postData = null;
  848.       
  849.       if (dataToSend.length) {
  850.         dataToSend = dataToSend.join("&");
  851.         
  852.         if (dataToSend.length > 8192 && /^https?:\/\/mail\.yandex\./.test(url)) {
  853.           url = url.replace("/compose?", "/classic/compose?");
  854.         }
  855.         
  856.         var stringStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream);
  857.         stringStream.setData(dataToSend, dataToSend.length);
  858.         
  859.         postData = Cc["@mozilla.org/network/mime-input-stream;1"].createInstance(Ci.nsIMIMEInputStream);
  860.         postData.addHeader("Content-Type", "application/x-www-form-urlencoded");
  861.         postData.addContentLength = true;
  862.         postData.setData(stringStream);
  863.       }
  864.       
  865.       Ya.loadURI(url, "tab", aSendObject.statData, postData);
  866.     }
  867.   },
  868.   
  869.   _mailIntegration: {
  870.     enabled: false,
  871.     
  872.     get mailUrl() {
  873.       let url;
  874.       
  875.       let topMFDAuth = Ya.nsIYa.isLogin ? false : Ya.MFD.getTopAuth();
  876.       
  877.       if (topMFDAuth)
  878.         url = "mail.yandex.ru/for/" + topMFDAuth.domain;
  879.       else
  880.         url = Ya.nsIYa.getLocaleDependedUrl("MailHost");
  881.       
  882.       return "http://" + url + "/compose?mailto=";
  883.     },
  884.     
  885.     defaultOnClick: function(aEvent) {
  886.       return window.contentAreaClick(aEvent, false);
  887.     },
  888.     
  889.     yaOnClick: function(aEvent) {
  890.       return Ya.contentAreaClick(aEvent, false);
  891.     },
  892.     
  893.     defaultWinObject: window.MailIntegration,
  894.     
  895.     _sendText: function(aBody, aSubject) {
  896.       var dataToSend = [];
  897.       
  898.       if (aBody)
  899.         dataToSend.push("body=" + encodeURIComponent(aBody.substr(0, 1000000)));
  900.       
  901.       if (aSubject)
  902.         dataToSend.push("subject=" + encodeURIComponent(aSubject.substr(0, 100000)));
  903.       
  904.       var postData = null;
  905.       if (dataToSend.length) {
  906.         dataToSend = dataToSend.join("&");
  907.         
  908.         var stringStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream);
  909.         stringStream.setData(dataToSend, dataToSend.length);
  910.         
  911.         postData = Cc["@mozilla.org/network/mime-input-stream;1"].createInstance(Ci.nsIMIMEInputStream);
  912.         postData.addHeader("Content-Type", "application/x-www-form-urlencoded");
  913.         postData.addContentLength = true;
  914.         postData.setData(stringStream);
  915.       }
  916.       
  917.       Ya.loadURI(this.mailUrl, "tab", null, postData);
  918.     },
  919.     
  920.     yaWinObject: {
  921.       sendLinkForWindow: function(aWindow) {
  922.         this.sendMessage(aWindow.location.href,
  923.                          aWindow.document.title);
  924.       },
  925.       
  926.       sendMessage: function(aBody, aSubject) {
  927.         Ya._mailIntegration._sendText(aBody, aSubject);
  928.       },
  929.       
  930.       _launchExternalUrl: function(aURL) {
  931.         Ya._mailIntegration.defaultWinObject._launchExternalUrl(aURL);
  932.       }
  933.     }
  934.   },
  935.   
  936.   composeEmail: function(aMailAddress) {
  937.     if (this.nsIYa.getBoolPref("yasearch.general.ui.mail.integration.helper.show")) {
  938.       this.nsIYa.setBoolPref("yasearch.general.ui.mail.integration.helper.show", false);
  939.       
  940.       setTimeout(function(me) {
  941.         me.nsIYa.promptService.alert(window,
  942.           me.stringBundleSet.getString("MailIntegrationHelperTitle"),
  943.           me.stringBundleSet.getString("MailIntegrationHelperMessage")
  944.         )
  945.       }, 100, this);
  946.     }
  947.     
  948.     let mailUrl = this._mailIntegration.mailUrl + encodeURIComponent(aMailAddress.replace(/^mailto\:/, ""));
  949.     this.loadURI(mailUrl, "tab", {action: /\/for\//.test(mailUrl) ? 1022 : 1021});
  950.     
  951.     return true;
  952.   },
  953.   
  954.   get mailIntegration() {
  955.     return this._mailIntegration.enabled;
  956.   },
  957.   
  958.   set mailIntegration(val) {
  959.     let type = val ? "ya" : "default";
  960.     this._mailIntegration.enabled = !!val;
  961.     document.getElementById("content").onclick = this._mailIntegration[type + "OnClick"];
  962.     window.MailIntegration = this._mailIntegration[type + "WinObject"];
  963.   },
  964.   
  965.   search: function(engineId, evt) {
  966.     if (!this.lastWord || this.lastWord == "")
  967.       return false;
  968.     
  969.     var searchUrl = this.nsIYa.getSearchEngineUrl(engineId, this.lastWord, null, {clid:10});
  970.     if (!searchUrl)
  971.       return false;
  972.     
  973.     if (this.nsIYa.prefs.searchHistoryEnabled) {
  974.       Cc["@mozilla.org/satchel/form-history;1"]
  975.         .getService(Ci.nsIFormHistory2)
  976.         .addEntry("yasearch-history", this.lastWord);
  977.     }
  978.     
  979.     this.loadURI(searchUrl.url, "tab", searchUrl.statData, null, true);
  980.     
  981.     return true;
  982.   },
  983.   
  984.   loadService: function(aId, aURL, aEvent, aStatData) {
  985.     this.loadURI(aURL, aEvent, aStatData);
  986.     this.nsIYa.setServiceTimestamp(aId);
  987.   },
  988.   
  989.   loadConditionalURI: function(aType, aEvent, aStatData) {
  990.     var url;
  991.     
  992.     switch (aType) {
  993.       case "feeds":
  994.       case "lenta":
  995.         url = this.nsIYa.getLocaleDependedUrl("MailHost") + "/lenta";
  996.         break;
  997.       
  998.       case "mail":
  999.         let topMFDAuth = this.nsIYa.isLogin ? false : this.MFD.getTopAuth();
  1000.         
  1001.         if (topMFDAuth) {
  1002.           url = "mail.yandex.ru/for/" + topMFDAuth.domain;
  1003.           if (aStatData && aStatData.action)
  1004.             aStatData.action = parseInt(aStatData.action, 10) + 5;
  1005.           
  1006.         } else {
  1007.           url = this.nsIYa.getLocaleDependedUrl("MailHost");
  1008.         }
  1009.         
  1010.         url += "/messages" + (this.nsIYa.getBoolPref("yasearch.mail.uri.open.new") ? "?extra_cond=only_new" : "");
  1011.         
  1012.         break;
  1013.       
  1014.       case "fotki":
  1015.         var login = this.nsIYa.username;
  1016.         url = "fotki.yandex.ru" + (login ? ("/users/" + encodeURIComponent(login) + "/favorites") : "");
  1017.         break;
  1018.       
  1019.       case "yaru":
  1020.         var login = this.nsIYa.username;
  1021.         url = login ? (encodeURIComponent(login) + ".ya.ru/replies_history_unread.xml") : "wow.ya.ru";
  1022.         break;
  1023.       
  1024.       default:
  1025.         if (aType && /^\/for\//.test(aType) && this.MFD) {
  1026.           if (aStatData && aStatData.action)
  1027.             aStatData.action = parseInt(aStatData.action, 10) + 5;
  1028.           
  1029.           return this.MFD.loadURI(aType, "messages", aEvent, aStatData);
  1030.         }
  1031.         
  1032.         return false;
  1033.     }
  1034.     
  1035.     return this.loadURI(url, aEvent, aStatData);
  1036.   },
  1037.   
  1038.   checkForClick: function(aEvent) {
  1039.     var node = aEvent.target;
  1040.     if (node.getAttribute("disabled") == "true" || !node.hasAttribute("oncommand"))
  1041.       return;
  1042.     
  1043.     var fn = new Function("event", node.getAttribute("oncommand"));
  1044.     fn.call(node, aEvent);
  1045.     
  1046.     this.closeMenus(node);
  1047.   },
  1048.   
  1049.   closeMenus: function(aNode) {
  1050.     if (aNode && "tagName" in aNode) {
  1051.       if (aNode.namespaceURI == "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
  1052.           && (aNode.tagName == "menupopup" || aNode.tagName == "popup"))
  1053.         if (aNode.hidePopup)
  1054.            aNode.hidePopup();
  1055.       this.closeMenus(aNode.parentNode);
  1056.     }
  1057.   },
  1058.   
  1059.   getTypeByEvent: function(evt) {
  1060.     if (evt) {
  1061.       if (evt == "tab" || evt == "window" || evt == "new-tab") return evt;
  1062.       if (evt.shiftKey) return "window";
  1063.       if (evt.ctrlKey || evt.metaKey || this.nsIYa.prefs.commandOpenTab) return "tab";
  1064.       if (evt.type == "click" && evt.button == 1) return "tab";
  1065.     }
  1066.     return "none";
  1067.   },
  1068.   
  1069.   canLoadUrlInCurrentTab: function(aTab, aUrl) {
  1070.     if (aTab.hasAttribute("busy"))
  1071.       return false;
  1072.     
  1073.     var linkedBrowser = aTab && aTab.linkedBrowser ? aTab.linkedBrowser : null;
  1074.     
  1075.     try {
  1076.       if (!linkedBrowser || linkedBrowser.currentURI.host == "yasearch")
  1077.         return true;
  1078.     } catch(e) {}
  1079.     
  1080.     try {
  1081.       var sh = linkedBrowser.sessionHistory;
  1082.       if (!sh || sh.index < 0 || (sh.count < 2 && (!linkedBrowser.currentURI || linkedBrowser.currentURI.spec == "about:blank")))
  1083.         return true;
  1084.     } catch(e) {}
  1085.     
  1086.     function getHostFromURL(url) {
  1087.       const IO_SERVICE = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  1088.       
  1089.       try {
  1090.         return IO_SERVICE.newURI(url, null, null).host;
  1091.       } catch(e) {}
  1092.       
  1093.       return null;
  1094.     }
  1095.     
  1096.     var currentHost = getHostFromURL(linkedBrowser.currentURI.spec);
  1097.     var host2Load = getHostFromURL(aUrl);
  1098.     
  1099.     if (!(currentHost && (currentHost === host2Load)))
  1100.       return false;
  1101.     
  1102.     function modifTextareasInWindow(aWin) {
  1103.       var doc = aWin.document;
  1104.       if (doc && ("body" in doc)) {
  1105.         var i=0, textareas = doc.getElementsByTagName("textarea");
  1106.         while (textareas[i]) {
  1107.           var textarea = textareas[i++];
  1108.           if (textarea instanceof Ci.nsIDOMHTMLTextAreaElement && textarea.defaultValue != textarea.value)
  1109.             return true;
  1110.         }
  1111.       }
  1112.       return false;
  1113.     }
  1114.     
  1115.     return modifTextareasInWindow(linkedBrowser.contentWindow) ? false : true;
  1116.   },
  1117.   
  1118.   loadURI: function(url, evt, aStatData, postData, aRespectLoadTabPref) {
  1119.     this.nsIYa.checkNeedSendGuid();
  1120.     
  1121.     if (/^mailto\:/.test(url))
  1122.       return this.mailIntegration ? this.composeEmail(url) : false;
  1123.     
  1124.     var type = this.getTypeByEvent(evt);
  1125.     
  1126.     if (!/^[A-z]+\:\/\//.test(url))
  1127.       url = "http://" + url;
  1128.     
  1129.     if (aStatData)
  1130.       url = this.nsIYa.appendStatData2Url(url, aStatData);
  1131.     
  1132.     var currentTab;
  1133.     
  1134.     switch (type) {
  1135.       case "window":
  1136.         openNewWindowWith(url);
  1137.         break;
  1138.       
  1139.       case "new-tab":
  1140.       case "tab":
  1141.         currentTab = gBrowser.mCurrentTab;
  1142.         
  1143.         if (!(type == "new-tab" || evt.ctrlKey || evt.metaKey || (evt.type == "click" && evt.button == 1)) &&
  1144.             this.canLoadUrlInCurrentTab(currentTab, url))
  1145.         {
  1146.           currentTab.linkedBrowser.loadURIWithFlags(url, Ci.nsIWebNavigation.LOAD_FLAGS_NONE, null, null, postData);
  1147.         } else {
  1148.           currentTab = gBrowser.loadOneTab(url, null, null, postData, (aRespectLoadTabPref ? null : false));
  1149.         }
  1150.         
  1151.         break;
  1152.       
  1153.       default:
  1154.         currentTab = gBrowser.mCurrentTab;
  1155.         loadURI(url, null, postData);
  1156.     }
  1157.     
  1158.     if (aStatData && aStatData.action && currentTab && currentTab.linkedBrowser.yaSearchTHandler)
  1159.       currentTab.linkedBrowser.yaSearchTHandler.actionValue = aStatData.action;
  1160.     
  1161.     return true;
  1162.   },
  1163.   
  1164.   fixupWebURI: function(aString) {
  1165.     const nsIURIFixup = Ci.nsIURIFixup;
  1166.     let fixup = Cc["@mozilla.org/docshell/urifixup;1"].getService(nsIURIFixup);
  1167.     let uri = null;
  1168.     try {
  1169.       uri = fixup.createFixupURI(aString, nsIURIFixup.FIXUP_FLAG_NONE);
  1170.       uri = uri && uri.spec && /^(ftp|https?)/.test(uri.scheme) ? uri : null;
  1171.     } catch(e) {}
  1172.     
  1173.     return uri;
  1174.   },
  1175.   
  1176.   loadURIsInTabs: function(aURIsArray) {
  1177.     for each (let uriString in aURIsArray) {
  1178.       let uri = this.fixupWebURI(uriString);
  1179.       if (uri)
  1180.         gBrowser.addTab(uri.spec);
  1181.     }
  1182.   },
  1183.   
  1184.   refreshMailData: function() {
  1185.     let mb = document.getElementById("yasearch-mail-menupopup");
  1186.     if (!mb)
  1187.       return;
  1188.     
  1189.     while (mb.firstChild)
  1190.       mb.removeChild(mb.firstChild);
  1191.     
  1192.     let data = this.nsIYa.mailData;
  1193.     
  1194.     if (data.nodes)
  1195.       while (data.nodes.hasChildNodes())
  1196.         this.nsIYa.DOMUtils.appendNode(data.nodes.firstChild, mb);
  1197.     
  1198.     mb.parentNode.setAttribute("yaLabel", data.count > 0 ? data.count : 0);
  1199.     mb.parentNode.setAttribute("yaMailType", data.type);
  1200.     
  1201.     this._changeToolbaritemAuthState(mb.parentNode, !!(this.nsIYa.isLogin || this.nsIYa.yaMFD.isLogin));
  1202.   },
  1203.   
  1204.   clickMailButton: function(aEvent) {
  1205.     if (aEvent.target.getAttribute("yaMailType") == "mfd")
  1206.       this.MFD.checkMailButtonClickWarning();
  1207.     
  1208.     Ya.loadConditionalURI("mail", aEvent, {action:1000});
  1209.   },
  1210.   
  1211.   clickMail: function(aEvent, aMailType) {
  1212.     let url = aEvent.target.id;
  1213.     let action = "mfd" == aMailType ? 1035 : 1030;
  1214.     
  1215.     this.nsIYa.decMailCounter(url);
  1216.     
  1217.     this.loadURI(url, aEvent, {action:action});
  1218.     
  1219.     return false;
  1220.   },
  1221.   
  1222.   MFD: {
  1223.     _checkDomainString: function(aDomain) {
  1224.       let domain = aDomain;
  1225.       
  1226.       if (domain.indexOf("/for/") != 0)
  1227.         domain = "/for/" + domain;
  1228.       
  1229.       return domain;
  1230.     },
  1231.     
  1232.     loadURI: function(aDomain, aLinkType, aEvent, aStatData) {
  1233.       let url = "mail.yandex.ru" + this._checkDomainString(aDomain) + "/" + aLinkType;
  1234.       
  1235.       if (aLinkType == "messages" && Ya.nsIYa.getBoolPref("yasearch.mail.uri.open.new"))
  1236.         url += "?extra_cond=only_new";
  1237.       
  1238.       return Ya.loadURI(url, aEvent, aStatData);
  1239.     },
  1240.     
  1241.     dropAuthForLogin: function(aLogin, aForgetLogin) {
  1242.       Ya.nsIYa.yaMFD.dropAuthForLogin(aLogin, aForgetLogin);
  1243.     },
  1244.     
  1245.     getComposeURLForDomain: function(aDomain) {
  1246.       return aDomain ? "http://mail.yandex.ru" + this._checkDomainString(aDomain) + "/compose?mailto=" : null;
  1247.     },
  1248.     
  1249.     getTopAuth: function() {
  1250.       return Ya.nsIYa.yaMFD.getTopAuth();
  1251.     },
  1252.     
  1253.     checkMailButtonClickWarning: function() {
  1254.       if (Ya.nsIYa.getBoolPref("yasearch.general.ui.mail.mfd.warning.show")) {
  1255.         Ya.nsIYa.setBoolPref("yasearch.general.ui.mail.mfd.warning.show", false);
  1256.         
  1257.         setTimeout(function() {
  1258.           Ya.nsIYa.promptService.alert(window,
  1259.             Ya.stringBundleSet.getString("MailButtonClickMFDWarningTitle"),
  1260.             Ya.stringBundleSet.getString("MailButtonClickMFDWarningMessage")
  1261.           )
  1262.         }, 100);
  1263.       }
  1264.     }
  1265.   },
  1266.   
  1267.   refreshCounterData: function(aType) {
  1268.     let menupopup = document.getElementById("yasearch-" + aType + "-menupopup");
  1269.     
  1270.     if (menupopup) {
  1271.       let tbb = this.nsIYa.Counters.getXULNode(aType);
  1272.       menupopup.parentNode.setAttribute("yaLabel", tbb.getAttribute("yaLabel"));
  1273.       
  1274.       while (menupopup.firstChild)
  1275.         menupopup.removeChild(menupopup.firstChild);
  1276.       
  1277.       let data = tbb.firstChild;
  1278.       while (data.hasChildNodes())
  1279.         this.nsIYa.DOMUtils.appendNode(data.firstChild, menupopup);
  1280.     }
  1281.   },
  1282.   
  1283.   refreshLentaData: function() {
  1284.     let fb = document.getElementById("yasearch-lenta-button");
  1285.     if (fb) {
  1286.       let data = this.nsIYa.Counters.getCount("lenta");
  1287.       fb.setAttribute("yaLabel", data > 0 ? data : 0);
  1288.     }
  1289.   },
  1290.   
  1291.   refreshMoneyData: function() {
  1292.     let mb = document.getElementById("yasearch-money-button");
  1293.     if (mb) {
  1294.       let data = this.nsIYa.Counters.getCount("money");
  1295.       mb.setAttribute("yaLabel", data > 0 ? data : 0);
  1296.     }
  1297.   },
  1298.   
  1299.   observe: function(aSubject, aTopic, aState) {
  1300.     switch (aTopic) {
  1301.       case "Ya-Refresh-Services":
  1302.         this.redrawServicesButton();
  1303.         break;
  1304.       
  1305.       case "Ya-Refresh-Login-Status":
  1306.         this.realizeLoginBehaviour();
  1307.         break;
  1308.       
  1309.       case "Ya-Refresh-Data":
  1310.         switch (aState) {
  1311.           case "mfd-list":
  1312.           case "mailList":
  1313.             this.refreshMailData();
  1314.             break;
  1315.           
  1316.           case "allServices":
  1317.           case "mailAndFeeds":
  1318.             this.refreshLentaData();
  1319.             this.refreshMoneyData();
  1320.             this.refreshCounterData("fotki");
  1321.             this.refreshCounterData("yaru");
  1322.             this.refreshCounterData("moikrug");
  1323.             break;
  1324.           
  1325.           case "fotki":
  1326.           case "yaru":
  1327.           case "moikrug":
  1328.             this.refreshCounterData(aState);
  1329.             break;
  1330.           
  1331.           case "lenta":
  1332.             this.refreshLentaData();
  1333.             break;
  1334.           
  1335.           case "money":
  1336.             this.refreshMoneyData();
  1337.             break;
  1338.           
  1339.           case "mail-integration":
  1340.             this.mailIntegration = this.nsIYa.getBoolPref("yasearch.general.ui.mail.integration");
  1341.             break;
  1342.           
  1343.           case "services":
  1344.             this.redrawServices();
  1345.             break;
  1346.           
  1347.           case "login":
  1348.             this.refreshLoginButton();
  1349.             break;
  1350.           
  1351.           default:
  1352.             break;
  1353.         }
  1354.         
  1355.         break;
  1356.         
  1357.       case "Ya-Refresh-Busy-State":
  1358.         let data = aState.split(":");
  1359.         let state = !!(data[0] === "true");
  1360.         let types = [data[1]];
  1361.         
  1362.         for each (let type in types) {
  1363.           window.setTimeout(function(aType) {
  1364.             let btn = YaUtils.evaluateXPath(document, '//xul:toolbaritem[starts-with(@id,"' + aType + '")]')[0];
  1365.             if (btn)
  1366.               btn.setAttribute("busy", state);
  1367.           }, state ? 0 : 700, type);
  1368.         }
  1369.         
  1370.         break;
  1371.     }
  1372.   },
  1373.   
  1374.   openWelcomeWindow: function(aServiceType, aCallbackElementId, aExtraProps) {
  1375.     const winType = "Yasearch:WelcomeDialog";
  1376.     
  1377.     let welcomeWindow = this.nsIYa.getWindow(winType);
  1378.     if (welcomeWindow) {
  1379.       welcomeWindow.focus();
  1380.     } else {
  1381.       let flags = "chrome,alwaysRaised,dependent=yes";
  1382.       
  1383.       if (!this.nsIYa.AppInfo.browser.isGreaterThenFx35 || this.nsIYa.AppInfo.OS.isMacOS)
  1384.         flags += ",titlebar=no";
  1385.       
  1386.       welcomeWindow = window.openDialog(YaUtils.CHROME_CONTENT + "dialogs/welcome.xul",
  1387.                                         winType, flags, aServiceType, aCallbackElementId, aExtraProps);
  1388.     }
  1389.     
  1390.     return welcomeWindow;
  1391.   },
  1392.   
  1393.   openPrefWindow: function() {
  1394.     const APP_NAME = "yasearch";
  1395.     const winType = APP_NAME + ":Preferences";
  1396.     
  1397.     let prefWindow = this.nsIYa.getWindow(winType);
  1398.     if (prefWindow) {
  1399.       prefWindow.focus();
  1400.     } else {                         
  1401.       let instantApply = this.nsIYa.getBoolPref("browser.preferences.instantApply");
  1402.       let features = "chrome,titlebar,toolbar,centerscreen,resizable," + (instantApply ? "dialog=no" : "modal");
  1403.       prefWindow = window.openDialog("chrome://" + APP_NAME + "/content/custombar/preferences/preferences.xul", winType, features);
  1404.     }
  1405.     
  1406.     return prefWindow;
  1407.   },
  1408.   
  1409.   openAboutWindow: function() {
  1410.     const winType = "Yasearch:AboutDialog";
  1411.     
  1412.     let aboutWindow = this.nsIYa.getWindow(winType);
  1413.     if (aboutWindow)
  1414.       aboutWindow.focus();
  1415.     else
  1416.       aboutWindow = window.openDialog(YaUtils.CHROME_CONTENT + "about/about.xul", winType,
  1417.                                       "chrome,resizable=no,dependent=yes,centerscreen");
  1418.     
  1419.     return aboutWindow;
  1420.   },
  1421.   
  1422.   log: function(msg) { this.nsIYa.log("Ya: " + msg); },
  1423.   dump: function(aObj) { this.nsIYa.dump(aObj); }
  1424. };
  1425.  
  1426. window.addEventListener("load", function(aLoadEvent) {
  1427.   aLoadEvent.currentTarget.removeEventListener("load", arguments.callee, false);
  1428.   
  1429.   aLoadEvent.currentTarget.addEventListener("unload", function(aUnloadEvent) {
  1430.     aUnloadEvent.currentTarget.removeEventListener("unload", arguments.callee, false);
  1431.     Ya.unLoad();
  1432.   }, false);
  1433.   
  1434.   Ya.onLoad();
  1435. }, false);
  1436.