diff options
Diffstat (limited to 'library/ajaxchat/chat/lib/class/AJAXChatTemplate.php')
-rw-r--r-- | library/ajaxchat/chat/lib/class/AJAXChatTemplate.php | 329 |
1 files changed, 329 insertions, 0 deletions
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; + } + +} +?> |