home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 May / 05_02.iso / software / netscape6 / nim.xpi / bin / chrome / aim.jar / content / aim / prefIM.js < prev    next >
Encoding:
Text File  |  2001-10-02  |  30.7 KB  |  1,050 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;1'];
  9. MozPreferences = MozPreferences.getService();
  10. MozPreferences = MozPreferences.QueryInterface(Components.interfaces.nsIPref);
  11.  
  12. function getString(name)
  13. {
  14.     if (aimStringBundle())
  15.                 return aimStringBundle().GetStringFromName(name);
  16.         else    
  17.         return "";
  18. }
  19.  
  20. function EditAwayMessageOnLoad()
  21. {
  22.     // poke in the arguments 
  23.  
  24.     var nameItem = document.getElementById("awayMessageName");
  25.     var textItem = document.getElementById("awayMessageText");
  26.  
  27.     nameItem.value = window.arguments[1];
  28.     textItem.value = window.arguments[2];
  29.     nameItem.focus();
  30.  
  31.     // construct some of the static labels here; had problems placing
  32.     // '%' into an DTD ENTITY
  33.  
  34.     var labelItem = document.getElementById("editAwayMessageSpecial1");
  35.     var stringItem = getString( "editAwayMessageSpecial1" );
  36.     labelItem.setAttribute( "value", stringItem );
  37.     labelItem = document.getElementById("editAwayMessageSpecial2");
  38.     stringItem = getString( "editAwayMessageSpecial2" );
  39.     labelItem.setAttribute( "value", stringItem );
  40.     labelItem = document.getElementById("editAwayMessageSpecial3");
  41.     stringItem = getString( "editAwayMessageSpecial3" );
  42.     labelItem.setAttribute( "value", stringItem );
  43.     labelItem = document.getElementById("editAwayMessageSpecial4");
  44.     stringItem = getString( "editAwayMessageSpecial4" );
  45.     labelItem.setAttribute( "value", stringItem );
  46.  
  47.     // set the OK, Cancel callbacks
  48.  
  49.     if ( nameItem.value == "" ) 
  50.         doSetOKCancel(AddAwayMessageOnOK, 0);
  51.     else    
  52.         doSetOKCancel(EditAwayMessageOnOK, 0);
  53. }
  54.  
  55. function PrefIMAwayOnLoad()
  56. {
  57.   GetRDFService();
  58.  
  59.     sidebar_file = GetRdfFileUrl("default-messages.rdf", "dm.rdf");  
  60.     datasource = 
  61.         RDF.GetDataSource(sidebar_file);
  62.     
  63.     dump( "datasource " + datasource + "\n" );
  64.  
  65.     var tree = document.getElementById("AwayMessages");
  66.     tree.database.AddDataSource(datasource);
  67.         tree.setAttribute('ref', tree.getAttribute('ref'));
  68.  
  69. /*
  70.         var editorShell = editorElement.editorShell;
  71.         
  72.         if(editorShell) {
  73.                 window.editorShell = editorShell;
  74.  
  75.                 contentWindow = window._content;  
  76.  
  77.                 window.editorShell.editorType = "html";
  78.  
  79.                 window.editorShell.SetContentWindow(contentWindow);
  80.                 window.editorShell.SetWebShellWindow(window);
  81.                 window.editorShell.SetToolbarWindow(window);
  82.         contentWindow.focus();
  83.         }
  84. */
  85. }
  86.  
  87.  
  88. // XXXVISHy 
  89. // Add a user to the allow or deny list. top.addMode defines which list
  90.  
  91. function GetUserAdd()
  92. {
  93.         var fldUserName = top.document.getElementById("fldUserName");
  94.     var pIAimPrivacy = aimPrivacy();
  95.         var name = fldUserName.value;
  96.         if ( name && name != "" ) {
  97.         if ( top.addMode == "Allow" ) {
  98.             pIAimPrivacy.AllowListAdd( name );
  99.         }
  100.         else if ( top.addMode == "Deny" ) {
  101.             pIAimPrivacy.DenyListAdd( name );
  102.         }
  103.         //pIAimPrivacy.UpdateStorage();
  104.                   top.window.close();
  105.         }
  106. }
  107.  
  108. /* 
  109.  * Name: StandardURL
  110.  *
  111.  * Arguments: URI string, e.g., chrome://foo/bar
  112.  *
  113.  * Description: obtains an instance of nsIURL and sets the spec to the passed
  114.  * uri. Returns the nsIURL instance.
  115.  *
  116.  */
  117.  
  118. function StandardURL(s) {
  119.     var clazz = Components.classes["@mozilla.org/network/standard-url;1"];
  120.     var iface = Components.interfaces.nsIURL;
  121.     var obj = clazz.createInstance(iface);
  122.     obj.spec = s;
  123.     return obj;
  124.  
  125. /* 
  126.  * Name: Sound
  127.  *
  128.  * Arguments: none 
  129.  *
  130.  * Description: Creates and returns an instance of nsISound
  131.  *
  132.  */
  133.  
  134. function Sound() {
  135.     var clazz = Components.classes["@mozilla.org/sound;1"];
  136.     var iface = Components.interfaces.nsISound;
  137.     var obj = clazz.createInstance(iface);
  138.     return obj;
  139. }
  140.  
  141. /* 
  142.  * Name: PlaySound
  143.  *
  144.  * Arguments: chrome URI to a sound file
  145.  *
  146.  * Description: Called by onclick handler for speaker titled buttons in
  147.  * the sound preferences panel for IM.
  148.  *
  149.  */
  150.  
  151. function PlaySound( myURIPref )
  152. {
  153.     var sound = new Sound();
  154.     var myURI;
  155.  
  156.     try {
  157.         myURI = aimPrefsManager().GetCharPref( myURIPref , null, false );
  158.     }
  159.     catch(e) {
  160.         try {
  161.             myURI = aimPrefsManager().GetCharPref( myURIPref , null, true); // get the global one if the per screen name doesnt work
  162.         }
  163.         catch(e) {
  164.             return;
  165.         }         
  166.     }        
  167.  
  168.     var uri = new StandardURL(myURI);
  169.     if ( sound != undefined && sound != null && uri != undefined && uri != null ) {
  170.         try {
  171.             sound.play( uri );
  172.         }
  173.         catch( e ) {
  174.             // device may not support sound, so ignore
  175.         }
  176.     }    
  177. }
  178.  
  179. /* away messages */
  180.  
  181. var datasource = null;
  182. var RDF = null;
  183. var awayMessages = null;
  184.  
  185. function
  186. GetRDFService()
  187. {
  188.     if ( RDF == null ) {
  189.         var RDFClass = Components.classes['@mozilla.org/rdf/rdf-service;1'];
  190.         RDF = RDFClass.getService(Components.interfaces.nsIRDFService);
  191.     }
  192. }
  193.  
  194. function
  195. RemoveTarget( msgName )
  196. {
  197.     GetRDFService();
  198.  
  199.     var messages_file = GetRdfFileUrl("default-messages.rdf", "dm.rdf");  
  200.     var datasource = RDF.GetDataSource(messages_file);
  201.  
  202.     var container = Components.classes["@mozilla.org/rdf/container;1"].createInstance();
  203.       container = container.QueryInterface(Components.interfaces.nsIRDFContainer);
  204.       container.Init(datasource, RDF.GetResource("NC:AIM/AwayMessageBag"));
  205.  
  206.     var elements = container.GetElements();
  207.     var target, node;
  208.     var nameResource = 
  209.                 RDF.GetResource("http://home.netscape.com/NC-rdf#MsgName");
  210.     while ( elements.hasMoreElements() ) {
  211.         node = elements.getNext();
  212.         if ( node ) 
  213.             target = datasource.GetTarget( node, nameResource, 
  214.                 true );
  215.         if ( target ) 
  216.             target = target.QueryInterface(Components.interfaces.nsIRDFLiteral);
  217.         if ( target && target.Value == msgName ) {
  218.             container.RemoveElement( node, true );
  219.             datasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush();
  220.         }
  221.     }
  222.     return null;
  223. }
  224.  
  225. function
  226. SetAwayMessageTarget( msgName, msgText )
  227. {
  228.     GetRDFService();
  229.  
  230.     var messages_file = GetRdfFileUrl("default-messages.rdf", "dm.rdf");  
  231.     var datasource = RDF.GetDataSource(messages_file);
  232.  
  233.     var container = Components.classes["@mozilla.org/rdf/container;1"].createInstance();
  234.       container = container.QueryInterface(Components.interfaces.nsIRDFContainer);
  235.       container.Init(datasource, RDF.GetResource("NC:AIM/AwayMessageBag"));
  236.  
  237.     var elements = container.GetElements();
  238.     var nametarget, texttarget, node;
  239.     var nameResource = 
  240.                 RDF.GetResource("http://home.netscape.com/NC-rdf#MsgName");
  241.     var textResource = 
  242.                 RDF.GetResource("http://home.netscape.com/NC-rdf#MsgText");
  243.     while ( elements.hasMoreElements() ) {
  244.         node = elements.getNext();
  245.         if ( node ) 
  246.             nametarget = datasource.GetTarget( node, nameResource, 
  247.                 true );
  248.         if ( nametarget ) 
  249.             nametarget = nametarget.QueryInterface(Components.interfaces.nsIRDFLiteral);
  250.         if ( nametarget && nametarget.Value == msgName ) {
  251.             texttarget = datasource.GetTarget( node, textResource, 
  252.                 true );
  253.             if ( texttarget ) 
  254.                 texttarget = texttarget.QueryInterface(Components.interfaces.nsIRDFLiteral);
  255.             if ( texttarget ) {
  256.                 var newText = RDF.GetLiteral(msgText);
  257.                 datasource.Change( node, textResource,
  258.                     texttarget, newText);
  259.                 datasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush();
  260.             }
  261.             break;
  262.         }
  263.     }
  264. }
  265.  
  266. //XXXVISHY - two 
  267.  
  268. function modeToRadio(mode)
  269. {
  270.  
  271.     switch(mode) {
  272.     case allEnums.AllowAll:
  273.     dump ("allEnums.AllowAll\n" );
  274.         return document.getElementById("aim_privacy_contact_allowallusers"); 
  275.         break;
  276.     case allEnums.AllowBuddies:
  277.     dump ("allEnums.AllowBuddies\n" );
  278.         return document.getElementById("aim_privacy_contact_allowbuddylistusers"); 
  279.         break;
  280.     case allEnums.AllowList:
  281.     dump ("allEnums.AllowOnlyList\n" );
  282.         return document.getElementById("aim_privacy_contact_allowonlylist"); 
  283.         break;
  284.     case allEnums.DenyAll:
  285.     dump ("allEnums.DenyAll\n" );
  286.       
  287.         return document.getElementById("aim_privacy_contact_blockallusers"); 
  288.         break;
  289.     case allEnums.DenyList:
  290.     dump ("allEnums.DenyList\n" );
  291.         return document.getElementById("aim_privacy_contact_blocklistusers"); 
  292.         break;
  293.     default:
  294.         dump("Bad privacy mode\n");
  295.         return document.getElementById("aim_privacy_contact_allowallusers"); 
  296.         break;
  297.     }
  298. }
  299.  
  300. function privacyModeRadio(mode)
  301. {
  302.   dump("privacyModeRadio\n");
  303.  
  304.   // this should not be needed, but believe me dont remove it 
  305.   // otherwise radio UI can show two things selected ;-)
  306.   lastRadio.checked = false;
  307.   lastRadio = modeToRadio(mode);
  308.   dump ("lastRadio is " + lastRadio + "\n");
  309.   lastRadio.checked = true;
  310.   parent.lastPrivacyMode = mode;
  311.  
  312.   dump ("lastPrivacyMode is " + parent.lastPrivacyMode + "\n");
  313. }
  314.  
  315. function privacyChatInvites(value)
  316. {
  317.   parent.lastChatInvites = value;
  318. }
  319.  
  320. function viewToRadio(view)
  321. {
  322.   dump("in function viewToRadio\n" + view);
  323.  
  324.     switch(view) {
  325.     case '1':
  326.         return document.getElementById("nodisclosure"); 
  327.         break;
  328.     case '2':
  329.         return document.getElementById("limiteddisclosure"); 
  330.         break;
  331.     case '3':
  332.         return document.getElementById("fulldisclosure"); 
  333.         break;
  334.     default:
  335.         dump("Bad privacy view\n");
  336.         return document.getElementById("nodisclosure"); 
  337.         break;
  338.     }
  339. }
  340.  
  341. function privacyViewRadio(view)
  342. {
  343.   dump("privacyModeRadio\n");
  344.  
  345.   // this should not be needed, but believe me dont remove it 
  346.   // otherwise radio UI can show two things selected ;-)
  347.   //lastViewRadio.checked = false;
  348.   //lastViewRadio = viewToRadio(view);
  349.   dump ("lastViewRadio is " + lastViewRadio + "\n");
  350.   //lastViewRadio.checked = true;
  351.   parent.lastPrivacyView = view;
  352.  
  353.   dump ("lastPrivacyView is " + parent.lastPrivacyView + "\n");
  354. }
  355.  
  356. // onload handler for privacy panel. grab the privacy mode enums, and register
  357. // AssertChanges with prefwindow so we get called on OK presses.
  358.  
  359. AdminCallback = new Object();
  360. AdminCallback.OnRequestInfoComplete = function(type,info)
  361. {
  362.     dump("On RequestInfoComplete\n");
  363.  
  364.     switch (type) { 
  365.     case Components.interfaces.nsIAimAdminInfo.RegistrationStatusPreference:
  366.         dump("info is " + info + "\n");
  367.         parent.lastPrivacyView = info;
  368.  
  369.         dump("Got the aim privacy view\n");
  370.         lastViewRadio = viewToRadio(parent.lastPrivacyView);
  371.     
  372.         if ( lastViewRadio != undefined && lastViewRadio != null) {
  373.             var privacyViewElement = document.getElementById("privacyView");
  374.             privacyViewElement.selectedItem = lastViewRadio;
  375.         }
  376.         break;
  377.     default:
  378.         break;
  379.     }
  380. }
  381. AdminCallback.OnRequestInfoError = function(pErrMsg)
  382. {
  383.     dump("OnRequestInfoError\n");
  384. }
  385.  
  386. adminGetterCallback = new Object();
  387.  
  388. adminGetterCallback.ExecuteIfReady = function()
  389. {
  390.     dump("about to get the disclosure level\n");
  391.     aimAdminManager().RequestInfoRegistrationStatusPreference(AdminCallback);
  392. }
  393.  
  394. function DisablePrivacyUI()
  395. {
  396.         var el = document.getElementById("aim_privacy_contact_allowallusers");
  397.         if ( el )
  398.             el.setAttribute( "disabled", "true" );
  399.         el = document.getElementById("aim_privacy_contact_allowbuddylistusers");
  400.         if ( el )
  401.             el.setAttribute( "disabled", "true" );
  402.         el = document.getElementById("aim_privacy_contact_allowonlylist");
  403.         if ( el )
  404.             el.setAttribute( "disabled", "true" );
  405.         el = document.getElementById("aim_privacy_contact_blockallusers");
  406.         if ( el )
  407.             el.setAttribute( "disabled", "true" );
  408.         el = document.getElementById("aim_privacy_contact_blocklistusers");
  409.         if ( el )
  410.             el.setAttribute( "disabled", "true" );
  411.         el = document.getElementById("button1");
  412.         if ( el )
  413.             el.setAttribute( "disabled", "true" );
  414.         el = document.getElementById("button2");
  415.         if ( el )
  416.             el.setAttribute( "disabled", "true" );
  417.         el = document.getElementById("button3");
  418.         if ( el )
  419.             el.setAttribute( "disabled", "true" );
  420.         el = document.getElementById("button4");
  421.         if ( el )
  422.             el.setAttribute( "disabled", "true" );
  423.         el = document.getElementById("chatInvites");
  424.         if ( el )
  425.             el.setAttribute( "disabled", "true" );
  426. /*        el = document.getElementById("idleTime");
  427.         if ( el )
  428.             el.setAttribute( "disabled", "true" );
  429. */
  430.         el = document.getElementById("privacyView");
  431.         if ( el )
  432.             el.setAttribute( "disabled", "true" );
  433.         el = document.getElementById("fulldisclosure");
  434.         if ( el )
  435.             el.setAttribute( "disabled", "true" );
  436.         el = document.getElementById("limiteddisclosure");
  437.         if ( el )
  438.             el.setAttribute( "disabled", "true" );
  439.         el = document.getElementById("nodisclosure");
  440.         if ( el )
  441.             el.setAttribute( "disabled", "true" );
  442. }
  443.  
  444. function DiscardPrivacyChanges()
  445. {
  446.  
  447.     var IMServiceClass = Components.classes['@netscape.com/aim/IMManager;1'];
  448.     var pIIMManager  = IMServiceClass.getService(Components.interfaces.nsIIMManager);
  449.     var pIAimString = pIIMManager.QueryInterface(Components.interfaces.nsIStringBundle);
  450.     
  451.     if ( pIAimString == undefined || pIAimString == null )
  452.         return;
  453.  
  454.     var str = pIAimString.GetStringFromName( "privacy.exitmsg" );
  455.     if (str == undefined || str ==null)
  456.         return;
  457.     
  458.     alert( str );
  459. }
  460.  
  461. function IsSignedOn()
  462. {
  463.     var state = aimSession().CurrentState;
  464. dump( "state is " + state + " \n" );
  465.  
  466.     if ( state == stateEnums.Online || state == stateEnums.OnlineAway )
  467.         return true;
  468.     return false;
  469. }
  470.  
  471. function PrefIMPrivacyOnLoad()
  472. {
  473.     dump("PrefIMPrivacyOnLoad\n");
  474.  
  475.     if(false == IsSignedOn()) {
  476.         var str = getString( "privacy.entermsg" );        
  477.         DisablePrivacyUI();
  478.         alert( str );
  479.         parent.hPrefWindow.registerOKCallbackFunc( DiscardPrivacyChanges );
  480.     }
  481.     else
  482.         parent.hPrefWindow.registerOKCallbackFunc( AssertPrivacyChanges );
  483.  
  484. //    parent.handle.AddOnOK( AssertChanges );
  485.     
  486.     var priv = aimPrivacy();
  487.     // do it only the first time!
  488.     if (parent.lastPrivacyMode == undefined)
  489.         parent.lastPrivacyMode = priv.PrivacyMode;
  490.  
  491.     dump("Got the aim privacy mode\n");
  492.     lastRadio = modeToRadio(parent.lastPrivacyMode);
  493.  
  494.     if ( lastRadio != undefined && lastRadio != null)
  495.         lastRadio.setAttribute("checked","true");
  496.  
  497.     if ( parent.lastChatInvites != undefined && parent.lastChatInvites != null) {
  498.                 var checkbox = document.getElementById("chatInvites");
  499.                 if ( checkbox != undefined && checkbox != null ) {
  500.                         checkbox.setAttribute("checked",parent.lastChatInvites);
  501.                 }
  502.         }
  503.  
  504.     dump("set the radio.checked property\n");
  505.         //aimPreferenceOnload();
  506.     //dump("did the per screen name munging\n");
  507.  
  508.     var loggedin = true;
  509.  
  510.     if (loggedin && (parent.lastPrivacyView == undefined))
  511.     {
  512.         aimAdminManager().ExecuteIfReady(adminGetterCallback);
  513.     }
  514. }
  515.  
  516. function PrefIMPrivacyOnUnload() 
  517. {
  518.     // nothing for now
  519. }
  520.  
  521. // grab a screenname from the user.
  522.  
  523. function PostGetUserDlg( which )
  524.     openDialog("chrome://aim/content/pref-IM_getuser.xul", "", 
  525.         "modal=yes,chrome", which);
  526. }
  527.  
  528. // delete the screenname entered by the user from the allow or deny list.
  529. // "which" indicates which list to purge from
  530.  
  531. function DeleteFromList( which )
  532. {
  533.         var tree = document.getElementById(which);
  534.     var pIAimPrivacy = aimPrivacy();
  535.     var selectedUser;
  536.     if ( tree == undefined || tree == null )
  537.         {
  538.         return;
  539.         }
  540.     
  541.     for ( var i = 0; i < tree.childNodes.length; i++ ) {
  542.         if ( tree.childNodes[i].nodeName == "treechildren" ) {
  543.             var users= tree.childNodes[i].childNodes;
  544.         }
  545.     }
  546.         
  547.     for (var i = 0; i <= users.length; i++) {
  548.             if (users[i].getAttribute("selected") == "true") {
  549.             selectedUser = users[i].childNodes[0].childNodes[0].getAttribute("label");
  550.             if ( which == "Allow" ) {
  551.                 pIAimPrivacy.AllowListRemove( selectedUser );
  552.                         }
  553.             else if ( which == "Deny" ) {
  554.                 pIAimPrivacy.DenyListRemove( selectedUser );
  555.                         }
  556.                     break;
  557.             }
  558.     }
  559. }
  560.  
  561. // onload handler for the dialog used to get a screenname from the user
  562.  
  563. function GetUserOnLoad()
  564. {
  565.         doSetOKCancel(GetUserAdd, 0);
  566.     top.addMode = window.arguments[0];
  567.     document.getElementById("fldUserName").focus();
  568. }
  569.  
  570. // called when OK button is pressed in privacy mode preferences panel. Figure
  571. // out what changed, communicate this to AIM Glue backend
  572.  
  573. function AssertPrivacyChanges()
  574. {
  575.     // We cannot use global variables as this is called in the
  576.     // context of the Parent window much later!!
  577.     dump("Calling function prefIM.js AssertChanges\n");
  578.     var IMServiceClass = Components.classes['@netscape.com/aim/IMManager;1'];
  579.     var pIIMManager  = IMServiceClass.getService(Components.interfaces.nsIIMManager)
  580.     var lastRadio = null;
  581.     var allEnums = Components.interfaces.nsAimPrivacyModes;
  582.     var pIAimPrivacy = pIIMManager.QueryInterface(Components.interfaces.nsIAimPrivacy)
  583.     
  584.     if ( pIAimPrivacy == undefined || pIAimPrivacy == null )
  585.         return;
  586.  
  587.     // This has been simplified and made correct
  588.     pIAimPrivacy.PrivacyMode = parent.lastPrivacyMode;
  589.     var tvalues = false;
  590.  
  591.     dump ("saved privacy mode in AIM as " + parent.lastPrivacyMode + "\n");
  592.     
  593.     var pAimAdmin = pIIMManager.QueryInterface(Components.interfaces.nsIAimAdminManager);
  594.     
  595.     if ( pAimAdmin == undefined || pAimAdmin == null )
  596.         return;
  597.  
  598.     adminSetterCallback = new Object();
  599.     adminSetterCallback.ExecuteIfReady = function()
  600.     {
  601.         dump("adminsettercallback executeifready\n");
  602.  
  603.                 // this kinda code is dangerous -- should not glom so many
  604.                 // things that can fail into one statement XXX
  605.  
  606.     Components.classes['@netscape.com/aim/IMManager;1'].getService(Components.interfaces.nsIIMManager).QueryInterface(Components.interfaces.nsIAimAdminManager).ChangeRegistrationStatusPreference(null,parent.lastPrivacyView);
  607.     }
  608.  
  609.     dump("adminsettercallback.execifready\n");
  610.     pAimAdmin.ExecuteIfReady(adminSetterCallback);
  611.  
  612.     var pAimPrefs =  pIIMManager.QueryInterface(Components.interfaces.nsIPrefsManager);
  613.  
  614. dump( "parent.lastChatInvites is " + parent.lastChatInvites + " \n" );
  615.         if ( parent.lastChatInvites != undefined ) {
  616.             pAimPrefs.SetBoolPref("aim.chat.unavailable", parent.lastChatInvites, null, false);
  617.         }
  618.  
  619.     var chatInvite_pref=false;
  620.     try {
  621.         chatInvite_pref= pAimPrefs.GetBoolPref("aim.chat.unavailable", null, false);
  622.         }
  623.     catch (ex) {
  624.         dump("chat announce pref could not be read\n");
  625.         chatInvite_pref = false;
  626.         }
  627.     pChatManager= pIIMManager.QueryInterface(Components.interfaces.nsIAimChatManager);
  628.     // Suresh: Setting it to complement coz the pref is aim.chat._un_available. Gee...This is confusing..heh.
  629.     pChatManager.SetAvailableForChat(!chatInvite_pref);
  630.     dump("Setting chat invite to "+chatInvite_pref+"\n");
  631.  
  632.     return;
  633.  
  634. }
  635.  
  636. function
  637. FindAwayMessageTargetByName( msgName )
  638. {
  639.     GetRDFService();
  640.  
  641.     var messages_file = GetRdfFileUrl("default-messages.rdf", "dm.rdf");  
  642.     var datasource = RDF.GetDataSource(messages_file);
  643.  
  644.     var container = Components.classes["@mozilla.org/rdf/container;1"].createInstance();
  645.       container = container.QueryInterface(Components.interfaces.nsIRDFContainer);
  646.       container.Init(datasource, RDF.GetResource("NC:AIM/AwayMessageBag"));
  647.  
  648.     var elements = container.GetElements();
  649.     var target, node;
  650.     var nameResource = 
  651.                 RDF.GetResource("http://home.netscape.com/NC-rdf#MsgName");
  652.     while ( elements.hasMoreElements() ) {
  653.         node = elements.getNext();
  654.         if ( node ) 
  655.             target = datasource.GetTarget( node, nameResource, 
  656.                 true );
  657.         if ( target ) 
  658.             target = target.QueryInterface(Components.interfaces.nsIRDFLiteral);
  659.         if ( target && target.Value == msgName ) 
  660.             return target.Value;
  661.     }
  662.     return null;
  663. }
  664.  
  665. function
  666. EditAwayMessageOnOK()
  667. {
  668.     var nameItem = document.getElementById("awayMessageName");
  669.     var textItem = document.getElementById("awayMessageText");
  670.     var nameValue = null;
  671.     var textValue = null;
  672.  
  673.     if ( !nameItem || nameItem == undefined ) 
  674.         return;
  675.     if ( !textItem || textItem == undefined ) 
  676.         return;
  677.     nameValue = nameItem.value;
  678.     textValue = textItem.value;
  679.     if ( nameValue == "" ) {
  680.         alert(getString("away.EnterLabel"));
  681.         return;
  682.     }
  683.     if ( textValue == "" ) {
  684.         alert(getString("away.EnterMessage"));
  685.         return;
  686.     }
  687.  
  688.     var target = FindAwayMessageTargetByName( nameValue );
  689.     if ( target == null ) {
  690.         retval = confirm(getString("away.DoesNotExist"));
  691.         if ( retval == true ) 
  692.             AssertAwayMessage( nameValue, textValue ); 
  693.         else
  694.             return;
  695.     } else 
  696.         SetAwayMessageTarget( nameValue, textValue )
  697.     top.window.close();
  698. }
  699.  
  700. function
  701. AddAwayMessageOnOK()
  702. {
  703.     var nameItem = document.getElementById("awayMessageName");
  704.     var textItem = document.getElementById("awayMessageText");
  705.     var nameValue = null;
  706.     var textValue = null;
  707.  
  708.     if ( !nameItem || nameItem == undefined ) 
  709.         return;
  710.     if ( !textItem || textItem == undefined ) 
  711.         return;
  712.     nameValue = nameItem.value;
  713.     textValue = textItem.value;
  714.     if ( nameValue == "" ) {
  715.         alert(getString("away.EnterLabel"));
  716.         return;
  717.     }
  718.     if ( textValue == "" ) {
  719.         alert(getString("away.EnterMessage"));
  720.         return;
  721.     }
  722.  
  723.     if ( FindAwayMessageTargetByName( nameValue ) != null ) {
  724.  
  725.         // ask them if they would like to overwrite (i.e., 
  726.         // turn this into an edit).
  727.  
  728.         var response = confirm(getString("away.AlreadyExists"));
  729.         if ( response == true ) {
  730.             EditAwayMessageOnOK();
  731.             return;
  732.         } else {
  733.             alert(getString("away.EnterLabel"));
  734.             return;
  735.         }
  736.     }
  737.  
  738.     AssertAwayMessage( nameValue, textValue ); 
  739.     top.window.close();
  740. }
  741.  
  742. function
  743. AssertAwayMessage( nameValue, textValue )
  744. {
  745.     GetRDFService();
  746.  
  747.     var newmsg = RDF.GetAnonymousResource();
  748.     var messages_file = GetRdfFileUrl("default-messages.rdf", "dm.rdf");  
  749.  
  750.     var datasource = 
  751.         RDF.GetDataSource(messages_file);
  752.     datasource.Assert(newmsg, 
  753.         RDF.GetResource("http://home.netscape.com/NC-rdf#MsgName"),
  754.             RDF.GetLiteral(nameValue), true);
  755.     datasource.Assert(newmsg, 
  756.         RDF.GetResource("http://home.netscape.com/NC-rdf#MsgText"),
  757.         RDF.GetLiteral(textValue), true);
  758.  
  759.     var container = Components.classes["@mozilla.org/rdf/container;1"].createInstance();
  760.       container = container.QueryInterface(Components.interfaces.nsIRDFContainer);
  761.       container.Init(datasource, RDF.GetResource("NC:AIM/AwayMessageBag"));
  762.  
  763.     container.AppendElement(newmsg);
  764.     datasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush();
  765. }
  766.  
  767. function
  768. AddAwayMessage()
  769. {
  770. // title is window.arguments[1];
  771. // content is window.arguments[2];
  772.  
  773.      window.openDialog("chrome://aim/content/AddAwayMessage.xul","_blank", "chrome,close,titlebar,modal", "", "", "");
  774. }
  775.  
  776. function
  777. EditAwayMessage()
  778. {
  779. // title is window.arguments[1];
  780. // content is window.arguments[2];
  781.  
  782.     var msgName, msgText;
  783.     var response;
  784.  
  785.     response = FindSelectedAwayMessage();
  786.     if ( response == null ) {
  787.         alert(getString("away.PleaseSelectToEdit"));
  788.         return;
  789.     } else {
  790.         msgName = response.msgName;
  791.         msgText = response.msgText;
  792.     }
  793.  
  794.      window.openDialog("chrome://aim/content/AddAwayMessage.xul","_blank", "chrome,close,titlebar, modal", "", msgName, msgText);
  795. }
  796.  
  797. function
  798. RemoveAwayMessage()
  799. {
  800.     var msgName, msgText;
  801.     var response;
  802.  
  803.     response = FindSelectedAwayMessage();
  804.     if ( response == null ) {
  805.         alert(getString("away.PleaseSelectToRemove"));
  806.         return;
  807.     } 
  808.  
  809.     answer = confirm(getString("away.AreYouSure").replace(/%AwayMsg%/,response.msgName));
  810.     if ( answer == true ) 
  811.         RemoveTarget( response.msgName );
  812. }
  813.  
  814. function
  815. FindSelectedAwayMessage()
  816. {
  817.         var selection;
  818.     var tree = document.getElementById("AwayMessages");
  819.  
  820.     var response = new Object();
  821.  
  822.         if ( tree )
  823.                 selection = tree.selectedItems;
  824.  
  825.         if ( selection && selection.length == 1 ) {
  826.             response.msgName = selection[0].getAttribute("MsgName");
  827.         response.msgText = selection[0].getAttribute("MsgText");
  828.  
  829.         return response;
  830.     }
  831.     return null;
  832. }
  833.  
  834.  
  835.  //XXXVISHY - per screen name stuff
  836.   
  837.  function getCurrentScreenName()
  838.  {
  839.    var myaimSession = aimSession();
  840.    if (myaimSession) {
  841.      return myaimSession.CurrentScreenName;
  842.    }
  843.    else
  844.      return "";
  845.  }
  846.  
  847. // XXXVISHY - the aimPreferenceOnload function MUST be called in the
  848. // onload handler of every aim preference panel so as to do the
  849. // per screen name munging
  850.  
  851.  function aimPreferenceOnload()
  852.  {
  853.     if (aimIsShrimp())
  854.     {
  855.     // Hide other components from edit->preferences in shrimp  bug 1614
  856.     // Need to rewrite this manipulating preftree.xul and overlays.rdf for shrimp
  857.     var panelChildren = parent.document.getElementById( "panelChildren" );
  858.     var panelTree = parent.document.getElementById( "prefsTree" );
  859.     for( var i = 0; i < panelChildren.childNodes.length; i++ )
  860.     {
  861.        var currentItem = panelChildren.childNodes[i];
  862.         if(currentItem.id != "instantmessenger"){
  863.           currentItem.setAttribute('style','visibility: collapse'); 
  864.         }    
  865.         if( currentItem.id == "appearance" ){
  866.             currentItem.setAttribute('style','visibility: visible'); 
  867.             currentItem.firstChild.firstChild.setAttribute("url","chrome://communicator/content/pref/pref-fonts.xul");
  868.             currentItem.childNodes[1].childNodes[2].setAttribute('style','visibility: collapse'); 
  869.         }    
  870.                   
  871.     }
  872.     }
  873.      var aimprefs = document.getElementsByAttribute("pref", "true");
  874.      
  875.      for (var i = 0 ; i < aimprefs.length ; i++) {
  876.      var preference = aimprefs[i].getAttribute("prefstring");
  877.  
  878.     var sN = getCurrentScreenName() + "."; 
  879.      //preference.replace(/^aim/ , sN);
  880.     qPreference = sN + preference;
  881.  
  882.     if (MozPreferences.GetPrefType(qPreference) == Components.interfaces.nsIPref.ePrefInvalid) {
  883.  
  884.         // first time with this pref, so create a per screen name copy
  885.         switch (MozPreferences.GetPrefType(preference)) {
  886.         case Components.interfaces.nsIPref.ePrefString:
  887.         var sPref = MozPreferences.CopyCharPref(preference);        
  888.         MozPreferences.SetCharPref(qPreference, sPref);
  889.         break;
  890.         case Components.interfaces.nsIPref.ePrefInt:
  891.         var iPref = MozPreferences.GetIntPref(preference);
  892.         MozPreferences.SetIntPref(qPreference, iPref);
  893.         break;
  894.         case Components.interfaces.nsIPref.ePrefBool:
  895.         var bPref = MozPreferences.GetBoolPref(preference);
  896.         MozPreferences.SetBoolPref(qPreference, bPref);
  897.         break;
  898.         default:
  899.         dump("Bad pref type for NIM\n");
  900.         break;
  901.         }
  902.     }
  903.  
  904.     aimprefs[i].setAttribute("prefstring", qPreference);
  905.      }
  906.  }
  907.  
  908. /*
  909.     XXXVISHY - this is a hack. The aimPreferenceOnload would have munged
  910.     aim.mail.presence into a per-screen name pref. This function
  911.     will unmunge it back into a global preference. This is done in this 
  912.     ugly manner since it is the least invasive way at this point. 
  913.  */
  914.  
  915. function aimMailPresenceUnMunge()
  916. {
  917.     var mailPref = document.getElementById("mailPresence");
  918.     mailPref.setAttribute("prefstring", "aim.mail.presence");
  919. }
  920.  
  921. /************* Related to the Connection/Proxy Panel ********************/
  922.  
  923. function PrefIMConnectionOnload()
  924. {
  925.    var proxPass = "";
  926.    DoEnabling();
  927.    parent.ConnectionLoad = 1;
  928.    parent.connectionSaved = 0;
  929.    if ( parent.ConnectionCallback == undefined || 
  930.         parent.ConnectionCallback == null ) {
  931.  
  932.    /* if aim.session.isaol is true, then disable the host and port fields
  933.       because we hardcode our connection to a specific AOL system for TIH
  934.       login */
  935.  
  936.    var isAOL;
  937.  
  938.      try {
  939.         isAOL = aimPrefsManager().GetBoolPref( "aim.session.isaol", null, false );
  940.      }
  941.      catch(e) {
  942.     isAOL = false;
  943.    }
  944.  
  945.    var el = document.getElementById("aimHost");
  946.    if ( el && isAOL == true )
  947.     el.setAttribute( "disabled", "true" );
  948.    else if ( el )
  949.     el.setAttribute( "disabled", "false" );
  950.    el = document.getElementById("aimPort");
  951.    if ( el && isAOL == true )
  952.     el.setAttribute( "disabled", "true" );
  953.    else if ( el )
  954.     el.setAttribute( "disabled", "false" );
  955.  
  956.     // Register the OK callback func once, and unmunge the initial value 
  957.  
  958.     parent.ConnectionCallback = 1;
  959.        parent.hPrefWindow.registerOKCallbackFunc( AssertProxyChanges );
  960.        var pIAimSession = aimSessionObject();
  961.        if ( pIAimSession ) {
  962.            proxPass = pIAimSession.UnMungeString(document.getElementById("proxyPassword").value);
  963.         parent.proxyPassword = proxPass;
  964.        }
  965.    } else {
  966.  
  967.     // we switched back from some other panel, so restore the 
  968.     // saved off value from the unload handler
  969.  
  970.     proxPass = parent.proxyPassword;    
  971.    }
  972.    document.getElementById("proxyPassword").value = proxPass;
  973. }
  974.  
  975. function
  976. AssertProxyChanges()
  977. {
  978.     // if the connection panel is loaded, base64 the current password
  979.  
  980.     if ( parent.ConnectionLoad == 1 )
  981.         MungeProxyPassword();
  982.  
  983.     // set this so the unload handler doesn't do anything when called
  984.  
  985.     parent.connectionSaved = 1;
  986. }
  987.  
  988. function PrefIMConnectionOnunload()
  989. {
  990.     // we already saved (e.g., here because OK was hit), so juswt return
  991.  
  992.     if ( parent.connectionSaved == 1 )
  993.         return;
  994.  
  995.     // ok, switching to some other panel. Save off the current value
  996.     // to be restored in the onload handler, and remember we are not
  997.     // visible so we deal with the AssertProxyChanges() callback in
  998.     // the correct manner
  999.  
  1000.     parent.proxyPassword = document.getElementById("proxyPassword").value;
  1001.     MungeProxyPassword();        // just in case OK is hit while away
  1002.     parent.ConnectionLoad = 0;    
  1003. }
  1004.  
  1005. function DoEnabling()
  1006. {
  1007.   var host = document.getElementById("proxyHost");
  1008.   var port = document.getElementById("proxyPort");
  1009.   var protocol = document.getElementById("proxyProtocol");
  1010.   var userName = document.getElementById("proxyUserName");
  1011.   var password = document.getElementById("proxyPassword");
  1012.   var radiogroup0 = document.getElementById("proxyProtocolSocks4");
  1013.   var radiogroup1 = document.getElementById("proxyProtocolSocks5");
  1014.   var radiogroup2 = document.getElementById("proxyProtocolHttps");
  1015.  
  1016.   // convenience arrays
  1017.   var manual = [host, port, protocol, userName, password, radiogroup0, radiogroup1, radiogroup2];
  1018.   
  1019.   // checkbox button
  1020.   var checkboxitem = document.getElementById("proxyUse");
  1021.   if ( checkboxitem.checked ) {
  1022.       for( var i = 0; i < manual.length; i++ ) {
  1023.         manual[i].setAttribute( "disabled", "false" );
  1024.         manual[i].removeAttribute( "disabled" );
  1025.       }
  1026.   } else {
  1027.       for( var i = 0; i < manual.length; i++ ) 
  1028.         manual[i].setAttribute( "disabled", "true" );
  1029.   }
  1030. }
  1031.  
  1032. function MungeProxyPassword()
  1033. {
  1034.     //XXXVISHY - you cannot use macros like AimSessionObject in
  1035.         // any callback because the javascript context will not remember
  1036.         // the included files!!!
  1037.  
  1038.         var IMServiceClass = Components.classes['@netscape.com/aim/IMManager;1'];
  1039.         var pIIMManager  = IMServiceClass.getService(Components.interfaces.nsIIMManager)
  1040.         var pIAimSession = pIIMManager.QueryInterface(Components.interfaces.nsIAimSession)
  1041.  
  1042.         var proxPass = "";
  1043.         if(pIAimSession) {
  1044.                proxPass = pIAimSession.MungeString(document.getElementById("proxyPassword").value);
  1045.               document.getElementById("proxyPassword").value = proxPass;
  1046.         }
  1047. }
  1048.