home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 December / PCWorld_2006-12_cd.bin / komunikace / netscape / nsb-install-8-1-2.exe / chrome / aim.jar / content / aim / aimHelpers.js < prev    next >
Text File  |  2006-01-06  |  64KB  |  1,997 lines

  1. // Various IDL interfaces 
  2. var CachedAimServiceClass = null;
  3. var CachedAimManager = null;
  4. var CachedAimSession = null;
  5. var CachedAimLocateManager = null;
  6. var CachedAimBuddyManager = null;
  7. var CachedAimOdirManager = null;
  8. var CachedAimUserLookupManager = null;
  9. var CachedAimChatManager = null;
  10. var CachedAimTalkAgent = null;
  11. var CachedAimFileXfer = null;
  12. var CachedAimInviteManager = null;
  13. var CachedAimPrivacy = null;
  14. var CachedAimIM = null;
  15. var CachedAimPIM = null;
  16. var CachedAimAdminManager = null;
  17. var CachedAimABInfo = null;
  18. var CachedAimFeedbagManager = null;
  19. var CachedAimWarnings = null;
  20. var CachedAimPrefsManager = null;
  21. var CachedAimStringBundle = null;
  22. var CachedAimSoundManager = null;
  23. var CachedAimDataSource = null;
  24. var CachedAimRDFServiceClass  = null;
  25. var CachedAimRDFService = null;
  26. var CachedAimRDF  = null;
  27. var CachedSessionType= null;
  28. var CachedUserConnection = null;
  29. var CachedFileProtocolHandler = null;
  30.  
  31. /* Various IDL that represent enumerated types */
  32. var CachedAimAuthorizerState = null;
  33. var CachedAimInsertionStyles = null;
  34. var CachedAimPrivacyModes = null;
  35. var CachedAimTalkAudioMode = null;
  36.  
  37. //Required for sns passcard
  38. var sidebarPanel_UI = "AIM";
  39. var snsScreenname_UI = "SNS";
  40. var ksnsPasscardHost = "ScreenNameService";
  41. var    ksnsAutoLogin = 2;   // automatically login in drop down
  42. var ksnsMessageBar = 0;  // browser message bar
  43.  
  44.  
  45. /*
  46.  * Function: aimFileProtocolHandler()
  47.  * Arguments: None
  48.  * Return: the cached file:// protocol handler
  49.  */
  50. function aimFileProtocolHandler()
  51. {
  52.   try {
  53.     if (CachedFileProtocolHandler == null) {
  54.       var ios = Components.classes["@mozilla.org/network/io-service;1"]
  55.                           .getService(Components.interfaces.nsIIOService);
  56.       CachedFileProtocolHandler = ios.getProtocolHandler("file")
  57.                                      .QueryInterface(Components.interfaces.nsIFileProtocolHandler);
  58.     }
  59.   } catch (e) {};
  60.   return CachedFileProtocolHandler;
  61. }
  62.  
  63. /*
  64.  * Function: aimRDFServiceClass()
  65.  * Arguments: None
  66.  * Return: the cached RDF service class
  67.  * Description: This function checks to see is there is already an existing CachedAimRDFServiceClass.
  68.  * If so, then the cached service class is returned. If not, then the rdf-service object is got from Components.classes
  69.  * and stored as CachedAimRDFSeriveClass.
  70. */
  71.  
  72. function aimRDFServiceClass() 
  73. {
  74.      try {
  75.       if (CachedAimRDFServiceClass == null)
  76.         CachedAimRDFServiceClass = Components.classes["@mozilla.org/rdf/rdf-service;1"];
  77.   } catch (e) {};
  78.   return CachedAimRDFServiceClass;
  79. }
  80.  
  81. /*
  82.  * Function: aimRDF()
  83.  * Arguments: None
  84.  * Return: the cached RDF service
  85.  * Description: This function checks to see is there is already an existing CachedAimRDFService.
  86.  * If so, then the cached service is returned. If not, then a getService function is called 
  87.  * on aimRDFServiceClass (See Above) and stored as CachedAimRDFSerive.
  88. */
  89.  
  90. function aimRDF()
  91. {
  92.   try {
  93.       if (CachedAimRDFService == null)
  94.         CachedAimRDFService = aimRDFServiceClass().getService(Components.interfaces.nsIRDFService);
  95.   } catch (e) {};
  96.   return CachedAimRDFService;
  97. }
  98.  
  99. /*
  100.  * Function: aimRDFDataSource()
  101.  * Arguments: None
  102.  * Return: the cached Aim DataSource
  103.  * Description: This function is called whenever the Aim DataSource is needed.
  104.  * This function checks to see is there is already an existing CachedAimDataSource.
  105.  * If so, then the cahced datasource is returned. If not, then an RDFservice is accessed through
  106.  * the RDFclass object from Components.classes array by using getservice. From the RDF service,
  107.  * the aimDataSource is obtained by using getdataSource function. This gets stored in the global 
  108.  * variable CachedAimDataSource and this gets returned.
  109. */
  110.  
  111. function aimRDFDataSource()
  112. {
  113.     try {
  114.         if (CachedAimDataSource == null) {
  115.             var RDFClass = Components.classes["@mozilla.org/rdf/rdf-service;1"];
  116.             var RDF = RDFClass.getService(Components.interfaces.nsIRDFService);
  117.             CachedAimDataSource = RDF.GetDataSource("rdf:AIM");
  118.         }
  119.     } catch (e) {};
  120.  
  121.     return CachedAimDataSource;
  122. }
  123.  
  124. /*
  125.  * Function: aimServiceClass()
  126.  * Arguments: None
  127.  * Return: the cached Aim Service class
  128.  * Description: This function returns the IMService class object.
  129.  * IMService class is one of the classes in the Components.classes array which can be
  130.  * uniquely identified by the ProgID of "@netscape.com/aim/IMManager;1". 
  131. */
  132.  
  133. function aimServiceClass() 
  134. {
  135.   try {
  136.       if (CachedAimServiceClass == null)
  137.         CachedAimServiceClass = Components.classes['@netscape.com/aim/IMManager;1'];
  138.   } catch (e) {};
  139.   return CachedAimServiceClass;
  140. }
  141.  
  142. /*
  143.  * Function: aimManager()
  144.  * Arguments: None
  145.  * Return: the IMManager service
  146.  * Description: This function is called whenever the Aim Manager service is needed.
  147.  * It checks to see if there is an existing instance of CachedAimManager available. If it does, that is returned.
  148.  * If not, then the AimManager service is obtained from the aimServiceClass() (See Above) 
  149.  * and stored in the CachedAimManager which is returned.
  150. */
  151.  
  152. function aimManager()
  153. {
  154.   try {
  155.       if (CachedAimManager == null)
  156.         CachedAimManager = aimServiceClass().getService(Components.interfaces.nsIIMManager);
  157.   } catch (e) {};
  158.   return CachedAimManager;
  159. }
  160.  
  161. /*
  162.  * Function: aimSession()
  163.  * Arguments: None
  164.  * Return: the AimSession interface
  165.  * Description: This function is either returns(if it already exists) or queries for it and
  166.  * holds the nsIAimSession interface in the CachedAimSession global variable.
  167. */
  168.  
  169. function aimSession()
  170. {
  171.   try {
  172.       if(CachedAimSession == null)
  173.         CachedAimSession = aimManager().QueryInterface(Components.interfaces.nsIAimSession);
  174.   } catch (e) {}; 
  175.   return CachedAimSession;
  176. }
  177.  
  178. /*
  179.  * Function: aimPrivacy()
  180.  * Arguments: None
  181.  * Return: the AimPrivacy interface
  182.  * Description: This function either returns(if it already exists) or queries for it and
  183.  * holds the nsIAimPrivacy interface in the CachedAimPrivacy global variable.
  184. */
  185.  
  186. function aimPrivacy()
  187. {
  188.   try {
  189.       if(CachedAimPrivacy == null)
  190.         CachedAimPrivacy = aimManager().QueryInterface(Components.interfaces.nsIAimPrivacy);
  191.   } catch (e) {}; 
  192.   return CachedAimPrivacy;
  193. }
  194.  
  195. /*
  196.  * Function: aimBuddyManager()
  197.  * Arguments: None
  198.  * Return: the AimBuddy interface
  199.  * Description: This function either returns(if it already exists) or queries for it and
  200.  * holds the nsIAimBuddy interface in the CachedAimBuddyManager global variable.
  201. */
  202.  
  203. function aimBuddyManager()
  204. {
  205.   try {
  206.       if(CachedAimBuddyManager == null)
  207.         CachedAimBuddyManager = aimManager().QueryInterface(Components.interfaces.nsIAimBuddy);
  208.   } catch (e) {}; 
  209.   return CachedAimBuddyManager;
  210. }
  211.  
  212. /*
  213.  * Function: aimLocateManager()
  214.  * Arguments: None
  215.  * Return: the AimLocateManager interface
  216.  * Description: This function either returns(if it already exists) or queries for it and
  217.  * holds the nsIAimLocateManager interface in the CachedAimLocateManager global variable.
  218. */
  219.  
  220. function aimLocateManager()
  221. {
  222.   try {
  223.       if(CachedAimLocateManager == null)
  224.         CachedAimLocateManager = aimManager().QueryInterface(Components.interfaces.nsIAimLocateManager);
  225.   } catch (e) {}; 
  226.   return CachedAimLocateManager;
  227. }
  228.  
  229.  
  230. /*
  231.  * Function: aimOdirManager()
  232.  * Arguments: None
  233.  * Return: the AimOdirManager interface
  234.  * Description: This function either returns(if it already exists) or queries for it and
  235.  * holds the nsIAimOdirManager interface in the CachedAimOdirManager global variable.
  236. */
  237.  
  238. function aimOdirManager()
  239. {
  240.   try {
  241.       if(CachedAimOdirManager == null)
  242.         CachedAimOdirManager = aimManager().QueryInterface(Components.interfaces.nsIAimOdirManager);
  243.   } catch (e) {}; 
  244.   return CachedAimOdirManager;
  245. }
  246.  
  247. /*
  248.  * Function: aimUserLookupManager()
  249.  * Arguments: None
  250.  * Return: the AimUserLookupManager interface
  251.  * Description: This function either returns(if it already exists) or queries for it and
  252.  * holds the nsIAimUserLookupManager interface in the CachedAimUserLookupManager global variable.
  253. */
  254.  
  255. function aimUserLookupManager()
  256. {
  257.   try {
  258.       if(CachedAimUserLookupManager == null)
  259.         CachedAimUserLookupManager = aimManager().QueryInterface(Components.interfaces.nsIAimUserLookupManager);
  260.   } catch (e) {}; 
  261.   return CachedAimUserLookupManager;
  262. }
  263.  
  264. /*
  265.  * Function: aimChatManager()
  266.  * Arguments: None
  267.  * Return: the AimChatManager interface
  268.  * Description: This function either returns(if it already exists) or queries for it and
  269.  * holds the nsIAimChatManager interface in the CachedAimChatManager global variable.
  270. */
  271.  
  272. function aimChatManager()
  273. {
  274.   try {
  275.       if(CachedAimChatManager == null)
  276.         CachedAimChatManager = aimManager().QueryInterface(Components.interfaces.nsIAimChatManager);
  277.   } catch (e) {}; 
  278.   return CachedAimChatManager;
  279. }
  280.  
  281. /*
  282.  * Function: aimLocateManager()
  283.  * Arguments: None
  284.  * Return: the AimTalkAgent interface
  285.  * Description: This function either returns(if it already exists) or queries for it and
  286.  * holds the nsIAimTalkAgent interface in the CachedAimTalkAgent global variable.
  287. */
  288.  
  289. function aimTalkAgent()
  290. {
  291.   try {
  292.       if(CachedAimTalkAgent == null)
  293.         CachedAimTalkAgent = aimManager().QueryInterface(Components.interfaces.nsIAimTalkAgent);
  294.   } catch (e) {}; 
  295.   return CachedAimTalkAgent;
  296. }
  297.  
  298.  
  299.  
  300. function fileXfer()
  301. {
  302.   try {
  303.           if(CachedAimFileXfer == null)
  304.             CachedAimFileXfer = aimManager().QueryInterface(Components.interfaces.nsIAimFileXfer);
  305.   } catch (e) {};
  306.   return CachedAimFileXfer;
  307. }
  308.  
  309.  
  310. /*
  311.  * Function: aimInviteManager()
  312.  * Arguments: None
  313.  * Return: the AimInviteManager interface
  314.  * Description: This function either returns(if it already exists) or queries for it and
  315.  * holds the nsIAimInviteManager interface in the CachedAimInviteManager global variable.
  316. */
  317.  
  318. function aimInviteManager()
  319. {
  320.   try {
  321.       if(CachedAimInviteManager == null)
  322.         CachedAimInviteManager = aimManager().QueryInterface(Components.interfaces.nsIAimInviteManager);
  323.   } catch (e) {}; 
  324.   return CachedAimInviteManager;
  325. }
  326.  
  327. /*
  328.  * Function: aimSoundManager()
  329.  * Arguments: None
  330.  * Return: the AimSoundManager interface
  331.  * Description: This function either returns(if it already exists) or queries for it and
  332.  * holds the nsIAimSoundManager interface in the CachedAimSoundManager global variable.
  333. */
  334.  
  335. function aimSoundManager()
  336. {
  337.   try {
  338.       if(CachedAimSoundManager == null)
  339.         CachedAimSoundManager = aimManager().QueryInterface(Components.interfaces.nsIAimSoundManager);
  340.   } catch (e) {}; 
  341.   return CachedAimSoundManager;
  342. }
  343.  
  344. /*
  345.  * Function: aimIM()
  346.  * Arguments: None
  347.  * Return: the AimIM interface
  348.  * Description: This function either returns(if it already exists) or queries for it and
  349.  * holds the nsIAimIM interface in the CachedAimIM global variable.
  350. */
  351.  
  352. function aimIM()
  353. {
  354.   try {
  355.       if(CachedAimIM == null)
  356.         CachedAimIM = aimManager().QueryInterface(Components.interfaces.nsIAimIM);
  357.   } catch (e) {}; 
  358.   return CachedAimIM;
  359. }
  360.  
  361. /*
  362.  * Function: aimAdminManager()
  363.  * Arguments: None
  364.  * Return: the AimAdminManager interface
  365.  * Description: This function either returns(if it already exists) or queries for it and
  366.  * holds the nsIAimAdminManager interface in the CachedAimAdminManager global variable.
  367. */
  368.  
  369. function aimAdminManager()
  370. {
  371.   try {
  372.       if(CachedAimAdminManager == null)
  373.         CachedAimAdminManager = aimManager().QueryInterface(Components.interfaces.nsIAimAdminManager);
  374.   } catch (e) {}; 
  375.   return CachedAimAdminManager;
  376. }
  377.  
  378. /*
  379.  * Function: aimABInfo()
  380.  * Arguments: None
  381.  * Return: the AimABInfo interface
  382.  * Description: This function either returns(if it already exists) or queries for it and
  383.  * holds the nsIAimABInfo interface in the CachedAimABInfo global variable.
  384. */
  385.  
  386. function aimABInfo()
  387. {
  388.   try {
  389.       if(CachedAimABInfo == null)
  390.         CachedAimABInfo = aimManager().QueryInterface(Components.interfaces.nsIAimABInfo);
  391.   } catch (e) {}; 
  392.   return CachedAimABInfo;
  393. }
  394.  
  395. /*
  396.  * Function: aimFeedbagManager()
  397.  * Arguments: None
  398.  * Return: the AimFeedbagManager interface
  399.  * Description: This function either returns(if it already exists) or queries for it and
  400.  * holds the nsIAimFeedbagManager interface in the CachedAimFeedbagManager global variable.
  401. */
  402.  
  403. function aimFeedbagManager()
  404. {
  405.   try {
  406.       if(CachedAimFeedbagManager == null)
  407.         CachedAimFeedbagManager = aimManager().QueryInterface(Components.interfaces.nsIAimFeedbagManager);
  408.   } catch (e) {}; 
  409.   return CachedAimFeedbagManager;
  410. }
  411.  
  412. /*
  413.  * Function: aimWarnings()
  414.  * Arguments: None
  415.  * Return: the AimWarnings interface
  416.  * Description: This function either returns(if it already exists) or queries for it and
  417.  * holds the nsIAimWarnings interface in the CachedAimWarnings global variable.
  418. */
  419.  
  420. function aimWarnings()
  421. {
  422.   try {
  423.       if(CachedAimWarnings == null)
  424.         CachedAimWarnings = aimManager().QueryInterface(Components.interfaces.nsIAimWarnings);
  425.   } catch (e) {}; 
  426.   return CachedAimWarnings;
  427. }
  428.  
  429. /*
  430.  * Function: aimPrefsManager()
  431.  * Arguments: None
  432.  * Return: the AimPrefsManager interface
  433.  * Description: This function either returns(if it already exists) or queries for it and
  434.  * holds the nsIAimPrefsManager interface in the CachedAimPrefsManager global variable.
  435.   * Make sure any reference to this file appears before any reference to AimIM.js in the XUL files.
  436. */
  437.  
  438. function aimPrefsManager()
  439. {
  440.   try {
  441.       if(CachedAimPrefsManager == null) 
  442.         CachedAimPrefsManager = aimManager().QueryInterface(Components.interfaces.nsIPrefsManager);        
  443.   } catch (e) {}; 
  444.   return CachedAimPrefsManager;
  445. }
  446.  
  447. /*
  448.  * Function: aimStringBundle()
  449.  * Arguments: None
  450.  * Return: the AimLocateManager interface
  451.  * Description: This function either returns(if it already exists) or queries for it and
  452.  * holds the nsIStringBundle interface in the CachedAimStringBundle global variable.
  453. */
  454.  
  455. function aimStringBundle()
  456. {
  457.   try {
  458.       if(CachedAimStringBundle == null)
  459.         CachedAimStringBundle = aimManager().QueryInterface(Components.interfaces.nsIStringBundle);
  460.   } catch (e) {}; 
  461.   return CachedAimStringBundle;
  462. }
  463.  
  464.  
  465. // The various enumerated types/interfaces
  466. /*
  467.  * Function: aimInsertionStyles()
  468.  * Arguments: None
  469.  * Return: the AimInsertionStyles  
  470.  * Description: This function either returns(if it already exists) or queries for it and
  471.  * holds the nsIAimInsertionStyles enumerated type in the CachedAimInsertionStyles global variable.
  472. */
  473.  
  474. function aimInsertionStyles()
  475. {
  476.   try {
  477.       if(CachedAimInsertionStyles == null)
  478.         CachedAimInsertionStyles = Components.interfaces.nsAimInsertionStyles;
  479.   } catch (e) {}; 
  480.   return CachedAimInsertionStyles;
  481. }
  482.  
  483. /*
  484.  * Function: aimPrivacyModes()
  485.  * Arguments: None
  486.  * Return: the AimPrivacyModes  
  487.  * Description: This function either returns(if it already exists) or queries for it and
  488.  * holds the nsIAimPrivacyModes enumerated type in the CachedAimPrivacyModes global variable.
  489. */
  490.  
  491. function aimPrivacyModes()
  492. {
  493.   try {
  494.       if(CachedAimPrivacyModes == null)
  495.         CachedAimPrivacyModes = Components.interfaces.nsAimPrivacyModes;
  496.   } catch (e) {}; 
  497.   return CachedAimPrivacyModes;
  498. }
  499.  
  500. /*
  501.  * Function: aimNormalizeScreenName()
  502.  * Arguments: 
  503.  *    oldSN -- The original screen name
  504.  * Return: the normalised formatted screenname  
  505.  * Description: This function takes a screen name and formats all the white space charaters with 
  506.  * empty string and converts the screen name into lowercase word.
  507. */
  508.  
  509. function aimNormalizeScreenName(oldSN)
  510. {
  511.     return (oldSN.replace(/\s/gi,"")).toLowerCase();
  512. }
  513.  
  514. /*
  515.  * Function: aimIsSameScreenName()
  516.  * Arguments: 
  517.  *  sN1 -- Screen name one
  518.  *  sN2 --  Screen name two
  519.  * Return: true if both screen names are same, false if not  
  520.  * Description: It is is used to know if two formatted screen names are the same.
  521.  * The aimNormalizeScreenName (See Above) function is used to get the formatted screen names.
  522. */
  523.  
  524. function aimIsSameScreenName(sN1, sN2)
  525. {
  526.      return (aimNormalizeScreenName(sN1) == aimNormalizeScreenName(sN2))
  527. }
  528.  
  529. /* 
  530.  * Function: aimMigrateBuddyList( who )
  531.  * Arguments: 
  532.  *    who --  screen name whose buddy list needs to be migrated.
  533.  * Return: None
  534.  * Description: This function is used to migrate the buddylist of the screen name with
  535.  * which the user has signed on to the aim session. This used thr AimMigratorMigrateBuddyList 
  536.  * function of the AimMigrator service which does the actual migration.
  537.  *
  538. */
  539.  
  540. function aimMigrateBuddyList( who )
  541. {
  542.     var whoMigrate = aimPrefsManager().GetCharPref("aim.session.migrateBuddyList",null, true);
  543.     if ( !whoMigrate || whoMigrate == null || whoMigrate == undefined || whoMigrate != who ) {
  544.         return;
  545.     }
  546.     var IMServiceClass;
  547.     var pAimMigrator;
  548.     try { 
  549.         IMServiceClass = Components.classes['@netscape.com/aim/AimMigrator;1'];
  550.         if ( IMServiceClass != null ) {
  551.             try {
  552.                 pAimMigrator = IMServiceClass.getService(Components.interfaces.nsIAimMigrator);
  553.                 if ( pAimMigrator != null ) {
  554.                     pAimMigrator.AimMigratorMigrateBuddyList( who );
  555.                     aimPrefsManager().SetCharPref("aim.session.migrateBuddyList", "nobody", null, true);
  556.                 }
  557.             }
  558.             catch ( exception ) {
  559.                 // nothing
  560.             }
  561.         }
  562.     }
  563.     catch ( exception ) {
  564.         // nothing
  565.     }
  566. }
  567.  
  568. /*
  569.  * Function: html( node )
  570.  * Arguments: 
  571.  *    node  --  the parent node
  572.  * Return: the entire text content of the document tree
  573.  * Description: This function recursively walks through the entire conversation window doucment
  574.  * and stores all the values in the variable answer.
  575.  *
  576. */
  577.  
  578. function html(node)
  579. {
  580.     var answer = "";
  581.     var type = node.nodeType;
  582.     if (type == Node.ELEMENT_NODE) {
  583.       answer += "<" + node.tagName;
  584.         attributes = node.attributes;
  585.         if (null != attributes) {
  586.             var countAttrs = attributes.length;
  587.             var index = 0;
  588.             while(index < countAttrs) {
  589.                 att = attributes[index];
  590.                 if (null != att) {
  591.                     answer += " " + att.name + "=\"" + att.value + "\"";
  592.                 }
  593.                 index++
  594.             }
  595.         }
  596.  
  597.         // close tag
  598.         answer += ">";
  599.  
  600.         // recursively dump the children
  601.         if (node.hasChildNodes()) {
  602.             // get the children
  603.             var children = node.childNodes;
  604.             var length = children.length;
  605.             var count = 0;
  606.             while(count < length) {
  607.                 child = children[count]
  608.                 answer += html(child)
  609.                 count++
  610.             }
  611.             answer += "</" + node.tagName + ">";
  612.         }
  613.  
  614.  
  615.     }
  616.     // if it's a piece of text just dump the text
  617.     else if (type == Node.TEXT_NODE) {
  618.         answer += node.data;
  619.     }
  620.     return answer;
  621. }
  622.  
  623. /*
  624.  * Function: createInstance( contractid, iidName  )
  625.  * Arguments: 
  626.  *    contractid  --  'ProgID' of the component class.
  627.  *    iidName -- Interface id for the object
  628.  * Return: the XPConnect wrapper for the object with the given iid
  629.  * Description: This function is used to create an instance of class. According to the progID
  630.  * and interface ID, the instance gets created and returned.
  631.  *
  632. */
  633.  
  634. function createInstance( contractid, iidName ) {
  635.   var iid = eval( "Components.interfaces." + iidName );
  636.   return Components.classes[ contractid ].createInstance( iid );
  637. }
  638.  
  639. /*
  640.  * Function: cmdFileSave()
  641.  * Arguments: None
  642.  * Return: None;
  643.  * Description: This function is called from File_>Save menu option in the IM window.
  644.  * It takes the converstaion window document and recursively walk through each documentElement
  645.  * and stores them in a variable called answer. After traversing the entire document,
  646.  * it displays the file picker dialog. Once the user chooses a filename, the SaveConversation
  647.  * function is used to write the contents of variable into the chosen file.
  648. */
  649.  
  650. function cmdFileSave()
  651. {
  652.   var answer;
  653.   var wind = top.document.getElementById("LogWnd").contentWindow;
  654.   if ( wind ) {
  655.       myhead = wind.document.getElementsByTagName("HEAD").item(0);
  656.         if (myhead == null) {
  657.             myhead = wind.document.createElement("HEAD");
  658.             myhtml = wind.document.getElementsByTagName("HTML").item(0);
  659.             myhtml.appendChild(myhead);
  660.         }
  661.         mymeta = wind.document.createElement("META");
  662.         mymeta.setAttribute("HTTP-EQUIV", "Content-Type");
  663.         mymeta.setAttribute("CONTENT", "text/html; charset=UTF-8");
  664.         myhead.appendChild(mymeta);
  665.     answer = html(wind.document.documentElement);
  666.     answer += "\n";
  667.   }
  668.   else {
  669.     return;
  670.   }
  671.   try {
  672.     var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  673.     // XXX i18n
  674.     fp.init(window, aimString( "title.saveconversation" ),  nsIFilePicker.modeSave);
  675.     fp.appendFilters(nsIFilePicker.filterHTML | nsIFilePicker.filterAll );
  676.     fp.defaultString = aimString("log.defaultfilename") + ".html";
  677.     var returnCode = fp.show();
  678.     if (returnCode == nsIFilePicker.returnOK || returnCode == nsIFilePicker.returnReplace) {
  679.       var pPAimIM = aimPIMObject();
  680.       if (pPAimIM)
  681.       {
  682.         pPAimIM.SaveConversation(fp.file.path, answer);
  683.       }
  684.     }
  685.   } catch (ex) { }
  686. }
  687.  
  688. /*
  689.  * Function: cmdFileClose()
  690.  * Arguments: None
  691.  * Return: None
  692.  * Description: This function is called from File_>Close menu item.
  693.  * It closes the current window( does not exit app).
  694. */
  695.  
  696. function cmdFileClose()
  697. {
  698.   top.close();
  699. }
  700.  
  701. /*
  702.  * Function: cmdFilePrint()
  703.  * Arguments: None 
  704.  * Return: None
  705.  * Description: This function is used to print the IM conversation window. 
  706.  * It accesses the Log window and calls the print function to print the contents.
  707. */
  708.  
  709. function cmdFilePrint(window)
  710. {
  711.   switch(window) {
  712.   case "im":
  713.           if (top.document.getElementById("LogWnd").contentWindow.document.documentElement.lastChild.firstChild != null) {
  714.             // print the contents of log window
  715.             top.document.getElementById("LogWnd").contentWindow.print();
  716.             return;
  717.           }
  718.           // No log window yet - print the compose window
  719.           NSPrint();
  720.           break;
  721.   case "chat":
  722.           top.document.getElementById("LogWnd").contentWindow.print();
  723.           break;
  724.   }
  725. }
  726.  
  727. /*
  728.  * Function: getEnums( myInterface )
  729.  * Arguments: 
  730.  *    myInterface --  Interface whose enums needs to be obtained 
  731.  * Return: all the enumerated types in the interface
  732.  * Description: This function is used to get all the enumerated types defined in the interface.
  733.  * It loops through all the variables and checks to see if it is of type number. If it is then,
  734.  * it stores all the enums os that variable in a array called enums which is returned.
  735. */
  736.  
  737. function getEnums( myInterface )
  738. {
  739.   var enums = {};
  740.   for ( var i in myInterface ) {
  741.     if ( typeof myInterface[i] == "number" ) {
  742.       enums[i] = myInterface[i];
  743.     }
  744.   }
  745.   return enums;
  746. }
  747.  
  748. /*
  749.  * Function: MigrateDiscover()
  750.  * Arguments: None
  751.  * Return: Boolean
  752.  * Description: This function uses the Aim migrator serice to see what instant messenger 
  753.  * has been used ( to migrate from). Once that version  has been determined, it then checks
  754.  * to see if there is any defaultscreen name and password stored.
  755.  * Return true, if present. Return false if not and set screen name and password to be empty.
  756. */
  757.  
  758. function MigrateDiscover()
  759. {
  760.   var IMServiceClass;
  761.   var pAimMigrator;
  762.     try { 
  763.       IMServiceClass = Components.classes['@netscape.com/aim/AimMigrator;1'];
  764.         if ( IMServiceClass != null ) {
  765.             try {
  766.                 pAimMigrator = IMServiceClass.getService(Components.interfaces.nsIAimMigrator);
  767.                 if ( pAimMigrator != null ) {
  768.                     version = pAimMigrator.AimMigratorDiscover();
  769.                     parent.migrationSource = version;
  770.                     if ( version == null || version == "" ) {
  771.                         return false;
  772.                     }
  773.  
  774.                     var stringPref = {};
  775.                     var stringPref2 = {};
  776.                     var enums = getEnums( Components.interfaces.nsIAimMigrator );
  777.                     // get the default screen name
  778.  
  779.                     var ret = pAimMigrator.AimMigratorGetStringPref2( enums.DefaultScreenName, stringPref, stringPref2 );
  780.  
  781.                     if ( ret == true ) {
  782.                         parent.migrationScreenName = stringPref.value;
  783.                         parent.migrationPassword = stringPref2.value;
  784.                     }
  785.                     else {
  786.                         parent.migrationScreenName = "";
  787.                         parent.migrationPassword = "";
  788.                     }
  789.  
  790.                     // get the remaining screen names, if any
  791.                     var stringPrefVec = {}; 
  792.                     var vecSize = {};
  793.                     stringPrefVec = pAimMigrator.AimMigratorGetStringVectorPref( enums.ScreenName, vecSize );
  794.  
  795.                     var i;
  796.                     parent.migrationScreenNameVecSize = vecSize;
  797.                     parent.migrationScreenNameVec = stringPrefVec;
  798.  
  799.                     return ret;        // all we care about is did we get a default screenname
  800.                 }
  801.             }
  802.             catch(exception) {
  803.                 return false;
  804.             }
  805.         }    
  806.     }
  807.   catch(exception) {
  808.         return false;
  809.     }
  810. }
  811.  
  812. /*
  813.  * Function: AimOnlineAway()
  814.  * Arguments: None 
  815.  * Return: Boolean
  816.  * Description: This function is used to check whether user is in away state. 
  817.  * This function uses the RDF service to access Aim Session from the Aimdatasource.
  818.  * From the aimSession, the value of the Sessionstate is retrieved and checked to see if it
  819.  * is "OnlineAway". If it is return true, otherwise return false.
  820. */
  821.  
  822. function AimOnlineAway()
  823. {
  824.     var SessionState = aimRDF().GetResource("http://home.netscape.com/NC-rdf#OnlineState");
  825.     var dataSource = aimRDFDataSource();
  826.     var AimSession = aimRDF().GetResource("NC:AIM/Session");
  827.     var target = dataSource.GetTarget(AimSession, SessionState, true);
  828.     var state = target.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  829.     if ("OnlineAway" == state)
  830.         return true;
  831.     return false;
  832. }
  833.  
  834. /*
  835.  * Function: ComeBack()
  836.  * Arguments: None 
  837.  * Return: None
  838.  * Description: This function is used when the I'mBack button is clicked or 
  839.  * whenever the user needs to get out of the "Away" state. It sets a null away message
  840.  * using the SetUserInfoAwayMessage function. 
  841. */
  842.  
  843. function ComeBack()
  844. {
  845.     locateManager = aimLocateManager();
  846.     if ( locateManager ) 
  847.         locateManager.SetUserInfoAwayMessage(null);
  848. }
  849.  
  850. /*
  851.  * Function: AimtoOpenWindowByType( inType, uri )
  852.  * Arguments:  
  853.  *    inType  --  name of the window type
  854.  *    uri   --  uri of the window to be opened
  855.  * Return: None
  856.  * Description: This function uses the windows mediator service to get the most recent window
  857.  * of the given type. If there is a window with the same type, then that window is brought to 
  858.  * focus. If no window exists, then a new window get opened.
  859. */
  860.  
  861. function AimtoOpenWindowByType( inType, uri )
  862. {
  863.   //var windowManager = Components.classes['@mozilla.org/rdf/datasource;1?name=window-mediator'].getService();
  864.   //var     windowManagerInterface = windowManager.QueryInterface( Components.interfaces.nsIWindowMediator);
  865.   var windowManagerInterface = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator);
  866.   var topWindow = windowManagerInterface.getMostRecentWindow( inType );
  867.   if ( topWindow ) {
  868.     topWindow.focus();
  869.   } 
  870.   else
  871.     window.openDialog(uri, "_blank", "chrome,all,dialog=no", "Setup");
  872. }                     
  873.  
  874. /*
  875.  * Function: aimGlobalCmdHelp()
  876.  * Arguments: None 
  877.  * Return: None
  878.  * Description: For netbusiness instant messenger client, this will call the AimtoOpenWindwoByType 
  879.  * (See Above) function with help_nim.xul. For NIM, it is called with help.xul?im. 
  880.  * These files in turn contain the help contents for the respective products.
  881. */
  882.  
  883. function aimGlobalCmdHelp()
  884. {
  885.   if (isIcq())
  886.     openHelp("icq");
  887.   else
  888.     openHelp("im");
  889. }
  890.  
  891. /*
  892.  * Function: AimgoClickThrobber(urlPref)
  893.  * Arguments: 
  894.  *  urlPref --  input url which should be loaded
  895.  * Return: None
  896.  * Description: For netbusiness instant messenger client, this will get the localised url.
  897.  * This url is then loaded in the default browser.
  898.  * for NIM, this just loads the given url in the browser.
  899. */
  900.  
  901. function AimgoClickThrobber(urlPref)
  902. {
  903.         goClickThrobber( urlPref );
  904. }
  905.  
  906. /*
  907.  * Function: GetRdfFileUrl(def_name, chg_name)
  908.  * Arguments: 
  909.  *    def_name  --  default file that needs to be copied in the case of new profile  
  910.  *    chg_name  --  the name of the file which will be appended to screen name and stores the data.
  911.  * Return: the url of the file
  912.  * Description: This function is used to get the rdf file for away messages/sign on a friend invites 
  913.  * for a given screen name. Using the directory service, the default profile and the user profile is
  914.  * obtained.  A default file is created by making a copy of the default profile file.
  915.  * This will be named after the def_name (first input parameter). e.g. in the case of away messages 
  916.  * it will be called default-messages.rdf.  A new file which is a copy of the user's profile is created.
  917.  * It will be named after the screen name for the current session. According to the second input 
  918.  * parameter it will be further identified. So e.g. in case of away message, the file will be named 
  919.  * as <screenname><chg_name>.rdf. If this file cannot be created from the user's profile, then default 
  920.  * profile file is copied over and this will now be called after the session's screen name and chg_name param. 
  921.  * The exact identity and location of this file is then obtained  by using nsIFileProtocolHandler and 
  922.  * the unique url gets returned.
  923. */
  924. function GetRdfFileUrl(def_name, chg_name, skipScreenName)
  925. {                                                                               
  926.     var directoryService  =  Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties);
  927.     var userProfile = directoryService.get("ProfD", Components.interfaces.nsIFile);
  928.     var defaultProfile = directoryService.get("profDef", Components.interfaces.nsIFile); // profile defaults
  929.     if (!defaultProfile.exists())                                   
  930.         defaultProfile = directoryService.get("ProfDefNoLoc", Components.interfaces.nsIFile); // profile defaults
  931.     var defaultInviteFile = defaultProfile.clone();                         
  932.     defaultInviteFile.append(def_name);                                     
  933.   var screenName = "";                                                
  934.   myPref = aimPrefsManager();                                         
  935.   if ( myPref && !skipScreenName )
  936.   {                                                         
  937.     try {                                                           
  938.       screenName = myPref.GetCharPref( "aim.session.screenname" , null, false);
  939.     }
  940.     catch(e)
  941.     {                                                      
  942.       screenName = "";                                        
  943.     }
  944.   }   
  945.   if ( screenName != "" )
  946.   {                                               
  947.     screenName = screenName + ".";                                  
  948.   }
  949.   else if(!skipScreenName)                                                   
  950.   {
  951.     return;                                         
  952.   }
  953.   var InviteListFile = userProfile.clone();
  954.   InviteListFile.append(screenName+chg_name);                             
  955.     if (!InviteListFile.exists()) {                                         
  956.           try {
  957.               defaultInviteFile.copyTo(userProfile,screenName+chg_name);     
  958.         }
  959.             catch (e) {
  960.                       }
  961.             InviteListFile = userProfile.clone();                           
  962.       InviteListFile.append(screenName+chg_name);                     
  963.       if (!InviteListFile.exists())    {
  964.         // Something is wrong - This should never happen
  965.         return;
  966.       }                             
  967.     }                                                                       
  968.     return aimFileProtocolHandler().getURLSpecFromFile(InviteListFile);
  969. }  
  970.  
  971. /*
  972.  * Function: getsidebarframe()
  973.  * Arguments: None
  974.  * Return: the frame which contains the sidebarbarpanel.xul
  975.  * Description: This function walks through the list of frames. If there is only one frame, then that frame is
  976.  * returned. Otherwise from the list, the frame which contains SidebarPanel.xul is returned.
  977. */
  978.  
  979. function getsidebarframe()
  980. {
  981.   var frame_list=window.frames;
  982.      if (frame_list.length==0)
  983.        return window;
  984.   for (var i=0; i<frame_list.length; i++) {
  985.        if (frame_list[i].location =="chrome://aim/content/SidebarPanel.xul")
  986.              return frame_list[i];
  987.      }
  988.     return window;    
  989.                                                                              
  990. function aimString(name)
  991. {
  992.  
  993.     var myAimSession = aimSession();
  994.     if ( myAimSession ) {
  995.         var pIStringBundle = aimSession().QueryInterface(Components.interfaces.nsIStringBundle);
  996.         if (pIStringBundle)
  997.             return pIStringBundle.GetStringFromName(name);
  998.     }
  999.     return "";
  1000. }
  1001.  
  1002. function aimErrorBox(errorText)
  1003. {
  1004.     top.alert(errorText);
  1005. }
  1006.  
  1007.  
  1008. /*
  1009.  * Function: processAwayMsg(msg)
  1010.  *
  1011.  * Arguments: msg
  1012.  * 
  1013.  * Return: msg with real away msgs.
  1014.  *
  1015.  * Description: This fn takes a msg (like "Hi %n, howdy?") and converts to real away msgs (like "Hi screenname, howdy?").
  1016.  *
  1017.  * Author: Suresh Kasinathan<suresh@netscape.com> 12/10/01
  1018.  *              
  1019. */
  1020.  
  1021. function processAwayMsg(msg)
  1022. {
  1023.   var sn;
  1024.   var pIAimSession = aimSession();
  1025.   if(pIAimSession)
  1026.     sn = pIAimSession.CurrentScreenName;
  1027.   else
  1028.     sn = "";
  1029.   var date = new Date();
  1030.   var dateService = Components.classes["@mozilla.org/intl/scriptabledateformat;1"].getService(Components.interfaces.nsIScriptableDateFormat);
  1031.   var time =  dateService.FormatTime(
  1032.                               "",
  1033.                               dateService.timeFormatNoSeconds,
  1034.                               date.getHours(),
  1035.                               date.getMinutes(),
  1036.                               date.getSeconds());
  1037.  
  1038.   var day =  dateService.FormatDate(
  1039.                               "",
  1040.                               dateService.dateFormatShort,
  1041.                               date.getFullYear(),
  1042.                               date.getMonth()+1,
  1043.                               date.getDate());
  1044.  
  1045.   msg = msg.replace(/%t/gi, time);
  1046.   msg = msg.replace(/%d/gi, day);
  1047.   msg = msg.replace(/%n/gi, sn);
  1048.   return msg;
  1049. }
  1050.  
  1051.  
  1052.  /******
  1053.   * Returns a string with the difference between two dates looking like: "x days, x hours, x minutes."
  1054.   * Both parameters are dates in seconds since 1/1/1970 00:00:00.
  1055.   ******/
  1056.  
  1057. function getPrettyDateDiff(aDate2, aDate1)
  1058. {
  1059.   var diff = aDate2-aDate1;
  1060.   var pretty = "";
  1061.    
  1062.   var dayDiff = Math.floor(diff / 86400);
  1063.   diff %= 86400;
  1064.   if (dayDiff > 0) {
  1065.     pretty += dayDiff + " " + (dayDiff == 1 ? aimString("tooltip.day") : aimString("tooltip.days"));
  1066.   }
  1067.    
  1068.   var hourDiff = Math.floor(diff / 3600);
  1069.   diff %= 3600;
  1070.   if (hourDiff > 0) {
  1071.     pretty += (pretty.length > 0 ? ", " : "") + hourDiff + " " + (hourDiff == 1 ? aimString("tooltip.hour") : aimString("tooltip.hours"));
  1072.   }
  1073.    
  1074.   var minDiff = Math.floor(diff / 60);
  1075.   if (minDiff > 0) {
  1076.     pretty += (pretty.length > 0 ? ", " : "") + minDiff + " " + (minDiff == 1 ? aimString("tooltip.minute") : aimString("tooltip.minutes"));
  1077.   }
  1078.    
  1079.   return pretty;
  1080. }
  1081.  
  1082.  
  1083. /*
  1084.  * Function: validateEmailAddress()
  1085.  *
  1086.  * Arguments: email address
  1087.  * 
  1088.  * Return: boolean true if the email address is valid
  1089.  *         boolean false if the email address is invalid
  1090.  *
  1091.  * Description: Called from the above function to validate the email address. Length and special characters are validated.
  1092.  *
  1093.  * Author: Suresh Kasinathan<suresh@netscape.com> 11/15/01
  1094.  *        
  1095. */
  1096.  
  1097. function validateEmailAddress(emailElement)
  1098. {
  1099.   // var email = emailElement.value;
  1100.   var emailArray = emailElement.split('@');
  1101.  
  1102.   if (emailArray.length != 2 ||
  1103.       !emailArray[0].length ||
  1104.       !emailArray[1].length || 
  1105.       containsIllegalCharacter(emailArray[0]) ||
  1106.       containsIllegalCharacter(emailArray[1]) ) {
  1107.         // aimErrorBox(aimString("msg.enterValidEmail"));
  1108.         return false;
  1109.   }
  1110.     
  1111.   return true;
  1112. }
  1113.  
  1114. /*
  1115.  * Function: containsIllegalCharacter()
  1116.  *
  1117.  * Arguments: string
  1118.  * 
  1119.  * Return: boolean true if the string doesnot contain illegal characters.
  1120.  *         boolean false if the string contain illegal characters.
  1121.  *
  1122.  * Description: This function checks for common illegal characters. 
  1123.  *
  1124.  * Author: Suresh Kasinathan<suresh@netscape.com> 11/15/01
  1125.  *        
  1126. */
  1127.  
  1128. function containsIllegalCharacter(aString)
  1129. {
  1130.   for (var i=0; i < aString.length; i++) {
  1131.     var code = aString.charCodeAt(i);
  1132.     if (code > 127)
  1133.       return true; // non-ASCII
  1134.     else if (code == 9 || code == 10 || code == 11 || code == 32)
  1135.       return true; // white space
  1136.     else if (code == 64)
  1137.       return true; // '@'
  1138.   }
  1139.   return false;
  1140.  
  1141.  
  1142. /* Returns the selected tree/tree name based on the selected tab (online or listsetup) */
  1143. function getSelectedTreeName()
  1144. {
  1145.   var sidebarframe=getsidebarframe();
  1146.   var tab = sidebarframe.document.getElementById("OnlineOrgTabPanel");
  1147.   var tree;
  1148.   if (tab.selectedIndex == 0)
  1149.     tree = sidebarframe.document.getElementById("OnlineBuddies");
  1150.   else
  1151.     tree = sidebarframe.document.getElementById("ListSetup");
  1152.  
  1153.   return tree;
  1154. }
  1155.  
  1156. /* Returns the column name for the selected tab*/
  1157. function getSelectedTabName()
  1158. {
  1159.   var sidebarframe=getsidebarframe();
  1160.   var tab = sidebarframe.document.getElementById("OnlineOrgTabPanel");
  1161.   if (tab.selectedIndex == 0)
  1162.     return "BuddiesCol"
  1163.   else
  1164.     return "ListSetupCol"
  1165. }
  1166.  
  1167. /*this returns the target for the given source, attribute(property) in the tree*/
  1168. function GetBuddyAttribute(tree, source, attribute)
  1169. {
  1170.   var RDF = aimRDF();
  1171.   var property = RDF.GetResource("http://home.netscape.com/NC-rdf#" + attribute);
  1172.   var target = tree.database.GetTarget(source, property, true);
  1173.   if (target)
  1174.     target = target.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  1175.   return target;
  1176. }
  1177.  
  1178. /* returns the resource at the given index */
  1179. function GetBuddyResource(tree, index)
  1180. {
  1181.   var RDF = aimRDF();
  1182.   var item = tree.contentView.getItemAtIndex(index);
  1183.   return RDF.GetUnicodeResource(item.id);
  1184. }
  1185.  
  1186. /*
  1187. * Name: getSelectedScreenName
  1188. * Arguments: tree 
  1189. * Description:
  1190. *  This function returns the selected item's screenname value if selected item has this attribute. 
  1191. * Return Value: screenName
  1192. * Author: Prassanna<prass@netscape.com>, Joseph Elwell<jelwell@netscape.com>
  1193. */
  1194.  
  1195. function getSelectedScreenName()
  1196. {
  1197.   var tree = getSelectedTreeName();
  1198.   var col = getSelectedTabName();
  1199.   if (!tree || !col) return;
  1200.   var screenName = null;
  1201.   var currentIndex = tree.currentIndex;
  1202.   if (currentIndex > 0) {
  1203.     var isContainer = tree.treeBoxObject.view.isContainer(currentIndex);
  1204.     //if it is a container (groups or Offline group) return null
  1205.     if (!isContainer) {
  1206.       var buddyResource = GetBuddyResource(tree, currentIndex);
  1207.       var screenName = GetBuddyAttribute(tree, buddyResource, "ScreenName");
  1208.     }
  1209.   }
  1210.   return screenName;
  1211. }
  1212.  
  1213.  
  1214. function getGroupForScreenName()
  1215. {
  1216.   var tree = getSelectedTreeName();
  1217.   var col = getSelectedTabName();
  1218.   if (!tree || !col) return;
  1219.   var groupName = null;
  1220.   var currentIndex = tree.currentIndex;
  1221.   if (currentIndex > 0) {
  1222.     var parentIndex = tree.treeBoxObject.view.getParentIndex(currentIndex);
  1223.     var parentResource = GetBuddyResource(tree, parentIndex);
  1224.     groupName = GetBuddyAttribute(tree, parentResource, "Name");
  1225.   }
  1226.   return groupName;
  1227. }
  1228.  
  1229.  
  1230. /*
  1231. * Name: checkInputEmail
  1232. * Arguments: input email value 
  1233. * Description:
  1234. *  This function returns a boolean value based on whether the input is a valid email-address
  1235. * Return Value: boolean
  1236. * Author: Prassanna<prass@netscape.com> 
  1237. */
  1238.  
  1239.  
  1240. function checkInputEmail( email)
  1241. {
  1242.   var emailArray=email.split('@');
  1243.   var emailArray2=email.split('.');
  1244.   var alertText;
  1245.   if (email.length =="") {
  1246.     aimErrorBox(aimString("msg.Invalidemail"));
  1247.     return false;
  1248.   }
  1249.   if (emailArray.length != 2 || emailArray[0] == "" || emailArray[1] == "") {
  1250.     aimErrorBox(aimString("msg.Invalidemail"));
  1251.     return false;
  1252.   }
  1253.   if (emailArray2.length < 2) { 
  1254.     aimErrorBox(aimString("msg.Invalidemail"));
  1255.     return false;
  1256.   }
  1257.   for (i=0; i<emailArray2.length; i++)
  1258.   {
  1259.     if (emailArray2[i] == "") {
  1260.       aimErrorBox(aimString("msg.Invalidemail"));
  1261.       return false;
  1262.     }
  1263.   }
  1264.   return true;
  1265. }
  1266.  
  1267. /*
  1268. * Name: setConnectionInfo
  1269. * Arguments: connectionName, aClient, screenName
  1270. * Description:
  1271. *  This function sets current connection
  1272. * Return Value: true
  1273. * Author: A Averbukh<anatoliya@netscape.com> 
  1274. */
  1275. function setConnectionInfo (connectionName, aClient, screenName)
  1276. {
  1277.     var curSession;
  1278.     if (connectionName =="AIM")
  1279.         curSession = 0;
  1280.     else // ICQ
  1281.         curSession = 2;
  1282.  
  1283.         
  1284.  
  1285.     manPref = aimPrefsManager();
  1286.             
  1287.     var Host           = manPref.GetCharPrefEdit ("aim.session.host",           null, 2, "", curSession);
  1288.     var Port           = manPref.GetIntPrefEdit  ("aim.session.port",           null, 2, "", curSession);
  1289.     var ProxyHost      = manPref.GetCharPrefEdit ("aim.session.proxyhost",      null, 2, "", curSession);
  1290.     var ProxyPort      = manPref.GetIntPrefEdit  ("aim.session.proxyport",      null, 2, "", curSession);
  1291.     var ProxyUser      = manPref.GetWCharPrefEdit("aim.session.proxyuser",      null, 2, "", curSession);
  1292.     var ProxyPassword  = manPref.GetWCharPrefEdit("aim.session.proxypassword",  null, 2, "", curSession);
  1293.     var ProxyProtocol  = manPref.GetIntPrefEdit  ("aim.session.proxyprotocol",  null, 2, "", curSession);
  1294.     var useProxy       = manPref.GetBoolPrefEdit ("aim.session.isproxy",        null, 2, "", curSession);
  1295.     var ConnectionType = manPref.GetIntPrefEdit  ("aim.session.connectiontype", null, 2, "", curSession);                                                
  1296.  
  1297. dump("Host=" + Host + " Port=" + Port + " ProxyHost=" + ProxyHost + " ProxyPort=" + ProxyPort + "\n");
  1298. dump("ProxyUser=" + ProxyUser + " ProxyPassword=" + ProxyPassword + " ProxyProtocol=" + ProxyProtocol + "\n");
  1299. dump("useProxy=" + useProxy + " ConnectionType=" + ConnectionType + "\n");
  1300.  
  1301.  
  1302.         if (aClient == "im") { // internal session
  1303.  
  1304.         manPref.SetIntPrefEdit  ("aim.internal.intsessiontype",  curSession,    
  1305.                                      null, 1, "", -1);
  1306.         manPref.SetWCharPrefEdit("aim.internal.intname",         connectionName, 
  1307.                                      null, 1, "", -1);
  1308.         manPref.SetCharPrefEdit("aim.internal.inthost",             Host,           
  1309.                                      null, 1, "", -1);
  1310.         manPref.SetIntPrefEdit  ("aim.internal.intport",            Port,           
  1311.                                      null, 1, "", -1);
  1312.         manPref.SetCharPrefEdit("aim.internal.intproxyhost",        ProxyHost,      
  1313.                                      null, 1, "", -1);
  1314.         manPref.SetIntPrefEdit  ("aim.internal.intproxyport",       ProxyPort,      
  1315.                                      null, 1, "", -1);
  1316.         manPref.SetWCharPrefEdit("aim.internal.intproxyuser",       ProxyUser,      
  1317.                                      null, 1, "", -1);
  1318.         manPref.SetWCharPrefEdit("aim.internal.intproxypassword",   ProxyPassword,  
  1319.                                      null, 1, "", -1);
  1320.         manPref.SetIntPrefEdit  ("aim.internal.intproxyprotocol",   ProxyProtocol,  
  1321.                                      null, 1, "", -1);
  1322.             manPref.SetBoolPrefEdit ("aim.internal.intisproxy",      useProxy,                 
  1323.                                      null, 1, "", -1);
  1324.         manPref.SetIntPrefEdit  ("aim.internal.intconnectiontype",  ConnectionType,                 
  1325.                                      null, 1, "", -1);                                           
  1326.         }
  1327.         else { //external session
  1328.  
  1329.         manPref.SetIntPrefEdit  ("aim.internal.extsessiontype",  curSession,    
  1330.                                      null, 1, "", -1);
  1331.         manPref.SetWCharPrefEdit("aim.internal.extname",         connectionName, 
  1332.                                      null, 1, "", -1);
  1333.         manPref.SetCharPrefEdit("aim.internal.exthost",           Host,           
  1334.                                      null, 1, "", -1);
  1335.         manPref.SetIntPrefEdit  ("aim.internal.extport",          Port,           
  1336.                                      null, 1, "", -1);
  1337.         manPref.SetCharPrefEdit("aim.internal.extproxyhost",      ProxyHost,      
  1338.                                      null, 1, "", -1);
  1339.         manPref.SetIntPrefEdit  ("aim.internal.extproxyport",     ProxyPort,      
  1340.                                      null, 1, "", -1);
  1341.         manPref.SetWCharPrefEdit("aim.internal.extproxyuser",     ProxyUser,      
  1342.                                      null, 1, "", -1);
  1343.         manPref.SetWCharPrefEdit("aim.internal.extproxypassword", ProxyPassword,  
  1344.                                      null, 1, "", -1);
  1345.         manPref.SetIntPrefEdit  ("aim.internal.extproxyprotocol", ProxyProtocol,  
  1346.                                      null, 1, "", -1);
  1347.             manPref.SetBoolPrefEdit ("aim.internal.extisproxy",      useProxy,   
  1348.                                      null, 1, "", -1);  
  1349.         manPref.SetIntPrefEdit  ("aim.internal.extconnectiontype", ConnectionType,   
  1350.                                      null, 1, "", -1);  
  1351.         }
  1352.  
  1353.         return true;
  1354.  
  1355.     }
  1356.  
  1357.  
  1358. /*
  1359.  * Function: GetPanelSessionType 
  1360.  * Arguments: 
  1361.  * Return: the url of the file
  1362.  * Description: returns current pref panel type
  1363.  * The function is used for preferences
  1364.  * Author: A Averbukh<anatoliya@netscape.com> 
  1365. */
  1366.  
  1367. function GetPanelSessionType()
  1368. {
  1369.  
  1370.     if (document.documentElement.getAttribute("isIcqPanel") == "true")
  1371.         return 2;
  1372.     else//AIM
  1373.         return 0;
  1374.  
  1375. }
  1376.  
  1377. /*
  1378.  * Function: CopynGetUrl (def_name, chg_name)
  1379.  * Arguments: 
  1380.  *    def_name  --  default file that needs to be copied in the case of new profile  
  1381.  *    chg_name  --  the name of the file which will be appended to screen name and stores the data.
  1382.  * Return: the url of the file
  1383.  * Description: The same one as GetRdfFileUrl, except: it copies file to user's profile without adding SN to the file name
  1384.  * The function is used for connection settings
  1385. */
  1386. function CopynGetUrl (def_name, chg_name) 
  1387. {
  1388.     var directoryService  =  Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties);
  1389.     
  1390.     var userProfile = directoryService.get("ProfD", Components.interfaces.nsIFile);
  1391.     var defaultProfile = directoryService.get("profDef", Components.interfaces.nsIFile);
  1392.     if (!defaultProfile.exists())                                   
  1393.         defaultProfile = directoryService.get("ProfDefNoLoc", Components.interfaces.nsIFile); 
  1394.  
  1395.  
  1396.     var defaultConnections = defaultProfile.clone();                         
  1397.     defaultConnections.append(def_name);                                 
  1398.  
  1399.     var UserConnections = userProfile.clone();
  1400.     UserConnections.append(chg_name); 
  1401.     
  1402.     if (!UserConnections.exists()) 
  1403.     { 
  1404.       try 
  1405.       {
  1406.         defaultConnections.copyTo(userProfile, chg_name);     
  1407.       }
  1408.       catch (e) 
  1409.       {
  1410.  
  1411.         return null;
  1412.       }
  1413.                       
  1414.       UserConnections = userProfile.clone();                           
  1415.       UserConnections.append(chg_name);   
  1416.  
  1417.     }  
  1418.  
  1419.     return aimFileProtocolHandler().getURLSpecFromFile(UserConnections);
  1420. }
  1421.  
  1422. /*
  1423.  * Function: isIcq
  1424.  * Arguments: 
  1425.  * Return: boolean
  1426.  * Description: returns true is it is icq session, false if not
  1427.   * Author: Prassanna<prass@netscape.com> 
  1428. */
  1429. function isIcq()
  1430. {
  1431.   var SessionType=getCurrentSessionType();
  1432.   if (SessionType == "ICQ")
  1433.   {
  1434.     return true;
  1435.    }
  1436.    return false;
  1437. }
  1438.  
  1439. /*
  1440.  * Function: getCurrentSessionType
  1441.  * Arguments: 
  1442.  * Return: Value of sessionType
  1443.  * Description: If cached sessionType value exists, return that value, else obtain sessionType from prefs.
  1444.  * This will be used in most windows where the user is logged in and is attached to one session and is safe to 
  1445.  * look at cached value.
  1446.  * Author: Prassanna<prass@netscape.com> 
  1447. */
  1448. function getCurrentSessionType()
  1449. {
  1450.  try {
  1451.       // if(CachedSessionType == null)
  1452.             CachedSessionType = aimPrefsManager().GetCharPref("aim.session.userconnectionname", null, true);
  1453.   } catch (e) {}; 
  1454.   return CachedSessionType;
  1455.  }
  1456.  
  1457. function setCurrentSessionType(conval)
  1458. {
  1459.    CachedSessionType=conval;
  1460.    aimPrefsManager().SetCharPref("aim.session.userconnectionname", conval, null, true);
  1461. }
  1462.  
  1463. /*
  1464.  * Function: getSessionType
  1465.  * Arguments: 
  1466.  * Return: Value of sessionType
  1467.  * Description: Obtain the sessionType from prefs everytime. Differnt from the above where a cahced value is used.
  1468.  * This will be used in sidebarpanel and app windows where user could change it before loggin in.
  1469.  * Author: Prassanna<prass@netscape.com> 
  1470. */
  1471.  
  1472. function getSessionType() {
  1473.   return(aimPrefsManager().GetSessionType());
  1474. }
  1475.  
  1476. /*
  1477.  * Function: IsServiceCorrect (curSN, curConnName)
  1478.  * Arguments: 
  1479.  *    curSN        --  cureent SN
  1480.  *    curConnName  --  cureent connection name
  1481.  * Return: true/false 
  1482.  * Description: Check, if curSN can be used to sign on to service curConnName
  1483.  * Author: Anatoliy Averbukh<anatoliya@netscape.com> 
  1484. */
  1485. function IsServiceCorrect (curSN, curConnName)
  1486. {
  1487.    var curTypeperSN = aimPrefsManager().GetSessionTypeEdit (curSN);
  1488.  
  1489.    var nCurConn;
  1490.  
  1491.    if (curConnName =="AIM") {
  1492.       nCurConn = 0;
  1493.    }
  1494.    else if (curConnName =="ICQ"){
  1495.       nCurConn = 2;
  1496.    }
  1497.    else {
  1498.       return false;
  1499.    }
  1500.  
  1501.    if (nCurConn == curTypeperSN) {
  1502.        return true;
  1503.    }
  1504.    else {
  1505.        if (curConnName =="AIM")
  1506.         aimErrorBox(aimString("msg.wrongsrv").replace(/%ScreenName%/, '"' + curSN + '"'));
  1507.        else
  1508.         aimErrorBox(aimString("msgICQ.wrongsrv").replace(/%ScreenName%/, '"' + curSN + '"'));
  1509.  
  1510.         return false;
  1511.    }
  1512.  
  1513.       
  1514.  
  1515. }
  1516.  
  1517.  
  1518.  
  1519. /*
  1520.  * Function:  openRegisterLink(sessionID)
  1521.  *
  1522.  * Arguments: sessionID
  1523.  * Possible values: sessionWatcher (inside sidebar), sessionAppWatcher (from menu)
  1524.  *
  1525.  * Return: None
  1526.  *
  1527.  * Description: This function is called when the register link in sigon overlay is invoked. It opens 
  1528.  * registration url for icq if session is icq. If session is Aim, it opens the regitration wizard.
  1529.  * Note: this is a clone of the function openRegisterLink() in SidebarPanel.js except this getting a  
  1530.  * app-level session element
  1531.  *
  1532.  * Author: Prassanna 4/06/2002
  1533.  */
  1534.  
  1535. function openRegisterLink(sessionID)
  1536. {
  1537.  if(sessionID != null  && sessionID  !=""){
  1538.  
  1539.   var checkSession=window.document.getElementById(sessionID).getAttribute('sessionMode'); 
  1540.   if (checkSession == "Aim")
  1541.     {
  1542.       aimGlobalCmdStartupWizard();
  1543.       return;
  1544.     }
  1545.   else
  1546.     {
  1547.       regLink = aimRegionString("icq.register.url");
  1548.       openTopWin(regLink);  
  1549.       return;
  1550.     }
  1551.  } 
  1552. }
  1553.  
  1554. /*
  1555.  * Function:  cmdIcqSearch()
  1556.  *
  1557.  * Arguments: None
  1558.  * Return: None
  1559.  *
  1560.  * Description: This function is used as a workaround to go to a web page and do user search since we do not support
  1561.  * server side search for Machv.
  1562.  *
  1563.  * Author: Prassanna 4/29/2002
  1564.  */
  1565.  
  1566.  
  1567. function cmdIcqSearch()
  1568. {
  1569.    var url=aimRegionString("icq.search.url");
  1570.    if (window.opener) {
  1571.        // From add buddy modal dialog
  1572.        window.opener.openDialog("chrome://navigator/content/navigator.xul", "_blank","modal=no,chrome,all,dialog=no", url);
  1573.        return;
  1574.        //Since we have a modal window opening some other window (yuk!), this opener stuff is there
  1575.       // Clean this up post-Machv when real icq search is supported
  1576.    }
  1577.    openDialog("chrome://navigator/content/navigator.xul", "_blank","modal=no,chrome,all,dialog=no", url);
  1578. }
  1579.  
  1580. /*
  1581.  * Function: openPrefWindow
  1582.  * Arguments: none
  1583.  * Return: none
  1584.  * Description: opens the pref window based on session type.
  1585.  * Author: Suresh <suresh@netscape.com> 
  1586. */
  1587. function openPrefWindow()
  1588. {
  1589.   if (isIcq())
  1590.     goPreferences('instantmessenger', 'chrome://aim/content/pref-Icq_icq.xul','icq');
  1591.   else
  1592.     goPreferences('instantmessenger', 'chrome://aim/content/pref-IM_instantmessage.xul','instantmessenger');
  1593. }
  1594.  
  1595.  
  1596. /*
  1597.  * Function: cachedUserConnection
  1598.  * Arguments: None
  1599.  * Return: connection name
  1600.  * Description: returns AIM or ICQ
  1601.   * Author: Prassanna<prass@netscape.com> 
  1602. */
  1603. function cachedUserConnection()
  1604. {
  1605.   try {
  1606.       if(CachedUserConnection== null)
  1607.             CachedUserConnection= aimPrefsManager().GetCharPref("aim.session.userconnectionname", null, true);
  1608.   } catch (e) {}; 
  1609.   return CachedUserConnection;
  1610. }
  1611.       
  1612. function getSelectedDisplayName()
  1613. {
  1614.   var tree = getSelectedTreeName();
  1615.   var col = getSelectedTabName();
  1616.   if (!tree || !col) return;
  1617.   var displayName = null;
  1618.   var currentIndex = tree.currentIndex;
  1619.   if (currentIndex > 0) {
  1620.     var isContainer = tree.treeBoxObject.view.isContainer(currentIndex);
  1621.     //if it is a container (groups or Offline group) return null
  1622.     if (!isContainer) {
  1623.       var buddyResource = GetBuddyResource(tree, currentIndex);
  1624.       var displayName = GetBuddyAttribute(tree, buddyResource, "Name");
  1625.     }
  1626.   }
  1627.   return displayName;
  1628. }
  1629.  
  1630. /* Selects the given index in the buddy list */
  1631. function SelectIndex(index)
  1632. {
  1633.   if (aimSession().IsOnline()) {
  1634.     var tree = getSelectedTreeName();
  1635.     var treeselection = tree.treeBoxObject.selection;
  1636.     treeselection.select(index);
  1637.   }
  1638. }
  1639.  
  1640. function openMailCompose(emailaddresses)
  1641. {
  1642.   var msgComposeType = Components.interfaces.nsIMsgCompType;
  1643.   var msgComposFormat = Components.interfaces.nsIMsgCompFormat;
  1644.   var msgComposeService = Components.classes["@mozilla.org/messengercompose;1"].getService();
  1645.   msgComposeService = msgComposeService.QueryInterface(Components.interfaces.nsIMsgComposeService);
  1646.  
  1647.   var params = Components.classes["@mozilla.org/messengercompose/composeparams;1"].createInstance(Components.interfaces.nsIMsgComposeParams);
  1648.   if (params)
  1649.   {
  1650.     params.type = msgComposeType.New;
  1651.     params.format = msgComposFormat.Default;
  1652.     var composeFields = Components.classes["@mozilla.org/messengercompose/composefields;1"].createInstance(Components.interfaces.nsIMsgCompFields);
  1653.     if (composeFields)
  1654.     {
  1655.       composeFields.to = emailaddresses;
  1656.       params.composeFields = composeFields;
  1657.       msgComposeService.OpenComposeWindowWithParams(null, params);
  1658.     }
  1659.   }
  1660. }
  1661.  
  1662. function sendfile(screenName) {
  1663.   inviteArgsObj = {
  1664.     inviteProposalScreenName: screenName,
  1665.     inviteProposalObj: null,
  1666.     inviteToExistingWindow: false,
  1667.     inviteMode: 'outgoingfile'
  1668.   }
  1669.   window.openDialog('chrome://aim/content/sendfile.xul','_blank','chrome,all,dialog=no',inviteArgsObj);
  1670. }
  1671.  
  1672.  
  1673. /*
  1674.  * Function: isValidChar
  1675.  * Arguments: string
  1676.  * Return: boolean
  1677.  * Description: Checks for invalid characters for buddynames. Except for alphanumeric chars, digits, 
  1678.  * comma, colon, underscore and forward slash, other special chars are invalid.
  1679.  * Author: Prassanna<prass@netscape.com> 
  1680. */
  1681.  
  1682. function IsValidChar(cp)
  1683. {
  1684.   var c;
  1685.   var j;
  1686.   for (j=0; j < cp.length; j++)
  1687.   {
  1688.     c= cp.charCodeAt(j);
  1689.     if ( ((c > 32) &&  (c < 44)) || ((c > 57) &&  (c < 64)) || ((c > 90) &&  (c < 95)) || (c == 96) || c > 122 )
  1690.       return false;
  1691.   }  
  1692.   return true;
  1693. }
  1694.  
  1695.  
  1696. function IsValidLength(screenName)
  1697. {
  1698.   var nLen;
  1699.   if ((!screenName) || (screenName == null) || (screenName == ''))
  1700.   {
  1701.     return false;
  1702.   }
  1703.   nLen = screenName.length;
  1704.   if (nLen > 16 || nLen < 3) {
  1705.     return false;
  1706.   }
  1707.   return true;
  1708. }
  1709.  
  1710. function getPreaknessFlag()
  1711. {
  1712.   var myaimSession = aimSession();
  1713.   if (myaimSession) {
  1714.     return myaimSession.preaknessFlag;
  1715.   }
  1716.   else
  1717.     return false;
  1718. }
  1719.  
  1720. function IsIcqServiceUser(buddy)
  1721. {
  1722.   var isAllDigits = false;
  1723.   var cp = new String(buddy);
  1724.   if ((cp.charCodeAt(0) > 47) && (cp.charCodeAt(0) < 58))
  1725.   // Begins with a number - so icq
  1726.     isAllDigits=true;
  1727.   return isAllDigits;
  1728. }
  1729.  
  1730. // MERC JVL
  1731. // Retrieve the SNS password given the screenname
  1732. function GetSNSPassword(screenName)
  1733. {
  1734.   if(screenName && aimSession())
  1735.     return aimSession().GetSavedPassword(screenName);
  1736.  
  1737.   return "";
  1738. }
  1739.  
  1740. // MERC JVL
  1741. // Is the autologin flag set for the given screenname?
  1742. function IsSNSAutoLogin(screenName)
  1743. {
  1744.   if(!aimSession())
  1745.     return false;
  1746.  
  1747.   var screenNamePref = aimSession().CurrentScreenName;
  1748.   if (screenName)
  1749.     screenNamePref = screenName;
  1750.  
  1751.   if(!aimPrefsManager())
  1752.     return false;
  1753.  
  1754.   screenNamePref += ".aim.session.autologin";
  1755.   return aimPrefsManager().GetBoolPref(screenNamePref, null, true);
  1756. }
  1757.  
  1758. // MERC JVL
  1759. // Retrieve the Netscape SNS screenname
  1760. function GetSNSScreenName()
  1761. {
  1762.   var prefService = Components.classes["@mozilla.org/preferences-service;1"]
  1763.                               .getService(Components.interfaces.nsIPrefBranch);
  1764.   if (prefService && prefService.getPrefType("netscape.sns.screenname"))
  1765.       return prefService.getCharPref("netscape.sns.screenname");
  1766.  
  1767.   return "";
  1768. }
  1769.  
  1770. // MERC JVL
  1771. // Retrieve the AIM screenname
  1772. function GetAIMScreenName()
  1773. {
  1774.   var prefService = Components.classes["@mozilla.org/preferences-service;1"]
  1775.                               .getService(Components.interfaces.nsIPrefBranch);
  1776.   if (prefService)
  1777.   {
  1778.     try
  1779.     {
  1780.       return prefService.getCharPref("aim.session.latestaimscreenname");
  1781.     }
  1782.     catch(e) {};
  1783.   }
  1784.  
  1785.   return "";
  1786. }
  1787.  
  1788. // MERC JVL
  1789. // Check if the SNS fields have actually been filled out or not
  1790. function IsSNSEnabled()
  1791. {
  1792.   var screenName = GetSNSScreenName();
  1793.   var password = GetSNSPassword(screenName);
  1794.   return (screenName.length > 0) && (password.length > 0);
  1795. }
  1796.  
  1797.  
  1798.  
  1799. /* function : addSnsLoginName
  1800.  * Argument : newName 
  1801.  * Description: It is to add the sns Screenname to the loginNames-aim.rdf file
  1802.  * located in the profile folder.
  1803.  */
  1804. function addSnsLoginName(newName)
  1805. {
  1806.   var loginContainer = null;
  1807.   var loginRDF = aimRDF();
  1808.   var loginRDFCU = Components.classes['@mozilla.org/rdf/container-utils;1'].getService(Components.interfaces.nsIRDFContainerUtils);
  1809.   var loginNamesfile; 
  1810.   var refid;
  1811.   var  loginDS;
  1812.    
  1813.  
  1814.    loginNamesfile = GetRdfFileUrl("loginNames-aim.rdf", "loginNames-aim.rdf", 1);
  1815.    refid = "NC:AIM/LoginNamesBag";  
  1816.  
  1817.  
  1818.  
  1819.   try {
  1820.     loginDS = loginRDF.GetDataSourceBlocking(loginNamesfile);
  1821.   } catch (e) {
  1822.     return;
  1823.     dump("need to get the new loginNames-*.rdf files into this profile\n");
  1824.   }
  1825.   if (loginDS)
  1826.     loginDS = loginDS.QueryInterface(Components.interfaces.nsIRDFDataSource);
  1827.   
  1828.   if (loginContainer == null)
  1829.     loginContainer = Components.classes["@mozilla.org/rdf/container;1"].createInstance(Components.interfaces.nsIRDFContainer);
  1830.   
  1831.   if (loginContainer)
  1832.   {
  1833.     var containerRes = loginRDF.GetResource(refid);
  1834.     var checkIfSeq = loginRDFCU.IsSeq(loginDS, containerRes);
  1835.     if (!checkIfSeq)
  1836.       loginRDFCU.MakeSeq(loginDS, containerRes);
  1837.     loginContainer.Init(loginDS, containerRes);
  1838.  
  1839.     // Check to see if this loginname is already in the list.
  1840.     var elements = loginContainer.GetElements();
  1841.     var nameResource = loginRDF.GetResource("http://home.netscape.com/NC-rdf#LoginName");
  1842.     var node, target;
  1843.     while (elements.hasMoreElements())
  1844.     {
  1845.       node = elements.getNext();
  1846.       if (node)
  1847.       {
  1848.         target = loginDS.GetTarget( node, nameResource, true);
  1849.         if (target)
  1850.         {
  1851.           target = target.QueryInterface(Components.interfaces.nsIRDFLiteral);
  1852.           if (target && target.Value == newName)
  1853.           {
  1854.             return;
  1855.           }
  1856.         }
  1857.       }
  1858.     }
  1859.   }
  1860.   
  1861.   var newMsg = loginRDF.GetAnonymousResource();
  1862.   loginDS.Assert(newMsg, loginRDF.GetResource("http://home.netscape.com/NC-rdf#LoginName"), loginRDF.GetLiteral(newName), true);
  1863.   loginContainer.AppendElement(newMsg);
  1864.   loginDS.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush();
  1865. }
  1866.  
  1867.  
  1868. /*
  1869. * Find the Screen Name Service Passcard if it exists, otherwise, return null
  1870. */
  1871. function FindSNSPasscard (kPasscardHost) {
  1872.     
  1873.     // xpconnect to password manager interfaces
  1874.     var passwordmanager = Components.classes["@mozilla.org/passwordmanager;1"].getService(Components.interfaces.nsIPasswordManager);
  1875.     if (passwordmanager) {
  1876.             var enumerator = passwordmanager.enumerator;
  1877.             while (enumerator.hasMoreElements()) {
  1878.                 try {
  1879.                     var nextPassword = enumerator.getNext();
  1880.                     nextPassword = nextPassword.QueryInterface(Components.interfaces.nsIPassword);
  1881.                     if (kPasscardHost == nextPassword.host)
  1882.                     return nextPassword;
  1883.                 } catch(e) {}
  1884.             }
  1885.  }
  1886.  return null;
  1887. }
  1888.  
  1889.  
  1890.  /*
  1891.   * Creates a Screen Name Service Passcard if one doesn't already exist
  1892.   */
  1893. function createSNSPasscard (screenname, password, snsAutoLogin, UI) {
  1894.  
  1895.     if (!screenname)
  1896.     return;
  1897.         
  1898.     // xpconnect to password manager interfaces
  1899.     var passwordmanager = Components.classes["@mozilla.org/passwordmanager;1"]
  1900.                                           .getService(Components.interfaces.nsIPasswordManager);
  1901.     if (!passwordmanager)
  1902.         return;
  1903.             
  1904.     // check if there is an existing passcard for this site
  1905.     // If there is it will leave it and remove it 
  1906.     // AIM coming from my sidebar panel and SNS from tool->options->screenname
  1907.     var passcard = FindSNSPasscard(ksnsPasscardHost);
  1908.     if (passcard){
  1909.         if(UI == sidebarPanel_UI){
  1910.             return;
  1911.       }else if(UI == snsScreenname_UI){
  1912.           // Merc - TO
  1913.           // BLT 211733
  1914.           // we need to pass in the SNS Passcard's username so that
  1915.           // Password Manager can remove the Passcard properly
  1916.           removeSNSPasscard(passcard.user);
  1917.       }else{
  1918.           return;
  1919.       }
  1920.      }
  1921.  
  1922.  
  1923.         
  1924.     // add a new SNS Passcard
  1925.     if(password !="")passwordmanager.addUser(ksnsPasscardHost, screenname, password);
  1926.         
  1927.     // find the newly added SNS Passcard so we can modify its passcard name and autologin property
  1928.     var snsPasscard = FindSNSPasscard(ksnsPasscardHost);
  1929.     if (snsPasscard) {
  1930.         var bAutoLogin = snsAutoLogin;
  1931.         passwordmanager.updateSignon(snsPasscard.host, ksnsPasscardHost, snsPasscard.user, snsPasscard.password,
  1932.                                      bAutoLogin ? ksnsAutoLogin : ksnsMessageBar, snsPasscard.protect,
  1933.                                      snsPasscard.lastUsed, snsPasscard.uniqueID, snsPasscard.advancedFields,
  1934.                                      snsPasscard.fraudProtected, true);
  1935.     }
  1936. }
  1937.  
  1938.  /* function : removeSNSPasscard
  1939.   * Argument : snsInfo object
  1940.   * Description : Remove a Screen Name Service Passcard if one does already exist if the sns Screennname match.
  1941.   */
  1942. function removeSNSPasscard(screenname){
  1943.  
  1944.   if (!screenname)return;
  1945.         
  1946.     // xpconnect to password manager interfaces
  1947.     var passwordmanager = Components.classes["@mozilla.org/passwordmanager;1"]
  1948.                                           .getService(Components.interfaces.nsIPasswordManager);
  1949.     if (!passwordmanager)
  1950.         return;
  1951.             
  1952.     // check if there is an existing passcard for this site
  1953.     if (!FindSNSPasscard(ksnsPasscardHost))
  1954.         return;
  1955.         
  1956.     //Protect this call as it throws an error if screenname doesn't
  1957.     //find a match for ksnsPasscardHost
  1958.     try {
  1959.         // remove a new SNS Passcard
  1960.         passwordmanager.removeUser(ksnsPasscardHost, screenname);
  1961.     }
  1962.     catch (ex) {
  1963.         dump("Exception in removeSNSPasscard: " + ex + "\n");
  1964.     }
  1965. }
  1966.  
  1967.  
  1968. /* function : isSNSSite
  1969.   * Argument : aHost
  1970.   * Description : Check to if the host is valid SNS host.
  1971.   */
  1972. function isSNSSite(aHost){
  1973.     
  1974.     var prefService;
  1975.     var stringOfUrl;
  1976.     var arrayOfHost;
  1977.     
  1978.     // xpconnect to password manager interfaces
  1979.      prefService = Components.classes["@mozilla.org/preferences-service;1"]
  1980.                               .getService(Components.interfaces.nsIPrefBranch);
  1981.                               
  1982.    if(prefService)
  1983.         stringOfUrl = prefService.getCharPref('netscape.sns.sites');
  1984.         
  1985.    if(!stringOfUrl) return false;
  1986.    
  1987.    //Split the string and check if the sting aHost is in the array 
  1988.    arrayOfHost = stringOfUrl.split(';');
  1989.    for(var i = 0; i < arrayOfHost.length; i++){
  1990.      if (arrayOfHost[i] == aHost) return true;
  1991.    }
  1992.    
  1993.   return false;
  1994.     
  1995. }