aboutsummaryrefslogtreecommitdiffstats
path: root/library/ajaxchat/chat/lib
diff options
context:
space:
mode:
authorfriendica <info@friendica.com>2014-01-18 23:49:39 -0800
committerfriendica <info@friendica.com>2014-01-18 23:49:39 -0800
commit724ad4505628d493b43b4f585512d67dc0b4ee76 (patch)
tree4fb920a79e3dff961a6301ec56ec9f40e91f6af3 /library/ajaxchat/chat/lib
parent3f7032e542e3c451507fc9266ab3536155c8190f (diff)
downloadvolse-hubzilla-724ad4505628d493b43b4f585512d67dc0b4ee76.tar.gz
volse-hubzilla-724ad4505628d493b43b4f585512d67dc0b4ee76.tar.bz2
volse-hubzilla-724ad4505628d493b43b4f585512d67dc0b4ee76.zip
add ajaxchat library - needs a lot of integration work to handle decentralisation (e.g. chatroom@website) and zotid w/permissions (e.g. ACL controlled chatrooms); we can also rip out a lot of stuff we don't need.
Diffstat (limited to 'library/ajaxchat/chat/lib')
-rw-r--r--library/ajaxchat/chat/lib/.htaccess4
-rw-r--r--library/ajaxchat/chat/lib/class/AJAXChat.php3326
-rw-r--r--library/ajaxchat/chat/lib/class/AJAXChatDataBase.php81
-rw-r--r--library/ajaxchat/chat/lib/class/AJAXChatEncoding.php138
-rw-r--r--library/ajaxchat/chat/lib/class/AJAXChatFileSystem.php22
-rw-r--r--library/ajaxchat/chat/lib/class/AJAXChatHTTPHeader.php56
-rw-r--r--library/ajaxchat/chat/lib/class/AJAXChatLanguage.php102
-rw-r--r--library/ajaxchat/chat/lib/class/AJAXChatMySQLDataBase.php92
-rw-r--r--library/ajaxchat/chat/lib/class/AJAXChatMySQLQuery.php89
-rw-r--r--library/ajaxchat/chat/lib/class/AJAXChatMySQLiDataBase.php91
-rw-r--r--library/ajaxchat/chat/lib/class/AJAXChatMySQLiQuery.php81
-rw-r--r--library/ajaxchat/chat/lib/class/AJAXChatString.php37
-rw-r--r--library/ajaxchat/chat/lib/class/AJAXChatTemplate.php329
-rw-r--r--library/ajaxchat/chat/lib/class/CustomAJAXChat.php124
-rw-r--r--library/ajaxchat/chat/lib/class/CustomAJAXChatInterface.php21
-rw-r--r--library/ajaxchat/chat/lib/class/CustomAJAXChatShoutBox.php25
-rw-r--r--library/ajaxchat/chat/lib/classes.php26
-rw-r--r--library/ajaxchat/chat/lib/config.php.example209
-rw-r--r--library/ajaxchat/chat/lib/custom.php11
-rw-r--r--library/ajaxchat/chat/lib/data/channels.php16
-rw-r--r--library/ajaxchat/chat/lib/data/users.php40
-rw-r--r--library/ajaxchat/chat/lib/lang/ar.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/bg.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/ca.php125
-rw-r--r--library/ajaxchat/chat/lib/lang/cy.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/cz.php123
-rw-r--r--library/ajaxchat/chat/lib/lang/da.php123
-rw-r--r--library/ajaxchat/chat/lib/lang/de.php123
-rw-r--r--library/ajaxchat/chat/lib/lang/el.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/en.php123
-rw-r--r--library/ajaxchat/chat/lib/lang/es.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/et.php123
-rw-r--r--library/ajaxchat/chat/lib/lang/fa.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/fi.php125
-rw-r--r--library/ajaxchat/chat/lib/lang/fr.php125
-rw-r--r--library/ajaxchat/chat/lib/lang/gl.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/he.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/hr.php123
-rw-r--r--library/ajaxchat/chat/lib/lang/hu.php123
-rw-r--r--library/ajaxchat/chat/lib/lang/in.php123
-rw-r--r--library/ajaxchat/chat/lib/lang/it.php125
-rw-r--r--library/ajaxchat/chat/lib/lang/ja.php123
-rw-r--r--library/ajaxchat/chat/lib/lang/ka.php123
-rw-r--r--library/ajaxchat/chat/lib/lang/kr.php123
-rw-r--r--library/ajaxchat/chat/lib/lang/mk.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/nl-be.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/nl.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/no.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/pl.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/pt-br.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/pt-pt.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/ro.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/ru.php125
-rw-r--r--library/ajaxchat/chat/lib/lang/sk.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/sl.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/sr.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/sv.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/th.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/tr.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/uk.php124
-rw-r--r--library/ajaxchat/chat/lib/lang/zh-tw.php123
-rw-r--r--library/ajaxchat/chat/lib/lang/zh.php124
-rw-r--r--library/ajaxchat/chat/lib/template/loggedIn.html387
-rw-r--r--library/ajaxchat/chat/lib/template/loggedOut.html78
-rw-r--r--library/ajaxchat/chat/lib/template/logs.html276
-rw-r--r--library/ajaxchat/chat/lib/template/shoutbox.html60
66 files changed, 10798 insertions, 0 deletions
diff --git a/library/ajaxchat/chat/lib/.htaccess b/library/ajaxchat/chat/lib/.htaccess
new file mode 100644
index 000000000..91e386dc9
--- /dev/null
+++ b/library/ajaxchat/chat/lib/.htaccess
@@ -0,0 +1,4 @@
+AuthType Basic
+AuthName "Forbidden"
+AuthUserFile /dev/null
+require user nobody \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/class/AJAXChat.php b/library/ajaxchat/chat/lib/class/AJAXChat.php
new file mode 100644
index 000000000..2cf7aa11f
--- /dev/null
+++ b/library/ajaxchat/chat/lib/class/AJAXChat.php
@@ -0,0 +1,3326 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+// Ajax Chat backend logic:
+class AJAXChat {
+
+ var $db;
+ var $_config;
+ var $_requestVars;
+ var $_infoMessages;
+ var $_channels;
+ var $_allChannels;
+ var $_view;
+ var $_lang;
+ var $_invitations;
+ var $_customVars;
+ var $_sessionNew;
+ var $_onlineUsersData;
+ var $_bannedUsersData;
+
+ function __construct() {
+ $this->initialize();
+ }
+
+ function initialize() {
+ // Initialize configuration settings:
+ $this->initConfig();
+
+ // Initialize the DataBase connection:
+ $this->initDataBaseConnection();
+
+ // Initialize request variables:
+ $this->initRequestVars();
+
+ // Initialize the chat session:
+ $this->initSession();
+
+ // Handle the browser request and send the response content:
+ $this->handleRequest();
+ }
+
+ function initConfig() {
+ $config = null;
+ if (!include(AJAX_CHAT_PATH.'lib/config.php')) {
+ echo('<strong>Error:</strong> Could not find a config.php file in "'.AJAX_CHAT_PATH.'"lib/". Check to make sure the file exists.');
+ die();
+ }
+ $this->_config = &$config;
+
+ // Initialize custom configuration settings:
+ $this->initCustomConfig();
+ }
+
+ function initRequestVars() {
+ $this->_requestVars = array();
+ $this->_requestVars['ajax'] = isset($_REQUEST['ajax']) ? true : false;
+ $this->_requestVars['userID'] = isset($_REQUEST['userID']) ? (int)$_REQUEST['userID'] : null;
+ $this->_requestVars['userName'] = isset($_REQUEST['userName']) ? $_REQUEST['userName'] : null;
+ $this->_requestVars['channelID'] = isset($_REQUEST['channelID']) ? (int)$_REQUEST['channelID'] : null;
+ $this->_requestVars['channelName'] = isset($_REQUEST['channelName']) ? $_REQUEST['channelName'] : null;
+ $this->_requestVars['text'] = isset($_POST['text']) ? $_POST['text'] : null;
+ $this->_requestVars['lastID'] = isset($_REQUEST['lastID']) ? (int)$_REQUEST['lastID'] : 0;
+ $this->_requestVars['login'] = isset($_REQUEST['login']) ? true : false;
+ $this->_requestVars['logout'] = isset($_REQUEST['logout']) ? true : false;
+ $this->_requestVars['password'] = isset($_REQUEST['password']) ? $_REQUEST['password'] : null;
+ $this->_requestVars['view'] = isset($_REQUEST['view']) ? $_REQUEST['view'] : null;
+ $this->_requestVars['year'] = isset($_REQUEST['year']) ? (int)$_REQUEST['year'] : null;
+ $this->_requestVars['month'] = isset($_REQUEST['month']) ? (int)$_REQUEST['month'] : null;
+ $this->_requestVars['day'] = isset($_REQUEST['day']) ? (int)$_REQUEST['day'] : null;
+ $this->_requestVars['hour'] = isset($_REQUEST['hour']) ? (int)$_REQUEST['hour'] : null;
+ $this->_requestVars['search'] = isset($_REQUEST['search']) ? $_REQUEST['search'] : null;
+ $this->_requestVars['shoutbox'] = isset($_REQUEST['shoutbox']) ? true : false;
+ $this->_requestVars['getInfos'] = isset($_REQUEST['getInfos']) ? $_REQUEST['getInfos'] : null;
+ $this->_requestVars['lang'] = isset($_REQUEST['lang']) ? $_REQUEST['lang'] : null;
+ $this->_requestVars['delete'] = isset($_REQUEST['delete']) ? (int)$_REQUEST['delete'] : null;
+
+ // Initialize custom request variables:
+ $this->initCustomRequestVars();
+
+ // Remove slashes which have been added to user input strings if magic_quotes_gpc is On:
+ if(get_magic_quotes_gpc()) {
+ // It is safe to remove the slashes as we escape user data ourself
+ array_walk(
+ $this->_requestVars,
+ create_function(
+ '&$value, $key',
+ 'if(is_string($value)) $value = stripslashes($value);'
+ )
+ );
+ }
+ }
+
+ function initDataBaseConnection() {
+ // Create a new database object:
+ $this->db = new AJAXChatDataBase(
+ $this->_config['dbConnection']
+ );
+ // Use a new database connection if no existing is given:
+ if(!$this->_config['dbConnection']['link']) {
+ // Connect to the database server:
+ $this->db->connect($this->_config['dbConnection']);
+ if($this->db->error()) {
+ echo $this->db->getError();
+ die();
+ }
+ // Select the database:
+ $this->db->select($this->_config['dbConnection']['name']);
+ if($this->db->error()) {
+ echo $this->db->getError();
+ die();
+ }
+ }
+ // Unset the dbConnection array for safety purposes:
+ unset($this->_config['dbConnection']);
+ }
+
+ function getDataBaseTable($table) {
+ return ($this->db->getName() ? '`'.$this->db->getName().'`.'.$this->getConfig('dbTableNames',$table) : $this->getConfig('dbTableNames',$table));
+ }
+
+ function initSession() {
+ // Start the PHP session (if not already started):
+ $this->startSession();
+
+ if($this->isLoggedIn()) {
+ // Logout if we receive a logout request, the chat has been closed or the userID could not be revalidated:
+ if($this->getRequestVar('logout') || !$this->isChatOpen() || !$this->revalidateUserID()) {
+ $this->logout();
+ return;
+ }
+ // Logout if the Session IP is not the same when logged in and ipCheck is enabled:
+ if($this->getConfig('ipCheck') && ($this->getSessionIP() === null || $this->getSessionIP() != $_SERVER['REMOTE_ADDR'])) {
+ $this->logout('IP');
+ return;
+ }
+ } else if(
+ // Login if auto-login enabled or a login, userName or shoutbox parameter is given:
+ $this->getConfig('forceAutoLogin') ||
+ $this->getRequestVar('login') ||
+ $this->getRequestVar('userName') ||
+ $this->getRequestVar('shoutbox')
+ ) {
+ $this->login();
+ }
+
+ // Initialize the view:
+ $this->initView();
+
+ if($this->getView() == 'chat') {
+ $this->initChatViewSession();
+ } else if($this->getView() == 'logs') {
+ $this->initLogsViewSession();
+ }
+
+ if(!$this->getRequestVar('ajax') && !headers_sent()) {
+ // Set style cookie:
+ $this->setStyle();
+ // Set langCode cookie:
+ $this->setLangCodeCookie();
+ }
+
+ $this->initCustomSession();
+ }
+
+ function initLogsViewSession() {
+ if($this->getConfig('socketServerEnabled')) {
+ if(!$this->getSessionVar('logsViewSocketAuthenticated')) {
+ $this->updateLogsViewSocketAuthentication();
+ $this->setSessionVar('logsViewSocketAuthenticated', true);
+ }
+ }
+ }
+
+ function updateLogsViewSocketAuthentication() {
+ if($this->getUserRole() != AJAX_CHAT_ADMIN) {
+ $channels = array();
+ foreach($this->getChannels() as $channel) {
+ if($this->getConfig('logsUserAccessChannelList') && !in_array($channel, $this->getConfig('logsUserAccessChannelList'))) {
+ continue;
+ }
+ array_push($channels, $channel);
+ }
+ array_push($channels, $this->getPrivateMessageID());
+ array_push($channels, $this->getPrivateChannelID());
+ } else {
+ // The channelID "ALL" authenticates for all channels:
+ $channels = array('ALL');
+ }
+ $this->updateSocketAuthentication(
+ $this->getUserID(),
+ $this->getSocketRegistrationID(),
+ $channels
+ );
+ }
+
+ function initChatViewSession() {
+ // If channel is not null we are logged in to the chat view:
+ if($this->getChannel() !== null) {
+ // Check if the current user has been logged out due to inactivity:
+ if(!$this->isUserOnline()) {
+ $this->logout();
+ return;
+ }
+ if($this->getRequestVar('ajax')) {
+ $this->initChannel();
+ $this->updateOnlineStatus();
+ $this->checkAndRemoveInactive();
+ }
+ } else {
+ if($this->getRequestVar('ajax')) {
+ // Set channel, insert login messages and add to online list on first ajax request in chat view:
+ $this->chatViewLogin();
+ }
+ }
+ }
+
+ function isChatOpen() {
+ if($this->getUserRole() == AJAX_CHAT_ADMIN)
+ return true;
+ if($this->getConfig('chatClosed'))
+ return false;
+ $time = time();
+ if($this->getConfig('timeZoneOffset') !== null) {
+ // Subtract the server timezone offset and add the config timezone offset:
+ $time -= date('Z', $time);
+ $time += $this->getConfig('timeZoneOffset');
+ }
+ // Check the opening hours:
+ if($this->getConfig('openingHour') < $this->getConfig('closingHour'))
+ {
+ if(($this->getConfig('openingHour') > date('G', $time)) || ($this->getConfig('closingHour') <= date('G', $time)))
+ return false;
+ }
+ else
+ {
+ if(($this->getConfig('openingHour') > date('G', $time)) && ($this->getConfig('closingHour') <= date('G', $time)))
+ return false;
+ }
+ // Check the opening weekdays:
+ if(!in_array(date('w', $time), $this->getConfig('openingWeekDays')))
+ return false;
+ return true;
+ }
+
+ function handleRequest() {
+ if($this->getRequestVar('ajax')) {
+ if($this->isLoggedIn()) {
+ // Parse info requests (for current userName, etc.):
+ $this->parseInfoRequests();
+
+ // Parse command requests (e.g. message deletion):
+ $this->parseCommandRequests();
+
+ // Parse message requests:
+ $this->initMessageHandling();
+ }
+ // Send chat messages and online user list in XML format:
+ $this->sendXMLMessages();
+ } else {
+ // Display XHTML content for non-ajax requests:
+ $this->sendXHTMLContent();
+ }
+ }
+
+ function parseCommandRequests() {
+ if($this->getRequestVar('delete') !== null) {
+ $this->deleteMessage($this->getRequestVar('delete'));
+ }
+ }
+
+ function parseInfoRequests() {
+ if($this->getRequestVar('getInfos')) {
+ $infoRequests = explode(',', $this->getRequestVar('getInfos'));
+ foreach($infoRequests as $infoRequest) {
+ $this->parseInfoRequest($infoRequest);
+ }
+ }
+ }
+
+ function parseInfoRequest($infoRequest) {
+ switch($infoRequest) {
+ case 'userID':
+ $this->addInfoMessage($this->getUserID(), 'userID');
+ break;
+ case 'userName':
+ $this->addInfoMessage($this->getUserName(), 'userName');
+ break;
+ case 'userRole':
+ $this->addInfoMessage($this->getUserRole(), 'userRole');
+ break;
+ case 'channelID':
+ $this->addInfoMessage($this->getChannel(), 'channelID');
+ break;
+ case 'channelName':
+ $this->addInfoMessage($this->getChannelName(), 'channelName');
+ break;
+ case 'socketRegistrationID':
+ $this->addInfoMessage($this->getSocketRegistrationID(), 'socketRegistrationID');
+ break;
+ default:
+ $this->parseCustomInfoRequest($infoRequest);
+ }
+ }
+
+ function sendXHTMLContent() {
+ $httpHeader = new AJAXChatHTTPHeader($this->getConfig('contentEncoding'), $this->getConfig('contentType'));
+
+ $template = new AJAXChatTemplate($this, $this->getTemplateFileName(), $httpHeader->getContentType());
+
+ // Send HTTP header:
+ $httpHeader->send();
+
+ // Send parsed template content:
+ echo $template->getParsedContent();
+ }
+
+ function getTemplateFileName() {
+ switch($this->getView()) {
+ case 'chat':
+ return AJAX_CHAT_PATH.'lib/template/loggedIn.html';
+ case 'logs':
+ return AJAX_CHAT_PATH.'lib/template/logs.html';
+ default:
+ return AJAX_CHAT_PATH.'lib/template/loggedOut.html';
+ }
+ }
+
+ function initView() {
+ $this->_view = null;
+ // "chat" is the default view:
+ $view = ($this->getRequestVar('view') === null) ? 'chat' : $this->getRequestVar('view');
+ if($this->hasAccessTo($view)) {
+ $this->_view = $view;
+ }
+ }
+
+ function getView() {
+ return $this->_view;
+ }
+
+ function hasAccessTo($view) {
+ switch($view) {
+ case 'chat':
+ case 'teaser':
+ if($this->isLoggedIn()) {
+ return true;
+ }
+ return false;
+ case 'logs':
+ if($this->isLoggedIn() && ($this->getUserRole() == AJAX_CHAT_ADMIN ||
+ ($this->getConfig('logsUserAccess') &&
+ ($this->getUserRole() == AJAX_CHAT_MODERATOR || $this->getUserRole() == AJAX_CHAT_USER))
+ )) {
+ return true;
+ }
+ return false;
+ default:
+ return false;
+ }
+ }
+
+ function login() {
+ // Retrieve valid login user data (from request variables or session data):
+ $userData = $this->getValidLoginUserData();
+
+ if(!$userData) {
+ $this->addInfoMessage('errorInvalidUser');
+ return false;
+ }
+
+ // If the chat is closed, only the admin may login:
+ if(!$this->isChatOpen() && $userData['userRole'] != AJAX_CHAT_ADMIN) {
+ $this->addInfoMessage('errorChatClosed');
+ return false;
+ }
+
+ if(!$this->getConfig('allowGuestLogins') && $userData['userRole'] == AJAX_CHAT_GUEST) {
+ return false;
+ }
+
+ // Check if userID or userName are already listed online:
+ if($this->isUserOnline($userData['userID']) || $this->isUserNameInUse($userData['userName'])) {
+ if($userData['userRole'] == AJAX_CHAT_USER || $userData['userRole'] == AJAX_CHAT_MODERATOR || $userData['userRole'] == AJAX_CHAT_ADMIN) {
+ // Set the registered user inactive and remove the inactive users so the user can be logged in again:
+ $this->setInactive($userData['userID'], $userData['userName']);
+ $this->removeInactive();
+ } else {
+ $this->addInfoMessage('errorUserInUse');
+ return false;
+ }
+ }
+
+ // Check if user is banned:
+ if($userData['userRole'] != AJAX_CHAT_ADMIN && $this->isUserBanned($userData['userName'], $userData['userID'], $_SERVER['REMOTE_ADDR'])) {
+ $this->addInfoMessage('errorBanned');
+ return false;
+ }
+
+ // Check if the max number of users is logged in (not affecting moderators or admins):
+ if(!($userData['userRole'] == AJAX_CHAT_MODERATOR || $userData['userRole'] == AJAX_CHAT_ADMIN) && $this->isMaxUsersLoggedIn()) {
+ $this->addInfoMessage('errorMaxUsersLoggedIn');
+ return false;
+ }
+
+ // Use a new session id (if session has been started by the chat):
+ $this->regenerateSessionID();
+
+ // Log in:
+ $this->setUserID($userData['userID']);
+ $this->setUserName($userData['userName']);
+ $this->setLoginUserName($userData['userName']);
+ $this->setUserRole($userData['userRole']);
+ $this->setLoggedIn(true);
+ $this->setLoginTimeStamp(time());
+
+ // IP Security check variable:
+ $this->setSessionIP($_SERVER['REMOTE_ADDR']);
+
+ // The client authenticates to the socket server using a socketRegistrationID:
+ if($this->getConfig('socketServerEnabled')) {
+ $this->setSocketRegistrationID(
+ md5(uniqid(rand(), true))
+ );
+ }
+
+ // Add userID, userName and userRole to info messages:
+ $this->addInfoMessage($this->getUserID(), 'userID');
+ $this->addInfoMessage($this->getUserName(), 'userName');
+ $this->addInfoMessage($this->getUserRole(), 'userRole');
+
+ // Purge logs:
+ if($this->getConfig('logsPurgeLogs')) {
+ $this->purgeLogs();
+ }
+
+ return true;
+ }
+
+ function chatViewLogin() {
+ $this->setChannel($this->getValidRequestChannelID());
+ $this->addToOnlineList();
+
+ // Add channelID and channelName to info messages:
+ $this->addInfoMessage($this->getChannel(), 'channelID');
+ $this->addInfoMessage($this->getChannelName(), 'channelName');
+
+ // Login message:
+ $text = '/login '.$this->getUserName();
+ $this->insertChatBotMessage(
+ $this->getChannel(),
+ $text,
+ null,
+ 1
+ );
+ }
+
+ function getValidRequestChannelID() {
+ $channelID = $this->getRequestVar('channelID');
+ $channelName = $this->getRequestVar('channelName');
+ // Check the given channelID, or get channelID from channelName:
+ if($channelID === null) {
+ if($channelName !== null) {
+ $channelID = $this->getChannelIDFromChannelName($channelName);
+ // channelName might need encoding conversion:
+ if($channelID === null) {
+ $channelID = $this->getChannelIDFromChannelName(
+ $this->trimChannelName($channelName, $this->getConfig('contentEncoding'))
+ );
+ }
+ }
+ }
+ // Validate the resulting channelID:
+ if(!$this->validateChannel($channelID)) {
+ if($this->getChannel() !== null) {
+ return $this->getChannel();
+ }
+ return $this->getConfig('defaultChannelID');
+ }
+ return $channelID;
+ }
+
+ function initChannel() {
+ $channelID = $this->getRequestVar('channelID');
+ $channelName = $this->getRequestVar('channelName');
+ if($channelID !== null) {
+ $this->switchChannel($this->getChannelNameFromChannelID($channelID));
+ } else if($channelName !== null) {
+ if($this->getChannelIDFromChannelName($channelName) === null) {
+ // channelName might need encoding conversion:
+ $channelName = $this->trimChannelName($channelName, $this->getConfig('contentEncoding'));
+ }
+ $this->switchChannel($channelName);
+ }
+ }
+
+ function logout($type=null) {
+ // Update the socket server authentication for the user:
+ if($this->getConfig('socketServerEnabled')) {
+ $this->updateSocketAuthentication($this->getUserID());
+ }
+ if($this->isUserOnline()) {
+ $this->chatViewLogout($type);
+ }
+ $this->setLoggedIn(false);
+ $this->destroySession();
+
+ // Re-initialize the view:
+ $this->initView();
+ }
+
+ function chatViewLogout($type) {
+ $this->removeFromOnlineList();
+ if($type !== null) {
+ $type = ' '.$type;
+ }
+ // Logout message
+ $text = '/logout '.$this->getUserName().$type;
+ $this->insertChatBotMessage(
+ $this->getChannel(),
+ $text,
+ null,
+ 1
+ );
+ }
+
+ function switchChannel($channelName) {
+ $channelID = $this->getChannelIDFromChannelName($channelName);
+
+ if($channelID !== null && $this->getChannel() == $channelID) {
+ // User is already in the given channel, return:
+ return;
+ }
+
+ // Check if we have a valid channel:
+ if(!$this->validateChannel($channelID)) {
+ // Invalid channel:
+ $text = '/error InvalidChannelName '.$channelName;
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ $text
+ );
+ return;
+ }
+
+ $oldChannel = $this->getChannel();
+
+ $this->setChannel($channelID);
+ $this->updateOnlineList();
+
+ // Channel leave message
+ $text = '/channelLeave '.$this->getUserName();
+ $this->insertChatBotMessage(
+ $oldChannel,
+ $text,
+ null,
+ 1
+ );
+
+ // Channel enter message
+ $text = '/channelEnter '.$this->getUserName();
+ $this->insertChatBotMessage(
+ $this->getChannel(),
+ $text,
+ null,
+ 1
+ );
+
+ $this->addInfoMessage($channelName, 'channelSwitch');
+ $this->addInfoMessage($channelID, 'channelID');
+ $this->_requestVars['lastID'] = 0;
+ }
+
+ function addToOnlineList() {
+ $sql = 'INSERT INTO '.$this->getDataBaseTable('online').'(
+ userID,
+ userName,
+ userRole,
+ channel,
+ dateTime,
+ ip
+ )
+ VALUES (
+ '.$this->db->makeSafe($this->getUserID()).',
+ '.$this->db->makeSafe($this->getUserName()).',
+ '.$this->db->makeSafe($this->getUserRole()).',
+ '.$this->db->makeSafe($this->getChannel()).',
+ NOW(),
+ '.$this->db->makeSafe($this->ipToStorageFormat($_SERVER['REMOTE_ADDR'])).'
+ );';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+
+ $this->resetOnlineUsersData();
+ }
+
+ function removeFromOnlineList() {
+ $sql = 'DELETE FROM
+ '.$this->getDataBaseTable('online').'
+ WHERE
+ userID = '.$this->db->makeSafe($this->getUserID()).';';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+
+ $this->removeUserFromOnlineUsersData();
+ }
+
+ function updateOnlineList() {
+ $sql = 'UPDATE
+ '.$this->getDataBaseTable('online').'
+ SET
+ userName = '.$this->db->makeSafe($this->getUserName()).',
+ channel = '.$this->db->makeSafe($this->getChannel()).',
+ dateTime = NOW(),
+ ip = '.$this->db->makeSafe($this->ipToStorageFormat($_SERVER['REMOTE_ADDR'])).'
+ WHERE
+ userID = '.$this->db->makeSafe($this->getUserID()).';';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+
+ $this->resetOnlineUsersData();
+ }
+
+ function initMessageHandling() {
+ // Don't handle messages if we are not in chat view:
+ if($this->getView() != 'chat') {
+ return;
+ }
+
+ // Check if we have been uninvited from a private or restricted channel:
+ if(!$this->validateChannel($this->getChannel())) {
+ // Switch to the default channel:
+ $this->switchChannel($this->getChannelNameFromChannelID($this->getConfig('defaultChannelID')));
+ return;
+ }
+
+ if($this->getRequestVar('text') !== null) {
+ $this->insertMessage($this->getRequestVar('text'));
+ }
+ }
+
+ function insertParsedMessage($text) {
+
+ // If a queryUserName is set, sent all messages as private messages to this userName:
+ if($this->getQueryUserName() !== null && strpos($text, '/') !== 0) {
+ $text = '/msg '.$this->getQueryUserName().' '.$text;
+ }
+
+ // Parse IRC-style commands:
+ if(strpos($text, '/') === 0) {
+ $textParts = explode(' ', $text);
+
+ switch($textParts[0]) {
+
+ // Channel switch:
+ case '/join':
+ $this->insertParsedMessageJoin($textParts);
+ break;
+
+ // Logout:
+ case '/quit':
+ $this->logout();
+ break;
+
+ // Private message:
+ case '/msg':
+ case '/describe':
+ $this->insertParsedMessagePrivMsg($textParts);
+ break;
+
+ // Invitation:
+ case '/invite':
+ $this->insertParsedMessageInvite($textParts);
+ break;
+
+ // Uninvitation:
+ case '/uninvite':
+ $this->insertParsedMessageUninvite($textParts);
+ break;
+
+ // Private messaging:
+ case '/query':
+ $this->insertParsedMessageQuery($textParts);
+ break;
+
+ // Kicking offending users from the chat:
+ case '/kick':
+ $this->insertParsedMessageKick($textParts);
+ break;
+
+ // Listing banned users:
+ case '/bans':
+ $this->insertParsedMessageBans($textParts);
+ break;
+
+ // Unban user (remove from ban list):
+ case '/unban':
+ $this->insertParsedMessageUnban($textParts);
+ break;
+
+ // Describing actions:
+ case '/me':
+ case '/action':
+ $this->insertParsedMessageAction($textParts);
+ break;
+
+
+ // Listing online Users:
+ case '/who':
+ $this->insertParsedMessageWho($textParts);
+ break;
+
+ // Listing available channels:
+ case '/list':
+ $this->insertParsedMessageList($textParts);
+ break;
+
+ // Retrieving the channel of a User:
+ case '/whereis':
+ $this->insertParsedMessageWhereis($textParts);
+ break;
+
+ // Listing information about a User:
+ case '/whois':
+ $this->insertParsedMessageWhois($textParts);
+ break;
+
+ // Rolling dice:
+ case '/roll':
+ $this->insertParsedMessageRoll($textParts);
+ break;
+
+ // Switching userName:
+ case '/nick':
+ $this->insertParsedMessageNick($textParts);
+ break;
+
+ // Custom or unknown command:
+ default:
+ if(!$this->parseCustomCommands($text, $textParts)) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error UnknownCommand '.$textParts[0]
+ );
+ }
+ }
+
+ } else {
+ // No command found, just insert the plain message:
+ $this->insertCustomMessage(
+ $this->getUserID(),
+ $this->getUserName(),
+ $this->getUserRole(),
+ $this->getChannel(),
+ $text
+ );
+ }
+ }
+
+ function insertParsedMessageJoin($textParts) {
+ if(count($textParts) == 1) {
+ // join with no arguments is the own private channel, if allowed:
+ if($this->isAllowedToCreatePrivateChannel()) {
+ // Private channels are identified by square brackets:
+ $this->switchChannel($this->getChannelNameFromChannelID($this->getPrivateChannelID()));
+ } else {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error MissingChannelName'
+ );
+ }
+ } else {
+ $this->switchChannel($textParts[1]);
+ }
+ }
+
+ function insertParsedMessagePrivMsg($textParts) {
+ if($this->isAllowedToSendPrivateMessage()) {
+ if(count($textParts) < 3) {
+ if(count($textParts) == 2) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error MissingText'
+ );
+ } else {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error MissingUserName'
+ );
+ }
+ } else {
+ // Get UserID from UserName:
+ $toUserID = $this->getIDFromName($textParts[1]);
+ if($toUserID === null) {
+ if($this->getQueryUserName() !== null) {
+ // Close the current query:
+ $this->insertMessage('/query');
+ } else {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error UserNameNotFound '.$textParts[1]
+ );
+ }
+ } else {
+ // Insert /privaction command if /describe is used:
+ $command = ($textParts[0] == '/describe') ? '/privaction' : '/privmsg';
+ // Copy of private message to current User:
+ $this->insertCustomMessage(
+ $this->getUserID(),
+ $this->getUserName(),
+ $this->getUserRole(),
+ $this->getPrivateMessageID(),
+ $command.'to '.$textParts[1].' '.implode(' ', array_slice($textParts, 2))
+ );
+ // Private message to requested User:
+ $this->insertCustomMessage(
+ $this->getUserID(),
+ $this->getUserName(),
+ $this->getUserRole(),
+ $this->getPrivateMessageID($toUserID),
+ $command.' '.implode(' ', array_slice($textParts, 2))
+ );
+ }
+ }
+ } else {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error PrivateMessageNotAllowed'
+ );
+ }
+ }
+
+ function insertParsedMessageInvite($textParts) {
+ if($this->getChannel() == $this->getPrivateChannelID() || in_array($this->getChannel(), $this->getChannels())) {
+ if(count($textParts) == 1) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error MissingUserName'
+ );
+ } else {
+ $toUserID = $this->getIDFromName($textParts[1]);
+ if($toUserID === null) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error UserNameNotFound '.$textParts[1]
+ );
+ } else {
+ // Add the invitation to the database:
+ $this->addInvitation($toUserID);
+ $invitationChannelName = $this->getChannelNameFromChannelID($this->getChannel());
+ // Copy of invitation to current User:
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/inviteto '.$textParts[1].' '.$invitationChannelName
+ );
+ // Invitation to requested User:
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID($toUserID),
+ '/invite '.$this->getUserName().' '.$invitationChannelName
+ );
+ }
+ }
+ } else {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error InviteNotAllowed'
+ );
+ }
+ }
+
+ function insertParsedMessageUninvite($textParts) {
+ if($this->getChannel() == $this->getPrivateChannelID() || in_array($this->getChannel(), $this->getChannels())) {
+ if(count($textParts) == 1) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error MissingUserName'
+ );
+ } else {
+ $toUserID = $this->getIDFromName($textParts[1]);
+ if($toUserID === null) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error UserNameNotFound '.$textParts[1]
+ );
+ } else {
+ // Remove the invitation from the database:
+ $this->removeInvitation($toUserID);
+ $invitationChannelName = $this->getChannelNameFromChannelID($this->getChannel());
+ // Copy of uninvitation to current User:
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/uninviteto '.$textParts[1].' '.$invitationChannelName
+ );
+ // Uninvitation to requested User:
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID($toUserID),
+ '/uninvite '.$this->getUserName().' '.$invitationChannelName
+ );
+ }
+ }
+ } else {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error UninviteNotAllowed'
+ );
+ }
+ }
+
+ function insertParsedMessageQuery($textParts) {
+ if($this->isAllowedToSendPrivateMessage()) {
+ if(count($textParts) == 1) {
+ if($this->getQueryUserName() !== null) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/queryClose '.$this->getQueryUserName()
+ );
+ // Close the current query:
+ $this->setQueryUserName(null);
+ } else {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error NoOpenQuery'
+ );
+ }
+ } else {
+ if($this->getIDFromName($textParts[1]) === null) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error UserNameNotFound '.$textParts[1]
+ );
+ } else {
+ if($this->getQueryUserName() !== null) {
+ // Close the current query:
+ $this->insertMessage('/query');
+ }
+ // Open a query to the requested user:
+ $this->setQueryUserName($textParts[1]);
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/queryOpen '.$textParts[1]
+ );
+ }
+ }
+ } else {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error PrivateMessageNotAllowed'
+ );
+ }
+ }
+
+ function insertParsedMessageKick($textParts) {
+ // Only moderators/admins may kick users:
+ if($this->getUserRole() == AJAX_CHAT_ADMIN || $this->getUserRole() == AJAX_CHAT_MODERATOR) {
+ if(count($textParts) == 1) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error MissingUserName'
+ );
+ } else {
+ // Get UserID from UserName:
+ $kickUserID = $this->getIDFromName($textParts[1]);
+ if($kickUserID === null) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error UserNameNotFound '.$textParts[1]
+ );
+ } else {
+ // Check the role of the user to kick:
+ $kickUserRole = $this->getRoleFromID($kickUserID);
+ if($kickUserRole == AJAX_CHAT_ADMIN || ($kickUserRole == AJAX_CHAT_MODERATOR && $this->getUserRole() != AJAX_CHAT_ADMIN)) {
+ // Admins and moderators may not be kicked:
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error KickNotAllowed '.$textParts[1]
+ );
+ } else {
+ // Kick user and insert message:
+ $channel = $this->getChannelFromID($kickUserID);
+ $banMinutes = (count($textParts) > 2) ? $textParts[2] : null;
+ $this->kickUser($textParts[1], $banMinutes, $kickUserID);
+ // If no channel found, user logged out before he could be kicked
+ if($channel !== null) {
+ $this->insertChatBotMessage(
+ $channel,
+ '/kick '.$textParts[1],
+ null,
+ 1
+ );
+ // Send a copy of the message to the current user, if not in the channel:
+ if($channel != $this->getChannel()) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/kick '.$textParts[1],
+ null,
+ 1
+ );
+ }
+ }
+ }
+ }
+ }
+ } else {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error CommandNotAllowed '.$textParts[0]
+ );
+ }
+ }
+
+ function insertParsedMessageBans($textParts) {
+ // Only moderators/admins may see the list of banned users:
+ if($this->getUserRole() == AJAX_CHAT_ADMIN || $this->getUserRole() == AJAX_CHAT_MODERATOR) {
+ $this->removeExpiredBans();
+ $bannedUsers = $this->getBannedUsers();
+ if(count($bannedUsers) > 0) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/bans '.implode(' ', $bannedUsers)
+ );
+ } else {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/bansEmpty -'
+ );
+ }
+ } else {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error CommandNotAllowed '.$textParts[0]
+ );
+ }
+ }
+
+ function insertParsedMessageUnban($textParts) {
+ // Only moderators/admins may unban users:
+ if($this->getUserRole() == AJAX_CHAT_ADMIN || $this->getUserRole() == AJAX_CHAT_MODERATOR) {
+ $this->removeExpiredBans();
+ if(count($textParts) == 1) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error MissingUserName'
+ );
+ } else {
+ if(!in_array($textParts[1], $this->getBannedUsers())) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error UserNameNotFound '.$textParts[1]
+ );
+ } else {
+ // Unban user and insert message:
+ $this->unbanUser($textParts[1]);
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/unban '.$textParts[1]
+ );
+ }
+ }
+ } else {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error CommandNotAllowed '.$textParts[0]
+ );
+ }
+ }
+
+ function insertParsedMessageAction($textParts) {
+ if(count($textParts) == 1) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error MissingText'
+ );
+ } else {
+ if($this->getQueryUserName() !== null) {
+ // If we are in query mode, sent the action to the query user:
+ $this->insertMessage('/describe '.$this->getQueryUserName().' '.implode(' ', array_slice($textParts, 1)));
+ } else {
+ $this->insertCustomMessage(
+ $this->getUserID(),
+ $this->getUserName(),
+ $this->getUserRole(),
+ $this->getChannel(),
+ implode(' ', $textParts)
+ );
+ }
+ }
+ }
+
+ function insertParsedMessageWho($textParts) {
+ if(count($textParts) == 1) {
+ if($this->isAllowedToListHiddenUsers()) {
+ // List online users from any channel:
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/who '.implode(' ', $this->getOnlineUsers())
+ );
+ } else {
+ // Get online users for all accessible channels:
+ $channels = $this->getChannels();
+ // Add the own private channel if allowed:
+ if($this->isAllowedToCreatePrivateChannel()) {
+ array_push($channels, $this->getPrivateChannelID());
+ }
+ // Add the invitation channels:
+ foreach($this->getInvitations() as $channelID) {
+ if(!in_array($channelID, $channels)) {
+ array_push($channels, $channelID);
+ }
+ }
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/who '.implode(' ', $this->getOnlineUsers($channels))
+ );
+ }
+ } else {
+ $channelName = $textParts[1];
+ $channelID = $this->getChannelIDFromChannelName($channelName);
+ if(!$this->validateChannel($channelID)) {
+ // Invalid channel:
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error InvalidChannelName '.$channelName
+ );
+ } else {
+ // Get online users for the given channel:
+ $onlineUsers = $this->getOnlineUsers(array($channelID));
+ if(count($onlineUsers) > 0) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/whoChannel '.$channelName.' '.implode(' ', $onlineUsers)
+ );
+ } else {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/whoEmpty -'
+ );
+ }
+ }
+ }
+ }
+
+ function insertParsedMessageList($textParts) {
+ // Get the names of all accessible channels:
+ $channelNames = $this->getChannelNames();
+ // Add the own private channel, if allowed:
+ if($this->isAllowedToCreatePrivateChannel()) {
+ array_push($channelNames, $this->getPrivateChannelName());
+ }
+ // Add the invitation channels:
+ foreach($this->getInvitations() as $channelID) {
+ $channelName = $this->getChannelNameFromChannelID($channelID);
+ if($channelName !== null && !in_array($channelName, $channelNames)) {
+ array_push($channelNames, $channelName);
+ }
+ }
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/list '.implode(' ', $channelNames)
+ );
+ }
+
+ function insertParsedMessageWhereis($textParts) {
+ if(count($textParts) == 1) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error MissingUserName'
+ );
+ } else {
+ // Get UserID from UserName:
+ $whereisUserID = $this->getIDFromName($textParts[1]);
+ if($whereisUserID === null) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error UserNameNotFound '.$textParts[1]
+ );
+ } else {
+ $channelID = $this->getChannelFromID($whereisUserID);
+ if($this->validateChannel($channelID)) {
+ $channelName = $this->getChannelNameFromChannelID($channelID);
+ } else {
+ $channelName = null;
+ }
+ if($channelName === null) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error UserNameNotFound '.$textParts[1]
+ );
+ } else {
+ // List user information:
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/whereis '.$textParts[1].' '.$channelName
+ );
+ }
+ }
+ }
+ }
+
+ function insertParsedMessageWhois($textParts) {
+ // Only moderators/admins:
+ if($this->getUserRole() == AJAX_CHAT_ADMIN || $this->getUserRole() == AJAX_CHAT_MODERATOR) {
+ if(count($textParts) == 1) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error MissingUserName'
+ );
+ } else {
+ // Get UserID from UserName:
+ $whoisUserID = $this->getIDFromName($textParts[1]);
+ if($whoisUserID === null) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error UserNameNotFound '.$textParts[1]
+ );
+ } else {
+ // List user information:
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/whois '.$textParts[1].' '.$this->getIPFromID($whoisUserID)
+ );
+ }
+ }
+ } else {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error CommandNotAllowed '.$textParts[0]
+ );
+ }
+ }
+
+ function insertParsedMessageRoll($textParts) {
+ if(count($textParts) == 1) {
+ // default is one d6:
+ $text = '/roll '.$this->getUserName().' 1d6 '.$this->rollDice(6);
+ } else {
+ $diceParts = explode('d', $textParts[1]);
+ if(count($diceParts) == 2) {
+ $number = (int)$diceParts[0];
+ $sides = (int)$diceParts[1];
+
+ // Dice number must be an integer between 1 and 100, else roll only one:
+ $number = ($number > 0 && $number <= 100) ? $number : 1;
+
+ // Sides must be an integer between 1 and 100, else take 6:
+ $sides = ($sides > 0 && $sides <= 100) ? $sides : 6;
+
+ $text = '/roll '.$this->getUserName().' '.$number.'d'.$sides.' ';
+ for($i=0; $i<$number; $i++) {
+ if($i != 0)
+ $text .= ',';
+ $text .= $this->rollDice($sides);
+ }
+ } else {
+ // if dice syntax is invalid, roll one d6:
+ $text = '/roll '.$this->getUserName().' 1d6 '.$this->rollDice(6);
+ }
+ }
+ $this->insertChatBotMessage(
+ $this->getChannel(),
+ $text
+ );
+ }
+
+ function insertParsedMessageNick($textParts) {
+ if(!$this->getConfig('allowNickChange') ||
+ (!$this->getConfig('allowGuestUserName') && $this->getUserRole() == AJAX_CHAT_GUEST)) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error CommandNotAllowed '.$textParts[0]
+ );
+ } else if(count($textParts) == 1) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error MissingUserName'
+ );
+ } else {
+ $newUserName = implode(' ', array_slice($textParts, 1));
+ if($newUserName == $this->getLoginUserName()) {
+ // Allow the user to regain the original login userName:
+ $prefix = '';
+ $suffix = '';
+ } else if($this->getUserRole() == AJAX_CHAT_GUEST) {
+ $prefix = $this->getConfig('guestUserPrefix');
+ $suffix = $this->getConfig('guestUserSuffix');
+ } else {
+ $prefix = $this->getConfig('changedNickPrefix');
+ $suffix = $this->getConfig('changedNickSuffix');
+ }
+ $maxLength = $this->getConfig('userNameMaxLength')
+ - $this->stringLength($prefix)
+ - $this->stringLength($suffix);
+ $newUserName = $this->trimString($newUserName, 'UTF-8', $maxLength, true);
+ if(!$newUserName) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error InvalidUserName'
+ );
+ } else {
+ $newUserName = $prefix.$newUserName.$suffix;
+ if($this->isUserNameInUse($newUserName)) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error UserNameInUse'
+ );
+ } else {
+ $oldUserName = $this->getUserName();
+ $this->setUserName($newUserName);
+ $this->updateOnlineList();
+ // Add info message to update the client-side stored userName:
+ $this->addInfoMessage($this->getUserName(), 'userName');
+ $this->insertChatBotMessage(
+ $this->getChannel(),
+ '/nick '.$oldUserName.' '.$newUserName,
+ null,
+ 2
+ );
+ }
+ }
+ }
+ }
+
+ function insertMessage($text) {
+ if(!$this->isAllowedToWriteMessage())
+ return;
+
+ if(!$this->floodControl())
+ return;
+
+ $text = $this->trimMessageText($text);
+ if($text == '')
+ return;
+
+ if(!$this->onNewMessage($text))
+ return;
+
+ $text = $this->replaceCustomText($text);
+
+ $this->insertParsedMessage($text);
+ }
+
+ function deleteMessage($messageID) {
+ // Retrieve the channel of the given message:
+ $sql = 'SELECT
+ channel
+ FROM
+ '.$this->getDataBaseTable('messages').'
+ WHERE
+ id='.$this->db->makeSafe($messageID).';';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+
+ $row = $result->fetch();
+
+ if($row['channel'] !== null) {
+ $channel = $row['channel'];
+
+ if($this->getUserRole() == AJAX_CHAT_ADMIN) {
+ $condition = '';
+ } else if($this->getUserRole() == AJAX_CHAT_MODERATOR) {
+ $condition = ' AND
+ NOT (userRole='.$this->db->makeSafe(AJAX_CHAT_ADMIN).')
+ AND
+ NOT (userRole='.$this->db->makeSafe(AJAX_CHAT_CHATBOT).')';
+ } else if($this->getUserRole() == AJAX_CHAT_USER && $this->getConfig('allowUserMessageDelete')) {
+ $condition = 'AND
+ (
+ userID='.$this->db->makeSafe($this->getUserID()).'
+ OR
+ (
+ channel = '.$this->db->makeSafe($this->getPrivateMessageID()).'
+ OR
+ channel = '.$this->db->makeSafe($this->getPrivateChannelID()).'
+ )
+ AND
+ NOT (userRole='.$this->db->makeSafe(AJAX_CHAT_ADMIN).')
+ AND
+ NOT (userRole='.$this->db->makeSafe(AJAX_CHAT_CHATBOT).')
+ )';
+ } else {
+ return false;
+ }
+
+ // Remove given message from the database:
+ $sql = 'DELETE FROM
+ '.$this->getDataBaseTable('messages').'
+ WHERE
+ id='.$this->db->makeSafe($messageID).'
+ '.$condition.';';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+
+ if($result->affectedRows() == 1) {
+ // Insert a deletion command to remove the message from the clients chatlists:
+ $this->insertChatBotMessage($channel, '/delete '.$messageID);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ function floodControl() {
+ // Moderators and Admins need no flood control:
+ if($this->getUserRole() == AJAX_CHAT_MODERATOR || $this->getUserRole() == AJAX_CHAT_ADMIN) {
+ return true;
+ }
+ $time = time();
+ // Check the time of the last inserted message:
+ if($this->getInsertedMessagesRateTimeStamp()+60 < $time) {
+ $this->setInsertedMessagesRateTimeStamp($time);
+ $this->setInsertedMessagesRate(1);
+ } else {
+ // Increase the inserted messages rate:
+ $rate = $this->getInsertedMessagesRate()+1;
+ $this->setInsertedMessagesRate($rate);
+ // Check if message rate is too high:
+ if($rate > $this->getConfig('maxMessageRate')) {
+ $this->insertChatBotMessage(
+ $this->getPrivateMessageID(),
+ '/error MaxMessageRate'
+ );
+ // Return false so the message is not inserted:
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function isAllowedToWriteMessage() {
+ if($this->getUserRole() != AJAX_CHAT_GUEST)
+ return true;
+ if($this->getConfig('allowGuestWrite'))
+ return true;
+ return false;
+ }
+
+ function insertChatBotMessage($channelID, $messageText, $ip=null, $mode=0) {
+ $this->insertCustomMessage(
+ $this->getConfig('chatBotID'),
+ $this->getConfig('chatBotName'),
+ AJAX_CHAT_CHATBOT,
+ $channelID,
+ $messageText,
+ $ip,
+ $mode
+ );
+ }
+
+ function insertCustomMessage($userID, $userName, $userRole, $channelID, $text, $ip=null, $mode=0) {
+ // The $mode parameter is used for socket updates:
+ // 0 = normal messages
+ // 1 = channel messages (e.g. login/logout, channel enter/leave, kick)
+ // 2 = messages with online user updates (nick)
+
+ $ip = $ip ? $ip : $_SERVER['REMOTE_ADDR'];
+
+ $sql = 'INSERT INTO '.$this->getDataBaseTable('messages').'(
+ userID,
+ userName,
+ userRole,
+ channel,
+ dateTime,
+ ip,
+ text
+ )
+ VALUES (
+ '.$this->db->makeSafe($userID).',
+ '.$this->db->makeSafe($userName).',
+ '.$this->db->makeSafe($userRole).',
+ '.$this->db->makeSafe($channelID).',
+ NOW(),
+ '.$this->db->makeSafe($this->ipToStorageFormat($ip)).',
+ '.$this->db->makeSafe($text).'
+ );';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+
+ if($this->getConfig('socketServerEnabled')) {
+ $this->sendSocketMessage(
+ $this->getSocketBroadcastMessage(
+ $this->db->getLastInsertedID(),
+ time(),
+ $userID,
+ $userName,
+ $userRole,
+ $channelID,
+ $text,
+ $mode
+ )
+ );
+ }
+ }
+
+ function getSocketBroadcastMessage(
+ $messageID,
+ $timeStamp,
+ $userID,
+ $userName,
+ $userRole,
+ $channelID,
+ $text,
+ $mode
+ ) {
+ // The $mode parameter:
+ // 0 = normal messages
+ // 1 = channel messages (e.g. login/logout, channel enter/leave, kick)
+ // 2 = messages with online user updates (nick)
+
+ // Get the message XML content:
+ $xml = '<root chatID="'.$this->getConfig('socketServerChatID').'" channelID="'.$channelID.'" mode="'.$mode.'">';
+ if($mode) {
+ // Add the list of online users if the user list has been updated ($mode > 0):
+ $xml .= $this->getChatViewOnlineUsersXML(array($channelID));
+ }
+ if($mode != 1 || $this->getConfig('showChannelMessages')) {
+ $xml .= '<messages>';
+ $xml .= $this->getChatViewMessageXML(
+ $messageID,
+ $timeStamp,
+ $userID,
+ $userName,
+ $userRole,
+ $channelID,
+ $text
+ );
+ $xml .= '</messages>';
+ }
+ $xml .= '</root>';
+ return $xml;
+ }
+
+ function sendSocketMessage($message) {
+ // Open a TCP socket connection to the socket server:
+ if($socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) {
+ if(@socket_connect($socket, $this->getConfig('socketServerIP'), $this->getConfig('socketServerPort'))) {
+ // Append a null-byte to the string as EOL (End Of Line) character
+ // which is required by Flash XML socket communication:
+ $message .= "\0";
+ @socket_write(
+ $socket,
+ $message,
+ strlen($message) // Using strlen to count the bytes instead of the number of UTF-8 characters
+ );
+ }
+ @socket_close($socket);
+ }
+ }
+
+ function updateSocketAuthentication($userID, $socketRegistrationID=null, $channels=null) {
+ // If no $socketRegistrationID or no $channels are given the authentication is removed for the given user:
+ $authentication = '<authenticate chatID="'.$this->getConfig('socketServerChatID').'" userID="'.$userID.'" regID="'.$socketRegistrationID.'">';
+ if($channels) {
+ foreach($channels as $channelID) {
+ $authentication .= '<channel id="'.$channelID.'"/>';
+ }
+ }
+ $authentication .= '</authenticate>';
+ $this->sendSocketMessage($authentication);
+ }
+
+ function setSocketRegistrationID($value) {
+ $this->setSessionVar('SocketRegistrationID', $value);
+ }
+
+ function getSocketRegistrationID() {
+ return $this->getSessionVar('SocketRegistrationID');
+ }
+
+ function rollDice($sides) {
+ // seed with microseconds since last "whole" second:
+ mt_srand((double)microtime()*1000000);
+
+ return mt_rand(1, $sides);
+ }
+
+ function kickUser($userName, $banMinutes=null, $userID=null) {
+ if($userID === null) {
+ $userID = $this->getIDFromName($userName);
+ }
+ if($userID === null) {
+ return;
+ }
+
+ $banMinutes = $banMinutes ? $banMinutes : $this->getConfig('defaultBanTime');
+
+ if($banMinutes) {
+ // Ban User for the given time in minutes:
+ $this->banUser($userName, $banMinutes, $userID);
+ }
+
+ // Remove given User from online list:
+ $sql = 'DELETE FROM
+ '.$this->getDataBaseTable('online').'
+ WHERE
+ userID = '.$this->db->makeSafe($userID).';';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+
+ // Update the socket server authentication for the kicked user:
+ if($this->getConfig('socketServerEnabled')) {
+ $this->updateSocketAuthentication($userID);
+ }
+
+ $this->removeUserFromOnlineUsersData($userID);
+ }
+
+ function getBannedUsersData($key=null, $value=null) {
+ if($this->_bannedUsersData === null) {
+ $this->_bannedUsersData = array();
+
+ $sql = 'SELECT
+ userID,
+ userName,
+ ip
+ FROM
+ '.$this->getDataBaseTable('bans').'
+ WHERE
+ NOW() < dateTime;';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+
+ while($row = $result->fetch()) {
+ $row['ip'] = $this->ipFromStorageFormat($row['ip']);
+ array_push($this->_bannedUsersData, $row);
+ }
+
+ $result->free();
+ }
+
+ if($key) {
+ $bannedUsersData = array();
+ foreach($this->_bannedUsersData as $bannedUserData) {
+ if(!isset($bannedUserData[$key])) {
+ return $bannedUsersData;
+ }
+ if($value) {
+ if($bannedUserData[$key] == $value) {
+ array_push($bannedUsersData, $bannedUserData);
+ } else {
+ continue;
+ }
+ } else {
+ array_push($bannedUsersData, $bannedUserData[$key]);
+ }
+ }
+ return $bannedUsersData;
+ }
+
+ return $this->_bannedUsersData;
+ }
+
+ function getBannedUsers() {
+ return $this->getBannedUsersData('userName');
+ }
+
+ function banUser($userName, $banMinutes=null, $userID=null) {
+ if($userID === null) {
+ $userID = $this->getIDFromName($userName);
+ }
+ $ip = $this->getIPFromID($userID);
+ if(!$ip || $userID === null) {
+ return;
+ }
+
+ // Remove expired bans:
+ $this->removeExpiredBans();
+
+ $banMinutes = (int)$banMinutes;
+ if(!$banMinutes) {
+ // If banMinutes is not a valid integer, use the defaultBanTime:
+ $banMinutes = $this->getConfig('defaultBanTime');
+ }
+
+ $sql = 'INSERT INTO '.$this->getDataBaseTable('bans').'(
+ userID,
+ userName,
+ dateTime,
+ ip
+ )
+ VALUES (
+ '.$this->db->makeSafe($userID).',
+ '.$this->db->makeSafe($userName).',
+ DATE_ADD(NOW(), interval '.$this->db->makeSafe($banMinutes).' MINUTE),
+ '.$this->db->makeSafe($this->ipToStorageFormat($ip)).'
+ );';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+ }
+
+ function unbanUser($userName) {
+ $sql = 'DELETE FROM
+ '.$this->getDataBaseTable('bans').'
+ WHERE
+ userName = '.$this->db->makeSafe($userName).';';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+ }
+
+ function removeExpiredBans() {
+ $sql = 'DELETE FROM
+ '.$this->getDataBaseTable('bans').'
+ WHERE
+ dateTime < NOW();';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+ }
+
+ function setInactive($userID, $userName=null) {
+ $condition = 'userID='.$this->db->makeSafe($userID);
+ if($userName !== null) {
+ $condition .= ' OR userName='.$this->db->makeSafe($userName);
+ }
+ $sql = 'UPDATE
+ '.$this->getDataBaseTable('online').'
+ SET
+ dateTime = DATE_SUB(NOW(), interval '.(intval($this->getConfig('inactiveTimeout'))+1).' MINUTE)
+ WHERE
+ '.$condition.';';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+
+ $this->resetOnlineUsersData();
+ }
+
+ function removeInactive() {
+ $sql = 'SELECT
+ userID,
+ userName,
+ channel
+ FROM
+ '.$this->getDataBaseTable('online').'
+ WHERE
+ NOW() > DATE_ADD(dateTime, interval '.$this->getConfig('inactiveTimeout').' MINUTE);';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+
+ if($result->numRows() > 0) {
+ $condition = '';
+ while($row = $result->fetch()) {
+ if(!empty($condition))
+ $condition .= ' OR ';
+ // Add userID to condition for removal:
+ $condition .= 'userID='.$this->db->makeSafe($row['userID']);
+
+ // Update the socket server authentication for the kicked user:
+ if($this->getConfig('socketServerEnabled')) {
+ $this->updateSocketAuthentication($row['userID']);
+ }
+
+ $this->removeUserFromOnlineUsersData($row['userID']);
+
+ // Insert logout timeout message:
+ $text = '/logout '.$row['userName'].' Timeout';
+ $this->insertChatBotMessage(
+ $row['channel'],
+ $text,
+ null,
+ 1
+ );
+ }
+
+ $result->free();
+
+ $sql = 'DELETE FROM
+ '.$this->getDataBaseTable('online').'
+ WHERE
+ '.$condition.';';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+ }
+ }
+
+ function updateOnlineStatus() {
+ // Update online status every 50 seconds (this allows update requests to be in time):
+ if(!$this->getStatusUpdateTimeStamp() || ((time() - $this->getStatusUpdateTimeStamp()) > 50)) {
+ $this->updateOnlineList();
+ $this->setStatusUpdateTimeStamp(time());
+ }
+ }
+
+ function checkAndRemoveInactive() {
+ // Remove inactive users every inactiveCheckInterval:
+ if(!$this->getInactiveCheckTimeStamp() || ((time() - $this->getInactiveCheckTimeStamp()) > $this->getConfig('inactiveCheckInterval')*60)) {
+ $this->removeInactive();
+ $this->setInactiveCheckTimeStamp(time());
+ }
+ }
+
+ function sendXMLMessages() {
+ $httpHeader = new AJAXChatHTTPHeader('UTF-8', 'text/xml');
+
+ // Send HTTP header:
+ $httpHeader->send();
+
+ // Output XML messages:
+ echo $this->getXMLMessages();
+ }
+
+ function getXMLMessages() {
+ switch($this->getView()) {
+ case 'chat':
+ return $this->getChatViewXMLMessages();
+ case 'teaser':
+ return $this->getTeaserViewXMLMessages();
+ case 'logs':
+ return $this->getLogsViewXMLMessages();
+ default:
+ return $this->getLogoutXMLMessage();
+ }
+ }
+
+ function getMessageCondition() {
+ $condition = 'id > '.$this->db->makeSafe($this->getRequestVar('lastID')).'
+ AND (
+ channel = '.$this->db->makeSafe($this->getChannel()).'
+ OR
+ channel = '.$this->db->makeSafe($this->getPrivateMessageID()).'
+ )
+ AND
+ ';
+ if($this->getConfig('requestMessagesPriorChannelEnter') ||
+ ($this->getConfig('requestMessagesPriorChannelEnterList') && in_array($this->getChannel(), $this->getConfig('requestMessagesPriorChannelEnterList')))) {
+ $condition .= 'NOW() < DATE_ADD(dateTime, interval '.$this->getConfig('requestMessagesTimeDiff').' HOUR)';
+ } else {
+ $condition .= 'dateTime >= FROM_UNIXTIME(' . $this->getChannelEnterTimeStamp() . ')';
+ }
+ return $condition;
+ }
+
+ function getMessageFilter() {
+ $filterChannelMessages = '';
+ if(!$this->getConfig('showChannelMessages') || $this->getRequestVar('shoutbox')) {
+ $filterChannelMessages = ' AND NOT (
+ text LIKE (\'/login%\')
+ OR
+ text LIKE (\'/logout%\')
+ OR
+ text LIKE (\'/channelEnter%\')
+ OR
+ text LIKE (\'/channelLeave%\')
+ OR
+ text LIKE (\'/kick%\')
+ )';
+ }
+ return $filterChannelMessages;
+ }
+
+ function getInfoMessagesXML() {
+ $xml = '<infos>';
+ // Go through the info messages:
+ foreach($this->getInfoMessages() as $type=>$infoArray) {
+ foreach($infoArray as $info) {
+ $xml .= '<info type="'.$type.'">';
+ $xml .= '<![CDATA['.$this->encodeSpecialChars($info).']]>';
+ $xml .= '</info>';
+ }
+ }
+ $xml .= '</infos>';
+ return $xml;
+ }
+
+ function getChatViewOnlineUsersXML($channelIDs) {
+ // Get the online users for the given channels:
+ $onlineUsersData = $this->getOnlineUsersData($channelIDs);
+ $xml = '<users>';
+ foreach($onlineUsersData as $onlineUserData) {
+ $xml .= '<user';
+ $xml .= ' userID="'.$onlineUserData['userID'].'"';
+ $xml .= ' userRole="'.$onlineUserData['userRole'].'"';
+ $xml .= ' channelID="'.$onlineUserData['channel'].'"';
+ $xml .= '>';
+ $xml .= '<![CDATA['.$this->encodeSpecialChars($onlineUserData['userName']).']]>';
+ $xml .= '</user>';
+ }
+ $xml .= '</users>';
+ return $xml;
+ }
+
+ function getLogoutXMLMessage() {
+ $xml = '<?xml version="1.0" encoding="UTF-8"?>';
+ $xml .= '<root>';
+ $xml .= '<infos>';
+ $xml .= '<info type="logout">';
+ $xml .= '<![CDATA['.$this->encodeSpecialChars($this->getConfig('logoutData')).']]>';
+ $xml .= '</info>';
+ $xml .= '</infos>';
+ $xml .= '</root>';
+ return $xml;
+ }
+
+ function getChatViewMessageXML(
+ $messageID,
+ $timeStamp,
+ $userID,
+ $userName,
+ $userRole,
+ $channelID,
+ $text
+ ) {
+ $message = '<message';
+ $message .= ' id="'.$messageID.'"';
+ $message .= ' dateTime="'.date('r', $timeStamp).'"';
+ $message .= ' userID="'.$userID.'"';
+ $message .= ' userRole="'.$userRole.'"';
+ $message .= ' channelID="'.$channelID.'"';
+ $message .= '>';
+ $message .= '<username><![CDATA['.$this->encodeSpecialChars($userName).']]></username>';
+ $message .= '<text><![CDATA['.$this->encodeSpecialChars($text).']]></text>';
+ $message .= '</message>';
+ return $message;
+ }
+
+ function getChatViewMessagesXML() {
+ // Get the last messages in descending order (this optimises the LIMIT usage):
+ $sql = 'SELECT
+ id,
+ userID,
+ userName,
+ userRole,
+ channel AS channelID,
+ UNIX_TIMESTAMP(dateTime) AS timeStamp,
+ text
+ FROM
+ '.$this->getDataBaseTable('messages').'
+ WHERE
+ '.$this->getMessageCondition().'
+ '.$this->getMessageFilter().'
+ ORDER BY
+ id
+ DESC
+ LIMIT '.$this->getConfig('requestMessagesLimit').';';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+
+ $messages = '';
+
+ // Add the messages in reverse order so it is ascending again:
+ while($row = $result->fetch()) {
+ $message = $this->getChatViewMessageXML(
+ $row['id'],
+ $row['timeStamp'],
+ $row['userID'],
+ $row['userName'],
+ $row['userRole'],
+ $row['channelID'],
+ $row['text']
+ );
+ $messages = $message.$messages;
+ }
+ $result->free();
+
+ $messages = '<messages>'.$messages.'</messages>';
+ return $messages;
+ }
+
+ function getChatViewXMLMessages() {
+ $xml = '<?xml version="1.0" encoding="UTF-8"?>';
+ $xml .= '<root>';
+ $xml .= $this->getInfoMessagesXML();
+ $xml .= $this->getChatViewOnlineUsersXML(array($this->getChannel()));
+ $xml .= $this->getChatViewMessagesXML();
+ $xml .= '</root>';
+ return $xml;
+ }
+
+ function getTeaserMessageCondition() {
+ $channelID = $this->getValidRequestChannelID();
+ $condition = 'channel = '.$this->db->makeSafe($channelID).'
+ AND
+ ';
+ if($this->getConfig('requestMessagesPriorChannelEnter') ||
+ ($this->getConfig('requestMessagesPriorChannelEnterList') && in_array($channelID, $this->getConfig('requestMessagesPriorChannelEnterList')))) {
+ $condition .= 'NOW() < DATE_ADD(dateTime, interval '.$this->getConfig('requestMessagesTimeDiff').' HOUR)';
+ } else {
+ // Teaser content may not be shown for this channel:
+ $condition .= '0 = 1';
+ }
+ return $condition;
+ }
+
+ function getTeaserViewMessagesXML() {
+ // Get the last messages in descending order (this optimises the LIMIT usage):
+ $sql = 'SELECT
+ id,
+ userID,
+ userName,
+ userRole,
+ channel AS channelID,
+ UNIX_TIMESTAMP(dateTime) AS timeStamp,
+ text
+ FROM
+ '.$this->getDataBaseTable('messages').'
+ WHERE
+ '.$this->getTeaserMessageCondition().'
+ '.$this->getMessageFilter().'
+ ORDER BY
+ id
+ DESC
+ LIMIT '.$this->getConfig('requestMessagesLimit').';';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+
+ $messages = '';
+
+ // Add the messages in reverse order so it is ascending again:
+ while($row = $result->fetch()) {
+ $message = '';
+ $message .= '<message';
+ $message .= ' id="'.$row['id'].'"';
+ $message .= ' dateTime="'.date('r', $row['timeStamp']).'"';
+ $message .= ' userID="'.$row['userID'].'"';
+ $message .= ' userRole="'.$row['userRole'].'"';
+ $message .= ' channelID="'.$row['channelID'].'"';
+ $message .= '>';
+ $message .= '<username><![CDATA['.$this->encodeSpecialChars($row['userName']).']]></username>';
+ $message .= '<text><![CDATA['.$this->encodeSpecialChars($row['text']).']]></text>';
+ $message .= '</message>';
+ $messages = $message.$messages;
+ }
+ $result->free();
+
+ $messages = '<messages>'.$messages.'</messages>';
+ return $messages;
+ }
+
+ function getTeaserViewXMLMessages() {
+ $xml = '<?xml version="1.0" encoding="UTF-8"?>';
+ $xml .= '<root>';
+ $xml .= $this->getInfoMessagesXML();
+ $xml .= $this->getTeaserViewMessagesXML();
+ $xml .= '</root>';
+ return $xml;
+ }
+
+ function getLogsViewCondition() {
+ $condition = 'id > '.$this->db->makeSafe($this->getRequestVar('lastID'));
+
+ // Check the channel condition:
+ switch($this->getRequestVar('channelID')) {
+ case '-3':
+ // Just display messages from all accessible channels
+ if($this->getUserRole() != AJAX_CHAT_ADMIN) {
+ $condition .= ' AND (channel = '.$this->db->makeSafe($this->getPrivateMessageID());
+ $condition .= ' OR channel = '.$this->db->makeSafe($this->getPrivateChannelID());
+ foreach($this->getChannels() as $channel) {
+ if($this->getConfig('logsUserAccessChannelList') && !in_array($channel, $this->getConfig('logsUserAccessChannelList'))) {
+ continue;
+ }
+ $condition .= ' OR channel = '.$this->db->makeSafe($channel);
+ }
+ $condition .= ')';
+ }
+ break;
+ case '-2':
+ if($this->getUserRole() != AJAX_CHAT_ADMIN) {
+ $condition .= ' AND channel = '.($this->getPrivateMessageID());
+ } else {
+ $condition .= ' AND channel > '.($this->getConfig('privateMessageDiff')-1);
+ }
+ break;
+ case '-1':
+ if($this->getUserRole() != AJAX_CHAT_ADMIN) {
+ $condition .= ' AND channel = '.($this->getPrivateChannelID());
+ } else {
+ $condition .= ' AND (channel > '.($this->getConfig('privateChannelDiff')-1).' AND channel < '.($this->getConfig('privateMessageDiff')).')';
+ }
+ break;
+ default:
+ if(($this->getUserRole() == AJAX_CHAT_ADMIN || !$this->getConfig('logsUserAccessChannelList') || in_array($this->getRequestVar('channelID'), $this->getConfig('logsUserAccessChannelList')))
+ && $this->validateChannel($this->getRequestVar('channelID'))) {
+ $condition .= ' AND channel = '.$this->db->makeSafe($this->getRequestVar('channelID'));
+ } else {
+ // No valid channel:
+ $condition .= ' AND 0 = 1';
+ }
+ }
+
+ // Check the period condition:
+ $hour = ($this->getRequestVar('hour') === null || $this->getRequestVar('hour') > 23 || $this->getRequestVar('hour') < 0) ? null : $this->getRequestVar('hour');
+ $day = ($this->getRequestVar('day') === null || $this->getRequestVar('day') > 31 || $this->getRequestVar('day') < 1) ? null : $this->getRequestVar('day');
+ $month = ($this->getRequestVar('month') === null || $this->getRequestVar('month') > 12 || $this->getRequestVar('month') < 1) ? null : $this->getRequestVar('month');
+ $year = ($this->getRequestVar('year') === null || $this->getRequestVar('year') > date('Y') || $this->getRequestVar('year') < $this->getConfig('logsFirstYear')) ? null : $this->getRequestVar('year');
+
+ // If a time (hour) is given but no date (year, month, day), use the current date:
+ if($hour !== null) {
+ if($day === null)
+ $day = date('j');
+ if($month === null)
+ $month = date('n');
+ if($year === null)
+ $year = date('Y');
+ }
+
+ if($year === null) {
+ // No year given, so no period condition
+ } else if($month === null) {
+ // Define the given year as period:
+ $periodStart = mktime(0, 0, 0, 1, 1, $year);
+ // The last day in a month can be expressed by using 0 for the day of the next month:
+ $periodEnd = mktime(23, 59, 59, 13, 0, $year);
+ } else if($day === null) {
+ // Define the given month as period:
+ $periodStart = mktime(0, 0, 0, $month, 1, $year);
+ // The last day in a month can be expressed by using 0 for the day of the next month:
+ $periodEnd = mktime(23, 59, 59, $month+1, 0, $year);
+ } else if($hour === null){
+ // Define the given day as period:
+ $periodStart = mktime(0, 0, 0, $month, $day, $year);
+ $periodEnd = mktime(23, 59, 59, $month, $day, $year);
+ } else {
+ // Define the given hour as period:
+ $periodStart = mktime($hour, 0, 0, $month, $day, $year);
+ $periodEnd = mktime($hour, 59, 59, $month, $day, $year);
+ }
+
+ if(isset($periodStart))
+ $condition .= ' AND dateTime > \''.date('Y-m-d H:i:s', $periodStart).'\' AND dateTime <= \''.date('Y-m-d H:i:s', $periodEnd).'\'';
+
+ // Check the search condition:
+ if($this->getRequestVar('search')) {
+ if(($this->getUserRole() == AJAX_CHAT_ADMIN || $this->getUserRole() == AJAX_CHAT_MODERATOR) && strpos($this->getRequestVar('search'), 'ip=') === 0) {
+ // Search for messages with the given IP:
+ $ip = substr($this->getRequestVar('search'), 3);
+ $condition .= ' AND (ip = '.$this->db->makeSafe($this->ipToStorageFormat($ip)).')';
+ } else if(strpos($this->getRequestVar('search'), 'userID=') === 0) {
+ // Search for messages with the given userID:
+ $userID = substr($this->getRequestVar('search'), 7);
+ $condition .= ' AND (userID = '.$this->db->makeSafe($userID).')';
+ } else {
+ // Use the search value as regular expression on message text and username:
+ $condition .= ' AND (userName REGEXP '.$this->db->makeSafe($this->getRequestVar('search')).' OR text REGEXP '.$this->db->makeSafe($this->getRequestVar('search')).')';
+ }
+ }
+
+ // If no period or search condition is given, just monitor the last messages on the given channel:
+ if(!isset($periodStart) && !$this->getRequestVar('search')) {
+ $condition .= ' AND NOW() < DATE_ADD(dateTime, interval '.$this->getConfig('logsRequestMessagesTimeDiff').' HOUR)';
+ }
+
+ return $condition;
+ }
+
+ function getLogsViewMessagesXML() {
+ $sql = 'SELECT
+ id,
+ userID,
+ userName,
+ userRole,
+ channel AS channelID,
+ UNIX_TIMESTAMP(dateTime) AS timeStamp,
+ ip,
+ text
+ FROM
+ '.$this->getDataBaseTable('messages').'
+ WHERE
+ '.$this->getLogsViewCondition().'
+ ORDER BY
+ id
+ LIMIT '.$this->getConfig('logsRequestMessagesLimit').';';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+
+ $xml = '<messages>';
+ while($row = $result->fetch()) {
+ $xml .= '<message';
+ $xml .= ' id="'.$row['id'].'"';
+ $xml .= ' dateTime="'.date('r', $row['timeStamp']).'"';
+ $xml .= ' userID="'.$row['userID'].'"';
+ $xml .= ' userRole="'.$row['userRole'].'"';
+ $xml .= ' channelID="'.$row['channelID'].'"';
+ if($this->getUserRole() == AJAX_CHAT_ADMIN || $this->getUserRole() == AJAX_CHAT_MODERATOR) {
+ $xml .= ' ip="'.$this->ipFromStorageFormat($row['ip']).'"';
+ }
+ $xml .= '>';
+ $xml .= '<username><![CDATA['.$this->encodeSpecialChars($row['userName']).']]></username>';
+ $xml .= '<text><![CDATA['.$this->encodeSpecialChars($row['text']).']]></text>';
+ $xml .= '</message>';
+ }
+ $result->free();
+
+ $xml .= '</messages>';
+
+ return $xml;
+ }
+
+ function getLogsViewXMLMessages() {
+ $xml = '<?xml version="1.0" encoding="UTF-8"?>';
+ $xml .= '<root>';
+ $xml .= $this->getInfoMessagesXML();
+ $xml .= $this->getLogsViewMessagesXML();
+ $xml .= '</root>';
+ return $xml;
+ }
+
+ function purgeLogs() {
+ $sql = 'DELETE FROM
+ '.$this->getDataBaseTable('messages').'
+ WHERE
+ dateTime < DATE_SUB(NOW(), interval '.$this->getConfig('logsPurgeTimeDiff').' DAY);';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+ }
+
+ function getInfoMessages($type=null) {
+ if(!isset($this->_infoMessages)) {
+ $this->_infoMessages = array();
+ }
+ if($type) {
+ if(!isset($this->_infoMessages[$type])) {
+ $this->_infoMessages[$type] = array();
+ }
+ return $this->_infoMessages[$type];
+ } else {
+ return $this->_infoMessages;
+ }
+ }
+
+ function addInfoMessage($info, $type='error') {
+ if(!isset($this->_infoMessages)) {
+ $this->_infoMessages = array();
+ }
+ if(!isset($this->_infoMessages[$type])) {
+ $this->_infoMessages[$type] = array();
+ }
+ if(!in_array($info, $this->_infoMessages[$type])) {
+ array_push($this->_infoMessages[$type], $info);
+ }
+ }
+
+ function getRequestVars() {
+ return $this->_requestVars;
+ }
+
+ function getRequestVar($key) {
+ if($this->_requestVars && isset($this->_requestVars[$key])) {
+ return $this->_requestVars[$key];
+ }
+ return null;
+ }
+
+ function setRequestVar($key, $value) {
+ if(!$this->_requestVars) {
+ $this->_requestVars = array();
+ }
+ $this->_requestVars[$key] = $value;
+ }
+
+ function getOnlineUsersData($channelIDs=null, $key=null, $value=null) {
+ if($this->_onlineUsersData === null) {
+ $this->_onlineUsersData = array();
+
+ $sql = 'SELECT
+ userID,
+ userName,
+ userRole,
+ channel,
+ UNIX_TIMESTAMP(dateTime) AS timeStamp,
+ ip
+ FROM
+ '.$this->getDataBaseTable('online').'
+ ORDER BY
+ userName;';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+
+ while($row = $result->fetch()) {
+ $row['ip'] = $this->ipFromStorageFormat($row['ip']);
+ array_push($this->_onlineUsersData, $row);
+ }
+
+ $result->free();
+ }
+
+ if($channelIDs || $key) {
+ $onlineUsersData = array();
+ foreach($this->_onlineUsersData as $userData) {
+ if($channelIDs && !in_array($userData['channel'], $channelIDs)) {
+ continue;
+ }
+ if($key) {
+ if(!isset($userData[$key])) {
+ return $onlineUsersData;
+ }
+ if($value !== null) {
+ if($userData[$key] == $value) {
+ array_push($onlineUsersData, $userData);
+ } else {
+ continue;
+ }
+ } else {
+ array_push($onlineUsersData, $userData[$key]);
+ }
+ } else {
+ array_push($onlineUsersData, $userData);
+ }
+ }
+ return $onlineUsersData;
+ }
+
+ return $this->_onlineUsersData;
+ }
+
+ function removeUserFromOnlineUsersData($userID=null) {
+ if(!$this->_onlineUsersData) {
+ return;
+ }
+ $userID = ($userID === null) ? $this->getUserID() : $userID;
+ for($i=0; $i<count($this->_onlineUsersData); $i++) {
+ if($this->_onlineUsersData[$i]['userID'] == $userID) {
+ array_splice($this->_onlineUsersData, $i, 1);
+ break;
+ }
+ }
+ }
+
+ function resetOnlineUsersData() {
+ $this->_onlineUsersData = null;
+ }
+
+ function getOnlineUsers($channelIDs=null) {
+ return $this->getOnlineUsersData($channelIDs, 'userName');
+ }
+
+ function getOnlineUserIDs($channelIDs=null) {
+ return $this->getOnlineUsersData($channelIDs, 'userID');
+ }
+
+ function startSession() {
+ if(!session_id()) {
+ // Set the session name:
+ session_name($this->getConfig('sessionName'));
+
+ // Set session cookie parameters:
+ session_set_cookie_params(
+ 0, // The session is destroyed on logout anyway, so no use to set this
+ $this->getConfig('sessionCookiePath'),
+ $this->getConfig('sessionCookieDomain'),
+ $this->getConfig('sessionCookieSecure')
+ );
+
+ // Start the session:
+ session_start();
+
+ // We started a new session:
+ $this->_sessionNew = true;
+ }
+ }
+
+ function destroySession() {
+ if($this->_sessionNew) {
+ // Delete all session variables:
+ $_SESSION = array();
+
+ // Delete the session cookie:
+ if (isset($_COOKIE[session_name()])) {
+ setcookie(
+ session_name(),
+ '',
+ time()-42000,
+ $this->getConfig('sessionCookiePath'),
+ $this->getConfig('sessionCookieDomain'),
+ $this->getConfig('sessionCookieSecure')
+ );
+ }
+
+ // Destroy the session:
+ session_destroy();
+ } else {
+ // Unset all session variables starting with the sessionKeyPrefix:
+ foreach($_SESSION as $key=>$value) {
+ if(strpos($key, $this->getConfig('sessionKeyPrefix')) === 0) {
+ unset($_SESSION[$key]);
+ }
+ }
+ }
+ }
+
+ function regenerateSessionID() {
+ if($this->_sessionNew) {
+ // Regenerate session id:
+ @session_regenerate_id(true);
+ }
+ }
+
+ function getSessionVar($key, $prefix=null) {
+ if($prefix === null)
+ $prefix = $this->getConfig('sessionKeyPrefix');
+
+ // Return the session value if existing:
+ if(isset($_SESSION[$prefix.$key]))
+ return $_SESSION[$prefix.$key];
+ else
+ return null;
+ }
+
+ function setSessionVar($key, $value, $prefix=null) {
+ if($prefix === null)
+ $prefix = $this->getConfig('sessionKeyPrefix');
+
+ // Set the session value:
+ $_SESSION[$prefix.$key] = $value;
+ }
+
+ function getSessionIP() {
+ return $this->getSessionVar('IP');
+ }
+
+ function setSessionIP($ip) {
+ $this->setSessionVar('IP', $ip);
+ }
+
+ function getQueryUserName() {
+ return $this->getSessionVar('QueryUserName');
+ }
+
+ function setQueryUserName($userName) {
+ $this->setSessionVar('QueryUserName', $userName);
+ }
+
+ function getInvitations() {
+ if($this->_invitations === null) {
+ $this->_invitations = array();
+
+ $sql = 'SELECT
+ channel
+ FROM
+ '.$this->getDataBaseTable('invitations').'
+ WHERE
+ userID='.$this->db->makeSafe($this->getUserID()).'
+ AND
+ DATE_SUB(NOW(), interval 1 DAY) < dateTime;';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+
+ while($row = $result->fetch()) {
+ array_push($this->_invitations, $row['channel']);
+ }
+
+ $result->free();
+ }
+ return $this->_invitations;
+ }
+
+ function removeExpiredInvitations() {
+ $sql = 'DELETE FROM
+ '.$this->getDataBaseTable('invitations').'
+ WHERE
+ DATE_SUB(NOW(), interval 1 DAY) > dateTime;';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+ }
+
+ function addInvitation($userID, $channelID=null) {
+ $this->removeExpiredInvitations();
+
+ $channelID = ($channelID === null) ? $this->getChannel() : $channelID;
+
+ $sql = 'INSERT INTO '.$this->getDataBaseTable('invitations').'(
+ userID,
+ channel,
+ dateTime
+ )
+ VALUES (
+ '.$this->db->makeSafe($userID).',
+ '.$this->db->makeSafe($channelID).',
+ NOW()
+ );';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+ }
+
+ function removeInvitation($userID, $channelID=null) {
+ $channelID = ($channelID === null) ? $this->getChannel() : $channelID;
+
+ $sql = 'DELETE FROM
+ '.$this->getDataBaseTable('invitations').'
+ WHERE
+ userID='.$this->db->makeSafe($userID).'
+ AND
+ channel='.$this->db->makeSafe($channelID).';';
+
+ // Create a new SQL query:
+ $result = $this->db->sqlQuery($sql);
+
+ // Stop if an error occurs:
+ if($result->error()) {
+ echo $result->getError();
+ die();
+ }
+ }
+
+ function getUserID() {
+ return $this->getSessionVar('UserID');
+ }
+
+ function setUserID($id) {
+ $this->setSessionVar('UserID', $id);
+ }
+
+ function getUserName() {
+ return $this->getSessionVar('UserName');
+ }
+
+ function setUserName($name) {
+ $this->setSessionVar('UserName', $name);
+ }
+
+ function getLoginUserName() {
+ return $this->getSessionVar('LoginUserName');
+ }
+
+ function setLoginUserName($name) {
+ $this->setSessionVar('LoginUserName', $name);
+ }
+
+ function getUserRole() {
+ $userRole = $this->getSessionVar('UserRole');
+ if($userRole === null)
+ return AJAX_CHAT_GUEST;
+ return $userRole;
+ }
+
+ function setUserRole($role) {
+ $this->setSessionVar('UserRole', $role);
+ }
+
+ function getChannel() {
+ return $this->getSessionVar('Channel');
+ }
+
+ function setChannel($channel) {
+ $this->setSessionVar('Channel', $channel);
+
+ // Save the channel enter timestamp:
+ $this->setChannelEnterTimeStamp(time());
+
+ // Update the channel authentication for the socket server:
+ if($this->getConfig('socketServerEnabled')) {
+ $this->updateSocketAuthentication(
+ $this->getUserID(),
+ $this->getSocketRegistrationID(),
+ array($channel,$this->getPrivateMessageID())
+ );
+ }
+
+ // Reset the logs view socket authentication session var:
+ if($this->getSessionVar('logsViewSocketAuthenticated')) {
+ $this->setSessionVar('logsViewSocketAuthenticated', false);
+ }
+ }
+
+ function isLoggedIn() {
+ return (bool)$this->getSessionVar('LoggedIn');
+ }
+
+ function setLoggedIn($bool) {
+ $this->setSessionVar('LoggedIn', $bool);
+ }
+
+ function getLoginTimeStamp() {
+ return $this->getSessionVar('LoginTimeStamp');
+ }
+
+ function setLoginTimeStamp($time) {
+ $this->setSessionVar('LoginTimeStamp', $time);
+ }
+
+ function getChannelEnterTimeStamp() {
+ return $this->getSessionVar('ChannelEnterTimeStamp');
+ }
+
+ function setChannelEnterTimeStamp($time) {
+ $this->setSessionVar('ChannelEnterTimeStamp', $time);
+ }
+
+ function getStatusUpdateTimeStamp() {
+ return $this->getSessionVar('StatusUpdateTimeStamp');
+ }
+
+ function setStatusUpdateTimeStamp($time) {
+ $this->setSessionVar('StatusUpdateTimeStamp', $time);
+ }
+
+ function getInactiveCheckTimeStamp() {
+ return $this->getSessionVar('InactiveCheckTimeStamp');
+ }
+
+ function setInactiveCheckTimeStamp($time) {
+ $this->setSessionVar('InactiveCheckTimeStamp', $time);
+ }
+
+ function getInsertedMessagesRate() {
+ return $this->getSessionVar('InsertedMessagesRate');
+ }
+
+ function setInsertedMessagesRate($rate) {
+ $this->setSessionVar('InsertedMessagesRate', $rate);
+ }
+
+ function getInsertedMessagesRateTimeStamp() {
+ return $this->getSessionVar('InsertedMessagesRateTimeStamp');
+ }
+
+ function setInsertedMessagesRateTimeStamp($time) {
+ $this->setSessionVar('InsertedMessagesRateTimeStamp', $time);
+ }
+
+ function getLangCode() {
+ // Get the langCode from request or cookie:
+ $langCodeCookie = isset($_COOKIE[$this->getConfig('sessionName').'_lang']) ? $_COOKIE[$this->getConfig('sessionName').'_lang'] : null;
+ $langCode = $this->getRequestVar('lang') ? $this->getRequestVar('lang') : $langCodeCookie;
+ // Check if the langCode is valid:
+ if(!in_array($langCode, $this->getConfig('langAvailable'))) {
+ // Determine the user language:
+ $language = new AJAXChatLanguage($this->getConfig('langAvailable'), $this->getConfig('langDefault'));
+ $langCode = $language->getLangCode();
+ }
+ return $langCode;
+ }
+
+ function setLangCodeCookie() {
+ setcookie(
+ $this->getConfig('sessionName').'_lang',
+ $this->getLangCode(),
+ time()+60*60*24*$this->getConfig('sessionCookieLifeTime'),
+ $this->getConfig('sessionCookiePath'),
+ $this->getConfig('sessionCookieDomain'),
+ $this->getConfig('sessionCookieSecure')
+ );
+ }
+
+ function removeUnsafeCharacters($str) {
+ // Remove NO-WS-CTL, non-whitespace control characters (RFC 2822), decimal 1–8, 11–12, 14–31, and 127:
+ return AJAXChatEncoding::removeUnsafeCharacters($str);
+ }
+
+ function subString($str, $start=0, $length=null, $encoding='UTF-8') {
+ return AJAXChatString::subString($str, $start, $length, $encoding);
+ }
+
+ function stringLength($str, $encoding='UTF-8') {
+ return AJAXChatString::stringLength($str, $encoding);
+ }
+
+ function trimMessageText($text) {
+ return $this->trimString($text, 'UTF-8', $this->getConfig('messageTextMaxLength'));
+ }
+
+ function trimUserName($userName) {
+ return $this->trimString($userName, null, $this->getConfig('userNameMaxLength'), true, true);
+ }
+
+ function trimChannelName($channelName) {
+ return $this->trimString($channelName, null, null, true, true);
+ }
+
+ function trimString($str, $sourceEncoding=null, $maxLength=null, $replaceWhitespace=false, $decodeEntities=false, $htmlEntitiesMap=null) {
+ // Make sure the string contains valid unicode:
+ $str = $this->convertToUnicode($str, $sourceEncoding);
+
+ // Make sure the string contains no unsafe characters:
+ $str = $this->removeUnsafeCharacters($str);
+
+ // Strip whitespace from the beginning and end of the string:
+ $str = trim($str);
+
+ if($replaceWhitespace) {
+ // Replace any whitespace in the userName with the underscore "_":
+ $str = preg_replace('/\s/u', '_', $str);
+ }
+
+ if($decodeEntities) {
+ // Decode entities:
+ $str = $this->decodeEntities($str, 'UTF-8', $htmlEntitiesMap);
+ }
+
+ if($maxLength) {
+ // Cut the string to the allowed length:
+ $str = $this->subString($str, 0, $maxLength);
+ }
+
+ return $str;
+ }
+
+ function convertToUnicode($str, $sourceEncoding=null) {
+ if($sourceEncoding === null) {
+ $sourceEncoding = $this->getConfig('sourceEncoding');
+ }
+ return $this->convertEncoding($str, $sourceEncoding, 'UTF-8');
+ }
+
+ function convertFromUnicode($str, $contentEncoding=null) {
+ if($contentEncoding === null) {
+ $contentEncoding = $this->getConfig('contentEncoding');
+ }
+ return $this->convertEncoding($str, 'UTF-8', $contentEncoding);
+ }
+
+ function convertEncoding($str, $charsetFrom, $charsetTo) {
+ return AJAXChatEncoding::convertEncoding($str, $charsetFrom, $charsetTo);
+ }
+
+ function encodeEntities($str, $encoding='UTF-8', $convmap=null) {
+ return AJAXChatEncoding::encodeEntities($str, $encoding, $convmap);
+ }
+
+ function decodeEntities($str, $encoding='UTF-8', $htmlEntitiesMap=null) {
+ return AJAXChatEncoding::decodeEntities($str, $encoding, $htmlEntitiesMap);
+ }
+
+ function htmlEncode($str) {
+ return AJAXChatEncoding::htmlEncode($str, $this->getConfig('contentEncoding'));
+ }
+
+ function encodeSpecialChars($str) {
+ return AJAXChatEncoding::encodeSpecialChars($str);
+ }
+
+ function decodeSpecialChars($str) {
+ return AJAXChatEncoding::decodeSpecialChars($str);
+ }
+
+ function ipToStorageFormat($ip) {
+ if(function_exists('inet_pton')) {
+ // ipv4 & ipv6:
+ return @inet_pton($ip);
+ }
+ // Only ipv4:
+ return @pack('N',@ip2long($ip));
+ }
+
+ function ipFromStorageFormat($ip) {
+ if(function_exists('inet_ntop')) {
+ // ipv4 & ipv6:
+ return @inet_ntop($ip);
+ }
+ // Only ipv4:
+ $unpacked = @unpack('Nlong',$ip);
+ if(isset($unpacked['long'])) {
+ return @long2ip($unpacked['long']);
+ }
+ return null;
+ }
+
+ function getConfig($key, $subkey=null) {
+ if($subkey)
+ return $this->_config[$key][$subkey];
+ else
+ return $this->_config[$key];
+ }
+
+ function setConfig($key, $subkey, $value) {
+ if($subkey) {
+ if(!isset($this->_config[$key])) {
+ $this->_config[$key] = array();
+ }
+ $this->_config[$key][$subkey] = $value;
+ } else {
+ $this->_config[$key] = $value;
+ }
+ }
+
+ function getLang($key=null) {
+ if(!$this->_lang) {
+ // Include the language file:
+ $lang = null;
+ require(AJAX_CHAT_PATH.'lib/lang/'.$this->getLangCode().'.php');
+ $this->_lang = &$lang;
+ }
+ if($key === null)
+ return $this->_lang;
+ if(isset($this->_lang[$key]))
+ return $this->_lang[$key];
+ return null;
+ }
+
+ function getChatURL() {
+ if(defined('AJAX_CHAT_URL')) {
+ return AJAX_CHAT_URL;
+ }
+
+ return
+ (isset($_SERVER['HTTPS']) ? 'https://' : 'http://').
+ (isset($_SERVER['REMOTE_USER']) ? $_SERVER['REMOTE_USER'].'@' : '').
+ (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ($_SERVER['SERVER_NAME'].
+ (isset($_SERVER['HTTPS']) && $_SERVER['SERVER_PORT'] == 443 || $_SERVER['SERVER_PORT'] == 80 ? '' : ':'.$_SERVER['SERVER_PORT']))).
+ substr($_SERVER['SCRIPT_NAME'],0, strrpos($_SERVER['SCRIPT_NAME'], '/')+1);
+ }
+
+ function getIDFromName($userName) {
+ $userDataArray = $this->getOnlineUsersData(null,'userName',$userName);
+ if($userDataArray && isset($userDataArray[0])) {
+ return $userDataArray[0]['userID'];
+ }
+ return null;
+ }
+
+ function getNameFromID($userID) {
+ $userDataArray = $this->getOnlineUsersData(null,'userID',$userID);
+ if($userDataArray && isset($userDataArray[0])) {
+ return $userDataArray[0]['userName'];
+ }
+ return null;
+ }
+
+ function getChannelFromID($userID) {
+ $userDataArray = $this->getOnlineUsersData(null,'userID',$userID);
+ if($userDataArray && isset($userDataArray[0])) {
+ return $userDataArray[0]['channel'];
+ }
+ return null;
+ }
+
+ function getIPFromID($userID) {
+ $userDataArray = $this->getOnlineUsersData(null,'userID',$userID);
+ if($userDataArray && isset($userDataArray[0])) {
+ return $userDataArray[0]['ip'];
+ }
+ return null;
+ }
+
+ function getRoleFromID($userID) {
+ $userDataArray = $this->getOnlineUsersData(null,'userID',$userID);
+ if($userDataArray && isset($userDataArray[0])) {
+ return $userDataArray[0]['userRole'];
+ }
+ return null;
+ }
+
+ function getChannelNames() {
+ return array_flip($this->getChannels());
+ }
+
+ function getChannelIDFromChannelName($channelName) {
+ if(!$channelName)
+ return null;
+ $channels = $this->getAllChannels();
+ if(array_key_exists($channelName,$channels)) {
+ return $channels[$channelName];
+ }
+ $channelID = null;
+ // Check if the requested channel is the own private channel:
+ if($channelName == $this->getPrivateChannelName()) {
+ return $this->getPrivateChannelID();
+ }
+ // Try to retrieve a private room ID:
+ $strlenChannelName = $this->stringLength($channelName);
+ $strlenPrefix = $this->stringLength($this->getConfig('privateChannelPrefix'));
+ $strlenSuffix = $this->stringLength($this->getConfig('privateChannelSuffix'));
+ if($this->subString($channelName,0,$strlenPrefix) == $this->getConfig('privateChannelPrefix')
+ && $this->subString($channelName,$strlenChannelName-$strlenSuffix) == $this->getConfig('privateChannelSuffix')) {
+ $userName = $this->subString(
+ $channelName,
+ $strlenPrefix,
+ $strlenChannelName-($strlenPrefix+$strlenSuffix)
+ );
+ $userID = $this->getIDFromName($userName);
+ if($userID !== null) {
+ $channelID = $this->getPrivateChannelID($userID);
+ }
+ }
+ return $channelID;
+ }
+
+ function getChannelNameFromChannelID($channelID) {
+ foreach($this->getAllChannels() as $key=>$value) {
+ if($value == $channelID) {
+ return $key;
+ }
+ }
+ // Try to retrieve a private room name:
+ if($channelID == $this->getPrivateChannelID()) {
+ return $this->getPrivateChannelName();
+ }
+ $userName = $this->getNameFromID($channelID-$this->getConfig('privateChannelDiff'));
+ if($userName === null) {
+ return null;
+ }
+ return $this->getPrivateChannelName($userName);
+ }
+
+ function getChannelName() {
+ return $this->getChannelNameFromChannelID($this->getChannel());
+ }
+
+ function getPrivateChannelName($userName=null) {
+ if($userName === null) {
+ $userName = $this->getUserName();
+ }
+ return $this->getConfig('privateChannelPrefix').$userName.$this->getConfig('privateChannelSuffix');
+ }
+
+ function getPrivateChannelID($userID=null) {
+ if($userID === null) {
+ $userID = $this->getUserID();
+ }
+ return $userID + $this->getConfig('privateChannelDiff');
+ }
+
+ function getPrivateMessageID($userID=null) {
+ if($userID === null) {
+ $userID = $this->getUserID();
+ }
+ return $userID + $this->getConfig('privateMessageDiff');
+ }
+
+ function isAllowedToSendPrivateMessage() {
+ if($this->getConfig('allowPrivateMessages') || $this->getUserRole() == AJAX_CHAT_ADMIN) {
+ return true;
+ }
+ return false;
+ }
+
+ function isAllowedToCreatePrivateChannel() {
+ if($this->getConfig('allowPrivateChannels')) {
+ switch($this->getUserRole()) {
+ case AJAX_CHAT_USER:
+ return true;
+ case AJAX_CHAT_MODERATOR:
+ return true;
+ case AJAX_CHAT_ADMIN:
+ return true;
+ default:
+ return false;
+ }
+ }
+ return false;
+ }
+
+ function isAllowedToListHiddenUsers() {
+ // Hidden users are users within private or restricted channels:
+ switch($this->getUserRole()) {
+ case AJAX_CHAT_MODERATOR:
+ return true;
+ case AJAX_CHAT_ADMIN:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ function isUserOnline($userID=null) {
+ $userID = ($userID === null) ? $this->getUserID() : $userID;
+ $userDataArray = $this->getOnlineUsersData(null,'userID',$userID);
+ if($userDataArray && count($userDataArray) > 0) {
+ return true;
+ }
+ return false;
+ }
+
+ function isUserNameInUse($userName=null) {
+ $userName = ($userName === null) ? $this->getUserName() : $userName;
+ $userDataArray = $this->getOnlineUsersData(null,'userName',$userName);
+ if($userDataArray && count($userDataArray) > 0) {
+ return true;
+ }
+ return false;
+ }
+
+ function isUserBanned($userName, $userID=null, $ip=null) {
+ if($userID !== null) {
+ $bannedUserDataArray = $this->getBannedUsersData('userID',$userID);
+ if($bannedUserDataArray && isset($bannedUserDataArray[0])) {
+ return true;
+ }
+ }
+ if($ip !== null) {
+ $bannedUserDataArray = $this->getBannedUsersData('ip',$ip);
+ if($bannedUserDataArray && isset($bannedUserDataArray[0])) {
+ return true;
+ }
+ }
+ $bannedUserDataArray = $this->getBannedUsersData('userName',$userName);
+ if($bannedUserDataArray && isset($bannedUserDataArray[0])) {
+ return true;
+ }
+ return false;
+ }
+
+ function isMaxUsersLoggedIn() {
+ if(count($this->getOnlineUsersData()) >= $this->getConfig('maxUsersLoggedIn')) {
+ return true;
+ }
+ return false;
+ }
+
+ function validateChannel($channelID) {
+ if($channelID === null) {
+ return false;
+ }
+ // Return true for normal channels the user has acces to:
+ if(in_array($channelID, $this->getChannels())) {
+ return true;
+ }
+ // Return true if the user is allowed to join his own private channel:
+ if($channelID == $this->getPrivateChannelID() && $this->isAllowedToCreatePrivateChannel()) {
+ return true;
+ }
+ // Return true if the user has been invited to a restricted or private channel:
+ if(in_array($channelID, $this->getInvitations())) {
+ return true;
+ }
+ // No valid channel, return false:
+ return false;
+ }
+
+ function createGuestUserName() {
+ $maxLength = $this->getConfig('userNameMaxLength')
+ - $this->stringLength($this->getConfig('guestUserPrefix'))
+ - $this->stringLength($this->getConfig('guestUserSuffix'));
+
+ // seed with microseconds since last "whole" second:
+ mt_srand((double)microtime()*1000000);
+
+ // Create a random userName using numbers between 100000 and 999999:
+ $userName = substr(mt_rand(100000, 999999), 0, $maxLength);
+
+ return $this->getConfig('guestUserPrefix').$userName.$this->getConfig('guestUserSuffix');
+ }
+
+ // Guest userIDs must not interfere with existing userIDs and must be lower than privateChannelDiff:
+ function createGuestUserID() {
+ // seed with microseconds since last "whole" second:
+ mt_srand((double)microtime()*1000000);
+
+ return mt_rand($this->getConfig('minGuestUserID'), $this->getConfig('privateChannelDiff')-1);
+ }
+
+ function getGuestUser() {
+ if(!$this->getConfig('allowGuestLogins'))
+ return null;
+
+ if($this->getConfig('allowGuestUserName')) {
+ $maxLength = $this->getConfig('userNameMaxLength')
+ - $this->stringLength($this->getConfig('guestUserPrefix'))
+ - $this->stringLength($this->getConfig('guestUserSuffix'));
+
+ // Trim guest userName:
+ $userName = $this->trimString($this->getRequestVar('userName'), null, $maxLength, true, true);
+
+ // If given userName is invalid, create one:
+ if(!$userName) {
+ $userName = $this->createGuestUserName();
+ } else {
+ // Add the guest users prefix and suffix to the given userName:
+ $userName = $this->getConfig('guestUserPrefix').$userName.$this->getConfig('guestUserSuffix');
+ }
+ } else {
+ $userName = $this->createGuestUserName();
+ }
+
+ $userData = array();
+ $userData['userID'] = $this->createGuestUserID();
+ $userData['userName'] = $userName;
+ $userData['userRole'] = AJAX_CHAT_GUEST;
+ return $userData;
+ }
+
+ function getCustomVar($key) {
+ if(!isset($this->_customVars))
+ $this->_customVars = array();
+ if(!isset($this->_customVars[$key]))
+ return null;
+ return $this->_customVars[$key];
+ }
+
+ function setCustomVar($key, $value) {
+ if(!isset($this->_customVars))
+ $this->_customVars = array();
+ $this->_customVars[$key] = $value;
+ }
+
+ // Override to replace custom template tags:
+ // Return the replacement for the given tag (and given tagContent)
+ function replaceCustomTemplateTags($tag, $tagContent) {
+ return null;
+ }
+
+ // Override to initialize custom configuration settings:
+ function initCustomConfig() {
+ }
+
+ // Override to add custom request variables:
+ // Add values to the request variables array: $this->_requestVars['customVariable'] = null;
+ function initCustomRequestVars() {
+ }
+
+ // Override to add custom session code right after the session has been started:
+ function initCustomSession() {
+ }
+
+ // Override, to parse custom info requests:
+ // $infoRequest contains the current info request
+ // Add info responses using the method addInfoMessage($info, $type)
+ function parseCustomInfoRequest($infoRequest) {
+ }
+
+ // Override to replace custom text:
+ // Return replaced text
+ // $text contains the whole message
+ function replaceCustomText(&$text) {
+ return $text;
+ }
+
+ // Override to add custom commands:
+ // Return true if a custom command has been successfully parsed, else false
+ // $text contains the whole message, $textParts the message split up as words array
+ function parseCustomCommands($text, $textParts) {
+ return false;
+ }
+
+ // Override to perform custom actions on new messages:
+ // Return true if message may be inserted, else false
+ // $text contains the whole message
+ function onNewMessage($text) {
+ return true;
+ }
+
+ // Override to perform custom actions on new messages:
+ // Method to set the style cookie depending on user data
+ function setStyle() {
+ }
+
+ // Override:
+ // Returns true if the userID of the logged in user is identical to the userID of the authentication system
+ // or the user is authenticated as guest in the chat and the authentication system
+ function revalidateUserID() {
+ return true;
+ }
+
+ // Override:
+ // Returns an associative array containing userName, userID and userRole
+ // Returns null if login is invalid
+ function getValidLoginUserData() {
+ // Check if we have a valid registered user:
+ if(false) {
+ // Here is the place to check user authentication
+ } else {
+ // Guest users:
+ return $this->getGuestUser();
+ }
+ }
+
+ // Override:
+ // Store the channels the current user has access to
+ // Make sure channel names don't contain any whitespace
+ function &getChannels() {
+ if($this->_channels === null) {
+ $this->_channels = $this->getAllChannels();
+ }
+ return $this->_channels;
+ }
+
+ // Override:
+ // Store all existing channels
+ // Make sure channel names don't contain any whitespace
+ function &getAllChannels() {
+ if($this->_allChannels === null) {
+ $this->_allChannels = array();
+
+ // Default channel, public to everyone:
+ $this->_allChannels[$this->trimChannelName($this->getConfig('defaultChannelName'))] = $this->getConfig('defaultChannelID');
+ }
+ return $this->_allChannels;
+ }
+
+}
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/class/AJAXChatDataBase.php b/library/ajaxchat/chat/lib/class/AJAXChatDataBase.php
new file mode 100644
index 000000000..2143c5aa0
--- /dev/null
+++ b/library/ajaxchat/chat/lib/class/AJAXChatDataBase.php
@@ -0,0 +1,81 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+// Class to initialize the DataBase connection:
+class AJAXChatDataBase {
+
+ var $_db;
+
+ function __construct(&$dbConnectionConfig) {
+ switch($dbConnectionConfig['type']) {
+ case 'mysqli':
+ $this->_db = new AJAXChatDatabaseMySQLi($dbConnectionConfig);
+ break;
+ case 'mysql':
+ $this->_db = new AJAXChatDatabaseMySQL($dbConnectionConfig);
+ break;
+ default:
+ // Use MySQLi if available, else MySQL (and check the type of a given database connection object):
+ if(function_exists('mysqli_connect') && (!$dbConnectionConfig['link'] || is_object($dbConnectionConfig['link']))) {
+ $this->_db = new AJAXChatDatabaseMySQLi($dbConnectionConfig);
+ } else {
+ $this->_db = new AJAXChatDatabaseMySQL($dbConnectionConfig);
+ }
+ }
+ }
+
+ // Method to connect to the DataBase server:
+ function connect(&$dbConnectionConfig) {
+ return $this->_db->connect($dbConnectionConfig);
+ }
+
+ // Method to select the DataBase:
+ function select($dbName) {
+ return $this->_db->select($dbName);
+ }
+
+ // Method to determine if an error has occured:
+ function error() {
+ return $this->_db->error();
+ }
+
+ // Method to return the error report:
+ function getError() {
+ return $this->_db->getError();
+ }
+
+ // Method to return the connection identifier:
+ function &getConnectionID() {
+ return $this->_db->getConnectionID();
+ }
+
+ // Method to prevent SQL injections:
+ function makeSafe($value) {
+ return $this->_db->makeSafe($value);
+ }
+
+ // Method to perform SQL queries:
+ function sqlQuery($sql) {
+ return $this->_db->sqlQuery($sql);
+ }
+
+ // Method to retrieve the current DataBase name:
+ function getName() {
+ return $this->_db->getName();
+ //If your database has hyphens ( - ) in it, try using this instead:
+ //return '`'.$this->_db->getName().'`';
+ }
+
+ // Method to retrieve the last inserted ID:
+ function getLastInsertedID() {
+ return $this->_db->getLastInsertedID();
+ }
+
+}
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/class/AJAXChatEncoding.php b/library/ajaxchat/chat/lib/class/AJAXChatEncoding.php
new file mode 100644
index 000000000..96b2482c7
--- /dev/null
+++ b/library/ajaxchat/chat/lib/class/AJAXChatEncoding.php
@@ -0,0 +1,138 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+// Class to provide static encoding methods
+class AJAXChatEncoding {
+
+ // Helper function to store special chars as we cannot use static class members in PHP4:
+ public static function getSpecialChars() {
+ static $specialChars;
+ if(!$specialChars) {
+ // As &apos; is not supported by IE, we use &#39; as replacement for "'":
+ $specialChars = array('&'=>'&amp;', '<'=>'&lt;', '>'=>'&gt;', "'"=>'&#39;', '"'=>'&quot;');
+ }
+ return $specialChars;
+ }
+
+ // Helper function to store Regular expression for NO-WS-CTL as we cannot use static class members in PHP4:
+ public static function getRegExp_NO_WS_CTL() {
+ static $regExp_NO_WS_CTL;
+ if(!$regExp_NO_WS_CTL) {
+ // Regular expression for NO-WS-CTL, non-whitespace control characters (RFC 2822), decimal 1–8, 11–12, 14–31, and 127:
+ $regExp_NO_WS_CTL = '/[\x0\x1\x2\x3\x4\x5\x6\x7\x8\xB\xC\xE\xF\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x7F]/';
+ }
+ return $regExp_NO_WS_CTL;
+ }
+
+ public static function convertEncoding($str, $charsetFrom, $charsetTo) {
+ if(function_exists('mb_convert_encoding')) {
+ return mb_convert_encoding($str, $charsetTo, $charsetFrom);
+ }
+ if(function_exists('iconv')) {
+ return iconv($charsetFrom, $charsetTo, $str);
+ }
+ if(($charsetFrom == 'UTF-8') && ($charsetTo == 'ISO-8859-1')) {
+ return utf8_decode($str);
+ }
+ if(($charsetFrom == 'ISO-8859-1') && ($charsetTo == 'UTF-8')) {
+ return utf8_encode($str);
+ }
+ return $str;
+ }
+
+ public static function htmlEncode($str, $contentCharset='UTF-8') {
+ switch($contentCharset) {
+ case 'UTF-8':
+ // Encode only special chars (&, <, >, ', ") as entities:
+ return AJAXChatEncoding::encodeSpecialChars($str);
+ break;
+ case 'ISO-8859-1':
+ case 'ISO-8859-15':
+ // Encode special chars and all extended characters above ISO-8859-1 charset as entities, then convert to content charset:
+ return AJAXChatEncoding::convertEncoding(AJAXChatEncoding::encodeEntities($str, 'UTF-8', array(
+ 0x26, 0x26, 0, 0xFFFF, // &
+ 0x3C, 0x3C, 0, 0xFFFF, // <
+ 0x3E, 0x3E, 0, 0xFFFF, // >
+ 0x27, 0x27, 0, 0xFFFF, // '
+ 0x22, 0x22, 0, 0xFFFF, // "
+ 0x100, 0x2FFFF, 0, 0xFFFF // above ISO-8859-1
+ )), 'UTF-8', $contentCharset);
+ break;
+ default:
+ // Encode special chars and all characters above ASCII charset as entities, then convert to content charset:
+ return AJAXChatEncoding::convertEncoding(AJAXChatEncoding::encodeEntities($str, 'UTF-8', array(
+ 0x26, 0x26, 0, 0xFFFF, // &
+ 0x3C, 0x3C, 0, 0xFFFF, // <
+ 0x3E, 0x3E, 0, 0xFFFF, // >
+ 0x27, 0x27, 0, 0xFFFF, // '
+ 0x22, 0x22, 0, 0xFFFF, // "
+ 0x80, 0x2FFFF, 0, 0xFFFF // above ASCII
+ )), 'UTF-8', $contentCharset);
+ }
+ }
+
+ public static function encodeSpecialChars($str) {
+ return strtr($str, AJAXChatEncoding::getSpecialChars());
+ }
+
+ public static function decodeSpecialChars($str) {
+ return strtr($str, array_flip(AJAXChatEncoding::getSpecialChars()));
+ }
+
+ public static function encodeEntities($str, $encoding='UTF-8', $convmap=null) {
+ if($convmap && function_exists('mb_encode_numericentity')) {
+ return mb_encode_numericentity($str, $convmap, $encoding);
+ }
+ return htmlentities($str, ENT_QUOTES, $encoding);
+ }
+
+ public static function decodeEntities($str, $encoding='UTF-8', $htmlEntitiesMap=null) {
+ // Due to PHP bug #25670, html_entity_decode does not work with UTF-8 for PHP versions < 5:
+ if(function_exists('html_entity_decode') && version_compare(phpversion(), 5, '>=')) {
+ // Replace numeric and literal entities:
+ $str = html_entity_decode($str, ENT_QUOTES, $encoding);
+ // Replace additional literal HTML entities if an HTML entities map is given:
+ if($htmlEntitiesMap) {
+ $str = strtr($str, $htmlEntitiesMap);
+ }
+ } else {
+ // Replace numeric entities:
+ $str = preg_replace('~&#([0-9]+);~e', 'AJAXChatEncoding::unicodeChar("\\1")', $str);
+ $str = preg_replace('~&#x([0-9a-f]+);~ei', 'AJAXChatEncoding::unicodeChar(hexdec("\\1"))', $str);
+ // Replace literal entities:
+ $htmlEntitiesMap = $htmlEntitiesMap ? $htmlEntitiesMap : array_flip(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES));
+ $str = strtr($str, $htmlEntitiesMap);
+ }
+ return $str;
+ }
+
+ public static function unicodeChar($c) {
+ if($c <= 0x7F) {
+ return chr($c);
+ } else if($c <= 0x7FF) {
+ return chr(0xC0 | $c >> 6) . chr(0x80 | $c & 0x3F);
+ } else if($c <= 0xFFFF) {
+ return chr(0xE0 | $c >> 12) . chr(0x80 | $c >> 6 & 0x3F)
+ . chr(0x80 | $c & 0x3F);
+ } else if($c <= 0x10FFFF) {
+ return chr(0xF0 | $c >> 18) . chr(0x80 | $c >> 12 & 0x3F)
+ . chr(0x80 | $c >> 6 & 0x3F)
+ . chr(0x80 | $c & 0x3F);
+ } else {
+ return null;
+ }
+ }
+
+ public static function removeUnsafeCharacters($str) {
+ // Remove NO-WS-CTL, non-whitespace control characters (RFC 2822), decimal 1–8, 11–12, 14–31, and 127:
+ return preg_replace(AJAXChatEncoding::getRegExp_NO_WS_CTL(), '', $str);
+ }
+
+}
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/class/AJAXChatFileSystem.php b/library/ajaxchat/chat/lib/class/AJAXChatFileSystem.php
new file mode 100644
index 000000000..c9626c36a
--- /dev/null
+++ b/library/ajaxchat/chat/lib/class/AJAXChatFileSystem.php
@@ -0,0 +1,22 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+// Class to provide methods for file system access:
+class AJAXChatFileSystem {
+
+ public static function getFileContents($file) {
+ if(function_exists('file_get_contents')) {
+ return file_get_contents($file);
+ } else {
+ return(implode('', file($file)));
+ }
+ }
+
+}
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/class/AJAXChatHTTPHeader.php b/library/ajaxchat/chat/lib/class/AJAXChatHTTPHeader.php
new file mode 100644
index 000000000..7340bfcf0
--- /dev/null
+++ b/library/ajaxchat/chat/lib/class/AJAXChatHTTPHeader.php
@@ -0,0 +1,56 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+// Class to manage HTTP header
+class AJAXChatHTTPHeader {
+
+ var $_contentType;
+ var $_constant;
+ var $_noCache;
+
+ function __construct($encoding='UTF-8', $contentType=null, $noCache=true) {
+ if($contentType) {
+ $this->_contentType = $contentType.'; charset='.$encoding;
+ $this->_constant = true;
+ } else {
+ if(isset($_SERVER['HTTP_ACCEPT']) && (strpos($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml') !== false)) {
+ $this->_contentType = 'application/xhtml+xml; charset='.$encoding;
+ } else {
+ $this->_contentType = 'text/html; charset='.$encoding;
+ }
+ $this->_constant = false;
+ }
+ $this->_noCache = $noCache;
+ }
+
+ // Method to send the HTTP header:
+ function send() {
+ // Prevent caching:
+ if($this->_noCache) {
+ header('Cache-Control: no-cache, must-revalidate');
+ header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
+ }
+
+ // Send the content-type-header:
+ header('Content-Type: '.$this->_contentType);
+
+ // Send vary header if content-type varies (important for proxy-caches):
+ if(!$this->_constant) {
+ header('Vary: Accept');
+ }
+ }
+
+ // Method to return the content-type string:
+ function getContentType() {
+ // Return the content-type string:
+ return $this->_contentType;
+ }
+
+}
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/class/AJAXChatLanguage.php b/library/ajaxchat/chat/lib/class/AJAXChatLanguage.php
new file mode 100644
index 000000000..b19724710
--- /dev/null
+++ b/library/ajaxchat/chat/lib/class/AJAXChatLanguage.php
@@ -0,0 +1,102 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+class AJAXChatLanguage {
+
+ var $_regExpAcceptLangCode;
+ var $_availableLangCodes;
+ var $_defaultLangCode;
+ var $_strictMode;
+ var $_langCode;
+
+ function __construct($availableLangCodes, $defaultLangCode, $langCode=null, $strictMode=false) {
+ $this->_regExpAcceptLangCode = '/^([a-z]{1,8}(?:-[a-z]{1,8})*)(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i';
+ $this->_availableLangCodes = $availableLangCodes;
+ $this->_defaultLangCode = $defaultLangCode;
+ if($langCode && in_array($langCode, $availableLangCodes)) {
+ $this->_langCode = $langCode;
+ }
+ $this->_strictMode = $strictMode;
+ }
+
+ // Method to detect the language code from the HTTP_ACCEPT_LANGUAGE header:
+ function detectLangCode() {
+ // If HTTP_ACCEPT_LANGUAGE is empty use defaultLangCode:
+ if(empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
+ $this->_langCode = $this->_defaultLangCode;
+ return;
+ }
+
+ // Split up the HTTP_ACCEPT_LANGUAGE header:
+ $acceptedLanguages = preg_split('/,\s*/', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
+
+ $currentLangCode = $this->_defaultLangCode;
+ $currentLangQuality = 0.0;
+
+ foreach($acceptedLanguages as $acceptedLanguage) {
+ // Parse the language string:
+ $match = preg_match($this->_regExpAcceptLangCode, $acceptedLanguage, $matches);
+ // Check if the syntax is valid:
+ if(!$match) {
+ continue;
+ }
+
+ // Get and split the language code:
+ $langCodeParts = explode ('-', $matches[1]);
+
+ // Get the language quality given as float value:
+ if(isset($matches[2])) {
+ $langQuality = (float)$matches[2];
+ } else {
+ // Missing language quality value is maximum quality:
+ $langQuality = 1.0;
+ }
+
+ // Go through it until the language code is empty:
+ while(count($langCodeParts)) {
+ // Join the current langCodeParts:
+ $langCode = strtolower(join('-', $langCodeParts));
+ // Check if the langCode is in the available list:
+ if(in_array($langCode, $this->_availableLangCodes)) {
+ // Check the quality setting:
+ if ($langQuality > $currentLangQuality) {
+ $currentLangCode = $langCode;
+ $currentLangQuality = $langQuality;
+ break;
+ }
+ }
+ // If strict mode is set, don't minimalize the language code:
+ if($this->_strictMode) {
+ break;
+ }
+ // else chop off the right part:
+ array_pop($langCodeParts);
+ }
+ }
+
+ $this->_langCode = $currentLangCode;
+ }
+
+ function getLangCode() {
+ if(!$this->_langCode) {
+ $this->detectLangCode();
+ }
+ return $this->_langCode;
+ }
+
+ function setLangCode($langCode) {
+ $this->_langCode = $langCode;
+ }
+
+ function getLangCodes() {
+ return $this->_availableLangCodes;
+ }
+
+}
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/class/AJAXChatMySQLDataBase.php b/library/ajaxchat/chat/lib/class/AJAXChatMySQLDataBase.php
new file mode 100644
index 000000000..6dca348d1
--- /dev/null
+++ b/library/ajaxchat/chat/lib/class/AJAXChatMySQLDataBase.php
@@ -0,0 +1,92 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+// Class to initialize the MySQL DataBase connection:
+class AJAXChatDataBaseMySQL {
+
+ var $_connectionID;
+ var $_errno = 0;
+ var $_error = '';
+ var $_dbName;
+
+ function __construct(&$dbConnectionConfig) {
+ $this->_connectionID = $dbConnectionConfig['link'];
+ $this->_dbName = $dbConnectionConfig['name'];
+ }
+
+ // Method to connect to the DataBase server:
+ function connect(&$dbConnectionConfig) {
+ $this->_connectionID = @mysql_connect(
+ $dbConnectionConfig['host'],
+ $dbConnectionConfig['user'],
+ $dbConnectionConfig['pass'],
+ true
+ );
+ if(!$this->_connectionID) {
+ $this->_errno = null;
+ $this->_error = 'Database connection failed.';
+ return false;
+ }
+ return true;
+ }
+
+ // Method to select the DataBase:
+ function select($dbName) {
+ if(!@mysql_select_db($dbName, $this->_connectionID)) {
+ $this->_errno = mysql_errno($this->_connectionID);
+ $this->_error = mysql_error($this->_connectionID);
+ return false;
+ }
+ $this->_dbName = $dbName;
+ return true;
+ }
+
+ // Method to determine if an error has occured:
+ function error() {
+ return (bool)$this->_error;
+ }
+
+ // Method to return the error report:
+ function getError() {
+ if($this->error()) {
+ $str = 'Error-Report: ' .$this->_error."\n";
+ $str .= 'Error-Code: '.$this->_errno."\n";
+ } else {
+ $str = 'No errors.'."\n";
+ }
+ return $str;
+ }
+
+ // Method to return the connection identifier:
+ function &getConnectionID() {
+ return $this->_connectionID;
+ }
+
+ // Method to prevent SQL injections:
+ function makeSafe($value) {
+ return "'".mysql_real_escape_string($value, $this->_connectionID)."'";
+ }
+
+ // Method to perform SQL queries:
+ function sqlQuery($sql) {
+ return new AJAXChatMySQLQuery($sql, $this->_connectionID);
+ }
+
+ // Method to retrieve the current DataBase name:
+ function getName() {
+ return $this->_dbName;
+ }
+
+ // Method to retrieve the last inserted ID:
+ function getLastInsertedID() {
+ return mysql_insert_id($this->_connectionID);
+ }
+
+}
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/class/AJAXChatMySQLQuery.php b/library/ajaxchat/chat/lib/class/AJAXChatMySQLQuery.php
new file mode 100644
index 000000000..f2f3fd466
--- /dev/null
+++ b/library/ajaxchat/chat/lib/class/AJAXChatMySQLQuery.php
@@ -0,0 +1,89 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+// Class to perform SQL (MySQL) queries:
+class AJAXChatMySQLQuery {
+
+ var $_connectionID;
+ var $_sql = '';
+ var $_result = 0;
+ var $_errno = 0;
+ var $_error = '';
+
+ // Constructor:
+ function __construct($sql, $connectionID = null) {
+ $this->_sql = trim($sql);
+ $this->_connectionID = $connectionID;
+ if($this->_connectionID) {
+ $this->_result = mysql_query($this->_sql, $this->_connectionID);
+ if(!$this->_result) {
+ $this->_errno = mysql_errno($this->_connectionID);
+ $this->_error = mysql_error($this->_connectionID);
+ }
+ } else {
+ $this->_result = mysql_query($this->_sql);
+ if(!$this->_result) {
+ $this->_errno = mysql_errno();
+ $this->_error = mysql_error();
+ }
+ }
+ }
+
+ // Returns true if an error occured:
+ function error() {
+ // Returns true if the Result-ID is valid:
+ return !(bool)($this->_result);
+ }
+
+ // Returns an Error-String:
+ function getError() {
+ if($this->error()) {
+ $str = 'Query: ' .$this->_sql ."\n";
+ $str .= 'Error-Report: ' .$this->_error."\n";
+ $str .= 'Error-Code: '.$this->_errno;
+ } else {
+ $str = "No errors.";
+ }
+ return $str;
+ }
+
+ // Returns the content:
+ function fetch() {
+ if($this->error()) {
+ return null;
+ } else {
+ return mysql_fetch_assoc($this->_result);
+ }
+ }
+
+ // Returns the number of rows (SELECT or SHOW):
+ function numRows() {
+ if($this->error()) {
+ return null;
+ } else {
+ return mysql_num_rows($this->_result);
+ }
+ }
+
+ // Returns the number of affected rows (INSERT, UPDATE, REPLACE or DELETE):
+ function affectedRows() {
+ if($this->error()) {
+ return null;
+ } else {
+ return mysql_affected_rows($this->_connectionID);
+ }
+ }
+
+ // Frees the memory:
+ function free() {
+ @mysql_free_result($this->_result);
+ }
+
+}
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/class/AJAXChatMySQLiDataBase.php b/library/ajaxchat/chat/lib/class/AJAXChatMySQLiDataBase.php
new file mode 100644
index 000000000..9bc611e2d
--- /dev/null
+++ b/library/ajaxchat/chat/lib/class/AJAXChatMySQLiDataBase.php
@@ -0,0 +1,91 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+// Class to initialize the MySQL DataBase connection:
+class AJAXChatDataBaseMySQLi {
+
+ var $_connectionID;
+ var $_errno = 0;
+ var $_error = '';
+ var $_dbName;
+
+ function __construct(&$dbConnectionConfig) {
+ $this->_connectionID = $dbConnectionConfig['link'];
+ $this->_dbName = $dbConnectionConfig['name'];
+ }
+
+ // Method to connect to the DataBase server:
+ function connect(&$dbConnectionConfig) {
+ @$this->_connectionID = new mysqli(
+ $dbConnectionConfig['host'],
+ $dbConnectionConfig['user'],
+ $dbConnectionConfig['pass']
+ );
+ if($this->_connectionID->connect_errno) {
+ $this->_errno = mysqli_connect_errno();
+ $this->_error = mysqli_connect_error();
+ return false;
+ }
+ return true;
+ }
+
+ // Method to select the DataBase:
+ function select($dbName) {
+ if(!$this->_connectionID->select_db($dbName)) {
+ $this->_errno = $this->_connectionID->errno;
+ $this->_error = $this->_connectionID->error;
+ return false;
+ }
+ $this->_dbName = $dbName;
+ return true;
+ }
+
+ // Method to determine if an error has occured:
+ function error() {
+ return (bool)$this->_error;
+ }
+
+ // Method to return the error report:
+ function getError() {
+ if($this->error()) {
+ $str = 'Error-Report: ' .$this->_error."\n";
+ $str .= 'Error-Code: '.$this->_errno."\n";
+ } else {
+ $str = 'No errors.'."\n";
+ }
+ return $str;
+ }
+
+ // Method to return the connection identifier:
+ function &getConnectionID() {
+ return $this->_connectionID;
+ }
+
+ // Method to prevent SQL injections:
+ function makeSafe($value) {
+ return "'".$this->_connectionID->escape_string($value)."'";
+ }
+
+ // Method to perform SQL queries:
+ function sqlQuery($sql) {
+ return new AJAXChatMySQLiQuery($sql, $this->_connectionID);
+ }
+
+ // Method to retrieve the current DataBase name:
+ function getName() {
+ return $this->_dbName;
+ }
+
+ // Method to retrieve the last inserted ID:
+ function getLastInsertedID() {
+ return $this->_connectionID->insert_id;
+ }
+
+}
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/class/AJAXChatMySQLiQuery.php b/library/ajaxchat/chat/lib/class/AJAXChatMySQLiQuery.php
new file mode 100644
index 000000000..f81afd886
--- /dev/null
+++ b/library/ajaxchat/chat/lib/class/AJAXChatMySQLiQuery.php
@@ -0,0 +1,81 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+// Class to perform SQL (MySQLi) queries:
+class AJAXChatMySQLiQuery {
+
+ var $_connectionID;
+ var $_sql = '';
+ var $_result = 0;
+ var $_errno = 0;
+ var $_error = '';
+
+ // Constructor:
+ function __construct($sql, $connectionID) {
+ $this->_sql = trim($sql);
+ $this->_connectionID = $connectionID;
+ $this->_result = $this->_connectionID->query($this->_sql);
+ if(!$this->_result) {
+ $this->_errno = $this->_connectionID->errno;
+ $this->_error = $this->_connectionID->error;
+ }
+ }
+
+ // Returns true if an error occured:
+ function error() {
+ // Returns true if the Result-ID is valid:
+ return !(bool)($this->_result);
+ }
+
+ // Returns an Error-String:
+ function getError() {
+ if($this->error()) {
+ $str = 'Query: ' .$this->_sql ."\n";
+ $str .= 'Error-Report: ' .$this->_error."\n";
+ $str .= 'Error-Code: '.$this->_errno;
+ } else {
+ $str = "No errors.";
+ }
+ return $str;
+ }
+
+ // Returns the content:
+ function fetch() {
+ if($this->error()) {
+ return null;
+ } else {
+ return $this->_result->fetch_assoc();
+ }
+ }
+
+ // Returns the number of rows (SELECT or SHOW):
+ function numRows() {
+ if($this->error()) {
+ return null;
+ } else {
+ return $this->_result->num_rows;
+ }
+ }
+
+ // Returns the number of affected rows (INSERT, UPDATE, REPLACE or DELETE):
+ function affectedRows() {
+ if($this->error()) {
+ return null;
+ } else {
+ return $this->_connectionID->affected_rows;
+ }
+ }
+
+ // Frees the memory:
+ function free() {
+ $this->_result->free();
+ }
+
+}
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/class/AJAXChatString.php b/library/ajaxchat/chat/lib/class/AJAXChatString.php
new file mode 100644
index 000000000..8997da5ea
--- /dev/null
+++ b/library/ajaxchat/chat/lib/class/AJAXChatString.php
@@ -0,0 +1,37 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+// Class to provide multibyte enabled string methods
+class AJAXChatString {
+
+ public static function subString($str, $start=0, $length=null, $encoding='UTF-8') {
+ if($length === null) {
+ $length = AJAXChatString::stringLength($str);
+ }
+ if(function_exists('mb_substr')) {
+ return mb_substr($str, $start, $length, $encoding);
+ } else if(function_exists('iconv_substr')) {
+ return iconv_substr($str, $start, $length, $encoding);
+ } else {
+ return substr($str, $start, $length);
+ }
+ }
+
+ public static function stringLength($str, $encoding='UTF-8') {
+ if(function_exists('mb_strlen')) {
+ return mb_strlen($str, $encoding);
+ } else if(function_exists('iconv_strlen')) {
+ return iconv_strlen($str, $encoding);
+ } else {
+ return strlen($str);
+ }
+ }
+
+}
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/class/AJAXChatTemplate.php b/library/ajaxchat/chat/lib/class/AJAXChatTemplate.php
new file mode 100644
index 000000000..16e53a7e6
--- /dev/null
+++ b/library/ajaxchat/chat/lib/class/AJAXChatTemplate.php
@@ -0,0 +1,329 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+// Class to handle HTML templates
+class AJAXChatTemplate {
+
+ var $ajaxChat;
+ var $_regExpTemplateTags;
+ var $_templateFile;
+ var $_contentType;
+ var $_content;
+ var $_parsedContent;
+
+ // Constructor:
+ function __construct(&$ajaxChat, $templateFile, $contentType=null) {
+ $this->ajaxChat = $ajaxChat;
+ $this->_regExpTemplateTags = '/\[(\w+?)(?:(?:\/)|(?:\](.+?)\[\/\1))\]/s';
+ $this->_templateFile = $templateFile;
+ $this->_contentType = $contentType;
+ }
+
+ function getParsedContent() {
+ if(!$this->_parsedContent) {
+ $this->parseContent();
+ }
+ return $this->_parsedContent;
+ }
+
+ function getContent() {
+ if(!$this->_content) {
+ $this->_content = AJAXChatFileSystem::getFileContents($this->_templateFile);
+ }
+ return $this->_content;
+ }
+
+ function parseContent() {
+ $this->_parsedContent = $this->getContent();
+
+ // Remove the XML declaration if the content-type is not xml:
+ if($this->_contentType && (strpos($this->_contentType,'xml') === false)) {
+ $doctypeStart = strpos($this->_parsedContent, '<!DOCTYPE ');
+ if($doctypeStart !== false) {
+ // Removing the XML declaration (in front of the document type) prevents IE<7 to go into "Quirks mode":
+ $this->_parsedContent = substr($this->_parsedContent, $doctypeStart);
+ }
+ }
+
+ // Replace template tags ([TAG/] and [TAG]content[/TAG]) and return parsed template content:
+ $this->_parsedContent = preg_replace_callback($this->_regExpTemplateTags, array($this, 'replaceTemplateTags'), $this->_parsedContent);
+ }
+
+ function replaceTemplateTags($tagData) {
+ switch($tagData[1]) {
+ case 'AJAX_CHAT_URL':
+ return $this->ajaxChat->htmlEncode($this->ajaxChat->getChatURL());
+
+ case 'LANG':
+ return $this->ajaxChat->htmlEncode($this->ajaxChat->getLang((isset($tagData[2]) ? $tagData[2] : null)));
+ case 'LANG_CODE':
+ return $this->ajaxChat->getLangCode();
+
+ case 'BASE_DIRECTION':
+ return $this->getBaseDirectionAttribute();
+
+ case 'CONTENT_ENCODING':
+ return $this->ajaxChat->getConfig('contentEncoding');
+
+ case 'CONTENT_TYPE':
+ return $this->_contentType;
+
+ case 'LOGIN_URL':
+ return ($this->ajaxChat->getRequestVar('view') == 'logs') ? './?view=logs' : './';
+
+ case 'USER_NAME_MAX_LENGTH':
+ return $this->ajaxChat->getConfig('userNameMaxLength');
+ case 'MESSAGE_TEXT_MAX_LENGTH':
+ return $this->ajaxChat->getConfig('messageTextMaxLength');
+
+ case 'LOGIN_CHANNEL_ID':
+ return $this->ajaxChat->getValidRequestChannelID();
+
+ case 'SESSION_NAME':
+ return $this->ajaxChat->getConfig('sessionName');
+
+ case 'COOKIE_EXPIRATION':
+ return $this->ajaxChat->getConfig('sessionCookieLifeTime');
+ case 'COOKIE_PATH':
+ return $this->ajaxChat->getConfig('sessionCookiePath');
+ case 'COOKIE_DOMAIN':
+ return $this->ajaxChat->getConfig('sessionCookieDomain');
+ case 'COOKIE_SECURE':
+ return $this->ajaxChat->getConfig('sessionCookieSecure');
+
+ case 'CHAT_BOT_NAME':
+ return rawurlencode($this->ajaxChat->getConfig('chatBotName'));
+ case 'CHAT_BOT_ID':
+ return $this->ajaxChat->getConfig('chatBotID');
+
+ case 'ALLOW_USER_MESSAGE_DELETE':
+ if($this->ajaxChat->getConfig('allowUserMessageDelete'))
+ return 1;
+ else
+ return 0;
+
+ case 'INACTIVE_TIMEOUT':
+ return $this->ajaxChat->getConfig('inactiveTimeout');
+
+ case 'PRIVATE_CHANNEL_DIFF':
+ return $this->ajaxChat->getConfig('privateChannelDiff');
+ case 'PRIVATE_MESSAGE_DIFF':
+ return $this->ajaxChat->getConfig('privateMessageDiff');
+
+ case 'SHOW_CHANNEL_MESSAGES':
+ if($this->ajaxChat->getConfig('showChannelMessages'))
+ return 1;
+ else
+ return 0;
+
+ case 'SOCKET_SERVER_ENABLED':
+ if($this->ajaxChat->getConfig('socketServerEnabled'))
+ return 1;
+ else
+ return 0;
+
+ case 'SOCKET_SERVER_HOST':
+ if($this->ajaxChat->getConfig('socketServerHost')) {
+ $socketServerHost = $this->ajaxChat->getConfig('socketServerHost');
+ } else {
+ $socketServerHost = (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']);
+ }
+ return rawurlencode($socketServerHost);
+
+ case 'SOCKET_SERVER_PORT':
+ return $this->ajaxChat->getConfig('socketServerPort');
+
+ case 'SOCKET_SERVER_CHAT_ID':
+ return $this->ajaxChat->getConfig('socketServerChatID');
+
+ case 'STYLE_SHEETS':
+ return $this->getStyleSheetLinkTags();
+
+ case 'CHANNEL_OPTIONS':
+ return $this->getChannelOptionTags();
+ case 'STYLE_OPTIONS':
+ return $this->getStyleOptionTags();
+ case 'LANGUAGE_OPTIONS':
+ return $this->getLanguageOptionTags();
+
+ case 'ERROR_MESSAGES':
+ return $this->getErrorMessageTags();
+
+ case 'LOGS_CHANNEL_OPTIONS':
+ return $this->getLogsChannelOptionTags();
+ case 'LOGS_YEAR_OPTIONS':
+ return $this->getLogsYearOptionTags();
+ case 'LOGS_MONTH_OPTIONS':
+ return $this->getLogsMonthOptionTags();
+ case 'LOGS_DAY_OPTIONS':
+ return $this->getLogsDayOptionTags();
+ case 'LOGS_HOUR_OPTIONS':
+ return $this->getLogsHourOptionTags();
+ case 'CLASS_WRITEABLE':
+ $userdata = $this->ajaxChat->getValidLoginUserData();
+ $guestwrite = $this->ajaxChat->getConfig('allowGuestWrite');
+ if ($userdata['userRole'] === AJAX_CHAT_GUEST && $guestwrite === false)
+ return 'write_forbidden';
+ else
+ return 'write_allowed';
+
+ default:
+ return $this->ajaxChat->replaceCustomTemplateTags($tagData[1], (isset($tagData[2]) ? $tagData[2] : null));
+ }
+ }
+
+ // Function to display alternating table row colors:
+ function alternateRow($rowOdd='rowOdd', $rowEven='rowEven') {
+ static $i;
+ $i += 1;
+ if($i % 2 == 0) {
+ return $rowEven;
+ } else {
+ return $rowOdd;
+ }
+ }
+
+ function getBaseDirectionAttribute() {
+ $langCodeParts = explode('-', $this->ajaxChat->getLangCode());
+ switch($langCodeParts[0]) {
+ case 'ar':
+ case 'fa':
+ case 'he':
+ return 'rtl';
+ default:
+ return 'ltr';
+ }
+ }
+
+ function getStyleSheetLinkTags() {
+ $styleSheets = '';
+ foreach($this->ajaxChat->getConfig('styleAvailable') as $style) {
+ $alternate = ($style == $this->ajaxChat->getConfig('styleDefault')) ? '' : 'alternate ';
+ $styleSheets .= '<link rel="'.$alternate.'stylesheet" type="text/css" href="css/'.rawurlencode($style).'.css" title="'.$this->ajaxChat->htmlEncode($style).'"/>';
+ }
+ return $styleSheets;
+ }
+
+ function getChannelOptionTags() {
+ $channelOptions = '';
+ $channelSelected = false;
+ foreach($this->ajaxChat->getChannels() as $name=>$id) {
+ if($this->ajaxChat->isLoggedIn() && $this->ajaxChat->getChannel()) {
+ $selected = ($id == $this->ajaxChat->getChannel()) ? ' selected="selected"' : '';
+ } else {
+ $selected = ($id == $this->ajaxChat->getConfig('defaultChannelID')) ? ' selected="selected"' : '';
+ }
+ if($selected) {
+ $channelSelected = true;
+ }
+ $channelOptions .= '<option value="'.$this->ajaxChat->htmlEncode($name).'"'.$selected.'>'.$this->ajaxChat->htmlEncode($name).'</option>';
+ }
+ if($this->ajaxChat->isLoggedIn() && $this->ajaxChat->isAllowedToCreatePrivateChannel()) {
+ // Add the private channel of the user to the options list:
+ if(!$channelSelected && $this->ajaxChat->getPrivateChannelID() == $this->ajaxChat->getChannel()) {
+ $selected = ' selected="selected"';
+ $channelSelected = true;
+ } else {
+ $selected = '';
+ }
+ $privateChannelName = $this->ajaxChat->getPrivateChannelName();
+ $channelOptions .= '<option value="'.$this->ajaxChat->htmlEncode($privateChannelName).'"'.$selected.'>'.$this->ajaxChat->htmlEncode($privateChannelName).'</option>';
+ }
+ // If current channel is not in the list, try to retrieve the channelName:
+ if(!$channelSelected) {
+ $channelName = $this->ajaxChat->getChannelName();
+ if($channelName !== null) {
+ $channelOptions .= '<option value="'.$this->ajaxChat->htmlEncode($channelName).'" selected="selected">'.$this->ajaxChat->htmlEncode($channelName).'</option>';
+ } else {
+ // Show an empty selection:
+ $channelOptions .= '<option value="" selected="selected">---</option>';
+ }
+ }
+ return $channelOptions;
+ }
+
+ function getStyleOptionTags() {
+ $styleOptions = '';
+ foreach($this->ajaxChat->getConfig('styleAvailable') as $style) {
+ $selected = ($style == $this->ajaxChat->getConfig('styleDefault')) ? ' selected="selected"' : '';
+ $styleOptions .= '<option value="'.$this->ajaxChat->htmlEncode($style).'"'.$selected.'>'.$this->ajaxChat->htmlEncode($style).'</option>';
+ }
+ return $styleOptions;
+ }
+
+ function getLanguageOptionTags() {
+ $languageOptions = '';
+ $languageNames = $this->ajaxChat->getConfig('langNames');
+ foreach($this->ajaxChat->getConfig('langAvailable') as $langCode) {
+ $selected = ($langCode == $this->ajaxChat->getLangCode()) ? ' selected="selected"' : '';
+ $languageOptions .= '<option value="'.$this->ajaxChat->htmlEncode($langCode).'"'.$selected.'>'.$languageNames[$langCode].'</option>';
+ }
+ return $languageOptions;
+ }
+
+ function getErrorMessageTags() {
+ $errorMessages = '';
+ foreach($this->ajaxChat->getInfoMessages('error') as $error) {
+ $errorMessages .= '<div>'.$this->ajaxChat->htmlEncode($this->ajaxChat->getLang($error)).'</div>';
+ }
+ return $errorMessages;
+ }
+
+ function getLogsChannelOptionTags() {
+ $channelOptions = '';
+ $channelOptions .= '<option value="-3">------</option>';
+ foreach($this->ajaxChat->getChannels() as $key=>$value) {
+ if($this->ajaxChat->getUserRole() != AJAX_CHAT_ADMIN && $this->ajaxChat->getConfig('logsUserAccessChannelList') && !in_array($value, $this->ajaxChat->getConfig('logsUserAccessChannelList'))) {
+ continue;
+ }
+ $channelOptions .= '<option value="'.$value.'">'.$this->ajaxChat->htmlEncode($key).'</option>';
+ }
+ $channelOptions .= '<option value="-1">'.$this->ajaxChat->htmlEncode($this->ajaxChat->getLang('logsPrivateChannels')).'</option>';
+ $channelOptions .= '<option value="-2">'.$this->ajaxChat->htmlEncode($this->ajaxChat->getLang('logsPrivateMessages')).'</option>';
+ return $channelOptions;
+ }
+
+ function getLogsYearOptionTags() {
+ $yearOptions = '';
+ $yearOptions .= '<option value="-1">----</option>';
+ for($year=date('Y'); $year>=$this->ajaxChat->getConfig('logsFirstYear'); $year--) {
+ $yearOptions .= '<option value="'.$year.'">'.$year.'</option>';
+ }
+ return $yearOptions;
+ }
+
+ function getLogsMonthOptionTags() {
+ $monthOptions = '';
+ $monthOptions .= '<option value="-1">--</option>';
+ for($month=1; $month<=12; $month++) {
+ $monthOptions .= '<option value="'.$month.'">'.sprintf("%02d", $month).'</option>';
+ }
+ return $monthOptions;
+ }
+
+ function getLogsDayOptionTags() {
+ $dayOptions = '';
+ $dayOptions .= '<option value="-1">--</option>';
+ for($day=1; $day<=31; $day++) {
+ $dayOptions .= '<option value="'.$day.'">'.sprintf("%02d", $day).'</option>';
+ }
+ return $dayOptions;
+ }
+
+ function getLogsHourOptionTags() {
+ $hourOptions = '';
+ $hourOptions .= '<option value="-1">-----</option>';
+ for($hour=0; $hour<=23; $hour++) {
+ $hourOptions .= '<option value="'.$hour.'">'.sprintf("%02d", $hour).':00</option>';
+ }
+ return $hourOptions;
+ }
+
+}
+?>
diff --git a/library/ajaxchat/chat/lib/class/CustomAJAXChat.php b/library/ajaxchat/chat/lib/class/CustomAJAXChat.php
new file mode 100644
index 000000000..a18e64069
--- /dev/null
+++ b/library/ajaxchat/chat/lib/class/CustomAJAXChat.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+class CustomAJAXChat extends AJAXChat {
+
+ // Returns an associative array containing userName, userID and userRole
+ // Returns null if login is invalid
+ function getValidLoginUserData() {
+
+ $customUsers = $this->getCustomUsers();
+
+ if($this->getRequestVar('password')) {
+ // Check if we have a valid registered user:
+
+ $userName = $this->getRequestVar('userName');
+ $userName = $this->convertEncoding($userName, $this->getConfig('contentEncoding'), $this->getConfig('sourceEncoding'));
+
+ $password = $this->getRequestVar('password');
+ $password = $this->convertEncoding($password, $this->getConfig('contentEncoding'), $this->getConfig('sourceEncoding'));
+
+ foreach($customUsers as $key=>$value) {
+ if(($value['userName'] == $userName) && ($value['password'] == $password)) {
+ $userData = array();
+ $userData['userID'] = $key;
+ $userData['userName'] = $this->trimUserName($value['userName']);
+ $userData['userRole'] = $value['userRole'];
+ return $userData;
+ }
+ }
+
+ return null;
+ } else {
+ // Guest users:
+ return $this->getGuestUser();
+ }
+ }
+
+ // Store the channels the current user has access to
+ // Make sure channel names don't contain any whitespace
+ function &getChannels() {
+ if($this->_channels === null) {
+ $this->_channels = array();
+
+ $customUsers = $this->getCustomUsers();
+
+ // Get the channels, the user has access to:
+ if($this->getUserRole() == AJAX_CHAT_GUEST) {
+ $validChannels = $customUsers[0]['channels'];
+ } else {
+ $validChannels = $customUsers[$this->getUserID()]['channels'];
+ }
+
+ // Add the valid channels to the channel list (the defaultChannelID is always valid):
+ foreach($this->getAllChannels() as $key=>$value) {
+ if ($value == $this->getConfig('defaultChannelID')) {
+ $this->_channels[$key] = $value;
+ continue;
+ }
+ // Check if we have to limit the available channels:
+ if($this->getConfig('limitChannelList') && !in_array($value, $this->getConfig('limitChannelList'))) {
+ continue;
+ }
+ if(in_array($value, $validChannels)) {
+ $this->_channels[$key] = $value;
+ }
+ }
+ }
+ return $this->_channels;
+ }
+
+ // Store all existing channels
+ // Make sure channel names don't contain any whitespace
+ function &getAllChannels() {
+ if($this->_allChannels === null) {
+ // Get all existing channels:
+ $customChannels = $this->getCustomChannels();
+
+ $defaultChannelFound = false;
+
+ foreach($customChannels as $name=>$id) {
+ $this->_allChannels[$this->trimChannelName($name)] = $id;
+ if($id == $this->getConfig('defaultChannelID')) {
+ $defaultChannelFound = true;
+ }
+ }
+
+ if(!$defaultChannelFound) {
+ // Add the default channel as first array element to the channel list
+ // First remove it in case it appeard under a different ID
+ unset($this->_allChannels[$this->getConfig('defaultChannelName')]);
+ $this->_allChannels = array_merge(
+ array(
+ $this->trimChannelName($this->getConfig('defaultChannelName'))=>$this->getConfig('defaultChannelID')
+ ),
+ $this->_allChannels
+ );
+ }
+ }
+ return $this->_allChannels;
+ }
+
+ function &getCustomUsers() {
+ // List containing the registered chat users:
+ $users = null;
+ require(AJAX_CHAT_PATH.'lib/data/users.php');
+ return $users;
+ }
+
+ function getCustomChannels() {
+ // List containing the custom channels:
+ $channels = null;
+ require(AJAX_CHAT_PATH.'lib/data/channels.php');
+ // Channel array structure should be:
+ // ChannelName => ChannelID
+ return array_flip($channels);
+ }
+
+} \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/class/CustomAJAXChatInterface.php b/library/ajaxchat/chat/lib/class/CustomAJAXChatInterface.php
new file mode 100644
index 000000000..a950739c5
--- /dev/null
+++ b/library/ajaxchat/chat/lib/class/CustomAJAXChatInterface.php
@@ -0,0 +1,21 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+class CustomAJAXChatInterface extends CustomAJAXChat {
+
+ function initialize() {
+ // Initialize configuration settings:
+ $this->initConfig();
+
+ // Initialize the DataBase connection:
+ $this->initDataBaseConnection();
+ }
+
+}
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/class/CustomAJAXChatShoutBox.php b/library/ajaxchat/chat/lib/class/CustomAJAXChatShoutBox.php
new file mode 100644
index 000000000..c014d639e
--- /dev/null
+++ b/library/ajaxchat/chat/lib/class/CustomAJAXChatShoutBox.php
@@ -0,0 +1,25 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+class CustomAJAXChatShoutBox extends CustomAJAXChat {
+
+ function initialize() {
+ // Initialize configuration settings:
+ $this->initConfig();
+ }
+
+ function getShoutBoxContent() {
+ $template = new AJAXChatTemplate($this, AJAX_CHAT_PATH.'lib/template/shoutbox.html');
+
+ // Return parsed template content:
+ return $template->getParsedContent();
+ }
+
+}
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/classes.php b/library/ajaxchat/chat/lib/classes.php
new file mode 100644
index 000000000..ff1dee265
--- /dev/null
+++ b/library/ajaxchat/chat/lib/classes.php
@@ -0,0 +1,26 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+// Include Class libraries:
+require(AJAX_CHAT_PATH.'lib/class/AJAXChat.php');
+require(AJAX_CHAT_PATH.'lib/class/AJAXChatDataBase.php');
+require(AJAX_CHAT_PATH.'lib/class/AJAXChatMySQLDataBase.php');
+require(AJAX_CHAT_PATH.'lib/class/AJAXChatMySQLQuery.php');
+require(AJAX_CHAT_PATH.'lib/class/AJAXChatMySQLiDataBase.php');
+require(AJAX_CHAT_PATH.'lib/class/AJAXChatMySQLiQuery.php');
+require(AJAX_CHAT_PATH.'lib/class/AJAXChatEncoding.php');
+require(AJAX_CHAT_PATH.'lib/class/AJAXChatString.php');
+require(AJAX_CHAT_PATH.'lib/class/AJAXChatFileSystem.php');
+require(AJAX_CHAT_PATH.'lib/class/AJAXChatHTTPHeader.php');
+require(AJAX_CHAT_PATH.'lib/class/AJAXChatLanguage.php');
+require(AJAX_CHAT_PATH.'lib/class/AJAXChatTemplate.php');
+require(AJAX_CHAT_PATH.'lib/class/CustomAJAXChat.php');
+require(AJAX_CHAT_PATH.'lib/class/CustomAJAXChatShoutBox.php');
+require(AJAX_CHAT_PATH.'lib/class/CustomAJAXChatInterface.php');
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/config.php.example b/library/ajaxchat/chat/lib/config.php.example
new file mode 100644
index 000000000..023adcdbb
--- /dev/null
+++ b/library/ajaxchat/chat/lib/config.php.example
@@ -0,0 +1,209 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+// Define AJAX Chat user roles:
+define('AJAX_CHAT_CHATBOT', 4);
+define('AJAX_CHAT_ADMIN', 3);
+define('AJAX_CHAT_MODERATOR', 2);
+define('AJAX_CHAT_USER', 1);
+define('AJAX_CHAT_GUEST', 0);
+
+// AJAX Chat config parameters:
+$config = array();
+
+// Database connection values:
+$config['dbConnection'] = array();
+// Database hostname:
+$config['dbConnection']['host'] = 'localhost';
+// Database username:
+$config['dbConnection']['user'] = 'root';
+// Database password:
+$config['dbConnection']['pass'] = '';
+// Database name:
+$config['dbConnection']['name'] = 'chat';
+// Database type:
+$config['dbConnection']['type'] = null;
+// Database link:
+$config['dbConnection']['link'] = null;
+
+// Database table names:
+$config['dbTableNames'] = array();
+$config['dbTableNames']['online'] = 'ajax_chat_online';
+$config['dbTableNames']['messages'] = 'ajax_chat_messages';
+$config['dbTableNames']['bans'] = 'ajax_chat_bans';
+$config['dbTableNames']['invitations'] = 'ajax_chat_invitations';
+
+// Available languages:
+$config['langAvailable'] = array(
+ 'ar','bg','ca','cy','cz','da','de','el','en','es','et','fa','fi','fr','gl','he','hr','hu','in','it','ja','ka','kr','mk','nl','nl-be','no','pl','pt-br','pt-pt','ro','ru','sk','sl','sr','sv','th','tr','uk','zh','zh-tw'
+);
+// Default language:
+$config['langDefault'] = 'en';
+// Language names (each languge code in available languages must have a display name assigned here):
+$config['langNames'] = array(
+ 'ar'=>'عربي', 'bg'=>'Български', 'ca'=>'Català', 'cy'=>'Cymraeg', 'cz'=>'Česky', 'da'=>'Dansk', 'de'=>'Deutsch', 'el'=>'Ελληνικα', 'en'=>'English',
+ 'es'=>'Español', 'et'=>'Eesti', 'fa'=>'فارسی', 'fi'=>'Suomi', 'fr'=>'Français', 'gl'=>'Galego', 'he'=>'עברית', 'hr' => 'Hrvatski', 'hu' => 'Magyar', 'in'=>'Bahasa Indonesia', 'it'=>'Italiano',
+ 'ja'=>'日本語','ka'=>'ქართული','kr'=>'한 글','mk'=>'Македонски', 'nl'=>'Nederlands', 'nl-be'=>'Nederlands (België)', 'no'=>'Norsk', 'pl'=> 'Polski', 'pt-br'=>'Português (Brasil)', 'pt-pt'=>'Português (Portugal)',
+ 'ro'=>'România', 'ru'=>'Русский', 'sk'=> 'Slovenčina', 'sl'=>'Slovensko', 'sr'=>'Srpski', 'sv'=> 'Svenska', 'th'=>'&#x0e20;&#x0e32;&#x0e29;&#x0e32;&#x0e44;&#x0e17;&#x0e22;',
+ 'tr'=>'Türkçe', 'uk'=>'Українська', 'zh'=>'中文 (简体)', 'zh-tw'=>'中文 (繁體)'
+);
+
+// Available styles:
+$config['styleAvailable'] = array('beige','black','grey','Oxygen','Lithium','Sulfur','Cobalt','Mercury','Uranium','Plum','prosilver','subblack2','subSilver','Core','MyBB','vBulletin');
+// Default style:
+$config['styleDefault'] = 'prosilver';
+
+// The encoding used for the XHTML content:
+$config['contentEncoding'] = 'UTF-8';
+// The encoding of the data source, like userNames and channelNames:
+$config['sourceEncoding'] = 'UTF-8';
+// The content-type of the XHTML page (e.g. "text/html", will be set dependent on browser capabilities if set to null):
+$config['contentType'] = null;
+
+// Session name used to identify the session cookie:
+$config['sessionName'] = 'ajax_chat';
+// Prefix added to every session key:
+$config['sessionKeyPrefix'] = 'ajaxChat';
+// The lifetime of the language, style and setting cookies in days:
+$config['sessionCookieLifeTime'] = 365;
+// The path of the cookies, '/' allows to read the cookies from all directories:
+$config['sessionCookiePath'] = '/';
+// The domain of the cookies, defaults to the hostname of the server if set to null:
+$config['sessionCookieDomain'] = null;
+// If enabled, cookies must be sent over secure (SSL/TLS encrypted) connections:
+$config['sessionCookieSecure'] = null;
+
+// Default channelName used together with the defaultChannelID if no channel with this ID exists:
+$config['defaultChannelName'] = 'Public';
+// ChannelID used when no channel is given:
+$config['defaultChannelID'] = 0;
+// Defines an array of channelIDs (e.g. array(0, 1)) to limit the number of available channels, will be ignored if set to null:
+$config['limitChannelList'] = null;
+
+// UserID plus this value are private channels (this is also the max userID and max channelID):
+$config['privateChannelDiff'] = 500000000;
+// UserID plus this value are used for private messages:
+$config['privateMessageDiff'] = 1000000000;
+
+// Enable/Disable private Channels:
+$config['allowPrivateChannels'] = true;
+// Enable/Disable private Messages:
+$config['allowPrivateMessages'] = true;
+
+// Private channels should be distinguished by either a prefix or a suffix or both (no whitespace):
+$config['privateChannelPrefix'] = '[';
+// Private channels should be distinguished by either a prefix or a suffix or both (no whitespace):
+$config['privateChannelSuffix'] = ']';
+
+// If enabled, users will be logged in automatically as guest users (if allowed), if not authenticated:
+$config['forceAutoLogin'] = false;
+
+// Defines if login/logout and channel enter/leave are displayed:
+$config['showChannelMessages'] = true;
+
+// If enabled, the chat will only be accessible for the admin:
+$config['chatClosed'] = false;
+// Defines the timezone offset in seconds (-12*60*60 to 12*60*60) - if null, the server timezone is used:
+$config['timeZoneOffset'] = null;
+// Defines the hour of the day the chat is opened (0 - closingHour):
+$config['openingHour'] = 0;
+// Defines the hour of the day the chat is closed (openingHour - 24):
+$config['closingHour'] = 24;
+// Defines the weekdays the chat is opened (0=Sunday to 6=Saturday):
+$config['openingWeekDays'] = array(0,1,2,3,4,5,6);
+
+// Enable/Disable guest logins:
+$config['allowGuestLogins'] = true;
+// Enable/Disable write access for guest users - if disabled, guest users may not write messages:
+$config['allowGuestWrite'] = true;
+// Allow/Disallow guest users to choose their own userName:
+$config['allowGuestUserName'] = true;
+// Guest users should be distinguished by either a prefix or a suffix or both (no whitespace):
+$config['guestUserPrefix'] = '(';
+// Guest users should be distinguished by either a prefix or a suffix or both (no whitespace):
+$config['guestUserSuffix'] = ')';
+// Guest userIDs may not be lower than this value (and not higher than privateChannelDiff):
+$config['minGuestUserID'] = 400000000;
+
+// Allow/Disallow users to change their userName (Nickname):
+$config['allowNickChange'] = true;
+// Changed userNames should be distinguished by either a prefix or a suffix or both (no whitespace):
+$config['changedNickPrefix'] = '(';
+// Changed userNames should be distinguished by either a prefix or a suffix or both (no whitespace):
+$config['changedNickSuffix'] = ')';
+
+// Allow/Disallow registered users to delete their own messages:
+$config['allowUserMessageDelete'] = true;
+
+// The userID used for ChatBot messages:
+$config['chatBotID'] = 2147483647;
+// The userName used for ChatBot messages
+$config['chatBotName'] = 'ChatBot';
+
+// Minutes until a user is declared inactive (last status update) - the minimum is 2 minutes:
+$config['inactiveTimeout'] = 2;
+// Interval in minutes to check for inactive users:
+$config['inactiveCheckInterval'] = 5;
+
+// Defines if messages are shown which have been sent before the user entered the channel:
+$config['requestMessagesPriorChannelEnter'] = true;
+// Defines an array of channelIDs (e.g. array(0, 1)) for which the previous setting is always true (will be ignored if set to null):
+$config['requestMessagesPriorChannelEnterList'] = null;
+// Max time difference in hours for messages to display on each request:
+$config['requestMessagesTimeDiff'] = 24;
+// Max number of messages to display on each request:
+$config['requestMessagesLimit'] = 10;
+
+// Max users in chat (does not affect moderators or admins):
+$config['maxUsersLoggedIn'] = 100;
+// Max userName length:
+$config['userNameMaxLength'] = 16;
+// Max messageText length:
+$config['messageTextMaxLength'] = 1040;
+// Defines the max number of messages a user may send per minute:
+$config['maxMessageRate'] = 20;
+
+// Defines the default time in minutes a user gets banned if kicked from a moderator without ban minutes parameter:
+$config['defaultBanTime'] = 5;
+
+// Argument that is given to the handleLogout JavaScript method:
+$config['logoutData'] = './?logout=true';
+
+// If true, checks if the user IP is the same when logged in:
+$config['ipCheck'] = true;
+
+// Defines the max time difference in hours for logs when no period or search condition is given:
+$config['logsRequestMessagesTimeDiff'] = 1;
+// Defines how many logs are returned on each logs request:
+$config['logsRequestMessagesLimit'] = 10;
+
+// Defines the earliest year used for the logs selection:
+$config['logsFirstYear'] = 2007;
+
+// Defines if old messages are purged from the database:
+$config['logsPurgeLogs'] = false;
+// Max time difference in days for old messages before they are purged from the database:
+$config['logsPurgeTimeDiff'] = 365;
+
+// Defines if registered users (including moderators) have access to the logs (admins are always granted access):
+$config['logsUserAccess'] = false;
+// Defines a list of channels (e.g. array(0, 1)) to limit the logs access for registered users, includes all channels the user has access to if set to null:
+$config['logsUserAccessChannelList'] = null;
+
+// Defines if the socket server is enabled:
+$config['socketServerEnabled'] = false;
+// Defines the hostname of the socket server used to connect from client side (the server hostname is used if set to null):
+$config['socketServerHost'] = null;
+// Defines the IP of the socket server used to connect from server side to broadcast update messages:
+$config['socketServerIP'] = '127.0.0.1';
+// Defines the port of the socket server:
+$config['socketServerPort'] = 1935;
+// This ID can be used to distinguish between different chat installations using the same socket server:
+$config['socketServerChatID'] = 0;
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/custom.php b/library/ajaxchat/chat/lib/custom.php
new file mode 100644
index 000000000..a9d08841b
--- /dev/null
+++ b/library/ajaxchat/chat/lib/custom.php
@@ -0,0 +1,11 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+// Include custom libraries and initialization code here
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/data/channels.php b/library/ajaxchat/chat/lib/data/channels.php
new file mode 100644
index 000000000..8688e5e7b
--- /dev/null
+++ b/library/ajaxchat/chat/lib/data/channels.php
@@ -0,0 +1,16 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+// List containing the custom channels:
+$channels = array();
+
+// Sample channel list:
+$channels[0] = 'Public';
+$channels[1] = 'Private';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/data/users.php b/library/ajaxchat/chat/lib/data/users.php
new file mode 100644
index 000000000..52ca77e50
--- /dev/null
+++ b/library/ajaxchat/chat/lib/data/users.php
@@ -0,0 +1,40 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+// List containing the registered chat users:
+$users = array();
+
+// Default guest user (don't delete this one):
+$users[0] = array();
+$users[0]['userRole'] = AJAX_CHAT_GUEST;
+$users[0]['userName'] = null;
+$users[0]['password'] = null;
+$users[0]['channels'] = array(0);
+
+// Sample admin user:
+$users[1] = array();
+$users[1]['userRole'] = AJAX_CHAT_ADMIN;
+$users[1]['userName'] = 'admin';
+$users[1]['password'] = 'admin';
+$users[1]['channels'] = array(0,1);
+
+// Sample moderator user:
+$users[2] = array();
+$users[2]['userRole'] = AJAX_CHAT_MODERATOR;
+$users[2]['userName'] = 'moderator';
+$users[2]['password'] = 'moderator';
+$users[2]['channels'] = array(0,1);
+
+// Sample registered user:
+$users[3] = array();
+$users[3]['userRole'] = AJAX_CHAT_USER;
+$users[3]['userName'] = 'user';
+$users[3]['password'] = 'user';
+$users[3]['channels'] = array(0,1);
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/ar.php b/library/ajaxchat/chat/lib/lang/ar.php
new file mode 100644
index 000000000..af9c8305e
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/ar.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author pepotiger (www.dd4bb.com)
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'اسم المستخدم';
+$lang['password'] = 'كلمة المرور';
+$lang['login'] = 'دخول';
+$lang['logout'] = 'خروج';
+$lang['channel'] = 'الغرفة';
+$lang['style'] = 'الشكل';
+$lang['language'] = 'اللغة';
+$lang['inputLineBreak'] = 'Press SHIFT+ENTER to input a line break';
+$lang['messageSubmit'] = 'ارسل';
+$lang['registeredUsers'] = 'الأعضاء المسجلين';
+$lang['onlineUsers'] = 'الأعضاء المتواجدين';
+$lang['toggleAutoScroll'] = 'Autoscroll on/off';
+$lang['toggleAudio'] = 'Sound on/off';
+$lang['toggleHelp'] = 'Show/hide help';
+$lang['toggleSettings'] = 'Show/hide settings';
+$lang['toggleOnlineList'] = 'Show/hide online list';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'اقتباس';
+$lang['bbCodeLabelCode'] = 'كود';
+$lang['bbCodeLabelURL'] = 'رابط';
+$lang['bbCodeLabelImg'] = 'Image';
+$lang['bbCodeLabelColor'] = 'لون الخط';
+$lang['bbCodeTitleBold'] = 'نص عريض: [b]نص[/b]';
+$lang['bbCodeTitleItalic'] = 'نص مائل: [i]نص[/i]';
+$lang['bbCodeTitleUnderline'] = 'نص تحته خط: [u]نص[/u]';
+$lang['bbCodeTitleQuote'] = 'نص مقتبس: [quote]نص[/quote] او [quote=الكاتب]نص[/quote]';
+$lang['bbCodeTitleCode'] = 'عرض الكود: [code]كود[/code]';
+$lang['bbCodeTitleURL'] = 'ادحال رابط: [url]http://example.org[/url] او [url=http://example.org]نص[/url]';
+$lang['bbCodeTitleImg'] = 'Insert image: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'لون النص: [color=red]نص[/color]';
+$lang['help'] = 'مساعدة';
+$lang['helpItemDescJoin'] = 'دخول الغرفة:';
+$lang['helpItemCodeJoin'] = '/join اسم الغرفة';
+$lang['helpItemDescJoinCreate'] = 'انشاء غرفة خاصة (للمسجلين فقط):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'دعوة احد (لغرفة خاصة مثلا):';
+$lang['helpItemCodeInvite'] = '/invite username';
+$lang['helpItemDescUninvite'] = 'الغاء الدعوة:';
+$lang['helpItemCodeUninvite'] = '/uninvite Username';
+$lang['helpItemDescLogout'] = 'خروج:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'رسالة خاصة:';
+$lang['helpItemCodePrivateMessage'] = '/msg Username نص';
+$lang['helpItemDescQueryOpen'] = 'فتح نافذة خاصة:';
+$lang['helpItemCodeQueryOpen'] = '/query Username';
+$lang['helpItemDescQueryClose'] = 'غلق النافذة الخاصة:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'وصف الحدث:';
+$lang['helpItemCodeAction'] = '/action نص';
+$lang['helpItemDescDescribe'] = 'وصف حدث برسالة خاصة:';
+$lang['helpItemCodeDescribe'] = '/describe Username نص';
+$lang['helpItemDescIgnore'] = 'تجاهل/قبول رسائل خاصة من:';
+$lang['helpItemCodeIgnore'] = '/ignore Username';
+$lang['helpItemDescIgnoreList'] = 'الأعضاء المتجاهلين:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Display user channel:';
+$lang['helpItemCodeWhereis'] = '/whereis Username';
+$lang['helpItemDescKick'] = 'حظر مستخدمين (للمديرين فقط):';
+$lang['helpItemCodeKick'] = '/kick Username [دقائق الحظر]';
+$lang['helpItemDescUnban'] = 'الغاء حظر عضو (للمديرين فقط):';
+$lang['helpItemCodeUnban'] = '/unban Username';
+$lang['helpItemDescBans'] = 'الأعضاء المحظورين (للمديرين فقط):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'عرض الأى بى للمستخدم (المديرين فقط):';
+$lang['helpItemCodeWhois'] = '/whois Username';
+$lang['helpItemDescWho'] = 'الأعضاء المتواجدين:';
+$lang['helpItemCodeWho'] = '/who [Channelname]';
+$lang['helpItemDescList'] = 'القنوات المتوافرة:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Roll dice:';
+$lang['helpItemCodeRoll'] = '/roll [number]d[sides]';
+$lang['helpItemDescNick'] = 'Change username:';
+$lang['helpItemCodeNick'] = '/nick Username';
+$lang['settings'] = 'Settings';
+$lang['settingsBBCode'] = 'Enable BBCode:';
+$lang['settingsBBCodeImages'] = 'Enable image BBCode:';
+$lang['settingsBBCodeColors'] = 'Enable font color BBCode:';
+$lang['settingsHyperLinks'] = 'Enable hyperlinks:';
+$lang['settingsLineBreaks'] = 'Enable line breaks:';
+$lang['settingsEmoticons'] = 'Enable emoticons:';
+$lang['settingsAutoFocus'] = 'Automatically set the focus on the input field:';
+$lang['settingsMaxMessages'] = 'Maximum number of messages in the chatlist:';
+$lang['settingsWordWrap'] = 'Enable wrapping of long words:';
+$lang['settingsMaxWordLength'] = 'Maximum length of a word before it gets wrapped:';
+$lang['settingsDateFormat'] = 'Format of date and time display:';
+$lang['settingsPersistFontColor'] = 'Persist font color:';
+$lang['settingsAudioVolume'] = 'Sound Volume:';
+$lang['settingsSoundReceive'] = 'Sound for incoming messages:';
+$lang['settingsSoundSend'] = 'Sound for outgoing messages:';
+$lang['settingsSoundEnter'] = 'Sound for login and channel enter messages:';
+$lang['settingsSoundLeave'] = 'Sound for logout and channel leave messages:';
+$lang['settingsSoundChatBot'] = 'Sound for chatbot messages:';
+$lang['settingsSoundError'] = 'Sound for error messages:';
+$lang['settingsBlink'] = 'Blink window title on new messages:';
+$lang['settingsBlinkInterval'] = 'Blink interval in milliseconds:';
+$lang['settingsBlinkIntervalNumber'] = 'Number of blink intervals:';
+$lang['playSelectedSound'] = 'Play selected sound';
+$lang['requiresJavaScript'] = 'يجب دعم الجافة سكريبت لهذا الشات.';
+$lang['errorInvalidUser'] = 'اسم مستخدم خطأ.';
+$lang['errorUserInUse'] = 'اسم المستخدم مستخدم.';
+$lang['errorBanned'] = 'المستخدم او عنوان الأى بى محظور.';
+$lang['errorMaxUsersLoggedIn'] = 'الشات به الحد الأقصى من الأعضاء المسجلين.';
+$lang['errorChatClosed'] = 'الشات مغلق حاليا.';
+$lang['logsTitle'] = 'سحل الشات';
+$lang['logsDate'] = 'التاريخ';
+$lang['logsTime'] = 'الوقت';
+$lang['logsSearch'] = 'بحث';
+$lang['logsPrivateChannels'] = 'القنوات الخاصة';
+$lang['logsPrivateMessages'] = 'الرسائل الخاصة';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/bg.php b/library/ajaxchat/chat/lib/lang/bg.php
new file mode 100644
index 000000000..46d6af163
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/bg.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Borislav Manolov
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Потребителско име';
+$lang['password'] = 'Парола';
+$lang['login'] = 'Вход';
+$lang['logout'] = 'Изход';
+$lang['channel'] = 'Канал';
+$lang['style'] = 'Облик';
+$lang['language'] = 'Език';
+$lang['inputLineBreak'] = 'Натиснете SHIFT+ENTER, за да вмъкнете нов ред';
+$lang['messageSubmit'] = 'Пращане';
+$lang['registeredUsers'] = 'Регистрирани потребители';
+$lang['onlineUsers'] = 'Потребители на линия';
+$lang['toggleAutoScroll'] = 'Автопрелистване вкл/изкл';
+$lang['toggleAudio'] = 'Звук вкл/изкл';
+$lang['toggleHelp'] = 'Показване/скриване на помощта';
+$lang['toggleSettings'] = 'Показване/скриване на настройките';
+$lang['toggleOnlineList'] = 'Показване/скриване на списъка с потребителите';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Цитат';
+$lang['bbCodeLabelCode'] = 'Код';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Картинка';
+$lang['bbCodeLabelColor'] = 'Цвят на шрифта';
+$lang['bbCodeTitleBold'] = 'Получер текст: [b]текст[/b]';
+$lang['bbCodeTitleItalic'] = 'Курсивен текст: [i]текст[/i]';
+$lang['bbCodeTitleUnderline'] = 'Подчертан текст: [u]текст[/u]';
+$lang['bbCodeTitleQuote'] = 'Цитиран текст: [quote]текст[/quote] или [quote=Автор]текст[/quote]';
+$lang['bbCodeTitleCode'] = 'Показване на код: [code]код[/code]';
+$lang['bbCodeTitleURL'] = 'URL: [url]http://example.org[/url] или [url=http://example.org]текст[/url]';
+$lang['bbCodeTitleImg'] = 'Вмъкване на картинка: [img]http://primer.org/kartinka.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Цвят на шрифта: [color=red]текст[/color]';
+$lang['help'] = 'Помощ';
+$lang['helpItemDescJoin'] = 'Присъединяване към канал:';
+$lang['helpItemCodeJoin'] = '/join име_на_канал';
+$lang['helpItemDescJoinCreate'] = 'Създаване на лична стая (само за регистрирани потребители):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Покана на потребител (напр. в лична стая):';
+$lang['helpItemCodeInvite'] = '/invite Потребителско_име';
+$lang['helpItemDescUninvite'] = 'Отказване на покана:';
+$lang['helpItemCodeUninvite'] = '/uninvite Потребителско_име';
+$lang['helpItemDescLogout'] = 'Изход от чата:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Лично съобщение:';
+$lang['helpItemCodePrivateMessage'] = '/msg Потребителско_име Текст';
+$lang['helpItemDescQueryOpen'] = 'Отваряне на личен канал:';
+$lang['helpItemCodeQueryOpen'] = '/query Потребителско_име';
+$lang['helpItemDescQueryClose'] = 'Затваряне на личен канал:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Описание на действие:';
+$lang['helpItemCodeAction'] = '/action Текст';
+$lang['helpItemDescDescribe'] = 'Описание на действието в лично съобщение:';
+$lang['helpItemCodeDescribe'] = '/describe Потребителско_име Текст';
+$lang['helpItemDescIgnore'] = 'Пренебрегване/приемане на съобщения от потребител:';
+$lang['helpItemCodeIgnore'] = '/ignore Потребителско_име';
+$lang['helpItemDescIgnoreList'] = 'Преглед на пренебрегнатите потребители:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Показване на потребителския канал:';
+$lang['helpItemCodeWhereis'] = '/whereis Потребителско_име';
+$lang['helpItemDescKick'] = 'Изритване на потребител (само за модератори):';
+$lang['helpItemCodeKick'] = '/kick Потребителско_име [брой минути]';
+$lang['helpItemDescUnban'] = 'Изгонване на потребител (само за модератори):';
+$lang['helpItemCodeUnban'] = '/unban Потребителско_име';
+$lang['helpItemDescBans'] = 'Преглед на изгонените потребители (само за модератори):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Преглед на айпи адреса на потребител (само за модератори):';
+$lang['helpItemCodeWhois'] = '/whois Потребителско_име';
+$lang['helpItemDescWho'] = 'Преглед на потребителите на линия:';
+$lang['helpItemCodeWho'] = '/who [Име_на_канал]';
+$lang['helpItemDescList'] = 'Преглед на наличните канали:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Хвърляне на зар:';
+$lang['helpItemCodeRoll'] = '/roll [пъти]d[страни]';
+$lang['helpItemDescNick'] = 'Смяна на потребителско име:';
+$lang['helpItemCodeNick'] = '/nick Потребителско_име';
+$lang['settings'] = 'Настройки';
+$lang['settingsBBCode'] = 'Позволяване на BBCode:';
+$lang['settingsBBCodeImages'] = 'Позволяване на BBCode за картинки:';
+$lang['settingsBBCodeColors'] = 'Позволяване на BBCode за шрифтов цвят:';
+$lang['settingsHyperLinks'] = 'Позволяване на хипервръзки:';
+$lang['settingsLineBreaks'] = 'Позволяване на край на ред:';
+$lang['settingsEmoticons'] = 'Позволяване на усмивки:';
+$lang['settingsAutoFocus'] = 'Автоматично фокусиране на полето за въвеждане:';
+$lang['settingsMaxMessages'] = 'Максимален брой съобщения в прозореца на чата:';
+$lang['settingsWordWrap'] = 'Пренасяне на дълги думи:';
+$lang['settingsMaxWordLength'] = 'Максимална дължина на дума преди да бъде пренесена:';
+$lang['settingsDateFormat'] = 'Формат на датата и часа:';
+$lang['settingsPersistFontColor'] = 'Устойчив цвят на шрифта:';
+$lang['settingsAudioVolume'] = 'Височина на звука:';
+$lang['settingsSoundReceive'] = 'Звук за входящи съобщения:';
+$lang['settingsSoundSend'] = 'Звук за изходящи съобщения:';
+$lang['settingsSoundEnter'] = 'Звук за съобщенията за влизане в чата или в канала:';
+$lang['settingsSoundLeave'] = 'Звук за съобщенията за излизане от чата или от канала:';
+$lang['settingsSoundChatBot'] = 'Звук за съобщенията на чатбота:';
+$lang['settingsSoundError'] = 'Звук за съобщенията за грешки:';
+$lang['settingsBlink'] = 'Примигване на прозоречното заглавие при нови съобщения:';
+$lang['settingsBlinkInterval'] = 'Интервал на примигване в милисекунди:';
+$lang['settingsBlinkIntervalNumber'] = 'Брой пъти на примигване:';
+$lang['playSelectedSound'] = 'Прослушване на избрания звук';
+$lang['requiresJavaScript'] = 'За чата се изисква поддръжката на Джаваскрипт.';
+$lang['errorInvalidUser'] = 'Грешно потребителско име.';
+$lang['errorUserInUse'] = 'Потребителското име се използва.';
+$lang['errorBanned'] = 'Потребителят или айпи адресът е изгонен.';
+$lang['errorMaxUsersLoggedIn'] = 'Чатът достигна максималния брой на влезли потребители.';
+$lang['errorChatClosed'] = 'В момента чатът е затворен.';
+$lang['logsTitle'] = 'AJAX Chat — Логове';
+$lang['logsDate'] = 'Дата';
+$lang['logsTime'] = 'Време';
+$lang['logsSearch'] = 'Търсене';
+$lang['logsPrivateChannels'] = 'Лични канали';
+$lang['logsPrivateMessages'] = 'Лични съобщения';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/ca.php b/library/ajaxchat/chat/lib/lang/ca.php
new file mode 100644
index 000000000..e45c376da
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/ca.php
@@ -0,0 +1,125 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Manu Quintans
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Usuari';
+$lang['password'] = 'Contrasenya';
+$lang['login'] = 'Accedir';
+$lang['logout'] = 'Tancar sessió';
+$lang['channel'] = 'Canal';
+$lang['style'] = 'Estil';
+$lang['language'] = 'Idioma';
+$lang['inputLineBreak'] = 'Prem SHIFT+ENTER per introduir un salt de línia';
+$lang['messageSubmit'] = 'Enviar';
+$lang['registeredUsers'] = 'Usuaris registrats';
+$lang['onlineUsers'] = 'Usuaris Conectats';
+$lang['toggleAutoScroll'] = 'Desplaçament automàtic activat/desactivat';
+$lang['toggleAudio'] = 'So activat/desactivat';
+$lang['toggleHelp'] = 'mostra/amaga ajuda';
+$lang['toggleSettings'] = 'mostra/amaga propietats';
+$lang['toggleOnlineList'] = 'mostra/amaga usuaris conectats';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Citar';
+$lang['bbCodeLabelCode'] = 'Codi';
+$lang['bbCodeLabelURL'] = 'Enllaç';
+$lang['bbCodeLabelImg'] = 'Imatge';
+$lang['bbCodeLabelColor'] = 'Color de la Font';
+$lang['bbCodeTitleBold'] = 'text en negreta: [b]text[/b]';
+$lang['bbCodeTitleItalic'] = 'text en cursiva: [i]text[/i]';
+$lang['bbCodeTitleUnderline'] = 'text subratllat: [u]text[/u]';
+$lang['bbCodeTitleQuote'] = 'text citat: [quote]text[/quote] o [quote=author]text[/quote]';
+$lang['bbCodeTitleCode'] = 'Mostrar codi: [code]code[/code]';
+$lang['bbCodeTitleURL'] = 'Insertar enllaç: [url]http://example.org[/url] o [url=http://example.org]text[/url]';
+$lang['bbCodeTitleImg'] = 'Insertar imatge: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Color de la font: [color=red]text[/color]';
+$lang['help'] = 'Ajuda';
+$lang['helpItemDescJoin'] = 'Entrar en canal:';
+$lang['helpItemCodeJoin'] = '/join nom del canal';
+$lang['helpItemDescJoinCreate'] = 'Crear una sala privada (només usuaris registrats):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Convidar algú (p.ex. a una sala privada):';
+$lang['helpItemCodeInvite'] = '/invite nom de l\'usuari';
+$lang['helpItemDescUninvite'] = 'Cancel·lar invitació:';
+$lang['helpItemCodeUninvite'] = '/uninvite nom d l\'usuari';
+$lang['helpItemDescLogout'] = 'Tancar sessió:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Missatge privat:';
+$lang['helpItemCodePrivateMessage'] = '/msg Usuari Text';
+$lang['helpItemDescQueryOpen'] = 'Obrir un canal privat:';
+$lang['helpItemCodeQueryOpen'] = '/query Usuari';
+$lang['helpItemDescQueryClose'] = 'Tancar canal privat:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Descriu acció:';
+$lang['helpItemCodeAction'] = '/action acció';
+$lang['helpItemDescDescribe'] = 'Descriu acció en un missatge privat:';
+$lang['helpItemCodeDescribe'] = '/describe NomUsuari acció';
+$lang['helpItemDescIgnore'] = 'Ignorar/Acceptar missatges d\'usuaris:';
+$lang['helpItemCodeIgnore'] = '/ignore nom de l\'usuari ';
+$lang['helpItemDescIgnoreList'] = 'Llista d\'usuaris ignorats:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Mostra canal de l\'usuari:';
+$lang['helpItemCodeWhereis'] = '/whereis nom de l\'usuari';
+$lang['helpItemDescKick'] = 'Patear usuari (només moderadors):';
+$lang['helpItemCodeKick'] = '/kick Usuari [Minuts banejat]';
+$lang['helpItemDescUnban'] = 'treure banejat usuari (només moderadors):';
+$lang['helpItemCodeUnban'] = '/unban nom de l\'usuari';
+$lang['helpItemDescBans'] = 'Llista d\'usuaris banejats (només moderadors):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Mostrar les IPs d\'usuaris (només moderadors):';
+$lang['helpItemCodeWhois'] = '/whois nom de l\'usuari';
+$lang['helpItemDescWho'] = 'Mostrar usuaris conectats:';
+$lang['helpItemCodeWho'] = '/who [nom del canal]';
+$lang['helpItemDescList'] = 'Llista de canals disponibles:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Tirar els daus:';
+$lang['helpItemCodeRoll'] = '/roll [nombre]d[cares]';
+$lang['helpItemDescNick'] = 'canviar nom d\'usuari:';
+$lang['helpItemCodeNick'] = '/nick nom d\'usuari';
+$lang['settings'] = 'Configuració';
+$lang['settingsBBCode'] = 'Habilitar BBCode:';
+$lang['settingsBBCodeImages'] = 'Habilitar imatge BBCode:';
+$lang['settingsBBCodeColors'] = 'habilitar color de font BBCode:';
+$lang['settingsHyperLinks'] = 'habilitar hipervincles:';
+$lang['settingsLineBreaks'] = 'Habilitar salts de línia:';
+$lang['settingsEmoticons'] = 'Habilitar emoticons:';
+$lang['settingsAutoFocus'] = 'Configurar automàticament el focus en el camp d\'entrada:';
+$lang['settingsMaxMessages'] = 'Màxim nombre de missatges en les llistes de Xat:';
+$lang['settingsWordWrap'] = 'Habilitar partir paraules llargues';
+$lang['settingsMaxWordLength'] = 'Màxima llargada d\'una paraula abns de ser tallada:';
+$lang['settingsDateFormat'] = 'Format de dia i hora:';
+$lang['settingsPersistFontColor'] = 'Color de font persistent:';
+$lang['settingsAudioVolume'] = 'So volum:';
+$lang['settingsSoundReceive'] = 'So per missatdes d\'entrada:';
+$lang['settingsSoundSend'] = 'So per missatges de sortida:';
+$lang['settingsSoundEnter'] = 'So per connectar i missatges d\'entrada del canal:';
+$lang['settingsSoundLeave'] = 'So per desconnectar i missatges de sortida del canal:';
+$lang['settingsSoundChatBot'] = 'So pels missatges del xat:';
+$lang['settingsSoundError'] = 'So per missatges d\'error:';
+$lang['settingsBlink'] = 'Notificació de finestra per als nous missatges:';
+$lang['settingsBlinkInterval'] = 'Interval de notificacions intermitents (milisegons):';
+$lang['settingsBlinkIntervalNumber'] = 'Nombre de notificacions intermitents:';
+$lang['playSelectedSound'] = 'Reproduir el so seleccionat';
+$lang['requiresJavaScript'] = 'Necesites tenir instal·lat Javascript al teu navegador';
+$lang['errorInvalidUser'] = 'Usuari no vàlid';
+$lang['errorUserInUse'] = 'Aquest nom d\'usuari està sent utilitzat en aquests moments';
+$lang['errorBanned'] = 'L\'usuari o IP està bannejat';
+$lang['errorMaxUsersLoggedIn'] = 'El xat ha arribat al màxim nombre d\'usuaris.';
+$lang['errorChatClosed'] = 'El xat està tancat en aquests moments.';
+$lang['logsTitle'] = 'AJAX Xat - Registre';
+$lang['logsDate'] = 'Data';
+$lang['logsTime'] = 'Hora';
+$lang['logsSearch'] = 'Buscar';
+$lang['logsPrivateChannels'] = 'Canals privats';
+$lang['logsPrivateMessages'] = 'Missatges privats';
+
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/cy.php b/library/ajaxchat/chat/lib/lang/cy.php
new file mode 100644
index 000000000..dea446df5
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/cy.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Alan Davies
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Enw';
+$lang['password'] = 'Cyfrinair';
+$lang['login'] = 'Mewngofnodi';
+$lang['logout'] = 'Allgofnodi';
+$lang['channel'] = 'Sianel';
+$lang['style'] = 'Steil';
+$lang['language'] = 'Iaith';
+$lang['inputLineBreak'] = 'Gwasgwch SHIFT+ENTER i orfodi llinell newydd';
+$lang['messageSubmit'] = 'Anfon';
+$lang['registeredUsers'] = 'Defnyddwyr Cofrestredig';
+$lang['onlineUsers'] = 'Defnyddwyr ar-lein';
+$lang['toggleAutoScroll'] = 'Awtorhôl ymlaen/bant';
+$lang['toggleAudio'] = 'Sain ymlaen/bant';
+$lang['toggleHelp'] = 'Dangos/cuddio cymorth';
+$lang['toggleSettings'] = 'Dangos/cuddio gosodiadau';
+$lang['toggleOnlineList'] = 'Dangos/cuddio rhestr ar-lein';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Dyfyniad';
+$lang['bbCodeLabelCode'] = 'Cod';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Delwedd';
+$lang['bbCodeLabelColor'] = 'Lliw Ffont';
+$lang['bbCodeTitleBold'] = 'Testun bras: [b]testun[/b]';
+$lang['bbCodeTitleItalic'] = 'Testun italig: [i]testun[/i]';
+$lang['bbCodeTitleUnderline'] = 'Tanlinellu testun: [u]testun[/u]';
+$lang['bbCodeTitleQuote'] = 'Dyfynnu testun: [quote]testun[/quote] neu [quote=awdur]testun[/quote]';
+$lang['bbCodeTitleCode'] = 'Dangos cod: [code]cod[/code]';
+$lang['bbCodeTitleURL'] = 'Mewnosod URL: [url]http://example.org[/url] neu [url=http://example.org]testun[/url]';
+$lang['bbCodeTitleImg'] = 'Mewnosod delwedd: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Lliw Ffont: [color=red]testun[/color]';
+$lang['help'] = 'Cymorth';
+$lang['helpItemDescJoin'] = 'Ymunwch â sianel:';
+$lang['helpItemCodeJoin'] = '/join EnwSianel';
+$lang['helpItemDescJoinCreate'] = 'Crëwch ystafell breifat (Defnyddwyr cofrestredig yn unig):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Gwahodd rhywun (e.e. i ystafell breifat):';
+$lang['helpItemCodeInvite'] = '/invite Enw';
+$lang['helpItemDescUninvite'] = 'Tynnu gwahaoddiad yn ôl:';
+$lang['helpItemCodeUninvite'] = '/uninvite Enw';
+$lang['helpItemDescLogout'] = 'Allgofnodwch o Sgwrs:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Neges breifat:';
+$lang['helpItemCodePrivateMessage'] = '/msg Testun Enw';
+$lang['helpItemDescQueryOpen'] = 'Agorwch sianel breifat:';
+$lang['helpItemCodeQueryOpen'] = '/query Enw';
+$lang['helpItemDescQueryClose'] = 'Ceuwch sianel breifat:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Disgrifiwch weithred:';
+$lang['helpItemCodeAction'] = '/action Testun';
+$lang['helpItemDescDescribe'] = 'Disgrifiwch weithred mewn neges breifat:';
+$lang['helpItemCodeDescribe'] = '/describe Testun Enw';
+$lang['helpItemDescIgnore'] = 'Anwybyddu/derbyn negeseuon o ddefnyddiwr:';
+$lang['helpItemCodeIgnore'] = '/ignore Enw';
+$lang['helpItemDescIgnoreList'] = 'Rhestr anwybyddion:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Dangos sianel defnyddiwr:';
+$lang['helpItemCodeWhereis'] = '/whereis Enw';
+$lang['helpItemDescKick'] = 'Ciciwch ddefnyddiwr (Cymedrolwyr yn unig):';
+$lang['helpItemCodeKick'] = '/kick Enw [Gwahardd munudau]';
+$lang['helpItemDescUnban'] = 'Dadwahardd defnyddiwr (Cymedrolwyr yn unig):';
+$lang['helpItemCodeUnban'] = '/unban Enw';
+$lang['helpItemDescBans'] = 'Rhestr waharddogion (Cymedrolwyr yn unig):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Dangos IP defnyddiwr (Cymedrolwyr yn unig):';
+$lang['helpItemCodeWhois'] = '/whois Enw';
+$lang['helpItemDescWho'] = 'Rhestr ddefnyddwyr ar-lein:';
+$lang['helpItemCodeWho'] = '/who [EnwSianel]';
+$lang['helpItemDescList'] = 'Rhestr sianeli ar gael:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Rholio dis:';
+$lang['helpItemCodeRoll'] = '/roll [nifer]d[ochrau]'; //posib angen newid hwn
+$lang['helpItemDescNick'] = 'Newid enw:';
+$lang['helpItemCodeNick'] = '/nick Enw';
+$lang['settings'] = 'Gosodiadau';
+$lang['settingsBBCode'] = 'Galluogi BBCode:';
+$lang['settingsBBCodeImages'] = 'Galluogi delweddau BBCode:';
+$lang['settingsBBCodeColors'] = 'Galluogi lliwiau ffont BBCode:';
+$lang['settingsHyperLinks'] = 'Galluogi dolenni:';
+$lang['settingsLineBreaks'] = 'Galluogi toriadau llinell:';
+$lang['settingsEmoticons'] = 'Galluogi gwenogluniau:';
+$lang['settingsAutoFocus'] = 'Gosod y ffocws ar y maes mewnbwn yn awtomatig:';
+$lang['settingsMaxMessages'] = 'Uchafswm y negeseuon yn y rhestr sgwrs:';
+$lang['settingsWordWrap'] = 'Galluogi lapio geiriau hir:';
+$lang['settingsMaxWordLength'] = 'Hyd mwyaf y gair cyn iddo gael ei lapio:';
+$lang['settingsDateFormat'] = 'Fformat y dyddiad a\'r amser:';
+$lang['settingsPersistFontColor'] = 'Lliw ffont parhaus:';
+$lang['settingsAudioVolume'] = 'Uchder Sain:';
+$lang['settingsSoundReceive'] = 'Sain am negeseuon yn dyfod i mewn:';
+$lang['settingsSoundSend'] = 'Sain am negeseuon yn mynd allan:';
+$lang['settingsSoundEnter'] = 'Sain am fewngofnodi a negeseuon myned i sianeli:';
+$lang['settingsSoundLeave'] = 'Sain am allgofnodi a negeseuon gadael sianeli:';
+$lang['settingsSoundChatBot'] = 'Sain am negeseuon sgwrsbot:';
+$lang['settingsSoundError'] = 'Sain am wallnegeseuon:';
+$lang['settingsBlink'] = 'Fflachio teitl y ffenestr ar negeseuon newydd:';
+$lang['settingsBlinkInterval'] = 'Cyfwng fflachio mewn milieiliadau:';
+$lang['settingsBlinkIntervalNumber'] = 'Nifer y cyfyngau fflachio:';
+$lang['playSelectedSound'] = 'Chwarae\'r sain hon';
+$lang['requiresJavaScript'] = 'Mae angen JavaScript ar gyfer y Sgwrs hon.';
+$lang['errorInvalidUser'] = 'Enw annilys.';
+$lang['errorUserInUse'] = 'Enw\'n bodoli eisoes.';
+$lang['errorBanned'] = 'Gwaharddwyd y Defnyddiwr neu\'r IP.';
+$lang['errorMaxUsersLoggedIn'] = 'Mae\'r sgwrs wedi cyrraedd yr uchafswm o ddefnyddwyr.';
+$lang['errorChatClosed'] = 'Mae\'r sgwrs ar gau yn bresennol.';
+$lang['logsTitle'] = 'Sgwrs AJAX - Logiau';
+$lang['logsDate'] = 'Dyddiad';
+$lang['logsTime'] = 'Amser';
+$lang['logsSearch'] = 'Chwilio';
+$lang['logsPrivateChannels'] = 'Sianeli Preifat';
+$lang['logsPrivateMessages'] = 'Negeseuon Preifat';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/cz.php b/library/ajaxchat/chat/lib/lang/cz.php
new file mode 100644
index 000000000..cc6868c1e
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/cz.php
@@ -0,0 +1,123 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Jméno uživatele';
+$lang['password'] = 'Heslo';
+$lang['login'] = 'Přihlásit';
+$lang['logout'] = 'Odhlásit';
+$lang['channel'] = 'Místnost';
+$lang['style'] = 'Styl';
+$lang['language'] = 'Jazyk';
+$lang['inputLineBreak'] = 'Pro zalomení řádku stiskni SHIFT+ENTER';
+$lang['messageSubmit'] = 'Odeslat';
+$lang['registeredUsers'] = 'Registrovaní uživatelé';
+$lang['onlineUsers'] = 'Přihlášení uživatelé';
+$lang['toggleAutoScroll'] = 'Posouvání textu zapnuto/vypnuto';
+$lang['toggleAudio'] = 'Zvuk zapnutý/vypnutý';
+$lang['toggleHelp'] = 'Zobrazit/skrýt nápovědu';
+$lang['toggleSettings'] = 'Zobrazit/skrýt nastavení';
+$lang['toggleOnlineList'] = 'Zobrazit/skrýt seznam přihlášených';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Citace';
+$lang['bbCodeLabelCode'] = 'Kód';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Obrázek';
+$lang['bbCodeLabelColor'] = 'Barva písma';
+$lang['bbCodeTitleBold'] = 'Tučně: [b]text[/b]';
+$lang['bbCodeTitleItalic'] = 'Kurzívou: [i]text[/i]';
+$lang['bbCodeTitleUnderline'] = 'Podtržené: [u]text[/u]';
+$lang['bbCodeTitleQuote'] = 'Citace: [quote]text[/quote] nebo [quote=autor]text[/quote]';
+$lang['bbCodeTitleCode'] = 'Zobrazit kód: [code]kód[/code]';
+$lang['bbCodeTitleURL'] = 'Vložit URL: [url]http://example.org[/url] nebo [url=http://example.org]text[/url]';
+$lang['bbCodeTitleImg'] = 'Vložit obrázek: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Barva písma: [color=red]text[/color]';
+$lang['help'] = 'Nápověda';
+$lang['helpItemDescJoin'] = 'Vstup do místnosti:';
+$lang['helpItemCodeJoin'] = '/join Místnost';
+$lang['helpItemDescJoinCreate'] = 'Vytvořit vlastní místnost (Pouze registrovaní uživatelé):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Pozvání k soukromému rozhovoru (např. do vlastní místnosti):';
+$lang['helpItemCodeInvite'] = '/invite Uživatel';
+$lang['helpItemDescUninvite'] = 'Odvolat pozvání:';
+$lang['helpItemCodeUninvite'] = '/uninvite Uživatel';
+$lang['helpItemDescLogout'] = 'Odhlášení z chatu:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Soukromá zpráva:';
+$lang['helpItemCodePrivateMessage'] = '/msg Uživatel zpráva';
+$lang['helpItemDescQueryOpen'] = 'Soukromý rozhovor:';
+$lang['helpItemCodeQueryOpen'] = '/query Uživatel';
+$lang['helpItemDescQueryClose'] = 'Ukončit soukromý rozhovor:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Co zrovna dělám:';
+$lang['helpItemCodeAction'] = '/action Text';
+$lang['helpItemDescDescribe'] = 'To samé soukromě:';
+$lang['helpItemCodeDescribe'] = '/describe Uživatel Text';
+$lang['helpItemDescIgnore'] = 'Odmítnout/přijmout zprávu od uživatele:';
+$lang['helpItemCodeIgnore'] = '/ignore (accept) Uživatel';
+$lang['helpItemDescIgnoreList'] = 'Výpis odmítnutých uživatelů:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Najít uživatele:';
+$lang['helpItemCodeWhereis'] = '/whereis Uživatel';
+$lang['helpItemDescKick'] = 'Vyhodit uživatele (Pouze moderátoři):';
+$lang['helpItemCodeKick'] = '/kick Uživatel [Čas v minutách]';
+$lang['helpItemDescUnban'] = 'Omilostnit vyhozeného (Pouze moderátoři):';
+$lang['helpItemCodeUnban'] = '/unban Uživatel';
+$lang['helpItemDescBans'] = 'Výpis vyhozených uživatelů (Pouze moderátoři):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Zobrazit IP uživatele (Pouze moderátoři):';
+$lang['helpItemCodeWhois'] = '/whois Username';
+$lang['helpItemDescWho'] = 'Seznam přihlášených uživatelů:';
+$lang['helpItemCodeWho'] = '/who [Místnost]';
+$lang['helpItemDescList'] = 'Výpis místností:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Hodit kostkou:';
+$lang['helpItemCodeRoll'] = '/roll [číslo]d[počet stran]';
+$lang['helpItemDescNick'] = 'Změnit jméno uživatele:';
+$lang['helpItemCodeNick'] = '/nick Uživatel';
+$lang['settings'] = 'Nastavení';
+$lang['settingsBBCode'] = 'Povolit kódy BBCode:';
+$lang['settingsBBCodeImages'] = 'Povolit image BBCode:';
+$lang['settingsBBCodeColors'] = 'Povolit font color BBCode:';
+$lang['settingsHyperLinks'] = 'Povolit odkazy:';
+$lang['settingsLineBreaks'] = 'Povolit více řádků:';
+$lang['settingsEmoticons'] = 'Povolit smajlíky:';
+$lang['settingsAutoFocus'] = 'Automaticky nastavit kurzor na vstupní pole:';
+$lang['settingsMaxMessages'] = 'Maximální počet zpráv v hlavním okně:';
+$lang['settingsWordWrap'] = 'Povolit zalomení řádku u dlouhého slova:';
+$lang['settingsMaxWordLength'] = 'Maximální délka slova, než bude zalomeno:';
+$lang['settingsDateFormat'] = 'Formát zobrazení data a času:';
+$lang['settingsPersistFontColor'] = 'Neměnná barva textu:';
+$lang['settingsAudioVolume'] = 'Hlasitost:';
+$lang['settingsSoundReceive'] = 'Zvuk pro příchozí zprávy:';
+$lang['settingsSoundSend'] = 'Zvuk pro odchozí zprávy:';
+$lang['settingsSoundEnter'] = 'Zvuk při přihlášení nebo vstupu do místnosti:';
+$lang['settingsSoundLeave'] = 'Zvuk při odhlášení nebo odchodu z místnosti:';
+$lang['settingsSoundChatBot'] = 'Zvuk při zprávě chatbota:';
+$lang['settingsSoundError'] = 'Zvuk při chybové zprávě:';
+$lang['settingsBlink'] = 'Blikání titulku okna při příchozí zprávě:';
+$lang['settingsBlinkInterval'] = 'Interval blikání v milisekundách:';
+$lang['settingsBlinkIntervalNumber'] = 'Počet bliknutí:';
+$lang['playSelectedSound'] = 'Přehrát vybraný zvuk:';
+$lang['requiresJavaScript'] = 'Pro tento chat musíš mít zapnutý JavaScript.';
+$lang['errorInvalidUser'] = 'Uživatel neexistuje.';
+$lang['errorUserInUse'] = 'To jméno už je používáno.';
+$lang['errorBanned'] = 'Uživatel nebo IP adresa jsou na seznamu vyhozených.';
+$lang['errorMaxUsersLoggedIn'] = 'Chat je plný.';
+$lang['errorChatClosed'] = 'Chat je v tuto chvíli mimo provoz.';
+$lang['logsTitle'] = 'AJAX Chat - Logy';
+$lang['logsDate'] = 'Datum';
+$lang['logsTime'] = 'Čas';
+$lang['logsSearch'] = 'Hledej';
+$lang['logsPrivateChannels'] = 'Soukromé místnosti';
+$lang['logsPrivateMessages'] = 'Soukromé zprávy';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/da.php b/library/ajaxchat/chat/lib/lang/da.php
new file mode 100644
index 000000000..55e7eff1b
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/da.php
@@ -0,0 +1,123 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Brugernavn';
+$lang['password'] = 'Adgangskode';
+$lang['login'] = 'Log ind';
+$lang['logout'] = 'Log ud';
+$lang['channel'] = 'Kanal';
+$lang['style'] = 'Stil';
+$lang['language'] = 'Sprog';
+$lang['inputLineBreak'] = 'Tryk SHIFT+ENTER For at lave et linjeskift';
+$lang['messageSubmit'] = 'Send';
+$lang['registeredUsers'] = 'Registrerede brugere';
+$lang['onlineUsers'] = 'Online brugere';
+$lang['toggleAutoScroll'] = 'Autoscroll til/fra';
+$lang['toggleAudio'] = 'Lyd til/fra';
+$lang['toggleHelp'] = 'Vis/skjul Hjælp';
+$lang['toggleSettings'] = 'Vis/skjul indstillinger';
+$lang['toggleOnlineList'] = 'Vis/Skjul online liste';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Citat';
+$lang['bbCodeLabelCode'] = 'Kode';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Billede';
+$lang['bbCodeLabelColor'] = 'Font Farve';
+$lang['bbCodeTitleBold'] = 'Fed tekst: [b]tekstt[/b]';
+$lang['bbCodeTitleItalic'] = 'Kursiv tekst: [i]tekst[/i]';
+$lang['bbCodeTitleUnderline'] = 'Understreget tekst: [u]tekst[/u]';
+$lang['bbCodeTitleQuote'] = 'Citer tekst: [quote]citat[/quote] eller [quote=author]tekst[/quote]';
+$lang['bbCodeTitleCode'] = 'Vis kode: [code]kode[/code]';
+$lang['bbCodeTitleURL'] = 'Indsæt URL: [url]http://example.org[/url] eller [url=http://example.org]text[/url]';
+$lang['bbCodeTitleImg'] = 'Indsæt image: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Font Farve: [color=red]tekst[/color]';
+$lang['help'] = 'Hjælp';
+$lang['helpItemDescJoin'] = 'Deltag i en kanal:';
+$lang['helpItemCodeJoin'] = '/join Kanalnavn';
+$lang['helpItemDescJoinCreate'] = 'Opret et rum (kun for registrerede brugere):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Inviter person (fx til et privat rum):';
+$lang['helpItemCodeInvite'] = '/invite brugernavn';
+$lang['helpItemDescUninvite'] = 'Anuller invitation:';
+$lang['helpItemCodeUninvite'] = '/uninvite brugernavn';
+$lang['helpItemDescLogout'] = 'Log ud af chatten:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Privat besked:';
+$lang['helpItemCodePrivateMessage'] = '/msg brugernavn Tekst';
+$lang['helpItemDescQueryOpen'] = 'Åben en privat kanal:';
+$lang['helpItemCodeQueryOpen'] = '/query brugernavn';
+$lang['helpItemDescQueryClose'] = 'Luk en privat kanal:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'beskrivende handling:';
+$lang['helpItemCodeAction'] = '/action Tekst';
+$lang['helpItemDescDescribe'] = 'Beskrivende handling i privat besked:';
+$lang['helpItemCodeDescribe'] = '/describe brugernavn Tekst';
+$lang['helpItemDescIgnore'] = 'Ignorer/accepter beskeder fra bruger:';
+$lang['helpItemCodeIgnore'] = '/ignore brugernavn';
+$lang['helpItemDescIgnoreList'] = 'Vis ignorerede brugere:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Vis bruger kanal:';
+$lang['helpItemCodeWhereis'] = '/whereis brugernavn';
+$lang['helpItemDescKick'] = 'Spark en bruger ud af chatten (Moderators):';
+$lang['helpItemCodeKick'] = '/kick brugernavn [Minuter banlyst]';
+$lang['helpItemDescUnban'] = 'fjern banlysning af bruger (Moderators):';
+$lang['helpItemCodeUnban'] = '/unban brugernavn';
+$lang['helpItemDescBans'] = 'Vis banlyste brugere (Moderators):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Vis en brugers IP (Moderators):';
+$lang['helpItemCodeWhois'] = '/whois brugernavn';
+$lang['helpItemDescWho'] = 'Vis online brugere:';
+$lang['helpItemCodeWho'] = '/who [kanalnavn]';
+$lang['helpItemDescList'] = 'Vis tilgængelige kanaler:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'kast terninger:';
+$lang['helpItemCodeRoll'] = '/roll [antal]d[sider]';
+$lang['helpItemDescNick'] = 'Skift brugernavn:';
+$lang['helpItemCodeNick'] = '/nick brugernavn';
+$lang['settings'] = 'Indstillinger';
+$lang['settingsBBCode'] = 'Aktiver BBCode:';
+$lang['settingsBBCodeImages'] = 'Aktiver billede BBCode:';
+$lang['settingsBBCodeColors'] = 'Aktiver font farve BBCode:';
+$lang['settingsHyperLinks'] = 'Aktiver hyperlinks:';
+$lang['settingsLineBreaks'] = 'Aktiver linjeskift:';
+$lang['settingsEmoticons'] = 'Aktiver smileys:';
+$lang['settingsAutoFocus'] = 'Automatisk indstild fokus på indtastningsfeltet:';
+$lang['settingsMaxMessages'] = 'Maximum antal beskeder i chat list:';
+$lang['settingsWordWrap'] = 'Aktiver ombrydning af lange ord:';
+$lang['settingsMaxWordLength'] = 'Maximum længde af et ord før det bliver ombrudt:';
+$lang['settingsDateFormat'] = 'Metoden hvorpå data og klokkeslet vises:';
+$lang['settingsPersistFontColor'] = 'Vedhold en tekst farve:';
+$lang['settingsAudioVolume'] = 'Lydstyrke:';
+$lang['settingsSoundReceive'] = 'Lyd for indgående beskeder:';
+$lang['settingsSoundSend'] = 'Lyd for udgående:';
+$lang['settingsSoundEnter'] = 'Lyd ved login og kanal beskeder:';
+$lang['settingsSoundLeave'] = 'Lyd ved login og forlad kanal beskeder:';
+$lang['settingsSoundChatBot'] = 'Lyd ved ChatBot beskeder:';
+$lang['settingsSoundError'] = 'Lyd ved fejlmeddelse:';
+$lang['settingsBlink'] = 'Blink vindue titel ved nye beskeder:';
+$lang['settingsBlinkInterval'] = 'Blink interval i millisekonder:';
+$lang['settingsBlinkIntervalNumber'] = 'Antal blink intervaler:';
+$lang['playSelectedSound'] = 'Afspil valgte lyd';
+$lang['requiresJavaScript'] = 'JavaScript er nødvændigt for at kunne bruge denne chat.';
+$lang['errorInvalidUser'] = 'Ugyldigt brugernavn.';
+$lang['errorUserInUse'] = 'Brugernavn allerede i brug.';
+$lang['errorBanned'] = 'Bruger eller IP er blevet banned.';
+$lang['errorMaxUsersLoggedIn'] = 'Chatten har opnået det maksimale antal online brugere.';
+$lang['errorChatClosed'] = 'Chatten er pt lukket.';
+$lang['logsTitle'] = 'AJAX Chat - Logs';
+$lang['logsDate'] = 'Dato';
+$lang['logsTime'] = 'Tid';
+$lang['logsSearch'] = 'Søg';
+$lang['logsPrivateChannels'] = 'Private Kanaler';
+$lang['logsPrivateMessages'] = 'Private Beskeder';
+?>
diff --git a/library/ajaxchat/chat/lib/lang/de.php b/library/ajaxchat/chat/lib/lang/de.php
new file mode 100644
index 000000000..f345d100a
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/de.php
@@ -0,0 +1,123 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Benutzername';
+$lang['password'] = 'Passwort';
+$lang['login'] = 'Login';
+$lang['logout'] = 'Logout';
+$lang['channel'] = 'Raum';
+$lang['style'] = 'Stil';
+$lang['language'] = 'Sprache';
+$lang['inputLineBreak'] = 'UMSCHALT+EINGABE drücken um einen Zeilenumbruch zu erzeugen';
+$lang['messageSubmit'] = 'Abschicken';
+$lang['registeredUsers'] = 'Registrierte Benutzer';
+$lang['onlineUsers'] = 'Online Benutzer';
+$lang['toggleAutoScroll'] = 'Autoscroll an/aus';
+$lang['toggleAudio'] = 'Sound an/aus';
+$lang['toggleHelp'] = 'Hilfe anzeigen/verstecken';
+$lang['toggleSettings'] = 'Einstellungen anzeigen/verstecken';
+$lang['toggleOnlineList'] = 'Online Benutzer anzeigen/verstecken';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Zitat';
+$lang['bbCodeLabelCode'] = 'Code';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Bild';
+$lang['bbCodeLabelColor'] = 'Schriftfarbe';
+$lang['bbCodeTitleBold'] = 'Fett: [b]Text[/b]';
+$lang['bbCodeTitleItalic'] = 'Kursiv: [i]Text[/i]';
+$lang['bbCodeTitleUnderline'] = 'Unterstrichen: [u]Text[/u]';
+$lang['bbCodeTitleQuote'] = 'Zitat: [quote]Text[/quote] oder [quote=Autor]Text[/quote]';
+$lang['bbCodeTitleCode'] = 'Code anzeigen: [code]code[/code]';
+$lang['bbCodeTitleURL'] = 'Link einfügen: [url]http://example.org[/url] oder [url=http://example.org]Text[/url]';
+$lang['bbCodeTitleImg'] = 'Bild einfügen: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Schriftfarbe: [color=red]Text[/color]';
+$lang['help'] = 'Hilfe';
+$lang['helpItemDescJoin'] = 'Raum betreten:';
+$lang['helpItemCodeJoin'] = '/join Raumname';
+$lang['helpItemDescJoinCreate'] = 'Einen privaten Raum erstellen (nur registrierte Benutzer):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Jemanden einladen (z.B. in einen privaten Raum):';
+$lang['helpItemCodeInvite'] = '/invite Benutzername';
+$lang['helpItemDescUninvite'] = 'Einladung zurücknehmen:';
+$lang['helpItemCodeUninvite'] = '/uninvite Benutzername';
+$lang['helpItemDescLogout'] = 'Logout aus dem Chat:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Private Nachricht:';
+$lang['helpItemCodePrivateMessage'] = '/msg Benutzername Text';
+$lang['helpItemDescQueryOpen'] = 'Privaten Kanal öffnen:';
+$lang['helpItemCodeQueryOpen'] = '/query Benutzername';
+$lang['helpItemDescQueryClose'] = 'Privaten Kanal schließen:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Aktion beschreiben:';
+$lang['helpItemCodeAction'] = '/action Text';
+$lang['helpItemDescDescribe'] = 'Aktion in privater Nachricht beschreiben:';
+$lang['helpItemCodeDescribe'] = '/describe Benutzername Text';
+$lang['helpItemDescIgnore'] = 'Nachrichten von Benutzer ignorieren/akzeptieren:';
+$lang['helpItemCodeIgnore'] = '/ignore Benutzername';
+$lang['helpItemDescIgnoreList'] = 'Ignorierte Benutzer auflisten:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Raum eines Benutzers anzeigen:';
+$lang['helpItemCodeWhereis'] = '/whereis Benutzername';
+$lang['helpItemDescKick'] = 'Benutzer ausschließen (nur Moderatoren):';
+$lang['helpItemCodeKick'] = '/kick Benutzername [Ausschluss in Minuten]';
+$lang['helpItemDescUnban'] = 'Ausschluss eines Benutzers aufheben (nur Moderatoren):';
+$lang['helpItemCodeUnban'] = '/unban Benutzername';
+$lang['helpItemDescBans'] = 'Ausgeschlossene Benutzer auflisten (nur Moderatoren):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Benutzer IP anzeigen (nur Moderatoren):';
+$lang['helpItemCodeWhois'] = '/whois Benutzername';
+$lang['helpItemDescWho'] = 'Online Benutzer auflisten:';
+$lang['helpItemCodeWho'] = '/who [Kanalname]';
+$lang['helpItemDescList'] = 'Verfügbare Räume auflisten:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Würfeln:';
+$lang['helpItemCodeRoll'] = '/roll [Anzahl]d[Seiten]';
+$lang['helpItemDescNick'] = 'Benutzernamen ändern:';
+$lang['helpItemCodeNick'] = '/nick Benutzername';
+$lang['settings'] = 'Einstellungen';
+$lang['settingsBBCode'] = 'BBCode aktivieren:';
+$lang['settingsBBCodeImages'] = ' Bilder BBCode aktivieren:';
+$lang['settingsBBCodeColors'] = 'Schriftfarben BBCode aktivieren:';
+$lang['settingsHyperLinks'] = 'Hyperlinks aktivieren:';
+$lang['settingsLineBreaks'] = 'Zeilenumbrüche aktivieren:';
+$lang['settingsEmoticons'] = 'Smileys aktivieren:';
+$lang['settingsAutoFocus'] = 'Automatisch den Fokus auf das Eingabefeld setzen:';
+$lang['settingsMaxMessages'] = 'Maximale Anzahl der Nachrichten in der Chatliste:';
+$lang['settingsWordWrap'] = 'Lange Wörter umbrechen:';
+$lang['settingsMaxWordLength'] = 'Maximallänge eines Wortes bevor es umgebrochen wird:';
+$lang['settingsDateFormat'] = 'Datums- und Zeitanzeige:';
+$lang['settingsPersistFontColor'] = 'Schriftfarbe dauerhaft setzen:';
+$lang['settingsAudioVolume'] = 'Lautstärke:';
+$lang['settingsSoundReceive'] = 'Klang für empfangene Nachrichten:';
+$lang['settingsSoundSend'] = 'Klang für gesendete Nachrichten:';
+$lang['settingsSoundEnter'] = 'Klang für Logins und das Betreten von Räumen:';
+$lang['settingsSoundLeave'] = 'Klang für Logouts und das Verlassen von Räumen:';
+$lang['settingsSoundChatBot'] = 'Klang für Chatbot Nachrichten:';
+$lang['settingsSoundError'] = 'Klang für Fehlermeldungen:';
+$lang['settingsBlink'] = 'Blinkender Fenstertitel bei neuen Nachrichten:';
+$lang['settingsBlinkInterval'] = 'Blink-Intervall in Millisekunden:';
+$lang['settingsBlinkIntervalNumber'] = 'Anzahl der Blink-Intervalle:';
+$lang['playSelectedSound'] = 'Ausgewählten Klang abspielen';
+$lang['requiresJavaScript'] = 'JavaScript wird für diesen Chat benötigt.';
+$lang['errorInvalidUser'] = 'Ungültiger Benutzername.';
+$lang['errorUserInUse'] = 'Benutzername in Verwendung.';
+$lang['errorBanned'] = 'Benutzer oder IP ist ausgeschlossen.';
+$lang['errorMaxUsersLoggedIn'] = 'Der Chat hat die maximale Anzahl eingeloggter Benutzer erreicht.';
+$lang['errorChatClosed'] = 'Der Chat ist zur Zeit geschlossen.';
+$lang['logsTitle'] = 'AJAX Chat - Logs';
+$lang['logsDate'] = 'Datum';
+$lang['logsTime'] = 'Uhrzeit';
+$lang['logsSearch'] = 'Suche';
+$lang['logsPrivateChannels'] = 'Private Räume';
+$lang['logsPrivateMessages'] = 'Private Nachrichten';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/el.php b/library/ajaxchat/chat/lib/lang/el.php
new file mode 100644
index 000000000..526c31bf9
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/el.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author panas
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Όνομα χρήστη';
+$lang['password'] = 'Κωδικός';
+$lang['login'] = 'Σύνδεση';
+$lang['logout'] = 'Αποσύνδεση';
+$lang['channel'] = 'Κανάλι';
+$lang['style'] = 'Στυλ';
+$lang['language'] = 'Γλώσσα';
+$lang['inputLineBreak'] = 'Πατήστε SHIFT+ENTER για να εισάγετε μια νέα γραμμή';
+$lang['messageSubmit'] = 'Υποβολή';
+$lang['registeredUsers'] = 'Εγγεγραμμένοι χρήστες';
+$lang['onlineUsers'] = 'Συνδεδεμένοι χρήστες';
+$lang['toggleAutoScroll'] = 'Αυτόματη κύλιση ναι/όχι';
+$lang['toggleAudio'] = 'Ήχος ναι/όχι';
+$lang['toggleHelp'] = 'Εμφάνιση/απόκρυψη βοήθειας';
+$lang['toggleSettings'] = 'Εμφάνιση/απόκρυψη ρυθμίσεων';
+$lang['toggleOnlineList'] = 'Εμφάνιση/απόκρυψη λίστας συνδεδεμένων';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Παράθεση';
+$lang['bbCodeLabelCode'] = 'Κώδικας';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Image';
+$lang['bbCodeLabelColor'] = 'Χρώμα γραμματοσειράς';
+$lang['bbCodeTitleBold'] = 'Έντονο κείμενο: [b]κείμενο[/b]';
+$lang['bbCodeTitleItalic'] = 'Πλάγια γραφή: [i]κείμενο[/i]';
+$lang['bbCodeTitleUnderline'] = 'Υπογραμμισμένο κείμενο: [u]κείμενο[/u]';
+$lang['bbCodeTitleQuote'] = 'Κείμενο σε παράθεση: [quote]κείμενο[/quote] ή [quote=author]κείμενο[/quote]';
+$lang['bbCodeTitleCode'] = 'Εμφάνιση κώδικα: [code]code[/code]';
+$lang['bbCodeTitleURL'] = 'Εισαγωγή URL: [url]http://example.org[/url] ή [url=http://example.org]κείμενο[/url]';
+$lang['bbCodeTitleImg'] = 'Insert image: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Χρώμα γραμματοσειράς: [color=red]κείμενο[/color]';
+$lang['help'] = 'Βοήθεια';
+$lang['helpItemDescJoin'] = 'Είσοδος σε ένα κανάλι:';
+$lang['helpItemCodeJoin'] = '/join όνομα_καναλιού';
+$lang['helpItemDescJoinCreate'] = 'Δημιουργία πριβέ καναλιού(μόνο για εγγεγραμμένους):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Για να προκαλέσετε (π.χ. σε ένα πριβέ κανάλι):';
+$lang['helpItemCodeInvite'] = '/invite όνομα';
+$lang['helpItemDescUninvite'] = 'Ακύρωση πρόσκλησης:';
+$lang['helpItemCodeUninvite'] = '/uninvite όνομα';
+$lang['helpItemDescLogout'] = 'Αποσύνδεση από το Chat:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Προσωπικό μήνυμα:';
+$lang['helpItemCodePrivateMessage'] = '/msg όνομα_χρήστη κείμενο';
+$lang['helpItemDescQueryOpen'] = 'Άνοιγμα πριβέ καναλιού:';
+$lang['helpItemCodeQueryOpen'] = '/query όνομα χρήστη';
+$lang['helpItemDescQueryClose'] = 'Κλεισιμό ενώς πριβέ καναλιού:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Περιγραφή ενέργειας:';
+$lang['helpItemCodeAction'] = '/action κείμενο';
+$lang['helpItemDescDescribe'] = 'Περιγραφή ενέργειας με προσωπικό μήνυμα:';
+$lang['helpItemCodeDescribe'] = '/describe όνομα_χρήστη κείμενο';
+$lang['helpItemDescIgnore'] = 'Αγνόηση/αποδοχή μηνυμάτων από χρήστη:';
+$lang['helpItemCodeIgnore'] = '/ignore όνομα_χρήστη';
+$lang['helpItemDescIgnoreList'] = 'Εμφάνιση λίστας αγνοημένων:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Εμφάνιση καναλιού χρήστη:';
+$lang['helpItemCodeWhereis'] = '/whereis Username';
+$lang['helpItemDescKick'] = 'Kick έναν χρήστη (Μόνον για συντονιστές):';
+$lang['helpItemCodeKick'] = '/kick όνομα χρήστη [λεπτά αποκλεισμού]';
+$lang['helpItemDescUnban'] = 'Αφαίρεση αποκλεισμού από χρήστη (Μόνον για συντονιστές):';
+$lang['helpItemCodeUnban'] = '/unban όνομα_χρήστη';
+$lang['helpItemDescBans'] = 'Λίστα αποκλεισμένων χρηστών (Μόνον για συντονιστές):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Εμφανίζει την IP του χρήστη (Μόνον για συντονιστές):';
+$lang['helpItemCodeWhois'] = '/whois όνομα χρήστη';
+$lang['helpItemDescWho'] = 'Λίστα συνδεδεμένων χρηστών:';
+$lang['helpItemCodeWho'] = '/who [όνομακαναλιού]';
+$lang['helpItemDescList'] = 'Εμφάνιση διαθέσιμων καναλιών:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Κύλιση ζαριών:';
+$lang['helpItemCodeRoll'] = '/roll [αριθμός]d[πλευρές]';
+$lang['helpItemDescNick'] = 'Αλλαγή ονόματος:';
+$lang['helpItemCodeNick'] = '/nick όνομα_χρήστη';
+$lang['settings'] = 'Ρυθμίσεις';
+$lang['settingsBBCode'] = 'Ενεργοποίηση BBCode:';
+$lang['settingsBBCodeImages'] = 'Enable image BBCode:';
+$lang['settingsBBCodeColors'] = 'Enable font color BBCode:';
+$lang['settingsHyperLinks'] = 'Ενεργοποίηση συνδέσμων:';
+$lang['settingsLineBreaks'] = 'Ενεργοποίηση αλλαγής γραμμής:';
+$lang['settingsEmoticons'] = 'Ενεργοποίηση εικονιδίων:';
+$lang['settingsAutoFocus'] = 'Θέστε αυτόματα την εστίαση στο πεδίο εισαγωγής:';
+$lang['settingsMaxMessages'] = 'Μέγιστος αριθμός μηνυμάτων στην λίστα του chat:';
+$lang['settingsWordWrap'] = 'Ενεργοποίηση καλύμματος μεγάλων λέξεων:';
+$lang['settingsMaxWordLength'] = 'Μέγιστο μήκος μιας λέξης χωρίς κάλυμμα:';
+$lang['settingsDateFormat'] = 'Μορφή ημερομηνίας και ώρας που θα εμφανίζετε:';
+$lang['settingsPersistFontColor'] = 'Έντονο χρώμα γραμματοσειράς:';
+$lang['settingsAudioVolume'] = 'Ένταση ήχου:';
+$lang['settingsSoundReceive'] = 'Ήχος για εισερχόμενα μηνύματα:';
+$lang['settingsSoundSend'] = 'Ήχος για εξερχόμενα μηνύματα:';
+$lang['settingsSoundEnter'] = 'Ήχος για μηνύματα σύνδεσης και εισόδου:';
+$lang['settingsSoundLeave'] = 'Ήχος για μηνύματα αποχώρισης και αποσύνδεσης:';
+$lang['settingsSoundChatBot'] = 'Ήχος για μηνύματα του chatbot:';
+$lang['settingsSoundError'] = 'Ήχος για μηνύματα λάθους:';
+$lang['settingsBlink'] = 'Αναβόσβημα τίτλου σε νέα μηνύματα:';
+$lang['settingsBlinkInterval'] = 'Ρυθμός αναβοσβήματος σε χιλιοστά του δευτερόλεπτου:';
+$lang['settingsBlinkIntervalNumber'] = 'Αριθμός αναβοσβήματος οθόνης:';
+$lang['playSelectedSound'] = 'Αναπαραγωγή επιλεγμένου ήχου';
+$lang['requiresJavaScript'] = 'Χρειάζεται JavaScript για το Chat.';
+$lang['errorInvalidUser'] = 'Ακατάλληλο όνομα χρήστη.';
+$lang['errorUserInUse'] = 'Το όνομα υπάρχει ήδη.';
+$lang['errorBanned'] = 'Το όνομα χρήστη ή IP είναι αποκλεισμένα.';
+$lang['errorMaxUsersLoggedIn'] = 'Το chat έχει φτάσει το μέγιστο αριθμό χρηστών.';
+$lang['errorChatClosed'] = 'Το chat είναι κλειστό προς το παρόν.';
+$lang['logsTitle'] = 'AJAX Chat - Καταγραφές';
+$lang['logsDate'] = 'Ημερομηνία';
+$lang['logsTime'] = 'Ώρα';
+$lang['logsSearch'] = 'Αναζήτηση';
+$lang['logsPrivateChannels'] = 'Πριβέ κανάλια';
+$lang['logsPrivateMessages'] = 'προσωπικά μηνύματα';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/en.php b/library/ajaxchat/chat/lib/lang/en.php
new file mode 100644
index 000000000..cb9492bde
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/en.php
@@ -0,0 +1,123 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Username';
+$lang['password'] = 'Password';
+$lang['login'] = 'Login';
+$lang['logout'] = 'Logout';
+$lang['channel'] = 'Channel';
+$lang['style'] = 'Style';
+$lang['language'] = 'Language';
+$lang['inputLineBreak'] = 'Press SHIFT+ENTER to input a line break';
+$lang['messageSubmit'] = 'Submit';
+$lang['registeredUsers'] = 'Registered Users';
+$lang['onlineUsers'] = 'Online users';
+$lang['toggleAutoScroll'] = 'Autoscroll on/off';
+$lang['toggleAudio'] = 'Sound on/off';
+$lang['toggleHelp'] = 'Show/hide help';
+$lang['toggleSettings'] = 'Show/hide settings';
+$lang['toggleOnlineList'] = 'Show/hide online list';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Quote';
+$lang['bbCodeLabelCode'] = 'Code';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Image';
+$lang['bbCodeLabelColor'] = 'Font Color';
+$lang['bbCodeTitleBold'] = 'Bold text: [b]text[/b]';
+$lang['bbCodeTitleItalic'] = 'Italic text: [i]text[/i]';
+$lang['bbCodeTitleUnderline'] = 'Underline text: [u]text[/u]';
+$lang['bbCodeTitleQuote'] = 'Quote text: [quote]text[/quote] or [quote=author]text[/quote]';
+$lang['bbCodeTitleCode'] = 'Code display: [code]code[/code]';
+$lang['bbCodeTitleURL'] = 'Insert URL: [url]http://example.org[/url] or [url=http://example.org]text[/url]';
+$lang['bbCodeTitleImg'] = 'Insert image: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Font Color: [color=red]text[/color]';
+$lang['help'] = 'Help';
+$lang['helpItemDescJoin'] = 'Join a channel:';
+$lang['helpItemCodeJoin'] = '/join Channelname';
+$lang['helpItemDescJoinCreate'] = 'Create a private room (Registered users only):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Invite someone (e.g. to a private room):';
+$lang['helpItemCodeInvite'] = '/invite Username';
+$lang['helpItemDescUninvite'] = 'Revoke invitation:';
+$lang['helpItemCodeUninvite'] = '/uninvite Username';
+$lang['helpItemDescLogout'] = 'Logout from Chat:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Private message:';
+$lang['helpItemCodePrivateMessage'] = '/msg Username Text';
+$lang['helpItemDescQueryOpen'] = 'Open a private channel:';
+$lang['helpItemCodeQueryOpen'] = '/query Username';
+$lang['helpItemDescQueryClose'] = 'Close a private channel:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Describe action:';
+$lang['helpItemCodeAction'] = '/action Text';
+$lang['helpItemDescDescribe'] = 'Describe action in private message:';
+$lang['helpItemCodeDescribe'] = '/describe Username Text';
+$lang['helpItemDescIgnore'] = 'Ignore/accept messages from user:';
+$lang['helpItemCodeIgnore'] = '/ignore Username';
+$lang['helpItemDescIgnoreList'] = 'List ignored users:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Display user channel:';
+$lang['helpItemCodeWhereis'] = '/whereis Username';
+$lang['helpItemDescKick'] = 'Kick a user (Moderators only):';
+$lang['helpItemCodeKick'] = '/kick Username [Minutes banned]';
+$lang['helpItemDescUnban'] = 'Unban a user (Moderators only):';
+$lang['helpItemCodeUnban'] = '/unban Username';
+$lang['helpItemDescBans'] = 'List banned users (Moderators only):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Display user IP (Moderators only):';
+$lang['helpItemCodeWhois'] = '/whois Username';
+$lang['helpItemDescWho'] = 'List online users:';
+$lang['helpItemCodeWho'] = '/who [Channelname]';
+$lang['helpItemDescList'] = 'List available channels:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Roll dice:';
+$lang['helpItemCodeRoll'] = '/roll [number]d[sides]';
+$lang['helpItemDescNick'] = 'Change username:';
+$lang['helpItemCodeNick'] = '/nick Username';
+$lang['settings'] = 'Settings';
+$lang['settingsBBCode'] = 'Enable BBCode:';
+$lang['settingsBBCodeImages'] = 'Enable image BBCode:';
+$lang['settingsBBCodeColors'] = 'Enable font color BBCode:';
+$lang['settingsHyperLinks'] = 'Enable hyperlinks:';
+$lang['settingsLineBreaks'] = 'Enable line breaks:';
+$lang['settingsEmoticons'] = 'Enable emoticons:';
+$lang['settingsAutoFocus'] = 'Automatically set the focus on the input field:';
+$lang['settingsMaxMessages'] = 'Maximum number of messages in the chatlist:';
+$lang['settingsWordWrap'] = 'Enable wrapping of long words:';
+$lang['settingsMaxWordLength'] = 'Maximum length of a word before it gets wrapped:';
+$lang['settingsDateFormat'] = 'Format of date and time display:';
+$lang['settingsPersistFontColor'] = 'Persist font color:';
+$lang['settingsAudioVolume'] = 'Sound Volume:';
+$lang['settingsSoundReceive'] = 'Sound for incoming messages:';
+$lang['settingsSoundSend'] = 'Sound for outgoing messages:';
+$lang['settingsSoundEnter'] = 'Sound for login and channel enter messages:';
+$lang['settingsSoundLeave'] = 'Sound for logout and channel leave messages:';
+$lang['settingsSoundChatBot'] = 'Sound for chatbot messages:';
+$lang['settingsSoundError'] = 'Sound for error messages:';
+$lang['settingsBlink'] = 'Blink window title on new messages:';
+$lang['settingsBlinkInterval'] = 'Blink interval in milliseconds:';
+$lang['settingsBlinkIntervalNumber'] = 'Number of blink intervals:';
+$lang['playSelectedSound'] = 'Play selected sound';
+$lang['requiresJavaScript'] = 'JavaScript is required for this Chat.';
+$lang['errorInvalidUser'] = 'Invalid username.';
+$lang['errorUserInUse'] = 'Username in use.';
+$lang['errorBanned'] = 'User or IP is banned.';
+$lang['errorMaxUsersLoggedIn'] = 'The chat has reached the maximum number of logged-in users.';
+$lang['errorChatClosed'] = 'The chat is closed at the moment.';
+$lang['logsTitle'] = 'AJAX Chat - Logs';
+$lang['logsDate'] = 'Date';
+$lang['logsTime'] = 'Time';
+$lang['logsSearch'] = 'Search';
+$lang['logsPrivateChannels'] = 'Private Channels';
+$lang['logsPrivateMessages'] = 'Private Messages';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/es.php b/library/ajaxchat/chat/lib/lang/es.php
new file mode 100644
index 000000000..27b9b7273
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/es.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author - Spanis Translation: Manu Quintans / KeScI [www.e-nologia.com]
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Usuario';
+$lang['password'] = 'Contraseña';
+$lang['login'] = 'Conectar';
+$lang['logout'] = 'Desconectar';
+$lang['channel'] = 'Canal';
+$lang['style'] = 'Estilo';
+$lang['language'] = 'Idioma';
+$lang['inputLineBreak'] = 'Pulse SHIFT+ENTER para insertar un salto de línea';
+$lang['messageSubmit'] = 'Enviar';
+$lang['registeredUsers'] = 'Usuarios Registrados';
+$lang['onlineUsers'] = 'Usuarios Conectados';
+$lang['toggleAutoScroll'] = 'Autoscroll on/off';
+$lang['toggleAudio'] = 'Sonido on/off';
+$lang['toggleHelp'] = 'Mostrar/ocultar ayuda';
+$lang['toggleSettings'] = 'Mostrar/ocultar configuración';
+$lang['toggleOnlineList'] = 'Mostrar/ocultar lista conectados';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Citar';
+$lang['bbCodeLabelCode'] = 'Código';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Imagen';
+$lang['bbCodeLabelColor'] = 'Color de Fuente';
+$lang['bbCodeTitleBold'] = 'Texto Negrita: [b]texto[/b]';
+$lang['bbCodeTitleItalic'] = 'Texto Cursiva: [i]texto[/i]';
+$lang['bbCodeTitleUnderline'] = 'Texto Subrayado: [u]texto[/u]';
+$lang['bbCodeTitleQuote'] = 'Texto Citado: [quote]texto[/quote] o [quote=author]text[/quote]';
+$lang['bbCodeTitleCode'] = 'Mostrar código: [code]código[/code]';
+$lang['bbCodeTitleURL'] = 'Insertar URL: [url]http://example.org[/url] or [url=http://example.org]texto[/url]';
+$lang['bbCodeTitleImg'] = 'Insertar imagen: [img]http://example.org/imagen.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Color de Fuente: [color=red]texto[/color]';
+$lang['help'] = 'Ayuda';
+$lang['helpItemDescJoin'] = 'Entrar en canal:';
+$lang['helpItemCodeJoin'] = '/join nombre del canal';
+$lang['helpItemDescJoinCreate'] = 'Crear un canal privado (Solo usuarios registrados):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Invitar a alguien (por ejemplo a un canal privado):';
+$lang['helpItemCodeInvite'] = '/invite Usuario';
+$lang['helpItemDescUninvite'] = 'Anular invitación:';
+$lang['helpItemCodeUninvite'] = '/uninvite Usuario';
+$lang['helpItemDescLogout'] = 'Cerrar sesión:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Mensaje Privado:';
+$lang['helpItemCodePrivateMessage'] = '/msg Usuario Texto';
+$lang['helpItemDescQueryOpen'] = 'Abrir un privado:';
+$lang['helpItemCodeQueryOpen'] = '/query Usuario';
+$lang['helpItemDescQueryClose'] = 'Cerrar privado:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Describir acción:';
+$lang['helpItemCodeAction'] = '/action Texto';
+$lang['helpItemDescDescribe'] = 'Describir acción en mensaje privado:';
+$lang['helpItemCodeDescribe'] = '/describe Usuario Texto';
+$lang['helpItemDescIgnore'] = 'Ignorar/Aceptar mensajes de usuarios:';
+$lang['helpItemCodeIgnore'] = '/ignore Usuario';
+$lang['helpItemDescIgnoreList'] = 'Mostrar usuarios ignorados:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Mostrar canal del usuario:';
+$lang['helpItemCodeWhereis'] = '/whereis Usuario';
+$lang['helpItemDescKick'] = 'Patear usuario (Solo moderadores):';
+$lang['helpItemCodeKick'] = '/kick Usuario [Minutos baneado]';
+$lang['helpItemDescUnban'] = 'Quitar ban usuario (Solo moderadores):';
+$lang['helpItemCodeUnban'] = '/unban Usuario';
+$lang['helpItemDescBans'] = 'Listar usuarios baneados (Solo moderadores):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Mostrar ips de usuarios (Solo moderadores):';
+$lang['helpItemCodeWhois'] = '/whois Usuario';
+$lang['helpItemDescWho'] = 'Mostrar usuarios conectados:';
+$lang['helpItemCodeWho'] = '/who [Channelname]';
+$lang['helpItemDescList'] = 'Lista de canales disponibles:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Tirar dado:';
+$lang['helpItemCodeRoll'] = '/roll [numero]de[lados]';
+$lang['helpItemDescNick'] = 'Cambiar nombre de usuario:';
+$lang['helpItemCodeNick'] = '/nick Usuario';
+$lang['settings'] = 'Configuración';
+$lang['settingsBBCode'] = 'Permitir BBCode:';
+$lang['settingsBBCodeImages'] = 'Permitir BBCode de imagen:';
+$lang['settingsBBCodeColors'] = 'Permitir BBCode de color de fuente:';
+$lang['settingsHyperLinks'] = 'Permitir enlaces:';
+$lang['settingsLineBreaks'] = 'Permitir saltos de línea:';
+$lang['settingsEmoticons'] = 'Permitir emoticonos:';
+$lang['settingsAutoFocus'] = 'Seleccionar el cuadro de ingreso automáticamente:';
+$lang['settingsMaxMessages'] = 'Máximo número de mensajes en la lista del chat:';
+$lang['settingsWordWrap'] = 'Permitir la separación del las palabras largas:';
+$lang['settingsMaxWordLength'] = 'Máximo tamaño de una palabara antes de que se separe:';
+$lang['settingsDateFormat'] = 'Formato de la fecha y hora a mostrar:';
+$lang['settingsPersistFontColor'] = 'Mantener el color de la fuente:';
+$lang['settingsAudioVolume'] = 'Volumen Sonido:';
+$lang['settingsSoundReceive'] = 'Sonido para mensajes entrantes:';
+$lang['settingsSoundSend'] = 'Sonido para mensajes salientes:';
+$lang['settingsSoundEnter'] = 'Sonido para mensajes de conexión y entradas al canal:';
+$lang['settingsSoundLeave'] = 'Sonido para mensajes de desconexión y salidas del canal:';
+$lang['settingsSoundChatBot'] = 'Sonido para mensajes del Chatbot:';
+$lang['settingsSoundError'] = 'Sonido para mensajes de error:';
+$lang['settingsBlink'] = 'Parpadeo del título de la ventana con nuevos mensajes:';
+$lang['settingsBlinkInterval'] = 'Intervalo de parpadeo en milisegundos:';
+$lang['settingsBlinkIntervalNumber'] = 'Número de intervalos de parpadeo:';
+$lang['playSelectedSound'] = 'Reproducir sonido seleccionado';
+$lang['requiresJavaScript'] = 'Necesita tener activado el Javascript en su navegador..';
+$lang['errorInvalidUser'] = 'Usuario Invalido.';
+$lang['errorUserInUse'] = 'Este nombre de usuario esta siendo utilizado en este momento.';
+$lang['errorBanned'] = 'El Usuario o la IP esta baneada..';
+$lang['errorMaxUsersLoggedIn'] = 'El Chat ha alcanzado el número máximo de usuarios conectados.';
+$lang['errorChatClosed'] = 'El Chat está cerrado en estos momentos.';
+$lang['logsTitle'] = 'AJAX Chat - Logs';
+$lang['logsDate'] = 'Fecha';
+$lang['logsTime'] = 'Hora';
+$lang['logsSearch'] = 'Buscar';
+$lang['logsPrivateChannels'] = 'Canales Privados';
+$lang['logsPrivateMessages'] = 'Mensajes Privados';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/et.php b/library/ajaxchat/chat/lib/lang/et.php
new file mode 100644
index 000000000..f1169fe19
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/et.php
@@ -0,0 +1,123 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Kasutajanimi';
+$lang['password'] = 'Parool';
+$lang['login'] = 'Sisene';
+$lang['logout'] = 'Välju';
+$lang['channel'] = 'Kanal';
+$lang['style'] = 'Stiil';
+$lang['language'] = 'Keel';
+$lang['inputLineBreak'] = 'Vajuta SHIFT+ENTER, et sisestada reavahe';
+$lang['messageSubmit'] = 'Sisesta';
+$lang['registeredUsers'] = 'Registreeritud kasutajad';
+$lang['onlineUsers'] = 'Sisse loginud kasutajad';
+$lang['toggleAutoScroll'] = 'Automaatne kerimine sees/väljas';
+$lang['toggleAudio'] = 'Helid sees/väljas';
+$lang['toggleHelp'] = 'Näita/Peida Abi';
+$lang['toggleSettings'] = 'Näita/Peida seaded';
+$lang['toggleOnlineList'] = 'Näita/Peida sisse loginuid';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Tsitaat';
+$lang['bbCodeLabelCode'] = 'Kood';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Pilt';
+$lang['bbCodeLabelColor'] = 'Fondi värv';
+$lang['bbCodeTitleBold'] = 'Rasvases kirjas tekst: [b]tekst[/b]';
+$lang['bbCodeTitleItalic'] = 'Kaldkirjas tekst: [i]tekst[/i]';
+$lang['bbCodeTitleUnderline'] = 'Underline text: [u]tekst[/u]';
+$lang['bbCodeTitleQuote'] = 'Tsiteeritud tekst: [quote]tekst[/quote] või [quote=autor]tekst[/quote]';
+$lang['bbCodeTitleCode'] = 'Koodi esitamine: [code]kood[/code]';
+$lang['bbCodeTitleURL'] = 'Lisa URL: [url]http://näide.org[/url] või [url=http://näide.org]tekst[/url]';
+$lang['bbCodeTitleImg'] = 'Lisa pilt: [img]http://näide.org/pilt.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Fondi värv: [color=red]tekst[/color]';
+$lang['help'] = 'Abi';
+$lang['helpItemDescJoin'] = 'Liitu kanaliga:';
+$lang['helpItemCodeJoin'] = '/join Kanalinimi';
+$lang['helpItemDescJoinCreate'] = 'Loo privaat-ruum (Vaid registreeritud kasutajad):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Kutsu kedagi (näiteks privaat-ruumi):';
+$lang['helpItemCodeInvite'] = '/invite Kasutajanimi';
+$lang['helpItemDescUninvite'] = 'Tühista kutse:';
+$lang['helpItemCodeUninvite'] = '/uninvite Kasutajanimi';
+$lang['helpItemDescLogout'] = 'Lahku jutukast:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Privaat-sõnum:';
+$lang['helpItemCodePrivateMessage'] = '/msg Kasutajanimi Tekst';
+$lang['helpItemDescQueryOpen'] = 'Ava privaat-kanal:';
+$lang['helpItemCodeQueryOpen'] = '/query Kasutajanimi';
+$lang['helpItemDescQueryClose'] = 'Sulge privaat-kanal:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Kirjelda tegevust:';
+$lang['helpItemCodeAction'] = '/action Tekst';
+$lang['helpItemDescDescribe'] = 'Kirjelda tegevust privaat-sõnumis:';
+$lang['helpItemCodeDescribe'] = '/describe Kasutajanimi Tekst';
+$lang['helpItemDescIgnore'] = 'Ignoreeri/Tunnusta sõnumeid kindlalt kasutajalt:';
+$lang['helpItemCodeIgnore'] = '/ignore Kasutajanimi';
+$lang['helpItemDescIgnoreList'] = 'Ignoreeritud kasutajate nimekiri:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Mis kanalis asub kasutaja?:';
+$lang['helpItemCodeWhereis'] = '/whereis Kasutajanimi';
+$lang['helpItemDescKick'] = 'Viska kasutaja välja (Ainult moderaatorid):';
+$lang['helpItemCodeKick'] = '/kick Kasutajanimi [minutite hulk mustas nimekirjas]';
+$lang['helpItemDescUnban'] = 'Eemalda kasutaja mustast nimekirjast (Ainult moderaatorid):';
+$lang['helpItemCodeUnban'] = '/unban Kasutajanimi';
+$lang['helpItemDescBans'] = 'Must nimekiri (Ainult moderaatorid):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Näita kasutaja IP aadressit (Ainult moderaatorid):';
+$lang['helpItemCodeWhois'] = '/whois Kasutajanimi';
+$lang['helpItemDescWho'] = 'Jutukasse sisenenud kasutajad:';
+$lang['helpItemCodeWho'] = '/who [Kanalinimi]';
+$lang['helpItemDescList'] = 'Vabade kanalite nimekiri:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Veereta täringut:';
+$lang['helpItemCodeRoll'] = '/roll [number]d[küljed]';
+$lang['helpItemDescNick'] = 'Muuda kasutajanimi:';
+$lang['helpItemCodeNick'] = '/nick Kasutajanimi';
+$lang['settings'] = 'Seaded';
+$lang['settingsBBCode'] = 'Luba BBCode:';
+$lang['settingsBBCodeImages'] = 'Luba pildi BBCode:';
+$lang['settingsBBCodeColors'] = 'Luba fondi värvi BBCode:';
+$lang['settingsHyperLinks'] = 'Luba hüpperlingid:';
+$lang['settingsLineBreaks'] = 'Luba reavahed:';
+$lang['settingsEmoticons'] = 'Luba emotikonid:';
+$lang['settingsAutoFocus'] = 'Sea fookus automaatselt sisestusväljale:';
+$lang['settingsMaxMessages'] = 'Maksimum sõnumite hulk ühes nimekirjas:';
+$lang['settingsWordWrap'] = 'Luba pikkade sõnade murdmine:';
+$lang['settingsMaxWordLength'] = 'Maksimum sõna pikkus enne kui seda murtakse:';
+$lang['settingsDateFormat'] = 'Kuupäeva ja kellaaja formaat:';
+$lang['settingsPersistFontColor'] = 'Püsiv fondi värv';
+$lang['settingsAudioVolume'] = 'Heli tugevus:';
+$lang['settingsSoundReceive'] = 'Heli sisenemisel:';
+$lang['settingsSoundSend'] = 'Heli väljumisel:';
+$lang['settingsSoundEnter'] = 'Heli sisenemisel ja kanalisse sisenemise sõnumitel:';
+$lang['settingsSoundLeave'] = 'Heli väljumise ja kanalitest lahkumise sõnumitel:';
+$lang['settingsSoundChatBot'] = 'Chatboti sõnumite heli:';
+$lang['settingsSoundError'] = 'Veateate heli:';
+$lang['settingsBlink'] = 'Vilguta akna tiitlit uute sõnumite saabumisel:';
+$lang['settingsBlinkInterval'] = 'Vilgutamise intervall millisekundites:';
+$lang['settingsBlinkIntervalNumber'] = 'Vilksatuste arv intervallis:';
+$lang['playSelectedSound'] = 'Mängi valitud heli';
+$lang['requiresJavaScript'] = 'Vajalik on JavaScripti olemas olu jutuka kasutamiseks.';
+$lang['errorInvalidUser'] = 'Vigane kasutajanimi.';
+$lang['errorUserInUse'] = 'Kasutajanimi on juba võetud.';
+$lang['errorBanned'] = 'Kasutaja või IP on lisatud musta nimekirja.';
+$lang['errorMaxUsersLoggedIn'] = 'Jutukas on jõudnud maksimum kasutajate hulgani.';
+$lang['errorChatClosed'] = 'Jutukas on hetkel suletud.';
+$lang['logsTitle'] = 'ComicLand - jutukas - Logiraamat';
+$lang['logsDate'] = 'Kuupäev';
+$lang['logsTime'] = 'Kellaaeg';
+$lang['logsSearch'] = 'Otsi';
+$lang['logsPrivateChannels'] = 'Privaat-kanalid';
+$lang['logsPrivateMessages'] = 'Privaat-sõnumid';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/fa.php b/library/ajaxchat/chat/lib/lang/fa.php
new file mode 100644
index 000000000..0dc3cb132
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/fa.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author pepotiger (www.dd4bb.com)
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'نام عبور';
+$lang['password'] = 'کلمه عبور';
+$lang['login'] = 'ورود';
+$lang['logout'] = 'خروج';
+$lang['channel'] = 'اطاق';
+$lang['style'] = 'ظاهر';
+$lang['language'] = 'زبان';
+$lang['inputLineBreak'] = 'کلید SHIFT+ENTER را برای ایجاد خط جدید فشار دهید';
+$lang['messageSubmit'] = 'ارسل';
+$lang['registeredUsers'] = 'کاربران ثبت نام شده';
+$lang['onlineUsers'] = 'کاربران حاضر';
+$lang['toggleAutoScroll'] = 'اسکرول اتوماتیک فعال/غیر فعال';
+$lang['toggleAudio'] = 'صدا روشن/خاموش';
+$lang['toggleHelp'] = 'نمایش/پنهان سازی کمک رسان';
+$lang['toggleSettings'] = 'نمایش/پنهان سازی تنظیمات';
+$lang['toggleOnlineList'] = 'نمایش/پنهان سازی لیست کاربران حاضر';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'اقتباس';
+$lang['bbCodeLabelCode'] = 'کد';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'تصویر';
+$lang['bbCodeLabelColor'] = 'رنگ خط';
+$lang['bbCodeTitleBold'] = 'متن درشت: [b]متن[/b]';
+$lang['bbCodeTitleItalic'] = 'متن کج: [i]متن[/i]';
+$lang['bbCodeTitleUnderline'] = 'زیر خط دار: [u]متن[/u]';
+$lang['bbCodeTitleQuote'] = 'نقل قول: [quote]متن[/quote] او [quote=الكاتب]نص[/quote]';
+$lang['bbCodeTitleCode'] = 'نمایش کد: [code]code[/code]';
+$lang['bbCodeTitleURL'] = 'وارد کردن آدرس: [url]http://example.org[/url] یا [url=http://example.org]متن[/url]';
+$lang['bbCodeTitleImg'] = 'وارد کردن تصویر: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'رنگ متن: [color=red]متن[/color]';
+$lang['help'] = 'کمک';
+$lang['helpItemDescJoin'] = 'ورود به اطاق:';
+$lang['helpItemCodeJoin'] = '/join نام اطاق';
+$lang['helpItemDescJoinCreate'] = 'ساخت اطاق خصوصی (تنها برای اعضا):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'دعوت کاربر (به عنوان مثال برای اطاق خصوصی):';
+$lang['helpItemCodeInvite'] = '/invite نام کاربری';
+$lang['helpItemDescUninvite'] = 'لغو دعوت:';
+$lang['helpItemCodeUninvite'] = '/uninvite نام کاربری';
+$lang['helpItemDescLogout'] = 'خروج:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'پیام خصوصی:';
+$lang['helpItemCodePrivateMessage'] = '/msg نامکاربری متن';
+$lang['helpItemDescQueryOpen'] = 'ساخت اطاق خصوصی:';
+$lang['helpItemCodeQueryOpen'] = '/query نام کاربری';
+$lang['helpItemDescQueryClose'] = 'خروج از اطاق خصوصی:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'شرح واقعه:';
+$lang['helpItemCodeAction'] = '/action متن';
+$lang['helpItemDescDescribe'] = 'شرح واقعه با پیام خصوصی:';
+$lang['helpItemCodeDescribe'] = '/describe نام کاربری متن';
+$lang['helpItemDescIgnore'] = 'قبول/صرف نظر پیغام از کاربر:';
+$lang['helpItemCodeIgnore'] = '/ignore نام کاربری';
+$lang['helpItemDescIgnoreList'] = 'افراد صرف نظر شده:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'نمایش اطاق کاربر:';
+$lang['helpItemCodeWhereis'] = '/whereis نام کاربر';
+$lang['helpItemDescKick'] = 'اجراج کاربر (تنها برای مدیران):';
+$lang['helpItemCodeKick'] = '/kick نام کاربری [زمان اخراج]';
+$lang['helpItemDescUnban'] = 'لغو اخراج (تنها برای مدیران):';
+$lang['helpItemCodeUnban'] = '/unban نام کاربری';
+$lang['helpItemDescBans'] = 'لیست کاربران اخراج شده (تنها برای مدیران):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'مشاهده آیپی کاربر (تنها برای مدیران):';
+$lang['helpItemCodeWhois'] = '/whois نام کاربری';
+$lang['helpItemDescWho'] = 'لیست کاربران حاضر:';
+$lang['helpItemCodeWho'] = '/who [نام اطاق]';
+$lang['helpItemDescList'] = 'نام اطاق های موجود:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Roll dice:';
+$lang['helpItemCodeRoll'] = '/roll [number]d[sides]';
+$lang['helpItemDescNick'] = 'تغییر نام کاربری:';
+$lang['helpItemCodeNick'] = '/nick نام کاربری';
+$lang['settings'] = 'تنظیمات';
+$lang['settingsBBCode'] = 'فعال سازی BBCode:';
+$lang['settingsBBCodeImages'] = 'فعال سازی تصاویر BBCode:';
+$lang['settingsBBCodeColors'] = 'فعال سازی رنگ متن BBCode:';
+$lang['settingsHyperLinks'] = 'فعال سازی لینک های اینترنتی:';
+$lang['settingsLineBreaks'] = 'فعال سازی پیام چند خطی:';
+$lang['settingsEmoticons'] = 'فعال سازی شکلک ها:';
+$lang['settingsAutoFocus'] = 'Automatically set the focus on the input field:';
+$lang['settingsMaxMessages'] = 'حد اکثر تعداد پیام در هر اطاق:';
+$lang['settingsWordWrap'] = 'Enable wrapping of long words:';
+$lang['settingsMaxWordLength'] = 'Maximum length of a word before it gets wrapped:';
+$lang['settingsDateFormat'] = 'Format of date and time display:';
+$lang['settingsPersistFontColor'] = 'Persist font color:';
+$lang['settingsAudioVolume'] = 'Sound Volume:';
+$lang['settingsSoundReceive'] = 'Sound for incoming messages:';
+$lang['settingsSoundSend'] = 'Sound for outgoing messages:';
+$lang['settingsSoundEnter'] = 'Sound for login and channel enter messages:';
+$lang['settingsSoundLeave'] = 'Sound for logout and channel leave messages:';
+$lang['settingsSoundChatBot'] = 'Sound for chatbot messages:';
+$lang['settingsSoundError'] = 'Sound for error messages:';
+$lang['settingsBlink'] = 'Blink window title on new messages:';
+$lang['settingsBlinkInterval'] = 'Blink interval in milliseconds:';
+$lang['settingsBlinkIntervalNumber'] = 'Number of blink intervals:';
+$lang['playSelectedSound'] = 'اجرای صدای انتخاب شده';
+$lang['requiresJavaScript'] = 'جاوا اسکریپت برای این تالار نیاز است.';
+$lang['errorInvalidUser'] = 'نا کاربری نامعتبر.';
+$lang['errorUserInUse'] = 'نام کاربری در حال استفاده است.';
+$lang['errorBanned'] = 'نام کاربری یا آیپی اخراج شده اند.';
+$lang['errorMaxUsersLoggedIn'] = 'متاسفانه تالار گفتگو به حداکثر ظرفیت خود برای کاربران حاضر رسیده است.';
+$lang['errorChatClosed'] = 'تالار گفتوگو هم اکنون بسته می باشد.';
+$lang['logsTitle'] = 'AJAX Chat - Logs';
+$lang['logsDate'] = 'تاریخ';
+$lang['logsTime'] = 'زمان';
+$lang['logsSearch'] = 'جست و جو';
+$lang['logsPrivateChannels'] = 'اطاق های خصوصی';
+$lang['logsPrivateMessages'] = 'پیغام های خصوصی';
+?>
diff --git a/library/ajaxchat/chat/lib/lang/fi.php b/library/ajaxchat/chat/lib/lang/fi.php
new file mode 100644
index 000000000..73466b412
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/fi.php
@@ -0,0 +1,125 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Asmo Soinio
+ * @author Saku Laukkanen
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Käyttäjätunnus';
+$lang['password'] = 'Salasana';
+$lang['login'] = 'Kirjaudu sisään';
+$lang['logout'] = 'Kirjaudu ulos';
+$lang['channel'] = 'Kanava';
+$lang['style'] = 'Tyyli';
+$lang['language'] = 'Kieli';
+$lang['inputLineBreak'] = 'Paina SHIFT+ENTER saadaksesi rivinvaihdon';
+$lang['messageSubmit'] = 'Lähetä';
+$lang['registeredUsers'] = 'Rekisteröityneet käyttäjät';
+$lang['onlineUsers'] = 'Paikalla olevat käyttäjät';
+$lang['toggleAutoScroll'] = 'Automaattinen vieritys päällä/pois';
+$lang['toggleAudio'] = 'Äänet päällä/pois';
+$lang['toggleHelp'] = 'Näytä/piilota ohje';
+$lang['toggleSettings'] = 'Näytä/piilota asetukset';
+$lang['toggleOnlineList'] = 'Näytä/piilota paikalla olevat käyttäjät';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Lainaus';
+$lang['bbCodeLabelCode'] = 'Koodi';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Kuva';
+$lang['bbCodeLabelColor'] = 'Fontin väri';
+$lang['bbCodeTitleBold'] = 'Lihavoitu teksti: [b]teksti[/b]';
+$lang['bbCodeTitleItalic'] = 'Kursivoitu teksti: [i]teksti[/i]';
+$lang['bbCodeTitleUnderline'] = 'Alleviivattu teksti: [u]teksti[/u]';
+$lang['bbCodeTitleQuote'] = 'Lainattu teksti: [quote]teksti[/quote] tai [quote=kirjoittaja]teksti[/quote]';
+$lang['bbCodeTitleCode'] = 'Koodi: [code]koodi[/code]';
+$lang['bbCodeTitleURL'] = 'Lisää linkki: [url]http://example.org[/url] tai [url=http://example.org]teksti[/url]';
+$lang['bbCodeTitleImg'] = 'Lisää kuva: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Kirjaisimen väri: [color=red]teksti[/color]';
+$lang['help'] = 'Ohje';
+$lang['helpItemDescJoin'] = 'Liity kanavalle:';
+$lang['helpItemCodeJoin'] = '/join KanavanNimi';
+$lang['helpItemDescJoinCreate'] = 'Tee uusi yksityinen kanava (Ainoastaan rekisteröityneille käyttäjille):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Kutsu joku (esim. Yksityiseen kanavaan):';
+$lang['helpItemCodeInvite'] = '/invite Käyttäjätunnus';
+$lang['helpItemDescUninvite'] = 'Peruuta kutsu:';
+$lang['helpItemCodeUninvite'] = '/uninvite Käyttäjätunnus';
+$lang['helpItemDescLogout'] = 'Kirjaudu ulos chatista:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Yksityisviesti:';
+$lang['helpItemCodePrivateMessage'] = '/msg Käyttäjätunnus Teksti';
+$lang['helpItemDescQueryOpen'] = 'Avaa yksityinen kanava:';
+$lang['helpItemCodeQueryOpen'] = '/query Käyttäjänimi';
+$lang['helpItemDescQueryClose'] = 'Sulje yksityinen kanava:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Kerro, mitä teet:';
+$lang['helpItemCodeAction'] = '/action Teksti';
+$lang['helpItemDescDescribe'] = 'Kerro yksityisviestissä mitä teet:';
+$lang['helpItemCodeDescribe'] = '/describe Käyttäjätunnus Teksti';
+$lang['helpItemDescIgnore'] = 'Estä tai salli viestejä käyttäjältä:';
+$lang['helpItemCodeIgnore'] = '/ignore Käyttäjänimi';
+$lang['helpItemDescIgnoreList'] = 'Listaa estetyt käyttäjät:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Näytä käyttäjän kanavat:';
+$lang['helpItemCodeWhereis'] = '/whereis Käyttäjänimi';
+$lang['helpItemDescKick'] = 'Potki käyttäjä (Ainoastaan Moderaattoreille):';
+$lang['helpItemCodeKick'] = '/kick Käyttäjänimi [Minuutteja potkittuna]';
+$lang['helpItemDescUnban'] = 'Poista käyttäjän potkut (Ainoastaan moderaattoreille):';
+$lang['helpItemCodeUnban'] = '/unban Käyttäjänimi';
+$lang['helpItemDescBans'] = 'Listaa potkitut käyttäjät (Ainoastaan moderaattoreille):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Näytä käyttäjän IP (Ainoastaan moderaattoreille):';
+$lang['helpItemCodeWhois'] = '/whois Käyttäjänimi';
+$lang['helpItemDescWho'] = 'Listaa käyttäjät jotka ovat paikalla:';
+$lang['helpItemCodeWho'] = '/who [Kanavatunnus]';
+$lang['helpItemDescList'] = 'Listaa käytettävissä olevat kanavat:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Heitä noppaa:';
+$lang['helpItemCodeRoll'] = '/roll [kertaa]d[sivuja]';
+$lang['helpItemDescNick'] = 'Vaihda käyttäjätunnusta:';
+$lang['helpItemCodeNick'] = '/nick Käyttäjänimi';
+$lang['settings'] = 'Asetukset';
+$lang['settingsBBCode'] = 'BBCode päälle:';
+$lang['settingsBBCodeImages'] = 'Salli kuvat:';
+$lang['settingsBBCodeColors'] = 'Salli värit:';
+$lang['settingsHyperLinks'] = 'Salli hyperlinkit:';
+$lang['settingsLineBreaks'] = 'Salli rivinvaihdot:';
+$lang['settingsEmoticons'] = 'Salli hymiöt:';
+$lang['settingsAutoFocus'] = 'Valitse tekstinsyöttökenttä automaattisesti:';
+$lang['settingsMaxMessages'] = 'Suurin määrä viestejä sivulla:';
+$lang['settingsWordWrap'] = 'Salli pitkien sanojen rivinvaihto:';
+$lang['settingsMaxWordLength'] = 'Sanan enimmäispituus ennen kuin riviä vaihdetaan:';
+$lang['settingsDateFormat'] = 'Ajan ja päivämäärän muoto:';
+$lang['settingsPersistFontColor'] = 'Pysyvä fontin väri:';
+$lang['settingsAudioVolume'] = 'Äänenvoimakkuus:';
+$lang['settingsSoundReceive'] = 'Ääni tuleville viesteille:';
+$lang['settingsSoundSend'] = 'Ääni lähteville viesteille:';
+$lang['settingsSoundEnter'] = 'Ääni sisäänkirjoittautumiseen ja kanavalle tuloon:';
+$lang['settingsSoundLeave'] = 'Ääni poistumiseen keskustelusta ja kanavalta:';
+$lang['settingsSoundChatBot'] = 'Ääni chatbotin viesteille:';
+$lang['settingsSoundError'] = 'Ääni virheilmoituksille:';
+$lang['settingsBlink'] = 'Vilkuta ikkunan nimeä uusista viesteistä:';
+$lang['settingsBlinkInterval'] = 'Vilkuttamisen aika millisekunneissa:';
+$lang['settingsBlinkIntervalNumber'] = 'Vilkutuksen viive:';
+$lang['playSelectedSound'] = 'Soita valittu ääni';
+$lang['requiresJavaScript'] = 'JavaScript on pakollinen tässä chatissa';
+$lang['errorInvalidUser'] = 'Virheellinen käyttäjänimi';
+$lang['errorUserInUse'] = 'Käyttäjänimi on käytössä, ole hyvä ja valitse toinen';
+$lang['errorBanned'] = 'Tällä IP:llä on porttikielto';
+$lang['errorMaxUsersLoggedIn'] = 'Chatissa on jo maksimimäärä käyttäjiä.';
+$lang['errorChatClosed'] = 'Chat on poistettu käytöstä toistaiseksi.';
+$lang['logsTitle'] = 'AJAX Chat-Lokitiedot';
+$lang['logsDate'] = 'Päivä';
+$lang['logsTime'] = 'Aika';
+$lang['logsSearch'] = 'Etsi';
+$lang['logsPrivateChannels'] = 'Näytä yksityiset kanavat';
+$lang['logsPrivateMessages'] = 'Yksityiset viestit';
+?>
diff --git a/library/ajaxchat/chat/lib/lang/fr.php b/library/ajaxchat/chat/lib/lang/fr.php
new file mode 100644
index 000000000..52ffaf1a2
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/fr.php
@@ -0,0 +1,125 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Ettelcar
+ * @author Massimiliano Tiraboschi
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Nom d’utilisateur';
+$lang['password'] = 'Mot de passe';
+$lang['login'] = 'Connexion';
+$lang['logout'] = 'Déconnexion';
+$lang['channel'] = 'Salon';
+$lang['style'] = 'Style';
+$lang['language'] = 'Langue';
+$lang['inputLineBreak'] = 'Taper Maj + Entrer pour avoir une ligne blanche';
+$lang['messageSubmit'] = 'Envoyer';
+$lang['registeredUsers'] = 'Utilisateurs enregistrés';
+$lang['onlineUsers'] = 'Utilisateurs en ligne';
+$lang['toggleAutoScroll'] = 'Activer / Désactiver l’autoscroll';
+$lang['toggleAudio'] = 'Activer / Désactiver le son';
+$lang['toggleHelp'] = 'Afficher / Masquer l’aide';
+$lang['toggleSettings'] = 'Afficher / Masquer les préférences';
+$lang['toggleOnlineList'] = 'Afficher / Masquer les utilisateurs en ligne';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Citation';
+$lang['bbCodeLabelCode'] = 'Code';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Image';
+$lang['bbCodeLabelColor'] = 'Couleur de police';
+$lang['bbCodeTitleBold'] = 'Texte en gras : [b]texte[/b]';
+$lang['bbCodeTitleItalic'] = 'Texte en italique : [i]texte[/i]';
+$lang['bbCodeTitleUnderline'] = 'Texte souligné : [u]texte[/u]';
+$lang['bbCodeTitleQuote'] = 'Citation : [quote]texte[/quote] ou [quote=auteur]texte[/quote]';
+$lang['bbCodeTitleCode'] = 'Affichage de code : [code]code[/code]';
+$lang['bbCodeTitleURL'] = 'Insérer une URL : [url]http://example.org[/url] ou [url=http://example.org]text[/url]';
+$lang['bbCodeTitleImg'] = 'Insérer une image : [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Couleur de la police: [color=red]texte[/color]';
+$lang['help'] = 'Aide';
+$lang['helpItemDescJoin'] = 'Rejoindre un salon :';
+$lang['helpItemCodeJoin'] = '/join Nom_du_salon';
+$lang['helpItemDescJoinCreate'] = 'Créer un salon privé (Utilisateurs enregistrés seulement) :';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Inviter quelqu’un (exemple : rejoindre un salon privé) :';
+$lang['helpItemCodeInvite'] = '/invite Nom_d_utilisateur';
+$lang['helpItemDescUninvite'] = 'Annuler l’invitation :';
+$lang['helpItemCodeUninvite'] = '/uninvite Nom_d_utilisateur';
+$lang['helpItemDescLogout'] = 'Se déconnecter du chat :';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Message privé :';
+$lang['helpItemCodePrivateMessage'] = '/msg Nom_d_utilisateur Texte';
+$lang['helpItemDescQueryOpen'] = 'Ouvrir un canal privé :';
+$lang['helpItemCodeQueryOpen'] = '/query Nom_d_utilisateur';
+$lang['helpItemDescQueryClose'] = 'Fermer un canal privé:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Décrire une action :';
+$lang['helpItemCodeAction'] = '/action Texte';
+$lang['helpItemDescDescribe'] = 'Décrire une action dans un message privé :';
+$lang['helpItemCodeDescribe'] = '/describe Nom_d_utilisateur Texte';
+$lang['helpItemDescIgnore'] = 'Ignorer / Accepter les messages de l’utilisateur :';
+$lang['helpItemCodeIgnore'] = '/ignore Nom_d_utilisateur';
+$lang['helpItemDescIgnoreList'] = 'Liste des utilisateurs ignorés :';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Display user channel :';
+$lang['helpItemCodeWhereis'] = '/whereis Username';
+$lang['helpItemDescKick'] = 'Éjecter un utilisateur (Modérateurs seulement) :';
+$lang['helpItemCodeKick'] = '/kick Nom_d_utilisateur [Temps en minutes de ban]';
+$lang['helpItemDescUnban'] = 'Débannir un utilisateur (Modérateurs seulement) :';
+$lang['helpItemCodeUnban'] = '/unban Nom_d_utilisateur';
+$lang['helpItemDescBans'] = 'Liste des utilisateurs bannis (Modérateurs seulement) :';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Afficher l’adresse IP de l’utilisateur (Modérateurs seulement) :';
+$lang['helpItemCodeWhois'] = '/whois Nom_d_utilisateur';
+$lang['helpItemDescWho'] = 'Liste des utilisateurs en ligne :';
+$lang['helpItemCodeWho'] = '/who [Nom du salon]';
+$lang['helpItemDescList'] = 'Liste des salons disponibles :';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Jeter un dé :';
+$lang['helpItemCodeRoll'] = '/roll [nombre de dés]d[nombre de faces]';
+$lang['helpItemDescNick'] = 'Changer le nom d’utilisateur';
+$lang['helpItemCodeNick'] = '/nick Nom_d_utilisateur';
+$lang['settings'] = 'Préférences';
+$lang['settingsBBCode'] = 'Activer le BBCode :';
+$lang['settingsBBCodeImages'] = 'Activer le BBCode des images :';
+$lang['settingsBBCodeColors'] = 'Activer le BBCode pour la couleur de la police :';
+$lang['settingsHyperLinks'] = 'Activer les liens :';
+$lang['settingsLineBreaks'] = 'Activer les lignes blanches :';
+$lang['settingsEmoticons'] = 'Activer les émoticons :';
+$lang['settingsAutoFocus'] = 'Champ de saisie automatique :';
+$lang['settingsMaxMessages'] = 'Maximum de messages dans le chat :';
+$lang['settingsWordWrap'] = 'Activer la coupure des mots :';
+$lang['settingsMaxWordLength'] = 'Longueur maximum des mots :';
+$lang['settingsDateFormat'] = 'Format de la date :';
+$lang['settingsPersistFontColor'] = 'Garder la couleur du font :';
+$lang['settingsAudioVolume'] = 'Volume du son :';
+$lang['settingsSoundReceive'] = 'Son message entrant :';
+$lang['settingsSoundSend'] = 'Son message sortant :';
+$lang['settingsSoundEnter'] = 'Son pour connexion :';
+$lang['settingsSoundLeave'] = 'Son pour déconnexion :';
+$lang['settingsSoundChatBot'] = 'Son pour message robot :';
+$lang['settingsSoundError'] = 'Son pour les erreurs :';
+$lang['settingsBlink'] = 'Clignoter à chaque nouveau message :';
+$lang['settingsBlinkInterval'] = 'Intervalle de clignotage :';
+$lang['settingsBlinkIntervalNumber'] = 'Numéro de clignotage :';
+$lang['playSelectedSound'] = 'Jouer le son sélectionné';
+$lang['requiresJavaScript'] = 'Ce chat requiert JavasSript.';
+$lang['errorInvalidUser'] = 'Nom d’utilisateur incorrect.';
+$lang['errorUserInUse'] = 'Nom d’utilisateur déjà utilisé.';
+$lang['errorBanned'] = 'L’utilisateur ou l’adresse IP a été banni(e).';
+$lang['errorMaxUsersLoggedIn'] = 'Le chat a atteint le nombre maximal d’utilisateurs en ligne.';
+$lang['errorChatClosed'] = 'Le chat est fermé pour le moment.';
+$lang['logsTitle'] = 'Chat AJAX - Historique';
+$lang['logsDate'] = 'Date';
+$lang['logsTime'] = 'Heure';
+$lang['logsSearch'] = 'Chercher';
+$lang['logsPrivateChannels'] = 'Salons privés';
+$lang['logsPrivateMessages'] = 'Messages privés';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/gl.php b/library/ajaxchat/chat/lib/lang/gl.php
new file mode 100644
index 000000000..54b8a8ee6
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/gl.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Manu Quintans
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Usuario';
+$lang['password'] = 'Password';
+$lang['login'] = 'Entrar';
+$lang['logout'] = 'Pechar Sesión';
+$lang['channel'] = 'Canle';
+$lang['style'] = 'Estilo';
+$lang['language'] = 'Idioma';
+$lang['inputLineBreak'] = 'Prema SHIFT+ENTER para un salto de liña';
+$lang['messageSubmit'] = 'Enviar';
+$lang['registeredUsers'] = 'Usuarios rexistrados';
+$lang['onlineUsers'] = 'Usuarios Conectados';
+$lang['toggleAutoScroll'] = 'Autoscroll on/off';
+$lang['toggleAudio'] = 'Sons on/off';
+$lang['toggleHelp'] = 'Amosar/Esconder ayuda';
+$lang['toggleSettings'] = 'Amosar/Esconder configuración';
+$lang['toggleOnlineList'] = 'Amosar/Esconder usuarios en liña';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Quote';
+$lang['bbCodeLabelCode'] = 'Code';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Imagen';
+$lang['bbCodeLabelColor'] = 'Color fonte';
+$lang['bbCodeTitleBold'] = 'Texto negriña: [b]text[/b]';
+$lang['bbCodeTitleItalic'] = 'Texto cursiva: [i]text[/i]';
+$lang['bbCodeTitleUnderline'] = 'Texto subraiado: [u]text[/u]';
+$lang['bbCodeTitleQuote'] = 'Texto entrecomillado: [quote]text[/quote] or [quote=author]text[/quote]';
+$lang['bbCodeTitleCode'] = 'Mosrar código: [code]code[/code]';
+$lang['bbCodeTitleURL'] = 'Insertar URL: [url]http://example.org[/url] or [url=http://example.org]text[/url]';
+$lang['bbCodeTitleImg'] = 'Insertar imaxe: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Cor fonte: [color=red]text[/color]';
+$lang['help'] = 'Axuda';
+$lang['helpItemDescJoin'] = 'Entrar na canle:';
+$lang['helpItemCodeJoin'] = '/join nome da canle';
+$lang['helpItemDescJoinCreate'] = 'Crear un privado(So usuarios registrados):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Invitar a alguén(por ex. a un privado):';
+$lang['helpItemCodeInvite'] = '/invite Nome usuario';
+$lang['helpItemDescUninvite'] = 'Rechazar invitación:';
+$lang['helpItemCodeUninvite'] = '/uninvite Nome usuario';
+$lang['helpItemDescLogout'] = 'Pechar sesión:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Mensaxe Privada:';
+$lang['helpItemCodePrivateMessage'] = '/msg Usuario Texto';
+$lang['helpItemDescQueryOpen'] = 'Abrir unha canle privada:';
+$lang['helpItemCodeQueryOpen'] = '/query Usuario';
+$lang['helpItemDescQueryClose'] = 'Pechar canle privada:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Describe acción:';
+$lang['helpItemCodeAction'] = '/action Texto';
+$lang['helpItemDescDescribe'] = 'Describe acción nunha mensaxe privada:';
+$lang['helpItemCodeDescribe'] = '/describe Nome Usuario Texto';
+$lang['helpItemDescIgnore'] = 'Ignorar/Aceptar mensaxes de usuarios:';
+$lang['helpItemCodeIgnore'] = '/ignore Usuario';
+$lang['helpItemDescIgnoreList'] = 'Listar usuarios Ignorados:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Mostrar canle usuario:';
+$lang['helpItemCodeWhereis'] = '/whereis Usuario';
+$lang['helpItemDescKick'] = 'Banear usuario (Só moderadores):';
+$lang['helpItemCodeKick'] = '/kick Usuario [Minutos baneado]';
+$lang['helpItemDescUnban'] = 'Quitar ban usuario (Só moderadores):';
+$lang['helpItemCodeUnban'] = '/unban Nome usuario';
+$lang['helpItemDescBans'] = 'Listar usuarios baneados (Só moderadores):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Amosar ips de usuarios (So moderadores):';
+$lang['helpItemCodeWhois'] = '/whois Nome usuario';
+$lang['helpItemDescWho'] = 'Amosar usuarios conectados:';
+$lang['helpItemCodeWho'] = '/who [Nome canle]';
+$lang['helpItemDescList'] = 'Lista de canles disponibles:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Roll dice:';
+$lang['helpItemCodeRoll'] = '/roll [number]d[sides]';
+$lang['helpItemDescNick'] = 'Cambiar Nome usuario:';
+$lang['helpItemCodeNick'] = '/nick Usuario';
+$lang['settings'] = 'Configuración';
+$lang['settingsBBCode'] = 'Activar BBCode:';
+$lang['settingsBBCodeImages'] = 'Activar imaxes BBCode:';
+$lang['settingsBBCodeColors'] = 'Activar cor fonte BBCode:';
+$lang['settingsHyperLinks'] = 'Activar enlaces:';
+$lang['settingsLineBreaks'] = 'Activar saltos de liña:';
+$lang['settingsEmoticons'] = 'Activar emoticonos:';
+$lang['settingsAutoFocus'] = 'Foco en campo de entrada automáticamente:';
+$lang['settingsMaxMessages'] = 'Máximo número de mensaxes:';
+$lang['settingsWordWrap'] = 'Activar wrapping en palabras largas:';
+$lang['settingsMaxWordLength'] = 'Máxima lonxutide de palabra antes de wrap:';
+$lang['settingsDateFormat'] = 'Formato de data e hora:';
+$lang['settingsPersistFontColor'] = 'Fixar cor de fonte:';
+$lang['settingsAudioVolume'] = 'Volume sons:';
+$lang['settingsSoundReceive'] = 'Son para mensaxes entrantes:';
+$lang['settingsSoundSend'] = 'Son para mensaxes salientes:';
+$lang['settingsSoundEnter'] = 'Son para login :';
+$lang['settingsSoundLeave'] = 'Son para logout :';
+$lang['settingsSoundChatBot'] = 'Son para mensaxes chat:';
+$lang['settingsSoundError'] = 'Son para errores:';
+$lang['settingsBlink'] = 'Parpadeo en ventá con novas mensaxes:';
+$lang['settingsBlinkInterval'] = 'Intervalo parpadeos (milisegundos):';
+$lang['settingsBlinkIntervalNumber'] = 'Número de parpadeos:';
+$lang['playSelectedSound'] = 'Executa son';
+$lang['requiresJavaScript'] = 'Necesitas ter activado o Javascript no teu navegador..';
+$lang['errorInvalidUser'] = 'Usuario Incorrecto.';
+$lang['errorUserInUse'] = 'Este Nome de usuario xa está sendo utilizado neste momento.';
+$lang['errorBanned'] = 'Usuario ou IP baneada..';
+$lang['errorMaxUsersLoggedIn'] = 'O chat alcanzou o número máximo de conexións.';
+$lang['errorChatClosed'] = 'Chat pechado neste momento.';
+$lang['logsTitle'] = 'AJAX Chat - Logs';
+$lang['logsDate'] = 'Data';
+$lang['logsTime'] = 'Hora';
+$lang['logsSearch'] = 'Buscar';
+$lang['logsPrivateChannels'] = 'Canles privadas';
+$lang['logsPrivateMessages'] = 'mensaxes privadas';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/he.php b/library/ajaxchat/chat/lib/lang/he.php
new file mode 100644
index 000000000..39fa799d2
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/he.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Smiley Barry
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'שם משתמש';
+$lang['password'] = 'סיסמה';
+$lang['login'] = 'היכנס';
+$lang['logout'] = 'צא';
+$lang['channel'] = 'ערוץ';
+$lang['style'] = 'סגנון';
+$lang['language'] = 'לשון';
+$lang['inputLineBreak'] = 'Press SHIFT+ENTER to input a line break';
+$lang['messageSubmit'] = 'שלח';
+$lang['registeredUsers'] = 'משתמשים רשומים';
+$lang['onlineUsers'] = 'משתמשים מחוברים';
+$lang['toggleAutoScroll'] = 'Autoscroll on/off';
+$lang['toggleAudio'] = 'Sound on/off';
+$lang['toggleHelp'] = 'Show/hide help';
+$lang['toggleSettings'] = 'Show/hide settings';
+$lang['toggleOnlineList'] = 'Show/hide online list';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'צטט';
+$lang['bbCodeLabelCode'] = 'קוד';
+$lang['bbCodeLabelURL'] = 'כתובת אינטרנט';
+$lang['bbCodeLabelImg'] = 'Image';
+$lang['bbCodeLabelColor'] = 'צבע גופן';
+$lang['bbCodeTitleBold'] = 'טקסט מודגש: [b]טקסט[/b]';
+$lang['bbCodeTitleItalic'] = 'טקסט נטוי: [i]טקסט[/i]';
+$lang['bbCodeTitleUnderline'] = 'טקסט מודגש קו: [u]טקסט[/u]';
+$lang['bbCodeTitleQuote'] = 'צטט טקסט: [quote]טקסט[/quote] או [quote=כותב מקורי]טקסט[/quote]';
+$lang['bbCodeTitleCode'] = 'הראה קוד: [code]קוד[/code]';
+$lang['bbCodeTitleURL'] = 'הכנס כתובת: [url]http://www.example.org[/url] או[url=http://www.example.org]טקסט[/url]';
+$lang['bbCodeTitleImg'] = 'Insert image: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'צבע גופן: [color=צבע]טקסט[/color]';
+$lang['help'] = 'עזרה';
+$lang['helpItemDescJoin'] = 'הצטרף לערוץ:';
+$lang['helpItemCodeJoin'] = '/join שם ערוץ';
+$lang['helpItemDescJoinCreate'] = 'צור חדר פרטי (משתמשים רשומים בלבד):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'הזמן מישהו (דוגמא: חדר פרטי):';
+$lang['helpItemCodeInvite'] = '/invite שם_משתמש';
+$lang['helpItemDescUninvite'] = 'בטל הזמנה:';
+$lang['helpItemCodeUninvite'] = '/uninvite שם_משתמש';
+$lang['helpItemDescLogout'] = 'צא מהצאט:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'הודעה פרטית:';
+$lang['helpItemCodePrivateMessage'] = '/msg שם_משתמש טקסט';
+$lang['helpItemDescQueryOpen'] = 'פתח ערוץ אישי:';
+$lang['helpItemCodeQueryOpen'] = '/query שם_משתמש';
+$lang['helpItemDescQueryClose'] = 'סגור ערוץ אישי:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'תאר פעולה:';
+$lang['helpItemCodeAction'] = '/action טקסט';
+$lang['helpItemDescDescribe'] = 'תאר פעולה בהודעה פרטית:';
+$lang['helpItemCodeDescribe'] = '/describe שם_משתמש טקסט';
+$lang['helpItemDescIgnore'] = 'התעלם או קבל הודעות ממשתמש:';
+$lang['helpItemCodeIgnore'] = '/ignore שם_משתמש';
+$lang['helpItemDescIgnoreList'] = 'הראה רשימה של אנשים שאתה מתעלם מהם:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Display user channel:';
+$lang['helpItemCodeWhereis'] = '/whereis Username';
+$lang['helpItemDescKick'] = 'העף משתמש (חברי צוות בלבד):';
+$lang['helpItemCodeKick'] = '/kick שם_משתמש [מספר דקות]';
+$lang['helpItemDescUnban'] = 'בטל חסימת משתמש (חברי צוות בלבד):';
+$lang['helpItemCodeUnban'] = '/unban שם_משתמש';
+$lang['helpItemDescBans'] = 'הראה רשימת משתמשים חסומים (חברי צוות בלבד):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'הראה כתובת מחשב של משתמש (חברי צוות בלבד):';
+$lang['helpItemCodeWhois'] = '/whois שם_משתמש';
+$lang['helpItemDescWho'] = 'הראה רשימת משתמשים מחוברים:';
+$lang['helpItemCodeWho'] = '/who שם_ערוץ';
+$lang['helpItemDescList'] = 'הראה רשימת ערוצים פתוחים:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'גלגל קוביה:';
+$lang['helpItemCodeRoll'] = '/roll [מספר]d[צדדים]';
+$lang['helpItemDescNick'] = 'Change username:';
+$lang['helpItemCodeNick'] = '/nick Username';
+$lang['settings'] = 'Settings';
+$lang['settingsBBCode'] = 'Enable BBCode:';
+$lang['settingsBBCodeImages'] = 'Enable image BBCode:';
+$lang['settingsBBCodeColors'] = 'Enable font color BBCode:';
+$lang['settingsHyperLinks'] = 'Enable hyperlinks:';
+$lang['settingsLineBreaks'] = 'Enable line breaks:';
+$lang['settingsEmoticons'] = 'Enable emoticons:';
+$lang['settingsAutoFocus'] = 'Automatically set the focus on the input field:';
+$lang['settingsMaxMessages'] = 'Maximum number of messages in the chatlist:';
+$lang['settingsWordWrap'] = 'Enable wrapping of long words:';
+$lang['settingsMaxWordLength'] = 'Maximum length of a word before it gets wrapped:';
+$lang['settingsDateFormat'] = 'Format of date and time display:';
+$lang['settingsPersistFontColor'] = 'Persist font color:';
+$lang['settingsAudioVolume'] = 'Sound Volume:';
+$lang['settingsSoundReceive'] = 'Sound for incoming messages:';
+$lang['settingsSoundSend'] = 'Sound for outgoing messages:';
+$lang['settingsSoundEnter'] = 'Sound for login and channel enter messages:';
+$lang['settingsSoundLeave'] = 'Sound for logout and channel leave messages:';
+$lang['settingsSoundChatBot'] = 'Sound for chatbot messages:';
+$lang['settingsSoundError'] = 'Sound for error messages:';
+$lang['settingsBlink'] = 'Blink window title on new messages:';
+$lang['settingsBlinkInterval'] = 'Blink interval in milliseconds:';
+$lang['settingsBlinkIntervalNumber'] = 'Number of blink intervals:';
+$lang['playSelectedSound'] = 'Play selected sound';
+$lang['requiresJavaScript'] = 'JavaScript נצרך בשביל הצאט הזה.';
+$lang['errorInvalidUser'] = 'שם משתמש לא חוקי.';
+$lang['errorUserInUse'] = 'שם משתמש בשימוש.';
+$lang['errorBanned'] = 'משתמש או כתובת מחשב חסומים.';
+$lang['errorMaxUsersLoggedIn'] = 'הצאט כרגע מלא.';
+$lang['errorChatClosed'] = 'הצאט כרגע סגור.';
+$lang['logsTitle'] = 'תיעוד';
+$lang['logsDate'] = 'תאריך';
+$lang['logsTime'] = 'זמן';
+$lang['logsSearch'] = 'חיפוש';
+$lang['logsPrivateChannels'] = 'ערוצים פרטיים';
+$lang['logsPrivateMessages'] = 'הודעות פרטיות';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/hr.php b/library/ajaxchat/chat/lib/lang/hr.php
new file mode 100644
index 000000000..ed0451033
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/hr.php
@@ -0,0 +1,123 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Brbljanje';
+$lang['userName'] = 'Korisničko ime';
+$lang['password'] = 'Lozinka';
+$lang['login'] = 'Prijava';
+$lang['logout'] = 'Odjava';
+$lang['channel'] = 'Kanal';
+$lang['style'] = 'Stil';
+$lang['language'] = 'Jezik';
+$lang['inputLineBreak'] = 'Za unos novog retka pritisnite SHIFT+ENTER';
+$lang['messageSubmit'] = 'Pošalji';
+$lang['registeredUsers'] = 'Registrirani korisnici';
+$lang['onlineUsers'] = 'Prisutni korisnici';
+$lang['toggleAutoScroll'] = 'Automatsko klizanje - uklj/isklj ';
+$lang['toggleAudio'] = 'Zvuk - uklj/isklj';
+$lang['toggleHelp'] = 'Pomoć - prikaži/sakrij';
+$lang['toggleSettings'] = 'Postavke - prikaži/sakrij';
+$lang['toggleOnlineList'] = 'Popisa prisutnih - prikaži/sakrij';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Citat';
+$lang['bbCodeLabelCode'] = 'Kôd';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Slika';
+$lang['bbCodeLabelColor'] = 'Boja';
+$lang['bbCodeTitleBold'] = 'Snažan tekst: [b]tekst[/b]';
+$lang['bbCodeTitleItalic'] = 'Kurziv: [i]tekst[/i]';
+$lang['bbCodeTitleUnderline'] = 'Podvučeni tekst: [u]tekst[/u]';
+$lang['bbCodeTitleQuote'] = 'Citirani tekst: [quote]tekst[/quote] ili [quote=autor]tekst[/quote]';
+$lang['bbCodeTitleCode'] = 'Prikaz kôda: [code]kôd[/code]';
+$lang['bbCodeTitleURL'] = 'Umetanje URL: [url]http://primjer.org[/url] ili [url=http://primjer.org]tekst[/url]';
+$lang['bbCodeTitleImg'] = 'Umetanje slike: [img]http://primjer.org/slika.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Boja fonta: [color=red]tekst[/color]';
+$lang['help'] = 'Pomoć';
+$lang['helpItemDescJoin'] = 'Pridruživanje kanalu:';
+$lang['helpItemCodeJoin'] = '/join kanal';
+$lang['helpItemDescJoinCreate'] = 'Izrada privatne sobe (samo za registrirane korisnike):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Pozivanje korisnika (npr. u privatnu sobu):';
+$lang['helpItemCodeInvite'] = '/invite korisnik';
+$lang['helpItemDescUninvite'] = 'Opoziv:';
+$lang['helpItemCodeUninvite'] = '/uninvite korisnik';
+$lang['helpItemDescLogout'] = 'Odjava iz brbljanja:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Privatna poruka:';
+$lang['helpItemCodePrivateMessage'] = '/msg korisnik tekst';
+$lang['helpItemDescQueryOpen'] = 'Otvaranje privatnog kanala:';
+$lang['helpItemCodeQueryOpen'] = '/query korisnik';
+$lang['helpItemDescQueryClose'] = 'Zatvaranje privatnog kanala:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Aktivnost:';
+$lang['helpItemCodeAction'] = '/action tekst';
+$lang['helpItemDescDescribe'] = 'Aktivnost u privatnoj poruci:';
+$lang['helpItemCodeDescribe'] = '/describe korisnik tekst';
+$lang['helpItemDescIgnore'] = 'Ignoriranje/prihvaćanje poruka od korisnika:';
+$lang['helpItemCodeIgnore'] = '/ignore korisnik';
+$lang['helpItemDescIgnoreList'] = 'Ispisivanje ignoriranih korisnika:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Prikazivanje korisničkog kanala:';
+$lang['helpItemCodeWhereis'] = '/whereis korisnik';
+$lang['helpItemDescKick'] = 'Progon korisnika (samo za moderatore):';
+$lang['helpItemCodeKick'] = '/kick korisnik [minute]';
+$lang['helpItemDescUnban'] = 'Uklanjanje zabrane korisnika (samo za moderatore):';
+$lang['helpItemCodeUnban'] = '/unban korisnik';
+$lang['helpItemDescBans'] = 'Ispisivanje zabranjenih korisnika (samo za moderatore):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Prikazivanje IP korisnika (samo za moderatore):';
+$lang['helpItemCodeWhois'] = '/whois korisnik';
+$lang['helpItemDescWho'] = 'Ispisivanje prisutnih korisnika:';
+$lang['helpItemCodeWho'] = '/who [kanal]';
+$lang['helpItemDescList'] = 'Ispisivanje dostupnih kanala:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Bacanje kocke:';
+$lang['helpItemCodeRoll'] = '/roll [broj]d[strane]';
+$lang['helpItemDescNick'] = 'Promjena korisničkog imena:';
+$lang['helpItemCodeNick'] = '/nick korisnik';
+$lang['settings'] = 'Postavke';
+$lang['settingsBBCode'] = 'Omogući BB kôd:';
+$lang['settingsBBCodeImages'] = 'Omogući BB kôd za slike:';
+$lang['settingsBBCodeColors'] = 'Omogući BB kôd za boju fonta:';
+$lang['settingsHyperLinks'] = 'Omogući hiperveze:';
+$lang['settingsLineBreaks'] = 'Omogući nove retke:';
+$lang['settingsEmoticons'] = 'Omogući emotikone:';
+$lang['settingsAutoFocus'] = 'Automatski postavi fokus u polje unosa:';
+$lang['settingsMaxMessages'] = 'Najveći broj poruka na popisu:';
+$lang['settingsWordWrap'] = 'Omogući obmatanje dugih riječi:';
+$lang['settingsMaxWordLength'] = 'Najveća duljina riječi prije njezinog obmatanja:';
+$lang['settingsDateFormat'] = 'Oblikovanje datuma i vremena:';
+$lang['settingsPersistFontColor'] = 'Dosljedna boja fonta:';
+$lang['settingsAudioVolume'] = 'Glasnoća zvuka:';
+$lang['settingsSoundReceive'] = 'Zvuk za dolazne poruke:';
+$lang['settingsSoundSend'] = 'Zvuk za odlazne poruke:';
+$lang['settingsSoundEnter'] = 'Zvuk za prijavljivanje i poruke pristupanja kanalu:';
+$lang['settingsSoundLeave'] = 'Zvuk za odjavljivanje i poruke napuštanja kanala:';
+$lang['settingsSoundChatBot'] = 'Zvuk za poruke brbljobota:';
+$lang['settingsSoundError'] = 'Zvuk za poruke pogreške:';
+$lang['settingsBlink'] = 'Treptanje naslova prozora kod novih poruka:';
+$lang['settingsBlinkInterval'] = 'Trajanje treptanja (u milisekundama):';
+$lang['settingsBlinkIntervalNumber'] = 'Broj treptanja:';
+$lang['playSelectedSound'] = 'Pokreni odabrani zvuk';
+$lang['requiresJavaScript'] = 'Ovo brbljanje zahtjeva JavaScript.';
+$lang['errorInvalidUser'] = 'Nepravilno korisničko ime.';
+$lang['errorUserInUse'] = 'Korisničko ime već je u upotrebi.';
+$lang['errorBanned'] = 'Korisnik ili IP je zabranjen.';
+$lang['errorMaxUsersLoggedIn'] = 'Brbljaonica je dostigla najveći dopušteni broj prijavljenih korisnika.';
+$lang['errorChatClosed'] = 'Brbljaonica je trenutno zatvorena.';
+$lang['logsTitle'] = 'AJAX Brbljanje - Zapisnici';
+$lang['logsDate'] = 'Datum';
+$lang['logsTime'] = 'Vrijeme';
+$lang['logsSearch'] = 'Traži';
+$lang['logsPrivateChannels'] = 'Privatni kanali';
+$lang['logsPrivateMessages'] = 'Privatne poruke';
+?>
diff --git a/library/ajaxchat/chat/lib/lang/hu.php b/library/ajaxchat/chat/lib/lang/hu.php
new file mode 100644
index 000000000..5f2174134
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/hu.php
@@ -0,0 +1,123 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Felhasználónév';
+$lang['password'] = 'Jelszó';
+$lang['login'] = 'Belépés';
+$lang['logout'] = 'Kilépés';
+$lang['channel'] = 'Szoba';
+$lang['style'] = 'Stílus';
+$lang['language'] = 'Nyelv';
+$lang['inputLineBreak'] = 'Üsse le a SHIFT+ENTER billentyűket sortöréshez';
+$lang['messageSubmit'] = 'Küldés';
+$lang['registeredUsers'] = 'Regisztrált felhasználók';
+$lang['onlineUsers'] = 'Jelenlévők';
+$lang['toggleAutoScroll'] = 'Automatikus görgetés be/ki';
+$lang['toggleAudio'] = 'Hang be/ki';
+$lang['toggleHelp'] = 'Segítség mutatása/elrejtése';
+$lang['toggleSettings'] = 'Beállítások mutatása/elrejtése';
+$lang['toggleOnlineList'] = 'Jelenlévők mutatása/elrejtése';
+$lang['bbCodeLabelBold'] = 'B';
+$lang['bbCodeLabelItalic'] = 'I';
+$lang['bbCodeLabelUnderline'] = 'U';
+$lang['bbCodeLabelQuote'] = 'Idézet';
+$lang['bbCodeLabelCode'] = 'Kód';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Kép';
+$lang['bbCodeLabelColor'] = 'Szöveg szín';
+$lang['bbCodeTitleBold'] = 'Félkövér szöveg: [b]szöveg[/b]';
+$lang['bbCodeTitleItalic'] = 'Dőlt szöveg: [i]szöveg[/i]';
+$lang['bbCodeTitleUnderline'] = 'Aláhúzott szöveg: [u]szöveg[/u]';
+$lang['bbCodeTitleQuote'] = 'Idézett szöveg: [quote]szöveg[/quote] vagy [quote=szerző]szöveg[/quote]';
+$lang['bbCodeTitleCode'] = 'Kód: [code]kód[/code]';
+$lang['bbCodeTitleURL'] = 'URL beszúrása: [url]http://example.org[/url] vagy [url=http://example.org]szöveg[/url]';
+$lang['bbCodeTitleImg'] = 'Kép beszúrása: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Szöveg szín: [color=red]szöveg[/color]';
+$lang['help'] = 'Segítség';
+$lang['helpItemDescJoin'] = 'Belépés a szobába:';
+$lang['helpItemCodeJoin'] = '/join Szobanév';
+$lang['helpItemDescJoinCreate'] = 'Privát szoba létrehozása (Csak regisztráltaknak):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Meghívás (pl. privát szobába):';
+$lang['helpItemCodeInvite'] = '/invite Nick';
+$lang['helpItemDescUninvite'] = 'Meghívás megszüntetése:';
+$lang['helpItemCodeUninvite'] = '/uninvite Nick';
+$lang['helpItemDescLogout'] = 'Kilépés a chatből:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Privát üzenet:';
+$lang['helpItemCodePrivateMessage'] = '/msg Nick szöveg';
+$lang['helpItemDescQueryOpen'] = 'Privát szoba létrehozása:';
+$lang['helpItemCodeQueryOpen'] = '/query Nick';
+$lang['helpItemDescQueryClose'] = 'Privát szoba beázárása:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Akció írása (E/3 személyű beszéd):';
+$lang['helpItemCodeAction'] = '/action szöveg';
+$lang['helpItemDescDescribe'] = 'Akció privát beszélgetésben:';
+$lang['helpItemCodeDescribe'] = '/describe Nick szöveg';
+$lang['helpItemDescIgnore'] = 'Felhasználó figyelembe vétele/figyelmen kívül hagyása:';
+$lang['helpItemCodeIgnore'] = '/ignore Nick';
+$lang['helpItemDescIgnoreList'] = 'Figyelmen kívül hagyottak listája:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'A felhasználó mely szobákban tartózkodik:';
+$lang['helpItemCodeWhereis'] = '/whereis Nick';
+$lang['helpItemDescKick'] = 'Felhasználó kirúgása (Csak moderátorok):';
+$lang['helpItemCodeKick'] = '/kick Nick [kitiltás percekben]';
+$lang['helpItemDescUnban'] = 'Tiltás feloldása (Csak moderátorok):';
+$lang['helpItemCodeUnban'] = '/unban Nick';
+$lang['helpItemDescBans'] = 'Kitiltottak listája (Csak moderátorok):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Felhasználó IP címének mutatása (Csak moderátorok):';
+$lang['helpItemCodeWhois'] = '/whois Nick';
+$lang['helpItemDescWho'] = 'Jelenlévők listázása:';
+$lang['helpItemCodeWho'] = '/who [Szobanév]';
+$lang['helpItemDescList'] = 'Szobák listázása:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Dobókocka dobás:';
+$lang['helpItemCodeRoll'] = '/roll [szám]d[oldalak]';
+$lang['helpItemDescNick'] = 'Nick cseréje:';
+$lang['helpItemCodeNick'] = '/nick Nick';
+$lang['settings'] = 'Beállítások';
+$lang['settingsBBCode'] = 'BBCode engedélyezése:';
+$lang['settingsBBCodeImages'] = 'Kép BBCode engedélyezése:';
+$lang['settingsBBCodeColors'] = 'Szöveg szín BBCode engedélyezése:';
+$lang['settingsHyperLinks'] = 'Linkek engedélyezése:';
+$lang['settingsLineBreaks'] = 'Sortörések engedélyezése:';
+$lang['settingsEmoticons'] = 'Emotikonok engedélyezése:';
+$lang['settingsAutoFocus'] = 'Automatikusan a beviteli mezőn legyen a fókusz:';
+$lang['settingsMaxMessages'] = 'Maximálisan látható üzenetek száma:';
+$lang['settingsWordWrap'] = 'Hosszú szavak tördelése:';
+$lang['settingsMaxWordLength'] = 'Maximális karakterszám egy szó tördelése előtt:';
+$lang['settingsDateFormat'] = 'Dátum és idő kijelzésének formátuma:';
+$lang['settingsPersistFontColor'] = 'Folyamatos betűszín használata:';
+$lang['settingsAudioVolume'] = 'Hangerő:';
+$lang['settingsSoundReceive'] = 'Bejövő üzenetek hangja:';
+$lang['settingsSoundSend'] = 'Kimenő üzenetek hangja:';
+$lang['settingsSoundEnter'] = 'Belépés szobaüzenetek hangja:';
+$lang['settingsSoundLeave'] = 'Kilépés szobaüzenetek hangja:';
+$lang['settingsSoundChatBot'] = 'ChatBot üzenetek hangja:';
+$lang['settingsSoundError'] = 'Hibaüzenetek hangja:';
+$lang['settingsBlink'] = 'Ablak fejléce villogjon új üzenet esetén:';
+$lang['settingsBlinkInterval'] = 'A villogás intervallumának hossza századmásodpercekben:';
+$lang['settingsBlinkIntervalNumber'] = 'Villogási intervallumok száma:';
+$lang['playSelectedSound'] = 'Kiválasztott hang lejátszása';
+$lang['requiresJavaScript'] = 'A JavaScript bekapcsolása szükséges a chat használatához.';
+$lang['errorInvalidUser'] = 'Hamis Nick.';
+$lang['errorUserInUse'] = 'A nick már használatban van.';
+$lang['errorBanned'] = 'Ez a felhasználó vagy IP ki van tiltva.';
+$lang['errorMaxUsersLoggedIn'] = 'A chatelők száma elérte a megengedett maximumot.';
+$lang['errorChatClosed'] = 'A chat jelenleg nem üzemel.';
+$lang['logsTitle'] = 'AJAX Chat - Logok';
+$lang['logsDate'] = 'Dátum';
+$lang['logsTime'] = 'Idő';
+$lang['logsSearch'] = 'Keresés';
+$lang['logsPrivateChannels'] = 'Privát szobák';
+$lang['logsPrivateMessages'] = 'Privát üzenetek';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/in.php b/library/ajaxchat/chat/lib/lang/in.php
new file mode 100644
index 000000000..175cc904b
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/in.php
@@ -0,0 +1,123 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Nama';
+$lang['password'] = 'Password';
+$lang['login'] = 'Masuk';
+$lang['logout'] = 'Keluar';
+$lang['channel'] = 'Channel';
+$lang['style'] = 'Model';
+$lang['language'] = 'Bahasa';
+$lang['inputLineBreak'] = 'Tekan SHIFT+ENTER untuk berpindah baris';
+$lang['messageSubmit'] = 'Tampilkan';
+$lang['registeredUsers'] = 'Pemakai Terdaftar';
+$lang['onlineUsers'] = 'Pemakai Online';
+$lang['toggleAutoScroll'] = 'Scroll Otomatis on/off';
+$lang['toggleAudio'] = 'Suara on/off';
+$lang['toggleHelp'] = 'Tampilkan/Sembunyikan help';
+$lang['toggleSettings'] = 'Tampilkan/Sembunyikan settings';
+$lang['toggleOnlineList'] = 'Tampilkan/Sembunyikan daftar online';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Salin';
+$lang['bbCodeLabelCode'] = 'Kode';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Gambar';
+$lang['bbCodeLabelColor'] = 'Warna Huruf';
+$lang['bbCodeTitleBold'] = 'Huruf Tebal: [b]kata[/b]';
+$lang['bbCodeTitleItalic'] = 'Huruf Miring: [i]kata[/i]';
+$lang['bbCodeTitleUnderline'] = 'Garis Bawah: [u]kata[/u]';
+$lang['bbCodeTitleQuote'] = 'Kata Saduran: [quote]kata[/quote] or [quote=author]text[/quote]';
+$lang['bbCodeTitleCode'] = 'Code display: [code]code[/code]';
+$lang['bbCodeTitleURL'] = 'Sisip URL: [url]http://example.org[/url] or [url=http://example.org]text[/url]';
+$lang['bbCodeTitleImg'] = 'Sisip gambar: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Warna Huruf: [color=red]text[/color]';
+$lang['help'] = 'Help';
+$lang['helpItemDescJoin'] = 'Gabung Channel:';
+$lang['helpItemCodeJoin'] = '/join NamaChannel';
+$lang['helpItemDescJoinCreate'] = 'Buat ruang privasi (Hanya untuk pengguna terdaftar):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Mengundang Seseorang (mis: ke ruang privasi):';
+$lang['helpItemCodeInvite'] = '/invite NamaPengguna';
+$lang['helpItemDescUninvite'] = 'Batalkan Undangan:';
+$lang['helpItemCodeUninvite'] = '/uninvite NamaPengguna';
+$lang['helpItemDescLogout'] = 'Keluar dari Chat:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Pesan Pribadi:';
+$lang['helpItemCodePrivateMessage'] = '/msg NamaPengguna Teks';
+$lang['helpItemDescQueryOpen'] = 'Membuka Channel Privasi:';
+$lang['helpItemCodeQueryOpen'] = '/query NamaPengguna';
+$lang['helpItemDescQueryClose'] = 'Menutup Channel Privasi:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Menjelaskan Tindakan:';
+$lang['helpItemCodeAction'] = '/action Teks';
+$lang['helpItemDescDescribe'] = 'Menjelaskan Tindakan pada pesan pribadi:';
+$lang['helpItemCodeDescribe'] = '/describe NamaPengguna Teks';
+$lang['helpItemDescIgnore'] = 'Mengacuhkan/Menerima Pesan Dari Pengguna Lain:';
+$lang['helpItemCodeIgnore'] = '/ignore NamaPengguna';
+$lang['helpItemDescIgnoreList'] = 'Tampilkan Daftar Pengguna yang Diacuhkan:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Tampilkan Pengguna di Channel:';
+$lang['helpItemCodeWhereis'] = '/whereis NamaPengguna';
+$lang['helpItemDescKick'] = 'Menendang Pengguna (Hanya Untuk Moderator):';
+$lang['helpItemCodeKick'] = '/kick NamaPengguna [Jumlah Menit Hukuman]';
+$lang['helpItemDescUnban'] = 'Membatalkan Blok Pengguna (Hanya Untuk Moderator):';
+$lang['helpItemCodeUnban'] = '/unban NamaPengguna';
+$lang['helpItemDescBans'] = 'Tampilkan Daftar Pengguna yang diblok (Hanya Untuk Moderator):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Tampilkan IP Pengguna (Hanya Untuk Moderator):';
+$lang['helpItemCodeWhois'] = '/whois NamaPengguna';
+$lang['helpItemDescWho'] = 'Tampilkan Daftar Pengguna di Channel:';
+$lang['helpItemCodeWho'] = '/who [NamaChannel]';
+$lang['helpItemDescList'] = 'Tampilkan Daftar Channel Yang Tersedia:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Lempar Dadu:';
+$lang['helpItemCodeRoll'] = '/roll [number]d[sides]';
+$lang['helpItemDescNick'] = 'Mengganti Nama:';
+$lang['helpItemCodeNick'] = '/nick Nama';
+$lang['settings'] = 'Pengaturan';
+$lang['settingsBBCode'] = 'Membolehkan BBCode:';
+$lang['settingsBBCodeImages'] = 'Membolehkan gambar BBCode:';
+$lang['settingsBBCodeColors'] = 'Membolehkan warna huruf BBCode:';
+$lang['settingsHyperLinks'] = 'Membolehkan hyperlinks:';
+$lang['settingsLineBreaks'] = 'Membolehkan line breaks:';
+$lang['settingsEmoticons'] = 'Membolehkan emoticons:';
+$lang['settingsAutoFocus'] = 'Mengatur fokus secara otomatis ke kotak input:';
+$lang['settingsMaxMessages'] = 'Jumlah Pesan Maksimum pada daftar Chat:';
+$lang['settingsWordWrap'] = 'Membolehkan memecah suku kata yang panjang:';
+$lang['settingsMaxWordLength'] = 'Panjang maksimum sebuah kata sebelum dipecah:';
+$lang['settingsDateFormat'] = 'Format dari tampilan tanggal dan waktu:';
+$lang['settingsPersistFontColor'] = 'Mempertahankan Warna Huruf:';
+$lang['settingsAudioVolume'] = 'Volume Suara:';
+$lang['settingsSoundReceive'] = 'Suara pada saat pesan masuk:';
+$lang['settingsSoundSend'] = 'Suara pada saat pesan keluar:';
+$lang['settingsSoundEnter'] = 'Suara pada saat masuk channel:';
+$lang['settingsSoundLeave'] = 'Suara pada saat keluar Channel:';
+$lang['settingsSoundChatBot'] = 'Suara pada saat ChatBot:';
+$lang['settingsSoundError'] = 'Suara pada saat terdapat kesalahan:';
+$lang['settingsBlink'] = 'Kedipkan Judul Jendela pada saat ada pesan baru:';
+$lang['settingsBlinkInterval'] = 'Blink interval in milliseconds:';
+$lang['settingsBlinkIntervalNumber'] = 'Jumlah interval kedipan:';
+$lang['playSelectedSound'] = 'Mainkan suara yang dipilih';
+$lang['requiresJavaScript'] = 'JavaScript diperlukan untuk Chat ini.';
+$lang['errorInvalidUser'] = 'Nama Salah.';
+$lang['errorUserInUse'] = 'Nama sudah ada yang pakai.';
+$lang['errorBanned'] = 'Pengguna atau IP diblok.';
+$lang['errorMaxUsersLoggedIn'] = 'Saluran Chat telah mencapai jumlah maksimum pengguna.';
+$lang['errorChatClosed'] = 'Saluran Chat ditutup sementara.';
+$lang['logsTitle'] = 'AJAX Chat - Logs';
+$lang['logsDate'] = 'Tanggal';
+$lang['logsTime'] = 'Waktu';
+$lang['logsSearch'] = 'Cari';
+$lang['logsPrivateChannels'] = 'Saluran-saluran privasi';
+$lang['logsPrivateMessages'] = 'Pesan Pribadi';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/it.php b/library/ajaxchat/chat/lib/lang/it.php
new file mode 100644
index 000000000..abcd4f9db
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/it.php
@@ -0,0 +1,125 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author s8s8
+ * @author Massimiliano Tiraboschi
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Nome';
+$lang['password'] = 'Password';
+$lang['login'] = 'Login';
+$lang['logout'] = 'Uscita';
+$lang['channel'] = 'Canale';
+$lang['style'] = 'Stile';
+$lang['language'] = 'Lingua';
+$lang['inputLineBreak'] = 'Premi SHIFT+ENTER per inserire una linea vuota';
+$lang['messageSubmit'] = 'Invia';
+$lang['registeredUsers'] = 'Utente registrato';
+$lang['onlineUsers'] = 'Utenti Online';
+$lang['toggleAutoScroll'] = 'Autoscroll on/off';
+$lang['toggleAudio'] = 'Suono on/off';
+$lang['toggleHelp'] = 'Mostra/Nascondi aiuto';
+$lang['toggleSettings'] = 'Mostra/Nascondi preferenze';
+$lang['toggleOnlineList'] = 'Mostra/Nascondi lista utenti online';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Cita';
+$lang['bbCodeLabelCode'] = 'Codice';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Image';
+$lang['bbCodeLabelColor'] = 'Colore Testo';
+$lang['bbCodeTitleBold'] = 'Grassetto: [b]testo[/b]';
+$lang['bbCodeTitleItalic'] = 'Corsivo: [i]testo[/i]';
+$lang['bbCodeTitleUnderline'] = 'Sottolineato: [u]testo[/u]';
+$lang['bbCodeTitleQuote'] = 'Cita: [quote]testo[/quote] oppure [quote=autore]testo[/quote]';
+$lang['bbCodeTitleCode'] = 'Mostra Codice: [code]codice[/code]';
+$lang['bbCodeTitleURL'] = 'Inserire URL: [url]http://example.org/[/url] oppure [url=http://example.org/]testo[/url]';
+$lang['bbCodeTitleImg'] = 'Insert image: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Colore Testo: [color=red]testo[/color]';
+$lang['help'] = 'Aiuto';
+$lang['helpItemDescJoin'] = 'Entra nel canale:';
+$lang['helpItemCodeJoin'] = '/join NomeCanale';
+$lang['helpItemDescJoinCreate'] = 'Crea un canale privato (Solo utenti registrati):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Invita qualcuno (e.g. in un canale privato):';
+$lang['helpItemCodeInvite'] = '/invite Username';
+$lang['helpItemDescUninvite'] = 'Rimuovi invito:';
+$lang['helpItemCodeUninvite'] = '/uninvite Username';
+$lang['helpItemDescLogout'] = 'Esce dalla Chat:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Messaggio privato:';
+$lang['helpItemCodePrivateMessage'] = '/msg NomeUtente Testo';
+$lang['helpItemDescQueryOpen'] = 'Apre un canale privato:';
+$lang['helpItemCodeQueryOpen'] = '/query NomeUtente';
+$lang['helpItemDescQueryClose'] = 'Chiude un canale privato:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Descrive azione:';
+$lang['helpItemCodeAction'] = '/action Testo';
+$lang['helpItemDescDescribe'] = 'Descrive azioni in messaggi privati:';
+$lang['helpItemCodeDescribe'] = '/describe NomeUtente Testo';
+$lang['helpItemDescIgnore'] = 'Ignora/accetta messaggi di un Utente:';
+$lang['helpItemCodeIgnore'] = '/ignore NomeUtente';
+$lang['helpItemDescIgnoreList'] = 'Elenca la lista degli ignorati:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Display user channel:';
+$lang['helpItemCodeWhereis'] = '/whereis Username';
+$lang['helpItemDescKick'] = 'Fa uscire un Utente (Solo Moderatore):';
+$lang['helpItemCodeKick'] = '/kick NomeUtente [Minuti bannato]';
+$lang['helpItemDescUnban'] = 'Toglie il Ban a un Utente (Solo Moderatore):';
+$lang['helpItemCodeUnban'] = '/unban NomeUtente';
+$lang['helpItemDescBans'] = 'Lista Utenti Bannati (Solo Moderatore):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Mostra IP Utente (Solo Moderatore):';
+$lang['helpItemCodeWhois'] = '/whois NomeUtente';
+$lang['helpItemDescWho'] = 'Lista Utenti in linea:';
+$lang['helpItemCodeWho'] = '/who [NomeCanale]';
+$lang['helpItemDescList'] = 'Lista canali disponibili:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Lancia i dadi:';
+$lang['helpItemCodeRoll'] = '/roll [quantita]d[faccie]';
+$lang['helpItemDescNick'] = 'Cambia username:';
+$lang['helpItemCodeNick'] = '/nick Username';
+$lang['settings'] = 'Preferenze';
+$lang['settingsBBCode'] = 'Attiva BBCode:';
+$lang['settingsBBCodeImages'] = 'Enable image BBCode:';
+$lang['settingsBBCodeColors'] = 'Enable font color BBCode:';
+$lang['settingsHyperLinks'] = 'Attiva hyperlinks:';
+$lang['settingsLineBreaks'] = 'Attiva linee bianche:';
+$lang['settingsEmoticons'] = 'Attiva emoticons:';
+$lang['settingsAutoFocus'] = 'Focus messaggio automatico:';
+$lang['settingsMaxMessages'] = 'Max messaggi in chat:';
+$lang['settingsWordWrap'] = 'Attiva taglio parole lunghe:';
+$lang['settingsMaxWordLength'] = 'Lunghezza massima parole:';
+$lang['settingsDateFormat'] = 'Formato data ed ora:';
+$lang['settingsPersistFontColor'] = 'Colore font persistente:';
+$lang['settingsAudioVolume'] = 'Volume suono:';
+$lang['settingsSoundReceive'] = 'Suono messaggi entranti:';
+$lang['settingsSoundSend'] = 'Suono messaggi uscenti:';
+$lang['settingsSoundEnter'] = 'Suono per login:';
+$lang['settingsSoundLeave'] = 'Suono per uscita:';
+$lang['settingsSoundChatBot'] = 'Suono per messaggi robot:';
+$lang['settingsSoundError'] = 'Suono per messaggi errore:';
+$lang['settingsBlink'] = 'Lampeggio nuovi messaggi:';
+$lang['settingsBlinkInterval'] = 'Intervallo lampeggio:';
+$lang['settingsBlinkIntervalNumber'] = 'Numero massimo lampeggi:';
+$lang['playSelectedSound'] = 'Esegui suono selezionato';
+$lang['requiresJavaScript'] = 'Serve il JavaScript per questa Chat.';
+$lang['errorInvalidUser'] = 'Nome utente non valido.';
+$lang['errorUserInUse'] = 'Nome utente in uso.';
+$lang['errorBanned'] = 'Utente o IP bannato.';
+$lang['errorMaxUsersLoggedIn'] = 'La chat ha raggiunto il massimo numero di utenti connessi.';
+$lang['errorChatClosed'] = 'La chat è chiusa in questo momento.';
+$lang['logsTitle'] = 'AJAX Chat - Logs';
+$lang['logsDate'] = 'Data';
+$lang['logsTime'] = 'Ora';
+$lang['logsSearch'] = 'Cerca';
+$lang['logsPrivateChannels'] = 'Canali Privati';
+$lang['logsPrivateMessages'] = 'Messaggi privati';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/ja.php b/library/ajaxchat/chat/lib/lang/ja.php
new file mode 100644
index 000000000..075fc4fcb
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/ja.php
@@ -0,0 +1,123 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'ユーザー名';
+$lang['password'] = 'パスワード';
+$lang['login'] = 'ログイン';
+$lang['logout'] = 'ログアウト';
+$lang['channel'] = 'チャンネル';
+$lang['style'] = 'スタイル';
+$lang['language'] = '言語';
+$lang['inputLineBreak'] = 'SHIFT+ENTER で改行できます';
+$lang['messageSubmit'] = '送信';
+$lang['registeredUsers'] = '登録ユーザー';
+$lang['onlineUsers'] = 'オンラインユーザー';
+$lang['toggleAutoScroll'] = '自動スクロール on/off';
+$lang['toggleAudio'] = 'サウンド on/off';
+$lang['toggleHelp'] = 'ヘルプ 表示/非表示';
+$lang['toggleSettings'] = '環境設定 表示/非表示';
+$lang['toggleOnlineList'] = 'オンラインリスト 表示/非表示';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Quote';
+$lang['bbCodeLabelCode'] = 'Code';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Image';
+$lang['bbCodeLabelColor'] = 'フォントカラー';
+$lang['bbCodeTitleBold'] = 'ボールド(太字): [b]text[/b]';
+$lang['bbCodeTitleItalic'] = 'イタリック(斜体): [i]text[/i]';
+$lang['bbCodeTitleUnderline'] = 'アンダーライン: [u]text[/u]';
+$lang['bbCodeTitleQuote'] = '引用: [quote]text[/quote] or [quote=author]text[/quote]';
+$lang['bbCodeTitleCode'] = 'コード表示: [code]code[/code]';
+$lang['bbCodeTitleURL'] = 'URLリンク: [url]http://example.org[/url] or [url=http://example.org]text[/url]';
+$lang['bbCodeTitleImg'] = '画像: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'フォントカラー: [color=red]text[/color]';
+$lang['help'] = 'ヘルプ';
+$lang['helpItemDescJoin'] = 'チャンネルの変更 :';
+$lang['helpItemCodeJoin'] = '/join チャンネル名';
+$lang['helpItemDescJoinCreate'] = 'プライベートルームへ移動 (登録ユーザーのみ可) :';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'チャンネルへ招待 :';
+$lang['helpItemCodeInvite'] = '/invite ユーザー名';
+$lang['helpItemDescUninvite'] = '招待の取り消し :';
+$lang['helpItemCodeUninvite'] = '/uninvite ユーザー名';
+$lang['helpItemDescLogout'] = 'ログアウト :';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'プライベートメッセージ :';
+$lang['helpItemCodePrivateMessage'] = '/msg ユーザー名';
+$lang['helpItemDescQueryOpen'] = '二人きりモードの開始 :';
+$lang['helpItemCodeQueryOpen'] = '/query ユーザー名';
+$lang['helpItemDescQueryClose'] = '二人きりモードの終了 :';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = '感情を表現する :';
+$lang['helpItemCodeAction'] = '/action スマイリーなど';
+$lang['helpItemDescDescribe'] = '感情を表現する (プライベートメッセージ) :';
+$lang['helpItemCodeDescribe'] = '/describe ユーザー名 スマイリーなど';
+$lang['helpItemDescIgnore'] = 'ユーザーを 無視する/無視しない :';
+$lang['helpItemCodeIgnore'] = '/ignore ユーザー名';
+$lang['helpItemDescIgnoreList'] = '無視ユーザーリスト :';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'ユーザーの居場所 :';
+$lang['helpItemCodeWhereis'] = '/whereis ユーザー名';
+$lang['helpItemDescKick'] = 'ユーザーをキックする (モデレータのみ可) :';
+$lang['helpItemCodeKick'] = '/kick ユーザー名 [アクセス禁止時間(分)]';
+$lang['helpItemDescUnban'] = 'アクセス禁止の解除 (モデレータのみ可) :';
+$lang['helpItemCodeUnban'] = '/unban ユーザー名';
+$lang['helpItemDescBans'] = 'アクセス禁止ユーザーリスト (モデレータのみ可) :';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'ユーザーのIPアドレス (モデレータのみ可) :';
+$lang['helpItemCodeWhois'] = '/whois ユーザー名';
+$lang['helpItemDescWho'] = 'オンラインユーザーリスト :';
+$lang['helpItemCodeWho'] = '/who [チャンネル名]';
+$lang['helpItemDescList'] = '入室可能なチャンネルのリスト :';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'サイコロを振る :';
+$lang['helpItemCodeRoll'] = '/roll [サイコロを振る回数]d[サイコロの面の数]';
+$lang['helpItemDescNick'] = 'ユーザー名の変更 :';
+$lang['helpItemCodeNick'] = '/nick ユーザー名';
+$lang['settings'] = '環境設定';
+$lang['settingsBBCode'] = 'BBCode を有効にする:';
+$lang['settingsBBCodeImages'] = 'BBCode [image] を有効にする :';
+$lang['settingsBBCodeColors'] = 'BBCode [color] を有効にする :';
+$lang['settingsHyperLinks'] = 'ハイパーリンクを有効にする :';
+$lang['settingsLineBreaks'] = '改行を有効にする :';
+$lang['settingsEmoticons'] = 'スマイリーを有効にする :';
+$lang['settingsAutoFocus'] = '自動的にフォーカスをインプットフィールドにセットする :';
+$lang['settingsMaxMessages'] = 'チャットメッセージの最大数 :';
+$lang['settingsWordWrap'] = '長い英数字の折り返しを有効にする :';
+$lang['settingsMaxWordLength'] = '折り返しされない英数字の最大字数 :';
+$lang['settingsDateFormat'] = '日付と表示時間のフォーマット :';
+$lang['settingsPersistFontColor'] = 'フォントカラーを保持する :';
+$lang['settingsAudioVolume'] = 'サウンドのボリューム :';
+$lang['settingsSoundReceive'] = 'サウンド - メッセージの到着 :';
+$lang['settingsSoundSend'] = 'サウンド - メッセージの送信 :';
+$lang['settingsSoundEnter'] = 'サウンド - ログイン、チャンネル入室 :';
+$lang['settingsSoundLeave'] = 'サウンド - ログアウト、チャンネル退室 :';
+$lang['settingsSoundChatBot'] = 'サウンド - チャットボットメッセージ :';
+$lang['settingsSoundError'] = 'サウンド - エラーメッセージ :';
+$lang['settingsBlink'] = '新着メッセージの到着時にウィンドウタイトルを点滅させる :';
+$lang['settingsBlinkInterval'] = '点滅の間隔(ミリ秒) :';
+$lang['settingsBlinkIntervalNumber'] = '点滅の回数 :';
+$lang['playSelectedSound'] = 'サウンドの再生';
+$lang['requiresJavaScript'] = 'このチャットシステムを利用するには JavaScript を有効にする必要があります';
+$lang['errorInvalidUser'] = 'ユーザー名が正しくありません';
+$lang['errorUserInUse'] = 'そのユーザー名は既に使われています';
+$lang['errorBanned'] = 'ユーザー名またはIPアドレスがアクセス禁止されています';
+$lang['errorMaxUsersLoggedIn'] = 'ログインユーザーの最大数に達しているため、これ以上チャットに参加することはできません';
+$lang['errorChatClosed'] = '現在、チャットは停止中です';
+$lang['logsTitle'] = 'AJAX Chat - ログ';
+$lang['logsDate'] = '日時';
+$lang['logsTime'] = '時間';
+$lang['logsSearch'] = '検索';
+$lang['logsPrivateChannels'] = '二人きりモード';
+$lang['logsPrivateMessages'] = 'プライベートメッセージ';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/ka.php b/library/ajaxchat/chat/lib/lang/ka.php
new file mode 100644
index 000000000..d92d50886
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/ka.php
@@ -0,0 +1,123 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'მეტსახელი';
+$lang['password'] = 'პაროლი';
+$lang['login'] = 'შესვლა';
+$lang['logout'] = 'გასვლა';
+$lang['channel'] = 'არხი';
+$lang['style'] = 'სტილი';
+$lang['language'] = 'ენა';
+$lang['inputLineBreak'] = 'ახალი სტრიქონისთვის დააჭირეთ SHIFT+ENTER';
+$lang['messageSubmit'] = 'დამატება';
+$lang['registeredUsers'] = 'მხოლოდ დარეგისტრირებული წევრები';
+$lang['onlineUsers'] = 'ხაზზე მყოფთა სია';
+$lang['toggleAutoScroll'] = 'ავტოჩამოწევა კი/არა';
+$lang['toggleAudio'] = 'ხმები კი/არა';
+$lang['toggleHelp'] = 'დახმარების ჩვენება/დამალვა';
+$lang['toggleSettings'] = 'პარამეტრების ჩვენება/დამალვა';
+$lang['toggleOnlineList'] = 'ხაზზე მყოფტა სიის ჩვენება/დამალვა';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'ციტატა';
+$lang['bbCodeLabelCode'] = 'კოდი';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'სურათი';
+$lang['bbCodeLabelColor'] = 'შრიფტის ფერი';
+$lang['bbCodeTitleBold'] = 'მსხვილი ტექსტი: [b]ტექსტი[/b]';
+$lang['bbCodeTitleItalic'] = 'დახრილი ტექსტი: [i]ტექსტი[/i]';
+$lang['bbCodeTitleUnderline'] = 'ხაზგასმული ტექსტი: [u]ტექსტი[/u]';
+$lang['bbCodeTitleQuote'] = 'ციტატის ტექსტი: [quote]ტექსტი[/quote] ან [quote=ავტორი]ტექსტი[/quote]';
+$lang['bbCodeTitleCode'] = 'კოდის ჩვენება: [code]კოდი[/code]';
+$lang['bbCodeTitleURL'] = 'URL ბმულის ჩასმა: [url]http://example.org[/url] ან [url=http://example.org]ტექსტი[/url]';
+$lang['bbCodeTitleImg'] = 'ნახატის ჩასმა: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'შრიფტის ფერი: [color=red]ტექსტი[/color]';
+$lang['help'] = 'დახმარება';
+$lang['helpItemDescJoin'] = 'შეუერთდი არხს:';
+$lang['helpItemCodeJoin'] = '/join არხის_სახელი';
+$lang['helpItemDescJoinCreate'] = 'პირადი ოთახის შექმნა (მხოლოდ დარეგისტრირებული წევრები):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'მეგობრის დაპატიჟება (მაგ. პირად ოთახში):';
+$lang['helpItemCodeInvite'] = '/invite მეტსახელი';
+$lang['helpItemDescUninvite'] = 'დაპატიჟების გაუქმება:';
+$lang['helpItemCodeUninvite'] = '/uninvite მეტსახელი';
+$lang['helpItemDescLogout'] = 'ჩატიდან გასვლა:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'პირადი გზავნილი:';
+$lang['helpItemCodePrivateMessage'] = '/msg მეტსახელი ტექსტი';
+$lang['helpItemDescQueryOpen'] = 'გახსენი პირადი არხი:';
+$lang['helpItemCodeQueryOpen'] = '/query მეტსახელი';
+$lang['helpItemDescQueryClose'] = 'დახურე პირადი არხი:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'აღწერე ქმედება:';
+$lang['helpItemCodeAction'] = '/action ტექსტი';
+$lang['helpItemDescDescribe'] = 'აღწერე ქმედება პირად გზავნილში:';
+$lang['helpItemCodeDescribe'] = '/describe მეტსახელი ტექსტი';
+$lang['helpItemDescIgnore'] = 'მიიღე/გააიგნორირე გზავნილები წევრისგან:';
+$lang['helpItemCodeIgnore'] = '/ignore მეტსახელი';
+$lang['helpItemDescIgnoreList'] = 'ჩამოწერე გაიგნორირებული წევრების სია:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'მაჩვენე წევრის არხი:';
+$lang['helpItemCodeWhereis'] = '/whereis მეტსახელი';
+$lang['helpItemDescKick'] = 'ამოარტყი წევრს (მხოლოდ მოდერები):';
+$lang['helpItemCodeKick'] = '/kick მეტსახელი [დაბლოკვის დრო]';
+$lang['helpItemDescUnban'] = 'წევრის ბლოკის მოხსნა (მხოლოდ მოდერები):';
+$lang['helpItemCodeUnban'] = '/unban მეტსახელი';
+$lang['helpItemDescBans'] = 'ჩამოწერე დაბლოკილი წევრების სია (მხოლოდ მოდერები):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'მაჩვენე წევრის IP (მხოლოდ მოდერები):';
+$lang['helpItemCodeWhois'] = '/whois მეტსახელი';
+$lang['helpItemDescWho'] = 'ჩამოწერე ხაზზე მყოფთა სია:';
+$lang['helpItemCodeWho'] = '/who [არხის_სახელი]';
+$lang['helpItemDescList'] = 'ჩამოწერე ხელმისაწვდომი არხები:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'კამათლების გაგორება:';
+$lang['helpItemCodeRoll'] = '/roll [რიცხვი]d[გვერდი]';
+$lang['helpItemDescNick'] = 'მეტსახელის შეცვლა:';
+$lang['helpItemCodeNick'] = '/nick მეტსახელი';
+$lang['settings'] = 'პარამეტრები';
+$lang['settingsBBCode'] = 'ჩართე BBCode:';
+$lang['settingsBBCodeImages'] = 'ჩართე ნახატის BBCode:';
+$lang['settingsBBCodeColors'] = 'ჩართე შრიფტის ფერის BBCode:';
+$lang['settingsHyperLinks'] = 'ჩართე URL ბმულები:';
+$lang['settingsLineBreaks'] = 'ჩართე ახალი სტრიქონის გამოყენება:';
+$lang['settingsEmoticons'] = 'ჩართე სიცილაკები:';
+$lang['settingsAutoFocus'] = 'ტექსტის შეყვანის ველის ავტომატიური ფოკუსირება:';
+$lang['settingsMaxMessages'] = 'ჩატში მყოფი გზავნილების მაქსიმალური რიცხვი:';
+$lang['settingsWordWrap'] = 'გრძელი სიტყვების გადატანა:';
+$lang['settingsMaxWordLength'] = 'სიტყვის მაქსიმალური სიგრძე, სანამ ახალ სტრიქონზე გადავა:';
+$lang['settingsDateFormat'] = 'თარიღისა და დროის ჩვენების ფორმატი:';
+$lang['settingsPersistFontColor'] = 'შრიფტის ფერის შენახვა:';
+$lang['settingsAudioVolume'] = 'ხმის სიმაღლე:';
+$lang['settingsSoundReceive'] = 'შემავალი გზავნილის ხმა:';
+$lang['settingsSoundSend'] = 'გამავალი გზავნილის ხმა:';
+$lang['settingsSoundEnter'] = 'ავტორიზაციისა და არხში შესვლის ხმა:';
+$lang['settingsSoundLeave'] = 'გასვლის და არხის მიტოვების ხმა:';
+$lang['settingsSoundChatBot'] = 'ჩატბოტის გზავნილების ხმა:';
+$lang['settingsSoundError'] = 'შედომის გზავნილების ხმა:';
+$lang['settingsBlink'] = 'ახალ გზავნილზე ფანჯრის დასახელების ციმციმი:';
+$lang['settingsBlinkInterval'] = 'ციმციმის ინტერვალი მილიწამებში:';
+$lang['settingsBlinkIntervalNumber'] = 'ციმციმის ინტერვალების რაოდენობა:';
+$lang['playSelectedSound'] = 'ითამაშე არჩეული ხმა';
+$lang['requiresJavaScript'] = 'ამ ჩატისთვის საჭიროა JavaScript.';
+$lang['errorInvalidUser'] = 'არასწორი მეტსახელი.';
+$lang['errorUserInUse'] = 'მეტსახელი დაკავებულია.';
+$lang['errorBanned'] = 'წევრი ან IP დაბლოკილია.';
+$lang['errorMaxUsersLoggedIn'] = 'ჩატში იმყოფება წევრთა მაქსიმალური შესაძლებელი რიცხვი.';
+$lang['errorChatClosed'] = 'ჩატი ამ წუთისთვის დახურულია.';
+$lang['logsTitle'] = 'AJAX Chat - ჟურნალი';
+$lang['logsDate'] = 'თარიღი';
+$lang['logsTime'] = 'დრო';
+$lang['logsSearch'] = 'ძიება';
+$lang['logsPrivateChannels'] = 'პირადი არხები';
+$lang['logsPrivateMessages'] = 'პირადი გზავნილები';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/kr.php b/library/ajaxchat/chat/lib/lang/kr.php
new file mode 100644
index 000000000..687dd6e30
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/kr.php
@@ -0,0 +1,123 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = '대화명';
+$lang['password'] = '비밀번호';
+$lang['login'] = '로그인';
+$lang['logout'] = '로그아웃';
+$lang['channel'] = '채널';
+$lang['style'] = '스타일';
+$lang['language'] = '언어';
+$lang['inputLineBreak'] = '새 줄을 입력하려면 SHIFT+ENTER를 누르세요';
+$lang['messageSubmit'] = '보내기';
+$lang['registeredUsers'] = '등록된 사용자';
+$lang['onlineUsers'] = '접속중인 사용자';
+$lang['toggleAutoScroll'] = '자동스크롤 on/off';
+$lang['toggleAudio'] = '소리 on/off';
+$lang['toggleHelp'] = '도움말';
+$lang['toggleSettings'] = '설정';
+$lang['toggleOnlineList'] = '접속중인 사용자';
+$lang['bbCodeLabelBold'] = '굵게';
+$lang['bbCodeLabelItalic'] = '이탤릭';
+$lang['bbCodeLabelUnderline'] = '밑줄';
+$lang['bbCodeLabelQuote'] = '따옴표';
+$lang['bbCodeLabelCode'] = '코드';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = '이미지';
+$lang['bbCodeLabelColor'] = '글자색';
+$lang['bbCodeTitleBold'] = '굵게: [b]내용[/b]';
+$lang['bbCodeTitleItalic'] = '이탤릭: [i]내용[/i]';
+$lang['bbCodeTitleUnderline'] = '밑줄: [u]내용[/u]';
+$lang['bbCodeTitleQuote'] = '따옴표: [quote]내용[/quote] 또는 [quote=문자]내용[/quote]';
+$lang['bbCodeTitleCode'] = '코드: [code]코드[/code]';
+$lang['bbCodeTitleURL'] = '주소: [url]http://example.org[/url] or [url=http://example.org]text[/url]';
+$lang['bbCodeTitleImg'] = '이미지: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = '글자색: [color=red]내용[/color]';
+$lang['help'] = '도움말';
+$lang['helpItemDescJoin'] = '채널 접속:';
+$lang['helpItemCodeJoin'] = '/join 채널명';
+$lang['helpItemDescJoinCreate'] = '개인방 생성:';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = '사용자 초대 (예: 개인방으로 초대):';
+$lang['helpItemCodeInvite'] = '/invite 대화명';
+$lang['helpItemDescUninvite'] = '초대 취소:';
+$lang['helpItemCodeUninvite'] = '/uninvite 대화명';
+$lang['helpItemDescLogout'] = '로그아웃';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = '귓속말:';
+$lang['helpItemCodePrivateMessage'] = '/msg 대화명 메시지';
+$lang['helpItemDescQueryOpen'] = '개인방 열기:';
+$lang['helpItemCodeQueryOpen'] = '/query 대화명';
+$lang['helpItemDescQueryClose'] = '개인방 닫기:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = '명령 설명:';
+$lang['helpItemCodeAction'] = '/action 설명내용';
+$lang['helpItemDescDescribe'] = '귓속말로 명령 설명:';
+$lang['helpItemCodeDescribe'] = '/describe 대화명 설명내용';
+$lang['helpItemDescIgnore'] = '대화 차단/허용:';
+$lang['helpItemCodeIgnore'] = '/ignore 대화명';
+$lang['helpItemDescIgnoreList'] = '대화차단 사용자 목록:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = '접속중인 채널 확인:';
+$lang['helpItemCodeWhereis'] = '/whereis 대화명';
+$lang['helpItemDescKick'] = '사용자 추방 (방장 만):';
+$lang['helpItemCodeKick'] = '/kick 대화명 [추방 시간(분)]';
+$lang['helpItemDescUnban'] = '추방 취소 (방장 만):';
+$lang['helpItemCodeUnban'] = '/unban 대화명';
+$lang['helpItemDescBans'] = '추방된 사용자 목록 (방장 만):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = '사용자 접속 IP주소 (방장 만):';
+$lang['helpItemCodeWhois'] = '/whois 대화명';
+$lang['helpItemDescWho'] = '접속중인 사용자 목록:';
+$lang['helpItemCodeWho'] = '/who [채널명]';
+$lang['helpItemDescList'] = '채널목록:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = '주사위 굴리기:';
+$lang['helpItemCodeRoll'] = '/roll [굴린횟수]d[면수]';
+$lang['helpItemDescNick'] = '대화명 변경:';
+$lang['helpItemCodeNick'] = '/nick 대화명';
+$lang['settings'] = '설정';
+$lang['settingsBBCode'] = 'BBCode 사용:';
+$lang['settingsBBCodeImages'] = '이미지 BBCode 사용:';
+$lang['settingsBBCodeColors'] = '글자색 BBCode 사용:';
+$lang['settingsHyperLinks'] = '하이퍼링크 사용:';
+$lang['settingsLineBreaks'] = '엔터키 사용:';
+$lang['settingsEmoticons'] = '이모티콘 사용:';
+$lang['settingsAutoFocus'] = '입력창으로 포커스 자동이동:';
+$lang['settingsMaxMessages'] = '대화창의 최대 메시지 수:';
+$lang['settingsWordWrap'] = '긴 문장 다음줄로 표시:';
+$lang['settingsMaxWordLength'] = '최대 글자수:';
+$lang['settingsDateFormat'] = '날짜, 시간 표시 형식:';
+$lang['settingsPersistFontColor'] = '글자색 고정:';
+$lang['settingsAudioVolume'] = '소리크기:';
+$lang['settingsSoundReceive'] = '메시지 수신 소리:';
+$lang['settingsSoundSend'] = '메시지 송신 소리:';
+$lang['settingsSoundEnter'] = '로그인, 채널 접속 소리:';
+$lang['settingsSoundLeave'] = '로그아웃, 채널 접속해제 소리:';
+$lang['settingsSoundChatBot'] = '시스템 메시지 소리:';
+$lang['settingsSoundError'] = '오류 소리:';
+$lang['settingsBlink'] = '새로운 메시지 도착 시 타이틀 깜빡임:';
+$lang['settingsBlinkInterval'] = '밀리세컨드 단위 깜빡임 속도:';
+$lang['settingsBlinkIntervalNumber'] = '깜빡임 횟수:';
+$lang['playSelectedSound'] = '소리 듣기';
+$lang['requiresJavaScript'] = '이 채팅에는 자바스크립트가 필요합니다.';
+$lang['errorInvalidUser'] = '사용할 수 없는 대화명입니다.';
+$lang['errorUserInUse'] = '사용중인 대화명입니다.';
+$lang['errorBanned'] = '사용자/아이피가 차단되었습니다.';
+$lang['errorMaxUsersLoggedIn'] = '동시에 접속할 수 있는 최대 사용자를 초과했습니다.';
+$lang['errorChatClosed'] = '잠시동안 서비스가 닫혔습니다.';
+$lang['logsTitle'] = 'AJAX Chat - 로그';
+$lang['logsDate'] = '날짜';
+$lang['logsTime'] = '시간';
+$lang['logsSearch'] = '검색';
+$lang['logsPrivateChannels'] = '개인채널';
+$lang['logsPrivateMessages'] = '개인 메시지';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/mk.php b/library/ajaxchat/chat/lib/lang/mk.php
new file mode 100644
index 000000000..f43bcfb7d
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/mk.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Nebojsa Ilijoski
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Име';
+$lang['password'] = 'Лозинка';
+$lang['login'] = 'Влези';
+$lang['logout'] = 'Излези';
+$lang['channel'] = 'Канал';
+$lang['style'] = 'Изглед';
+$lang['language'] = 'Јазик';
+$lang['inputLineBreak'] = 'Притиснете SHIFT+ENTER, за да вметнете нов ред';
+$lang['messageSubmit'] = 'Прашање';
+$lang['registeredUsers'] = 'Регистрирани корисници';
+$lang['onlineUsers'] = 'Online корисници';
+$lang['toggleAutoScroll'] = 'Автопрелистување вкл/иcкл';
+$lang['toggleAudio'] = 'Звук вкл/изкл';
+$lang['toggleHelp'] = 'Покашување/скривање на помошта';
+$lang['toggleSettings'] = 'Покажување/скривање на поставките';
+$lang['toggleOnlineList'] = 'Покажување/скривање на листата со корисници';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Цитат';
+$lang['bbCodeLabelCode'] = 'Код';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Image';
+$lang['bbCodeLabelColor'] = 'Боја на фонт';
+$lang['bbCodeTitleBold'] = 'Задебелен текст: [b]текст[/b]';
+$lang['bbCodeTitleItalic'] = 'Закосен текст: [i]текст[/i]';
+$lang['bbCodeTitleUnderline'] = 'Подцртан текст: [u]текст[/u]';
+$lang['bbCodeTitleQuote'] = 'Цитиран текст: [quote]текст[/quote] или [quote=Автор]текст[/quote]';
+$lang['bbCodeTitleCode'] = 'Покажување на код: [code]код[/code]';
+$lang['bbCodeTitleURL'] = 'URL: [url]http://example.org[/url] или [url=http://example.org]текст[/url]';
+$lang['bbCodeTitleImg'] = 'Insert image: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Боја на заглавие: [color=red]текст[/color]';
+$lang['help'] = 'Помош';
+$lang['helpItemDescJoin'] = 'Присоединување кон канал:';
+$lang['helpItemCodeJoin'] = '/join име_на_канал';
+$lang['helpItemDescJoinCreate'] = 'Креирање сопствена соба (само за регистрирани корисници):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Покана на корисници (напр. во сопствена соба):';
+$lang['helpItemCodeInvite'] = '/invite Корисничко_име';
+$lang['helpItemDescUninvite'] = 'Откажување на покана:';
+$lang['helpItemCodeUninvite'] = '/uninvite Корисничко_име';
+$lang['helpItemDescLogout'] = 'Одјавување од четот:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Лична порака:';
+$lang['helpItemCodePrivateMessage'] = '/msg Корисничко_име Текст';
+$lang['helpItemDescQueryOpen'] = 'Отварање на личен канал:';
+$lang['helpItemCodeQueryOpen'] = '/query Корисничко_име';
+$lang['helpItemDescQueryClose'] = 'Затварање на личен канал:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Опиц на дејство:';
+$lang['helpItemCodeAction'] = '/action Текст';
+$lang['helpItemDescDescribe'] = 'Опис на дејство во приватна порака:';
+$lang['helpItemCodeDescribe'] = '/describe Корисничко_име Текст';
+$lang['helpItemDescIgnore'] = 'Игнорирање/примање на пораки од корисник:';
+$lang['helpItemCodeIgnore'] = '/ignore Корисничко_име';
+$lang['helpItemDescIgnoreList'] = 'Преглед на игнорирани корисници:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Покажување на корисничкиот канал:';
+$lang['helpItemCodeWhereis'] = '/whereis Корисничко_име';
+$lang['helpItemDescKick'] = 'Исфрлање на корисници (само за модератори):';
+$lang['helpItemCodeKick'] = '/kick Корисничко_име [број минути]';
+$lang['helpItemDescUnban'] = 'Одблокирање на корисници (само за модератори):';
+$lang['helpItemCodeUnban'] = '/unban Корисничко_име';
+$lang['helpItemDescBans'] = 'Преглед на блокирани корисници (само за модератори):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Преглед на IP адреса на корисник (само за модератори):';
+$lang['helpItemCodeWhois'] = '/whois Корисничко_име';
+$lang['helpItemDescWho'] = 'Преглед на online корисници:';
+$lang['helpItemCodeWho'] = '/who [Име_на_канал]';
+$lang['helpItemDescList'] = 'Преглед на приватните канали:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Фрлање коцка:';
+$lang['helpItemCodeRoll'] = '/roll [пати]d[страни]';
+$lang['helpItemDescNick'] = 'Промена на корисничкото име:';
+$lang['helpItemCodeNick'] = '/nick Корисничко_име';
+$lang['settings'] = 'Поставки';
+$lang['settingsBBCode'] = 'Користење на BBCode:';
+$lang['settingsBBCodeImages'] = 'Enable image BBCode:';
+$lang['settingsBBCodeColors'] = 'Enable font color BBCode:';
+$lang['settingsHyperLinks'] = 'Користење на на хиперлинк:';
+$lang['settingsLineBreaks'] = 'Користење на крај на ред:';
+$lang['settingsEmoticons'] = 'Користење на емоции:';
+$lang['settingsAutoFocus'] = 'Автоматско фокусирање на полето за внес:';
+$lang['settingsMaxMessages'] = 'Максимален број пораки во прозорецот на четот:';
+$lang['settingsWordWrap'] = 'Префрлање на текст:';
+$lang['settingsMaxWordLength'] = 'Максимална должина на порака пред да биде пренесена:';
+$lang['settingsDateFormat'] = 'Формат на датата и часот:';
+$lang['settingsPersistFontColor'] = 'Постојана боја на фонтот:';
+$lang['settingsAudioVolume'] = 'Гласност на звука:';
+$lang['settingsSoundReceive'] = 'Звук за приемни пораки:';
+$lang['settingsSoundSend'] = 'Звук за испратени пораки:';
+$lang['settingsSoundEnter'] = 'Звук за пораки за влез на четот или на каналот:';
+$lang['settingsSoundLeave'] = 'Звук за пораки за излез од четот или од каналот:';
+$lang['settingsSoundChatBot'] = 'Звук за пораки на чатботот:';
+$lang['settingsSoundError'] = 'Звук за пораки за грешки:';
+$lang['settingsBlink'] = 'Жмигање на заглавието на прозорецот при нови пораки:';
+$lang['settingsBlinkInterval'] = 'Интервал на жмигање во милисекунди:';
+$lang['settingsBlinkIntervalNumber'] = 'Број пати на жмигање:';
+$lang['playSelectedSound'] = 'Преслушување на избраниот звук';
+$lang['requiresJavaScript'] = 'За четот е потребна поддршка на Јаваскрипт.';
+$lang['errorInvalidUser'] = 'Грешно корисничко име.';
+$lang['errorUserInUse'] = 'Корисничкото име е во употреба.';
+$lang['errorBanned'] = 'Корисникот или IP адресата е блокирана.';
+$lang['errorMaxUsersLoggedIn'] = 'Четот го достигна максималниот број на корисници.';
+$lang['errorChatClosed'] = 'Во моментов четот е затворен.';
+$lang['logsTitle'] = 'AJAX Chat — Лого';
+$lang['logsDate'] = 'Дата';
+$lang['logsTime'] = 'Време';
+$lang['logsSearch'] = 'Пребарување';
+$lang['logsPrivateChannels'] = 'Приватни канали';
+$lang['logsPrivateMessages'] = 'Приватни пораки';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/nl-be.php b/library/ajaxchat/chat/lib/lang/nl-be.php
new file mode 100644
index 000000000..db01b9871
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/nl-be.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Nic Mertens
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Gebruikersnaam';
+$lang['password'] = 'Wachtwoord';
+$lang['login'] = 'Inloggen';
+$lang['logout'] = 'Uitloggen';
+$lang['channel'] = 'Kanaal';
+$lang['style'] = 'Stijl';
+$lang['language'] = 'Taal';
+$lang['inputLineBreak'] = 'Typ SHIFT+ENTER om een line break in te geven';
+$lang['messageSubmit'] = 'Verzend';
+$lang['registeredUsers'] = 'Geregistreerde gebruikers';
+$lang['onlineUsers'] = 'Online gebruikers';
+$lang['toggleAutoScroll'] = 'Autoscroll aan/uit';
+$lang['toggleAudio'] = 'Geluid aan/uit';
+$lang['toggleHelp'] = 'Toon/verberg help';
+$lang['toggleSettings'] = 'Toon/verberg instellingen';
+$lang['toggleOnlineList'] = 'Toon/verberg online lijst';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Quote';
+$lang['bbCodeLabelCode'] = 'Code';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Figuur';
+$lang['bbCodeLabelColor'] = 'Kleur lettertype';
+$lang['bbCodeTitleBold'] = 'Tekst in vet: [b]text[/b]';
+$lang['bbCodeTitleItalic'] = 'Tekst in cursief: [i]text[/i]';
+$lang['bbCodeTitleUnderline'] = 'Tekst onderlijnd: [u]text[/u]';
+$lang['bbCodeTitleQuote'] = 'Quote tekst: [quote]text[/quote] or [quote=author]text[/quote]';
+$lang['bbCodeTitleCode'] = 'Code ingeven: [code]code[/code]';
+$lang['bbCodeTitleURL'] = 'Voeg URL in: [url]http://example.org[/url] or [url=http://example.org]text[/url]';
+$lang['bbCodeTitleImg'] = 'Voeg figuur toe: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Kleur lettertype: [color=red]text[/color]';
+$lang['help'] = 'Help';
+$lang['helpItemDescJoin'] = 'Betreed een kamer:';
+$lang['helpItemCodeJoin'] = '/join Kanaalnaam';
+$lang['helpItemDescJoinCreate'] = 'Maak een privékamer (Enkel geregistreerde gebruikers):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Nodig iemand uit (bv. naar een privékamer):';
+$lang['helpItemCodeInvite'] = '/invite Gebruikersnaam';
+$lang['helpItemDescUninvite'] = 'Annuleer de uitnodiging:';
+$lang['helpItemCodeUninvite'] = '/uninvite Gebruikersnaam';
+$lang['helpItemDescLogout'] = 'Uitloggen:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Privé bericht:';
+$lang['helpItemCodePrivateMessage'] = '/msg Gebruikersnaam Tekst';
+$lang['helpItemDescQueryOpen'] = 'Open een privékamer:';
+$lang['helpItemCodeQueryOpen'] = '/query Gebruikersnaam';
+$lang['helpItemDescQueryClose'] = 'Sluit een privékamer:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Beschrijf actie:';
+$lang['helpItemCodeAction'] = '/action Tekst';
+$lang['helpItemDescDescribe'] = 'Beschrijf actie in privébericht:';
+$lang['helpItemCodeDescribe'] = '/describe Gebruikersnaam Tekst';
+$lang['helpItemDescIgnore'] = 'Negeer/aanvaard berichten van gebruiker:';
+$lang['helpItemCodeIgnore'] = '/ignore Gebruikersnaam';
+$lang['helpItemDescIgnoreList'] = 'Toon de genegeerde gebruikers:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Display user channel:';
+$lang['helpItemCodeWhereis'] = '/whereis Gebruikersnaam';
+$lang['helpItemDescKick'] = 'Kick een gebruiker (Enkel Moderators of Administrators):';
+$lang['helpItemCodeKick'] = '/kick Gebruikersnaam [aantal minuten]';
+$lang['helpItemDescUnban'] = 'Unban een gebruiker (Enkel Moderators of Administrators):';
+$lang['helpItemCodeUnban'] = '/unban Gebruikersnaam';
+$lang['helpItemDescBans'] = 'Lijst van gebande Gebruikers (Enkel Moderators of Administrators):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Toon gebruikers-IP (Enkel Moderators of Administrators):';
+$lang['helpItemCodeWhois'] = '/whois Gebruikersnaam';
+$lang['helpItemDescWho'] = 'Lijst van gebruikers online:';
+$lang['helpItemCodeWho'] = '/who [Kanaalnaam]';
+$lang['helpItemDescList'] = 'Lijst van beschikbare kanalen:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Werp dobbelsteen:';
+$lang['helpItemCodeRoll'] = '/roll [number]d[sides]';
+$lang['helpItemDescNick'] = 'Wijzig gebruikersnaam:';
+$lang['helpItemCodeNick'] = '/nick Gebruikersnaam';
+$lang['settings'] = 'Instellingen';
+$lang['settingsBBCode'] = 'Inschakelen BBCode:';
+$lang['settingsBBCodeImages'] = 'Inschakelen figuur BBCode:';
+$lang['settingsBBCodeColors'] = 'Inschakelen lettertype kleur BBCode:';
+$lang['settingsHyperLinks'] = 'Inschakelen hyperlinks:';
+$lang['settingsLineBreaks'] = 'Inschakelen line breaks:';
+$lang['settingsEmoticons'] = 'Inschakelen emoticons:';
+$lang['settingsAutoFocus'] = 'Zet automatisch de focus in het invoerveld:';
+$lang['settingsMaxMessages'] = 'Maximaal aantal berichten in de chatkamer:';
+$lang['settingsWordWrap'] = 'Inschakelen wrapping van lange woorden:';
+$lang['settingsMaxWordLength'] = 'Maximale lengte van een woord voor dat het gewrapped wordt:';
+$lang['settingsDateFormat'] = 'Formaat van datum en tijd:';
+$lang['settingsPersistFontColor'] = 'Persiste lettertype kleur:';
+$lang['settingsAudioVolume'] = 'Volume geluid:';
+$lang['settingsSoundReceive'] = 'Geluid voor inkomende berichten:';
+$lang['settingsSoundSend'] = 'Geluid voor buitengaande berichten:';
+$lang['settingsSoundEnter'] = 'Geluid voor login en chatkemer voor binnenkomende berichten:';
+$lang['settingsSoundLeave'] = 'Geluid voor logout en verlaat berichten:';
+$lang['settingsSoundChatBot'] = 'Geluid voor berichten van de bot:';
+$lang['settingsSoundError'] = 'Geluid voor errorberichten:';
+$lang['settingsBlink'] = 'Blink window title on new messages:';
+$lang['settingsBlinkInterval'] = 'Blink interval in milliseconds:';
+$lang['settingsBlinkIntervalNumber'] = 'Number of blink intervals:';
+$lang['playSelectedSound'] = 'Speel geselecteerd geluid';
+$lang['requiresJavaScript'] = 'JavaScript is nodig voor deze chat.';
+$lang['errorInvalidUser'] = 'Ongeldige gebruikersnaam.';
+$lang['errorUserInUse'] = 'Gebruikersnaam is in gebruik, kies een andere.';
+$lang['errorBanned'] = 'Gebruiker of gebruikers-IP is gebanned.';
+$lang['errorMaxUsersLoggedIn'] = 'Dit chatkamer heeft het maximum toegelaten aantal ingelogde gebruikers bereikt.';
+$lang['errorChatClosed'] = 'Dit chatkamer is momenteel gesloten.';
+$lang['logsTitle'] = 'AJAX Chat - Logs';
+$lang['logsDate'] = 'Datum';
+$lang['logsTime'] = 'Tijd';
+$lang['logsSearch'] = 'Zoek';
+$lang['logsPrivateChannels'] = 'Privékanalen';
+$lang['logsPrivateMessages'] = 'Privéberichten';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/nl.php b/library/ajaxchat/chat/lib/lang/nl.php
new file mode 100644
index 000000000..c7dcc4b38
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/nl.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Dutch localisation: Patrick Donker
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Gebruikersnaam';
+$lang['password'] = 'Wachtwoord';
+$lang['login'] = 'Inloggen';
+$lang['logout'] = 'Uitloggen';
+$lang['channel'] = 'Kanaal';
+$lang['style'] = 'Stijl';
+$lang['language'] = 'Taal';
+$lang['inputLineBreak'] = 'Typ SHIFT+ENTER om een line break in te geven';
+$lang['messageSubmit'] = 'Verzend';
+$lang['registeredUsers'] = 'Geregistreerde gebruikers';
+$lang['onlineUsers'] = 'Online gebruikers';
+$lang['toggleAutoScroll'] = 'Autoscroll aan/uit';
+$lang['toggleAudio'] = 'Geluid aan/uit';
+$lang['toggleHelp'] = 'Toon/verberg help';
+$lang['toggleSettings'] = 'Toon/verberg instellingen';
+$lang['toggleOnlineList'] = 'Toon/verberg online lijst';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Citeer';
+$lang['bbCodeLabelCode'] = 'Code';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Figuur';
+$lang['bbCodeLabelColor'] = 'Kleur lettertype';
+$lang['bbCodeTitleBold'] = 'Vetgedrukte tekst: [b]text[/b]';
+$lang['bbCodeTitleItalic'] = 'Cursieve tekst: [i]text[/i]';
+$lang['bbCodeTitleUnderline'] = 'Onderlijnde tekst: [u]text[/u]';
+$lang['bbCodeTitleQuote'] = 'Citeer tekst: [quote]text[/quote] of [quote=author]text[/quote]';
+$lang['bbCodeTitleCode'] = 'Code ingeven: [code]code[/code]';
+$lang['bbCodeTitleURL'] = 'Voeg URL in: [url]http://example.org[/url] of [url=http://example.org]text[/url]';
+$lang['bbCodeTitleImg'] = 'Voeg figuur toe: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Kleur lettertype: [color=red]text[/color]';
+$lang['help'] = 'Help';
+$lang['helpItemDescJoin'] = 'Betreed een kanaal:';
+$lang['helpItemCodeJoin'] = '/join Kanaalnaam';
+$lang['helpItemDescJoinCreate'] = 'Maak een privékamer (Enkel geregistreerde gebruikers):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Nodig iemand uit (voor bijv. een privékamer):';
+$lang['helpItemCodeInvite'] = '/invite Gebruikersnaam';
+$lang['helpItemDescUninvite'] = 'Annuleer uitnodiging:';
+$lang['helpItemCodeUninvite'] = '/uninvite Gebruikersnaam';
+$lang['helpItemDescLogout'] = 'Uitloggen:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Privé bericht:';
+$lang['helpItemCodePrivateMessage'] = '/msg Gebruikersnaam Tekst';
+$lang['helpItemDescQueryOpen'] = 'Open een privékamer:';
+$lang['helpItemCodeQueryOpen'] = '/query Gebruikersnaam';
+$lang['helpItemDescQueryClose'] = 'Sluit een privékamer:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Beschrijf actie:';
+$lang['helpItemCodeAction'] = '/action Tekst';
+$lang['helpItemDescDescribe'] = 'Beschrijf actie in privébericht:';
+$lang['helpItemCodeDescribe'] = '/describe Gebruikersnaam Tekst';
+$lang['helpItemDescIgnore'] = 'Negeer/aanvaard berichten van gebruiker:';
+$lang['helpItemCodeIgnore'] = '/ignore Gebruikersnaam';
+$lang['helpItemDescIgnoreList'] = 'Toon genegeerde gebruikers:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Waar bevindt zich een gebruiker:';
+$lang['helpItemCodeWhereis'] = '/whereis Gebruikersnaam';
+$lang['helpItemDescKick'] = 'Verwijder een gebruiker (Enkel Moderators of Administrators):';
+$lang['helpItemCodeKick'] = '/kick Gebruikersnaam [aantal minuten]';
+$lang['helpItemDescUnban'] = 'Hertoelaten van een gebruiker (Enkel Moderators of Administrators):';
+$lang['helpItemCodeUnban'] = '/unban Gebruikersnaam';
+$lang['helpItemDescBans'] = 'Lijst van verbannen Gebruikers (Enkel Moderators of Administrators):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Toon IP adres gebruikers (Enkel Moderators of Administrators):';
+$lang['helpItemCodeWhois'] = '/whois Gebruikersnaam';
+$lang['helpItemDescWho'] = 'Lijst van online gebruikers:';
+$lang['helpItemCodeWho'] = '/who [Kanaalnaam]';
+$lang['helpItemDescList'] = 'Lijst van beschikbare kanalen:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Gooi dobbelsteen:';
+$lang['helpItemCodeRoll'] = '/roll [number]d[sides]';
+$lang['helpItemDescNick'] = 'Wijzig gebruikersnaam:';
+$lang['helpItemCodeNick'] = '/nick Gebruikersnaam';
+$lang['settings'] = 'Instellingen';
+$lang['settingsBBCode'] = 'Inschakelen BBCode:';
+$lang['settingsBBCodeImages'] = 'Inschakelen figuur BBCode:';
+$lang['settingsBBCodeColors'] = 'Inschakelen lettertype kleur BBCode:';
+$lang['settingsHyperLinks'] = 'Inschakelen hyperlinks:';
+$lang['settingsLineBreaks'] = 'Inschakelen line breaks:';
+$lang['settingsEmoticons'] = 'Inschakelen emoticons:';
+$lang['settingsAutoFocus'] = 'Zet automatisch de focus op het invoerveld:';
+$lang['settingsMaxMessages'] = 'Maximaal aantal berichten in de chatkamer:';
+$lang['settingsWordWrap'] = 'Inschakelen afbreken van lange woorden:';
+$lang['settingsMaxWordLength'] = 'Maximale lengte van een woord alvorens het afgebroken wordt:';
+$lang['settingsDateFormat'] = 'Formaat van datum en tijd:';
+$lang['settingsPersistFontColor'] = 'Vaste kleur lettertype:';
+$lang['settingsAudioVolume'] = 'Volume geluid:';
+$lang['settingsSoundReceive'] = 'Geluid bij binnenkomende berichten:';
+$lang['settingsSoundSend'] = 'Geluid bij buitengaande berichten:';
+$lang['settingsSoundEnter'] = 'Geluid bij login en betreden van chat';
+$lang['settingsSoundLeave'] = 'Geluid bij logout en verlaten chat:';
+$lang['settingsSoundChatBot'] = 'Geluid bij systeenberichten:';
+$lang['settingsSoundError'] = 'Geluid bij foutmeldingen:';
+$lang['settingsBlink'] = 'Knipper tekst windowtitel bij nieuw bericht:';
+$lang['settingsBlinkInterval'] = 'Knipperinterval in milliseconden:';
+$lang['settingsBlinkIntervalNumber'] = 'Aantal keren knippering van tekst:';
+$lang['playSelectedSound'] = 'Speel geselecteerd geluid af';
+$lang['requiresJavaScript'] = 'JavaScript is vereist voor deze chat.';
+$lang['errorInvalidUser'] = 'Ongeldige gebruikersnaam.';
+$lang['errorUserInUse'] = 'Gebruikersnaam is in gebruik, kies een andere.';
+$lang['errorBanned'] = 'Gebruiker of gebruikers-IP is verbannen.';
+$lang['errorMaxUsersLoggedIn'] = 'Deze chatkamer heeft het maximum aantal toegelaten gebruikers bereikt.';
+$lang['errorChatClosed'] = 'Deze chatkamer is momenteel gesloten.';
+$lang['logsTitle'] = 'AJAX Chat - Logs';
+$lang['logsDate'] = 'Datum';
+$lang['logsTime'] = 'Tijd';
+$lang['logsSearch'] = 'Zoek';
+$lang['logsPrivateChannels'] = 'Privékanalen';
+$lang['logsPrivateMessages'] = 'Privéberichten';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/no.php b/library/ajaxchat/chat/lib/lang/no.php
new file mode 100644
index 000000000..52fe4afbe
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/no.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author DagArneKirkerod
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Brukernavn';
+$lang['password'] = 'Passord';
+$lang['login'] = 'Logg inn';
+$lang['logout'] = 'Logg ut';
+$lang['channel'] = 'Kanal';
+$lang['style'] = 'Stil';
+$lang['language'] = 'Språk';
+$lang['inputLineBreak'] = 'Press SHIFT+ENTER to input a line break';
+$lang['messageSubmit'] = 'Send';
+$lang['registeredUsers'] = 'Registrerte Brukere';
+$lang['onlineUsers'] = 'Påloggede brukere';
+$lang['toggleAutoScroll'] = 'Autoscroll on/off';
+$lang['toggleAudio'] = 'Sound on/off';
+$lang['toggleHelp'] = 'Show/hide help';
+$lang['toggleSettings'] = 'Show/hide settings';
+$lang['toggleOnlineList'] = 'Show/hide online list';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Siter';
+$lang['bbCodeLabelCode'] = 'Kode';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Image';
+$lang['bbCodeLabelColor'] = 'Tekst Farge';
+$lang['bbCodeTitleBold'] = 'Fet tekst: [b]tekst[/b]';
+$lang['bbCodeTitleItalic'] = 'Kursiv tekst: [i]tekst[/i]';
+$lang['bbCodeTitleUnderline'] = 'Understrek tekst: [u]tekst[/u]';
+$lang['bbCodeTitleQuote'] = 'Siter tekst: [quote]tekst[/quote] or [quote=author]tekst[/quote]';
+$lang['bbCodeTitleCode'] = 'Vis kode: [code]code[/code]';
+$lang['bbCodeTitleURL'] = 'Legg til url: [url]http://example.org[/url] or [url=http://example.org]text[/url]';
+$lang['bbCodeTitleImg'] = 'Insert image: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Tekst farge: [color=red]text[/color]';
+$lang['help'] = 'Hjelp';
+$lang['helpItemDescJoin'] = 'Delta i en kanal:';
+$lang['helpItemCodeJoin'] = '/Join kanalnavn';
+$lang['helpItemDescJoinCreate'] = 'Lag et privat rom (Bare Registrerte Brukere):';
+$lang['helpItemCodeJoinCreate'] = '/Join';
+$lang['helpItemDescInvite'] = 'Inviter noen (for eksempel til et privat rom):';
+$lang['helpItemCodeInvite'] = '/invite brukernavn';
+$lang['helpItemDescUninvite'] = 'Opphev invitasjon:';
+$lang['helpItemCodeUninvite'] = '/uninvite brukernavn';
+$lang['helpItemDescLogout'] = 'Logg ut fra Chat:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Privat melding:';
+$lang['helpItemCodePrivateMessage'] = '/msg brukernavn tekst';
+$lang['helpItemDescQueryOpen'] = 'Åpne en privat kanal:';
+$lang['helpItemCodeQueryOpen'] = '/query brukernavn';
+$lang['helpItemDescQueryClose'] = 'Lukk en privat kanal:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Beskriv handling:';
+$lang['helpItemCodeAction'] = '/action tekst';
+$lang['helpItemDescDescribe'] = 'Beskriv handling i privat melding:';
+$lang['helpItemCodeDescribe'] = '/describe brukernavn tekst';
+$lang['helpItemDescIgnore'] = 'Ignorer/aksepter meldinger fra bruker:';
+$lang['helpItemCodeIgnore'] = '/ignore brukernavn';
+$lang['helpItemDescIgnoreList'] = 'Liste med ignorerte brukere:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Display user channel:';
+$lang['helpItemCodeWhereis'] = '/whereis Username';
+$lang['helpItemDescKick'] = 'Spark ut en bruker (bare Moderatorer):';
+$lang['helpItemCodeKick'] = '/kick brukernavn [minutter]';
+$lang['helpItemDescUnban'] = 'Ta inn en utsparket bruker (bare Moderatorer):';
+$lang['helpItemCodeUnban'] = '/unban brukernavn';
+$lang['helpItemDescBans'] = 'Liste med utsparkede brukere (bare Moderatorer):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Vis bruker IP (bare Moderatorer):';
+$lang['helpItemCodeWhois'] = '/whois brukernavn';
+$lang['helpItemDescWho'] = 'Vis påloggede brukere:';
+$lang['helpItemCodeWho'] = '/who [kanalnavn]';
+$lang['helpItemDescList'] = 'Vis tilgjenglige kanaler:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Rull terning:';
+$lang['helpItemCodeRoll'] = '/roll [nummer]d[sider]';
+$lang['helpItemDescNick'] = 'Change username:';
+$lang['helpItemCodeNick'] = '/nick Username';
+$lang['settings'] = 'Settings';
+$lang['settingsBBCode'] = 'Enable BBCode:';
+$lang['settingsBBCodeImages'] = 'Enable image BBCode:';
+$lang['settingsBBCodeColors'] = 'Enable font color BBCode:';
+$lang['settingsHyperLinks'] = 'Enable hyperlinks:';
+$lang['settingsLineBreaks'] = 'Enable line breaks:';
+$lang['settingsEmoticons'] = 'Enable emoticons:';
+$lang['settingsAutoFocus'] = 'Automatically set the focus on the input field:';
+$lang['settingsMaxMessages'] = 'Maximum number of messages in the chatlist:';
+$lang['settingsWordWrap'] = 'Enable wrapping of long words:';
+$lang['settingsMaxWordLength'] = 'Maximum length of a word before it gets wrapped:';
+$lang['settingsDateFormat'] = 'Format of date and time display:';
+$lang['settingsPersistFontColor'] = 'Persist font color:';
+$lang['settingsAudioVolume'] = 'Sound Volume:';
+$lang['settingsSoundReceive'] = 'Sound for incoming messages:';
+$lang['settingsSoundSend'] = 'Sound for outgoing messages:';
+$lang['settingsSoundEnter'] = 'Sound for login and channel enter messages:';
+$lang['settingsSoundLeave'] = 'Sound for logout and channel leave messages:';
+$lang['settingsSoundChatBot'] = 'Sound for chatbot messages:';
+$lang['settingsSoundError'] = 'Sound for error messages:';
+$lang['settingsBlink'] = 'Blink window title on new messages:';
+$lang['settingsBlinkInterval'] = 'Blink interval in milliseconds:';
+$lang['settingsBlinkIntervalNumber'] = 'Number of blink intervals:';
+$lang['playSelectedSound'] = 'Play selected sound';
+$lang['requiresJavaScript'] = 'JavaScript trengs for denne chat.';
+$lang['errorInvalidUser'] = 'Ugyldig brukernavn.';
+$lang['errorUserInUse'] = 'Brukernavn er i bruk.';
+$lang['errorBanned'] = 'Bruker eller IP er utsparket.';
+$lang['errorMaxUsersLoggedIn'] = 'Chatten har nådd maksimalt antall innloggede brukere.';
+$lang['errorChatClosed'] = 'Chatten er for øyeblikket stengt .';
+$lang['logsTitle'] = 'AJAX Chat - Logger';
+$lang['logsDate'] = 'Dato';
+$lang['logsTime'] = 'Tid';
+$lang['logsSearch'] = 'Søk';
+$lang['logsPrivateChannels'] = 'Private Kanaler';
+$lang['logsPrivateMessages'] = 'Private Meldinger';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/pl.php b/library/ajaxchat/chat/lib/lang/pl.php
new file mode 100644
index 000000000..92a1716a6
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/pl.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Tomasz Topa, http://tomasz.topa.pl/
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Nick';
+$lang['password'] = 'Hasło';
+$lang['login'] = 'Zaloguj';
+$lang['logout'] = 'Wyloguj';
+$lang['channel'] = 'Pokój';
+$lang['style'] = 'Styl';
+$lang['language'] = 'Język';
+$lang['inputLineBreak'] = 'Wciśnij SHIFT+ENTER aby przejść do nowej linijki';
+$lang['messageSubmit'] = 'Wyślij';
+$lang['registeredUsers'] = 'Zarejestrowani użytkownicy';
+$lang['onlineUsers'] = 'Użytkownicy online';
+$lang['toggleAutoScroll'] = 'Automatyczne przewijanie wł/wył';
+$lang['toggleAudio'] = 'Dźwięk wł/wył';
+$lang['toggleHelp'] = 'Pokaż/ukryj pomoc';
+$lang['toggleSettings'] = 'Pokaż/ukryj ustawienia';
+$lang['toggleOnlineList'] = 'Pokaż/ukryj listę osób online';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Cytat';
+$lang['bbCodeLabelCode'] = 'Kod';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Image';
+$lang['bbCodeLabelColor'] = 'Kolor tekstu';
+$lang['bbCodeTitleBold'] = 'Pogrubiony: [b]tekst[/b]';
+$lang['bbCodeTitleItalic'] = 'Kursywa: [i]tekst[/i]';
+$lang['bbCodeTitleUnderline'] = 'Podkreślony: [u]tekst[/u]';
+$lang['bbCodeTitleQuote'] = 'Cytat: [quote]tekst[/quote] lub [quote=autor]tekst[/quote]';
+$lang['bbCodeTitleCode'] = 'Kod: [code]kod[/code]';
+$lang['bbCodeTitleURL'] = 'Wstaw adres: [url]http://example.org[/url] lub [url=http://example.org]opis[/url]';
+$lang['bbCodeTitleImg'] = 'Insert image: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Kolor tekstu: [color=red]tekst[/color]';
+$lang['help'] = 'Pomoc';
+$lang['helpItemDescJoin'] = 'Wejdź do pokoju:';
+$lang['helpItemCodeJoin'] = '/join NazwaPokoju';
+$lang['helpItemDescJoinCreate'] = 'Utwórz nowy pokój (Tylko dla zarejestrowanych):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Zaproś kogoś (np. do prywatnego pokoju):';
+$lang['helpItemCodeInvite'] = '/invite Nick';
+$lang['helpItemDescUninvite'] = 'Odwołaj zaproszenie:';
+$lang['helpItemCodeUninvite'] = '/uninvite Nick';
+$lang['helpItemDescLogout'] = 'Wyloguj z czata:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Prywatna wiadomość:';
+$lang['helpItemCodePrivateMessage'] = '/msg Nick tekst';
+$lang['helpItemDescQueryOpen'] = 'Prywatna rozmowa:';
+$lang['helpItemCodeQueryOpen'] = '/query Nick';
+$lang['helpItemDescQueryClose'] = 'Zakończ prywatną rozmowę:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Napisz co teraz robisz:';
+$lang['helpItemCodeAction'] = '/action Tekst';
+$lang['helpItemDescDescribe'] = 'Napisz komuś co teraz robisz:';
+$lang['helpItemCodeDescribe'] = '/describe Nick Tekst';
+$lang['helpItemDescIgnore'] = 'Ignoruj/akceptuj wiadomości od użytkownika:';
+$lang['helpItemCodeIgnore'] = '/ignore Nick';
+$lang['helpItemDescIgnoreList'] = 'Lista ignorowanych:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Gdzie jest użytkownik:';
+$lang['helpItemCodeWhereis'] = '/whereis Nick';
+$lang['helpItemDescKick'] = 'Wyrzuć użytkownika (Tylko dla moderatorów):';
+$lang['helpItemCodeKick'] = '/kick Nick [Czas zablokowania w minutach]';
+$lang['helpItemDescUnban'] = 'Odblokuj użytkowników (Tylko dla moderatorów):';
+$lang['helpItemCodeUnban'] = '/unban Nick';
+$lang['helpItemDescBans'] = 'Lista zablokowanych użytkowników (Tylko dla moderatorów):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Pokaż IP użytkownika (Tylko dla moderatorów):';
+$lang['helpItemCodeWhois'] = '/whois Nick';
+$lang['helpItemDescWho'] = 'Lista użytkowników online:';
+$lang['helpItemCodeWho'] = '/who [NazwaPokoju]';
+$lang['helpItemDescList'] = 'Lista pokoi:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Rzuć kostką:';
+$lang['helpItemCodeRoll'] = '/roll [ile_razy]d[ilu_ścienną]';
+$lang['helpItemDescNick'] = 'Zmień nick:';
+$lang['helpItemCodeNick'] = '/nick Nick';
+$lang['settings'] = 'Ustawienia';
+$lang['settingsBBCode'] = 'Pozwól na BBCode:';
+$lang['settingsBBCodeImages'] = 'Enable image BBCode:';
+$lang['settingsBBCodeColors'] = 'Enable font color BBCode:';
+$lang['settingsHyperLinks'] = 'Pozwól na linki:';
+$lang['settingsLineBreaks'] = 'Pozwól na używanie wielu linijek:';
+$lang['settingsEmoticons'] = 'Pozwól na emotikonki:';
+$lang['settingsAutoFocus'] = 'Automatycznie ustawiaj kursor w polu tekstowym:';
+$lang['settingsMaxMessages'] = 'Maksymalna liczba wiadomości w głównym oknie:';
+$lang['settingsWordWrap'] = 'Pozwól dzielić długie wyrazy:';
+$lang['settingsMaxWordLength'] = 'Maksymalna długość wyrazu, którego nie wolno dzielić:';
+$lang['settingsDateFormat'] = 'Format wyświetlanej daty i czasu:';
+$lang['settingsPersistFontColor'] = 'Nie pozwól na zmianę koloru tekstu:';
+$lang['settingsAudioVolume'] = 'Głośność:';
+$lang['settingsSoundReceive'] = 'Dźwięk dla przychodzących wiadomości:';
+$lang['settingsSoundSend'] = 'Dźwięk dla wysyłanych wiadomości:';
+$lang['settingsSoundEnter'] = 'Dźwięk dla wejść do pokoju:';
+$lang['settingsSoundLeave'] = 'Dźwięk dla wyjść z pokoju:';
+$lang['settingsSoundChatBot'] = 'Dźwięk dla informacji od bota:';
+$lang['settingsSoundError'] = 'Dźwięk dla informacji o błędach:';
+$lang['settingsBlink'] = 'Miganie okienka przy nadejściu nowej wiadomości:';
+$lang['settingsBlinkInterval'] = 'Odstęp pomiędzy mignięciami (w milisekundach):';
+$lang['settingsBlinkIntervalNumber'] = 'Liczba mignięć:';
+$lang['playSelectedSound'] = 'Odtwórz wybrany dźwięk';
+$lang['requiresJavaScript'] = 'Do poprawnego działania czata wymagana jest obsługa JavaScript.';
+$lang['errorInvalidUser'] = 'Nieprawidłowy nick.';
+$lang['errorUserInUse'] = 'Wybrany nick jest już używany.';
+$lang['errorBanned'] = 'Nick lub IP jest zablokowane.';
+$lang['errorMaxUsersLoggedIn'] = 'Czat jest już pełny.';
+$lang['errorChatClosed'] = 'Czat jest tymczasowo wyłączony.';
+$lang['logsTitle'] = 'AJAX Chat - Logi';
+$lang['logsDate'] = 'Data';
+$lang['logsTime'] = 'Czas';
+$lang['logsSearch'] = 'Szukaj';
+$lang['logsPrivateChannels'] = 'Prywatne pokoje';
+$lang['logsPrivateMessages'] = 'Prywatne wiadomości';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/pt-br.php b/library/ajaxchat/chat/lib/lang/pt-br.php
new file mode 100644
index 000000000..034a5fb09
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/pt-br.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Pedro Innecco
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Usuário';
+$lang['password'] = 'Senha';
+$lang['login'] = 'Entrar';
+$lang['logout'] = 'Sair';
+$lang['channel'] = 'Canal';
+$lang['style'] = 'Aparência';
+$lang['language'] = 'Idioma';
+$lang['inputLineBreak'] = 'Pressione SHIFT+ENTER para inserir uma quebra de linha';
+$lang['messageSubmit'] = 'Enviar';
+$lang['registeredUsers'] = 'Para Usuários Registrados';
+$lang['onlineUsers'] = 'Usuários Online';
+$lang['toggleAutoScroll'] = 'Autorolagem liga/desliga';
+$lang['toggleAudio'] = 'Som liga/desliga';
+$lang['toggleHelp'] = 'Mostrar/esconder ajuda';
+$lang['toggleSettings'] = 'Mostrar/esconder configurações';
+$lang['toggleOnlineList'] = 'Mostrar/esconder lista de usuários online';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Citar';
+$lang['bbCodeLabelCode'] = 'Código';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Imagem';
+$lang['bbCodeLabelColor'] = 'Cor da fonte';
+$lang['bbCodeTitleBold'] = 'Texto negrito: [b]texto[/b]';
+$lang['bbCodeTitleItalic'] = 'Texto itálico: [i]texto[/i]';
+$lang['bbCodeTitleUnderline'] = 'Texto sublinhado: [u]texto[/u]';
+$lang['bbCodeTitleQuote'] = 'Citar texto: [quote]texto[/quote] ou [quote=autor]texto[/quote]';
+$lang['bbCodeTitleCode'] = 'Citar código: [code]código[/code]';
+$lang['bbCodeTitleURL'] = 'Inserir URL: [url]http://example.org[/url] or [url=http://example.org]texto[/url]';
+$lang['bbCodeTitleImg'] = 'Inserir imagem: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Cor da fonte: [color=red]texto[/color]';
+$lang['help'] = 'Ajuda';
+$lang['helpItemDescJoin'] = 'Entrar em um canal:';
+$lang['helpItemCodeJoin'] = '/join Nome do Canal';
+$lang['helpItemDescJoinCreate'] = 'Criar uma sala privada (Somente usuários registrados):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Convidar alguém (Por exemplo, para uma sala privada):';
+$lang['helpItemCodeInvite'] = '/invite Usuário';
+$lang['helpItemDescUninvite'] = 'Cancelar convite';
+$lang['helpItemCodeUninvite'] = '/uninvite Usuário';
+$lang['helpItemDescLogout'] = 'Sair do Chat:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Enviar mensagem privada:';
+$lang['helpItemCodePrivateMessage'] = '/msg Usuário Texto';
+$lang['helpItemDescQueryOpen'] = 'Abrir um canal privado:';
+$lang['helpItemCodeQueryOpen'] = '/query Usuário';
+$lang['helpItemDescQueryClose'] = 'Fechar um canal privado:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Descrever uma ação:';
+$lang['helpItemCodeAction'] = '/action Texto';
+$lang['helpItemDescDescribe'] = 'Descrever uma ação em uma mensagem privada:';
+$lang['helpItemCodeDescribe'] = '/describe Usuário Texto';
+$lang['helpItemDescIgnore'] = 'Ignorar/Aceitar mensagens de um usuário:';
+$lang['helpItemCodeIgnore'] = '/ignore Usuário';
+$lang['helpItemDescIgnoreList'] = 'Listar usuários ignorados:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Exibir canal de um usuário:';
+$lang['helpItemCodeWhereis'] = '/whereis Usuário';
+$lang['helpItemDescKick'] = 'Banir um usuário (Somente Moderadores):';
+$lang['helpItemCodeKick'] = '/kick Usuário [Bandido por minutos]';
+$lang['helpItemDescUnban'] = 'Desbanir um usuário (Somente Moderadores):';
+$lang['helpItemCodeUnban'] = '/unban Usuário';
+$lang['helpItemDescBans'] = 'Listar usuários banidos (Somente Moderadores):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Exibir IP de um usuário (Somente Moderadores):';
+$lang['helpItemCodeWhois'] = '/whois Usuário';
+$lang['helpItemDescWho'] = 'Listar usuários online:';
+$lang['helpItemCodeWho'] = '/who [Channelname]';
+$lang['helpItemDescList'] = 'Listar canais diponíveis:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Jogar dados:';
+$lang['helpItemCodeRoll'] = '/roll [números]d[lados]';
+$lang['helpItemDescNick'] = 'Trocar seu nome de usuário:';
+$lang['helpItemCodeNick'] = '/nick Nome';
+$lang['settings'] = 'Configurações';
+$lang['settingsBBCode'] = 'Permitir BBCode:';
+$lang['settingsBBCodeImages'] = 'Permitir BBCode image (imagem):';
+$lang['settingsBBCodeColors'] = 'Permitir BBCode font color (cor de fonte):';
+$lang['settingsHyperLinks'] = 'Permitir hyperlinks:';
+$lang['settingsLineBreaks'] = 'Permitir quebra-linha:';
+$lang['settingsEmoticons'] = 'Permitir emoticons:';
+$lang['settingsAutoFocus'] = 'Definir automaticamente o foco no campo de envio de mensagens:';
+$lang['settingsMaxMessages'] = 'O número máximo de mensagens na lista do Chat:';
+$lang['settingsWordWrap'] = 'Permitir quebra de linha para palavras longas:';
+$lang['settingsMaxWordLength'] = 'O comprimento máximo de uma palavra antes dele começa envolvido:';
+$lang['settingsDateFormat'] = 'Formato da exposição da data e da hora:';
+$lang['settingsPersistFontColor'] = 'Persistir cor da fonte:';
+$lang['settingsAudioVolume'] = 'Volume do som:';
+$lang['settingsSoundReceive'] = 'Som para mensagens recebidas:';
+$lang['settingsSoundSend'] = 'Som para mensagens enviadas:';
+$lang['settingsSoundEnter'] = 'Som para login e avisos de entrada em canais:';
+$lang['settingsSoundLeave'] = 'Som para logout e avisos de saida em canais:';
+$lang['settingsSoundChatBot'] = 'Som para mensagens do chatbot:';
+$lang['settingsSoundError'] = 'Som para mensagens de erro:';
+$lang['settingsBlink'] = 'Título da janela do piscamento em mensagens novas:';
+$lang['settingsBlinkInterval'] = 'Intervalo do piscamento nos milissegundos:';
+$lang['settingsBlinkIntervalNumber'] = 'Número de intervalos do piscamento:';
+$lang['playSelectedSound'] = 'Reproduzir som selecionado';
+$lang['requiresJavaScript'] = 'Javascript é requerido para este Chat.';
+$lang['errorInvalidUser'] = 'Usuário inválido.';
+$lang['errorUserInUse'] = 'Usuário já se encontra em uso.';
+$lang['errorBanned'] = 'O usuário ou endereço de IP foi banido do chat.';
+$lang['errorMaxUsersLoggedIn'] = 'O chat atingiu o número máximo de usuários permitidos.';
+$lang['errorChatClosed'] = 'O chat está fechado no momento.';
+$lang['logsTitle'] = 'Ajax Chat - Relatório';
+$lang['logsDate'] = 'Data';
+$lang['logsTime'] = 'Hora';
+$lang['logsSearch'] = 'Pesquisar';
+$lang['logsPrivateChannels'] = 'Canais privados';
+$lang['logsPrivateMessages'] = 'Mensagens privadas';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/pt-pt.php b/library/ajaxchat/chat/lib/lang/pt-pt.php
new file mode 100644
index 000000000..e3399eb04
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/pt-pt.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author of translate Carlos Rocha (aka Broas@)
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Nick';
+$lang['password'] = 'Password';
+$lang['login'] = 'Entrar';
+$lang['logout'] = 'Sair';
+$lang['channel'] = 'Sala';
+$lang['style'] = 'Aparência';
+$lang['language'] = 'Idioma';
+$lang['inputLineBreak'] = 'Prima SHIFT+ENTER para inserir uma quebra de linha';
+$lang['messageSubmit'] = 'Enviar';
+$lang['registeredUsers'] = 'Utilizadores registados';
+$lang['onlineUsers'] = 'Utilizadores online';
+$lang['toggleAutoScroll'] = 'Ligar/Desligar scroll automático';
+$lang['toggleAudio'] = 'Ligar/Desligar som';
+$lang['toggleHelp'] = 'Mostrar/Esconder ajuda';
+$lang['toggleSettings'] = 'Mostrar/Esconder configurações';
+$lang['toggleOnlineList'] = 'Mostrar/Esconder listas online';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Citar';
+$lang['bbCodeLabelCode'] = 'Código';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Imagem';
+$lang['bbCodeLabelColor'] = 'Cor da fonte';
+$lang['bbCodeTitleBold'] = 'Texto a negrito: [b]texto[/b]';
+$lang['bbCodeTitleItalic'] = 'Texto itálico: [i]texto[/i]';
+$lang['bbCodeTitleUnderline'] = 'Texto sublinhado: [u]texto[/u]';
+$lang['bbCodeTitleQuote'] = 'Citar texto: [quote]texto[/quote] ou [quote=autor]texto[/quote]';
+$lang['bbCodeTitleCode'] = 'Citar código: [code]código[/code]';
+$lang['bbCodeTitleURL'] = 'Inserir URL: [url]http://example.org[/url] ou [url=http://example.org]texto[/url]';
+$lang['bbCodeTitleImg'] = 'Inserir imagem: [img]http://example.org/imagem.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Cor da fonte: [color=red]texto[/color]';
+$lang['help'] = 'Ajuda';
+$lang['helpItemDescJoin'] = 'Entrar numa sala:';
+$lang['helpItemCodeJoin'] = '/join [Nome da sala]';
+$lang['helpItemDescJoinCreate'] = 'Criar sala privada (Só para utilizadores registados):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Convidar alguém para uma sala privada:';
+$lang['helpItemCodeInvite'] = '/invite [Utilizador]';
+$lang['helpItemDescUninvite'] = 'Cancelar convite';
+$lang['helpItemCodeUninvite'] = '/uninvite [Utilizador]';
+$lang['helpItemDescLogout'] = 'Sair do chat:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Enviar mensagem privada:';
+$lang['helpItemCodePrivateMessage'] = '/msg [Utilizador] [Texto]';
+$lang['helpItemDescQueryOpen'] = 'Abrir uma sala privada:';
+$lang['helpItemCodeQueryOpen'] = '/query [Utilizador]';
+$lang['helpItemDescQueryClose'] = 'Fechar uma sala privada:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Acção:';
+$lang['helpItemCodeAction'] = '/action [Texto]';
+$lang['helpItemDescDescribe'] = 'Descreve a acção em mensagem privada:';
+$lang['helpItemCodeDescribe'] = '/describe [Utilizador] [Texto]';
+$lang['helpItemDescIgnore'] = 'Adicionar/Remover utilizador à lista de ignorados:';
+$lang['helpItemCodeIgnore'] = '/ignore [Utilizador]';
+$lang['helpItemDescIgnoreList'] = 'Lista de utilizadores ignorados:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Encontrar um utilizador:';
+$lang['helpItemCodeWhereis'] = '/whereis [Utilizador]';
+$lang['helpItemDescKick'] = 'Kickar um utilizador (Só Moderadores):';
+$lang['helpItemCodeKick'] = '/kick [Utilizador] [Minutos]';
+$lang['helpItemDescUnban'] = 'Desbanir um utilizador (Só Moderadores):';
+$lang['helpItemCodeUnban'] = '/unban [Utilizador]';
+$lang['helpItemDescBans'] = 'Lista de utilizadores banidos (Só Moderadores):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Mostrar IP de um utilizador (Só Moderadores):';
+$lang['helpItemCodeWhois'] = '/whois [Utilizador]';
+$lang['helpItemDescWho'] = 'Lista de utilizadores online na sala:';
+$lang['helpItemCodeWho'] = '/who ou /who [Sala]';
+$lang['helpItemDescList'] = 'Lista canais diponíveis:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Jogar dados:';
+$lang['helpItemCodeRoll'] = '/roll [números] [dados]';
+$lang['helpItemDescNick'] = 'Trocar de nick:';
+$lang['helpItemCodeNick'] = '/nick [Novo nick]';
+$lang['settings'] = 'Configurações';
+$lang['settingsBBCode'] = 'Permitir BBCode:';
+$lang['settingsBBCodeImages'] = 'Permitir BBCode para imagem:';
+$lang['settingsBBCodeColors'] = 'Permitir BBCode para cor da fonte:';
+$lang['settingsHyperLinks'] = 'Permitir URL:';
+$lang['settingsLineBreaks'] = 'Permitir quebra de linha:';
+$lang['settingsEmoticons'] = 'Permitir smileys:';
+$lang['settingsAutoFocus'] = 'Definir automaticamente a centrar-se no campo de pesquisa:';
+$lang['settingsMaxMessages'] = 'Número máximo de mensagens no Chat:';
+$lang['settingsWordWrap'] = 'Permitir palavras longas:';
+$lang['settingsMaxWordLength'] = 'O comprimento máximo de uma palavra é de:';
+$lang['settingsDateFormat'] = 'Formato da hora e data:';
+$lang['settingsPersistFontColor'] = 'Persistir cor da fonte:';
+$lang['settingsAudioVolume'] = 'Volume do som:';
+$lang['settingsSoundReceive'] = 'Som para as mensagens recebidas:';
+$lang['settingsSoundSend'] = 'Som de mensagens enviadas:';
+$lang['settingsSoundEnter'] = 'Som de login:';
+$lang['settingsSoundLeave'] = 'Som de logout:';
+$lang['settingsSoundChatBot'] = 'Som para mensagens do chatbot:';
+$lang['settingsSoundError'] = 'Som para mensagens de erro:';
+$lang['settingsBlink'] = 'Título da janela do "piscamento" em mensagens novas:';
+$lang['settingsBlinkInterval'] = 'Intervalo do "piscamento" em milissegundos:';
+$lang['settingsBlinkIntervalNumber'] = 'Número de intervalos do "piscamento":';
+$lang['playSelectedSound'] = 'Reproduzir o som selecionado';
+$lang['requiresJavaScript'] = 'O Javascript tem de estar ligado para entrares no Chat.';
+$lang['errorInvalidUser'] = 'Nick inválido.';
+$lang['errorUserInUse'] = 'Nick em uso.';
+$lang['errorBanned'] = 'O teu nick ou IP está banido.';
+$lang['errorMaxUsersLoggedIn'] = 'O chat atingiu o número máximo de utilizadores ligados.';
+$lang['errorChatClosed'] = 'O Chat está encerrado de momento.';
+$lang['logsTitle'] = 'AJAX Chat - Relatório';
+$lang['logsDate'] = 'Data';
+$lang['logsTime'] = 'Tempo';
+$lang['logsSearch'] = 'Procurar';
+$lang['logsPrivateChannels'] = 'Salas privadas';
+$lang['logsPrivateMessages'] = 'Mensagens privadas';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/ro.php b/library/ajaxchat/chat/lib/lang/ro.php
new file mode 100644
index 000000000..8e6d6418f
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/ro.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author K.Z.
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'Chat AJAX';
+$lang['userName'] = 'Nume de utilizator';
+$lang['password'] = 'Parolă';
+$lang['login'] = 'Autentificare';
+$lang['logout'] = 'Ieşire';
+$lang['channel'] = 'Canal';
+$lang['style'] = 'Stil';
+$lang['language'] = 'Limbă';
+$lang['inputLineBreak'] = 'Press SHIFT+ENTER to input a line break';
+$lang['messageSubmit'] = 'Trimite';
+$lang['registeredUsers'] = 'Utizatori înregistraţi';
+$lang['onlineUsers'] = 'Utilizatori activi';
+$lang['toggleAutoScroll'] = 'Autoscroll on/off';
+$lang['toggleAudio'] = 'Sound on/off';
+$lang['toggleHelp'] = 'Show/hide help';
+$lang['toggleSettings'] = 'Show/hide settings';
+$lang['toggleOnlineList'] = 'Show/hide online list';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Citat';
+$lang['bbCodeLabelCode'] = 'Cod';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Image';
+$lang['bbCodeLabelColor'] = 'Culoare fontului';
+$lang['bbCodeTitleBold'] = 'Text îngroşat: [b]text[/b]';
+$lang['bbCodeTitleItalic'] = 'Text înclinat: [i]text[/i]';
+$lang['bbCodeTitleUnderline'] = 'Text subliniat: [u]text[/u]';
+$lang['bbCodeTitleQuote'] = 'Citează text: [quote]text[/quote] or [quote=author]text[/quote]';
+$lang['bbCodeTitleCode'] = 'Scrie cod: [code]code[/code]';
+$lang['bbCodeTitleURL'] = 'Introdu URL: [url]http://example.org[/url] or [url=http://example.org]text[/url]';
+$lang['bbCodeTitleImg'] = 'Insert image: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Culoarea fontului: [color=red]text[/color]';
+$lang['help'] = 'Ajutor';
+$lang['helpItemDescJoin'] = 'Alăturăte canalului:';
+$lang['helpItemCodeJoin'] = '/join Channelname';
+$lang['helpItemDescJoinCreate'] = 'Creează o cameră privată de chat (Utilizatorii înregistraţi):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Invită pe cineva (ex.: într-o cameră privată):';
+$lang['helpItemCodeInvite'] = '/invite Username';
+$lang['helpItemDescUninvite'] = 'Respinge invitaţia:';
+$lang['helpItemCodeUninvite'] = '/uninvite Username';
+$lang['helpItemDescLogout'] = 'Ieşire din chat:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Mesaj privat:';
+$lang['helpItemCodePrivateMessage'] = '/msg Username Text';
+$lang['helpItemDescQueryOpen'] = 'Deschide un canal privat:';
+$lang['helpItemCodeQueryOpen'] = '/query Username';
+$lang['helpItemDescQueryClose'] = 'Închide un canal privat:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Descrie acţiune:';
+$lang['helpItemCodeAction'] = '/action Text';
+$lang['helpItemDescDescribe'] = 'Descrie acţiune în mesaj privat:';
+$lang['helpItemCodeDescribe'] = '/describe Username Text';
+$lang['helpItemDescIgnore'] = 'Ignoră/acceptă mesaj de la un utilizator:';
+$lang['helpItemCodeIgnore'] = '/ignore Username';
+$lang['helpItemDescIgnoreList'] = 'Arată lista cu utilizatorii ignoraţi:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Display user channel:';
+$lang['helpItemCodeWhereis'] = '/whereis Username';
+$lang['helpItemDescKick'] = 'Dă afară un utilizator (doar Moderatorii):';
+$lang['helpItemCodeKick'] = '/kick Username [Minutes banned]';
+$lang['helpItemDescUnban'] = 'Redă accesul la chat al unui utilizator (doar Moderatorii):';
+$lang['helpItemCodeUnban'] = '/unban Username';
+$lang['helpItemDescBans'] = 'Listează utilizatorii care au accesul interzis (doar Moderatorii):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Arată IP-ul utilizatorului (doar Moderatorii):';
+$lang['helpItemCodeWhois'] = '/whois Username';
+$lang['helpItemDescWho'] = 'Listează utilizatorii activi:';
+$lang['helpItemCodeWho'] = '/who [Channelname]';
+$lang['helpItemDescList'] = 'Listează canalele disponbile:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Aruncă zarul:';
+$lang['helpItemCodeRoll'] = '/roll [number]d[sides]';
+$lang['helpItemDescNick'] = 'Change username:';
+$lang['helpItemCodeNick'] = '/nick Username';
+$lang['settings'] = 'Settings';
+$lang['settingsBBCode'] = 'Enable BBCode:';
+$lang['settingsBBCodeImages'] = 'Enable image BBCode:';
+$lang['settingsBBCodeColors'] = 'Enable font color BBCode:';
+$lang['settingsHyperLinks'] = 'Enable hyperlinks:';
+$lang['settingsLineBreaks'] = 'Enable line breaks:';
+$lang['settingsEmoticons'] = 'Enable emoticons:';
+$lang['settingsAutoFocus'] = 'Automatically set the focus on the input field:';
+$lang['settingsMaxMessages'] = 'Maximum number of messages in the chatlist:';
+$lang['settingsWordWrap'] = 'Enable wrapping of long words:';
+$lang['settingsMaxWordLength'] = 'Maximum length of a word before it gets wrapped:';
+$lang['settingsDateFormat'] = 'Format of date and time display:';
+$lang['settingsPersistFontColor'] = 'Persist font color:';
+$lang['settingsAudioVolume'] = 'Sound Volume:';
+$lang['settingsSoundReceive'] = 'Sound for incoming messages:';
+$lang['settingsSoundSend'] = 'Sound for outgoing messages:';
+$lang['settingsSoundEnter'] = 'Sound for login and channel enter messages:';
+$lang['settingsSoundLeave'] = 'Sound for logout and channel leave messages:';
+$lang['settingsSoundChatBot'] = 'Sound for chatbot messages:';
+$lang['settingsSoundError'] = 'Sound for error messages:';
+$lang['settingsBlink'] = 'Blink window title on new messages:';
+$lang['settingsBlinkInterval'] = 'Blink interval in milliseconds:';
+$lang['settingsBlinkIntervalNumber'] = 'Number of blink intervals:';
+$lang['playSelectedSound'] = 'Play selected sound';
+$lang['requiresJavaScript'] = 'Pentru a vizualiza acest chat trebuie să aveţi activat JavaScript-ul activat.';
+$lang['errorInvalidUser'] = 'Numele de utilizator incorect.';
+$lang['errorUserInUse'] = 'Numele de utilizator este deja folosit.';
+$lang['errorBanned'] = 'Accesul interzis utilizatorului sau persoanei cu acest IP.';
+$lang['errorMaxUsersLoggedIn'] = 'Chat-ul a atins numărul maxim de utilizatori.';
+$lang['errorChatClosed'] = 'Chat-ul este închis temporar.';
+$lang['logsTitle'] = 'Chat AJAX - Loguri';
+$lang['logsDate'] = 'Data';
+$lang['logsTime'] = 'Ora';
+$lang['logsSearch'] = 'Caută';
+$lang['logsPrivateChannels'] = 'Canale private';
+$lang['logsPrivateMessages'] = 'Mesaje private';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/ru.php b/library/ajaxchat/chat/lib/lang/ru.php
new file mode 100644
index 000000000..ac86531dc
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/ru.php
@@ -0,0 +1,125 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author SkyKnight
+ * @author Dmitry Plyonkin
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Имя';
+$lang['password'] = 'Пароль';
+$lang['login'] = 'Login';
+$lang['logout'] = 'Выйти';
+$lang['channel'] = 'Канал';
+$lang['style'] = 'Стиль';
+$lang['language'] = 'Язык';
+$lang['inputLineBreak'] = 'Нажмите SHIFT+ENTER, чтобы перейти на новую строку';
+$lang['messageSubmit'] = 'Отправить';
+$lang['registeredUsers'] = 'Только для зарегистрированных пользователей';
+$lang['onlineUsers'] = 'Пользователи онлайн';
+$lang['toggleAutoScroll'] = 'Вкл/выкл авто-прокрутку';
+$lang['toggleAudio'] = 'Вкл/выкл звук';
+$lang['toggleHelp'] = 'Показать/скрыть подсказку';
+$lang['toggleSettings'] = 'Показать/скрыть настройки';
+$lang['toggleOnlineList'] = 'Показать/скрыть список участников';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Цитата';
+$lang['bbCodeLabelCode'] = 'Код';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Image';
+$lang['bbCodeLabelColor'] = 'Цвет шрифта';
+$lang['bbCodeTitleBold'] = 'Жирный текст: [b]текст[/b]';
+$lang['bbCodeTitleItalic'] = 'Курсив: [i]текст[/i]';
+$lang['bbCodeTitleUnderline'] = 'Подчеркнутый текст: [u]текст[/u]';
+$lang['bbCodeTitleQuote'] = 'Цитата: [quote]текст[/quote] или [quote=автор]текст[/quote]';
+$lang['bbCodeTitleCode'] = 'Код: [code]текст[/code]';
+$lang['bbCodeTitleURL'] = 'Вставить ссылку: [url]http://example.org[/url] или [url=http://example.org]текст[/url]';
+$lang['bbCodeTitleImg'] = 'Insert image: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Цвет шрифта: [color=red]текст[/color]';
+$lang['help'] = 'Помощь';
+$lang['helpItemDescJoin'] = 'Присоедениться к каналу:';
+$lang['helpItemCodeJoin'] = '/join имя_канала';
+$lang['helpItemDescJoinCreate'] = 'Создать частный (приватный) канал:';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Пригласить кого-либо (например в частный канал):';
+$lang['helpItemCodeInvite'] = '/invite имя_пользователя';
+$lang['helpItemDescUninvite'] = 'Отозвать приглашение:';
+$lang['helpItemCodeUninvite'] = '/uninvite имя_пользователя';
+$lang['helpItemDescLogout'] = 'Выйти из чата:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Приватное сообщение:';
+$lang['helpItemCodePrivateMessage'] = '/msg Имя_пользователся Текст';
+$lang['helpItemDescQueryOpen'] = 'Открыть приватный канал:';
+$lang['helpItemCodeQueryOpen'] = '/query Имя_пользователя';
+$lang['helpItemDescQueryClose'] = 'Закрыть приватный канал:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Описать действия:';
+$lang['helpItemCodeAction'] = '/action Текст';
+$lang['helpItemDescDescribe'] = 'Описать действия в приватном сообщении:';
+$lang['helpItemCodeDescribe'] = '/describe Имя_пользователя Текст';
+$lang['helpItemDescIgnore'] = 'Игнорировать/принимать сообщения от пользователей:';
+$lang['helpItemCodeIgnore'] = '/ignore Имя_пользователся';
+$lang['helpItemDescIgnoreList'] = 'List ignored users:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Display user channel:';
+$lang['helpItemCodeWhereis'] = '/whereis Username';
+$lang['helpItemDescKick'] = 'Выгнать пользователся (Kick) (только модераторы и администраторы):';
+$lang['helpItemCodeKick'] = '/kick Имя_пользователя [Минуты]';
+$lang['helpItemDescUnban'] = 'Разбанить пользователя (Только модераторы и администраторы):';
+$lang['helpItemCodeUnban'] = '/unban Имя_пользователя';
+$lang['helpItemDescBans'] = 'Список забаненных пользователей (Только для модераторов):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Показать IP пользователся (Только модераторы и администраторы):';
+$lang['helpItemCodeWhois'] = '/whois Имя_пользователя';
+$lang['helpItemDescWho'] = 'Список доступных пользователей:';
+$lang['helpItemCodeWho'] = '/who [Имя_канала]';
+$lang['helpItemDescList'] = 'Список доступных каналов:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Бросить кубики:';
+$lang['helpItemCodeRoll'] = '/roll [количесво]d[количество сторон]';
+$lang['helpItemDescNick'] = 'Change username:';
+$lang['helpItemCodeNick'] = '/nick Username';
+$lang['settings'] = 'Настройки';
+$lang['settingsBBCode'] = 'Разрешить BBCode:';
+$lang['settingsBBCodeImages'] = 'Enable image BBCode:';
+$lang['settingsBBCodeColors'] = 'Enable font color BBCode:';
+$lang['settingsHyperLinks'] = 'Разрешить ссылки:';
+$lang['settingsLineBreaks'] = 'Разрешить переводы строк:';
+$lang['settingsEmoticons'] = 'Разрешить смайлики:';
+$lang['settingsAutoFocus'] = 'Автоматически ставить курсор в поле ввода:';
+$lang['settingsMaxMessages'] = 'Маскимальное количество сообщений, отображающихся в чате:';
+$lang['settingsWordWrap'] = 'Переносить длинные слова:';
+$lang['settingsMaxWordLength'] = 'Максимально допустимая длина слова, которе не будет разбито для переноса:';
+$lang['settingsDateFormat'] = 'Формат даты и времени:';
+$lang['settingsPersistFontColor'] = 'Постоянный цвет шрифта:';
+$lang['settingsAudioVolume'] = 'Громкость:';
+$lang['settingsSoundReceive'] = 'Звук для входящих сообщений:';
+$lang['settingsSoundSend'] = 'Звук для исходящих сообщений:';
+$lang['settingsSoundEnter'] = 'Звук для оповещения о новом участнике в чате:';
+$lang['settingsSoundLeave'] = 'Звук для оповещения об уходе участника из чата:';
+$lang['settingsSoundChatBot'] = 'Звук для сообщений бота:';
+$lang['settingsSoundError'] = 'Звук для оповещений об ошибках:';
+$lang['settingsBlink'] = '"Моргать" заголовком окна при новом сообщении:';
+$lang['settingsBlinkInterval'] = 'Интервал "моргания" (в миллисекундах):';
+$lang['settingsBlinkIntervalNumber'] = 'Количество "морганий":';
+$lang['playSelectedSound'] = 'Воспроизвести выбранный звук';
+$lang['requiresJavaScript'] = 'Для корректной работы чата должен быть разрешен JavaScript.';
+$lang['errorInvalidUser'] = 'Неверное имя пользователя.';
+$lang['errorUserInUse'] = 'Имя занято.';
+$lang['errorBanned'] = 'Пользователь или IP забанены.';
+$lang['errorMaxUsersLoggedIn'] = 'В чате максимальное количество пользователей. Попробуйте зайти позднее.';
+$lang['errorChatClosed'] = 'Чат закрыт в настоящий момент.';
+$lang['logsTitle'] = 'AJAX Chat - История';
+$lang['logsDate'] = 'Дата';
+$lang['logsTime'] = 'Время';
+$lang['logsSearch'] = 'Поиск';
+$lang['logsPrivateChannels'] = 'Приватные каналы';
+$lang['logsPrivateMessages'] = 'Приватные сообщения';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/sk.php b/library/ajaxchat/chat/lib/lang/sk.php
new file mode 100644
index 000000000..fae99a785
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/sk.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Peter
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Meno';
+$lang['password'] = 'Heslo';
+$lang['login'] = 'Prihlásiť';
+$lang['logout'] = 'Odhlásiť';
+$lang['channel'] = 'Kanál';
+$lang['style'] = 'Štýl';
+$lang['language'] = 'Jazyk';
+$lang['inputLineBreak'] = 'Press SHIFT+ENTER to input a line break';
+$lang['messageSubmit'] = 'Poslať';
+$lang['registeredUsers'] = 'Registrovaní užívatelia';
+$lang['onlineUsers'] = 'Prihlásení užívatelia';
+$lang['toggleAutoScroll'] = 'Autoscroll on/off';
+$lang['toggleAudio'] = 'Sound on/off';
+$lang['toggleHelp'] = 'Show/hide help';
+$lang['toggleSettings'] = 'Show/hide settings';
+$lang['toggleOnlineList'] = 'Show/hide online list';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Citovať';
+$lang['bbCodeLabelCode'] = 'Kód';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Image';
+$lang['bbCodeLabelColor'] = 'Farba písma';
+$lang['bbCodeTitleBold'] = 'Tučné: [b]text[/b]';
+$lang['bbCodeTitleItalic'] = 'Kurzívou: [i]text[/i]';
+$lang['bbCodeTitleUnderline'] = 'Podčiarknuté: [u]text[/u]';
+$lang['bbCodeTitleQuote'] = 'Citovať text: [quote]text[/quote] alebo [quote=autor]text[/quote]';
+$lang['bbCodeTitleCode'] = 'Zobraziť kód: [code]kód[/code]';
+$lang['bbCodeTitleURL'] = 'Vložiť URL: [url]http://www.example.org/[/url] alebo [url=http://www.example.org/]text[/url]';
+$lang['bbCodeTitleImg'] = 'Insert image: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Farba písma: [color=red]text[/color]';
+$lang['help'] = 'Nápoveda';
+$lang['helpItemDescJoin'] = 'Prihlásenie do kanálu:';
+$lang['helpItemCodeJoin'] = '/join Názov_kanálu';
+$lang['helpItemDescJoinCreate'] = 'Vytvoriť súkromný chat (Iba pre registrovaných užívateľov):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Pozvať niekoho k súkromnému rozhovoru:';
+$lang['helpItemCodeInvite'] = '/invite Meno_užívateľa';
+$lang['helpItemDescUninvite'] = 'Odriecť pozvanie:';
+$lang['helpItemCodeUninvite'] = '/uninvite Meno_užívateľa';
+$lang['helpItemDescLogout'] = 'Odhlásenie z chatu:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Súkromná správa:';
+$lang['helpItemCodePrivateMessage'] = '/msg Meno_užívateľa Text';
+$lang['helpItemDescQueryOpen'] = 'Otvoriť súkromný kanál:';
+$lang['helpItemCodeQueryOpen'] = '/query Meno_užívateľa';
+$lang['helpItemDescQueryClose'] = 'Zavrieť súkromný kanál:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Opísať akciu:';
+$lang['helpItemCodeAction'] = '/action Text';
+$lang['helpItemDescDescribe'] = 'Opísať akciu v súkromnej správe:';
+$lang['helpItemCodeDescribe'] = '/describe Meno_užívateľa Text';
+$lang['helpItemDescIgnore'] = 'Ignoruj/akceptuj správu od užívateľa:';
+$lang['helpItemCodeIgnore'] = '/ignore (accept) Meno_užívateľa';
+$lang['helpItemDescIgnoreList'] = 'Zoznam zamietnutých užívateľov:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Display user channel:';
+$lang['helpItemCodeWhereis'] = '/whereis Username';
+$lang['helpItemDescKick'] = 'Vylúčiť užívateľa (Iba Moderátori):';
+$lang['helpItemCodeKick'] = '/kick Meno_užívateľa [čas vylúčenia v minútach]';
+$lang['helpItemDescUnban'] = 'Prijať vylúčeného užívateľa (Iba Moderátori):';
+$lang['helpItemCodeUnban'] = '/unban Meno_užívateľa';
+$lang['helpItemDescBans'] = 'Zoznam vylúčených užívateľov (Iba Moderátori):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Zobraz IP užívateľa(Iba Moderátori):';
+$lang['helpItemCodeWhois'] = '/whois Meno_užívateľa';
+$lang['helpItemDescWho'] = 'Zoznam prihlásených užívateľov:';
+$lang['helpItemCodeWho'] = '/who [Meno_kanálu]';
+$lang['helpItemDescList'] = 'Zoznam dostupných kanálov:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Hodiť kocky:';
+$lang['helpItemCodeRoll'] = '/roll [číslo]d[strana]';
+$lang['helpItemDescNick'] = 'Change username:';
+$lang['helpItemCodeNick'] = '/nick Username';
+$lang['settings'] = 'Settings';
+$lang['settingsBBCode'] = 'Enable BBCode:';
+$lang['settingsBBCodeImages'] = 'Enable image BBCode:';
+$lang['settingsBBCodeColors'] = 'Enable font color BBCode:';
+$lang['settingsHyperLinks'] = 'Enable hyperlinks:';
+$lang['settingsLineBreaks'] = 'Enable line breaks:';
+$lang['settingsEmoticons'] = 'Enable emoticons:';
+$lang['settingsAutoFocus'] = 'Automatically set the focus on the input field:';
+$lang['settingsMaxMessages'] = 'Maximum number of messages in the chatlist:';
+$lang['settingsWordWrap'] = 'Enable wrapping of long words:';
+$lang['settingsMaxWordLength'] = 'Maximum length of a word before it gets wrapped:';
+$lang['settingsDateFormat'] = 'Format of date and time display:';
+$lang['settingsPersistFontColor'] = 'Persist font color:';
+$lang['settingsAudioVolume'] = 'Sound Volume:';
+$lang['settingsSoundReceive'] = 'Sound for incoming messages:';
+$lang['settingsSoundSend'] = 'Sound for outgoing messages:';
+$lang['settingsSoundEnter'] = 'Sound for login and channel enter messages:';
+$lang['settingsSoundLeave'] = 'Sound for logout and channel leave messages:';
+$lang['settingsSoundChatBot'] = 'Sound for chatbot messages:';
+$lang['settingsSoundError'] = 'Sound for error messages:';
+$lang['settingsBlink'] = 'Blink window title on new messages:';
+$lang['settingsBlinkInterval'] = 'Blink interval in milliseconds:';
+$lang['settingsBlinkIntervalNumber'] = 'Number of blink intervals:';
+$lang['playSelectedSound'] = 'Play selected sound';
+$lang['requiresJavaScript'] = 'Pre tento chat sa vyžaduje nainštalovať JavaScript.';
+$lang['errorInvalidUser'] = 'Neplatné užívateľské meno.';
+$lang['errorUserInUse'] = 'Použité užívateľské meno.';
+$lang['errorBanned'] = 'Užívateľ alebo IP je zakázané.';
+$lang['errorMaxUsersLoggedIn'] = 'Chat dosiahol maximálny počet prihlásených užívateľov.';
+$lang['errorChatClosed'] = 'Chat je momentálne nedostupný.';
+$lang['logsTitle'] = 'AJAX Chat - Záznamy';
+$lang['logsDate'] = 'Dátum';
+$lang['logsTime'] = 'Čas';
+$lang['logsSearch'] = 'Vyhľadávanie';
+$lang['logsPrivateChannels'] = 'Súkromný kanál';
+$lang['logsPrivateMessages'] = 'Súkromná správa';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/sl.php b/library/ajaxchat/chat/lib/lang/sl.php
new file mode 100644
index 000000000..6e4941532
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/sl.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Valter Pepelko
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'Klepetalnica';
+$lang['userName'] = 'Uporabniško ime';
+$lang['password'] = 'Geslo';
+$lang['login'] = 'Prijava';
+$lang['logout'] = 'Odjava';
+$lang['channel'] = 'Soba';
+$lang['style'] = 'Stil';
+$lang['language'] = 'Jezik';
+$lang['inputLineBreak'] = 'Pritisnite SHIFT+ENTER za novo vrstico';
+$lang['messageSubmit'] = 'Pošlji';
+$lang['registeredUsers'] = 'Registrirani uporabniki';
+$lang['onlineUsers'] = 'Prisotni';
+$lang['toggleAutoScroll'] = 'Samodejno pomikanje besedila vklop/izklop';
+$lang['toggleAudio'] = 'Zvok vklop/izklop';
+$lang['toggleHelp'] = 'Pomoč prikaži/skrij';
+$lang['toggleSettings'] = 'Nastavitve prikaži/skrij';
+$lang['toggleOnlineList'] = 'Prisotni prikaži/skrij';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Citiranje';
+$lang['bbCodeLabelCode'] = 'Koda';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Slika';
+$lang['bbCodeLabelColor'] = 'Barva črk';
+$lang['bbCodeTitleBold'] = 'Odebeljeno besedilo: [b]besedilo[/b]';
+$lang['bbCodeTitleItalic'] = 'Poševno besedilo: [i]besedilo[/i]';
+$lang['bbCodeTitleUnderline'] = 'Podčrtano besedilo: [u]besedilo[/u]';
+$lang['bbCodeTitleQuote'] = 'Citirano besedilo: [quote]besedilo[/quote] ali [quote=autor]besedilo[/quote]';
+$lang['bbCodeTitleCode'] = 'Prikazovanje kode: [code]koda[/code]';
+$lang['bbCodeTitleURL'] = 'Vnesi URL: [url]http://www.primer.org/[/url] ali [url=http://www.primer.org/]besedilo[/url]';
+$lang['bbCodeTitleImg'] = 'Vstavi sliko: [img]http://priemr.org/slika.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Barva črk: [color=red]besedilo[/color]';
+$lang['help'] = 'Pomoč';
+$lang['helpItemDescJoin'] = 'Vstopi v sobo:';
+$lang['helpItemCodeJoin'] = '/join Ime sobe';
+$lang['helpItemDescJoinCreate'] = 'Izdelaj privatno sobo (samo registrirani uporabniki):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Povabi uporabnika v privatno sobo:';
+$lang['helpItemCodeInvite'] = '/invite Uporabnik';
+$lang['helpItemDescUninvite'] = 'Preklic povabila v privatno sobo uporabniku:';
+$lang['helpItemCodeUninvite'] = '/uninvite Uporabnik';
+$lang['helpItemDescLogout'] = 'Odjava:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Privatno sporočilo:';
+$lang['helpItemCodePrivateMessage'] = '/msg Uporabnik Besedilo sporočila';
+$lang['helpItemDescQueryOpen'] = 'Odpri privatno sobo:';
+$lang['helpItemCodeQueryOpen'] = '/query Uporabnik';
+$lang['helpItemDescQueryClose'] = 'Zapri privatno sobo:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Opiši akcijo:';
+$lang['helpItemCodeAction'] = '/action Besedilo';
+$lang['helpItemDescDescribe'] = 'Opiši akcijo v privatnem sporočilu:';
+$lang['helpItemCodeDescribe'] = '/describe Uporabnik Besedilo';
+$lang['helpItemDescIgnore'] = 'Ignoriraj sporočila uporabnika:';
+$lang['helpItemCodeIgnore'] = '/ignore Uporabnik';
+$lang['helpItemDescIgnoreList'] = 'Seznam ignoriranih uporabnikov:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Prikaži v kateri sobi je uporabnik:';
+$lang['helpItemCodeWhereis'] = '/whereis Uporabnik';
+$lang['helpItemDescKick'] = 'Prepovej uporabnika (samo Moderatorji):';
+$lang['helpItemCodeKick'] = '/kick Uporabnik [čas prepovedi v minutah]';
+$lang['helpItemDescUnban'] = 'Prekliči prepoved uporabniku (samo Moderatorji):';
+$lang['helpItemCodeUnban'] = '/unban Uporabnik';
+$lang['helpItemDescBans'] = 'Seznam prepovedanih uporabnikov (samo Moderatorji):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Prikaži IP uporabnika (samo Moderatorji):';
+$lang['helpItemCodeWhois'] = '/whois Uporabnik';
+$lang['helpItemDescWho'] = 'Seznam prijavljenih uporabnikov:';
+$lang['helpItemCodeWho'] = '/who [Ime sobe]';
+$lang['helpItemDescList'] = 'Seznam dostopnih sob:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Vrzi kocko:';
+$lang['helpItemCodeRoll'] = '/roll [število]d[strani]';
+$lang['helpItemDescNick'] = 'Zamenjaj Uporabniško ime:';
+$lang['helpItemCodeNick'] = '/nick Uporabnik';
+$lang['settings'] = 'Nastavitve';
+$lang['settingsBBCode'] = 'Omogoči BB kodo:';
+$lang['settingsBBCodeImages'] = 'Omogoči slikovno BBCode:';
+$lang['settingsBBCodeColors'] = 'Omogoči barvo črk BBCode:';
+$lang['settingsHyperLinks'] = 'Omogoči hiperlinke:';
+$lang['settingsLineBreaks'] = 'Omogoči nove vrstice:';
+$lang['settingsEmoticons'] = 'Omogoči smeške:';
+$lang['settingsAutoFocus'] = 'Samodejno naravnaj fokus na polje za vnos besedila:';
+$lang['settingsMaxMessages'] = 'Maksimalno število sporočil na chat seznamu:';
+$lang['settingsWordWrap'] = 'Omogoči ovijanje dolgih besed:';
+$lang['settingsMaxWordLength'] = 'Maksimalna dolžina besed pred ovijanjem:';
+$lang['settingsDateFormat'] = 'Format prikaza datuma i ure:';
+$lang['settingsPersistFontColor'] = 'Stalna barva črk:';
+$lang['settingsAudioVolume'] = 'Višina zvoka:';
+$lang['settingsSoundReceive'] = 'Zvok za prispela sporočila:';
+$lang['settingsSoundSend'] = 'Zvok za poslana sporočila:';
+$lang['settingsSoundEnter'] = 'Zvok za prijavo in vstop v sobo:';
+$lang['settingsSoundLeave'] = 'Zvok za odjavo in izhod iz sobe:';
+$lang['settingsSoundChatBot'] = 'Zvok za chatbot sporočila:';
+$lang['settingsSoundError'] = 'Zvuk za sporočila o napakah:';
+$lang['settingsBlink'] = 'Trepetanje imena okna za nova sporočila:';
+$lang['settingsBlinkInterval'] = 'Interval trepetanja v milisekundah:';
+$lang['settingsBlinkIntervalNumber'] = 'Število intervalov trepetanja:';
+$lang['playSelectedSound'] = 'Reprodukcija izbranega zvoka';
+$lang['requiresJavaScript'] = 'Za uporabo klepetalnice moraš imeti nameščen JavaScript!';
+$lang['errorInvalidUser'] = 'Napačno uporabniško ime!';
+$lang['errorUserInUse'] = 'Uporabnik je že prijavljen!';
+$lang['errorBanned'] = 'Uporabnik ali ta IP je prepovedan!';
+$lang['errorMaxUsersLoggedIn'] = 'Na kleptu je prijavljeno maksimalno število uporabnikov!';
+$lang['errorChatClosed'] = 'Klepet je trenutno nedostopen!';
+$lang['logsTitle'] = 'Klepet - Beležke';
+$lang['logsDate'] = 'Datum';
+$lang['logsTime'] = 'Ura';
+$lang['logsSearch'] = 'Iskanje';
+$lang['logsPrivateChannels'] = 'Privatne sobe';
+$lang['logsPrivateMessages'] = 'Privatna sporočila';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/sr.php b/library/ajaxchat/chat/lib/lang/sr.php
new file mode 100644
index 000000000..a14ba5512
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/sr.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Saša Stojanović
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Korisničko ime';
+$lang['password'] = 'Lozinka';
+$lang['login'] = 'Prijava';
+$lang['logout'] = 'Odjava';
+$lang['channel'] = 'Soba';
+$lang['style'] = 'Stil';
+$lang['language'] = 'Jezik';
+$lang['inputLineBreak'] = 'Pritisnite SHIFT+ENTER za novi red';
+$lang['messageSubmit'] = 'Pošalji';
+$lang['registeredUsers'] = 'Registrovani korisnici';
+$lang['onlineUsers'] = 'Prisutni korisnici';
+$lang['toggleAutoScroll'] = 'Automatsko pomeranje teksta uključeno/isključeno';
+$lang['toggleAudio'] = 'Zvuk uključen/isključen';
+$lang['toggleHelp'] = 'Pomoć prikaži/sakrij';
+$lang['toggleSettings'] = 'Podešavanja prikaži/sakrij';
+$lang['toggleOnlineList'] = 'Prisutne korisnike prikaži/sakrij';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Citiranje';
+$lang['bbCodeLabelCode'] = 'Kod';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Image';
+$lang['bbCodeLabelColor'] = 'Boja fonta';
+$lang['bbCodeTitleBold'] = 'Podebljan tekst: [b]text[/b]';
+$lang['bbCodeTitleItalic'] = 'Iskrivljen tekst: [i]text[/i]';
+$lang['bbCodeTitleUnderline'] = 'Podvučen tekst: [u]text[/u]';
+$lang['bbCodeTitleQuote'] = 'Citiran tekst: [quote]text[/quote] ili [quote=autor]text[/quote]';
+$lang['bbCodeTitleCode'] = 'Prikazivanje koda: [code]kod[/code]';
+$lang['bbCodeTitleURL'] = 'Unesi URL: [url]http://www.example.org/[/url] ili [url=http://www.example.org/]text[/url]';
+$lang['bbCodeTitleImg'] = 'Insert image: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Boja fonta: [color=red]text[/color]';
+$lang['help'] = 'Pomoć';
+$lang['helpItemDescJoin'] = 'Priključi se sobi:';
+$lang['helpItemCodeJoin'] = '/join Naziv sobe';
+$lang['helpItemDescJoinCreate'] = 'Napravi privatnu sobu (samo registrovani korisnici):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Pozovi korisnika u privatnu sobu:';
+$lang['helpItemCodeInvite'] = '/invite Korisnik';
+$lang['helpItemDescUninvite'] = 'Opoziv poziva u privatnu sobu korisnika:';
+$lang['helpItemCodeUninvite'] = '/uninvite Korisnik';
+$lang['helpItemDescLogout'] = 'Odjavljivanje:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Privatna poruka:';
+$lang['helpItemCodePrivateMessage'] = '/msg Korisnik Tekst poruke';
+$lang['helpItemDescQueryOpen'] = 'Otvori privatnu sobu:';
+$lang['helpItemCodeQueryOpen'] = '/query Korisnik';
+$lang['helpItemDescQueryClose'] = 'Zatvori privatnu sobu:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Opiši akciju:';
+$lang['helpItemCodeAction'] = '/action Tekst';
+$lang['helpItemDescDescribe'] = 'Opiši akciju u privatnoj poruci:';
+$lang['helpItemCodeDescribe'] = '/describe Korisnik Tekst';
+$lang['helpItemDescIgnore'] = 'Prikazuj/neprikazuj poruke od korisnika:';
+$lang['helpItemCodeIgnore'] = '/ignore Korisnik';
+$lang['helpItemDescIgnoreList'] = 'Lista ignorisanih korisnika:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Prikaži u kojoj sobi je korisnik:';
+$lang['helpItemCodeWhereis'] = '/whereis Korisnik';
+$lang['helpItemDescKick'] = 'Zabrani korisnika (samo za Moderatore):';
+$lang['helpItemCodeKick'] = '/kick Korisnik [vreme zabrane u minutima]';
+$lang['helpItemDescUnban'] = 'Opozovi zabranu korisnika (samo za Moderatore):';
+$lang['helpItemCodeUnban'] = '/unban Korisnik';
+$lang['helpItemDescBans'] = 'Lista zabranjenih korisnika (samo za Moderatore):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Prikaži IP korisnika (samo za Moderatore):';
+$lang['helpItemCodeWhois'] = '/whois Korisnik';
+$lang['helpItemDescWho'] = 'Lista prijavljenih korisnika:';
+$lang['helpItemCodeWho'] = '/who [Ime sobe]';
+$lang['helpItemDescList'] = 'Lista dostupnih soba:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Baci kocku:';
+$lang['helpItemCodeRoll'] = '/roll [broj]d[strana]';
+$lang['helpItemDescNick'] = 'Promeni Korisničko ime:';
+$lang['helpItemCodeNick'] = '/nick Korisnik';
+$lang['settings'] = 'Podešavanja';
+$lang['settingsBBCode'] = 'Omogući BB kod:';
+$lang['settingsBBCodeImages'] = 'Enable image BBCode:';
+$lang['settingsBBCodeColors'] = 'Enable font color BBCode:';
+$lang['settingsHyperLinks'] = 'Omogući hiperlinkove:';
+$lang['settingsLineBreaks'] = 'Omugući novi red:';
+$lang['settingsEmoticons'] = 'Omugući emocije:';
+$lang['settingsAutoFocus'] = 'Automatski podesi fokus na polje za unos teksta:';
+$lang['settingsMaxMessages'] = 'Maksimalni broj poruka u chat listi:';
+$lang['settingsWordWrap'] = 'Omogući omotavanje dugačkih reči:';
+$lang['settingsMaxWordLength'] = 'Maksimalna dužina reči pre nego što se omota:';
+$lang['settingsDateFormat'] = 'Format prikaza datuma i vremena:';
+$lang['settingsPersistFontColor'] = 'Stalna boja fonta:';
+$lang['settingsAudioVolume'] = 'Jačina zvuka:';
+$lang['settingsSoundReceive'] = 'Zvuk za primljene poruke:';
+$lang['settingsSoundSend'] = 'Zvuk za poslate poruke:';
+$lang['settingsSoundEnter'] = 'Zvuk za prijavljivanje i ulazak u sobu:';
+$lang['settingsSoundLeave'] = 'Zvuk za odjavljivanje i izlazak iz sobe:';
+$lang['settingsSoundChatBot'] = 'Zvuk za chatbot poruke:';
+$lang['settingsSoundError'] = 'Zvuk za poruke o grešci:';
+$lang['settingsBlink'] = 'Treptanje naziva prozora za nove poruke:';
+$lang['settingsBlinkInterval'] = 'Interval treptanja u milisekundama:';
+$lang['settingsBlinkIntervalNumber'] = 'Broj intervala treptanja:';
+$lang['playSelectedSound'] = 'Reprodukcija selektovanog zvuka';
+$lang['requiresJavaScript'] = 'JavaScript je neophodan za ovaj chat.';
+$lang['errorInvalidUser'] = 'Pogrešno korisničko ime.';
+$lang['errorUserInUse'] = 'Korisnik je već prijavljen.';
+$lang['errorBanned'] = 'Korisnik ili IP je zabranjen.';
+$lang['errorMaxUsersLoggedIn'] = 'Na chatu je prijavljen maksimalni broj korisnika.';
+$lang['errorChatClosed'] = 'Chat je trenutno nedostupan.';
+$lang['logsTitle'] = 'AJAX Chat - Beleške';
+$lang['logsDate'] = 'Datum';
+$lang['logsTime'] = 'Vreme';
+$lang['logsSearch'] = 'Pretraga';
+$lang['logsPrivateChannels'] = 'Privatne sobe';
+$lang['logsPrivateMessages'] = 'Privatne poruke';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/sv.php b/library/ajaxchat/chat/lib/lang/sv.php
new file mode 100644
index 000000000..87f03a0ce
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/sv.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Eric [June 7,2008]
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Användarnamn';
+$lang['password'] = 'Lösenord';
+$lang['login'] = 'Logga In';
+$lang['logout'] = 'Logga Ut';
+$lang['channel'] = 'Kanal';
+$lang['style'] = 'Stil';
+$lang['language'] = 'Språk';
+$lang['inputLineBreak'] = 'Håll ner SHIFT+ENTER för att göra ett radbryt';
+$lang['messageSubmit'] = 'Skicka';
+$lang['registeredUsers'] = 'Registerade Användare';
+$lang['onlineUsers'] = 'Användare OnLine';
+$lang['toggleAutoScroll'] = 'Autoscroll av/på';
+$lang['toggleAudio'] = 'Ljud av/på';
+$lang['toggleHelp'] = 'Visa/göm hjälp';
+$lang['toggleSettings'] = 'Visa/göm inställningar';
+$lang['toggleOnlineList'] = 'Visa/göm OnLine-listan';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Citera';
+$lang['bbCodeLabelCode'] = 'Kod';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Image';
+$lang['bbCodeLabelColor'] = 'Textfärg';
+$lang['bbCodeTitleBold'] = 'Fet text: [b]text[/b]';
+$lang['bbCodeTitleItalic'] = 'Kursiv text: [i]text[/i]';
+$lang['bbCodeTitleUnderline'] = 'Understruken text: [u]text[/u]';
+$lang['bbCodeTitleQuote'] = 'Citera text: [quote]text[/quote] or [quote=author]text[/quote]';
+$lang['bbCodeTitleCode'] = 'Visa kod: [code]code[/code]';
+$lang['bbCodeTitleURL'] = 'Lägg till URL: [url]http://www.example.org/[/url] or [url=http://www.example.org/]text[/url]';
+$lang['bbCodeTitleImg'] = 'Infoga bild: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Textfärg: [color=red]text[/color]';
+$lang['help'] = 'Hjälp';
+$lang['helpItemDescJoin'] = 'Anslut till kanal:';
+$lang['helpItemCodeJoin'] = '/join Kanalens namn';
+$lang['helpItemDescJoinCreate'] = 'Skapa privat rum (Endast registrerade användare):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Bjud in någon (eg till ett privat rum):';
+$lang['helpItemCodeInvite'] = '/invite Användare';
+$lang['helpItemDescUninvite'] = 'Upphäv inbjudan:';
+$lang['helpItemCodeUninvite'] = '/uninvite Användare';
+$lang['helpItemDescLogout'] = 'Logga ut från Chatten:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Privat meddelande:';
+$lang['helpItemCodePrivateMessage'] = '/msg Användare Text';
+$lang['helpItemDescQueryOpen'] = 'Öppna privat kanal:';
+$lang['helpItemCodeQueryOpen'] = '/query Användare';
+$lang['helpItemDescQueryClose'] = 'Stäng privat kanal:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Beskriv händelse:';
+$lang['helpItemCodeAction'] = '/action Text';
+$lang['helpItemDescDescribe'] = 'Beskriv händelse i privat meddelande:';
+$lang['helpItemCodeDescribe'] = '/describe Användare Text';
+$lang['helpItemDescIgnore'] = 'Ignorera/acceptera meddelande från användare:';
+$lang['helpItemCodeIgnore'] = '/ignore Användare';
+$lang['helpItemDescIgnoreList'] = 'Lista ignorerade användare:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Visa användare &amp; kanal:';
+$lang['helpItemCodeWhereis'] = '/whereis Användarnamn';
+$lang['helpItemDescKick'] = 'Sparka användare (Endast moderatorer):';
+$lang['helpItemCodeKick'] = '/kick Användare [Minuter bannad]';
+$lang['helpItemDescUnban'] = 'Upphäv banning av användare (Endast moderatorer):';
+$lang['helpItemCodeUnban'] = '/unban Användare';
+$lang['helpItemDescBans'] = 'Lista bannade användare (Endast moderatorer):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Visa användares IP (Endast moderatorer):';
+$lang['helpItemCodeWhois'] = '/whois Användare';
+$lang['helpItemDescWho'] = 'Lista användare online:';
+$lang['helpItemCodeWho'] = '/who [Kanalnamn]';
+$lang['helpItemDescList'] = 'Lista tillgängliga kanaler:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Rulla tärning:';
+$lang['helpItemCodeRoll'] = '/roll [siffra]d[sidor]';
+$lang['helpItemDescNick'] = 'Ändra användarnamn:';
+$lang['helpItemCodeNick'] = '/nick Användarnamn';
+$lang['settings'] = 'Inställningar';
+$lang['settingsBBCode'] = 'Aktivera BBCode:';
+$lang['settingsBBCodeImages'] = 'Aktivera BBCode bilder:';
+$lang['settingsBBCodeColors'] = 'Enable BBCode textfärg:';
+$lang['settingsHyperLinks'] = 'Aktivera länkar:';
+$lang['settingsLineBreaks'] = 'Aktivera radbryt:';
+$lang['settingsEmoticons'] = 'Aktivera smiley\'s:';
+$lang['settingsAutoFocus'] = 'Sätt fokus automatiskt på skrivraden:';
+$lang['settingsMaxMessages'] = 'Maximalt antal meddelanden i Chatlistan:';
+$lang['settingsWordWrap'] = 'Aktivera "wrapping" av långa ord:';
+$lang['settingsMaxWordLength'] = 'Maxlängd på ord innan det blir avdelat:';
+$lang['settingsDateFormat'] = 'Visningsformat av datum och tid:';
+$lang['settingsPersistFontColor'] = 'Behåll textfärg:';
+$lang['settingsAudioVolume'] = 'Volym:';
+$lang['settingsSoundReceive'] = 'Ljud för inkommande meddelanden:';
+$lang['settingsSoundSend'] = 'Ljud för utgående meddelanden:';
+$lang['settingsSoundEnter'] = 'Ljud för Logga in/Kanal meddelanden:';
+$lang['settingsSoundLeave'] = 'Ljud för Logga ut/lämna Kanal meddelanden:';
+$lang['settingsSoundChatBot'] = 'Ljud för Chatbot meddelanden:';
+$lang['settingsSoundError'] = 'Ljud för felmeddelanden:';
+$lang['settingsBlink'] = 'Blinka fönstrets titel vid nya meddelanden:';
+$lang['settingsBlinkInterval'] = 'Blinkintervall i millisekunder:';
+$lang['settingsBlinkIntervalNumber'] = 'Antal blinkintervaller:';
+$lang['playSelectedSound'] = 'Spela valt ljud';
+$lang['requiresJavaScript'] = 'JavaScript krävs för denna Chat.';
+$lang['errorInvalidUser'] = 'Ogiltigt användarnamn.';
+$lang['errorUserInUse'] = 'Användarnamnet är redan i bruk.';
+$lang['errorBanned'] = 'Användaren eller IP-numret är bannat.';
+$lang['errorMaxUsersLoggedIn'] = 'Chatten är full. Max antal användare är inloggade.';
+$lang['errorChatClosed'] = 'Chatten är stängd för tillfället.';
+$lang['logsTitle'] = 'AJAX Chat - Loggfiler';
+$lang['logsDate'] = 'Datum';
+$lang['logsTime'] = 'Tid';
+$lang['logsSearch'] = 'Sök';
+$lang['logsPrivateChannels'] = 'Privata Kanaler';
+$lang['logsPrivateMessages'] = 'Privata Meddelanden';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/th.php b/library/ajaxchat/chat/lib/lang/th.php
new file mode 100644
index 000000000..7ed3b1ef0
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/th.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ * @Translate by Charge01 @ http://www.thaira2lovers.co.cc
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'ชื่อผู้ใช้';
+$lang['password'] = 'รหัสผ่าน';
+$lang['login'] = 'เข้าสู่ระบบ';
+$lang['logout'] = 'ออกจากระบบ';
+$lang['channel'] = 'ห้องแชท';
+$lang['style'] = 'รูปแบบ';
+$lang['language'] = 'ภาษา';
+$lang['inputLineBreak'] = 'กด SHIFT+ENTER เพื่อเว้นบรรทัด';
+$lang['messageSubmit'] = 'ส่ง';
+$lang['registeredUsers'] = 'ผู้ใช้ที่ลงทะเบียนแล้ว';
+$lang['onlineUsers'] = 'ผู้ใช้ออนไลน์อยู่';
+$lang['toggleAutoScroll'] = 'เลื่อนอัตโนมัติ เปิด/ปิด';
+$lang['toggleAudio'] = 'เสียง เปิด/ปิด';
+$lang['toggleHelp'] = 'ช่วยเหลือ แสดง/ซ่อน';
+$lang['toggleSettings'] = 'ตั้งค่า แสดง/ซ่อน';
+$lang['toggleOnlineList'] = 'ผู้ใช้ออนไลน์ แสดง/ซ่อน';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'อ้างอิง';
+$lang['bbCodeLabelCode'] = 'โค๊ด';
+$lang['bbCodeLabelURL'] = 'ลิงค์';
+$lang['bbCodeLabelImg'] = 'ภาพ';
+$lang['bbCodeLabelColor'] = 'สีอักษร';
+$lang['bbCodeTitleBold'] = 'อักษรตัวหน้า: [b]ข้อความ[/b]';
+$lang['bbCodeTitleItalic'] = 'อักษรตัวเอียง: [i]ข้อความ[/i]';
+$lang['bbCodeTitleUnderline'] = 'อักษรขีดเส้นใต้: [u]ข้อความ[/u]';
+$lang['bbCodeTitleQuote'] = 'อ้างอิงข้อความ: [quote]ข้อความ[/quote] หรือ [quote=เจ้าของข้อความ]ข้อความ[/quote]';
+$lang['bbCodeTitleCode'] = 'แสดงโค๊ด: [code]โค๊ด[/code]';
+$lang['bbCodeTitleURL'] = 'แทรกลิงค์: [url]http://example.org[/url] or [url=http://example.org]ข้อความ[/url]';
+$lang['bbCodeTitleImg'] = 'แทรกภาพ: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'ตัวอักษรสี: [color=red]ข้อความ[/color]';
+$lang['help'] = 'ช่วยเหลือ';
+$lang['helpItemDescJoin'] = 'ร่วมห้องแชท:';
+$lang['helpItemCodeJoin'] = '/join ชื่อห้องแชท';
+$lang['helpItemDescJoinCreate'] = 'สร้างห้องส่วนตัว (สำหรับสมาชิกเท่านั้น):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'เชิญใครสักคน (เช่น คุยในห้องส่วนตัว):';
+$lang['helpItemCodeInvite'] = '/invite ชื่อผู้ใช้';
+$lang['helpItemDescUninvite'] = 'ถอนคำเชิญ:';
+$lang['helpItemCodeUninvite'] = '/uninvite ชื่อผู้ใช้';
+$lang['helpItemDescLogout'] = 'ออกจากระบบห้องแชท:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'ข้อความส่วนตัว:';
+$lang['helpItemCodePrivateMessage'] = '/msg ชื่อผู้ใช้ ข้อความ';
+$lang['helpItemDescQueryOpen'] = 'เปิดห้องส่วนตัว:';
+$lang['helpItemCodeQueryOpen'] = '/query ชื่อผู้ใช้';
+$lang['helpItemDescQueryClose'] = 'ปิดห้องส่วนตัว:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'บอกสิ่งกระทำ:';
+$lang['helpItemCodeAction'] = '/action สิ่งที่ำกำลังทำ';
+$lang['helpItemDescDescribe'] = 'บอกสิ่งที่กระทำในข้อความส่วนตัว:';
+$lang['helpItemCodeDescribe'] = '/describe ชื่อผู้ใช้ ข้อความ';
+$lang['helpItemDescIgnore'] = 'ไม่สนใจ/ยอมรับ ข้อความจากผู้ใช้:';
+$lang['helpItemCodeIgnore'] = '/ignore ชื่อผู้ใช้';
+$lang['helpItemDescIgnoreList'] = 'รายการผู้ใช้ที่ไม่สนใจ:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'แสดงผู้ใช้อยู่ในห้อง:';
+$lang['helpItemCodeWhereis'] = '/whereis ชื่อผู้ใช้';
+$lang['helpItemDescKick'] = 'ไล่ผู้ใช้ (ผู้ดูแลเท่านั้น):';
+$lang['helpItemCodeKick'] = '/kick ผู้ใช้ [แบนในหนึ่งนาที]';
+$lang['helpItemDescUnban'] = 'ยกเลิกแบนผู้ใช้ (ผู้ดูแลเท่านั้น):';
+$lang['helpItemCodeUnban'] = '/unban ชื่อผู้ใช้';
+$lang['helpItemDescBans'] = 'รายการผู้ใช้ถูกแบน (ผู้ดูแลเท่านั้น):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'แสดง IP ของผู้ใช้ (ผู้ดูแลเท่านั้น):';
+$lang['helpItemCodeWhois'] = '/whois ชื่อผู้ใช้';
+$lang['helpItemDescWho'] = 'รายชื่อผู้ใช้ที่ออนไลน์:';
+$lang['helpItemCodeWho'] = '/who [ชื่อห้อง]';
+$lang['helpItemDescList'] = 'รายชื่อห้องที่มีอยู่:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'ทอยลูกเต๋า:';
+$lang['helpItemCodeRoll'] = '/roll [เลข]d[ด้าน]';
+$lang['helpItemDescNick'] = 'เปลี่ยนชื่อผู้ใช้:';
+$lang['helpItemCodeNick'] = '/nick ชื่อผู้ใช้ใหม่';
+$lang['settings'] = 'ตั้งค่า';
+$lang['settingsBBCode'] = 'เปิดใช้งาน BBCode:';
+$lang['settingsBBCodeImages'] = 'เปิดใช้งาน BBCode ภาพ:';
+$lang['settingsBBCodeColors'] = 'เปิดใช้งาน อักษรสี BBCode:';
+$lang['settingsHyperLinks'] = 'เปิดใช้งานลิงค์:';
+$lang['settingsLineBreaks'] = 'เปิดใช้งานการเว้นบรรทัด:';
+$lang['settingsEmoticons'] = 'เปิดใช้งาน รูปแสดงอารมณ์:';
+$lang['settingsAutoFocus'] = 'ตั้งโฟกัสในช่องพิมพ์อัตโนมัติ:';
+$lang['settingsMaxMessages'] = 'อักษรที่สามารถให้พิมพ์ได้มากสุดในข้อความ:';
+$lang['settingsWordWrap'] = 'เปิดใช้งานการเว้นบรรทัดข้อความที่ยาว:';
+$lang['settingsMaxWordLength'] = 'ความาวของคำก่อนที่จะเว้นบรรทัดใหม่ให้:';
+$lang['settingsDateFormat'] = 'รูปแบบวันที่และเวลา:';
+$lang['settingsPersistFontColor'] = 'สีอักษรทั้งข้อความ:';
+$lang['settingsAudioVolume'] = 'ระดับเสียง:';
+$lang['settingsSoundReceive'] = 'เสียงสำหรับข้อความเข้า:';
+$lang['settingsSoundSend'] = 'เสียงสำหรับข้อความออกไป:';
+$lang['settingsSoundEnter'] = 'เสียงสำหรับเข้าระบบและเข้าห้อง:';
+$lang['settingsSoundLeave'] = 'เสียงสำหรับออกจากระบบและออกจากห้อง:';
+$lang['settingsSoundChatBot'] = 'เสียงสำหรับข้อความจาำกระบบ:';
+$lang['settingsSoundError'] = 'เสียงสำหรับข้อความผิดพลาด:';
+$lang['settingsBlink'] = 'มีสัญญาณ กระพริบบน Title Bar เมื่อมีข้อความใหม่:';
+$lang['settingsBlinkInterval'] = 'Blink interval in milliseconds:';
+$lang['settingsBlinkIntervalNumber'] = 'Number of blink intervals:';
+$lang['playSelectedSound'] = 'เล่นเสียงที่เลือก';
+$lang['requiresJavaScript'] = 'ต้องการจาวาสคริปสำหรับห้องแชท';
+$lang['errorInvalidUser'] = 'ชื่อผู้ใช้ผิดพลาด';
+$lang['errorUserInUse'] = 'ชื่อผู้ใช้นี้กำลังใช้งานอยู่';
+$lang['errorBanned'] = 'ผู้ใช้นี้หรือ IP นี้ถูกแบน';
+$lang['errorMaxUsersLoggedIn'] = 'ห้องแชทเต็ม';
+$lang['errorChatClosed'] = 'ห้องแชทถูกปิดชั่วคราว';
+$lang['logsTitle'] = 'AJAX Chat - บันทึกการใช้งาน';
+$lang['logsDate'] = 'วันที่';
+$lang['logsTime'] = 'เวลา';
+$lang['logsSearch'] = 'ค้นหา';
+$lang['logsPrivateChannels'] = 'ห้องส่วนตัว';
+$lang['logsPrivateMessages'] = 'ข้อความส่วนตัว';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/tr.php b/library/ajaxchat/chat/lib/lang/tr.php
new file mode 100644
index 000000000..00f7dfaa6
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/tr.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Cydonian
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Üye adı';
+$lang['password'] = 'Şifre';
+$lang['login'] = 'Giriş';
+$lang['logout'] = 'Çıkış';
+$lang['channel'] = 'Kanal';
+$lang['style'] = 'Stil';
+$lang['language'] = 'Dil';
+$lang['inputLineBreak'] = 'Bir satır ara için SHIFT+ENTER tuşlarına basınız';
+$lang['messageSubmit'] = 'Gönder';
+$lang['registeredUsers'] = 'Kayıtlı Üyeler';
+$lang['onlineUsers'] = 'Çevrimiçi üyeler';
+$lang['toggleAutoScroll'] = 'Otomatik kaydırma aç/kapat';
+$lang['toggleAudio'] = 'Ses aç/kapat';
+$lang['toggleHelp'] = 'Yardımı göster/sakla';
+$lang['toggleSettings'] = 'Ayarları göster/sakla';
+$lang['toggleOnlineList'] = 'Çevrimiçi listesini göster/sakla';
+$lang['bbCodeLabelBold'] = 'b';
+$lang['bbCodeLabelItalic'] = 'i';
+$lang['bbCodeLabelUnderline'] = 'u';
+$lang['bbCodeLabelQuote'] = 'Büyük';
+$lang['bbCodeLabelCode'] = 'Kod';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Resim';
+$lang['bbCodeLabelColor'] = 'Renkli Yazı';
+$lang['bbCodeTitleBold'] = 'Kalın text: [b]text[/b]';
+$lang['bbCodeTitleItalic'] = 'Eğik text: [i]text[/i]';
+$lang['bbCodeTitleUnderline'] = 'Altçizgili text: [u]text[/u]';
+$lang['bbCodeTitleQuote'] = 'Büyük text: [quote]text[/quote] or [quote=author]text[/quote]';
+$lang['bbCodeTitleCode'] = 'Kod gösterim: [code]kod[/code]';
+$lang['bbCodeTitleURL'] = 'URL gir: [url]http://example.org[/url] veya [url=http://example.org]text[/url]';
+$lang['bbCodeTitleImg'] = 'Resim gir: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Font Rengi: [color=red]text[/color]';
+$lang['help'] = 'Yardım';
+$lang['helpItemDescJoin'] = 'Bir kanala girin:';
+$lang['helpItemCodeJoin'] = '/join kanalismi';
+$lang['helpItemDescJoinCreate'] = 'Özel oda aç (Sadece kayıtlı üyeler için):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Birisini Davet Et (örn. özel bir odaya):';
+$lang['helpItemCodeInvite'] = '/invite üyeismi';
+$lang['helpItemDescUninvite'] = 'Daveti İptal Et:';
+$lang['helpItemCodeUninvite'] = '/uninvite üyeismi';
+$lang['helpItemDescLogout'] = 'Sohbetten Çık:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Özel mesaj:';
+$lang['helpItemCodePrivateMessage'] = '/msg üyeismi mesaj';
+$lang['helpItemDescQueryOpen'] = 'Özel bir kanal aç:';
+$lang['helpItemCodeQueryOpen'] = '/query üyeismi';
+$lang['helpItemDescQueryClose'] = 'Özel bir kanalı kapat:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Aksiyon:';
+$lang['helpItemCodeAction'] = '/action mesaj';
+$lang['helpItemDescDescribe'] = 'Özel mesajda aksiyon:';
+$lang['helpItemCodeDescribe'] = '/describe üyeismi mesaj';
+$lang['helpItemDescIgnore'] = 'Üyeden gelen mesajları Blokla/KabulEt:';
+$lang['helpItemCodeIgnore'] = '/ignore üyeismi';
+$lang['helpItemDescIgnoreList'] = 'Bloklanmış üyeleri listele:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Üyenin kanalını göster:';
+$lang['helpItemCodeWhereis'] = '/whereis üyeismi';
+$lang['helpItemDescKick'] = 'Üyeyi at (Sadece Moderatörler):';
+$lang['helpItemCodeKick'] = '/kick üyeismi [Yasaklanan Dakika]';
+$lang['helpItemDescUnban'] = 'Üyenin yasağını kaldır (Sadece Moderatörler):';
+$lang['helpItemCodeUnban'] = '/unban üyeismi';
+$lang['helpItemDescBans'] = 'Yasaklanan üyeleri listele (Sadece Moderatörler):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Üyenin IP adresini göster (Sadece Moderatörler):';
+$lang['helpItemCodeWhois'] = '/whois üyeismi';
+$lang['helpItemDescWho'] = 'Çevrimiçi üyeleri listele:';
+$lang['helpItemCodeWho'] = '/who [kanalismi]';
+$lang['helpItemDescList'] = 'Kullanılabilir kanalları listele:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Zarları at:';
+$lang['helpItemCodeRoll'] = '/roll [number]d[sides]';
+$lang['helpItemDescNick'] = 'Üye ismini değiştir:';
+$lang['helpItemCodeNick'] = '/nick üyeismi';
+$lang['settings'] = 'Ayarlar';
+$lang['settingsBBCode'] = 'BBCode u aç:';
+$lang['settingsBBCodeImages'] = 'Resim BBCode u aç:';
+$lang['settingsBBCodeColors'] = 'Font Rengi BBCode u aç:';
+$lang['settingsHyperLinks'] = 'Bağlantıları (link) aç:';
+$lang['settingsLineBreaks'] = 'Satır aralarını aç:';
+$lang['settingsEmoticons'] = 'Emoticons ı aç:';
+$lang['settingsAutoFocus'] = 'Giriş kutusuna otomatik odaklan:';
+$lang['settingsMaxMessages'] = 'Sohbet listesinde maksimum mesaj sayısı:';
+$lang['settingsWordWrap'] = 'Uzun kelimeleri kısaltmayı aç:';
+$lang['settingsMaxWordLength'] = 'Kısaltılacak kelimenin maksimum uzunluğu:';
+$lang['settingsDateFormat'] = 'Tarih ve zaman gösterim formatı:';
+$lang['settingsPersistFontColor'] = 'Kalıcı font rengi:';
+$lang['settingsAudioVolume'] = 'Ses Düzeyi:';
+$lang['settingsSoundReceive'] = 'Gelen mesaj sesi:';
+$lang['settingsSoundSend'] = 'Giden mesaj sesi:';
+$lang['settingsSoundEnter'] = 'Giriş ve kanala giriş sesi:';
+$lang['settingsSoundLeave'] = 'Çıkış ve kanaldan çıkış sesi:';
+$lang['settingsSoundChatBot'] = 'Chatbot mesajları sesi:';
+$lang['settingsSoundError'] = 'Hata mesajları sesi:';
+$lang['settingsBlink'] = 'Yeni mesaj geldiğinde pencere başlığını kırp:';
+$lang['settingsBlinkInterval'] = 'Milisaniye olarak kırpma aralığı:';
+$lang['settingsBlinkIntervalNumber'] = 'Kırpma sayısı aralığı:';
+$lang['playSelectedSound'] = 'Seçili sesi çal';
+$lang['requiresJavaScript'] = 'Bu Sohbet için JavaScript gereklidir.';
+$lang['errorInvalidUser'] = 'Geçersiz üyeismi.';
+$lang['errorUserInUse'] = 'Üyeismi kullanımda.';
+$lang['errorBanned'] = 'Üye veya IP yasaklanmıştır.';
+$lang['errorMaxUsersLoggedIn'] = 'Sohbet maksimum kullanıcı sayısına ulaştı.';
+$lang['errorChatClosed'] = 'Sohbet şu anda kapalıdır.';
+$lang['logsTitle'] = 'AJAX Chat - Logs';
+$lang['logsDate'] = 'Tarih';
+$lang['logsTime'] = 'Saat';
+$lang['logsSearch'] = 'Ara';
+$lang['logsPrivateChannels'] = 'Özel Kanallar';
+$lang['logsPrivateMessages'] = 'Özel Mesajlar';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/uk.php b/library/ajaxchat/chat/lib/lang/uk.php
new file mode 100644
index 000000000..a7d80c16b
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/uk.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Yuriy Smetana (yura@stryi.com.ua, http://joomla.org.ua)
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = 'Ім\'я користувача';
+$lang['password'] = 'Пароль';
+$lang['login'] = 'Увійти';
+$lang['logout'] = 'Вийти';
+$lang['channel'] = 'Кімната';
+$lang['style'] = 'Стиль';
+$lang['language'] = 'Мова';
+$lang['inputLineBreak'] = 'Використовуйте SHIFT+ENTER для нового рядка';
+$lang['messageSubmit'] = 'Надіслати';
+$lang['registeredUsers'] = 'Зареєстровані користувачі';
+$lang['onlineUsers'] = 'Зараз в Чаті';
+$lang['toggleAutoScroll'] = 'Прогортувати: так/ні';
+$lang['toggleAudio'] = 'Звік: так/ні';
+$lang['toggleHelp'] = 'Показати допомогу: так/ні';
+$lang['toggleSettings'] = 'Показати налаштування: так/ні';
+$lang['toggleOnlineList'] = 'Хто в Чаті: так/ні';
+$lang['bbCodeLabelBold'] = 'Ж';
+$lang['bbCodeLabelItalic'] = 'Н';
+$lang['bbCodeLabelUnderline'] = 'П';
+$lang['bbCodeLabelQuote'] = 'Цитата';
+$lang['bbCodeLabelCode'] = 'Код';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Image';
+$lang['bbCodeLabelColor'] = 'Колір шрифту';
+$lang['bbCodeTitleBold'] = 'Жирний текст: [b]текст[/b]';
+$lang['bbCodeTitleItalic'] = 'Текст курсивом: [i]текст[/i]';
+$lang['bbCodeTitleUnderline'] = 'Підкреслений текст: [u]текст[/u]';
+$lang['bbCodeTitleQuote'] = 'Цитований текст: [quote]текст[/quote] чи [quote=author]текст[/quote]';
+$lang['bbCodeTitleCode'] = 'Показати код: [code]код[/code]';
+$lang['bbCodeTitleURL'] = 'Показати URL: [url]http://example.org[/url] or [url=http://example.org]текст[/url]';
+$lang['bbCodeTitleImg'] = 'Insert image: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = 'Колір шрифту: [color=red]текст[/color]';
+$lang['help'] = 'Допомога';
+$lang['helpItemDescJoin'] = 'Зайти в кімнату:';
+$lang['helpItemCodeJoin'] = '/join Назва_Кімнати';
+$lang['helpItemDescJoinCreate'] = 'Створити приватну кімнату (тільки для зареєстрованих користувачів):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = 'Запросити когось (наприклад до приватної кімнати):';
+$lang['helpItemCodeInvite'] = '/invite Користувач';
+$lang['helpItemDescUninvite'] = 'Відмінити запрошення:';
+$lang['helpItemCodeUninvite'] = '/uninvite Користувач';
+$lang['helpItemDescLogout'] = 'Вийти з чату:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = 'Приватне повідомлення:';
+$lang['helpItemCodePrivateMessage'] = '/msg Користувач Текст';
+$lang['helpItemDescQueryOpen'] = 'Створити приватну кімнату:';
+$lang['helpItemCodeQueryOpen'] = '/query Користувач';
+$lang['helpItemDescQueryClose'] = 'Закрити приватну кімнату:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = 'Описати чим займаєтесь:';
+$lang['helpItemCodeAction'] = '/action Що Робите';
+$lang['helpItemDescDescribe'] = 'Описати чим займаєтесь, в приватному повідомленні:';
+$lang['helpItemCodeDescribe'] = '/describe Кому Що Робите';
+$lang['helpItemDescIgnore'] = 'Ігнорувати/приймати повідомлення від користувача:';
+$lang['helpItemCodeIgnore'] = '/ignore Користувач';
+$lang['helpItemDescIgnoreList'] = 'Перелік ігнорованих користувачів:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = 'Показати кімнату користувача:';
+$lang['helpItemCodeWhereis'] = '/whereis Користувач';
+$lang['helpItemDescKick'] = 'Вигнати користувача (тільки для модераторів):';
+$lang['helpItemCodeKick'] = '/kick Користувач [на скільки хвилин]';
+$lang['helpItemDescUnban'] = 'Розблокувати користувача (тільки для модераторів):';
+$lang['helpItemCodeUnban'] = '/unban Користувач';
+$lang['helpItemDescBans'] = 'Перелік заблокованих користувачів:';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = 'Показати ІР користувача (тільки для модераторів):';
+$lang['helpItemCodeWhois'] = '/whois Користувач';
+$lang['helpItemDescWho'] = 'Хто в Чаті:';
+$lang['helpItemCodeWho'] = '/who [Кімната]';
+$lang['helpItemDescList'] = 'Перелік кімнат:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = 'Кинути кості:';
+$lang['helpItemCodeRoll'] = '/roll [к-сть]d[к-сть сторін]';
+$lang['helpItemDescNick'] = 'Змінити ім\'я користувача:';
+$lang['helpItemCodeNick'] = '/nick Користувач';
+$lang['settings'] = 'Налаштування';
+$lang['settingsBBCode'] = 'Дозволити коди BB:';
+$lang['settingsBBCodeImages'] = 'Enable image BBCode:';
+$lang['settingsBBCodeColors'] = 'Enable font color BBCode:';
+$lang['settingsHyperLinks'] = 'Дозволити посилання:';
+$lang['settingsLineBreaks'] = 'Дозволити багаторядковість:';
+$lang['settingsEmoticons'] = 'Дозволити хихоньки:';
+$lang['settingsAutoFocus'] = 'Автоматично встановлювати фокус на полі вводу:';
+$lang['settingsMaxMessages'] = 'Максимальна кількість повідомлень у вікні Чату:';
+$lang['settingsWordWrap'] = 'Розділювати довгі слова:';
+$lang['settingsMaxWordLength'] = 'Максимальна довжина слова після якої його буде розділено:';
+$lang['settingsDateFormat'] = 'Формат дати та часу:';
+$lang['settingsPersistFontColor'] = 'Колір для привернення уваги:';
+$lang['settingsAudioVolume'] = 'Гучність:';
+$lang['settingsSoundReceive'] = 'Звук для отриманих повідомлень:';
+$lang['settingsSoundSend'] = 'Звук для надісланих повідомлень:';
+$lang['settingsSoundEnter'] = 'Звук для події входу в Чат чи кімнату:';
+$lang['settingsSoundLeave'] = 'Звук для події виходу з Чату чи кімнати:';
+$lang['settingsSoundChatBot'] = 'Звук для системних повідомлень:';
+$lang['settingsSoundError'] = 'Звук для помилок:';
+$lang['settingsBlink'] = 'Сигналізувати при появі нових повідомлень (блимання заголовку вікна):';
+$lang['settingsBlinkInterval'] = 'Тривалість блимання заголовку вікна:';
+$lang['settingsBlinkIntervalNumber'] = 'Кількість блимань:';
+$lang['playSelectedSound'] = 'Відтворити обраний звук';
+$lang['requiresJavaScript'] = 'Для цього Чату потрібно дозволити JavaScript.';
+$lang['errorInvalidUser'] = 'Неправильне ім\'я користувача.';
+$lang['errorUserInUse'] = 'Таке ім\'я вже використовується';
+$lang['errorBanned'] = 'Користувач або IP заблокований.';
+$lang['errorMaxUsersLoggedIn'] = 'В Чаті максимальна кількість учасників.';
+$lang['errorChatClosed'] = 'Чат, тимчасово, закрито.';
+$lang['logsTitle'] = 'AJAX Chat - Logs';
+$lang['logsDate'] = 'Дата';
+$lang['logsTime'] = 'Час';
+$lang['logsSearch'] = 'Пошук';
+$lang['logsPrivateChannels'] = 'Приватні кімнати';
+$lang['logsPrivateMessages'] = 'Приватні повідомлення';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/lang/zh-tw.php b/library/ajaxchat/chat/lib/lang/zh-tw.php
new file mode 100644
index 000000000..d39fe6b14
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/zh-tw.php
@@ -0,0 +1,123 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = '使用者帳號';
+$lang['password'] = '密碼';
+$lang['login'] = '登入';
+$lang['logout'] = '登出';
+$lang['channel'] = '房間';
+$lang['style'] = '版面風格';
+$lang['language'] = '語言';
+$lang['inputLineBreak'] = '按 SHIFT+ENTER 換行';
+$lang['messageSubmit'] = '發送';
+$lang['registeredUsers'] = '已註冊會員';
+$lang['onlineUsers'] = '在線會員';
+$lang['toggleAutoScroll'] = '自動捲動 開/關';
+$lang['toggleAudio'] = '音效 開/關';
+$lang['toggleHelp'] = '開啟/關閉 使用說明';
+$lang['toggleSettings'] = '開啟/關閉 選項設定';
+$lang['toggleOnlineList'] = '開啟/關閉 線上名單';
+$lang['bbCodeLabelBold'] = '粗體';
+$lang['bbCodeLabelItalic'] = '斜體';
+$lang['bbCodeLabelUnderline'] = '底線';
+$lang['bbCodeLabelQuote'] = '引用';
+$lang['bbCodeLabelCode'] = '代碼';
+$lang['bbCodeLabelURL'] = '連結';
+$lang['bbCodeLabelImg'] = '圖片';
+$lang['bbCodeLabelColor'] = '字體顏色';
+$lang['bbCodeTitleBold'] = '粗體字: [b]文字[/b]';
+$lang['bbCodeTitleItalic'] = '斜體字: [i]文字[/i]';
+$lang['bbCodeTitleUnderline'] = '底線: [u]文字[/u]';
+$lang['bbCodeTitleQuote'] = '引用文字: [quote]文字[/quote] 或 [quote=某人]文字[/quote]';
+$lang['bbCodeTitleCode'] = '代碼: [code]代碼[/code]';
+$lang['bbCodeTitleURL'] = '插入URL: [url]http://example.org[/url] 或 [url=http://example.org]文字[/url]';
+$lang['bbCodeTitleImg'] = '插入圖片: [img]http://example.org/image.png[/img]';
+$lang['bbCodeTitleColor'] = '字體顏色: [color=red]文字[/color]';
+$lang['help'] = '使用說明';
+$lang['helpItemDescJoin'] = '進入一個房間:';
+$lang['helpItemCodeJoin'] = '/join 房間名';
+$lang['helpItemDescJoinCreate'] = '進入自己的私人房間(會員限定):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = '邀請某人(進入自己的私人房):';
+$lang['helpItemCodeInvite'] = '/invite 使用者帳號';
+$lang['helpItemDescUninvite'] = '收回邀請函:';
+$lang['helpItemCodeUninvite'] = '/uninvite 使用者帳號';
+$lang['helpItemDescLogout'] = '登出:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = '悄悄話:';
+$lang['helpItemCodePrivateMessage'] = '/msg 使用者帳號 文字';
+$lang['helpItemDescQueryOpen'] = '開啟一間私人房:';
+$lang['helpItemCodeQueryOpen'] = '/query 使用者帳號';
+$lang['helpItemDescQueryClose'] = '關閉私人房:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = '描述動作:';
+$lang['helpItemCodeAction'] = '/action 文字';
+$lang['helpItemDescDescribe'] = '用悄悄話描述動作:';
+$lang['helpItemCodeDescribe'] = '/describe 使用者帳號 文字';
+$lang['helpItemDescIgnore'] = '忽略/接受某人的訊息:';
+$lang['helpItemCodeIgnore'] = '/ignore 使用者帳號';
+$lang['helpItemDescIgnoreList'] = '列出所有被忽略訊息的人:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = '尋找某人的位置:';
+$lang['helpItemCodeWhereis'] = '/whereis 使用者帳號';
+$lang['helpItemDescKick'] = '踢除某人(版主限定):';
+$lang['helpItemCodeKick'] = '/kick 使用者帳號 [Minutes banned]';
+$lang['helpItemDescUnban'] = '解除封鎖某人(版主限定):';
+$lang['helpItemCodeUnban'] = '/unban 使用者帳號';
+$lang['helpItemDescBans'] = '列出所有被禁止使用的人(版主限定):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = '查詢某人的IP(版主限定):';
+$lang['helpItemCodeWhois'] = '/whois 使用者帳號';
+$lang['helpItemDescWho'] = '列出所有在房間的人:';
+$lang['helpItemCodeWho'] = '/who [房間名]';
+$lang['helpItemDescList'] = '列出所有可進去的房間:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = '擲骰子:';
+$lang['helpItemCodeRoll'] = '/roll [幾次]d[幾種點]';
+$lang['helpItemDescNick'] = '更換暱稱:';
+$lang['helpItemCodeNick'] = '/nick 使用者帳號';
+$lang['settings'] = '選項';
+$lang['settingsBBCode'] = '啟用BBCode:';
+$lang['settingsBBCodeImages'] = '啟用圖形的BBCode:';
+$lang['settingsBBCodeColors'] = '啟用字體顏色的BBCode:';
+$lang['settingsHyperLinks'] = '啟用超連結:';
+$lang['settingsLineBreaks'] = '啟用換行符號';
+$lang['settingsEmoticons'] = '啟用表情圖示:';
+$lang['settingsAutoFocus'] = '自動切換焦點至輸入框:';
+$lang['settingsMaxMessages'] = '對話框裡訊息的最大數量:';
+$lang['settingsWordWrap'] = '遇長字彙時隨螢幕大小自動斷行:';
+$lang['settingsMaxWordLength'] = '字被截斷之前的最大長度:';
+$lang['settingsDateFormat'] = '時間格式:';
+$lang['settingsPersistFontColor'] = '固定字體顏色:';
+$lang['settingsAudioVolume'] = '音效的音量:';
+$lang['settingsSoundReceive'] = '新訊息的音效:';
+$lang['settingsSoundSend'] = '舊訊息的音效:';
+$lang['settingsSoundEnter'] = '登入和進入房間的音效:';
+$lang['settingsSoundLeave'] = '登出和離開房間的音效:';
+$lang['settingsSoundChatBot'] = '系統訊息的音效:';
+$lang['settingsSoundError'] = '錯誤訊息的音效:';
+$lang['settingsBlink'] = '當有新訊息時閃動標題:';
+$lang['settingsBlinkInterval'] = '閃動的間隔時間(毫秒):';
+$lang['settingsBlinkIntervalNumber'] = '閃動次數:';
+$lang['playSelectedSound'] = '播放選取的音效';
+$lang['requiresJavaScript'] = '請啟用JavaScript才能登入!';
+$lang['errorInvalidUser'] = '使用者名稱無法使用……';
+$lang['errorUserInUse'] = '使用者名稱正在使用中……';
+$lang['errorBanned'] = '使用者名稱或IP已被封鎖……';
+$lang['errorMaxUsersLoggedIn'] = '聊天室已客滿,無法進入……';
+$lang['errorChatClosed'] = '聊天室目前已關閉……';
+$lang['logsTitle'] = 'AJAX Chat - Logs';
+$lang['logsDate'] = '日期';
+$lang['logsTime'] = '時間';
+$lang['logsSearch'] = '搜尋';
+$lang['logsPrivateChannels'] = '私人房';
+$lang['logsPrivateMessages'] = '悄悄話';
+?>
diff --git a/library/ajaxchat/chat/lib/lang/zh.php b/library/ajaxchat/chat/lib/lang/zh.php
new file mode 100644
index 000000000..1d18f0bc0
--- /dev/null
+++ b/library/ajaxchat/chat/lib/lang/zh.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author mikespook
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+$lang = array();
+$lang['title'] = 'AJAX Chat';
+$lang['userName'] = '用户名';
+$lang['password'] = '密码';
+$lang['login'] = '登录';
+$lang['logout'] = '退出';
+$lang['channel'] = '频道';
+$lang['style'] = '样式';
+$lang['language'] = '语言';
+$lang['inputLineBreak'] = '按 SHIFT + ENTER 输入新行';
+$lang['messageSubmit'] = '提交';
+$lang['registeredUsers'] = '注册用户';
+$lang['onlineUsers'] = '在线用户';
+$lang['toggleAutoScroll'] = '自动滚动 开/关';
+$lang['toggleAudio'] = '声音 开/关';
+$lang['toggleHelp'] = '显示/隐藏 帮助';
+$lang['toggleSettings'] = '显示/隐藏 设置';
+$lang['toggleOnlineList'] = '显示/隐藏 在线列表';
+$lang['bbCodeLabelBold'] = '粗体';
+$lang['bbCodeLabelItalic'] = '斜体';
+$lang['bbCodeLabelUnderline'] = '下划线';
+$lang['bbCodeLabelQuote'] = '引用';
+$lang['bbCodeLabelCode'] = '代码';
+$lang['bbCodeLabelURL'] = 'URL';
+$lang['bbCodeLabelImg'] = 'Image';
+$lang['bbCodeLabelColor'] = '文字颜色';
+$lang['bbCodeTitleBold'] = '粗体:[b]文字[/b]';
+$lang['bbCodeTitleItalic'] = '斜体:[i]文字[/i]';
+$lang['bbCodeTitleUnderline'] = '下划线:[u]文字[/u]';
+$lang['bbCodeTitleQuote'] = '引用:[quote]引用[/quote] or [quote=作者]引用[/quote]';
+$lang['bbCodeTitleCode'] = '显示代码:[code]代码[/code]';
+$lang['bbCodeTitleURL'] = '插入 URL:[url]http://example.org[/url] 或者 [url=http://example.org]文字[/url]';
+$lang['bbCodeTitleImg'] = 'Insert image: [img]http://example.org/image.jpg[/img]';
+$lang['bbCodeTitleColor'] = '文字颜色:[color=red]文字[/color]';
+$lang['help'] = '帮助';
+$lang['helpItemDescJoin'] = '加入频道';
+$lang['helpItemCodeJoin'] = '/join 频道名';
+$lang['helpItemDescJoinCreate'] = '创建私人房间(仅限注册用户):';
+$lang['helpItemCodeJoinCreate'] = '/join';
+$lang['helpItemDescInvite'] = '邀请某人(例如进入私人房间):';
+$lang['helpItemCodeInvite'] = '/invite 用户名';
+$lang['helpItemDescUninvite'] = '取消邀请:';
+$lang['helpItemCodeUninvite'] = '/uninvite 用户名';
+$lang['helpItemDescLogout'] = '推出登录:';
+$lang['helpItemCodeLogout'] = '/quit';
+$lang['helpItemDescPrivateMessage'] = '悄悄话';
+$lang['helpItemCodePrivateMessage'] = '/msg 用户名 内容';
+$lang['helpItemDescQueryOpen'] = '打开私人频道:';
+$lang['helpItemCodeQueryOpen'] = '/query 用户名';
+$lang['helpItemDescQueryClose'] = '关闭私人频道:';
+$lang['helpItemCodeQueryClose'] = '/query';
+$lang['helpItemDescAction'] = '动作描述:';
+$lang['helpItemCodeAction'] = '/action 文字';
+$lang['helpItemDescDescribe'] = '在悄悄话中做动作:';
+$lang['helpItemCodeDescribe'] = '/describe 用户名 文字';
+$lang['helpItemDescIgnore'] = '忽略/接受用户消息:';
+$lang['helpItemCodeIgnore'] = '/ignore 用户名';
+$lang['helpItemDescIgnoreList'] = '列出忽略用户:';
+$lang['helpItemCodeIgnoreList'] = '/ignore';
+$lang['helpItemDescWhereis'] = '显示用户频道:';
+$lang['helpItemCodeWhereis'] = '/whereis 用户名';
+$lang['helpItemDescKick'] = '踢出用户(仅限版主):';
+$lang['helpItemCodeKick'] = '/kick 用户名 [倒数秒数]';
+$lang['helpItemDescUnban'] = '取消用户禁言(仅限版主):';
+$lang['helpItemCodeUnban'] = '/unban 用户名';
+$lang['helpItemDescBans'] = '列出禁言用户(仅限版主):';
+$lang['helpItemCodeBans'] = '/bans';
+$lang['helpItemDescWhois'] = '显示用户 IP(仅限版主):';
+$lang['helpItemCodeWhois'] = '/whois 用户名';
+$lang['helpItemDescWho'] = '列出在线用户:';
+$lang['helpItemCodeWho'] = '/who [频道名]';
+$lang['helpItemDescList'] = '列出可用频道:';
+$lang['helpItemCodeList'] = '/list';
+$lang['helpItemDescRoll'] = '摇骰子:';
+$lang['helpItemCodeRoll'] = '/roll [number]d[sides]';
+$lang['helpItemDescNick'] = '修改用户名:';
+$lang['helpItemCodeNick'] = '/nick Username';
+$lang['settings'] = '设置';
+$lang['settingsBBCode'] = '可用 BBCode:';
+$lang['settingsBBCodeImages'] = 'Enable image BBCode:';
+$lang['settingsBBCodeColors'] = 'Enable font color BBCode:';
+$lang['settingsHyperLinks'] = '可用超链接:';
+$lang['settingsLineBreaks'] = '可用换行:';
+$lang['settingsEmoticons'] = '可用表情符号:';
+$lang['settingsAutoFocus'] = '自动将焦点定位于输入框:';
+$lang['settingsMaxMessages'] = '消息列表中的最大消息数:';
+$lang['settingsWordWrap'] = '开启超宽换行:';
+$lang['settingsMaxWordLength'] = '行宽:';
+$lang['settingsDateFormat'] = '时间和日期显示格式:';
+$lang['settingsPersistFontColor'] = '字体颜色:';
+$lang['settingsAudioVolume'] = '音量:';
+$lang['settingsSoundReceive'] = '声音提示进入信息:';
+$lang['settingsSoundSend'] = '声音提示离开信息:';
+$lang['settingsSoundEnter'] = '声音提示登录或进入频道信息:';
+$lang['settingsSoundLeave'] = '声音提示退出或离开频道信息:';
+$lang['settingsSoundChatBot'] = '声音提示机器人信息:';
+$lang['settingsSoundError'] = '声音提示错误信息:';
+$lang['settingsBlink'] = '有新消息时闪烁窗口标题:';
+$lang['settingsBlinkInterval'] = '空闲间隔毫秒数:';
+$lang['settingsBlinkIntervalNumber'] = '空闲间隔数:';
+$lang['playSelectedSound'] = '播放选择的声音';
+$lang['requiresJavaScript'] = '需要 JavaScript。';
+$lang['errorInvalidUser'] = '不合法的用户名。';
+$lang['errorUserInUse'] = '用户名已被使用。';
+$lang['errorBanned'] = '用户名或 IP 被禁止。';
+$lang['errorMaxUsersLoggedIn'] = '聊天室达到最大用户数。';
+$lang['errorChatClosed'] = '当前聊天室暂停服务。';
+$lang['logsTitle'] = 'AJAX Chat - 日志';
+$lang['logsDate'] = '日期';
+$lang['logsTime'] = '时间';
+$lang['logsSearch'] = '搜索';
+$lang['logsPrivateChannels'] = '私人频道';
+$lang['logsPrivateMessages'] = '私人消息';
+?> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/template/loggedIn.html b/library/ajaxchat/chat/lib/template/loggedIn.html
new file mode 100644
index 000000000..16a75ebe9
--- /dev/null
+++ b/library/ajaxchat/chat/lib/template/loggedIn.html
@@ -0,0 +1,387 @@
+<?xml version="1.0" encoding="[CONTENT_ENCODING/]"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="[LANG_CODE/]" lang="[LANG_CODE/]" dir="[BASE_DIRECTION/]">
+
+<head>
+ <meta http-equiv="Content-Type" content="[CONTENT_TYPE/]" />
+ <title>[LANG]title[/LANG]</title>
+ <style type="text/css">
+ body {
+ padding:0;
+ margin:0;
+ }
+ </style>
+ [STYLE_SHEETS/]
+ <!--[if lt IE 7]>
+ <link rel="stylesheet" type="text/css" href="css/ie5-6.css"/>
+ <script type="text/javascript">
+ var isIElt7 = true;
+ </script>
+ <![endif]-->
+ <script src="js/chat.js" type="text/javascript" charset="UTF-8"></script>
+ <script src="js/custom.js" type="text/javascript" charset="UTF-8"></script>
+ <script src="js/lang/[LANG_CODE/].js" type="text/javascript" charset="UTF-8"></script>
+ <script src="js/config.js" type="text/javascript" charset="UTF-8"></script>
+ <script src="js/FABridge.js" type="text/javascript" charset="UTF-8"></script>
+ <script type="text/javascript">
+ // <![CDATA[
+ function toggleContainer(containerID, hideContainerIDs) {
+ if(hideContainerIDs) {
+ for(var i=0; i<hideContainerIDs.length; i++) {
+ ajaxChat.showHide(hideContainerIDs[i], 'none');
+ }
+ }
+ ajaxChat.showHide(containerID);
+ if(typeof arguments.callee.styleProperty == 'undefined') {
+ if(typeof isIElt7 != 'undefined') {
+ arguments.callee.styleProperty = 'marginRight';
+ } else {
+ arguments.callee.styleProperty = 'right';
+ }
+ }
+ var containerWidth = document.getElementById(containerID).offsetWidth;
+ if(containerWidth) {
+ document.getElementById('chatList').style[arguments.callee.styleProperty] = (containerWidth+28)+'px';
+ } else {
+ document.getElementById('chatList').style[arguments.callee.styleProperty] = '20px';
+ }
+ }
+
+ function initialize() {
+ ajaxChat.updateButton('audio', 'audioButton');
+ ajaxChat.updateButton('autoScroll', 'autoScrollButton');
+ document.getElementById('bbCodeSetting').checked = ajaxChat.getSetting('bbCode');
+ document.getElementById('bbCodeImagesSetting').checked = ajaxChat.getSetting('bbCodeImages');
+ document.getElementById('bbCodeColorsSetting').checked = ajaxChat.getSetting('bbCodeColors');
+ document.getElementById('hyperLinksSetting').checked = ajaxChat.getSetting('hyperLinks');
+ document.getElementById('lineBreaksSetting').checked = ajaxChat.getSetting('lineBreaks');
+ document.getElementById('emoticonsSetting').checked = ajaxChat.getSetting('emoticons');
+ document.getElementById('autoFocusSetting').checked = ajaxChat.getSetting('autoFocus');
+ document.getElementById('maxMessagesSetting').value = ajaxChat.getSetting('maxMessages');
+ document.getElementById('wordWrapSetting').checked = ajaxChat.getSetting('wordWrap');
+ document.getElementById('maxWordLengthSetting').value = ajaxChat.getSetting('maxWordLength');
+ document.getElementById('dateFormatSetting').value = ajaxChat.getSetting('dateFormat');
+ document.getElementById('persistFontColorSetting').checked = ajaxChat.getSetting('persistFontColor');
+ for(var i=0; i<document.getElementById('audioVolumeSetting').options.length; i++) {
+ if(document.getElementById('audioVolumeSetting').options[i].value == ajaxChat.getSetting('audioVolume')) {
+ document.getElementById('audioVolumeSetting').options[i].selected = true;
+ break;
+ }
+ }
+ ajaxChat.fillSoundSelection('soundReceiveSetting', ajaxChat.getSetting('soundReceive'));
+ ajaxChat.fillSoundSelection('soundSendSetting', ajaxChat.getSetting('soundSend'));
+ ajaxChat.fillSoundSelection('soundEnterSetting', ajaxChat.getSetting('soundEnter'));
+ ajaxChat.fillSoundSelection('soundLeaveSetting', ajaxChat.getSetting('soundLeave'));
+ ajaxChat.fillSoundSelection('soundChatBotSetting', ajaxChat.getSetting('soundChatBot'));
+ ajaxChat.fillSoundSelection('soundErrorSetting', ajaxChat.getSetting('soundError'));
+ document.getElementById('blinkSetting').checked = ajaxChat.getSetting('blink');
+ document.getElementById('blinkIntervalSetting').value = ajaxChat.getSetting('blinkInterval');
+ document.getElementById('blinkIntervalNumberSetting').value = ajaxChat.getSetting('blinkIntervalNumber');
+ }
+
+ ajaxChatConfig.loginChannelID = parseInt('[LOGIN_CHANNEL_ID/]');
+ ajaxChatConfig.sessionName = '[SESSION_NAME/]';
+ ajaxChatConfig.cookieExpiration = parseInt('[COOKIE_EXPIRATION/]');
+ ajaxChatConfig.cookiePath = '[COOKIE_PATH/]';
+ ajaxChatConfig.cookieDomain = '[COOKIE_DOMAIN/]';
+ ajaxChatConfig.cookieSecure = '[COOKIE_SECURE/]';
+ ajaxChatConfig.chatBotName = decodeURIComponent('[CHAT_BOT_NAME/]');
+ ajaxChatConfig.chatBotID = '[CHAT_BOT_ID/]';
+ ajaxChatConfig.allowUserMessageDelete = parseInt('[ALLOW_USER_MESSAGE_DELETE/]');
+ ajaxChatConfig.inactiveTimeout = parseInt('[INACTIVE_TIMEOUT/]');
+ ajaxChatConfig.privateChannelDiff = parseInt('[PRIVATE_CHANNEL_DIFF/]');
+ ajaxChatConfig.privateMessageDiff = parseInt('[PRIVATE_MESSAGE_DIFF/]');
+ ajaxChatConfig.showChannelMessages = parseInt('[SHOW_CHANNEL_MESSAGES/]');
+ ajaxChatConfig.messageTextMaxLength = parseInt('[MESSAGE_TEXT_MAX_LENGTH/]');
+ ajaxChatConfig.socketServerEnabled = parseInt('[SOCKET_SERVER_ENABLED/]');
+ ajaxChatConfig.socketServerHost = decodeURIComponent('[SOCKET_SERVER_HOST/]');
+ ajaxChatConfig.socketServerPort = parseInt('[SOCKET_SERVER_PORT/]');
+ ajaxChatConfig.socketServerChatID = parseInt('[SOCKET_SERVER_CHAT_ID/]');
+
+ ajaxChat.init(ajaxChatConfig, ajaxChatLang, true, true, true, initialize);
+ // ]]>
+ </script>
+</head>
+
+<body>
+ <div id="content">
+ <div id="headlineContainer">
+ <h1>[LANG]title[/LANG]</h1>
+ </div>
+ <div id="logoutChannelContainer">
+ <input type="button" id="logoutButton" value="[LANG]logout[/LANG]" onclick="ajaxChat.logout();"/>
+ <label for="channelSelection">[LANG]channel[/LANG]:</label>
+ <select id="channelSelection" onchange="ajaxChat.switchChannel(this.options[this.selectedIndex].value);">[CHANNEL_OPTIONS/]</select>
+ <label for="styleSelection">[LANG]style[/LANG]:</label>
+ <select id="styleSelection" onchange="ajaxChat.setActiveStyleSheet(ajaxChat.getSelectedStyle());">[STYLE_OPTIONS/]</select>
+ <label for="languageSelection">[LANG]language[/LANG]:</label>
+ <select id="languageSelection" onchange="ajaxChat.switchLanguage(this.value);">[LANGUAGE_OPTIONS/]</select>
+ </div>
+ <div id="statusIconContainer" class="statusContainerOn"></div>
+ <!--[if lt IE 7]>
+ <div></div>
+ <![endif]-->
+ <div id="chatList"></div>
+ <div id="inputFieldContainer">
+ <textarea id="inputField" rows="1" cols="50" title="[LANG]inputLineBreak[/LANG]" onkeypress="ajaxChat.handleInputFieldKeyPress(event);" onkeyup="ajaxChat.handleInputFieldKeyUp(event);"></textarea>
+ </div>
+ <div id="submitButtonContainer">
+ <span id="messageLengthCounter">0/[MESSAGE_TEXT_MAX_LENGTH/]</span>
+ <input type="button" id="submitButton" value="[LANG]messageSubmit[/LANG]" onclick="ajaxChat.sendMessage();"/>
+ </div>
+ <div id="emoticonsContainer" dir="ltr"></div>
+ <div id="bbCodeContainer">
+ <input type="button" value="[LANG]bbCodeLabelBold[/LANG]" title="[LANG]bbCodeTitleBold[/LANG]" onclick="ajaxChat.insertBBCode('b');" style="font-weight:bold;"/>
+ <input type="button" value="[LANG]bbCodeLabelItalic[/LANG]" title="[LANG]bbCodeTitleItalic[/LANG]" onclick="ajaxChat.insertBBCode('i');" style="font-style:italic;"/>
+ <input type="button" value="[LANG]bbCodeLabelUnderline[/LANG]" title="[LANG]bbCodeTitleUnderline[/LANG]" onclick="ajaxChat.insertBBCode('u');" style="text-decoration:underline;"/>
+ <input type="button" value="[LANG]bbCodeLabelQuote[/LANG]" title="[LANG]bbCodeTitleQuote[/LANG]" onclick="ajaxChat.insertBBCode('quote');"/>
+ <input type="button" value="[LANG]bbCodeLabelCode[/LANG]" title="[LANG]bbCodeTitleCode[/LANG]" onclick="ajaxChat.insertBBCode('code');"/>
+ <input type="button" value="[LANG]bbCodeLabelURL[/LANG]" title="[LANG]bbCodeTitleURL[/LANG]" onclick="ajaxChat.insertBBCode('url');"/>
+ <input type="button" value="[LANG]bbCodeLabelImg[/LANG]" title="[LANG]bbCodeTitleImg[/LANG]" onclick="ajaxChat.insertBBCode('img');"/>
+ <input type="button" value="[LANG]bbCodeLabelColor[/LANG]" title="[LANG]bbCodeTitleColor[/LANG]" onclick="ajaxChat.showHide('colorCodesContainer', null);"/>
+ </div>
+ <div id="colorCodesContainer" style="display:none;" dir="ltr"></div>
+ <div id="optionsContainer">
+ <input type="image" src="img/pixel.gif" class="button" id="helpButton" alt="[LANG]toggleHelp[/LANG]" title="[LANG]toggleHelp[/LANG]" onclick="toggleContainer('helpContainer', new Array('onlineListContainer','settingsContainer'));"/>
+ <input type="image" src="img/pixel.gif" class="button" id="settingsButton" alt="[LANG]toggleSettings[/LANG]" title="[LANG]toggleSettings[/LANG]" onclick="toggleContainer('settingsContainer', new Array('onlineListContainer','helpContainer'));"/>
+ <input type="image" src="img/pixel.gif" class="button" id="onlineListButton" alt="[LANG]toggleOnlineList[/LANG]" title="[LANG]toggleOnlineList[/LANG]" onclick="toggleContainer('onlineListContainer', new Array('settingsContainer','helpContainer'));"/>
+ <input type="image" src="img/pixel.gif" class="button" id="audioButton" alt="[LANG]toggleAudio[/LANG]" title="[LANG]toggleAudio[/LANG]" onclick="ajaxChat.toggleSetting('audio', 'audioButton');"/>
+ <input type="image" src="img/pixel.gif" class="button" id="autoScrollButton" alt="[LANG]toggleAutoScroll[/LANG]" title="[LANG]toggleAutoScroll[/LANG]" onclick="ajaxChat.toggleSetting('autoScroll', 'autoScrollButton');"/>
+ </div>
+ <div id="onlineListContainer">
+ <h3>[LANG]onlineUsers[/LANG]</h3>
+ <div id="onlineList"></div>
+ </div>
+ <div id="helpContainer" style="display:none;">
+ <h3>[LANG]help[/LANG]</h3>
+ <div id="helpList">
+ <table>
+ <tr class="rowOdd">
+ <td class="desc">[LANG]helpItemDescJoin[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeJoin[/LANG]</td>
+ </tr>
+ <tr class="rowEven">
+ <td class="desc">[LANG]helpItemDescJoinCreate[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeJoinCreate[/LANG]</td>
+
+ </tr>
+ <tr class="rowOdd">
+ <td class="desc">[LANG]helpItemDescInvite[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeInvite[/LANG]</td>
+ </tr>
+ <tr class="rowEven">
+ <td class="desc">[LANG]helpItemDescUninvite[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeUninvite[/LANG]</td>
+ </tr>
+
+ <tr class="rowOdd">
+ <td class="desc">[LANG]helpItemDescLogout[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeLogout[/LANG]</td>
+ </tr>
+ <tr class="rowEven">
+ <td class="desc">[LANG]helpItemDescPrivateMessage[/LANG]</td>
+ <td class="code">[LANG]helpItemCodePrivateMessage[/LANG]</td>
+ </tr>
+ <tr class="rowOdd">
+
+ <td class="desc">[LANG]helpItemDescQueryOpen[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeQueryOpen[/LANG]</td>
+ </tr>
+ <tr class="rowEven">
+ <td class="desc">[LANG]helpItemDescQueryClose[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeQueryClose[/LANG]</td>
+ </tr>
+ <tr class="rowOdd">
+ <td class="desc">[LANG]helpItemDescAction[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeAction[/LANG]</td>
+ </tr>
+ <tr class="rowEven">
+ <td class="desc">[LANG]helpItemDescDescribe[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeDescribe[/LANG]</td>
+ </tr>
+ <tr class="rowOdd">
+ <td class="desc">[LANG]helpItemDescIgnore[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeIgnore[/LANG]</td>
+
+ </tr>
+ <tr class="rowEven">
+ <td class="desc">[LANG]helpItemDescIgnoreList[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeIgnoreList[/LANG]</td>
+ </tr>
+ <tr class="rowOdd">
+ <td class="desc">[LANG]helpItemDescWhereis[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeWhereis[/LANG]</td>
+ </tr>
+
+ <tr class="rowEven">
+ <td class="desc">[LANG]helpItemDescKick[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeKick[/LANG]</td>
+ </tr>
+ <tr class="rowOdd">
+ <td class="desc">[LANG]helpItemDescUnban[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeUnban[/LANG]</td>
+ </tr>
+ <tr class="rowEven">
+
+ <td class="desc">[LANG]helpItemDescBans[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeBans[/LANG]</td>
+ </tr>
+ <tr class="rowOdd">
+ <td class="desc">[LANG]helpItemDescWhois[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeWhois[/LANG]</td>
+ </tr>
+ <tr class="rowEven">
+ <td class="desc">[LANG]helpItemDescWho[/LANG]</td>
+
+ <td class="code">[LANG]helpItemCodeWho[/LANG]</td>
+ </tr>
+ <tr class="rowOdd">
+ <td class="desc">[LANG]helpItemDescList[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeList[/LANG]</td>
+ </tr>
+ <tr class="rowEven">
+ <td class="desc">[LANG]helpItemDescRoll[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeRoll[/LANG]</td>
+
+ </tr>
+ <tr class="rowOdd">
+ <td class="desc">[LANG]helpItemDescNick[/LANG]</td>
+ <td class="code">[LANG]helpItemCodeNick[/LANG]</td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ <div id="settingsContainer" style="display:none;">
+ <h3>[LANG]settings[/LANG]</h3>
+ <div id="settingsList">
+ <table>
+ <tr class="rowOdd">
+ <td><label for="bbCodeSetting">[LANG]settingsBBCode[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="bbCodeSetting" onclick="ajaxChat.setSetting('bbCode', this.checked);"/></td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="bbCodeImagesSetting">[LANG]settingsBBCodeImages[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="bbCodeImagesSetting" onclick="ajaxChat.setSetting('bbCodeImages', this.checked);"/></td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="bbCodeColorsSetting">[LANG]settingsBBCodeColors[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="bbCodeColorsSetting" onclick="ajaxChat.setSetting('bbCodeColors', this.checked);"/></td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="hyperLinksSetting">[LANG]settingsHyperLinks[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="hyperLinksSetting" onclick="ajaxChat.setSetting('hyperLinks', this.checked);"/></td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="lineBreaksSetting">[LANG]settingsLineBreaks[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="lineBreaksSetting" onclick="ajaxChat.setSetting('lineBreaks', this.checked);"/></td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="emoticonsSetting">[LANG]settingsEmoticons[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="emoticonsSetting" onclick="ajaxChat.setSetting('emoticons', this.checked);"/></td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="autoFocusSetting">[LANG]settingsAutoFocus[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="autoFocusSetting" onclick="ajaxChat.setSetting('autoFocus', this.checked);"/></td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="maxMessagesSetting">[LANG]settingsMaxMessages[/LANG]</label></td>
+ <td class="setting"><input type="text" class="text" id="maxMessagesSetting" onchange="ajaxChat.setSetting('maxMessages', parseInt(this.value));"/></td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="wordWrapSetting">[LANG]settingsWordWrap[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="wordWrapSetting" onclick="ajaxChat.setSetting('wordWrap', this.checked);"/></td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="maxWordLengthSetting">[LANG]settingsMaxWordLength[/LANG]</label></td>
+ <td class="setting"><input type="text" class="text" id="maxWordLengthSetting" onchange="ajaxChat.setSetting('maxWordLength', parseInt(this.value));"/></td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="dateFormatSetting">[LANG]settingsDateFormat[/LANG]</label></td>
+ <td class="setting"><input type="text" class="text" id="dateFormatSetting" onchange="ajaxChat.setSetting('dateFormat', this.value);"/></td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="persistFontColorSetting">[LANG]settingsPersistFontColor[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="persistFontColorSetting" onclick="ajaxChat.setPersistFontColor(this.checked);"/></td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="audioVolumeSetting">[LANG]settingsAudioVolume[/LANG]</label></td>
+ <td class="setting">
+ <select class="left" id="audioVolumeSetting" onchange="ajaxChat.setAudioVolume(this.options[this.selectedIndex].value);">
+ <option value="1.0">100 %</option>
+ <option value="0.9">90 %</option>
+ <option value="0.8">80 %</option>
+ <option value="0.7">70 %</option>
+ <option value="0.6">60 %</option>
+ <option value="0.5">50 %</option>
+ <option value="0.4">40 %</option>
+ <option value="0.3">30 %</option>
+ <option value="0.2">20 %</option>
+ <option value="0.1">10 %</option>
+ </select>
+ </td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="soundReceiveSetting">[LANG]settingsSoundReceive[/LANG]</label></td>
+ <td class="setting">
+ <select id="soundReceiveSetting" onchange="ajaxChat.setSetting('soundReceive', this.options[this.selectedIndex].value);"><option value="">-</option></select><input type="image" src="img/pixel.gif" class="button playback" alt="[LANG]playSelectedSound[/LANG]" title="[LANG]playSelectedSound[/LANG]" onclick="ajaxChat.playSound(this.previousSibling.options[this.previousSibling.selectedIndex].value);"/>
+ </td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="soundSendSetting">[LANG]settingsSoundSend[/LANG]</label></td>
+ <td class="setting">
+ <select id="soundSendSetting" onchange="ajaxChat.setSetting('soundSend', this.options[this.selectedIndex].value);"><option value="">-</option></select><input type="image" src="img/pixel.gif" class="button playback" alt="[LANG]playSelectedSound[/LANG]" title="[LANG]playSelectedSound[/LANG]" onclick="ajaxChat.playSound(this.previousSibling.options[this.previousSibling.selectedIndex].value);"/>
+ </td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="soundEnterSetting">[LANG]settingsSoundEnter[/LANG]</label></td>
+ <td class="setting">
+ <select id="soundEnterSetting" onchange="ajaxChat.setSetting('soundEnter', this.options[this.selectedIndex].value);"><option value="">-</option></select><input type="image" src="img/pixel.gif" class="button playback" alt="[LANG]playSelectedSound[/LANG]" title="[LANG]playSelectedSound[/LANG]" onclick="ajaxChat.playSound(this.previousSibling.options[this.previousSibling.selectedIndex].value);"/>
+ </td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="soundLeaveSetting">[LANG]settingsSoundLeave[/LANG]</label></td>
+ <td class="setting">
+ <select id="soundLeaveSetting" onchange="ajaxChat.setSetting('soundLeave', this.options[this.selectedIndex].value);"><option value="">-</option></select><input type="image" src="img/pixel.gif" class="button playback" alt="[LANG]playSelectedSound[/LANG]" title="[LANG]playSelectedSound[/LANG]" onclick="ajaxChat.playSound(this.previousSibling.options[this.previousSibling.selectedIndex].value);"/>
+ </td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="soundChatBotSetting">[LANG]settingsSoundChatBot[/LANG]</label></td>
+ <td class="setting">
+ <select id="soundChatBotSetting" onchange="ajaxChat.setSetting('soundChatBot', this.options[this.selectedIndex].value);"><option value="">-</option></select><input type="image" src="img/pixel.gif" class="button playback" alt="[LANG]playSelectedSound[/LANG]" title="[LANG]playSelectedSound[/LANG]" onclick="ajaxChat.playSound(this.previousSibling.options[this.previousSibling.selectedIndex].value);"/>
+ </td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="soundErrorSetting">[LANG]settingsSoundError[/LANG]</label></td>
+ <td class="setting">
+ <select id="soundErrorSetting" onchange="ajaxChat.setSetting('soundError', this.options[this.selectedIndex].value);"><option value="">-</option></select><input type="image" src="img/pixel.gif" class="button playback" alt="[LANG]playSelectedSound[/LANG]" title="[LANG]playSelectedSound[/LANG]" onclick="ajaxChat.playSound(this.previousSibling.options[this.previousSibling.selectedIndex].value);"/>
+ </td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="blinkSetting">[LANG]settingsBlink[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="blinkSetting" onclick="ajaxChat.setSetting('blink', this.checked);"/></td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="blinkIntervalSetting">[LANG]settingsBlinkInterval[/LANG]</label></td>
+ <td class="setting"><input type="text" class="text" id="blinkIntervalSetting" onchange="ajaxChat.setSetting('blinkInterval', parseInt(this.value));"/></td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="blinkIntervalNumberSetting">[LANG]settingsBlinkIntervalNumber[/LANG]</label></td>
+ <td class="setting"><input type="text" class="text" id="blinkIntervalNumberSetting" onchange="ajaxChat.setSetting('blinkIntervalNumber', parseInt(this.value));"/></td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ <!--
+ Please retain the full copyright notice below including the link to blueimp.net.
+ This not only gives respect to the amount of time given freely by the developer
+ but also helps build interest, traffic and use of AJAX Chat.
+
+ Thanks,
+ Sebastian Tschan
+ //-->
+ <div id="copyright"><a href="https://blueimp.net/ajax/">AJAX Chat</a> &copy; <a href="https://blueimp.net">blueimp.net</a></div>
+ </div>
+ <div id="flashInterfaceContainer"></div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/template/loggedOut.html b/library/ajaxchat/chat/lib/template/loggedOut.html
new file mode 100644
index 000000000..ba8a8a4a9
--- /dev/null
+++ b/library/ajaxchat/chat/lib/template/loggedOut.html
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="[CONTENT_ENCODING/]"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="[LANG_CODE/]" lang="[LANG_CODE/]" dir="[BASE_DIRECTION/]">
+
+<head>
+ <meta http-equiv="Content-Type" content="[CONTENT_TYPE/]" />
+ <title>[LANG]title[/LANG]</title>
+ <style type="text/css">
+ body {
+ padding:0;
+ margin:0;
+ }
+ </style>
+ [STYLE_SHEETS/]
+ <!--[if lt IE 7]>
+ <link rel="stylesheet" type="text/css" href="css/ie5-6.css"/>
+ <![endif]-->
+ <script src="js/chat.js" type="text/javascript" charset="UTF-8"></script>
+ <script src="js/lang/[LANG_CODE/].js" type="text/javascript" charset="UTF-8"></script>
+ <script src="js/config.js" type="text/javascript" charset="UTF-8"></script>
+ <script type="text/javascript">
+ // <![CDATA[
+ function initializeLoginPage() {
+ document.getElementById('userNameField').focus();
+ if(!ajaxChat.isCookieEnabled()) {
+ var node = document.createElement('div');
+ var text = document.createTextNode(ajaxChatLang['errorCookiesRequired']);
+ node.appendChild(text);
+ document.getElementById('errorContainer').appendChild(node);
+ }
+ }
+
+ ajaxChatConfig.sessionName = '[SESSION_NAME/]';
+ ajaxChatConfig.cookieExpiration = parseInt('[COOKIE_EXPIRATION/]');
+ ajaxChatConfig.cookiePath = '[COOKIE_PATH/]';
+ ajaxChatConfig.cookieDomain = '[COOKIE_DOMAIN/]';
+ ajaxChatConfig.cookieSecure = '[COOKIE_SECURE/]';
+
+ ajaxChat.init(ajaxChatConfig, ajaxChatLang, true, true, false);
+ // ]]>
+ </script>
+</head>
+
+<body onload="initializeLoginPage();">
+ <div id="loginContent">
+ <div id="loginHeadlineContainer">
+ <h1>[LANG]title[/LANG]</h1>
+ </div>
+ <form id="loginForm" action="[LOGIN_URL/]" method="post" enctype="application/x-www-form-urlencoded">
+ <div id="loginFormContainer">
+ <input type="hidden" name="login" id="loginField" value="login"/>
+ <input type="hidden" name="redirect" id="redirectField" value="[REDIRECT_URL/]"/>
+ <div><label for="userNameField">[LANG]userName[/LANG]:</label><br />
+ <input type="text" name="userName" id="userNameField" maxlength="[USER_NAME_MAX_LENGTH/]"/></div>
+ <div><label for="passwordField">[LANG]password[/LANG]*:</label><br />
+ <input type="password" name="password" id="passwordField"/></div>
+ <div><label for="channelField">[LANG]channel[/LANG]:</label><br />
+ <select name="channelName" id="channelField">[CHANNEL_OPTIONS/]</select></div>
+ <div><label for="languageSelection">[LANG]language[/LANG]:</label><br />
+ <select id="languageSelection" name="lang" onchange="ajaxChat.switchLanguage(this.value);">[LANGUAGE_OPTIONS/]</select></div>
+ <div><input type="submit" name="submit" id="loginButton" value="[LANG]login[/LANG]"/></div>
+ <div id="loginRegisteredUsers">* [LANG]registeredUsers[/LANG]</div>
+ </div>
+ </form>
+ <div id="errorContainer">[ERROR_MESSAGES/]<noscript><div>[LANG]requiresJavaScript[/LANG]</div></noscript></div>
+ <!--
+ Please retain the full copyright notice below including the link to blueimp.net.
+ This not only gives respect to the amount of time given freely by the developer
+ but also helps build interest, traffic and use of AJAX Chat.
+
+ Thanks,
+ Sebastian Tschan
+ //-->
+ <div id="copyright"><a href="https://blueimp.net/ajax/">AJAX Chat</a> &copy; <a href="https://blueimp.net">blueimp.net</a></div>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/template/logs.html b/library/ajaxchat/chat/lib/template/logs.html
new file mode 100644
index 000000000..d0b9162a9
--- /dev/null
+++ b/library/ajaxchat/chat/lib/template/logs.html
@@ -0,0 +1,276 @@
+<?xml version="1.0" encoding="[CONTENT_ENCODING/]"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="[LANG_CODE/]" lang="[LANG_CODE/]" dir="[BASE_DIRECTION/]">
+
+<head>
+ <meta http-equiv="Content-Type" content="[CONTENT_TYPE/]" />
+ <title>[LANG]logsTitle[/LANG]</title>
+ <style type="text/css">
+ body {
+ padding:0;
+ margin:0;
+ }
+ </style>
+ [STYLE_SHEETS/]
+ <!--[if lt IE 7]>
+ <link rel="stylesheet" type="text/css" href="css/ie5-6.css"/>
+ <script type="text/javascript">
+ var isIElt7 = true;
+ </script>
+ <![endif]-->
+ <script src="js/chat.js" type="text/javascript" charset="UTF-8"></script>
+ <script src="js/logs.js" type="text/javascript" charset="UTF-8"></script>
+ <script src="js/lang/[LANG_CODE/].js" type="text/javascript" charset="UTF-8"></script>
+ <script src="js/config.js" type="text/javascript" charset="UTF-8"></script>
+ <script src="js/FABridge.js" type="text/javascript" charset="UTF-8"></script>
+ <script type="text/javascript">
+ // <![CDATA[
+ function toggleContainer(containerID, hideContainerIDs) {
+ if(hideContainerIDs) {
+ for(var i=0; i<hideContainerIDs.length; i++) {
+ ajaxChat.showHide(hideContainerIDs[i], 'none');
+ }
+ }
+ ajaxChat.showHide(containerID);
+ if(typeof arguments.callee.styleProperty == 'undefined') {
+ if(typeof isIElt7 != 'undefined') {
+ arguments.callee.styleProperty = 'marginRight';
+ } else {
+ arguments.callee.styleProperty = 'right';
+ }
+ }
+ var containerWidth = document.getElementById(containerID).offsetWidth;
+ if(containerWidth) {
+ document.getElementById('chatList').style[arguments.callee.styleProperty] = (containerWidth+28)+'px';
+ } else {
+ document.getElementById('chatList').style[arguments.callee.styleProperty] = '20px';
+ }
+ }
+
+ function initialize() {
+ toggleContainer('settingsContainer');
+ ajaxChat.updateButton('audio', 'audioButton');
+ ajaxChat.updateButton('autoScroll', 'autoScrollButton');
+ document.getElementById('bbCodeSetting').checked = ajaxChat.getSetting('bbCode');
+ document.getElementById('hyperLinksSetting').checked = ajaxChat.getSetting('hyperLinks');
+ document.getElementById('lineBreaksSetting').checked = ajaxChat.getSetting('lineBreaks');
+ document.getElementById('emoticonsSetting').checked = ajaxChat.getSetting('emoticons');
+ document.getElementById('autoFocusSetting').checked = ajaxChat.getSetting('autoFocus');
+ document.getElementById('maxMessagesSetting').value = ajaxChat.getSetting('maxMessages');
+ document.getElementById('wordWrapSetting').checked = ajaxChat.getSetting('wordWrap');
+ document.getElementById('maxWordLengthSetting').value = ajaxChat.getSetting('maxWordLength');
+ document.getElementById('dateFormatSetting').value = ajaxChat.getSetting('dateFormat');
+ document.getElementById('persistFontColorSetting').checked = ajaxChat.getSetting('persistFontColor');
+ for(var i=0; i<document.getElementById('audioVolumeSetting').options.length; i++) {
+ if(document.getElementById('audioVolumeSetting').options[i].value == ajaxChat.getSetting('audioVolume')) {
+ document.getElementById('audioVolumeSetting').options[i].selected = true;
+ break;
+ }
+ }
+ ajaxChat.fillSoundSelection('soundReceiveSetting', ajaxChat.getSetting('soundReceive'));
+ ajaxChat.fillSoundSelection('soundSendSetting', ajaxChat.getSetting('soundSend'));
+ ajaxChat.fillSoundSelection('soundEnterSetting', ajaxChat.getSetting('soundEnter'));
+ ajaxChat.fillSoundSelection('soundLeaveSetting', ajaxChat.getSetting('soundLeave'));
+ ajaxChat.fillSoundSelection('soundChatBotSetting', ajaxChat.getSetting('soundChatBot'));
+ ajaxChat.fillSoundSelection('soundErrorSetting', ajaxChat.getSetting('soundError'));
+ document.getElementById('blinkSetting').checked = ajaxChat.getSetting('blink');
+ document.getElementById('blinkIntervalSetting').value = ajaxChat.getSetting('blinkInterval');
+ document.getElementById('blinkIntervalNumberSetting').value = ajaxChat.getSetting('blinkIntervalNumber');
+ }
+
+ ajaxChatConfig.sessionName = '[SESSION_NAME/]';
+ ajaxChatConfig.cookieExpiration = parseInt('[COOKIE_EXPIRATION/]');
+ ajaxChatConfig.cookiePath = '[COOKIE_PATH/]';
+ ajaxChatConfig.cookieDomain = '[COOKIE_DOMAIN/]';
+ ajaxChatConfig.cookieSecure = '[COOKIE_SECURE/]';
+ ajaxChatConfig.chatBotName = decodeURIComponent('[CHAT_BOT_NAME/]');
+ ajaxChatConfig.chatBotID = '[CHAT_BOT_ID/]';
+ ajaxChatConfig.allowUserMessageDelete = parseInt('[ALLOW_USER_MESSAGE_DELETE/]');
+ ajaxChatConfig.inactiveTimeout = parseInt('[INACTIVE_TIMEOUT/]');
+ ajaxChatConfig.privateChannelDiff = parseInt('[PRIVATE_CHANNEL_DIFF/]');
+ ajaxChatConfig.privateMessageDiff = parseInt('[PRIVATE_MESSAGE_DIFF/]');
+ ajaxChatConfig.showChannelMessages = true;
+ ajaxChatConfig.messageTextMaxLength = parseInt('[MESSAGE_TEXT_MAX_LENGTH/]');
+ ajaxChatConfig.socketServerEnabled = parseInt('[SOCKET_SERVER_ENABLED/]');
+ ajaxChatConfig.socketServerHost = decodeURIComponent('[SOCKET_SERVER_HOST/]');
+ ajaxChatConfig.socketServerPort = parseInt('[SOCKET_SERVER_PORT/]');
+ ajaxChatConfig.socketServerChatID = parseInt('[SOCKET_SERVER_CHAT_ID/]');
+
+ ajaxChatConfig.ajaxURL += '&view=logs';
+
+ ajaxChatConfig.domIDs['yearSelection'] = 'yearSelection';
+ ajaxChatConfig.domIDs['monthSelection'] = 'monthSelection';
+ ajaxChatConfig.domIDs['daySelection'] = 'daySelection';
+ ajaxChatConfig.domIDs['hourSelection'] = 'hourSelection';
+
+ ajaxChatConfig.settings.dateFormat = '(%Y.%m.%d - %H:%i:%s)';
+ ajaxChatConfig.settings.audio = false;
+ ajaxChatConfig.settings.blink = false;
+ ajaxChatConfig.nonPersistentSettings.push('dateFormat','audio','blink');
+
+ ajaxChat.init(ajaxChatConfig, ajaxChatLang, true, true, true, initialize);
+ // ]]>
+ </script>
+</head>
+
+<body>
+ <div id="content">
+ <div id="headlineContainer">
+ <h1>[LANG]logsTitle[/LANG]</h1>
+ </div>
+ <div id="logoutChannelContainer">
+ <input type="button" id="logoutButton" value="[LANG]logout[/LANG]" onclick="ajaxChat.logout();"/>
+ <label for="channelSelection">[LANG]channel[/LANG]:</label>
+ <select id="channelSelection" onchange="ajaxChat.getLogs();">[LOGS_CHANNEL_OPTIONS/]</select>
+ <label for="yearSelection">[LANG]logsDate[/LANG]:</label>
+ <select id="yearSelection" onchange="ajaxChat.getLogs();">[LOGS_YEAR_OPTIONS/]</select>
+ <select id="monthSelection" onchange="ajaxChat.getLogs();">[LOGS_MONTH_OPTIONS/]</select>
+ <select id="daySelection" onchange="ajaxChat.getLogs();">[LOGS_DAY_OPTIONS/]</select>
+ <label for="hourSelection">[LANG]logsTime[/LANG]:</label>
+ <select id="hourSelection" onchange="ajaxChat.getLogs();">[LOGS_HOUR_OPTIONS/]</select>
+ <label for="styleSelection">[LANG]style[/LANG]:</label>
+ <select id="styleSelection" onchange="ajaxChat.setActiveStyleSheet(ajaxChat.getSelectedStyle());">[STYLE_OPTIONS/]</select>
+ <label for="languageSelection">[LANG]language[/LANG]:</label>
+ <select id="languageSelection" onchange="ajaxChat.switchLanguage(this.value);">[LANGUAGE_OPTIONS/]</select>
+ </div>
+ <!--[if lt IE 7]>
+ <div></div>
+ <![endif]-->
+ <div id="chatList"></div>
+ <div id="inputFieldContainer">
+ <textarea id="inputField" rows="1" cols="50" title="[LANG]inputLineBreak[/LANG]" onkeypress="ajaxChat.handleInputFieldKeyPress(event);"></textarea>
+ </div>
+ <div id="submitButtonContainer">
+ <input type="button" id="submitButton" value="[LANG]logsSearch[/LANG]" onclick="ajaxChat.sendMessage();"/>
+ </div>
+ <div id="optionsContainer">
+ <input type="image" src="img/pixel.gif" class="button" id="settingsButton" alt="[LANG]toggleSettings[/LANG]" title="[LANG]toggleSettings[/LANG]" onclick="toggleContainer('settingsContainer');"/>
+ <input type="image" src="img/pixel.gif" class="button" id="audioButton" alt="[LANG]toggleAudio[/LANG]" title="[LANG]toggleAudio[/LANG]" onclick="ajaxChat.toggleSetting('audio', 'audioButton');"/>
+ <input type="image" src="img/pixel.gif" class="button" id="autoScrollButton" alt="[LANG]toggleAutoScroll[/LANG]" title="[LANG]toggleAutoScroll[/LANG]" onclick="ajaxChat.toggleSetting('autoScroll', 'autoScrollButton')"/>
+ </div>
+ <div id="settingsContainer" style="display:none;">
+ <h3>[LANG]settings[/LANG]</h3>
+ <div id="settingsList">
+ <table>
+ <tr class="rowOdd">
+ <td><label for="bbCodeSetting">[LANG]settingsBBCode[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="bbCodeSetting" onclick="ajaxChat.setSetting('bbCode', this.checked);"/></td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="hyperLinksSetting">[LANG]settingsHyperLinks[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="hyperLinksSetting" onclick="ajaxChat.setSetting('hyperLinks', this.checked);"/></td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="lineBreaksSetting">[LANG]settingsLineBreaks[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="lineBreaksSetting" onclick="ajaxChat.setSetting('lineBreaks', this.checked);"/></td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="emoticonsSetting">[LANG]settingsEmoticons[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="emoticonsSetting" onclick="ajaxChat.setSetting('emoticons', this.checked);"/></td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="autoFocusSetting">[LANG]settingsAutoFocus[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="autoFocusSetting" onclick="ajaxChat.setSetting('autoFocus', this.checked);"/></td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="maxMessagesSetting">[LANG]settingsMaxMessages[/LANG]</label></td>
+ <td class="setting"><input type="text" class="text" id="maxMessagesSetting" onchange="ajaxChat.setSetting('maxMessages', parseInt(this.value));"/></td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="wordWrapSetting">[LANG]settingsWordWrap[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="wordWrapSetting" onclick="ajaxChat.setSetting('wordWrap', this.checked);"/></td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="maxWordLengthSetting">[LANG]settingsMaxWordLength[/LANG]</label></td>
+ <td class="setting"><input type="text" class="text" id="maxWordLengthSetting" onchange="ajaxChat.setSetting('maxWordLength', parseInt(this.value));"/></td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="dateFormatSetting">[LANG]settingsDateFormat[/LANG]</label></td>
+ <td class="setting"><input type="text" class="text" id="dateFormatSetting" onchange="ajaxChat.setSetting('dateFormat', this.value);"/></td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="persistFontColorSetting">[LANG]settingsPersistFontColor[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="persistFontColorSetting" onclick="ajaxChat.setPersistFontColor(this.checked);"/></td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="audioVolumeSetting">[LANG]settingsAudioVolume[/LANG]</label></td>
+ <td class="setting">
+ <select class="left" id="audioVolumeSetting" onchange="ajaxChat.setAudioVolume(this.options[this.selectedIndex].value);">
+ <option value="1.0">100 %</option>
+ <option value="0.9">90 %</option>
+ <option value="0.8">80 %</option>
+ <option value="0.7">70 %</option>
+ <option value="0.6">60 %</option>
+ <option value="0.5">50 %</option>
+ <option value="0.4">40 %</option>
+ <option value="0.3">30 %</option>
+ <option value="0.2">20 %</option>
+ <option value="0.1">10 %</option>
+ </select>
+ </td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="soundReceiveSetting">[LANG]settingsSoundReceive[/LANG]</label></td>
+ <td class="setting">
+ <select id="soundReceiveSetting" onchange="ajaxChat.setSetting('soundReceive', this.options[this.selectedIndex].value);"><option value="">-</option></select><input type="image" src="img/pixel.gif" class="button playback" alt="[LANG]playSelectedSound[/LANG]" title="[LANG]playSelectedSound[/LANG]" onclick="ajaxChat.playSound(this.previousSibling.options[this.previousSibling.selectedIndex].value);"/>
+ </td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="soundSendSetting">[LANG]settingsSoundSend[/LANG]</label></td>
+ <td class="setting">
+ <select id="soundSendSetting" onchange="ajaxChat.setSetting('soundSend', this.options[this.selectedIndex].value);"><option value="">-</option></select><input type="image" src="img/pixel.gif" class="button playback" alt="[LANG]playSelectedSound[/LANG]" title="[LANG]playSelectedSound[/LANG]" onclick="ajaxChat.playSound(this.previousSibling.options[this.previousSibling.selectedIndex].value);"/>
+ </td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="soundEnterSetting">[LANG]settingsSoundEnter[/LANG]</label></td>
+ <td class="setting">
+ <select id="soundEnterSetting" onchange="ajaxChat.setSetting('soundEnter', this.options[this.selectedIndex].value);"><option value="">-</option></select><input type="image" src="img/pixel.gif" class="button playback" alt="[LANG]playSelectedSound[/LANG]" title="[LANG]playSelectedSound[/LANG]" onclick="ajaxChat.playSound(this.previousSibling.options[this.previousSibling.selectedIndex].value);"/>
+ </td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="soundLeaveSetting">[LANG]settingsSoundLeave[/LANG]</label></td>
+ <td class="setting">
+ <select id="soundLeaveSetting" onchange="ajaxChat.setSetting('soundLeave', this.options[this.selectedIndex].value);"><option value="">-</option></select><input type="image" src="img/pixel.gif" class="button playback" alt="[LANG]playSelectedSound[/LANG]" title="[LANG]playSelectedSound[/LANG]" onclick="ajaxChat.playSound(this.previousSibling.options[this.previousSibling.selectedIndex].value);"/>
+ </td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="soundChatBotSetting">[LANG]settingsSoundChatBot[/LANG]</label></td>
+ <td class="setting">
+ <select id="soundChatBotSetting" onchange="ajaxChat.setSetting('soundChatBot', this.options[this.selectedIndex].value);"><option value="">-</option></select><input type="image" src="img/pixel.gif" class="button playback" alt="[LANG]playSelectedSound[/LANG]" title="[LANG]playSelectedSound[/LANG]" onclick="ajaxChat.playSound(this.previousSibling.options[this.previousSibling.selectedIndex].value);"/>
+ </td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="soundErrorSetting">[LANG]settingsSoundError[/LANG]</label></td>
+ <td class="setting">
+ <select id="soundErrorSetting" onchange="ajaxChat.setSetting('soundError', this.options[this.selectedIndex].value);"><option value="">-</option></select><input type="image" src="img/pixel.gif" class="button playback" alt="[LANG]playSelectedSound[/LANG]" title="[LANG]playSelectedSound[/LANG]" onclick="ajaxChat.playSound(this.previousSibling.options[this.previousSibling.selectedIndex].value);"/>
+ </td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="blinkSetting">[LANG]settingsBlink[/LANG]</label></td>
+ <td class="setting"><input type="checkbox" id="blinkSetting" onclick="ajaxChat.setSetting('blink', this.checked);"/></td>
+ </tr>
+ <tr class="rowOdd">
+ <td><label for="blinkIntervalSetting">[LANG]settingsBlinkInterval[/LANG]</label></td>
+ <td class="setting"><input type="text" class="text" id="blinkIntervalSetting" onchange="ajaxChat.setSetting('blinkInterval', parseInt(this.value));"/></td>
+ </tr>
+ <tr class="rowEven">
+ <td><label for="blinkIntervalNumberSetting">[LANG]settingsBlinkIntervalNumber[/LANG]</label></td>
+ <td class="setting"><input type="text" class="text" id="blinkIntervalNumberSetting" onchange="ajaxChat.setSetting('blinkIntervalNumber', parseInt(this.value));"/></td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ <!--
+ Please retain the full copyright notice below including the link to blueimp.net.
+ This not only gives respect to the amount of time given freely by the developer
+ but also helps build interest, traffic and use of AJAX Chat.
+
+ Thanks,
+ Sebastian Tschan
+ //-->
+ <div id="copyright"><a href="https://blueimp.net/ajax/">AJAX Chat</a> &copy; <a href="https://blueimp.net">blueimp.net</a></div>
+ </div>
+ <div id="flashInterfaceContainer"></div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/library/ajaxchat/chat/lib/template/shoutbox.html b/library/ajaxchat/chat/lib/template/shoutbox.html
new file mode 100644
index 000000000..5f2de9981
--- /dev/null
+++ b/library/ajaxchat/chat/lib/template/shoutbox.html
@@ -0,0 +1,60 @@
+<div id="ajaxChatContent">
+ <script src="[AJAX_CHAT_URL/]js/chat.js" type="text/javascript" charset="UTF-8"></script>
+ <script src="[AJAX_CHAT_URL/]js/custom.js" type="text/javascript" charset="UTF-8"></script>
+ <script src="[AJAX_CHAT_URL/]js/shoutbox.js" type="text/javascript" charset="UTF-8"></script>
+ <script src="[AJAX_CHAT_URL/]js/lang/[LANG_CODE/].js" type="text/javascript" charset="UTF-8"></script>
+ <script src="[AJAX_CHAT_URL/]js/config.js" type="text/javascript" charset="UTF-8"></script>
+ <script src="[AJAX_CHAT_URL/]js/FABridge.js" type="text/javascript" charset="UTF-8"></script>
+ <div id="ajaxChatChatList"></div>
+ <div id="ajaxChatInputFieldContainer" class="[CLASS_WRITEABLE/]">
+ <input id="ajaxChatInputField" type="text" maxlength="[MESSAGE_TEXT_MAX_LENGTH/]" onkeypress="ajaxChat.handleInputFieldKeyPress(event);"/>
+ </div>
+ <script type="text/javascript">
+ // <![CDATA[
+ ajaxChatConfig.ajaxURL = '[AJAX_CHAT_URL/]?ajax=true&shoutbox=true';
+ ajaxChatConfig.baseURL = '[AJAX_CHAT_URL/]';
+
+ ajaxChatConfig.sessionName = '[SESSION_NAME/]';
+ ajaxChatConfig.cookieExpiration = parseInt('[COOKIE_EXPIRATION/]');
+ ajaxChatConfig.cookiePath = '[COOKIE_PATH/]';
+ ajaxChatConfig.cookieDomain = '[COOKIE_DOMAIN/]';
+ ajaxChatConfig.cookieSecure = '[COOKIE_SECURE/]';
+ ajaxChatConfig.chatBotName = decodeURIComponent('[CHAT_BOT_NAME/]');
+ ajaxChatConfig.chatBotID = '[CHAT_BOT_ID/]';
+ ajaxChatConfig.allowUserMessageDelete = parseInt('[ALLOW_USER_MESSAGE_DELETE/]');
+ ajaxChatConfig.inactiveTimeout = parseInt('[INACTIVE_TIMEOUT/]');
+ ajaxChatConfig.privateChannelDiff = parseInt('[PRIVATE_CHANNEL_DIFF/]');
+ ajaxChatConfig.privateMessageDiff = parseInt('[PRIVATE_MESSAGE_DIFF/]');
+ ajaxChatConfig.showChannelMessages = false;
+ ajaxChatConfig.messageTextMaxLength = parseInt('[MESSAGE_TEXT_MAX_LENGTH/]');
+ ajaxChatConfig.socketServerEnabled = parseInt('[SOCKET_SERVER_ENABLED/]');
+ ajaxChatConfig.socketServerHost = decodeURIComponent('[SOCKET_SERVER_HOST/]');
+ ajaxChatConfig.socketServerPort = parseInt('[SOCKET_SERVER_PORT/]');
+ ajaxChatConfig.socketServerChatID = parseInt('[SOCKET_SERVER_CHAT_ID/]');
+
+ ajaxChatConfig.domIDs['chatList'] = 'ajaxChatChatList';
+ ajaxChatConfig.domIDs['inputField'] = 'ajaxChatInputField';
+ ajaxChatConfig.domIDs['flashInterfaceContainer'] = 'ajaxChatFlashInterfaceContainer';
+
+ ajaxChatConfig.startChatOnLoad = false;
+
+ ajaxChatConfig.settings.autoFocus = false;
+ ajaxChatConfig.settings.wordWrap = true;
+ ajaxChatConfig.settings.maxWordLength = 11;
+ ajaxChatConfig.settings.blink = false;
+ ajaxChatConfig.nonPersistentSettings.push('autoFocus','wordWrap','maxWordLength','blink');
+
+ ajaxChat.init(ajaxChatConfig, ajaxChatLang, true, false, true);
+ // ]]>
+ </script>
+ <!--
+ Please retain the full copyright notice below including the link to blueimp.net.
+ This not only gives respect to the amount of time given freely by the developer
+ but also helps build interest, traffic and use of AJAX Chat.
+
+ Thanks,
+ Sebastian Tschan
+ //-->
+ <div id="ajaxChatCopyright"><a href="https://blueimp.net/ajax/">AJAX Chat</a> &copy; <a href="https://blueimp.net">blueimp.net</a></div>
+</div>
+<div id="ajaxChatFlashInterfaceContainer"></div>