| 7 | | var currentRequest = null; |
|---|
| 8 | | |
|---|
| 9 | | function createRequestObject() { |
|---|
| 10 | | if( navigator.appName == "Microsoft Internet Explorer" ) |
|---|
| 11 | | return new ActiveXObject( "Microsoft.XMLHTTP" ); |
|---|
| 12 | | return new XMLHttpRequest(); |
|---|
| 13 | | } |
|---|
| 14 | | |
|---|
| 15 | | function setup() { |
|---|
| 16 | | document.body.addEventListener( "keypress", documentKeyInput, true ); |
|---|
| 17 | | document.getElementById( "input" ).addEventListener( "keypress", inputKeyPressed, false ); |
|---|
| 18 | | document.body.addEventListener( "blur", windowBlured, false ); |
|---|
| 19 | | document.body.addEventListener( "focus", windowFocused, false ); |
|---|
| 20 | | |
|---|
| 21 | | currentRequest = createRequestObject(); |
|---|
| 22 | | currentRequest.onreadystatechange = processSetup; |
|---|
| 23 | | currentRequest.open( "GET", "/command/setup" ); |
|---|
| 24 | | currentRequest.send( null ); |
|---|
| 25 | | } |
|---|
| 26 | | |
|---|
| 27 | | function windowBlured() { |
|---|
| 28 | | foreground = false; |
|---|
| 29 | | document.getElementById( "timer" ).innerText = "blured"; |
|---|
| 30 | | } |
|---|
| 31 | | |
|---|
| 32 | | function windowFocused() { |
|---|
| 33 | | foreground = true; |
|---|
| 34 | | activePanel.newMessage = 0; |
|---|
| 35 | | activePanel.newHighlightMessage = 0; |
|---|
| 36 | | activePanel.listItem.className = activePanel.listItem.className.replace( /\s*newMessage/g, "" ); |
|---|
| 37 | | activePanel.listItem.className = activePanel.listItem.className.replace( /\s*newHighlight/g, "" ); |
|---|
| 38 | | activePanel.listItem.title = "No messages waiting"; |
|---|
| 39 | | document.getElementById( "timer" ).innerText = "focused"; |
|---|
| 40 | | } |
|---|
| 41 | | |
|---|
| 42 | | function checkQueue() { |
|---|
| 43 | | currentRequest = createRequestObject(); |
|---|
| 44 | | currentRequest.onreadystatechange = processQueue; |
|---|
| 45 | | currentRequest.open( "GET", "/command/checkActivity" ); |
|---|
| 46 | | currentRequest.send( null ); |
|---|
| 47 | | } |
|---|
| 48 | | |
|---|
| 49 | | function panelForIdentifier( id ) { |
|---|
| 50 | | for( var i = 0; i < panels.length; i++ ) |
|---|
| 51 | | if( panels[i].id == id ) |
|---|
| 52 | | return panels[i]; |
|---|
| 53 | | return null; |
|---|
| 54 | | } |
|---|
| 55 | | |
|---|
| 56 | | function switchPanel( id ) { |
|---|
| 57 | | for( var i = 0; i < panels.length; i++ ) { |
|---|
| 58 | | var panel = panels[i]; |
|---|
| 59 | | if( panel.id == id ) { |
|---|
| | 16 | |
|---|
| | 17 | var ChatController = { |
|---|
| | 18 | panels: new Array() |
|---|
| | 19 | }; |
|---|
| | 20 | |
|---|
| | 21 | ChatController.createPanel = function( node ) { |
|---|
| | 22 | var type = node.getAttribute( "class" ); |
|---|
| | 23 | if( type == "JVDirectChatPanel" ) |
|---|
| | 24 | return new DirectChatPanel( node ); |
|---|
| | 25 | else if( type == "JVChatRoomPanel" ) |
|---|
| | 26 | return new ChatRoomPanel( node ); |
|---|
| | 27 | return undefined; |
|---|
| | 28 | }; |
|---|
| | 29 | |
|---|
| | 30 | ChatController.panel = function( id ) { |
|---|
| | 31 | for( var i = 0, l = this.panels.length; i < l; ++i ) |
|---|
| | 32 | if( this.panels[i].id == id ) return this.panels[i]; |
|---|
| | 33 | return undefined; |
|---|
| | 34 | } |
|---|
| | 35 | |
|---|
| | 36 | ChatController.checkActivity = function() { |
|---|
| | 37 | new Ajax.Request( "/command/checkActivity", { |
|---|
| | 38 | method: "get", |
|---|
| | 39 | onSuccess: function( transport ) { |
|---|
| | 40 | var updateIntervalDelta = 100; |
|---|
| | 41 | |
|---|
| | 42 | if( transport.responseText && transport.responseXML ) { |
|---|
| | 43 | var children = transport.responseXML.documentElement.childNodes; |
|---|
| | 44 | for( var i = 0; i < children.length; ++i ) { |
|---|
| | 45 | switch( children[i].tagName ) { |
|---|
| | 46 | case "open": |
|---|
| | 47 | ChatController.createPanel( children[i] ); |
|---|
| | 48 | break; |
|---|
| | 49 | case "close": |
|---|
| | 50 | var panel = ChatController.panel( children[i].getAttribute( "identifier" ) ); |
|---|
| | 51 | panel.close(); |
|---|
| | 52 | break; |
|---|
| | 53 | case "message": |
|---|
| | 54 | var message = children[i]; |
|---|
| | 55 | if( message.firstChild ) { |
|---|
| | 56 | var panel = ChatController.panel( message.getAttribute( "panel" ) ); |
|---|
| | 57 | panel.appendMessage( message.firstChild.nodeValue ); |
|---|
| | 58 | if( ( ( ! foreground && panel.active ) || ! panel.active ) && ! panel.listItem.hasClassName( "newMessage" ) ) { |
|---|
| | 59 | panel.listItem.addClassName( "newMessage" ); |
|---|
| | 60 | panel.newMessage++; |
|---|
| | 61 | panel.listItem.title = panel.newMessage + " messages waiting"; |
|---|
| | 62 | } |
|---|
| | 63 | } |
|---|
| | 64 | break; |
|---|
| | 65 | } |
|---|
| | 66 | } |
|---|
| | 67 | |
|---|
| | 68 | if( children.length >= 1 ) |
|---|
| | 69 | updateIntervalDelta = ( -500 * children.length ) - 100; |
|---|
| | 70 | } |
|---|
| | 71 | |
|---|
| | 72 | var newActivityCheckSpeed = Math.max( Math.min( ( activityCheckSpeed + updateIntervalDelta ), 4000 ), 500 ); |
|---|
| | 73 | if( newActivityCheckSpeed != activityCheckSpeed ) { |
|---|
| | 74 | activityCheckSpeed = newActivityCheckSpeed; |
|---|
| | 75 | |
|---|
| | 76 | clearInterval( activityCheckInterval ); |
|---|
| | 77 | activityCheckInterval = setInterval( ChatController.checkActivity, activityCheckSpeed ); |
|---|
| | 78 | |
|---|
| | 79 | $("timer").innerText = activityCheckSpeed / 1000 + " secs"; |
|---|
| | 80 | } |
|---|
| | 81 | }, |
|---|
| | 82 | onFailure: function( transport ) { |
|---|
| | 83 | clearInterval( activityCheckInterval ); |
|---|
| | 84 | activityCheckInterval = setInterval( ChatController.checkActivity, 1000 ); |
|---|
| | 85 | }, |
|---|
| | 86 | onException: function( transport, exception ) { |
|---|
| | 87 | throw exception; |
|---|
| | 88 | } |
|---|
| | 89 | } ); |
|---|
| | 90 | }; |
|---|
| | 91 | |
|---|
| | 92 | function Panel( node ) { |
|---|
| | 93 | var panel = this; |
|---|
| | 94 | |
|---|
| | 95 | this.id = node.getAttribute( "identifier" ); |
|---|
| | 96 | this.name = node.getAttribute( "name" ); |
|---|
| | 97 | this.server = node.getAttribute( "server" ); |
|---|
| | 98 | this.type = node.getAttribute( "class" ); |
|---|
| | 99 | this.active = false; |
|---|
| | 100 | |
|---|
| | 101 | this.listItem = $(document.createElement( "li" )); |
|---|
| | 102 | this.listItem.className = "listItem"; |
|---|
| | 103 | this.listItem.addEventListener( "click", function( event ) { panel.show(); }, false ); |
|---|
| | 104 | this.listItem.appendChild( document.createTextNode( this.name ) ); |
|---|
| | 105 | |
|---|
| | 106 | this.frame = $(document.createElement( "iframe" )); |
|---|
| | 107 | this.frame.className = "panel"; |
|---|
| | 108 | |
|---|
| | 109 | if( ChatController.panels.length ) |
|---|
| | 110 | this.frame.style.setProperty( "visibility", "hidden", "" ); |
|---|
| | 111 | |
|---|
| | 112 | ChatController.panels.push( this ); |
|---|
| | 113 | $("panelList").appendChild( this.listItem ); |
|---|
| | 114 | $("panels").appendChild( this.frame ); |
|---|
| | 115 | |
|---|
| | 116 | if( ChatController.panels.length == 1 ) |
|---|
| | 117 | this.show(); |
|---|
| | 118 | } |
|---|
| | 119 | |
|---|
| | 120 | Panel.prototype.toString = function() { |
|---|
| | 121 | return this.name + " (" + this.type + ":" + this.id + ")"; |
|---|
| | 122 | } |
|---|
| | 123 | |
|---|
| | 124 | Panel.prototype.show = function() { |
|---|
| | 125 | for( var i = 0, l = ChatController.panels.length; i < l; ++i ) { |
|---|
| | 126 | var panel = ChatController.panels[i]; |
|---|
| | 127 | if( panel.id == this.id ) { |
|---|
| 79 | | function toggleMemberList( event, id ) { |
|---|
| 80 | | var panel = panelForIdentifier( id ); |
|---|
| 81 | | panel.memberListVisible = ! panel.memberListVisible; |
|---|
| 82 | | if( panel.memberListVisible ) panel.memberList.style.setProperty( "display", "none", "" ); |
|---|
| 83 | | else panel.memberList.style.setProperty( "display", "block", "" ); |
|---|
| 84 | | event.preventDefault(); |
|---|
| 85 | | event.stopPropagation(); |
|---|
| 86 | | } |
|---|
| 87 | | |
|---|
| 88 | | function createPanel( node ) { |
|---|
| 89 | | if( panelForIdentifier( node.getAttribute( "identifier" ) ) ) return; |
|---|
| 90 | | |
|---|
| 91 | | var panel = new Object(); |
|---|
| 92 | | panel.id = node.getAttribute( "identifier" ); |
|---|
| 93 | | panel.name = node.getAttribute( "name" ); |
|---|
| 94 | | panel.server = node.getAttribute( "server" ); |
|---|
| 95 | | panel.type = node.getAttribute( "class" ); |
|---|
| 96 | | panel.newMessage = 0; |
|---|
| 97 | | panel.newHighlightMessage = 0; |
|---|
| 98 | | panel.active = false; |
|---|
| 99 | | panel.memberListVisible = false; |
|---|
| 100 | | panel.frame = document.createElement( "iframe" ); |
|---|
| 101 | | panel.listItem = document.createElement( "li" ); |
|---|
| 102 | | panels.push( panel ); |
|---|
| 103 | | |
|---|
| 104 | | panel.frame.id = "panel" + panel.id; |
|---|
| 105 | | panel.frame.className = "panel"; |
|---|
| 106 | | panel.frame.src = "/command/panelContents?panel=" + panel.id; |
|---|
| 107 | | if( panels.length > 1 ) panel.frame.style.setProperty( "visibility", "hidden", "" ); |
|---|
| 108 | | document.getElementById( "panels" ).appendChild( panel.frame ); |
|---|
| 109 | | |
|---|
| 110 | | panel.listItem.id = "listItem" + panel.id; |
|---|
| 111 | | panel.listItem.className = "listItem"; |
|---|
| 112 | | |
|---|
| 113 | | if( panel.type == "JVChatRoomPanel" ) { |
|---|
| 114 | | panel.listItem.className += " chatRoom"; |
|---|
| 115 | | panel.members = new Array(); |
|---|
| 116 | | panel.memberList = document.createElement( "ol" ); |
|---|
| 117 | | panel.memberList.className = "memberList"; |
|---|
| 118 | | panel.memberList.style.setProperty( "display", "none", "" ); |
|---|
| 119 | | |
|---|
| 120 | | var memberNode = null; |
|---|
| 121 | | var members = node.childNodes; |
|---|
| 122 | | for( var i = 0; i < members.length; i++ ) { |
|---|
| 123 | | memberNode = members[i]; |
|---|
| 124 | | |
|---|
| 125 | | var member = new Object(); |
|---|
| 126 | | member.name = memberNode.firstChild.nodeValue; |
|---|
| 127 | | member.nickname = memberNode.getAttribute( "nickname" ); |
|---|
| 128 | | member.hostmask = memberNode.getAttribute( "hostmask" ); |
|---|
| 129 | | member.identifier = memberNode.getAttribute( "identifier" ); |
|---|
| 130 | | member.buddy = memberNode.getAttribute( "buddy" ); |
|---|
| 131 | | member.type = memberNode.getAttribute( "class" ); |
|---|
| 132 | | member.self = ( memberNode.getAttribute( "self" ) == "yes" ); |
|---|
| 133 | | panel.members.push( member ); |
|---|
| 134 | | |
|---|
| 135 | | member.listItem = document.createElement( "li" ); |
|---|
| 136 | | member.listItem.title = member.hostmask; |
|---|
| 137 | | member.listItem.className = "listItem member" + ( member.type ? " " + member.type : "" ); |
|---|
| 138 | | member.listItem.appendChild( document.createTextNode( member.name ) ); |
|---|
| 139 | | panel.memberList.appendChild( member.listItem ); |
|---|
| | 147 | Panel.prototype.close = function() { |
|---|
| | 148 | for( var i = 0, l = ChatController.panels.length; i < l; ++i ) |
|---|
| | 149 | if( ChatController.panels[i].id == this.id ) break; |
|---|
| | 150 | |
|---|
| | 151 | if( i < ChatController.panels.length ) |
|---|
| | 152 | ChatController.panels.slice( i, 1 ); |
|---|
| | 153 | |
|---|
| | 154 | this.frame.parentNode.removeChild( this.frame ); |
|---|
| | 155 | this.listItem.parentNode.removeChild( this.listItem ); |
|---|
| | 156 | |
|---|
| | 157 | ChatController.panels[0].show(); |
|---|
| | 158 | } |
|---|
| | 159 | |
|---|
| | 160 | function DirectChatPanel( node ) { |
|---|
| | 161 | DirectChatPanel.baseConstructor.call( this, node ); |
|---|
| | 162 | |
|---|
| | 163 | this.newMessage = 0; |
|---|
| | 164 | this.newHighlightMessage = 0; |
|---|
| | 165 | |
|---|
| | 166 | this.listItem.addClassName( "directChat" ); |
|---|
| | 167 | |
|---|
| | 168 | var panel = this; |
|---|
| | 169 | this.frame.onload = function() { |
|---|
| | 170 | panel.contentFrame = $(panel.frame.document.getElementById( "content" )); |
|---|
| | 171 | panel.contentFrame.onload = function() { panel.scrollToBottom() }; |
|---|
| | 172 | panel.contentFrame.src = "/command/panelContents?panel=" + panel.id; |
|---|
| | 173 | }; |
|---|
| | 174 | |
|---|
| | 175 | this.frame.src = "/resources/base.html"; |
|---|
| | 176 | } |
|---|
| | 177 | |
|---|
| | 178 | extendClass( DirectChatPanel, Panel ); |
|---|
| | 179 | |
|---|
| | 180 | DirectChatPanel.prototype.sendMessage = function( html ) { |
|---|
| | 181 | if( ! html.length ) return; |
|---|
| | 182 | |
|---|
| | 183 | new Ajax.Request( "/command/send?panel=" + this.id, { |
|---|
| | 184 | method: "post", |
|---|
| | 185 | contentType: "text/html", |
|---|
| | 186 | postBody: html, |
|---|
| | 187 | onSuccess: function( transport ) { |
|---|
| | 188 | clearInterval( activityCheckInterval ); |
|---|
| | 189 | activityCheckInterval = setInterval( ChatController.checkActivity, 250 ); |
|---|
| | 190 | }, |
|---|
| | 191 | onException: function( transport, exception ) { |
|---|
| | 192 | throw exception; |
|---|
| 141 | | } else if( panel.type == "JVDirectChatPanel" ) panel.listItem.className += " directChat"; |
|---|
| 142 | | |
|---|
| 143 | | panel.listItem.setAttribute( "onclick", "switchPanel(" + panel.id + ")" ); |
|---|
| 144 | | panel.listItem.setAttribute( "ondblclick", "toggleMemberList(event," + panel.id + ")" ); |
|---|
| 145 | | panel.listItem.appendChild( document.createTextNode( panel.name ) ); |
|---|
| 146 | | document.getElementById( "panelList" ).appendChild( panel.listItem ); |
|---|
| 147 | | if( panel.memberList ) document.getElementById( "panelList" ).appendChild( panel.memberList ); |
|---|
| 148 | | |
|---|
| 149 | | setTimeout( scrollToBottom, 50, panel.frame ); |
|---|
| 150 | | |
|---|
| 151 | | if( panels.length == 1 ) switchPanel( panel.id ); |
|---|
| 152 | | } |
|---|
| 153 | | |
|---|
| 154 | | function closePanel( id ) { |
|---|
| 155 | | for( var i = 0; i < panels.length; i++ ) |
|---|
| 156 | | if( panels[i].id == id ) break; |
|---|
| 157 | | |
|---|
| 158 | | if( i >= panels.length ) return; |
|---|
| 159 | | |
|---|
| 160 | | var panel = panels[i]; |
|---|
| 161 | | panels.slice( i, 1 ); |
|---|
| 162 | | |
|---|
| 163 | | panel.frame.parentNode.removeChild( panel.frame ); |
|---|
| 164 | | panel.listItem.parentNode.removeChild( panel.listItem ); |
|---|
| 165 | | |
|---|
| 166 | | switchPanel( panels[0].id ); |
|---|
| 167 | | } |
|---|
| 168 | | |
|---|
| 169 | | function processSetup() { |
|---|
| 170 | | if( currentRequest.readyState == 4 && currentRequest.status == 200 ) { |
|---|
| 171 | | var xml = currentRequest.responseXML; |
|---|
| 172 | | var children = xml.documentElement.getElementsByTagName( "panels" ).item( 0 ).childNodes; |
|---|
| 173 | | |
|---|
| 174 | | for( var i = 0; i < children.length; i++ ) |
|---|
| 175 | | createPanel( children[i] ); |
|---|
| 176 | | |
|---|
| 177 | | checkQueue(); |
|---|
| 178 | | queueCheckInterval = setInterval( checkQueue, queueCheckSpeed ); |
|---|
| 179 | | } |
|---|
| 180 | | } |
|---|
| 181 | | |
|---|
| 182 | | function processQueue() { |
|---|
| 183 | | if( currentRequest.readyState == 4 && currentRequest.status == 200 && currentRequest.responseText.length ) { |
|---|
| 184 | | var xml = currentRequest.responseXML; |
|---|
| 185 | | var children = xml.documentElement.childNodes; |
|---|
| 186 | | |
|---|
| 187 | | var messages = 0; |
|---|
| 188 | | for( var i = 0; i < children.length; i++ ) { |
|---|
| 189 | | switch( children[i].tagName ) { |
|---|
| 190 | | case "open": |
|---|
| 191 | | createPanel( children[i] ); |
|---|
| 192 | | break; |
|---|
| 193 | | case "close": |
|---|
| 194 | | closePanel( children[i].getAttribute( "identifier" ) ); |
|---|
| 195 | | break; |
|---|
| 196 | | case "message": |
|---|
| 197 | | messages++; |
|---|
| 198 | | var message = children[i]; |
|---|
| 199 | | var id = message.getAttribute( "panel" ); |
|---|
| 200 | | if( message.firstChild ) { |
|---|
| 201 | | appendMessage( id, message.firstChild.nodeValue ); |
|---|
| 202 | | var panel = panelForIdentifier( id ); |
|---|
| 203 | | if( ( ( ! foreground && panel.active ) || ! panel.active ) && panel.listItem.className.indexOf( "newMessage" ) == -1 ) { |
|---|
| 204 | | panel.listItem.className += " newMessage"; |
|---|
| 205 | | panel.newMessage++; |
|---|
| 206 | | panel.listItem.title = panel.newMessage + " messages waiting"; |
|---|
| 207 | | } |
|---|
| 208 | | } |
|---|
| 209 | | break; |
|---|
| 210 | | } |
|---|
| 211 | | } |
|---|
| 212 | | |
|---|
| 213 | | if( messages >= 1 ) { |
|---|
| 214 | | queueCheckSpeed -= ( 500 * messages ); |
|---|
| 215 | | if( queueCheckSpeed < 500 ) queueCheckSpeed = 500; |
|---|
| 216 | | clearInterval( queueCheckInterval ); |
|---|
| 217 | | queueCheckInterval = setInterval( checkQueue, queueCheckSpeed ); |
|---|
| 218 | | document.getElementById( "timer" ).innerText = queueCheckSpeed / 1000 + " secs"; |
|---|
| 219 | | } |
|---|
| 220 | | } else if( currentRequest.readyState == 4 ) { |
|---|
| 221 | | if( queueCheckSpeed < 4000 ) { |
|---|
| 222 | | queueCheckSpeed += 100; |
|---|
| 223 | | if( queueCheckSpeed > 4000 ) queueCheckSpeed = 4000; |
|---|
| 224 | | clearInterval( queueCheckInterval ); |
|---|
| 225 | | queueCheckInterval = setInterval( checkQueue, queueCheckSpeed ); |
|---|
| 226 | | document.getElementById( "timer" ).innerText = queueCheckSpeed / 1000 + " secs"; |
|---|
| 227 | | } |
|---|
| 228 | | } |
|---|
| 229 | | } |
|---|
| 230 | | |
|---|
| 231 | | function documentKeyInput( event ) { |
|---|
| 232 | | if( event.target.id == "input" || event.target.parentNode.id == "input" ) return; |
|---|
| 233 | | if( event.keyCode == 13 && ! event.altKey ) inputKeyPressed( event ); |
|---|
| 234 | | else if( event.keyCode == 32 ) input.innerHTML += " "; |
|---|
| 235 | | else input.innerHTML += String.fromCharCode( event.keyCode ); |
|---|
| 236 | | } |
|---|
| 237 | | |
|---|
| 238 | | function inputKeyPressed( event ) { |
|---|
| 239 | | if( event.keyCode == 13 && ! event.altKey ) { |
|---|
| 240 | | var input = document.getElementById( "input" ); |
|---|
| 241 | | sendMessage( activePanel.id, input.innerText ); |
|---|
| 242 | | input.innerHTML = ""; |
|---|
| 243 | | } |
|---|
| 244 | | } |
|---|
| 245 | | |
|---|
| 246 | | function sendMessage( panel, html ) { |
|---|
| 247 | | if( ! html.length ) return; |
|---|
| 248 | | currentRequest = createRequestObject(); |
|---|
| 249 | | currentRequest.onreadystatechange = processQueue; |
|---|
| 250 | | currentRequest.open( "POST", "/command/send?panel=" + panel ); |
|---|
| 251 | | currentRequest.send( html ); |
|---|
| 252 | | setTimeout( checkQueue, 250 ); |
|---|
| 253 | | } |
|---|
| 254 | | |
|---|
| 255 | | function appendMessage( panel, html ) { |
|---|
| 256 | | var frame = document.getElementById( "panel" + panel ); |
|---|
| 257 | | if( html.indexOf( "<?message type=\"subsequent\"?>" ) != -1 && frame.document.getElementById( "consecutiveInsert" ) ) { |
|---|
| 258 | | appendConsecutiveMessage( panel, html ); |
|---|
| | 194 | } ); |
|---|
| | 195 | } |
|---|
| | 196 | |
|---|
| | 197 | DirectChatPanel.prototype.appendMessage = function( html ) { |
|---|
| | 198 | var frame = this.contentFrame; |
|---|
| | 199 | |
|---|
| | 200 | var consecutive = ( html.indexOf( "<?message type=\"consecutive\"?>" ) != -1 ); |
|---|
| | 201 | if( ! consecutive ) consecutive = ( html.indexOf( "<?message type=\"subsequent\"?>" ) != -1 ); |
|---|
| | 202 | if( consecutive && frame.document.getElementById( "consecutiveInsert" ) ) { |
|---|
| | 203 | this.appendConsecutiveMessage( html ); |
|---|
| | 266 | |
|---|
| | 267 | function ChatRoomPanel( node ) { |
|---|
| | 268 | ChatRoomPanel.baseConstructor.call( this, node ); |
|---|
| | 269 | |
|---|
| | 270 | this.memberListVisible = false; |
|---|
| | 271 | |
|---|
| | 272 | this.listItem.removeClassName( "directChat" ); |
|---|
| | 273 | this.listItem.addClassName( "chatRoom" ); |
|---|
| | 274 | |
|---|
| | 275 | this.members = new Array(); |
|---|
| | 276 | |
|---|
| | 277 | this.memberList = $(document.createElement( "ol" )); |
|---|
| | 278 | this.memberList.className = "memberList"; |
|---|
| | 279 | this.memberList.style.setProperty( "display", "none", "" ); |
|---|
| | 280 | $("panelList").appendChild( this.memberList ); |
|---|
| | 281 | |
|---|
| | 282 | var memberNodes = node.childNodes; |
|---|
| | 283 | for( var i = 0; i < memberNodes.length; ++i ) { |
|---|
| | 284 | var memberNode = memberNodes[i]; |
|---|
| | 285 | |
|---|
| | 286 | var member = new Object(); |
|---|
| | 287 | member.name = memberNode.firstChild.nodeValue; |
|---|
| | 288 | member.nickname = memberNode.getAttribute( "nickname" ); |
|---|
| | 289 | member.hostmask = memberNode.getAttribute( "hostmask" ); |
|---|
| | 290 | member.identifier = memberNode.getAttribute( "identifier" ); |
|---|
| | 291 | member.buddy = memberNode.getAttribute( "buddy" ); |
|---|
| | 292 | member.type = memberNode.getAttribute( "class" ); |
|---|
| | 293 | member.self = ( memberNode.getAttribute( "self" ) == "yes" ); |
|---|
| | 294 | |
|---|
| | 295 | this.members.push( member ); |
|---|
| | 296 | |
|---|
| | 297 | member.listItem = $(document.createElement( "li" )); |
|---|
| | 298 | member.listItem.title = member.hostmask; |
|---|
| | 299 | member.listItem.className = "listItem member" + ( member.type ? " " + member.type : "" ); |
|---|
| | 300 | member.listItem.appendChild( document.createTextNode( member.name ) ); |
|---|
| | 301 | |
|---|
| | 302 | this.memberList.appendChild( member.listItem ); |
|---|
| | 303 | } |
|---|
| | 304 | |
|---|
| | 305 | var panel = this; |
|---|
| | 306 | this.listItem.addEventListener( "dblclick", function( event ) { panel.toggleMemberList(); event.preventDefault(); event.stopPropagation(); }, false ); |
|---|
| | 307 | } |
|---|
| | 308 | |
|---|
| | 309 | extendClass( ChatRoomPanel, DirectChatPanel ); |
|---|
| | 310 | |
|---|
| | 311 | ChatRoomPanel.prototype.toggleMemberList = function() { |
|---|
| | 312 | this.memberListVisible = ! this.memberListVisible; |
|---|
| | 313 | if( this.memberListVisible ) this.memberList.style.setProperty( "display", "none", "" ); |
|---|
| | 314 | else this.memberList.style.setProperty( "display", "block", "" ); |
|---|
| | 315 | } |
|---|
| | 316 | |
|---|
| | 317 | ChatRoomPanel.prototype.close = function() { |
|---|
| | 318 | ChatRoomPanel.superClass.close.call(this); |
|---|
| | 319 | this.memberList.parentNode.removeChild( this.memberList ); |
|---|
| | 320 | } |
|---|
| | 321 | |
|---|
| | 322 | window.addEventListener( "load", setup, false ); |
|---|
| | 323 | |
|---|
| | 324 | function setup() { |
|---|
| | 325 | $("input").addEventListener( "keydown", inputKeyDown, false ); |
|---|
| | 326 | window.addEventListener( "blur", windowBlured, false ); |
|---|
| | 327 | window.addEventListener( "focus", windowFocused, false ); |
|---|
| | 328 | |
|---|
| | 329 | new Ajax.Request( "/command/setup", { |
|---|
| | 330 | method: "get", |
|---|
| | 331 | onSuccess: function( transport ) { |
|---|
| | 332 | var xml = transport.responseXML; |
|---|
| | 333 | var children = xml.documentElement.getElementsByTagName( "panels" ).item( 0 ).childNodes; |
|---|
| | 334 | |
|---|
| | 335 | for( var i = 0; i < children.length; ++i ) |
|---|
| | 336 | ChatController.createPanel( children[i] ); |
|---|
| | 337 | |
|---|
| | 338 | ChatController.checkActivity(); |
|---|
| | 339 | activityCheckInterval = setInterval( ChatController.checkActivity, activityCheckSpeed ); |
|---|
| | 340 | }, |
|---|
| | 341 | onException: function( transport, exception ) { |
|---|
| | 342 | throw exception; |
|---|
| | 343 | } |
|---|
| | 344 | } ); |
|---|
| | 345 | } |
|---|
| | 346 | |
|---|
| | 347 | function windowBlured() { |
|---|
| | 348 | foreground = false; |
|---|
| | 349 | } |
|---|
| | 350 | |
|---|
| | 351 | function windowFocused() { |
|---|
| | 352 | foreground = true; |
|---|
| | 353 | if( ! activePanel ) return; |
|---|
| | 354 | |
|---|
| | 355 | activePanel.newMessage = 0; |
|---|
| | 356 | activePanel.newHighlightMessage = 0; |
|---|
| | 357 | activePanel.listItem.removeClassName( "newMessage" ); |
|---|
| | 358 | activePanel.listItem.removeClassName( "newHighlight" ); |
|---|
| | 359 | activePanel.listItem.title = "No messages waiting"; |
|---|
| | 360 | } |
|---|
| | 361 | |
|---|
| | 362 | function inputKeyDown( event ) { |
|---|
| | 363 | if( event.keyCode == 13 && ! event.altKey ) { |
|---|
| | 364 | var input = $("input"); |
|---|
| | 365 | activePanel.sendMessage( input.innerText ); |
|---|
| | 366 | input.innerHTML = ""; |
|---|
| | 367 | event.preventDefault(); |
|---|
| | 368 | } |
|---|
| | 369 | } |
|---|