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 / App.js < prev    next >
Text File  |  2006-01-06  |  50KB  |  1,514 lines

  1.  
  2.  
  3. // XXX Global to determine if our onload handler has been called yet.
  4. // For some reason, our onunload handler is getting called before onload
  5. // on the first time we create App.xul. This is a workaround.
  6. var gFirstTime = 1;
  7. var timercatch = false;
  8.  
  9. function GoAway( target )
  10. {
  11.     var name = target.getAttribute('MsgText');
  12.     if(name=='')
  13.     {
  14.         try 
  15.         {
  16.           name= document.getElementById('tbAway').getElementsByTagName("menuitem")[1].getAttribute('MsgText')
  17.         }
  18.         catch (e)
  19.         {
  20.             //Some error finding tbAway message-Setting default backup message
  21.             name=aimString("away.DefaultMessage");
  22.         }
  23.     }
  24.  
  25.     locateManager = aimLocateManager();
  26.   if (locateManager)
  27.         locateManager.SetUserInfoAwayMessage(name);
  28. }
  29.  
  30. var targetElement = null;
  31.  
  32. function GoAwayWait(target,wait)
  33. {
  34.     targetElement = target;
  35.     setTimeout('GoAway( targetElement )',wait)
  36. }
  37.  
  38. /*
  39.  * Function: AimAppOnWndLoad()
  40.  *
  41.  * Arguments: None
  42.  * 
  43.  * Return: None
  44.  *
  45.  * Description: Called once app.xul has finished loading.Initializes the
  46.  *        sidebar.
  47. */
  48.  
  49. function AimAppOnWndLoad()
  50. {
  51.   // XXX See note at the top of the file
  52.     gFirstTime = 0;
  53.  
  54.     setTimeout("CheckBuddyPanel()",500);
  55.       
  56.   setAdTimer();
  57.  
  58.   updateCurrentAppWindow();
  59.  
  60.   addAppSessionListener();
  61.  
  62.   var supportmailim = aimPrefsManager().GetBoolPref("aim.session.supportmailim", null, false);
  63.   if (!supportmailim) {
  64.     document.getElementById("menu_switchview").setAttribute("hidden", "true");
  65.     document.getElementById("menu_editbuddyinfo").setAttribute("hidden", "true");
  66.     //document.getElementById("context-editdispname").setAttribute("hidden", "true");
  67.     //document.getElementById("context-updateemail").setAttribute("hidden", "true");
  68.     document.getElementById("preemailseperator").setAttribute("hidden", "true");
  69.     document.getElementById("context-sendemail").setAttribute("hidden", "true");
  70.     document.getElementById("emailseperator").setAttribute("hidden", "true");
  71.     document.getElementById("viewseparator").setAttribute("hidden", "true");
  72.     document.getElementById("context-checkemail").setAttribute("hidden", "true");
  73.   }
  74.     
  75.  
  76.   setTimeout("aimSession().SetAppIcon()", 1000);
  77.  
  78.  
  79. }
  80.  
  81. /*
  82.  * Function: AimAppOnWndUnload()
  83.  *
  84.  * Arguments: None
  85.  * 
  86.  * Return: None
  87.  *
  88.  * Description: Called once app.xul has been unloaded. 
  89. */
  90.  
  91. function AimAppOnWndUnload()
  92. {
  93.     // XXX See note at the top of the file
  94.  
  95.   if(gFirstTime == 1)
  96.         return;
  97.   removeAppSessionListener();
  98. }
  99.  
  100. //************  Command Handling ****************
  101.  
  102. /*
  103.  * Function: cmdNewBrowser()
  104.  *
  105.  * Arguments: None
  106.  * 
  107.  * Return: None
  108.  *
  109.  * Description: Function invoked from menu or toolbar to create a new 
  110.  *         browser window. 
  111.  * 
  112.  * Bugs: URL is hardcoded. Needs to open a user-specified preference.
  113. */
  114.  
  115. function cmdNewBrowser()
  116. {
  117.     aimCmdNewBrowser("http://home.netscape.com");
  118. }
  119.  
  120. /*
  121.  * Function: cmdNewEmail()
  122.  *
  123.  * Arguments: None
  124.  * 
  125.  * Return: None
  126.  *
  127.  * Description: Function invoked from menu or toolbar to create a new
  128.  *        messenger window. 
  129. */
  130.  
  131. function cmdNewEmail()
  132. {
  133.     aimCmdNewEmail();
  134. }
  135.  
  136.  
  137.  
  138. function cmdNewChat(invScreenName,invProposal,invScreenNames,toExistingWindow,invMode)
  139. {
  140.   if (isIcq() != true )
  141.   {
  142.     //App is aim - in this case shift-ctrl-C which invokes cmdNewchat should bring up chat window
  143.   inviteArgsObj = {
  144.     inviteProposalScreenName: invScreenName, 
  145.     inviteProposalObj: invProposal,
  146.     invitedScreenNames: invScreenNames,
  147.     inviteToExistingWindow: toExistingWindow,
  148.     inviteMode: invMode
  149.   }
  150.   window.openDialog('chrome://aim/content/chatInviteBuddy.xul','_blank','chrome,all,dialog=no',inviteArgsObj);
  151.   }
  152.   else
  153.   {
  154.     //App is aim - in this case shift-ctrl-C which invokes cmdNewchat should bring up add Contact window.
  155.     cmdAddBuddy();
  156.   }
  157.  
  158. }
  159.  
  160. /* MERC: SL */
  161. function cmdOpenIMSidebar()
  162. {  
  163.    RevealPanel("urn:sidebar:panel:im-panel");
  164. }
  165.  
  166.  
  167. /*
  168.  * Function: cmdNewIM()
  169.  *
  170.  * Arguments: None
  171.  * 
  172.  * Return: None
  173.  *
  174.  * Description: Function invoked from menu or toolbar to create a new IM 
  175.  *        window. Loads the window into a pre-connect state, e.g., the 
  176.  *        dialog consists of screen name field and an editor. This
  177.  *        function determines which buddy is selected in the list. 
  178.  *        If a buddy is selected (the first one found) and is online,
  179.  *        the screenname field in the IM window is initialized to that
  180.  *        buddy. Otherwise, the screen name field is set to "".
  181. */
  182.  
  183. function cmdNewIM()
  184. {
  185.    /* MERC SL - add a check to determine if user is connected
  186.                 to AIM to handle key shortcut of ^!I from browser. */
  187.     
  188.     dump("----> in cmdNewIM\n");
  189.     var isOnline= aimSession().IsOnline();
  190.     if (!isOnline) {
  191.       if (!isIcq())
  192.         aimErrorBox(aimString("msg.LogInToSendIM"));
  193.       else
  194.         aimErrorBox(aimString("msg.LogInToSendIM_ICQ"));
  195.       return false;
  196.   }
  197.   /* MERC SL */
  198.    
  199.   var screenName = getSelectedScreenName();
  200.   if (AimOnlineAway())
  201.     ComeBack();
  202.   if (!aimBuddyIsOnline(screenName))
  203.     screenName = null;
  204.     
  205.   if (screenName != null) {
  206.     var pIAimIM = aimIMObject();
  207.     if (pIAimIM)
  208.       var pWindow = pIAimIM.GetExistingIM(screenName);
  209.     if (pWindow) {
  210.       pWindow.focus();
  211.       return;
  212.     }
  213.   }
  214.   aimIMInvokeIMForm(screenName);
  215. }
  216.  
  217. /*
  218.  * Function: getSelectedBuddiesFromList()
  219.  *
  220.  * Arguments: None
  221.  * 
  222.  * Return: array of strings of buddies
  223.  *     that are currently selected (expands Groups to all buddies in group).
  224.  *
  225.  * Description: Function invoked via cmdNewChatSidebar to poll the
  226.  *        Buddy list to find out which buddies (and expanded groups are selected).
  227.  *        This function will always return an Array.
  228.  *    
  229. */
  230.  
  231. function getSelectedBuddiesFromList()
  232. {
  233.   var tree = getSelectedTreeName();
  234.   var col = getSelectedTabName();
  235.   var selectedBuddies = new Array();
  236.   var selectedGroups = new Array();
  237.   var groupCount = 0;
  238.   var buddyCount = 0;
  239.   if (!tree || !col) return;
  240.   var rangeCount = tree.treeBoxObject.selection.getRangeCount();
  241.   if (rangeCount == 0)
  242.     return null;
  243.   var view = tree.treeBoxObject.view;
  244.   var totalRowCount = view.rowCount;
  245.   for(var i = 0; i < rangeCount; i++) {
  246.     var startIndex = {};
  247.     var endIndex = {};
  248.     tree.treeBoxObject.selection.getRangeAt(i, startIndex, endIndex);
  249.     for (var j = startIndex.value; j <= endIndex.value; j++) {
  250.       var inOffline = IsIndexinSpecialGroup(tree, col, j);
  251.       if (inOffline)
  252.         break;
  253.  
  254.       var level = view.getLevel(j);
  255.       if (level == 0) {
  256.         //ok..a group (not in offline gp) is selected.
  257.         var groupResource = GetBuddyResource(tree, j);
  258.         var groupName = GetBuddyAttribute(tree, groupResource, "Name");
  259.         if (!CheckForDuplicateInArray(selectedGroups, groupName)) {
  260.           // we really don't need this check...but just in case ;-)
  261.           selectedGroups[groupCount++] = groupName;
  262.         }
  263.       }
  264.       else {
  265.         // ok..a buddy is selected. Make sure the group associated with this buddy is not in the selectedGroups list.
  266.         var parentIndex = view.getParentIndex(j);
  267.         var parentResource = GetBuddyResource(tree, parentIndex);
  268.         var parentName = GetBuddyAttribute(tree, parentResource, "Name");
  269.         if (!CheckForDuplicateInArray(selectedGroups, parentName)) {
  270.           var buddyResource = GetBuddyResource(tree, j);
  271.           var buddyName = GetBuddyAttribute(tree, buddyResource, "ScreenName");
  272.           if (!CheckForDuplicateInArray(selectedBuddies, buddyName)) {
  273.             selectedBuddies[buddyCount++] = buddyName;
  274.         }
  275.         }
  276.  
  277.  
  278.       }
  279.     }
  280.   }
  281.  
  282.   //till now we have all the information about the selected buddies and the groups (NOT the buddies underneath
  283.   //the selected groups.
  284.   for (var m=0; m < selectedGroups.length; m++) {
  285.     var viewIndex = GetGroupIndex(tree, col, selectedGroups[m]);
  286.     if (viewIndex < 0) {
  287.       dump("Unable to find the group index for group: " + selectedGroups[m] + "\n");
  288.       return;
  289.     }
  290.  
  291.     //open the group
  292.     if(!view.isContainerOpen(viewIndex))
  293.       view.toggleOpenState(viewIndex);
  294.  
  295.     //get the buddies
  296.     var groupIndex = viewIndex;
  297.     totalRowCount = view.rowCount;
  298.     while ((groupIndex < totalRowCount-1) && (viewIndex == view.getParentIndex(++groupIndex))) {
  299.       var buddyResource1 = GetBuddyResource(tree, groupIndex);
  300.       var buddyName1 = GetBuddyAttribute(tree, buddyResource1, "ScreenName");
  301.       if (!CheckForDuplicateInArray(selectedBuddies, buddyName1))
  302.         selectedBuddies[buddyCount++] = buddyName1;
  303.     } //while
  304.  
  305.   } //for
  306.  
  307.   return selectedBuddies;
  308. }
  309.  
  310. /* For the given parameter, this fn returns the index of the groupName */
  311. function GetGroupIndex(tree, col, groupName)
  312. {
  313.   var view = tree.treeBoxObject.view;
  314.   var totalRowCount = view.rowCount;
  315.   for (var k=0; k<totalRowCount; k++) {
  316.     var level = view.getLevel(k);
  317.     //groups are always at index 0
  318.     if (level == 0) {
  319.       var parentResource = GetBuddyResource(tree, k);
  320.       var cellText = GetBuddyAttribute(tree, parentResource, "Name");
  321.       if (cellText == groupName)
  322.         return k;
  323.     }
  324.   }
  325.   return -1;
  326. }
  327.  
  328. /* Just checks for any duplication in the array */
  329. function CheckForDuplicateInArray(aarray, element)
  330. {
  331.   for (var i=0; i<aarray.length; i++) {
  332.     if (aarray[i] == element)
  333.       return true;
  334.   }
  335.   return false;
  336. }
  337.  
  338. /*Checks for any duplicatation in the name property in an array */
  339. function CheckForDuplicateNameInArray(aarray, element)
  340. {
  341.   for (var i=0; i<aarray.length; i++) {
  342.     if (aarray[i].name == element)
  343.       return true;
  344.   }
  345.   return false;
  346. }
  347.  
  348. /* Checks whether the index is in Special group
  349.    Right now only Special group: Awaiting Authorization
  350.    Maybe later on Offline and Collected buddies will fall under this category ;-)
  351. */
  352.  
  353. function IsIndexinSpecialGroup(tree, col, index)
  354. {
  355.   var offlineIndex = -1;
  356.   var view = tree.treeBoxObject.view;
  357.   var totalRowCount = view.rowCount;
  358.   for (var k=0; k<totalRowCount; k++) {
  359.     var level = view.getLevel(k);
  360.     if (level == 0) {
  361.       var cellText = view.getCellText(k, col);
  362.       if (cellText == aimString("msg.AuthGroup")) {
  363.       
  364.         offlineIndex = k;
  365.         break;
  366.       }
  367.     }
  368.   }
  369.  
  370.   if ((index >= offlineIndex) && (offlineIndex != -1))
  371.     return true;
  372.   else
  373.     return false;
  374.  
  375. }
  376.  
  377.  
  378. /*
  379.  * Function: cmdSignOn()
  380.  *
  381.  * Arguments: None
  382.  * 
  383.  * Return: None
  384.  *
  385.  * Description: Called from menu item or toolbar. Passes control to sidebar
  386.  *        panel cmdSignOn() (see SidebarPanel/SidebarPanel.js)
  387. */
  388.  
  389. function cmdSignOn()
  390. {
  391.     //var sidebarframe = top.frames["AppPanel"];
  392.     //var sidebarframe=top.AIMDocumentPath;
  393.     var sidebarframe=getsidebarframe();
  394.  
  395.   if(sidebarframe) {
  396.       sidebarframe.cmdPanelSignOn();
  397.   }
  398.   
  399. }
  400.  
  401. /*
  402.  * Function: cmdSignOff()
  403.  *
  404.  * Arguments: None
  405.  * 
  406.  * Return: None
  407.  *
  408.  * Description: Calls aimSessionLogoff to close current IM session. 
  409.  *     
  410.  *
  411. */
  412.  
  413. function cmdSignOff()
  414. {
  415.   /* Set pref to be false so that auto login doesnt get fired for every launch */
  416.   aimPrefsManager().SetBoolPref("aim.session.appfirstlogin", false, null,true);
  417.   aimSessionLogoff();
  418.  
  419. }
  420.  
  421. /*
  422.  * Function: cmdCancelSignOn()
  423.  *
  424.  * Arguments: None
  425.  * 
  426.  * Return: None
  427.  *
  428.  * Description: Called during connection startup if cancel button is pressed.
  429.  *         Cancels the IM session by calling cmdSignOff().
  430.  *        
  431. */
  432.  
  433. function cmdCancelSignOn()
  434. {
  435.     aimPrefsManager().SetBoolPref("aim.session.firsttry", false, null, true);
  436.     cmdSignOff();
  437. }
  438.  
  439. /*
  440.  * Function: cmdClose()
  441.  *
  442.  * Arguments: None
  443.  * 
  444.  * Return: None
  445.  *
  446.  * Description: Invoked from close menu item, or from cmdSignOffAndClose(),
  447.  *        below. Causes the app window to be closed.
  448.  *
  449. */
  450.  
  451. function cmdClose()
  452. {
  453.    //aimCmdClose();
  454.    top.close();
  455. }
  456.  
  457. /*
  458.  * Function: cmdSignOffAndClose()
  459.  *
  460.  * Arguments: None
  461.  * 
  462.  * Return: None
  463.  *
  464.  * Description: Called in response to user selecting signoff and close menu
  465.  *        item. Signs off the current IM session and closes the 
  466.  *        standalone window.
  467. */
  468.  
  469. function createInstance( contractid, iidName )
  470. {
  471.     var iid = eval( "Components.interfaces." + iidName );
  472.         return Components.classes[ contractid ].createInstance( iid );
  473. }
  474.  
  475. function cmdExportBuddyList()
  476. {
  477.         nsIFilePicker = Components.interfaces.nsIFilePicker;
  478.     var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  479.  
  480.     fp.init(window, aimString("title.exportbudlist"), nsIFilePicker.modeSave);
  481.     fp.appendFilter(aimString("budlist.title"), aimString("budlist.filter"));
  482.     fp.appendFilters(nsIFilePicker.filterAll);
  483.  
  484.     try {
  485.         var ret = fp.show();
  486.         if ( ret == nsIFilePicker.returnOK || ret == nsIFilePicker.returnReplace) {
  487.             var status;
  488.             status = aimBuddyExportBuddyList(fp.file);
  489. /*
  490.             if ( status == false )
  491.                 aimErrorBox(aimString("msg.exporttryagain"));
  492.             else
  493.                 aimErrorBox(aimString("msg.exportsuccess"));
  494. */
  495.         }
  496.     } 
  497.     catch (ex) {
  498.         aimErrorBox(aimString("msg.exportfailure"));
  499.     }
  500.     return;
  501. }
  502.  
  503.  
  504. function cmdImportBuddyList()
  505. {
  506.   var feedbag = aimFeedbagManager();
  507.   var flag = feedbag.CheckFeedbag();
  508.   if (!flag) {
  509.     aimErrorBox(aimString("msg.feedbagdown"));
  510.     return;
  511.   }
  512.  
  513.     nsIFilePicker = Components.interfaces.nsIFilePicker;
  514.     var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  515.  
  516.     fp.init(window, aimString("title.importbudlist"), nsIFilePicker.modeOpen);
  517.     fp.appendFilter(aimString("budlist.title"), aimString("budlist.filter"));
  518.     fp.appendFilters(nsIFilePicker.filterAll);
  519.  
  520.     try {
  521.         var ret = fp.show();
  522.         if ( ret == nsIFilePicker.returnOK ) {
  523.             var status;
  524.             aimBuddyImportBuddyList(fp.file);
  525.         }
  526.     }
  527.     catch (ex) {
  528.         aimErrorBox(aimString("msg.importfailure"));
  529.     }
  530.     return;
  531. }
  532.  
  533. function cmdSignOffAndClose()
  534. {
  535.     cmdSignOff();
  536.     cmdClose();
  537. }
  538.  
  539. /*
  540.  * Function: cmdAddBuddy()
  541.  *
  542.  * Arguments: None
  543.  * 
  544.  * Return: None
  545.  *
  546.  * Description: Called in response to menu item of toolbar button in standalone
  547.  *        for adding a buddy to a buddy group. Opens BuddyAddBuddy.xul to
  548.  *        place a dialog that can be used to add a buddy.
  549.  *
  550.  * Bugs:    Needs to support inline editing.
  551.  * 
  552. */
  553.  
  554. function cmdAddBuddy()
  555. {
  556.   var feedbag = aimFeedbagManager();
  557.   var flag = feedbag.CheckFeedbag();
  558.   if (!flag) {
  559.     aimErrorBox(aimString("msg.feedbagdown"));
  560.     return;
  561.   }
  562.  
  563.   var sidebarframe=getsidebarframe();
  564.     var foundOne = false;
  565.     var selectedGroup = "";
  566.   var elt = sidebarframe;
  567.   if (!sidebarframe)
  568.     elt = window;
  569.   var tree = elt.document.getElementById("ListSetup");
  570.    if (!tree )
  571.       return;
  572.  
  573.   var isGroupPresent = aimCheckForGroupCount();
  574.   if (!isGroupPresent) {
  575.     (aimString("msg.NoGroups"));
  576.       return;
  577.   }
  578.  
  579.   var groups = aimGetSelectedBuddyGroups();
  580.     openDialog("chrome://aim/content/BuddyAddBuddy.xul", "", 
  581.         "modal=yes,titlebar,chrome", groups, tree, null, null);
  582. }
  583.  
  584. /*
  585.  * Function: cmdAddGroup()
  586.  *
  587.  * Arguments: None
  588.  * 
  589.  * Return: None
  590.  *
  591.  * Description: Called in response to menu item of toolbar button in standalone
  592.  *        for adding a buddy group. Opens BuddyAddGroup.xul to place a 
  593.  *        dialog that can be used to add a buddy group.
  594.  *
  595.  * Bugs:    Needs to support inline editing.
  596.  * 
  597. */
  598.  
  599. function cmdAddGroup()
  600. {
  601.   var feedbag = aimFeedbagManager();
  602.   var flag = feedbag.CheckFeedbag();
  603.   if (!flag) {
  604.     aimErrorBox(aimString("msg.feedbagdown"));
  605.     return;
  606.   }
  607.     openDialog("chrome://aim/content/BuddyAddGroup.xul", "", "modal=yes,titlebar,chrome");
  608. }
  609.  
  610. /*
  611.  * Function: SelectedGroup()
  612.  *
  613.  * Arguments: None
  614.  * 
  615.  * Return: None
  616.  *
  617.  * Description: Constructor function for SelectedGroup objects
  618.  *         
  619.  *        
  620. */
  621.  
  622. function SelectedGroup()
  623. {
  624.   var index = 0;
  625.     var selected = "false";
  626.     var name = null;
  627. }
  628.  
  629. /*
  630.  * Function: SelectedBuddy()
  631.  *
  632.  * Arguments: None
  633.  * 
  634.  * Return: None
  635.  *
  636.  * Description: Constructor function for SelectedBuddy objects
  637.  *         
  638. */
  639.  
  640. function SelectedBuddy()
  641. {
  642.     var parentname = null;
  643.     var name = null;
  644. }
  645.  
  646. /*
  647.  * Function: cmdDelete()
  648.  *
  649.  * Arguments: None
  650.  * 
  651.  * Return: None
  652.  *
  653.  * Description: Called in response to user clicking delete toolbar button or
  654.  *        selecting delete menu item. Deletes all selected groups (and
  655.  *        the buddies they contain) and all selected buddies.
  656. */
  657.  
  658. function cmdDelete()
  659. {
  660.   var feedbag = aimFeedbagManager();
  661.   var flag = feedbag.CheckFeedbag();
  662.   if (!flag) {
  663.     aimErrorBox(aimString("msg.feedbagdown"));
  664.     return;
  665.   }
  666.  
  667.   var tree = getSelectedTreeName();
  668.   var col = getSelectedTabName();
  669.   var selectedBuddies = new Array();
  670.   var selectedGroups = new Array();
  671.   var groupCount = 0;
  672.   var buddyCount = 0;
  673.   var lastSelectedIndex;
  674.   if (!tree || !col) return;
  675.   var groupCount = 0;
  676.   var buddyCount = 0;
  677.   var rangeCount = tree.treeBoxObject.selection.getRangeCount();
  678.   if (rangeCount == 0) {
  679.     // nothing is selected
  680.     aimErrorBox(aimString("msg.NothingToDelete"));
  681.     return;
  682.   }
  683.   var view = tree.treeBoxObject.view;
  684.   for(var i = 0; i < rangeCount; i++) {
  685.     var startIndex = {};
  686.     var endIndex = {};
  687.     tree.treeBoxObject.selection.getRangeAt(i, startIndex, endIndex);
  688.     lastSelectedIndex = endIndex.value;
  689.     for (var j = startIndex.value; j <= endIndex.value; j++) {
  690.       var level = view.getLevel(j);
  691.       if (level == 0) {
  692.         var groupResource = GetBuddyResource(tree, j);
  693.         var groupName = GetBuddyAttribute(tree, groupResource, "Name");
  694.         // Special groups like Offline have no resources. So the value will be null.
  695.         if (groupName == aimString("msg.AuthGroup")|| groupName == null) {
  696.           aimErrorBox(aimString("msg.CannotDeleteAuthGroup"));
  697.           continue;
  698.         }
  699.         
  700.         selectedGroups[groupCount] = new SelectedGroup;
  701.         selectedGroups[groupCount].name = groupName;
  702.         selectedGroups[groupCount].index = j;
  703.         groupCount++;
  704.  
  705.  
  706.  
  707.       } //if level ==0
  708.       else {
  709.         if (level == 1) {
  710.           var parentIndex = view.getParentIndex(j);
  711.           var parentResource = GetBuddyResource(tree, parentIndex);
  712.           var parentName = GetBuddyAttribute(tree, parentResource, "Name");
  713.           if (parentName == aimString("msg.AuthGroup") || parentName == null) {
  714.              // A contact from the special group Authorization awaiting has been selected.
  715.              var buddyResource = GetBuddyResource(tree, j);
  716.              var buddyName = GetBuddyAttribute(tree, buddyResource, "ScreenName");
  717.              selectedBuddies[buddyCount] = new SelectedBuddy;
  718.              selectedBuddies[buddyCount].name = buddyName;
  719.              selectedBuddies[buddyCount].parentname = aimString("msg.AuthGroup");
  720.             // a group under Offline is selected.
  721.           /*  var offlineGroupResource = GetBuddyResource(tree, j);
  722.             var offlineGroupName = GetBuddyAttribute(tree, offlineGroupResource, "Name");
  723.             if (!CheckForDuplicateNameInArray(selectedGroups, offlineGroupName)) {
  724.               selectedGroups[groupCount] = new SelectedGroup;
  725.               selectedGroups[groupCount].name = offlineGroupName;
  726.               selectedGroups[groupCount].index = j;
  727.               groupCount++;
  728.  
  729.             }
  730.            */
  731.  
  732.  
  733.           } //if offline
  734.           else {
  735.             // a Online buddy is selected
  736.             if (!tree.treeBoxObject.selection.isSelected(parentIndex)) {
  737.               //If the parent is already selected, ignore the selection. Else get the parent name
  738.               var buddyResource = GetBuddyResource(tree, j);
  739.               var buddyName = GetBuddyAttribute(tree, buddyResource, "ScreenName");
  740.               selectedBuddies[buddyCount] = new SelectedBuddy;
  741.               selectedBuddies[buddyCount].name = buddyName;
  742.               selectedBuddies[buddyCount].parentname = parentName;
  743.               buddyCount++;
  744.             } //if
  745.  
  746.  
  747.           } //else
  748.  
  749.         } //if level 1
  750.         else {
  751.           if (level == 2) {
  752.             //Offline buddy is selected..
  753.             var offlineParentIndex = view.getParentIndex(j);
  754.             if (!tree.treeBoxObject.selection.isSelected(offlineParentIndex)) {
  755.               //If the parent is already selected, ignore the selection. Else get the parent name
  756.               //get the offline parent name
  757.               var offlineParentResource = GetBuddyResource(tree, offlineParentIndex);
  758.               var offlineParentName = GetBuddyAttribute(tree, offlineParentResource, "Name");
  759.               
  760.               // if the group is already selected in the Online, ignore it.
  761.               if (!CheckForDuplicateNameInArray(selectedGroups, offlineParentName)) {
  762.                 var buddyResource = GetBuddyResource(tree, j);
  763.                 var buddyName = GetBuddyAttribute(tree, buddyResource, "ScreenName");
  764.                 selectedBuddies[buddyCount] = new SelectedBuddy;
  765.                 selectedBuddies[buddyCount].name = buddyName;
  766.                 selectedBuddies[buddyCount].parentname = offlineParentName;
  767.                 buddyCount++;
  768.               }
  769.             } //if
  770.           } //if 
  771.         } //else
  772.       } //else
  773.     } //for
  774.   } //for
  775.  
  776.  
  777.   var answer;
  778.   var hasCancelled = 0;
  779.   for (var g=0; g<selectedGroups.length; g++) {
  780.     if (selectedGroups[g].name != null && selectedGroups[g].name != "" ) {
  781.       if (isIcq() != true ) {
  782.         answer = top.confirm(aimString("confirm.DeleteGroup").replace(/%GroupName%/, selectedGroups[g].name));
  783.         }
  784.       else {
  785.         answer = top.confirm(aimString("confirm.DeleteGroup_ICQ").replace(/%GroupName%/, selectedGroups[g].name));
  786.         }
  787.       if (answer == true) {
  788.         aimBuddyRemoveBuddyGroup(selectedGroups[g].name);
  789.       }
  790.       else
  791.         if (!hasCancelled)
  792.           hasCancelled = 1;
  793.     }
  794.   }
  795.  
  796.   for (var b=0; b<selectedBuddies.length; b++) {
  797.     if (selectedBuddies[b].name != null && selectedBuddies[b].name != "" ) {
  798.       if (isIcq() != true)
  799.         answer  = top.confirm(aimString("confirm.DeleteBuddy").replace(/%BuddyName%/, selectedBuddies[b].name).replace(/%GroupName%/, selectedBuddies[b].parentname));
  800.       else
  801.         answer  = top.confirm(aimString("confirm.DeleteBuddy_ICQ").replace(/%BuddyName%/, selectedBuddies[b].name).replace(/%GroupName%/, selectedBuddies[b].parentname));
  802.  
  803.       if (answer == true) {
  804.         if (selectedBuddies[b].parentname == aimString("msg.AuthGroup")) {
  805.            // If this is the Awaiting authorization special group remove from feedbag and datasource
  806.            aimBuddyManager().RemoveBuddyAll(selectedBuddies[b].name);
  807.            aimFeedbagManager().ClearAuthorization(selectedBuddies[b].name);
  808.            continue;
  809.         }
  810.         aimBuddyRemoveBuddy(selectedBuddies[b].parentname, selectedBuddies[b].name);
  811.       }
  812.       else
  813.         if (!hasCancelled)
  814.           hasCancelled = 1;
  815.     }
  816.   }
  817.  
  818.   
  819.   var totalRowCount = view.rowCount;
  820.   if (!hasCancelled) {
  821.     // The view maintains the selection if the user has cancelled the deletion. So don't worry about selecting the
  822.     // next index in this case
  823.     if ((lastSelectedIndex + 1) > totalRowCount)
  824.       //if there is nothing after the last selected one, select the last one.
  825.       SelectIndex(totalRowCount-1);
  826.     else
  827.       SelectIndex(lastSelectedIndex);
  828.   }
  829. }
  830.  
  831.  
  832.  
  833. function cmdAbEditCard()
  834. {
  835.   var sidebarframe=getsidebarframe();
  836.   var selectedGroup = "";
  837.   var wasSelected = false;
  838.   var tree = sidebarframe.document.getElementById("ListSetup");
  839.     var tab = sidebarframe.document.getElementById("OnlineOrgTabPanel");   
  840.     // in the online tab and the user hit delete
  841.   if ( tab.selectedIndex == 0 )
  842.     return;
  843.   var groups = aimBuddyTreeFindGroups( tree );
  844.   top.selectedGroups = new Array();
  845.   for (var i = 0; i != groups.length; i++) {
  846.   // make a record for this group
  847.     top.selectedGroups[i] = new SelectedGroup;
  848.     top.selectedGroups[i].selectedBuddies = new Array();
  849.     top.selectedGroups[i].name = groups[i].getAttribute("Name");
  850.     if (groups[i].getAttribute("selected") == "true") {
  851.       wasSelected = "true";
  852.       top.selectedGroups[i].selected = "true";
  853.     }
  854.     else
  855.       top.selectedGroups[i].selected = "false";                                                   // find the buddy nodes for this group.
  856.  
  857.     var buddies = null;
  858.     for (var j = 0; j != groups[i].childNodes.length; j++)
  859.     {
  860.       if (groups[i].childNodes[j].nodeName == "treechildren")
  861.       {
  862.         // found it.
  863.         buddies = groups[i].childNodes[j].childNodes;
  864.         break;
  865.       }
  866.     }
  867.  
  868.     if (buddies)
  869.     {
  870.       for (var j = 0; j != buddies.length; j++)
  871.       {
  872.         top.selectedGroups[i].selectedBuddies[j] = new SelectedBuddy;
  873.         if (buddies[j].getAttribute("selected") == "true") {
  874.           // buddy is selected. Save the name
  875.           // and set the selected flag to true
  876.           wasSelected = "true";
  877.           top.selectedGroups[i].selectedBuddies[j].name = buddies[j].getAttribute("ScreenName");
  878.           top.selectedGroups[i].selectedBuddies[j].selected = "true";
  879.         }
  880.         else
  881.           top.selectedGroups[i].selectedBuddies[j].selected = "false";
  882.       }
  883.     }                     
  884.     }
  885.  
  886.   for ( var i = 0; i != top.selectedGroups.length; i++ ) {
  887.     selectedGroup = top.selectedGroups[i].name;
  888.     if ( top.selectedGroups[i].selected == "true" ) {
  889.          aimErrorBox(aimString("msg.SelectBuddy")); 
  890.         }
  891.     else {
  892.       for ( var j = 0; j != top.selectedGroups[i].selectedBuddies.length; j++ ) {
  893.         if ( top.selectedGroups[i].selectedBuddies[j].selected == "true" ) {
  894.           selectedBuddy = top.selectedGroups[i].selectedBuddies[j].name;
  895.           if ( selectedBuddy && selectedBuddy != "" ) {
  896.             // XXX DOES THIS STILL WORK, IS IT STILL NEEDED?
  897.                   var card = aimABInfo().getPersonalAbCardFromAttribute("_AimScreenName", selectedBuddy, false);
  898.               goEditCardDialog("moz-abmdbdirectory://abook.mab",card,null);
  899.           }
  900.         }                  
  901.         }
  902.     }
  903.   }
  904.  
  905. }       
  906.  
  907.  
  908. function cmdCustom()
  909. {
  910.   url = aimString("app.custom.url");
  911.   aimCmdNewBrowser(url);
  912. }
  913.  
  914. function cmdAdClick()
  915. {
  916.      aimCmdNewBrowser(aimRegionString("app.ad.link"));
  917.   }
  918.  
  919. var ad_access=1;
  920.  
  921. function setAdTimer()
  922. {
  923.  
  924.   var adButton = top.document.getElementById("adButton");
  925.     var adImage = aimRegionString("app.ad.image")+"?access=" + ad_access;
  926.  
  927.   ad_access++;
  928.   var adTimer = aimString("app.ad.timer");
  929.  
  930.   if(adButton)
  931.         adButton.setAttribute("src", adImage);
  932.  
  933.   if(window)
  934.     window.setTimeout('setAdTimer()', adTimer);
  935. }
  936.  
  937. function getSidebarDs()
  938. {
  939. var PANELS_RDF_FILE = "UPnls";
  940. try {
  941.      var locator_service = Components.classes["@mozilla.org/file/directory_service;1"].getService();
  942.       if (locator_service)
  943.         locator_service = locator_service.QueryInterface(Components.interfaces.nsIProperties);
  944.       var sidebar_file = locator_service.get(PANELS_RDF_FILE, Components.interfaces.nsIFile);
  945.       if (!sidebar_file.exists()) {
  946.         //Sidebar panels file does not exist?
  947.         return;
  948.       }
  949.       return aimFileProtocolHandler().getURLSpecFromFile(sidebar_file);
  950.     } catch (ex) {
  951.        throw(ex);
  952.     }
  953.  }
  954.  
  955. function CheckBuddyPanel()
  956. {
  957.   var RDF = aimRDF();
  958.   this.nc = "http://home.netscape.com/NC-rdf#";
  959.   this.resource = 'urn:sidebar:current-panel-list';
  960.     var panel_list =RDF.GetDataSource(getSidebarDs()).GetTarget(RDF.GetResource("urn:sidebar:current-panel-list"),RDF.GetResource("http://home.netscape.com/NC-rdf#"+"panel-list"),  true);
  961.     if (panel_list) {
  962.         panel_list.QueryInterface(Components.interfaces.nsIRDFResource);
  963.     }
  964.   var container = Components.classes["@mozilla.org/rdf/container;1"].createInstance();
  965.     try { 
  966.     container = container.QueryInterface(Components.interfaces.nsIRDFContainer);
  967.     container.Init(RDF.GetDataSource(getSidebarDs()), panel_list);
  968.     const RDF_CONTRACTID = "@mozilla.org/rdf/rdf-service;1";
  969.     const nsIRDFService = Components.interfaces.nsIRDFService;
  970.     this.datasource = RDF.GetDataSource(getSidebarDs());
  971.     this.rdf = Components.classes[RDF_CONTRACTID].getService(nsIRDFService);
  972.   } catch (ex)
  973.   {
  974.     if (timercatch == false)
  975.     {
  976.       timercatch = true;
  977.       setTimeout("CheckBuddyPanel()",5000);
  978.     }
  979.     
  980. //    throw(ex);
  981.   }
  982.     var panel_resource = RDF.GetResource("urn:sidebar:panel:im-panel");
  983.     var im_resource=RDF.GetResource("urn:sidebar:3rdparty-panel:chrome://aim/content/SidebarPanel.xul");
  984.     var panel_index = container.IndexOf(panel_resource);
  985.     var panel_index2 = container.IndexOf(im_resource);
  986.     if ((panel_index == -1) && (panel_index2==-1))
  987.     {
  988.       if ((typeof window.sidebar == "object") && (typeof window.sidebar.addPanel == "function")) 
  989.     { 
  990. //  This line was broken by mstoltz's security fix to disallow chrome urls passed to addPanel
  991. //  Eventually when the security fix is done properly (i.e. checking the caller rather than blindly disallowing chrome)
  992. //  We should use this addPanel call and back out all the changes I made to this file in this checkin.
  993. //         window.sidebar.addPanel ("Buddy List","chrome://aim/content/SidebarPanel.xul",""); 
  994.  
  995.       var aTitle = "Buddy List";
  996.       var aContentURL = "chrome://aim/content/SidebarPanel.xul";
  997.  
  998.       this.datasource.Assert(panel_resource,
  999.                              this.rdf.GetResource(this.nc + "title"),
  1000.                              this.rdf.GetLiteral(aTitle),
  1001.                              true);
  1002.       this.datasource.Assert(panel_resource,
  1003.                             this.rdf.GetResource(this.nc + "content"),
  1004.                             this.rdf.GetLiteral(aContentURL),
  1005.                             true);
  1006.       container.AppendElement(panel_resource);
  1007.       // Use an assertion to pass a "refresh" event to all the sidebars.
  1008.       // They use observers to watch for this assertion (in sidebarOverlay.js).
  1009.       this.datasource.Assert(this.rdf.GetResource(this.resource),
  1010.                              this.rdf.GetResource(this.nc + "refresh"),
  1011.                              this.rdf.GetLiteral("true"),
  1012.                              true);
  1013.       this.datasource.Unassert(this.rdf.GetResource(this.resource),
  1014.                                this.rdf.GetResource(this.nc + "refresh"),
  1015.                                this.rdf.GetLiteral("true"));
  1016.  
  1017.       /* Write the modified panels out. */
  1018.       const nsIRDFRemoteDataSource = Components.interfaces.nsIRDFRemoteDataSource;
  1019.       this.datasource.QueryInterface(nsIRDFRemoteDataSource).Flush();
  1020.       }
  1021.     } 
  1022.   if(!SidebarSelectPanel(document.getElementById("urn:sidebar:panel:im-panel"), true, true))
  1023.     SidebarTogglePanel(document.getElementById("urn:sidebar:panel:im-panel"));
  1024. }
  1025.  
  1026.  
  1027.  /******
  1028.   * Request info about a user and display it in a tooltip (after callback).
  1029.   ******/
  1030.  
  1031. function fillInfoTooltip(aEvent, aTooltipNode)
  1032. {
  1033.   var tree = document.getElementById("OnlineBuddies");
  1034.   var bx = tree.treeBoxObject;
  1035.   var row = {}; var col = {}; var obj = {};
  1036.   bx.getCellAt(aEvent.clientX, aEvent.clientY, row, col, obj);
  1037.   var rowValue = row.value;
  1038.   var tooltip = document.getElementById("infoTooltip");
  1039.   if (rowValue < 0) {
  1040.     tooltip.setAttribute("collapsed", "true");
  1041.     return;
  1042.   }
  1043.   var buddyResource = GetBuddyResource(tree, rowValue);
  1044.   var name = GetBuddyAttribute(tree, buddyResource, "ScreenName");
  1045.   var view = tree.treeBoxObject.view;
  1046.   var level = view.getLevel(rowValue);
  1047.   var inOffline = IsIndexinSpecialGroup(tree, col.value, rowValue);
  1048.   if (level != 1 || inOffline) {
  1049.     // if this is a mac do this bad hack to hide the tooltip
  1050.     if (navigator.appVersion.indexOf("Macintosh") != -1)
  1051.       document.getElementById("hideload").setAttribute("collapsed", "true");
  1052.     else
  1053.       tooltip.setAttribute("collapsed", "true");
  1054.     return;
  1055.   }
  1056.   
  1057.    // this check is required to prevent redundant 
  1058.    // re-requests while waiting for the callback
  1059.    if (!rowValue._RequestingInfo) {
  1060.      //var name = getScreenNameFromNode(aTreecell);
  1061.      //var tooltip = document.getElementById("infoTooltip");
  1062.  
  1063.      if (name && name != "" && tooltip) {
  1064.        var elOnline = document.getElementById("infoTooltipOnlineTime");
  1065.        elOnline.setAttribute("value", "");
  1066.        var elStatusTime = document.getElementById("infoTooltipStatusTime");
  1067.        elStatusTime.setAttribute("value", "");
  1068.        // if this is a mac do this bad hack to hide the tooltip
  1069.        if (navigator.appVersion.indexOf("Macintosh") != -1)
  1070.          document.getElementById("hideload").setAttribute("collapsed", "true");
  1071.        else
  1072.          tooltip.setAttribute("collapsed", "true");
  1073.        rowValue._RequestingInfo = true;
  1074.  
  1075.        // send the request and wait for callback
  1076.        var listenerCap = new TooltipCapListener(rowValue, tooltip);
  1077.        try {
  1078.         aimLocateManager().RequestUserInfoCapabilities(listenerCap, name);
  1079.        } catch (ex) {
  1080.          //ERROR: unable to retrieve AIM user info for name
  1081.          return;
  1082.        }
  1083.      }
  1084.    }
  1085.  }
  1086.  
  1087.  /******
  1088.   * Search up the tree for first treeitem node.
  1089.   ******/
  1090.  
  1091.  function getScreenNameFromNode(aNode)
  1092.  {
  1093.    var node = aNode;
  1094.    while (node.localName != "treeitem") {
  1095.      node = node.parentNode;
  1096.    }
  1097.    return node ? node.getAttribute("ScreenName") : null;
  1098.  }
  1099.  
  1100.  
  1101.  
  1102.  
  1103.  /******
  1104.   * Event listener used for RequestUserInfoCapabilities
  1105.   ******/
  1106.  
  1107. function TooltipCapListener(aTreecell, aTooltip)
  1108. {
  1109.   this.mTreecell = aTreecell;
  1110.   this.mTooltip = aTooltip;
  1111. }
  1112.  
  1113. TooltipCapListener.prototype = {
  1114.   OnRequestUserInfoCapabilitiesComplete: function(aScreenName, aUserObj)
  1115.   {
  1116.     var now = new Date().getTime()/1000;
  1117.     // TODO: search within mTooltip for text elements instead of id search
  1118.     // fill the screen name
  1119.     var elName = document.getElementById("infoTooltipName");
  1120.   
  1121.     aimABInfo = aimManager().QueryInterface(Components.interfaces.nsIAimABInfo);
  1122.     if (aimABInfo) {
  1123.       var card = aimABInfo.getPersonalAbCardFromAttribute("_AimScreenName", aScreenName, false);
  1124.       if (card) {
  1125.         if (card.nickName)
  1126.           elName.setAttribute("value", card.nickName);
  1127.         else
  1128.           if (card.displayName)
  1129.             elName.setAttribute("value", card.displayName);
  1130.           else
  1131.             elName.setAttribute("value", aScreenName);
  1132.       }
  1133.       else
  1134.         elName.setAttribute("value", aScreenName);
  1135.     }
  1136.     else
  1137.       elName.setAttribute("value", aScreenName);
  1138.  
  1139.     
  1140.     // fill the online line
  1141.     var elOnline = document.getElementById("infoTooltipOnlineTime");
  1142.     var since = aUserObj.GetOnlineSinceTime();
  1143.     elOnline.setAttribute("value", getPrettyDateDiff(now, since));
  1144.     var elOnlineId = document.getElementById("infoTooltipOnlineTimeId");
  1145.     elOnlineId.setAttribute("value", aimString("tooltip.online") + ":");
  1146.      
  1147.     // fill the status line
  1148.     var elStatus = document.getElementById("infoTooltipStatus");
  1149.     var elStatusTime = document.getElementById("infoTooltipStatusTime");
  1150.     if (aUserObj.IsIdle()) {
  1151.       elStatus.setAttribute("value", aimString("tooltip.idle") + ":");
  1152.       var statusDate = aUserObj.GetIdleSinceTime();
  1153.       elStatusTime.setAttribute("value", getPrettyDateDiff(now, statusDate));
  1154.     }
  1155.     else
  1156.       if (aUserObj.IsAway()) {
  1157.         elStatus.setAttribute("value", aimString("tooltip.status") + ":");
  1158.         elStatusTime.setAttribute("value", aimString("tooltip.away"));
  1159.       }
  1160.       else {
  1161.         elStatus.setAttribute("value", aimString("tooltip.status") + ": ");
  1162.         elStatusTime.setAttribute("value", aimString("tooltip.active"));
  1163.       }
  1164.  
  1165.     if (isIcq() != true ) 
  1166.     {  
  1167.  
  1168.     // fill the warnings line
  1169.     var warnings = document.getElementById("infoTooltipWarnings");
  1170.     warnings.setAttribute("value", aUserObj.GetWarningPercent() + "%");
  1171.     var warningsId = document.getElementById("infoTooltipWarningsId");
  1172.     warningsId.setAttribute("value", aimString("tooltip.warnings") + ":");
  1173.     var cp = new String(aScreenName);
  1174.     if ((cp.charCodeAt(0) > 47) && (cp.charCodeAt(0) < 58))
  1175.     {
  1176.       // is an icq number, do not show warnings
  1177.       warningsId.setAttribute("hidden", "true");
  1178.       warnings.setAttribute("hidden", "true");
  1179.     }
  1180.     else
  1181.     {
  1182.       warningsId.setAttribute("hidden", "false");
  1183.       warnings.setAttribute("hidden", "false");
  1184.     }
  1185.  
  1186.     // fill in the Service Type (AOL, Internet, Administrator...)     
  1187.     var elFlagService = document.getElementById("infoTooltipFlagValue");
  1188.     var flagServiceValue = aUserObj.GetFlags();
  1189.     var serviceString = "";
  1190.     var serviceEnums = Components.interfaces.nsAimServiceTypes;
  1191.     if (flagServiceValue & serviceEnums.Transient)
  1192.       serviceString = aimString("IdsflagTrial.label") + " ";
  1193.     if (flagServiceValue & serviceEnums.Aol)
  1194.       serviceString = serviceString + aimString("IdsflagAol.label") + " ";
  1195.     if (flagServiceValue & serviceEnums.Free)
  1196.       serviceString = serviceString + aimString("IdsflagInternet.label") + " ";
  1197.     if (flagServiceValue & serviceEnums.Administrator)
  1198.       serviceString = serviceString + aimString("IdsflagAdministrator.label") + " ";
  1199.     if (flagServiceValue & serviceEnums.Mobile)
  1200.       serviceString = serviceString + aimString("IdsflagMobile.label") + " ";
  1201.     
  1202.     elFlagService.setAttribute("value", serviceString);
  1203.     var elFlagServiceId = document.getElementById("infoTooltipFlag");
  1204.     elFlagServiceId.setAttribute("value", aimString("tooltip.service") + ":");
  1205.     elFlagService.setAttribute("hidden", "false");
  1206.     elFlagServiceId.setAttribute("hidden", "false");
  1207.  
  1208.     // fill in the Capabilities
  1209.     var elCapabilities = document.getElementById("capabilitiesValue");
  1210.     var elCapabilitiesId = document.getElementById("capabilities");
  1211.     elCapabilitiesId.setAttribute("hidden", "false");
  1212.     elCapabilities.setAttribute("hidden", "false");
  1213.     try {
  1214.       var capString = "";
  1215.       var capMask = aUserObj.GetCapabilities();
  1216.       if (capMask == 0) {
  1217.         elCapabilitiesId.setAttribute("hidden", "true");
  1218.         elCapabilities.setAttribute("hidden", "true");
  1219.       }
  1220.       else {
  1221.         var capEnums = Components.interfaces.nsAimCapabilitesMask;
  1222.         if (capEnums.buddyIcon & capMask) {
  1223.           if (capString == "")
  1224.             // if it is the first capability, just add it
  1225.             capString += aimString("tooltip.buddyicon");
  1226.           else
  1227.             // if some capability already present just add a comma and the capability
  1228.             capString += ", " + aimString("tooltip.buddyicon");
  1229.         }
  1230.         if (capEnums.chat & capMask) {
  1231.           if (capString == "")
  1232.             capString += aimString("tooltip.chat");
  1233.           else
  1234.             capString += ", " + aimString("tooltip.chat");
  1235.         }
  1236.         if (capEnums.filexfer & capMask) {
  1237.           if (capString == "")
  1238.             capString += aimString("tooltip.filexfer");
  1239.           else
  1240.             capString += ", " + aimString("tooltip.filexfer");
  1241.         }
  1242.         if (capEnums.unification & capMask) {
  1243.           if (capString == "")
  1244.             capString += aimString("tooltip.unification");
  1245.           else
  1246.             capString += ", "+aimString("tooltip.unification");
  1247.         }
  1248.  
  1249.         elCapabilitiesId.setAttribute("value", aimString("tooltip.capabilities") + ":");
  1250.         elCapabilities.setAttribute("value", capString);
  1251.  
  1252.       }
  1253.     }
  1254.     catch (e) {}
  1255.  
  1256.     var supportmailim = aimPrefsManager().GetBoolPref("aim.session.supportmailim", null, false);
  1257.     if (!supportmailim) {
  1258.       document.getElementById("displayName").setAttribute("hidden", "true");
  1259.       document.getElementById("displayNameValue").setAttribute("hidden", "true");
  1260.       document.getElementById("email").setAttribute("hidden", "true");
  1261.       document.getElementById("emailValue").setAttribute("hidden", "true");
  1262.     }
  1263.     else {
  1264.       // fill the Display Name line
  1265.       var dnValue = document.getElementById("displayNameValue");
  1266.       var curDispName = aimFeedbagManager().GetDispName(aScreenName);
  1267.       if (curDispName)
  1268.         dnValue.setAttribute("value", curDispName);
  1269.       else
  1270.         dnValue.setAttribute("value", aimString("tooltip.unknown"));
  1271.       var displayName = document.getElementById("displayName");
  1272.       displayName.setAttribute("value", aimString("tooltip.displayName") + ":");
  1273.       displayName.setAttribute("hidden", "false");
  1274.       dnValue.setAttribute("hidden", "false");
  1275.  
  1276.       // fill the Email Address line
  1277.       var emailValue = document.getElementById("emailValue");
  1278.       var curEmail = aimFeedbagManager().GetEmailId(aScreenName);
  1279.       if (curEmail)
  1280.         emailValue.setAttribute("value", curEmail);
  1281.       else
  1282.         emailValue.setAttribute("value", aimString("tooltip.unknown"));
  1283.       var emailName = document.getElementById("email");
  1284.       emailName.setAttribute("value", aimString("tooltip.emailName") + ":");
  1285.       emailName.setAttribute("hidden", "false");
  1286.       emailValue.setAttribute("hidden", "false");
  1287.     }
  1288.     }
  1289.     else
  1290.     {
  1291.       document.getElementById("capabilitiesValue").setAttribute("hidden", "true");
  1292.       document.getElementById("capabilities").setAttribute("hidden", "true");
  1293.       document.getElementById("infoTooltipWarningsId").setAttribute("hidden", "true");
  1294.       document.getElementById("infoTooltipWarnings").setAttribute("hidden", "true");
  1295.       document.getElementById("infoTooltipFlag").setAttribute("hidden", "true");
  1296.       document.getElementById("infoTooltipFlagValue").setAttribute("hidden", "true");
  1297.       document.getElementById("displayName").setAttribute("hidden", "true");
  1298.       document.getElementById("displayNameValue").setAttribute("hidden", "true");
  1299.       document.getElementById("email").setAttribute("hidden", "true");
  1300.       document.getElementById("emailValue").setAttribute("hidden", "true");
  1301.       
  1302.        //Hide warning capabilities etc in Icq     
  1303.     }
  1304.     // show the tooltip
  1305.     // if this is a mac do this bad hack to hide the tooltip
  1306.     if (navigator.appVersion.indexOf("Macintosh") != -1)
  1307.       document.getElementById("hideload").removeAttribute("collapsed");
  1308.     else
  1309.       this.mTooltip.removeAttribute("collapsed");
  1310.       this.mTreecell._RequestingInfo = false;
  1311.   },
  1312.  
  1313.   OnRequestUserInfoCapabilitiesError: function(aScreenName, aError)
  1314.   {
  1315.     this.mTreecell._RequestingInfo = false;
  1316.   }
  1317. };
  1318.  
  1319.  
  1320. function cmdChangePassword() {
  1321.     window.openDialog('chrome://aim/content/AimChangePassword.xul','','modal=no,titlebar,chrome,centerscreen',null);
  1322. }
  1323.  
  1324. function cmdConfirmAccount() {
  1325.     window.openDialog('chrome://aim/content/AimConfirmAccount.xul','','modal=yes,titlebar,chrome,centerscreen',null);
  1326. }
  1327.  
  1328. function cmdChangeEmail() {
  1329.     window.openDialog('chrome://aim/content/AimChangeEmail.xul','','modal=no,titlebar,chrome,centerscreen',null);
  1330. }
  1331.  
  1332. function cmdGetMemberInfo() {
  1333.   var screenName = getSelectedScreenName();
  1334.   window.openDialog('chrome://aim/content/GetMemberInfo.xul','_blank','chrome,all,dialog=no', screenName);
  1335. }
  1336.  
  1337.  
  1338. /*
  1339. * Name: cmdBuddyAlert
  1340. * Arguments: none. 
  1341. * Description: This function is called by command handler of cmd_buddyAlert. It chooses the appropriate tree where
  1342. * the event is triggered from and checks to see if there is a screenName attribute on the selected node. Then it opens
  1343. * the BuddyAlert dialog by passign the screenname as an argument.
  1344. * Return Value: none
  1345. * Author: Prassanna<prass@netscape.com> 
  1346. */
  1347.  
  1348. function cmdBuddyAlert(isedit) {
  1349.   var screenName = getSelectedScreenName();
  1350.   var groupName = getGroupForScreenName();
  1351.   if (screenName && (screenName != null) && groupName && (groupName != null)) 
  1352.   {
  1353.     if (isedit == 1)
  1354.       window.openDialog('chrome://aim/content/AimBuddyAlert.xul','_blank','chrome,all,dialog=no', screenName, groupName, 1);
  1355.     else  
  1356.       window.openDialog('chrome://aim/content/AimBuddyAlert.xul','_blank','chrome,all,dialog=no', screenName, groupName, null);
  1357.   }
  1358. }
  1359.  
  1360. /*
  1361. * Name: cmdDelBuddyAlert
  1362. * Arguments: none. 
  1363. * Description: This function is called by command handler of cmd_delbuddyAlert. It chooses the appropriate tree where
  1364. * the event is triggered from and checks to see if there is a screenName attribute on the selected node. Then it removes 
  1365. * the screen name from the buddy alert list.
  1366. * Return Value: none
  1367. * Author: Prassanna<prass@netscape.com> 
  1368. */
  1369.  
  1370. function cmdDelBuddyAlert() {
  1371.   var screenName = getSelectedScreenName();
  1372.   var groupName = getGroupForScreenName();
  1373.   if (screenName && (screenName != null) && groupName && (groupName != null))
  1374.     aimBuddyManager().DeleteBuddyFromAlertList(screenName, groupName); 
  1375. }
  1376.  
  1377. function cmdNewAway()
  1378. {
  1379.   if (isIcq())
  1380.     window.openDialog("chrome://aim/content/AddIcqAwayMessage.xul","_blank", "chrome,close,titlebar,modal", "", "", "");
  1381.   else {
  1382.     window.openDialog("chrome://aim/content/AddAwayMessage.xul","_blank", "chrome,close,titlebar,modal", "", "", "", true);
  1383.   }
  1384. }
  1385.  
  1386. function sendFile()
  1387. {
  1388.   window.openDialog("chrome://aim/content/sendfile.xul","_blank", "chrome,close,titlebar", "", "", "");
  1389. }
  1390.  
  1391. function addAppSessionListener() {
  1392.   var observerService = Components.classes["@mozilla.org/observer-service;1"].getService();
  1393.   observerService = observerService.QueryInterface(Components.interfaces.nsIObserverService);
  1394.   if (observerService) {
  1395.     observerService.addObserver(sessionAppObserver, "sessionMode-changed", false);
  1396.   } else {
  1397.     dump("failed to get observer service\n");
  1398.   }
  1399. }
  1400.  
  1401. function removeAppSessionListener() {
  1402.   var observerService = Components.classes["@mozilla.org/observer-service;1"].getService();
  1403.   observerService = observerService.QueryInterface(Components.interfaces.nsIObserverService);
  1404.   if (observerService)
  1405.   {
  1406.   observerService.removeObserver(sessionAppObserver, "sessionMode-changed");
  1407.   }
  1408. }
  1409.  
  1410.  
  1411. var sessionAppObserver = {
  1412.   observe: function(subject, message, data) {
  1413.   if (message == 'sessionMode-changed') {
  1414.      // Update sessionMode attribut which updates all images thru css
  1415.      window.document.getElementById("sessionAppWatcher").setAttribute("sessionMode", data);
  1416.      UpdateAppMenus(data);
  1417.      }
  1418.   }
  1419. }
  1420.  
  1421.  
  1422. function cmdRegistUser()
  1423. {
  1424.  // Open regist user url;
  1425.   regLink = aimRegionString("icq.register.url");
  1426.   openTopWin(regLink);  
  1427.   return;
  1428. }
  1429.  
  1430. function updateCurrentAppWindow()
  1431. {
  1432.   var connectionName;
  1433.   connectionName = aimPrefsManager().GetCharPref("aim.session.userconnectionname", null, true);       
  1434.   if (connectionName == "ICQ")
  1435.   {
  1436.     // Change the sessionMode to Icq. Originally in xul it was initialized to Aim by default.
  1437.     window.document.getElementById("sessionAppWatcher").setAttribute("sessionMode", "Icq");
  1438.     UpdateAppMenus("Icq");
  1439.   }
  1440. }
  1441.  
  1442. function UpdateAppMenus(sessionName)
  1443. {
  1444.   switch (sessionName) {
  1445.         case "Icq": document.getElementById('menu_File_Icq').removeAttribute("hidden");
  1446.                     document.getElementById('menu_File').setAttribute("hidden", "true");
  1447.                     document.getElementById('editOptionsid_Icq').removeAttribute("hidden");
  1448.                     document.getElementById('editOptionsid').setAttribute("hidden", "true");
  1449.                     break;
  1450.         case "Aim": document.getElementById('menu_File_Icq').setAttribute("hidden", "true");
  1451.                     document.getElementById('menu_File').removeAttribute("hidden");
  1452.                     document.getElementById('editOptionsid_Icq').setAttribute("hidden", "true");
  1453.                     document.getElementById('editOptionsid').removeAttribute("hidden");
  1454.                     break;   
  1455.   }
  1456.   
  1457. }
  1458.  
  1459. /*
  1460.  * Name: cmdRename
  1461.  * Arguments: none. 
  1462.  * Description: This function is called by command handler of cmd_rename. It opens the add buddy dialog from which user can remane
  1463.  * Return Value: none
  1464.  * Author: Prassanna<prass@netscape.com> 
  1465.  */
  1466.  
  1467. function cmdRename()
  1468. {
  1469.    var user=getSelectedScreenName();
  1470.    var tree = getSelectedTreeName();
  1471.    var currentIndex = tree.currentIndex;
  1472.    var rangeCount = tree.treeBoxObject.selection.getRangeCount();
  1473.    if (rangeCount != 1 || user == null) { 
  1474.      // We dont support multiple selectetion for rename :-(
  1475.      aimErrorBox(aimString("msg.SelectContact"));
  1476.      return;
  1477.    }
  1478.    var view = tree.treeBoxObject.view;
  1479.    var parentIndex = view.getParentIndex(currentIndex);
  1480.    if (currentIndex > 0) {
  1481.        var groupResource = GetBuddyResource(tree, parentIndex);
  1482.        var groupName = GetBuddyAttribute(tree, groupResource, "Name");
  1483.    }
  1484.  
  1485.    openDialog("chrome://aim/content/RenameBuddy.xul", "", "modal=yes,titlebar,chrome,centerscreen", groupName, user);
  1486.  
  1487. }
  1488.  
  1489.  
  1490. /*
  1491. * Name: cmdRequestAuth
  1492. * Arguments: none. 
  1493. * Description: This function is called by command handler of cmd_rerequest auth. It chooses the appropriate tree where
  1494. * the event is triggered from and checks to see if there is a screenName attribute on the selected node. Then it opens
  1495. * the authorization request window with the screenname.
  1496. * Return Value: none
  1497. * Author: Prassanna<prass@netscape.com> 
  1498. */
  1499.  
  1500. function cmdRequestAuth()
  1501. {
  1502.   var auth_msg=aimString("icq.rerequestauth");
  1503.   var user=getSelectedScreenName();
  1504.   var isinlist = new Object();
  1505.   aimFeedbagManager().IsInAuthList(user, isinlist);
  1506.   // Ifin auth await group open rerequest auth window
  1507.   if (isinlist.value == true) {
  1508.     window.openDialog('chrome://aim/content/icqAuthOutgoing.xul','_blank','chrome,all,dialog=no',user, auth_msg);
  1509.     }
  1510.   else
  1511.     aimErrorBox(aimString("msg.authtryagain"));  
  1512. }
  1513.  
  1514.