FIRSTCLASS.apps.Global = { init: function () { FIRSTCLASS.util.DataSource.registerGlobalDataListener(FIRSTCLASS.apps.Global.listener); this.chat.init(); }, listener: { onHeaderData: function (key, contents) { //debugger; if (key == "session") { //FIRSTCLASS.session.vkeys.push(contents.vkey); if (FIRSTCLASS.session.updates.chatfolder < contents.updates.chatfolder) { FIRSTCLASS.apps.Global.chat._chatfolderds.fetchNewRows(false); } FIRSTCLASS.session.updates.chatfolder = contents.updates.chatfolder; } /*if (key == "chats") { for (var i in contents) { FIRSTCLASS.apps.Global.chat.parseChatChannel(contents[i]); } }*/ if (key == "mypeople") { FIRSTCLASS.apps.Global.chat.updateOverlay(); } }, filter: function (key) { switch (key) { case "session": case "chats": case "mypeople": return true; default: return false; } } }, resizeEvent: function() { var viewport = FIRSTCLASS.ui.Dom.getViewportBounds(); var overlay = false; if (false && FIRSTCLASS.apps.Global.chat._mainoverlaydiv) { overlay = FIRSTCLASS.apps.Global.chat._mainoverlaydiv; } else if (FIRSTCLASS.apps.Global.chat._overlaydiv) { overlay = FIRSTCLASS.apps.Global.chat._overlaydiv; } if (overlay) { YAHOO.util.Dom.setStyle(FIRSTCLASS.apps.Global.chat._mainoverlaydiv, 'width', "" + viewport.wd + "px"); if (FIRSTCLASS.apps.Global.chat._mainoverlaydiv.firstChild) { YAHOO.util.Dom.setStyle(FIRSTCLASS.apps.Global.chat._mainoverlaydiv.firstChild, 'width', "" + viewport.wd + "px"); } YAHOO.util.Dom.setStyle(overlay, 'width', "" + (viewport.wd - (17*2)) + "px"); if(overlay.firstChild) { YAHOO.util.Dom.setStyle(overlay.firstChild, 'width', "" + (viewport.wd - (17*2)) + "px"); } } if (overlay) { FIRSTCLASS.apps.Global.chat.updateOverlays(); } }, chat: { container: false, _initialized: false, _enabled: true, init: function () { if (this._initialized) { return; } this._chatfolderds = new FIRSTCLASS.util.DataSource( { name: "Chats", globalDataListener: {key:"chats"}, itemrequest: false, containerBaseUrl: FIRSTCLASS.lang.ensureSlashUrl(FIRSTCLASS.session.baseURL) + "__Open-Item/MyIMFolders/" }); YAHOO.widget.Overlay.VIEWPORT_OFFSET = 0; var overlaydiv = document.createElement("div"); overlaydiv.id = 'chatoverlay'; this._overlaydiv = overlaydiv; document.body.appendChild(overlaydiv); var html = []; var viewport = FIRSTCLASS.ui.Dom.getViewportBounds(); html.push(""); html.push(""); html.push("
  
"); overlaydiv.innerHTML = html.join(""); overlaydiv = overlaydiv.firstChild.firstChild.childNodes[0].childNodes[1]; this._mainoverlaydiv = this._overlaydiv; this._overlaytable = overlaydiv.firstChild; this._overlaydiv = overlaydiv; FIRSTCLASS.apps.Global.resizeEvent(); //this._overlay = new YAHOO.widget.Overlay("chatoverlay", // { // visible:false, // width: "100%", // constraintoviewport:true, // context: ['fcMain', 'bl', 'bl', ['beforeShow', /*'windowResize',*/ /*'windowScroll',*/ 'changeBody']] // }); //this._overlay.hideMacGeckoScrollbars(); this._manager = new YAHOO.widget.OverlayManager(); this._initialized = true; this._chatfolderds.addRowListener(FIRSTCLASS.apps.Global.chat.listener); this._mypeople = {minimized:true, messages:false}; var offset = [0,0]; if (YAHOO.env.ua.ie) { offset = [0,0]; } this._mypeople.overlay = new YAHOO.widget.Panel("chatoverlaymypeople", { visible: false, width: "218px", height: "400px", constraintoviewport:true, zindex: 1000, underlay: "none", close: true, draggable: false, context: ['fcChatOverlayPeople', 'br', 'tr', ['beforeShow', 'windowResize', 'windowScroll', 'changeBody', 'render'], offset] }); this._mypeople.overlay.subscribe('hide', function() { FIRSTCLASS.apps.Global.chat._mypeople.minimized = true; YAHOO.util.Dom.removeClass('fcChatOverlayPeople', 'visible'); YAHOO.util.Dom.addClass('fcChatOverlayPeople', 'minimized'); }); this._manager.register(this._mypeople.overlay); this._mypeople.overlay.setBody("
"); this._mypeople.overlay.render(document.body); this._mypeople.overlay.hideMacGeckoScrollbars(); this._mypeople.sidebar = new FIRSTCLASS.ui.sideBar($("mypeoplebox").firstChild); this.buildPeopleBox(); // FIRSTCLASS.apps.Desktop.instance.buildApplicationBox(this._mypeople.sidebar, {id:"people"}); YAHOO.util.Dom.setStyle(this._mypeople.overlay.element, 'border', 'none'); YAHOO.util.Dom.setStyle(this._mypeople.overlay.element.firstChild, 'border', 'none'); YAHOO.util.Dom.setStyle(this._mypeople.overlay.element, 'height', '400px'); YAHOO.util.Dom.setStyle(this._mypeople.overlay.element.firstChild, 'height', '400px'); YAHOO.util.Dom.setStyle(this._mypeople.overlay.element.firstChild.firstChild, 'height', '400px'); YAHOO.util.Dom.setStyle(this._mypeople.overlay.element.firstChild.firstChild, 'border', 'none'); YAHOO.util.Dom.setStyle($('chatoverlaymypeople').firstChild, 'padding', '0px'); }, buildPeopleBox: function() { var div = document.createElement("div"); this._mypeople.peoplelistds = new FIRSTCLASS.util.DataSource( { name: "My People", globalDataListener: {key:"mypeople"}, itemrequest: false, compareRows: function (row1, row2) { return row1.online == row2.online; }, isSameRow: function (row1, row2) { return row1.uid == row2.uid; } }); var buddylistcfg = { domElement: div, dataSource: this._mypeople.peoplelistds, keepRowsSorted: true, threading: { format: FIRSTCLASS.layout.ThreadHandler.types.NONE, sortfunc: function (row1, row2) { var weight1 = "9999"; if (row1.online > 0) { weight1 = "1111"; } if (false && row1.status.unread) { weight1 = "0000"; } var weight2 = "9999"; if (row2.online > 0) { weight2 = "1111"; } if (false && row2.status.unread) { weight2 = "0000"; } var str1 = weight1 + row1.name; var str2 = weight2 + row2.name; if (str1 > str2) { return 1; } else if (str1 == str2) { return 0; } else { return -1; } }, expandcfg: { urls: true, maxurl: 23, maxstr: 23 } }, rowFilter: function (row) { return (row.typedef.subtype == FIRSTCLASS.subTypes.profile && row.status.alias && row.status.deleted === 0); }, onFillFinished: function () { if (false && FIRSTCLASS.apps.Desktop.instance._dataSource.isActive()) { /*if ((!that._buddylistlv || (that._buddylistlv && !that._buddylistlv.hasChildren()))) { FIRSTCLASS.ui.sideBar.hideApplicationBox(FIRSTCLASS.locale.desktop.people); } else {*/ if (FIRSTCLASS.ui.leftSideBar.isHidden() && (FIRSTCLASS.session.getActiveApplicationName() == "desktop")) { FIRSTCLASS.ui.leftSideBar.show(false, function () { FIRSTCLASS.ui.sideBar.showApplicationBox(FIRSTCLASS.locale.desktop.people); }); } //} } }, rowHandler: new FIRSTCLASS.layout.UserListHandler(FIRSTCLASS.apps.Desktop.instance._dataSource, false, false, false, false, true) }; this._mypeoplecfg = {domElement: div}; this._mypeoplecfg.listView = new FIRSTCLASS.layout.ListView(buddylistcfg); this._mypeople.sidebar.addApplicationBox(this._mypeoplecfg.domElement, " "); }, currentNewChats: [], currentChats: [], chatlistener: { onHeaderData: function(data, contents, dataSource) { if (data == "folderid") { var chat = FIRSTCLASS.apps.Global.chat.currentChats[contents.full]; var found = false; if (!chat) { for (var i in FIRSTCLASS.apps.Global.chat.currentChats) { chat = FIRSTCLASS.apps.Global.chat.currentChats[i]; if (chat.dataSource === dataSource) { found = true; } } } if (found) { FIRSTCLASS.apps.Global.chat.updateChatFolderID(chat, contents.full); } else { return; } } if (data == "chatparticipants") { var chat = false; if (dataSource._data && dataSource._data.folderid && dataSource._data.folderid.full) { chat = FIRSTCLASS.apps.Global.chat.currentChats[dataSource._data.folderid.full]; } var found = false; if (!chat) { for (var i in FIRSTCLASS.apps.Global.chat.currentChats) { chat = FIRSTCLASS.apps.Global.chat.currentChats[i]; if (chat.dataSource._config.containerBaseUrl == dataSource._config.containerBaseUrl) { found = true; break; } } } else { found = true; } if (found) { chat.participants = contents; FIRSTCLASS.apps.Global.chat.updateOverlay(); //FIRSTCLASS.apps.Global.chat.updateChatFolderID(chat, contents.full); } else { return; } } }, onRow: function (row, dataSource, isNewDelivery) { if (isNewDelivery) { FIRSTCLASS.session.debug.writeMessage({"module": "FIRSTCLASS.apps.Global.chat", "1": "chatlistener onRow Called", "3": row}); } // do some stuff var chat = FIRSTCLASS.apps.Global.chat.currentChats[dataSource._data.folderid.full]; var found = false; if (!chat) { for (var i in FIRSTCLASS.apps.Global.chat.currentChats) { chat = FIRSTCLASS.apps.Global.chat.currentChats[i]; if (chat.dataSource === dataSource) { found = true; } } if (found) { FIRSTCLASS.apps.Global.chat.updateChatFolderID(chat, dataSource._data.folderid.full); } else { return; } } found = false; for (var i in chat.messages) { /* FIXME: Ugly hack for jason demo for dfait */ if (chat.messages[i].messageid == "[0:0]" && chat.messages[i].col8063 == row.col8063) { found = true; chat.messages[i] = row; chat.isdirty = true; } else if (chat.messages[i].messageid == row.messageid) { found = true; chat.messages[i] = row; } } if (!found) { chat.messages.push(row); chat.isdirty = true; } if (row.justsent) { chat.isdirty = false; row.creatorcid = FIRSTCLASS.session.user.cid; chat.showOnNextUpdate = true; } }, onRowChanged: function (row, dataSource) { this.onRow(row, dataSource, false); }, fillFinished: function (isNewDelivery) { /*if (!FIRSTCLASS.apps.Global.chat._initialized) { return; } if (!isNewDelivery) { for (var i in this._chatids) { var chat = FIRSTCLASS.apps.Global.chat.currentChats[this._chatids[i]]; if (chat) { var messages = []; for (var j in chat.messages) { messages.push(chat.messages[j]); } chat.messages = messages; if (chat.refreshingAfterFailure) { chat.refreshingAfterFailure = false; var form = $("fcChatReply"+chat.messageid); if (form) { var body = form.elements['BODY']; body.value = 'Failed, please try again'; body.disabled = false; } } } } }*/ FIRSTCLASS.apps.Global.chat.updateOverlays(); } }, listener: { _chatids: [], /*onThread: function(threadrows) { if (threadrows.length > 0) { var row = threadrows[0]; if (!FIRSTCLASS.apps.Global.chat.currentChats[row.threadid]) { FIRSTCLASS.apps.Global.chat.currentChats[row.threadid] = {cid:row.creatorcid, messages:[], name:row.name, participants:[], threadid: row.threadid, minimized: true, isdirty:true}; if (row.threadid.indexOf("CID") < 0) { FIRSTCLASS.apps.Global.chat._chatfolderds.fetchRowsByThread(row.threadid); } } this._chatids[row.threadid] = row.threadid; var chat = FIRSTCLASS.apps.Global.chat.currentChats[row.threadid]; if (typeof chat.nparticipants == "undefined") { chat.nparticipants = 0; } if (!chat.messages) { chat.messages = []; } var found = false; var oldrows = chat.messages; chat.messages = threadrows; if (oldrows[oldrows.length-1].messageid != chat.messages[chat.messages.length-1].messageid) { chat.isdirty = true; } if (!found) { if (!row.status.outgoing || row.justsent) { var r = FIRSTCLASS.util.BuddyList.isBuddy(row.creatorcid); if (!chat.participants[row.creatorcid]) { chat.nparticipants++; } if (r) { chat.participants[row.creatorcid] = r.name; } else { chat.participants[row.creatorcid] = row.name; } } chat.isdirty = true; } if (row.justsent) { chat.isdirty = false; row.creatorcid = FIRSTCLASS.session.user.cid; chat.showOnNextUpdate = true; } } },*/ onRow: function (row, atend, isNewDelivery) { if (isNewDelivery) { FIRSTCLASS.session.debug.writeMessage({"module": "FIRSTCLASS.apps.Global.chat", "1": "listener onRow Called", "3": row}); } if (!(row.status.unread)) { // || (typeof row.imattrs != "undefined" && FIRSTCLASS.lang.binary.AND(row.imattrs, 0x01)))) { return; } if (!FIRSTCLASS.apps.Global.chat.currentChats[row.messageid]) { FIRSTCLASS.apps.Global.chat.currentChats[row.messageid] = {cid:row.creatorcid, messages:[], name:row.messageid, participants:[], threadid: row.threadid, minimized: true, isdirty:true, messageid:row.messageid, row:row, showOnNextUpdate: row.isNewChat}; var callbacks = false; if (row.isNewChat) { callbacks = { chat: FIRSTCLASS.apps.Global.chat.currentChats[row.messageid], completed:function() { var huri = this.chat.dataSource._data.huri; huri = FIRSTCLASS.lang.removeSlashUrl(huri); huri = huri.split("/"); row.uri = huri[huri.length-1]; FIRSTCLASS.apps.Global.chat.updateChatAttrs(this.chat.messageid, {open: true}); } }; //FIRSTCLASS.apps.Global.chat.currentChats[row.messageid].dataSource = FIRSTCLASS.apps.Global.chat._chatfolderds.fetchSubFolder(row); // register a new listener //fetchRowsByThread(row.threadid); } FIRSTCLASS.apps.Global.chat.currentChats[row.messageid].dataSource = FIRSTCLASS.apps.Global.chat._chatfolderds.getChildDataSource(row, callbacks); // register a new listener } this._chatids[row.messageid] = row.messageid; var chat = FIRSTCLASS.apps.Global.chat.currentChats[row.messageid]; chat.participants = row.chatparticipants; chat.nparticipants = Object.size(row.chatparticipants); if (!chat.messages) { chat.messages = []; } FIRSTCLASS.apps.Global.chat.currentChats[row.messageid].dataSource.addRowListener(FIRSTCLASS.apps.Global.chat.chatlistener); FIRSTCLASS.apps.Global.chat.currentChats[row.messageid].dataSource.addDataListener(FIRSTCLASS.apps.Global.chat.chatlistener); if (row.status.unread && FIRSTCLASS.apps.Global.chat.currentChats[row.messageid].dataSource) { FIRSTCLASS.apps.Global.chat.currentChats[row.messageid].dataSource.fetchNewRows(false, true); } var found = false; /* for (var i in chat.messages) { if (chat.messages[i].messageid == row.messageid) { found = true; chat.messages[i] = row; } } if (!found) { chat.messages.push(row); if (!row.status.outgoing || row.justsent) { var r = FIRSTCLASS.util.BuddyList.isBuddy(row.creatorcid); if (!chat.participants[row.creatorcid]) { chat.nparticipants++; } if (r) { chat.participants[row.creatorcid] = r.name; } else { chat.participants[row.creatorcid] = row.name; } } chat.isdirty = true; } if (row.justsent) { chat.isdirty = false; row.creatorcid = FIRSTCLASS.session.user.cid; chat.showOnNextUpdate = true; }*/ }, onRowChanged: function (row, dataSource, oldRow) { this.onRow(row, dataSource, false); if (oldRow && row.lastupdate != oldRow.lastupdate) { var chat = FIRSTCLASS.apps.Global.chat.currentChats[row.messageid]; if (!chat) { this.onRow(row, false, true); } else { chat.dataSource.fetchNewRows(false, true); chat.row = row; } } }, fillFinished: function (isNewDelivery) { if (!FIRSTCLASS.apps.Global.chat._initialized) { return; } if (!isNewDelivery) { for (var i in this._chatids) { var chat = FIRSTCLASS.apps.Global.chat.currentChats[this._chatids[i]]; if (chat) { var messages = []; for (var j in chat.messages) { messages.push(chat.messages[j]); } chat.messages = messages; if (chat.refreshingAfterFailure) { chat.refreshingAfterFailure = false; var form = $("fcChatReply"+chat.messageid); if (form) { var body = form.elements['BODY']; body.value = FIRSTCLASS.locale.chat.sendfailed; body.disabled = false; } } } } } FIRSTCLASS.apps.Global.chat.updateOverlays(); this._threads = []; } }, messageSort: function(msg1, msg2) { if (msg1.parsedDate < msg2.parsedDate) { return -1; } else if (msg1.parsedDate == msg2.parsedDate) { return 0; } else { return 1; } }, updateOverlay: function () { var html = []; var count = 0; var chat, i, stats, el; var getAnchorHTML = function (chat) { var myhtml = []; myhtml.push(""); myhtml.push("' onclick='FIRSTCLASS.apps.Global.chat.toggleChat(this.getAttribute(\"threadid\"));' threadid='" +chat.messageid+"'>
 "); myhtml.push(myhtml2.join("")); myhtml.push(" x"); myhtml.push(" 
"); return myhtml.join(""); }; if (!this._overlayInitialized) { html.push("
"); for (i in this.currentChats) { chat = this.currentChats[i]; html.push(getAnchorHTML(chat)); count++; } //html.push("
 
"); stats = FIRSTCLASS.util.BuddyList.getBuddyStats(); html.push("
 " + stats.online + FIRSTCLASS.locale.chat.buddiesonline + " 
"); html.push("
"); this._overlaydiv.innerHTML = html.join(""); /*this._overlay.setBody(html.join(""));*/ this._overlayInitialized = true; } else { var container = $('fcChatOverlayContainer'); for (i in this.currentChats) { chat = this.currentChats[i]; el = $('fcChatAnchor' + chat.messageid); if (!el && chat.oldthreadid) { el = $('fcChatAnchor' + chat.oldthreadid); el.id = 'fcChatAnchor' + chat.messageid; el.setAttribute('threadid', chat.messageid); var e2 = FIRSTCLASS.ui.Dom.getChildByClassName('m', el).lastChild; e2.setAttribute('threadid', chat.messageid); //e2.lastChild.setAttribute('onclick', 'FIRSTCLASS.apps.Global.chat.closeChat(\"' + chat.messageid+'\");return true;'); delete chat.oldthreadid; } if (el) { if (chat.minimized) { YAHOO.util.Dom.removeClass(el, 'visible'); YAHOO.util.Dom.addClass(el, 'minimized'); } else { YAHOO.util.Dom.addClass(el, 'visible'); YAHOO.util.Dom.removeClass(el, 'minimized'); } var typing = false; for (var j in chat.participants) { if (j != FIRSTCLASS.session.user.cid && chat.participants[j].status > 0) { typing = true; } } var m = FIRSTCLASS.ui.Dom.getChildByClassName('m', el); if (typing) { YAHOO.util.Dom.addClass(m, 'typing'); } else { YAHOO.util.Dom.removeClass(m, 'typing'); } } else { el = document.createElement("div"); el.innerHTML = getAnchorHTML(chat); container.insertBefore(el.firstChild, container.firstChild); } } var people = $('fcChatOverlayPeople'); if (!this._mypeople || this._mypeople.minimized) { YAHOO.util.Dom.removeClass(people, 'visible'); YAHOO.util.Dom.addClass(people, 'minimized'); } else { YAHOO.util.Dom.addClass(people, 'visible'); YAHOO.util.Dom.removeClass(people, 'minimized'); } for (i = container.childNodes.length-1; i >= 0; i--) { var id = container.childNodes[i].id; if (id.indexOf('fcChatAnchor') === 0) { var threadid = id.replace('fcChatAnchor', ''); if (!this.currentChats[threadid]) { container.removeChild(container.childNodes[i]); } } } /* update my people list */ stats = FIRSTCLASS.util.BuddyList.getBuddyStats(); var label = FIRSTCLASS.locale.getStringParts(FIRSTCLASS.locale.desktop.people); people.firstChild.firstChild.childNodes[1].innerHTML = "

" + label.content + "

" + "" + stats.online + FIRSTCLASS.locale.chat.buddiesonline + "
"; } //this._overlay.hideMacGeckoScrollbars(); //this._overlay.render(document.body); el = $('chatoverlay'); if (el) { if (YAHOO.env.ua.ie == 6) { YAHOO.util.Dom.setStyle(el, 'position', 'absolute'); } else { YAHOO.util.Dom.setStyle(el, 'position', 'fixed'); } YAHOO.util.Dom.setStyle(el, 'bottom', '0'); YAHOO.util.Dom.setStyle(el, 'right', '0'); YAHOO.util.Dom.setStyle(el, 'top', ''); } //this._overlay.hideMacGeckoScrollbars(); //this._overlay.show(); //this._overlay.hideMacGeckoScrollbars(); }, updateOverlays: function () { FIRSTCLASS.apps.Global.chat.updateOverlay(); var chat; for (var i in this.currentChats) { chat = this.currentChats[i]; if (chat.isdirty || chat.showOnNextUpdate) { this.updateOverlayForChat(chat); if (FIRSTCLASS.appProperties.sounds && FIRSTCLASS.appProperties.sounds.supported && FIRSTCLASS.appProperties.sounds.im.newim) { soundManager.play("paper"); } chat.isdirty = false; } if (chat.overlay) { chat.overlay.align('bl', 'tl', [-2,0]); } if (chat.minimized) { var hasunread = false; for (var i in chat.messages) { if (chat.messages[i].status.unread) { hasunread = true; break; } } if (hasunread) { var anchor = $('fcChatAnchor'+chat.messageid); YAHOO.util.Dom.addClass(anchor, 'highlight'); } } } FIRSTCLASS.apps.Global.chat.updateOverlay(); }, updateOverlayForChat: function (chat, doShow, bringToTop) { var html, i, row, hasunread = false, lastcid = -1; this.init(); if (chat.showOnNextUpdate) { doShow = true; bringToTop = true; chat.showOnNextUpdate = false; } if (chat.messages) { chat.messages.sort(this.sortfunc); } if (!chat.overlay) { var offset = [0,0]; if (YAHOO.env.ua.ie) { offset = [0,0]; } chat.overlay = new YAHOO.widget.Panel("chatoverlay"+chat.messageid, { visible: false, width: "291px", height: "349px", constraintoviewport:true, zindex: 100, underlay: "none", draggable: false, close: false, context: [$('fcChatAnchor'+chat.messageid), 'bl', 'tl', ['beforeShow', 'windowResize', 'windowScroll', 'changeBody', 'render'], offset] }); this._manager.register(chat.overlay); chat.overlay.render(document.body); html = []; html.push("
"); html.push("
"); html.push(""); html.push(""); html.push(""); html.push(""); html.push(""); html.push(""); html.push("
"); html.push("
"); chat.overlay.setFooter(html.join("")); chat.overlay.beforeHideEvent.subscribe(function () { FIRSTCLASS.apps.Global.chat.minimizeChat(chat.messageid); }); /* chat.overlay.renderEvent.subscribe(function () { chat.overlay.align(YAHOO.widget.Overlay.BOTTOM_LEFT, YAHOO.widget.Overlay.TOP_LEFT, [0,0]); });*/ var names = ""; var first = true; for (i in chat.participants) { if (i != FIRSTCLASS.session.user.cid) { if (!first) { if (i == chat.participants.length-1) { names += FIRSTCLASS.locale.chat.and; } else { names += ", "; } } names += ""+chat.participants[i].name+""; } } chat.overlay.setHeader("

" + FIRSTCLASS.locale.chat.headerprefix + names + "

"); YAHOO.util.Dom.addClass(chat.overlay.element, 'chatoverlayboxcontainer'); YAHOO.util.Dom.addClass(chat.overlay.element.firstChild, 'chatoverlaybox'); YAHOO.util.Dom.setStyle(chat.overlay.element, 'border', 'none'); YAHOO.util.Dom.setStyle(chat.overlay.element.firstChild, 'border', 'none'); YAHOO.util.Dom.setStyle(chat.overlay.element.firstChild.firstChild, 'border', 'none'); // YAHOO.util.Dom.setStyle(chat.overlay.element, 'border-bottom', 'none'); // YAHOO.util.Dom.setStyle(chat.overlay.element.firstChild, 'border-bottom', 'none'); //var id = "chatoverlay"+chat.messages[0].threadid; } else { chat.overlay.cfg.setProperty("context", [$('fcChatAnchor'+chat.messageid), 'bl', 'tl', ['beforeShow', 'windowResize', 'windowScroll', 'changeBody', 'render'], offset]); chat.overlay.render(document.body); } if (chat.messages) { var ft = chat.overlay.footer; ft.firstChild.firstChild.action = FIRSTCLASS.lang.ensureSlashUrl(chat.dataSource.getContainerUrl()) + FIRSTCLASS.opCodes.SendIM + "?Templates=JS&JSON=2&FormID=21007"; ft.firstChild.firstChild.setAttribute('fcattrs', chat.messageid); ft.firstChild.firstChild.id = 'fcChatReply'+chat.messageid; chat.messages.sort(FIRSTCLASS.apps.Global.chat.messageSort); } html = []; var count = 0; var el=$('fcChatBody'+chat.messageid); var that = this; var isNewChat = false; var getRowHTML = function (row, plastcid, chat) { var myhtml = ""; var pv = ""; if (row.col8063) { pv = row.expandedPreview; } var date = new Date(); date.setTime(row.parsedDate); var dstr = ", " + FIRSTCLASS.util.Date.getFriendlyDateTimeString(date); if (i != that.currentNewChats.length-1) { dstr = ""; } var style = ""; if (row.status.unread) { hasunread = true; style = "background-color:#FFFFFF;"; } var msgclass ='msg'; var userclass ='them'; var participant = chat.participants[row.creatorcid]; var name = "
"+participant.name+"
"; if (row.creatorcid == FIRSTCLASS.session.user.cid) { //userclass = 'me'; //msgclass = 'mymsg'; name = "
"+FIRSTCLASS.session.user.name+"
";//""; } if (plastcid == -1) { userclass += " first"; } if (plastcid != row.creatorcid) { myhtml+="
" + name + "
"; } if (row.isvirtual) { msgclass += " virtual"; row.isvirtual = false; } myhtml += "
" + "
" + FIRSTCLASS.util.Date.getShortDateTimeString(date) + "
" + pv + "
"; return myhtml; }; var wasminimized = chat.minimized; if (el) { i = el.lastChild; if (chat.redrawbodycompletely) { el.innerHTML = ""; chat.redrawbodycompletely = false; } else { /*var virtuals = YAHOO.util.Dom.getElementsByClassName('virtual', false, el); var tmpel = document.createElement("div"); for (var i in virtuals) { FIRSTCLASS.ui.Dom.reparentNode(virtuals[i], tmpel); }*/ var virtuals = FIRSTCLASS.ui.Dom.getChildrenByClassName('virtual', el); var tmpdiv = document.createElement("div"); for (var a in virtuals) { try { FIRSTCLASS.ui.Dom.reparentNode(virtuals[a], tmpdiv); } catch(e) {} } /* while (YAHOO.util.Dom.hasClass(i,"virtual")) { el.removeChild(i); i = el.lastChild; }*/ } var lastchildmsgid = false; if (el.lastChild) { lastchildmsgid = el.lastChild.id; } var started = false; if (!lastchildmsgid) { started = true; el.innerHTML = ""; } var tmpel = document.createElement("div"); for (var j in chat.messages) { row = chat.messages[j]; if (row.messageid == lastchildmsgid && !started) { started = true; } else if (started) { var oldrow = $(row.messageid); FIRSTCLASS.session.debug.writeMessage({"module": "FIRSTCLASS.apps.Global.chat", "1": "updateoverlayforchat adding", "2": row.messageid, "3": chat}); if (oldrow && YAHOO.util.Dom.hasClass(oldrow, 'virtual')) { // get rid of old row, it's not needed anymore FIRSTCLASS.ui.Dom.reparentNode(oldrow, tmpel); } html = getRowHTML(row, lastcid, chat); tmpel.innerHTML = html; while (tmpel.firstChild) { el.appendChild(tmpel.firstChild); } } lastcid = row.creatorcid; } //chat.overlay.setBody(el); if (wasminimized) { chat.overlay.render(document.body); } el.scrollTop = el.scrollHeight; } else { html.push("
"); var index = 0; if (chat.messages.length > 10) { index = chat.messages.length - 10; } lastcid = -1; for (i = index; i < chat.messages.length; i++) { row = chat.messages[i]; html.push(getRowHTML(row, lastcid, chat)); lastcid = row.creatorcid; count++; if (row.isNewChat) { row.isNewChat = false; isNewChat = true; } } /* if (chat.chatchannel) { for (var i in chat.chatchannel.participants) { if (chat.chatchannel.participants[i].icon.icon == 9803) { html.push("
" + chat.chatchannel.participants[i].name + " is typing
"); } } }*/ html.push("
"); chat.overlay.setBody(html.join("")); } var actuallyShow = true; var chat = false; for (var i in this.currentChats) { chat = this.currentChats[i]; if (!chat.minimized) { actuallyShow = false; } } if (actuallyShow) { var isSafe = true; if (FIRSTCLASS.session.getActiveApplication() && FIRSTCLASS.session.getActiveApplication().isSafeToNavigate) { isSafe = FIRSTCLASS.session.getActiveApplication().isSafeToNavigate(); } if (!isSafe) { actuallyShow = false; } } if (actuallyShow && ((hasunread || doShow) && this._enabled)) { if (chat.minimized) { if (chat.overlay) { chat.overlay.render(document.body); } if (actuallyShow) { this.showChat(chat.messageid); } // chat.overlay.show(); } var chatbody = $('fcChatBody'+chat.messageid); chatbody.scrollTop = chatbody.scrollHeight; chat.minimized = false; } if (!chat.timeout) { chat.timeout = window.setTimeout(function () { FIRSTCLASS.apps.Global.chat.updateChatChannel(chat); chat.timeout = false; }, 1000); } if (bringToTop && wasminimized) { this._manager.bringToTop(chat.overlay); } if (isNewChat) { this.showChat(chat.messageid); var form = $("fcChatReply"+chat.messageid); var bd = form.elements['BODY'] window.setTimeout(function() { bd.disabled = false; bd.value = ""; bd.focus();bd.focus();bd.select();bd.focus(); }, 30); } }, openChat: function (cid, name) { var chat = false; for (var i in this.currentChats) { chat = this.currentChats[i]; if (chat.nparticipants == 2) { for (var j in chat.participants) { if (j == cid) { /* open this chat */ this.showChat(chat.messageid); return; } } } } this.doNewChat(cid, name); }, doNewChat: function (cid, name) { var date = new Date(); var participants = {}; participants[FIRSTCLASS.session.user.cid] = {name:FIRSTCLASS.session.user.name}; participants[cid] = {name:name}; var vrow = { status: { unread: 1, outgoing: 1 }, typedef: { objtype: 0 }, "creatorcid": cid, "name": name, "col8063": "", "expandedPreview": "", chatparticipants: { }, parsedDate: date, uri: "__FCXIM_" + cid, threadid: "CID"+cid, messageid: "CID"+cid, justsent: true, isNewChat: true }; vrow.chatparticipants = participants; FIRSTCLASS.apps.Global.chat.listener.onRow(vrow, true, true); FIRSTCLASS.apps.Global.chat.listener.fillFinished(); }, updateChatFolderID: function (chat, newfolderid) { // do something if (chat.messageid == newfolderid) { return; } else { var offset = [0,0]; var oldfid = chat.messageid; chat.messages.splice(0,1); chat.messageid = newfolderid; chat.oldthreadid = oldfid; chat.redrawbodycompletely = true; this.currentChats[newfolderid] = chat; this.currentChats[oldfid] = false; delete this.currentChats[oldfid]; this.updateOverlay(); this.updateOverlayForChat(chat); var oldform = chat.overlay.footer.firstChild.firstChild; if (oldform) { oldform.id = 'fcChatReply'+newfolderid; } chat.overlay.cfg.setProperty("context", [$('fcChatAnchor'+chat.messageid), 'bl', 'tl', ['beforeShow', 'windowResize', 'windowScroll', 'changeBody', 'render'], offset]); //chat.overlay.render(document.body); var input = FIRSTCLASS.ui.Dom.getChildByClassName("fcInlineReplyInput", chat.overlay.footer.firstChild); if (input) { input.setAttribute('fcattrs', newfolderid); } else { debugger; } } }, minimizeChat: function (messageid, nofetch) { var chat = this.currentChats[messageid]; if (messageid == "mypeople") { chat = this._mypeople; nofetch = true; } if (chat) { if (chat.minimized) { return; } if (chat.messages) { chat.dataSource.toggleUnreadRows(chat.messages); } //chat.messages = false; chat.minimized = true; if (chat.overlay) { chat.overlay.hide(); } /*if (!nofetch) { this._chatfolderds.fetchRowsByThread(threadid); }*/ } this.updateOverlay(); /*if (chat.overlay) { chat.overlay.hide(); }*/ }, toggleChat: function (messageid) { var chat = this.currentChats[messageid]; if (messageid == "mypeople") { chat = this._mypeople; } if (chat) { if (chat.minimized) { this.showChat(messageid); } else { this.minimizeChat(messageid); //this.closeChat(threadid); } } }, showWindow: function (overlay, chat) { for (var i in this.currentChats) { if (this.currentChats[i] != chat) { this.minimizeChat(this.currentChats[i].messageid, true); } } this._mypeople.overlay.hide(); this._mypeople.minimized = true; YAHOO.util.Dom.removeClass('fcChatOverlayPeople', 'visible'); YAHOO.util.Dom.addClass('fcChatOverlayPeople', 'minimized'); /* if (chat) { var offset = [0,0]; var anchor = $('fcChatAnchor'+chat.messageid); overlay.cfg.setProperty("context", [anchor, 'bl', 'tl', ['beforeShow', 'windowResize', 'windowScroll', 'changeBody', 'render'], offset]); }*/ /*if (chat) { var xy = [0,0]; var anchor = $('fcChatAnchor'+chat.messageid); var axy = YAHOO.util.Dom.getXY(anchor); xy[0] = axy[0]; xy[1] = axy[1]-349; overlay.cfg.setProperty("xy", xy); }*/ overlay.show(); overlay.render(document.body); if (YAHOO.env.ua.ie) { YAHOO.util.Dom.setStyle(overlay.element.parentNode, 'position', ""); YAHOO.util.Dom.setStyle(overlay.element, 'position', ""); } this._manager.bringToTop(overlay); }, showChat: function (chatid) { if (chatid == "mypeople") { this.showWindow(this._mypeople.overlay); this._mypeople.minimized = false; YAHOO.util.Dom.addClass('fcChatOverlayPeople', 'visible'); YAHOO.util.Dom.removeClass('fcChatOverlayPeople', 'minimized'); this._mypeople.overlay.render(document.body); } else { var chat = this.currentChats[chatid]; if (chat) { this.disable(); if (chat.messages || chatid.indexOf("CID") === 0) { this.updateOverlayForChat(chat, true); // this._chatfolderds.fetchRowsByThread(threadid); } else { chat.showOnNextUpdate = true; // this._chatfolderds.fetchRowsByThread(threadid); } if (chatid.indexOf("CID") < 0) { //this._chatfolderds.fetchRowsByThread(threadid); } this.enable(); //this._manager.hideAll(); chat.minimized = false; this.updateOverlay(); this.showWindow(chat.overlay, chat); if (chat.messages) { chat.dataSource.toggleUnreadRows(chat.messages); } var chatbody = $('fcChatBody'+chat.messageid); chatbody.scrollTop = chatbody.scrollHeight; var anchor = $('fcChatAnchor'+chat.messageid); YAHOO.util.Dom.removeClass(anchor, 'highlight'); var form = $('fcChatReply'+chatid); if (form) { var bd = form.elements['BODY'] window.setTimeout(function() { bd.disabled = false; bd.focus();bd.focus();bd.select();bd.focus(); }, 30); } this.updateChatAttrs(chatid, {open: true}); } } }, closeChat: function (chatid) { var chat = this.currentChats[chatid]; this.minimizeChat(chatid, true); // this.updateChatAttrs(chatid, {open: false}); // no longer place closed chats into cold storage this.currentChats[chatid] = false; delete this.currentChats[chatid]; this.updateOverlay(); this._manager.remove(chat.overlay); chat.overlay.destroy(); /*chat.overlay.element.innerHTML = ""; var div = document.createElement("div"); FIRSTCLASS.ui.Dom.reparentNode(chat.overlay.element, div); div.innerHTML = "";*/ }, updateChatAttrs: function(chatid, attrs) { var chat = this.currentChats[chatid]; var bAttrs = 0; if (attrs.open) { bAttrs = FIRSTCLASS.lang.binary.OR(bAttrs,0x001); } this._chatfolderds.updateFieldData(chat.row, [{id:8133, type:"LONG", value:bAttrs}]); }, hideOverlay: function () { this.currentNewChats = []; YAHOO.util.Dom.setStyle(this._overlaydiv, 'display', 'none'); //this._overlay.hide(); }, sortfunc: function (row1, row2) { if (row1.parsedDate > row2.parsedDate) { return 1; } else if (row1.parsedDate == row2.parsedDate) { return 0; } else { return -1; } }, scrollCurrentChatToBottom: function() { var chat = false; for (var i in this.currentChats) { chat = this.currentChats[i]; if (!chat.minimized && chat.overlay && chat.overlay.element) { var body = FIRSTCLASS.ui.Dom.getChildByIdName('fcChatBody'+chat.messageid, chat.overlay.element); body.scrollTop = body.scrollHeight; } } }, parseChatChannel: function (chatchannel) { return; var chat = false; var found = false; for (var i in this.currentChats) { chat = this.currentChats[i]; for (var j in chat.participants) { if (chat.participants[j] == chatchannel.from) { found = true; break; } else { chat = false; } } if (found) { break; } } if (chat) { /* found the chat to match with this channel */ if (!chat.chatchannel) { FIRSTCLASS.util.net.doAsyncGet({action:chatchannel.aurl, callbacks:this.chatChannelCallbacks}); } chat.chatchannel = chatchannel; this.updateOverlayForChat(chat); } }, updateChatChannel: function (chat) { if (chat.chatchannel) { FIRSTCLASS.util.net.doAsyncGet({action:chat.chatchannel.durl,callbacks:this.chatChannelCallbacks}); } }, chatChannelCallbacks: { success: function (response) { var obj = false; try { obj = response.responseJSON; if (!obj) { throw "JSON parse failed"; } } catch(e) { //debugger; } if (obj) { FIRSTCLASS.apps.Global.chat.parseChatChannel(obj); } }, failure: function (response) { // do nothing for now } }, sendReply: function (chatid) { var form = $('fcChatReply'+chatid); if (form) { if (form.elements["BODY"].value != "") { var bd = form.elements["BODY"].value; form.elements["BODY"].blur(); form.elements["BODY"].disabled = true; FIRSTCLASS.apps.Global.chat.inlinereplycallbacks._form = form; var date = new Date(); var vrow = { status: { unread: 0, outgoing: 1 }, "creatorcid": FIRSTCLASS.session.user.cid, "name": FIRSTCLASS.session.user.name, "col8063": FIRSTCLASS.util.expandHashTags(FIRSTCLASS.lang.mlesc(form.elements["BODY"].value).parseURLS(23,23).replace(/\n/g,"
")), "expandedPreview": FIRSTCLASS.util.expandHashTags(FIRSTCLASS.lang.mlesc(form.elements["BODY"].value).parseURLS(23,23).replace(/\n/g,"
")), parsedDate: date, uri: "virtual", threadid: chatid, messageid: "virtual", isvirtual: true }; FIRSTCLASS.apps.Global.chat._lastreplyvrow = vrow; var frm = { elements: [ {name:"KeepNames", value: 1}, {name:'charset', value:'UTF-8'}, {name:'BODYTYPE', value:'ALTHTML'}, {name:'Quote', value:'0'}, {name:"BODY", value:FIRSTCLASS.lang.mlesc(bd).replace(/\n/g,"
")} ]}; //form.elements["BODY"].value = ""; if (chatid.indexOf("CID") === 0) { var uri = FIRSTCLASS.session.baseURL + FIRSTCLASS.opCodes.SendIM +"?Templates=JS&JSON=2&FormID=21007"; var tmpel = document.createElement("div"); tmpel.innerHTML = form.parentNode.innerHTML; var msg = bd; form = FIRSTCLASS.ui.Dom.getChildByIdName('fcChatReply'+chatid, tmpel); form.elements["BODY"].value = msg; form.action = uri; tmpel.innerHTML = ""; //frm.elements.push({name:'To', value:chatid}); form.appendChild(tmpel.firstChild); } else { var chat = FIRSTCLASS.apps.Global.chat.currentChats[chatid]; /*for (var j in chat.participants) { frm.elements.push({name:'To', value:"CID"+j}); }*/ } frm.action = form.action; FIRSTCLASS.util.net.doAsyncPost({form: frm, upload: false, callbacks: FIRSTCLASS.apps.Global.chat.inlinereplycallbacks}); } } }, updateTypingIndicator: function (chatid) { var form = $('fcChatReply'+chatid); var chat = FIRSTCLASS.apps.Global.chat.currentChats[chatid]; if (form) { var typing = (form.elements["BODY"].value != ""); if (chat.typing != typing) { var status = 0; if (typing) { status = 4; } // chat.dataSource.updateContainerFieldData([{name:"FCXChatCommand", type:"LONG", value: "" + status}]); var uri = chat.dataSource.getContainerUrl() + "?Templates=JS&JSON=2&FCXChatCommand=" + status; FIRSTCLASS.util.net.doAsyncGet(uri); chat.typing = typing; } } }, inlinereplycallbacks: { success: function (response) { if (false && this._form) { var body = this._form.elements['BODY']; body.disabled = false; body.value = ""; /*this._form.focus();*/ body.focus();body.focus();body.focus();body.select(); /*body.blur();*/ } var obj = false; try { obj = response.responseJSON; //FIRSTCLASS.lang.JSON.parse(response.responseText); } catch(e) { } var vrow = FIRSTCLASS.apps.Global.chat._lastreplyvrow; var chatid = vrow.threadid; if (obj && obj.item) { var chat = FIRSTCLASS.apps.Global.chat.currentChats[vrow.threadid]; if (obj.lastmods && false) { obj.parsedDate = new Date(); obj.parsedDate.setTime(obj.lastmods*1000); vrow.parsedDate = obj.parsedDate; } else if (chat.messages.length > 0) { var date = chat.messages[chat.messages.length-1].parsedDate; var tm = date.getTime() + 1000; vrow.parsedDate.setTime(tm); } vrow.threadid = obj.item.threadid; vrow.messageid = obj.item.messageid; vrow.uri = obj.item.hmessageid.replace("[", "").replace("]", "").replace(":","-"); // vrow.uri = "virtual"+obj.item.messageid; chat.messages.push(vrow); //FIRSTCLASS.apps.Global.chat.updateChatFolderID(chat, chat.messageid); FIRSTCLASS.apps.Global.chat.updateOverlayForChat(chat); chat.dataSource.fetchRows(false, false, {startIndex: 0, endIndex:10}); } if (false && this._form) { var body = this._form.elements['BODY']; body.focus(); } /*window.setTimeout(function() { FIRSTCLASS.apps.Global.chat._chatfolderds.fetchRowsByThread(vrow.threadid); }, 200);*/ if (this._form) { var bd = this._form.elements['BODY'] window.setTimeout(function() { bd.disabled = false; bd.value = ""; bd.focus();bd.focus();bd.select();bd.focus(); FIRSTCLASS.apps.Global.chat.updateTypingIndicator(chatid); }, 30); } }, failure: function (response) { /* var vrow = FIRSTCLASS.apps.Global.chat._lastreplyvrow; var chat = FIRSTCLASS.apps.Global.chat.currentChats[vrow.threadid]; chat.refreshingAfterFailure = true; FIRSTCLASS.apps.Global.chat._chatfolderds.fetchRowsByThread(vrow.threadid);*/ if (this._form) { var body = this._form.elements['BODY']; body.value = FIRSTCLASS.locale.chat.sendfailed; body.disabled = false; } } }, sendIM: function (cid, message) { if (message != "") { var el = document.createElement("div"); var html = []; var uri = FIRSTCLASS.session.baseURL + FIRSTCLASS.opCodes.SendIM; html.push("
"); html.push(""); html.push(""); html.push(""); html.push(""); // html.push(""); html.push(""); html.push(""); html.push("
"); el.innerHTML = html.join(""); FIRSTCLASS.util.net.doAsyncPost({form: el.firstChild, upload: false, callbacks: FIRSTCLASS.apps.Global.chat.sendIMCB}); this._lastmessage = message; this._lastcid = cid; } }, sendIMCB: { success: function (response) { var obj = false; try { obj = response.responseJSON;//FIRSTCLASS.lang.JSON.parse(response.responseText); } catch(e) { } // create chat window if (obj && obj.item) { var date = new Date(); var vrow = { status: { unread: 0, outgoing: 1 }, //"creatorcid": FIRSTCLASS.session.user.cid, "name": FIRSTCLASS.session.user.name, "col8063": FIRSTCLASS.lang.mlesc(FIRSTCLASS.apps.Global.chat._lastmessage).parseURLS(23,23), "expandedPreview": FIRSTCLASS.lang.mlesc(FIRSTCLASS.apps.Global.chat._lastmessage).parseURLS(23,23), parsedDate: date, uri: obj.item.hmessageid.replace("[", "").replace("]", "").replace(":","-"), threadid: obj.item.threadid, messageid: obj.item.messageid, creatorcid: FIRSTCLASS.apps.Global.chat._lastcid, justsent: true, isvirtual: true }; FIRSTCLASS.apps.Global.chat.listener.onRow(vrow, true, true); FIRSTCLASS.apps.Global.chat._chatfolderds.fetchRowsByThread(obj.item.threadid); } }, failure: function (response) { var obj = false; try { obj = response.responseJSON;//FIRSTCLASS.lang.JSON.parse(response.responseText); } catch(e) { } // hmm } }, disable: function () { this._enabled = false; }, enable: function () { this._enabled = true; } } }; YAHOO.register("fcChat", FIRSTCLASS.apps.Global, {version: "0.0.1", build: "1"});