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 / IM.js < prev    next >
Text File  |  2006-01-06  |  44KB  |  1,384 lines

  1. var enterCR_pref_value = false;
  2. var Tab_pref_value = false;
  3. var args;
  4. var message="";
  5. var sendAwayMessage = true;
  6. var showTimestampVal;
  7. var isChatContent = false;
  8. var firstSend = 1;
  9.  
  10. //this variable is used for checking the typing indicator pref (in Privacy pane) after an IM is sent.
  11. //We send typing indicators based on this pref.
  12. var gTypingPref = checkTypingPref();
  13.  
  14. //This variable is used to check whether we need to send an event. This variable is reset everytime 
  15. //the typing indicator flag changes (Typing, NotEmpty etc).
  16. var gSendTypingEvent = 1;
  17.  
  18. //This variable is used to send Non Empty typing event
  19. var gSendNonEmptyEvent = 0;
  20.  
  21. var gTypingTimeoutid;
  22.  
  23. var gTypingEnum = Components.interfaces.nsAimInputStateFlags;
  24. var gEditorLength;
  25.  
  26. /*
  27.  * Function:  KnockKnockAddDenyList()
  28.  * Arguments: None
  29.  * Return: None
  30.  * Description:  This function is called when the user clicks on the deny button in the KnockKnock window.
  31.  * It blocks screen name of the incoming message and closees the dialog window.
  32. */
  33.  
  34. function KnockKnockAddDenyList()
  35. {
  36.   val = cmdPeopleBlock();
  37.   if ( val == true )
  38.     window.close();
  39. }
  40.  
  41. /*
  42.  * Function:  toggleKnockKnockPref()
  43.  * Arguments: None
  44.  * Return: None
  45.  * Description:  This function is called when the user chooses not to display the KnockKnock
  46.  * message window. There is a checkbox in the first KnockKnock window which when checked,
  47.  * sets a pref. Once this pref is set, from next time on, there will nit be KnockKnock again.
  48.  * This function justs sets the pref according to the checkbox value.
  49. */
  50.  
  51. function toggleKnockKnockPref()
  52. {
  53.   var element = document.getElementById("IMKnockKnockCheckbox");
  54.   if (aimPrefsManager() && element.checked == true ) {
  55.     aimPrefsManager().SetBoolPref("aim.privacy.knockknock", false , null, false);
  56.   }
  57.   else if ( aimPrefsManager() && element ) {
  58.     aimPrefsManager().SetBoolPref("aim.privacy.knockknock", true , null, false);
  59.   }
  60. }
  61.  
  62. /*
  63.  * Function:  pokeKnockKnockMessage( scname )
  64.  * Arguments: scname
  65.  * Return: None
  66.  * Description:  This function is called when there is a incoming KnockKnock message. It adds the 
  67.  * necessary text to the knockknock window including the sender's screen name and their current warning percent.
  68.  * The sender's screen name is obtained from the input parameter scname. The warning level of sender is obtained
  69.  * by using the locatemanager. It puts up a Ok and Cancel button. clicking Ok will open a Im indow by calling the 
  70.  * StartConveration function (See below). It also checks the KnockKnock pref to see if it has been set or not
  71.  * and updates the checkbox in window.
  72. */
  73.  
  74. function pokeKnockKnockMessage(scname)
  75. {
  76.   var msg = aimString("knock.msg");
  77.   var warning = aimString("knock.warning");
  78.   var message = aimString("knock.preamble").replace(/%ScreenName%/, scname);
  79.  
  80.   if (isIcq()) {
  81.     var icqmsg = aimString("knock.icqmsg");
  82.     var icqelement = document.getElementById("IMKnockKnockIcqMsg");
  83.     var icqtextNode = document.createTextNode(icqmsg);
  84.     icqelement.appendChild(icqtextNode);
  85.   }
  86.   else {
  87.     document.getElementById("IMKnockKnockIcqMsg").setAttribute("hidden", true);
  88.   }
  89.  
  90.   var element = document.getElementById("IMKnockKnockHtml");
  91.   var textNode = document.createTextNode(message);
  92.   element.appendChild(textNode);
  93.  
  94.   element = document.getElementById("IMKnockKnockMessage");
  95.   textNode = document.createTextNode(msg);
  96.   element.appendChild(textNode);
  97.  
  98.   document.getElementById("IMKnockKnockWarningTitle").setAttribute("label", scname);
  99.  
  100.   var locateManager = aimLocateManager();
  101.   var LocateCallbackObject = new Object();
  102.  
  103.   LocateCallbackObject.OnRequestUserInfoDefaultComplete = function(screenname, userobj)
  104.   {
  105.     var element = document.getElementById("IMKnockKnockWarning");
  106.     var percent = userobj.GetWarningPercent();
  107.     var message = warning.replace(/%Level%/,  percent);
  108.     document.getElementById("IMKnockKnockWarning").value = message;
  109.   }
  110.  
  111.   LocateCallbackObject.OnRequestUserInfoDefaultError = function(screenname, error)
  112.   {
  113.     // do nothing
  114.   }
  115.  
  116.   locateManager.RequestUserInfoDefault( LocateCallbackObject, scname );   
  117.  
  118.   labels = document.getElementById("okCancelButtons");
  119.   element = document.getElementById("ok");
  120.   element.setAttribute("label", labels.getAttribute("button1Label"));
  121.   element = document.getElementById("cancel");
  122.   element.setAttribute("label", labels.getAttribute("button2Label"));
  123.  
  124.   doSetOKCancel(StartConversation, CancelConversation);
  125.  
  126.   element = document.getElementById("IMKnockKnockCheckbox");
  127.   var currentVal = aimPrefsManager().GetBoolPref("aim.privacy.knockknock" ,null,false);
  128.   if ( currentVal == true ) 
  129.     element.setAttribute("checked", false);
  130.   else 
  131.     element.setAttribute("checked", true);
  132.     
  133. }
  134.  
  135. /*
  136. * gFirstTime is a global to determine if our onload handler has been called yet.
  137. * For some reason, our onunload handler is getting called before onload
  138. * on the first time we create IM.xul. This is a workaround.
  139. */
  140.  
  141. var gFirstTime = 1;
  142.  
  143. /*
  144.  * Function:  AimIMOnWndLoad()
  145.  * Arguments: None
  146.  * Return: None
  147.  * Description:  Onload handler for IM conversation window. It creates a IM Object which is 
  148.  * used to store all the focus information and initialises it. It also retrieves the IM Mode and
  149.  * screen name from the window arguments. It adds an event listener to capture keypress events 
  150.  * which gets handles by ComposeKeyPress handler. This is in place to take care of IM specific keydown
  151.  * handling like tab and enter key. If it is knockKnock mode then PokeKnockKnockMessage function (See Above)
  152.  * gets called. Otherwise call StartConversation function ( See Below) brings up the IM window.
  153. */
  154.  
  155. function AimIMOnWndLoad()
  156. {
  157.   gFirstTime = 0;
  158.  
  159.   top.imObject = new Object();
  160.   top.imObject.logHasFocus = false;
  161.   top.imObject.editorHasFocus = true; /* doesn't work */  
  162.   top.imObject.screenNameHasFocus = false;
  163.   
  164.   // Focus on the compose window on start
  165.   top.document.getElementById("ComposeWnd").contentWindow.focus(); // S. Lang Feb 4, 2005
  166.    
  167.   /**
  168.    * retrieve window arguments, extract IM mode and screen name
  169.    */
  170.  
  171.   args = aimGetArgs(top.arguments[0]);
  172.   top.document.getElementById("IMAttribs").setAttribute("imMode", args.Mode);
  173.  
  174.   /* capture some events, BEFORE editor does */
  175.  
  176.   var bbox = document.getElementById("ComposeWnd");
  177.   if (bbox) { 
  178.     // bugscape bug 10832, Macintosh is not receiveing the keydown properly.
  179.     if (navigator.appVersion.indexOf("Macintosh") != -1)
  180.       bbox.addEventListener("keypress", composeKeyPress, true);
  181.     else
  182.       bbox.addEventListener("keydown", composeKeyPress, true);
  183.   }
  184.     
  185.  
  186.   // set initial timestamp value for this window, and seed the menu item
  187.  
  188.   showTimestampVal = aimPrefsManager().GetBoolPref("aim.general.im.timeStamp", 
  189.     null, false);
  190.  
  191.   SetTimestampMenuItem();
  192.  
  193.   updateCurrentComposeWindow();
  194.  
  195.   window.setTimeout('delayedOnWndLoad()', 0);
  196.   document.getElementById("paragraphMenu").setAttribute("hidden", true);
  197.   document.getElementById("listMenu").setAttribute("hidden", true);
  198.   document.getElementById("decreaseIndent").setAttribute("hidden", true);
  199.   document.getElementById("increaseIndent").setAttribute("hidden", true);
  200.   document.getElementById("alignMenu").setAttribute("hidden", true);
  201.   document.getElementById("tableMenu").setAttribute("hidden", true);
  202.   document.getElementById("objectProperties").setAttribute("hidden", true);
  203.   document.getElementById("removeLinksMenuitem").setAttribute("hidden", true);
  204.   document.getElementById("removeNamedAnchorsMenuitem").setAttribute("hidden", true);
  205.  
  206.   document.getElementById("removeSep").setAttribute("hidden", true);
  207.   document.getElementById("tabSep").setAttribute("hidden", true);
  208.   document.getElementById("identingSep").setAttribute("hidden", true);
  209.   document.getElementById("tableSep").setAttribute("hidden", true);
  210.  
  211.   //hide some insert menuitems
  212.   document.getElementById("insertImage").setAttribute("hidden", true);
  213.   document.getElementById("insertTable").setAttribute("hidden", true);
  214.   document.getElementById("insertAnchor").setAttribute("hidden", true);
  215.   document.getElementById("insertHline").setAttribute("hidden", true);
  216.   document.getElementById("insertHTMLSource").setAttribute("hidden", true);
  217.   document.getElementById("insertChars").setAttribute("hidden", true);
  218.   document.getElementById("insertTOC").setAttribute("hidden", true);
  219.   document.getElementById("insertMenuSeparator").setAttribute("hidden", true);
  220.   document.getElementById("insertBreakAll").setAttribute("hidden", true);
  221.  
  222.   // style the conversation log box
  223.   var logdoc = document.getElementById("LogWnd").contentDocument;
  224.   if (logdoc)
  225.   {
  226.     logdoc.close();
  227.     logdoc.open();
  228.     logdoc.write('<html><head>');
  229.     logdoc.write('<link rel="important stylesheet" href="chrome://aim/content/smileys.css">');
  230.     logdoc.write('</head><body></body></html>');
  231.     logdoc.close();
  232.   }
  233.   else
  234.     dump("chatContentOnWinLoad: couldn't style log window");
  235. }
  236.  
  237. /*
  238.  * Name: delayedOnWndLoad
  239.  * Arguments: None
  240.  * Description: This is code that logically belongs to AimIMOnWndLoad.
  241.  * It must executed after AimIMOnWndLoad has returned to its caller.
  242.  * This was necessary to make the code in this function work. For some
  243.  * reason it did not work when it was placed directly in AimIMOnWndLoad.
  244.  * The theory is, this is caused by the callback mechanism used in this function,
  245.  * which conflicts with the call frame in which AimIMOnWndLoad is executed.
  246.  * Return Value: None
  247.  * Original Code: portions moved from AimIMOnWndLoad, portions Kai Engert 10/2001
  248.  *
  249.  */
  250. function delayedOnWndLoad()
  251. {
  252.   function CapabitiliesObtainer()
  253.   {
  254.   }
  255.  
  256.   CapabitiliesObtainer.prototype = {
  257.  
  258.     OnRequestUserInfoCapabilitiesError: function(aScreenName, ErrMsg)
  259.     {
  260.       // Unable to obtain, do not enable encryption
  261.     },
  262.  
  263.     OnRequestUserInfoCapabilitiesComplete: function(aScreenName, aUserObj)
  264.     {
  265.       var capMask = aUserObj.GetCapabilities();
  266.       var capEnums = Components.interfaces.nsAimCapabilitesMask;
  267.       if (capEnums.secureIM & capMask) {
  268.         var btnLock = document.getElementById("btnLock");
  269.         if (btnLock) {
  270.           btnLock.removeAttribute("hidden");
  271.         }
  272.         /* we don't want to show it, but we use it to keep track of a window's encryption status*/
  273.         var chkboxCrypt = document.getElementById("chkboxCrypt");
  274.         if (chkboxCrypt) {
  275.           chkboxCrypt.checked = true;
  276.           //chkboxCrypt.removeAttribute("hidden");
  277.         }
  278.         var encryptStatus = document.getElementById("encryptStatus");
  279.         if (encryptStatus) {
  280.           encryptStatus.removeAttribute("hidden");
  281.         }
  282.         if (capEnums.unicode & capMask)
  283.         {
  284.           alert("unicode");
  285.           document.getElementById("unicode").setAttribute("value", "1");
  286.         }
  287.         else
  288.         {
  289.           alert("not unicode");
  290.           document.getElementById("unicode").setAttribute("value", "");
  291.         }
  292.       }
  293.     }
  294.   }
  295.  
  296.   args = aimGetArgs(top.arguments[0]);
  297.  
  298.   var locateMgr = aimLocateManager();
  299.   if (locateMgr) {
  300.     try {
  301.       var obtainer = new CapabitiliesObtainer();
  302.       locateMgr.RequestUserInfoCapabilities(obtainer, args.ScreenName);
  303.     } catch (ex) {
  304.       dump("* ERROR: unable to retrieve AIM user capabilities for '"+args.ScreenName+"'\n* REASON: " + ex);
  305.     }
  306.   }
  307.  
  308.   
  309.   /**
  310.    * if knock knock, let user approve it, also, check to see if we should
  311.    * autoreply, and do so if necessary
  312.    */
  313.  
  314.   var pPAimIM = aimPIMObject();
  315.   var screenName = AimIMGetFormScreenName();
  316.   aimIM().SetIMWndIcon(screenName);
  317.  
  318.   if ( args.Mode == "KnockKnock" ) {
  319.     pokeKnockKnockMessage( screenName ); 
  320.   /**
  321.    * we have to set this focus or ok/cancel buttons will not work
  322.    * with the key equivalents. lame
  323.    */
  324.     setTimeout('window.focus()',300);
  325.     return;
  326.   }
  327.   else
  328.     doSetOKCancel(DoNothing, DoNothing);
  329.  
  330.   /**
  331.    * otherwise, do what we have always done
  332.    */
  333.    
  334.   StartConversation();
  335. }
  336.  
  337. function composeKeyPress(event)
  338. {
  339.   var editor = GetCurrentEditor();
  340.   if (!editor)
  341.     return;
  342.  
  343.   var screenName = AimIMGetFormScreenName();
  344.   if (gTypingPref && gSendTypingEvent) {
  345.     aimIM().SetInputStateFlag(gTypingEnum.Typing, screenName);
  346.  
  347.     //reset this variable. we need to set this only if there is a change in typing state.
  348.     gSendTypingEvent = 0;
  349.  
  350.     gSendNonEmptyEvent = 1;
  351.   }
  352.  
  353.   if (gTypingPref) {
  354.     gEditorLength = editor.textLength;
  355.     if (gEditorLength == 0) {
  356.       aimIM().SetInputStateFlag(gTypingEnum.None, screenName);
  357.       gSendTypingEvent = 1;
  358.       gSendNonEmptyEvent = 0;
  359.     }
  360.     else {
  361.       window.clearTimeout(gTypingTimeoutid);
  362.       gTypingTimeoutid = window.setTimeout('CheckTypingState()', 5000);
  363.     }
  364.   }
  365.  
  366.   if (event.keyCode == 46 || event.keyCode == 8)
  367.   {
  368.     /* If user hits backspace or delete key, check if the document will be emptied*/
  369.      checkToDisable();
  370.      return;
  371.   }
  372.     
  373.   // This is how it really should be for control enter 
  374.   // if ((event.ctrlKey) && (event.keyCode == 13))
  375.   // Temporary hack since the above fails. Currently this condition is met by both control-enter 
  376.   // and control-j (Depends bug). Control-j should not send IM -bug tracked in 9007.
  377.   if ((event.ctrlKey) && (event.charCode == 106)) 
  378.   {
  379.      event.preventBubble();
  380.      event.preventDefault();
  381.      if (!editor.documentIsEmpty)
  382.        window.setTimeout('AimIMCmdSend()', 1, true); 
  383.      return false;
  384.    }
  385.    if ((event.keyCode == 13) || (event.keyCode == 10)){ 
  386.       if (event.shiftKey || editor.selection.isCollapsed == false)
  387.          return;
  388.       if (SendOnEnter() == true) { 
  389.          event.preventBubble();
  390.          event.preventDefault();
  391.          /* Make sure user is not sending a empty message */
  392.          if (!editor.documentIsEmpty)
  393.             window.setTimeout('AimIMCmdSend(true)', 1, true); 
  394.          return false; 
  395.        } 
  396.        
  397.       return true;
  398.    } 
  399.    if (event.keyCode == 9) {
  400.     if (OnTab() == true) { 
  401.       if (!editor.documentIsEmpty) {
  402.         document.getElementById('btnSend').focus();
  403.         FocusSend();
  404.        }
  405.        else{
  406.         //send focus to the right field
  407.          var theLogWindow = document.getElementById('LogWnd');
  408.          var theScreenNameField = document.getElementById('fldScreenName')
  409.          var theWindow = document.getElementById('AimIM');
  410.          var theWindowMode = theWindow.getAttribute("imMode")
  411.         if(theWindowMode == "Normal") {
  412.            theScreenNameField.focus();
  413.         }
  414.         if(theWindowMode == "Bound") {
  415.           top.document.getElementById("LogWnd").contentWindow.focus();
  416.         }
  417.        }
  418.       event.preventDefault();
  419.       return false;
  420.  
  421.     } 
  422.     return true;                
  423.    }
  424.    composeSendButtonUpdate();  
  425. }
  426.  
  427. function checkToDisable()
  428. {
  429.   var editor = GetCurrentEditor();
  430.   if (!editor)
  431.     return;
  432.  
  433.   var origLength = editor.textLength;
  434.   /* If there is only one element in the document and the user chooses to delete that element,
  435. then the document will be emptied. Disable send button in this case */      
  436.   if (origLength == 1)
  437.   {
  438.     DisableSendButton();
  439.     return;
  440.   }
  441.   var selection = editor.selection;
  442.   if (!selection)
  443.     return;
  444.   var tempString=new String(selection);
  445.   var selectLength=tempString.length;
  446.   /* If the user chooses to delete all or more than the contents of the document, 
  447. then the document will be emptied. Disable send button in this case */      
  448.   if (origLength <= selectLength)
  449.   {
  450.     DisableSendButton();
  451.     return;
  452.   }
  453. }
  454.  
  455. function composeMenuPaste()
  456. {
  457.   /* If the user chooses Edit->Paste, this function gets called.
  458.   This will enable the send button if the user is online */
  459.   
  460.   var isOnline= aimSession().IsOnline();
  461.   if (isOnline) 
  462.     EnableSendButton();   
  463. }
  464. function composeSendButtonUpdate()
  465. {
  466.   // Give time for editor to update the document after mouse events
  467.   setTimeout("checkcomposeSend()", 5);
  468. }
  469.  
  470. function checkcomposeSend()
  471. {
  472.   var editor = GetCurrentEditor();
  473.   if (editor && editor.textLength > 0)
  474.      EnableSendButton();
  475.   else 
  476.      DisableSendButton();
  477. }
  478.  
  479. function DoNothing()
  480. {
  481.   return false;
  482. }
  483.  
  484. function CancelConversation()
  485. {
  486.     args = aimGetArgs(top.arguments[0]);
  487.     var screenName = AimIMGetFormScreenName();
  488.     var session = aimSession();
  489.     if ( session ) {
  490.       session.AddKnockKnockReject(screenName);
  491.     }
  492.     window.close();
  493. }
  494.  
  495. function StartConversation()
  496. {
  497.   doSetOKCancel(DoNothing, DoNothing);
  498.     args = aimGetArgs(top.arguments[0]);
  499.     var screenName;
  500.     var displayName; 
  501.   
  502.   var isKnockKnock = false;
  503.     if(args.ScreenName)
  504.         screenName= args.ScreenName;
  505.     else
  506.         screenName = "";
  507.  
  508.     if(args.DisplayName)
  509.         displayName= args.DisplayName;
  510.     else
  511.         displayName = "";
  512.  
  513.     if(args.Message) {
  514.         message= args.Message;
  515.     }
  516.     else
  517.         message = "";
  518.  
  519.     if ( args.Mode == "KnockKnock" ) {
  520.     var session = aimSession();
  521.     if ( session ) {
  522.       session.AddKnockKnockAccept(screenName);
  523.     }
  524.     args.Mode = "Bound";
  525.     isKnockKnock = true;
  526.     if ( AimOnlineAway())
  527.       ComeBack();   // return from away state if we are in it
  528.   }
  529.   
  530.   top.document.getElementById("IMAttribs").setAttribute("imMode", args.Mode);
  531.   top.imObject.logHasFocus = false;
  532.   //top.imObject.editorHasFocus = true;   /* XXX */
  533.  
  534.   var editorElement = document.getElementById("ComposeWnd");
  535.   if (!editorElement)
  536.     return;
  537.  
  538.   EditorSharedStartup();
  539.   var commandManager = GetCurrentCommandManager();
  540.  
  541.   try {
  542.     commandManager.addCommandObserver(gIMEditorStateObserver, "obs_documentCreated");
  543.     commandManager.addCommandObserver(gIMEditorStateObserver, "cmd_setDocumentModified");
  544.  
  545.     // Load empty page to create the editor
  546.     editorElement.webNavigation.loadURI("about:blank", // uri string
  547.                          0,                            // load flags
  548.                          null,                         // referrer
  549.                          null,                         // post-data stream
  550.                          null);
  551.   } catch (e) {
  552.     dump(" Failed to startup editor: "+e+"\n");
  553.   }
  554.  
  555.   top.document.getElementById("fldScreenName").value = screenName;
  556.   top.document.getElementById("fldDisplayName").value = displayName;
  557.  
  558.     // if we have a screen name, put the focus on the content window
  559.     // otherwise, put the focus in the "To:" field
  560.  
  561.   if(screenName != "") {
  562. //    setTimeout('contentWindow.focus()',300);
  563.     top.imObject.editorHasFocus = true; 
  564.     LoadBuddyIcon(screenName);
  565.   }
  566.   else {
  567.     //setTimeout('top.document.getElementById("fldScreenName").focus()', 350);
  568.       setTimeout("DoFocusAdjust()",200);
  569.       
  570.   }
  571.     
  572.   AimIMSetFormScreenName(screenName, displayName);
  573.   // XXX For some reason, we need to refresh the title after the
  574.   // onload handler or it won't change
  575.   setTimeout('AimIMRefreshScreenName()', 10);
  576.  
  577.   SetTimestampMenuItem();
  578.  
  579.   // since we overlay the edit menu from the editorOverlay.xul file,
  580.   // we have to reset the oncommad to be AIM specific
  581.  
  582.   var pPAimIM = aimPIMObject();
  583.   if(pPAimIM) {
  584.     if(args.setWantBI)
  585.       pPAimIM.OnWindowLoad(screenName, top, sendAwayMessage, true);
  586.     else
  587.       pPAimIM.OnWindowLoad(screenName, top, sendAwayMessage, false);
  588.     if ( sendAwayMessage == true ) {
  589.       var curVal = aimPrefsManager().GetBoolPref("aim.away.autoreply", null, false);
  590.             if ( curVal == true )
  591.         pPAimIM.SendAwayMessageMaybe(AimIMGetFormScreenName(), top);
  592.       sendAwayMessage = false;
  593.     }
  594.   }
  595.   
  596.     setTimeout("setStyles()", 100);
  597.  
  598. /*
  599.   var theLogNode = top.frames['LogWnd'];
  600.   var myRange = theLogNode.document.createRange();
  601.   var theLogHead = theLogNode.document.getElementsByTagName("head").item(0);
  602.   myRange.setStartAfter(theLogHead);
  603.   var docFrag;
  604.   docFrag = myRange.createContextualFragment("<style type='text/css'>body.timestampHidden span.logtimestamp { display: none}</style>");
  605.   theLogHead.appendChild(docFrag);
  606. */
  607.  
  608.   if (commandManager && isIcq()) {//ICQ
  609.    unregisterCommand(commandManager, "cmd_indent");
  610.    unregisterCommand(commandManager, "cmd_outdent");
  611.    unregisterCommand(commandManager, "cmd_bold");
  612.    unregisterCommand(commandManager, "cmd_italic");
  613.    unregisterCommand(commandManager, "cmd_underline");
  614.    unregisterCommand(commandManager, "cmd_tt");
  615.    unregisterCommand(commandManager, "cmd_strikethrough");
  616.    unregisterCommand(commandManager, "cmd_superscript");
  617.    unregisterCommand(commandManager, "cmd_subscript");
  618.    unregisterCommand(commandManager, "cmd_nobreak");
  619.    unregisterCommand(commandManager, "cmd_em");
  620.    unregisterCommand(commandManager, "cmd_strong");
  621.    unregisterCommand(commandManager, "cmd_cite");
  622.    unregisterCommand(commandManager, "cmd_abbr");
  623.    unregisterCommand(commandManager, "cmd_acronym");
  624.    unregisterCommand(commandManager, "cmd_code");
  625.    unregisterCommand(commandManager, "cmd_samp");
  626.    unregisterCommand(commandManager, "cmd_var");
  627.    unregisterCommand(commandManager, "cmd_ol");
  628.    unregisterCommand(commandManager, "cmd_ul");
  629.    unregisterCommand(commandManager, "cmd_dt");
  630.    unregisterCommand(commandManager, "cmd_dd");
  631.    unregisterCommand(commandManager, "cmd_removeList");
  632.    unregisterCommand(commandManager, "cmd_paragraphState");
  633.    unregisterCommand(commandManager, "cmd_fontFace");
  634.    unregisterCommand(commandManager, "cmd_fontColor");
  635.    unregisterCommand(commandManager, "cmd_backgroundColor");
  636.    unregisterCommand(commandManager, "cmd_highlight");
  637.    unregisterCommand(commandManager, "cmd_align");
  638.    unregisterCommand(commandManager, "cmd_removeStyles");
  639.    unregisterCommand(commandManager, "cmd_increaseFont");
  640.    unregisterCommand(commandManager, "cmd_decreaseFont");
  641.   }
  642. }
  643.  
  644. /*
  645.  * gIMEditorStateObserver is the listener which the IM compose window uses.
  646.  * NotifyDocumentCreated gets called by the editor after the editor is created and
  647.  *    document is built.
  648.  * If there is any IM message from the input arguments, then that is added 
  649.  *    to the compose window and the send button is enabled.
  650. */
  651. var gIMEditorStateObserver =
  652.   observe: function(aSubject, aTopic, aData)
  653.   {
  654.     var editor = GetCurrentEditor();
  655.     var commandManager = GetCurrentCommandManager();
  656.     if (!editor || !commandManager || commandManager != aSubject)
  657.       return;
  658.     
  659.     switch (aTopic)
  660.     {
  661.       case "obs_documentCreated":
  662.         //XXX Do we need an init call to C++ here?
  663.         //gMsgCompose.initEditor(editor, window.content);
  664.  
  665.         setTimeout("sendButtonListeners()",100);
  666.         var nsIPlaintextEditor = Components.interfaces.nsIPlaintextEditor;
  667.         editor.flags |= nsIPlaintextEditor.eEditorNoCSSMask;
  668.  
  669.         if (message)
  670.         {
  671.           editor.insertHTML(message);
  672.           EnableSendButton();
  673.         }
  674.  
  675.         //see bugzilla bug 112960 for why we have a timeout call
  676.         setTimeout("setStyles()", 100);
  677.         break;
  678.  
  679.       case "cmd_setDocumentModified":
  680.        
  681.         var commandParams = newCommandParams();
  682.         if (commandParams)
  683.         {
  684.          
  685.           /*
  686.           if (!commandManager) {
  687.               dump("**** commandManager not found in IM.js ****\n");
  688.           }
  689.                     
  690.           commandManager.getCommandState("cmd_setDocumentModified", top.frames['ComposeWnd'], commandParams);
  691.           
  692.           dump("**** Completed commandManager.getCommandState in IM.js ****\n");
  693.           */
  694.           // commandManager.getCommandState("cmd_setDocumentModified",  commandParams);  
  695.           // SLang Jan 11/05
  696.         
  697.         //  Commented SLang Feb 4/05  
  698.          // if (commandParams.getBooleanValue("state_attribute"))
  699.          //   EnableSendButton();
  700.         }
  701.         
  702.         break;
  703.     }
  704.   }
  705. }
  706.  
  707.  
  708. function DoFocusAdjust()
  709. {
  710.   var ScrElement=document.getElementById("fldScreenName");
  711.   if (top.imObject.screenNameHasFocus == false)
  712.     setTimeout("DoFocusAdjust()",100);
  713.   if (ScrElement.value == "")
  714.   {
  715.     ScrElement.focus();
  716.     top.imObject.screenNameHasFocus=true;
  717.     return;
  718.   }
  719.  
  720. }
  721. function AimIMOnWndUnload()
  722. {
  723.   // XXX See note at the top of the file
  724.   if(gFirstTime == 1)
  725.     return;
  726.   var screenName = AimIMGetFormScreenName();
  727.   var pPAimIM = aimPIMObject();
  728.   if(pPAimIM)
  729.     pPAimIM.OnWindowUnload(screenName, top);
  730.  
  731.   // send the none input state flag
  732.   aimIM().SetInputStateFlag(gTypingEnum.None, screenName);
  733.  
  734. }
  735.  
  736. function AimIMCmdSend(strip)
  737. {
  738.   AimIMSetFormAction(true);
  739.   var isOnline= aimSession().IsOnline();
  740.   if (!isOnline) {
  741.     if (!isIcq())
  742.       aimErrorBox(aimString("msg.LogInToSendIM"));
  743.     else
  744.       aimErrorBox(aimString("msg.LogInToSendIM_ICQ"));
  745.  
  746.     // MERC: SL - this XUL window left incomplete
  747.     // toOpenWindowByType('Aim:AimApp', 'chrome://aim/content/App.xul');
  748.     return false;
  749.   }
  750.   var screenName = AimIMGetFormScreenName();
  751.   var displayName = AimIMGetFormDisplayName();
  752.  
  753.   if ( !screenName || screenName == "" ) {
  754.     if (isIcq() == false) {
  755.       aimErrorBox(aimString("msg.EmptyScreenName"));
  756.       }
  757.     else {
  758.       aimErrorBox(aimString("msg.EmptyScreenName_ICQ"));
  759.       }
  760.  
  761.     top.document.getElementById("fldScreenName").focus();
  762.     return false;
  763.   }
  764.   
  765.   if (firstSend) {
  766.     var cp = new String(screenName);
  767.     if (!IsValidChar(cp)){
  768.       // Cannot contain invalid characters 
  769.       aimErrorBox(aimString("msg.InvalidScreenName"));
  770.       top.document.getElementById("fldScreenName").focus();
  771.       return false;
  772.     }
  773.   }
  774.  
  775.  
  776.   if(!AimIMIsBound() ) {
  777.     // XXX Should be handled when blur works.
  778.     AimIMSetFormScreenName(top.document.getElementById("fldScreenName").value, top.document.getElementById("fldDisplayName").value);
  779.     screenName = AimIMGetFormScreenName();
  780.   }
  781.   
  782.   var bodyText;
  783.   var plainBodyText = null;
  784.   var editor = GetCurrentEditor();
  785.   if (!editor)
  786.     return;
  787.  
  788.   if (aimPrefsManager().GetSessionType()  == 2) {//ICQ
  789.     plainBodyText = editor.outputToString("text/plain", 2);
  790.     // because of bug in dom text serializer, last call inserts additional new line at the end
  791.     // we need to eliminate it
  792.     plainBodyText = plainBodyText.replace(/\r\n$|\r$|\n$/, "");
  793.     if (plainBodyText) {
  794.       var icqMsgLength = plainBodyText.length;
  795.       if (icqMsgLength > 1024) {
  796.         aimErrorBox(aimString("msg.BigIM").replace(/%BigBy%/, ""+ (icqMsgLength-1024)));
  797.         return;
  798.       }
  799.     }
  800.   }
  801.  
  802.   var bodyText = editor.outputToString("text/html", 8 + 4);
  803.  
  804.   /* smiley conversion */
  805.   bodyText = bodyText.replace(/<\/span><\/span>/g,  " ");
  806.   bodyText = bodyText.replace(/<span class="moz-smiley-s[0-9][0-9]?"><span>/g, " ");
  807.  
  808.   // *** placeholder for getting strip pref.
  809.   //var strip=true
  810.  
  811.     bodyText = bodyText.replace(/<br>/gi, "");
  812.     bodyText = bodyText.replace(/\n/g, "");
  813.     bodyText = bodyText.replace(/\r/g, "");
  814.  
  815.   bodyText = bodyText.replace(/\n/g, "");
  816.   bodyText = bodyText.replace(/\r/g, "");
  817.   bodyText = bodyText.replace(/<big>/gi, "<font size=\"+1\">");
  818.   bodyText = bodyText.replace(/<\/big>/gi, "<\/font>");
  819.   bodyText = bodyText.replace(/<small>/gi, "<font size=\"-1\">");
  820.   bodyText = bodyText.replace(/<\/small>/gi, "<\/font>");
  821.   bodyText = bodyText.replace(/<br><br>/gi, "<br>");
  822.   bodyText = bodyText.replace(/<br><\/body>/i, "<\/body>");
  823.   bodyText = bodyText.replace(/\u00a0/gi, " ");
  824.  
  825.  
  826.   var backgroundcolor = document.getElementById("cmd_backgroundColor");
  827.   if (backgroundcolor) {
  828.     backgroundcolor = backgroundcolor.getAttribute("state");
  829.     bodyText = bodyText.replace(/<body bgcolor[^>]*>/gi, "<body><font BACK=\"" + backgroundcolor +"\"> ");
  830.     bodyText = bodyText.replace(/<\/body>/gi, "<\/font><\/body>");
  831.   }
  832.   
  833.   if (bodyText) {
  834.     var imMsgLength = bodyText.length;
  835.     if (imMsgLength > 1024) {
  836.       aimErrorBox(aimString("msg.BigIM").replace(/%BigBy%/, ""+ (imMsgLength-1024)));
  837.       return;
  838.     }
  839.   }
  840.  
  841.   if (AimOnlineAway())
  842.     ComeBack();   // if away, come back
  843.  
  844.   if (firstSend) {
  845.     //if it is the first msg we are sending...load the BI. This shd execute for only the first outgoing IM.
  846.     LoadBuddyIcon(screenName);
  847.     aimIM().SetIMWndIcon(screenName);
  848.     firstSend = 0;
  849.   }
  850.  
  851.   aimIM().SetInputStateFlag(gTypingEnum.None, screenName);
  852.   gSendNonEmptyEvent = 0;
  853.  
  854.   aimPIMSendIM(top, screenName, bodyText, plainBodyText);
  855.  
  856.   var session = aimSession();
  857.   if ( session )
  858.     session.AddKnockKnockAccept( screenName );
  859.   
  860.   gTypingPref = checkTypingPref();
  861.   editor.selectAll();
  862.   getStyles();
  863.   editor.deleteSelection(null);
  864.   /* After the contents have been emptied, disable the send button*/
  865.   DisableSendButton();
  866.   setStyles();
  867.    
  868.   //*** return focus to editor after clicking send ***
  869.   top._content.focus();
  870.   return true;
  871. }
  872.  
  873. function AimIMIsBound()
  874. {
  875.   var mode = AimIMGetFormMode();
  876.  
  877.   if("Bound" == mode)
  878.     return true;
  879.   return false;
  880. }
  881.  
  882. function AimIMUpdateWarningPercent()
  883. {
  884.   //AimIMUpdateWarningPercent
  885. }
  886.  
  887. //************ Form Accessors ****************
  888.  
  889. function AimIMGetFormMode()
  890. {
  891.   return top.document.getElementById("IMAttribs").getAttribute("imMode");
  892. }
  893.  
  894. function AimIMGetFormScreenName()
  895. {
  896.   //var myScreenName = top.document.getElementById("IMAttribs").getAttribute("imScreenName");
  897.   //if (!myScreenName || myScreenName == "") {
  898.     myScreenName = top.document.getElementById("fldScreenName").value;
  899.     if (!myScreenName || myScreenName == "" || myScreenName == undefined)
  900.       if(args && args.ScreenName)
  901.         myScreenName = args.ScreenName;
  902.   //}
  903.  
  904.   return myScreenName;
  905. }
  906.  
  907.  
  908. function AimIMGetFormDisplayName()
  909. {
  910.     var myDisplayName = top.document.getElementById("fldDisplayName").value;
  911.     if (!myDisplayName || myDisplayName == "" || myDisplayName == undefined)
  912.       if(args && args.DisplayName)
  913.         myDisplayName = args.DisplayName;
  914.   return myDisplayName;
  915. }
  916.  
  917.  
  918. function AimIMRefreshScreenName()
  919. {
  920.   AimIMSetFormScreenName(top.document.getElementById('fldScreenName').value, top.document.getElementById('fldDisplayName').value);
  921. }
  922.  
  923. function toKeyPress(event) 
  924. {
  925.    switch(event.keyCode) {
  926.    case 9: 
  927.      if (!event.shiftKey) {
  928.        var SN = top.document.getElementById('fldScreenName').value;
  929.        if (SN && SN != "")
  930.         LoadBuddyIcon(SN);
  931.        window._content.focus();
  932.        event.preventDefault();
  933.      }
  934.      break;
  935.    case 13:
  936.      var SN = top.document.getElementById('fldScreenName').value;
  937.      if (SN && SN != "")
  938.       LoadBuddyIcon(SN);
  939.      window._content.focus();
  940.      break;
  941.    }
  942. }
  943.  
  944.  
  945. function AimIMSetFormScreenName(screenName, displayName)
  946. {
  947.   var pPAimIM = aimPIMObject();
  948.   if(pPAimIM)
  949.     pPAimIM.OnWindowScreenNameChange(screenName, top);
  950.   var title;
  951.  
  952.   if("" == screenName || !screenName) {
  953.     if (isIcq() == true)
  954.       title = aimString("icq.title.Unbound");
  955.     else
  956.       title = aimString("im.title.Unbound");
  957.   }
  958.   else {
  959.     if (isIcq() == true) {
  960.       if ((displayName == "") || (!displayName))
  961.         title = aimString("icq.title.Bound").replace(/%ScreenName%/, screenName);
  962.       else
  963.         title = aimString("icq.title.Bound").replace(/%ScreenName%/, displayName+", "+ screenName);
  964.     }
  965.     else {
  966.       if ((displayName == "") || (!displayName))
  967.         title = aimString("im.title.Bound").replace(/%ScreenName%/, screenName);
  968.       else
  969.         title = aimString("im.title.Bound").replace(/%ScreenName%/, displayName+", "+ screenName);
  970.     }
  971.   }
  972.  
  973.   top.title = title;
  974. }
  975.  
  976. function AimIMSetFormAction(action)
  977. {
  978.   top.document.getElementById("IMAttribs").setAttribute("imAction", action);
  979. }
  980.  
  981. //***********  Window Resizing *****************
  982.  
  983. function AimIMWindowResize(sWidth,sHeight){
  984.   top.resizeTo(sWidth,sHeight)
  985. }
  986.  
  987.  
  988.  
  989. //************  Command Handling ****************
  990.  
  991. function cmdFileNewIM()
  992. {
  993.   aimIMInvokeIMForm(null);
  994. }
  995.  
  996. function cmdEditCut()
  997. {
  998.   if ( top.imObject.editorHasFocus == true  ) {
  999.     EditorCut();
  1000.   }
  1001. }
  1002.  
  1003. function cmdEditCopy()
  1004. {
  1005.   if ( top.imObject.logHasFocus == true ) {
  1006.     //Focus window is log wnd
  1007.   } 
  1008.   else if ( top.imObject.editorHasFocus == true  ) {
  1009.     //Focus window is edit wnd
  1010.     EditorCopy();
  1011.   }
  1012. }
  1013.  
  1014. function cmdEditPaste()
  1015. {
  1016.   if ( top.imObject.editorHasFocus == true  ) {
  1017.   //Focus window is edit wnd
  1018.     EditorPaste();
  1019.   }
  1020. }
  1021.  
  1022. function cmdEditSelectAll()
  1023. {
  1024.   if ( top.imObject.logHasFocus == true ) {
  1025.     //Focus window is log wnd
  1026.   } 
  1027.   else if ( top.imObject.editorHasFocus == true  ) {
  1028.     //Focus window is edit wnd
  1029.     EditorSelectAll();
  1030.   }
  1031. }
  1032.  
  1033. function cmdAddressBook()
  1034. {
  1035.   // XXX DOES THIS STILL WORK, IS IT STILL NEEDED?
  1036.   var screenName = AimIMGetFormScreenName();
  1037.   var card = aimABInfo().getPersonalAbCardFromAttribute("_AimScreenName", screenName, false);
  1038.   // if no card, should we create one?    
  1039.   goEditCardDialog("moz-abmdbdirectory://abook.mab", card, null);
  1040. }
  1041.  
  1042. function cmdPeopleSendChatInvitation()
  1043. {
  1044.   //dump("Implement Menu Command cmdPeopleSendChatInvitation()\n");
  1045. }
  1046.  
  1047.  
  1048.  
  1049. function cmdPeopleBlock()
  1050. {
  1051.   var screenName = AimIMGetFormScreenName();
  1052.     if( !screenName )
  1053.       return false;
  1054.   var pIAimPrivacy = aimPrivacy();
  1055.   if ( !pIAimPrivacy )
  1056.     return false;
  1057.   pIAimPrivacy.BlockUser( screenName );
  1058.   return true;
  1059. }
  1060.  
  1061. function cmdPeopleUnblock()
  1062. {
  1063.   var screenName = AimIMGetFormScreenName();
  1064.     if( !screenName )
  1065.       return false;
  1066.   var pIAimPrivacy = aimPrivacy();
  1067.   if ( !pIAimPrivacy )
  1068.     return false;
  1069.   pIAimPrivacy.UnblockUser( screenName );
  1070.   return true;
  1071. }
  1072.  
  1073. function cmdAddABuddy()
  1074. {
  1075.   openDialog("chrome://aim/content/BuddyAddBuddy.xul", "", "modal=yes,titlebar,chrome", null, null, AimIMGetFormScreenName());
  1076.   
  1077. }
  1078.  
  1079. function cmdCmdWarn()
  1080. {
  1081.   //dump("Implement Menu Command cmdCmdWarn()\n");
  1082. }
  1083.  
  1084. /**** routines to track Focus */
  1085.  
  1086. function composeWndFocus(boolval)
  1087. {
  1088.   if ( top.imObject )
  1089.     top.imObject.editorHasFocus = boolval;
  1090.   if (boolval) {
  1091.     var SN = top.document.getElementById('fldScreenName').value;
  1092.     if (SN && SN != "")
  1093.       LoadBuddyIcon(SN);
  1094.   }
  1095. }
  1096.  
  1097. function logWndFocus(boolval)
  1098. {
  1099.   if ( top.imObject )
  1100.     top.imObject.logHasFocus = boolval;
  1101. }
  1102.  
  1103. function AimIMFldScreenNameFocus(focus)
  1104. {
  1105.   if(false == focus)
  1106.     AimIMSetFormScreenName(top.document.getElementById("fldScreenName").value, top.document.getElementById("fldDisplayName").value);
  1107. }
  1108.  
  1109. function SendOnEnter()
  1110. {
  1111.   // if enterCR_pref_value is true, the pref was set so that enter was a CR
  1112.   // if enterCR_pref_value is false, the user wants enter to send the IM message
  1113.   try {
  1114.     pref = aimPrefsManager();
  1115.     enterCR_pref_value = pref.GetBoolPref("aim.general.im.enterCR", null, false);
  1116.   }
  1117.   catch (ex) {
  1118.     // default to be "send on enter key"
  1119.     enterCR_pref_value = true;
  1120.   }
  1121.   return (!enterCR_pref_value);
  1122. }
  1123.  
  1124. function OnTab()
  1125.   try {
  1126.     Tab_pref_value = aimPrefsManager().GetBoolPref("aim.general.im.tabKey", null, false);
  1127.   }
  1128.   catch (ex) {
  1129.     // default 
  1130.     Tab_pref_value = true;
  1131.   }
  1132.   return (!Tab_pref_value);
  1133. }
  1134.  
  1135. function EnableSendButton()
  1136. {
  1137.   top.document.getElementById("btnSend").setAttribute("disabled", "false");
  1138.   top.document.getElementById("cmd_Send").setAttribute("disabled", "false");
  1139. }
  1140.  
  1141. function DisableSendButton()
  1142. {
  1143.   top.document.getElementById("btnSend").setAttribute("disabled", "true");
  1144.   top.document.getElementById("cmd_Send").setAttribute("disabled", "true");
  1145.   UnFocusSend();
  1146.  
  1147. function UnFocusSend()
  1148. {
  1149.   top.document.getElementById("btnSend").removeAttribute("focus-ring");
  1150. }
  1151.  
  1152. function FocusSend()
  1153. {
  1154.   top.document.getElementById("btnSend").setAttribute("focus-ring", "true");
  1155. }
  1156.  
  1157. function sendButtonListeners()
  1158. {
  1159.   /* Add listeners to cut , copy and paste items in menu and context menu */
  1160.   var delmenu=document.getElementById("menu_delete");
  1161.   if (delmenu)
  1162.     delmenu.addEventListener("mouseup", checkToDisable, true);
  1163.   var cutmenu=document.getElementById("menu_cut");
  1164.   if (cutmenu)
  1165.     cutmenu.addEventListener("mouseup", checkToDisable, true);   
  1166.   var pastemenu=document.getElementById("menu_paste");
  1167.   if (pastemenu)
  1168.     pastemenu.addEventListener("mouseup", composeMenuPaste , true);    
  1169.   var cmdelmenu=document.getElementById("menu_delete_cm");
  1170.   if (cmdelmenu)
  1171.     cmdelmenu.addEventListener("mousedown", checkToDisable, true);
  1172.   var cmcutmenu=document.getElementById("menu_cut_cm");
  1173.   if (cmcutmenu)
  1174.     cmcutmenu.addEventListener("mousedown", checkToDisable, true);   
  1175.   var cmpastemenu=document.getElementById("menu_paste_cm");
  1176.   if (cmpastemenu)
  1177.     cmpastemenu.addEventListener("mousedown", composeMenuPaste , true);    
  1178.  var bbox = document.getElementById("ComposeWnd");
  1179.   if (bbox) {
  1180.     bbox.addEventListener("mousedown", composeSendButtonUpdate, true);
  1181.     bbox.addEventListener("mouseup", composeSendButtonUpdate, true);
  1182.     bbox.addEventListener("dragdrop", composeSendButtonUpdate, true);
  1183.   }
  1184.  
  1185. }
  1186.  
  1187.  
  1188. function converseKeyCodeListener()
  1189. {
  1190.   if (event.keyCode == 13 || event.keyCode == 9) 
  1191.   {
  1192.     aimAutoCompleteAddress('aimScreenNameType', 'fldScreenName');
  1193.     window._content.focus();
  1194.     setTimeout('AimIMRefreshScreenName()',50);
  1195.     return true;
  1196.   } 
  1197.   setTimeout('AimIMRefreshScreenName()',50);
  1198.   return false;
  1199. }
  1200.  
  1201.  
  1202. //////////////////////////////////////////////////////////////////////////////
  1203. // IM Log Context Menu helper routines --> The following routines are used by
  1204. // the context menu in the IM log overlay...
  1205. //////////////////////////////////////////////////////////////////////////////
  1206.  
  1207. function initializeIMLogContextPane(aContextMenu)
  1208. {
  1209.   // our base nsContextMenu class is going to take care of enabling/disabliing all our menu items
  1210.   // for us. All we need to do is make sure we show and hide the appropriate separators...
  1211.  
  1212.   aContextMenu.showItem( "context-sep-open", aContextMenu.onSaveableLink || (aContextMenu.inDirList && aContextMenu.onLink));
  1213.   aContextMenu.showItem( "context-sep-bookmark", aContextMenu.onLink );
  1214.   aContextMenu.showItem( "context-sep-save", aContextMenu.onSaveableLink || aContextMenu.onImage);
  1215. }
  1216.  
  1217.  
  1218. function LoadBuddyIcon(screenname)
  1219. {
  1220.   var aimPrefs = aimPrefsManager();
  1221.   if (aimPrefs)
  1222.     var biValue = aimPrefs.GetIntPref("aim.buddyicon.displayBuddyIcons", null, false);
  1223.   else
  1224.     return;
  1225.  
  1226.   //check for Never *display* BI pref before displaying...
  1227.   // 0 - Aceept BI from users in Buddy list.
  1228.   // 1 - Never accept BI
  1229.   // 2 - Never *display* BI's.
  1230.   if (biValue == 2)
  1231.     return;
  1232.   if ((screenname == "") || (screenname == null)) {
  1233.     return;
  1234.   }
  1235.  
  1236.   var nimSession = aimSession();
  1237.   var pictDir = nimSession.profileDir;
  1238.   var biPath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  1239.   biPath.initWithPath(pictDir.path);
  1240.   biPath.append("picture");
  1241.   if (!biPath.exists()) {
  1242.     return;
  1243.   }
  1244.   biPath.append(screenname+".gif");
  1245.   if (!biPath.exists()) {
  1246.     //The buddy doesn't have BI.
  1247.     return;
  1248.   }
  1249.  
  1250.   var fileHandler = GetFileHandler();
  1251.   var bifileurl = fileHandler.getURLSpecFromFile(biPath);
  1252.     
  1253.   var currentTime = new Date().getTime();
  1254.   var BIfield = top.document.getElementById("BuddyIcon");
  1255.   BIfield.setAttribute("src", bifileurl+"?foobar="+currentTime);
  1256. }
  1257.  
  1258.  
  1259. function GetFileHandler()
  1260. {
  1261.   var IOService = Components.classes["@mozilla.org/network/io-service;1"]
  1262.                .getService(Components.interfaces.nsIIOService);
  1263.  
  1264.   return IOService.getProtocolHandler("file")
  1265.                   .QueryInterface(Components.interfaces.nsIFileProtocolHandler);
  1266. }
  1267.  
  1268. function updateCurrentComposeWindow()
  1269. {
  1270.   if (isIcq() == true ) {
  1271.     document.getElementById('icqDisplayFields').setAttribute('hidden', false);
  1272.     document.getElementById('fldDisplayName').setAttribute('hidden', false);
  1273.     var elems = document.getElementById("sessionComposeWatcher");
  1274.     elems.setAttribute("sessionMode", "Icq"); 
  1275.     var icqval=document.getElementById('composetoolbarmenu').getAttribute('icqlabel','value');
  1276.     document.getElementById('composetoolbarmenu').setAttribute('label', icqval);
  1277.     icqval=document.getElementById('AimIM').getAttribute('icqtitle','value');
  1278.     document.getElementById('AimIM').setAttribute('title', icqval);
  1279.     icqval=document.getElementById('menu_newMsg').getAttribute('icqlabel','value');
  1280.     document.getElementById('menu_newMsg').setAttribute('label', icqval);
  1281.     icqval=document.getElementById('menu_peopleadd').getAttribute('icqlabel','value');
  1282.     document.getElementById('menu_peopleadd').setAttribute('label', icqval);
  1283.     icqval=document.getElementById('tbAddBuddy').getAttribute('icqlabel','value');
  1284.     document.getElementById('tbAddBuddy').setAttribute('label', icqval);
  1285.     icqval=document.getElementById('tbAddBuddy').getAttribute('icqtooltip','value');
  1286.     document.getElementById('tbAddBuddy').setAttribute('tooltiptext', icqval);
  1287.     icqval=document.getElementById('btnSend').getAttribute('icqtooltip','value');
  1288.     document.getElementById('btnSend').setAttribute('tooltiptext', icqval);
  1289.     icqval=document.getElementById('tbBlock').getAttribute('icqlabel','value');
  1290.     document.getElementById('tbBlock').setAttribute('label', icqval);
  1291.     icqval=document.getElementById('tbBlock').getAttribute('icqtooltip','value');
  1292.     document.getElementById('tbBlock').setAttribute('tooltiptext', icqval);
  1293.     document.getElementById('formatMenu').setAttribute('hidden', true);
  1294.     document.getElementById('insertMenu').setAttribute('hidden', true);
  1295.   }
  1296. }
  1297.  
  1298. function checkTypingPref()
  1299. {
  1300.   var prefmask = aimFeedbagManager().GetBuddyPrefs();
  1301.   if (prefmask & Components.interfaces.nsAimBuddyPrefs.DiscloseTyping)
  1302.     return true;
  1303.   else
  1304.     return false;
  1305. }
  1306.  
  1307. function CheckTypingState()
  1308. {
  1309.   var editor = GetCurrentEditor();
  1310.   if (!editor)
  1311.     return;
  1312.   var newLength = editor.textLength;
  1313.   //SURESH: This is bit hacky. My guess is something is wrong with the way editor returns for textLength.
  1314.   //gEditorLength is off by 1 when you type something or backspace. :(
  1315.   if (gSendNonEmptyEvent && newLength > 0 && ((newLength == gEditorLength + 1) || (newLength == gEditorLength - 1))) {
  1316.     var screenName = AimIMGetFormScreenName();
  1317.     aimIM().SetInputStateFlag(gTypingEnum.NotEmpty, screenName);
  1318.     gSendTypingEvent = 1;
  1319.  
  1320.     //reset the non empty typing event, so that it is not sent for every key press
  1321.     gSendNonEmptyEvent = 0;
  1322.   }
  1323.  
  1324.  
  1325. }
  1326.  
  1327. function openUILinkIM(url, where)
  1328. {
  1329.   var gPrefService = null;
  1330.   
  1331.   if ((url == null) || (url == "")) 
  1332.     return;
  1333.   // xlate the URL if necessary
  1334.   if (url.indexOf("urn:") == 0) {
  1335.       url = xlateURL(url);        // does RDF urn expansion
  1336.   }
  1337.   // avoid loading "", since this loads a directory listing
  1338.   if (url == "") {
  1339.       url = "about:blank";
  1340.   }
  1341.  
  1342.   if (where == "default") {
  1343.  
  1344.      gPrefService = Components.classes["@mozilla.org/preferences-service;1"]
  1345.                              .getService(Components.interfaces.nsIPrefBranch);
  1346.    
  1347.      var openPref = gPrefService.getCharPref("browser.tabs.localfile.open");
  1348.  
  1349.      if (openPref == "overwrite")
  1350.          where = "current";
  1351.      else {
  1352.         where = "tab";    // openPref == "new" is default
  1353.      }    
  1354.      gPrefService = null;
  1355.   }   
  1356.    
  1357.   var w = (where == "window") ? null : getTopWin();
  1358.   if (!w) {
  1359.     openDialog(getBrowserURL(), "_blank", "chrome,all,dialog=no", url);
  1360.     return;
  1361.   }
  1362.   var browser = w.document.getElementById("content");
  1363.  
  1364.   switch (where) {
  1365.   case "current":
  1366.     browser.loadURI(url);
  1367.     w._content.focus();
  1368.     break;
  1369.   case "tabshifted":
  1370.   case "tab":
  1371.     var tab = browser.addTabAt(url);
  1372.  
  1373.  
  1374.     if (!getBoolPref("browser.tabs.loadInBackground", false)) {
  1375.       browser.selectedTab = tab;
  1376.       w._content.focus();
  1377.     }
  1378.  
  1379.     break;
  1380.   }
  1381. }