Page MenuHomeIn-Portal Phabricator

in-bulletin
No OneTemporary

File Metadata

Created
Tue, Feb 25, 3:23 AM

in-bulletin

Index: branches/5.1.x/in-bulletin/units/private_messages/private_message_eh.php
===================================================================
--- branches/5.1.x/in-bulletin/units/private_messages/private_message_eh.php (revision 12148)
+++ branches/5.1.x/in-bulletin/units/private_messages/private_message_eh.php (revision 12149)
@@ -1,249 +1,275 @@
<?php
/**
* @version $Id$
* @package In-Bulletin
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.net/license/ for copyright notices and details.
*/
class PrivateMessageEventHandler extends kDBEventHandler {
function mapPermissions()
{
parent::mapPermissions();
$permissions = Array(
'OnItemBuild' => Array('self' => true),
'OnCreate' => Array('self' => true),
'OnDelete' => Array('self' => true),
+ 'OnPreview' => Array('self' => true),
);
$this->permMapping = array_merge($this->permMapping, $permissions);
}
/**
* Applies folder & message owner filter to message list
*
* @param kEvent $event
*/
function SetCustomQuery(&$event)
{
$folder_id = $this->Application->GetVar('folder_id');
if ($folder_id === false) {
$folder_id = PM_FOLDER_INBOX;
$this->Application->SetVar('folder_id', $folder_id);
}
$object =& $event->getObject();
/* @var $object kDBList */
$user_id = $this->Application->RecallVar('user_id');
if ($folder_id == PM_FOLDER_INBOX) {
$object->addFilter('owner_filter', '%1$s.ToId = '.$user_id);
}
else {
$object->addFilter('owner_filter', '%1$s.FromId = '.$user_id);
}
$object->addFilter('folder_filter', '%1$s.FolderId = '.$folder_id);
}
/**
* Puts message to Sent folder
*
* @param kEvent $event
*/
function OnBeforeItemCreate(&$event)
{
$object =& $event->getObject();
/* @var $object kDBItem */
if ($object->GetDBField('FolderId') != PM_FOLDER_SENT) {
// when creating "Inbox" message (from "Sent" message) don't reset folder & status
return ;
}
$user_id = $this->Application->RecallVar('user_id');
$object->SetDBField('FromId', $user_id);
$object->SetDBField('FolderId', PM_FOLDER_SENT);
$object->SetDBField('Status', PM_STATUS_READ);
}
/**
* Creates 1st post when topic is created
*
* @param kEvent $event
*/
function OnAfterItemCreate(&$event)
{
parent::OnAfterItemCreate($event);
$object =& $event->getObject();
/* @var $object kDBItem */
if ($object->GetDBField('FolderId') != PM_FOLDER_SENT) {
// 1. create message in sender's "Sent" folder (this method only for this step)
// 2. create message body (shared)
// 3. create message copy in recipient's "Inbox" folder
return ;
}
$message_body =& $this->Application->recallObject($event->Prefix.'-body', null, Array ('skip_autoload' => true));
/* @var $message_body kDBItem */
// 1. create message body (for sender & recipient)
$copy_fields = Array ('Subject', 'Body', 'ShowSignatures', 'DisableSmileys', 'DisableBBCodes');
$message_body->SetDBFieldsFromHash($object->GetFieldValues(), $copy_fields);
$body_created = $message_body->Create();
if ($body_created) {
// 2. link body with message
$object->SetDBField('PMBodyId', $message_body->GetID());
$object->Update();
// 3. create message in recipient's Inbox folder
$object->SetDBField('FolderId', PM_FOLDER_INBOX);
$object->SetDBField('Status', PM_STATUS_UNREAD);
$object->Create();
}
}
/**
* Sets post options to virtual fields
*
* @param kEvent $event
*/
function OnAfterItemLoad(&$event)
{
$object =& $event->getObject();
/* @var $object kDBItem */
$post_helper =& $this->Application->recallObject('PostHelper');
/* @var $post_helper PostHelper */
$options_map = $post_helper->getOptionsMap();
$post_options = $object->GetDBField('Options');
foreach ($options_map as $option_name => $field_name) {
$option_value = $post_helper->GetPostOption($option_name, $post_options);
$object->SetDBField($field_name, (int)$option_value);
}
}
/**
* Goes to next_template after post creation
*
* @param kEvent $event
*/
function OnCreate(&$event)
{
parent::OnCreate($event);
if ($event->status == erSUCCESS && !$this->Application->IsAdmin()) {
$event->SetRedirectParam('opener', 's');
$event->redirect = $this->Application->GetVar('next_template');
}
}
/**
* Prevents user from deleting other user private messages
*
* @param kEvent $event
*/
function OnBeforeItemDelete(&$event)
{
$object =& $event->getObject();
/* @var $object kDBItem */
$user_id = $this->Application->RecallVar('user_id');
$owner_field = ($object->GetDBField('FolderId') == PM_FOLDER_INBOX) ? 'ToId' : 'FromId';
if ($object->GetDBField($owner_field) != $user_id) {
$event->status = erFAIL;
}
}
/**
* Updates reference counter in message body record
*
* @param kEvent $event
*/
function OnAfterItemDelete(&$event)
{
$object =& $event->getObject();
/* @var $object kDBItem */
$body_idfield = $this->Application->getUnitOption($event->Prefix.'-body', 'IDField');
$body_table = $this->Application->getUnitOption($event->Prefix.'-body', 'TableName');
$sql = 'UPDATE '.$body_table.'
SET ReferenceCount = ReferenceCount - 1
WHERE '.$body_idfield.' = '.$object->GetDBField('PMBodyId');
$this->Conn->Query($sql);
}
/**
* Sets default values to posting options based on persistent session
*
* @param kEvent $event
*/
function OnAfterConfigRead(&$event)
{
$virtual_fields = $this->Application->getUnitOption($event->Prefix, 'VirtualFields');
$virtual_fields['DisableBBCodes']['default'] = (int)!$this->Application->RecallPersistentVar('bbcode');
$virtual_fields['DisableSmileys']['default'] = (int)!$this->Application->RecallPersistentVar('smileys');
$virtual_fields['ShowSignatures']['default'] = (int)$this->Application->RecallPersistentVar('show_sig');
$this->Application->setUnitOption($event->Prefix, 'VirtualFields', $virtual_fields);
}
/**
* Checks, that current user is recipient or sender of viewed message
*
* @param kEvent $event
* @return bool
*/
function checkItemStatus(&$event)
{
$object =& $event->getObject();
if (!$object->isLoaded()) {
return true;
}
$user_id = $this->Application->RecallVar('user_id');
return ($object->GetDBField('FromId') == $user_id) || ($object->GetDBField('ToId') == $user_id);
}
/**
* Prepares new reply & new message form
*
* @param kEvent $event
*/
function OnNew(&$event)
{
parent::OnNew($event);
$reply_to = $this->Application->GetVar('reply_to');
$user_id = $this->Application->GetVar('user_id');
$object =& $event->getObject();
/* @var $object kDBItem */
if ($reply_to > 0) {
// reply to message
$source_msg =& $this->Application->recallObject($event->Prefix.'.-item', null, Array ('skip_autoload' => true));
/* @var $source_msg kDBItem */
$source_msg->Load($reply_to);
$object->SetDBField('ToId', $source_msg->GetDBField('FromId'));
$object->SetDBField('Subject', 'Re: '.$source_msg->GetDBField('Subject'));
}
elseif ($user_id > 0) {
// send message to any user by id
$object->SetDBField('ToId', $user_id);
}
}
+
+ /**
+ * Allows to preview message, before submitting
+ *
+ * @param kEvent $event
+ */
+ function OnPreview(&$event)
+ {
+ $object =& $event->getObject( Array('skip_autoload' => true) );
+
+ $post_helper =& $this->Application->recallObject('PostHelper');
+ /* @var $post_helper PostHelper */
+
+ $items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) );
+ if ($items_info) {
+ foreach ($items_info as $id => $field_values) {
+ $object->Load($id);
+ $object->SetFieldsFromHash($field_values);
+ $post_helper->calculatePostOptions($object);
+ $object->setID($id);
+ }
+ }
+
+ $event->redirect = false;
+ }
}
?>
\ No newline at end of file
Index: branches/5.1.x/in-bulletin/units/topics/topics_tag_processor.php
===================================================================
--- branches/5.1.x/in-bulletin/units/topics/topics_tag_processor.php (revision 12148)
+++ branches/5.1.x/in-bulletin/units/topics/topics_tag_processor.php (revision 12149)
@@ -1,79 +1,99 @@
<?php
/**
* @version $Id$
* @package In-Bulletin
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.net/license/ for copyright notices and details.
*/
class TopicsTagProcessor extends kCatDBTagProcessor {
function TopicLink($params)
{
return $this->ItemLink($params, 'topic');
}
function ListTopics($params)
{
return $this->PrintList2($params);
}
function PostingLink($params)
{
$item_id = getArrayValue($params, 'posting_id');
if (!$item_id) {
$item_id = $this->Application->GetVar($this->Prefix.'_post_id');
}
$params[$this->Prefix.'_post_id'] = $item_id;
return $this->TopicLink($params);
}
function PostingDeleteLink($params)
{
$params['Action'] = 'bb_post_delete';
return $this->PostingLink($params);
}
/**
* Returns topic replies count
*
* @param Array $params
* @return int
*/
function TopicReplies($params)
{
$object =& $this->getObject($params);
// -1 - don't count post created together with topic
return $object->GetDBField('Posts') ? $object->GetDBField('Posts') - 1 : 0;
}
/**
* Returns topic lock statis
*
* @param Array $params
* @return bool
*/
function IsLocked($params)
{
$object =& $this->getObject($params);
return $object->GetDBField('TopicType') == 0;
}
function LockToggleLink($params)
{
$params[$this->Prefix.'_event'] = 'OnTopicLockToggle';
$params['pass'] = 'm,'.$this->Prefix;
return $this->Application->ProcessParsedTag('m', 'Link', $params);
}
+
+ function PostBody($params)
+ {
+ $object =& $this->getObject($params);
+
+ $post_helper =& $this->Application->recallObject('PostHelper');
+ /* @var $post_helper PostHelper */
+
+ $body = $object->GetDBField('PostingText');
+
+ // 2. parse post body
+ $sub_blocks = Array (
+ 'smileys' => $params['smiley_render_as'],
+ 'bbcode' => $params['bbcode_render_as'],
+ 'quote' => $params['quote_render_as'],
+ );
+ $body = $post_helper->parsePostBody($body, $object->GetDBField('Options'), $sub_blocks);
+
+ return $body;
+ }
}
?>
\ No newline at end of file
Index: branches/5.1.x/in-bulletin/units/topics/topics_event_handler.php
===================================================================
--- branches/5.1.x/in-bulletin/units/topics/topics_event_handler.php (revision 12148)
+++ branches/5.1.x/in-bulletin/units/topics/topics_event_handler.php (revision 12149)
@@ -1,341 +1,381 @@
<?php
/**
* @version $Id$
* @package In-Bulletin
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.net/license/ for copyright notices and details.
*/
class TopicsEventHandler extends kCatDBEventHandler {
+ /**
+ * Allows to override standart permission mapping
+ *
+ */
+ function mapPermissions()
+ {
+ parent::mapPermissions();
+
+ $permissions = Array (
+ 'OnPreview' => Array ('self' => true),
+ );
+
+ $this->permMapping = array_merge($this->permMapping, $permissions);
+ }
/**
* Checks topic lock permission
*
* @param kEvent $event
*/
function CheckPermission(&$event)
{
if ($event->Name == 'OnTopicLockToggle') {
$object =& $event->getObject();
/* @var $object kCatDBItem */
if (!$object->isLoaded()) {
$event->status = erPERM_FAIL;
return false;
}
$category_id = $object->GetDBField('CategoryId');
$perm_status = $this->Application->CheckPermission('TOPIC.LOCK', 0, $category_id);
if (!$perm_status) {
$event->status = erPERM_FAIL;
}
return $perm_status;
}
return parent::CheckPermission($event);
}
/**
* Created url part for this module
*
* @param kEvent $event
*/
function BuildEnv(&$event)
{
$prefix_special = $event->getPrefixSpecial();
$url_params = $event->getEventParam('url_params');
$pass_events = $event->getEventParam('pass_events');
$query_vars = $this->Application->getUnitOption($event->Prefix, 'QueryString');
$event_key = array_search('event', $query_vars);
if ($event_key) {
// pass through event of this prefix
unset($query_vars[$event_key]);
}
if (!getArrayValue($url_params, $prefix_special.'_event')) {
// if empty event, then remove it from url
unset( $url_params[$prefix_special.'_event'] );
}
//if pass events is off and event is not implicity passed
if ( !$pass_events && !isset($url_params[$prefix_special.'_event']) ) {
unset($url_params[$prefix_special.'_event']); // remove event from url if requested
//otherwise it will use value from get_var
}
if (!$query_vars) {
return true;
}
$processed_params = Array();
foreach($query_vars as $index => $var_name) {
//if value passed in params use it, otherwise use current from application
$var_name = $prefix_special.'_'.$var_name;
$processed_params[$var_name] = isset( $url_params[$var_name] ) ? $url_params[$var_name] : $this->Application->GetVar($var_name);
if ( isset($url_params[$var_name]) ) unset( $url_params[$var_name] );
}
$ret = '';
if (!$processed_params[$prefix_special.'_id']) {
if ($processed_params[$prefix_special.'_Page'] == 1) {
// when printing "items" from category, there is 1st page -> nothing from "item prefix" in url
// and auto-guess pass_category will not be added to url
$url_params['pass_category'] = 1;
}
else {
$ret .= $processed_params[$prefix_special.'_Page'].'/';
}
}
if ($processed_params[$prefix_special.'_id']) {
// this allows to fill 3 cache records with one query (see this method for details)
$category_id = isset($url_params['m_cat_id']) ? $url_params['m_cat_id'] : $this->Application->GetVar('m_cat_id');
$category_filename = $this->Application->getFilename('c', $category_id);
// if template is also item template of category, then remove template
$template = getArrayValue($url_params, 't');
$mod_rw_helper =& $this->Application->recallObject('ModRewriteHelper');
/* @var $mod_rw_helper kModRewriteHelper */
$item_template = $mod_rw_helper->GetItemTemplate($category_id, $event->Prefix);
if ($template == $item_template || strtolower($template) == '__default__') {
unset($url_params['t']);
}
// get item's filename
$ret .= 'bb_' . $processed_params[$prefix_special.'_id'].'/';
}
$event->setEventParam('url_params', $url_params);
$event->setEventParam('env_string', mb_strtolower($ret) );
}
/**
* Process mod_rewrite url part left after previous parser
*
* @param kEvent $event
*/
function ParseEnv(&$event)
{
// <module_page>/bb_<item_id>
$url_parts = $event->getEventParam('url_parts');
$vars = $event->getEventParam('vars');
$defaults = Array('id' => 0, 'Page' => 1);
foreach ($defaults as $var_name => $var_value) {
$this->Application->SetVar($event->getPrefixSpecial().'_'.$var_name, $var_value);
$vars[$event->getPrefixSpecial().'_'.$var_name] = $var_value;
}
if (!$url_parts) {
// $event->status = erFAIL;
return false;
}
$ret = '';
$item_id = false;
$url_part = end($url_parts);
if ( is_numeric($url_part) ) {
// match module page
$this->Application->SetVar( $event->getPrefixSpecial() . '_Page', $url_part);
$vars[$event->getPrefixSpecial() . '_Page'] = $url_part;
}
elseif (preg_match('/^bb_([\d]+)$/', $url_part, $regs)) {
// match item's filename
$item_id = $regs[1];
}
if ($item_id !== false) {
$this->Application->SetVar($event->getPrefixSpecial().'_id', $item_id);
$vars[$event->getPrefixSpecial().'_id'] = $item_id;
+ array_pop($url_parts);
}
elseif ($url_part !== 'index') {
// otherwise category/index.html is parsed as /index.tpl
array_unshift($url_parts, $url_part);
$event->status = erFAIL;
}
$event->setEventParam('url_parts', $url_parts);
$event->setEventParam('vars', $vars);
}
/**
* Lock or unlock topic
*
* @param kEvent $event
*/
function OnToggleLock(&$event)
{
$object =& $event->getObject();
$new_type = $object->GetDBField('TopicType') ? 0 : 1;
$object->SetDBField('TopicType', $new_type);
$object->Update();
}
/**
* Cache topic owner
*
* @param kEvent $event
*/
function OnBeforeItemUpdate(&$event)
{
parent::OnBeforeItemUpdate($event);
$this->cacheItemOwner($event, 'OwnerId', 'PostedBy');
}
/**
* Cache topic owner
*
* @param kEvent $event
*/
function OnBeforeItemCreate(&$event)
{
parent::OnBeforeItemCreate($event);
$this->cacheItemOwner($event, 'OwnerId', 'PostedBy');
$object =& $event->getObject();
/* @var $object kCatDBItem */
if (!$object->GetDBField('TodayDate')) {
$object->SetDBField('TodayDate', adodb_date('Y-m-d'));
}
$post_helper =& $this->Application->recallObject('PostHelper');
/* @var $post_helper PostHelper */
$object->SetDBField('TopicText', $post_helper->CensorText( $object->GetDBField('TopicText') ));
}
/**
* Creates 1st post when topic is created
*
* @param kEvent $event
*/
function OnAfterItemCreate(&$event)
{
parent::OnAfterItemCreate($event);
if ($event->Special == '-item') {
// don't create first post when cloning
return ;
}
$object =& $event->getObject();
/* @var $object kDBItem */
$post =& $this->Application->recallObject($event->Prefix.'-post', null, Array ('skip_autoload' => true));
/* @var $post kDBItem */
$post->SetDBField('Pending', $object->GetDBField('Status') == STATUS_ACTIVE ? 0 : 1);
$post->SetDBField('Subject', '');
$post->SetDBField('PostingText', $object->GetDBField('PostingText'));
$post->SetDBField('ShowSignatures', $object->GetDBField('ShowSignatures'));
$post->SetDBField('DisableSmileys', $object->GetDBField('DisableSmileys'));
$post->SetDBField('DisableBBCodes', $object->GetDBField('DisableBBCodes'));
$post->Create();
// need to update category topic count here
}
/**
* Approves 1st post when topic got approved
*
* @param kEvent $event
*/
function OnAfterItemUpdate(&$event)
{
if (!$this->Application->IsAdmin()) {
return ;
}
$object =& $event->getObject();
/* @var $object kCatDBItem */
if ($object->GetDBField('Posts') == 1) {
$post =& $this->Application->recallObject($event->Prefix.'-post', null, Array('skip_autoload' => true));
/* @var $post kDBItem */
$main_status = $object->GetDBField('Status');
$post->Load($object->GetDBField('LastPostId'));
if ($post->isLoaded()) {
$post->SetDBField('Pending', $main_status == STATUS_ACTIVE ? 0 : 1);
$post->Update();
}
}
}
/**
* Makes first post body field non-requered when topic has posts already
*
* @param kEvent $event
*/
function OnAfterItemLoad(&$event)
{
parent::OnAfterItemLoad($event);
$object =& $event->getObject();
/* @var $object kCatDBItem */
if ($object->GetDBField('Posts') > 0 || !$this->Application->IsAdmin()) {
$object->setRequired('PostingText', false);
}
}
/**
* Locks or unlocks topic
*
* @param kEvent $event
*/
function OnTopicLockToggle(&$event)
{
$object =& $event->getObject();
/* @var $object kCatDBItem */
$topic_type = $object->GetDBField('TopicType');
$object->SetDBField('TopicType', $topic_type == 1 ? 0 : 1);
$object->Update();
}
/**
+ * Allows to preview message, before submitting
+ *
+ * @param kEvent $event
+ */
+ function OnPreview(&$event)
+ {
+ $object =& $event->getObject( Array('skip_autoload' => true) );
+
+ $post_helper =& $this->Application->recallObject('PostHelper');
+ /* @var $post_helper PostHelper */
+
+ $items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) );
+ if ($items_info) {
+ foreach ($items_info as $id => $field_values) {
+ $object->Load($id);
+ $object->SetFieldsFromHash($field_values);
+ $post_helper->calculatePostOptions($object);
+ $object->setID($id);
+ }
+ }
+
+ $event->redirect = false;
+ }
+
+ /**
* Sets default values to posting options based on persistent session
*
* @param kEvent $event
*/
function OnAfterConfigRead(&$event)
{
parent::OnAfterConfigRead($event);
$fields = $this->Application->getUnitOption($event->Prefix, 'Fields');
$fields['NotifyOwnerOnChanges']['default'] = (int)$this->Application->RecallPersistentVar('owner_notify');
$this->Application->setUnitOption($event->Prefix, 'Fields', $fields);
$virtual_fields = $this->Application->getUnitOption($event->Prefix, 'VirtualFields');
$virtual_fields['DisableBBCodes']['default'] = (int)!$this->Application->RecallPersistentVar('bbcode');
$virtual_fields['DisableSmileys']['default'] = (int)!$this->Application->RecallPersistentVar('smileys');
$virtual_fields['ShowSignatures']['default'] = (int)$this->Application->RecallPersistentVar('show_sig');
$this->Application->setUnitOption($event->Prefix, 'VirtualFields', $virtual_fields);
}
}
?>
\ No newline at end of file
Index: branches/5.1.x/in-bulletin/units/helpers/post_helper.php
===================================================================
--- branches/5.1.x/in-bulletin/units/helpers/post_helper.php (revision 12148)
+++ branches/5.1.x/in-bulletin/units/helpers/post_helper.php (revision 12149)
@@ -1,417 +1,433 @@
<?php
/**
* @version $Id$
* @package In-Bulletin
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.net/license/ for copyright notices and details.
*/
class PostHelper extends kHelper {
var $postOptionBits = Array (
'show_sig' => 128,
'disable_bbcode' => 64,
'disable_smileys' => 32,
);
/**
* Checks if specific option is set for post
*
* @param string $option_name
* @param Array $options
* @return bool
*/
function GetPostOption($option_name, $options)
{
if (!isset($this->postOptionBits[$option_name])) {
return false;
}
$option_bit = $this->postOptionBits[$option_name];
return ($options & $option_bit) == $option_bit;
}
/**
* Sets given option bit (by name) to post options
*
* @param string $option_name
* @param int $option_value
* @param Array $options
* @return bool
*/
function SetPostOption($option_name, $option_value, &$options)
{
if (!isset($this->postOptionBits[$option_name])) {
return false;
}
$option_bit = $this->postOptionBits[$option_name];
if ($option_value) {
$options |= $option_bit;
}
else {
$options = $options &~ $option_bit;
}
return true;
}
/**
* Returns post options map to virtual field names
*
* @return Array
*/
function getOptionsMap()
{
$options_map = Array (
'show_sig' => 'ShowSignatures',
'disable_smileys' => 'DisableSmileys',
'disable_bbcode' => 'DisableBBCodes',
);
return $options_map;
}
/**
+ * Sets post options field
+ *
+ * @param kDBItem $object
+ */
+ function calculatePostOptions(&$object)
+ {
+ $options_map = $this->getOptionsMap();
+ $post_options = $object->GetDBField('Options');
+ foreach ($options_map as $option_name => $field_name) {
+ $option_value = $object->GetDBField($field_name);
+ $this->SetPostOption($option_name, $option_value, $post_options);
+ }
+ $object->SetDBField('Options', $post_options);
+ }
+
+ /**
* @return void
* @param int $date
* @desc Set any field to category & all it's parent categories
*/
function PropagateCategoryField($category_id, $field_name, $field_value)
{
$id_field = $this->Application->getUnitOption('c', 'IDField');
$table_name = $this->Application->getUnitOption('c', 'TableName');
$sql = 'SELECT ParentPath
FROM '.$table_name.'
WHERE '.$id_field.' = '.$category_id;
$parent_path = $this->Conn->GetOne($sql);
$parent_categories = explode('|', substr($parent_path, 1, -1));
if (!$parent_categories) {
return false;
}
$fields_hash = Array (
$field_name => $field_value,
);
$this->Conn->doUpdate($fields_hash, $table_name, $id_field.' IN ('.implode(',', $parent_categories).')');
}
/**
* Sets today posts count & today date for topic
*
* @param kCatDBItem $object
* @param int $increment_by
*/
function updateTodayPostsCount(&$object, $post_date, $increment_by = 1)
{
$date_now = adodb_date('Y-m-d');
if (adodb_date('Y-m-d', $post_date) != $date_now) {
return ;
}
// last post update date was today or not
$today_posts = ($date_now == $object->GetDBField('TodayDate')) ? $object->GetDBField('TodayPosts') : 0;
$object->SetDBField('TodayDate', $date_now);
$object->SetDBField('TodayPosts', $today_posts + $increment_by);
return $object->Update();
}
function updatePostCount($topic_id, $increment = 1)
{
$id_field = $this->Application->getUnitOption('bb', 'IDField');
$table_name = $this->Application->getUnitOption('bb', 'TableName');
// helps in case, when 2 (or more) users tries to post in same topic at same time
$sql = 'UPDATE '.$table_name.'
SET Posts = Posts '.($increment > 0 ? '+' : '-').' '.abs($increment).'
WHERE '.$id_field.' = '.$topic_id;
$this->Conn->Query($sql);
// returns new value
$sql = 'SELECT Posts
FROM '.$table_name.'
WHERE '.$id_field.' = '.$topic_id;
return $this->Conn->GetOne($sql);
}
/**
* Replaces all special formatting in post before displaing it to user
*
* @param string $post_body
* @param int $post_options bit array of post options
* @param Array $sub_blocks block names for rendering smileys & bbcodes
* @return string
*/
function parsePostBody($post_body, $post_options, $sub_blocks)
{
// 1. escape all html sequences
$post_body = htmlspecialchars($post_body, ENT_NOQUOTES); // don't touch quotes in bbcode attribute values
// 2. replace censored words
$post_body = $this->CensorText($post_body);
// 3. replace bb codes
if (!$this->GetPostOption('disable_bbcode', $post_options)) {
$post_body = $this->replaceBBCodes($post_body, $sub_blocks['bbcode']);
}
// 4. replace smileys
if (!$this->GetPostOption('disable_smileys', $post_options)) {
$post_body = $this->replaceSmileys($post_body, $sub_blocks['smileys']);
}
// 5. add enters (because we don't use HTML in post body)
$post_body = nl2br($post_body);
// 6. replace quoted text
return $this->replacePostQuote($post_body, $sub_blocks['quote']);
}
function replacePostQuote($text, $render_as)
{
if (preg_match('/\[quote id=([\d]+)\](.*)\[\/quote\]/s', $text, $regs)) {
$post =& $this->Application->recallObject('bb-post.-item', null, Array ('skip_autoload' => true));
/* @var $post kDBItem */
$post->Load($regs[1]);
$block_params = Array ('name' => $render_as, 'PrefixSpecial' => 'bb-post.-item', 'Prefix' => 'bb-post', 'Special' => '-item', 'strip_nl' => 2);
$parsed_quote = $this->Application->ParseBlock($block_params);
return str_replace($regs[0], $parsed_quote, $text);
}
return $text;
}
/**
* Replaces bad words with good words (censorship process)
*
* @param string $text
* @return string
*/
function CensorText($text)
{
static $censor_words = null;
if (!isset($censor_words)) {
$sql = 'SELECT Replacement, BadWord
FROM '.TABLE_PREFIX.'Censorship';
$censor_words = $this->Conn->GetCol($sql, 'BadWord');
}
foreach ($censor_words as $replace_from => $replace_to) {
$text = str_replace($replace_from, $replace_to, $text);
}
return $text;
}
function replaceSmileys($text, $smiley_element)
{
static $smileys = null;
if (!isset($smileys)) {
$sql = 'SELECT em.EmotionImage, em.KeyStroke
FROM '.TABLE_PREFIX.'Emoticon em
WHERE em.Enabled = 1
ORDER BY CHAR_LENGTH(em.KeyStroke) DESC';
$smileys = $this->Conn->GetCol($sql, 'KeyStroke');
}
$block_params = Array ('name' => $smiley_element, 'smiley_url' => '#SMILEY_URL#');
$smiley_mask = trim($this->Application->ParseBlock($block_params));
$base_url = rtrim($this->Application->BaseURL(),'/');
foreach ($smileys as $key_stoke => $image_url) {
if (strpos($text, $key_stoke) === false) {
continue;
}
$smiley_html = str_replace('#SMILEY_URL#', $base_url.SMILEYS_PATH.$image_url, $smiley_mask);
$text = str_replace($key_stoke, $smiley_html, $text);
}
return $text;
}
/**
* Sort params by name and then by length
*
* @param string $a
* @param string $b
* @return int
* @access private
*/
function CmpParams($a, $b)
{
list ($a, ) = explode(':', $a);
list ($b, ) = explode(':', $b);
$a_len = strlen($a);
$b_len = strlen($b);
if ($a_len == $b_len) return 0;
return $a_len > $b_len ? -1 : 1;
}
function replaceBBCodes($text, $bbcode_element)
{
// convert phpbb bbcodes to in-bulletin bbcodes
$text = $this->preformatBBCodes($text);
$tags_defs = explode(';', $this->Application->ConfigValue('BBTags')); // 'b:;i:;u:;ul:type|align;font:color|face|size;url:href;img:src|border';
usort($tags_defs, Array (&$this, 'CmpParams'));
foreach($tags_defs as $tag) {
list ($tag_name, $tag_params) = explode(':', $tag);
$tag_params = $tag_params ? array_flip(explode('|', $tag_params)) : 0;
$text = preg_replace('/\['.$tag_name.'(.*)\](.*)\[\/'.$tag_name.' *\]/Uise','$this->checkBBCodeAttribs("'.$tag_name.'",\'$1\',\'$2\',$tag_params);', $text);
}
// additional processing for [url], [*], [img] bbcode
$text = preg_replace('/<url>(.*)<\/url>/Usi','<url href="$1">$1</url>',$text);
$text = preg_replace('/<font>(.*)<\/font>/Usi','$1',$text); // skip empty fonts
$text = str_replace( Array('<url','</url>','[*]'),
Array('<a target="_blank"','</a>','<li>'),
$text);
// bbcode [code]xxx[/code] processing
$text = preg_replace('/\[code\](.*)\[\/code\]/Uise', "\$this->replaceCodeBBCode('$1', '".$bbcode_element."')", $text);
return $text;
}
/**
* Convert phpbb url bbcode to valid in-bulletin's format
*
* @param string $text
* @return string
*/
function preformatBBCodes($text)
{
// 1. urls
$text = preg_replace('/\[url=(.*)\](.*)\[\/url\]/Ui','[url href="$1"]$2[/url]',$text);
$text = preg_replace('/\[url\](.*)\[\/url\]/Ui','[url href="$1"]$1[/url]',$text);
// 2. images
$text = preg_replace('/\[img\](.*)\[\/img\]/Ui','[img src="$1" border="0"][/img]',$text);
// 3. color
$text = preg_replace('/\[color=(.*)\](.*)\[\/color\]/Ui','[font color="$1"]$2[/font]',$text);
// 4. size
$text = preg_replace('/\[size=(.*)\](.*)\[\/size\]/Ui','[font size="$1"]$2[/font]',$text);
// 5. lists
$text = preg_replace('/\[list(.*)\](.*)\[\/list\]/Uis','[ul]$2[/ul]',$text);
// 6. email to link
$text = preg_replace('/\[email\](.*)\[\/email\]/Ui','[url href="mailto:$1"]$1[/url]',$text);
//7. b tag
$text = preg_replace('/\[(b|i|u):(.*)\](.*)\[\/(b|i|u):(.*)\]/Ui','[$1]$3[/$4]',$text);
//8. code tag
$text = preg_replace('/\[code:(.*)\](.*)\[\/code:(.*)\]/Uis','[code]$2[/code]',$text);
return $text;
}
/**
* Removes not allowed params from tag and returns result
*
* @param string $BBCode bbcode to check
* @param string $TagParams params string entered by user
* @param string $TextInside text between opening and closing bbcode tag
* @param string $ParamsAllowed list of allowed parameter names ("|" separated)
* @return string
*/
function checkBBCodeAttribs($BBCode, $TagParams, $TextInside, $ParamsAllowed)
{
// unescape escaped quotes in tag
$TagParams = str_replace('\"', '"', $TagParams);
$TextInside = str_replace('\"', '"', $TextInside);
$params_extracted = preg_match_all('/ +([^=]*)=["\']?([^ "\']*)["\']?/is', $TagParams, $extracted_params, PREG_SET_ORDER);
if ($ParamsAllowed && $params_extracted) {
$ret = Array();
foreach ($extracted_params as $param) {
$param_name = strtolower(trim( $param[1] ));
$param_value = trim($param[2]);
// 1. prevent hacking
if ($BBCode == 'url' && $param_name == 'href') {
if (strpos(strtolower($param_value), 'script:') !== false) {
// script tag found in "href" parameter of "url" bbcode (equals to hacking) -> remove bbcode
return $TextInside;
}
}
// 2. leave only allowed params & remove all not allowed
if (isset($ParamsAllowed[$param_name])) {
$ret[] = $param_name.'="'.$param_value.'"';
}
}
$ret = count($ret) ? ' '.implode(' ', $ret) : '';
return '<'.$BBCode.$ret.'>'.$TextInside.'</'.$BBCode.'>';
}
return '<'.$BBCode.'>'.$TextInside.'</'.$BBCode.'>';
}
function highlightCode($code, $strip_tabs = 0)
{
if ($strip_tabs) {
$code = preg_replace('/(\t){'.$strip_tabs.'}(.*)/', '\\2', $code);
}
$code = str_replace( Array('\\', '/') , Array('_no_match_string_', '_n_m_s_'), $code);
$code = highlight_string('<?php'.$code.'?>', true);
$code = str_replace( Array('_no_match_string_', '_n_m_s_'), Array('\\', '/'), $code);
$code = preg_replace('/&lt;\?(.*)php(.*)\?&gt;/Us', '\\2', $code);
$code = preg_replace('/<code><font color="(.*)">([\r\n]+)/si', '<code><font color="\\1">', $code);
$code = preg_replace('/([\r\n]+)<\/font>([\r\n]+)<\/code>/si', '</font></code>', $code);
return $code;
}
/**
* Replaces [code]php code[/code] bbcode in post
*
* @param string $input_string code line to highlight
* @param string $bbcode_element block name used for bbcode descoration
* @return string
*/
function replaceCodeBBCode($input_string, $bbcode_element)
{
static $bbcode_mask = null;
if (!isset($bbcode_mask)) {
$block_params = Array ('name' => $bbcode_element, 'bb_code' => '#BB_CODE#');
$bbcode_mask = trim($this->Application->ParseBlock($block_params));
}
$input_string = trim( str_replace('\"','"', unhtmlentities($input_string)) );
$input_string = $this->highlightCode($input_string);
$input_string = preg_replace("/\r<br \/>/s", "\r", $input_string); // undo nl2br added in highlighting
$input_string = str_replace('#BB_CODE#', $input_string, $bbcode_mask);
return $input_string;
}
}
?>
\ No newline at end of file
Index: branches/5.1.x/in-bulletin/units/posts/post_eh.php
===================================================================
--- branches/5.1.x/in-bulletin/units/posts/post_eh.php (revision 12148)
+++ branches/5.1.x/in-bulletin/units/posts/post_eh.php (revision 12149)
@@ -1,388 +1,400 @@
<?php
/**
* @version $Id$
* @package In-Bulletin
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.net/license/ for copyright notices and details.
*/
class PostEventHandler extends kDBEventHandler {
/**
* Checks topic-post modify and delete permissions
*
* @param kEvent $event
*/
function CheckPermission(&$event)
{
- $events = Array('OnUpdate', 'OnDelete');
+ $events = Array('OnUpdate', 'OnDelete', 'OnPreview');
if (in_array($event->Name, $events)) {
return true;
}
return parent::CheckPermission($event);
}
/**
* Sets default values
*
* @param kEvent $event
*/
function OnBeforeItemCreate(&$event)
{
$object =& $event->getObject();
/* @var $object kDBItem */
$user_id = $this->Application->RecallVar('user_id');
$now = adodb_mktime();
$object->SetDBField('CreatedById', $user_id);
$object->SetDBField('CreatedOn_date', $now);
$object->SetDBField('CreatedOn_time', $now);
$object->SetDBField('ModifiedById', $user_id);
$object->SetDBField('Modified_date', $now);
$object->SetDBField('Modified_time', $now);
$object->SetDBField('IPAddress', $_SERVER['REMOTE_ADDR']);
$sql = 'SELECT Login
FROM '.TABLE_PREFIX.'PortalUser
WHERE PortalUserId = '.$user_id;
$object->SetDBField('PosterAlias', $this->Conn->GetOne($sql));
- // set post options
$post_helper =& $this->Application->recallObject('PostHelper');
/* @var $post_helper PostHelper */
- $options_map = $post_helper->getOptionsMap();
- $post_options = $object->GetDBField('Options');
- foreach ($options_map as $option_name => $field_name) {
- $option_value = $object->GetDBField($field_name);
- $post_helper->SetPostOption($option_name, $option_value, $post_options);
- }
- $object->SetDBField('Options', $post_options);
+ $post_helper->calculatePostOptions($object);
$table_info = $object->getLinkedInfo($event->Special, true);
$object->SetDBField($table_info['ForeignKey'], $table_info['ParentId']);
}
/**
* Checks if user has permission on post
*
* @param kEvent $event
* @param string $permissions
*/
function checkPostPermission(&$event, $permissions)
{
$object =& $event->getObject();
/* @var $object kDBItem */
$sql = 'SELECT ci.CategoryId, p.CreatedById
FROM '.$object->TableName.' p
LEFT JOIN '.TABLE_PREFIX.'Topic t ON t.TopicId = p.TopicId
LEFT JOIN '.TABLE_PREFIX.'CategoryItems ci ON ci.ItemResourceId = t.ResourceId AND ci.PrimaryCat = 1
WHERE p.'.$object->IDField.' = '.$object->GetID();
$post_info = $this->Conn->GetRow($sql);
$perm_helper =& $this->Application->recallObject('PermissionsHelper');
/* @var $perm_helper kPermissionsHelper */
$is_owner = $post_info['CreatedById'] == $this->Application->RecallVar('user_id');
$params['permissions'] = 'TOPIC.REPLY.MODIFY|TOPIC.REPLY.OWNER.MODIFY';
$params['cat_id'] = $post_info['CategoryId'];
return $perm_helper->TagPermissionCheck($params, $is_owner);
}
/**
* Sets post options before post update
* Ensures, that only user with permission will update topic
*
* @param kEvent $event
*/
function OnBeforeItemUpdate(&$event)
{
$object =& $event->getObject();
/* @var $object kDBItem */
$perm_status = $this->checkPostPermission($event, 'TOPIC.REPLY.MODIFY|TOPIC.REPLY.OWNER.MODIFY');
if (!$perm_status) {
$event->status = erFAIL;
return ;
}
$post_helper =& $this->Application->recallObject('PostHelper');
/* @var $post_helper PostHelper */
- $options_map = $post_helper->getOptionsMap();
- $post_options = $object->GetDBField('Options');
- foreach ($options_map as $option_name => $field_name) {
- $option_value = $object->GetDBField($field_name);
- $post_helper->SetPostOption($option_name, $option_value, $post_options);
- }
- $object->SetDBField('Options', $post_options);
+ $post_helper->calculatePostOptions($object);
}
/**
* Checks, that user can delete post
*
* @param kEvent $event
*/
function OnBeforeItemDelete(&$event)
{
$object =& $event->getObject();
/* @var $object kDBItem */
$perm_status = $this->checkPostPermission($event, 'TOPIC.REPLY.OWNER.DELETE|TOPIC.REPLY.DELETE');
if (!$perm_status) {
$event->status = erFAIL;
}
}
/**
* Sets post options to virtual fields
*
* @param kEvent $event
*/
function OnAfterItemLoad(&$event)
{
$object =& $event->getObject();
/* @var $object kDBItem */
$post_helper =& $this->Application->recallObject('PostHelper');
/* @var $post_helper PostHelper */
$options_map = $post_helper->getOptionsMap();
$post_options = $object->GetDBField('Options');
foreach ($options_map as $option_name => $field_name) {
$option_value = $post_helper->GetPostOption($option_name, $post_options);
$object->SetDBField($field_name, (int)$option_value);
}
}
/**
* Updates cached post counter in topic
*
* @param kEvent $event
*/
function OnAfterItemCreate(&$event)
{
$object =& $event->getObject();
/* @var $object kDBItem */
$parent_prefix = $this->Application->getUnitOption($event->Prefix, 'ParentPrefix');
$main_object =& $this->Application->recallObject($parent_prefix);
/* @var $main_object kCatDBItem */
// update user posts counter
$user_posts = $this->Application->RecallPersistentVar('bb_posts');
$this->Application->StorePersistentVar('bb_posts', $user_posts + 1);
$post_helper =& $this->Application->recallObject('PostHelper');
/* @var $post_helper PostHelper */
$category_id = $this->Application->GetVar('m_cat_id');
$post_helper->PropagateCategoryField($category_id, 'Modified', $object->GetDBField('CreatedOn'));
if (!$this->Application->IsAdmin() && $main_object->GetDBField('Posts')) {
// don't send any email events when in admin OR new topic just added (0 posts)
$user_notified = false; // don't send POST.ADD event twice to same user (in case if owner adds new post)
if ($main_object->GetDBField('NotifyOwnerOnChanges')) {
$user_notified = $main_object->GetDBField('OwnerId');
$this->Application->EmailEventUser('POST.ADD', $user_notified);
}
$post_owner_id = $object->GetDBField('CreatedById');
if (($post_owner_id > 0) && ($user_notified != $post_owner_id)) {
$this->Application->EmailEventUser('POST.ADD', $post_owner_id);
}
$this->Application->EmailEventAdmin('POST.ADD');
}
$post_helper->updateTodayPostsCount($main_object, $object->GetDBField('CreatedOn'), +1);
$this->updateTopicInfo($event, $main_object);
$topic_id = $object->GetDBField('TopicId');
$posts_count = $post_helper->updatePostCount($topic_id, +1);
$main_object->SetDBField('Posts', $posts_count);
// autolock topic after N number of posts (if option enabled)
$auto_lock = $this->Application->ConfigValue('AutoTopicLockPosts');
if ((int)$auto_lock > 0) {
if ($posts_count >= $auto_lock) {
// user has unlocked topic after $auto_lock and posts again -> ensure that topic will be locked again
$this->Application->HandleEvent($parent_prefix.':OnTopicLockToggle');
}
}
}
/**
* Update last post info in topic
*
* @param kEvent $event
* @param kCatDBItem $main_object
*/
function updateTopicInfo(&$event, &$main_object)
{
$object =& $event->getObject();
/* @var $object kDBItem */
$main_object->SetDBField('Modified_date', $object->GetDBField('Modified'));
$main_object->SetDBField('Modified_time', $object->GetDBField('Modified'));
$main_object->SetDBField('LastPostId', $object->GetID());
$main_object->SetDBField('LastPostDate_date', $object->GetDBField('CreatedOn'));
$main_object->SetDBField('LastPostDate_time', $object->GetDBField('CreatedOn'));
$main_object->Update();
}
/**
* Goes to next_template after post creation
*
* @param kEvent $event
*/
function OnCreate(&$event)
{
parent::OnCreate($event);
if ($event->status == erSUCCESS && !$this->Application->IsAdmin()) {
$event->SetRedirectParam('opener', 's');
$event->redirect = $this->Application->GetVar('next_template');
}
}
/**
* Goes to next_template after post editing
*
* @param kEvent $event
*/
function OnUpdate(&$event)
{
parent::OnUpdate($event);
if ($event->status == erSUCCESS && !$this->Application->IsAdmin()) {
$event->SetRedirectParam('opener', 's');
$event->redirect = $this->Application->GetVar('next_template');
$event->SetRedirectParam('pass', 'm,bb');
}
}
/**
+ * Allows to preview message, before submitting
+ *
+ * @param kEvent $event
+ */
+ function OnPreview(&$event)
+ {
+ $object =& $event->getObject( Array('skip_autoload' => true) );
+
+ $post_helper =& $this->Application->recallObject('PostHelper');
+ /* @var $post_helper PostHelper */
+
+ $items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) );
+ if ($items_info) {
+ foreach ($items_info as $id => $field_values) {
+ $object->Load($id);
+ $object->SetFieldsFromHash($field_values);
+ $post_helper->calculatePostOptions($object);
+ $object->setID($id);
+ }
+ }
+
+ $event->redirect = false;
+ }
+
+ /**
* Moves reference to last post in topic, when it is deleted
*
* @param kEvent $event
*/
function OnAfterItemDelete(&$event)
{
$object =& $event->getObject();
/* @var $object kDBItem */
$topic_id = $object->GetDBField('TopicId');
if (!$topic_id) {
// deleting non-existing post
return ;
}
$post_helper =& $this->Application->recallObject('PostHelper');
/* @var $post_helper PostHelper */
// update posts count in topic
$post_helper->updatePostCount($topic_id, -1);
// update post owner posts counter
$sql = 'UPDATE '.TABLE_PREFIX.'PersistantSessionData
SET VariableValue = IF (VariableValue > 0, VariableValue - 1, 0)
WHERE (PortalUserId = '.$object->GetDBField('CreatedById').') AND (VariableName = "bb_posts")';
$this->Conn->Query($sql);
$main_object =& $this->Application->recallObject('bb.-item', null, Array('skip_autoload' => true));
/* @var $main_object kCatDBItem */
$main_object->Load($topic_id);
$post_helper->updateTodayPostsCount($main_object, $object->GetDBField('CreatedOn'), -1);
if ($main_object->GetDBField('LastPostId') == $object->GetID()) {
$sql = 'SELECT PostingId, CreatedOn
FROM '.$object->TableName.'
WHERE TopicId = '.$topic_id.'
ORDER BY PostingId DESC';
$last_post = $this->Conn->GetRow($sql);
$fields_hash = Array (
'LastPostId' => $last_post['PostingId'],
'LastPostDate' => $last_post['CreatedOn'],
);
$this->Conn->doUpdate($fields_hash, $main_object->TableName, $main_object->IDField.' = '.$topic_id);
}
}
/**
* Sets default values to posting options based on persistent session
*
* @param kEvent $event
*/
function OnAfterConfigRead(&$event)
{
$virtual_fields = $this->Application->getUnitOption($event->Prefix, 'VirtualFields');
$virtual_fields['DisableBBCodes']['default'] = (int)!$this->Application->RecallPersistentVar('bbcode');
$virtual_fields['DisableSmileys']['default'] = (int)!$this->Application->RecallPersistentVar('smileys');
$virtual_fields['ShowSignatures']['default'] = (int)$this->Application->RecallPersistentVar('show_sig');
$this->Application->setUnitOption($event->Prefix, 'VirtualFields', $virtual_fields);
}
/**
* Deletes items & preserves clean env
*
* @param kEvent $event
*/
function OnDelete(&$event)
{
parent::OnDelete($event);
if ($event->status == erSUCCESS && !$this->Application->IsAdmin()) {
$parent_prefix = $this->Application->getUnitOption($event->Prefix, 'ParentPrefix');
$event->SetRedirectParam('pass', 'm,'.$parent_prefix);
}
}
/**
* Prepares new reply form
*
* @param kEvent $event
*/
function OnNew(&$event)
{
parent::OnNew($event);
$reply_to = $this->Application->GetVar('reply_to');
if ($reply_to > 0) {
$object =& $event->getObject();
/* @var $object kDBItem */
$source_post =& $this->Application->recallObject($event->Prefix.'.-item', null, Array ('skip_autoload' => true));
/* @var $source_post kDBItem */
$source_post->Load($reply_to);
$object->SetDBField('Subject', 'Re: '.$source_post->GetDBField('Subject'));
$object->SetDBField('PostingText', '[quote id='.$reply_to.']'.$source_post->GetDBField('PostingText').'[/quote]');
}
}
}
?>
\ No newline at end of file
Index: branches/5.1.x/in-bulletin/install/english.lang
===================================================================
--- branches/5.1.x/in-bulletin/install/english.lang (revision 12148)
+++ branches/5.1.x/in-bulletin/install/english.lang (revision 12149)
@@ -1,234 +1,236 @@
<LANGUAGES>
<LANGUAGE PackName="English" Encoding="base64"><DATEFORMAT>m/d/Y</DATEFORMAT><TIMEFORMAT>g:i:s A</TIMEFORMAT><INPUTDATEFORMAT>m/d/Y</INPUTDATEFORMAT><INPUTTIMEFORMAT>g:i:s A</INPUTTIMEFORMAT><DECIMAL>.</DECIMAL><THOUSANDS>,</THOUSANDS><CHARSET>utf-8</CHARSET><UNITSYSTEM>2</UNITSYSTEM>
<PHRASES>
<PHRASE Label="la_col_BadWord" Module="In-Bulletin" Type="1">Q2Vuc29yZWQgV29yZA==</PHRASE>
<PHRASE Label="la_col_CommentedByUser" Module="In-Bulletin" Type="1">VXNlcg==</PHRASE>
<PHRASE Label="la_col_KeyStroke" Module="In-Bulletin" Type="1">S2V5IFN0cm9rZQ==</PHRASE>
<PHRASE Label="la_col_ModifiedDate" Module="In-Bulletin" Type="1">RGF0ZS9UaW1l</PHRASE>
<PHRASE Label="la_col_NumberOfDaysActive" Module="In-Bulletin" Type="1">RGF5cyBBY3RpdmU=</PHRASE>
<PHRASE Label="la_col_PollComment" Module="In-Bulletin" Type="1">Q29tbWVudA==</PHRASE>
<PHRASE Label="la_col_PostedBy" Module="In-Bulletin" Type="1">UG9zdGVy</PHRASE>
<PHRASE Label="la_col_Posts" Module="In-Bulletin" Type="1">UmVwbGllcw==</PHRASE>
<PHRASE Label="la_col_Replacement" Module="In-Bulletin" Type="1">UmVwbGFjZW1lbnQ=</PHRASE>
<PHRASE Label="la_col_TopicText" Module="In-Bulletin" Type="1">VG9waWM=</PHRASE>
<PHRASE Label="la_col_Views" Module="In-Bulletin" Type="1">Vmlld3M=</PHRASE>
<PHRASE Label="la_col_VoteCount" Module="In-Bulletin" Type="1">Vm90ZSBDb3VudA==</PHRASE>
<PHRASE Label="la_event_post.add" Module="In-Bulletin" Type="1">UG9zdCBBZGRlZA==</PHRASE>
<PHRASE Label="la_event_post.modify" Module="In-Bulletin" Type="1">UG9zdCBNb2RpZmllZA==</PHRASE>
<PHRASE Label="la_event_topic.add" Module="In-Bulletin" Type="1">VG9waWMgQWRkZWQ=</PHRASE>
<PHRASE Label="la_fld_AllowComments" Module="In-Bulletin" Type="1">QWxsb3cgQ29tbWVudHM=</PHRASE>
<PHRASE Label="la_fld_AllowMultipleVotings" Module="In-Bulletin" Type="1">QWxsb3cgTXVsdGlwbGUgVm90aW5ncw==</PHRASE>
<PHRASE Label="la_fld_BadWord" Module="In-Bulletin" Type="1">Q2Vuc29yZWQgV29yZA==</PHRASE>
<PHRASE Label="la_fld_cust_bb_ItemTemplate" Module="In-Bulletin" Type="1">VG9waWNzIEl0ZW0gVGVtcGxhdGU=</PHRASE>
<PHRASE Label="la_fld_EndDate" Module="In-Bulletin" Type="1">RW5kIERhdGU=</PHRASE>
<PHRASE Label="la_fld_Image" Module="In-Bulletin" Type="1">SW1hZ2U=</PHRASE>
<PHRASE Label="la_fld_KeyStroke" Module="In-Bulletin" Type="1">S2V5IFN0cm9rZQ==</PHRASE>
<PHRASE Label="la_fld_PostedBy" Module="In-Bulletin" Type="1">UG9zdGVkIEJ5</PHRASE>
<PHRASE Label="la_fld_Question" Module="In-Bulletin" Type="1">UXVlc3Rpb24=</PHRASE>
<PHRASE Label="la_fld_Replacement" Module="In-Bulletin" Type="1">UmVwbGFjZW1lbnQ=</PHRASE>
<PHRASE Label="la_fld_RequireLogin" Module="In-Bulletin" Type="1">UmVxdWlyZSBMb2dpbg==</PHRASE>
<PHRASE Label="la_fld_TopicType" Module="In-Bulletin" Type="1">VG9waWMgTG9ja2Vk</PHRASE>
<PHRASE Label="la_fld_Topic_MaxHotNumber" Module="In-Bulletin" Type="1">TWF4aW11bSBudW1iZXIgb2YgSE9UIHRvcGljcw==</PHRASE>
<PHRASE Label="la_fld_Topic_MinPopRating" Module="In-Bulletin" Type="1">TWluaW11bSByYXRpbmcgdG8gY29uc2lkZXIgdG9waWMgUE9Q</PHRASE>
<PHRASE Label="la_fld_Topic_MinPopVotes" Module="In-Bulletin" Type="1">TWluaW11bSBudW1iZXIgb2YgcG9zdHMgdG8gY29uc2lkZXIgdG9waWMgUE9Q</PHRASE>
<PHRASE Label="la_fld_Views" Module="In-Bulletin" Type="1">Vmlld3M=</PHRASE>
<PHRASE Label="la_In-bulletin" Module="In-Bulletin" Type="1">SW4tYnVsbGV0aW4=</PHRASE>
<PHRASE Label="la_ItemTab_Topics" Module="In-Bulletin" Type="1">VG9waWNz</PHRASE>
<PHRASE Label="la_opt_LastPoster" Module="In-Bulletin" Type="1">TGFzdCBQb3N0ZXI=</PHRASE>
<PHRASE Label="la_opt_LastUpdated" Module="In-Bulletin" Type="1">TGFzdCBVcGRhdGVk</PHRASE>
<PHRASE Label="la_opt_NumberOfPosts" Module="In-Bulletin" Type="1">TnVtYmVyIG9mIFBvc3Rz</PHRASE>
<PHRASE Label="la_opt_TopicText" Module="In-Bulletin" Type="1">VG9waWMgVGV4dA==</PHRASE>
<PHRASE Label="la_opt_TopicViews" Module="In-Bulletin" Type="1">VG9waWMgVmlld3M=</PHRASE>
<PHRASE Label="la_posts_newdays_prompt" Module="In-Bulletin" Type="1">TmV3IHBvc3RzIChkYXlzKQ==</PHRASE>
<PHRASE Label="la_posts_perpage_prompt" Module="In-Bulletin" Type="1">TnVtYmVyIG9mIHBvc3RzIHBlciBwYWdl</PHRASE>
<PHRASE Label="la_posts_subheading" Module="In-Bulletin" Type="1">UG9zdHM=</PHRASE>
<PHRASE Label="la_prompt_ActiveTopics" Module="In-Bulletin" Type="1">QWN0aXZlIFRvcGljcw==</PHRASE>
<PHRASE Label="la_prompt_DupPollComments" Module="In-Bulletin" Type="1">QWxsb3cgRHVwbGljYXRlIENvbW1lbnRz</PHRASE>
<PHRASE Label="la_prompt_EditorsPickTopics" Module="In-Bulletin" Type="1">RWRpdG9yIFBpY2sgVG9waWNz</PHRASE>
<PHRASE Label="la_prompt_HotTopics" Module="In-Bulletin" Type="1">SG90IFRvcGljcw==</PHRASE>
<PHRASE Label="la_prompt_LastUpdatedPostDate" Module="In-Bulletin" Type="1">TGFzdCBVcGRhdGVkIFBvc3QgRGF0ZQ==</PHRASE>
<PHRASE Label="la_prompt_LastUpdatedPostTime" Module="In-Bulletin" Type="1">TGFzdCBVcGRhdGVkIFBvc3QgVGltZQ==</PHRASE>
<PHRASE Label="la_prompt_LastUpdatedTopicDate" Module="In-Bulletin" Type="1">TGFzdCBVcGRhdGVkIFRvcGljIERhdGU=</PHRASE>
<PHRASE Label="la_prompt_LastUpdatedTopicTime" Module="In-Bulletin" Type="1">TGFzdCBVcGRhdGVkIFRvcGljIFRpbWU=</PHRASE>
<PHRASE Label="la_prompt_MaxTopicHits" Module="In-Bulletin" Type="1">VG9waWMgTWF4aW11bSBIaXRz</PHRASE>
<PHRASE Label="la_prompt_MaxTopicVotes" Module="In-Bulletin" Type="1">VG9waWMgTWF4aW11bSBWb3Rlcw==</PHRASE>
<PHRASE Label="la_prompt_NewestPostDate" Module="In-Bulletin" Type="1">TmV3ZXN0IFBvc3QgRGF0ZQ==</PHRASE>
<PHRASE Label="la_prompt_NewestPostTime" Module="In-Bulletin" Type="1">TmV3ZXN0IFBvc3QgVGltZQ==</PHRASE>
<PHRASE Label="la_prompt_NewestTopicDate" Module="In-Bulletin" Type="1">TmV3ZXN0IFRvcGljIERhdGU=</PHRASE>
<PHRASE Label="la_prompt_NewestTopicTime" Module="In-Bulletin" Type="1">TmV3ZXN0IFRvcGljIFRpbWU=</PHRASE>
<PHRASE Label="la_prompt_NewTopics" Module="In-Bulletin" Type="1">TmV3IFRvcGljcw==</PHRASE>
<PHRASE Label="la_prompt_PopularTopics" Module="In-Bulletin" Type="1">UG9wdWxhciBUb3BpY3M=</PHRASE>
<PHRASE Label="la_prompt_PostsToLock" Module="In-Bulletin" Type="1">UG9zdHMgdG8gbG9jaw==</PHRASE>
<PHRASE Label="la_prompt_PostsTotal" Module="In-Bulletin" Type="1">VG90YWwgUG9zdHM=</PHRASE>
<PHRASE Label="la_prompt_TopicAverageRating" Module="In-Bulletin" Type="1">VG9waWNzIEF2ZXJhZ2UgUmF0aW5n</PHRASE>
<PHRASE Label="la_prompt_TopicReviews" Module="In-Bulletin" Type="1">VG90YWwgVG9waWMgQ29tbWVudHM=</PHRASE>
<PHRASE Label="la_prompt_TopicsActive" Module="In-Bulletin" Type="1">QWN0aXZlIFRvcGljcw==</PHRASE>
<PHRASE Label="la_prompt_TopicsDisabled" Module="In-Bulletin" Type="1">RGlzYWJsZWQgVG9waWNz</PHRASE>
<PHRASE Label="la_prompt_TopicsPending" Module="In-Bulletin" Type="1">UGVuZGluZyBUb3BpY3M=</PHRASE>
<PHRASE Label="la_prompt_TopicsTotal" Module="In-Bulletin" Type="1">VG90YWwgVG9waWNz</PHRASE>
<PHRASE Label="la_prompt_TopicsUsers" Module="In-Bulletin" Type="1">VG90YWwgVXNlcnMgd2l0aCBUb3BpY3M=</PHRASE>
<PHRASE Label="la_section_Topic" Module="In-Bulletin" Type="1">VG9waWM=</PHRASE>
<PHRASE Label="la_tab_ConfigCensorship" Module="In-Bulletin" Type="1">Q2Vuc29yc2hpcA==</PHRASE>
<PHRASE Label="la_tab_ConfigSmileys" Module="In-Bulletin" Type="1">U21pbGV5cw==</PHRASE>
<PHRASE Label="la_tab_PollAnswers" Module="In-Bulletin" Type="1">QW5zd2Vycw==</PHRASE>
<PHRASE Label="la_tab_PollUserComments" Module="In-Bulletin" Type="1">VXNlciBDb21tZW50cw==</PHRASE>
<PHRASE Label="la_tab_Topics" Module="In-Bulletin" Type="1">VG9waWNz</PHRASE>
<PHRASE Label="la_Text_Polls" Module="In-Bulletin" Type="1">UG9sbCBTZXR0aW5ncw==</PHRASE>
<PHRASE Label="la_Text_Topic" Module="In-Bulletin" Type="1">VG9waWM=</PHRASE>
<PHRASE Label="la_Text_Topics" Module="In-Bulletin" Type="1">VG9waWNz</PHRASE>
<PHRASE Label="la_title_AddingCensorship" Module="In-Bulletin" Type="1">QWRkaW5nIENlbnNvcnNoaXA=</PHRASE>
<PHRASE Label="la_title_AddingSmiley" Module="In-Bulletin" Type="1">QWRkaW5nIFNtaWxleQ==</PHRASE>
<PHRASE Label="la_title_AddingTopic" Module="In-Bulletin" Type="1">QWRkaW5nIFRvcGlj</PHRASE>
<PHRASE Label="la_title_Adding_Poll" Module="In-Bulletin" Type="1">QWRkaW5nIFBvbGw=</PHRASE>
<PHRASE Label="la_title_EditingCensorship" Module="In-Bulletin" Type="1">RWRpdGluZyBDZW5zb3JzaGlw</PHRASE>
<PHRASE Label="la_title_EditingSmiley" Module="In-Bulletin" Type="1">RWRpdGluZyBTbWlsZXk=</PHRASE>
<PHRASE Label="la_title_EditingTopic" Module="In-Bulletin" Type="1">RWRpdGluZyBUb3BpYw==</PHRASE>
<PHRASE Label="la_title_Editing_Poll" Module="In-Bulletin" Type="1">RWRpdGluZyBQb2xs</PHRASE>
<PHRASE Label="la_title_In-Bulletin" Module="In-Bulletin" Type="1">VG9waWNz</PHRASE>
<PHRASE Label="la_title_NewPoll" Module="In-Bulletin" Type="1">TmV3IFBvbGw=</PHRASE>
<PHRASE Label="la_title_NewTopic" Module="In-Bulletin" Type="1">TmV3IFRvcGlj</PHRASE>
<PHRASE Label="la_title_PollAnswers" Module="In-Bulletin" Type="1">UG9sbCBBbnN3ZXJz</PHRASE>
<PHRASE Label="la_title_PollComments" Module="In-Bulletin" Type="1">VXNlciBDb21tZW50cw==</PHRASE>
<PHRASE Label="la_title_Polls" Module="In-Bulletin" Type="1">UG9sbHM=</PHRASE>
<PHRASE Label="la_title_Topics" Module="In-Bulletin" Type="1">VG9waWNz</PHRASE>
<PHRASE Label="la_ToolTip_NewTopic" Module="In-Bulletin" Type="1">TmV3IFRvcGlj</PHRASE>
<PHRASE Label="la_ToolTip_New_Answer" Module="In-Bulletin" Type="1">TmV3IEFuc3dlcg==</PHRASE>
<PHRASE Label="la_ToolTip_New_Comment" Module="In-Bulletin" Type="1">TmV3IENvbW1lbnQ=</PHRASE>
<PHRASE Label="la_ToolTip_ResetVotes" Module="In-Bulletin" Type="1">UmVzZXQgVm90ZXM=</PHRASE>
<PHRASE Label="la_topic_editorpicksabove_prompt" Module="In-Bulletin" Type="1">RGlzcGxheSBlZGl0b3IgcGlja3MgYWJvdmUgcmVndWxhciB0b3BpY3M=</PHRASE>
<PHRASE Label="la_topic_newdays_prompt" Module="In-Bulletin" Type="1">TmV3IFRvcGljcyAoRGF5cyk=</PHRASE>
<PHRASE Label="la_topic_perpage_prompt" Module="In-Bulletin" Type="1">TnVtYmVyIG9mIHRvcGljcyBwZXIgcGFnZQ==</PHRASE>
<PHRASE Label="la_topic_perpage_short_prompt" Module="In-Bulletin" Type="1">VG9waWNzIFBlciBQYWdlIChTaG9ydGxpc3Qp</PHRASE>
<PHRASE Label="la_topic_sortfield2_prompt" Module="In-Bulletin" Type="1">QW5kIHRoZW4gYnk=</PHRASE>
<PHRASE Label="la_topic_sortfield_prompt" Module="In-Bulletin" Type="1">U29ydCB0b3BpY3MgYnk=</PHRASE>
<PHRASE Label="lu_btn_DeletePost" Module="In-Bulletin" Type="0">RGVsZXRlIFBvc3Q=</PHRASE>
<PHRASE Label="lu_btn_LockTopic" Module="In-Bulletin" Type="0">TG9jayBUb3BpYw==</PHRASE>
<PHRASE Label="lu_btn_ModifyPost" Module="In-Bulletin" Type="0">TW9kaWZ5IFBvc3Q=</PHRASE>
<PHRASE Label="lu_btn_NewPrivateMessage" Module="In-Bulletin" Type="0">TmV3IFByaXZhdGUgTWVzc2FnZQ==</PHRASE>
<PHRASE Label="lu_btn_newtopic" Module="In-Bulletin" Type="0">TmV3IHRvcGlj</PHRASE>
+ <PHRASE Label="lu_btn_Preview" Module="In-Bulletin" Type="0">UHJldmlldw==</PHRASE>
<PHRASE Label="lu_btn_RateThisTopic" Module="In-Bulletin" Type="0">UmF0ZSBUb3BpYw==</PHRASE>
<PHRASE Label="lu_btn_Reply" Module="In-Bulletin" Type="0">UmVwbHk=</PHRASE>
<PHRASE Label="lu_btn_ReplyQuoted" Module="In-Bulletin" Type="0">UmVwbHkgUXVvdGVk</PHRASE>
<PHRASE Label="lu_btn_SendMessage" Module="In-Bulletin" Type="0">U2VuZCBQcml2YXRlIE1lc3NhZ2U=</PHRASE>
<PHRASE Label="lu_btn_UnlockTopic" Module="In-Bulletin" Type="0">VW5sb2NrIFRvcGlj</PHRASE>
<PHRASE Label="lu_btn_ViewYourProfile" Module="In-Bulletin" Type="0">VmlldyBZb3VyIFByb2ZpbGU=</PHRASE>
<PHRASE Label="lu_btn_Vote" Module="In-Bulletin" Type="0">Vm90ZQ==</PHRASE>
<PHRASE Label="lu_col_Author" Module="In-Bulletin" Type="0">QXV0aG9y</PHRASE>
<PHRASE Label="lu_col_Created" Module="In-Bulletin" Type="0">RGF0ZQ==</PHRASE>
<PHRASE Label="lu_col_Forums" Module="In-Bulletin" Type="0">Rm9ydW1z</PHRASE>
<PHRASE Label="lu_col_FromName" Module="In-Bulletin" Type="0">RnJvbQ==</PHRASE>
<PHRASE Label="lu_col_LastPost" Module="In-Bulletin" Type="0">TGFzdCBQb3N0</PHRASE>
<PHRASE Label="lu_col_Poster" Module="In-Bulletin" Type="0">UG9zdGVy</PHRASE>
<PHRASE Label="lu_col_Posts" Module="In-Bulletin" Type="0">UG9zdHM=</PHRASE>
<PHRASE Label="lu_col_Replies" Module="In-Bulletin" Type="0">UmVwbGllcw==</PHRASE>
<PHRASE Label="lu_col_Subject" Module="In-Bulletin" Type="0">U3ViamVjdA==</PHRASE>
<PHRASE Label="lu_col_ToName" Module="In-Bulletin" Type="0">VG8=</PHRASE>
<PHRASE Label="lu_col_Topics" Module="In-Bulletin" Type="0">VG9waWNz</PHRASE>
<PHRASE Label="lu_DeletePostConfirm" Module="In-Bulletin" Type="0">QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgcG9zdD8NClRoaXMgYWN0aW9uIGNhbm5vdCBiZSB1bmRvbmUu</PHRASE>
<PHRASE Label="lu_DeletePrivateMessageConfirm" Module="In-Bulletin" Type="0">QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgcHJpdmF0ZSBtZXNzYWdlPyBUaGlzIGFjdGlvbiBjYW5ub3QgYmUgdW5kb25lLg==</PHRASE>
<PHRASE Label="lu_DeleteTopicConfirm" Module="In-Bulletin" Type="0">QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgdG9waWM/IFRoaXMgYWN0aW9uIGNhbm5vdCBiZSB1bmRvbmUu</PHRASE>
<PHRASE Label="lu_description_MyTopics" Module="In-Bulletin" Type="0">TWFuYWdlIHlvdXIgVG9waWNzIGhlcmU=</PHRASE>
<PHRASE Label="lu_field_lastpostid" Module="In-Bulletin" Type="2">TGFzdCBQb3N0IElE</PHRASE>
<PHRASE Label="lu_field_postedby" Module="In-Bulletin" Type="2">UG9zdGVkIEJ5</PHRASE>
<PHRASE Label="lu_field_posts" Module="In-Bulletin" Type="0">VG9waWMgUG9zdHM=</PHRASE>
<PHRASE Label="lu_field_topicid" Module="In-Bulletin" Type="2">VG9waWMgSUQ=</PHRASE>
<PHRASE Label="lu_field_topictext" Module="In-Bulletin" Type="2">VG9waWMgVGV4dA==</PHRASE>
<PHRASE Label="lu_field_topictype" Module="In-Bulletin" Type="0">VG9waWMgVHlwZQ==</PHRASE>
<PHRASE Label="lu_fld_Author" Module="In-Bulletin" Type="0">QXV0aG9y</PHRASE>
<PHRASE Label="lu_fld_DisableBBCodes" Module="In-Bulletin" Type="0">RElzYWJsZSBCQiBjb2Rlcw==</PHRASE>
<PHRASE Label="lu_fld_DisableSmileys" Module="In-Bulletin" Type="0">RGlzYWJsZSBzbWlsZXlz</PHRASE>
<PHRASE Label="lu_fld_EnableBBCodes" Module="In-Bulletin" Type="0">RW5hYmxlIEJCIENvZGVz</PHRASE>
<PHRASE Label="lu_fld_EnableSmileys" Module="In-Bulletin" Type="0">RW5hYmxlIFNtaWxleXM=</PHRASE>
<PHRASE Label="lu_fld_From" Module="In-Bulletin" Type="0">RnJvbQ==</PHRASE>
<PHRASE Label="lu_fld_MessageBody" Module="In-Bulletin" Type="0">TWVzc2FnZQ==</PHRASE>
<PHRASE Label="lu_fld_MySignature" Module="In-Bulletin" Type="0">U2lnbmF0dXJl</PHRASE>
<PHRASE Label="lu_fld_NotifyOnPrivateMessages" Module="In-Bulletin" Type="0">Tm90aWZ5IGFib3V0IFByaXZhdGUgTWVzc2FnZXM=</PHRASE>
<PHRASE Label="lu_fld_NotifyOwnerOnChanges" Module="In-Bulletin" Type="0">Tm90aWZ5IG1lIGFib3V0IHJlcGxpZXM=</PHRASE>
<PHRASE Label="lu_fld_PostsPerPage" Module="In-Bulletin" Type="0">UG9zdHMgcGVyIHBhZ2U=</PHRASE>
<PHRASE Label="lu_fld_ShowOtherSignatures" Module="In-Bulletin" Type="0">U2hvdyBTaWduYXR1cmVz</PHRASE>
<PHRASE Label="lu_fld_ShowSignatures" Module="In-Bulletin" Type="0">U2hvdyBzaWduYXR1cmU=</PHRASE>
<PHRASE Label="lu_fld_Subject" Module="In-Bulletin" Type="0">U3ViamVjdA==</PHRASE>
<PHRASE Label="lu_fld_To" Module="In-Bulletin" Type="0">VG8=</PHRASE>
<PHRASE Label="lu_fld_TopicsPerPage" Module="In-Bulletin" Type="0">VG9waWNzIHBlciBwYWdl</PHRASE>
<PHRASE Label="lu_folder_Sent" Module="In-Bulletin" Type="0">U2VudA==</PHRASE>
<PHRASE Label="lu_forums" Module="In-Bulletin" Type="0">Rm9ydW1z</PHRASE>
<PHRASE Label="lu_forum_locked_for_posting" Module="In-Bulletin" Type="0">Rm9ydW0gaXMgbG9ja2VkIGZvciBwb3N0aW5n</PHRASE>
<PHRASE Label="lu_LockedTopic" Module="In-Bulletin" Type="0">TG9ja2VkIFRvcGlj</PHRASE>
<PHRASE Label="lu_MessageCreated" Module="In-Bulletin" Type="0">RGF0ZQ==</PHRASE>
+ <PHRASE Label="lu_MessagePreview" Module="In-Bulletin" Type="0">TWVzc2FnZSBQcmV2aWV3</PHRASE>
<PHRASE Label="lu_MyTopics" Module="In-Bulletin" Type="0">TXkgVG9waWNz</PHRASE>
<PHRASE Label="lu_NewTopic" Module="In-Bulletin" Type="0">TmV3IFRvcGlj</PHRASE>
<PHRASE Label="lu_newtopic_confirm_pending_text" Module="In-Bulletin" Type="0">VGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yIG11c3QgYXBwcm92ZSB5b3VyIHRvcGljIGJlZm9yZSBpdCBpcyBwdWJsaWNseSBhdmFpbGFibGUu</PHRASE>
<PHRASE Label="lu_newtopic_confirm_text" Module="In-Bulletin" Type="0">VGhlIFRvcGljIHlvdSBoYXZlIGNyZWF0ZWQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHN5c3RlbQ==</PHRASE>
<PHRASE Label="lu_new_posts" Module="In-Bulletin" Type="0">Rm9ydW0gaGFzIG5ldyBwb3N0cw==</PHRASE>
<PHRASE Label="lu_NoPrivateMessages" Module="In-Bulletin" Type="0">Tm8gbWVzc2FnZXM=</PHRASE>
<PHRASE Label="lu_NoSubject" Module="In-Bulletin" Type="0">bm8gc3ViamVjdA==</PHRASE>
<PHRASE Label="lu_NoTopics" Module="In-Bulletin" Type="0">Tm8gVG9waWNz</PHRASE>
<PHRASE Label="lu_no_new_posts" Module="In-Bulletin" Type="0">Rm9ydW0gaGFzIG5vIG5ldyBwb3N0cw==</PHRASE>
<PHRASE Label="lu_opt_MessageRead" Module="In-Bulletin" Type="0">UmVhZA==</PHRASE>
<PHRASE Label="lu_opt_MessageReplied" Module="In-Bulletin" Type="0">UmVwbGllZA==</PHRASE>
<PHRASE Label="lu_opt_MessageSent" Module="In-Bulletin" Type="0">U2VudA==</PHRASE>
<PHRASE Label="lu_opt_MessageUnread" Module="In-Bulletin" Type="0">VW5yZWFk</PHRASE>
<PHRASE Label="lu_opt_MessageViewed" Module="In-Bulletin" Type="0">Vmlld2Vk</PHRASE>
<PHRASE Label="lu_PermName_Topic.Add.Pending_desc" Module="In-Bulletin" Type="0">QWRkIFBlbmRpbmcgVG9waWM=</PHRASE>
<PHRASE Label="lu_PermName_Topic.Add_desc" Module="In-Bulletin" Type="0">QWRkIFRvcGlj</PHRASE>
<PHRASE Label="lu_PermName_Topic.Delete_desc" Module="In-Bulletin" Type="0">RGVsZXRlIFRvcGlj</PHRASE>
<PHRASE Label="lu_PermName_Topic.Lock_desc" Module="In-Bulletin" Type="1">TG9jay9VbmxvY2sgVG9waWNz</PHRASE>
<PHRASE Label="lu_PermName_Topic.Modify.Pending_desc" Module="In-Bulletin" Type="1">TW9kaWZ5IFRvcGljIFBlbmRpbmc=</PHRASE>
<PHRASE Label="lu_PermName_Topic.Modify_desc" Module="In-Bulletin" Type="0">TW9kaWZ5IFRvcGlj</PHRASE>
<PHRASE Label="lu_PermName_Topic.Owner.Delete_desc" Module="In-Bulletin" Type="1">VG9waWMgT3duZXIgRGVsZXRl</PHRASE>
<PHRASE Label="lu_PermName_Topic.Owner.Modify.Pending_desc" Module="In-Bulletin" Type="1">T3duZXIgTW9kaWZ5IFRvcGljIFBlbmRpbmc=</PHRASE>
<PHRASE Label="lu_PermName_Topic.Owner.Modify_desc" Module="In-Bulletin" Type="1">VG9waWMgT3duZXIgTW9kaWZ5</PHRASE>
<PHRASE Label="lu_PermName_Topic.Rate_desc" Module="In-Bulletin" Type="0">UmF0ZSBUb3BpYw==</PHRASE>
<PHRASE Label="lu_PermName_Topic.Reply.Add_desc" Module="In-Bulletin" Type="0">QWRkIFRvcGljIFJlcGx5</PHRASE>
<PHRASE Label="lu_PermName_Topic.Reply.Delete_desc" Module="In-Bulletin" Type="0">RGVsZXRlIFRvcGlj</PHRASE>
<PHRASE Label="lu_PermName_Topic.Reply.Modify_desc" Module="In-Bulletin" Type="0">UmVwbHkgVG9waWMgTW9kaWZ5</PHRASE>
<PHRASE Label="lu_PermName_Topic.Reply.Owner.Delete_desc" Module="In-Bulletin" Type="1">UG9zdCBPd25lciBEZWxldGU=</PHRASE>
<PHRASE Label="lu_PermName_Topic.Reply.Owner.Modify_desc" Module="In-Bulletin" Type="1">UG9zdCBPd25lciBNb2RpZnk=</PHRASE>
<PHRASE Label="lu_PermName_Topic.Reply.View_desc" Module="In-Bulletin" Type="0">VmlldyBUb3BpYyBSZXBseQ==</PHRASE>
<PHRASE Label="lu_PermName_Topic.Review_desc" Module="In-Bulletin" Type="1">Q29tbWVudCBUb3BpYw==</PHRASE>
<PHRASE Label="lu_PermName_Topic.View_desc" Module="In-Bulletin" Type="0">VmlldyBUb3BpYw==</PHRASE>
<PHRASE Label="lu_posted" Module="In-Bulletin" Type="0">UG9zdGVk</PHRASE>
<PHRASE Label="lu_posts" Module="In-Bulletin" Type="0">cG9zdHM=</PHRASE>
<PHRASE Label="lu_PrivateMessages" Module="In-Bulletin" Type="0">UHJpdmF0ZSBNZXNzYWdlcw==</PHRASE>
<PHRASE Label="lu_tab_Forums" Module="In-Bulletin" Type="0">Rm9ydW1z</PHRASE>
<PHRASE Label="lu_text_AlreadyVoted" Module="In-Bulletin" Type="0">QWxyZWFkeSB2b3RlZCE=</PHRASE>
<PHRASE Label="lu_text_GuestsLoginToVote" Module="In-Bulletin" Type="0">UGxlYXNlIGxvZ2luIHRvIHZvdGUh</PHRASE>
<PHRASE Label="lu_text_modifytopicconfirm" Module="In-Bulletin" Type="0">VGhhbmsgeW91IGZvciB1cGRhdGluZyB5b3VyIHRvcGljLg==</PHRASE>
<PHRASE Label="lu_text_modifytopicpendingconfirm" Module="In-Bulletin" Type="0">VGhhbmsgeW91IGZvciB1cGRhdGluZyB5b3VyIHRvcGljLiBZb3VyIG1vZGlmaWNhdGlvbnMgYXJlIHBlbmRpbmcgZm9yIGFkbWluaXN0cmF0aXZlIGFwcHJvdmFsLg==</PHRASE>
<PHRASE Label="lu_text_MyTopics" Module="In-Bulletin" Type="0">TXkgVG9waWNz</PHRASE>
<PHRASE Label="lu_text_nomodifytopicpermission" Module="In-Bulletin" Type="0">Tm8gcGVybWlzc2lvbnMgdG8gbW9kaWZ5IHRoaXMgdG9waWM=</PHRASE>
<PHRASE Label="lu_text_nonewtopicpermission" Module="In-Bulletin" Type="0">Tm8gcGVybWlzc2lvbnMgdG8gc3VibWl0IGEgbmV3IHRvcGljIGludG8gdGhlIGN1cnJlbnQgY2F0ZWdvcnku</PHRASE>
<PHRASE Label="lu_text_nonewtopicreplypermission" Module="In-Bulletin" Type="0">Tm8gcGVybWlzc2lvbnMgdG8gcmVwbHkgaW4gdGhpcyB0b3BpYw==</PHRASE>
<PHRASE Label="lu_text_notopicpostmodifypermission" Module="In-Bulletin" Type="0">Tm8gcGVybWlzc2lvbnMgdG8gbW9kaWZ5IHRoaXMgcG9zdC4=</PHRASE>
<PHRASE Label="lu_text_notopicreplyviewpermission" Module="In-Bulletin" Type="0">Tm8gcGVybWlzc2lvbnMgdG8gdmlldyByZXBsaWVzIGZvciB0aGlzIHRvcGljLg==</PHRASE>
<PHRASE Label="lu_title_AddComment" Module="In-Bulletin" Type="0">QWRkaW5nIENvbW1lbnQ=</PHRASE>
<PHRASE Label="lu_title_addprivatemessageconfirm" Module="In-Bulletin" Type="0">UHJpdmF0ZSBNZXNzYWdlIFNlbnQ=</PHRASE>
<PHRASE Label="lu_title_addtopicconfirm" Module="In-Bulletin" Type="0">TmV3IFRvcGljIEFkZGVk</PHRASE>
<PHRASE Label="lu_title_addtopicpendingconfirm" Module="In-Bulletin" Type="0">TmV3IFRvcGljIFBlbmRpbmc=</PHRASE>
<PHRASE Label="lu_title_favoritetopics" Module="In-Bulletin" Type="0">RmF2b3JpdGUgVG9waWNz</PHRASE>
<PHRASE Label="lu_title_ModifyTopicConfirm" Module="In-Bulletin" Type="0">VG9waWMgTW9kaWZpY2F0aW9uIENvbmZpcm1hdGlvbg==</PHRASE>
<PHRASE Label="lu_title_ModifyTopicPendingConfirm" Module="In-Bulletin" Type="0">VG9waWMgUGVuZGluZyBNb2RpZmljYXRpb24gQ29uZmlybWF0aW9u</PHRASE>
<PHRASE Label="lu_title_NewPrivateMessage" Module="In-Bulletin" Type="0">TmV3IFByaXZhdGUgTWVzc2FnZQ==</PHRASE>
<PHRASE Label="lu_title_NewTopic" Module="In-Bulletin" Type="0">TmV3IFRvcGlj</PHRASE>
<PHRASE Label="lu_title_NewTopicReply" Module="In-Bulletin" Type="0">UG9zdCBSZXBseQ==</PHRASE>
<PHRASE Label="lu_title_Polls" Module="In-Bulletin" Type="0">UG9sbHM=</PHRASE>
<PHRASE Label="lu_title_PrivateMessageDetails" Module="In-Bulletin" Type="0">UHJpdmF0ZSBNZXNzYWdlIERldGFpbHM=</PHRASE>
<PHRASE Label="lu_title_PrivateMessages" Module="In-Bulletin" Type="0">UHJpdmF0ZSBNZXNzYWdlcw==</PHRASE>
<PHRASE Label="lu_title_TopicPostModify" Module="In-Bulletin" Type="0">TW9kaWZ5IFBvc3Q=</PHRASE>
<PHRASE Label="lu_title_TopicPosts" Module="In-Bulletin" Type="0">VG9waWMgUG9zdHM=</PHRASE>
<PHRASE Label="lu_title_Topics" Module="In-Bulletin" Type="0">VG9waWNz</PHRASE>
<PHRASE Label="lu_title_topicsearchresults" Module="In-Bulletin" Type="0">VG9waWMgU2VhcmNoIFJlc3VsdHM=</PHRASE>
<PHRASE Label="lu_title_ViewComments" Module="In-Bulletin" Type="0">VmlldyBDb21tZW50cw==</PHRASE>
<PHRASE Label="lu_topics" Module="In-Bulletin" Type="0">VG9waWNz</PHRASE>
<PHRASE Label="lu_topicsupdated" Module="In-Bulletin" Type="0">TGFzdCB1cGRhdGVk</PHRASE>
<PHRASE Label="lu_totaltopics" Module="In-Bulletin" Type="0">VG90YWwgdG9waWNz</PHRASE>
</PHRASES>
<EVENTS>
<EVENT MessageType="text" Event="PM.ADD" Type="0">WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogTmV3IFByaXZhdGUgTWVzc2FnZQoKQSBuZXcgcHJpdmF0ZSBtZXNzYWdlIGhhcyBhcnJpdmVkLiA=</EVENT>
<EVENT MessageType="text" Event="POST.ADD" Type="0">WC1Qcmlvcml0eTogMQpYLU1TTWFpbC1Qcmlvcml0eTogSGlnaApYLU1haWxlcjogSW4tUG9ydGFsClN1YmplY3Q6IE5ldyByZXBseSBoYXMgYmVlbiBhZGRlZAoKTmV3IHJlcGx5IGhhcyBiZWVuIGFkZGVkIHRvIG9uZSBvZiB5b3VyIHRvcGljczogPGEgaHJlZj0iPGlucDI6YmJfVG9waWNMaW5rIHRlbXBsYXRlPSJfX2RlZmF1bHRfXyIvPiI+PGlucDI6YmJfRmllbGQgbmFtZT0iVG9waWNUZXh0Ii8+PC9hPg==</EVENT>
<EVENT MessageType="text" Event="POST.ADD" Type="1">WC1Qcmlvcml0eTogMQpYLU1TTWFpbC1Qcmlvcml0eTogSGlnaApYLU1haWxlcjogSW4tUG9ydGFsClN1YmplY3Q6IE5ldyByZXBseSBoYXMgYmVlbiBhZGRlZAoKTmV3IHJlcGx5IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBUb3BpYzogIDxhIGhyZWY9IjxpbnAyOmJiX1RvcGljTGluayB0ZW1wbGF0ZT0iX19kZWZhdWx0X18iLz4iPjxpbnAyOmJiX0ZpZWxkIG5hbWU9IlRvcGljVGV4dCIvPjwvYT4=</EVENT>
<EVENT MessageType="text" Event="POST.MODIFY" Type="1">WC1Qcmlvcml0eTogMQpYLU1TTWFpbC1Qcmlvcml0eTogSGlnaApYLU1haWxlcjogSW4tUG9ydGFsClN1YmplY3Q6IFBvc3QgbW9kaWZpZWQKCkEgcG9zdCBoYXMgYmVlbiBtb2RpZmllZC4=</EVENT>
<EVENT MessageType="text" Event="TOPIC.ADD" Type="1">WC1Qcmlvcml0eTogMQ0KWC1NU01haWwtUHJpb3JpdHk6IEhpZ2gNClgtTWFpbGVyOiBJbi1Qb3J0YWwKU3ViamVjdDogVG9waWMgYWRkZGUKCkEgdG9waWMgaGFzIGJlZW4gYWRkZWQu</EVENT>
</EVENTS>
</LANGUAGE>
</LANGUAGES>
\ No newline at end of file
Index: branches/5.1.x/in-bulletin
===================================================================
--- branches/5.1.x/in-bulletin (revision 12148)
+++ branches/5.1.x/in-bulletin (revision 12149)
Property changes on: branches/5.1.x/in-bulletin
___________________________________________________________________
Added: svn:mergeinfo
## -0,0 +0,1 ##
Merged /in-bulletin/branches/5.0.x/in-bulletin:r12120-12148

Event Timeline