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 / filBF7F26F5B896BD8B655E131FC8B77D36 < prev    next >
Text File  |  2010-07-12  |  15KB  |  493 lines

  1. var gYaUServices = {
  2.   _servicesFileName: "services.mybar.xml",
  3.   _servicesFileURL: "http://export.yandex.ru/xml/services.mybar.xml",
  4.   _countersServicesURL: "http://export.yandex.ru/for/counters.xml",
  5.   
  6.   _servicesFileWrapper: null,
  7.   
  8.   _timedHTTPRequester: null,
  9.   
  10.   _timedHTTPRequesterCallback: function(aResponseData) {
  11.     var data = gYaSearchService.safeE4Xml(aResponseData, null, ["services"]);
  12.     return (data && data..service.length() > 5) ? aResponseData : null;
  13.   },
  14.   
  15.   _init: function() {
  16.     OBSERVER_SERVICE.addObserver(this, "quit-application-granted", false);
  17.     OBSERVER_SERVICE.addObserver(this, "profile-after-change", false);
  18.     OBSERVER_SERVICE.addObserver(this, "profile-before-change", false);
  19.   },
  20.   
  21.   _uninit: function() {
  22.     OBSERVER_SERVICE.removeObserver(this, "profile-before-change");
  23.     OBSERVER_SERVICE.removeObserver(this, "profile-after-change");
  24.     OBSERVER_SERVICE.removeObserver(this, "quit-application-granted");
  25.   },
  26.   
  27.   _profileInit: function() {
  28.     this._timedHTTPRequester = new G_TimedHTTPRequester(
  29.         "servicesmybar", this._servicesFileURL, this._servicesFileName,
  30.         this._timedHTTPRequesterCallback.bind(this)// default: 2 weeks, 1 hour
  31.     );
  32.     
  33.     this._servicesFileWrapper = new G_HTTPFileWrapper(this._servicesFileName, ["services"]);
  34.     this.servicesXMLData;
  35.   },
  36.   
  37.   _profileUninit: function() {
  38.     this._servicesFileWrapper = null;
  39.   },
  40.   
  41.   observe: function(aSubject, aTopic, aData) {
  42.     switch (aTopic) {
  43.       case "quit-application-granted":
  44.         this._uninit();
  45.         break;
  46.       
  47.       case "profile-after-change":
  48.         this._profileInit();
  49.         break;
  50.       
  51.       case "profile-before-change":
  52.         this._profileUninit();
  53.         break;
  54.     }
  55.   },
  56.   
  57.   _data: {},
  58.   
  59.   _SERVICES_DATA: {
  60.     mail:    { sid: 43, isCounter: true },
  61.     lenta:   { sid: 44, isCounter: true, notifyUser: true },
  62.     money:   { sid: 45, isCounter: true },
  63.     fotki:   { sid: 46, isCounter: true },
  64.     yaru:    { sid: 47, isCounter: true, alias: "blogs"},
  65.     moikrug: { sid: 48, isCounter: true}
  66.   },
  67.   
  68.   get SERVICES_DATA() {
  69.     return this._SERVICES_DATA;
  70.   },
  71.   
  72.   _getServiceAlias: function(aServiceName) {
  73.     let alias = aServiceName;
  74.     
  75.     if (aServiceName in this.SERVICES_DATA)
  76.       alias = this.SERVICES_DATA[aServiceName].alias || aServiceName;
  77.     
  78.     return alias;
  79.   },
  80.   
  81.   getSID: function(aType) {
  82.     return this.SERVICES_DATA[aType].sid;
  83.   },
  84.   
  85.   getURLForSID: function(aTypes) {
  86.     let params = [];
  87.     
  88.     if (aTypes === "allCounters") {
  89.       const servicesData = this.SERVICES_DATA;
  90.       let buttonsInfo = gYaSearchService.buttonsInfo;
  91.       
  92.       if (buttonsInfo) {
  93.         for (let service in servicesData) {
  94.           let sData = servicesData[service];
  95.           if (sData.isCounter && sData.sid && buttonsInfo[service]) {
  96.               params.push("services=" + sData.sid);
  97.           }
  98.         }
  99.       }
  100.     } else if (aTypes === "allServices") {
  101.       params.push("services=all");
  102.     } else {
  103.       for each (let type in aTypes)
  104.         params.push("services=" + this.getSID(type));
  105.     }
  106.     
  107.     if (!params.length)
  108.       return false;
  109.     
  110.     return this._countersServicesURL + "?" + params.join("&").replace(/'/g, "\\'");
  111.   },
  112.   
  113.   _errorTimeout: 0,
  114.   
  115.   get errorTimeout() {
  116.     var timeout = (this._errorTimeout || 1) * Math.max(5, gYaSearchService.getIntPref("yasearch.http.update.interval"));
  117.     return Math.min(15, timeout) * MIN_SEC;
  118.   },
  119.   
  120.   set errorTimeout(val) {
  121.     this._errorTimeout = (val === null) ? 0 : Math.min(3, Math.max(1, val));
  122.     return this._errorTimeout;
  123.   },
  124.   
  125.   _error: false,
  126.   
  127.   get error() {
  128.     return this._error;
  129.   },
  130.   
  131.   set error(val) {
  132.     this._error = val;
  133.     return this._error;
  134.   },
  135.   
  136.   get login() {
  137.     return gYaSearchService.username;
  138.   },
  139.   
  140.   _usersData: {},
  141.   
  142.   _getUserData: function(aLogin) {
  143.     if (!aLogin)
  144.       return null;
  145.     
  146.     if (!this._usersData[aLogin])
  147.       this._usersData[aLogin] = <s><c/></s>;
  148.     
  149.     return this._usersData[aLogin];
  150.   },
  151.   
  152.   _getUserCounters: function(aLogin) {
  153.     let userData = this._getUserData(aLogin);
  154.     if (!userData)
  155.       return null;
  156.     
  157.     return userData.c[0];
  158.   },
  159.   
  160.   get currentUserData() {
  161.     return this._getUserData(this.login);
  162.   },
  163.   
  164.   get currentUserCounters() {
  165.     return this._getUserCounters(this.login);
  166.   },
  167.   
  168.   setAllServicesError: function(aNotifyObservers) {
  169.     if (aNotifyObservers)
  170.       OBSERVER_SERVICE.notifyObservers(null, "Ya-Refresh-Data", "allServices");
  171.   },
  172.   
  173.   setDataFromInboxString: function(aCounterTypes, aInboxXMLString) {
  174.     let currentUserCounters = this.currentUserCounters;
  175.     if (!currentUserCounters)
  176.       return;
  177.     
  178.     let xmlData = gYaSearchService.safeE4Xml(aInboxXMLString, null, "s");
  179.     let xmlCountersData = xmlData ? xmlData.c[0] : null;
  180.     if (!xmlCountersData)
  181.       return;
  182.     
  183.     if (aCounterTypes.allServices || aCounterTypes.mailAndFeeds)
  184.       aCounterTypes = this.SERVICES_DATA;
  185.     
  186.     for (let counterType in aCounterTypes) {
  187.       let counterName = this._getServiceAlias(counterType);
  188.       let counterData = xmlCountersData[counterName][0];
  189.       
  190.       if (!currentUserCounters[counterName].length())
  191.         currentUserCounters[counterName] = new XML("<" + counterName + "/>");
  192.       
  193.       let serviceData = currentUserCounters[counterName];
  194.       
  195.       if (counterData) {
  196.         let counterError = counterData.@e.toString() || "0";
  197.         if (counterError == "0") {
  198.           let counterValue = parseInt(counterData.@v, 10) || 0;
  199.  
  200.           if (counterType in this.SERVICES_DATA && this.SERVICES_DATA[counterType].notifyUser) {
  201.             let cDiff = counterValue - parseInt(serviceData.@permCounter, 10);
  202.             if (cDiff != 0 && counterValue > 0)
  203.               gYaSearchService.notifyAboutNewItems(counterType, cDiff > 0 ? cDiff : counterValue);
  204.           }
  205.  
  206.           serviceData.@permCounter = counterValue;
  207.           serviceData.@lastVisited = Date.now();
  208.         }
  209.         
  210.         for each (let propNode in counterData.@*)
  211.           serviceData["@" + propNode.name()] = propNode.toString();
  212.         
  213.         serviceData.@error = counterError;
  214.         
  215.       } else {
  216.         serviceData.@v = 0;
  217.       }
  218.     }
  219.   },
  220.   
  221.   _getXMLDataForService: function(aServiceName) {
  222.     let xmlCountersData = this.currentUserCounters;
  223.     if (!xmlCountersData)
  224.       return null;
  225.     
  226.     let counterName = this._getServiceAlias(aServiceName);
  227.     let counterData = xmlCountersData[counterName][0];
  228.     
  229.     return counterData || null;
  230.   },
  231.   
  232.   getCount: function(aServiceName, aCounterProp) {
  233.     let counterData = this._getXMLDataForService(aServiceName);
  234.     if (!counterData || counterData.@error != "0")
  235.       return null;
  236.     
  237.     let counterProp = aCounterProp || "v";
  238.     
  239.     switch (counterProp) {
  240.       case "comments":
  241.         counterProp = "c";
  242.       case "v":
  243.       case "c":
  244.         break;
  245.       
  246.       default:
  247.         return null;
  248.     }
  249.     
  250.     return parseInt(counterData["@" + counterProp].toString(), 10) || null;
  251.   },
  252.   
  253.   getXULNode: function(aServiceName) {
  254.     let result = <counter><data/></counter>;
  255.     let login = this.login;
  256.     
  257.     if (login) {
  258.       let xmlData = this._getXMLDataForService(aServiceName);
  259.       
  260.       if (xmlData) {
  261.         result.@login = login;
  262.         
  263.         for each (let propNode in xmlData.@*)
  264.           result.data["@" + propNode.name()] = propNode.toString();
  265.       }
  266.     }
  267.     
  268.     return gYaSearchService.getDOMDocContent("counter-" + aServiceName,
  269.                                              gYaSearchService.domParser.parseFromString(result.toSource(), "text/xml"));
  270.   },
  271.   
  272.   _handleNoAuth: function() {
  273.     gYaSearchService.mailCounter = 0;
  274.     gYaSearchService.mailDOMMenuDoc = false;
  275.   },
  276.   
  277.   getErrorFromInboxString: function(aInboxXMLString) {
  278.     let error = false;
  279.     
  280.     let xmlData = gYaSearchService.safeE4Xml(aInboxXMLString, null, "s");
  281.     
  282.     if (!xmlData || (xmlData.@error.toString() > "")) {
  283.       error = { type: "error" };
  284.     } else {
  285.       if (xmlData.toXMLString() === "<s/>") {
  286.         error = { type: "noauth" };
  287.         this._handleNoAuth();
  288.       }
  289.     }
  290.     
  291.     return (this.error = error);
  292.   },
  293.   
  294.   appendUserSessionData: function(aLogin, aServiceXMLData, aYaruXMLData) {
  295.     let userCounters = this._getUserCounters(aLogin);
  296.     
  297.     for each (let serviceNode in aServiceXMLData.*) {
  298.       let serviceName = serviceNode.name();
  299.       if (!userCounters[serviceName].length())
  300.         userCounters[serviceName] = <{serviceName}/>;
  301.       
  302.       userCounters[serviceName].@permCounter = gYaSearchService.parseIntFromStr(serviceNode.@pcounter.toString());
  303.       userCounters[serviceName].@error = serviceNode.@perror.toString() === "0" ? 0 : 10;
  304.     }
  305.     
  306.     this.setYaruUserData(aYaruXMLData, aLogin);
  307.   },
  308.   
  309.   getUserSessionDataForFlush: function(aLogin) {
  310.     let counters = <counters/>;
  311.     let userCounters = this._getUserCounters(aLogin);
  312.     
  313.     for each (let counter in userCounters) {
  314.       let permCounter = gYaSearchService.parseIntFromStr(counter.@permCounter.toString());
  315.       let permError = gYaSearchService.parseIntFromStr(counter.@error.toString());
  316.       
  317.       if (permCounter || permError === 0) {
  318.         let counterName = counter.name();
  319.         counters[counterName].@pcounter = permCounter;
  320.         counters[counterName].@perror = permError;
  321.       }
  322.     }
  323.     
  324.     return [counters, this.getYaruUserData(aLogin)];
  325.   },
  326.   
  327.   getServicesXML: function(aLogin) {
  328.     let servicesXML = this._servicesFileWrapper.mergedContent;
  329.     
  330.     if (!servicesXML)
  331.       return null;
  332.     
  333.     let oldFeeds = servicesXML.service.(function::attribute("name") == "lenta")[0];
  334.     let newFeeds = servicesXML.service.(function::attribute("name") == "subscriptions")[0];
  335.     
  336.     if (oldFeeds && newFeeds) {
  337.       delete oldFeeds.parent().service[oldFeeds.childIndex()];
  338.       newFeeds.@name = "lenta";
  339.     }
  340.     
  341.     for each (let node in servicesXML.service..*.(!function::hasComplexContent() && /\{user\}/.test(function::text())))
  342.       node.setChildren(node.text().toString().replace(/\{user\}/g, this.login));
  343.     
  344.     return servicesXML;
  345.   },
  346.   
  347.   getServicesLocalizedXML: function() {
  348.     let servicesXML = this.getServicesXML();
  349.     
  350.     if (!servicesXML)
  351.       return null;
  352.     
  353.     let currentLang = gYaSearchService.localeLang;
  354.     let currentLangFix = gYaSearchService.localeTld;
  355.     let defaultLang = "ru";
  356.     
  357.     for each (let service in servicesXML.service) {
  358.       for each (let serviceNode in service.*) {
  359.         let serviceName = serviceNode.name();
  360.         let nodes = service[serviceName];
  361.         if (nodes.length() > 1) {
  362.           let node = nodes.(function::attribute("lang") == currentLang)[0] ||
  363.                      nodes.(function::attribute("lang") == currentLangFix)[0] ||
  364.                      nodes.(function::attribute("lang").length() == 0)[0] ||
  365.                      nodes.(function::attribute("lang") == defaultLang)[0];
  366.           
  367.           if (node) {
  368.             delete service[serviceName];
  369.             delete node.@lang;
  370.             service.appendChild(node);
  371.           }
  372.         }
  373.       }
  374.     }
  375.     
  376.     return servicesXML;
  377.   },
  378.   
  379.   getServiceLocalizedXML: function(aServiceName) {
  380.     let servicesXML = this.getServicesLocalizedXML();
  381.     if (!servicesXML)
  382.       return null;
  383.     
  384.     let serviceXML = servicesXML.service.(function::attribute("name") == aServiceName)[0];
  385.     return serviceXML || null;
  386.   },
  387.   
  388.   getUserServicesXUL: function() {
  389.     let servicesXML = this.getServicesLocalizedXML();
  390.     
  391.     if (!servicesXML)
  392.       return null;
  393.     
  394.     let i = 0,
  395.         sortArr = [];
  396.     
  397.     for each (let service in servicesXML.service) {
  398.       let counterData = this._getXMLDataForService(service.@name.toString());
  399.       
  400.       service.@sorthelper = i++;
  401.       service.@error = 30;
  402.       
  403.       if (counterData) {
  404.         service.@error = counterData.@error.toString() == "40" ? 0 : counterData.@error.toString();
  405.         if (counterData.@v.length() == 1)
  406.           service.@v = counterData.@v;
  407.       }
  408.       
  409.       sortArr.push(service);
  410.     }
  411.     
  412.     delete servicesXML.service;
  413.     
  414.     sortArr.sort(function(a,b) {
  415.       let aE = a.@error.toString(), bE = b.@error.toString();
  416.       let aS = parseInt(a.@sorthelper,10), bS = parseInt(b.@sorthelper,10);
  417.       return (aE > bE) ? 1 : (aE < bE) ? -1 : (aS > bS ? 1 : (aS < bS ? -1 : 0));
  418.     })
  419.     .forEach(function(a) servicesXML.appendChild(a));
  420.     
  421.     return gYaSearchService.getDOMDocContent2("services/mybar/uservices.xsl", servicesXML, {});
  422.   },
  423.   
  424.   getUserServicesXULForMFDUser: function(aBoxname) {
  425.     let servicesXML = this.getServicesLocalizedXML();
  426.     if (!servicesXML)
  427.       return null;
  428.     
  429.     delete servicesXML.service.url;
  430.     delete servicesXML.service.counterurl;
  431.     
  432.     let mfdUserData = gYaSearchService.yaMFD.getDataForUser(aBoxname);
  433.     if (mfdUserData) {
  434.       let mailURL = "http://mail.yandex.ru/for/" + mfdUserData.list.@domain;
  435.       let mailService = servicesXML.service.(@name = "pdd")[0];
  436.       if (mailService) {
  437.         mailService.@v = mfdUserData.counter;
  438.         mailService.@error = 0;
  439.         mailService.appendChild(<url action="1005">{mailURL}</url>);
  440.         mailService.appendChild(<counterurl action="1005">{mailURL}/messages</counterurl>);
  441.       }
  442.     }
  443.     
  444.     return gYaSearchService.getDOMDocContent2("services/mybar/uservices.xsl", servicesXML, {});
  445.   },
  446.   
  447.   getYaruUserData: function(aLogin) {
  448.     let login = arguments.length == 1 ? aLogin : this.login;
  449.     let userData = this._getUserData(login);
  450.     
  451.     if (!userData)
  452.       return null;
  453.     
  454.     let yaruData = userData.yaru[0];
  455.     if (!yaruData) {
  456.       yaruData = <yaru/>;
  457.       userData.appendChild(yaruData);
  458.     }
  459.     
  460.     return yaruData;
  461.   },
  462.   
  463.   setYaruUserData: function(aXMLData, aLogin) {
  464.     let userData = this._getUserData(aLogin);
  465.     if (userData)
  466.       userData.yaru = aXMLData;
  467.   },
  468.   
  469.   refreshYaRuUserData: function() {
  470.     gYaSearchService.xmlHttpRequest("http://export.yandex.ru/yaru-info.xml?" + getNCRndStr(),
  471.                              { callbackFunc: this.refreshYaRuUserDataCallback.bind(this) });
  472.   },
  473.   
  474.   refreshYaRuUserDataCallback: function(aReq) {
  475.     let error = null;
  476.     
  477.     if (gYaSearchService.isReqError(aReq)) {
  478.       error = "lost_connection";
  479.     } else if (!this.login) {
  480.       error = "auth_required";
  481.     }
  482.     
  483.     if (!error) {
  484.       let responseText = aReq.target.responseText;
  485.       if (responseText)
  486.         this.setYaruUserData(gYaSearchService.safeE4Xml(responseText.replace(/[\r\n]/g, ""), null, "yaru"), this.login);
  487.     }
  488.     
  489.     OBSERVER_SERVICE.notifyObservers(null, "Ya-Refresh-Data", "yaru-user-data");
  490.   }
  491. }
  492.  
  493. gYaUServices._init();