📄 jwchat.html
字号:
case 'enableLog': enableLog = eval(jNode.childNodes.item(i).firstChild.nodeValue); break; } } } } // print roster roster.print(); if (opener.prio) onlprio = opener.prio; else onlprio = DEFAULTPRIORITY; // send presence if (onlstat == '') onlstat = 'available'; changeStatus(onlstat,onlmsg,onlprio); playSound('connected'); // Start Service Discovery iq = new JSJaCIQ(); iq.setIQ(con.domain,'get','disco_item_1'); iq.setQuery('http://jabber.org/protocol/disco#items'); con.send(iq,getDiscoItems); // get bookmarks iq = new JSJaCIQ(); iq.setIQ(null,'get','storage_bookmarks'); var query = iq.setQuery('jabber:iq:private'); query.appendChild(iq.getDoc().createElement('storage')).setAttribute('xmlns','storage:bookmarks'); con.send(iq,getBookmarks); // get annotations iq = new JSJaCIQ(); iq.setIQ(null,'get','jwchat_notes'); var query = iq.setQuery('jabber:iq:private'); query.appendChild(iq.getDoc().createElement('storage')).setAttribute('xmlns','storage:rosternotes'); con.send(iq,getAnnotations);}function getDiscoItems(iq) { if (!iq) return; Debug.log(iq.getDoc().xml,2); disco = new Object(); var items = iq.getNode().firstChild.childNodes; /* query items */ for (var i=0; i<items.length; i++) { if (items[i].nodeName != 'item' || !items[i].getAttribute('jid') || items[i].getAttribute('node')!=null) // skip those continue; var aIQ = new JSJaCIQ(); aIQ.setIQ(items[i].getAttribute('jid'),'get','disco_info_'+i); aIQ.setQuery("http://jabber.org/protocol/disco#info"); con.send(aIQ,getDiscoInfo); }}function getDiscoInfo(iq) { if (!iq || iq.getType() != 'result') return; Debug.log(iq.getDoc().xml,2); if (iq.getType() == 'result') { disco[iq.getFrom()] = iq; // If the identity does not have a name, set the name to jid if(iq.getNode().getElementsByTagName('identity').item(0).getAttribute('name') == null) iq.getNode().getElementsByTagName('identity').item(0).setAttribute('name', iq.getFrom()); // set loghost if (iq.getNode().getElementsByTagName('identity').item(0)) { if (iq.getNode().getElementsByTagName('identity').item(0).getAttribute('type') == 'archive') { for (var j=0; j<iq.getNode().getElementsByTagName('feature').length; j++) { if (iq.getNode().getElementsByTagName('feature').item(j).getAttribute('var') == 'http://jabber.org/protocol/archive') { loghost = iq.getFrom(); break; } } } } }}var bookmarks;function getBookmarks(iq) { if (!iq || iq.getType() != 'result') return; Debug.log(iq.getDoc().xml,2); bookmarks = new Array(); if (iq.getNode().getElementsByTagName('storage').item(0)) { var jNode = iq.getNode().getElementsByTagName('storage').item(0); for (var i=0; i<jNode.childNodes.length; i++) { var item = jNode.childNodes.item(i); if (item.nodeName == 'conference') { var bookmark = new Object(); bookmark.jid = item.getAttribute('jid'); bookmark.name = item.getAttribute('name'); if (item.getAttribute('autojoin') == '1') bookmark.autojoin = '1'; if (item.getElementsByTagName('nick').item(0)) bookmark.nick = item.getElementsByTagName('nick').item(0).firstChild.nodeValue; if (item.getElementsByTagName('pass').item(0)) bookmark.pass = item.getElementsByTagName('pass').item(0).firstChild.nodeValue; bookmarks[bookmarks.length] = bookmark; if (bookmark.autojoin == '1') { openGroupchat(bookmark.jid, bookmark.nick, bookmark.pass); } } } }}var annotations;function getAnnotations(iq) { if (!iq || iq.getType() != 'result') return; Debug.log(iq.getDoc().xml,2); annotations = new Object(); if (iq.getType() == 'result') { if (iq.getNode().getElementsByTagName('storage').item(0)) { var jNode = iq.getNode().getElementsByTagName('storage').item(0); for (var i=0; i<jNode.childNodes.length; i++) if (jNode.childNodes.item(i).nodeName == 'note' && jNode.childNodes.item(i).firstChild) annotations[jNode.childNodes.item(i).getAttribute('jid')] = jNode.childNodes.item(i).firstChild.nodeValue; } }}/************************************************************************ * ****** END HANDLERS ******* ************************************************************************ *//************************************************************************ * ****** INIT ******* ************************************************************************ */var con, Debug, srcW;function init() { /* initialise debugger */ if (!Debug || typeof(Debug) == 'undefined' || !Debug.start) { if (typeof(Debugger) != 'undefined') Debug = new Debugger(DEBUG_LVL,'JWChat ' + cutResource(jid)); else { Debug = new Object(); Debug.log = function() {}; Debug.start = function() {}; } } if (DEBUG && (!USE_DEBUGJID || DEBUGJID == cutResource(jid))) Debug.start(); Debug.log("jid: "+jid+"\npass: "+pass,2); /* get some refs to static elements */ statusLed = frames["jwc_main"].document.getElementById('statusLed'); statusMsg = frames["jwc_main"].document.getElementById('statusMsg'); fmd = frames["jwc_main"].iRoster.document; /* set title */ document.title = "JWChat - " + nick; /* set nick */ frames["jwc_main"].document.getElementById('myNickname').innerHTML = nick; /* init empty roster */ roster = new Roster(); /* *** * create new connection */ var oArg = {oDbg: Debug, httpbase: HTTPBASE, timerval: timerval}; if (BACKEND_TYPE == 'binding') con = new JSJaCHttpBindingConnection(oArg); else con = new JSJaCHttpPollingConnection(oArg); /* register handlers */ con.registerHandler('iq',handleIQSet); con.registerHandler('presence',handlePresence); con.registerHandler('message',handleMessage); con.registerHandler('message',handleMessageError); con.registerHandler('ondisconnect',handleDisconnect); con.registerHandler('onconnect',handleConnected); con.registerHandler('onerror',handleConError); /* connect to remote */ oArg = {domain:JABBERSERVER,username:jid.substring(0,jid.indexOf('@')),resource:jid.substring(jid.indexOf('/')+1),pass:pass,register:register} if (BACKEND_TYPE == 'binding') { if (opener.connect_port && !isNaN(opener.connect_port)) oArg.port = opener.connect_port; if (opener.connect_host && opener.connect_host != '') oArg.host = opener.connect_host; if (opener && opener.connect_secure) oArg.secure = true; } con.connect(oArg);}/************************************************************************ * ****** LOGOUT ******* ************************************************************************ */function cleanUp() { /* close dependent windows */ if (roster) roster.cleanUp(); if (subw && !subw.closed) subw.close(); if (typeof(ow) != 'undefined' && ow && !ow.closed) ow.close(); if (searchW && !searchW.closed) searchW.close(); if (ebW && !ebW.closed) ebW.close(); fmd.getElementById('roster').innerHTML = ''; // clear frames frames["jwc_sound"].document.open(); frames["jwc_sound"].document.write(); frames["jwc_sound"].document.close();}var logoutCalled = false;function logout() { logoutCalled = true; cleanUp(); if (!con.connected()) return; /* save state */ var iq = new JSJaCIQ(); iq.setIQ(null,'set'); var query = iq.setQuery('jabber:iq:private'); var aNode = query.appendChild(iq.getDoc().createElement('jwchat')); aNode.setAttribute('xmlns','jwchat:state'); // save presence if (onlstat != 'offline') aNode.appendChild(iq.getDoc().createElement('presence')).appendChild(iq.getDoc().createTextNode(onlstat)); if (onlmsg != '') aNode.appendChild(iq.getDoc().createElement('onlmsg')).appendChild(iq.getDoc().createTextNode(onlmsg)); var hiddengroups = ''; if (typeof(roster) != 'undefined') { for (var i=0; i<roster.hiddenGroups.length; i++) if (roster.hiddenGroups[i]) hiddengroups += i+","; } if (hiddengroups != '') aNode.appendChild(iq.getDoc().createElement('hiddenGroups')).appendChild(iq.getDoc().createTextNode(hiddengroups)); con.send(iq); var aPresence = new JSJaCPresence(); aPresence.setType('unavailable'); con.send(aPresence); con.disconnect();}/************************************************************************ * ****** INITIALISE VARS ******* ************************************************************************ *//* check for unsupported browsers */if (is.b == 'op' || is.b == 'Konqueror' || (is.b == 'ns' && is.v < '5') || (is.ie && is.mac) || is.ie4 ) { open("unsupported.html","unsupported","width=380,height=180"); }/* quick hack - need this info before onload *//* get args */getArgs();var JABBERSERVER;var BACKEND_TYPE;var HTTPBASE;if (opener && opener.JABBERSERVER) JABBERSERVER = opener.JABBERSERVER;else if (passedArgs['server']) JABBERSERVER = passedArgs['server'];if (opener && opener.BACKEND_TYPE) BACKEND_TYPE = opener.BACKEND_TYPE;else if (passedArgs['btype']) BACKEND_TYPE = passedArgs['btype'];if (opener && opener.HTTPBASE) HTTPBASE = opener.HTTPBASE;else if (passedArgs['base']) HTTPBASE = passedArgs['base'];if (opener && opener.pass) pass = opener.pass;else if (passedArgs['pass']) pass = passedArgs['pass'];if (opener && opener.jid) jid = opener.jid;else if (passedArgs['jid']) jid = passedArgs['jid'];if (opener && opener.register) register = opener.registerelse if (passedArgs['register']) register = eval(passedArgs['register']);if (!jid) { alert("JID is missing.\nAborting..."); window.close();}if (!pass) { alert("Password is missing.\nAborting..."); window.close();}if (!isValidJID(jid)) window.close();nick = jid.substring(0,jid.indexOf('@'));/* get style */if (opener && opener.myStyle) stylesheet = THEMESDIR + "/" + opener.myStyle + "/" + stylesheet;else if (passedArgs['myStyle']) stylesheet = THEMESDIR + "/" + passedArgs['myStyle'] + "/" + stylesheet;function updateStyleIE() { if (roster) roster.updateStyleIE();}onload = init;onunload = logout;onresize = updateStyleIE;//--> </script> <script src="roster.js"></script> </head> <frameset rows="100%,0,0,0,0" border="0"> <frame src="roster.html" name="jwc_main" marginwidth="0" marginheight="0" scrolling="no"> <frame src="empty.html" name="jwc_sound" marginwidth="0" marginheight="0" onLoad="soundLoaded();"> </frameset> <body> Your browser must support frames and javascript to use this application. Please refer to our <a href="help.html">online manual</a> for a list of supported browser. </body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -