home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 May / 05_02.iso / software / netscape6 / nim.xpi / bin / chrome / aim.jar / content / aim / chatContent.js < prev    next >
Encoding:
JavaScript  |  2001-07-06  |  27.5 KB  |  938 lines

  1. // globals
  2.  
  3. var invitedScreenNames = window.arguments[0].invitedScreenNames;
  4. dump('got invitedScreenNames'+invitedScreenNames+"\n\n")    
  5. var chatRoomName= window.arguments[0].chatRoomName;
  6. dump('got chatRoomName'+chatRoomName+"\n\n")    
  7. var chatLanguage= window.arguments[0].chatLanguage;
  8. dump('got chatLanguage'+chatLanguage+"\n\n")    
  9. var chatMsg = window.arguments[0].chatMsg;
  10. dump("got chatMsg "+chatMsg+"\n\n")
  11. var chatPanelLoaded = false;
  12.  
  13. var chatFromURL = window.arguments[0].fromurl;                          
  14. var chatExchange = window.arguments[0].exchange;                        
  15. var chatInstance = window.arguments[0].instance; 
  16. // globals for invite
  17.  
  18. var incomingChat = window.arguments[0].incomingChat;
  19. var inviteProposalScreenName = window.arguments[0].incomingChatInviteProposalScreenName;
  20. var inviteProposalObj= window.arguments[0].incomingChatInviteProposalObj;
  21.     
  22. // globals for conversion
  23.      
  24.     var smileyCodes = new Array(7);
  25.     smileyCodes[0] = /:-?\)/g;
  26.     smileyCodes[1] = /:-D/g;
  27.     smileyCodes[2] = /:-?\(/g;
  28.     smileyCodes[3] = /:-\[/g;
  29.     smileyCodes[4] = /;-?\)/g;
  30.     smileyCodes[5] = /:-\\/g;
  31.     smileyCodes[6] = /:-P/g;
  32.  
  33.     var smileyImgs = new Array('<img src="chrome://editor/content/images/smile_n.gif" class="moz-txt-smily" height=19 width=19 align=ABSCENTER>',
  34.                                '<img src="chrome://editor/content/images/laughing_n.gif" class="moz-txt-smily" height=19 width=19 align=ABSCENTER>',
  35.                                '<img src="chrome://editor/content/images/frown_n.gif" class="moz-txt-smily" height=19 width=19 align=ABSCENTER>',
  36.                                '<img src="chrome://editor/content/images/embarrassed_n.gif" class="moz-txt-smily" height=19 width=19 align=ABSCENTER>',
  37.                                '<img src="chrome://editor/content/images/wink_n.gif" class="moz-txt-smily" height=19 width=19 align=ABSCENTER>',
  38.                                '<img src="chrome://editor/content/images/undecided_n.gif" class="moz-txt-smily" height=19 width=19 align=ABSCENTER>',
  39.                                '<img src="chrome://editor/content/images/tongue_n.gif" class="moz-txt-smily" height=19 width=19 align=ABSCENTER>');
  40.  
  41.  
  42. // timestamp
  43.     
  44. var IDateTime = Components.classes["@mozilla.org/intl/scriptabledateformat;1"].createInstance();
  45. var aDateTime = IDateTime.QueryInterface(Components.interfaces.nsIScriptableDateFormat);
  46.  
  47. //ChatRoomManager setup 
  48. //         ***start***
  49. function chatRoomMemberObj(screenName,status,ignored,blocked){
  50.     this.screenName=screenName;
  51.     this.status=status;
  52.     this.ignored=ignored;
  53.     this.blocked=blocked;
  54.     return this;
  55. }
  56.  
  57.  
  58. function chatRoomManagerObj(){
  59.     this.members = new Array();
  60.     this.roomname = "";
  61.     
  62.     return this;
  63.     }    
  64.  
  65. function chatRoomManagerAddMember(managerObj,membername,status,ignored,blocked){
  66.     managerObj.members[managerObj.members.length] = new chatRoomMemberObj(membername,status,ignored,blocked);
  67.     dump("chatRoomManagerAddMember: "+membername+"\n");
  68. }
  69.  
  70. function chatRoomManagerShowMembers(managerObj){
  71.     for(i=0;i<managerObj.members.length;i++){
  72.         alert(managerObj.members[i].screenName);
  73.     }
  74. }
  75.  
  76. function chatRoomManagerDelMember(managerObj,membername){
  77.     var tempMembersArray = new Array();
  78.     for(k=0;k<managerObj.members.length;k++){
  79.         if(managerObj.members[k].screenName.toLowerCase() == membername.toLowerCase()){
  80.             //copy members to new Array, except for deleted one.
  81.             for(m=0;m<managerObj.members.length;m++){
  82.                 if(m!=k){
  83.                     tempMembersArray[tempMembersArray.length] = managerObj.members[m];    
  84.                 }
  85.             }
  86.             //swap old array with new one.
  87.             managerObj.members = tempMembersArray;
  88.         }
  89.     }
  90.         dump("chatRoomManagerDelMember: "+membername+"\n");
  91.  
  92.     
  93. }
  94.  
  95. function chatRoomManagerUpdateMember(managerObj,membername,status){
  96.     var changedFlag = false;
  97.         for(i=0;i<managerObj.members.length;i++){
  98.             if(managerObj.members[i].screenName.toLowerCase()==membername.toLowerCase()){
  99.                 managerObj.members[i].status = status
  100.                 changedFlag=true;
  101.             }
  102.  
  103.         }
  104.         if(!changedFlag){
  105.             //didnt change anyone - must not be here yet!
  106.             chatRoomManagerAddMember(managerObj,membername,status,false,false)
  107.         }
  108.         
  109.         dump("chatRoomManagerUpdateMember[of "+managerObj.members.length+" ]: "+membername+"\n");
  110.  
  111. }
  112.  
  113.  
  114.  var myManager = new chatRoomManagerObj();
  115.  
  116. //ChatRoomManager setup ***end***
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123. // Setup Callbacks
  124.  
  125.  
  126. //Setup Room Callbacks (basically event capturing)
  127.  
  128. var RoomCallback= new Object();
  129.  
  130. RoomCallback.OnMessageReceived = function(screenName, rcvdMsg, language){
  131.     dump("OnMessageReceived:"+rcvdMsg+"\n");
  132.     dump (screenName + " SAYETH " + rcvdMsg + " IN " + language +"\n");
  133.     chatContentRecieveMsg(screenName,rcvdMsg)
  134. }
  135.  
  136. RoomCallback.OnWhisperReceived = function(screenName,  rcvdWhispMsg, language){
  137.     dump("OnWhisperReceived:"+rcvdWhispMsg+"\n");
  138.     chatContentRecieveMsg(screenName,rcvdWhispMsg)
  139. }
  140.  
  141.  
  142. RoomCallback.OnLeft = function(errorMsg){
  143.     dump("Onleft: error["+errorMsg+"] \n");
  144.     chatContentReceiveStatus(null, aimString("chat.YouLeft").replace(/%ChatRoom%/, chatRoomName));
  145.     updateStatus(aimString("chat.YouLeft").replace(/%ChatRoom%/, chatRoomName));
  146. }
  147.  
  148. RoomCallback.OnJoined = function(){
  149.     dump("OnJoin: \n")
  150.     dump("Yes I Joined\n");
  151.     chatContentReceiveStatus(null, aimString("chat.YouJoined").replace(/%ChatRoom%/, chatRoomName));
  152.     updateStatus(aimString("chat.YouJoined").replace(/%ChatRoom%/, chatRoomName));
  153.  
  154. }
  155.  
  156. RoomCallback.OnUserJoined = function(screenName){
  157.   dump("OnUserJoined:"+screenName+"\n");
  158.   updateStatus(aimString("chat.OnUserJoined").replace(/%ScreenName%/, screenName));
  159.     //update their status in the list
  160.     top.frames['chatpanel'].chatPanelUpdateScreenName(screenName,"joined treecell-iconic")
  161.     
  162.     //update their status in the global obj
  163.     chatRoomManagerUpdateMember(myManager,screenName,"joined")
  164.     try {
  165.         chatAnnounce_pref=aimPrefsManager().GetBoolPref("aim.chat.AnnounceChatRoom", null, false);
  166.         }
  167.         catch (ex) {
  168.             chatAnnounce_pref = true;
  169.            }
  170.  
  171.     var currentScreenName = aimSessionCurrentScreenName();      
  172.     if ((chatAnnounce_pref && (currentScreenName != screenName)))
  173.     {
  174.         chatContentReceiveStatus(screenName, aimString("chat.OnUserJoined").replace(/%ScreenName%/,""));
  175.     }
  176.     chatRoomManagerUpdateMember(myManager,screenName,"joined treecell-iconic")
  177.  
  178. }
  179.  
  180. RoomCallback.OnUserLeft = function(screenName){
  181.   dump("OnUserLeft:"+screenName+"\n");
  182.   updateStatus(aimString("chat.OnUserLeft").replace(/%ScreenName%/, screenName));
  183.     top.frames['chatpanel'].chatPanelRemoveScreenName(screenName)
  184.     //update global obj
  185.     chatRoomManagerDelMember(myManager,screenName)
  186.  
  187.     var chatAnnounce_pref;
  188.     try {
  189.         chatAnnounce_pref=aimPrefsManager().GetBoolPref("aim.chat.AnnounceChatRoom", null, false);
  190.         }
  191.     catch (ex) {
  192.            chatAnnounce_pref = true;
  193.         }
  194.     if (chatAnnounce_pref)
  195.     {
  196.         chatContentReceiveStatus(screenName, aimString("chat.OnUserLeft").replace(/%ScreenName%/, ""));
  197.     }
  198.     
  199.     
  200. }
  201.  
  202. RoomCallback.OnPaused = function(){
  203.     dump("OnPaused: \n");
  204.     //chatContentReceiveStatus(null,aimString("chat.RoomPaused"));
  205.     updateStatus(aimString("chat.RoomPaused"));
  206.  
  207. }
  208.  
  209. RoomCallback.OnResumed = function(){
  210.     dump("OnResumed: \n");
  211.     //chatContentReceiveStatus(null,aimString("chat.RoomResumed"));
  212.     updateStatus(aimString("chat.RoomResumed"));
  213. }
  214.  
  215. RoomCallback.OnInfoUpdate = function(){
  216.     dump("OnInfoUpdate: \n")
  217.     
  218. }
  219.  
  220. RoomCallback.OnClientError = function(screenName,errMsg){
  221.     dump("OnClientError: error["+screenName+" : "+errMsg+"]\n");
  222.     //chatContentReceiveStatus(screenName,aimString("chat.ClientError"));
  223.     updateStatus(aimString("chat.ClientError").replace(/%ScreenName%/, screenName));
  224. }
  225.  
  226.  
  227. // end Setup Room Callback
  228.  
  229.  
  230.  
  231.  
  232. // Setup ChatManager Callback 
  233.  
  234. var CallBack = new Object();
  235. var RoomCreationTimeStamp = null;
  236. CallBack.title = aimString("chat.WindowTitle");
  237.  
  238. CallBack.OnRequestRoomComplete =  function(roomName,chatRoomObj){
  239.     dump("OnRequestRoomComplete: success on "+roomName+"\n");
  240.     dump("chatRoomObj"+chatRoomObj+"\n")
  241.     RoomCreationTimeStamp= new Date();
  242.     chatRoomObj.SetChatRoomCallback( RoomCallback )
  243.     top.chatRoomObj = chatRoomObj;
  244.     
  245.     dump("roomName is " + roomName + "\n");
  246.     dump("chatRoomName is " + chatRoomName + "\n");
  247.     dump("roomObjName is " + chatRoomObj.GetName() + "\n");
  248.  
  249.     if (roomName)
  250.         window.title= aimString("chat.WindowTitle").replace(/%ChatRoom%/, roomName);
  251.     else if (chatRoomName)
  252.         window.title= aimString("chat.WindowTitle").replace(/%ChatRoom%/, chatRoomName);
  253.     else if (chatRoomObj.GetName())
  254.         window.title= aimString("chat.WindowTitle").replace(/%ChatRoom%/, chatRoomObj.GetName());
  255.     
  256.     window.setTimeout('top.chatRoomObj.Join()', 1000);
  257.     if(invitedScreenNames)
  258.         window.setTimeout('chatContentInviteMany(invitedScreenNames,chatMsg)',1500);
  259.     //window.setTimeout('top.chatRoomObj.SendMessage("This is working!!")', 30000);
  260.     //window.setTimeout('top.chatRoomObj.SendWhisper("trip004", "Private message for vishy26aug")', 30000);
  261.     
  262. }
  263.  
  264.  
  265. CallBack.OnRequestRoomError =  function(roomName,errMsg){
  266.     dump("OnRequestRoomError: there was an error \n");
  267.  
  268. }
  269.  
  270. CallBack.OnProposalReceived = function(screenName,proposalObj){
  271.     dump("OnProposalReceived:"+screenName+"  \n");
  272.  
  273. }
  274.  
  275.  
  276.  
  277. //Chat Sound handling
  278.  
  279. function chatSound(msg)
  280. {
  281.     aimSoundManager().ChatEvent(msg);
  282. }
  283.  
  284. // first thing to do on startup
  285.  
  286. function chatContentStartup(){
  287.  
  288.     pChatManager = aimChatManager();
  289.     if (!pChatManager)
  290.     {
  291.         dump("chatContentStartup:unable to get pChatManager\n");
  292.         return;
  293.     }
  294.     else{
  295.             dump("chatContentStartup:got  pChatManager\n");
  296.  
  297.     }
  298.  
  299.  
  300.     dump("chatContentStartup: calling pChatManager.GetMaxConcurrentRooms\n");
  301.  
  302.     var rooms = new Object();
  303.     
  304.     try {
  305.         dump("trying pChatManager.GetMaxConcurrentRooms(rooms) \n");
  306.         pChatManager.GetMaxConcurrentRooms(rooms);
  307.         }
  308.     catch (e){
  309.         dump("!!!!! catching js error during pChatManager.GetMacConcurrentRooms !!!!! \n")
  310.         dump ("rooms.label: "+rooms.label + "\n");
  311.     
  312.     }
  313.     
  314.     
  315.  
  316. // got chatroom name from arguments passed to the opendialog
  317.  
  318.  
  319.     if(incomingChat){
  320. /*
  321.         try {
  322.             dump("chatContentStartup: trying pChatManager.RequestProposedRoom\n");
  323.             dump("inviteProposalObj:"+inviteProposalObj+"\n");
  324.  
  325.             pChatManager.RequestProposedRoom(CallBack, inviteProposalObj);
  326.         }
  327.         catch (e){
  328.             dump("chatContentStartup: error loading pChatManager.RequestProposedRoom\n");
  329.     
  330.             alert("There was an error loading the Chat window");
  331.         }    
  332. */
  333.         dump("About to CallbackIncoming\n");
  334.         CallBack.OnRequestRoomComplete(window.arguments[0].chatRoomName, window.arguments[0].incomingChatRoom);    
  335.  
  336.     }
  337.     else {    
  338.         try {
  339.             if(chatFromURL && (chatExchange != 0)) {                                               
  340.                 pChatManager.RequestRoom(CallBack, chatRoomName, chatLanguage, chatExchange, chatInstance)
  341.             }                                                               
  342.                 else { 
  343.                 dump("chatContentStartup: trying pChatManager.RequestPrivateRoom\n");
  344.                 pChatManager.RequestPrivateRoom(CallBack,chatRoomName, chatLanguage)
  345.             }
  346.         }
  347.         catch (e){
  348.             dump("chatContentStartup: E = " + e + "\n");
  349.             alert("There was an error loading the Chat window");
  350.         }    
  351.     }
  352. }
  353.  
  354. // One more level of callback in order that chat manager can be ready
  355. myExecutionCallback = new Object();
  356. myExecutionCallback.ExecuteIfReady = function()
  357. {
  358. // get chatroom and callbacks
  359.       dump ("before chatContentStartup\n");
  360.     chatContentStartup();
  361.     dump("after Chatcontentstartup\n");
  362.     
  363.     // startup the ender widget
  364.     startUpEditor(document.getElementById("ComposeWnd"));
  365.     
  366.     updateMemberCount();
  367.     //chatContentAddMsgToLog('goober','hi');
  368.  
  369.     try{
  370.         if(!chatFromURL)
  371.             window.opener.close();
  372.     }
  373.     catch (e){
  374.         dump("chat: where's my invite window?? \n")
  375.     }    
  376. }
  377.  
  378. // after the window has loaded:
  379.  
  380. function chatContentOnWinLoad(){
  381.  
  382.     var bbox = document.getElementById("ComposeWnd");
  383.     if (bbox)
  384.     { 
  385.       bbox.addEventListener("keypress", composeKeyPress, true);
  386.     }
  387.  
  388.     aimChatManager().OnWindowLoad(top);
  389.     aimChatManager().ExecuteIfReady(myExecutionCallback);
  390.     
  391.     
  392.  
  393. }
  394.  
  395. function composeKeyPress(event)
  396. {
  397.   if (event.keyCode == 13) { 
  398.  
  399.     if (SendOnEnter() == true) { 
  400.         event.preventBubble();
  401.         event.preventDefault(); 
  402.         window.setTimeout('chatContentSendMsg()', 1, true); 
  403.         return false; 
  404.         } 
  405.     return true;
  406.   } 
  407.  
  408.   if (event.keyCode == 9) {
  409.  
  410.     if (OnTab() == true) { 
  411.       document.getElementById('btnSend').focus();
  412.       event.preventDefault();
  413.       return false;
  414.       }
  415.     return true;        
  416.   }
  417.             
  418. }
  419.  
  420. // window is closing
  421.  
  422. function chatContentOnWinUnLoad(){
  423.     aimChatManager().OnWindowUnload(top);
  424.     try{
  425.         top.chatRoomObj.Leave()
  426.         }
  427.     catch (e){
  428.         dump("chat: there was an error trying to call chatRoomObj.leave() \n");
  429.     }    
  430.  
  431. }    
  432.  
  433.  
  434.  
  435. function startUpEditor(editorElement){
  436.  
  437.     if (!editorElement) {
  438.         dump("No editor element found\n");
  439.         return;
  440.     }
  441.     
  442.     var editorShell = editorElement.editorShell;
  443.     if(editorShell) {            
  444.         // save the editorShell in the window. The editor JS expects to find it there.
  445.         window.editorShell = editorShell;
  446.  
  447.         //SetupToolbarElements(); //defined into editor.js
  448.         window.editorShell.editorType = "html";
  449.  
  450.         window.editorShell.contentWindow = window._content;
  451.         window.editorShell.webShellWindow = window;
  452.         window.editorShell.LoadUrl("chrome://aim/content/blank.html");
  453.         EditorSharedStartup();
  454.     } else {
  455.         dump("No editorShell found\n");
  456.         return;
  457.     }
  458. }
  459.  
  460.  
  461. // updates the number of chat members (use after an add or delete member)
  462.  
  463. function updateMemberCount(){
  464.         //theTree = document.getElementById("cptChildren");
  465.         
  466.         var theTreeChildren = top.frames["chatpanel"].document.getElementsByTagName("treecell")
  467.         var activeMembers=0;
  468.         
  469.         for(i=0 ; i<theTreeChildren.length;i++){
  470.             
  471.             dump("updateMemberCount:class "+theTreeChildren.item(i).getAttribute("class")+"\n")
  472.             dump("updateMemberCount:label "+theTreeChildren.item(i).getAttribute("label")+"\n")
  473.             
  474.             if(theTreeChildren.item(i).getAttribute("class") == "joined treecell-iconic"){
  475.                 activeMembers++;
  476.             }
  477.         }
  478.         
  479.         //dump("theTreeNode"+theTree+" \n")
  480.         theMemberCountNode=document.getElementById("numberchatting")
  481.         
  482.         if(activeMembers!=1){
  483.           theMemberCountNode.setAttribute("label", aimString("chat.PeopleHere").replace(/%NumPeople%/, activeMembers));
  484.         }
  485.         else{
  486.           theMemberCountNode.setAttribute("label", aimString("chat.PersonHere"));
  487.         }
  488. }
  489.  
  490.  
  491.  
  492. //send your message out
  493. function SendOnEnter()
  494. {
  495.     // if enterCR_pref_value is true, the pref was set so that enter was a CR
  496.         // if enterCR_pref_value is false, the user wants enter to send the IM message
  497.     try {
  498.         enterCR_pref_value = aimPrefsManager().GetBoolPref("aim.general.im.enterCR", null, false);
  499.     }
  500.     catch (ex) {
  501.         // default to be "send on enter key"
  502.         enterCR_pref_value = true;
  503.     }
  504.     
  505.     return (!enterCR_pref_value);
  506. }
  507.  
  508. function OnTab()
  509. {
  510.     var Tab_pref_value = false;
  511.     try {
  512.         Tab_pref_value = aimPrefsManager().GetBoolPref("aim.general.im.tabKey", null, false);
  513.     }
  514.     catch (ex) {
  515.         // default
  516.         Tab_pref_value = true;
  517.     }
  518.  
  519.     return (!Tab_pref_value);
  520. }
  521.  
  522. /* Name: getMaxIndividualMessage
  523.  *
  524.  * Arguments: 
  525.  *      none.
  526.  * Return Value:
  527.  *      maxIndividualMessageLength -- maximum length of an individual chat message.
  528.  *
  529.  * Description:
  530.  *      This function caches maxIndividuaMessageLength, and calls
  531.  *      nsIAimChatRoom::GetMaxIndividualMessageLength if the cache is empty.
  532.  *
  533.  * Author:
  534.  *      Joseph Elwell 07/04/2001
  535.  * 
  536. */
  537. var maxIndividualMessageLength = -1;
  538. function getMaxIndividualMessage(){
  539.         if (maxIndividualMessageLength == -1) {
  540.                 maxIndividualMessageLength = top.chatRoomObj.GetMaxIndividualMessageLength();
  541.         }
  542.         return maxIndividualMessageLength;
  543. }
  544.         
  545. function chatContentSendMsg(strip){
  546.  
  547.      if (top.editorShell.documentLength > getMaxIndividualMessage())
  548.     {
  549.          var bigChatError = aimString("msg.BigChat").replace(/%BigBy%/, ""+(top.editorShell.documentLength-getMaxIndividualMessage()));
  550.          bigChatError = bigChatError.replace(/471/, ""+(getMaxIndividualMessage()));
  551.          aimErrorBox(bigChatError);
  552.          return;
  553.      }
  554.  
  555.     var bodyText = editorShell.GetContentsAs("text/html", 8 + 4);
  556.         
  557.     /* smiley conversion */
  558.     bodyText = bodyText.replace(/<\/span><\/span>/g,  " ");
  559.     bodyText = bodyText.replace(/<span -moz-smiley="s[0-9][0-9]?"><span>/g, " ");
  560.     
  561.     // *** placeholder for getting strip pref.
  562.     //var strip=true
  563.  
  564.     if ( strip == true ) {
  565.         bodyText = bodyText.replace(/<br>/gi, "");
  566.         bodyText = bodyText.replace(/\n/g, "");
  567.         bodyText = bodyText.replace(/\r/g, "");
  568.     }
  569.  
  570.     bodyText = bodyText.replace(/\n/g, "");
  571.     bodyText = bodyText.replace(/\r/g, "");
  572.         bodyText = bodyText.replace(/<big>/gi, "<font size=\"+1\">");
  573.         bodyText = bodyText.replace(/<\/big>/gi, "<\/font>");
  574.         bodyText = bodyText.replace(/<small>/gi, "<font size=\"-1\">");
  575.         bodyText = bodyText.replace(/<\/small>/gi, "<\/font>");
  576.     bodyText = bodyText.replace(/<br><br>/gi, "<br>");
  577.     bodyText = bodyText.replace(/<br><\/body>/i, "<\/body>");
  578.     bodyText = bodyText.replace(/\u00a0/gi, " ");
  579.     
  580.     //chatContentAddMsgToLog('noone',bodyText)
  581.  
  582.         try {
  583.             top.chatRoomObj.SendMessage(bodyText);
  584.         } catch( ex ) {
  585.                 aimErrorBox(aimString("chat.SendError"));
  586.                 return;
  587.         }
  588.  
  589.     top.editorShell.SelectAll();
  590.     top.editorShell.DeleteSelection(null);
  591.     //*** return focus to editor after clicking send ***
  592.     
  593.     
  594.     top._content.focus();
  595.  
  596.     //Chat Send Sound to hook
  597.     dump("Outgoing Sound works!\n");
  598.         chatSound(Components.interfaces.nsAimChatSoundEvent.ChatSoundEvent_OutgoingMsg);    
  599.  
  600. }
  601.  
  602.  
  603.  
  604. // handle incoming messages
  605.  
  606. function chatContentRecieveMsg(screenName,msg){
  607.     var chatflash=false;         
  608.     try {
  609.         chatflash=aimPrefsManager().GetBoolPref("aim.chat.FlashChatWin", null, false); 
  610.     }
  611.     catch (ex) {
  612.         chatflash = true;
  613.     }               
  614.     if (chatflash)
  615.             top.window.GetAttention();
  616.  
  617.     msg = msg.replace(/<pre>/gi, "");
  618.     msg = msg.replace(/<\/pre>/gi, "");
  619.     chatContentAddMsgToLog(screenName,msg,true)
  620.  
  621.     //Chat Receive Sound to Hook
  622.     dump("INCOMING SOUND\n");
  623.     if (screenName != aimSessionCurrentScreenName()) {
  624.         chatSound(Components.interfaces.nsAimChatSoundEvent.ChatSoundEvent_IncomingMsg);
  625.     }
  626. }
  627.  
  628. function chatContentReceiveStatus(screenName, msg) {
  629.   chatContentAddMsgToLog(screenName,msg,false);
  630. }
  631.  
  632. // sub timestamp generation
  633. function getTimeStampStr(){
  634.  
  635.     var timestampFeature = aimPrefsManager().GetBoolPref("aim.general.im.timeStamp", null, false);
  636.  
  637.     var strTimestamp;
  638.  
  639.     
  640.     if (timestampFeature){
  641.         
  642.         var curTime = new Date();
  643.     
  644.         var curHours   = curTime.getHours();  
  645.         var curMinutes = curTime.getMinutes();
  646.         var curSeconds = curTime.getSeconds();
  647.            
  648.         strTimestamp = aDateTime.FormatTime("",                                
  649.                                aDateTime.timeFormatSeconds,
  650.                                curHours, 
  651.                                curMinutes, 
  652.                                curSeconds);
  653.     
  654.         return "(" + strTimestamp + ")";
  655.     
  656.     }
  657.     else
  658.         return "";
  659.  
  660. }
  661.  
  662.  
  663. // sub function conversion smiley codes to images
  664. function convertToSmileyImg(msg){
  665.     var count;
  666.  
  667.     for (count = 0; count < smileyCodes.length; count++)        
  668.         msg = msg.replace(smileyCodes[count], smileyImgs[count] );
  669.     
  670.     return msg;
  671.  
  672. }
  673.  
  674. // sub function of chatContentRecieveMsg
  675. function chatContentAddMsgToLog(screenName,msg,isMsg){
  676.     // There is no contract id for this interface now. mscott/myself will add one later and change this.
  677.     var moz = Components.classesByID["{77c0e42a-1dd2-11b2-8ebf-edc6606f2f4b}"];
  678.     var moztxt = moz.createInstance(Components.interfaces.mozITXTToHTMLConv);
  679.     var iface = Components.interfaces.mozITXTToHTMLConv;
  680.     var mozURL = iface.kURLs;
  681.     
  682.      var smileyFeatureEnabled = aimPrefsManager().GetBoolPref("aim.general.im.smilies", null, false);
  683.      
  684.      if (smileyFeatureEnabled)
  685.          msg = convertToSmileyImg(msg);
  686.  
  687.     var timeStampStr = getTimeStampStr();
  688.  
  689.     var theLogNode = top.frames['LogWnd']
  690.     
  691.     var myRange = theLogNode.document.createRange();
  692.     var theLogBody =theLogNode.document.getElementsByTagName("body").item(0)
  693.         myRange.setStartAfter(theLogBody);
  694.     var docFrag;
  695.     // XXXVISHY - this handles info messages also
  696.     if (screenName) {
  697.       var colorpre = " ";
  698.       var colorpost = " </b> ";
  699.       if(msg)
  700.         msg = moztxt.scanHTML(msg, mozURL);
  701.       if (isMsg) // otherwise it is a status
  702.       {
  703.           if (screenName.toLowerCase() == aimSessionCurrentScreenName()) 
  704.             colorpre = '<font color=\"#ff0000\">';
  705.           else
  706.             colorpre = '<font color=\"#0000ff\">';
  707.             
  708.           colorpost = '</b>: </font>';
  709.  
  710.           docFrag = myRange.createContextualFragment("<html>" + colorpre + "<b>"+ screenName + timeStampStr + colorpost+ msg+"</html><br>");
  711.  
  712.       }
  713.       else
  714.          docFrag = myRange.createContextualFragment("<html>" + colorpre + "<b>"+ timeStampStr + screenName + colorpost+ msg+"</html><br>");
  715.     } else
  716.         docFrag = myRange.createContextualFragment("<html><b>"+ timeStampStr + "</b>" + msg+"</html><br>");
  717.       
  718.   var prevdocHeight = theLogNode.document.height;
  719.   var isLocked=((theLogNode.scrollY + theLogNode.innerHeight) >= theLogNode.document.height) 
  720.                   || (( theLogNode.document.height - theLogNode.scrollY ) <= 5)
  721.     theLogBody.appendChild(docFrag)
  722.             
  723.     
  724.   if (isLocked){
  725.     if ((theLogNode.innerHeight - (prevdocHeight-theLogNode.scrollY)) <= 5)
  726.                 return;
  727.     if ((theLogNode.innerHeight < theLogNode.document.height) && (theLogNode.scrollY == prevdocHeight))
  728.                return;
  729.  
  730.       theLogNode.scrollTo(theLogNode.scrollX, theLogNode.document.height)
  731.     }
  732.     
  733. }
  734.  
  735.  
  736.  
  737.  
  738.  
  739.  
  740. //send info to the status area
  741. // defunct!
  742. function updateStatus(statusMsg){
  743.     var statusTextNode= document.getElementById("statustext");
  744.     statusTextNode.setAttribute("value",statusMsg);
  745.  
  746. }
  747.  
  748.  
  749. // handle status changes
  750.  
  751. function chatContentStatusChange(screenName,statusItem){
  752.   //updateStatus(screenName+": "+statusItem)    
  753. }
  754.  
  755.  
  756. /*** Handle Proposal and ProposalOwner for Chat Invitations ***/
  757. var proposals = new Array(); // of all the open proposals;
  758. var aproposal = new Object();
  759.  
  760. function AimProposalOwner()
  761. {
  762.         this.OnProposalAcked = function( 
  763.               pProposal) 
  764.     { dump("OnProposalAcked"); }
  765.         
  766.         this.OnProposalError = function( 
  767.               pProposal,
  768.               pErrMsg) 
  769.     { aimErrorBox(aimString("chat.NotAvailable").replace(/%ScreenName%/, pProposal.GetProposee())); 
  770.     top.frames['chatpanel'].chatPanelRemoveScreenName(pProposal.GetProposee());
  771.     chatRoomManagerDelMember(myManager,pProposal.GetProposee());
  772.     }
  773.         
  774.         this.OnProposalAccepted = function( 
  775.               pProposal) 
  776.     { dump("OnProposalAccepted"); }
  777.         
  778.         this.OnProposalRejected = function(  pProposal)
  779.     { dump("OnProposalRejected");
  780.     aimErrorBox(aimString("chat.Declined").replace(/%ScreenName%/, pProposal.GetProposee()));
  781.     top.frames['chatpanel'].chatPanelRemoveScreenName(pProposal.GetProposee());
  782.     chatRoomManagerDelMember(myManager,pProposal.GetProposee());
  783.     }
  784.               
  785.         this.OnProposalCountered = function( 
  786.               pProposal,
  787.               pCounterProposal) 
  788.     { dump("OnProposalCountered"); }
  789.  
  790.         this.OnProposalTimeout = function(  pProposal)
  791.     { aimErrorBox(aimString("chat.TimedOut"));
  792.     
  793.     top.frames['chatpanel'].chatPanelRemoveScreenName(pProposal.GetProposee());
  794.     chatRoomManagerDelMember(myManager,pProposal.GetProposee());
  795.     }   
  796.  
  797.         this.OnProposalCancelled = function( 
  798.               pProposal)
  799.     { dump("OnProposalCancelled"); 
  800.     top.frames['chatpanel'].chatPanelRemoveScreenName(pProposal.GetProposee());
  801.     chatRoomManagerDelMember(myManager,pProposal.GetProposee());
  802.     }
  803.  
  804.     return this;
  805. }
  806.  
  807. // handle many invitations
  808. function chatContentInviteMany(inviteList,chatMsg){
  809.     // convert carriage returns and newlines to commas 
  810.     inviteList = inviteList.replace(/\n/gi, ",");
  811.     inviteList = inviteList.replace(/\r/gi, ",");
  812.  
  813.     inviteArray=inviteList.split(",")
  814.     for(inviteItem = 0; inviteItem<inviteArray.length; inviteItem++){
  815.         //test to make sure the name isnt empty
  816.         if(itemTest(inviteArray[inviteItem])){
  817.         
  818.             dump("Inviting["+inviteArray[inviteItem]+"]\n")
  819.             
  820.             aproposal = top.chatRoomObj.Invite(inviteArray[inviteItem], chatMsg);
  821.             proposals[proposals.length] = aproposal;
  822.             dump("proposals.length is " + proposals.length + "\n")
  823.             proposals[proposals.length-1].SetOwner(new AimProposalOwner());
  824.             dump("proposals.length is " + proposals.length + "\n");
  825.             //proposals.length++;
  826.             
  827.             top.frames['chatpanel'].chatPanelUpdateScreenName(inviteArray[inviteItem],"invited treecell-iconic")
  828.         
  829.             chatRoomManagerAddMember(myManager,inviteArray[inviteItem],"invited treecell-iconic",false,false)
  830.         
  831.             dump("Invited: "+inviteArray[inviteItem]+"\n");
  832.         }
  833.     }
  834.     
  835.  
  836. }
  837.  
  838.  
  839.  
  840. function itemTest(inviteItem){
  841.     var passed = true;
  842.  
  843.  
  844.     switch(inviteItem) {
  845.     
  846.         case "": 
  847.         case " ": passed = false;
  848.         break;
  849.         
  850.     
  851.     }
  852.  
  853.  
  854.     dump("itemTest: "+passed+"\n");
  855.     return passed;
  856. }
  857.  
  858. // pop up invitation window:
  859.  
  860. function cmdPopUpInvite(screenNames){
  861.     //window.openDialog('chrome://aim/content/chatInviteBuddy.xul','inviteBuddy','chrome,all,dialog=no','',true,"outgoingchat"); 
  862.  
  863.      var isOnline = aimSession().IsOnline();
  864.      if ( isOnline == false ) {
  865.              window.close();
  866.              aimErrorBox(aimString("chat.NotOnline"));
  867.      } else {
  868.              var language = aimString("aim.LanguageCode");    
  869.              inviteArgsObj = {
  870.                 inviteProposalScreenName: '', 
  871.                 inviteProposalObj: null,
  872.                 invitedScreenNames: screenNames,
  873.                 inviteToExistingWindow: true,
  874.                 inviteMode: 'outgoingchat',
  875.                 inviteToExistingRoom: chatRoomName,
  876.                 inviteLanguage: language
  877.              }
  878.                         
  879.              window.openDialog('chrome://aim/content/chatInviteBuddy.xul','inviteBuddy','chrome,all,dialog=no',inviteArgsObj); 
  880.      }
  881. }
  882.  
  883. // display room info
  884.  
  885. function cmdRoomInfo(){
  886.     window.openDialog('chrome://aim/content/chatRoomInfo.xul','inviteBuddy','chrome,all,dialog=no,resizable=no,titlebar',chatRoomName, top.chatRoomObj.GetLanguage(), top.chatRoomObj.GetMaxMessageLength(),RoomCreationTimeStamp.toLocaleString()); 
  887. }
  888.  
  889. function createInstance( contractid, iidName )
  890. {
  891.     var iid = eval( "Components.interfaces." + iidName );
  892.         return Components.classes[ contractid ].createInstance( iid );
  893. }
  894.  
  895.  
  896. function cmdFilePrint()
  897. {
  898.     dump("Implement Menu Command cmdFilePrint()\n");
  899.     top.frames["LogWnd"].print();
  900. }
  901.  
  902.  
  903. function fixScrolling(){
  904.     var LogWindow = top.frames["LogWnd"]
  905.     var pageY = LogWindow.pageYOffset
  906.     var docHeight = LogWindow.innerHeight
  907.  
  908. }
  909.  
  910.  
  911. function cmdViewTimestamp()
  912. {
  913.     var timestampItem = top.document.getElementById("miTimestamp");
  914.  
  915.     var currentVal = aimPrefsManager().GetBoolPref("aim.general.im.timeStamp" , null, false );
  916.     if ( currentVal == true ){
  917.         aimPrefsManager().SetBoolPref("aim.general.im.timeStamp", false , null, false);
  918.         timestampItem.setAttribute("label", aimString("miTimestamp.Show"));
  919.     }
  920.     else {
  921.         aimPrefsManager().SetBoolPref("aim.general.im.timeStamp", true , null, false);
  922.         timestampItem.setAttribute("label", aimString("miTimestamp.Hide"));
  923.     }
  924. }
  925.  
  926. function cmdCreateTimestamp()
  927. {
  928.     var timestampItem = top.document.getElementById("miTimestamp");
  929.  
  930.     var currentVal = aimPrefsManager().GetBoolPref("aim.general.im.timeStamp" , null, false );
  931.     if ( currentVal == true ){
  932.          timestampItem.setAttribute("label", aimString("miTimestamp.Hide")); 
  933.         }
  934.     else {
  935.          timestampItem.setAttribute("label", aimString("miTimestamp.Show"));
  936.         }
  937. }
  938.