var is_ie = navigator.appName.match("Explorer"); var is_khtml = navigator.appName.match("Konqueror") || navigator.appVersion.match("KHTML"); var is_ff = navigator.appName.match("Netscape"); var is_ie7 = navigator.userAgent.indexOf('MSIE 7') > 0; /** * This class is the client part of phpFreeChat * (depends on prototype library) * @author Stephane Gully */ var pfcClient = Class.create(); //defining the rest of the class implmentation pfcClient.prototype = { initialize: function() { // load the graphical user interface builder this.gui = new pfcGui(); // load the resources manager (labels and urls) this.res = new pfcResource(); this.nickname = pfc_nickname; this.nickid = pfc_nickid; this.usermeta = $H(); this.chanmeta = $H(); this.nickwhoisbox = $H(); // this array contains all the sent command // used the up and down key to navigate in the history // (doesn't work on IE6) this.cmdhistory = Array(); this.cmdhistoryid = -1; this.cmdhistoryissearching = false; /* this.channels = Array(); this.channelids = Array(); */ this.privmsgs = Array(); this.privmsgids = Array(); this.timeout = null; this.refresh_delay = pfc_refresh_delay; this.max_refresh_delay = pfc_max_refresh_delay; this.last_response_time = new Date().getTime(); this.last_request_time = new Date().getTime(); this.canupdatenexttime = true; /* unique client id for each windows used to identify a open window * this id is passed every time the JS communicate with server * (2 clients can use the same session: then only the nickname is shared) */ this.clientid = pfc_clientid; this.isconnected = false; this.nicklist = $H(); this.nickcolor = Array(); this.colorlist = Array(); this.blinktmp = Array(); this.blinkloop = Array(); this.blinktimeout = Array(); }, connectListener: function() { this.el_words = $('pfc_words'); this.el_handle = $('pfc_handle'); this.el_container = $('pfc_container'); // this.el_online = $('pfc_online'); this.el_errors = $('pfc_errors'); this.detectactivity = new DetectActivity(this.el_container); // restore the window title when user come back to the active zone if (pfc_notify_window) this.detectactivity.onunactivate = this.gui.unnotifyWindow.bindAsEventListener(this.gui); /* the events callbacks */ this.el_words.onkeypress = this.callbackWords_OnKeypress.bindAsEventListener(this); // don't use this line because when doing completeNick the "return false" doesn't work (focus is lost) // Event.observe(this.el_words, 'keypress', this.callbackWords_OnKeypress.bindAsEventListener(this), false); Event.observe(this.el_words, 'keydown', this.callbackWords_OnKeydown.bindAsEventListener(this), false); Event.observe(this.el_words, 'focus', this.callbackWords_OnFocus.bindAsEventListener(this), false); Event.observe(this.el_handle, 'keydown', this.callbackHandle_OnKeydown.bindAsEventListener(this), false); Event.observe(this.el_handle, 'change', this.callbackHandle_OnChange.bindAsEventListener(this), false); Event.observe(document.body, 'unload', this.callback_OnUnload.bindAsEventListener(this), false); }, refreshGUI: function() { this.minmax_status = pfc_start_minimized; var cookie = getCookie('pfc_minmax_status'); if (cookie != null) this.minmax_status = (cookie == 'true'); cookie = getCookie('pfc_nickmarker'); this.nickmarker = (cookie == 'true'); if (cookie == '' || cookie == null) this.nickmarker = pfc_nickmarker; cookie = getCookie('pfc_clock'); this.clock = (cookie == 'true'); if (cookie == '' || cookie == null) this.clock = pfc_clock; cookie = getCookie('pfc_showsmileys'); this.showsmileys = (cookie == 'true'); if (cookie == '' || cookie == null) this.showsmileys = pfc_showsmileys; cookie = getCookie('pfc_showwhosonline'); this.showwhosonline = (cookie == 'true'); if (cookie == '' || cookie == null) this.showwhosonline = pfc_showwhosonline; // '' means no forced color, let CSS choose the text color this.current_text_color = ''; cookie = getCookie('pfc_current_text_color'); if (cookie != null) this.switch_text_color(cookie); cookie = getCookie('pfc_issoundenable'); this.issoundenable = (cookie == 'true'); if (cookie == '' || cookie == null) this.issoundenable = pfc_startwithsound; this.refresh_loginlogout(); this.refresh_minimize_maximize(); this.refresh_Smileys(); this.refresh_sound(); this.refresh_nickmarker(); }, /** * Show a popup dialog to ask user to choose a nickname */ askNick: function(nickname,error_text) { // ask to choose a nickname if (nickname == '' || nickname == undefined) nickname = this.nickname; // build a dhtml prompt box var pfcp = this.getPrompt();//new pfcPrompt($('pfc_container')); pfcp.callback = function(v) { pfc.askNickResponse(v); } pfcp.prompt((error_text != undefined ? ''+error_text+'
' : '')+this.res.getLabel('Please enter your nickname'), nickname); pfcp.focus(); }, askNickResponse: function(newnick) { if (newnick) { if (this.isconnected) this.sendRequest('/nick "'+newnick+'"'); else this.sendRequest('/connect '+newnick); } }, /** * Reacte to the server response */ handleResponse: function(cmd, resp, param) { if (pfc_debug) if (cmd != "update") trace('handleResponse: '+cmd + "-"+resp+"-"+param); // store the new refresh time this.last_response_time = new Date().getTime(); // calculate the ping and display it this.ping = this.last_response_time - this.last_request_time; $('pfc_ping').innerHTML = this.ping+'ms'; if (cmd == "connect") { if (resp == "ok") { this.nickname = param[0]; this.sendRequest('/nick "'+this.nickname+'"'); this.isconnected = true; // start the polling system this.updateChat(true); } else this.isconnected = false; this.refresh_loginlogout(); } else if (cmd == "quit") { if (resp =="ok") { // stop updates this.updateChat(false); this.isconnected = false; this.refresh_loginlogout(); } } else if (cmd == "join" || cmd == "join2") { if (resp =="ok") { // create the new channel var tabid = param[0]; var name = param[1]; this.gui.createTab(name, tabid, "ch"); if (cmd != "join2") this.gui.setTabById(tabid); this.refresh_Smileys(); this.refresh_WhosOnline(); } else if (resp == "max_channels") { this.displayMsg( cmd, this.res.getLabel('Maximum number of joined channels has been reached') ); } else alert(cmd + "-"+resp+"-"+param); } else if (cmd == "leave") { //alert(cmd + "-"+resp+"-"+param); if (resp =="ok") { // remove the channel var tabid = param; this.gui.removeTabById(tabid); // synchronize the channel client arrays /* var index = -1; index = this.channelids.indexOf(tabid); this.channelids = this.channelids.without(tabid); this.channels = this.channels.without(this.channels[index]); */ // synchronize the privmsg client arrays index = -1; index = indexOf(this.privmsgids, tabid); this.privmsgids = without(this.privmsgids, tabid); this.privmsgs = without(this.privmsgs, this.privmsgs[index]); } } else if (cmd == "privmsg" || cmd == "privmsg2") { if (resp == "ok") { // create the new channel var tabid = param[0]; var name = param[1]; this.gui.createTab(name, tabid, "pv"); if (cmd != "privmsg2") this.gui.setTabById(tabid); this.privmsgs.push(name); this.privmsgids.push(tabid); } else if (resp == "max_privmsg") { this.displayMsg( cmd, this.res.getLabel('Maximum number of private chat has been reached') ); } else if (resp == "unknown") { // speak to unknown user } else if (resp == "speak_to_myself") { this.displayMsg( cmd, this.res.getLabel('You are not allowed to speak to yourself') ); } else alert(cmd + "-"+resp+"-"+param); } else if (cmd == "nick") { // give focus the the input text box if wanted if (pfc_focus_on_connect) this.el_words.focus(); if (resp == "connected" || resp == "notchanged") { cmd = ''; } if (resp == "ok" || resp == "notchanged" || resp == "changed" || resp == "connected") { this.el_handle.innerHTML = param; this.nickname = param; this.usermeta[this.nickid]['nick'] = param; this.updateNickBox(this.nickid); // clear the possible error box generated by the bellow displayMsg(...) function this.clearError(Array(this.el_words)); } else if (resp == "isused") { this.setError(this.res.getLabel('Choosen nickname is allready used'), Array()); this.askNick(param,this.res.getLabel('Choosen nickname is allready used')); } else if (resp == "notallowed") { // when frozen_nick is true and the nickname is allready used, server will return // the 'notallowed' status. It will display a message and stop chat update. // if the chat update is not stopped, this will loop forever // as long as the forced nickname is not changed // display a message this.setError(this.res.getLabel('Choosen nickname is not allowed'), Array()); // then stop chat updates this.updateChat(false); this.isconnected = false; this.refresh_loginlogout(); } } else if (cmd == "update") { // if the first ever refresh request never makes it back then the chat will keep // trying to refresh as usual // this only helps if we temporarily lose connection in the middle of an established // chat session this.canupdatenexttime = true; } else if (cmd == "version") { if (resp == "ok") { this.displayMsg( cmd, this.res.getLabel('phpfreechat current version is %s',param) ); } } else if (cmd == "help") { if (resp == "ok") { this.displayMsg( cmd, param); } } else if (cmd == "rehash") { if (resp == "ok") { this.displayMsg( cmd, this.res.getLabel('Configuration has been rehashed') ); } else if (resp == "ko") { this.displayMsg( cmd, this.res.getLabel('A problem occurs during rehash') ); } } else if (cmd == "banlist") { if (resp == "ok" || resp == "ko") { this.displayMsg( cmd, param ); } } else if (cmd == "unban") { if (resp == "ok" || resp == "ko") { this.displayMsg( cmd, param ); } } else if (cmd == "auth") { if (resp == "ban") { alert(param); } if (resp == "frozen") { alert(param); } else if (resp == "nick") { this.displayMsg( cmd, param ); } } else if (cmd == "debug") { if (resp == "ok" || resp == "ko") { this.displayMsg( cmd, param ); } } else if (cmd == "clear") { var tabid = this.gui.getTabId(); var container = this.gui.getChatContentFromTabId(tabid); container.innerHTML = ""; } else if (cmd == "identify") { this.displayMsg( cmd, param ); } else if (cmd == "checknickchange") { this.displayMsg( cmd, param ); } else if (cmd == "whois" || cmd == "whois2") { var nickid = param['nickid']; if (resp == "ok") { this.usermeta[nickid] = $H(param); this.updateNickBox(nickid); this.updateNickWhoisBox(nickid); } if (cmd == "whois") { // display the whois info var um = this.getAllUserMeta(nickid); var um_keys = um.keys(); var msg = ''; for (var i=0; i' + k + ': ' + v + '
'; } this.displayMsg( cmd, msg ); } } else if (cmd == "who" || cmd == "who2") { var chan = param['chan']; var chanid = param['chanid']; var meta = $H(param['meta']); if (resp == "ok") { this.chanmeta[chanid] = meta; // send /whois commands for unknown users for (var i=0; i' + k + ': ' + v + '
'; } } this.displayMsg( cmd, msg ); } } else if (cmd == "getnewmsg") { if (resp == "ok") { this.handleComingRequest(param); } } else if (cmd == "send") { } else alert(cmd + "-"+resp+"-"+param); }, getAllUserMeta: function(nickid) { if (nickid && this.usermeta[nickid]) return this.usermeta[nickid]; else return null; }, getUserMeta: function(nickid, key) { if (nickid && key && this.usermeta[nickid] && this.usermeta[nickid][key]) return this.usermeta[nickid][key]; else return ''; }, getAllChanMeta: function(chanid) { if (chanid && this.chanmeta[chanid]) return this.chanmeta[chanid]; else return null; }, getChanMeta: function(chanid, key) { if (chanid && key && this.chanmeta[chanid] && this.chanmeta[chanid][key]) return this.chanmeta[chanid][key]; else return ''; }, doSendMessage: function() { var w = this.el_words; var wval = w.value; // append the string to the history this.cmdhistory.push(wval); this.cmdhistoryid = this.cmdhistory.length; this.cmdhistoryissearching = false; // send the string to the server re = new RegExp("^(\/[a-zA-Z0-9]+)( (.*)|)"); if (wval.match(re)) { // a user command cmd = wval.replace(re, '$1'); param = wval.replace(re, '$3'); this.sendRequest(cmd +' '+ param.substr(0, pfc_max_text_len + 2*this.clientid.length)); } else { // a classic 'send' command // empty messages with only spaces rx = new RegExp('^[ ]*$','g'); wval = wval.replace(rx,''); // truncate the text length wval = wval.substr(0,pfc_max_text_len); // colorize the text with current_text_color if (this.current_text_color != '' && wval.length != '') wval = '[color=#' + this.current_text_color + '] ' + wval + ' [/color]'; this.sendRequest('/send '+ wval); } w.value = ''; return false; }, /** * Try to complete a nickname like on IRC when pressing the TAB key * @todo: improve the algorithme, it should take into account the cursor position */ completeNick: function() { var w = this.el_words; var nick_src = w.value.substring(w.value.lastIndexOf(' ')+1,w.value.length); if (nick_src != '') { var tabid = this.gui.getTabId(); var n_list = this.chanmeta[tabid]['users']['nick']; for (var i=0; i0) { var w = this.el_words; if (this.cmdhistoryissearching == false && w.value != "") this.cmdhistory.push(w.value); this.cmdhistoryissearching = true; this.cmdhistoryid = this.cmdhistoryid-1; if (this.cmdhistoryid<0) this.cmdhistoryid = this.cmdhistory.length-1; w.value = this.cmdhistory[this.cmdhistoryid]; } } else if (code == 34 && false) // page down key { // write the next command in the history if (this.cmdhistory.length>0) { var w = this.el_words; if (this.cmdhistoryissearching == false && w.value != "") this.cmdhistory.push(w.value); this.cmdhistoryissearching = true; this.cmdhistoryid = this.cmdhistoryid+1; if (this.cmdhistoryid>=this.cmdhistory.length) this.cmdhistoryid = 0; w.value = this.cmdhistory[this.cmdhistoryid]; } } else { /* allow other keys */ return true; } }, /** * Handle the pressed keys * see also callbackWords_OnKeypress */ callbackWords_OnKeydown: function(evt) { if (!this.isconnected) return false; this.clearError(Array(this.el_words)); var code = (evt.which) ? evt.which : evt.keyCode if (code == 9) /* tab key */ { /* IE workaround : ignore TAB key here */ /* do the nickname completion work like on IRC */ this.completeNick(); return false; /* do not leave the tab key default behavior */ } else { return true; } }, callbackWords_OnFocus: function(evt) { // if (this.el_handle && this.el_handle.value == '' && !this.minmax_status) // this.el_handle.focus(); }, callbackHandle_OnKeydown: function(evt) { }, callbackHandle_OnChange: function(evt) { }, callback_OnUnload: function(evt) { /* don't disconnect users when they reload the window * this event doesn't only occurs when the page is closed but also when the page is reloaded */ if (pfc_quit_on_closedwindow) { if (!this.isconnected) return false; this.sendRequest('/quit'); } }, /** * hide error area and stop blinking fields */ clearError: function(ids) { this.el_errors.style.display = 'none'; for (var i=0; i'+msg+''; // finaly append this to the message list container.appendChild(div); this.gui.scrollDown(tabid, div); */ }, handleComingRequest: function( cmds ) { var msg_html = $H(); var max_msgid = $H(); //alert(cmds.inspect()); // var html = ''; for(var mid = 0; mid < cmds.length ; mid++) { var id = cmds[mid][0]; var date = cmds[mid][1]; var time = cmds[mid][2]; var sender = cmds[mid][3]; var recipientid = cmds[mid][4]; var cmd = cmds[mid][5]; var param = cmds[mid][6]; var fromtoday = cmds[mid][7]; var oldmsg = cmds[mid][8]; // format and post message var line = ''; line += '
'; line += ''+ date +' '; line += ''+ time +' '; if (cmd == 'send') { line += ' '; line += '‹'; line += ''; line += sender; line += ''; line += '›'; line += ' '; } if (cmd == 'notice' || cmd == 'me') line += '* '+ this.parseMessage(param) +' '; else line += ''+ this.parseMessage(param) +' '; line += '
'; if (oldmsg == 0) if (cmd == 'send' || cmd == 'me') { // notify the hidden tab a message has been received // don't notify anything if this is old messages var tabid = recipientid; if (this.gui.getTabId() != tabid) this.gui.notifyTab(tabid); // notify the window (change the title) if (!this.detectactivity.isActive() && pfc_notify_window) this.gui.notifyWindow(); } if (msg_html[recipientid] == null) msg_html[recipientid] = line; else msg_html[recipientid] += line; // remember the max message id in order to clean old lines if (!max_msgid[recipientid]) max_msgid[recipientid] = 0; if (max_msgid[recipientid] < id) max_msgid[recipientid] = id; } // loop on all recipients and post messages var keys = msg_html.keys(); for( var i=0; i scrollDown(..) will be broken m.innerHTML = msg_html[recipientid]; this.colorizeNicks(m); this.refresh_clock(m); // finaly append this to the message list recipientdiv.appendChild(m); this.gui.scrollDown(tabid, m); // delete the old messages from the client (save some memory) var limit_msgid = max_msgid[recipientid] - pfc_max_displayed_lines; var elt = $('pfc_msg_'+recipientid+'_'+limit_msgid); while (elt) { // delete this element to save browser memory if (is_ff) elt.innerHTML = ''; else // this code don't work in FF, why ? don't know .. elt.parentElement.removeChild(elt); limit_msgid--; elt = $('pfc_msg_'+recipientid+'_'+limit_msgid); } } }, /** * Call the ajax request function * Will query the server */ sendRequest: function(cmd, recipientid) { if (cmd != "/update") { // setup a new timeout to update the chat in 5 seconds (in refresh_delay more exactly) clearTimeout(this.timeout); this.timeout = setTimeout('pfc.updateChat(true)', this.refresh_delay); if (pfc_debug) trace('sendRequest: '+cmd); } this.last_request_time = new Date().getTime(); var rx = new RegExp('(^\/[^ ]+) *(.*)','ig'); if (!recipientid) recipientid = this.gui.getTabId(); cmd = cmd.replace(rx, '$1 '+this.clientid+' '+(recipientid==''?'0':recipientid)+' $2'); return pfc_handleRequest(cmd); //eval('pfc_handleRequest(cmd);'); }, /** * update function to poll the server each 'refresh_delay' time */ updateChat: function(start) { clearTimeout(this.timeout); if (start) { var res = true; if (this.canupdatenexttime) { // the connection is ok res = this.sendRequest('/update'); this.canupdatenexttime = false; // don't update if the last 'ok' response is not yet received } else if ((new Date().getTime() - this.last_response_time) > this.max_refresh_delay) { // the connection is probably closed or very slow res = this.sendRequest('/update'); this.canupdatenexttime = false; // don't update if the last 'ok' response is not yet received this.last_response_time = new Date().getTime(); } // setup the next update this.timeout = setTimeout('pfc.updateChat(true)', this.refresh_delay); } }, /** * insert a smiley */ insertSmiley: function(s) { this.el_words.value += s; this.el_words.focus(); }, updateNickBox: function(nickid) { // @todo optimize this function because it is called lot of times so it could cause CPU consuming on client side var chanids = this.chanmeta.keys(); for(var i = 0; chanids.length > i; i++) { this.updateNickListBox(chanids[i]); } }, /** * fill the nickname list with connected nicknames */ updateNickListBox: function(chanid) { var nickidlst = this.chanmeta[chanid]['users']['nickid']; var nickdiv = this.gui.getOnlineContentFromTabId(chanid); var ul = document.createElement('ul'); ul.setAttribute('class', 'pfc_nicklist'); ul.setAttribute('className', 'pfc_nicklist'); // IE6 for (var i=0; i 1 && !navigator.appName.match("Explorer|Konqueror") && !navigator.appVersion.match("KHTML")) { msg = ''; for( var i = 0; i' + (delta>0 ? ttt[i].substring(7,range1)+ ' ... ' + ttt[i].substring(range2,ttt[i].length) : ttt[i]) + ''; } else { msg = msg + ttt[i]; } } } else { // fallback for IE6/Konqueror which do not support split with regexp replace = '$1$2$3'; msg = msg.replace(rx_url, replace); } // replace double spaces by   entity rx = new RegExp(' ','g'); msg = msg.replace(rx, '  '); // try to parse bbcode rx = new RegExp('\\[b\\](.+?)\\[\/b\\]','ig'); msg = msg.replace(rx, '$1'); rx = new RegExp('\\[i\\](.+?)\\[\/i\\]','ig'); msg = msg.replace(rx, '$1'); rx = new RegExp('\\[u\\](.+?)\\[\/u\\]','ig'); msg = msg.replace(rx, '$1'); rx = new RegExp('\\[s\\](.+?)\\[\/s\\]','ig'); msg = msg.replace(rx, '$1'); // rx = new RegExp('\\[pre\\](.+?)\\[\/pre\\]','ig'); // msg = msg.replace(rx, '
$1
'); rx = new RegExp('\\[email\\]([A-z0-9][\\w.-]*@[A-z0-9][\\w\\-\\.]+\\.[A-z0-9]{2,6})\\[\/email\\]','ig'); msg = msg.replace(rx, '$1'); rx = new RegExp('\\[email=([A-z0-9][\\w.-]*@[A-z0-9][\\w\\-\\.]+\\.[A-z0-9]{2,6})\\](.+?)\\[\/email\\]','ig'); msg = msg.replace(rx, '$2'); rx = new RegExp('\\[color=([a-zA-Z]+|\\#?[0-9a-fA-F]{6}|\\#?[0-9a-fA-F]{3})](.+?)\\[\/color\\]','ig'); msg = msg.replace(rx, '$2'); // parse bbcode colors twice because the current_text_color is a bbcolor // so it's possible to have a bbcode color imbrication rx = new RegExp('\\[color=([a-zA-Z]+|\\#?[0-9a-fA-F]{6}|\\#?[0-9a-fA-F]{3})](.+?)\\[\/color\\]','ig'); msg = msg.replace(rx, '$2'); // try to parse smileys var smileys = this.res.getSmileyHash(); var sl = smileys.keys(); for(var i = 0; i < sl.length; i++) { rx = new RegExp(RegExp.escape(sl[i]),'g'); msg = msg.replace(rx, '' + sl[i] + ''); } // try to parse nickname for highlighting rx = new RegExp('(^|[ :,;])'+RegExp.escape(this.nickname)+'([ :,;]|$)','gi'); msg = msg.replace(rx, '$1'+ this.nickname +'$2'); // this piece of code is replaced by the word-wrap CSS3 rule. /* // don't allow to post words bigger than 65 caracteres // doesn't work with crappy IE and Konqueror ! rx = new RegExp('([^ \\:\\<\\>\\/\\&\\;]{60})','ig'); var ttt = msg.split(rx); if (ttt.length > 1 && !navigator.appName.match("Explorer|Konqueror") && !navigator.appVersion.match("KHTML")) { msg = ''; for( var i = 0; i i; i++) nicktochange[i].style.color = color; }, /** * Returns a list of elements which have a clsName class */ getElementsByClassName: function( root, clsName, clsIgnore ) { var i, matches = new Array(); var els = root.getElementsByTagName('*'); var rx1 = new RegExp('.*'+clsName+'.*'); var rx2 = new RegExp('.*'+clsIgnore+'.*'); for(i=0; i i; i++) if (show) elts[i].style.display = 'inline'; else elts[i].style.display = 'none'; }, /** * Nickname marker show/hide */ nickmarker_swap: function() { if (this.nickmarker) { this.nickmarker = false; } else { this.nickmarker = true; } this.refresh_nickmarker() setCookie('pfc_nickmarker', this.nickmarker); }, refresh_nickmarker: function(root) { var nickmarker_icon = $('pfc_nickmarker'); if (!root) root = $('pfc_channels_content'); if (this.nickmarker) { nickmarker_icon.src = this.res.getFileUrl('images/color-on.gif'); nickmarker_icon.alt = this.res.getLabel("Hide nickname marker"); nickmarker_icon.title = nickmarker_icon.alt; this.colorizeNicks(root); } else { nickmarker_icon.src = this.res.getFileUrl('images/color-off.gif'); nickmarker_icon.alt = this.res.getLabel("Show nickname marker"); nickmarker_icon.title = nickmarker_icon.alt; var elts = this.getElementsByClassName(root, 'pfc_nickmarker', ''); for(var i = 0; elts.length > i; i++) { // this is not supported in konqueror =>>> elts[i].removeAttribute('style'); elts[i].style.color = ''; } } }, /** * Date/Hour show/hide */ clock_swap: function() { if (this.clock) { this.clock = false; } else { this.clock = true; } this.refresh_clock(); setCookie('pfc_clock', this.clock); }, refresh_clock: function( root ) { var clock_icon = $('pfc_clock'); if (!root) root = $('pfc_channels_content'); if (this.clock) { clock_icon.src = this.res.getFileUrl('images/clock-on.gif'); clock_icon.alt = this.res.getLabel('Hide dates and hours'); clock_icon.title = clock_icon.alt; this.showClass(root, 'pfc_date', 'pfc_invisible', true); this.showClass(root, 'pfc_heure', 'pfc_invisible', true); } else { clock_icon.src = this.res.getFileUrl('images/clock-off.gif'); clock_icon.alt = this.res.getLabel('Show dates and hours'); clock_icon.title = clock_icon.alt; this.showClass(root, 'pfc_date', 'pfc_invisible', false); this.showClass(root, 'pfc_heure', 'pfc_invisible', false); } // browser automaticaly scroll up misteriously when showing the dates // $('pfc_chat').scrollTop += 30; }, /** * Sound button */ sound_swap: function() { if (this.issoundenable) { this.issoundenable = false; } else { this.issoundenable = true; } this.refresh_sound(); setCookie('pfc_issoundenable', this.issoundenable); }, refresh_sound: function( root ) { var snd_icon = $('pfc_sound'); if (this.issoundenable) { snd_icon.src = this.res.getFileUrl('images/sound-on.gif'); snd_icon.alt = this.res.getLabel('Disable sound notifications'); snd_icon.title = snd_icon.alt; } else { snd_icon.src = this.res.getFileUrl('images/sound-off.gif'); snd_icon.alt = this.res.getLabel('Enable sound notifications'); snd_icon.title = snd_icon.alt; } }, /** * Connect/disconnect button */ connect_disconnect: function() { if (this.isconnected) this.sendRequest('/quit'); else { if (this.nickname == '') this.askNick(); else this.sendRequest('/connect '+this.nickname); } }, refresh_loginlogout: function() { var loginlogout_icon = $('pfc_loginlogout'); if (this.isconnected) { loginlogout_icon.src = this.res.getFileUrl('images/logout.gif'); loginlogout_icon.alt = this.res.getLabel('Disconnect'); loginlogout_icon.title = loginlogout_icon.alt; } else { this.clearMessages(); this.clearNickList(); loginlogout_icon.src = this.res.getFileUrl('images/login.gif'); loginlogout_icon.alt = this.res.getLabel('Connect'); loginlogout_icon.title = loginlogout_icon.alt; } }, /** * Minimize/Maximized the chat zone */ swap_minimize_maximize: function() { if (this.minmax_status) { this.minmax_status = false; } else { this.minmax_status = true; } setCookie('pfc_minmax_status', this.minmax_status); this.refresh_minimize_maximize(); }, refresh_minimize_maximize: function() { var content = $('pfc_content_expandable'); var btn = $('pfc_minmax'); if (this.minmax_status) { btn.src = this.res.getFileUrl('images/maximize.gif'); btn.alt = this.res.getLabel('Magnify'); btn.title = btn.alt; content.style.display = 'none'; } else { btn.src = this.res.getFileUrl('images/minimize.gif'); btn.alt = this.res.getLabel('Cut down'); btn.title = btn.alt; content.style.display = 'block'; } }, /** * BBcode ToolBar */ insert_text: function(open, close, promptifselempty) { var msgfield = $('pfc_words'); var pfcp = this.getPrompt(); pfcp.msgfield = msgfield; pfcp.open = open; pfcp.close = close; pfcp.promptifselempty = promptifselempty; pfcp.callback = this.insert_text_callback; // IE support if (document.selection && document.selection.createRange) { msgfield.focus(); sel = document.selection.createRange(); var text = sel.text; if (text == "" && promptifselempty) { pfcp.sel = document.selection.createRange(); pfcp.prompt(this.res.getLabel('Enter the text to format'), ''); pfcp.focus(); } else this.insert_text_callback(text,pfcp); } // Mozilla support else if (msgfield.selectionStart || msgfield.selectionStart == '0') { var startPos = msgfield.selectionStart; var endPos = msgfield.selectionEnd; var text = msgfield.value.substring(startPos, endPos); var extralength = 0; if (startPos == endPos && promptifselempty) { pfcp.prompt(this.res.getLabel('Enter the text to format'), ''); pfcp.focus(); } else this.insert_text_callback(text,pfcp); } // Fallback support for other browsers else { pfcp.prompt(this.res.getLabel('Enter the text to format'), ''); pfcp.focus(); } return; }, insert_text_callback: function(text,pfcp) { var open = pfcp.open; var close = pfcp.close; var promptifselempty = pfcp.promptifselempty; var msgfield = pfcp.msgfield; var sel = pfcp.sel; // IE support if (document.selection && document.selection.createRange) { if (text == null) text = ""; if (text.length > 0 || !promptifselempty) { sel.text = open + text + close; // @todo move the cursor just after the BBCODE, this doesn't work when the text to enclose is selected, IE6 keeps the whole selection active after the operation. msgfield.focus(); } } // Mozilla support else if (msgfield.selectionStart || msgfield.selectionStart == '0') { var startPos = msgfield.selectionStart; var endPos = msgfield.selectionEnd; var extralength = 0; if (startPos == endPos && promptifselempty) { if (text == null) text = ""; extralength = text.length; } if (text.length > 0 || !promptifselempty) { msgfield.value = msgfield.value.substring(0, startPos) + open + text + close + msgfield.value.substring(endPos, msgfield.value.length); msgfield.selectionStart = msgfield.selectionEnd = endPos + open.length + extralength + close.length; msgfield.focus(); } } // Fallback support for other browsers else { if (text == null) text = ""; if (text.length > 0 || !promptifselempty) { msgfield.value += open + text + close; msgfield.focus(); } } }, /** * Minimize/Maximize none/inline */ minimize_maximize: function(idname, type) { var element = $(idname); if(element.style) { if(element.style.display == type ) { element.style.display = 'none'; } else { element.style.display = type; } } }, switch_text_color: function(color) { /* clear any existing borders on the color buttons */ var colorbtn = this.getElementsByClassName($('pfc_colorlist'), 'pfc_color', ''); for(var i = 0; colorbtn.length > i; i++) { colorbtn[i].style.border = 'none'; colorbtn[i].style.padding = '0'; } /* assign the new border style to the selected button */ this.current_text_color = color; setCookie('pfc_current_text_color', this.current_text_color); var idname = 'pfc_color_' + color; $(idname).style.border = '1px solid #555'; $(idname).style.padding = '1px'; // assigne the new color to the input text box this.el_words.style.color = '#'+color; this.el_words.focus(); }, /** * Smiley show/hide */ showHideSmileys: function() { if (this.showsmileys) { this.showsmileys = false; } else { this.showsmileys = true; } setCookie('pfc_showsmileys', this.showsmileys); this.refresh_Smileys(); }, refresh_Smileys: function() { // first of all : show/hide the smiley box var content = $('pfc_smileys'); if (this.showsmileys) content.style.display = 'block'; else content.style.display = 'none'; // then switch the button icon var btn = $('pfc_showHideSmileysbtn'); if (this.showsmileys) { if (btn) { btn.src = this.res.getFileUrl('images/smiley-on.gif'); btn.alt = this.res.getLabel('Hide smiley box'); btn.title = btn.alt; } } else { if (btn) { btn.src = this.res.getFileUrl('images/smiley-off.gif'); btn.alt = this.res.getLabel('Show smiley box'); btn.title = btn.alt; } } }, /** * Show Hide who's online */ showHideWhosOnline: function() { if (this.showwhosonline) { this.showwhosonline = false; } else { this.showwhosonline = true; } setCookie('pfc_showwhosonline', this.showwhosonline); this.refresh_WhosOnline(); }, refresh_WhosOnline: function() { // first of all : show/hide the nickname list box var root = $('pfc_channels_content'); var contentlist = this.getElementsByClassName(root, 'pfc_online', ''); for(var i = 0; i < contentlist.length; i++) { var content = contentlist[i]; if (this.showwhosonline) content.style.display = 'block'; else content.style.display = 'none'; content.style.zIndex = '100'; // for IE6, force the nickname list borders to be shown } // then refresh the button icon var btn = $('pfc_showHideWhosOnlineBtn'); if (!btn) return; if (this.showwhosonline) { btn.src = this.res.getFileUrl('images/online-on.gif'); btn.alt = this.res.getLabel('Hide online users box'); btn.title = btn.alt; } else { btn.src = this.res.getFileUrl('images/online-off.gif'); btn.alt = this.res.getLabel('Show online users box'); btn.title = btn.alt; } this.refresh_Chat(); }, /** * Resize chat */ refresh_Chat: function() { // resize all the tabs content var root = $('pfc_channels_content'); var contentlist = this.getElementsByClassName(root, 'pfc_chat', ''); for(var i = 0; i < contentlist.length; i++) { var chatdiv = contentlist[i]; var style = $H(); if (!this.showwhosonline) { chatdiv.style.width = '100%'; } else { chatdiv.style.width = ''; } } }, getPrompt: function() { if (!this.pfc) this.pfc = new pfcPrompt($('pfc_container')); return this.pfc; } };