[Phpfreechat-svn] SF.net SVN: phpfreechat: [1223] trunk
Status: Beta
Brought to you by:
kerphi
|
From: <ke...@us...> - 2008-03-23 18:52:53
|
Revision: 1223
http://phpfreechat.svn.sourceforge.net/phpfreechat/?rev=1223&view=rev
Author: kerphi
Date: 2008-03-23 11:52:58 -0700 (Sun, 23 Mar 2008)
Log Message:
-----------
Add a new parameter refresh_delay_steps used to adjust dynamically the refresh_delay parameter depending on the chat activity (thanks to Markus for the patch)
Modified Paths:
--------------
trunk/data/public/js/pfcclient.js
trunk/src/pfcglobalconfig.class.php
trunk/themes/default/chat.js.tpl.php
Modified: trunk/data/public/js/pfcclient.js
===================================================================
--- trunk/data/public/js/pfcclient.js 2007-11-26 13:08:10 UTC (rev 1222)
+++ trunk/data/public/js/pfcclient.js 2008-03-23 18:52:58 UTC (rev 1223)
@@ -1,2085 +1,2124 @@
-// Browser detection mostly taken from prototype.js 1.5.1.1.
-var is_ie = !!(window.attachEvent && !window.opera);
-var is_khtml = !!(navigator.appName.match("Konqueror") || navigator.appVersion.match("KHTML"));
-var is_gecko = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1;
-var is_ie7 = navigator.userAgent.indexOf('MSIE 7') > 0;
-var is_opera = !!window.opera;
-var is_webkit = navigator.userAgent.indexOf('AppleWebKit/') > -1;
-
-/**
- * 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 commands
- // use the up and down arrow key to navigate through the history
- 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.last_response_time = new Date().getTime();
- this.last_request_time = new Date().getTime();
-
- /* 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();
- },
-
- loadChat: function() {
- new Ajax.Request(pfc_server_script_url, {
- method: 'get',
- parameters: {pfc_ajax: 1, f: 'loadChat'},
- onSuccess: function(transport) {
- eval( transport.responseText );
- }
- });
- },
-
- 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, 'keyup', this.callbackWords_OnKeyup.bindAsEventListener(this), false);
- Event.observe(this.el_words, 'mouseup', this.callbackWords_OnMouseup.bindAsEventListener(this), false);
- Event.observe(this.el_words, 'focus', this.callbackWords_OnFocus.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 ? '<span style="color:red">'+error_text+'</span><br/>' : '')+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)
- {
- // display some debug messages
- if (pfc_debug)
- if (cmd != "update")
- {
- var param2 = param;
- if (cmd == "who" || cmd == "who2")
- {
- param2 = $H(param2);
- param2.set('meta', $H(param2.get('meta')));
- param2.get('meta').set('users', $H(param2.get('meta').get('users')));
- trace('handleResponse: '+cmd + "-"+resp+"-"+param2.inspect());
- }
- else
- if (cmd == "whois" || cmd == "whois2")
- {
- param2 = $H(param2);
- trace('handleResponse: '+cmd + "-"+resp+"-"+param2.inspect());
- }
- else
- if (cmd == "getnewmsg" || cmd == "join")
- {
- param2 = $A(param2);
- trace('handleResponse: '+cmd + "-"+resp+"-"+param2.inspect());
- }
- else
- trace('handleResponse: '+cmd + "-"+resp+"-"+param);
- }
-
- if (cmd == "connect")
- {
- if (resp == "ok")
- {
- this.nickname = param[0];
- 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.tabs.length == 1) 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")
- {
- 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.tabs.length == 1) 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
- this.displayMsg( cmd, this.res.getLabel('You are trying to speak to a unknown (or not connected) 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.setUserMeta(this.nickid, 'nick', param);
- this.el_handle.innerHTML = this.getUserMeta(this.nickid, 'nick').escapeHTML();
- this.nickname = this.getUserMeta(this.nickid, 'nick');
- 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('Chosen nickname is already used'), Array());
- this.askNick(param,this.res.getLabel('Chosen nickname is already used'));
- }
- else if (resp == "notallowed")
- {
- // When frozen_nick is true and the nickname is already 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('Chosen nickname is not allowed'), Array());
- // then stop chat updates
- this.updateChat(false);
- this.isconnected = false;
- this.refresh_loginlogout();
- }
- }
- else if (cmd == "update")
- {
- }
- 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")
- {
- param = $H(param);
- var nickid = param.get('nickid');
- if (resp == "ok")
- {
- this.setUserMeta(nickid, 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<um_keys.length; i++)
- {
- var k = um_keys[i];
- var v = um.get(k);
- if (v &&
- // these parameter are used internaly (don't display it)
- k != 'nickid' &&
- k != 'floodtime' &&
- k != 'flood_nbmsg' &&
- k != 'flood_nbchar')
- msg = msg + '<strong>' + k + '</strong>: ' + v + '<br/>';
- }
- this.displayMsg( cmd, msg );
- }
- }
- else if (cmd == "who" || cmd == "who2")
- {
- param = $H(param);
- var chan = param.get('chan');
- var chanid = param.get('chanid');
- var meta = $H(param.get('meta'));
- meta.set('users', $H(meta.get('users')));
- if (resp == "ok")
- {
- this.setChanMeta(chanid,meta);
- // send /whois commands for unknown users
- for (var i=0; i<meta.get('users').get('nickid').length; i++)
- {
- var nickid = meta.get('users').get('nickid')[i];
- var nick = meta.get('users').get('nick')[i];
- var um = this.getAllUserMeta(nickid);
- if (!um) this.sendRequest('/whois2 "'+nickid+'"');
- }
-
- // update the nick list display on the current channel
- this.updateNickListBox(chanid);
- }
- if (cmd == "who")
- {
- // display the whois info
- var cm = this.getAllChanMeta(chanid);
- var cm_keys = cm.keys();
- var msg = '';
- for (var i=0; i<cm_keys.length; i++)
- {
- var k = cm_keys[i];
- var v = cm[k];
- if (k != 'users')
- {
- msg = msg + '<strong>' + k + '</strong>: ' + v + '<br/>';
- }
- }
- 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.get(nickid))
- return this.usermeta.get(nickid);
- else
- return null;
- },
-
- getUserMeta: function(nickid, key)
- {
- if (nickid && key && this.usermeta.get(nickid) && this.usermeta.get(nickid).get(key))
- return this.usermeta.get(nickid).get(key);
- else
- return '';
- },
-
- setUserMeta: function(nickid, key, value)
- {
- if (nickid && key)
- {
- if (!this.usermeta.get(nickid)) this.usermeta.set(nickid, $H());
- if (value)
- this.usermeta.get(nickid).set(key, value);
- else
- this.usermeta.set(nickid, $H(key));
- }
- },
-
- getAllChanMeta: function(chanid)
- {
- if (chanid && this.chanmeta.get(chanid))
- return this.chanmeta.get(chanid);
- else
- return null;
- },
-
- getChanMeta: function(chanid, key)
- {
- if (chanid && key && this.chanmeta.get(chanid) && this.chanmeta.get(chanid).get(key))
- return this.chanmeta.get(chanid).get(key);
- else
- return '';
- },
-
- setChanMeta: function(chanid, key, value)
- {
- if (chanid && key)
- {
- if (!this.chanmeta.get(chanid)) this.chanmeta.set(chanid, $H());
- if (value)
- this.chanmeta.get(chanid).set(key,value);
- else
- this.chanmeta.set(chanid, $H(key));
- }
- },
-
- 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.
- * Nicks with spaces may not work under certain circumstances.
- * Replacing spaces with alternate spaces (e.g., ) helps.
- * Gecko browsers convert the to regular spaces, so no help for these browsers.
- * Note: IRC does not allow nicks with spaces, so it's much easier for those clients. :)
- * @author Gerard Pinzone
- */
- completeNick: function()
- {
- var w = this.el_words;
- var selStart = w.value.length; // Default for browsers that don't support selection/caret position commands.
- var selEnd = selStart;
-
- // Get selection/caret position.
- if (w.setSelectionRange)
- {
- // We don't rely on the stored values for browsers that support
- // the selectionStart and selectionEnd commands.
- selStart = w.selectionStart;
- selEnd = w.selectionEnd;
- }
- else if (w.createTextRange && document.selection)
- {
- // We must rely on the stored values for IE browsers.
- selStart = (w.selStart != null) ? w.selStart : w.value.length;
- selEnd = (w.selEnd != null) ? w.selEnd : w.value.length;
- }
-
- var begin = w.value.lastIndexOf(' ', selStart - 1) + 1;
- var end = (w.value.indexOf(' ', selStart) >= 0) ? w.value.indexOf(' ', selStart) : w.value.length;
- var nick_src = w.value.substring(begin, end);
- var non_nick_begin = w.value.substring(0, begin);
- var non_nick_end = w.value.substring(end, w.value.length);
-
- if (nick_src != '')
- {
- var tabid = this.gui.getTabId();
- var n_list = this.getChanMeta(tabid, 'users')['nick'];
- var nick_match = false;
- for (var i = 0; i < n_list.length; i++)
- {
- var nick_tmp = n_list[i];
- // replace spaces in nicks with
- nick_tmp = nick_tmp.replace(/ /g, '\240');
- if (nick_tmp.indexOf(nick_src) == 0)
- {
- if (! nick_match)
- {
- nick_match = true;
- nick_replace = nick_tmp;
- }
- else
- {
- // more than one possibility for completion
- var nick_len = Math.min(nick_tmp.length, nick_replace.length);
- // only keep characters that are common to all matches
- var j = 0;
- for (j = 0; j < nick_len; j++)
- if (nick_tmp.charAt(j) != nick_replace.charAt(j))
- break;
-
- nick_replace = nick_replace.substr(0, j);
- }
- }
- }
- if (nick_match)
- {
- w.value = non_nick_begin + nick_replace + non_nick_end;
- w.selStart = w.selEnd = non_nick_begin.length + nick_replace.length;
-
- // Move cursor to end of completed nick.
- if (w.setSelectionRange)
- w.setSelectionRange(w.selEnd, w.selEnd); // Gecko
- else
- this.setSelection(w); // IE
- }
- }
- },
-
- /**
- * Cycle to older entry in history
- */
- historyUp: function()
- {
- // Write the previous 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 < 0)
- this.cmdhistoryid = 0; // stop at oldest entry
- w.value = this.cmdhistory[this.cmdhistoryid];
- }
- },
-
- /**
- * Cycle to newer entry in history
- */
- historyDown: function()
- {
- // 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 = this.cmdhistory.length; // stop at newest entry + 1
- w.value = ""; // blank input box
- }
- else
- w.value = this.cmdhistory[this.cmdhistoryid];
- }
- },
-
- /**
- * Handle the pressed keys.
- * see also callbackWords_OnKeydown
- */
- callbackWords_OnKeypress: function(evt)
- {
- // All browsers except for IE should use "evt.which."
- var code = (evt.which) ? evt.which : evt.keyCode;
- if (code == Event.KEY_RETURN) /* ENTER key */
- {
- return this.doSendMessage();
- }
- else
- {
- // Allow other key defaults.
- return true;
- }
- },
-
- /**
- * Handle the pressed keys.
- * see also callbackWords_OnKeypress
- * WARNING: Suppressing defaults on the keydown event
- * may prevent keypress and/or keyup events
- * from firing.
- */
- 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 == 38 && (is_gecko || is_ie || is_opera || is_webkit)) // up arrow key
- {
- /* TODO: Fix up arrow issue in Opera - may be a bug in Opera. See TAB handler comments below. */
- /* Konqueror cannot use this feature due to keycode conflicts. */
-
- // Write the previous command in the history.
- this.historyUp();
-
- if (evt.returnValue) // IE
- evt.returnValue = false;
- if (evt.preventDefault) // DOM
- evt.preventDefault();
- return false; // should work in all browsers
- }
- else if (code == 40 && (is_gecko || is_ie || is_opera || is_webkit)) // down arrow key
- {
- /* Konqueror cannot use this feature due to keycode conflicts. */
-
- // Write the previous command in the history.
- this.historyDown();
-
- if (evt.returnValue) // IE
- evt.returnValue = false;
- if (evt.preventDefault) // DOM
- evt.preventDefault();
- return false; // should work in all browsers
- }
- else if (code == 9) /* TAB key */
- {
- // Do nickname completion like on IRC / Unix command line.
- this.completeNick();
-
- if (is_opera)
- {
- // Fixes Opera's loss of focus after TAB key is pressed.
- // This is most likely due to a bug in Opera
- // that executes the default key operation BEFORE the
- // keydown and keypress event handler.
- // This is probably the reason for the "up arrow" issue above.
- //window.setTimeout(function(){evt.target.focus();}, 0);
- evt.target.onblur = function() { this.focus(); this.onblur = null; };
- }
-
- if (evt.returnValue) // IE
- evt.returnValue = false;
- if (evt.preventDefault) // DOM
- evt.preventDefault();
- return false; // Should work in all browsers.
- }
- else
- {
- // Allow other key defaults.
- return true;
- }
- },
- callbackWords_OnKeyup: function(evt)
- {
- // Needed for IE since the text box loses selection/caret position on blur
- this.storeSelectionPos(this.el_words);
- },
- callbackWords_OnMouseup: function(evt)
- {
- // Needed for IE since the text box loses selection/caret position on blur
- this.storeSelectionPos(this.el_words);
- },
- callbackWords_OnFocus: function(evt)
- {
- // if (this.el_handle && this.el_handle.value == '' && !this.minmax_status)
- // this.el_handle.focus();
-
- // Needed for IE since the text box loses selection/caret position on blur
- this.setSelection(this.el_words);
- },
- 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<ids.length; i++)
- this.blink(ids[i].id, 'stop');
- },
-
- /**
- * show error area and assign to it an error message and start the blinking of given fields
- */
- setError: function(str, ids)
- {
- this.el_errors.innerHTML = str;
- this.el_errors.style.display = 'block';
- for (var i=0; i<ids.length; i++)
- this.blink(ids[i].id, 'start');
- },
-
- /**
- * blink routines used by Error functions
- */
- blink: function(id, action)
- {
- clearTimeout(this.blinktimeout[id]);
- if ($(id) == null) return;
- if (action == 'start')
- {
- this.blinktmp[id] = $(id).style.backgroundColor;
- clearTimeout(this.blinktimeout[id]);
- this.blinktimeout[id] = setTimeout('pfc.blink(\'' + id + '\',\'loop\')', 500);
- }
- if (action == 'stop')
- {
- $(id).style.backgroundColor = this.blinktmp[id];
- }
- if (action == 'loop')
- {
- if (this.blinkloop[id] == 1)
- {
- $(id).style.backgroundColor = '#FFDFC0';
- this.blinkloop[id] = 2;
- }
- else
- {
- $(id).style.backgroundColor = '#FFFFFF';
- this.blinkloop[id] = 1;
- }
- this.blinktimeout[id] = setTimeout('pfc.blink(\'' + id + '\',\'loop\')', 500);
- }
- },
-
- displayMsg: function( cmd, msg )
- {
- this.setError(msg, Array());
-
- // @todo find a better crossbrowser way to display messages
-/*
- // get the current selected tab container
- var tabid = this.gui.getTabId();
- var container = this.gui.getChatContentFromTabId(tabid);
-
- // to fix IE6 display bug
- // http://sourceforge.net/tracker/index.php?func=detail&aid=1545403&group_id=158880&atid=809601
- div = document.createElement('div');
- // div.style.padding = "2px 5px 2px 5px"; // this will clear the screen in IE6
- div.innerHTML = '<div class="pfc_info pfc_info_'+cmd+'" style="margin:5px">'+msg+'</div>';
-
- // 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());
-
- 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 += '<div id="pfc_msg_'+recipientid+'_'+id+'" class="pfc_cmd_'+ cmd +' pfc_message';
- line += (id % 2 == 0) ? ' pfc_evenmsg' : ' pfc_oddmsg';
- if (oldmsg == 1) line += ' pfc_oldmsg';
- line += '">';
- line += '<span class="pfc_date';
- if (fromtoday == 1) line += ' pfc_invisible';
- line += '">'+ date +'</span> ';
- line += '<span class="pfc_heure">'+ time +'</span> ';
- if (cmd == 'send')
- {
- line += ' <span class="pfc_nick">';
- line += '‹';
- line += '<span ';
- line += 'onclick="pfc.insert_text(\'' + sender.escapeHTML().replace("'", '\\\'') + ', \',\'\',false)" ';
- line += 'class="pfc_nickmarker pfc_nick_'+ _to_utf8(sender).md5() +'">';
- line += sender.escapeHTML();
- line += '</span>';
- line += '›';
- line += '</span> ';
- }
- if (cmd == 'notice' || cmd == 'me')
- line += '<span class="pfc_words">* '+ this.parseMessage(param) +'</span> ';
- else
- line += '<span class="pfc_words">'+ this.parseMessage(param) +'</span> ';
- line += '</div>';
-
- 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.get(recipientid) == null)
- msg_html.set(recipientid, line);
- else
- msg_html.set(recipientid, msg_html.get(recipientid) + line);
-
- // remember the max message id in order to clean old lines
- if (!max_msgid.get(recipientid)) max_msgid.set(recipientid, 0);
- if (max_msgid.get(recipientid) < id) max_msgid.set(recipientid, id);
- }
-
- // loop on all recipients and post messages
- var keys = msg_html.keys();
- for( var i=0; i<keys.length; i++)
- {
- var recipientid = keys[i];
- var tabid = recipientid;
- // create the tab if it doesn't exists yet
- var recipientdiv = this.gui.getChatContentFromTabId(tabid);
-
- // create a dummy div to avoid konqueror bug when setting nickmarkers
- var m = document.createElement('div'); // do not setup a inline element (ex: span) because the element height will be wrong on FF2 -> scrollDown(..) will be broken
- m.innerHTML = msg_html.get(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.get(recipientid) - pfc_max_displayed_lines;
- var elt = $('pfc_msg_'+recipientid+'_'+limit_msgid);
- while (elt)
- {
- // delete this element to save browser memory
- if(elt.parentNode)
- elt.parentNode.removeChild(elt);
- else if(elt.parentElement) // older IE browsers (<6.0) may not support parentNode
- elt.parentElement.removeChild(elt);
- else // if all else fails
- elt.innerHTML = '';
- limit_msgid--;
- elt = $('pfc_msg_'+recipientid+'_'+limit_msgid);
- }
- }
- },
-
- /**
- * Call the ajax request function
- * Will query the server
- */
- sendRequest: function(cmd, recipientid)
- {
- // do not send another ajax requests if the last one is not yet finished
- if (cmd == '/update' && this.pfc_ajax_connected) return;
-
- 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);
- }
-
- // prepare the command string
- var rx = new RegExp('(^\/[^ ]+) *(.*)','ig');
- if (!recipientid) recipientid = this.gui.getTabId();
- cmd = cmd.replace(rx, '$1 '+this.clientid+' '+(recipientid==''?'0':recipientid)+' $2');
-
- // send the real ajax request
- var url = pfc_server_script_url;
- new Ajax.Request(url, {
- method: 'post',
- parameters: {'pfc_ajax':1, 'f':'handleRequest', 'cmd': cmd },
- onCreate: function(transport) {
- this.pfc_ajax_connected = true;
- // request time counter used by ping indicator
- this.last_request_time = new Date().getTime();
- }.bind(this),
- onSuccess: function(transport) {
- if (!transport.status) return; // fix strange behavior on KHTML
-
- // request time counter used by ping indicator
- this.last_response_time = new Date().getTime();
- // evaluate the javascript response
- eval( transport.responseText );
- }.bind(this),
- onComplete: function(transport) {
- this.pfc_ajax_connected = false;
-
- // calculate the ping and display it
- this.ping = Math.abs(this.last_response_time - this.last_request_time);
- if ($('pfc_ping')) $('pfc_ping').innerHTML = this.ping+'ms';
- }.bind(this)
- });
- },
-
- /**
- * update function to poll the server each 'refresh_delay' time
- */
- updateChat: function(start)
- {
- clearTimeout(this.timeout);
- if (start)
- {
- this.sendRequest('/update');
-
- // setup the next update
- this.timeout = setTimeout('pfc.updateChat(true)', this.refresh_delay);
- }
- },
-
- /**
- * Stores the caret/selection position for IE 6.x and 7.x
- * Returns true if text range start and end values were updated.
- * Code based on: http://www.bazon.net/mishoo/articles.epl?art_id=1292
- */
- storeSelectionPos: function(obj)
- {
- // We don't need to store the start and end positions if the browser
- // supports the Gecko selection model. However, these values may be
- // useful for debugging. Also, Opera recognizes Gecko and IE range
- // commands, so we need to ensure Opera only uses the Gecko model.
- /* WARNING: Do not use this for textareas. They require a more
- complex algorithm. */
- if (obj.setSelectionRange)
- {
- obj.selStart = obj.selectionStart;
- obj.selEnd = obj.selectionEnd;
-
- return true;
- }
-
- // IE
- else if (obj.createTextRange && document.selection)
- {
- // Determine current selection start position.
- var range = document.selection.createRange();
- var isCollapsed = range.compareEndPoints("StartToEnd", range) == 0;
- if (!isCollapsed)
- range.collapse(true);
- var b = range.getBookmark();
- obj.selStart = b.charCodeAt(2) - b.charCodeAt(0) - 1;
-
- // Determine current selection end position.
- range = document.selection.createRange();
- isCollapsed = range.compareEndPoints("StartToEnd", range) == 0;
- if (!isCollapsed)
- range.collapse(false);
- b = range.getBookmark();
- obj.selEnd = b.charCodeAt(2) - b.charCodeAt(0) - 1;
-
- return true;
- }
-
- // Browser does not support selection range processing.
- else
- return false;
- },
-
- /**
- * Sets the selection/caret in the object based on the
- * object's selStart and selEnd parameters.
- * This should only be needed for IE only.
- */
- setSelection: function(obj)
- {
- // This part of the function is included to prevent
- // Opera from executing the IE portion.
- /* WARNING: Do not attempt to use this function as
- a wrapper for the Gekco based setSelectionRange.
- It causes problems in Opera when executed from
- the event trigger onFocus. */
- if (obj.setSelectionRange)
- {
- return null;
- }
- // IE
- else if (obj.createTextRange)
- {
- var range = obj.createTextRange();
- range.collapse(true);
- range.moveStart("character", obj.selStart);
- range.moveEnd("character", obj.selEnd - obj.selStart);
- range.select();
-
- return range;
- }
- // Browser does not support selection range processing.
- else
- return null;
- },
-
- /**
- * insert a smiley
- */
- insertSmiley: function(smiley)
- {
- var w = this.el_words;
-
- if (w.setSelectionRange)
- {
- // Gecko
- var s = w.selectionStart;
- var e = w.selectionEnd;
- w.value = w.value.substring(0, s) + smiley + w.value.substr(e);
- w.setSelectionRange(s + smiley.length, s + smiley.length);
- w.focus();
- }
- else if (w.createTextRange)
- {
- // IE
- w.focus();
-
- // Get range based on stored values.
- var range = this.setSelection(w);
-
- range.text = smiley;
-
- // Move caret position to end of smiley and collapse selection, if any.
- // Check if internally kept values for selection are initialized.
- w.selStart = (w.selStart) ? w.selStart + smiley.length : smiley.length;
- w.selEnd = w.selStart;
- }
- else
- {
- // Unsupported browsers get smiley at end of string like old times.
- w.value += smiley;
- w.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 className = (! is_ie) ? 'class' : 'className';
-
- var nickidlst = this.getChanMeta(chanid,'users').get('nickid');
- var nickdiv = this.gui.getOnlineContentFromTabId(chanid);
- var ul = document.createElement('ul');
- ul.setAttribute(className, 'pfc_nicklist');
- for (var i=0; i<nickidlst.length; i++)
- {
- var nickid = nickidlst[i];
- var li = this.buildNickItem(nickid);
- li.setAttribute(className, 'pfc_nickitem_'+nickid);
- ul.appendChild(li);
- }
- var fc = nickdiv.firstChild;
- if (fc)
- nickdiv.replaceChild(ul,fc);
- else
- nickdiv.appendChild(ul,fc);
- this.colorizeNicks(nickdiv);
- },
-
- getNickWhoisBox: function(nickid)
- {
- if (!this.nickwhoisbox.get(nickid))
- this.updateNickWhoisBox(nickid);
- return this.nickwhoisbox.get(nickid);
- },
-
- updateNickWhoisBox: function(nickid)
- {
- var className = (! is_ie) ? 'class' : 'className';
-
- var usermeta = this.getAllUserMeta(nickid);
- var div = document.createElement('div');
- div.setAttribute(className, 'pfc_nickwhois');
-
- var p = document.createElement('p');
- p.setAttribute(className, 'pfc_nickwhois_header');
- div.appendChild(p);
-
- // add the close button
- var img = document.createElement('img');
- img.setAttribute(className, 'pfc_nickwhois_close');
- img.pfc_parent = div;
- img.onclick = function(evt){
- this.pfc_parent.style.display = 'none';
- return false;
- }
- img.setAttribute('src', this.res.getFileUrl('images/close-whoisbox.gif'));
- img.alt = this.res.getLabel('Close');
- p.appendChild(img);
- p.appendChild(document.createTextNode(usermeta.get('nick'))); // append the nickname text in the title
-
- // add the whois information table
- var table = document.createElement('table');
- var tbody = document.createElement('tbody');
- table.appendChild(tbody);
- var um_keys = usermeta.keys();
- var msg = '';
- for (var i=0; i<um_keys.length; i++)
- {
- var k = um_keys[i];
- var v = usermeta.get(k);
- if (v && k != 'nickid'
- && k != 'nick' // useless because it is displayed in the box title
- && k != 'isadmin' // useless because of the gold shield icon
- && k != 'floodtime'
- && k != 'flood_nbmsg'
- && k != 'flood_nbchar'
- )
- {
- var tr = document.createElement('tr');
- if (pfc_nickmeta_key_to_hide.indexOf(k) != -1)
- {
- var td2 = document.createElement('td');
- td2.setAttribute(className, 'pfc_nickwhois_c2');
- td2.setAttribute('colspan', 2);
- td2.innerHTML = v;
- tr.appendChild(td2);
- }
- else
- {
- var td1 = document.createElement('td');
- td1.setAttribute(className, 'pfc_nickwhois_c1');
- var td2 = document.createElement('td');
- td2.setAttribute(className, 'pfc_nickwhois_c2');
- td1.innerHTML = k;
- td2.innerHTML = v;
- tr.appendChild(td1);
- tr.appendChild(td2);
- }
- tbody.appendChild(tr);
- }
- }
- div.appendChild(table);
-
- // add the privmsg link (do not add it if the nick is yours)
- if (pfc.getUserMeta(nickid,'nick') != this.nickname)
- {
- var p = document.createElement('p');
- p.setAttribute(className, 'pfc_nickwhois_pv');
- var a = document.createElement('a');
- a.setAttribute('href', '');
- a.pfc_nickid = nickid;
- a.pfc_parent = div;
- a.onclick = function(evt){
- var nick = pfc.getUserMeta(this.pfc_nickid,'nick');
- pfc.sendRequest('/privmsg "'+nick+'"');
- this.pfc_parent.style.display = 'none';
- return false;
- }
- var img = document.createElement('img');
- img.setAttribute('src', this.res.getFileUrl('images/openpv.gif'));
- img.alt = document.createTextNode(this.res.getLabel('Private message'));
- a.appendChild(img);
- a.appendChild(document.createTextNode(this.res.getLabel('Private message')));
- p.appendChild(a);
- div.appendChild(p);
- }
-
- this.nickwhoisbox.set(nickid, div);
- },
-
- buildNickItem: function(nickid)
- {
- var className = (! is_ie) ? 'class' : 'className';
-
- var nick = this.getUserMeta(nickid, 'nick');
- var isadmin = this.getUserMeta(nickid, 'isadmin');
- if (isadmin == '') isadmin = false;
-
- var li = document.createElement('li');
-
- var a = document.createElement('a');
- a.setAttribute('href','#');
- a.pfc_nick = nick;
- a.pfc_nickid = nickid;
- a.onclick = function(evt){
- var d = pfc.getNickWhoisBox(this.pfc_nickid);
- document.body.appendChild(d);
- d.style.display = 'block';
- d.style.zIndex = '400';
- d.style.position = 'absolute';
- d.style.left = (mousePosX(evt)-7)+'px';
- d.style.top = (mousePosY(evt)-7)+'px';
- return false;
- }
- li.appendChild(a);
-
- var img = document.createElement('img');
- if (isadmin)
- img.setAttribute('src', this.res.getFileUrl('images/user-admin.gif'));
- else
- img.setAttribute('src', this.res.getFileUrl('images/user.gif'));
- img.style.marginRight = '5px';
- img.setAttribute(className, 'pfc_nickbutton');
- a.appendChild(img);
-
- // nobr is not xhtml valid but it's a workeround
- // for IE which doesn't support 'white-space: pre' css rule
- var nobr = document.createElement('nobr');
- var span = document.createElement('span');
- span.setAttribute(className, 'pfc_nickmarker pfc_nick_'+nickid);
- span.innerHTML = nick.escapeHTML();
- nobr.appendChild(span);
- a.appendChild(nobr);
-
- return li;
- },
-
- /**
- * clear the nickname list
- */
- clearNickList: function()
- {
- /*
- var nickdiv = this.el_online;
- var fc = nickdiv.firstChild;
- if (fc) nickdiv.removeChild(fc);
- */
- },
-
-
- /**
- * clear the message list history
- */
- clearMessages: function()
- {
- //var msgdiv = $('pfc_chat');
- //msgdiv.innerHTML = '';
- },
-
- /**
- * parse the message
- */
- parseMessage: function(msg)
- {
- var rx = null;
-/*
- // parse urls
- var rx_url = new RegExp('(^|[^\\"])([a-z]+\:\/\/[a-z0-9.\\~\\/\\?\\=\\&\\-\\_\\#:;%,@]*[a-z0-9\\/\\?\\=\\&\\-\\_\\#])([^\\"]|$)','ig');
- var ttt = msg.split(rx_url);
- if (ttt.length > 1 &&
- !navigator.appName.match("Explorer|Konqueror") &&
- !navigator.appVersion.match("KHTML"))
- {
- msg = '';
- for( var i = 0; i<ttt.length; i++)
- {
- var offset = (ttt[i].length - 7) / 2;
- var delta = (ttt[i].length - 7 - 60);
- var range1 = 7+offset-delta;
- var range2 = 7+offset+delta;
- if (ttt[i].match(rx_url))
- {
- msg = msg + '<a href="' + ttt[i] + '"';
- if (pfc_openlinknewwindow)
- msg = msg + ' onclick="window.open(this.href,\'_blank\');return false;"';
- msg = msg + '>' + (delta>0 ? ttt[i].substring(7,range1)+ ' ... ' + ttt[i].substring(range2,ttt[i].length) : ttt[i]) + '</a>';
- }
- else
- {
- msg = msg + ttt[i];
- }
- }
- }
- else
- {
- // fallback for IE6/Konqueror which do not support split with regexp
- replace = '$1<a href="$2"';
- if (pfc_openlinknewwindow)
- replace = replace + ' onclick="window.open(this.href,\'_blank\');return false;"';
- replace = replace + '>$2</a>$3';
- msg = msg.replace(rx_url, replace);
- }
-*/
-
- // Remove auto-linked entries.
- if ( false )
- {
- rx = new RegExp('<a href="mailto:(.*?)".*?>.*?<\/a>','ig');
- msg = msg.replace(rx, '$1');
- rx = new RegExp('<a href="(.*?)".*?>.*?<\/a>','ig');
- msg = msg.replace(rx, '$1');
- }
-
- // Replace double spaces outside of tags by " " entity.
- rx = new RegExp(' (?= )(?![^<]*>)','g');
- msg = msg.replace(rx, ' ');
-
- // try to parse bbcode
- rx = new RegExp('\\[b\\](.+?)\\[\/b\\]','ig');
- msg = msg.replace(rx, '<span style="font-weight: bold">$1</span>');
- rx = new RegExp('\\[i\\](.+?)\\[\/i\\]','ig');
- msg = msg.replace(rx, '<span style="font-style: italic">$1</span>');
- rx = new RegExp('\\[u\\](.+?)\\[\/u\\]','ig');
- msg = msg.replace(rx, '<span style="text-decoration: underline">$1</span>');
- rx = new RegExp('\\[s\\](.+?)\\[\/s\\]','ig');
- msg = msg.replace(rx, '<span style="text-decoration: line-through">$1</span>');
- // rx = new RegExp('\\[pre\\](.+?)\\[\/pre\\]','ig');
- // msg = msg.replace(rx, '<pre>$1</pre>');
-/*
- rx = new RegExp('\\[email\\]([A-z0-9][\\w.-]*@[A-z0-9][\\w\\-\\.]+\\.[A-z0-9]{2,6})\\[\/email\\]','ig');
- msg = msg.replace(rx, '<a href="mailto: $1">$1</a>');
- rx = new RegExp('\\[email=([A-z0-9][\\w.-]*@[A-z0-9][\\w\\-\\.]+\\.[A-z0-9]{2,6})\\](.+?)\\[\/email\\]','ig');
- msg = msg.replace(rx, '<a href="mailto: $1">$2</a>');
-*/
- rx = new RegExp('\\[color=([a-zA-Z]+|\\#?[0-9a-fA-F]{6}|\\#?[0-9a-fA-F]{3})](.+?)\\[\/color\\]','ig');
- msg = msg.replace(rx, '<span style="color: $1">$2</span>');
- // 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, '<span style="color: $1">$2</span>');
-
- // try to parse smileys
- var smileys = this.res.getSmileyHash();
- var sl = this.res.getSmileyKeys(); // Keys should be sorted by length from pfc.gui.loadSmileyBox()
- for(var i = 0; i < sl.length; i++)
- {
- // We don't want to replace smiley strings inside of tags.
- // Use negative lookahead to search for end of tag.
- rx = new RegExp(RegExp.escape(sl[i]) + '(?![^<]*>)','g');
- msg = msg.replace(rx, '<img src="'+ smileys.get(sl[i]) +'" alt="' + sl[i] + '" title="' + sl[i] + '" />');
- }
-
- // try to parse nickname for highlighting
- rx = new RegExp('(^|[ :,;])'+RegExp.escape(this.nickname)+'([ :,;]|$)','gi');
- msg = msg.replace(rx, '$1<strong>'+ this.nickname +'</strong>$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<ttt.length; i++)
- {
- msg = msg + ttt[i] + ' ';
- }
- }
- */
- return msg;
- },
-
- /**
- * apply nicknames color to the root childs
- */
- colorizeNicks: function(root)
- {
- if (this.nickmarker)
- {
- var nicklist = this.getElementsByClassName(root, 'pfc_nickmarker', '');
- for(var i = 0; i < nicklist.length; i++)
- {
- var cur_nick = nicklist[i].innerHTML;
- var cur_color = this.getAndAssignNickColor(cur_nick);
- nicklist[i].style.color = cur_color;
- }
- }
- },
-
- /**
- * Initialize the color array used to colirize the nicknames
- */
- reloadColorList: function()
- {
- this.colorlist = $A(pfc_nickname_color_list);
- },
-
-
- /**
- * get the corresponding nickname color
- */
- getAndAssignNickColor: function(nick)
- {
- /* check the nickname is colorized or not */
- var already_colorized = false;
- var nc = '';
- for(var j = 0; j < this.nickcolor.length && !already_colorized; j++)
- {
- if (this.nickcolor[j][0] == nick)
- {
- already_colorized = true;
- nc = this.nickcolor[j][1];
- }
- }
- if (!already_colorized)
- {
- /* reload the color stack if it's empty */
- if (this.colorlist.length == 0) this.reloadColorList();
- /* take the next color from the list and colorize this nickname */
- var cid = Math.round(Math.random()*(this.colorlist.length-1));
- nc = this.colorlist[cid];
- this.colorlist.splice(cid,1);
- this.nickcolor.push(new Array(nick, nc));
- }
-
- return nc;
- },
-
-
- /**
- * Colorize with 'color' all the nicknames found as a 'root' child
- */
- applyNickColor: function(root, nick, color)
- {
-
- var nicktochange = this.getElementsByClassName(root, 'pfc_nick_'+ _to_utf8(nick).md5(), '');
- for(var i = 0; nicktochange.length > 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<els.length; i++) {
- if(els.item(i).className.match(rx1) &&
- (clsIgnore == '' || !els.item(i).className.match(rx2)) )
- {
- matches.push(els.item(i));
- }
- }
- return matches;
- },
-
- showClass: function(root, clsName, clsIgnore, show)
- {
- var elts = this.getElementsByClassName(root, clsName, clsIgnore);
- for(var i = 0; elts.length > 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;
-
- // Gecko
- /* Always check for Gecko selection processing commands
- first. This is needed for Opera. */
- if (msgfield.selectionStart || msgfield.selectionStart == '0')
- {
- var startPos = msgfield.selectionStart;
- var endPos = msgfield.selectionEnd;
-
- var text = msgfield.value.substring(startPos, endPos);
- if (startPos == endPos && promptifselempty)
- {
- pfcp.prompt(this.res.getLabel('Enter the text to format'), '');
- pfcp.focus();
- }
- else
- this.insert_text_callback(text, pfcp);
- }
-
- // IE
- else if (document.selection && document.selection.createRange)
- {
- msgfield.focus();
-
- // Get selection range.
- pfcp.range = this.setSelection(msgfield);
- var text = pfcp.range.text;
- if (text == "" && 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 range = pfcp.range;
-
- // Gecko
- /* Always check for Gecko selection processing commands
- first. This is needed for Opera. */
- 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.su...
[truncated message content] |