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