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 / SidebarPanel.js < prev    next >
Text File  |  2005-03-16  |  81KB  |  2,249 lines

  1. var processInviteTimer = -1;
  2.  
  3. /*
  4.  * Function: UpdateMenuItemsForApp(isonline)
  5.  * Arguments: 
  6.  *       isonline -- login state (offline/online)
  7.  * Return: None
  8.  * Description: This function is called when the user signs on/off and on load of Standalone.
  9.  * According to the the input parameter, the menu items in the standalone get updated.
  10. */
  11.  
  12. function UpdateMenuItemsForApp(isonline)
  13. {
  14.   if ( isonline == "Offline"){
  15.     ClearProcessTimer();
  16.     top.title = aimString("app.title.SignOn");
  17.     top.document.getElementById("miSignOn").setAttribute("label", aimString("miSignOn.SignOn"));
  18.     top.document.getElementById("miSignOn").setAttribute("oncommand", "cmdSignOn();");
  19.     top.document.getElementById("miSignOffClose").setAttribute("disabled", "true");
  20.     top.document.getElementById("miIcqSignOn").setAttribute("label", aimString("miSignOn.SignOn"));
  21.     top.document.getElementById("miIcqSignOn").setAttribute("oncommand", "cmdSignOn();");
  22.     top.document.getElementById("miIcqSignOffClose").setAttribute("disabled", "true");
  23.     top.document.getElementById("change_password").setAttribute("disabled", "true");
  24.     top.document.getElementById("confirm_account").setAttribute("disabled", "true");
  25.     top.document.getElementById("change_email").setAttribute("disabled", "true");
  26.     top.document.getElementById("people_menu").setAttribute("hidden", "true");
  27.     top.document.getElementById("people_menu_icq").setAttribute("hidden", "true");
  28.     top.document.getElementById("menu_PeoplePopup").setAttribute("collapsed", "true");
  29.     top.document.getElementById("menu_PeoplePopup_icq").setAttribute("collapsed", "true");
  30.     top.document.getElementById("menu_Away").setAttribute("hidden", "true");
  31.     top.document.getElementById("away_seperator").setAttribute("hidden", "true");
  32.     top.document.getElementById("menu_Away_icq").setAttribute("hidden", "true");
  33.     top.document.getElementById("away_icq_seperator").setAttribute("hidden", "true");
  34.     top.document.getElementById("cmd_IM").setAttribute("disabled", "true");
  35.     top.document.getElementById("cmd_import").setAttribute("disabled", "true");
  36.     top.document.getElementById("cmd_export").setAttribute("disabled", "true");
  37.   }
  38.   else {
  39.     top.document.getElementById("miSignOn").setAttribute("label", aimString("miSignOn.SignOff"));
  40.     top.document.getElementById("miSignOn").setAttribute("oncommand", "cmdSignOff();");
  41.     top.document.getElementById("miSignOffClose").setAttribute("disabled", "false");
  42.     top.document.getElementById("miIcqSignOn").setAttribute("label", aimString("miSignOn.SignOff"));
  43.     top.document.getElementById("miIcqSignOn").setAttribute("oncommand", "cmdSignOff();");
  44.     top.document.getElementById("miIcqSignOffClose").setAttribute("disabled", "false");
  45.     top.document.getElementById("change_password").setAttribute("disabled", "false");
  46.     top.document.getElementById("confirm_account").setAttribute("disabled", "false");
  47.     top.document.getElementById("change_email").setAttribute("disabled", "false");
  48.     if (isIcq() == true) {
  49.       top.document.getElementById("people_menu_icq").setAttribute("hidden", "false");
  50.       top.document.getElementById("menu_PeoplePopup_icq").setAttribute("collapsed", "false");
  51.       top.document.getElementById("menu_Away_icq").setAttribute("hidden", "false");
  52.       top.document.getElementById("away_icq_seperator").setAttribute("hidden", "false");
  53.       top.document.getElementById("people_menu").setAttribute("hidden", "true");
  54.       top.document.getElementById("menu_PeoplePopup").setAttribute("collapsed", "true");
  55.       top.document.getElementById("menu_Away").setAttribute("hidden", "true");
  56.       top.document.getElementById("away_seperator").setAttribute("hidden", "true");
  57.       }
  58.       else
  59.       {
  60.       top.document.getElementById("people_menu").setAttribute("hidden", "false");
  61.       // top.document.getElementById("menu_Away").setAttribute("hidden", "false");
  62.       top.document.getElementById("menu_PeoplePopup").setAttribute("collapsed", "false");
  63.       top.document.getElementById("menu_Away").setAttribute("hidden", "false");
  64.       top.document.getElementById("away_seperator").setAttribute("hidden", "false");
  65.       top.document.getElementById("people_menu_icq").setAttribute("hidden", "true");
  66.       top.document.getElementById("menu_PeoplePopup_icq").setAttribute("collapsed", "true");
  67.       top.document.getElementById("menu_Away_icq").setAttribute("hidden", "true");
  68.       top.document.getElementById("away_icq_seperator").setAttribute("hidden", "true");
  69.       }
  70.     top.document.getElementById("cmd_IM").setAttribute("disabled", "false");
  71.     top.document.getElementById("cmd_import").setAttribute("disabled", "false");
  72.     top.document.getElementById("cmd_export").setAttribute("disabled", "false");
  73.     // SetupCommandUpdateHandlers() will initialize command observers for Online tree and listsetup tree.
  74.     // timeout is used coz it takes a bit of time for the Online and listsetup tab to show up!
  75.     setTimeout("AimSetupCommandUpdateHandlers()", 500);
  76.     aimMigrateBuddyList( aimSessionCurrentScreenName() );
  77.     SetAwayMenu();
  78.     SetProcessTimer(10000);
  79.  
  80.  
  81.  }
  82. }
  83.  
  84. /****************  Window Management *****************/
  85.  
  86. function AimSidebarPanelOnWndLoad() {
  87.   //register buddy list observer for sidebar.
  88.   addSidebarBuddyListObserver();
  89.  
  90.   var todayhide = aimPrefsManager().GetBoolPref("aim.internal.hidetoday", null, false);
  91.   if (todayhide)
  92.     document.getElementById("btnbuddyorgtoday").setAttribute("style", "display: none" );
  93.  
  94.   var hasState;
  95.  
  96.   var hideConnection = aimPrefsManager().GetBoolPref("aim.session.hideconnection", null, false);
  97.   if (hideConnection == true) {
  98.     picker = document.getElementById('sessionPicker');
  99.     picker.setAttribute("style", "display: none" );
  100.     picker = document.getElementById('sessionPickerLabel');
  101.     picker.setAttribute("style", "display: none" );
  102.   } 
  103.  
  104.   enableSignOnButton(false);
  105.     // Read signon prefs. We need to load at least the screen name here,
  106.     // but might as well load the password and autoLogin prefs, too.
  107.  
  108.     var screenName = aimPrefsManager().GetCharPref("aim.session.screenname", null, true);
  109.  
  110.     var password = aimSessionGetPassword(null);
  111.     var autoLogin = aimPrefsManager().GetBoolPref("aim.session.autologin", null, false);
  112.     var firstTime = aimPrefsManager().GetBoolPref("aim.session.firsttime", null, true); // firsttime is a GLOBAL pref
  113.     var alreadyFinishedWizard = aimPrefsManager().GetBoolPref("aim.session.finishedwizard", null, false);
  114.  
  115.   addSidebarSessionListener();  
  116.   var connectionName = aimPrefsManager().GetCharPref("aim.session.userconnectionname", null, true);
  117.   setMenuPopUp (connectionName);
  118.     top.AIMDocumentPath=window;
  119.  
  120.   // If this is the first time the user is launching aim, pop open the wizard.
  121.   // If not, ignore and move on.
  122.   if (firstTime) {
  123.     //***** turning off this behavior but we may still need to know if the
  124.     //***** wizard has run yet or not.
  125.     //aimGlobalCmdStartupWizard();
  126.     // Set pref so we don't pop open the wizard again automatically if the user doesn't finish the wizard the first time.
  127.     aimPrefsManager().SetBoolPref("aim.session.firsttime",false, null, true);
  128.   }    
  129.  
  130.     // Initialize online state
  131.  
  132.     var state = aimRDFDataSource().GetTarget(aimRDFSession(), aimRDFSessionState(), true);
  133.     
  134.     if (state == null){
  135.         state = aimRDF().GetLiteral("Register");
  136.         hasState = true;
  137.     }
  138.  
  139.     if (alreadyFinishedWizard && (hasState || state == aimRDF().GetLiteral("Register")))
  140.         state = aimRDF().GetLiteral("Offline");
  141.  
  142.    if (screenName && screenName !="" && !alreadyFinishedWizard){
  143.       //we are in that special state of having had another wizard set a screen name
  144.       //but we havent finished up the 'registration'
  145.       aimSessionRegister(screenName);
  146.       aimPrefsManager().SetBoolPref("aim.session.finishedwizard",true, null, true);
  147.       //preset the latestaimscreenname so it will be preserved  if the user
  148.       //switches services before ever signing on it will still remember the
  149.       //aim screenname
  150.       aimPrefsManager().SetCharPref("aim.session.latestaimscreenname",screenName, null, true);
  151.       state = aimRDF().GetLiteral("Offline");   
  152.    }  
  153.   // Check whether the Sidebar buddylist is getting loaded or the Standalone one
  154.   CheckIfApp("Aim:AimApp");
  155.   CheckIfSidebar();
  156.  
  157.   // If App then initialize the menu items.
  158.   if ((IsApp) && (!IsSidebar)) 
  159.     UpdateMenuItemsForApp("Offline");
  160.   
  161.     
  162.   OnlineObserver.onAssert(aimRDFDataSource(), aimRDFSession(), aimRDFSessionState(), state);
  163.   // Watch future changes to online state
  164.     aimRDFDataSource().AddObserver(OnlineObserver);
  165.     
  166.     
  167.   var firstLogin = aimPrefsManager().GetBoolPref("aim.session.appfirstlogin", null,true);
  168.   // Auto login
  169.     
  170.   if (screenName && screenName != '' && password && password != '' && autoLogin && firstLogin != false &&
  171.       connectionName && connectionName !='') {
  172.     if (state.EqualsNode(aimRDF().GetLiteral("Offline"))) {
  173.  
  174.       if (!IsServiceCorrect(screenName, connectionName))
  175.         return;
  176.  
  177.       setConnectionInfo (connectionName, "im", screenName);
  178.       aimSessionLogin(screenName, password);
  179.     }
  180.   }
  181.   else
  182.   {
  183.     buildLoginMenu();
  184.     if (screenName && screenName != '') {
  185.       if (!password || password == '')
  186.         document.getElementById('fldPassword').focus();
  187.       else
  188.         enableSignOnButton(true); //ok..we have SN and password. Enable the signon button
  189.     }
  190.     else
  191.       document.getElementById('fldScreenName').focus();
  192.             
  193.   }
  194.   if (aimSession().IsOnline() && !isIcq()) {
  195.     var emailArray = GetBuddiesEmailAddress();
  196.     CreateAimMailBridge(emailArray);
  197.   }
  198. }
  199.  
  200.  
  201. function resetPopUp()
  202. {
  203.   setMenuPopUp (document.getElementById("sessionTypeListmenu").value);
  204. }
  205.  
  206.  
  207. function AimSidebarPanelSetAwayMsgBtn(){
  208.   var menu = window.document.getElementById("btnaway");
  209.   if (isIcq() == true)
  210.   {
  211.     // this is an Icq session
  212.     var sidebar_file = GetRdfFileUrl("default-messages-icq.rdf", "icqdm.rdf"); 
  213.     menu.setAttribute('ref', "NC:ICQ/AwayMessageBag");  
  214.   }
  215.     else
  216.   {
  217.     var sidebar_file = GetRdfFileUrl("default-messages.rdf", "dm.rdf");
  218.     menu.setAttribute('ref', "NC:AIM/AwayMessageBag");  
  219.   }
  220.   var datasource = aimRDF().GetDataSource(sidebar_file);
  221.   var menudb=menu.database.GetDataSources();
  222.   while   (menudb.hasMoreElements()) {
  223.                 var curDS= menudb.getNext();
  224.               curDS=curDS.QueryInterface(Components.interfaces.nsIRDFDataSource);
  225.                 menu.database.RemoveDataSource(curDS);
  226.         }
  227.     menu.database.AddDataSource(datasource);
  228.   menu.builder.rebuild();
  229. }
  230.  
  231.  
  232. function SetAwayMenu(){
  233.   var menu;
  234.   if (isIcq() == true) {
  235.     menu = top.document.getElementById("menu_Away_icq");
  236.     // this is an Icq session
  237.     var sidebar_file = GetRdfFileUrl("default-messages-icq.rdf", "icqdm.rdf"); 
  238.     menu.setAttribute('ref', "NC:ICQ/AwayMessageBag");  
  239.   }
  240.     else {
  241.     menu = top.document.getElementById("menu_Away");
  242.       var sidebar_file = GetRdfFileUrl("default-messages.rdf", "dm.rdf");  
  243.   }
  244.   var datasource = aimRDF().GetDataSource(sidebar_file);
  245.     var menudb=menu.database.GetDataSources();
  246.   while   (menudb.hasMoreElements()) {
  247.                 var curDS= menudb.getNext();
  248.                 curDS=curDS.QueryInterface(Components.interfaces.nsIRDFDataSource);
  249.                 menu.database.RemoveDataSource(curDS);
  250.         }
  251.     menu.database.AddDataSource(datasource);
  252.     menu.builder.rebuild();
  253. }
  254.  
  255. function AimSidebarPanelOnWndUnload() {
  256.     // Save signon fields if offline. If online, we saved during signon.
  257.     var state = aimRDFDataSource().GetTarget(aimRDFSession(), aimRDFSessionState(), true);
  258.     if (state == null || state.EqualsNode(aimRDF().GetLiteral("Offline")))
  259.         SaveFieldsToPrefs();
  260.   aimRDFDataSource().RemoveObserver(OnlineObserver);
  261.   ClearProcessTimer();
  262.   removeSidebarSessionListener();
  263.   removeSidebarBuddyListObserver();
  264.   CleanupGlobals();
  265. }
  266.  
  267. function addLoginName(newName)
  268. {
  269.   var loginContainer = null;
  270.   var loginRDF = aimRDF();
  271.   var loginRDFCU = Components.classes['@mozilla.org/rdf/container-utils;1'].getService(Components.interfaces.nsIRDFContainerUtils);
  272.   var loginNamesfile; 
  273.   var refid;
  274.  
  275.   if (isIcq())
  276.   {
  277.     // this is an Icq session
  278.     loginNamesfile = GetRdfFileUrl("loginNames-icq.rdf", "loginNames-icq.rdf", 1); 
  279.     refid = "NC:ICQ/LoginNamesBag";  
  280.   }
  281.   else
  282.   {
  283.     loginNamesfile = GetRdfFileUrl("loginNames-aim.rdf", "loginNames-aim.rdf", 1);
  284.     refid = "NC:AIM/LoginNamesBag";  
  285.   }
  286.  
  287.   try {
  288.     loginDS = loginRDF.GetDataSource(loginNamesfile);
  289.   } catch (e) {
  290.     return;
  291.     dump("need to get the new loginNames-*.rdf files into this profile\n");
  292.   }
  293.   if (loginDS)
  294.     loginDS = loginDS.QueryInterface(Components.interfaces.nsIRDFDataSource);
  295.   if (loginContainer == null)
  296.     loginContainer = Components.classes["@mozilla.org/rdf/container;1"].createInstance(Components.interfaces.nsIRDFContainer);
  297.  
  298.   if (loginContainer)
  299.   {
  300.     var containerRes = loginRDF.GetResource(refid);
  301.     var checkIfSeq = loginRDFCU.IsSeq(loginDS, containerRes);
  302.     if (!checkIfSeq)
  303.       loginRDFCU.MakeSeq(loginDS, containerRes);
  304.     loginContainer.Init(loginDS, containerRes);
  305.  
  306.     // Check to see if this loginname is already in the list.
  307.     var elements = loginContainer.GetElements();
  308.     var nameResource = loginRDF.GetResource("http://home.netscape.com/NC-rdf#LoginName");
  309.     var node, target;
  310.     while (elements.hasMoreElements())
  311.     {
  312.       node = elements.getNext();
  313.       if (node)
  314.       {
  315.         target = loginDS.GetTarget( node, nameResource, true);
  316.         if (target)
  317.         {
  318.           target = target.QueryInterface(Components.interfaces.nsIRDFLiteral);
  319.           if (target && target.Value == newName)
  320.           {
  321.             return;
  322.           }
  323.         }
  324.       }
  325.     }
  326.   }
  327.   
  328.   var newMsg = loginRDF.GetAnonymousResource();
  329.   loginDS.Assert(newMsg, loginRDF.GetResource("http://home.netscape.com/NC-rdf#LoginName"), loginRDF.GetLiteral(newName), true);
  330.  
  331.   loginContainer.AppendElement(newMsg);
  332.   loginDS.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush();
  333.  
  334. }
  335.  
  336. function InitFieldsFromPrefs( doSNAndPasswd, curScreenName) {
  337.  
  338.     if (doSNAndPasswd == true) {
  339.         var screenName = aimPrefsManager().GetCharPref("aim.session.screenname", null, true);
  340.         var password = aimSessionGetPassword(null);
  341.         document.getElementById('fldScreenName').value = screenName;
  342.     }
  343.     var savePassword = aimPrefsManager().GetBoolPref("aim.session.storepassword", null, false);
  344.     var autoLogin = aimPrefsManager().GetBoolPref("aim.session.autologin", null, false);
  345.     document.getElementById('chkSavePassword').checked = savePassword;
  346.  
  347.     // PRASS TODO: This does something wrong. Keeps switching the pulldown incorrectly. Need to look into
  348.     // For now commenting out set menu pop up
  349.     var connectionName;
  350.   connectionName = aimPrefsManager().GetCharPref("aim.session.connectionname", null, false);
  351.   if (curScreenName) {
  352.         var connectionName;
  353.         if(doSNAndPasswd == true) {
  354.             connectionName = aimPrefsManager().GetCharPref("aim.session.connectionname", null, false);
  355.         }
  356.         else
  357.             connectionName = aimPrefsManager().GetCharPrefEdit("aim.session.connectionname", null, false, 
  358.                                                 curScreenName, -1);
  359.   //setMenuPopUp (connectionName);
  360.   }
  361.  
  362.     if(doSNAndPasswd == true && savePassword)
  363.         document.getElementById('fldPassword').value = password;
  364.     if (doSNAndPasswd == true && !savePassword)
  365.         document.getElementById('fldPassword').value = '';
  366.  
  367.  
  368.     document.getElementById('chkAutoLogin').checked = autoLogin;
  369.     EnableInputs();
  370. }
  371.  
  372. function buildLoginMenu()
  373. {
  374.   var menu = window.document.getElementById("fldScreenName");
  375.   var login_file; 
  376.   var refid;
  377.  
  378.   if (isIcq())
  379.   {
  380.     // this is an Icq session
  381.     login_file = GetRdfFileUrl("loginNames-icq.rdf", "loginNames-icq.rdf", 1); 
  382.     refid = "NC:ICQ/LoginNamesBag";  
  383.   }
  384.   else
  385.   {
  386.     login_file = GetRdfFileUrl("loginNames-aim.rdf", "loginNames-aim.rdf", 1);
  387.     refid = "NC:AIM/LoginNamesBag";  
  388.   }
  389.  
  390.   menu.setAttribute('ref', refid);
  391.   var datasource;
  392.   var menudb;
  393.   try {
  394.     datasource = aimRDF().GetDataSource(login_file);
  395.     menudb=menu.database.GetDataSources();
  396.   } catch (e) {
  397.     dump("need to get the new loginNames-*.rdf files into this profile\n");
  398.     return;
  399.   }
  400.   while   (menudb.hasMoreElements())
  401.   {
  402.     var curDS= menudb.getNext();
  403.     curDS=curDS.QueryInterface(Components.interfaces.nsIRDFDataSource);
  404.     menu.database.RemoveDataSource(curDS);
  405.   }
  406.   menu.database.AddDataSource(datasource);
  407.   menu.builder.rebuild();
  408. }
  409.  
  410. function setMenuPopUp (pLabel){
  411.   
  412.   dump("starting setMenuPopUp pLabel=" + pLabel + "\n");
  413.  
  414.   if (!pLabel || pLabel == "") {
  415.     pLabel = "AIM";
  416.     }
  417.   var menuPopup = document.getElementById("sessionTypeList");
  418.   if (!menuPopup) {
  419.     return;
  420.   }
  421.   var menuItems = menuPopup.childNodes;
  422.   var menuItem;
  423.   var defItem;
  424.   for (var i=0; i < menuItems.length; i++)
  425.   {
  426.     menuItem = menuItems.item(i);
  427.     if (menuItem.getAttribute("label") == pLabel )
  428.     {
  429.       document.getElementById('sessionTypeListmenu').selectedItem = menuItem;
  430.       UpdateCurrentWindow(pLabel);
  431.       return;
  432.     }
  433.     if (menuItem.getAttribute("label") == "AIM")  
  434.       defItem = menuItem;
  435.   }   
  436.     //default
  437.   document.getElementById('sessionTypeListmenu').selectedItem = defItem;
  438.   UpdateCurrentWindow(pLabel);
  439.   
  440. }
  441.  
  442. function SaveFieldsToPrefs() {
  443.   var screenName = document.getElementById('fldScreenName').value;
  444.   var password = document.getElementById('fldPassword').value;
  445.   var autoLogin = document.getElementById('chkAutoLogin').checked;
  446.   var savePassword = document.getElementById('chkSavePassword').checked;
  447.   var connectionNameNode = document.getElementById('sessionTypeListmenu').selectedItem;
  448.   var connectionName = connectionNameNode.getAttribute("label");
  449.   //safety check for trying to save an "empty" screen name. 
  450.   if(screenName != ""){
  451.      aimPrefsManager().SetCharPref("aim.session.screenname", screenName, null, true);
  452.      aimPrefsManager().SetCharPref("aim.session.connectionname", connectionName, null, false);
  453.      //aimPrefsManager().SetCharPref("aim.session.userconnectionname", connectionName, null, true);
  454.   
  455.   
  456.      // test screenname to see if there are any non-numeric chars
  457.      // if there are - then it's not a valid ICQ screen name so do not store it.
  458.      // if there are only numeric chars then it's not a valid AIM screen name since 
  459.      // they have to start with a letter at least.
  460.   
  461.      var foundNonNumeric = screenName.match(/[\D]+/g); //matches any alpha chars
  462.    
  463.   
  464.      switch(connectionName){
  465.         case "ICQ": if(!foundNonNumeric){
  466.                        aimPrefsManager().SetCharPref("aim.session.latesticqscreenname", screenName, null, true);
  467.                        }
  468.                     break;
  469.         case "AIM": if(foundNonNumeric){
  470.                        aimPrefsManager().SetCharPref("aim.session.latestaimscreenname", screenName, null, true);
  471.                        }
  472.                     break;          
  473.   
  474.      }
  475.   }
  476.  
  477.  
  478.     if (savePassword)
  479.         aimSessionSavePassword(password);
  480.     else
  481.         aimSessionSavePassword("");
  482.  
  483.     aimPrefsManager().SetBoolPref("aim.session.storepassword", savePassword, null, false);
  484.     aimPrefsManager().SetBoolPref("aim.session.autologin", autoLogin, null, false);
  485. }
  486.  
  487.  
  488. function EnableInputs() {
  489.   var password = document.getElementById("fldPassword").value;
  490.     var savePassword = document.getElementById("chkSavePassword").checked;
  491.  
  492.     if (password != "") {
  493.     enableSignOnButton(true);
  494.     document.getElementById("chkSavePassword").disabled = false;
  495.         document.getElementById("chkAutoLogin").disabled = !savePassword;
  496.  
  497.         // XXX This is what the AIM 3.0 client does. Not sure if we should
  498.         //     change it.
  499.         if (!savePassword)
  500.             document.getElementById("chkAutoLogin").checked = false;
  501.     }
  502.     else {
  503.         enableSignOnButton(false);
  504.         document.getElementById("chkSavePassword").disabled = true;
  505.         document.getElementById("chkAutoLogin").disabled = true;
  506.  
  507.         // XXX This is what the AIM 3.0 client does. Not sure if we should
  508.         //     change it.
  509.         document.getElementById("chkSavePassword").checked = false;
  510.         document.getElementById("chkAutoLogin").checked = false;
  511.     }
  512. }
  513.  
  514.  
  515. /*
  516.  * Function: removeAllBuddyGroups()
  517.  *
  518.  * Arguments: none
  519.  * 
  520.  * Return: None
  521.  *
  522.  * Description: This function removes the IM datasource.
  523.  *
  524.  * Author: Suresh 12/13/01
  525.  */
  526.  
  527. function removeAllBuddyGroups()
  528. {
  529.   var aimbuddy = aimBuddyManager();
  530.   if (aimbuddy) {
  531.     aimbuddy.RemoveAllGroups();
  532.     aimbuddy.RemoveAuthGroup();
  533.     aimbuddy.RemoveBuddyAlertSeq();
  534.   }
  535. }
  536.  
  537.  
  538. function aimRDFEmail()
  539. {
  540.   var rdf = aimRDF();
  541.   if (rdf)
  542.     return rdf.GetResource("http://home.netscape.com/NC-rdf#EmailID");
  543.     return null;
  544. }
  545. /****************  RDF Observing ********************/
  546.  
  547. var OnlineObserver = new Object();
  548.  
  549. OnlineObserver.onAssert = function(datasource, source, property, target)
  550. {
  551.   if (!(aimBuddyManager().GetBLLoadingState())) {
  552.     if (property.EqualsNode(aimRDFEmail())) {
  553.       var email = target.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  554.       var RDF = aimRDF();
  555.       var property1 = RDF.GetResource("http://home.netscape.com/NC-rdf#ScreenName");
  556.       var buddyname = datasource.GetTarget(source, property1, true);
  557.       buddyvalue = buddyname.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  558.       AddBuddyEmailAddress(buddyvalue, email);
  559.     }
  560.   }
  561.  
  562.   if(source.EqualsNode(aimRDFSession())) {
  563.     if(property.EqualsNode(aimRDFSessionState())) {
  564.       var state = target.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  565.  
  566.       // flip to the appropriate panel in the deck
  567.       var deck = document.getElementById("PanelDeck");
  568.       var newIndex = deck.getAttribute("selectedIndex");
  569.       switch (state) {
  570.         case "Register":
  571.           setThrobberState(false);
  572.           newIndex = 4; // register panel
  573.           if  ((IsApp) && (!IsSidebar))
  574.             top.title = aimString("app.title.Register");
  575.           break;
  576.  
  577.         case "Offline":
  578.           CleanupGlobals();
  579.           setThrobberState(false);
  580.           var fsttry = aimPrefsManager().GetBoolPref("aim.session.firsttry", null, true);
  581.           if (!fsttry)       
  582.             newIndex = 0;// sign-on panel
  583.  
  584.           if ((IsApp) && (!IsSidebar))  {
  585.             top.title = aimString("app.title.SignOn");
  586.             UpdateMenuItemsForApp(state);
  587.           }
  588.           break;
  589.         case "Online":
  590.           if (aimBuddyManager().GetBLLoadingState())
  591.             setThrobberState(true);
  592.           else
  593.             setThrobberState(false);
  594.           newIndex = 3; // online panel
  595.           if ((IsApp) && (!IsSidebar))  {
  596.             if (isIcq() == true)
  597.               top.title = aimString("app.title.Online_ICQ").replace(/%UserName%/, aimSessionCurrentScreenName());
  598.             else
  599.               top.title = aimString("app.title.Online").replace(/%UserName%/, aimSessionCurrentScreenName());
  600.  
  601.             UpdateMenuItemsForApp(state);
  602.             
  603.           }
  604.  
  605.           //SURESH: document.getElementById("BuddiesCol") doesn't work for some reason...so
  606.           //searching for treecolid="buddies". It must be unique. Don't add this anywhere else!
  607.           var attr = document.getElementsByAttribute("treecolid", "buddies");
  608.           if (isIcq()) {
  609.             document.getElementById("ListSetup").setAttribute("context", "icqcontext");
  610.             document.getElementById("OnlineBuddies").setAttribute("context", "icqcontext");
  611.  
  612.             document.getElementById("NewMailCol").setAttribute("hidden", "true");
  613.             document.getElementById("ListSetupCol").setAttribute("sessionMode", "Icq");
  614.             attr.item(0).setAttribute("session", "Icq");
  615.           }
  616.           else {
  617.             document.getElementById("ListSetup").setAttribute("context", "context");
  618.             document.getElementById("OnlineBuddies").setAttribute("context", "context");
  619.  
  620.             var supportmailim = aimPrefsManager().GetBoolPref("aim.session.supportmailim", null, false);
  621.             if (!supportmailim) {
  622.               //this will remove/hide the NewMail column.
  623.               attr.item(0).setAttribute("session", "Icq");
  624.               document.getElementById("mailcompose").setAttribute("hidden", "true");
  625.               document.getElementById("OnlineBuddies").setAttribute("hidecolumnpicker", "true");
  626.             }
  627.           }
  628.           addLoginName(aimSessionCurrentScreenName());
  629.           break;
  630.         case "OnlineAway":
  631.           setThrobberState(false);
  632.           newIndex = 2; // away panel
  633.           if ((IsApp) && (!IsSidebar))
  634.             top.title = aimString("app.title.OnlineAway");
  635.           break;
  636.         case "Connecting":
  637.         case "Requesting":
  638.         case "Negotiating":
  639.         case "Validating":
  640.         case "Transferring":
  641.         case "Starting":
  642.           setThrobberState(true);
  643.           newIndex = 1; // connecting panel
  644.           if ((IsApp) && (!IsSidebar))
  645.             top.title = aimString("app.title.Connecting");
  646.           newIndex = 1;
  647.       }
  648.       
  649.       deck.setAttribute("selectedIndex", newIndex);
  650.       
  651.       if (state != "Offline" && state != "Online" && state != "Register" && state != "OnlineAway") {
  652.         var str = aimString("btnSignOnProgress." + state);
  653.         document.getElementById("btnSignOnProgress").setAttribute("value", str);
  654.         var theProgressBar = document.getElementById("spconnectingprogressbar001");
  655.         theProgressBar.setAttribute("value",parseInt(theProgressBar.getAttribute("value"))+15)
  656.       }
  657.       
  658.       if(state == "Online" || state == "OnlineAway")
  659.         aimMigrateBuddyList(aimSessionCurrentScreenName());
  660.  
  661.       // If returning to offline state, reinitialize the signon screen fields,
  662.       // which appear to be cleared out when they are hidden. We also do this
  663.       // when the form is loaded.
  664.       if (state == "Offline") {
  665.         progress = window.document.getElementById("spconnectingprogressbar001");
  666.         if (progress && progress != undefined)
  667.           progress.setAttribute("value", "0");
  668.         InitFieldsFromPrefs(true, null);
  669.         //this call is to delete all our datasources during signoff. Timeout is used coz the Signon panel
  670.         //must be loaded before we call this function. Without timeout, this function is called before the signon panel
  671.         //is loaded and it takes few seconds to see the panel :( 
  672.         setTimeout('removeAllBuddyGroups()', 500);
  673.  
  674.       }
  675.       
  676.       if (state == "Online") { 
  677.         AimSidebarPanelSetAwayMsgBtn();    
  678.         UpdateUserWarning(null);
  679.         UpdateAuthAwaitGroup();
  680.         SelectIndex(0);
  681.       }
  682.       
  683.     }
  684.    
  685.     if(property.EqualsNode(aimRDFWarningStatus())) {
  686.       var st = target.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  687.       UpdateUserWarning(st);
  688.     }
  689.  
  690.   }
  691. };
  692.  
  693. OnlineObserver.onUnassert = function(datasource, source, property, target)
  694. {
  695.   if (!(aimBuddyManager().GetBLLoadingState())) {
  696.     if (property.EqualsNode(aimRDFEmail())) {
  697.       var email = target.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  698.       var RDF = aimRDF();
  699.       var property1 = RDF.GetResource("http://home.netscape.com/NC-rdf#ScreenName");
  700.       var buddyname = datasource.GetTarget(source, property1, true);
  701.       buddyvalue = buddyname.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  702.       RemoveBuddyEmailAddress(buddyvalue);
  703.     }
  704.   }
  705. };
  706.     
  707. OnlineObserver.onChange = function(datasource, source, property, oldTarget, newTarget)
  708. {
  709.   if (!(aimBuddyManager().GetBLLoadingState())) {
  710.     if (property.EqualsNode(aimRDFEmail())) {
  711.       var email = newTarget.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  712.       var RDF = aimRDF();
  713.       var property1 = RDF.GetResource("http://home.netscape.com/NC-rdf#ScreenName");
  714.       var buddyname = datasource.GetTarget(source, property1, true);
  715.       buddyvalue = buddyname.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  716.       UpdateBuddyEmailAddress(buddyvalue, email);
  717.       return;
  718.     }
  719.   }
  720.     OnlineObserver.onAssert(datasource, source, property, newTarget);
  721. };
  722.     
  723. OnlineObserver.onMove = function(datasource, oldSource, newSource, property, target)
  724. {
  725.     OnlineObserver.onAssert(datasource, newSource, property, target);
  726. };
  727.  
  728. OnlineObserver.onBeginUpdateBatch = function(datasource)
  729. {
  730. };
  731.  
  732. OnlineObserver.onEndUpdateBatch = function(datasource)
  733. {
  734. };
  735.  
  736. /**************** Command Handlers ******************/
  737.  
  738. function cmdPanelSignOn() 
  739. {
  740.     SaveFieldsToPrefs();
  741.  
  742.     var screenName = document.getElementById('fldScreenName').value;
  743.     var password = document.getElementById('fldPassword').value;
  744.  
  745.     var curConnName = document.getElementById("sessionTypeListmenu").label;
  746.  
  747.     if (!IsServiceCorrect(screenName, curConnName)) {
  748.        return;  
  749.     }
  750.  
  751.   setConnectionInfo (curConnName, "im", screenName);
  752.     aimSessionLogin(screenName, password);
  753.       
  754. }
  755.  
  756.  
  757.  
  758. function autosuggest(screenName)
  759. {
  760.   var screenNameObj = document.getElementById("fldScreenName");
  761.   var menuPopup = screenNameObj.lastChild.childNodes;
  762.   var length = menuPopup.length;
  763.   var match;
  764.   var regexp = new RegExp("^" + screenName, "i");
  765.   for (var i=0; i<length; i++)
  766.   {
  767.     match = new String (menuPopup.item(i).value);
  768.     if (match.search(regexp) != -1)
  769.     {
  770.       screenNameObj.inputField.value = match.toString();
  771.       screenNameObj.inputField.setSelectionRange(screenName.length, match.length);
  772.       break;
  773.     }
  774.   }
  775. }
  776.  
  777. /************* key/focus handlers *************/
  778.  
  779. // function cmdScreenName(event)
  780. // handles key events from screenname field
  781. // id="fldScreenName shift-tabbing goes to id="sessionTypeListmenu"
  782. // id="fldScreenName" tabbing goes to id="fldPassword"
  783.  
  784. function cmdScreenName(event) {
  785.    var prevTabOrderElement = "sessionTypeListmenu";
  786.    var nextTabOrderElement = "fldPassword";
  787.    
  788.   if ((event.keyCode == 9) && (event.shiftKey)) 
  789.     {
  790.       document.getElementById(prevTabOrderElement).focus();
  791.       document.getElementById(prevTabOrderElement).setAttribute("focus-ring", "true");
  792.       event.preventDefault();
  793.       return;
  794.     }
  795.   
  796.     var screenName = document.getElementById('fldScreenName').value;
  797.   // if they didn't hit backspace or delete, try to guess what they're typing.
  798.   if (event.keyCode != 46 && event.keyCode != 8)
  799.   {
  800.     autosuggest(screenName);
  801.     screenName = document.getElementById('fldScreenName').value;
  802.   }
  803.   try {
  804.         var password = "";
  805.       try {
  806.         password = aimSessionGetPassword(screenName);
  807.         } catch (e) {}
  808.         document.getElementById('fldPassword').value = password; 
  809.         document.getElementById('fldPassword').setAttribute("value",password);
  810.     } catch (e) {dump("exception\n");}
  811.   EnableInputs();
  812.   InitFieldsFromPrefs(false, screenName);
  813.  
  814.   // if the user types in screenname and if find the password from pref, enable the send button.
  815.   if ((password.length != 0) && (screenName.length != 0))
  816.     enableSignOnButton(true);
  817.   else
  818.     enableSignOnButton(false);
  819.   // ..so.. if the user enters username and password is filled from prefs, then on enter key sign on.
  820.   if ((event.keyCode == 13) && (password.length != 0) && (screenName.length != 0))
  821.     cmdPanelSignOn();
  822.  
  823.   // if the user presses Enter and password field is empty, put the focus in password field.
  824.   if ((event.keyCode == 13) && (password.length == 0))
  825.     document.getElementById(nextTabOrderElement).focus();
  826. }
  827.  
  828. function cmdPasswordKeyup(event) {
  829.     // Enabled state of savePassword checkbox depends on
  830.     // empty/non-empty password field
  831.   EnableInputs();
  832.   InitFieldsFromPrefs(false, null);
  833.   var password = document.getElementById('fldPassword').value;
  834.   if (password.length > 0){
  835.     enableSignOnButton(true);
  836.     }
  837.   else{
  838.     enableSignOnButton(false);
  839.     }
  840. if (event.keyCode == 13 && password.length > 0){
  841.    event.preventDefault();
  842.    cmdPanelSignOn();
  843.    }
  844. }
  845.  
  846.  
  847. /*
  848.  * Function: setFocusPassLink (event)
  849.  *
  850.  * Arguments: 
  851.  *      event -- key event passed from SpSignOnOrgoverlay
  852.  *
  853.  * Return: None
  854.  *
  855.  * Description: This function intervenes the default focus propagation and sets focus 
  856.  * to the forgot password link to make it accessible. When user hits tab from the Signon button, the focus
  857.  * goes to forgot  password link. Tab from here, goes to screen name field and cycles as before.
  858.  *
  859.  */
  860.  
  861. function setFocusPassLink(event) {
  862.    var currTabOrderElement = "spsignonSignOn2";
  863.    var nextTabOrderElement = "spsignonpasslink";
  864.  
  865.   if (event.shiftKey) {
  866.     //go to previous element - either the sign on button or the help button
  867.     document.getElementById(currTabOrderElement).removeAttribute("focus-ring");
  868.     return;
  869.    }
  870.   event.preventDefault();
  871.   document.getElementById(currTabOrderElement).removeAttribute("focus-ring");
  872.   document.getElementById(nextTabOrderElement).focus();
  873.   document.getElementById(nextTabOrderElement).setAttribute("focus-ring", "true");  
  874.   
  875. }
  876.  
  877. /*
  878.  * Function: unsetFocusPassLink (event)
  879.  *
  880.  * Arguments: 
  881.  *      event -- key event passed from SpSignOnOrgoverlay
  882.  *
  883.  * Return: None
  884.  *
  885.  * Description: This function is called on the onkeypress handler on the password link label.
  886.  * If shift-tab is pressed, it puts focus on the Signon button (provided password field is not empty).
  887.  * If just tab is entered, then focus is put on the Screen name field by rotating focus in clockwise 
  888.  * direction.
  889.  *
  890.  */
  891.  
  892. function unsetFocusPassLink(event) {
  893.    var prevTabOrderElement = "spsignonSignOn2";
  894.    var currTabOrderElement = "spsignonpasslink";
  895.    var nextTabOrderElement = "spregisterpasslink";
  896.  
  897.   if (event.shiftKey) {
  898.     // Shift tab should rotate focus in anti clockwise direction. In this case focus to sign on button
  899.     var password = document.getElementById('fldPassword').value;
  900.     if (password.length == 0) 
  901.         // Do not put focus in sign on button is passfield field was empty - since user can use the button
  902.         return;
  903.     event.preventDefault();
  904.     document.getElementById(prevTabOrderElement).focus();
  905.     document.getElementById(prevTabOrderElement).setAttribute("focus-ring", "true");
  906.   }
  907.   document.getElementById(currTabOrderElement).removeAttribute('focus-ring');
  908. }
  909.  
  910. /*
  911.  * Function: setFocusRegisterLink (event)
  912.  *
  913.  * Arguments: 
  914.  *      event -- key event passed from SpSignOnOrgoverlay
  915.  *
  916.  * Return: None
  917.  *
  918.  * Description: This function intervenes the default focus propagation and sets focus 
  919.  * to the register user link to make it accessible. When user hits tab from the forgot password link, the focus
  920.  * goes to register link. Tab from here, goes to screen name field and cycles as before.
  921.  *
  922.  */
  923.  
  924. function setFocusRegisterLink(event) {
  925.    var prevTabOrderElement = "spsignonSignOn2";
  926.    var currTabOrderElement = "spsignonpasslink";
  927.    var nextTabOrderElement = "spregisterpasslink";
  928.  
  929.   if (event.shiftKey) {
  930.     //go to previous element - either the sign on button or the help button
  931.     document.getElementById(currTabOrderElement).removeAttribute("focus-ring");
  932.     return;
  933.    }
  934.   event.preventDefault();
  935.   document.getElementById(currTabOrderElement).removeAttribute("focus-ring");
  936.   document.getElementById(nextTabOrderElement).focus();
  937.   document.getElementById(nextTabOrderElement).setAttribute("focus-ring", "true");  
  938.   
  939. }
  940.  
  941. /*
  942.  * Function: unsetFocusRegisterLink (event)
  943.  *
  944.  * Arguments: 
  945.  *      event -- key event passed from SpSignOnOrgoverlay
  946.  *
  947.  * Return: None
  948.  *
  949.  * Description: This function is called on the onkeypress handler on the register user link label.
  950.  * If shift-tab is pressed, it puts focus on the forgot password link.
  951.  * If just tab is entered, then focus is put on the Screen name field by rotating focus in clockwise 
  952.  * direction.
  953.  *
  954.  */
  955.  
  956. function unsetFocusRegisterLink(event) {
  957.    var prevTabOrderElement = "spsignonpasslink";
  958.    var currTabOrderElement = "spregisterpasslink";
  959.    var nextTabOrderElement = "speditAIMlink";
  960.    if (event.shiftKey) {
  961.      event.preventDefault();
  962.      document.getElementById(prevTabOrderElement).focus();
  963.      document.getElementById(prevTabOrderElement).setAttribute("focus-ring", "true");
  964.    }
  965.    document.getElementById(currTabOrderElement).removeAttribute('focus-ring');
  966.    document.getElementById(currTabOrderElement).blur();
  967.    document.getElementById(nextTabOrderElement).setAttribute("focus-ring", "true");
  968. }
  969.  
  970. /*
  971.  * Function: setFocusEditAIMAccountLink (event)
  972.  *
  973.  * Arguments: 
  974.  *      event -- key event passed from SpSignOnOrgoverlay
  975.  *
  976.  * Return: None
  977.  *
  978.  * Description: This function intervenes the default focus propagation and sets focus 
  979.  * to the edit AIM Account link to make it accessible. When user hits tab from the register link, the focus
  980.  * goes to edit AIM link. Tab from here, goes to screen name field and cycles as before.
  981.  *
  982.  */
  983.         
  984. function setFocusEditAIMAccountLink(event) {
  985.    var prevTabOrderElement = "spsignonpasslink";
  986.    var currTabOrderElement = "spregisterpasslink";
  987.    var nextTabOrderElement = "speditAIMlink";  //speditAIMlink
  988.  
  989.   if (event.shiftKey) {
  990.     //go to previous element - either the sign on button or the help button
  991.     document.getElementById(currTabOrderElement).removeAttribute("focus-ring");
  992.     return;
  993.    }
  994.   event.preventDefault();
  995.   dump('$$$$$\n');
  996.   document.getElementById(currTabOrderElement).removeAttribute("focus-ring");
  997.   document.getElementById(nextTabOrderElement).focus();
  998.   document.getElementById(nextTabOrderElement).setAttribute("focus-ring", "true");  
  999.   
  1000. }
  1001.  
  1002. /*
  1003.  * Function: unsetFocusAIMEditAccountLink (event)
  1004.  *
  1005.  * Arguments: 
  1006.  *      event -- key event passed from SpSignOnOrgoverlay
  1007.  *
  1008.  * Return: None
  1009.  *
  1010.  * Description: This function is called on the onkeypress handler on the register user link label.
  1011.  * If shift-tab is pressed, it puts focus on the forgot password link.
  1012.  * If just tab is entered, then focus is put on the Screen name field by rotating focus in clockwise 
  1013.  * direction.
  1014.  *
  1015.  */
  1016.  
  1017. function unsetFocusEditAIMAccountLink(event) {
  1018.    var prevTabOrderElement = "spregisterpasslink";
  1019.    var currTabOrderElement = "spregisterpasslink";
  1020.    //var nextTabOrderElement = "sessionTypeListmenu";
  1021.    if (event.shiftKey) {
  1022.      event.preventDefault();
  1023.      document.getElementById(prevTabOrderElement).focus();
  1024.      document.getElementById(prevTabOrderElement).setAttribute("focus-ring", "true");
  1025.    }
  1026.    document.getElementById(currTabOrderElement).removeAttribute('focus-ring');
  1027.    document.getElementById(currTabOrderElement).blur();
  1028.    document.getElementById(nextTabOrderElement).setAttribute("focus-ring", "true");
  1029. }
  1030.  
  1031.  
  1032. function setFocusSignOnButton(event){
  1033.    var currTabOrderElement = "spsignonHelp2";
  1034.    var nextTabOrderElement = "spsignonSignOn2";
  1035.    if(event.shiftKey){
  1036.       return;
  1037.    }
  1038.    if(document.getElementById(nextTabOrderElement).getAttribute("disabled") == "true"){
  1039.       setFocusPassLink(event);
  1040.    }else{
  1041.      return;
  1042.    }
  1043. }
  1044.  
  1045.   /*
  1046.   * Name: enableSignOnButton
  1047.   *
  1048.   * Arguments: flag. 
  1049.   *
  1050.   * Description:
  1051.   *
  1052.   * This function enables or disables the signon button based on the flag.
  1053.   *    true = enables the button
  1054.   *    false = disables the button
  1055.   *
  1056.   * Return Value: none
  1057.   *
  1058.   * Author: Suresh Kasinathan<suresh@netscape.com> 8/20/01
  1059.   *
  1060.   */
  1061.  
  1062. function enableSignOnButton(flag) {
  1063.   var signOnButton = document.getElementById('spsignonSignOn2');
  1064.   if (signOnButton) {
  1065.     if (flag)
  1066.       signOnButton.setAttribute("disabled", "false");
  1067.     else
  1068.       signOnButton.setAttribute("disabled", "true");
  1069.   }
  1070. }
  1071.  
  1072. function cmdClickSavePassword() {
  1073.     if (!document.getElementById('chkSavePassword').checked)
  1074.         aimPrefsManager().SetBoolPref("aim.session.storepassword", false, null, false);
  1075.     // Enabled state of autoLogin checkbox depends on
  1076.     // state of savePassword checkbox
  1077.   EnableInputs();
  1078.   // Save fields so that icq/aim switcher will pick up the checkbox pref.
  1079.   SaveFieldsToPrefs();
  1080. }
  1081.  
  1082. function cmdClickAutoLogin() {
  1083.   aimPrefsManager().SetBoolPref("aim.session.autologin", document.getElementById('chkAutoLogin').checked, null, false);
  1084. }
  1085.  
  1086. function cmdRegisterScreenName() {
  1087.     var screenName = document.getElementById('fldRegisterName').value;
  1088.  
  1089.     if (screenName == '') {
  1090.         aimErrorBox(aimString("msg.NoScreenName"));
  1091.         return;
  1092.     }
  1093.   
  1094.   // this will call into nsIAimSession, save the screen name in prefs and
  1095.   // notify our observers to go from the register panel to the signon panel
  1096.   aimSessionRegister(screenName);
  1097.  
  1098.     document.getElementById('fldScreenName').value = screenName;
  1099. }
  1100.  
  1101. function cmdDoubleClick(event)
  1102. {
  1103.   if (event.button != 0) return;
  1104.   var target = event.originalTarget;
  1105.   if (event.detail == 2 && target.localName == "treechildren") {
  1106.     var row = new Object;
  1107.     var colID = new Object;
  1108.     var childElt = new Object;
  1109.  
  1110.     var tree = getSelectedTreeName();
  1111.     var col = getSelectedTabName();
  1112.     if (!tree || !col) return;
  1113.     tree.boxObject.QueryInterface(Components.interfaces.nsITreeBoxObject).getCellAt(event.clientX, event.clientY, row, colID, childElt);
  1114.  
  1115.     if (row.value == -1)
  1116.       return;
  1117.  
  1118.     var view = tree.treeBoxObject.view;
  1119.     var level = view.getLevel(row.value);
  1120.     if (level == 0)
  1121.       return;
  1122.  
  1123.  
  1124.     if ((!isIcq()) && (colID.value == "NewMailCol")) {
  1125.       var buddyres = GetBuddyResource(tree, row.value);
  1126.       var buddyName = GetBuddyAttribute(tree, buddyres, "ScreenName");
  1127.       var buddyEmail = aimFeedbagManager().GetEmailId(buddyName);
  1128.       if (buddyEmail && buddyEmail != "") 
  1129.         ViewUnread(buddyEmail);
  1130.       else
  1131.         window.openDialog('chrome://aim/content/AimStoreEmail.xul','_blank','chrome,titlebar,dialog=yes,centerscreen,modal=yes', buddyName);
  1132.       return;
  1133.     }
  1134.  
  1135.     var colvalue = document.getElementById(colID.value);
  1136.     if (colvalue && colvalue.getAttribute("cycler") != "true" && (childElt.value != "twisty"))
  1137.       cmdNewIM();
  1138.   }
  1139. }
  1140.  
  1141. function cmdFocus(event)
  1142.     {
  1143.     dump('focus: ' + event.target.tagName + '\n');
  1144.     }
  1145. function cmdBlur(event)
  1146.     {
  1147.     dump('blur: ' + event.target.tagName + '\n');
  1148.     }
  1149. function cmdGroupKeyUp(event)
  1150.     {
  1151.     if (event.keyCode == 13)
  1152.         {
  1153.         var item = event.target.parentNode.parentNode.parentNode;
  1154.         var name = item.getAttribute('Name');
  1155.         var newName = event.target.value;
  1156.  
  1157.         aimBuddyRenameBuddyGroup(name, newName);
  1158.         }
  1159.     }
  1160. function cmdBuddyKeyUp(event)
  1161.     {
  1162.     if (event.keyCode == 13)
  1163.         {
  1164.         var item = event.target.parentNode.parentNode.parentNode;
  1165.         var screenName = item.getAttribute('ScreenName');
  1166.         var newName = event.target.value;
  1167.  
  1168.         var groupItem = item.parentNode.parentNode;
  1169.         var groupName = groupItem.getAttribute('Name');
  1170.  
  1171.         var nextBuddy = null;
  1172.         if (item.nextSibling)
  1173.             nextBuddy = item.nextSibling.getAttribute('ScreenName');
  1174.  
  1175.         // XXX aimBuddyReplaceBuddy(groupName, screenName, newName);
  1176.         aimBuddyRemoveBuddy(groupName, screenName);
  1177.         aimBuddyAddBuddy(groupName, newName, nextBuddy);
  1178.         }
  1179.     }
  1180. function spInPlaceAddBuddy()
  1181.     {
  1182.       spInPlaceAddDelete( "AddBuddy" );
  1183.     }
  1184. function spAddBuddy()
  1185.     {
  1186.     val = prompt( "Enter Buddy Name","" );
  1187.     }
  1188. function spAddGroup()
  1189.     {
  1190.     val = prompt( "Enter Group Name", "" );
  1191.     }
  1192. function spInPlaceAddGroup()
  1193.     {
  1194.         spInPlaceAddDelete( "AddGroup" );
  1195.     }
  1196. function spInPlaceDelete()
  1197.     {
  1198.       spInPlaceAddDelete( "Delete" );
  1199.     }
  1200.  
  1201. function spInPlaceAddDelete( what )    // "Delete", "AddGroup", "AddBuddy"
  1202.     {
  1203.     // Locate selection in setup list
  1204.     // XXX There must be a better way to do this
  1205.     var selectedGroup = null;
  1206.     var selectedBuddy = null;
  1207.     var tree = document.getElementById("ListSetup");
  1208.     var groups = tree.childNodes[2].childNodes;
  1209.     for (var i = 0; i != groups.length; i++)
  1210.         {
  1211.         if (groups[i].getAttribute("selected") == "true")
  1212.             {
  1213.             selectedGroup = groups[i].getAttribute("Name");
  1214.             break;
  1215.             }
  1216.  
  1217.         var buddies = null;
  1218.         for (var j = 0; j != groups[i].childNodes.length; j++)
  1219.             {
  1220.             if (groups[i].childNodes[j].nodeName == "treechildren")
  1221.                 {
  1222.                 buddies = groups[i].childNodes[j].childNodes;
  1223.                 break;
  1224.                 }
  1225.             }
  1226.  
  1227.         if (buddies)
  1228.             {
  1229.             for (var j = 0; j != buddies.length; j++)
  1230.                 {
  1231.                 if (buddies[j].getAttribute("selected") == "true")
  1232.                     {
  1233.                     selectedBuddy = buddies[j].getAttribute("ScreenName");
  1234.                     break;
  1235.                     }
  1236.                 }
  1237.  
  1238.             if (selectedBuddy)
  1239.                 {
  1240.                 selectedGroup = groups[i].getAttribute("Name");
  1241.                 break;
  1242.                 }
  1243.             }
  1244.         }
  1245.  
  1246.     if (what == "AddBuddy")
  1247.         aimBuddyAddBuddy(selectedGroup, null, selectedBuddy);
  1248.     else if (what == "AddGroup")
  1249.         aimBuddyAddBuddyGroup(null, selectedGroup);
  1250.     else if (what == "Delete")
  1251.         {
  1252.         if (selectedBuddy)
  1253.             aimBuddyRemoveBuddy(selectedGroup, selectedBuddy);
  1254.         else if (selectedGroup)
  1255.             aimBuddyRemoveBuddyGroup(selectedGroup);
  1256.         }
  1257.     }
  1258.  
  1259. function spFindEmpty( display )    
  1260. {
  1261.     // Locate selection in setup list
  1262.     // XXX There must be a better way to do this
  1263.     var selectedGroup = null;
  1264.     var selectedBuddy = null;
  1265.     var tree = document.getElementById("ListSetup");
  1266.     var groups = tree.childNodes[2].childNodes;
  1267.  
  1268.     
  1269.     for (var i = 0; i != groups.length; i++)
  1270.     {
  1271.         var buddies = null;
  1272.         for (var j = 0; j != groups[i].childNodes.length; j++)
  1273.         {
  1274.             if (groups[i].childNodes[j].nodeName == "treechildren")
  1275.             {
  1276.                 buddies = groups[i].childNodes[j].childNodes;
  1277.                 break;
  1278.             }
  1279.         }
  1280.  
  1281.         if (buddies)
  1282.         {
  1283.             for (var j = 0; j != buddies.length; j++)
  1284.             {
  1285.                 if (buddies[j].getAttribute("ScreenName") == "")
  1286.                 {
  1287.                     selectedBuddy = buddies[j];
  1288.                     if ( display == "none" ) {
  1289.                         selectedBuddy.setAttribute("style", "visibility: hidden;");
  1290.                         selectedBuddy.setAttribute("Yabba", "Dabba;");
  1291.                     }
  1292.                     else {
  1293.                         selectedBuddy.setAttribute("style", "visibility: visible;");
  1294.                     }
  1295.                 }
  1296.                 if (buddies[j].getAttribute("type") == "text")
  1297.                 {
  1298.                     //dump( "Found an object that has a type of 'text'\n" );
  1299.                 }
  1300.             }
  1301.         }
  1302.     }
  1303.  
  1304.     //dump('  selectedGroup: ' + selectedGroup + '\n');
  1305.     //dump('  selectedBuddy: ' + selectedBuddy + '\n');
  1306. }
  1307. /*
  1308. function displayFrontTab(tabObj)
  1309. {
  1310.     tabOne=document.getElementById('tabOnline');
  1311.     tabTwo=document.getElementById('tabSetup');
  1312.     tabOne.setAttribute("style","");
  1313.     tabTwo.setAttribute("style","");
  1314.     tabObj.setAttribute("style","");
  1315. }
  1316.  
  1317. */
  1318.  
  1319. /*** setup chat callbacks for rendezvous ***/
  1320. /** start services **/
  1321. var IMServiceClass = Components.classes['@netscape.com/aim/IMManager;1'];
  1322. var pIIMManager  = IMServiceClass.getService(Components.interfaces.nsIIMManager);
  1323. var ChatManager = pIIMManager.QueryInterface(Components.interfaces.nsIAimChatManager);
  1324.  
  1325. /*** setup the chat call backs **/
  1326.  var ChatCallback = new Object();
  1327.  
  1328.  ChatCallback.OnRequestRoomComplete =  function(roomName,chatRoomObj){
  1329.   
  1330.   chatRoomObj.SetChatRoomCallback(ChatRoomCallback);
  1331.  
  1332.  top.chatRoomObj = chatRoomObj;
  1333.   window.setTimeout('top.chatRoomObj.Join()', 5000);
  1334.   window.setTimeout('top.chatRoomObj.Invite("vishy26aug", "Join this MAAN")', 10000);
  1335.   window.setTimeout('top.chatRoomObj.SendMessage("This is working!!")', 30000);
  1336.   window.setTimeout('top.chatRoomObj.SendWhisper("vishy26aug", "Private message for vishy26aug")', 30000);
  1337.  }
  1338.  
  1339.  
  1340.  ChatCallback.OnRequestRoomError =  function(roomName,errMsg){
  1341.  //dump("OnRequestRoomError: there was an error \n");
  1342.   window.close();
  1343.  }
  1344.  
  1345. /** setup the chat Room callbacks **/
  1346.  
  1347.  var ChatRoomCallback = new Object();
  1348.  
  1349.  ChatRoomCallback.OnJoined = function()
  1350.  {
  1351.   //dump("Yes I Joined\n");
  1352.  }
  1353.  
  1354.  ChatRoomCallback.OnUserJoined = function(screenName)
  1355.  {
  1356.   //dump( screenName + "joined the chat\n");
  1357.  }
  1358.  
  1359.  ChatRoomCallback.OnInfoUpdate = function()
  1360.  {
  1361.  }
  1362.  
  1363.  ChatRoomCallback.OnMessageReceived = function(screenName, language, message)
  1364.  {
  1365.   //dump (screenName + " SAYETH " + message + " IN " + language +"\n");
  1366.  }
  1367.  
  1368.  
  1369.  
  1370. var rendezvousCallback = new Object();
  1371.  
  1372. rendezvousCallback.OnProposalReceived = function (screenname, proposal)
  1373. {
  1374.     //dump ("got a proposal from " + screenname + "\n");
  1375.  
  1376.      //proposal.Accept();
  1377.      inviteArgsObj = {
  1378.          inviteProposalScreenName: screenname, 
  1379.          inviteProposalObj: proposal,
  1380.          invitedScreenNames: '',
  1381.          inviteToExistingWindow: false,
  1382.          inviteMode: 'incomingchat'
  1383.          }
  1384.      //dump('send proposal to dialog! \n;')
  1385.     window.openDialog('chrome://aim/content/chatInviteBuddy.xul','_blank','chrome,all,dialog=no',inviteArgsObj); 
  1386.     
  1387.      //dump("accepted the proposal");
  1388.  
  1389.      //ChatManager.RequestProposedRoom(ChatCallback, proposal);
  1390.  
  1391.  }
  1392.  
  1393. function setupChatRendezvous(){
  1394.     //dump("entering setupChatRendezvous 3\n");
  1395.     ChatManager.SetChatRendezvousCallback(rendezvousCallback)
  1396.     //dump("exiting setupChatRendezvous \n");
  1397. }
  1398.  
  1399.  
  1400. /***  end setup chat callbacks for rendezvous ***/
  1401.  
  1402. function cmdNewChatSidebar(invScreenName,invProposal,invScreenNames,toExistingWindow,invMode){
  1403.  
  1404.      inviteArgsObj = {
  1405.          inviteProposalScreenName: invScreenName, 
  1406.          inviteProposalObj: invProposal,
  1407.          invitedScreenNames: getSelectedBuddiesFromList(), //invScreenNames, (getSelectedBuddiesFromList is in App.js)
  1408.          inviteToExistingWindow: toExistingWindow,
  1409.          inviteMode: invMode
  1410.          }
  1411.          
  1412.     window.openDialog('chrome://aim/content/chatInviteBuddy.xul','_blank','chrome,all,dialog=no',inviteArgsObj);
  1413. }
  1414.  
  1415. // Function to open a new window for password lookup
  1416. function openPassLink()
  1417. {
  1418.   var checkSession=document.getElementById("sessionWatcher").getAttribute('sessionMode'); 
  1419.   if (checkSession == "Aim") {
  1420.     passLink = aimRegionString("aim.password.url");
  1421.     openTopWin(passLink);
  1422.     return;
  1423.   }
  1424.   else {
  1425.     passLink = aimRegionString("icq.password.url");
  1426.     openTopWin(passLink);  
  1427.     }
  1428.   
  1429. }
  1430.  
  1431.  
  1432.  
  1433.  
  1434.  
  1435. /*
  1436.  * Function:  UpdateAuthAwaitGroup()
  1437.  *
  1438.  * Arguments: None
  1439.  *
  1440.  * Return: None
  1441.  *
  1442.  * Description: This function is a ugly hack to get around the outliner issue. Outliner does not allow removal or hiding of 
  1443.  * outliner children as of now. Since we need this group for icq and not for aim, we need to manually remove it in Aim and add it in Icq
  1444.  * Author: Prassanna 4/06/2002
  1445.  */
  1446.  
  1447. function UpdateAuthAwaitGroup()
  1448. {
  1449.   if (isIcq() == true) {
  1450.     // Session is ICQ. Show Auth Await Group.
  1451.     document.getElementById('AuthAwait1').setAttribute("hidden", "false");
  1452.     document.getElementById('AuthAwait2').setAttribute("hidden", "false");
  1453.   }
  1454.   else
  1455.   {
  1456.     // Session is AIM. Hide Auth Await Group.
  1457.     document.getElementById('AuthAwait1').setAttribute("hidden", "true");
  1458.     document.getElementById('AuthAwait2').setAttribute("hidden", "true");
  1459.   }
  1460. }
  1461.  
  1462. function UpdateUserWarning(warning)
  1463. {
  1464.   var name = document.getElementById("warnname");
  1465.   var warn = document.getElementById("warnamount");
  1466.   if (warning != null)
  1467.   {
  1468.     if (warning > 0)
  1469.     {
  1470.       warn.setAttribute("value", "  " + warning + "%");
  1471.       name.setAttribute("class", "warned");
  1472.     }
  1473.     else
  1474.     {
  1475.       warn.setAttribute("value", "");
  1476.       name.setAttribute("class", "not-warned");
  1477.     }
  1478.     
  1479.     return
  1480.   }
  1481.   
  1482.   var curname=aimSessionCurrentScreenName();
  1483.  
  1484.   //document.getElementById("warnConnIcon").setAttribute("sessionType", aimPrefsManager().GetIntPref("aim.internal.intconnectiontype", null, true) );
  1485.  
  1486.   name.setAttribute("value",curname);
  1487.   
  1488.   var locateManager = aimLocateManager();
  1489.   var LocateCallbackObject = new Object();
  1490.   
  1491.   LocateCallbackObject.OnRequestUserInfoDefaultComplete = function(screenname, userobj)
  1492.   {
  1493.     var percent = userobj.GetWarningPercent();
  1494.     if (percent > 0 )
  1495.     {
  1496.       warn.setAttribute("value", " " + percent + "%");
  1497.       name.setAttribute("class", "warned");
  1498.     }
  1499.     else
  1500.     {
  1501.       warn.setAttribute("value", "");
  1502.       name.setAttribute("class", "not-warned");
  1503.     }
  1504.   }
  1505.  
  1506.   LocateCallbackObject.OnRequestUserInfoDefaultError = function(screenname, error)
  1507.   {
  1508.     //nothing
  1509.   }
  1510.  
  1511.   locateManager.RequestUserInfoDefault( LocateCallbackObject, curname); 
  1512. }
  1513.  
  1514.  
  1515. /*
  1516.  * Function: SetProcessTimer( interval )
  1517.  *
  1518.  * Arguments: 
  1519.  *      interval -- timeout in milliseconds 
  1520.  *
  1521.  * Return: None
  1522.  *
  1523.  * Description: This function sets the global (to App.js) timer 
  1524.  * processInviteTimer to fire after the specified interval
  1525.  *
  1526.  * Author: Syd 4/20/2001
  1527.  */
  1528.  
  1529. function SetProcessTimer( interval )
  1530. {
  1531.   processInviteTimer = setTimeout('ProcessInviteList()',interval);
  1532. }
  1533.  
  1534. /*
  1535.  * Function: ClearProcessTimer()
  1536.  *
  1537.  * Arguments: None
  1538.  *
  1539.  * Return: None
  1540.  *
  1541.  * Description: if the global processInviteTimer != -1, then
  1542.  * clear the timer, otherwise return. This function should 
  1543.  * be called by the onunload handler or at anytime the state
  1544.  * goes from online to offline
  1545.  *
  1546.  * Author: Syd 4/20/2001
  1547.  */
  1548.  
  1549. function ClearProcessTimer()
  1550. {
  1551.         if ( processInviteTimer != -1 ) {
  1552.                 window.clearTimeout( processInviteTimer );
  1553.                 processInviteTimer = -1;
  1554.         }
  1555. }
  1556.  
  1557.  
  1558.  
  1559. /*
  1560.  * Function: aimToday ()
  1561.  *
  1562.  * Arguments: None
  1563.  *
  1564.  * Return: None
  1565.  *
  1566.  * Description: This function launches the aimToday window.
  1567.  *
  1568.  */
  1569.  
  1570. function aimToday()
  1571. {
  1572.   var todayhide = aimPrefsManager().GetBoolPref("aim.internal.hidetoday", null, false);
  1573.   if (!todayhide)
  1574.   {
  1575.     var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
  1576.     var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
  1577.     var topWindow = windowManagerInterface.getMostRecentWindow( "mini:browser" );
  1578.     if ( topWindow )
  1579.     {
  1580.       topWindow.focus();
  1581.     }
  1582.     else
  1583.     {
  1584.       
  1585.         // MERC: SL
  1586.         var aimtodayurl = aimRegionString("aim.aimtoday");
  1587.         window.parent.loadURI(aimtodayurl, null, null); 
  1588.  
  1589.       // window.open("chrome://aim/content/mini.xul", "_blank", "chrome,extrachrome,menubar,resizable=no,scrollbars=no,status,toolbar");
  1590.     }
  1591.   }
  1592. }
  1593.  
  1594. function setFocusIfSignOnDisabled(event){
  1595.   if ((event.keyCode == 9) && (document.getElementById('spsignonSignOn2').getAttribute('disabled') == 'true')) {
  1596.     document.getElementById("spsignonHelp2").blur();
  1597.     setFocusPassLink(event)
  1598.   };
  1599. }
  1600.  
  1601.  
  1602. /*
  1603.  * Function: UpdateSessionImages(sessionType)
  1604.  *
  1605.  * Arguments: 
  1606.  *      sessionType -- "0" is Aim, "1" is TIH and "2" is Icq. Value passed from the Service selection 
  1607.  *                      pop-up menu.
  1608.  *
  1609.  * Return: None
  1610.  *
  1611.  * Description: This function sets the users choice of sessionType in the global pref. It also notifies all the observers
  1612.  * who are watching for the session-Mode changed message about the user's choice of service.
  1613.  *
  1614.  * Author: Prassanna 4/02/2002
  1615.  */
  1616.  
  1617. function UpdateSessionImages(sessionType)
  1618. {
  1619.   var session="";
  1620.   var connectionNameNode = document.getElementById('sessionTypeListmenu').selectedItem;
  1621.   var connectionName = connectionNameNode.getAttribute("label");
  1622.   aimPrefsManager().SetCharPref("aim.session.userconnectionname", connectionName, null, true);
  1623.   var latestScreenNameOfType = aimPrefsManager().GetCharPref("aim.session.screenname", null, true);
  1624.   aimSession().SetAppIcon();
  1625.   switch (sessionType) {
  1626.         case "2": session="Icq";
  1627.                   latestScreenNameOfType = aimPrefsManager().GetCharPref("aim.session.latesticqscreenname",null, true);
  1628. //                  changeTitle("Contact List");
  1629.                   break;
  1630.         case "0": session="Aim";
  1631.                   latestScreenNameOfType = aimPrefsManager().GetCharPref("aim.session.latestaimscreenname",null, true);
  1632. //                  changeTitle("Buddy List");
  1633.                   break;   
  1634.   }
  1635.  
  1636.   /** start update sign on fields due to  sessionChange **/
  1637.   aimPrefsManager().SetCharPref("aim.session.screenname", latestScreenNameOfType, null, true);
  1638.   InitFieldsFromPrefs( true, latestScreenNameOfType)
  1639.   /** end update **/
  1640.   var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  1641.   observerService.notifyObservers(null, "sessionMode-changed", session);
  1642.   buildLoginMenu();
  1643. }
  1644.  
  1645.  
  1646.  
  1647. /*
  1648.  * Function: UpdateCurrentWindow(sessionName)
  1649.  *
  1650.  * Arguments: 
  1651.  *      sessionName -- "Aim" or "Icq". passed when the current pop label is set
  1652.  *
  1653.  * Return: None
  1654.  *
  1655.  * Description: This function is called on load of sidebar buddy list. It basically sets 
  1656.  * sessionMode attribute on the broadcaster element when the apropriate seesin label is being set. 
  1657.  * This is done so that the current window  and the elements reflect the current sessionName.
  1658.  *
  1659.  * Author: Prassanna 4/02/2002
  1660.  */
  1661.  
  1662. function UpdateCurrentWindow(sessionName)
  1663. {
  1664.   var session;
  1665.   var elems = document.getElementById("sessionWatcher");
  1666.   switch (sessionName) {
  1667.         case "ICQ": session="Icq";
  1668.                     elems.setAttribute("sessionMode", "Icq"); 
  1669.                     break;
  1670.         case "AIM": session="Aim";
  1671.                     elems.setAttribute("sessionMode", "Aim"); 
  1672.                     break;   
  1673.   }
  1674.   var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  1675.   observerService.notifyObservers(null, "sessionMode-changed", session);
  1676. }
  1677.  
  1678.  
  1679.  
  1680. /*
  1681.  * Function: addSidebarSessionListener
  1682.  *
  1683.  * Arguments: None
  1684.  *
  1685.  * Return: None
  1686.  *
  1687.  * Description: This function is called on the load of sidebar buddylist panel. This adds a sessionSidebarObserver 
  1688.  * which waits for the sessionMode-changed message.
  1689.  *
  1690.  * Author: Prassanna 4/02/2002
  1691.  */
  1692.  
  1693. function addSidebarSessionListener() {
  1694.   var observerService = Components.classes["@mozilla.org/observer-service;1"].getService();
  1695.   observerService = observerService.QueryInterface(Components.interfaces.nsIObserverService);
  1696.   if (observerService) {
  1697.     observerService.addObserver(sessionSidebarObserver, "sessionMode-changed", false);
  1698.   } else {
  1699.     dump("failed to get observer service\n");
  1700.   }
  1701. }
  1702.  
  1703. /*
  1704.  * Function: removeSidebarSessionListener
  1705.  *
  1706.  * Arguments: None
  1707.  *
  1708.  * Return: None
  1709.  *
  1710.  * Description: This function is called on the Unload of sidebar buddylist panel. This removes the existing sessionSidebarObserver 
  1711.  * on the current sidebarpanel.
  1712.  *
  1713.  * Author: Prassanna 4/02/2002
  1714.  */
  1715.  
  1716. function removeSidebarSessionListener() {
  1717.   var observerService = Components.classes["@mozilla.org/observer-service;1"].getService();
  1718.   observerService = observerService.QueryInterface(Components.interfaces.nsIObserverService);
  1719.   if (observerService)
  1720.   {
  1721.   observerService.removeObserver(sessionSidebarObserver, "sessionMode-changed");
  1722.   }
  1723. }
  1724.  
  1725. /*
  1726.  * Function: UpdateSidebarLabels(sessionName)
  1727.  *
  1728.  * Arguments: sessionName - Passed from the listener. Aim/Icq
  1729.  *
  1730.  * Return: None
  1731.  *
  1732.  * Description: This function is called when the notifier receives sessionMode changed notification. It bruteforces all
  1733.  * the UI widgets to have the appropriate display labels and tooltips based on sessionName.
  1734.  *
  1735.  * Author: Prassanna 4/02/2002
  1736.  */
  1737.  
  1738.  
  1739. function UpdateSidebarLabels(sessionName)
  1740. {
  1741.   switch (sessionName) {
  1742.         case "Icq": var icqval=  document.getElementById('sessionTypeIcq').getAttribute("label");
  1743.                     document.getElementById('sessionTypeListmenu').setAttribute("label",icqval);
  1744.                     document.getElementById('sessionTypeListmenu').setAttribute("value","2");
  1745.                     icqval=document.getElementById('btnbuddyorgsendim').getAttribute("icqtooltip");
  1746.                     document.getElementById('btnbuddyorgsendim').setAttribute("tooltiptext", icqval);
  1747.                     //icqval=document.getElementById('tabOnline').getAttribute("icqlabel");
  1748.                     //document.getElementById('tabOnline').setAttribute("label", icqval);
  1749.                     //icqval=document.getElementById('tabSetup').getAttribute("icqlabel");
  1750.                     //document.getElementById('tabSetup').setAttribute("label", icqval);
  1751.                     icqval=document.getElementById('btnbuddyorgsignoff').getAttribute("icqlabel");
  1752.                     document.getElementById('btnbuddyorgsignoff').setAttribute("label", icqval);
  1753.                     icqval=document.getElementById('btnbuddyorgsignoff').getAttribute("icqtooltip");
  1754.                     document.getElementById('btnbuddyorgsignoff').setAttribute("tooltiptext", icqval);
  1755.                     icqval=document.getElementById('btnSignOnCancel').getAttribute("icqtooltip");
  1756.                     document.getElementById('btnSignOnCancel').setAttribute("tooltiptext", icqval); 
  1757.                     icqval=document.getElementById('snid').getAttribute("icqlabel");
  1758.                     document.getElementById('snid').setAttribute("value", icqval);   
  1759.                     icqval=document.getElementById('chkAutoLogin').getAttribute("icqlabel");
  1760.                     document.getElementById('chkAutoLogin').setAttribute("label", icqval);   
  1761.                     icqval=document.getElementById('spsignonHelp2').getAttribute("icqtooltip");
  1762.                     document.getElementById('spsignonHelp2').setAttribute("tooltiptext", icqval);
  1763.                     icqval=document.getElementById('spsignonSignOn2').getAttribute("icqlabel");
  1764.                     document.getElementById('spsignonSignOn2').setAttribute("label", icqval);   
  1765.                     icqval=document.getElementById('spsignonSignOn2').getAttribute("icqtooltip");
  1766.                     document.getElementById('spsignonSignOn2').setAttribute("tooltiptext", icqval);
  1767.                     icqval=document.getElementById('spregisterpasslink').getAttribute("icqlabel");
  1768.                     document.getElementById('spregisterpasslink').setAttribute("value", icqval);   
  1769.                     icqval=document.getElementById('spregisterpasslink').getAttribute("icqtooltip");
  1770.                     document.getElementById('spregisterpasslink').setAttribute("tooltiptext", icqval);
  1771.                     icqval=document.getElementById('btnsetuporgbuddy').getAttribute("icqtooltip");
  1772.                     document.getElementById('btnsetuporgbuddy').setAttribute("tooltiptext", icqval);
  1773.                     icqval=document.getElementById('btnsetuporgdelete').getAttribute("icqtooltip");
  1774.                     document.getElementById('btnsetuporgdelete').setAttribute("tooltiptext", icqval);
  1775.                     icqval=document.getElementById('btnImBack').getAttribute("icqlabel");
  1776.                     document.getElementById('btnImBack').setAttribute("label", icqval);
  1777.                     var sidebarimpanel = top.document.getElementById('urn:sidebar:panel:im-panel');
  1778.                     if (sidebarimpanel)
  1779.                       sidebarimpanel.setAttribute("label", aimString("icq.sidebarTitle"));
  1780.  
  1781.                     document.getElementById('sidebarnewaway').setAttribute("hidden", "true");
  1782.                     document.getElementById('newawayseparator').setAttribute("hidden", "true");
  1783.                     break;
  1784.         case "Aim": var aimval=  document.getElementById('sessionTypeAim').getAttribute("label");
  1785.                     document.getElementById('sessionTypeListmenu').setAttribute("label",aimval);
  1786.                     document.getElementById('sessionTypeListmenu').setAttribute("value","0");
  1787.                     aimval=document.getElementById('btnbuddyorgsendim').getAttribute("imtooltip");
  1788.                     document.getElementById('btnbuddyorgsendim').setAttribute("tooltiptext", aimval);
  1789.                     //aimval=document.getElementById('tabOnline').getAttribute("imlabel");
  1790.                     //document.getElementById('tabOnline').setAttribute("label", aimval);
  1791.                     //aimval=document.getElementById('tabSetup').getAttribute("imlabel");
  1792.                     //document.getElementById('tabSetup').setAttribute("label", aimval);
  1793.                     aimval=document.getElementById('btnbuddyorgsignoff').getAttribute("imlabel");
  1794.                     document.getElementById('btnbuddyorgsignoff').setAttribute("label", aimval);
  1795.                     aimval=document.getElementById('btnbuddyorgsignoff').getAttribute("imtooltip");
  1796.                     document.getElementById('btnbuddyorgsignoff').setAttribute("tooltiptext", aimval);
  1797.                     aimval=document.getElementById('btnSignOnCancel').getAttribute("imtooltip");
  1798.                     document.getElementById('btnSignOnCancel').setAttribute("tooltiptext", aimval); 
  1799.                     aimval=document.getElementById('snid').getAttribute("imlabel");
  1800.                     document.getElementById('snid').setAttribute("value", aimval);   
  1801.                     aimval=document.getElementById('chkAutoLogin').getAttribute("imlabel");
  1802.                     document.getElementById('chkAutoLogin').setAttribute("label", aimval);   
  1803.                     aimval=document.getElementById('spsignonHelp2').getAttribute("imtooltip");
  1804.                     document.getElementById('spsignonHelp2').setAttribute("tooltiptext", aimval);
  1805.                     aimval=document.getElementById('spsignonSignOn2').getAttribute("imlabel");
  1806.                     document.getElementById('spsignonSignOn2').setAttribute("label", aimval);   
  1807.                     aimval=document.getElementById('spsignonSignOn2').getAttribute("imtooltip");
  1808.                     document.getElementById('spsignonSignOn2').setAttribute("tooltiptext", aimval);
  1809.                     aimval=document.getElementById('spregisterpasslink').getAttribute("imlabel");
  1810.                     document.getElementById('spregisterpasslink').setAttribute("value", aimval);   
  1811.                     aimval=document.getElementById('spregisterpasslink').getAttribute("imtooltip");
  1812.                     document.getElementById('spregisterpasslink').setAttribute("tooltiptext", aimval);
  1813.                     aimval=document.getElementById('btnsetuporgbuddy').getAttribute("imtooltip");
  1814.                     document.getElementById('btnsetuporgbuddy').setAttribute("tooltiptext", aimval);
  1815.                     aimval=document.getElementById('btnsetuporgdelete').getAttribute("imtooltip");
  1816.                     document.getElementById('btnsetuporgdelete').setAttribute("tooltiptext", aimval);
  1817.                     aimval=document.getElementById('btnImBack').getAttribute("imlabel");
  1818.                     document.getElementById('btnImBack').setAttribute("label", aimval);
  1819.                     var sidebarimpanel = top.document.getElementById('urn:sidebar:panel:im-panel');
  1820.                     if (sidebarimpanel)
  1821.                       sidebarimpanel.setAttribute("label", aimString("importexport.budlist"));
  1822.  
  1823.                     document.getElementById('sidebarnewaway').removeAttribute("hidden");
  1824.                     document.getElementById('newawayseparator').removeAttribute("hidden");
  1825.                     break;   
  1826.   }
  1827.   
  1828. }
  1829.  
  1830.  
  1831. /*
  1832.  * Function: observe
  1833.  *
  1834.  * Arguments: message - "sessionMode-changed"
  1835.  *              data - "Aim/Icq"
  1836.  *              passed by the notifier 
  1837.  *
  1838.  * Return: None
  1839.  *
  1840.  * Description: This function updates the sessionWatcher broadcaster with the passes sessionMode. It forces the css
  1841.  * to apply the image rules based on sessionMode attribute. It also  calls the UpsideSidebarLabels with the sessionMode
  1842.  * so that all the labels and tooltips are updated based on the sessionMode.
  1843.  *
  1844.  * Author: Prassanna 4/02/2002
  1845.  */
  1846.  
  1847. var sessionSidebarObserver = {
  1848.   observe: function(subject, message, data) {
  1849.   if (message == 'sessionMode-changed')  {
  1850.      // Update sessionMode attribute which updates all images thru css
  1851.      document.getElementById("sessionWatcher").setAttribute("sessionMode", data);
  1852.     // Update all strings and labels to workaround un-dynamic dtd:-(
  1853.      UpdateSidebarLabels(data);
  1854.      }
  1855.   }
  1856. }
  1857.  
  1858.  
  1859. /*
  1860.  * Function: getDs()
  1861.  *
  1862.  * Arguments: None
  1863.  *
  1864.  * Return: sidebar panel datasource
  1865.  *
  1866.  * Description: This function is called by the changeTitle function to obtain the sidebar datasource.
  1867.  *
  1868.  * Author: Prassanna 4/02/2002
  1869.  */
  1870.  
  1871. function getDs()
  1872. {
  1873.   var PANELS_RDF_FILE = "UPnls";
  1874.   try 
  1875.   {
  1876.     var locator_service = Components.classes["@mozilla.org/file/directory_service;1"].getService();
  1877.     if (locator_service)
  1878.       locator_service = locator_service.QueryInterface(Components.interfaces.nsIProperties);
  1879.       var sidebar_file = locator_service.get(PANELS_RDF_FILE, Components.interfaces.nsIFile);
  1880.     if (!sidebar_file.exists()) {
  1881.       //Sidebar panels file does not exist?
  1882.       return;
  1883.     }
  1884.     return aimFileProtocolHandler().getURLSpecFromFile(sidebar_file);
  1885.   } catch (ex) {
  1886.      throw(ex);
  1887.   }
  1888. }
  1889.  
  1890. /*
  1891.  * Function:  changeTitle(title)
  1892.  *
  1893.  * Arguments: title - the title for the instant messenger sidebarpanel  "BuddyList"/"ContactList"
  1894.  *
  1895.  * Return: None
  1896.  *
  1897.  * Description: This function is during UpdateSidebarLabels upon notification of session Change. This attempts to
  1898.  * change the title of the instant messenger sidebar panel  basedon user's service choice Aim/Icq
  1899.  *
  1900.  * Author: Prassanna 4/02/2002
  1901.  */
  1902.  
  1903.  
  1904. function changeTitle(title)
  1905. {
  1906.  
  1907.   var RDF = aimRDF();
  1908.   const NC = "http://home.netscape.com/NC-rdf#";
  1909.   var panels = window.parent.document.getElementById("sidebar-panels");
  1910.   var datasource = RDF.GetDataSource(getDs());
  1911.   //var datasource = panels.database;
  1912.  
  1913.   var persistNode = datasource.GetTarget(RDF.GetResource("urn:sidebar:panel:im-panel"),  RDF.GetResource(NC + "title"),true);
  1914.   if (persistNode)
  1915.   {
  1916.     datasource.Change(RDF.GetResource("urn:sidebar:panel:im-panel"),
  1917.                                     RDF.GetResource(NC + "title"), 
  1918.                                     persistNode,
  1919.                                     RDF.GetLiteral(title));
  1920.     
  1921. /*
  1922.     panels.setAttribute('ref', "urn:sidebar:current-panel-list");
  1923.     panels.setAttribute('last-selected-panel', "urn:sidebar:panel:im-panel");
  1924.     SidebarRebuild();
  1925.     for (var ii=2; ii < panels.childNodes.length; ii += 2) {
  1926.           var header = panels.childNodes.item(ii);
  1927.           var content = this.node.childNodes.item(ii+1);
  1928.           if (header.getAttribute('id') == "urn:sidebar:panel:im-panel") {
  1929.                header.setAttribute('selected', 'true');
  1930.                content.removeAttribute('hidden');
  1931.                content.removeAttribute('collapsed');
  1932.                header.reload();
  1933.          break;
  1934.         }
  1935.     }
  1936.    
  1937. // After setting the current panel disappears from view :-( Have to reload maunally. Commenting for now
  1938.    datasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush();
  1939.    datasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Refresh(true);
  1940.  
  1941. */
  1942.   }
  1943.  
  1944. }
  1945.  
  1946.  
  1947. /*
  1948.  * Function: addSidebarBuddyListObserver
  1949.  *
  1950.  * Arguments: None
  1951.  *
  1952.  * Return: None
  1953.  *
  1954.  * Description: This function is called on the load of sidebar buddylist panel. This adds a sidebarBuddyListObserver 
  1955.  * which get notified when the Buddy List is loaded.
  1956.  *
  1957.  * Author: Suresh
  1958.  */
  1959.  
  1960. function addSidebarBuddyListObserver() {
  1961.   var observerService = Components.classes["@mozilla.org/observer-service;1"].getService();
  1962.   observerService = observerService.QueryInterface(Components.interfaces.nsIObserverService);
  1963.   if (observerService)
  1964.     observerService.addObserver(sidebarBuddyListObserver, "buddyListLoaded", false);
  1965. }
  1966.  
  1967. /*
  1968.  * Function: removeSidebarBuddyListObserver
  1969.  *
  1970.  * Arguments: None
  1971.  *
  1972.  * Return: None
  1973.  *
  1974.  * Description: This function is called on the Unload of sidebar buddylist panel. This removes the existing buddy list observer 
  1975.  * on the current sidebarpanel.
  1976.  *
  1977.  * Author: Suresh
  1978. */
  1979.  
  1980. function removeSidebarBuddyListObserver() {
  1981.   var observerService = Components.classes["@mozilla.org/observer-service;1"].getService();
  1982.   observerService = observerService.QueryInterface(Components.interfaces.nsIObserverService);
  1983.   if (observerService)
  1984.     observerService.removeObserver(sidebarBuddyListObserver, "buddyListLoaded");
  1985. }
  1986.  
  1987. var sidebarBuddyListObserver = {
  1988.   observe: function(subject, message, data) {
  1989.     if (message == 'buddyListLoaded')  {
  1990.       SelectIndex(0);
  1991.       setThrobberState(false);
  1992.       if (!isIcq()) {
  1993.         openAIMToday();
  1994.         var emailArray = GetBuddiesEmailAddress();
  1995.         CreateAimMailBridge(emailArray);
  1996.       }
  1997.     }
  1998.   }
  1999. }
  2000.  
  2001. function openAIMToday()
  2002. {
  2003.   var aimTodaypref = aimPrefsManager().GetBoolPref("aim.general.today", null, false);
  2004.   if (aimTodaypref) {
  2005.     var navigatorWindow;
  2006.     var possibleNavigator = top.document.getElementById("main-window");
  2007.     if (possibleNavigator && possibleNavigator.getAttribute("windowtype") == "navigator:browser")
  2008.       navigatorWindow = top;
  2009.  
  2010.     const WMEDIATOR_CONTRACTID     = "@mozilla.org/appshell/window-mediator;1";
  2011.     const nsIWindowMediator        = Components.interfaces.nsIWindowMediator;
  2012.     // if not, get the most recently used browser window
  2013.     if (!navigatorWindow) {
  2014.       var wm = Components.classes[WMEDIATOR_CONTRACTID].getService(nsIWindowMediator);
  2015.       navigatorWindow = wm.getMostRecentWindow("navigator:browser");
  2016.     }
  2017.  
  2018.     // if no browser window available open the mini browser
  2019.     if (!navigatorWindow)
  2020.       aimToday();
  2021.  
  2022.   }  
  2023.  
  2024. }
  2025.  
  2026.  
  2027. function setThrobberState(state)
  2028. {
  2029.   if ((IsApp) && (!IsSidebar)) {
  2030.     if (state)
  2031.       top.document.getElementById("navigator-throbber").setAttribute("busy", "true");
  2032.     else
  2033.       top.document.getElementById("navigator-throbber").setAttribute("busy", "false");
  2034.   }
  2035. }
  2036.  
  2037. //var gEmailArray = new Array();
  2038. var gEmailArray;
  2039.  
  2040. function GetBuddiesEmailAddress()
  2041. {
  2042.   if (!gEmailArray)
  2043.   {
  2044.     gEmailArray = new Array();
  2045.     var aimbuddy = aimBuddyManager();
  2046.     var RDF = aimRDF();
  2047.     var aim = aimRDFDataSource();
  2048.     var groups = aimbuddy.GetIMBuddyGroups();
  2049.     while (groups.hasMoreElements())
  2050.     {
  2051.       var element = groups.getNext();
  2052.       var resource = element.QueryInterface(Components.interfaces.nsIRDFResource);
  2053.       var agroup = aim.GetTarget(resource, RDF.GetResource("http://home.netscape.com/NC-rdf#Name"), true);
  2054.           if (agroup) {
  2055.               agroup = agroup.QueryInterface(Components.interfaces.nsIRDFLiteral);
  2056.               agroup = agroup.Value;
  2057.  
  2058.         var buddies = aimbuddy.GetBuddies(agroup);
  2059.         while(buddies.hasMoreElements())
  2060.         {
  2061.           var buddyelement = buddies.getNext();
  2062.           var buddyresource = buddyelement.QueryInterface(Components.interfaces.nsIRDFResource);
  2063.           var abuddy = aim.GetTarget(buddyresource, RDF.GetResource("http://home.netscape.com/NC-rdf#ScreenName"), true);
  2064.           if (abuddy)
  2065.           {
  2066.             abuddy = abuddy.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  2067.             var emailid = aimFeedbagManager().GetEmailId(abuddy);
  2068.             if (emailid) {
  2069.               AddtoEmailArray(abuddy, emailid);
  2070.             }
  2071.           }
  2072.         }
  2073.       }
  2074.     }
  2075.   }
  2076.   return gEmailArray;
  2077.  
  2078. }
  2079.  
  2080.  
  2081. function SNEmail()
  2082. {
  2083.   var EmailID = null;
  2084.     var ScreenName = null;
  2085. }
  2086.  
  2087. function AddtoEmailArray(screenName, emailID)
  2088. {
  2089.   var l = gEmailArray.length;
  2090.   if (!CheckForDuplicateScreenNameInArray(screenName))
  2091.   {
  2092.     gEmailArray[l] = new SNEmail;
  2093.     gEmailArray[l].ScreenName = screenName;
  2094.     gEmailArray[l].EmailID = emailID;
  2095.   }
  2096. }
  2097.  
  2098. /*Checks for any duplicatation in the ScreenName property in an array */
  2099. function CheckForDuplicateScreenNameInArray(element)
  2100. {
  2101.   for (var i=0; i<gEmailArray.length; i++) {
  2102.     if (gEmailArray[i].ScreenName == element)
  2103.       return true;
  2104.   }
  2105.   return false;
  2106. }
  2107.  
  2108. function SwitchView(resource)
  2109. {
  2110.   if (!resource)
  2111.     return;
  2112.   var aimsession = aimSession();
  2113.   var aimPrefs = aimPrefsManager();
  2114.   if (resource == "ScreenNameWithStatus") {
  2115.     aimsession.SetSessionBuddyListView(Components.interfaces.nsAimBuddyListViews.ScreenName);
  2116.     aimPrefs.SetIntPref("aim.session.buddyview", 0, null, false);
  2117.   }
  2118.   else { 
  2119.     if (resource == "DisplayName") {
  2120.       aimsession.SetSessionBuddyListView(Components.interfaces.nsAimBuddyListViews.DisplayName);
  2121.       aimPrefs.SetIntPref("aim.session.buddyview", 1, null, false);
  2122.     }
  2123.     else {
  2124.       aimsession.SetSessionBuddyListView(Components.interfaces.nsAimBuddyListViews.EmailAddress);
  2125.       aimPrefs.SetIntPref("aim.session.buddyview", 2, null, false);
  2126.     }
  2127.   }
  2128.  
  2129.   var rdf = aimRDF();
  2130.   var res = rdf.GetResource("http://home.netscape.com/NC-rdf#" + resource);
  2131.   var aimbuddy = aimBuddyManager();
  2132.   aimbuddy.SwitchView(res);
  2133. }
  2134.  
  2135. function ComposeNewMessage()
  2136. {
  2137.   var email = null;
  2138.   var tree = getSelectedTreeName();
  2139.   var col = getSelectedTabName();
  2140.   if (!tree || !col) return;
  2141.   var rangeCount = tree.treeBoxObject.selection.getRangeCount();
  2142.   var view = tree.treeBoxObject.view;
  2143.   for(var i = 0; i < rangeCount; i++) {
  2144.     var startIndex = {};
  2145.     var endIndex = {};
  2146.     tree.treeBoxObject.selection.getRangeAt(i, startIndex, endIndex);
  2147.     for (var j = startIndex.value; j <= endIndex.value; j++) {
  2148.       var level = view.getLevel(j);
  2149.       // as of now, 8/2002, we are not worried about groups.
  2150.       if (level == 1) {
  2151.         var buddyResource = GetBuddyResource(tree, j);
  2152.         var buddyName = GetBuddyAttribute(tree, buddyResource, "ScreenName");
  2153.         var buddyEmail = aimFeedbagManager().GetEmailId(buddyName);
  2154.         // MERC: SL - sanity check on buddyEmail 
  2155.         if (buddyEmail == null) {
  2156.            buddyEmail = " ";
  2157.            }
  2158.         if (!validateEmailAddress(buddyEmail)) {
  2159.            buddyEmail=" ";           
  2160.         }
  2161.         if (buddyEmail && buddyEmail != "") {
  2162.           if (email)
  2163.             email = email + "," + buddyEmail;
  2164.           else
  2165.             email = buddyEmail;
  2166.         }
  2167.       }
  2168.     }
  2169.   }
  2170.   
  2171.   // openMailCompose(email);  // MERC: SL
  2172.  
  2173.   // MERC: SL - snippet stolen from browser.js
  2174.   // generate a mailto url based on the url and the url's title
  2175.   var mailtoUrl =  "mailto:" + buddyEmail;
  2176.   
  2177.   var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  2178.   var uri = ioService.newURI(mailtoUrl, null, null);
  2179.     
  2180.   var extProtocolSvc = Components.classes["@mozilla.org/uriloader/external-protocol-service;1"].getService(Components.interfaces.nsIExternalProtocolService);
  2181.   if (extProtocolSvc)
  2182.   extProtocolSvc.loadUrl(uri);
  2183.   // -- end SL
  2184. }
  2185.  
  2186. function cmdDispName()
  2187. {
  2188.   var ascreenName = getSelectedScreenName();
  2189.   if (!ascreenName) {
  2190.     aimErrorBox(aimString("msg.selBuddy"));
  2191.     return;
  2192.   }
  2193.   window.openDialog('chrome://aim/content/AimDisplayName.xul','_blank','chrome,titlebar,dialog=yes,centerscreen,modal=yes', ascreenName);
  2194. }
  2195.  
  2196. function cmdSendEmail()
  2197. {
  2198.   var screenname = getSelectedScreenName();
  2199.   var curEmail = aimFeedbagManager().GetEmailId(screenname);
  2200.   openMailCompose(curEmail);
  2201. }
  2202.  
  2203. function cmdCheckEmail()
  2204. {
  2205.   var screenname = getSelectedScreenName();
  2206.   var curEmail = aimFeedbagManager().GetEmailId(screenname);
  2207.   ViewUnread(curEmail);
  2208. }
  2209.  
  2210. function cmdUpdateEmail()
  2211. {
  2212.   var ascreenName = getSelectedScreenName();
  2213.   if (!ascreenName) {
  2214.     aimErrorBox(aimString("msg.selBuddy"));
  2215.     return;
  2216.   }
  2217.  
  2218.   window.openDialog('chrome://aim/content/AimStoreEmail.xul','_blank','chrome,titlebar,dialog=yes,centerscreen,modal=yes', ascreenName);
  2219. }
  2220.  
  2221. function cmdEditBuddyInfo()
  2222. {
  2223.   var aimScreenName = getSelectedScreenName();
  2224.   if (!aimScreenName) {
  2225.     aimErrorBox(aimString("msg.selBuddy"));
  2226.     return;
  2227.   }
  2228.  
  2229.   var primaryEmail = aimFeedbagManager().GetEmailId(aimScreenName);
  2230.   var displayName = aimFeedbagManager().GetDispName(aimScreenName);
  2231.  
  2232.   var nimabinfo = pIIMManager.QueryInterface(Components.interfaces.nsIAimABInfo);
  2233.  
  2234.   var card = nimabinfo.getPersonalAbCardFromAttribute("_AimScreenName", aimScreenName, false);
  2235.   if (card)
  2236.     goEditCardDialog("moz-abmdbdirectory://abook.mab", card, UpdateCardView);
  2237.   else
  2238.     //NEW card
  2239.     window.openDialog("chrome://messenger/content/addressbook/abNewCardDialog.xul",
  2240.                      "",
  2241.                      "chrome,titlebar,resizable=no", 
  2242.                      {aimScreenName:aimScreenName });
  2243. }
  2244.  
  2245. function UpdateCardView()
  2246. {
  2247.   //Nothing for now.
  2248. }
  2249.