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

  1. var IMServiceClass = Components.classes['@netscape.com/aim/IMManager;1'];
  2. var pIIMManager  = IMServiceClass.getService(Components.interfaces.nsIIMManager)
  3. var lastRadio = null;
  4. var lastViewRadio = null;
  5. var allEnums = Components.interfaces.nsAimPrivacyModes;
  6. var stateEnums = Components.interfaces.nsAimOnlineStates;
  7. var globalPrivacyObject = pIIMManager.QueryInterface(Components.interfaces.nsIAimPrivacy);
  8. var MozPreferences = Components.classes['@mozilla.org/preferences-service;1'];
  9. MozPreferences = MozPreferences.getService();
  10. MozPreferences = MozPreferences.QueryInterface(Components.interfaces.nsIPrefBranch);
  11.  
  12. //connection panel
  13. var connLinks = new Object();
  14. connLinks.ConnectionName = "";
  15. connLinks.SessionType    = "";
  16. connLinks.Host           = "";
  17. connLinks.Port           = "";
  18. connLinks.ProxyHost      = "";
  19. connLinks.ProxyPort      = "";
  20. connLinks.ProxyUser      = "";
  21. connLinks.ProxyPassword  = "";
  22. connLinks.ProxyProtocol  = "";
  23. connLinks.IsProxy        = false;
  24. connLinks.ConnectionType = 0;
  25.  
  26. //end connection panel
  27.  
  28. function getString(name)
  29. {
  30.     if (aimStringBundle()){
  31.                 return aimStringBundle().GetStringFromName(name);
  32.         }
  33.         else{
  34.             return "";
  35.         }
  36. }
  37.  
  38.  
  39. var awayarg;
  40.  
  41. function EditAwayMessageOnLoad()
  42. {
  43.   var nameItem = document.getElementById("awayMessageName");
  44.   var textItem = document.getElementById("awayMessageText");
  45.  
  46.   nameItem.value = window.arguments[1];
  47.   textItem.value = window.arguments[2];
  48.   nameItem.focus();
  49.  
  50.   if (window.arguments[1] == "" && window.arguments[2] == "")
  51.     window.title= aimString("away.newmsg");
  52.   else
  53.     window.title= aimString("away.editmsg");
  54.  
  55.   // construct some of the static labels here; had problems placing
  56.   // '%' into an DTD ENTITY
  57.  
  58.   var labelItem = document.getElementById("editAwayMessageSpecial1");
  59.   var stringItem = getString( "editAwayMessageSpecial1" );
  60.   labelItem.setAttribute( "value", stringItem );
  61.   labelItem = document.getElementById("editAwayMessageSpecial2");
  62.   stringItem = getString( "editAwayMessageSpecial2" );
  63.   labelItem.setAttribute( "value", stringItem );
  64.   labelItem = document.getElementById("editAwayMessageSpecial3");
  65.   stringItem = getString( "editAwayMessageSpecial3" );
  66.   labelItem.setAttribute( "value", stringItem );
  67.   labelItem = document.getElementById("editAwayMessageSpecial4");
  68.   stringItem = getString( "editAwayMessageSpecial4" );
  69.   labelItem.setAttribute( "value", stringItem );
  70.  
  71.   // set the OK, Cancel callbacks
  72.   awayarg = window.arguments[3];
  73.   if (awayarg) {
  74.     document.getElementById("savelater").removeAttribute("hidden");
  75.     var imaway = aimString("msg.imaway");
  76.     document.getElementById("ok").setAttribute("label", imaway);
  77.   }
  78.   else {
  79.     document.getElementById("savelater").setAttribute("hidden", "true");
  80.   }
  81.   if (nameItem.value == "")
  82.     doSetOKCancel(AddAwayMessageOnOK, 0);
  83.   else
  84.     doSetOKCancel(EditAwayMessageOnOK, 0);
  85. }
  86.  
  87. function PrefIMAwayOnLoad()
  88. {
  89.   if((!IsSignedOn()) || (isIcq())) {
  90.     var offlinetxt = aimString("away.plsfirstsignon");
  91.     var element = document.getElementById("AwayOffline");
  92.     var textNode = document.createTextNode(offlinetxt);
  93.     element.appendChild(textNode);
  94.     document.getElementById("AwayGroup").setAttribute("hidden", "true");
  95.     document.getElementById("AwayMsgs").setAttribute("hidden", "true");
  96.     return;
  97.   }
  98.  
  99.   document.getElementById("AwayOffline").setAttribute("hidden", "true");
  100.   GetRDFService();
  101.   sidebar_file = GetRdfFileUrl("default-messages.rdf", "dm.rdf");  
  102.   datasource = RDF.GetDataSource(sidebar_file);
  103.   var tree = document.getElementById("AwayMessages");
  104.   tree.database.AddDataSource(datasource);
  105.   tree.setAttribute('ref', tree.getAttribute('ref'));
  106. }
  107.  
  108. /*
  109.  * Function:  PrefIMStyleOnload ()
  110.  * Arguments:
  111.  * Return:  None
  112.  * Description:  This function intializes the pref-IM_style.xul panel
  113.  *               In paticular the text and background color widgets
  114.  *               are filled in and the Special Text Styles are turned
  115.  *               on or off depending on the pref.
  116.  *
  117.  * Author: jelwell@netscape.com
  118. */
  119. function PrefIMStyleOnload()
  120. {
  121.   var textData = document.getElementById("textColorData");
  122.   var backgroundData = document.getElementById("backgroundColorData");
  123.   var customTextColor = textData.getAttribute("value");
  124.   var customBackgroundColor = backgroundData.getAttribute("value");
  125.  
  126.   if ( !customBackgroundColor || customBackgroundColor == "")
  127.     customBackgroundColor = "#FFFFFF";
  128.   if ( !customTextColor || customTextColor == "")
  129.     customTextColor = "#000000";
  130.   setColorWell("textCW", customTextColor);
  131.   setColorWell("backgroundCW", customBackgroundColor);
  132.  
  133.   textData.setAttribute("value", customTextColor); 
  134.   backgroundData.setAttribute("value", customBackgroundColor); 
  135.  
  136.   SwapSpecialStyles();
  137. }
  138.  
  139. /*
  140.  * Function:  SwapSpecialStyles()
  141.  * Arguments:
  142.  * Return:  None
  143.  * Description:  This function is used to toggle the special
  144.  *               text style checkboxes, on and off depending
  145.  *               on the pref and current setting.
  146.  *
  147.  * Author: jelwell@netscape.com
  148. */
  149. function SwapSpecialStyles()
  150. {
  151.   if (document.getElementById("textstyles").getAttribute("value") == "1")
  152.   {
  153.     document.getElementById("bold").removeAttribute("disabled");
  154.     document.getElementById("italics").removeAttribute("disabled");
  155.     document.getElementById("underline").removeAttribute("disabled");
  156.     
  157.   }
  158.   else
  159.   {
  160.     document.getElementById("bold").setAttribute("disabled", "true");
  161.     document.getElementById("italics").setAttribute("disabled", "true");
  162.     document.getElementById("underline").setAttribute("disabled", "true");
  163.     
  164.   }
  165. }
  166.  
  167. /*
  168.  * Function:  GetColorAndUpdate(ColorWellID)
  169.  * Arguments:
  170.  *    ColorWellID -- id of the color spacer inside the button.
  171.  * Return:  None
  172.  * Description:  This function is used to change the background
  173.  *               color of the spacer based on prefs.
  174.  *
  175.  * Author: jelwell@netscape.com
  176. */
  177. function GetColorAndUpdate(ColorWellID)
  178. {
  179.   var colorObj = new Object;
  180.   var colorWell = document.getElementById(ColorWellID);
  181.   var customTextColor = document.getElementById("textColorData").getAttribute("value"); 
  182.   var customBackgroundColor = document.getElementById("backgroundColorData").getAttribute("value"); 
  183.   if (!colorWell) return;
  184.  
  185.   // Don't allow a blank color, i.e., using the "default"
  186.   colorObj.NoDefault = true;
  187.  
  188.   switch( ColorWellID )
  189.   {
  190.     case "textCW":
  191.       colorObj.Type = "Text";
  192.       colorObj.TextColor = customTextColor;
  193.       break;
  194.     case "backgroundCW":
  195.       colorObj.Type = "Page";
  196.       colorObj.PageColor = customBackgroundColor;
  197.       break;
  198.   }
  199.  
  200.   window.openDialog("chrome://editor/content/EdColorPicker.xul", "_blank", "chrome,close,titlebar,modal", "", colorObj);
  201.  
  202.   // User canceled the dialog
  203.   if (colorObj.Cancel)
  204.     return;
  205.  
  206.   var color = "";
  207.   switch( ColorWellID )
  208.   {
  209.     case "textCW":
  210.       color = customTextColor = colorObj.TextColor;
  211.       document.getElementById("textColorData").setAttribute("value", color); 
  212.       break;
  213.     case "backgroundCW":
  214.       color = customBackgroundColor = colorObj.BackgroundColor;
  215.       document.getElementById("backgroundColorData").setAttribute("value", color);
  216.       break;
  217.   }
  218.   setColorWell(ColorWellID, color); 
  219. //  SetColorPreview(ColorWellID, color);
  220. }
  221.  
  222.  
  223. // XXXVISHy 
  224. // Add a user to the allow or deny list. top.addMode defines which list
  225.  
  226. function GetUserAdd()
  227. {
  228.         var fldUserName = top.document.getElementById("fldUserName");
  229.         var pIAimPrivacy = aimPrivacy();
  230.         var name = fldUserName.value;
  231.         if ( name && name != "" ) {
  232.            if ( top.addMode == "Allow" ) {
  233.               pIAimPrivacy.AllowListAdd( name );
  234.            }
  235.         else if ( top.addMode == "Deny" ) {
  236.             pIAimPrivacy.DenyListAdd( name );
  237.         }
  238.         //pIAimPrivacy.UpdateStorage();
  239.            top.opener.updateListBoxSelection(top.addMode);
  240.            top.window.close();
  241.         }
  242. }
  243.  
  244.  
  245.  
  246. function updateListBoxSelection(mode){
  247.    var targetListBox = document.getElementById(mode);
  248.    var targetListBoxSelectedCount = targetListBox.selectedCount
  249.    var targetListBoxRows = targetListBox.listBoxObject.getRowCount();
  250.    if(targetListBoxRows >0 && targetListBoxSelectedCount <1){
  251.       targetListBox.selectedIndex=0;
  252.    }
  253.  
  254. }
  255.  
  256. /* 
  257.  * Name: StandardURL
  258.  *
  259.  * Arguments: URI string, e.g., chrome://foo/bar
  260.  *
  261.  * Description: obtains an instance of nsIURL and sets the spec to the passed
  262.  * uri. Returns the nsIURL instance.
  263.  *
  264.  */
  265.  
  266. function StandardURL(s) {
  267.     var clazz = Components.classes["@mozilla.org/network/standard-url;1"];
  268.     var iface = Components.interfaces.nsIURL;
  269.     var obj = clazz.createInstance(iface);
  270.     obj.spec = s;
  271.     return obj;
  272.  
  273. /* 
  274.  * Name: Sound
  275.  *
  276.  * Arguments: none 
  277.  *
  278.  * Description: Creates and returns an instance of nsISound
  279.  *
  280.  */
  281.  
  282. function Sound() {
  283.     var clazz = Components.classes["@mozilla.org/sound;1"];
  284.     var iface = Components.interfaces.nsISound;
  285.     var obj = clazz.createInstance(iface);
  286.     return obj;
  287. }
  288.  
  289. /* 
  290.  * Name: PlaySound
  291.  *
  292.  * Arguments: chrome URI to a sound file
  293.  *
  294.  * Description: Called by onclick handler for speaker titled buttons in
  295.  * the sound preferences panel for IM.
  296.  *
  297.  */
  298.  
  299. function PlaySound( myURIPref )
  300. {
  301.     var sound = new Sound();
  302.     var myURI;
  303.  
  304.     try {
  305.         myURI = aimPrefsManager().GetCharPref( myURIPref , null, false );
  306.     }
  307.     catch(e) {
  308.         try {
  309.             myURI = aimPrefsManager().GetCharPref( myURIPref , null, true); // get the global one if the per screen name doesnt work
  310.         }
  311.         catch(e) {
  312.             return;
  313.         }         
  314.     }        
  315.  
  316.     var uri = new StandardURL(myURI);
  317.     if ( sound != undefined && sound != null && uri != undefined && uri != null ) {
  318.         try {
  319.             sound.play( uri );
  320.         }
  321.         catch( e ) {
  322.             // device may not support sound, so ignore
  323.         }
  324.     }    
  325. }
  326.  
  327. /* away messages */
  328.  
  329. var datasource = null;
  330. var RDF = null;
  331. var awayMessages = null;
  332.  
  333. function
  334. GetRDFService()
  335. {
  336.     if ( RDF == null ) {
  337.         RDF=aimRDF();
  338.     }
  339. }
  340.  
  341. function
  342. RemoveTarget( msgName )
  343. {
  344.     GetRDFService();
  345.  
  346.     var messages_file = GetRdfFileUrl("default-messages.rdf", "dm.rdf"); 
  347.     var datasource = RDF.GetDataSource(messages_file);
  348.  
  349.     var container = Components.classes["@mozilla.org/rdf/container;1"].createInstance();
  350.       container = container.QueryInterface(Components.interfaces.nsIRDFContainer);
  351.       container.Init(datasource, RDF.GetResource("NC:AIM/AwayMessageBag"));
  352.  
  353.     var elements = container.GetElements();
  354.     var target, node;
  355.     var nameResource = 
  356.                 RDF.GetResource("http://home.netscape.com/NC-rdf#MsgName");
  357.     while ( elements.hasMoreElements() ) {
  358.         node = elements.getNext();
  359.         if ( node ) 
  360.             target = datasource.GetTarget( node, nameResource, 
  361.                 true );
  362.         if ( target ) 
  363.             target = target.QueryInterface(Components.interfaces.nsIRDFLiteral);
  364.         if ( target && target.Value == msgName ) {
  365.             container.RemoveElement( node, true );
  366.             datasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush();
  367.         }
  368.     }
  369.     return null;
  370. }
  371.  
  372. function
  373. SetAwayMessageTarget( msgName, msgText )
  374. {
  375.     GetRDFService();
  376.  
  377.     var messages_file = GetRdfFileUrl("default-messages.rdf", "dm.rdf"); 
  378.     var datasource = RDF.GetDataSource(messages_file);
  379.  
  380.     var container = Components.classes["@mozilla.org/rdf/container;1"].createInstance();
  381.       container = container.QueryInterface(Components.interfaces.nsIRDFContainer);
  382.       container.Init(datasource, RDF.GetResource("NC:AIM/AwayMessageBag"));
  383.  
  384.     var elements = container.GetElements();
  385.     var nametarget, texttarget, node;
  386.     var nameResource = 
  387.                 RDF.GetResource("http://home.netscape.com/NC-rdf#MsgName");
  388.     var textResource = 
  389.                 RDF.GetResource("http://home.netscape.com/NC-rdf#MsgText");
  390.     while ( elements.hasMoreElements() ) {
  391.         node = elements.getNext();
  392.         if ( node ) 
  393.             nametarget = datasource.GetTarget( node, nameResource, 
  394.                 true );
  395.         if ( nametarget ) 
  396.             nametarget = nametarget.QueryInterface(Components.interfaces.nsIRDFLiteral);
  397.         if ( nametarget && nametarget.Value == msgName ) {
  398.             texttarget = datasource.GetTarget( node, textResource, 
  399.                 true );
  400.             if ( texttarget ) 
  401.                 texttarget = texttarget.QueryInterface(Components.interfaces.nsIRDFLiteral);
  402.             if ( texttarget ) {
  403.                 var newText = RDF.GetLiteral(msgText);
  404.                 datasource.Change( node, textResource,
  405.                     texttarget, newText);
  406.                 datasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush();
  407.             }
  408.             break;
  409.         }
  410.     }
  411. }
  412.  
  413. //XXXVISHY - two 
  414.  
  415. function modeToRadio(mode)
  416. {
  417.   switch(mode) {
  418.     case allEnums.AllowAll:
  419.       document.getElementById("allowradio").setAttribute("selected","true");
  420.       document.getElementById("denyradio").removeAttribute("selected");
  421.       document.getElementById("allowmenulist").selectedIndex = 0;
  422.       return document.getElementById("aim_privacy_contact_allowallusers"); 
  423.       break;
  424.     case allEnums.AllowBuddies:
  425.       document.getElementById("allowradio").setAttribute("selected","true");
  426.       document.getElementById("denyradio").removeAttribute("selected");
  427.       document.getElementById("allowmenulist").selectedIndex = 1;
  428.       return document.getElementById("aim_privacy_contact_allowbuddylistusers"); 
  429.       break;
  430.     case allEnums.AllowList:
  431.       document.getElementById("allowradio").setAttribute("selected","true");
  432.       document.getElementById("denyradio").removeAttribute("selected");
  433.       document.getElementById("allowmenulist").selectedIndex = 2;
  434.       return document.getElementById("aim_privacy_contact_allowonlylist"); 
  435.       break;
  436.     case allEnums.DenyAll:
  437.       document.getElementById("denyradio").setAttribute("selected","true");
  438.       document.getElementById("allowradio").removeAttribute("selected");
  439.       document.getElementById("denymenulist").selectedIndex = 0;
  440.       return document.getElementById("aim_privacy_contact_blockallusers"); 
  441.       break;
  442.     case allEnums.DenyList:
  443.       document.getElementById("denyradio").setAttribute("selected","true");
  444.       document.getElementById("allowradio").removeAttribute("selected");
  445.       document.getElementById("denymenulist").selectedIndex = 2;
  446.       return document.getElementById("aim_privacy_contact_blocklistusers"); 
  447.       break;
  448.     case allEnums.DenyAim:
  449.       document.getElementById("denyradio").setAttribute("selected","true");
  450.       document.getElementById("allowradio").removeAttribute("selected");
  451.       document.getElementById("denymenulist").selectedIndex = 1;
  452.       return document.getElementById("aim_privacy_contact_blockaimusers"); 
  453.       break;
  454.     default:
  455.       document.getElementById("allowradio").setAttribute("selected","true");
  456.       document.getElementById("denyradio").removeAttribute("selected");
  457.       document.getElementById("allowmenulist").selectedIndex = 0;
  458.       return document.getElementById("aim_privacy_contact_allowallusers"); 
  459.       break;
  460.   }
  461. }
  462.  
  463. function privacyModeRadio(mode)
  464. {
  465.   // this should not be needed, but believe me dont remove it 
  466.   // otherwise radio UI can show two things selected ;-)
  467.   lastRadio.checked = false;
  468.   lastRadio = modeToRadio(mode);
  469.   lastRadio.checked = true;
  470.   parent.lastPrivacyMode = mode;
  471. }
  472.  
  473. function privacyChatInvites(value)
  474. {
  475.   parent.lastChatInvites = value;
  476. }
  477.  
  478. function privacyIdle(value)
  479. {
  480.   parent.lastIdle = value;
  481. }
  482.  
  483. function privacyMobile(value)
  484. {
  485.   parent.lastMobile = value;
  486. }
  487.  
  488. function privacyTyping(value)
  489. {
  490.   parent.lastTyping = value;
  491. }
  492.  
  493. function viewToRadio(view)
  494. {
  495.   dump("in function viewToRadio\n" + view);
  496.  
  497.     switch(view) {
  498.     case '1':
  499.         return document.getElementById("nodisclosure"); 
  500.         break;
  501.     case '2':
  502.         return document.getElementById("limiteddisclosure"); 
  503.         break;
  504.     case '3':
  505.         return document.getElementById("fulldisclosure"); 
  506.         break;
  507.     default:
  508.         dump("Bad privacy view\n");
  509.         return document.getElementById("nodisclosure"); 
  510.         break;
  511.     }
  512. }
  513.  
  514. function privacyViewRadio(view)
  515. {
  516.   dump("privacyModeRadio\n");
  517.  
  518.   // this should not be needed, but believe me dont remove it 
  519.   // otherwise radio UI can show two things selected ;-)
  520.   //lastViewRadio.checked = false;
  521.   //lastViewRadio = viewToRadio(view);
  522.   dump ("lastViewRadio is " + lastViewRadio + "\n");
  523.   //lastViewRadio.checked = true;
  524.   parent.lastPrivacyView = view;
  525.  
  526.   dump ("lastPrivacyView is " + parent.lastPrivacyView + "\n");
  527. }
  528.  
  529. // onload handler for privacy panel. grab the privacy mode enums, and register
  530. // AssertChanges with prefwindow so we get called on OK presses.
  531.  
  532. AdminCallback = new Object();
  533. AdminCallback.OnRequestInfoComplete = function(type,info)
  534. {
  535.     dump("On RequestInfoComplete\n");
  536.  
  537.     switch (type) { 
  538.     case Components.interfaces.nsIAimAdminInfo.RegistrationStatusPreference:
  539.         dump("info is " + info + "\n");
  540.         parent.lastPrivacyView = info;
  541.  
  542.         dump("Got the aim privacy view\n");
  543.         lastViewRadio = viewToRadio(parent.lastPrivacyView);
  544.     
  545.         if ( lastViewRadio != undefined && lastViewRadio != null) {
  546.             var privacyViewElement = document.getElementById("privacyView");
  547.             privacyViewElement.selectedItem = lastViewRadio;
  548.         }
  549.         break;
  550.     default:
  551.         break;
  552.     }
  553. }
  554. AdminCallback.OnRequestInfoError = function(pErrMsg)
  555. {
  556.     dump("OnRequestInfoError\n");
  557. }
  558.  
  559. adminGetterCallback = new Object();
  560.  
  561. adminGetterCallback.ExecuteIfReady = function()
  562. {
  563.     dump("about to get the disclosure level\n");
  564.     aimAdminManager().RequestInfoRegistrationStatusPreference(AdminCallback);
  565. }
  566.  
  567. function DisablePrivacyUI()
  568. {
  569.   document.getElementById("contact").setAttribute("hidden", "true");
  570.   document.getElementById("whocancontact").setAttribute("hidden", "true");
  571.   document.getElementById("whocancontact1").setAttribute("hidden", "true");
  572. }
  573.  
  574.  
  575. function IsSignedOn()
  576. {
  577.     var state = aimSession().CurrentState;
  578. dump( "state is " + state + " \n" );
  579.  
  580.     if ( state == stateEnums.Online || state == stateEnums.OnlineAway )
  581.         return true;
  582.     return false;
  583. }
  584.  
  585. function PrefIMPrivacyOnLoad()
  586. {
  587.   var hideprivacy = false;
  588.   var offlinetxt;
  589.   if((!IsSignedOn()) || (isIcq())) {
  590.     offlinetxt = aimString("msg.offline");
  591.     hideprivacy = true;
  592.   }
  593.   else {
  594.     var feedbag = aimFeedbagManager();
  595.     var flag = feedbag.CheckFeedbag();
  596.     if (!flag) {
  597.       //feedbag is down, hide all the fields. you cannot do any thing in privacy pane without feedbag.
  598.       offlinetxt = aimString("msg.feedbagdown");
  599.       hideprivacy = true;
  600.     }
  601.   }
  602.  
  603.   if (hideprivacy) {
  604.     var element = document.getElementById("privacyOfflineIntro");
  605.     var textNode = document.createTextNode(offlinetxt);
  606.     element.appendChild(textNode);
  607.     DisablePrivacyUI();
  608.     return;
  609.   }
  610.  
  611.   document.getElementById("privacyOfflineIntro").setAttribute("hidden", "true");
  612.   parent.hPrefWindow.registerOKCallbackFunc( AssertPrivacyChanges );
  613.   var sessionType =aimPrefsManager().GetIntPref("aim.session.sessiontype", null, false);
  614.   if(sessionType == 0) {
  615.     var tree = document.getElementById("Allow");
  616.     tree.database.AddDataSource(aimRDF().GetDataSource("rdf:AIM"));
  617.     tree.setAttribute('ref', tree.getAttribute('ref'));
  618.     var tree = document.getElementById("Deny");
  619.     tree.database.AddDataSource(aimRDF().GetDataSource("rdf:AIM"));
  620.     tree.setAttribute('ref', tree.getAttribute('ref'));
  621.   }
  622.  
  623.   var priv = aimPrivacy();
  624.   // do it only the first time!
  625.   if (parent.lastPrivacyMode == undefined)
  626.     parent.lastPrivacyMode = priv.PrivacyMode;
  627.  
  628.   lastRadio = modeToRadio(parent.lastPrivacyMode);
  629.  
  630.   if ( parent.lastChatInvites != undefined && parent.lastChatInvites != null) {
  631.     var checkbox = document.getElementById("chatInvites");
  632.     if ( checkbox != undefined && checkbox != null)
  633.       checkbox.setAttribute("selected",parent.lastChatInvites);
  634.   }
  635.  
  636.  
  637.   var loggedin = true;
  638.  
  639.   if (loggedin && (parent.lastPrivacyView == undefined))
  640.     aimAdminManager().ExecuteIfReady(adminGetterCallback);
  641.   
  642.   var prefmask = feedbag.GetBuddyPrefs();
  643.   if (prefmask & Components.interfaces.nsAimBuddyPrefs.DiscloseIdleTime) {
  644.     document.getElementById("idle").checked = true;
  645.     parent.lastIdle = true;
  646.   }
  647.   else
  648.     parent.lastIdle = false;
  649.  
  650.   var mobilepresence = feedbag.GetBosPrefs();
  651.   if (mobilepresence & Components.interfaces.nsAimBosPrefs.HideWireless) {
  652.     document.getElementById("mobile").checked = true;
  653.     parent.lastMobile = true;
  654.   }
  655.   else
  656.     parent.lastMobile = false;
  657.  
  658.   if ( prefmask & Components.interfaces.nsAimBuddyPrefs.DiscloseTyping) {
  659.     document.getElementById("showtyping").checked = true;
  660.     parent.lastTyping = true;
  661.   }
  662.   else
  663.     parent.lastTyping = false;
  664.  
  665.   updateListBoxSelection("Allow");
  666.   updateListBoxSelection("Deny");
  667. }
  668.  
  669. function PrefIMPrivacyOnUnload() 
  670. {
  671.     // nothing for now
  672. }
  673.  
  674. // grab a screenname from the user.
  675.  
  676. function PostGetUserDlg( which )
  677.     openDialog("chrome://aim/content/pref-IM_getuser.xul", "", 
  678.         "modal=yes,chrome", which);
  679. }
  680.  
  681. // delete the screenname entered by the user from the allow or deny list.
  682. // "which" indicates which list to purge from
  683.  
  684. function DeleteFromList( which )
  685. {
  686.     var listbox = document.getElementById(which);
  687.     var pIAimPrivacy = aimPrivacy();
  688.     var selectedUser;
  689.     
  690.         
  691.     for (var i = 0; i <= listbox.selectedItems.length; i++) {
  692.       selectedUser = listbox.selectedItems[i].getAttribute("label");
  693.       if ( which == "Allow" ) {
  694.           pIAimPrivacy.AllowListRemove( selectedUser );
  695.           }
  696.       else if ( which == "Deny" ) {
  697.           pIAimPrivacy.DenyListRemove( selectedUser );
  698.           }
  699.       updateListBoxSelection(which);
  700.       break;
  701.     }
  702. }
  703.  
  704. // onload handler for the dialog used to get a screenname from the user
  705.  
  706. function GetUserOnLoad()
  707. {
  708.         doSetOKCancel(GetUserAdd, 0);
  709.     top.addMode = window.arguments[0];
  710.     document.getElementById("fldUserName").focus();
  711. }
  712.  
  713. // called when OK button is pressed in privacy mode preferences panel. Figure
  714. // out what changed, communicate this to AIM Glue backend
  715.  
  716. function AssertPrivacyChanges()
  717. {
  718.   // We cannot use global variables as this is called in the
  719.   // context of the Parent window much later!!
  720.   var IMServiceClass = Components.classes['@netscape.com/aim/IMManager;1'];
  721.   var pIIMManager  = IMServiceClass.getService(Components.interfaces.nsIIMManager)
  722.   var lastRadio = null;
  723.   var allEnums = Components.interfaces.nsAimPrivacyModes;
  724.   var pIAimPrivacy = pIIMManager.QueryInterface(Components.interfaces.nsIAimPrivacy)
  725.  
  726.   if ( pIAimPrivacy == undefined || pIAimPrivacy == null )
  727.     return;
  728.  
  729.   // This has been simplified and made correct
  730.   pIAimPrivacy.PrivacyMode = parent.lastPrivacyMode;
  731.  
  732.   var tvalues = false;
  733.   var pAimAdmin = pIIMManager.QueryInterface(Components.interfaces.nsIAimAdminManager);
  734.   if ( pAimAdmin == undefined || pAimAdmin == null )
  735.     return;
  736.  
  737.   adminSetterCallback = new Object();
  738.   adminSetterCallback.ExecuteIfReady = function()
  739.   {
  740.     // this kinda code is dangerous -- should not glom so many
  741.     // things that can fail into one statement XXX
  742.     Components.classes['@netscape.com/aim/IMManager;1'].getService(Components.interfaces.nsIIMManager).QueryInterface(Components.interfaces.nsIAimAdminManager).ChangeRegistrationStatusPreference(null,parent.lastPrivacyView);
  743.   }
  744.  
  745.   pAimAdmin.ExecuteIfReady(adminSetterCallback);
  746.   var pAimPrefs =  pIIMManager.QueryInterface(Components.interfaces.nsIPrefsManager);
  747.   if (parent.lastChatInvites != undefined)
  748.     pAimPrefs.SetBoolPref("aim.chat.unavailable", parent.lastChatInvites, null, false);
  749.  
  750.   var chatInvite_pref=false;
  751.   try {
  752.     chatInvite_pref= pAimPrefs.GetBoolPref("aim.chat.unavailable", null, false);
  753.   }
  754.   catch (ex) {
  755.     dump("chat announce pref could not be read\n");
  756.     chatInvite_pref = false;
  757.   }
  758.   pChatManager= pIIMManager.QueryInterface(Components.interfaces.nsIAimChatManager);
  759.   // Suresh: Setting it to complement coz the pref is aim.chat._un_available. Gee...This is confusing..heh.
  760.   pChatManager.SetAvailableForChat(!chatInvite_pref);
  761.  
  762.   var feedbag = aimFeedbagManager();
  763.   
  764.   try {
  765.     prefmask = feedbag.GetBuddyPrefs();
  766.     var typingmask = Components.interfaces.nsAimBuddyPrefs.DiscloseTyping;
  767.     var idlemask = Components.interfaces.nsAimBuddyPrefs.DiscloseIdleTime;
  768.     var typingset=prefmask & typingmask;
  769.     var idleset=prefmask & idlemask;
  770.     // User is setting it only now, the typing pref was not set before
  771.     if (parent.lastTyping  && !(typingset)) {
  772.       prefmask += typingmask;
  773.     }
  774.     // User is clearing it, even though the typing pref was set to begin with
  775.     else
  776.       if (!parent.lastTyping  && (typingset)) {
  777.         prefmask -= typingmask;
  778.       } 
  779.     // User is setting it only now, the idle pref was not set before
  780.     if (parent.lastIdle  && !(idleset)) {
  781.       prefmask += idlemask;
  782.     }
  783.     // User is clearing it, even though the idle pref was set to begin with
  784.     else
  785.       if (!parent.lastIdle  && (idleset)) {
  786.         prefmask -= idlemask;
  787.         aimSession().AimIdleStop(); 
  788.       } 
  789.     feedbag.SetBuddyPrefs(prefmask);
  790.   }
  791.  
  792.   catch (ex) {}
  793.  
  794.   //Mobile stuff
  795.   if (parent.lastMobile)
  796.     feedbag.SetBosPrefs(Components.interfaces.nsAimBosPrefs.HideWireless);
  797.   else
  798.     feedbag.SetBosPrefs(0);
  799.   
  800.     
  801.  
  802.   return;
  803.  
  804. }
  805.  
  806.  
  807. function
  808. FindAwayMessageTargetByName( msgName )
  809. {
  810.     GetRDFService();
  811.  
  812.     var messages_file = GetRdfFileUrl("default-messages.rdf", "dm.rdf");  
  813.     var datasource = RDF.GetDataSource(messages_file);
  814.  
  815.     var container = Components.classes["@mozilla.org/rdf/container;1"].createInstance();
  816.       container = container.QueryInterface(Components.interfaces.nsIRDFContainer);
  817.       container.Init(datasource, RDF.GetResource("NC:AIM/AwayMessageBag"));
  818.  
  819.     var elements = container.GetElements();
  820.     var target, node;
  821.     var nameResource = 
  822.                 RDF.GetResource("http://home.netscape.com/NC-rdf#MsgName");
  823.     while ( elements.hasMoreElements() ) {
  824.         node = elements.getNext();
  825.         if ( node ) 
  826.             target = datasource.GetTarget( node, nameResource, 
  827.                 true );
  828.         if ( target ) 
  829.             target = target.QueryInterface(Components.interfaces.nsIRDFLiteral);
  830.         if ( target && target.Value == msgName ) 
  831.             return target.Value;
  832.     }
  833.     return null;
  834. }
  835.  
  836. function
  837. EditAwayMessageOnOK()
  838. {
  839.     var nameItem = document.getElementById("awayMessageName");
  840.     var textItem = document.getElementById("awayMessageText");
  841.     var nameValue = null;
  842.     var textValue = null;
  843.  
  844.     if ( !nameItem || nameItem == undefined ) 
  845.         return;
  846.     if ( !textItem || textItem == undefined ) 
  847.         return;
  848.     nameValue = nameItem.value;
  849.     textValue = textItem.value;
  850.     if ( nameValue == "" ) {
  851.         alert(getString("away.EnterLabel"));
  852.         return;
  853.     }
  854.     
  855.     if ( textValue == "" ) {
  856.         alert(getString("away.EnterMessage"));
  857.         return;
  858.     }
  859.  
  860.     if ( textValue.length > 900 ) {
  861.         alert(getString("away.TooLongMessage"));
  862.         return;
  863.     }
  864.  
  865.     var target = FindAwayMessageTargetByName( nameValue );
  866.     if ( target == null ) {
  867.         retval = confirm(getString("away.DoesNotExist"));
  868.         if ( retval == true ) 
  869.             AssertAwayMessage( nameValue, textValue ); 
  870.         else
  871.             return;
  872.     } else 
  873.         SetAwayMessageTarget( nameValue, textValue )
  874.     top.window.close();
  875. }
  876.  
  877. function AddAwayMessageOnOK()
  878. {
  879.   var nameItem = document.getElementById("awayMessageName");
  880.   var textItem = document.getElementById("awayMessageText");
  881.   var nameValue = null;
  882.   var textValue = null;
  883.  
  884.   if ( !nameItem || nameItem == undefined ) 
  885.     return;
  886.   if ( !textItem || textItem == undefined ) 
  887.     return;
  888.   nameValue = nameItem.value;
  889.   textValue = textItem.value;
  890.   if ( nameValue == "" ) {
  891.     alert(getString("away.EnterLabel"));
  892.     return;
  893.   }
  894.   if ( textValue == "" ) {
  895.     alert(getString("away.EnterMessage"));
  896.     return;
  897.   }
  898.  
  899.   if ( textValue.length > 900 ) {
  900.     alert(getString("away.TooLongMessage"));
  901.     return;
  902.   }
  903.  
  904.   if (awayarg) {
  905.     var locateManager = aimLocateManager();
  906.     locateManager.SetUserInfoAwayMessage(textValue);
  907.     if (!document.getElementById('savelater').checked) {
  908.       top.window.close();
  909.       return;
  910.     }
  911.   }
  912.  
  913.   if ( FindAwayMessageTargetByName( nameValue ) != null ) {
  914.     // ask them if they would like to overwrite (i.e., 
  915.     // turn this into an edit).
  916.     var response = confirm(getString("away.AlreadyExists"));
  917.     if (response) {
  918.       EditAwayMessageOnOK();
  919.       return;
  920.     } 
  921.     else {
  922.       alert(getString("away.EnterLabel"));
  923.       return;
  924.     }
  925.   }
  926.  
  927.   AssertAwayMessage( nameValue, textValue ); 
  928.   top.window.close();
  929. }
  930.  
  931. function
  932. AssertAwayMessage( nameValue, textValue )
  933. {
  934.     GetRDFService();
  935.  
  936.     var newmsg = RDF.GetAnonymousResource();
  937.     var messages_file = GetRdfFileUrl("default-messages.rdf", "dm.rdf");  
  938.  
  939.     var datasource = 
  940.         RDF.GetDataSource(messages_file);
  941.     datasource.Assert(newmsg, 
  942.         RDF.GetResource("http://home.netscape.com/NC-rdf#MsgName"),
  943.             RDF.GetLiteral(nameValue), true);
  944.     datasource.Assert(newmsg, 
  945.         RDF.GetResource("http://home.netscape.com/NC-rdf#MsgText"),
  946.         RDF.GetLiteral(textValue), true);
  947.  
  948.     var container = Components.classes["@mozilla.org/rdf/container;1"].createInstance();
  949.       container = container.QueryInterface(Components.interfaces.nsIRDFContainer);
  950.       container.Init(datasource, RDF.GetResource("NC:AIM/AwayMessageBag"));
  951.  
  952.     container.AppendElement(newmsg);
  953.     datasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush();
  954. }
  955.  
  956. function
  957. AddAwayMessage()
  958. {
  959. // title is window.arguments[1];
  960. // content is window.arguments[2];
  961.  
  962.      window.openDialog("chrome://aim/content/AddAwayMessage.xul","_blank", "chrome,close,titlebar,modal", "", "", "");
  963. }
  964.  
  965. function
  966. EditAwayMessage()
  967. {
  968. // title is window.arguments[1];
  969. // content is window.arguments[2];
  970.  
  971.     var msgName, msgText;
  972.     var response;
  973.  
  974.     response = FindSelectedAwayMessage();
  975.     if ( response == null ) {
  976.         alert(getString("away.PleaseSelectToEdit"));
  977.         return;
  978.     } else {
  979.         msgName = response.msgName;
  980.         msgText = response.msgText;
  981.     }
  982.  
  983.      window.openDialog("chrome://aim/content/AddAwayMessage.xul","_blank", "chrome,close,titlebar, modal", "", msgName, msgText);
  984. }
  985.  
  986. function
  987. RemoveAwayMessage()
  988. {
  989.     var msgName, msgText;
  990.     var response;
  991.  
  992.     response = FindSelectedAwayMessage();
  993.     if ( response == null ) {
  994.         alert(getString("away.PleaseSelectToRemove"));
  995.         return;
  996.     } 
  997.  
  998.     answer = confirm(getString("away.AreYouSure").replace(/%AwayMsg%/,response.msgName));
  999.     if ( answer == true ) 
  1000.         RemoveTarget( response.msgName );
  1001. }
  1002.  
  1003. function
  1004. FindSelectedAwayMessage()
  1005. {
  1006.         var selection;
  1007.     var tree = document.getElementById("AwayMessages");
  1008.  
  1009.     var response = new Object();
  1010.  
  1011.         if ( tree )
  1012.                 selection = tree.contentView.getItemAtIndex(tree.currentIndex);
  1013.  
  1014.         if ( selection) {
  1015.             response.msgName = selection.getAttribute("MsgName");
  1016.         response.msgText = selection.getAttribute("MsgText");
  1017.  
  1018.         return response;
  1019.     }
  1020.     return null;
  1021. }
  1022.  
  1023.  
  1024.  //XXXVISHY - per screen name stuff
  1025.   
  1026. function getCurrentScreenName()
  1027. {
  1028.   var myaimSession = aimSession();
  1029.   if (myaimSession) {
  1030.     return myaimSession.CurrentScreenName;
  1031.   }
  1032.   else
  1033.     return "";
  1034. }
  1035.  
  1036. // XXXVISHY - the aimPreferenceOnload function MUST be called in the
  1037. // onload handler of every aim preference panel so as to do the
  1038. // per screen name munging
  1039.  
  1040. /* every element has: prefstring, preftype, preattribute, pref (true/false), prefscope(0,1,2)
  1041.  
  1042. preftype, a type of value to retrieve;
  1043. preattribute, a type of element attribute to assign
  1044.  
  1045.  
  1046. preftype = true, if it is for preference element only
  1047. prefscope = 0, PER_SN,
  1048. prefscope = 2, SESSION_GLOBAL,
  1049. prefscope = 1, GEN_GLOBAL
  1050.  
  1051. */
  1052.  
  1053. function aimPreferenceOnload()
  1054.  {
  1055.   dump("starting aimPreferenceOnload\n");   
  1056.     var aimprefs = document.getElementsByAttribute("pref", "true");
  1057.     var sN;
  1058.     var qPreference;
  1059.     var curDefPref;
  1060.     var panelType = 0;
  1061.      
  1062.     for (var i = 0 ; i < aimprefs.length ; i++) {
  1063.          var preference = aimprefs[i].getAttribute("prefstring");
  1064.         var curprefScope = aimprefs[i].getAttribute("prefscope");
  1065. dump("curprefScope=" + curprefScope + "\n");        
  1066.         if (curprefScope == 2 || curprefScope == 1) {
  1067.         
  1068.             if (panelType == 0)
  1069.                 qPreference = preference + ".aim";
  1070.             else //panelType == 2
  1071.                 qPreference = preference + ".icq";
  1072.                         
  1073.         }
  1074.         else { // scope == 0, PER_SN
  1075.  
  1076.           if (panelType == aimPrefsManager().GetSessionType()) 
  1077.           {
  1078.             sN = getCurrentScreenName() + "."; 
  1079.             qPreference = sN + preference;
  1080.  
  1081.             if (MozPreferences.getPrefType(qPreference) == Components.interfaces.nsIPrefBranch.PREF_INVALID)
  1082.                  {
  1083.             // first time with this pref, so create a per screen name copy
  1084.                 if (MozPreferences.getPrefType(preference) == Components.interfaces.nsIPrefBranch.PREF_INVALID)
  1085.                  {
  1086.                 // "preference" is not default name, create default name
  1087.                     
  1088.                     if (panelType == 0)
  1089.                         curDefPref = preference + ".aim";
  1090.                     else //panelType == 2
  1091.                         curDefPref = preference + ".icq";
  1092.                 }
  1093.                 else {
  1094.                     curDefPref = preference;
  1095.                 }
  1096. dump("curDefPref=" + curDefPref + "\n");
  1097.  
  1098.                 switch (MozPreferences.getPrefType(curDefPref)) {
  1099.                 case Components.interfaces.nsIPrefBranch.PREF_STRING:
  1100.                 var sPref = MozPreferences.getCharPref(curDefPref);        
  1101.                 MozPreferences.setCharPref(qPreference, sPref);
  1102.                 break;
  1103.                 case Components.interfaces.nsIPrefBranch.PREF_INT:
  1104.                 var iPref = MozPreferences.getIntPref(curDefPref);
  1105.                 MozPreferences.setIntPref(qPreference, iPref);
  1106.                 break;
  1107.                 case Components.interfaces.nsIPrefBranch.PREF_BOOL:
  1108.                 var bPref = MozPreferences.getBoolPref(curDefPref);
  1109.                 MozPreferences.setBoolPref(qPreference, bPref);
  1110.                 break;
  1111.                 default:
  1112.                 dump("Bad pref type for NIM\n");
  1113.                 break;
  1114.                 }
  1115.  
  1116.  
  1117.             }
  1118.           }
  1119.           else
  1120.           {
  1121.             qPreference = "__sys." + preference;
  1122.           
  1123.           }
  1124.  
  1125.             
  1126.         }
  1127.     
  1128.         aimprefs[i].setAttribute("prefstring", qPreference);
  1129.     
  1130.      }
  1131.  
  1132.  }
  1133.  
  1134.  
  1135.  
  1136. /*
  1137.     XXXVISHY - this is a hack. The aimPreferenceOnload would have munged
  1138.     aim.mail.presence into a per-screen name pref. This function
  1139.     will unmunge it back into a global preference. This is done in this 
  1140.     ugly manner since it is the least invasive way at this point. 
  1141.  */
  1142.  
  1143. function aimMailPresenceUnMunge()
  1144. {
  1145.     var mailPref = document.getElementById("mailPresence");
  1146.     mailPref.setAttribute("prefstring", "aim.mail.presence");
  1147. }
  1148.  
  1149.  
  1150.  
  1151. /************* Related to the Connection/Proxy Panel ********************/
  1152.  
  1153. // Remove whitespace from both ends of a string
  1154. function TrimString(string)
  1155. {
  1156.   if (!string) return "";
  1157.   return string.replace(/(^\s+)|(\s+$)/g, '')
  1158. }
  1159.  
  1160.  
  1161. function PrefIMConnectionOnload()
  1162. {
  1163.   var proxPass = "";
  1164.   DoEnabling();
  1165.   parent.ConnectionLoad = 1;
  1166.   parent.connectionSaved = 0;
  1167.   if (parent.ConnectionCallback == undefined || 
  1168.     parent.ConnectionCallback == null ) {
  1169.  
  1170.     // Register the OK callback func once, and unmunge the initial value 
  1171.     parent.ConnectionCallback = 1;
  1172.     parent.hPrefWindow.registerOKCallbackFunc(AssertProxyChanges);
  1173.     var pIAimSession = aimSession();
  1174.     if (pIAimSession) {
  1175.       var aimPrefs = aimPrefsManager();
  1176.       var mungedproxypassword = aimPrefs.GetWCharPrefEdit("aim.session.proxypassword.aim", null, 1, null, -1);
  1177.       proxPass = pIAimSession.UnMungeString(mungedproxypassword);
  1178.       parent.proxyPassword = proxPass;
  1179.     }
  1180.   }
  1181.   else {
  1182.  
  1183.     // we switched back from some other panel, so restore the 
  1184.     // saved off value from the unload handler
  1185.     proxPass = parent.proxyPassword;    
  1186.   }
  1187.  
  1188.   document.getElementById("proxyPassword").value = proxPass;
  1189. }
  1190.  
  1191. function AssertProxyChanges()
  1192. {
  1193.   parent.proxyPassword = document.getElementById("proxyPassword").value;
  1194.   // if the connection panel is loaded, base64 the current password
  1195.   if (parent.ConnectionLoad == 1)
  1196.     MungeProxyPassword();
  1197.  
  1198.   // set this so the unload handler doesn't do anything when called
  1199.   parent.connectionSaved = 1;
  1200. }
  1201.  
  1202. function PrefIMConnectionOnunload()
  1203. {
  1204.   // we already saved (e.g., here because OK was hit), so juswt return
  1205.   if ( parent.connectionSaved == 1 )
  1206.     return;
  1207.  
  1208.   // ok, switching to some other panel. Save off the current value
  1209.   // to be restored in the onload handler, and remember we are not
  1210.   // visible so we deal with the AssertProxyChanges() callback in
  1211.   // the correct manner
  1212.  
  1213.   parent.proxyPassword = document.getElementById("proxyPassword").value;
  1214.   parent.ConnectionLoad = 0;    
  1215. }
  1216.  
  1217. function DoEnabling()
  1218. {
  1219.   var host = document.getElementById("proxyHost");
  1220.   var port = document.getElementById("proxyPort");
  1221.   var protocol = document.getElementById("proxyProtocol");
  1222.   var userName = document.getElementById("proxyUserName");
  1223.   var password = document.getElementById("proxyPassword");
  1224.   var radiogroup0 = document.getElementById("proxyProtocolSocks4");
  1225.   var radiogroup1 = document.getElementById("proxyProtocolSocks5");
  1226.   var radiogroup2 = document.getElementById("proxyProtocolHttps");
  1227.   var radiogroup3 = document.getElementById("proxyProtocolHttp");
  1228.  
  1229.   // convenience arrays
  1230.   var manual = [host, port, protocol, userName, password, radiogroup0, radiogroup1, radiogroup2, radiogroup3];
  1231.   
  1232.   // checkbox button
  1233.   var checkboxitem = document.getElementById("proxyUse");
  1234.   if ( checkboxitem.checked ) {
  1235.       for( var i = 0; i < manual.length; i++ ) {
  1236.         manual[i].setAttribute( "disabled", "false" );
  1237.         manual[i].removeAttribute( "disabled" );
  1238.       }
  1239.   } else {
  1240.       for( var i = 0; i < manual.length; i++ ) 
  1241.         manual[i].setAttribute( "disabled", "true" );
  1242.   }
  1243. }
  1244.  
  1245. /*This function must be called ONLY by AsserProxyChanges function */
  1246. function MungeProxyPassword()
  1247. {
  1248.   var IMServiceClass = Components.classes['@netscape.com/aim/IMManager;1'];
  1249.   var pIIMManager  = IMServiceClass.getService(Components.interfaces.nsIIMManager);
  1250.   var pIAimSession = pIIMManager.QueryInterface(Components.interfaces.nsIAimSession);
  1251.   var proxPass = "";
  1252.   if(pIAimSession) {
  1253.       var aimPrefs = pIIMManager.QueryInterface(Components.interfaces.nsIPrefsManager);
  1254.       proxPass = pIAimSession.MungeString(parent.proxyPassword);
  1255.       aimPrefs.SetWCharPrefEdit("aim.session.proxypassword.aim", proxPass, null, 1, null, -1);
  1256.   }
  1257. }
  1258.  
  1259. function changePort()
  1260. {
  1261.   var proxyprotocol = document.getElementById("proxyProtocol").value;
  1262.   if (proxyprotocol == "1" || proxyprotocol == "2" || proxyprotocol == "4")
  1263.     document.getElementById("aimPort").value = "5190";
  1264.   else
  1265.     document.getElementById("aimPort").value = "443";
  1266. }
  1267.  
  1268. function resetConnection()
  1269. {
  1270.   document.getElementById("aimHost").value = "login.oscar.aol.com"
  1271.   document.getElementById("aimPort").value = "5190";
  1272.  
  1273.   //reset all the proxy stuff. clear all the fields.
  1274.   document.getElementById("proxyUse").checked = false;
  1275.   document.getElementById("proxyHost").value = "";
  1276.   document.getElementById("proxyPort").value = "1080";
  1277.   document.getElementById("proxyUserName").value = "";
  1278.   document.getElementById("proxyPassword").value = "";
  1279.   parent.proxyPassword = "";
  1280.   document.getElementById("proxyProtocolSocks4").setAttribute("selected","true");
  1281.   document.getElementById("proxyProtocolSocks5").removeAttribute("selected");
  1282.   document.getElementById("proxyProtocolHttps").removeAttribute("selected");
  1283.   document.getElementById("proxyProtocolHttp").removeAttribute("selected");
  1284.   DoEnabling();
  1285. }
  1286.  
  1287.  
  1288. /*connection panel end*/
  1289.  
  1290.  
  1291. function UpdateAwayButtons()
  1292. {
  1293.   var selection;
  1294.   var tree = document.getElementById("AwayMessages");
  1295.   if (tree)
  1296.     selection = tree.contentView.getItemAtIndex(tree.currentIndex);
  1297.   if ( selection ) {
  1298.     document.getElementById("buttonEditMess").setAttribute("disabled", "false");
  1299.     var parent = selection.parentNode;
  1300.     if (parent.childNodes.length != 1) {
  1301.       // If this is the last element in away tree, do not allow remove
  1302.       document.getElementById("buttonRemoveMess").setAttribute("disabled", "false");
  1303.     }
  1304.   }        
  1305.   return;
  1306. }
  1307.  
  1308. function DisableButtons()
  1309. {
  1310.     document.getElementById("buttonEditMess").setAttribute("disabled", "true");
  1311.     document.getElementById("buttonRemoveMess").setAttribute("disabled", "true");
  1312. }
  1313.  
  1314. function PrefIMBuddyIconOnLoad() {
  1315.   if((!IsSignedOn()) || (isIcq())) {
  1316.     var offlinetxt = aimString("bi.plsfirstsignon");
  1317.     var element = document.getElementById("OfflineIntro");
  1318.     var textNode = document.createTextNode(offlinetxt);
  1319.     element.appendChild(textNode);
  1320.     DisableBIElements();
  1321.     return;
  1322.   }
  1323.  
  1324.   var biframe = document.getElementById("content");
  1325.   var biurl = aimRegionString("aim.buddyiconpage");
  1326.   if (biframe)
  1327.     biframe.setAttribute("src", biurl);
  1328.  
  1329.   var nimBuddy = aimBuddyManager();
  1330.   nimBuddy.InitBuddyIconsState();
  1331.  
  1332.   //select the first element *My Buddy Icon* on pref load.
  1333.   var buddyTree = document.getElementById("buddyIconTree");
  1334.   var treeselection = buddyTree.treeBoxObject.selection;
  1335.   treeselection.select(0);
  1336.  
  1337.  
  1338.   document.getElementById("OfflineIntro").setAttribute("hidden", "true");
  1339.   LoadPersonalBuddyIcon();
  1340. }
  1341.  
  1342. function buddyIconBrowse() {
  1343.   var buddyTree = document.getElementById("buddyIconTree");
  1344.   var startIndex = {};
  1345.   var endIndex = {};
  1346.   buddyTree.treeBoxObject.selection.getRangeAt(0, startIndex, endIndex);
  1347.   var sindex = startIndex.value;
  1348.   var eindex = endIndex.value;
  1349.   var view = buddyTree.treeBoxObject.view;
  1350.   var level = view.getLevel(sindex);
  1351.   var selectedItem = view.getCellText(sindex, "ListSetupCol");
  1352.  
  1353.   if ((level == 0) && (sindex > 0)) {
  1354.     //some group is selected....just return;
  1355.     return;
  1356.   }
  1357.  
  1358.   var fileHandler = GetFileHandler();
  1359.   var currentTime = new Date().getTime();
  1360.   var biimage = document.getElementById("buddyIconImage");
  1361.   var pIAimSession = pIIMManager.QueryInterface(Components.interfaces.nsIAimSession);
  1362.   var pDir = pIAimSession.profileDir;
  1363.   
  1364.   //set the image to current picture.gif
  1365.   var pictureDir = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  1366.   pictureDir.initWithPath(pDir.path);
  1367.  
  1368.   //buddy picture directory.
  1369.   var bpictureDir = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  1370.   bpictureDir.initWithPath(pDir.path);
  1371.     
  1372.   var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
  1373.   if (!fp) {
  1374.     dump("Unable to create file picker...\n");
  1375.     return;
  1376.   }
  1377.   fp.init(window, aimString("bibrowse.title"),  Components.interfaces.nsIFilePicker.modeOpen);
  1378.   fp.appendFilter(aimString("bi.filetypes"), "*.gif;*.jpg;*.bmp;*.ico;*.xbm");
  1379.   var ret = fp.show();
  1380.   if (ret == Components.interfaces.nsIFilePicker.returnOK && fp.fileURL.spec) {
  1381.     var fileurl = fp.fileURL.spec;
  1382.     var Ifile = fp.fileURL.file;
  1383.     var filesize = Ifile.fileSize;
  1384.     if(filesize > 7168) {
  1385.       aimErrorBox(aimString("bi.toolarge"));
  1386.       return;
  1387.     }
  1388.   }
  1389.  
  1390.   //if the slected item is *my BI* then do this
  1391.   if ((level == 0) && (selectedItem == "*My Buddy Icon*") && (sindex == 0)) {
  1392.     pictureDir.append("picture.gif");
  1393.     if (pictureDir.exists()) {
  1394.       //delete the existing file
  1395.       pictureDir.remove(false);
  1396.     }
  1397.  
  1398.     Ifile.copyTo(pDir, "picture.gif");
  1399.     var anotherPictureDir = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  1400.     anotherPictureDir.initWithPath(pDir.path);
  1401.     anotherPictureDir.append("picture.gif");
  1402.     if (anotherPictureDir.exists()) {
  1403.       var tfileurl = fileHandler.getURLSpecFromFile(anotherPictureDir);
  1404.       if (biimage) {
  1405.         //The picture.gif will be stored in cache. so everytime you click browse and change you image
  1406.         //the url remains the same and it loads from cache. That's the reason a unique value is used.
  1407.         biimage.setAttribute("src", tfileurl+"?foobar="+currentTime);
  1408.       }
  1409.     }
  1410.  
  1411.     try {
  1412.       pIAimSession.SetBuddyIcon(false);
  1413.     }
  1414.     catch(e) {
  1415.       dump("Error setting Buddy Icon...:" + e + "\n");
  1416.     }
  1417.   } //end of setting personal BI
  1418.   else {
  1419.     pictureDir.append("picture");
  1420.     if(!pictureDir.exists()) {
  1421.       return;
  1422.     }
  1423.     bpictureDir.append("picture");
  1424.     if(!bpictureDir.exists()) {
  1425.       return;
  1426.     }
  1427.  
  1428.     pictureDir.append(selectedItem+".gif");
  1429.     if (pictureDir.exists()) {
  1430.       //delete the existing one
  1431.       pictureDir.remove(false);
  1432.     }
  1433.  
  1434.     var newfileName = selectedItem + ".gif";
  1435.     Ifile.copyTo(bpictureDir, newfileName);
  1436.     bpictureDir.append(newfileName);
  1437.     if (!bpictureDir.exists()) {
  1438.       return;
  1439.     }
  1440.     var buddyBI = fileHandler.getURLSpecFromFile(bpictureDir);
  1441.     if (biimage) {
  1442.       //The picture.gif will be stored in cache. so everytime you click browse and change you image
  1443.       //the url remains the same and it loads from cache. That's the reason a unique value is used.
  1444.       biimage.setAttribute("src", buddyBI+"?foobar="+currentTime);
  1445.     }
  1446.  
  1447.  
  1448.     //this guy should set the reject flag in *defaulr-BI.rdf* (Not in Buddy List DS)
  1449.     // for this buddy so that the user won't receive BI from that remote Buddy.
  1450.     //this guy should also call the main RDF code to set the hasBI property.
  1451.     var rdf = aimRDF();
  1452.     var nimIM = aimIM();
  1453.     nimIM.SetHasBIBuddyIconFlag(selectedItem, true);
  1454.  
  1455.     var wantBIres = rdf.GetResource("http://home.netscape.com/NC-rdf#WantBI");
  1456.     var falseliteral = rdf.GetLiteral("false");
  1457.     nimIM.SetBuddyIconFlag(selectedItem, wantBIres, falseliteral);
  1458.  
  1459.     var nimBuddy = aimBuddyManager();
  1460.     nimBuddy.SetHasBuddyIconFlag(selectedItem, true);
  1461.  
  1462.   } //else 
  1463. }
  1464.  
  1465. function GetFileHandler()
  1466. {
  1467.   var IOService = Components.classes["@mozilla.org/network/io-service;1"]
  1468.                     .getService(Components.interfaces.nsIIOService);
  1469.  
  1470.   return IOService.getProtocolHandler("file")
  1471.                   .QueryInterface(Components.interfaces.nsIFileProtocolHandler);
  1472. }
  1473.  
  1474. function clearBuddyIcon()
  1475. {
  1476.   var userresponse;
  1477.   userresponse = confirm(getString("bi.clearbi"));
  1478.   if (!userresponse) 
  1479.     return;
  1480.  
  1481.   var buddyTree = document.getElementById("buddyIconTree");
  1482.   var startIndex = {};
  1483.   var endIndex = {};
  1484.   buddyTree.treeBoxObject.selection.getRangeAt(0, startIndex, endIndex);
  1485.   var sindex = startIndex.value;
  1486.   var eindex = endIndex.value;
  1487.   var view = buddyTree.treeBoxObject.view;
  1488.   var level = view.getLevel(sindex);
  1489.   var selectedItem = view.getCellText(sindex, "ListSetupCol");
  1490.   var biimage = document.getElementById("buddyIconImage");
  1491.   var pIAimSession = pIIMManager.QueryInterface(Components.interfaces.nsIAimSession);
  1492.   var pDir = pIAimSession.profileDir;
  1493.   
  1494.   //set the image to current picture.gif
  1495.   var pictureDir = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  1496.   pictureDir.initWithPath(pDir.path);
  1497.  
  1498.   if ((level == 0) && (selectedItem == "*My Buddy Icon*") && (sindex == 0)) {
  1499.     clearPersonalBuddyIcon();
  1500.     clearBuddyIconImage();
  1501.     return;
  1502.   }
  1503.  
  1504.   if ((level == 0) && (sidex > 0)) {
  1505.     //a group is selected
  1506.     return;
  1507.   }
  1508.  
  1509.   //four steps done.
  1510.   //1. Delete the <SN>.gif
  1511.   //2. Clear the RejectBI flag, if any.
  1512.   //3. Clear the HasBI flag, if any.
  1513.   //4. Clear in any open IM windows
  1514.  
  1515.   pictureDir.append("picture");
  1516.   if (!pictureDir.exists()) {
  1517.     return;
  1518.   }
  1519.   pictureDir.append(selectedItem+".gif");
  1520.   if (pictureDir.exists()) {
  1521.     //remove the picture file
  1522.     pictureDir.remove(false);
  1523.   }
  1524.  
  1525.   
  1526.   var nimIM = aimIM();
  1527.   nimIM.SetHasBIBuddyIconFlag(selectedItem, false);
  1528.   var rdf = aimRDF();
  1529.  
  1530.   //clear wantBI flag
  1531.   var wantBIres = rdf.GetResource("http://home.netscape.com/NC-rdf#WantBI");
  1532.   var trueliteral = rdf.GetLiteral("true");
  1533.   nimIM.SetBuddyIconFlag(selectedItem, wantBIres, trueliteral);
  1534.  
  1535.   //clear reject BI flag
  1536.   var rejBIres = rdf.GetResource("http://home.netscape.com/NC-rdf#Reject");
  1537.   var falseliteral = rdf.GetLiteral("false");
  1538.   nimIM.SetBuddyIconFlag(selectedItem, rejBIres, falseliteral);
  1539.  
  1540.   //clear FileSize BI res
  1541.   var filesizeBIres = rdf.GetResource("http://home.netscape.com/NC-rdf#FileSize");
  1542.   var filesizeliteral = rdf.GetIntLiteral(0);
  1543.   nimIM.SetBuddyIconFlag(selectedItem, filesizeBIres, filesizeliteral);
  1544.  
  1545.   //clear checksum BI res
  1546.   var checksumBIres = rdf.GetResource("http://home.netscape.com/NC-rdf#CheckSum");
  1547.   var csliteral = rdf.GetIntLiteral(0);
  1548.   nimIM.SetBuddyIconFlag(selectedItem, checksumBIres, csliteral);
  1549.   
  1550.   var nimBuddy = aimBuddyManager();
  1551.   nimBuddy.SetHasBuddyIconFlag(selectedItem, false);
  1552.   nimBuddy.SetBuddyIconRejectFlag(selectedItem, false);
  1553.   
  1554.   clearBuddyIconImage();
  1555.  
  1556.   //4. Clear in any open IM windows
  1557.   setBuddyIconImageinIMWindow(selectedItem, null);
  1558.  
  1559. }
  1560.  
  1561. function setBuddyIconImageinIMWindow(screenName, url)
  1562. {
  1563.   var aimIM = aimIMObject();
  1564.   var existingIM = aimIM.GetExistingIM(screenName);
  1565.   if (existingIM) {
  1566.     var biElement = existingIM.document.getElementById("BuddyIcon");
  1567.     if (biElement)
  1568.       biElement.setAttribute("src", url);
  1569.   }
  1570. }
  1571.  
  1572. function clearAllBuddyIcons()
  1573. {
  1574.   var userresponse;
  1575.   userresponse = confirm(getString("bi.clearall"));
  1576.   if (userresponse == false) 
  1577.     return;
  1578.  
  1579.   clearPersonalBuddyIcon();
  1580.   clearAllRemoteBuddyIcons();
  1581.   var nimIM = aimIM();
  1582.   nimIM.ClearAllBuddyIconFlags();
  1583.   clearBuddyIconImage();
  1584.  
  1585. }
  1586.  
  1587. /*clears all the remote buudies BI
  1588.   deletes the entries in picture directory */
  1589. function clearAllRemoteBuddyIcons()
  1590. {
  1591.   var pIAimSession = pIIMManager.QueryInterface(Components.interfaces.nsIAimSession);
  1592.   var pDir = pIAimSession.profileDir;
  1593.   var pictureDir = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  1594.   pictureDir.initWithPath(pDir.path);
  1595.   pictureDir.append("picture");
  1596.   if ((pictureDir.exists()) && (pictureDir.isDirectory())) {
  1597.     var fileslist = pictureDir.directoryEntries;
  1598.     while(fileslist.hasMoreElements()) {
  1599.       var nextfile = fileslist.getNext().QueryInterface(Components.interfaces.nsIFile);
  1600.       if (nextfile && !nextfile.isDirectory())
  1601.         nextfile.remove(false);
  1602.     }
  1603.   }
  1604. }
  1605.  
  1606.  
  1607. /*Clears the personal Buddy Icon from the profilr directory and in COOL */
  1608. function clearPersonalBuddyIcon()
  1609. {
  1610.   var biimage = document.getElementById("buddyIconImage");
  1611.   var pIAimSession = pIIMManager.QueryInterface(Components.interfaces.nsIAimSession);
  1612.   var pDir = pIAimSession.profileDir;
  1613.   var pictureDir = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  1614.   pictureDir.initWithPath(pDir.path);
  1615.   pictureDir.append("picture.gif");
  1616.   if (pictureDir.exists()) {
  1617.     //remove the image from the profile dir. clear the bi. send signal back to COOL.
  1618.     biimage.removeAttribute("src");
  1619.     pIAimSession.SetBuddyIcon(true);
  1620.     pictureDir.remove(false);
  1621.   }
  1622. }
  1623.  
  1624.  
  1625. function DisableBIElements()
  1626. {
  1627.   document.getElementById("buddyIconTree").setAttribute("hidden", "true");
  1628.   document.getElementById("btnBrowseFile").setAttribute("hidden", "true");
  1629.   document.getElementById("btnClear").setAttribute("hidden", "true");
  1630.   document.getElementById("btnClearAll").setAttribute("hidden", "true");
  1631.   document.getElementById("acceptFromUsers").setAttribute("hidden", "true");
  1632.   document.getElementById("buddyKnockKnock").setAttribute("hidden", "true");
  1633.   document.getElementById("neverAccept").setAttribute("hidden", "true");
  1634.   document.getElementById("neverDisplay").setAttribute("hidden", "true");
  1635.   document.getElementById("imagegpbox").setAttribute("hidden", "true");
  1636.   document.getElementById("content").setAttribute("hidden", "true");
  1637.   document.getElementById("prefgpbox").setAttribute("hidden", "true");
  1638. }
  1639.  
  1640. function changeKnockKnock()
  1641. {
  1642.   var displayBI = document.getElementById("displayBI").value;
  1643.   var kk = document.getElementById("buddyKnockKnock");
  1644.   if(displayBI == "0")
  1645.     kk.removeAttribute("disabled");
  1646.   else
  1647.     kk.setAttribute("disabled", "true");
  1648. }
  1649.  
  1650. function onBISelectionChange()
  1651. {
  1652.   var buddyTree = document.getElementById("buddyIconTree");
  1653.   var startIndex = {};
  1654.   var endIndex = {};
  1655.   buddyTree.treeBoxObject.selection.getRangeAt(0, startIndex, endIndex);
  1656.   var sindex = startIndex.value;
  1657.   var eindex = endIndex.value;
  1658.   var view = buddyTree.treeBoxObject.view;
  1659.   var level = view.getLevel(sindex);
  1660.   var selectedItem = view.getCellText(sindex, "ListSetupCol");
  1661.   
  1662.  
  1663.   if ((level == 0) && (sindex > 0)) {
  1664.     //a group is selected. disable the buttons and clear the image.
  1665.     document.getElementById("btnBrowseFile").setAttribute("disabled", "true");
  1666.     document.getElementById("btnClear").setAttribute("disabled", "true");
  1667.     clearBuddyIconImage();
  1668.     return;
  1669.   }
  1670.   else {
  1671.     document.getElementById("btnBrowseFile").setAttribute("disabled", "false");
  1672.     document.getElementById("btnClear").setAttribute("disabled", "false");
  1673.   }
  1674.  
  1675.   if (sindex == 0) {
  1676.     LoadPersonalBuddyIcon();
  1677.     return;
  1678.   }
  1679.  
  1680.   if ((sindex >0) && (level != 0)) {
  1681.     //load the remote buddies buddy icon
  1682.     LoadRemoteBuddyBuddyIcon(selectedItem);
  1683.   }
  1684.  
  1685. }
  1686.  
  1687.  
  1688. /* As the name implies, this guy loads the buddy Icon of the remote buddy from the picture directory*/
  1689. function LoadRemoteBuddyBuddyIcon(buddyname)
  1690. {
  1691.   var pIAimSession = pIIMManager.QueryInterface(Components.interfaces.nsIAimSession);
  1692.   var pDir = pIAimSession.profileDir;
  1693.   
  1694.   //set the image to current picture.gif
  1695.   var pictureDir = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  1696.   pictureDir.initWithPath(pDir.path);
  1697.   pictureDir.append("picture");
  1698.   if(!pictureDir.exists()) {
  1699.     return;
  1700.   }
  1701.   pictureDir.append(buddyname + ".gif");
  1702.   if (!pictureDir.exists()) {
  1703.     clearBuddyIconImage();
  1704.     return;
  1705.   }
  1706.  
  1707.   var fileHandler = GetFileHandler();
  1708.   var tfileurl1 = fileHandler.getURLSpecFromFile(pictureDir);
  1709.   //avoid loading from cache
  1710.   var currentTime = new Date().getTime();
  1711.   var biimage = document.getElementById("buddyIconImage");
  1712.   biimage.setAttribute("src", tfileurl1+"?foobar="+currentTime);
  1713.  
  1714.   return;
  1715. }
  1716.  
  1717. /*This just clears the image from the pref panel. */
  1718. function clearBuddyIconImage() {
  1719.   var biimage = document.getElementById("buddyIconImage");
  1720.   biimage.removeAttribute("src");
  1721.   return;
  1722. }
  1723.  
  1724. /*This loads the personal Buddy Icon from the profile directory*/
  1725. function LoadPersonalBuddyIcon() {
  1726.   var biimage = document.getElementById("buddyIconImage");
  1727.   var pIAimSession = pIIMManager.QueryInterface(Components.interfaces.nsIAimSession);
  1728.   var pDir = pIAimSession.profileDir;
  1729.   
  1730.   //set the image to current picture.gif
  1731.   var pictureDir = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  1732.   pictureDir.initWithPath(pDir.path);
  1733.   pictureDir.append("picture.gif");
  1734.   if (pictureDir.exists()) {
  1735.     var fileHandler = GetFileHandler();
  1736.     var tfileurl1 = fileHandler.getURLSpecFromFile(pictureDir);
  1737.     //avoid loading from cache
  1738.     var currentTime = new Date().getTime();
  1739.     biimage.setAttribute("src", tfileurl1+"?foobar="+currentTime);     
  1740.   }
  1741.   else {
  1742.     clearBuddyIconImage();
  1743.   }
  1744.   return;
  1745. }
  1746.  
  1747. //Most of these code are inherited from browser code.
  1748. //And a note to whoever own the Buddy Icons content page: Please do not change the urls. ;-)
  1749.  
  1750. function bicontentAreaClick(event)
  1751. {
  1752.   var target = event.target;
  1753.   var linkNode;
  1754.   var local_name = target.localName;
  1755.  
  1756.   if (local_name)
  1757.     local_name = local_name.toLowerCase();
  1758.  
  1759.   switch (local_name) {
  1760.     case "a":
  1761.     case "area":
  1762.     case "link":
  1763.       if (target.hasAttribute("href")) 
  1764.         linkNode = target;
  1765.       break;
  1766.     default:
  1767.       linkNode = findBIParentNode(event.originalTarget, "a");
  1768.       // <a> cannot be nested.  So if we find an anchor without an
  1769.       // href, there is no useful <a> around the target
  1770.       if (linkNode && !linkNode.hasAttribute("href"))
  1771.         linkNode = null;
  1772.       break;
  1773.   }
  1774.  
  1775.   if (linkNode) {
  1776.     var linkNodehref = linkNode.href;
  1777.     //if the url contains aol.com just load it in BI pref pane
  1778.     if (linkNodehref.substr(0, 18) == aimRegionString("aim.aolurl"))
  1779.       return false;
  1780.     else {
  1781.       //if url does not contain aol.com and it is a http url load it in a new window.
  1782.       if (linkNodehref.substr(0, 7) == aimRegionString("aim.httpurl")) {
  1783.         event.preventDefault();
  1784.         openTopWin(linkNodehref);
  1785.         return true;
  1786.       }
  1787.     }
  1788.   }
  1789.  
  1790.   return false;
  1791. }
  1792.  
  1793. function findBIParentNode(node, parentNode)
  1794. {
  1795.   if (node && node.nodeType == Node.TEXT_NODE) {
  1796.     node = node.parentNode;
  1797.   }
  1798.   while (node) {
  1799.     var nodeName = node.localName;
  1800.     if (!nodeName)
  1801.       return null;
  1802.     nodeName = nodeName.toLowerCase();
  1803.     if (nodeName == "body" || nodeName == "html" ||
  1804.         nodeName == "#document") {
  1805.       return null;
  1806.     }
  1807.     if (nodeName == parentNode)
  1808.       return node;
  1809.     node = node.parentNode;
  1810.   }
  1811.   return null;
  1812. }
  1813.  
  1814.  
  1815. function boottoggle(value)
  1816. {
  1817.   parent.isBootEnabled = value;
  1818. }
  1819.  
  1820. function instantMessageOnOk()
  1821. {
  1822.   var winhooksService = Components.classes["@mozilla.org/winhooks;1"].getService(Components.interfaces.nsIWindowsHooks);
  1823.   if (winhooksService) {
  1824.     if (parent.isBootEnabled)
  1825.       winhooksService.startupAddOption("-aim");
  1826.     else
  1827.       winhooksService.startupRemoveOption("-aim");
  1828.   }
  1829. }
  1830.  
  1831. function instantMessageOnload()
  1832. {
  1833.   var todayhide = aimPrefsManager().GetBoolPref("aim.internal.hidetoday", null, false);
  1834.   if (todayhide)
  1835.   {
  1836.     document.getElementById("today").setAttribute("style", "display: none" );
  1837.   }
  1838.   if (navigator.platform != "Win32")
  1839.   {
  1840.     document.getElementById("boot").setAttribute("hidden", "true");
  1841.     // If all the elements in the Sign On group are removed, get ride of the groupbox
  1842.     // Otherwise we'll show an empty groupbox!
  1843.     if (todayhide)
  1844.     {
  1845.       document.getElementById("signongroup").setAttribute("style", "display: none" );
  1846.     }
  1847.     return;
  1848.   }
  1849.   if (!parent.hPrefWindow)
  1850.   {
  1851.     setTimeout("instantMessageOnload()", 1);
  1852.     return;
  1853.   }
  1854.   parent.hPrefWindow.registerOKCallbackFunc(instantMessageOnOk);
  1855.   if (!aimSession().CheckConflictRunKey())
  1856.   {
  1857.     var winhooksService = Components.classes["@mozilla.org/winhooks;1"].getService(Components.interfaces.nsIWindowsHooks);
  1858.     if (winhooksService) {
  1859.       parent.isBootEnabled = winhooksService.isOptionEnabled("-aim");
  1860.       document.getElementById("boot").checked = parent.isBootEnabled;
  1861.     }
  1862.   } 
  1863.   else
  1864.     document.getElementById("boot").setAttribute("disabled", "true");
  1865. }
  1866.  
  1867. function openfilepicker()
  1868. {
  1869.   var nsIFilePicker = Components.interfaces.nsIFilePicker;
  1870.   var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  1871.   fp.init(window, aimString('file.choose'), nsIFilePicker.modeGetFolder);
  1872.  
  1873.   fp.appendFilters(nsIFilePicker.filterAll);
  1874.  
  1875.   try {
  1876.     fp.show();
  1877.   }
  1878.   catch (ex) {
  1879.     dump ("filePicker.chooseInputFile threw an exception\n");
  1880.     return false;
  1881.   }
  1882.   var kdir_separator = "/";
  1883.   if (navigator.platform == 'MacPPC')
  1884.     kdir_separator = ":";
  1885.   else if (navigator.platform == 'Win32')
  1886.     kdir_separator = "\\";
  1887.   if (fp.file && fp.file.path.length > 0)
  1888.     document.getElementById("location").setAttribute("value", fp.file.path + kdir_separator);
  1889. }