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 / chatContent.js < prev    next >
Text File  |  2006-01-06  |  26KB  |  797 lines

  1. // globals
  2.  
  3. var invitedScreenNames = window.arguments[0].invitedScreenNames;
  4. var chatRoomName= window.arguments[0].chatRoomName;
  5. var chatLanguage= window.arguments[0].chatLanguage;
  6. var chatMsg = window.arguments[0].chatMsg;
  7. var chatPanelLoaded = false;
  8.  
  9. var chatFromURL = window.arguments[0].fromurl;                          
  10. var chatExchange = window.arguments[0].exchange;                        
  11. var chatInstance = window.arguments[0].instance; 
  12. // globals for invite
  13.  
  14. var incomingChat = window.arguments[0].incomingChat;
  15. var inviteProposalScreenName = window.arguments[0].incomingChatInviteProposalScreenName;
  16. var inviteProposalObj= window.arguments[0].incomingChatInviteProposalObj;
  17.  
  18. var isChatContent = true;
  19. var showTimestampVal;
  20.  
  21. // timestamp    
  22. var IDateTime = Components.classes["@mozilla.org/intl/scriptabledateformat;1"].createInstance();
  23. var aDateTime = IDateTime.QueryInterface(Components.interfaces.nsIScriptableDateFormat);
  24.  
  25. //ChatRoomManager setup 
  26. //         ***start***
  27. function chatRoomMemberObj(screenName,status,ignored,blocked)
  28. {
  29.   this.screenName=screenName;
  30.   this.status=status;
  31.   this.ignored=ignored;
  32.   this.blocked=blocked;
  33.   return this;
  34. }
  35.  
  36. function chatRoomManagerObj()
  37. {
  38.   this.members = new Array();
  39.   this.roomname = "";
  40.   return this;
  41. }
  42.  
  43. function chatRoomManagerAddMember(managerObj,membername,status,ignored,blocked)
  44. {
  45.   managerObj.members[managerObj.members.length] = new chatRoomMemberObj(membername,status,ignored,blocked);
  46. }
  47.  
  48. function chatRoomManagerDelMember(managerObj,membername)
  49. {
  50.   var tempMembersArray = new Array();
  51.   for(k=0;k<managerObj.members.length;k++) {
  52.     if(managerObj.members[k].screenName.toLowerCase() == membername.toLowerCase()) {
  53.       //copy members to new Array, except for deleted one.
  54.       for(m=0;m<managerObj.members.length;m++) {
  55.         if(m!=k) {
  56.           tempMembersArray[tempMembersArray.length] = managerObj.members[m];    
  57.         }
  58.       }
  59.       //swap old array with new one.
  60.       managerObj.members = tempMembersArray;
  61.     }
  62.   }
  63. }
  64.  
  65. function chatRoomManagerUpdateMember(managerObj,membername,status)
  66. {
  67.   var changedFlag = false;
  68.   for(i=0;i<managerObj.members.length;i++) {
  69.     if(managerObj.members[i].screenName.toLowerCase()==membername.toLowerCase()) {
  70.       managerObj.members[i].status = status
  71.       changedFlag=true;
  72.     }
  73.   }
  74.  
  75.   if(!changedFlag) {
  76.     //didnt change anyone - must not be here yet!
  77.     chatRoomManagerAddMember(managerObj,membername,status,false,false)
  78.   }
  79. }
  80.  
  81. var myManager = new chatRoomManagerObj();
  82. //ChatRoomManager setup ***end***
  83.  
  84. // Setup Callbacks
  85. //Setup Room Callbacks (basically event capturing)
  86.  
  87. var RoomCallback= new Object();
  88.  
  89. RoomCallback.OnMessageReceived = function(screenName, rcvdMsg, language) {
  90.   chatContentRecieveMsg(screenName,rcvdMsg)
  91. }
  92.  
  93. RoomCallback.OnWhisperReceived = function(screenName,  rcvdWhispMsg, language) {
  94.   chatContentRecieveMsg(screenName,rcvdWhispMsg)
  95. }
  96.  
  97. RoomCallback.OnUserJoined = function(screenName){
  98.   updateStatus(aimString("chat.OnUserJoined").replace(/%ScreenName%/, screenName));
  99.   //update their status in the list
  100.   top.frames['chatpanel'].chatPanelUpdateScreenName(screenName,"joined")
  101.   //update their status in the global obj
  102.   chatRoomManagerUpdateMember(myManager,screenName,"joined")
  103.   try {
  104.     chatAnnounce_pref=aimPrefsManager().GetBoolPref("aim.chat.AnnounceChatRoom", null, false);
  105.   }
  106.   catch (ex) {
  107.     chatAnnounce_pref = true;
  108.   }
  109.  
  110.   var currentScreenName = aimSessionCurrentScreenName();      
  111.   if ((chatAnnounce_pref && (currentScreenName != screenName))) {
  112.     chatContentReceiveStatus(screenName, aimString("chat.OnUserJoined").replace(/%ScreenName%/,""));
  113.   }
  114.   chatRoomManagerUpdateMember(myManager,screenName,"joined")
  115.  
  116. }
  117.  
  118. RoomCallback.OnUserLeft = function(screenName) {
  119.   updateStatus(aimString("chat.OnUserLeft").replace(/%ScreenName%/, screenName));
  120.   top.frames['chatpanel'].chatPanelRemoveScreenName(screenName)
  121.   //update global obj
  122.   chatRoomManagerDelMember(myManager,screenName)
  123.  
  124.   var chatAnnounce_pref;
  125.   try {
  126.     chatAnnounce_pref=aimPrefsManager().GetBoolPref("aim.chat.AnnounceChatRoom", null, false);
  127.   }
  128.   catch (ex) {
  129.     chatAnnounce_pref = true;
  130.   }
  131.   if (chatAnnounce_pref) {
  132.     chatContentReceiveStatus(screenName, aimString("chat.OnUserLeft").replace(/%ScreenName%/, ""));
  133.   }
  134. }
  135.  
  136. RoomCallback.OnPaused = function() {
  137.   updateStatus(aimString("chat.RoomPaused"));
  138. }
  139.  
  140. RoomCallback.OnResumed = function() {
  141.   updateStatus(aimString("chat.RoomResumed"));
  142. }
  143.  
  144. RoomCallback.OnInfoUpdate = function() {}
  145.  
  146. RoomCallback.OnClientError = function(screenName,errMsg) {
  147.   updateStatus(aimString("chat.ClientError").replace(/%ScreenName%/, screenName));
  148. }
  149.  
  150. // end Setup Room Callback
  151.  
  152. // Setup ChatManager Callback 
  153. var CallBack = new Object();
  154. var RoomCreationTimeStamp = null;
  155. CallBack.title = aimString("chat.WindowTitle");
  156.  
  157. CallBack.OnRequestRoomComplete =  function(roomName,chatRoomObj) {
  158.   RoomCreationTimeStamp= new Date();
  159.   chatRoomObj.SetChatRoomCallback( RoomCallback )
  160.   top.chatRoomObj = chatRoomObj;
  161.   if (roomName)
  162.     window.title= aimString("chat.WindowTitle").replace(/%ChatRoom%/, roomName);
  163.   else if (chatRoomName)
  164.     window.title= aimString("chat.WindowTitle").replace(/%ChatRoom%/, chatRoomName);
  165.   else if (chatRoomObj.GetName())
  166.     window.title= aimString("chat.WindowTitle").replace(/%ChatRoom%/, chatRoomObj.GetName());
  167.  
  168.   window.setTimeout('top.chatRoomObj.Join()', 1000);
  169.   if(invitedScreenNames)
  170.     window.setTimeout('chatContentInviteMany(invitedScreenNames,chatMsg)',1500);    
  171. }
  172.  
  173. CallBack.OnRequestRoomError =  function(roomName,errMsg) {
  174.   window.close();
  175. }
  176.  
  177. CallBack.OnProposalReceived = function(screenName,proposalObj) { }
  178.  
  179.  
  180. //Chat Sound handling
  181. function chatSound(msg)
  182. {
  183.   aimSoundManager().ChatEvent(msg);
  184. }
  185.  
  186. // first thing to do on startup
  187. function chatContentStartup() {
  188.   dump("III in chatContentStartup\n");
  189.   pChatManager = aimChatManager();
  190.   if (!pChatManager) {
  191.     return;
  192.   }
  193.  
  194.   var rooms = new Object();
  195.   try {
  196.     pChatManager.GetMaxConcurrentRooms(rooms);
  197.   }
  198.   catch (e) {
  199.     dump("!!!!! catching js error during pChatManager.GetMacConcurrentRooms !!!!! \n");
  200.   }
  201.  
  202.   // got chatroom name from arguments passed to the opendialog
  203.   if(incomingChat) {
  204.     CallBack.OnRequestRoomComplete(window.arguments[0].chatRoomName, window.arguments[0].incomingChatRoom);
  205.   }
  206.   else {    
  207.     try {
  208.       if(chatFromURL && (chatExchange != 0)) {                                               
  209.         pChatManager.RequestRoom(CallBack, chatRoomName, chatLanguage, chatExchange, chatInstance)
  210.       }
  211.       else {
  212.         pChatManager.RequestPrivateRoom(CallBack,chatRoomName, chatLanguage)
  213.       }
  214.     }
  215.     catch (e) {
  216.             dump("chatContentStartup: E = " + e + "\n");
  217.     }
  218.   }
  219.   showTimestampVal = aimPrefsManager().GetBoolPref("aim.general.im.timeStamp", null, false);
  220.   SetTimestampMenuItem();
  221. }
  222.  
  223. // One more level of callback in order that chat manager can be ready
  224. myExecutionCallback = new Object();
  225. myExecutionCallback.ExecuteIfReady = function()
  226. {
  227.   // get chatroom and callbacks
  228.   chatContentStartup();
  229.  
  230.   // startup the ender widget
  231.   startUpEditor(document.getElementById("ComposeWnd"));
  232.  
  233.   try {
  234.      updateMemberCount();
  235.   }
  236.   catch (e)  {
  237.     dump("chatcontent: Unable to run updateMemberCount()\n" +e+"\n");
  238.   } 
  239.   
  240.   try {
  241.     if(!chatFromURL)
  242.       window.opener.close();
  243.   }
  244.   catch (e) {
  245.     dump("chat: where's my invite window?? \n");
  246.   }
  247. }
  248.  
  249. // after the window has loaded:
  250. function chatContentOnWinLoad()
  251. {
  252.   var bbox = document.getElementById("ComposeWnd");
  253.   if (bbox)
  254.     bbox.addEventListener("keypress", composeKeyPress, true);
  255.  
  256.   aimChatManager().OnWindowLoad(top);
  257.   aimChatManager().ExecuteIfReady(myExecutionCallback);
  258.  
  259.   //hide some insert menuitems
  260.   document.getElementById("insertImage").setAttribute("hidden", true);
  261.   document.getElementById("insertTable").setAttribute("hidden", true);
  262.   document.getElementById("insertAnchor").setAttribute("hidden", true);
  263.   document.getElementById("insertHline").setAttribute("hidden", true);
  264.   document.getElementById("insertHTMLSource").setAttribute("hidden", true);
  265.   document.getElementById("insertChars").setAttribute("hidden", true);
  266.   document.getElementById("insertTOC").setAttribute("hidden", true);
  267.   document.getElementById("insertMenuSeparator").setAttribute("hidden", true);
  268.   document.getElementById("insertBreakAll").setAttribute("hidden", true);
  269.  
  270.   // style the conversation log box
  271.   var logdoc = document.getElementById("LogWnd").contentDocument;
  272.   if (logdoc)
  273.   {
  274.     logdoc.close();
  275.     logdoc.open();
  276.     logdoc.write('<html><head>');
  277.     logdoc.write('<link rel="important stylesheet" href="chrome://aim/content/smileys.css">');
  278.     logdoc.write('</head><body></body></html>');
  279.     logdoc.close();
  280.   }
  281.   else
  282.     dump("chatContentOnWinLoad: couldn't style log window");
  283. }
  284.  
  285. function composeKeyPress(event)
  286. {
  287.   if (event.keyCode == 13) {
  288.     if (SendOnEnter()) {
  289.       event.preventBubble();
  290.       event.preventDefault(); 
  291.       window.setTimeout('chatContentSendMsg()', 1, true); 
  292.       return false; 
  293.     }
  294.     return true;
  295.   }
  296.  
  297.   if (event.keyCode == 9) {
  298.     if (OnTab()) {
  299.       document.getElementById('btnSend').focus();
  300.       event.preventDefault();
  301.       return false;
  302.     }
  303.     return true;
  304.   }
  305. }
  306.  
  307. // window is closing
  308. function chatContentOnWinUnLoad()
  309. {
  310.   aimChatManager().OnWindowUnload(top);
  311.   try {
  312.     top.chatRoomObj.Leave()
  313.   }
  314.   catch (e) {
  315.     dump("chat: there was an error trying to call chatRoomObj.leave() \n");
  316.   }
  317. }
  318.  
  319. function startUpEditor(editorElement)
  320. {
  321.   if (!editorElement)
  322.     return;
  323.  
  324.   EditorSharedStartup();
  325.  
  326.   // Add an observer to be called when document is done loading,
  327.   // which creates the editor
  328.   try {
  329.     GetCurrentCommandManager().addCommandObserver(gChatEditorCreationObserver, "obs_documentCreated");
  330.  
  331.     // Load empty page to create the editor
  332.     editorElement.webNavigation.loadURI("about:blank", // uri string
  333.                          0,                            // load flags
  334.                          null,                         // referrer
  335.                          null,                         // post-data stream
  336.                          null);
  337.   }
  338.   catch (e) {
  339.     dump(" Failed to startup editor: "+e+"\n");
  340.   }
  341. }
  342.  
  343. // The new, nice, simple way of getting notified when a new editor has been created
  344. var gChatEditorCreationObserver =
  345.   observe: function(aSubject, aTopic, aData) {
  346.     if (aTopic == "obs_documentCreated") {
  347.       var editor = GetCurrentEditor();
  348.       if (editor && GetCurrentCommandManager() == aSubject) {
  349.         //gMsgCompose.initEditor(editor, window.content);
  350.         var nsIPlaintextEditor = Components.interfaces.nsIPlaintextEditor;
  351.         editor.flags |= nsIPlaintextEditor.eEditorNoCSSMask;
  352.  
  353.         //see bugzilla bug 112960 for why we have a timeout call
  354.         setTimeout("setStyles()", 100);
  355.       }
  356.     }
  357.   }
  358. }
  359.  
  360.  
  361.  
  362. // updates the number of chat members (use after an add or delete member)
  363. function updateMemberCount()
  364. {
  365.   var theTreeChildren = document.frames['chatpanelTree'].document.getElementsByTagName("listitem")
  366.   var activeMembers=0;
  367.   for(i=0 ; i<theTreeChildren.length;i++) {
  368.     if(theTreeChildren.item(i).getAttribute("class") == "joined") {
  369.       activeMembers++;
  370.     }
  371.   }
  372.  
  373.   theMemberCountNode=document.getElementById("numberchatting")
  374.   if(activeMembers != 1)
  375.     theMemberCountNode.setAttribute("label", aimString("chat.PeopleHere").replace(/%NumPeople%/, activeMembers));
  376.   else
  377.     theMemberCountNode.setAttribute("label", aimString("chat.PersonHere"));
  378. }
  379.  
  380. //send your message out
  381. function SendOnEnter()
  382. {
  383.   // if enterCR_pref_value is true, the pref was set so that enter was a CR
  384.   // if enterCR_pref_value is false, the user wants enter to send the IM message
  385.   try {
  386.     enterCR_pref_value = aimPrefsManager().GetBoolPref("aim.general.im.enterCR", null, false);
  387.   }
  388.   catch (ex) {
  389.     // default to be "send on enter key"
  390.     enterCR_pref_value = true;
  391.   }
  392.  
  393.   return (!enterCR_pref_value);
  394. }
  395.  
  396. function OnTab()
  397. {
  398.   var Tab_pref_value = false;
  399.   try {
  400.     Tab_pref_value = aimPrefsManager().GetBoolPref("aim.general.im.tabKey", null, false);
  401.   }
  402.   catch (ex) {
  403.     // default
  404.     Tab_pref_value = true;
  405.   }
  406.  
  407.   return (!Tab_pref_value);
  408. }
  409.  
  410. /* Name: getMaxIndividualMessage
  411.  *
  412.  * Arguments: 
  413.  *      none.
  414.  * Return Value:
  415.  *      maxIndividualMessageLength -- maximum length of an individual chat message.
  416.  *
  417.  * Description:
  418.  *      This function caches maxIndividuaMessageLength, and calls
  419.  *      nsIAimChatRoom::GetMaxIndividualMessageLength if the cache is empty.
  420.  *
  421.  * Author:
  422.  *      Joseph Elwell 07/04/2001
  423.  * 
  424. */
  425. var maxIndividualMessageLength = -1;
  426. function getMaxIndividualMessage()
  427. {
  428.   if (maxIndividualMessageLength == -1)
  429.     maxIndividualMessageLength = top.chatRoomObj.GetMaxIndividualMessageLength();
  430.  
  431.   return maxIndividualMessageLength;
  432. }
  433.         
  434. function chatContentSendMsg(strip) {
  435.   var editor = GetCurrentEditor();
  436.   if (!editor)
  437.     return;
  438.   if (editor.textLength > getMaxIndividualMessage()) {
  439.     var bigChatError = aimString("msg.BigChat").replace(/%BigBy%/, ""+(editor.textLength-getMaxIndividualMessage()));
  440.     bigChatError = bigChatError.replace(/471/, ""+(getMaxIndividualMessage()));
  441.     aimErrorBox(bigChatError);
  442.     return;
  443.   }
  444.  
  445.   var bodyText = editor.outputToString("text/html", 8 + 4);
  446.  
  447.   /* smiley conversion */
  448.   bodyText = bodyText.replace(/<\/span><\/span>/g,  " ");
  449.   bodyText = bodyText.replace(/<span class="moz-smiley-s[0-9][0-9]?"><span>/g, " ");
  450.  
  451.   // *** placeholder for getting strip pref.
  452.   //var strip=true
  453.  
  454.   if (strip) {
  455.     bodyText = bodyText.replace(/<br>/gi, "");
  456.     bodyText = bodyText.replace(/\n/g, "");
  457.     bodyText = bodyText.replace(/\r/g, "");
  458.   }
  459.  
  460.   bodyText = bodyText.replace(/\n/g, "");
  461.   bodyText = bodyText.replace(/\r/g, "");
  462.   bodyText = bodyText.replace(/<big>/gi, "<font size=\"+1\">");
  463.   bodyText = bodyText.replace(/<\/big>/gi, "<\/font>");
  464.   bodyText = bodyText.replace(/<small>/gi, "<font size=\"-1\">");
  465.   bodyText = bodyText.replace(/<\/small>/gi, "<\/font>");
  466.   bodyText = bodyText.replace(/<br><br>/gi, "<br>");
  467.   bodyText = bodyText.replace(/<br><\/body>/i, "<\/body>");
  468.   bodyText = bodyText.replace(/\u00a0/gi, " ");
  469.  
  470.   try {
  471.     top.chatRoomObj.SendMessage(bodyText);
  472.   }
  473.   catch(ex) {
  474.     aimErrorBox(aimString("chat.SendError"));
  475.     return;
  476.   }
  477.  
  478.   editor.selectAll();
  479.   getStyles();
  480.   editor.deleteSelection(null);
  481.   //*** return focus to editor after clicking send ***
  482.   setStyles();
  483.   top._content.focus();
  484.  
  485.   //Chat Send Sound to hook
  486.   chatSound(Components.interfaces.nsAimChatSoundEvent.ChatSoundEvent_OutgoingMsg);
  487. }
  488.  
  489. // handle incoming messages
  490. function chatContentRecieveMsg(screenName,msg)
  491. {
  492.   var chatflash=false;         
  493.   try {
  494.     chatflash=aimPrefsManager().GetBoolPref("aim.chat.FlashChatWin", null, false); 
  495.   }
  496.   catch (ex) {
  497.     chatflash = true;
  498.   }
  499.   if (chatflash)
  500.     top.window.getAttention();
  501.  
  502.   msg = msg.replace(/<pre>/gi, "");
  503.   msg = msg.replace(/<\/pre>/gi, "");
  504.   chatContentAddMsgToLog(screenName,msg,true)
  505.  
  506.   //Chat Receive Sound to Hook
  507.   if (screenName != aimSessionCurrentScreenName())
  508.     chatSound(Components.interfaces.nsAimChatSoundEvent.ChatSoundEvent_IncomingMsg);
  509. }
  510.  
  511. function chatContentReceiveStatus(screenName, msg)
  512. {
  513.   chatContentAddMsgToLog(screenName,msg,false);
  514. }
  515.  
  516. // sub timestamp generation
  517. function getTimeStampStr()
  518. {
  519.   var strTimestamp;
  520.   var curTime = new Date();
  521.   var curHours   = curTime.getHours();
  522.   var curMinutes = curTime.getMinutes();
  523.   var curSeconds = curTime.getSeconds();
  524.  
  525.   strTimestamp = aDateTime.FormatTime("", aDateTime.timeFormatSeconds, curHours, curMinutes, curSeconds);
  526.  
  527.   if (showTimestampVal)
  528.     strTimestamp = "<SPAN class=\"logtimestamp\"style=\"visibility:visible\">" + "(" + strTimestamp + ")" + "</SPAN>";
  529.   else  
  530.     strTimestamp = "<SPAN class=\"logtimestamp\"style=\"display:none\">" + "(" + strTimestamp + ")" + "</SPAN>";
  531.  
  532.   return strTimestamp;
  533. }
  534.  
  535. // sub function of chatContentRecieveMsg
  536. function chatContentAddMsgToLog(screenName,msg,isMsg)
  537. {
  538.   // There is no contract id for this interface now. mscott/myself will add one later and change this.
  539.   var moz = Components.classesByID["{77c0e42a-1dd2-11b2-8ebf-edc6606f2f4b}"];
  540.   var moztxt = moz.createInstance(Components.interfaces.mozITXTToHTMLConv);
  541.   var iface = Components.interfaces.mozITXTToHTMLConv;
  542.   var mozURL = iface.kURLs;
  543.   var mozSmiley = iface.kGlyphSubstitution;
  544.   var smileyFeatureEnabled = aimPrefsManager().GetBoolPref("aim.general.im.smilies", null, false);
  545.  
  546.   if (smileyFeatureEnabled)
  547.     msg = moztxt.scanHTML(msg, mozSmiley);
  548.  
  549.   var timeStampStr = getTimeStampStr();
  550.  
  551.   var theLogNode = top.document.getElementById("LogWnd").contentWindow;
  552.  
  553.   var myRange = theLogNode.document.createRange();
  554.   var theLogBody =theLogNode.document.body;
  555.   myRange.setStartAfter(theLogBody);
  556.   var docFrag;
  557.   // XXXVISHY - this handles info messages also
  558.   if (screenName) {
  559.     var colorpre = " ";
  560.     var colorpost = " </b> ";
  561.     
  562.     if(msg) {
  563.       dump ("***> chatContent.js msg is : " + msg + "\n");
  564.       msg = moztxt.scanHTML(msg, mozURL);
  565.       dump ("***> chatContent.js msg is : " + msg + "\n");
  566.  
  567.       }
  568.  
  569.     if (isMsg) {
  570.       // otherwise it is a status
  571.       if (screenName.toLowerCase() == aimSessionCurrentScreenName()) 
  572.         colorpre = '<font color=\"#ff0000\">';
  573.       else
  574.         colorpre = '<font color=\"#0000ff\">';
  575.  
  576.       colorpost = '</b>: </font>';
  577.       docFrag = myRange.createContextualFragment("<html>" + colorpre + "<b>"+ screenName + timeStampStr + colorpost+ msg+"</html><br>");
  578.     }
  579.     else
  580.       docFrag = myRange.createContextualFragment("<html>" + colorpre + "<b>"+ timeStampStr + screenName + colorpost+ msg+"</html><br>");
  581.   }
  582.   else
  583.     docFrag = myRange.createContextualFragment("<html><b>"+ timeStampStr + "</b>" + msg+"</html><br>");
  584.  
  585.   var prevdocHeight = theLogNode.document.height;
  586.   var isLocked=((theLogNode.scrollY + theLogNode.innerHeight) >= theLogNode.document.height) 
  587.                   || (( theLogNode.document.height - theLogNode.scrollY ) <= 5)
  588.   theLogBody.appendChild(docFrag)
  589.  
  590.   if (isLocked) {
  591.     if ((theLogNode.innerHeight - (prevdocHeight-theLogNode.scrollY)) <= 5)
  592.       return;
  593.     if ((theLogNode.innerHeight < theLogNode.document.height) && (theLogNode.scrollY == prevdocHeight))
  594.       return;
  595.     theLogNode.scrollTo(theLogNode.scrollX, theLogNode.document.height)
  596.   }
  597.  
  598. }
  599.  
  600.  
  601. //send info to the status area
  602. function updateStatus(statusMsg)
  603. {
  604.   var statusTextNode= document.getElementById("statustext");
  605.   statusTextNode.setAttribute("value",statusMsg);
  606. }
  607.  
  608. // handle status changes
  609. function chatContentStatusChange(screenName,statusItem)
  610. {
  611.   //updateStatus(screenName+": "+statusItem)
  612. }
  613.  
  614. /*** Handle Proposal and ProposalOwner for Chat Invitations ***/
  615. var proposals = new Array(); // of all the open proposals;
  616. var aproposal = new Object();
  617.  
  618. function AimProposalOwner()
  619. {
  620.   this.OnProposalAcked = function(pProposal) { }
  621.  
  622.   this.OnProposalError = function(pProposal, pErr) {
  623.     var screenName=pProposal.GetProposee();
  624.     var deletePanel=false;
  625.     switch(pErr) {
  626.       case 9:
  627.         aimErrorBox(aimString("chat.UnsupportedSoftware").replace(/%S/, screenName));
  628.         deleteFromPanel=true;
  629.         break;
  630.       case 19:
  631.         aimErrorBox(aimString("chat.NotAvailable").replace(/%ScreenName%/, screenName));
  632.         break;
  633.       case 4:
  634.         aimErrorBox(aimString("chat.NotAvailable").replace(/%ScreenName%/, screenName));
  635.         break;
  636.       case 16:  
  637.         aimErrorBox(aimString("chat.Blocked").replace(/%S%/, screenName));
  638.         deleteFromPanel=true;   
  639.         break;
  640.       case 0:
  641.         aimErrorBox(aimString("chat.NotAvailable").replace(/%ScreenName%/, screenName));
  642.         deleteFromPanel=true;
  643.     }
  644.     
  645.     if (deleteFromPanel) {
  646.       top.frames['chatpanel'].chatPanelRemoveScreenName(screenName);
  647.       chatRoomManagerDelMember(myManager,screenName);
  648.     }
  649.   }
  650.  
  651.   this.OnProposalAccepted = function(pProposal) { }
  652.  
  653.   this.OnProposalRejected = function(pErrMsg, pScreenName, deleteFromChatPanel) {
  654.     aimErrorBox(pErrMsg);
  655.     if (deleteFromChatPanel) {
  656.       top.frames['chatpanel'].chatPanelRemoveScreenName(pScreenName);
  657.       chatRoomManagerDelMember(myManager,pScreenName);
  658.     }
  659.   }
  660.  
  661.   this.OnProposalCountered = function(pProposal, pCounterProposal) { }
  662.  
  663.   this.OnProposalTimeout = function(pProposal) {
  664.     aimErrorBox(aimString("chat.TimedOut"));
  665.     top.frames['chatpanel'].chatPanelRemoveScreenName(pProposal.GetProposee());
  666.     chatRoomManagerDelMember(myManager,pProposal.GetProposee());
  667.   }
  668.  
  669.   this.OnProposalCancelled = function(pProposal) {
  670.     top.frames['chatpanel'].chatPanelRemoveScreenName(pProposal.GetProposee());
  671.     chatRoomManagerDelMember(myManager,pProposal.GetProposee());
  672.   }
  673.  
  674.   return this;
  675. }
  676.  
  677. // handle many invitations
  678. function chatContentInviteMany(inviteList,chatMsg)
  679. {
  680.   // convert carriage returns and newlines to commas 
  681.   inviteList = inviteList.replace(/\n/gi, ",");
  682.   inviteList = inviteList.replace(/\r/gi, ",");
  683.  
  684.   inviteArray=inviteList.split(",")
  685.   for(inviteItem = 0; inviteItem<inviteArray.length; inviteItem++) {
  686.     //test to make sure the name isnt empty
  687.     if(itemTest(inviteArray[inviteItem])) {
  688.       aproposal = top.chatRoomObj.Invite(inviteArray[inviteItem], chatMsg);
  689.       proposals[proposals.length] = aproposal;
  690.       proposals[proposals.length-1].SetOwner(new AimProposalOwner());
  691.       top.frames['chatpanel'].chatPanelUpdateScreenName(inviteArray[inviteItem],"invited");
  692.       chatRoomManagerAddMember(myManager,inviteArray[inviteItem],"invited",false,false);
  693.     }
  694.   }
  695. }
  696.  
  697. function itemTest(inviteItem)
  698. {
  699.   var passed = true;
  700.   switch(inviteItem) {
  701.     case "":
  702.         case " ":
  703.       passed = false;
  704.     break;
  705.   }
  706.   return passed;
  707. }
  708.  
  709. // pop up invitation window:
  710. function cmdPopUpInvite(screenNames)
  711. {
  712.   var isOnline = aimSession().IsOnline();
  713.   if (!isOnline) {
  714.     window.close();
  715.     aimErrorBox(aimString("chat.NotOnline"));
  716.   }
  717.   else {
  718.     var language = aimString("aim.LanguageCode");
  719.     inviteArgsObj = {
  720.       inviteProposalScreenName: '', 
  721.       inviteProposalObj: null,
  722.       invitedScreenNames: screenNames,
  723.       inviteToExistingWindow: true,
  724.       inviteMode: 'outgoingchat',
  725.       inviteToExistingRoom: chatRoomName,
  726.       inviteLanguage: language
  727.     }
  728.  
  729.     window.openDialog('chrome://aim/content/chatInviteBuddy.xul','inviteBuddy','chrome,all,dialog=no',inviteArgsObj);
  730.   }
  731. }
  732.  
  733. // display room info
  734. function cmdRoomInfo()
  735. {
  736.   var dateformat = Components.classes["@mozilla.org/intl/scriptabledateformat;1"].createInstance();
  737.   var dateFormatter = dateformat.QueryInterface(Components.interfaces.nsIScriptableDateFormat);
  738.   var curYear = RoomCreationTimeStamp.getYear() + 1900;
  739.   var curMonth = RoomCreationTimeStamp.getMonth() + 1;
  740.   var curDay = RoomCreationTimeStamp.getDate();
  741.   var curHours = RoomCreationTimeStamp.getHours();
  742.   var curMinutes = RoomCreationTimeStamp.getMinutes();
  743.   var curSeconds = RoomCreationTimeStamp.getSeconds();
  744.  
  745.   var dateTimeStr = dateFormatter.FormatDateTime("", Components.interfaces.nsIScriptableDateFormat.dateFormatLong,
  746.                   Components.interfaces.nsIScriptableDateFormat.timeFormatSeconds,
  747.                   curYear, curMonth, curDay, curHours, curMinutes, curSeconds);
  748.  
  749.   window.openDialog('chrome://aim/content/chatRoomInfo.xul','charRoomInfo','chrome,all,dialog=no,resizable=no,titlebar',chatRoomName, top.chatRoomObj.GetLanguage(), top.chatRoomObj.GetMaxIndividualMessageLength(), dateTimeStr); 
  750. }
  751.  
  752. function createInstance( contractid, iidName )
  753. {
  754.   var iid = eval( "Components.interfaces." + iidName );
  755.   return Components.classes[ contractid ].createInstance( iid );
  756. }
  757.  
  758. function fixScrolling()
  759. {
  760.   var LogWindow = top.document.getElementById("LogWnd").contentWindow;
  761.   var pageY = LogWindow.pageYOffset
  762.   var docHeight = LogWindow.innerHeight
  763. }
  764.  
  765. // ignore user from chat - called this time from top level people menu
  766. // simply accesses the cmdIgnoreFromChat() method present inside the chatpanel iframe
  767.  
  768. function cmdIgnoreFromChat_PeopleMenu()
  769. {
  770.   top.frames['chatpanel'].cmdIgnoreFromChat();
  771. }
  772.  
  773. // add buddy - get's the currently selected chat room
  774. // buddy and prepopulates the add buddy dialog.
  775. function cmdChatContentAddBuddy()
  776. {
  777.   var targetValue = top.frames['chatpanel'].cmdGetSelectedScreenName()
  778.   if (targetValue)
  779.     openDialog("chrome://aim/content/BuddyAddBuddy.xul", "", "modal=yes,titlebar,chrome", null, null, targetValue);
  780. }
  781.  
  782. // get member info - accesses the currently selected chatroom buddy and 
  783. // sends that info to the getmemeberinfo xul file
  784. function cmdChatContentGetMemberInfo()
  785. {
  786.   var targetValue = top.frames['chatpanel'].cmdGetSelectedScreenName()
  787.   if(targetValue && targetValue != null)
  788.     window.openDialog('chrome://aim/content/GetMemberInfo.xul','_blank','chrome,all,dialog=no', targetValue);
  789. }
  790.  
  791. function cmdChatContentSendIM()
  792. {
  793.   top.frames['chatpanel'].cmdSendIMFromChat();
  794. }
  795.  
  796.