AntonLV 6 лет назад
Родитель
Сommit
1458d961f3
84 измененных файлов с 23578 добавлено и 0 удалено
  1. 51 0
      modules/boonex/notifications/updates/11.0.1_11.0.2/install/config.php
  2. 13 0
      modules/boonex/notifications/updates/11.0.1_11.0.2/install/installer.php
  3. 5 0
      modules/boonex/notifications/updates/11.0.1_11.0.2/install/sql/enable.sql
  4. 513 0
      modules/boonex/notifications/updates/11.0.1_11.0.2/source/classes/BxNtfsModule.php
  5. 411 0
      modules/boonex/notifications/updates/11.0.1_11.0.2/source/classes/BxNtfsTemplate.php
  6. 82 0
      modules/boonex/notifications/updates/11.0.1_11.0.2/source/install/config.php
  7. 163 0
      modules/boonex/notifications/updates/11.0.1_11.0.2/source/install/sql/enable.sql
  8. 51 0
      modules/boonex/oauth2/updates/11.0.0_11.0.1/install/config.php
  9. 13 0
      modules/boonex/oauth2/updates/11.0.0_11.0.1/install/installer.php
  10. 439 0
      modules/boonex/oauth2/updates/11.0.0_11.0.1/source/classes/BxOAuthModule.php
  11. 68 0
      modules/boonex/oauth2/updates/11.0.0_11.0.1/source/install/config.php
  12. 51 0
      modules/boonex/ocean/updates/11.0.0_11.0.1/install/config.php
  13. 26 0
      modules/boonex/ocean/updates/11.0.0_11.0.1/install/installer.php
  14. 53 0
      modules/boonex/ocean/updates/11.0.0_11.0.1/source/data/template/bx_timeline/css/view.less
  15. 35 0
      modules/boonex/ocean/updates/11.0.0_11.0.1/source/data/template/studio/css/forms.css
  16. 35 0
      modules/boonex/ocean/updates/11.0.0_11.0.1/source/data/template/system/css/forms.css
  17. 68 0
      modules/boonex/ocean/updates/11.0.0_11.0.1/source/install/config.php
  18. 51 0
      modules/boonex/organizations/updates/11.0.0_11.0.1/install/config.php
  19. 13 0
      modules/boonex/organizations/updates/11.0.0_11.0.1/install/installer.php
  20. 6 0
      modules/boonex/organizations/updates/11.0.0_11.0.1/install/sql/enable.sql
  21. 88 0
      modules/boonex/organizations/updates/11.0.0_11.0.1/source/classes/BxOrgsModule.php
  22. 152 0
      modules/boonex/organizations/updates/11.0.0_11.0.1/source/install/config.php
  23. 628 0
      modules/boonex/organizations/updates/11.0.0_11.0.1/source/install/sql/enable.sql
  24. 51 0
      modules/boonex/payment/updates/11.0.2_11.0.3/install/config.php
  25. 13 0
      modules/boonex/payment/updates/11.0.2_11.0.3/install/installer.php
  26. 377 0
      modules/boonex/payment/updates/11.0.2_11.0.3/source/classes/BxPaymentCart.php
  27. 70 0
      modules/boonex/payment/updates/11.0.2_11.0.3/source/install/config.php
  28. 51 0
      modules/boonex/persons/updates/11.0.0_11.0.1/install/config.php
  29. 13 0
      modules/boonex/persons/updates/11.0.0_11.0.1/install/installer.php
  30. 4 0
      modules/boonex/persons/updates/11.0.0_11.0.1/install/sql/enable.sql
  31. 152 0
      modules/boonex/persons/updates/11.0.0_11.0.1/source/install/config.php
  32. 528 0
      modules/boonex/persons/updates/11.0.0_11.0.1/source/install/sql/enable.sql
  33. 51 0
      modules/boonex/photos/updates/11.0.1_11.0.2/install/config.php
  34. 13 0
      modules/boonex/photos/updates/11.0.1_11.0.2/install/installer.php
  35. 159 0
      modules/boonex/photos/updates/11.0.1_11.0.2/source/classes/BxPhotosModule.php
  36. 136 0
      modules/boonex/photos/updates/11.0.1_11.0.2/source/install/config.php
  37. 51 0
      modules/boonex/polls/updates/11.0.0_11.0.1/install/config.php
  38. 13 0
      modules/boonex/polls/updates/11.0.0_11.0.1/install/installer.php
  39. 292 0
      modules/boonex/polls/updates/11.0.0_11.0.1/source/classes/BxPollsTemplate.php
  40. 136 0
      modules/boonex/polls/updates/11.0.0_11.0.1/source/install/config.php
  41. 51 0
      modules/boonex/posts/updates/11.0.0_11.0.1/install/config.php
  42. 13 0
      modules/boonex/posts/updates/11.0.0_11.0.1/install/installer.php
  43. 2 0
      modules/boonex/posts/updates/11.0.0_11.0.1/install/sql/install.sql
  44. 150 0
      modules/boonex/posts/updates/11.0.0_11.0.1/source/install/config.php
  45. 555 0
      modules/boonex/posts/updates/11.0.0_11.0.1/source/install/sql/install.sql
  46. 51 0
      modules/boonex/protean/updates/11.0.2_11.0.3/install/config.php
  47. 26 0
      modules/boonex/protean/updates/11.0.2_11.0.3/install/installer.php
  48. 5 0
      modules/boonex/protean/updates/11.0.2_11.0.3/install/sql/install.sql
  49. 30 0
      modules/boonex/protean/updates/11.0.2_11.0.3/source/data/template/bx_timeline/css/view.less
  50. 885 0
      modules/boonex/protean/updates/11.0.2_11.0.3/source/data/template/system/css/default.less
  51. 68 0
      modules/boonex/protean/updates/11.0.2_11.0.3/source/install/config.php
  52. 1131 0
      modules/boonex/protean/updates/11.0.2_11.0.3/source/install/sql/install.sql
  53. 56 0
      modules/boonex/russian/updates/11.0.3_11.0.4/install/config.php
  54. 13 0
      modules/boonex/russian/updates/11.0.3_11.0.4/install/installer.php
  55. 4 0
      modules/boonex/russian/updates/11.0.3_11.0.4/install/langs/bx_accounts/ru.xml
  56. 4 0
      modules/boonex/russian/updates/11.0.3_11.0.4/install/langs/bx_timeline/ru.xml
  57. 15 0
      modules/boonex/russian/updates/11.0.3_11.0.4/install/langs/system/ru.xml
  58. 87 0
      modules/boonex/russian/updates/11.0.3_11.0.4/source/data/langs/bx_accounts/ru.xml
  59. 303 0
      modules/boonex/russian/updates/11.0.3_11.0.4/source/data/langs/bx_timeline/ru.xml
  60. 3146 0
      modules/boonex/russian/updates/11.0.3_11.0.4/source/data/langs/system/ru.xml
  61. 71 0
      modules/boonex/russian/updates/11.0.3_11.0.4/source/install/config.php
  62. 51 0
      modules/boonex/spaces/updates/11.0.0_11.0.1/install/config.php
  63. 13 0
      modules/boonex/spaces/updates/11.0.0_11.0.1/install/installer.php
  64. 225 0
      modules/boonex/spaces/updates/11.0.0_11.0.1/source/classes/BxSpacesConfig.php
  65. 152 0
      modules/boonex/spaces/updates/11.0.0_11.0.1/source/install/config.php
  66. 51 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/install/config.php
  67. 13 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/install/installer.php
  68. 4 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/install/langs/en.xml
  69. 13 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/install/sql/enable.sql
  70. 7 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/install/sql/install.sql
  71. 679 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/source/classes/BxTimelineConfig.php
  72. 319 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/source/classes/BxTimelineFormPost.php
  73. 4144 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/source/classes/BxTimelineModule.php
  74. 2641 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/source/classes/BxTimelineTemplate.php
  75. 135 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/source/install/config.php
  76. 302 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/source/install/langs/en.xml
  77. 416 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/source/install/sql/enable.sql
  78. 501 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/source/install/sql/install.sql
  79. 1100 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/source/js/view.js
  80. 6 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/source/template/block_item_info.html
  81. 867 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/source/template/css/view.css
  82. 72 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/source/template/item_outline.html
  83. 75 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/source/template/item_timeline.html
  84. 1 0
      modules/boonex/timeline/updates/11.0.3_11.0.4/source/template/video_iframe.html

+ 51 - 0
modules/boonex/notifications/updates/11.0.1_11.0.2/install/config.php

@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'title' => 'Notifications',
+    'version_from' => '11.0.1',
+    'version_to' => '11.0.2',
+    'vendor' => 'BoonEx',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/notifications/updates/update_11.0.1_11.0.2/',
+    'home_uri' => 'notifications_update_1101_1102',
+
+    'module_dir' => 'boonex/notifications/',
+    'module_uri' => 'notifications',
+
+    'db_prefix' => 'bx_notifications_',
+    'class_prefix' => 'BxNtfs',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_files' => 1,
+        'update_languages' => 0,
+        'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Notifications',
+
+    /**
+     * Files Section
+     */
+    'delete_files' => array(),
+);

+ 13 - 0
modules/boonex/notifications/updates/11.0.1_11.0.2/install/installer.php

@@ -0,0 +1,13 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+class BxNtfsUpdater extends BxDolStudioUpdater
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+}

+ 5 - 0
modules/boonex/notifications/updates/11.0.1_11.0.2/install/sql/enable.sql

@@ -0,0 +1,5 @@
+SET @sName = 'bx_notifications';
+
+
+-- PAGES
+UPDATE `sys_pages_blocks` SET `active`='0' WHERE `object`='sys_dashboard' AND `title`='_bx_ntfs_page_block_title_view';

+ 513 - 0
modules/boonex/notifications/updates/11.0.1_11.0.2/source/classes/BxNtfsModule.php

@@ -0,0 +1,513 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Notifications Notifications
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+bx_import('BxBaseModNotificationsModule');
+
+define('BX_NTFS_TYPE_OBJECT_OWNER_AND_CONNECTIONS', 'obj_own_and_con');
+define('BX_NTFS_TYPE_DEFAULT', BX_NTFS_TYPE_OBJECT_OWNER_AND_CONNECTIONS);
+
+/**
+ * STYPE - Setting Type:
+ * 1. personal - related to you;
+ * 2. follow_member - related to members you follow;
+ * 3. follow_context - related to contexts you follow;
+ * 4. other - others.
+ */
+define('BX_NTFS_STYPE_PERSONAL', 'personal');
+define('BX_NTFS_STYPE_FOLLOW_MEMBER', 'follow_member');
+define('BX_NTFS_STYPE_FOLLOW_CONTEXT', 'follow_context');
+define('BX_NTFS_STYPE_OTHER', 'other');
+
+/**
+ * SLTMODE - Silent mode:
+ * It is needed for alert sending module to tell that the alert should be ignored 
+ * with Notifications module completely or partially. Available values: 
+ * 1. disabled (value = 0) - all notifications are available;
+ * 2. absolute (value = 1) - alert isn't registered which means that there is no notifications at all;
+ * 3. on-site only (value = 2) - alert is registered. It means that on-site notification is available while the others are disabled.
+ * 4. on-site + email (value = 3) - alert is registered (on-site) and notification via 'email' is enabled.
+ * 5. on-site + push (value = 4) - alert is registered (on-site) and notification via 'push' is enabled.
+ * 
+ * @see BxNtfsResponse::response - 'silent_mode' parameter in Alerts Extras array.
+ */
+define('BX_NTFS_SLTMODE_DISABLED', 0);
+define('BX_NTFS_SLTMODE_ABSOLUTE', 1);
+define('BX_NTFS_SLTMODE_SITE', 2);
+define('BX_NTFS_SLTMODE_SITE_EMAIL', 3);
+define('BX_NTFS_SLTMODE_SITE_PUSH', 4);
+
+class BxNtfsModule extends BxBaseModNotificationsModule
+{
+    /**
+     * Constructor
+     */
+    function __construct($aModule)
+    {
+        parent::__construct($aModule);
+
+        $this->_iOwnerId = $this->getUserId();
+    }
+
+    /**
+     * ACTION METHODS
+     */
+    function actionGetPosts()
+    {
+        $aParams = $this->_prepareParamsGet();
+        $sEvents = $this->_oTemplate->getPosts($aParams);
+
+        echoJson(array('events' => $sEvents));
+    }
+
+    /**
+     * SERVICE METHODS
+     */
+
+    public function serviceGetSafeServices()
+    {
+        return array (
+            'GetBlockView' => '',
+        );
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_notifications Invitations
+     * @subsection bx_notifications-other Other
+     * @subsubsection bx_notifications-get_include get_include
+     * 
+     * @code bx_srv('bx_notifications', 'get_include', [...]); @endcode
+     * 
+     * Get all necessary CSS and JS files to include in a page.
+     *
+     * @return string with all necessary CSS and JS files.
+     * 
+     * @see BxInvModule::serviceGetInclude
+     */
+    /** 
+     * @ref bx_notifications-get_include "get_include"
+     */
+    public function serviceGetInclude($bIncludeCss = true, $mixedIncludeJs = false)
+    {
+        return $this->_oTemplate->getInclude($bIncludeCss, $mixedIncludeJs);
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_notifications Notifications
+     * @subsection bx_notifications-page_blocks Page Blocks
+     * @subsubsection bx_notifications-get_block_settings get_block_settings
+     * 
+     * @code bx_srv('bx_notifications', 'get_block_settings', [...]); @endcode
+     * 
+     * Get Settings block for a separate page.
+     *
+     * @return a string with block content to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxNtfsModule::serviceGetBlockSettings
+     */
+    /** 
+     * @ref bx_notifications-get_block_settings "get_block_settings"
+     */
+    public function serviceGetBlockSettings($sDeliveryType = '', $aParams = array())
+    {
+        if(!isLogged())
+            return '';
+
+        if(empty($sDeliveryType) && bx_get('delivery') !== false)
+            $sDeliveryType = bx_process_input(bx_get('delivery'));
+
+        if(empty($sDeliveryType))
+            $sDeliveryType = BX_BASE_MOD_NTFS_DTYPE_SITE;
+
+        $iUserId = bx_get_logged_profile_id();
+        if(!empty($aParams['user_id']))
+            $iUserId = (int)$aParams['user_id'];
+        else
+            $aParams['user_id'] = $iUserId;
+
+        $this->_oDb->initSettingUser($iUserId);
+
+        return array(
+            'content' => $this->getBlockSettings($sDeliveryType, $aParams),
+        );
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_notifications Notifications
+     * @subsection bx_notifications-page_blocks Page Blocks
+     * @subsubsection bx_notifications-get_block_view get_block_view
+     * 
+     * @code bx_srv('bx_notifications', 'get_block_view', [...]); @endcode
+     * 
+     * Get View block for a separate page. Will return a block with "Empty" message if nothing found.
+     *
+     * @return an array describing a block to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxNtfsModule::serviceGetBlockView
+     */
+    /** 
+     * @ref bx_notifications-get_block_view "get_block_view"
+     */
+    public function serviceGetBlockView($sType = '', $iStart = -1, $iPerPage = -1, $aModules = array())
+    {
+    	$aBrowseTypes = array(BX_NTFS_TYPE_OBJECT_OWNER_AND_CONNECTIONS, BX_BASE_MOD_NTFS_TYPE_CONNECTIONS, BX_BASE_MOD_NTFS_TYPE_OBJECT_OWNER);
+
+    	if(empty($sType)) {
+    		$mixedType = bx_get('type');
+    		if($mixedType !== false && in_array($mixedType, $aBrowseTypes))
+    			$sType = $mixedType;
+
+	    	if(empty($sType))
+    			$sType = BX_NTFS_TYPE_DEFAULT;
+    	}
+
+    	$iOwnerId = $this->getUserId();
+        if(!$iOwnerId)
+            return array('content' => MsgBox(_t('_bx_ntfs_txt_msg_no_results')));
+
+		$aParams = $this->_prepareParams($sType, $iOwnerId, $iStart, $iPerPage, $aModules);
+		$sContent = $this->_oTemplate->getViewBlock($aParams);
+
+		$aParams['browse'] = 'first';
+    	$aEvent = $this->_oDb->getEvents($aParams);
+    	if(!empty($aEvent))
+			$this->_oDb->markAsRead($iOwnerId, $aEvent['id']);
+
+		$sModule = $this->_oConfig->getName();
+		$sJsObject = $this->_oConfig->getJsObject('view');
+
+        return array('content' => $sContent); 
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_notifications Notifications
+     * @subsection bx_notifications-browsing Browsing
+     * @subsubsection bx_notifications-get_event_by_id get_event_by_id
+     * 
+     * @code bx_srv('bx_notifications', 'get_event_by_id', [...]); @endcode
+     * 
+     * Get event's data by event ID.
+     *
+     * @return an array with event's data.
+     * 
+     * @see BxNtfsModule::serviceGetEventById
+     */
+    /** 
+     * @ref bx_notifications-get_event_by_id "get_event_by_id"
+     */
+    public function serviceGetEventById($iId)
+    {
+        $aParams = array(
+            'browse' => 'id',
+            'value' => $iId,
+        );
+    	return $this->_oDb->getEvents($aParams);
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_notifications Notifications
+     * @subsection bx_notifications-other Other
+     * @subsubsection bx_notifications-get_notifications get_notifications
+     * 
+     * @code bx_srv('bx_notifications', 'get_notifications', [...]); @endcode
+     * 
+     * Get notifications by params.
+     *
+     * @return array with notifications.
+     * 
+     * @see BxNtfsModule::serviceGetNotifications
+     */
+    /** 
+     * @ref bx_notifications-get_notifications "get_notifications"
+     */
+    public function serviceGetNotifications($iOwnerId = 0, $aBrowseParams = array())
+    {
+        if(!$iOwnerId)
+            $iOwnerId = $this->getUserId();
+
+        if(!$iOwnerId)
+            return 0;
+
+        $aParams = $this->_prepareParams(BX_NTFS_TYPE_DEFAULT, $iOwnerId);
+        if(!empty($aBrowseParams) && is_array($aBrowseParams))
+            $aParams = array_merge($aParams, $aBrowseParams);
+
+        list($aEvent) = $this->_oDb->getEvents($aParams, true);
+
+        // returns parsed content for React Jot
+        if (!is_array($aBrowseParams) && $aBrowseParams === 'return_parsed_content')
+            foreach ($aEvent as &$aContent)
+                $this->_oTemplate->getPost($aContent, array('return_parsed_content'));
+
+        return $aEvent;
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_notifications Notifications
+     * @subsection bx_notifications-other Other
+     * @subsubsection bx_notifications-get_unread_notifications get_unread_notifications
+     * 
+     * @code bx_srv('bx_notifications', 'get_unread_notifications', [...]); @endcode
+     * 
+     * Get unread notifications.
+     *
+     * @return array with unread notifications.
+     * 
+     * @see BxNtfsModule::serviceGetUnreadNotifications
+     */
+    /** 
+     * @ref bx_notifications-get_unread_notifications "get_unread_notifications"
+     */
+    public function serviceGetUnreadNotifications($iOwnerId = 0)
+    {
+        return $this->serviceGetNotifications($iOwnerId, array('new' => 1));
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_notifications Notifications
+     * @subsection bx_notifications-other Other
+     * @subsubsection bx_notifications-get_unread_notifications_num get_unread_notifications_num
+     * 
+     * @code bx_srv('bx_notifications', 'get_unread_notifications_num', [...]); @endcode
+     * 
+     * Get number of unread notifications.
+     *
+     * @return integer value with number of unread notifications.
+     * 
+     * @see BxNtfsModule::serviceGetUnreadNotificationsNum
+     */
+    /** 
+     * @ref bx_notifications-get_unread_notifications_num "get_unread_notifications_num"
+     */
+    public function serviceGetUnreadNotificationsNum($iOwnerId = 0)
+    {
+        if(!$iOwnerId)
+            $iOwnerId = $this->getUserId();
+
+        if(!$iOwnerId)
+            return 0;
+
+        $aParams = $this->_prepareParams(BX_NTFS_TYPE_DEFAULT, $iOwnerId);
+        $aParams = array_merge($aParams, array(
+            'new' => 1,
+            'count_only' => 1
+        ));
+
+        return (int)$this->_oDb->getEvents($aParams);
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_notifications Notifications
+     * @subsection bx_notifications-other Other
+     * @subsubsection bx_notifications-get_live_updates get_live_updates
+     * 
+     * @code bx_srv('bx_notifications', 'get_live_updates', [...]); @endcode
+     * 
+     * Get data for Live Updates system.
+     *
+     * @return an array with special format.
+     * 
+     * @see BxNtfsModule::serviceGetLiveUpdates
+     */
+    /** 
+     * @ref bx_notifications-get_live_updates "get_live_updates"
+     */
+    public function serviceGetLiveUpdates($aMenuItemParent, $aMenuItemChild, $iCount = 0)
+    {
+        $iOwnerId = $this->getUserId();
+        $iCountNew = $this->serviceGetUnreadNotificationsNum($iOwnerId);
+        if($iCountNew == $iCount)
+			return false;
+
+        return array(
+    		'count' => $iCountNew, // required
+    		'method' => 'bx_menu_show_live_update(oData)', // required
+    		'data' => array(
+    			'code' => BxDolTemplate::getInstance()->parseHtmlByTemplateName('menu_item_addon', array(
+    				'content' => '{count}'
+                )),
+                'mi_parent' => $aMenuItemParent,
+                'mi_child' => $aMenuItemChild
+    		),  // optional, may have some additional data to be passed in JS method provided using 'method' param above.
+    	);
+    }
+
+    /*
+     * COMMON METHODS
+     */
+    public function getBlockSettings($sDeliveryType, $aParams = array())
+    {
+        return $this->_oTemplate->getSettingsBlock($sDeliveryType, $aParams);
+    }
+
+    public function setSubmenu($sSelected)
+    {
+    	$oSubmenuSystem = BxDolMenu::getObjectInstance('sys_site_submenu');
+        if(!$oSubmenuSystem)
+            return;
+
+        $CNF = &$this->_oConfig->CNF;
+
+        $oSubmenuSystem->setObjectSubmenu($CNF['OBJECT_MENU_SUBMENU'], array (
+            'title' => _t('_bx_ntfs'),
+            'link' => BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink($CNF['URL_HOME']),
+            'icon' => '',
+        ));
+
+        $oSubmenuModule = BxDolMenu::getObjectInstance($CNF['OBJECT_MENU_SUBMENU']);
+        if($oSubmenuModule)
+            $oSubmenuModule->setSelected($this->_oConfig->getName(), $sSelected);
+    }
+
+    public function onPost($iId)
+    {
+    	//--- Event -> Post for Alerts Engine ---//
+        $oAlert = new BxDolAlerts($this->_oConfig->getObject('alert'), 'post', $iId);
+        $oAlert->alert();
+        //--- Event -> Post for Alerts Engine ---//
+    }
+
+    public function enableSettingsLike($iId, $bValue, $bAdministration = false)
+    {
+        $aSetting = $this->_oDb->getSetting(array(
+            'by' => $bAdministration ? 'id' : 'tsu_id', 
+            'id' => (int)$iId
+        ));
+        if(empty($aSetting) || !is_array($aSetting))
+            return false;
+
+        $aSettingsIds = $this->_oDb->getSetting(array(
+            'by' => 'group_type_delivery', 
+            'group' => $aSetting['group'], 
+            'delivery' => $aSetting['delivery'], 
+            'type' => $aSetting['type'], 
+            'active' => !$bAdministration
+        ));
+        if(empty($aSettingsIds) || !is_array($aSettingsIds))
+            return false;
+
+        $iUserId = bx_get_logged_profile_id();
+
+        $mixedResult = false;
+        if($bAdministration)
+            $mixedResult =  $this->_oDb->activateSettingById($bValue, $aSettingsIds);
+        else
+            $mixedResult = $this->_oDb->activateSettingByIdUser($bValue, $iUserId, $aSettingsIds);
+
+        return $mixedResult;
+    }
+
+    public function sendNotificationEmail($oProfile, $aNotification)
+    {
+        if(!$oProfile)
+            return false;
+
+        $oAccount = $oProfile->getAccountObject();
+        if(!$oAccount)
+            return false;
+
+        $aSettings = &$aNotification['settings'];
+
+        $sTemplate = !empty($aSettings['template']) ? $aSettings['template'] : 'bx_notifications_new_event';
+        $aTemplateMarkers = array('content' => $aNotification['content']);
+        if(!empty($aSettings['markers']) && is_array($aSettings['markers']))
+            $aTemplateMarkers = array_merge($aTemplateMarkers, $aSettings['markers']);              
+
+        $aTemplate = null;
+        bx_alert($this->_aModule['name'], 'before_parse_email_template', 0, 0, array('profile_id' => $oProfile->id(), 'account_id' => $oAccount->id(), 'template' => $sTemplate, 'markers' => $aTemplateMarkers, 'override_result' => &$aTemplate));
+        if (is_null($aTemplate))
+            $aTemplate = BxDolEmailTemplates::getInstance()->parseTemplate($sTemplate, $aTemplateMarkers, $oAccount->id(), $oProfile->id());
+        if(!$aTemplate)
+            return false;
+
+        $sSubject = !empty($aSettings['subject']) ? $aSettings['subject'] : $aTemplate['Subject'];
+        return sendMail($oAccount->getEmail(), $sSubject, $aTemplate['Body'], 0, array(), BX_EMAIL_NOTIFY, 'html', false, array(), true);
+    }
+
+    public function sendNotificationPush($oProfile, $aNotification)
+    {
+        if(!$oProfile)
+            return false;
+
+        $oAccount = $oProfile->getAccountObject();
+        if(!$oAccount)
+            return false;
+
+        $aContent = &$aNotification['content'];
+        $aSettings = &$aNotification['settings'];
+
+        $sSubject = !empty($aSettings['subject']) ? $aSettings['subject'] : _t('_bx_ntfs_push_new_event_subject', getParam('site_title'));
+        
+        bx_alert($this->_aModule['name'], 'before_send_notification_push', 0, 0, array('profile_id' => $oProfile->id(), 'account_id' => $oAccount->id(), 'content' => &$aContent, 'setting' => &$aSettings, 'subject' => &$sSubject));
+   
+        return BxDolPush::getInstance()->send($oProfile->id(), array(
+            'contents' => array(
+                'en' => $aContent['message']
+            ),
+            'headings' => array(
+                'en' => $sSubject
+            ),
+            'url' => $aContent['url'],
+            'icon' => $aContent['icon']
+        ), true);
+    }
+
+    /*
+     * INTERNAL METHODS
+     */
+    protected function _prepareParams($sType = '', $iOwnerId = 0, $iStart = -1, $iPerPage = -1, $aModules = array())
+    {
+        $aParams = array();
+        $aParams['browse'] = 'list';
+        $aParams['type'] = !empty($sType) ? $sType : BX_NTFS_TYPE_DEFAULT;
+        $aParams['owner_id'] = (int)$iOwnerId != 0 ? $iOwnerId : $this->getUserId();
+        $aParams['start'] = (int)$iStart > 0 ? $iStart : 0;
+        $aParams['per_page'] = (int)$iPerPage > 0 ? $iPerPage : $this->_oConfig->getPerPage();
+        $aParams['modules'] = is_array($aModules) && !empty($aModules) ? $aModules : array();
+        $aParams['last_read'] = $this->_oDb->getLastRead($aParams['owner_id']);
+        $aParams['active'] = 1;
+
+        return $aParams;
+    }
+
+    protected function _prepareParamsGet()
+    {
+        $aParams = array();
+        $aParams['browse'] = 'list';
+
+        $sType = bx_get('type');
+        $aParams['type'] = $sType !== false ? bx_process_input($sType, BX_DATA_TEXT) : BX_NTFS_TYPE_DEFAULT;
+
+        $aParams['owner_id'] = $sType !== false ? bx_process_input(bx_get('owner_id'), BX_DATA_INT) : $this->getUserId();
+
+        $iStart = bx_get('start');
+        $aParams['start'] = $iStart !== false ? bx_process_input($iStart, BX_DATA_INT) : 0;
+
+        $iPerPage = bx_get('per_page');
+        $aParams['per_page'] = $iPerPage !== false ? bx_process_input($iPerPage, BX_DATA_INT) : $this->_oConfig->getPerPage();
+
+        $aModules = bx_get('modules');
+        $aParams['modules'] = $aModules !== false ? bx_process_input($aModules, BX_DATA_TEXT) : array();
+
+        $aParams['active'] = 1;
+
+        return $aParams;
+    }
+}
+
+/** @} */

+ 411 - 0
modules/boonex/notifications/updates/11.0.1_11.0.2/source/classes/BxNtfsTemplate.php

@@ -0,0 +1,411 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Notifications Notifications
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+require_once(BX_DIRECTORY_PATH_INC . "design.inc.php");
+
+class BxNtfsTemplate extends BxBaseModNotificationsTemplate
+{
+    function __construct(&$oConfig, &$oDb)
+    {
+        parent::__construct($oConfig, $oDb);
+    }
+
+    public function getInclude($bIncludeCss = true, $mixedIncludeJs = false)
+    {
+        if($bIncludeCss)
+            $this->getAddedCss();
+
+        $sResult = '';
+        if(is_string($mixedIncludeJs) && !empty($mixedIncludeJs)) {
+            $this->getAddedJs();
+            
+            $sResult = $this->getJsCode($mixedIncludeJs);
+        }
+            
+        return $sResult;
+    }
+
+    public function getViewBlock($aParams)
+    {
+        return $this->parseHtmlByName('block_view.html', array(
+        	'html_id_view_block' => $this->_oConfig->getHtmlIds('view', 'block'),
+        	'html_id_events' => $this->_oConfig->getHtmlIds('view', 'events'),
+            'style_prefix' => $this->_oConfig->getPrefix('style'),
+            'content' => $this->getPosts($aParams),
+            'js_content' => $this->getJsCode('view', array(
+        		'oRequestParams' => array(
+	                'type' => $aParams['type'],
+	                'owner_id' => $aParams['owner_id'],
+	                'start' => $aParams['start'],
+	                'per_page' => $aParams['per_page'],
+	                'modules' => $aParams['modules']
+       			)
+            ))
+        ));
+    }
+
+    public function getSettingsBlock($sDeliveryType, $aParams = array())
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $iUserId = !empty($aParams['user_id']) ? (int)$aParams['user_id'] : bx_get_logged_profile_id();
+        $sGrid = !empty($aParams['grid']) ? $aParams['grid'] : $CNF['OBJECT_GRID_SETTINGS_COMMON'];
+        $oTemplate = !empty($aParams['template']) ? $aParams['template'] : $this;
+
+        $oGrid = BxDolGrid::getObjectInstance($sGrid, $oTemplate);
+        if(!$oGrid)
+            return '';
+
+        $oGrid->setDeliveryType($sDeliveryType);
+        if(method_exists($oGrid, 'setUserId'))
+            $oGrid->setUserId($iUserId);
+
+        return $oGrid->getCode();
+    }
+
+    public function getPosts($aParams)
+    {
+    	$sJsObject = $this->_oConfig->getJsObject('view');
+
+    	$aParamsDb = $aParams;
+    	$aParamsDb['per_page'] = 3 * $aParamsDb['per_page'];
+
+        $aEvents = $this->_oDb->getEvents($aParamsDb);
+        if(empty($aEvents))
+        	return $this->getEmpty();
+
+        $aTmplVarsEvents = array();
+        foreach($aEvents as $aEvent) {
+            $sEvent = $this->getPost($aEvent, $aParams);
+            if(empty($sEvent))
+                continue;
+
+            $aTmplVarsEvents[] = array('event' => $sEvent);
+            if(count($aTmplVarsEvents) >= ($aParams['per_page'] + 1))
+            	break;
+        }
+
+        $oPaginate = new BxTemplPaginate(array(
+        	'start' => $aParams['start'],
+            'per_page' => $aParams['per_page'],
+        	'page_url' => $this->_oConfig->getViewUrl(),
+        	'on_change_page' => $sJsObject . ".changePage(this, {start}, {per_page})"
+        ));
+        $oPaginate->setNumFromDataArray($aTmplVarsEvents);
+
+        return $this->parseHtmlByName('events.html', array(
+        	'style_prefix' => $this->_oConfig->getPrefix('style'),
+        	'bx_repeat:events' => $aTmplVarsEvents,
+        	'paginate' => $oPaginate->getSimplePaginate()
+        ));
+    }
+
+    /**
+     * Enter description here ...
+     * @example Available keys are:
+     * 1. owner_name and owner_link
+     * 2. entry_caption and entry_url
+     * 3. subentry_url and subentry_sample
+     * 
+     */
+    public function getPost(&$aEvent, $aBrowseParams = array())
+    {
+    	$oModule = $this->getModule();
+
+        if(!empty($aEvent['content']) && is_string($aEvent['content']))
+            $aEvent['content'] = unserialize($aEvent['content']);
+
+    	if((int)$aEvent['processed'] == 0)
+            $this->_processContent($aEvent);
+
+        if((int)$aEvent['processed'] == 0 || empty($aEvent['content']))
+            return '';
+
+        $sParamCheck = 'perform_privacy_check';
+        if(!isset($aBrowseParams[$sParamCheck]) || $aBrowseParams[$sParamCheck] === true) {
+            $sParamCheckFor = 'perform_privacy_check_for';
+            $iViewerId = !empty($aBrowseParams[$sParamCheckFor]) ? (int)$aBrowseParams[$sParamCheckFor] : 0;
+
+            $oPrivacyInt = BxDolPrivacy::getObjectInstance($this->_oConfig->getObject('privacy_view'));
+            if(!$oPrivacyInt->check($aEvent['id'], $iViewerId))
+                return '';
+
+            $oPrivacyExt = $oModule->_oConfig->getPrivacyObject($aEvent['type'] . '_' . $aEvent['action']);
+            if($oPrivacyExt !== false && !$oPrivacyExt->check($aEvent['id'], $iViewerId))
+                return '';
+
+            $sSrvModule = $this->_getContentModule($aEvent);
+            $sSrvMethod = 'check_allowed_with_content_for_profile';
+            if($sSrvModule && BxDolRequest::serviceExists($sSrvModule, $sSrvMethod) && BxDolService::call($sSrvModule, $sSrvMethod, array('view', $this->_getContentObjectId($aEvent), $iViewerId)) !== CHECK_ACTION_RESULT_ALLOWED)
+                return '';
+        }
+
+        $bShowRealProfile = !isset($aBrowseParams['show_real_profile']) || $aBrowseParams['show_real_profile'] === true;
+
+        $oOwner = $oModule->getObjectUser($aEvent['owner_id']);
+        if(!$bShowRealProfile && $oOwner instanceof BxDolProfileAnonymous)
+            $oOwner->setShowRealProfile($bShowRealProfile);
+
+        $aEvent['content']['owner_name'] = strmaxtextlen($oOwner->getDisplayName(), $this->_oConfig->getOwnerNameMaxLen());
+        $aEvent['content']['owner_link'] = $oOwner->getUrl();
+        $aEvent['content']['owner_icon'] = $oOwner->getThumb();
+
+        if(!empty($aEvent['content']['entry_caption'])) {
+            $sEntryCaption = bx_process_output($aEvent['content']['entry_caption'], BX_DATA_TEXT);
+            if(get_mb_substr($sEntryCaption, 0, 1) == '_')
+                $sEntryCaption = _t($sEntryCaption);
+
+            $aEvent['content']['entry_caption'] = strmaxtextlen($sEntryCaption, $this->_oConfig->getContentMaxLen());
+        }
+
+        $iObjectOwner = (int)$aEvent['object_owner_id'];
+        if(empty($iObjectOwner) && !empty($aEvent['content']['entry_author']))
+            $iObjectOwner = (int)$aEvent['content']['entry_author'];
+
+        $oObjectOwner = $oModule->getObjectUser($iObjectOwner);
+        if($oObjectOwner) {
+            if(!$bShowRealProfile && $oObjectOwner instanceof BxDolProfileAnonymous)
+                $oObjectOwner->setShowRealProfile($bShowRealProfile);
+
+            $aEvent['content']['object_owner_name'] = strmaxtextlen($oObjectOwner->getDisplayName(), $this->_oConfig->getOwnerNameMaxLen());
+            $aEvent['content']['object_owner_link'] = $oObjectOwner->getUrl();
+            $aEvent['content']['object_owner_icon'] = $oObjectOwner->getThumb();
+        }
+
+        foreach($aEvent['content'] as $sKey => $sValue) {
+            if(!is_string($sValue) || substr($sValue, 0, 1) != '_') 
+                continue;
+
+            $aCallParams = array($sValue);
+
+            $sKeyParams = $sKey . '_params';
+            if(isset($aEvent['content'][$sKeyParams]) && is_array($aEvent['content'][$sKeyParams])) {
+                foreach($aEvent['content'][$sKeyParams] as $iParamIndex => $sParamValue)
+                    if(is_string($sParamValue) && substr($sParamValue, 0, 1) == '_')
+                        $aEvent['content'][$sKeyParams][$iParamIndex] = _t($sParamValue);
+
+                $aCallParams = array_merge($aCallParams, $aEvent['content'][$sKeyParams]);
+                unset($aEvent['content'][$sKeyParams]);
+            }
+
+            $aEvent['content'][$sKey] = call_user_func_array('_t', $aCallParams);
+        }
+
+    	$bEventParsed = false;
+        bx_alert($this->_oConfig->getName(), 'get_notification', 0, 0, array('event' => &$aEvent, 'event_parsed' => &$bEventParsed, 'owner' => &$oOwner));
+        if(!$bEventParsed) {
+            $mLk = '';
+            if(!empty($aEvent['content']['lang_key'])) {
+                $mLk = $aEvent['content']['lang_key'];
+                if(!is_string($mLk) && !(is_array($mLk) && isset($mLk['site'], $mLk['email'], $mLk['push'])))
+                    $mLk = '';
+            }
+
+            if(empty($mLk))
+                $mLk = $this->_getContentLangKey($aEvent);
+
+            if(is_array($mLk))
+                foreach($mLk as $sDeliveryType => $sLangKey)
+                    $aEvent['content_parsed'][$sDeliveryType] = $this->_parseContentLangKey($sLangKey, $aEvent);
+            else
+                $aEvent['content_parsed'] = $this->_parseContentLangKey($mLk, $aEvent);
+        }
+
+        // returns parsed content for React Jot
+        if(isset($aBrowseParams['return_parsed_content']))
+            return $aEvent;
+
+        return $this->parseHtmlByName('event.html', array (
+            'html_id' => $this->_oConfig->getHtmlIds('view', 'event') . $aEvent['id'],
+            'style_prefix' => $this->_oConfig->getPrefix('style'),
+            'js_object' => $this->_oConfig->getJsObject('view'),
+            'class' => !empty($aBrowseParams['last_read']) && $aEvent['id'] > $aBrowseParams['last_read'] ? ' bx-def-color-bg-box-active' : '', 
+            'id' => $aEvent['id'],
+            'author_unit' => $this->_isInContext($aEvent) && $oObjectOwner ? $oObjectOwner->getUnit(0, array('template' => 'unit_wo_info_links')) : $oOwner->getUnit(0, array('template' => 'unit_wo_info_links')),
+            'link' => $this->_getContentLink($aEvent),
+            'content' => is_array($aEvent['content_parsed']) && isset($aEvent['content_parsed']['site']) ? $aEvent['content_parsed']['site'] : $aEvent['content_parsed'],
+            'date' => bx_time_js($aEvent['date']),
+        ));
+    }
+
+    public function getNotificationEmail($iRecipient, &$aEvent)
+    {
+        $sEvent = $this->getPost($aEvent, array('perform_privacy_check_for' => $iRecipient, 'show_real_profile' => false));
+        if(empty($sEvent) || empty($aEvent['content_parsed']))
+            return false;
+
+        $aContent = &$aEvent['content'];
+        return array(
+            'content' => $this->parseHtmlByName('et_new_event.html', array(
+                'icon_url' => !empty($aContent['owner_icon']) ? $aContent['owner_icon'] : $this->getIconUrl('std-icon.svg'),
+                'content_url' => $this->_getContentLink($aEvent),
+                'content' => is_array($aEvent['content_parsed']) && isset($aEvent['content_parsed']['email']) ? $aEvent['content_parsed']['email'] : $aEvent['content_parsed'],
+                'date' => bx_process_output($aEvent['date'], BX_DATA_DATE_TS),
+            )),
+            'settings' => !empty($aContent['settings']['email']) ? $aContent['settings']['email'] : array()
+        );
+    }
+
+    public function getNotificationPush($iRecipient, &$aEvent)
+    {
+        $sEvent = $this->getPost($aEvent, array('perform_privacy_check_for' => $iRecipient, 'show_real_profile' => false));
+        if(empty($sEvent) || empty($aEvent['content_parsed']))
+            return false;
+
+        $sMessage = is_array($aEvent['content_parsed']) && isset($aEvent['content_parsed']['push']) ? $aEvent['content_parsed']['push'] : $aEvent['content_parsed'];
+        $sMessage = preg_replace('/<\/?[a-zA-Z0-9=\'":;\(\)\s_-]+>/i', '"', $sMessage);
+        if($sMessage)
+            $sMessage = BxTemplFunctions::getInstance()->getStringWithLimitedLength(html_entity_decode($sMessage), $this->_oConfig->getPushMaxLen());
+
+        if(empty($sMessage))
+            return false;
+
+        $aContent = &$aEvent['content'];
+        return array(
+            'content' => array(
+                'url' => $this->_getContentLink($aEvent),
+                'message' => $sMessage,
+                'icon' => !empty($aContent['owner_icon']) ? $aContent['owner_icon'] : ''
+            ),
+            'settings' => !empty($aContent['settings']['push']) ? $aContent['settings']['push'] : array()
+        );
+    }
+
+    public function getEmpty($bVisible = true)
+    {
+        return $this->parseHtmlByName('empty.html', array(
+            'style_prefix' => $this->_oConfig->getPrefix('style'),
+            'visible' => $bVisible ? 'block' : 'none',
+            'content' => MsgBox(_t('_bx_ntfs_txt_msg_no_results'))
+        ));
+    }
+
+    protected function _processContent(&$aEvent)
+    {
+    	$aContent = $this->_getContent($aEvent);
+        if(empty($aContent) || !is_array($aContent)) 
+            return;
+
+        $aSet = array();
+        if(!empty($aContent['entry_author'])) {
+            $aSet['object_owner_id'] = (int)$aContent['entry_author'];
+            unset($aContent['entry_author']);
+        }
+
+        if(!empty($aContent['entry_privacy'])) {
+            $aSet['allow_view_event_to'] = $aContent['entry_privacy'];
+            $aEvent['allow_view_event_to'] = $aContent['entry_privacy'];
+            unset($aContent['entry_privacy']);
+        }
+
+        if(!empty($aEvent['content'])) {
+            if(is_string($aEvent['content']))
+                $aEvent['content'] = unserialize($aEvent['content']);
+
+            if(is_array($aEvent['content']))
+                $aEvent['content'] = array_merge($aEvent['content'], $aContent);
+        }
+        else
+            $aEvent['content'] = $aContent;
+
+        $aEvent['processed'] = 1;
+
+        $aSet = array_merge($aSet, array(
+            'content' => serialize($aEvent['content']), 
+            'processed' => 1
+        ));
+
+        $this->_oDb->updateEvent($aSet, array('id' => $aEvent['id']));
+        return;
+    }
+
+    protected function _getContent(&$aEvent)
+    {
+        $sHandler = $aEvent['type'] . '_' . $aEvent['action'];
+        if(!$this->_oConfig->isHandler($sHandler))
+            return array();
+
+        $aHandler = $this->_oConfig->getHandlers($sHandler);
+        if(!empty($aHandler['module_name']) && !empty($aHandler['module_class']) && !empty($aHandler['module_method']))
+            return BxDolService::call($aHandler['module_name'], $aHandler['module_method'], array($aEvent), $aHandler['module_class']);
+
+        $sMethod = 'display' . bx_gen_method_name($aHandler['alert_unit'] . '_' . $aHandler['alert_action']);
+        if(!method_exists($this, $sMethod))
+            return array();
+
+        return $this->$sMethod($aEvent);
+    }
+
+    protected function _getContentModule(&$aEvent)
+    {
+        $sModule = $aEvent['type'];
+        if($this->_oDb->isEnabledByName($sModule))
+            return $sModule;
+
+        $sModule = str_replace(array('_media', '_reactions'), array('', ''), $sModule);
+        if($this->_oDb->isEnabledByName($sModule))
+            return $sModule;
+
+        return '';
+    }
+
+    protected function _getContentObjectId(&$aEvent)
+    {
+        return !empty($aEvent['content']['object_id']) ? (int)$aEvent['content']['object_id'] : (int)$aEvent['object_id'];
+    }
+
+    protected function _getContentLangKey(&$aEvent)
+    {
+        if(!empty($aEvent['subobject_id']))
+            return '_bx_ntfs_txt_subobject_added';
+
+        if($this->_isInContext($aEvent))
+            return '_bx_ntfs_txt_object_added_in_context';
+
+        $sKey = '';
+        switch($aEvent['action']) {
+            case 'publish_failed':
+                $sKey = '_bx_ntfs_txt_object_publish_failed';
+                break;
+
+            case 'publish_succeeded':
+                $sKey = '_bx_ntfs_txt_object_publish_succeeded';
+                break;
+
+            default:
+                $sKey = '_bx_ntfs_txt_object_added';
+        }
+
+    	return $sKey;
+    }
+
+    protected function _parseContentLangKey($sLangKey, &$aEvent)
+    {
+        $aExclude = array(
+            'lang_key' => 1,
+            'settings' => 1
+        );
+
+        return $this->parseHtmlByContent(_t($sLangKey), array_diff_key($aEvent['content'], $aExclude), array('{', '}'));
+    }
+
+    protected function _getContentLink(&$aEvent)
+    {
+        return !empty($aEvent['subobject_id']) && !empty($aEvent['content']['subentry_url']) ? $aEvent['content']['subentry_url'] : $aEvent['content']['entry_url'];
+    }
+
+    protected function _isInContext(&$aEvent)
+    {
+        return (int)$aEvent['object_privacy_view'] < 0;
+    }
+}
+
+/** @} */

+ 82 - 0
modules/boonex/notifications/updates/11.0.1_11.0.2/source/install/config.php

@@ -0,0 +1,82 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Notifications Notifications
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_MODULE,
+    'name' => 'bx_notifications',
+    'title' => 'Notifications',
+    'note' => 'Notifications module.',
+    'version' => '11.0.2',
+    'vendor' => 'BoonEx',
+    'help_url' => 'http://feed.una.io/?section={module_name}',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/notifications/',
+    'home_uri' => 'notifications',
+
+    'db_prefix' => 'bx_notifications_',
+    'class_prefix' => 'BxNtfs',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Notifications',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'uninstall' => array (
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable' => array(
+        'execute_sql' => 1,
+    	'update_relations_for_all' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable' => array (
+        'execute_sql' => 1,
+    	'update_relations_for_all' => 1,
+        'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Dependencies Section
+     */
+    'dependencies' => array(),
+
+    /**
+     * Relations Section
+     */
+    'relation_handlers' => array(
+    	'on_install' => '',
+    	'on_uninstall' => 'delete_module_events',
+	    'on_enable' => 'add_handlers',
+	    'on_disable' => 'delete_handlers',
+    ),
+);
+
+/** @} */

+ 163 - 0
modules/boonex/notifications/updates/11.0.1_11.0.2/source/install/sql/enable.sql

@@ -0,0 +1,163 @@
+SET @sName = 'bx_notifications';
+
+
+-- PAGES & BLOCKS
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_notifications_view', '_bx_ntfs_page_title_system_view', '_bx_ntfs_page_title_view', @sName, 5, 2147483647, 1, 'notifications-view', 'page.php?i=notifications-view', '', '', '', 0, 1, 0, 'BxNtfsPageView', 'modules/boonex/notifications/classes/BxNtfsPageView.php');
+
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
+('bx_notifications_view', 1, @sName, '_bx_ntfs_page_block_title_view', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:16:"bx_notifications";s:6:"method";s:14:"get_block_view";}', 0, 1, 1);
+
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_notifications_settings', '_bx_ntfs_page_title_system_settings', '_bx_ntfs_page_title_settings', @sName, 1, 2147483647, 1, 'notifications-settings', 'page.php?i=notifications-settings', '', '', '', 0, 1, 0, 'BxNtfsPageSettings', 'modules/boonex/notifications/classes/BxNtfsPageSettings.php');
+
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
+('bx_notifications_settings', 1, @sName, '_bx_ntfs_page_block_title_delivery', 13, 2147483644, 'menu', 'bx_notifications_settings', 0, 0, 1),
+('bx_notifications_settings', 2, @sName, '_bx_ntfs_page_block_title_settings', 13, 2147483644, 'service', 'a:2:{s:6:"module";s:16:"bx_notifications";s:6:"method";s:18:"get_block_settings";}', 0, 1, 1);
+
+-- PAGES: add page block on dashboard
+SET @iPBCellDashboard = 3;
+SET @iPBOrderDashboard = 4; --(SELECT IFNULL(MAX(`order`), 0) FROM `sys_pages_blocks` WHERE `object` = 'sys_dashboard' AND `cell_id` = @iPBCellDashboard LIMIT 1);
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES
+('sys_dashboard', @iPBCellDashboard, @sName, '_bx_ntfs_page_block_title_view', 11, 2147483644, 'service', 'a:2:{s:6:"module";s:16:"bx_notifications";s:6:"method";s:14:"get_block_view";}', 0, 0, 0, @iPBOrderDashboard);
+
+
+-- MENU: module sub-menu
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_notifications_submenu', '_bx_ntfs_menu_title_submenu', 'bx_notifications_submenu', @sName, 8, 0, 1, '', '');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_notifications_submenu', @sName, '_bx_ntfs_menu_set_title_submenu', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('bx_notifications_submenu', @sName, 'notifications-all', '_bx_ntfs_menu_item_title_system_notifications_all', '_bx_ntfs_menu_item_title_notifications_all', 'page.php?i=notifications-view', '', '', '', '', 2147483647, 1, 0, 1);
+
+-- MENU: preview popup
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_notifications_preview', '_bx_ntfs_menu_title_preview', 'bx_notifications_preview', @sName, 20, 0, 1, 'BxNtfsMenuPreview', 'modules/boonex/notifications/classes/BxNtfsMenuPreview.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_notifications_preview', @sName, '_bx_ntfs_menu_set_title_preview', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('bx_notifications_preview', @sName, 'more', '_bx_ntfs_menu_item_title_system_more', '_bx_ntfs_menu_item_title_more', 'page.php?i=notifications-view', '', '', '', '', 2147483647, 1, 0, 1);
+
+-- MENU: settings sub-menu
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_notifications_settings', '_bx_ntfs_menu_title_settings', 'bx_notifications_settings', @sName, 6, 0, 1, '', '');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_notifications_settings', @sName, '_bx_ntfs_menu_set_title_settings', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('bx_notifications_settings', @sName, 'notifications-site', '_bx_ntfs_menu_item_title_system_notifications_site', '_bx_ntfs_menu_item_title_notifications_site', 'page.php?i=notifications-settings&delivery=site', '', '', '', '', 2147483647, 1, 0, 10),
+('bx_notifications_settings', @sName, 'notifications-email', '_bx_ntfs_menu_item_title_system_notifications_email', '_bx_ntfs_menu_item_title_notifications_email', 'page.php?i=notifications-settings&delivery=email', '', '', '', '', 2147483647, 1, 0, 20),
+('bx_notifications_settings', @sName, 'notifications-push', '_bx_ntfs_menu_item_title_system_notifications_push', '_bx_ntfs_menu_item_title_notifications_push', 'page.php?i=notifications-settings&delivery=push', '', '', '', '', 2147483647, 1, 0, 30);
+
+-- MENU: member toolbar
+SET @iMenuToolbarMenuOrder = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_menu_items` WHERE `set_name`='sys_toolbar_member' LIMIT 1);
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `submenu_popup`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_toolbar_member', @sName, 'notifications-preview', '_bx_ntfs_menu_item_title_system_preview', '_bx_ntfs_menu_item_title_preview', 'javascript:void(0)', 'bx_menu_slide(''bx_notifications_preview'', this, ''site'', {id:{value:''bx_notifications_preview'', force:1}});', '', 'bell col-green3', 'a:2:{s:6:"module";s:16:"bx_notifications";s:6:"method";s:28:"get_unread_notifications_num";}', 'bx_notifications_preview', 1, 2147483646, 1, 1, 0);
+
+-- MENU: Notifications
+SET @iMIOrder = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_menu_items` WHERE `set_name` = 'sys_account_notifications' AND `order` < 9999);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `submenu_popup`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES
+('sys_account_notifications', @sName, 'notifications-notifications', '_bx_ntfs_menu_item_title_system_notifications', '_bx_ntfs_menu_item_title_notifications', 'javascript:void(0)', 'bx_menu_slide(''bx_notifications_preview'', this, ''site'', {id:{value:''bx_notifications_preview'', force:1}});', '', 'bell col-green3', 'a:2:{s:6:"module";s:16:"bx_notifications";s:6:"method";s:28:"get_unread_notifications_num";}', 'bx_notifications_preview', 1, 2147483646, 0, 1, @iMIOrder + 1);
+
+-- MENU: account settings menu
+SET @iMoAccountSettings = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_menu_items` WHERE `set_name`='sys_account_settings' AND `order` < 9999 LIMIT 1);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `editable`, `order`) VALUES
+('sys_account_settings', @sName, 'notifications-settings', '_bx_ntfs_menu_item_title_system_notifications', '_bx_ntfs_menu_item_title_notifications', 'page.php?i=notifications-settings', '', '', 'bell col-green3', '', '', 2147483646, 1, 0, 1, @iMoAccountSettings + 1);
+
+
+-- SETTINGS
+SET @iTypeOrder = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_options_types` WHERE `group` = 'modules');
+INSERT INTO `sys_options_types`(`group`, `name`, `caption`, `icon`, `order`) VALUES 
+('modules', @sName, '_bx_ntfs', 'bx_notifications@modules/boonex/notifications/|std-icon.svg', @iTypeOrder + 1);
+SET @iTypeId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options_categories` (`type_id`, `name`, `caption`, `hidden`, `order`) VALUES (@iTypeId, 'bx_notifications_system', '_bx_ntfs_options_category_system', 1, 1);
+SET @iCategId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `check`, `check_params`, `check_error`, `extra`, `order`) VALUES
+('bx_notifications_events_hide_site', '', @iCategId, '_bx_ntfs_option_events_hide_site', 'rlist', '', '', '', 'a:2:{s:6:"module";s:16:"bx_notifications";s:6:"method";s:21:"get_actions_checklist";}', 1),
+('bx_notifications_events_hide_email', '', @iCategId, '_bx_ntfs_option_events_hide_email', 'rlist', '', '', '', 'a:2:{s:6:"module";s:16:"bx_notifications";s:6:"method";s:21:"get_actions_checklist";}', 2),
+('bx_notifications_events_hide_push', '', @iCategId, '_bx_ntfs_option_events_hide_push', 'rlist', '', '', '', 'a:2:{s:6:"module";s:16:"bx_notifications";s:6:"method";s:21:"get_actions_checklist";}', 3),
+('bx_notifications_processed_event', '', @iCategId, '_bx_ntfs_option_processed_event', 'digit', '', '', '', '', 10);
+
+INSERT INTO `sys_options_categories` (`type_id`, `name`, `caption`, `hidden`, `order`) VALUES (@iTypeId, @sName, '_bx_ntfs', 0, 1);
+SET @iCategId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `check`, `check_params`, `check_error`, `extra`, `order`) VALUES
+('bx_notifications_events_per_page', '12', @iCategId, '_bx_ntfs_option_events_per_page', 'digit', '', '', '', '', 1),
+('bx_notifications_events_per_preview', '5', @iCategId, '_bx_ntfs_option_events_per_preview', 'digit', '', '', '', '', 5),
+('bx_notifications_enable_group_settings', 'on', @iCategId, '_bx_ntfs_option_enable_group_settings', 'checkbox', '', '', '', '', 10), 
+('bx_notifications_delivery_timeout', '120', @iCategId, '_bx_ntfs_option_delivery_timeout', 'digit', '', '', '', '', 20);
+
+
+-- PRIVACY 
+INSERT INTO `sys_objects_privacy` (`object`, `module`, `action`, `title`, `default_group`, `table`, `table_field_id`, `table_field_author`, `override_class_name`, `override_class_file`) VALUES
+('bx_notifications_privacy_view', @sName, 'view', '_bx_notifications_privacy_view', '3', 'bx_notifications_events', 'id', 'owner_id', 'BxNtfsPrivacy', 'modules/boonex/notifications/classes/BxNtfsPrivacy.php');
+
+
+-- LIVE UPDATES
+INSERT INTO `sys_objects_live_updates`(`name`, `frequency`, `service_call`, `active`) VALUES
+(@sName, 1, 'a:3:{s:6:"module";s:16:"bx_notifications";s:6:"method";s:16:"get_live_updates";s:6:"params";a:3:{i:0;a:2:{s:11:"menu_object";s:18:"sys_toolbar_member";s:9:"menu_item";s:7:"account";}i:1;a:2:{s:11:"menu_object";s:25:"sys_account_notifications";s:9:"menu_item";s:27:"notifications-notifications";}i:2;s:7:"{count}";}}', 1),
+('bx_notifications_toolbar', 1, 'a:3:{s:6:"module";s:16:"bx_notifications";s:6:"method";s:16:"get_live_updates";s:6:"params";a:3:{i:0;a:0:{}i:1;a:2:{s:11:"menu_object";s:18:"sys_toolbar_member";s:9:"menu_item";s:21:"notifications-preview";}i:2;s:7:"{count}";}}', 1);
+
+
+-- ALERTS
+INSERT INTO `sys_alerts_handlers`(`name`, `class`, `file`, `service_call`) VALUES 
+(@sName, 'BxNtfsResponse', 'modules/boonex/notifications/classes/BxNtfsResponse.php', '');
+SET @iHandler := LAST_INSERT_ID();
+
+INSERT INTO `sys_alerts` (`unit`, `action`, `handler_id`) VALUES
+('profile', 'delete', @iHandler),
+
+('meta_mention', 'added', @iHandler),
+
+('sys_profiles_friends', 'connection_added', @iHandler),
+('sys_profiles_friends', 'connection_removed', @iHandler),
+
+('sys_profiles_subscriptions', 'connection_added', @iHandler),
+('sys_profiles_subscriptions', 'connection_removed', @iHandler),
+
+('sys_cmts', 'doVote', @iHandler),
+('sys_cmts', 'undoVote', @iHandler),
+
+('sys_cmts_reactions', 'doVote', @iHandler),
+('sys_cmts_reactions', 'undoVote', @iHandler),
+
+('sys_cmts', 'doVoteUp', @iHandler),
+('sys_cmts', 'doVoteDown', @iHandler);
+
+
+-- EMAIL TEMPLATES
+INSERT INTO `sys_email_templates` (`Module`, `NameSystem`, `Name`, `Subject`, `Body`) VALUES
+(@sName, '_bx_ntfs_email_new_event', 'bx_notifications_new_event', '_bx_ntfs_email_new_event_subject', '_bx_ntfs_email_new_event_body');
+
+
+-- GRIDS
+INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `field_active`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_fields_translatable`, `filter_mode`, `sorting_fields`, `visible_for_levels`, `override_class_name`, `override_class_file`) VALUES
+('bx_notifications_settings_administration', 'Sql', 'SELECT `ts`.*, `th`.`alert_unit` AS `unit`, `th`.`alert_action` AS `action` FROM `bx_notifications_settings` AS `ts` LEFT JOIN `bx_notifications_handlers` AS `th` ON `ts`.`handler_id`=`th`.`id` WHERE 1 ', 'bx_notifications_settings', 'id', 'order', 'active', '', 100, NULL, 'start', '', '', 'ts`.`title', 'auto', '', 192, 'BxNtfsGridSettingsAdministration', 'modules/boonex/notifications/classes/BxNtfsGridSettingsAdministration.php'),
+('bx_notifications_settings_common', 'Sql', 'SELECT `tsu`.`id` AS `id`, `ts`.`group` AS `group`, `ts`.`id` AS `setting_id`, `ts`.`type` AS `type`, `ts`.`delivery` AS `delivery`, `ts`.`title` AS `title`, `tsu`.`active` AS `active`, `ts`.`order` AS `order`, `th`.`alert_unit` AS `unit`, `th`.`alert_action` AS `action` FROM `bx_notifications_settings` AS `ts` LEFT JOIN `bx_notifications_handlers` AS `th` ON `ts`.`handler_id`=`th`.`id` LEFT JOIN `bx_notifications_settings2users` AS `tsu` ON `ts`.`id`=`tsu`.`setting_id` WHERE `ts`.`active`=''1'' ', 'bx_notifications_settings2users', 'id', 'order', 'active', '', 100, NULL, 'start', '', '', 'ts`.`title', 'auto', '', 2147483647, 'BxNtfsGridSettingsCommon', 'modules/boonex/notifications/classes/BxNtfsGridSettingsCommon.php');
+
+INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `order`) VALUES
+('bx_notifications_settings_administration', 'checkbox', '', '1%', 0, '', '', 1),
+('bx_notifications_settings_administration', 'switcher', '', '10%', 0, '', '', 2),
+('bx_notifications_settings_administration', 'title', '_bx_ntfs_grid_column_title_title', '89%', 1, '', '', 10),
+
+('bx_notifications_settings_common', 'checkbox', '', '1%', 0, '', '', 1),
+('bx_notifications_settings_common', 'switcher', '', '10%', 0, '', '', 2),
+('bx_notifications_settings_common', 'title', '_bx_ntfs_grid_column_title_title', '89%', 1, '', '', 10);
+
+INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `confirm`, `order`) VALUES
+('bx_notifications_settings_administration', 'bulk', 'deactivate', '_bx_ntfs_grid_action_title_deactivate', '', 1, 0),
+
+('bx_notifications_settings_common', 'bulk', 'deactivate', '_bx_ntfs_grid_action_title_deactivate', '', 1, 0);
+
+
+-- CRON
+INSERT INTO `sys_cron_jobs` (`name`, `time`, `class`, `file`, `service_call`) VALUES
+('bx_notifications_queue', '* * * * *', 'BxNtfsCronQueue', 'modules/boonex/notifications/classes/BxNtfsCronQueue.php', ''),
+('bx_notifications_notify', '* * * * *', 'BxNtfsCronNotify', 'modules/boonex/notifications/classes/BxNtfsCronNotify.php', '');

+ 51 - 0
modules/boonex/oauth2/updates/11.0.0_11.0.1/install/config.php

@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'title' => 'OAuth2 Server',
+    'version_from' => '11.0.0',
+    'version_to' => '11.0.1',
+    'vendor' => 'BoonEx',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/oauth2/updates/update_11.0.0_11.0.1/',
+    'home_uri' => 'oauth2_update_1100_1101',
+
+    'module_dir' => 'boonex/oauth2/',
+    'module_uri' => 'oauth2',
+
+    'db_prefix' => 'bx_oauth_',
+    'class_prefix' => 'BxOAuth',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 0,
+        'update_files' => 1,
+        'update_languages' => 0,
+        'clear_db_cache' => 0,
+    ),
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'OAuth2 Server',
+
+    /**
+     * Files Section
+     */
+    'delete_files' => array(),
+);

+ 13 - 0
modules/boonex/oauth2/updates/11.0.0_11.0.1/install/installer.php

@@ -0,0 +1,13 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+class BxOAuthUpdater extends BxDolStudioUpdater
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+}

+ 439 - 0
modules/boonex/oauth2/updates/11.0.0_11.0.1/source/classes/BxOAuthModule.php

@@ -0,0 +1,439 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    OAuth2 OAuth2 server
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+require_once (BX_DIRECTORY_PATH_PLUGINS . 'OAuth2/Autoloader.php');
+OAuth2\Autoloader::register();
+
+class BxOAuthUserCredentialsStorage extends OAuth2\Storage\Pdo implements OAuth2\Storage\UserCredentialsInterface
+{
+    public function checkUserCredentials($sLogin, $sPassword)
+    {
+        return ($sErrorMsg = bx_check_password($sLogin, $sPassword)) ? false : true;
+    }
+
+    public function getUser($sLogin)
+    {
+        return $this->getUserDetails($sLogin);
+    }
+    
+    public function getUserDetails($sLogin)
+    {
+        if (!($oAccount = BxDolAccount::getInstance($sLogin)))
+            return false;
+
+        if (!($oProfile = BxDolProfile::getInstanceByAccount($oAccount->id())))
+            return false;
+
+        return array('user_id' => $oProfile->id());
+    }
+
+    public function checkRestrictedGrantType($iClientId, $sGrantType)
+    {
+        $aDetails = $this->getClientDetails($iClientId);
+        if (isset($aDetails['grant_types'])) {
+            $aGrantTypes = explode(',', $aDetails['grant_types']);
+
+            return in_array($sGrantType, (array) $aGrantTypes);
+        }
+
+        // if grant_types are not defined, then none are restricted
+        return true;
+    }
+}
+
+class BxOAuthModule extends BxDolModule
+{
+    protected $_oStorage;
+    protected $_oServer;
+    protected $_oAPI;
+
+    function __construct(&$aModule)
+    {
+        parent::__construct($aModule);        
+    }
+
+    public function checkAllowedOrigins()
+    {
+        $aClient = array();
+        if (isset($_SERVER['HTTP_ORIGIN']) && parse_url($_SERVER['HTTP_ORIGIN'], PHP_URL_HOST) != parse_url(BX_DOL_URL_ROOT, PHP_URL_HOST)) {
+
+            $aClient = $this->_oDb->getClientByAllowedOriginUrl($_SERVER['HTTP_ORIGIN']);
+            if (!$aClient) {
+                header('HTTP/1.0 403 Forbidden');
+                echo _t("_Access denied");
+                exit;
+            } 
+
+            header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
+            
+            if ('OPTIONS' == $_SERVER['REQUEST_METHOD']) {
+                header('Access-Control-Allow-Methods: POST, GET');
+                header('Access-Control-Allow-Headers: Authorization, Content-Type, X-Custom-Header, X-Requested-With');                    
+                exit(0);
+            }            
+        }
+        return $aClient;
+    }
+
+    public function initOAuth($sClientId)
+    {
+        if ($this->_oStorage)
+            return;        
+
+        // check cross origin request
+        
+        $aClient = $this->checkAllowedOrigins();
+
+        // get the client data if it wasn't set before
+        
+        if (empty($aClient))
+            $aClient = $sClientId ? $this->_oDb->getClientsBy(array('type' => 'client_id', 'client_id' => $sClientId)) : false;
+        
+        if (!$aClient)
+            $aClient = array('grant_types' => 'authorization_code');
+        
+        if (!$aClient['grant_types'])
+            $aClient['grant_types'] = 'authorization_code';
+        
+        $aGrantTypes = explode(',', $aClient['grant_types']);
+
+
+        // configure OAuth storage and server
+                
+        $aConfig = array (
+            'client_table' => 'bx_oauth_clients',
+            'access_token_table' => 'bx_oauth_access_tokens',
+            'refresh_token_table' => 'bx_oauth_refresh_tokens',
+            'code_table' => 'bx_oauth_authorization_codes',
+            'user_table' => 'sys_accounts',
+            'jwt_table'  => '',
+            'jti_table'  => '',
+            'scope_table'  => 'bx_oauth_scopes',
+            'public_key_table'  => '',
+        );
+        $this->_oStorage = new BxOAuthUserCredentialsStorage(BxDolDb::getLink(), $aConfig);
+
+        $this->_oServer = new OAuth2\Server($this->_oStorage, array(
+            'require_exact_redirect_uri' => false,
+            'refresh_token_lifetime' => 7776000, // set lifetime to 90 days
+        ));
+
+        // add grand types
+
+        // Add the "Client Credentials" grant type (it is the simplest of the grant types)
+        if (in_array('client_credentials', $aGrantTypes))
+            $this->_oServer->addGrantType(new OAuth2\GrantType\ClientCredentials($this->_oStorage));
+
+        // Add the "Authorization Code" grant type (this is where the oauth magic happens)
+        if (in_array('authorization_code', $aGrantTypes))
+            $this->_oServer->addGrantType(new OAuth2\GrantType\AuthorizationCode($this->_oStorage));
+
+        // Add the "Password" grant type (generate client_id with empty client_secret)
+        if (in_array('password', $aGrantTypes))
+            $this->_oServer->addGrantType(new OAuth2\GrantType\UserCredentials($this->_oStorage));
+
+        // Add the "Refresh Token" grant type
+        if (in_array('refresh_token', $aGrantTypes))
+            $this->_oServer->addGrantType(new OAuth2\GrantType\RefreshToken($this->_oStorage, array(
+                'always_issue_new_refresh_token' => true,
+                // 'unset_refresh_token_after_use' => false,
+            )));
+    }    
+
+    /**
+     * @page public_api API Public
+     * @section public_api_token /m/oauth2/token
+     * 
+     * Get the token for the future communication with @ref private_api
+     * 
+     * **HTTP Method:** 
+     * `POST`
+     *
+     * **Request params:**
+     * - `grant_type` - for API it's better to use 'password' grant type
+     * - `username` - login email
+     * - `password` - login password
+     * - `client_id` - client ID from bx_oauth_clients table
+     *
+     * **Response (success):**
+     * @code
+     * {  
+     *    "access_token":"cdd7056d0adafa9ead87526ca22367c6b0df8273",
+     *    "expires_in":3600,
+     *    "token_type":"Bearer",
+     *    "scope":"basic",
+     *    "refresh_token":"c3d7f6f4b7cc640214ae0cba2b194872c3089f1c"
+     * }
+     * @endcode
+     *
+     * **Response (error):**
+     * @code
+     * {  
+     *    "error":"short error description here",
+     *    "error_description":"long error description here"
+     * }
+     * @endcode
+     */
+    function actionToken ()
+    {
+        $this->initOAuth(bx_get('client_id'));
+        
+        // Handle a request for an OAuth2.0 Access Token and send the response to the client
+        $this->_oServer->handleTokenRequest(OAuth2\Request::createFromGlobals())->send();
+    }
+
+    /**
+     * @page public_api API Public
+     * @section public_api_revoke /m/oauth2/revoke
+     * 
+     * Revoke token 
+     * 
+     * **HTTP Method:** 
+     * `POST`
+     *
+     * **Request params:**
+     * - `token` - token to revoke
+     *
+     * **Request header:**
+     * @code
+     * Authorization: Bearer 9802c4a34e1535d8c3b721604ee0e7fb04116c49
+     * @endcode
+     *
+     * **Response (success):**
+     * @code
+     * {  
+     *    "revoked":true,
+     * }
+     * @endcode
+     *
+     * **Response (error):**
+     * @code
+     * {  
+     *    "error":"short error description here",
+     *    "error_description":"long error description here"
+     * }
+     * @endcode
+     */
+    function actionRevoke ()
+    {
+        $this->initOAuth($this->getClientIdFromAccessTokenHeader());
+        $this->_oServer->handleRevokeRequest(OAuth2\Request::createFromGlobals())->send();
+    }
+
+    /**
+     * Authenicated or public call to the "safe" and "public" service methods 
+     */
+    function actionCom ($sMethod)
+    {
+        if (!$this->_oAPI) {
+            bx_import('API', $this->_aModule);
+            $this->_oAPI = new BxOAuthAPI($this);
+        }
+
+        $bPublic = $this->_oAPI->isPublicAPI(bx_get('module') ? bx_get('module') : 'bx_api', $sMethod);
+        if ($bPublic) {
+            $this->checkAllowedOrigins();
+            $this->_oAPI->com($sMethod, array(), $bPublic);
+        }
+        else {
+            if (!$this->_oAPI->isSafeAPI(bx_get('module') ? bx_get('module') : 'bx_api', $sMethod)) {
+                $this->_oAPI->errorOutput(403, 'access_denied', 'Only "public" and "safe" services can be called, or method doesn\'t exist');
+                return;
+            }
+
+            $this->initOAuth($this->getClientIdFromAccessTokenHeader());
+
+            // Handle a request to a resource and authenticate the access token
+            if (!$this->_oServer->verifyResourceRequest(OAuth2\Request::createFromGlobals())) {
+                $this->_oServer->getResponse()->send();
+                return;
+            }
+
+            $aToken = $this->_oServer->getAccessTokenData(OAuth2\Request::createFromGlobals());
+
+            $aScope = explode(',', $this->_oAPI->aAction2Scope['api']);
+            $aScopeToken = explode(',', $aToken['scope']);
+            if (!array_intersect($aScopeToken, $aScope)) {
+                $this->_oAPI->errorOutput(403, 'insufficient_scope', 'The request requires higher privileges than provided by the access token');
+                return;
+            }
+
+            $this->_oAPI->com($sMethod, $aToken, false);
+        }
+    }
+
+    /**
+     * Authenicated call to the API
+     */
+    function actionApi ($sAction)
+    {
+        $this->initOAuth($this->getClientIdFromAccessTokenHeader());
+        
+        // Handle a request to a resource and authenticate the access token
+        if (!$this->_oServer->verifyResourceRequest(OAuth2\Request::createFromGlobals())) {
+            $this->_oServer->getResponse()->send();
+            return;
+        }
+
+        $aToken = $this->_oServer->getAccessTokenData(OAuth2\Request::createFromGlobals());
+
+        if (!$this->_oAPI) {
+            bx_import('API', $this->_aModule);
+            $this->_oAPI = new BxOAuthAPI($this);
+        }
+
+        if (!$sAction || !method_exists($this->_oAPI, $sAction) || in_array($sAction, $this->_oAPI->aExceptionsAPI)) {
+            $this->_oAPI->errorOutput(404, 'not_found', 'No such API endpoint available');
+            return;
+        }
+
+        $aScope = explode(',', $this->_oAPI->aAction2Scope[$sAction]);
+        $aScopeToken = explode(',', $aToken['scope']);
+        if (!array_intersect($aScopeToken, $aScope)) {
+            $this->_oAPI->errorOutput(403, 'insufficient_scope', 'The request requires higher privileges than provided by the access token');
+            return;
+        }
+
+        $this->_oAPI->$sAction($aToken);
+    }
+
+    function actionAuth ()
+    {
+        $this->initOAuth(bx_get('client_id'));
+        
+        $oRequest = OAuth2\Request::createFromGlobals();
+        $oResponse = new OAuth2\Response();
+
+        // validate the authorize request
+        if (!$this->_oServer->validateAuthorizeRequest($oRequest, $oResponse)) {
+            require_once(BX_DIRECTORY_PATH_INC . 'design.inc.php');
+            $o = json_decode($oResponse->getResponseBody());
+            $this->_oTemplate->getPage(false, MsgBox($o->error_description));
+        }
+
+        if (!isLogged()) {
+            require_once(BX_DIRECTORY_PATH_INC . 'design.inc.php');
+            $sForceRelocate = BX_DOL_URL_ROOT . $this->_oConfig->getBaseUri() . 'auth/?client_id=' . bx_get('client_id') . '&response_type=' . bx_get('response_type') . '&scope=' . bx_get('scope') . '&state=' . bx_get('state') . '&redirect_uri=' . bx_get('redirect_uri');
+            bx_login_form(false, false, $sForceRelocate);
+            return;
+        }
+
+        $aProfiles = BxDolAccount::getInstance()->getProfiles();
+
+        if (1 == count($aProfiles)) { // in case of one profile, don't display dialog with profiles choice
+            $aProfile = array_pop($aProfiles);
+            $_POST['profile_id'] = $aProfile['id'];
+        }
+
+        if (!($iProfileId = $this->_oDb->getSavedProfile(bx_get('client_id'), $aProfiles)) && empty($_POST)) {
+            $oPage = BxDolPage::getObjectInstanceByURI('oauth-authorization');
+            $this->_oTemplate->getPage(false, $oPage->getCode());
+            return;
+        } 
+
+        if (!$iProfileId)
+            $iProfileId = bx_get('profile_id');
+
+        $this->_oServer->handleAuthorizeRequest($oRequest, $oResponse, (bool)$iProfileId, $iProfileId);
+
+        $oResponse->send();
+    }
+
+    function serviceAuthorization ()
+    {
+        $sTitle = $this->_oDb->getClientTitle(bx_get('client_id'));
+        $this->_oTemplate->addCss('main.css');
+        return $this->_oTemplate->parseHtmlByName('page_auth.html', array(
+            'text' => _t('_bx_oauth_authorize_app', htmlspecialchars_adv($sTitle)),
+            'url' => BX_DOL_URL_ROOT . $this->_oConfig->getBaseUri() . 'auth',
+            'client_id' => bx_get('client_id'),
+            'response_type' => bx_get('response_type'),
+            'redirect_uri' => bx_get('redirect_uri'),
+        	'scope' => bx_get('scope'),
+            'state' => bx_get('state'),
+            'profiles' => BxDolService::call('system', 'account_profile_switcher', array(getLoggedId(), false, "javascript: $('#bx-auth-profile-id').val('{profile_id}'); $('#bx-auth-form form').submit(); void(0);", true, _t('_bx_oauth_connect'), 'unit_wo_links'), 'TemplServiceProfiles')['content'],
+        ));
+    }
+
+    function serviceGetClientsBy ($aParams = array())
+    {
+    	return $this->_oDb->getClientsBy($aParams);
+    }
+
+    function serviceAddClient ($aClient)
+    {
+        if (!isset($aClient['client_id'])) {
+            bx_import('FormAdd', 'bx_oauth');
+            for ($i = 0; $i < 99 ; ++$i) {
+                $aClient['client_id'] = strtolower(genRndPwd(BxOAuthFormAdd::$LENGTH_ID, false));
+                if (!$this->_oDb->getClientTitle($aClient['client_id'])) // check for uniq
+                    break;
+            }
+        }
+
+        if (!isset($aClient['client_secret'])) {
+            bx_import('FormAdd', 'bx_oauth');
+            $aClient['client_secret'] = strtolower(genRndPwd(BxOAuthFormAdd::$LENGTH_SECRET, false));
+        }
+
+        if (!isset($aClient['scope']))
+            $aClient['scope'] = 'market';
+
+        if (!isset($aClient['user_id']))
+            $aClient['user_id'] = bx_get_logged_profile_id();
+
+        if (!isset($aClient['title']) && isset($aClient['redirect_uri']) && ($sHost = parse_url($aClient['redirect_uri'], PHP_URL_HOST)))
+            $aClient['title'] = $sHost;
+
+    	return $this->_oDb->addClient($aClient);
+    }
+
+	function serviceUpdateClientsBy ($aParamsSet, $aParamsWhere)
+    {
+    	return $this->_oDb->updateClientsBy($aParamsSet, $aParamsWhere);
+    }
+
+	function serviceDeleteClientsBy ($aParams)
+    {
+    	return $this->_oDb->deleteClientsBy($aParams);
+    }
+
+    function studioSettings ()
+    {
+        if (!isAdmin()) {
+            $this->_oTemplate->displayAccessDenied ();
+            return;
+        }
+
+        $oGrid = BxDolGrid::getObjectInstance('bx_oauth', BxDolStudioTemplate::getInstance());
+        if ($oGrid)
+            return $oGrid->getCode();
+
+        return '';
+    }
+
+    function getClientIdFromAccessTokenHeader()
+    {
+        if (isset($_SERVER['HTTP_AUTHORIZATION']))
+            $sAuthHeader = $_SERVER['HTTP_AUTHORIZATION'];
+        elseif (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION']))
+            $sAuthHeader = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];
+        if (empty($sAuthHeader))
+            return false;
+        
+        if (false === stripos($sAuthHeader, 'Bearer'))
+            return false;
+
+        return $this->_oDb->getClientIdByAccessToken(trim(substr($sAuthHeader, 6)));
+    }
+}
+
+/** @} */

+ 68 - 0
modules/boonex/oauth2/updates/11.0.0_11.0.1/source/install/config.php

@@ -0,0 +1,68 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    OAuth2 OAuth2 server
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_MODULE,
+    'name' => 'bx_oauth',
+    'title' => 'OAuth2 Server',
+    'note' => 'Allow to use site user credentials and basic API',
+    'version' => '11.0.1',
+    'vendor' => 'BoonEx',
+    'help_url' => 'http://feed.una.io/?section={module_name}',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/oauth2/',
+    'home_uri' => 'oauth2',
+
+    'db_prefix' => 'bx_oauth_',
+    'class_prefix' => 'BxOAuth',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'OAuth2 Server',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+    ),
+    'uninstall' => array (
+        'execute_sql' => 1,
+        'update_languages' => 1,
+    ),
+    'enable' => array(
+        'execute_sql' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable' => array (
+        'execute_sql' => 1,
+        'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Dependencies Section
+     */
+    'dependencies' => array(),
+);
+
+/** @} */

+ 51 - 0
modules/boonex/ocean/updates/11.0.0_11.0.1/install/config.php

@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'title' => 'Ocean',
+    'version_from' => '11.0.0',
+    'version_to' => '11.0.1',
+    'vendor' => 'BoonEx',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/ocean/updates/update_11.0.0_11.0.1/',
+    'home_uri' => 'ocean_update_1100_1101',
+
+    'module_dir' => 'boonex/ocean/',
+    'module_uri' => 'ocean',
+
+    'db_prefix' => 'bx_ocean_',
+    'class_prefix' => 'BxOcean',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 0,
+        'update_files' => 1,
+        'update_languages' => 0,
+        'clear_db_cache' => 0,
+    ),
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'BoonEx Ocean',
+
+    /**
+     * Files Section
+     */
+    'delete_files' => array(),
+);

+ 26 - 0
modules/boonex/ocean/updates/11.0.0_11.0.1/install/installer.php

@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+class BxOceanUpdater extends BxDolStudioUpdater
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+
+    public function update($aParams)
+    {
+        $aResult = parent::update($aParams);
+        if(!$aResult['result'])
+            return $aResult;
+
+        $oCacheUtilities = BxDolCacheUtilities::getInstance();
+        $oCacheUtilities->clear('css');
+        $oCacheUtilities->clear('template');
+
+        return $aResult;
+    }
+}

+ 53 - 0
modules/boonex/ocean/updates/11.0.0_11.0.1/source/data/template/bx_timeline/css/view.less

@@ -0,0 +1,53 @@
+@import (reference) '../../system/css/default.less';
+@import '../../../../../timeline/template/css/view.css';
+
+div.bx-tl-item-text div.bx-tl-content.bx-tl-overflow:before {
+    background: -webkit-linear-gradient(top, transparent, @bx-color-box);
+    background: -moz-linear-gradient(top, transparent, @bx-color-box);
+    background: -o-linear-gradient(top, transparent, @bx-color-box);
+    background: linear-gradient(to bottom, transparent, @bx-color-box);
+}
+
+div.bx-tl-activity ul.bx-menu-object-bx_timeline_menu_item_actions {
+    .bx-def-margin-thd-leftright-neg;
+
+    .margin-top(-@bx-margin-thd);
+}
+
+div.bx-tl-activity ul.bx-menu-object-bx_timeline_menu_item_actions li  {
+    .bx-def-margin-thd;
+}
+
+/*+++ Item Menu +++*/
+.bx-tl-item-menu  .bx-tl-item-menu-button,
+.bx-menu-hor.bx-menu-hor-inline.bx-menu-object-bx_timeline_menu_item_actions li {
+    padding: 5px 10px;
+
+    border: 1px solid #b9e2f6;
+    border-radius: 3px;
+    -moz-border-radius: 3px;
+    -webkit-border-radius: 3px;
+
+    background-color: #fff;
+}
+
+.bx-menu-hor.bx-menu-hor-inline.bx-menu-object-bx_timeline_menu_item_actions li > a,
+.bx-menu-hor.bx-menu-hor-inline.bx-menu-object-bx_timeline_menu_item_actions li > span,
+.bx-menu-hor.bx-menu-hor-inline.bx-menu-object-bx_timeline_menu_item_actions li > div {
+    margin:0;
+}
+
+/*+++ Item Owner +++*/
+div.bx-tl-owner-name {
+    font-weight: bold;
+    font-size: 20px;
+    font-size: 1.25rem;
+}
+div.bx-tl-item-info {
+
+}
+
+/*+++ Item Text +++*/
+div.bx-tl-title {
+    font-weight: bold;
+}

+ 35 - 0
modules/boonex/ocean/updates/11.0.0_11.0.1/source/data/template/studio/css/forms.css

@@ -0,0 +1,35 @@
+@import url(../../../../../../../studio/template/css/forms.css);
+
+/* form inputs */
+.bx-form-input-slider,
+.bx-form-input-doublerange,
+.bx-form-input-select_multiple,
+.bx-form-input-select,
+.bx-form-input-radio_set,
+.bx-form-input-checkbox_set,
+.bx-form-input-number,
+.bx-form-input-time,
+.bx-form-input-datepicker,
+.bx-form-input-datetime,
+.bx-form-input-textarea,
+.bx-form-input-text,
+.bx-form-input-wrapper-password {
+    border-color:#6097b0;
+}
+
+.bx-form-input-slider:focus,
+.bx-form-input-doublerange:focus,
+.bx-form-input-number:focus,
+.bx-form-input-time:focus,
+.bx-form-input-datepicker:focus,
+.bx-form-input-datetime:focus,
+.bx-form-input-textarea:focus,
+.bx-form-input-text:focus,
+.bx-form-input-wrapper-password.bx-form-input-focus {
+    border-color:#57889e;
+}
+
+/* switcher */
+.bx-switcher-cont {
+    border-color: #6097b0;
+}

+ 35 - 0
modules/boonex/ocean/updates/11.0.0_11.0.1/source/data/template/system/css/forms.css

@@ -0,0 +1,35 @@
+@import url(../../../../../../../template/css/forms.css);
+
+/* form inputs */
+.bx-form-input-slider,
+.bx-form-input-doublerange,
+.bx-form-input-select_multiple,
+.bx-form-input-select,
+.bx-form-input-radio_set,
+.bx-form-input-checkbox_set,
+.bx-form-input-number,
+.bx-form-input-time,
+.bx-form-input-datepicker,
+.bx-form-input-datetime,
+.bx-form-input-textarea,
+.bx-form-input-text,
+.bx-form-input-wrapper-password {
+    border-color:#6097b0;
+}
+
+.bx-form-input-slider:focus,
+.bx-form-input-doublerange:focus,
+.bx-form-input-number:focus,
+.bx-form-input-time:focus,
+.bx-form-input-datepicker:focus,
+.bx-form-input-datetime:focus,
+.bx-form-input-textarea:focus,
+.bx-form-input-text:focus,
+.bx-form-input-wrapper-password.bx-form-input-focus {
+    border-color:#57889e;
+}
+
+/* switcher */
+.bx-switcher-cont {
+    border-color: #6097b0;
+}

+ 68 - 0
modules/boonex/ocean/updates/11.0.0_11.0.1/source/install/config.php

@@ -0,0 +1,68 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Ocean Ocean Template
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_TEMPLATE,
+    'name' => 'bx_ocean',
+    'title' => 'Ocean',
+    'note' => 'Design template',
+    'version' => '11.0.1',
+    'vendor' => 'BoonEx',
+    'help_url' => 'http://feed.una.io/?section={module_name}',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/ocean/',
+    'home_uri' => 'ocean',
+
+    'db_prefix' => 'bx_ocean_',
+    'class_prefix' => 'BxOcean',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'BoonEx Ocean',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+    	'clear_db_cache' => 1
+    ),
+    'uninstall' => array (
+        'execute_sql' => 1,
+        'update_languages' => 1,
+    	'clear_db_cache' => 1
+    ),
+    'enable' => array(
+        'execute_sql' => 1
+    ),
+    'disable' => array(
+        'execute_sql' => 1
+    ),
+
+    /**
+     * Dependencies Section
+     */
+    'dependencies' => array(),
+);
+
+/** @} */

+ 51 - 0
modules/boonex/organizations/updates/11.0.0_11.0.1/install/config.php

@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'title' => 'Organizations',
+    'version_from' => '11.0.0',
+    'version_to' => '11.0.1',
+    'vendor' => 'BoonEx',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/organizations/updates/update_11.0.0_11.0.1/',
+    'home_uri' => 'orgs_update_1100_1101',
+
+    'module_dir' => 'boonex/organizations/',
+    'module_uri' => 'orgs',
+
+    'db_prefix' => 'bx_organizations_',
+    'class_prefix' => 'BxOrgs',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_files' => 1,
+        'update_languages' => 0,
+        'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Organizations',
+
+    /**
+     * Files Section
+     */
+    'delete_files' => array(),
+);

+ 13 - 0
modules/boonex/organizations/updates/11.0.0_11.0.1/install/installer.php

@@ -0,0 +1,13 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+class BxOrgsUpdater extends BxDolStudioUpdater
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+}

+ 6 - 0
modules/boonex/organizations/updates/11.0.0_11.0.1/install/sql/enable.sql

@@ -0,0 +1,6 @@
+-- MENU
+UPDATE `sys_menu_items` SET `visible_for_levels`='2147483647' WHERE `set_name`='bx_organizations_view_actions' AND `name`='profile-set-acl-level';
+
+UPDATE `sys_menu_items` SET `visible_for_levels`='2147483647' WHERE `set_name`='bx_organizations_view_actions_all' AND `name`='profile-set-acl-level';
+
+DELETE FROM `sys_menu_items` WHERE `set_name`='bx_organizations_view_actions_all' AND `name`='repost';

+ 88 - 0
modules/boonex/organizations/updates/11.0.0_11.0.1/source/classes/BxOrgsModule.php

@@ -0,0 +1,88 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Organizations Organizations
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Organizations profiles module.
+ */
+class BxOrgsModule extends BxBaseModGroupsModule
+{
+    function __construct(&$aModule)
+    {
+        parent::__construct($aModule);
+
+        $CNF = &$this->_oConfig->CNF;
+
+        $this->_aSearchableNamesExcept[] = $CNF['FIELD_AUTHOR'];
+        $this->_aSearchableNamesExcept[] = $CNF['FIELD_JOIN_CONFIRMATION'];
+    }
+
+	/**
+     * Check if this module entry can be used as profile
+     */
+    public function serviceActAsProfile ()
+    {
+        return true;
+    }
+
+    public function serviceGetSearchResultUnit ($iContentId, $sUnitTemplate = '')
+    {
+        if(empty($sUnitTemplate))
+            $sUnitTemplate = 'unit_with_cover.html';
+
+        return parent::serviceGetSearchResultUnit($iContentId, $sUnitTemplate);
+    }
+
+    /**
+     * @see BxBaseModProfileModule::serviceGetSpaceTitle
+     */ 
+    public function serviceGetSpaceTitle()
+    {
+        return BxBaseModProfileModule::serviceGetSpaceTitle();
+    }
+    
+    /**
+     * @see iBxDolProfileService::serviceGetParticipatingProfiles
+     */ 
+    public function serviceGetParticipatingProfiles($iProfileId, $aConnectionObjects = false)
+    {
+        if (false === $aConnectionObjects)
+            $aConnectionObjects = array('sys_profiles_friends');
+        return BxBaseModProfileModule::serviceGetParticipatingProfiles($iProfileId, $aConnectionObjects);
+    }
+    
+    public function servicePrepareFields ($aFieldsProfile)
+    {
+        return parent::_servicePrepareFields($aFieldsProfile, array('org_cat' => 35), array(
+            'org_name' => 'name',
+            'org_desc' => 'description',
+        ));
+    }
+
+    public function serviceGetTimelineData()
+    {
+    	return BxBaseModProfileModule::serviceGetTimelineData();
+    }
+
+    public function onFanRemovedFromAdmins($iGroupProfileId, $iProfileId)
+    {
+        if (!($oProfile = BxDolProfile::getInstance($iProfileId)))
+            return false;
+        $oAccount = $oProfile->getAccountObject();
+        $oAccount->updateProfileContextAuto();
+    }
+
+    public function checkAllowedContact($aDataEntry, $isPerformAction = false)
+    {
+        return BxBaseModProfileModule::checkAllowedContact($aDataEntry, $isPerformAction);
+    }
+}
+
+/** @} */

+ 152 - 0
modules/boonex/organizations/updates/11.0.0_11.0.1/source/install/config.php

@@ -0,0 +1,152 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Organizations Organizations
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_MODULE,
+    'name' => 'bx_organizations',
+    'title' => 'Organizations',
+    'note' => 'Basic organization profiles functionality.',
+    'version' => '11.0.1',
+    'vendor' => 'BoonEx',
+    'help_url' => 'http://feed.una.io/?section={module_name}',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/organizations/',
+    'home_uri' => 'orgs',
+
+    'db_prefix' => 'bx_organizations_',
+    'class_prefix' => 'BxOrgs',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Organizations',
+
+    /**
+     * Connections.
+     */
+    'connections' => array(
+    	'sys_profiles_friends' => array ('type' => 'profiles'),
+        'sys_profiles_subscriptions' => array ('type' => 'profiles'),
+        'sys_profiles_relations' => array ('type' => 'profiles'),
+    ),
+
+    /**
+     * Menu triggers.
+     */
+    'menu_triggers' => array(
+        'trigger_profile_view_submenu',
+        'trigger_profile_snippet_meta',
+        'trigger_profile_view_actions',
+    ),
+
+    /**
+     * Page triggers.
+     */
+    'page_triggers' => array (
+    	'trigger_page_profile_view_entry', 
+    ),
+
+	/**
+     * Storage objects to automatically delete files from upon module uninstallation.
+     * Note. Don't add storage objects used in transcoder objects.
+     */
+    'storages' => array(
+    	'bx_organizations_pics'
+    ),
+
+	/**
+     * Transcoders.
+     */
+    'transcoders' => array(
+    	'bx_organizations_icon', 
+    	'bx_organizations_thumb', 
+    	'bx_organizations_avatar', 
+        'bx_organizations_avatar_big', 
+    	'bx_organizations_picture', 
+    	'bx_organizations_cover', 
+    	'bx_organizations_cover_thumb',
+    	'bx_organizations_gallery'
+    ),
+
+	/**
+     * Extended Search Forms.
+     */
+    'esearches' => array(
+        'bx_organizations',
+    	'bx_organizations_cmts',
+    ),
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'uninstall' => array (
+    	'process_esearches' => 1,
+        'execute_sql' => 1,
+        'update_languages' => 1,
+    	'process_connections' => 1,
+    	'process_deleted_profiles' => 1,
+    	'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable' => array(
+        'execute_sql' => 1,
+    	'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable_success' => array(
+    	'process_menu_triggers' => 1,
+    	'process_page_triggers' => 1,
+    	'process_esearches' => 1,
+    	'register_transcoders' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable' => array (
+        'execute_sql' => 1,
+    	'unregister_transcoders' => 1,
+    	'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable_failed' => array (
+    	'register_transcoders' => 1,
+    	'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Dependencies Section
+     */
+    'dependencies' => array(),
+
+    /**
+     * Connections Section
+     */
+    'relations' => array(
+        'bx_timeline',
+        'bx_notifications',
+    ),
+);
+
+/** @} */

+ 628 - 0
modules/boonex/organizations/updates/11.0.0_11.0.1/source/install/sql/enable.sql

@@ -0,0 +1,628 @@
+
+-- SETTINGS
+
+SET @iTypeOrder = (SELECT MAX(`order`) FROM `sys_options_types` WHERE `group` = 'modules');
+INSERT INTO `sys_options_types`(`group`, `name`, `caption`, `icon`, `order`) VALUES 
+('modules', 'bx_organizations', '_bx_orgs', 'bx_organizations@modules/boonex/organizations/|std-icon.svg', IF(ISNULL(@iTypeOrder), 1, @iTypeOrder + 1));
+SET @iTypeId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options_categories` (`type_id`, `name`, `caption`, `order`)
+VALUES (@iTypeId, 'bx_organizations', '_bx_orgs', 1);
+SET @iCategId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `extra`, `check`, `check_error`, `order`) VALUES
+('bx_organizations_autoapproval', 'on', @iCategId, '_bx_orgs_option_autoapproval', 'checkbox', '', '', '', 1),
+('bx_organizations_default_acl_level', '3', @iCategId, '_bx_orgs_option_default_acl_level', 'select', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:15:"get_memberships";s:6:"params";a:4:{s:11:"purchasable";b:0;s:6:"active";b:1;s:9:"translate";b:1;s:22:"filter_out_auto_levels";b:1;}s:5:"class";s:16:"TemplAclServices";}', '', '', 2),
+('bx_organizations_redirect_aadd', 'profile', @iCategId, '_bx_orgs_option_redirect_aadd', 'select', 'a:2:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:30:"get_options_redirect_after_add";}', '', '', 3),
+('bx_organizations_redirect_aadd_custom_url', '', @iCategId, '_bx_orgs_option_redirect_aadd_custom_url', 'digit', '', '', '', 4),
+('bx_organizations_num_connections_quick', '6', @iCategId, '_bx_orgs_option_num_connections_quick', 'digit', '', '', '', 10),
+('bx_organizations_per_page_browse', '24', @iCategId, '_bx_orgs_option_per_page_browse', 'digit', '', '', '', 11),
+('bx_organizations_num_rss', '10', @iCategId, '_bx_orgs_option_num_rss', 'digit', '', '', '', 12),
+('bx_organizations_per_page_browse_showcase', '32', @iCategId, '_sys_option_per_page_browse_showcase', 'digit', '', '', '', 15),
+('bx_organizations_per_page_browse_recommended', '10', @iCategId, '_sys_option_per_page_browse_recommended', 'digit', '', '', '', 16),
+('bx_organizations_searchable_fields', 'org_name,org_desc', @iCategId, '_bx_orgs_option_searchable_fields', 'list', 'a:2:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:21:"get_searchable_fields";}', '', '', 20),
+('bx_organizations_public_subscriptions', '', @iCategId, '_bx_orgs_option_public_subscriptions', 'checkbox', '', '', '', 30),
+('bx_organizations_public_subscribed_me', '', @iCategId, '_bx_orgs_option_public_subscribed_me', 'checkbox', '', '', '', 31),
+('bx_organizations_enable_profile_activation_letter', 'on', @iCategId, '_bx_orgs_option_enable_profile_activation_letter', 'checkbox', '', '', '', 32);
+
+-- PAGES
+
+-- PAGE: create profile
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_create_profile', 'create-organization-profile', '_bx_orgs_page_title_sys_create_profile', '_bx_orgs_page_title_create_profile', 'bx_organizations', 5, 2147483647, 1, 'page.php?i=create-organization-profile', '', '', '', 0, 1, 0, '', '');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES
+('bx_organizations_create_profile', 1, 'bx_organizations', '_bx_orgs_page_block_title_choose_type', 11, 2147483647, 'menu', 'sys_add_profile_vertical', 0, 1, 0, 0),
+('bx_organizations_create_profile', 1, 'bx_organizations', '_bx_orgs_page_block_title_create_profile', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:13:\"entity_create\";}', 0, 1, 1, 1);
+
+-- PAGE: view profile
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_view_profile', 'view-organization-profile', '_bx_orgs_page_title_sys_view_profile', '_bx_orgs_page_title_view_profile', 'bx_organizations', 7, 2147483647, 1, 'page.php?i=view-organization-profile', '', '', '', 0, 1, 0, 'BxOrgsPageEntry', 'modules/boonex/organizations/classes/BxOrgsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES
+('bx_organizations_view_profile', 2, 'bx_organizations', '', '_bx_orgs_page_block_title_profile_subscriptions', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:21:\"profile_subscriptions\";}', 0, 1, 0, 0),
+('bx_organizations_view_profile', 2, 'bx_organizations', '', '_bx_orgs_page_block_title_profile_subscribed_me', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:21:\"profile_subscribed_me\";}', 0, 1, 0, 0),
+('bx_organizations_view_profile', 2, 'bx_organizations', '', '_bx_orgs_page_block_title_profile_related_me', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:18:"profile_related_me";}', 0, 1, 0, 0),
+('bx_organizations_view_profile', 2, 'bx_organizations', '', '_bx_orgs_page_block_title_profile_relations', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:17:"profile_relations";}', 0, 1, 0, 0),
+('bx_organizations_view_profile', 2, 'bx_organizations', '', '_bx_orgs_page_block_title_profile_comments', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:15:\"entity_comments\";}', 0, 0, 0, 0),
+('bx_organizations_view_profile', 2, 'bx_organizations', '', '_bx_orgs_page_block_title_profile_description', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:17:\"entity_text_block\";}', 0, 0, 1, 1),
+('bx_organizations_view_profile', 2, 'bx_organizations', '', '_bx_orgs_page_block_title_fans', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:4:\"fans\";}', 0, 0, 1, 2),
+('bx_organizations_view_profile', 2, 'bx_organizations', '', '_bx_orgs_page_block_title_profile_friends', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:15:\"profile_friends\";}', 0, 1, 1, 3),
+('bx_organizations_view_profile', 3, 'bx_organizations', '', '_bx_orgs_page_block_title_profile_location', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:15:\"entity_location\";}', 0, 0, 0, 0),
+('bx_organizations_view_profile', 3, 'bx_organizations', '', '_bx_orgs_page_block_title_profile_info', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:11:\"entity_info\";}', 0, 0, 1, 1),
+('bx_organizations_view_profile', 3, 'bx_organizations', '', '_bx_orgs_page_block_title_profile_all_actions', 13, 2147483647, 'service', 'a:2:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:18:"entity_all_actions";}', 0, 0, 0, 0),
+('bx_organizations_view_profile', 3, 'bx_organizations', '', '_bx_orgs_page_block_title_profile_membership', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:18:\"profile_membership\";}', 0, 0, 1, 2),
+('bx_organizations_view_profile', 3, 'bx_organizations', '', '_bx_orgs_page_block_title_admins', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:6:\"admins\";}', 0, 0, 1, 3),
+('bx_organizations_view_profile', 3, 'bx_organizations', '', '_bx_orgs_page_block_title_profile_location', 3, 2147483647, 'service', 'a:4:{s:6:\"module\";s:6:\"system\";s:6:\"method\";s:13:\"locations_map\";s:6:\"params\";a:2:{i:0;s:16:\"bx_organizations\";i:1;s:12:\"{content_id}\";}s:5:\"class\";s:20:\"TemplServiceMetatags\";}', 0, 0, 1, 4);
+
+-- PAGE: view closed profile 
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_view_profile_closed', 'view-organization-profile-closed', '_bx_orgs_page_title_sys_view_profile_closed', '_bx_orgs_page_title_view_profile', 'bx_organizations', 10, 2147483647, 1, 'page.php?i=view-organization-profile', '', '', '', 0, 1, 0, 'BxOrgsPageEntry', 'modules/boonex/organizations/classes/BxOrgsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_organizations_view_profile_closed', 2, 'bx_organizations', '', '_bx_orgs_page_block_title_profile_info', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:11:\"entity_info\";}', 0, 0, 1, 0),
+('bx_organizations_view_profile_closed', 3, 'bx_organizations', '', '_bx_orgs_page_block_title_fans', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:4:\"fans\";}', 0, 0, 1, 0);
+
+-- PAGE: edit profile
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_edit_profile', 'edit-organization-profile', '_bx_orgs_page_title_sys_edit_profile', '_bx_orgs_page_title_edit_profile', 'bx_organizations', 5, 2147483647, 1, 'page.php?i=edit-organization-profile', '', '', '', 0, 1, 0, 'BxOrgsPageEntry', 'modules/boonex/organizations/classes/BxOrgsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_organizations_edit_profile', 1, 'bx_organizations', '_bx_orgs_page_block_title_edit_profile', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:11:\"entity_edit\";}', 0, 0, 0);
+
+-- PAGE: edit profile cover
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_edit_profile_cover', 'edit-organization-cover', '_bx_orgs_page_title_sys_edit_profile_cover', '_bx_orgs_page_title_edit_profile_cover', 'bx_organizations', 5, 2147483647, 1, 'page.php?i=edit-organization-cover', '', '', '', 0, 1, 0, 'BxOrgsPageEntry', 'modules/boonex/organizations/classes/BxOrgsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_organizations_edit_profile_cover', 1, 'bx_organizations', '_bx_orgs_page_block_title_edit_profile_cover', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:17:\"entity_edit_cover\";}', 0, 0, 0);
+
+-- PAGE: invite members
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_invite', 'invite-to-organization', '_bx_orgs_page_title_sys_invite_to_organization', '_bx_orgs_page_title_invite_to_organization', 'bx_organizations', 5, 2147483647, 1, 'page.php?i=invite-to-organization', '', '', '', 0, 1, 0, 'BxOrgsPageEntry', 'modules/boonex/organizations/classes/BxOrgsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_organizations_invite', 1, 'bx_organizations', '_bx_orgs_page_block_title_invite_to_organization', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:13:\"entity_invite\";}', 0, 0, 0);
+
+-- PAGE: delete profile
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_delete_profile', 'delete-organization-profile', '_bx_orgs_page_title_sys_delete_profile', '_bx_orgs_page_title_delete_profile', 'bx_organizations', 5, 2147483647, 1, 'page.php?i=delete-organization-profile', '', '', '', 0, 1, 0, 'BxOrgsPageEntry', 'modules/boonex/organizations/classes/BxOrgsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_organizations_delete_profile', 1, 'bx_organizations', '_bx_orgs_page_block_title_delete_profile', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:13:\"entity_delete\";}', 0, 0, 0);
+
+-- PAGE: profile info
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_profile_info', 'organization-profile-info', '_bx_orgs_page_title_sys_profile_info', '_bx_orgs_page_title_profile_info', 'bx_organizations', 5, 2147483647, 1, 'page.php?i=organization-profile-info', '', '', '', 0, 1, 0, 'BxOrgsPageEntry', 'modules/boonex/organizations/classes/BxOrgsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_organizations_profile_info', 1, 'bx_organizations', '_bx_orgs_page_block_title_system_profile_info', '_bx_orgs_page_block_title_profile_info_link', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:16:\"entity_info_full\";}', 0, 0, 1, 1),
+('bx_organizations_profile_info', 1, 'bx_organizations', '', '_bx_orgs_page_block_title_profile_description', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:17:\"entity_text_block\";}', 0, 0, 1, 2);
+
+-- PAGE: group fans
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_fans', 'organization-profile-fans', '_bx_orgs_page_title_sys_fans', '_bx_orgs_page_title_fans', 'bx_organizations', 5, 2147483647, 1, 'page.php?i=organization-profile-fans', '', '', '', 0, 1, 0, 'BxOrgsPageEntry', 'modules/boonex/organizations/classes/BxOrgsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_organizations_fans', 1, 'bx_organizations', '_bx_orgs_page_block_title_system_fans', '_bx_orgs_page_block_title_fans_link', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:10:"fans_table";}', 0, 0, 1, 1);
+
+-- PAGE: profile friends
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_profile_friends', 'organization-profile-friends', '_bx_orgs_page_title_sys_profile_friends', '_bx_orgs_page_title_profile_friends', 'bx_organizations', 5, 2147483647, 1, 'page.php?i=organization-profile-friends', '', '', '', 0, 1, 0, 'BxOrgsPageEntry', 'modules/boonex/organizations/classes/BxOrgsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_organizations_profile_friends', 1, 'bx_organizations', '_bx_orgs_page_block_title_system_profile_friends', '_bx_orgs_page_block_title_profile_friends_link', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:6:\"system\";s:6:\"method\";s:17:\"connections_table\";s:5:\"class\";s:23:\"TemplServiceConnections\";}', 0, 0, 1, 1);
+
+-- PAGE: profile friend requests
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_friend_requests', 'organization-friend-requests', '_bx_orgs_page_title_sys_friend_requests', '_bx_orgs_page_title_friend_requests', 'bx_organizations', 5, 2147483647, 1, 'page.php?i=organization-friend-requests', '', '', '', 0, 1, 0, 'BxOrgsPageEntry', 'modules/boonex/organizations/classes/BxOrgsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_organizations_friend_requests', 1, 'bx_organizations', '_bx_orgs_page_block_title_system_friend_requests', '_bx_orgs_page_block_title_friend_requests_link', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:6:\"system\";s:6:\"method\";s:25:\"connections_request_table\";s:5:\"class\";s:23:\"TemplServiceConnections\";}', 0, 0, 1, 1);
+
+-- PAGE: profile favorites
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_profile_favorites', 'organization-profile-favorites', '_bx_orgs_page_title_sys_profile_favorites', '_bx_orgs_page_title_profile_favorites', 'bx_organizations', 5, 2147483647, 1, 'page.php?i=organization-profile-favorites', '', '', '', 0, 1, 0, 'BxOrgsPageBrowse', 'modules/boonex/organizations/classes/BxOrgsPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_organizations_profile_favorites', 1, 'bx_organizations', '_bx_orgs_page_block_title_system_profile_favorites', '_bx_orgs_page_block_title_profile_favorites', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:15:"browse_favorite";}', 0, 1, 1, 1);
+
+-- PAGE: profile subscriptions
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_profile_subscriptions', 'organization-profile-subscriptions', '_bx_orgs_page_title_sys_profile_subscriptions', '_bx_orgs_page_title_profile_subscriptions', 'bx_organizations', 5, 2147483647, 1, 'page.php?i=organization-profile-subscriptions', '', '', '', 0, 1, 0, 'BxOrgsPageEntry', 'modules/boonex/organizations/classes/BxOrgsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_organizations_profile_subscriptions', 1, 'bx_organizations', '_bx_orgs_page_block_title_system_profile_subscriptions', '_bx_orgs_page_block_title_profile_subscriptions', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:6:\"system\";s:6:\"method\";s:19:\"subscriptions_table\";s:5:\"class\";s:23:\"TemplServiceConnections\";}', 0, 0, 1, 1),
+('bx_organizations_profile_subscriptions', 1, 'bx_organizations', '_bx_orgs_page_block_title_system_profile_subscribed_me', '_bx_orgs_page_block_title_profile_subscribed_me', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:6:\"system\";s:6:\"method\";s:19:\"subscribed_me_table\";s:5:\"class\";s:23:\"TemplServiceConnections\";}', 0, 0, 1, 2);
+
+-- PAGE: profile relations
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_profile_relations', 'organization-profile-relations', '_bx_orgs_page_title_sys_profile_relations', '_bx_orgs_page_title_profile_relations', 'bx_organizations', 5, 2147483647, 1, 'page.php?i=organization-profile-relations', '', '', '', 0, 1, 0, 'BxOrgsPageEntry', 'modules/boonex/organizations/classes/BxOrgsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_organizations_profile_relations', 1, 'bx_organizations', '_bx_orgs_page_block_title_system_profile_relations', '_bx_orgs_page_block_title_profile_relations', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:6:"system";s:6:"method";s:15:"relations_table";s:5:"class";s:23:"TemplServiceConnections";}', 0, 0, 1, 1),
+('bx_organizations_profile_relations', 1, 'bx_organizations', '_bx_orgs_page_block_title_system_profile_related_me', '_bx_orgs_page_block_title_profile_related_me', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:6:"system";s:6:"method";s:16:"related_me_table";s:5:"class";s:23:"TemplServiceConnections";}', 0, 0, 1, 2);
+
+-- PAGE: view entry comments
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_profile_comments', '_bx_orgs_page_title_sys_profile_comments', '_bx_orgs_page_title_profile_comments', 'bx_organizations', 5, 2147483647, 1, 'organization-profile-comments', '', '', '', '', 0, 1, 0, 'BxOrgsPageEntry', 'modules/boonex/organizations/classes/BxOrgsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_organizations_profile_comments', 1, 'bx_organizations', '_bx_orgs_page_block_title_profile_comments', '_bx_orgs_page_block_title_profile_comments_link', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:15:\"entity_comments\";}', 0, 0, 0, 1);
+
+-- PAGE: module home
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_home', '_bx_orgs_page_title_sys_recent', '_bx_orgs_page_title_recent', 'bx_organizations', 5, 2147483647, 1, 'organizations-home', 'page.php?i=organizations-home', '', '', '', 0, 1, 0, 'BxOrgsPageBrowse', 'modules/boonex/organizations/classes/BxOrgsPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
+('bx_organizations_home', 1, 'bx_organizations', '_bx_orgs_page_block_title_featured_profiles', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:15:"browse_featured";s:6:"params";a:1:{i:0;s:7:"gallery";}}', 0, 1, 0),
+('bx_organizations_home', 1, 'bx_organizations', '_bx_orgs_page_block_title_latest_profiles', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:22:\"browse_recent_profiles\";s:6:"params";a:1:{i:0;b:1;}}', 0, 1, 1);
+
+-- PAGE: active profiles
+
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_active', '_bx_orgs_page_title_sys_active', '_bx_orgs_page_title_active', 'bx_organizations', 5, 2147483647, 1, 'organizations-active', 'page.php?i=organizations-active', '', '', '', 0, 1, 0, 'BxOrgsPageBrowse', 'modules/boonex/organizations/classes/BxOrgsPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_organizations_active', 1, 'bx_organizations', '_bx_orgs_page_block_title_active_profiles', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:22:"browse_active_profiles";s:6:"params";a:2:{s:9:"unit_view";s:7:"gallery";s:13:"empty_message";b:1;}}}', 0, 1, 0);
+
+-- PAGE: online profiles
+
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_online', '_bx_orgs_page_title_sys_online', '_bx_orgs_page_title_online', 'bx_organizations', 5, 2147483647, 1, 'organizations-online', 'page.php?i=organizations-online', '', '', '', 0, 1, 0, 'BxOrgsPageBrowse', 'modules/boonex/organizations/classes/BxOrgsPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_organizations_online', 1, 'bx_organizations', '_bx_orgs_page_block_title_online_profiles', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:22:\"browse_online_profiles\";s:6:"params";a:1:{i:0;b:1;}}', 0, 1, 0);
+
+-- PAGE: search for entries
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_search', '_bx_orgs_page_title_sys_entries_search', '_bx_orgs_page_title_entries_search', 'bx_organizations', 5, 2147483647, 1, 'organizations-search', 'page.php?i=organizations-search', '', '', '', 0, 1, 0, 'BxOrgsPageBrowse', 'modules/boonex/organizations/classes/BxOrgsPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_organizations_search', 1, 'bx_organizations', '_bx_orgs_page_block_title_search_form', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:8:"get_form";s:6:"params";a:1:{i:0;a:1:{s:6:"object";s:16:"bx_organizations";}}s:5:"class";s:27:"TemplSearchExtendedServices";}', 0, 1, 1, 1),
+('bx_organizations_search', 1, 'bx_organizations', '_bx_orgs_page_block_title_search_results', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:11:"get_results";s:6:"params";a:1:{i:0;a:2:{s:6:"object";s:16:"bx_organizations";s:10:"show_empty";b:1;}}s:5:"class";s:27:"TemplSearchExtendedServices";}', 0, 1, 1, 2),
+('bx_organizations_search', 1, 'bx_organizations', '_bx_orgs_page_block_title_search_form_cmts', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:8:"get_form";s:6:"params";a:1:{i:0;a:1:{s:6:"object";s:21:"bx_organizations_cmts";}}s:5:"class";s:27:"TemplSearchExtendedServices";}', 0, 1, 0, 3),
+('bx_organizations_search', 1, 'bx_organizations', '_bx_orgs_page_block_title_search_results_cmts', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:11:"get_results";s:6:"params";a:1:{i:0;a:2:{s:6:"object";s:21:"bx_organizations_cmts";s:10:"show_empty";b:1;}}s:5:"class";s:27:"TemplSearchExtendedServices";}', 0, 1, 0, 4);
+
+-- PAGE: module manage own
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_manage', '_bx_orgs_page_title_sys_manage', '_bx_orgs_page_title_manage', 'bx_organizations', 5, 2147483647, 1, 'organizations-manage', 'page.php?i=organizations-manage', '', '', '', 0, 1, 0, 'BxOrgsPageBrowse', 'modules/boonex/organizations/classes/BxOrgsPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_organizations_manage', 1, 'bx_organizations', '_bx_orgs_page_block_title_system_manage', '_bx_orgs_page_block_title_manage', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:12:\"manage_tools\";}}', 0, 1, 0);
+
+-- PAGE: module manage all
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_administration', '_bx_orgs_page_title_sys_manage_administration', '_bx_orgs_page_title_manage', 'bx_organizations', 5, 192, 1, 'organizations-administration', 'page.php?i=organizations-administration', '', '', '', 0, 1, 0, 'BxOrgsPageBrowse', 'modules/boonex/organizations/classes/BxOrgsPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_organizations_administration', 1, 'bx_organizations', '_bx_orgs_page_block_title_system_manage_administration', '_bx_orgs_page_block_title_manage', 11, 192, 'service', 'a:3:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:12:\"manage_tools\";s:6:\"params\";a:1:{i:0;s:14:\"administration\";}}', 0, 1, 0);
+
+-- PAGE: user's organizations
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_joined', 'joined-organizations', '_bx_orgs_page_title_sys_joined_entries', '_bx_orgs_page_title_joined_entries', 'bx_organizations', 5, 2147483647, 1, '', '', '', '', 0, 1, 0, 'BxOrgsPageJoinedEntries', 'modules/boonex/organizations/classes/BxOrgsPageJoinedEntries.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES
+('bx_organizations_joined', 1, 'bx_organizations', '_bx_orgs_page_block_title_sys_entries_actions', '_bx_orgs_page_block_title_entries_actions', 13, 2147483647, 'service', 'a:2:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:18:"my_entries_actions";}', 0, 0, 1, 1),
+('bx_organizations_joined', 1, 'bx_organizations', '_bx_orgs_page_block_title_sys_favorites_of_author', '_bx_orgs_page_block_title_favorites_of_author', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:15:"browse_favorite";s:6:"params";a:1:{i:0;s:12:"{profile_id}";}}', 0, 1, 1, 1),
+('bx_organizations_joined', 1, 'bx_organizations', '_bx_orgs_page_block_title_sys_joined_entries', '_bx_orgs_page_block_title_joined_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:21:"browse_joined_entries";s:6:"params";a:2:{i:0;i:0;i:1;b:1;}}', 0, 0, 1, 2);
+
+-- PAGE: add block to homepage
+SET @iBlockOrder = (SELECT `order` FROM `sys_pages_blocks` WHERE `object` = 'sys_home' AND `cell_id` = 1 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES
+('sys_home', 1, 'bx_organizations', '', '_bx_orgs_page_block_title_latest_profiles', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:22:"browse_recent_profiles";}', 1, 0, 0, IFNULL(@iBlockOrder, 0) + 1),
+('sys_home', 1, 'bx_organizations', '_bx_orgs_page_block_title_sys_recommended_entries_view_showcase', '_bx_orgs_page_block_title_recommended_entries_view_showcase', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:18:\"browse_recommended\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:8:\"showcase\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 1, 0, 0, IFNULL(@iBlockOrder, 0) + 2);
+
+-- PAGES: add page block to profiles modules (trigger* page objects are processed separately upon modules enable/disable)
+SET @iPBCellProfile = 2;
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES
+('trigger_page_profile_view_entry', @iPBCellProfile, 'bx_organizations', '_bx_orgs_page_block_title_sys_joined_entries', '_bx_orgs_page_block_title_joined_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:21:"browse_joined_entries";s:6:"params";a:2:{i:0;s:12:"{profile_id}";i:1;b:0;}}', 0, 0, 1, 0);
+
+-- PAGE: service blocks
+SET @iBlockOrder = (SELECT `order` FROM `sys_pages_blocks` WHERE `object` = '' AND `cell_id` = 0 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES
+('', 0, 'bx_organizations', '', '_bx_orgs_page_block_title_categories', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:15:"categories_list";s:6:"params";a:2:{i:0;s:21:"bx_organizations_cats";i:1;a:2:{s:10:\"show_empty\";b:1;s:21:\"show_empty_categories\";b:1;}}s:5:"class";s:20:"TemplServiceCategory";}', 1, 1, 1, IFNULL(@iBlockOrder, 0) + 1),
+('', 0, 'bx_organizations', '_bx_orgs_page_block_title_sys_featured_entries_view_showcase', '_bx_orgs_page_block_title_featured_entries_view_showcase', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:15:\"browse_featured\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:8:\"showcase\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 0, 1, 1, IFNULL(@iBlockOrder, 0) + 2),
+('', 0, 'bx_organizations', '_bx_orgs_page_block_title_sys_recommended_entries_view_showcase', '_bx_orgs_page_block_title_recommended_entries_view_showcase', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:18:\"browse_recommended\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:8:\"showcase\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 0, 1, 1, IFNULL(@iBlockOrder, 0) + 3),
+('', 0, 'bx_organizations', '_bx_orgs_page_block_title_sys_active_entries_view_showcase', '_bx_orgs_page_block_title_active_entries_view_showcase', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:22:\"browse_active_profiles\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:16:\"showcase_wo_info\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 0, 1, 1, IFNULL(@iBlockOrder, 0) + 4),
+('', 0, 'bx_organizations', '_bx_orgs_page_block_title_sys_active_profiles', '_bx_orgs_page_block_title_active_profiles', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:16:\"bx_organizations\";s:6:\"method\";s:22:\"browse_active_profiles\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:15:\"gallery_wo_info\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 0, 1, 1, IFNULL(@iBlockOrder, 0) + 5);
+
+
+-- MENU
+
+-- MENU: add to site menu
+SET @iSiteMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_site' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_site', 'bx_organizations', 'organizations-home', '_bx_orgs_menu_item_title_system_entries_home', '_bx_orgs_menu_item_title_entries_home', 'page.php?i=organizations-home', '', '', 'briefcase col-red2', 'bx_organizations_submenu', 2147483647, 1, 1, IFNULL(@iSiteMenuOrder, 0) + 1);
+
+-- MENU: add to homepage menu
+SET @iHomepageMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_homepage' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_homepage', 'bx_organizations', 'organizations-home', '_bx_orgs_menu_item_title_system_entries_home', '_bx_orgs_menu_item_title_entries_home', 'page.php?i=organizations-home', '', '', 'briefcase col-red2', 'bx_organizations_submenu', 2147483647, 1, 1, IFNULL(@iHomepageMenuOrder, 0) + 1);
+
+--SET @iCreateProfileMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_profiles_create' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
+--INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES
+--('sys_profiles_create', 'bx_organizations', 'create-organization-profile', '_bx_orgs_menu_item_title_system_profile_type', '_bx_orgs_menu_item_title_profile_type', 'page.php?i=create-organization-profile', '', '', 'briefcase', '', 2147483647, 1, 1, IFNULL(@iCreateProfileMenuOrder, 0) + 1);
+
+-- MENU: add to create profile menu
+SET @iAddMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_add_profile_links' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_add_profile_links', 'bx_organizations', 'create-organization-profile', '_bx_orgs_menu_item_title_system_create_profile', '_bx_orgs_menu_item_title_create_profile', 'page.php?i=create-organization-profile', '', '', 'briefcase col-red2', '', 2147483647, 1, 1, IFNULL(@iAddMenuOrder, 0) + 1);
+
+-- MENU: view actions
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_view_actions', '_bx_orgs_menu_title_view_profile_actions', 'bx_organizations_view_actions', 'bx_organizations', 9, 0, 1, 'BxOrgsMenuViewActions', 'modules/boonex/organizations/classes/BxOrgsMenuViewActions.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_organizations_view_actions', 'bx_organizations', '_bx_orgs_menu_set_title_view_profile_actions', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `submenu_popup`, `visible_for_levels`, `visibility_custom`, `active`, `copyable`, `editable`, `order`) VALUES 
+('bx_organizations_view_actions', 'bx_organizations', 'profile-fan-add', '_bx_orgs_menu_item_title_system_become_fan', '{title_add_fan}', 'javascript:void(0)', 'bx_conn_action(this, \'bx_organizations_fans\', \'add\', \'{profile_id}\')', '', 'sign-in-alt', '', 0, 2147483647, '', 1, 0, 0, 5),
+('bx_organizations_view_actions', 'bx_organizations', 'profile-friend-add', '_bx_orgs_menu_item_title_system_befriend', '{title_add_friend}', 'javascript:void(0)', 'bx_conn_action(this, \'sys_profiles_friends\', \'add\', \'{profile_id}\')', '', 'user-plus', '', 0, 2147483647, '', 1, 0, 1, 10),
+('bx_organizations_view_actions', 'bx_organizations', 'profile-relation-add', '_bx_orgs_menu_item_title_system_relation_add', '_bx_orgs_menu_item_title_relation_add', 'javascript:void(0)', 'bx_menu_popup(''sys_add_relation'', window, {}, {profile_id: {profile_id}});', '', 'sync', '', 0, 2147483647, '', 1, 0, 1, 15),
+('bx_organizations_view_actions', 'bx_organizations', 'profile-subscribe-add', '_bx_orgs_menu_item_title_system_subscribe', '_bx_orgs_menu_item_title_subscribe', 'javascript:void(0)', 'bx_conn_action(this, \'sys_profiles_subscriptions\', \'add\', \'{profile_id}\')', '', 'check', '', 0, 2147483647, '', 1, 0, 1, 20),
+('bx_organizations_view_actions', 'bx_organizations', 'profile-set-acl-level', '_sys_menu_item_title_system_set_acl_level', '_sys_menu_item_title_set_acl_level', 'javascript:void(0)', 'bx_menu_popup(''sys_set_acl_level'', window, {}, {profile_id: {profile_id}});', '', 'certificate', '', 0, 2147483647, '', 1, 0, 1, 30),
+('bx_organizations_view_actions', 'bx_organizations', 'profile-set-badges', '_sys_menu_item_title_system_set_badges', '_sys_menu_item_title_set_badges', 'javascript:void(0)', 'bx_menu_popup(''sys_set_badges'', window, {}, {module: ''bx_organizations'', content_id: {content_id}});', '', 'check-circle', '', 0, 192, 'a:2:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:19:"is_badges_avaliable";}', 1, 0, 1, 40),
+('bx_organizations_view_actions', 'bx_organizations', 'profile-actions-more', '_bx_orgs_menu_item_title_system_more_actions', '_bx_orgs_menu_item_title_more_actions', 'javascript:void(0)', 'bx_menu_popup(''bx_organizations_view_actions_more'', this, {}, {profile_id:{profile_id}});', '', 'cog', 'bx_organizations_view_actions_more', 1, 2147483647, '', 1, 0, 1, 9999);
+
+-- MENU: view actions more
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_view_actions_more', '_bx_orgs_menu_title_view_profile_actions_more', 'bx_organizations_view_actions_more', 'bx_organizations', 6, 0, 1, 'BxOrgsMenuViewActions', 'modules/boonex/organizations/classes/BxOrgsMenuViewActions.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_organizations_view_actions_more', 'bx_organizations', '_bx_orgs_menu_set_title_view_profile_actions_more', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES
+('bx_organizations_view_actions_more', 'bx_organizations', 'profile-fan-remove', '_bx_orgs_menu_item_title_system_leave_organization', '{title_remove_fan}', 'javascript:void(0)', 'bx_conn_action(this, \'bx_organizations_fans\', \'remove\', \'{profile_id}\')', '', 'sign-out-alt', '', 2147483647, 1, 0, 10),
+('bx_organizations_view_actions_more', 'bx_organizations', 'profile-friend-remove', '_bx_orgs_menu_item_title_system_unfriend', '{title_remove_friend}', 'javascript:void(0)', 'bx_conn_action(this, \'sys_profiles_friends\', \'remove\', \'{profile_id}\')', '', 'user-minus', '', 2147483647, 1, 0, 10),
+('bx_organizations_view_actions_more', 'bx_organizations', 'profile-relation-remove', '_bx_orgs_menu_item_title_system_relation_delete', '_bx_orgs_menu_item_title_relation_delete', 'javascript:void(0)', 'bx_conn_action(this, \'sys_profiles_relations\', \'remove\', \'{profile_id}\')', '', 'sync', '', 2147483647, 1, 0, 15),
+('bx_organizations_view_actions_more', 'bx_organizations', 'profile-subscribe-remove', '_bx_orgs_menu_item_title_system_unsubscribe', '_bx_orgs_menu_item_title_unsubscribe', 'javascript:void(0)', 'bx_conn_action(this, \'sys_profiles_subscriptions\', \'remove\', \'{profile_id}\')', '', 'check', '', 2147483647, 1, 0, 20),
+('bx_organizations_view_actions_more', 'bx_organizations', 'edit-organization-cover', '_bx_orgs_menu_item_title_system_edit_cover', '_bx_orgs_menu_item_title_edit_cover', 'page.php?i=edit-organization-cover&id={content_id}', '', '', 'edit', '', 2147483647, 1, 0, 25),
+('bx_organizations_view_actions_more', 'bx_organizations', 'edit-organization-profile', '_bx_orgs_menu_item_title_system_edit_profile', '_bx_orgs_menu_item_title_edit_profile', 'page.php?i=edit-organization-profile&id={content_id}', '', '', 'pencil-alt', '', 2147483647, 1, 0, 30),
+('bx_organizations_view_actions_more', 'bx_organizations', 'invite-to-organization', '_bx_orgs_menu_item_title_system_invite', '_bx_orgs_menu_item_title_invite', 'page.php?i=invite-to-organization&id={content_id}', '', '', 'user-friends', '', 2147483647, 1, 0, 32),
+('bx_organizations_view_actions_more', 'bx_organizations', 'delete-organization-profile', '_bx_orgs_menu_item_title_system_delete_profile', '_bx_orgs_menu_item_title_delete_profile', 'page.php?i=delete-organization-profile&id={content_id}', '', '', 'remove', '', 2147483647, 1, 0, 40),
+('bx_organizations_view_actions_more', 'bx_organizations', 'delete-organization-account', '_bx_orgs_menu_item_title_system_delete_account', '_bx_orgs_menu_item_title_delete_account', 'page.php?i=account-settings-delete&id={account_id}', '', '', 'user-times', '', 128, 1, 0, 50),
+('bx_organizations_view_actions_more', 'bx_organizations', 'delete-organization-account-content', '_bx_orgs_menu_item_title_system_delete_account_content', '_bx_orgs_menu_item_title_delete_account_content', 'page.php?i=account-settings-delete&id={account_id}&content=1', '', '', 'trash', '', 128, 1, 0, 60);
+
+-- MENU: all actions menu for view entry 
+
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_view_actions_all', '_sys_menu_title_view_actions', 'bx_organizations_view_actions_all', 'bx_organizations', 15, 0, 1, 'BxOrgsMenuViewActionsAll', 'modules/boonex/organizations/classes/BxOrgsMenuViewActionsAll.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_organizations_view_actions_all', 'bx_organizations', '_sys_menu_set_title_view_actions', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `submenu_popup`, `visible_for_levels`, `visibility_custom`, `active`, `copyable`, `order`) VALUES 
+('bx_organizations_view_actions_all', 'bx_organizations', 'profile-fan-add', '_bx_orgs_menu_item_title_system_become_fan', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 10),
+('bx_organizations_view_actions_all', 'bx_organizations', 'profile-fan-remove', '_bx_orgs_menu_item_title_system_leave_organization', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 20),
+('bx_organizations_view_actions_all', 'bx_organizations', 'profile-friend-add', '_bx_orgs_menu_item_title_system_befriend', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 30),
+('bx_organizations_view_actions_all', 'bx_organizations', 'profile-friend-remove', '_bx_orgs_menu_item_title_system_unfriend', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 40),
+('bx_organizations_view_actions_all', 'bx_organizations', 'profile-relation-add', '_bx_orgs_menu_item_title_system_relation_add', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 43),
+('bx_organizations_view_actions_all', 'bx_organizations', 'profile-relation-remove', '_bx_orgs_menu_item_title_system_relation_delete', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 47),
+('bx_organizations_view_actions_all', 'bx_organizations', 'profile-subscribe-add', '_bx_orgs_menu_item_title_system_subscribe', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 50),
+('bx_organizations_view_actions_all', 'bx_organizations', 'profile-subscribe-remove', '_bx_orgs_menu_item_title_system_unsubscribe', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 60),
+('bx_organizations_view_actions_all', 'bx_organizations', 'profile-set-acl-level', '_sys_menu_item_title_system_set_acl_level', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 70),
+('bx_organizations_view_actions_all', 'bx_organizations', 'profile-set-badges', '_sys_menu_item_title_system_set_badges', '', '', '', '', '', '', '', 0, 192, 'a:2:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:19:"is_badges_avaliable";}', 1, 0, 80),
+('bx_organizations_view_actions_all', 'bx_organizations', 'comment', '_sys_menu_item_title_system_va_comment', '', '', '', '', '', '', '', 0, 2147483647, '', 0, 0, 200),
+('bx_organizations_view_actions_all', 'bx_organizations', 'view', '_sys_menu_item_title_system_va_view', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 210),
+('bx_organizations_view_actions_all', 'bx_organizations', 'vote', '_sys_menu_item_title_system_va_vote', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 215),
+('bx_organizations_view_actions_all', 'bx_organizations', 'score', '_sys_menu_item_title_system_va_score', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 220),
+('bx_organizations_view_actions_all', 'bx_organizations', 'favorite', '_sys_menu_item_title_system_va_favorite', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 230),
+('bx_organizations_view_actions_all', 'bx_organizations', 'feature', '_sys_menu_item_title_system_va_feature', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 240),
+('bx_organizations_view_actions_all', 'bx_organizations', 'report', '_sys_menu_item_title_system_va_report', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 260),
+('bx_organizations_view_actions_all', 'bx_organizations', 'social-sharing-facebook', '_sys_menu_item_title_system_social_sharing_facebook', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 300),
+('bx_organizations_view_actions_all', 'bx_organizations', 'social-sharing-twitter', '_sys_menu_item_title_system_social_sharing_twitter', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 320),
+('bx_organizations_view_actions_all', 'bx_organizations', 'social-sharing-pinterest', '_sys_menu_item_title_system_social_sharing_pinterest', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 330),
+('bx_organizations_view_actions_all', 'bx_organizations', 'edit-organization-cover', '_bx_orgs_menu_item_title_system_edit_cover', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 400),
+('bx_organizations_view_actions_all', 'bx_organizations', 'edit-organization-profile', '_bx_orgs_menu_item_title_system_edit_profile', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 410),
+('bx_organizations_view_actions_all', 'bx_organizations', 'invite-to-organization', '_bx_orgs_menu_item_title_system_invite', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 420),
+('bx_organizations_view_actions_all', 'bx_organizations', 'delete-organization-profile', '_bx_orgs_menu_item_title_system_delete_profile', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 430),
+('bx_organizations_view_actions_all', 'bx_organizations', 'delete-organization-account', '_bx_orgs_menu_item_title_system_delete_account', '', '', '', '', '', '', '', 0, 128, '', 1, 0, 440),
+('bx_organizations_view_actions_all', 'bx_organizations', 'delete-organization-account-content', '_bx_orgs_menu_item_title_system_delete_account_content', '', '', '', '', '', '', '', 0, 128, '', 1, 0, 450),
+('bx_organizations_view_actions_all', 'bx_organizations', 'more-auto', '_sys_menu_item_title_system_va_more_auto', '_sys_menu_item_title_va_more_auto', 'javascript:void(0)', '', '', 'ellipsis-v', '', '', 0, 2147483647, '', 1, 0, 9999);
+
+-- MENU: actions menu for my entries
+
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_my', '_bx_orgs_menu_title_entries_my', 'bx_organizations_my', 'bx_organizations', 9, 0, 1, 'BxOrgsMenu', 'modules/boonex/organizations/classes/BxOrgsMenu.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_organizations_my', 'bx_organizations', '_bx_orgs_menu_set_title_entries_my', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('bx_organizations_my', 'bx_organizations', 'create-organization-profile', '_bx_orgs_menu_item_title_system_new_profile', '_bx_orgs_menu_item_title_new_profile', 'page.php?i=create-organization-profile', '', '', 'plus', '', 2147483647, 1, 0, 0);
+
+-- MENU: module sub-menu
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_submenu', '_bx_orgs_menu_title_submenu', 'bx_organizations_submenu', 'bx_organizations', 8, 0, 1, '', '');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_organizations_submenu', 'bx_organizations', '_bx_orgs_menu_set_title_submenu', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('bx_organizations_submenu', 'bx_organizations', 'organizations-home', '_bx_orgs_menu_item_title_system_entries_recent', '_bx_orgs_menu_item_title_entries_recent', 'page.php?i=organizations-home', '', '', '', '', 2147483647, 1, 1, 1),
+('bx_organizations_submenu', 'bx_organizations', 'organizations-active', '_bx_orgs_menu_item_title_system_entries_active', '_bx_orgs_menu_item_title_entries_active', 'page.php?i=organizations-active', '', '', '', '', 2147483647, 1, 1, 2),
+('bx_organizations_submenu', 'bx_organizations', 'organizations-online', '_bx_orgs_menu_item_title_system_entries_online', '_bx_orgs_menu_item_title_entries_online', 'page.php?i=organizations-online', '', '', '', '', 2147483647, 1, 1, 3),
+('bx_organizations_submenu', 'bx_organizations', 'organizations-search', '_bx_orgs_menu_item_title_system_entries_search', '_bx_orgs_menu_item_title_entries_search', 'page.php?i=organizations-search', '', '', '', '', 2147483647, 1, 1, 4),
+('bx_organizations_submenu', 'bx_organizations', 'organizations-manage', '_bx_orgs_menu_item_title_system_entries_manage', '_bx_orgs_menu_item_title_entries_manage', 'page.php?i=organizations-manage', '', '', '', '', 2147483646, 1, 1, 5);
+
+-- MENU: view submenu
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_view_submenu', '_bx_orgs_menu_title_view_profile_submenu', 'bx_organizations_view_submenu', 'bx_organizations', 8, 0, 1, 'BxOrgsMenuView', 'modules/boonex/organizations/classes/BxOrgsMenuView.php'),
+('bx_organizations_view_submenu_cover', '_bx_orgs_menu_title_view_profile_submenu_cover', 'bx_organizations_view_submenu', 'bx_organizations', 7, 0, 1, 'BxOrgsMenuView', 'modules/boonex/organizations/classes/BxOrgsMenuView.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_organizations_view_submenu', 'bx_organizations', '_bx_orgs_menu_set_title_view_profile_submenu', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `submenu_popup`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('bx_organizations_view_submenu', 'bx_organizations', 'view-organization-profile', '_bx_orgs_menu_item_title_system_view_profile_view', '_bx_orgs_menu_item_title_view_profile_view', 'page.php?i=view-organization-profile&id={content_id}', '', '', 'briefcase col-red2', '', '', 0, 2147483647, 1, 0, 1),
+('bx_organizations_view_submenu', 'bx_organizations', 'organization-profile-info', '_bx_orgs_menu_item_title_system_view_profile_info', '_bx_orgs_menu_item_title_view_profile_info', 'page.php?i=organization-profile-info&id={content_id}', '', '', 'info-circle col-gray', '', '', 0, 2147483647, 1, 0, 2),
+('bx_organizations_view_submenu', 'bx_organizations', 'organization-profile-fans', '_bx_orgs_menu_item_title_system_view_profile_fans', '_bx_orgs_menu_item_title_view_profile_fans', 'page.php?i=organization-profile-fans&profile_id={profile_id}', '', '', 'users col-blue3', '', '', 0, 2147483647, 1, 0, 3),
+('bx_organizations_view_submenu', 'bx_organizations', 'organization-profile-friends', '_bx_orgs_menu_item_title_system_view_profile_friends', '_bx_orgs_menu_item_title_view_profile_friends', 'page.php?i=organization-profile-friends&profile_id={profile_id}', '', '', 'users col-blue3', '', '', 0, 2147483647, 1, 0, 4),
+('bx_organizations_view_submenu', 'bx_organizations', 'organization-profile-relations', '_bx_orgs_menu_item_title_system_view_profile_relations', '_bx_orgs_menu_item_title_view_profile_relations', 'page.php?i=organization-profile-relations&profile_id={profile_id}', '', '', 'sync col-blue3', '', '', 0, 2147483647, 1, 0, 5),
+('bx_organizations_view_submenu', 'bx_organizations', 'organization-profile-subscriptions', '_bx_orgs_menu_item_title_system_view_profile_subscriptions', '_bx_orgs_menu_item_title_view_profile_subscriptions', 'page.php?i=organization-profile-subscriptions&profile_id={profile_id}', '', '', 'check col-blue3', '', '', 0, 2147483647, 1, 0, 6),
+('bx_organizations_view_submenu', 'bx_organizations', 'organization-profile-comments', '_bx_orgs_menu_item_title_system_view_profile_comments', '_bx_orgs_menu_item_title_view_profile_comments', 'page.php?i=organization-profile-comments&id={content_id}', '', '', '', '', '', 0, 2147483647, 0, 0, 7),
+('bx_organizations_view_submenu', 'bx_organizations', 'more-auto', '_bx_orgs_menu_item_title_system_view_profile_more_auto', '_bx_orgs_menu_item_title_view_profile_more_auto', 'javascript:void(0)', '', '', 'ellipsis-v', '', '', 0, 2147483647, 1, 0, 9999);
+
+-- MENU: custom menu for snippet meta info
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_snippet_meta', '_sys_menu_title_snippet_meta', 'bx_organizations_snippet_meta', 'bx_organizations', 15, 0, 1, 'BxOrgsMenuSnippetMeta', 'modules/boonex/organizations/classes/BxOrgsMenuSnippetMeta.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_organizations_snippet_meta', 'bx_organizations', '_sys_menu_set_title_snippet_meta', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `editable`, `order`) VALUES
+('bx_organizations_snippet_meta', 'bx_organizations', 'date', '_sys_menu_item_title_system_sm_date', '_sys_menu_item_title_sm_date', '', '', '', '', '', 2147483647, 0, 0, 1, 1),
+('bx_organizations_snippet_meta', 'bx_organizations', 'tags', '_sys_menu_item_title_system_sm_tags', '_sys_menu_item_title_sm_tags', '', '', '', '', '', 2147483647, 0, 0, 1, 2),
+('bx_organizations_snippet_meta', 'bx_organizations', 'views', '_sys_menu_item_title_system_sm_views', '_sys_menu_item_title_sm_views', '', '', '', '', '', 2147483647, 0, 0, 1, 3),
+('bx_organizations_snippet_meta', 'bx_organizations', 'comments', '_sys_menu_item_title_system_sm_comments', '_sys_menu_item_title_sm_comments', '', '', '', '', '', 2147483647, 0, 0, 1, 4),
+('bx_organizations_snippet_meta', 'bx_organizations', 'members', '_sys_menu_item_title_system_sm_members', '_sys_menu_item_title_sm_members', '', '', '', '', '', 2147483647, 1, 0, 1, 5),
+('bx_organizations_snippet_meta', 'bx_organizations', 'friends', '_sys_menu_item_title_system_sm_friends', '_sys_menu_item_title_sm_friends', '', '', '', '', '', 2147483647, 1, 0, 1, 6),
+('bx_organizations_snippet_meta', 'bx_organizations', 'subscribers', '_sys_menu_item_title_system_sm_subscribers', '_sys_menu_item_title_sm_subscribers', '', '', '', '', '', 2147483647, 0, 0, 1, 7),
+('bx_organizations_snippet_meta', 'bx_organizations', 'membership', '_sys_menu_item_title_system_sm_membership', '_sys_menu_item_title_sm_membership', '', '', '', '', '', 2147483647, 0, 0, 1, 8),
+('bx_organizations_snippet_meta', 'bx_organizations', 'nl', '_sys_menu_item_title_system_sm_nl', '_sys_menu_item_title_sm_nl', '', '', '', '', '', 2147483647, 1, 0, 1, 9),
+('bx_organizations_snippet_meta', 'bx_organizations', 'join', '_sys_menu_item_title_system_sm_join', '_sys_menu_item_title_sm_join', '', '', '', '', '', 2147483647, 1, 0, 1, 10),
+('bx_organizations_snippet_meta', 'bx_organizations', 'leave', '_sys_menu_item_title_system_sm_leave', '_sys_menu_item_title_sm_leave', '', '', '', '', '', 2147483647, 0, 0, 1, 11),
+('bx_organizations_snippet_meta', 'bx_organizations', 'befriend', '_sys_menu_item_title_system_sm_befriend', '_sys_menu_item_title_sm_befriend', '', '', '', '', '', 2147483647, 1, 0, 1, 12),
+('bx_organizations_snippet_meta', 'bx_organizations', 'unfriend', '_sys_menu_item_title_system_sm_unfriend', '_sys_menu_item_title_sm_unfriend', '', '', '', '', '', 2147483647, 0, 0, 1, 13),
+('bx_organizations_snippet_meta', 'bx_organizations', 'subscribe', '_sys_menu_item_title_system_sm_subscribe', '_sys_menu_item_title_sm_subscribe', '', '', '', '', '', 2147483647, 0, 0, 1, 14),
+('bx_organizations_snippet_meta', 'bx_organizations', 'unsubscribe', '_sys_menu_item_title_system_sm_unsubscribe', '_sys_menu_item_title_sm_unsubscribe', '', '', '', '', '', 2147483647, 0, 0, 1, 15);
+
+-- MENU: notifications menu in account popup
+SET @iNotifMenuOrder = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_menu_items` WHERE `set_name` = 'sys_account_notifications' AND `active` = 1 AND `order` < 9999 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `visibility_custom`, `active`, `copyable`, `order`) VALUES
+('sys_account_notifications', 'bx_organizations', 'notifications-friend-requests', '_bx_orgs_menu_item_title_system_friends', '_bx_orgs_menu_item_title_friends', 'page.php?i=organization-profile-friends&profile_id={member_id}', '', '', 'group col-red2', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:31:"get_unconfirmed_connections_num";s:6:"params";a:1:{i:0;s:20:"sys_profiles_friends";}s:5:"class";s:23:"TemplServiceConnections";}', '', 2147483646, '', 1, 0, @iNotifMenuOrder + 1),
+('sys_account_notifications', 'bx_organizations', 'notifications-relation-requests', '_bx_orgs_menu_item_title_system_relations', '_bx_orgs_menu_item_title_relations', 'page.php?i=organization-profile-relations&profile_id={member_id}', '', '', 'sync col-blue3', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:31:"get_unconfirmed_connections_num";s:6:"params";a:1:{i:0;s:22:"sys_profiles_relations";}s:5:"class";s:23:"TemplServiceConnections";}', '', 2147483646, 'a:2:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:19:"is_enable_relations";}', 1, 0, @iNotifMenuOrder + 2);
+
+-- MENU: profile stats
+SET @iNotifMenuOrder = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_menu_items` WHERE `set_name` = 'sys_profile_stats' AND `active` = 1 LIMIT 1);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES
+('sys_profile_stats', 'bx_organizations', 'profile-stats-friend-requests', '_bx_orgs_menu_item_title_system_friend_requests', '_bx_orgs_menu_item_title_friend_requests', 'page.php?i=organization-profile-friends&profile_id={member_id}', '', '', 'briefcase col-red2', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:31:"get_unconfirmed_connections_num";s:6:"params";a:1:{i:0;s:20:"sys_profiles_friends";}s:5:"class";s:23:"TemplServiceConnections";}', '', 2147483646, 1, 0, @iNotifMenuOrder + 1),
+('sys_profile_stats', 'bx_organizations', 'profile-stats-manage-organizations', '_bx_orgs_menu_item_title_system_manage_my_organizations', '_bx_orgs_menu_item_title_manage_my_organizations', 'page.php?i=organizations-manage', '', '_self', 'briefcase col-red2', 'a:2:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:41:"get_menu_addon_manage_tools_profile_stats";}', '', 2147483646, 1, 0, @iNotifMenuOrder + 2),
+('sys_profile_stats', 'bx_organizations', 'profile-stats-favorite-organizations', '_bx_orgs_menu_item_title_system_favorites', '_bx_orgs_menu_item_title_favorites', 'page.php?i=organization-profile-favorites&profile_id={member_id}', '', '', 'star col-red2', 'a:2:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:38:"get_menu_addon_favorites_profile_stats";}', '', 2147483646, 1, 0, @iNotifMenuOrder + 3),
+('sys_profile_stats', 'bx_organizations', 'profile-stats-subscriptions', '_bx_orgs_menu_item_title_system_subscriptions', '_bx_orgs_menu_item_title_subscriptions', 'page.php?i=organization-profile-subscriptions&profile_id={member_id}#subscriptions', '', '_self', 'rss col-red2', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:25:"get_connected_content_num";s:6:"params";a:1:{i:0;s:26:"sys_profiles_subscriptions";}s:5:"class";s:23:"TemplServiceConnections";}', '', 2147483646, 1, 0, @iNotifMenuOrder + 4),
+('sys_profile_stats', 'bx_organizations', 'profile-stats-subscribed-me', '_bx_orgs_menu_item_title_system_subscribed_me', '_bx_orgs_menu_item_title_subscribed_me', 'page.php?i=organization-profile-subscribed-me&profile_id={member_id}#subscribers', '', '_self', 'rss col-red2', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:28:"get_connected_initiators_num";s:6:"params";a:1:{i:0;s:26:"sys_profiles_subscriptions";}s:5:"class";s:23:"TemplServiceConnections";}', '', 2147483646, 1, 0, @iNotifMenuOrder + 5),
+('sys_profile_stats', 'bx_organizations', 'profile-stats-relations', '_bx_orgs_menu_item_title_system_relations', '_bx_orgs_menu_item_title_relations', 'page.php?i=organization-profile-relations&profile_id={member_id}#relations', '', '_self', 'sync col-blue3', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:25:"get_connected_content_num";s:6:"params";a:3:{i:0;s:22:"sys_profiles_relations";i:1;i:0;i:2;i:1;}s:5:"class";s:23:"TemplServiceConnections";}', '', 2147483646, 1, 0, @iNotifMenuOrder + 6),
+('sys_profile_stats', 'bx_organizations', 'profile-stats-related-me', '_bx_orgs_menu_item_title_system_related_me', '_bx_orgs_menu_item_title_related_me', 'page.php?i=organization-profile-relations&profile_id={member_id}#related-me', '', '_self', 'sync col-blue3', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:28:"get_connected_initiators_num";s:6:"params";a:3:{i:0;s:22:"sys_profiles_relations";i:1;i:0;i:2;i:1;}s:5:"class";s:23:"TemplServiceConnections";}', '', 2147483646, 1, 0, @iNotifMenuOrder + 7);
+
+-- MENU: manage tools submenu
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_organizations_menu_manage_tools', '_bx_orgs_menu_title_manage_tools', 'bx_organizations_menu_manage_tools', 'bx_organizations', 6, 0, 1, 'BxOrgsMenuManageTools', 'modules/boonex/organizations/classes/BxOrgsMenuManageTools.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_organizations_menu_manage_tools', 'bx_organizations', '_bx_orgs_menu_set_title_manage_tools', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('bx_organizations_menu_manage_tools', 'bx_organizations', 'delete', '_bx_orgs_menu_item_title_system_delete', '_bx_orgs_menu_item_title_delete', 'javascript:void(0)', 'javascript:{js_object}.onClickDelete({content_id});', '_self', 'far trash-alt', '', 2147483647, 1, 0, 1),
+('bx_organizations_menu_manage_tools', 'bx_organizations', 'delete-with-content', '_bx_orgs_menu_item_title_system_delete_with_content', '_bx_orgs_menu_item_title_delete_with_content', 'javascript:void(0)', 'javascript:{js_object}.onClickDeleteWithContent({content_id});', '_self', 'far trash-alt', '', 2147483647, 1, 0, 2);
+
+-- MENU: dashboard manage tools
+SET @iManageMenuOrder = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_menu_items` WHERE `set_name`='sys_account_dashboard_manage_tools' LIMIT 1);
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_account_dashboard_manage_tools', 'bx_organizations', 'organizations-administration', '_bx_orgs_menu_item_title_system_admt_organizations', '_bx_orgs_menu_item_title_admt_organizations', 'page.php?i=organizations-administration', '', '_self', 'briefcase', 'a:2:{s:6:"module";s:16:"bx_organizations";s:6:"method";s:27:"get_menu_addon_manage_tools";}', '', 192, 1, 0, @iManageMenuOrder + 1);
+
+-- MENU: add menu item to profiles modules (trigger* menu sets are processed separately upon modules enable/disable)
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('trigger_profile_view_submenu', 'bx_organizations', 'joined-organizations', '_bx_orgs_menu_item_title_system_view_joined_groups', '_bx_orgs_menu_item_title_view_joined_groups', 'page.php?i=joined-organizations&profile_id={profile_id}', '', '', 'briefcase col-red2', '', 2147483647, 1, 0, 0);
+
+
+-- ACL
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_organizations', 'create entry', NULL, '_bx_orgs_acl_action_create_profile', '', 1, 1);
+SET @iIdActionProfileCreate = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_organizations', 'delete entry', NULL, '_bx_orgs_acl_action_delete_profile', '', 1, 1);
+SET @iIdActionProfileDelete = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_organizations', 'view entry', NULL, '_bx_orgs_acl_action_view_profile', '', 1, 0);
+SET @iIdActionProfileView = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_organizations', 'edit any entry', NULL, '_bx_orgs_acl_action_edit_any_profile', '', 1, 3);
+SET @iIdActionProfileEditAny = LAST_INSERT_ID();
+
+SET @iUnauthenticated = 1;
+SET @iAccount = 2;
+SET @iStandard = 3;
+SET @iUnconfirmed = 4;
+SET @iPending = 5;
+SET @iSuspended = 6;
+SET @iModerator = 7;
+SET @iAdministrator = 8;
+SET @iPremium = 9;
+
+INSERT INTO `sys_acl_matrix` (`IDLevel`, `IDAction`) VALUES
+
+-- profile create
+(@iAccount, @iIdActionProfileCreate),
+(@iStandard, @iIdActionProfileCreate),
+(@iUnconfirmed, @iIdActionProfileCreate),
+(@iPending, @iIdActionProfileCreate),
+(@iModerator, @iIdActionProfileCreate),
+(@iAdministrator, @iIdActionProfileCreate),
+(@iPremium, @iIdActionProfileCreate),
+
+-- profile delete
+(@iAccount, @iIdActionProfileDelete),
+(@iStandard, @iIdActionProfileDelete),
+(@iUnconfirmed, @iIdActionProfileDelete),
+(@iPending, @iIdActionProfileDelete),
+(@iModerator, @iIdActionProfileDelete),
+(@iAdministrator, @iIdActionProfileDelete),
+(@iPremium, @iIdActionProfileDelete),
+
+-- profile view
+(@iUnauthenticated, @iIdActionProfileView),
+(@iAccount, @iIdActionProfileView),
+(@iStandard, @iIdActionProfileView),
+(@iUnconfirmed, @iIdActionProfileView),
+(@iPending, @iIdActionProfileView),
+(@iModerator, @iIdActionProfileView),
+(@iAdministrator, @iIdActionProfileView),
+(@iPremium, @iIdActionProfileView),
+
+-- any profile edit
+(@iModerator, @iIdActionProfileEditAny),
+(@iAdministrator, @iIdActionProfileEditAny);
+
+
+-- METATAGS
+INSERT INTO `sys_objects_metatags` (`object`, `table_keywords`, `table_locations`, `table_mentions`, `override_class_name`, `override_class_file`) VALUES
+('bx_organizations', 'bx_organizations_meta_keywords', 'bx_organizations_meta_locations', 'bx_organizations_meta_mentions', '', '');
+
+
+-- CATEGORY
+INSERT INTO `sys_objects_category` (`object`, `search_object`, `form_object`, `list_name`, `table`, `field`, `join`, `where`, `override_class_name`, `override_class_file`) VALUES
+('bx_organizations_cats', 'bx_organizations', 'bx_organization', 'bx_organizations_cats', 'bx_organizations_data', 'org_cat', 'INNER JOIN `sys_profiles` ON (`sys_profiles`.`content_id` = `bx_organizations_data`.`id` AND `sys_profiles`.`type` = ''bx_organizations'')', 'AND `sys_profiles`.`status` = ''active''', '', '');
+
+
+-- SEARCH
+SET @iSearchOrder = (SELECT IFNULL(MAX(`Order`), 0) FROM `sys_objects_search`);
+INSERT INTO `sys_objects_search` (`ObjectName`, `Title`, `Order`, `ClassName`, `ClassPath`) VALUES
+('bx_organizations', '_bx_orgs', @iSearchOrder + 1, 'BxOrgsSearchResult', 'modules/boonex/organizations/classes/BxOrgsSearchResult.php'),
+('bx_organizations_cmts', '_bx_orgs_cmts', @iSearchOrder + 2, 'BxOrgsCmtsSearchResult', 'modules/boonex/organizations/classes/BxOrgsCmtsSearchResult.php');
+
+
+-- CONNECTIONS
+INSERT INTO `sys_objects_connection` (`object`, `table`, `type`, `override_class_name`, `override_class_file`) VALUES
+('bx_organizations_fans', 'bx_organizations_fans', 'mutual', '', '');
+
+
+-- STATS
+SET @iMaxOrderStats = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_statistics`);
+INSERT INTO `sys_statistics` (`module`, `name`, `title`, `link`, `icon`, `query`, `order`) VALUES 
+('bx_organizations', 'bx_organizations', '_bx_orgs', 'page.php?i=organizations-home', 'briefcase col-red2', 'SELECT COUNT(*) FROM `bx_organizations_data` AS `td` LEFT JOIN `sys_profiles` AS `tp` ON `td`.`id` = `tp`.`content_id` AND `tp`.`type`=''bx_organizations'' WHERE 1 AND `tp`.`status`=''active''', @iMaxOrderStats + 1);
+
+
+-- CHARTS
+SET @iMaxOrderCharts = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_objects_chart`);
+INSERT INTO `sys_objects_chart` (`object`, `title`, `table`, `field_date_ts`, `field_date_dt`, `field_status`, `query`, `active`, `order`, `class_name`, `class_file`) VALUES
+('bx_organizations_growth', '_bx_orgs_chart_growth', 'bx_organizations_data', 'added', '', '', 'SELECT {field_date_formatted} AS `period`, COUNT(*) AS {object} FROM {table} LEFT JOIN `sys_profiles` AS `tp` ON {table}.`id` = `tp`.`content_id` AND `tp`.`type`=''bx_organizations'' WHERE 1 AND `tp`.`status`=''active'' {where_inteval} GROUP BY `period` ORDER BY {table}.{field_date} ASC', 1, @iMaxOrderCharts + 1, 'BxDolChartGrowth', ''),
+('bx_organizations_growth_speed', '_bx_orgs_chart_growth_speed', 'bx_organizations_data', 'added', '', '', 'SELECT {field_date_formatted} AS `period`, COUNT(*) AS {object} FROM {table} LEFT JOIN `sys_profiles` AS `tp` ON {table}.`id` = `tp`.`content_id` AND `tp`.`type`=''bx_organizations'' WHERE 1 AND `tp`.`status`=''active'' {where_inteval} GROUP BY `period` ORDER BY {table}.{field_date} ASC', 1, @iMaxOrderCharts + 2, 'BxDolChartGrowthSpeed', '');
+
+
+-- GRID: connections
+INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `field_active`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_fields_translatable`, `filter_mode`, `sorting_fields`, `sorting_fields_translatable`, `visible_for_levels`, `responsive`, `override_class_name`, `override_class_file`) VALUES
+('bx_organizations_fans', 'Sql', 'SELECT `p`.`id`, `c`.`added`, `c`.`mutual` FROM `sys_profiles` AS `p` INNER JOIN `sys_accounts` AS `a` ON (`a`.`id` = `p`.`account_id`) {join_connections}', 'sys_profiles', 'id', 'c`.`added', '', '', 10, NULL, 'start', '', 'name,email', '', 'auto', '', '', 2147483647, 0, 'BxOrgsGridConnections', 'modules/boonex/organizations/classes/BxOrgsGridConnections.php');
+
+INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `params`, `order`) VALUES
+('bx_organizations_fans', 'name', '_sys_name', '50%', '', 10),
+('bx_organizations_fans', 'actions', '', '50%', '', 20);
+
+INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `confirm`, `order`) VALUES
+('bx_organizations_fans', 'single', 'accept', '_sys_accept', '', 0, 10),
+('bx_organizations_fans', 'single', 'to_admins', '_bx_orgs_txt_to_admins', '', 0, 20),
+('bx_organizations_fans', 'single', 'from_admins', '_bx_orgs_txt_from_admins', '', 0, 30),
+('bx_organizations_fans', 'single', 'delete', '', 'remove', 1, 40);
+
+-- GRIDS: administration
+INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `field_active`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_fields_translatable`, `filter_mode`, `sorting_fields`, `sorting_fields_translatable`, `visible_for_levels`, `override_class_name`, `override_class_file`) VALUES
+('bx_organizations_administration', 'Sql', 'SELECT `td`.*, `td`.`org_name` AS `fullname`, `ta`.`email` AS `account`, `ta`.`logged` AS `last_online`, `tp`.`status` AS `status` FROM `bx_organizations_data` AS `td` LEFT JOIN `sys_profiles` AS `tp` ON `td`.`id`=`tp`.`content_id` AND `tp`.`type`=''bx_organizations'' LEFT JOIN `sys_accounts` AS `ta` ON `tp`.`account_id`=`ta`.`id` WHERE 1 ', 'bx_organizations_data', 'id', 'last_online', 'status', '', 20, NULL, 'start', '', 'org_name,email', '', 'like', 'reports', '', 192, 'BxOrgsGridAdministration', 'modules/boonex/organizations/classes/BxOrgsGridAdministration.php'),
+('bx_organizations_common', 'Sql', 'SELECT `td`.*, `td`.`org_name` AS `fullname`, `ta`.`email` AS `account`, `ta`.`logged` AS `last_online`, `tp`.`status` AS `status` FROM `bx_organizations_data` AS `td` LEFT JOIN `sys_profiles` AS `tp` ON `td`.`id`=`tp`.`content_id` AND `tp`.`type`=''bx_organizations'' LEFT JOIN `sys_accounts` AS `ta` ON `tp`.`account_id`=`ta`.`id` WHERE 1 ', 'bx_organizations_data', 'id', 'last_online', 'status', '', 20, NULL, 'start', '', 'org_name', '', 'like', '', '', 2147483647, 'BxOrgsGridCommon', 'modules/boonex/organizations/classes/BxOrgsGridCommon.php');
+
+INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `order`) VALUES
+('bx_organizations_administration', 'checkbox', '_sys_select', '2%', 0, '', '', 1),
+('bx_organizations_administration', 'switcher', '_bx_orgs_grid_column_title_adm_active', '8%', 0, '', '', 2),
+('bx_organizations_administration', 'reports', '_sys_txt_reports_title', '5%', 0, '', '', 3),
+('bx_organizations_administration', 'fullname', '_bx_orgs_grid_column_title_adm_fullname', '25%', 0, '', '', 4),
+('bx_organizations_administration', 'last_online', '_bx_orgs_grid_column_title_adm_last_online', '20%', 1, '25', '', 5),
+('bx_organizations_administration', 'account', '_bx_orgs_grid_column_title_adm_account', '20%', 0, '25', '', 6),
+('bx_organizations_administration', 'actions', '', '20%', 0, '', '', 7),
+('bx_organizations_common', 'checkbox', '_sys_select', '2%', 0, '', '', 1),
+('bx_organizations_common', 'fullname', '_bx_orgs_grid_column_title_adm_fullname', '48%', 0, '', '', 2),
+('bx_organizations_common', 'last_online', '_bx_orgs_grid_column_title_adm_last_online', '30%', 1, '25', '', 3),
+('bx_organizations_common', 'actions', '', '20%', 0, '', '', 4);
+
+INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon_only`, `confirm`, `order`) VALUES
+('bx_organizations_administration', 'bulk', 'set_acl_level', '_bx_orgs_grid_action_title_adm_set_acl_level', '', 0, 0, 1),
+('bx_organizations_administration', 'bulk', 'delete', '_bx_orgs_grid_action_title_adm_delete', '', 0, 1, 2),
+('bx_organizations_administration', 'bulk', 'delete_with_content', '_bx_orgs_grid_action_title_adm_delete_with_content', '', 0, 1, 3),
+('bx_organizations_administration', 'single', 'set_acl_level', '_bx_orgs_grid_action_title_adm_set_acl_level', 'certificate', 1, 0, 1),
+('bx_organizations_administration', 'single', 'settings', '_bx_orgs_grid_action_title_adm_more_actions', 'cog', 1, 0, 2),
+('bx_organizations_administration', 'single', 'audit_content', '_bx_orgs_grid_action_title_adm_audit_content', 'search', 1, 0, 3),
+('bx_organizations_administration', 'single', 'audit_profile', '_bx_orgs_grid_action_title_adm_audit_profile', 'search-location', 1, 0, 4),
+('bx_organizations_common', 'bulk', 'delete', '_bx_orgs_grid_action_title_adm_delete', '', 0, 1, 1),
+('bx_organizations_common', 'bulk', 'delete_with_content', '_bx_orgs_grid_action_title_adm_delete_with_content', '', 0, 1, 2),
+('bx_organizations_common', 'single', 'settings', '_bx_orgs_grid_action_title_adm_more_actions', 'cog', 1, 0, 1);
+
+
+-- LIVE UPDATES
+INSERT INTO `sys_objects_live_updates`(`name`, `frequency`, `service_call`, `active`) VALUES
+('bx_organizations_friend_requests', 1, 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:40:"get_live_updates_unconfirmed_connections";s:6:"params";a:5:{i:0;s:16:"bx_organizations";i:1;s:20:"sys_profiles_friends";i:2;a:2:{s:11:"menu_object";s:18:"sys_toolbar_member";s:9:"menu_item";s:7:"account";}i:3;a:2:{s:11:"menu_object";s:25:"sys_account_notifications";s:9:"menu_item";s:29:"notifications-friend-requests";}i:4;s:7:"{count}";}s:5:"class";s:23:"TemplServiceConnections";}', 1);
+
+
+-- ALERTS
+INSERT INTO `sys_alerts_handlers` (`name`, `class`, `file`, `service_call`) VALUES 
+('bx_organizations', 'BxOrgsAlertsResponse', 'modules/boonex/organizations/classes/BxOrgsAlertsResponse.php', '');
+SET @iHandler := LAST_INSERT_ID();
+
+INSERT INTO `sys_alerts` (`unit`, `action`, `handler_id`) VALUES
+('system', 'save_setting', @iHandler),
+('account', 'check_switch_context', @iHandler),
+('sys_profiles_friends', 'connection_added', @iHandler),
+('bx_timeline', 'post_common', @iHandler),
+('bx_organizations_pics', 'file_deleted', @iHandler),
+('bx_organizations_fans', 'connection_added', @iHandler),
+('bx_organizations_fans', 'connection_removed', @iHandler),
+('bx_organizations', 'fan_added', @iHandler),
+('bx_organizations', 'join_invitation', @iHandler),
+('bx_organizations', 'join_request', @iHandler),
+('bx_organizations', 'join_request_accepted', @iHandler),
+('bx_organizations', 'timeline_view', @iHandler),
+('bx_organizations', 'timeline_post', @iHandler),
+('bx_organizations', 'timeline_delete', @iHandler),
+('bx_organizations', 'timeline_comment', @iHandler),
+('bx_organizations', 'timeline_vote', @iHandler),
+('bx_organizations', 'timeline_score', @iHandler),
+('bx_organizations', 'timeline_report', @iHandler),
+('bx_organizations', 'timeline_repost', @iHandler),
+('bx_organizations', 'timeline_pin', @iHandler),
+('bx_organizations', 'timeline_promote', @iHandler);
+
+
+-- PRIVACY 
+INSERT INTO `sys_objects_privacy` (`object`, `module`, `action`, `title`, `default_group`, `spaces`, `table`, `table_field_id`, `table_field_author`, `override_class_name`, `override_class_file`) VALUES
+('bx_organizations_allow_view_to', 'bx_organizations', 'view', '_bx_orgs_form_profile_input_allow_view_to', '3', '', 'bx_organizations_data', 'id', 'author', 'BxOrgsPrivacy', 'modules/boonex/organizations/classes/BxOrgsPrivacy.php'),
+('bx_organizations_allow_view_notification_to', 'bx_organizations', 'view_event', '_bx_orgs_form_profile_input_allow_view_notification_to', '3', '', 'bx_notifications_events', 'id', 'object_owner_id', 'BxOrgsPrivacyNotifications', 'modules/boonex/organizations/classes/BxOrgsPrivacyNotifications.php'),
+('bx_organizations_allow_post_to', 'bx_organizations', 'post', '_bx_orgs_form_profile_input_allow_post_to', '5', '', 'bx_organizations_data', 'id', 'author', 'BxOrgsPrivacyPost', 'modules/boonex/organizations/classes/BxOrgsPrivacyPost.php'),
+('bx_organizations_allow_contact_to', 'bx_organizations', 'contact', '_bx_orgs_form_profile_input_allow_contact_to', '3', '', 'bx_organizations_data', 'id', 'author', 'BxOrgsPrivacyContact', 'modules/boonex/organizations/classes/BxOrgsPrivacyContact.php');
+
+
+-- EMAIL TEMPLATES
+INSERT INTO `sys_email_templates` (`Module`, `NameSystem`, `Name`, `Subject`, `Body`) VALUES
+('bx_organizations', '_bx_orgs_email_friend_request', 'bx_organizations_friend_request', '_bx_orgs_email_friend_request_subject', '_bx_orgs_email_friend_request_body'),
+('bx_organizations', '_bx_orgs_email_join_request', 'bx_organizations_join_request', '_bx_orgs_email_join_request_subject', '_bx_orgs_email_join_request_body'),
+('bx_organizations', '_bx_orgs_email_join_reject', 'bx_organizations_join_reject', '_bx_orgs_email_join_reject_subject', '_bx_orgs_email_join_reject_body'),
+('bx_organizations', '_bx_orgs_email_join_confirm', 'bx_organizations_join_confirm', '_bx_orgs_email_join_confirm_subject', '_bx_orgs_email_join_confirm_body'),
+('bx_organizations', '_bx_orgs_email_fan_remove', 'bx_organizations_fan_remove', '_bx_orgs_email_fan_remove_subject', '_bx_orgs_email_fan_remove_body'),
+('bx_organizations', '_bx_orgs_email_fan_become_admin', 'bx_organizations_fan_become_admin', '_bx_orgs_email_fan_become_admin_subject', '_bx_orgs_email_fan_become_admin_body'),
+('bx_organizations', '_bx_orgs_email_admin_become_fan', 'bx_organizations_admin_become_fan', '_bx_orgs_email_admin_become_fan_subject', '_bx_orgs_email_admin_become_fan_body'),
+('bx_organizations', '_bx_orgs_email_invitation', 'bx_organizations_invitation', '_bx_orgs_email_invitation_subject', '_bx_orgs_email_invitation_body');
+
+
+-- UPLOADERS
+INSERT INTO `sys_objects_uploader` (`object`, `active`, `override_class_name`, `override_class_file`) VALUES
+('bx_organizations_cover_crop', 1, 'BxOrgsUploaderCoverCrop', 'modules/boonex/organizations/classes/BxOrgsUploaderCoverCrop.php'),
+('bx_organizations_picture_crop', 1, 'BxOrgsUploaderPictureCrop', 'modules/boonex/organizations/classes/BxOrgsUploaderPictureCrop.php');

+ 51 - 0
modules/boonex/payment/updates/11.0.2_11.0.3/install/config.php

@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'title' => 'Payment',
+    'version_from' => '11.0.2',
+    'version_to' => '11.0.3',
+    'vendor' => 'BoonEx',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/payment/updates/update_11.0.2_11.0.3/',
+    'home_uri' => 'payment_update_1102_1103',
+
+    'module_dir' => 'boonex/payment/',
+    'module_uri' => 'payment',
+
+    'db_prefix' => 'bx_payment_',
+    'class_prefix' => 'BxPayment',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 0,
+        'update_files' => 1,
+        'update_languages' => 0,
+        'clear_db_cache' => 0,
+    ),
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Payment',
+
+    /**
+     * Files Section
+     */
+    'delete_files' => array(),
+);

+ 13 - 0
modules/boonex/payment/updates/11.0.2_11.0.3/install/installer.php

@@ -0,0 +1,13 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+class BxPaymentUpdater extends BxDolStudioUpdater
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+}

+ 377 - 0
modules/boonex/payment/updates/11.0.2_11.0.3/source/classes/BxPaymentCart.php

@@ -0,0 +1,377 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Payment Payment
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxPaymentCart extends BxBaseModPaymentCart
+{
+    function __construct()
+    {
+    	$this->MODULE = 'bx_payment';
+
+    	parent::__construct();
+    }
+
+    /*
+     * Service methods
+     */
+    
+    /**
+     * @page service Service Calls
+     * @section bx_payment Payment
+     * @subsection bx_payment-page_blocks Page Blocks
+     * @subsubsection bx_payment-get_block_carts get_block_carts
+     * 
+     * @code bx_srv('bx_payment', 'get_block_carts', [...], 'Cart'); @endcode
+     * 
+     * Get page block with shopping carts by vendors.
+     *
+     * @return an array describing a block to display on the site or an empty string if something is wrong. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxPaymentCart::serviceGetBlockCarts
+     */
+    /** 
+     * @ref bx_payment-get_block_carts "get_block_carts"
+     */
+	public function serviceGetBlockCarts()
+    {
+    	$CNF = &$this->_oModule->_oConfig->CNF;
+
+    	if(bx_get('seller_id') !== false)
+    		return '';
+
+    	$iUserId = $this->_oModule->getProfileId();
+        if(empty($iUserId))
+            return MsgBox(_t($CNF['T']['ERR_REQUIRED_LOGIN']));
+
+        return array(
+        	'content' => $this->_oModule->_oTemplate->displayBlockCarts($iUserId)
+        );
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_payment Payment
+     * @subsection bx_payment-page_blocks Page Blocks
+     * @subsubsection bx_payment-get_block_cart get_block_cart
+     * 
+     * @code bx_srv('bx_payment', 'get_block_cart', [...], 'Cart'); @endcode
+     * 
+     * Get page block with content of selected shopping cart.
+     *
+     * @return an array describing a block to display on the site or an empty string if something is wrong. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxPaymentCart::serviceGetBlockCart
+     */
+    /** 
+     * @ref bx_payment-get_block_cart "get_block_cart"
+     */
+	public function serviceGetBlockCart()
+    {
+    	// Don't show the block at all if 'seller_id' not exists.
+    	if(bx_get('seller_id') === false)
+    		return '';
+
+    	$CNF = &$this->_oModule->_oConfig->CNF;
+
+    	$iUserId = $this->_oModule->getProfileId();
+        if(empty($iUserId))
+            return array(
+            	'content' => MsgBox(_t($CNF['T']['ERR_REQUIRED_LOGIN']))
+            );
+
+    	$iSellerId = bx_process_input(bx_get('seller_id'), BX_DATA_INT);
+    	if(empty($iSellerId))
+    		return array(
+            	'content' => MsgBox(_t($CNF['T']['ERR_UNKNOWN_VENDOR']))
+    		);
+
+		$aSeller = $this->_oModule->getProfileInfo($iSellerId);
+        return array(
+        	'title' => _t($CNF['T']['BLOCK_TITLE_CART'], $aSeller['name']),
+        	'content' => $this->_oModule->_oTemplate->displayBlockCart($iUserId, $iSellerId)
+        );
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_payment Payment
+     * @subsection bx_payment-page_blocks Page Blocks
+     * @subsubsection bx_payment-get_block_cart_history get_block_cart_history
+     * 
+     * @code bx_srv('bx_payment', 'get_block_cart_history', [...], 'Cart'); @endcode
+     * 
+     * Get page block with shopping cart history.
+     *
+     * @return an array describing a block to display on the site or an empty string if something is wrong. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxPaymentCart::serviceGetBlockCartHistory
+     */
+    /** 
+     * @ref bx_payment-get_block_cart_history "get_block_cart_history"
+     */
+    public function serviceGetBlockCartHistory()
+    {
+    	$CNF = &$this->_oModule->_oConfig->CNF;
+
+		$iSellerId = bx_get('vendor') !== false ? (int)bx_get('vendor') : 0;
+
+    	$iUserId = $this->_oModule->getProfileId();
+        if(empty($iUserId))
+            return array(
+            	'content' => MsgBox(_t($CNF['T']['ERR_REQUIRED_LOGIN']))
+            );
+
+        return array(
+        	'content' => $this->_oModule->_oTemplate->displayBlockHistory($iUserId, $iSellerId),
+		);
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_payment Payment
+     * @subsection bx_payment-purchase_processing Purchase Processing
+     * @subsubsection bx_payment-add_to_cart add_to_cart
+     * 
+     * @code bx_srv('bx_payment', 'add_to_cart', [...], 'Cart'); @endcode
+     * 
+     * Add an item described with method's params to shopping cart.
+     *
+     * @param $iSellerId integer value with seller ID.
+     * @param $mixedModuleId mixed value (ID, Name or URI) determining a module from which the action was initiated.
+     * @param $iItemId integer value with item ID.
+     * @param $iItemCount integer value with a number of items for purchasing.
+     * @param $aCustom array with custom data.
+     * @return an array with special format which describes the result of operation.
+     * 
+     * @see BxPaymentCart::serviceAddToCart
+     */
+    /** 
+     * @ref bx_payment-add_to_cart "add_to_cart"
+     */
+    public function serviceAddToCart($iSellerId, $mixedModuleId, $iItemId, $iItemCount, $aCustom = array())
+    {
+    	$CNF = &$this->_oModule->_oConfig->CNF;
+
+    	$iModuleId = $this->_oModule->_oConfig->getModuleId($mixedModuleId);
+    	$iClientId = $this->_oModule->getProfileId();
+
+    	$mixedResult = $this->_oModule->checkData($iClientId, $iSellerId, $iModuleId, $iItemId, $iItemCount, $aCustom);
+    	if($mixedResult !== true)
+    		return $mixedResult;
+
+        $aSellerProviders = $this->_oModule->_oDb->getVendorInfoProvidersSingle($iSellerId);
+        if(empty($aSellerProviders))
+            return array('code' => 5, 'message' => _t($CNF['T']['ERR_NOT_ACCEPT_PAYMENTS']));
+
+        $aCart = $this->_oModule->_oDb->getCartContent($iClientId);
+        $sCartItems = !empty($aCart['items']) ? $aCart['items'] : '';
+
+        $sCiDsc = $this->_oModule->_oConfig->descriptorA2S(array($iSellerId, $iModuleId, $iItemId));
+        if(strpos($sCartItems, $sCiDsc) !== false)
+            $sCartItems = preg_replace_callback(
+                "/" . $this->_oModule->_oConfig->descriptorA2S(array($iSellerId, $iModuleId, $iItemId, '([0-9])+')) . "/", function($aMatches) use($iSellerId, $iModuleId, $iItemId, $iItemCount) {
+                    return $this->_oModule->_oConfig->descriptorA2S(array($iSellerId, $iModuleId, $iItemId, $aMatches[1] + $iItemCount));
+                },
+            	$sCartItems
+            );
+        else {
+            $sCartItem = $this->_oModule->_oConfig->descriptorA2S(array($iSellerId, $iModuleId, $iItemId, $iItemCount));
+            $sCartItems = empty($sCartItems) ? $sCartItem : $sCartItems . $this->_oModule->_oConfig->getDivider('DIVIDER_DESCRIPTORS') . $sCartItem;
+        }
+
+        $aCartCustom = array();
+        if(!empty($aCart['customs']))
+            $aCartCustom = unserialize($aCart['customs']);
+
+        if(!empty($aCustom) && is_array($aCustom))
+            $aCartCustom[$sCiDsc] = !empty($aCartCustom[$sCiDsc]) && is_array($aCartCustom[$sCiDsc]) ? array_merge($aCartCustom[$sCiDsc], $aCustom) : $aCustom;
+
+        $this->_oModule->_oDb->setCartItems($iClientId, $sCartItems, $aCartCustom);
+
+        $aInfo = $this->getInfo(BX_PAYMENT_TYPE_SINGLE, $iClientId);
+        $iTotalQuantity = 0;
+        foreach($aInfo as $aCart)
+           $iTotalQuantity += $aCart['items_count'];
+
+        return array(
+        	'code' => 0, 
+        	'message' => _t($CNF['T']['MSG_ITEM_ADDED']), 
+        	'total_quantity' => $iTotalQuantity,
+	        //TODO: Update account submenu if it's needed.  
+        	'content' => '' //$this->_oModule->_oTemplate->displayToolbarSubmenu($aInfo)
+        );
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_payment Payment
+     * @subsection bx_payment-purchase_processing Purchase Processing
+     * @subsubsection bx_payment-delete_from_cart delete_from_cart
+     * 
+     * @code bx_srv('bx_payment', 'delete_from_cart', [...], 'Cart'); @endcode
+     * 
+     * Delete an item(s) from shopping cart.
+     *
+     * @param $iSellerId integer value with seller ID. The items owned by this seller will be removed only.
+     * @param $iModuleId (optional) integer value with module ID. If specified, the items related to this module will be removed only.
+     * @param $iItemId (optional) integer value with item ID. If specified, the item with this ID will be removed only.
+     * @return an array with special format which describes the result of operation.
+     * 
+     * @see BxPaymentCart::serviceDeleteFromCart
+     */
+    /** 
+     * @ref bx_payment-delete_from_cart "delete_from_cart"
+     */
+    public function serviceDeleteFromCart($iSellerId, $iModuleId = 0, $iItemId = 0)
+    {
+    	$CNF = &$this->_oModule->_oConfig->CNF;
+
+        if($iSellerId == BX_PAYMENT_EMPTY_ID)
+            return array('code' => 1, 'message' => _t($CNF['T']['ERR_WRONG_DATA']));
+
+		$iClientId = $this->_oModule->getProfileId();
+        if(empty($iClientId))
+            return array('code' => 2, 'message' => _t($CNF['T']['ERR_REQUIRED_LOGIN']));
+
+        $aCart = $this->_oModule->_oDb->getCartContent($iClientId);
+
+        $aCartCustom = array();
+        if(!empty($aCart['customs']))
+            $aCartCustom = unserialize($aCart['customs']);
+
+        if(!empty($iModuleId) && !empty($iItemId)) {
+            $sCiDsc = $this->_oModule->_oConfig->descriptorA2S(array($iSellerId, $iModuleId, $iItemId));
+            if(!empty($aCartCustom[$sCiDsc]))
+                unset($aCartCustom[$sCiDsc]);
+        }
+        else {
+            $aCiDscs = array_keys($aCartCustom);
+            foreach($aCiDscs as $sCiDsc)
+                if(strpos($sCiDsc, $iSellerId . '_') === 0)
+                    unset($aCartCustom[$sCiDsc]);
+
+            $iModuleId = $iItemId = '[0-9]+';
+        }
+
+        $aCart['items'] = trim(preg_replace("'" . $this->_oModule->_oConfig->descriptorA2S(array($iSellerId, $iModuleId, $iItemId, '[0-9]+:?')) . "'", "", $aCart['items']), ":");
+        $this->_oModule->_oDb->setCartItems($iClientId, $aCart['items'], $aCartCustom);
+
+        bx_alert($this->_oModule->getName(), 'delete_from_cart', 0, 0, array(
+            'seller_id' => $iSellerId,
+            'module_id' => $iModuleId,
+            'item_id' => $iItemId,
+        ));
+        
+        return array('code' => 0, 'message' => _t($CNF['T']['MSG_ITEM_DELETED']));
+    }
+
+    public function getInfo($sType, $iUserId, $iSellerId = BX_PAYMENT_EMPTY_ID, $aItems = array())
+    {
+        if($iSellerId != BX_PAYMENT_EMPTY_ID && !empty($aItems))
+            return $this->_getInfo($sType, $iUserId, $iSellerId, $this->_oModule->_oConfig->descriptorsM2A($aItems));
+
+        $aContent = $this->_parseByVendor($iUserId);
+
+        if($iSellerId != BX_PAYMENT_EMPTY_ID)
+            return isset($aContent[$iSellerId]) ? $this->_getInfo($sType, $iUserId, $iSellerId, $aContent[$iSellerId]) : array();
+
+        $aResult = array();
+        foreach($aContent as $iSellerId => $aSellerItems)
+            $aResult[$iSellerId] = $this->_getInfo($sType, $iUserId, $iSellerId, $aSellerItems);
+
+        return $aResult;
+    }
+
+    /**
+     * Enter description here...
+     *
+     * @param  integer $iClientId client's ID
+     * @param  integer $iSellerId vendor's ID
+     * @param  array   $aItems    item descriptors(quaternions) from shopping cart.
+     * @return array   with full info about vendor and items.
+     */
+    protected function _getInfo($sType, $iClientId, $iSellerId, $aItems)
+    {
+        $bTypeSingle = $sType == BX_PAYMENT_TYPE_SINGLE;
+
+        $iItemsCount = 0;
+        $fItemsPrice = 0;
+        $aItemsInfo = array();
+        foreach($aItems as $aItem) {
+            $aCustom = isset($aItem['custom']) ? $aItem['custom'] : array();
+
+            //--- Get item main info
+            $aItemInfo = $this->_oModule->callGetCartItem((int)$aItem['module_id'], array($aItem['item_id'], $aCustom));
+            if(empty($aItemInfo) || !is_array($aItemInfo)) {
+                if($bTypeSingle) {
+                    $sCartItems = $this->_oModule->_oDb->getCartItems($iClientId);
+                    $sCartItems = trim(preg_replace("'" . $this->_oModule->_oConfig->descriptorA2S($aItem) . ":?'", "", $sCartItems), ":");
+                    $this->_oModule->_oDb->setCartItems($iClientId, $sCartItems);
+                }
+
+                continue;
+            }
+
+            $aItemInfo['module_id'] = (int)$aItem['module_id'];
+            $aItemInfo['quantity'] = (int)$aItem['item_count'];
+
+            //--- Get item addons' info
+            $aItemAddons = array();
+            if(!empty($aItem['item_addons'])) {
+                $aAddons = $this->_oModule->_oConfig->s2a($aItem['item_addons']);
+                foreach($aAddons as $sAddon) {
+                    if(isset($aItemAddons[$sAddon])) {
+                        $aItemAddons[$sAddon]['quantity'] += 1;
+                        continue;
+                    }
+
+                    $aAddonInfo = $this->_oModule->callGetCartItem((int)$aItem['module_id'], array($sAddon, $aCustom));
+                    if(empty($aAddonInfo) || !is_array($aAddonInfo))
+                        continue;
+
+                    $aAddonInfo['module_id'] = (int)$aItem['module_id'];
+                    $aAddonInfo['quantity'] = 1;
+
+                    $aItemAddons[$sAddon] = $aAddonInfo;
+                }
+            }
+
+            $aItemInfo['addons'] = $aItemAddons;
+            $aItemsInfo[] = $aItemInfo;
+
+            //--- Update items' summary
+            $fAddonsPrice = 0;
+            foreach($aItemInfo['addons'] as $aAddonInfo)
+                $fAddonsPrice += $aAddonInfo['quantity'] * $this->_oModule->_oConfig->getPrice($sType, $aAddonInfo);
+
+            $iItemsCount += $aItemInfo['quantity'];
+            $fItemsPrice += $aItemInfo['quantity'] * ($this->_oModule->_oConfig->getPrice($sType, $aItemInfo) + $fAddonsPrice);
+        }
+
+        $aSeller = $this->_oModule->getVendorInfo((int)$iSellerId);
+        return array(
+            'client_id' => $iClientId,
+            'vendor_id' => $aSeller['id'],
+            'vendor_name' => $aSeller['name'],
+            'vendor_link' => $aSeller['link'],
+            'vendor_icon' => $aSeller['icon'],
+            'vendor_thumb' => $aSeller['thumb'],
+            'vendor_avatar' => $aSeller['avatar'],
+            'vendor_unit' => $aSeller['unit'],
+            'vendor_currency_code' => $aSeller['currency_code'],
+            'vendor_currency_sign' => $aSeller['currency_sign'],
+            'items_count' => $iItemsCount,
+            'items_price' => $fItemsPrice,
+            'items' => $aItemsInfo
+        );
+    }
+}
+
+/** @} */

+ 70 - 0
modules/boonex/payment/updates/11.0.2_11.0.3/source/install/config.php

@@ -0,0 +1,70 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Payment Payment
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_MODULE,
+    'name' => 'bx_payment',
+    'title' => 'Payment',
+    'note' => 'Payment module.',
+    'version' => '11.0.3',
+    'vendor' => 'Boonex',
+    'help_url' => 'http://feed.una.io/?section={module_name}',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/payment/',
+    'home_uri' => 'payment',
+
+    'db_prefix' => 'bx_payment_',
+    'class_prefix' => 'BxPayment',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Payment',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+	'uninstall' => array (
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable' => array(
+        'execute_sql' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable' => array (
+        'execute_sql' => 1,
+        'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Dependencies Section
+     */
+    'dependencies' => array(),
+);
+
+/** @} */

+ 51 - 0
modules/boonex/persons/updates/11.0.0_11.0.1/install/config.php

@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'title' => 'Persons',
+    'version_from' => '11.0.0',
+    'version_to' => '11.0.1',
+    'vendor' => 'BoonEx',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/persons/updates/update_11.0.0_11.0.1/',
+    'home_uri' => 'persons_update_1100_1101',
+
+    'module_dir' => 'boonex/persons/',
+    'module_uri' => 'persons',
+
+    'db_prefix' => 'bx_persons_',
+    'class_prefix' => 'BxPersons',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_files' => 1,
+        'update_languages' => 0,
+        'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Persons',
+
+    /**
+     * Files Section
+     */
+    'delete_files' => array(),
+);

+ 13 - 0
modules/boonex/persons/updates/11.0.0_11.0.1/install/installer.php

@@ -0,0 +1,13 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+class BxPersonsUpdater extends BxDolStudioUpdater
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+}

+ 4 - 0
modules/boonex/persons/updates/11.0.0_11.0.1/install/sql/enable.sql

@@ -0,0 +1,4 @@
+-- MENU
+UPDATE `sys_menu_items` SET `visible_for_levels`='2147483647' WHERE `set_name`='bx_persons_view_actions' AND `name`='profile-set-acl-level';
+
+UPDATE `sys_menu_items` SET `visible_for_levels`='2147483647' WHERE `set_name`='bx_persons_view_actions_all' AND `name`='profile-set-acl-level';

+ 152 - 0
modules/boonex/persons/updates/11.0.0_11.0.1/source/install/config.php

@@ -0,0 +1,152 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Persons Persons
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_MODULE,
+    'name' => 'bx_persons',
+    'title' => 'Persons',
+    'note' => 'Basic person profiles functionality.',
+    'version' => '11.0.1',
+    'vendor' => 'BoonEx',
+    'help_url' => 'http://feed.una.io/?section={module_name}',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/persons/',
+    'home_uri' => 'persons',
+
+    'db_prefix' => 'bx_persons_',
+    'class_prefix' => 'BxPersons',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Persons',
+
+    /**
+     * Connections.
+     */
+    'connections' => array(
+        'sys_profiles_friends' => array ('type' => 'profiles'),
+        'sys_profiles_subscriptions' => array ('type' => 'profiles'),
+        'sys_profiles_relations' => array ('type' => 'profiles'),
+    ),
+
+    /**
+     * Menu triggers.
+     */
+    'menu_triggers' => array(
+        'trigger_profile_view_submenu',
+        'trigger_profile_snippet_meta',
+    	'trigger_profile_view_actions',
+    ),
+
+	/**
+     * Page triggers.
+     */
+    'page_triggers' => array (
+    	'trigger_page_profile_view_entry', 
+    ),
+
+	/**
+     * Storage objects to automatically delete files from upon module uninstallation.
+     * Note. Don't add storage objects used in transcoder objects.
+     */
+    'storages' => array(
+    	'bx_persons_pictures'
+    ),
+
+	/**
+     * Transcoders.
+     */
+    'transcoders' => array(
+    	'bx_persons_icon',
+    	'bx_persons_thumb',
+    	'bx_persons_avatar',
+        'bx_persons_avatar_big',
+    	'bx_persons_picture',
+    	'bx_persons_cover',
+    	'bx_persons_cover_thumb',
+        'bx_persons_gallery'
+    ),
+
+    /**
+     * Extended Search Forms.
+     */
+    'esearches' => array(
+        'bx_persons',
+    	'bx_persons_cmts',
+    ),
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'uninstall' => array (
+    	'process_esearches' => 1,
+        'execute_sql' => 1,
+        'update_languages' => 1,
+    	'process_connections' => 1,
+    	'process_deleted_profiles' => 1,
+    	'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable' => array(
+        'execute_sql' => 1,
+    	'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+	'enable_success' => array(
+    	'process_menu_triggers' => 1,
+    	'process_page_triggers' => 1,
+    	'process_esearches' => 1,
+    	'register_transcoders' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable' => array (
+        'execute_sql' => 1,
+    	'unregister_transcoders' => 1,
+    	'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable_failed' => array (
+    	'register_transcoders' => 1,
+    	'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Dependencies Section
+     */
+    'dependencies' => array(),
+
+    /**
+     * Connections Section
+     */
+    'relations' => array(
+    	'bx_timeline',
+        'bx_notifications',
+    ),
+);
+
+/** @} */

+ 528 - 0
modules/boonex/persons/updates/11.0.0_11.0.1/source/install/sql/enable.sql

@@ -0,0 +1,528 @@
+
+-- SETTINGS
+
+SET @iTypeOrder = (SELECT MAX(`order`) FROM `sys_options_types` WHERE `group` = 'modules');
+INSERT INTO `sys_options_types`(`group`, `name`, `caption`, `icon`, `order`) VALUES 
+('modules', 'bx_persons', '_bx_persons', 'bx_persons@modules/boonex/persons/|std-icon.svg', IF(ISNULL(@iTypeOrder), 1, @iTypeOrder + 1));
+SET @iTypeId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options_categories` (`type_id`, `name`, `caption`, `order`)
+VALUES (@iTypeId, 'bx_persons', '_bx_persons', 1);
+SET @iCategId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `extra`, `check`, `check_error`, `order`) VALUES
+('bx_persons_autoapproval', 'on', @iCategId, '_bx_persons_option_autoapproval', 'checkbox', '', '', '', 1),
+('bx_persons_default_acl_level', '3', @iCategId, '_bx_persons_option_default_acl_level', 'select', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:15:"get_memberships";s:6:"params";a:4:{s:11:"purchasable";b:0;s:6:"active";b:1;s:9:"translate";b:1;s:22:"filter_out_auto_levels";b:1;}s:5:"class";s:16:"TemplAclServices";}', '', '', 2),
+('bx_persons_redirect_aadd', 'profile', @iCategId, '_bx_persons_option_redirect_aadd', 'select', 'a:2:{s:6:"module";s:10:"bx_persons";s:6:"method";s:30:"get_options_redirect_after_add";}', '', '', 3),
+('bx_persons_redirect_aadd_custom_url', '', @iCategId, '_bx_persons_option_redirect_aadd_custom_url', 'digit', '', '', '', 4),
+('bx_persons_num_connections_quick', '6', @iCategId, '_bx_persons_option_num_connections_quick', 'digit', '', '', '', 10),
+('bx_persons_per_page_browse', '24', @iCategId, '_bx_persons_option_per_page_browse', 'digit', '', '', '', 11),
+('bx_persons_num_rss', '10', @iCategId, '_bx_persons_option_num_rss', 'digit', '', '', '', 12),
+('bx_persons_per_page_browse_showcase', '32', @iCategId, '_sys_option_per_page_browse_showcase', 'digit', '', '', '', 15),
+('bx_persons_per_page_browse_recommended', '10', @iCategId, '_sys_option_per_page_browse_recommended', 'digit', '', '', '', 16),
+('bx_persons_searchable_fields', 'fullname,description', @iCategId, '_bx_persons_option_searchable_fields', 'list', 'a:2:{s:6:"module";s:10:"bx_persons";s:6:"method";s:21:"get_searchable_fields";}', '', '', 20),
+('bx_persons_public_subscriptions', '', @iCategId, '_bx_persons_option_public_subscriptions', 'checkbox', '', '', '', 30),
+('bx_persons_public_subscribed_me', '', @iCategId, '_bx_persons_option_public_subscribed_me', 'checkbox', '', '', '', 31),
+('bx_persons_enable_profile_activation_letter', 'on', @iCategId, '_bx_persons_option_enable_profile_activation_letter', 'checkbox', '', '', '', 32);
+
+-- PAGES
+
+-- PAGE: create profile
+
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_create_profile', 'create-persons-profile', '_bx_persons_page_title_sys_create_profile', '_bx_persons_page_title_create_profile', 'bx_persons', 5, 2147483647, 1, 'page.php?i=create-persons-profile', '', '', '', 0, 1, 0, '', '');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_persons_create_profile', 1, 'bx_persons', '_bx_persons_page_block_title_choose_type', 11, 2147483647, 'menu', 'sys_add_profile_vertical', 0, 1, 0, 0),
+('bx_persons_create_profile', 1, 'bx_persons', '_bx_persons_page_block_title_create_profile', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:13:\"entity_create\";}', 0, 1, 1, 1);
+
+-- PAGE: view profile
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_view_profile', 'view-persons-profile', '_bx_persons_page_title_sys_view_profile', '_bx_persons_page_title_view_profile', 'bx_persons', 7, 2147483647, 1, 'page.php?i=view-persons-profile', '', '', '', 0, 1, 0, 'BxPersonsPageEntry', 'modules/boonex/persons/classes/BxPersonsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES
+('bx_persons_view_profile', 2, 'bx_persons', '', '_bx_persons_page_block_title_profile_subscriptions', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:21:\"profile_subscriptions\";}', 0, 1, 0, 0),
+('bx_persons_view_profile', 2, 'bx_persons', '', '_bx_persons_page_block_title_profile_subscribed_me', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:21:\"profile_subscribed_me\";}', 0, 1, 0, 0),
+('bx_persons_view_profile', 2, 'bx_persons', '', '_bx_persons_page_block_title_profile_related_me', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:10:"bx_persons";s:6:"method";s:18:"profile_related_me";}', 0, 1, 0, 0),
+('bx_persons_view_profile', 2, 'bx_persons', '', '_bx_persons_page_block_title_profile_comments', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:15:\"entity_comments\";}', 0, 0, 0, 0),
+('bx_persons_view_profile', 2, 'bx_persons', '', '_bx_persons_page_block_title_profile_description', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:17:\"entity_text_block\";}', 0, 0, 1, 1),
+('bx_persons_view_profile', 2, 'bx_persons', '', '_bx_persons_page_block_title_profile_friends', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:15:\"profile_friends\";}', 0, 1, 1, 2),
+('bx_persons_view_profile', 2, 'bx_persons', '', '_bx_persons_page_block_title_profile_relations', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:10:"bx_persons";s:6:"method";s:17:"profile_relations";}', 0, 1, 1, 3),
+('bx_persons_view_profile', 3, 'bx_persons', '', '_bx_persons_page_block_title_profile_location', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:15:\"entity_location\";}', 0, 0, 0, 0),
+('bx_persons_view_profile', 3, 'bx_persons', '', '_bx_persons_page_block_title_profile_info', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:11:\"entity_info\";}', 0, 0, 1, 1),
+('bx_persons_view_profile', 3, 'bx_persons', '', '_bx_persons_page_block_title_profile_all_actions', 13, 2147483647, 'service', 'a:2:{s:6:"module";s:10:"bx_persons";s:6:"method";s:18:"entity_all_actions";}', 0, 0, 0, 0),
+('bx_persons_view_profile', 3, 'bx_persons', '', '_bx_persons_page_block_title_profile_membership', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:18:\"profile_membership\";}', 0, 0, 1, 2),
+('bx_persons_view_profile', 3, 'bx_persons', '', '_bx_persons_page_block_title_profile_location', 3, 2147483647, 'service', 'a:4:{s:6:\"module\";s:6:\"system\";s:6:\"method\";s:13:\"locations_map\";s:6:\"params\";a:2:{i:0;s:10:\"bx_persons\";i:1;s:12:\"{content_id}\";}s:5:\"class\";s:20:\"TemplServiceMetatags\";}', 0, 0, 1, 3);
+
+-- PAGE: view closed profile 
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_view_profile_closed', 'view-person-profile-closed', '_bx_persons_page_title_sys_view_profile_closed', '_bx_persons_page_title_view_profile', 'bx_persons', 10, 2147483647, 1, 'page.php?i=view-person-profile', '', '', '', 0, 1, 0, 'BxPersonsPageEntry', 'modules/boonex/persons/classes/BxPersonsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_persons_view_profile_closed', 1, 'bx_persons', '', '_bx_persons_page_block_title_profile_private', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:19:\"private_profile_msg\";}', 0, 1, 1, 0);
+
+-- PAGE: edit profile
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_edit_profile', 'edit-persons-profile', '_bx_persons_page_title_sys_edit_profile', '_bx_persons_page_title_edit_profile', 'bx_persons', 5, 2147483647, 1, 'page.php?i=edit-persons-profile', '', '', '', 0, 1, 0, 'BxPersonsPageEntry', 'modules/boonex/persons/classes/BxPersonsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_persons_edit_profile', 1, 'bx_persons', '_bx_persons_page_block_title_edit_profile', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:11:\"entity_edit\";}', 0, 0, 0);
+
+-- PAGE: edit profile cover
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_edit_profile_cover', 'edit-persons-cover', '_bx_persons_page_title_sys_edit_profile_cover', '_bx_persons_page_title_edit_profile_cover', 'bx_persons', 5, 2147483647, 1, 'page.php?i=edit-persons-cover', '', '', '', 0, 1, 0, 'BxPersonsPageEntry', 'modules/boonex/persons/classes/BxPersonsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_persons_edit_profile_cover', 1, 'bx_persons', '_bx_persons_page_block_title_edit_profile_cover', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:17:\"entity_edit_cover\";}', 0, 0, 0);
+
+-- PAGE: delete profile
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_delete_profile', 'delete-persons-profile', '_bx_persons_page_title_sys_delete_profile', '_bx_persons_page_title_delete_profile', 'bx_persons', 5, 2147483647, 1, 'page.php?i=delete-persons-profile', '', '', '', 0, 1, 0, 'BxPersonsPageEntry', 'modules/boonex/persons/classes/BxPersonsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_persons_delete_profile', 1, 'bx_persons', '_bx_persons_page_block_title_delete_profile', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:13:\"entity_delete\";}', 0, 0, 0);
+
+-- PAGE: profile info
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_profile_info', 'persons-profile-info', '_bx_persons_page_title_sys_profile_info', '_bx_persons_page_title_profile_info', 'bx_persons', 5, 2147483647, 1, 'page.php?i=persons-profile-info', '', '', '', 0, 1, 0, 'BxPersonsPageEntry', 'modules/boonex/persons/classes/BxPersonsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_persons_profile_info', 1, 'bx_persons', '_bx_persons_page_block_title_system_profile_info', '_bx_persons_page_block_title_profile_info_link', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:16:\"entity_info_full\";}', 0, 0, 1, 1),
+('bx_persons_profile_info', 1, 'bx_persons', '', '_bx_persons_page_block_title_profile_description', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:17:\"entity_text_block\";}', 0, 0, 1, 2);
+
+-- PAGE: profile friends
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_profile_friends', 'persons-profile-friends', '_bx_persons_page_title_sys_profile_friends', '_bx_persons_page_title_profile_friends', 'bx_persons', 5, 2147483647, 1, 'page.php?i=persons-profile-friends', '', '', '', 0, 1, 0, 'BxPersonsPageEntry', 'modules/boonex/persons/classes/BxPersonsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_persons_profile_friends', 1, 'bx_persons', '_bx_persons_page_block_title_system_profile_friends', '_bx_persons_page_block_title_profile_friends_link', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:6:\"system\";s:6:\"method\";s:17:\"connections_table\";s:5:\"class\";s:23:\"TemplServiceConnections\";}', 0, 0, 1, 1);
+
+-- PAGE: profile friend requests
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_friend_requests', 'persons-friend-requests', '_bx_persons_page_title_sys_friend_requests', '_bx_persons_page_title_friend_requests', 'bx_persons', 5, 2147483647, 1, 'page.php?i=persons-friend-requests', '', '', '', 0, 1, 0, 'BxPersonsPageEntry', 'modules/boonex/persons/classes/BxPersonsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_persons_friend_requests', 1, 'bx_persons', '_bx_persons_page_block_title_system_friend_requests', '_bx_persons_page_block_title_friend_requests_link', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:6:\"system\";s:6:\"method\";s:25:\"connections_request_table\";s:5:\"class\";s:23:\"TemplServiceConnections\";}', 0, 0, 1, 1);
+
+-- PAGE: profile favorites
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_profile_favorites', 'persons-profile-favorites', '_bx_persons_page_title_sys_profile_favorites', '_bx_persons_page_title_profile_favorites', 'bx_persons', 5, 2147483647, 1, 'page.php?i=persons-profile-favorites', '', '', '', 0, 1, 0, 'BxPersonsPageBrowse', 'modules/boonex/persons/classes/BxPersonsPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_persons_profile_favorites', 1, 'bx_persons', '_bx_persons_page_block_title_system_profile_favorites', '_bx_persons_page_block_title_profile_favorites', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:10:"bx_persons";s:6:"method";s:15:"browse_favorite";}', 0, 1, 1, 1);
+
+-- PAGE: profile subscriptions
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_profile_subscriptions', 'persons-profile-subscriptions', '_bx_persons_page_title_sys_profile_subscriptions', '_bx_persons_page_title_profile_subscriptions', 'bx_persons', 5, 2147483647, 1, 'page.php?i=persons-profile-subscriptions', '', '', '', 0, 1, 0, 'BxPersonsPageEntry', 'modules/boonex/persons/classes/BxPersonsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_persons_profile_subscriptions', 1, 'bx_persons', '_bx_persons_page_block_title_system_profile_subscriptions', '_bx_persons_page_block_title_profile_subscriptions', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:6:\"system\";s:6:\"method\";s:19:\"subscriptions_table\";s:5:\"class\";s:23:\"TemplServiceConnections\";}', 0, 0, 1, 1),
+('bx_persons_profile_subscriptions', 1, 'bx_persons', '_bx_persons_page_block_title_system_profile_subscribed_me', '_bx_persons_page_block_title_profile_subscribed_me', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:6:\"system\";s:6:\"method\";s:19:\"subscribed_me_table\";s:5:\"class\";s:23:\"TemplServiceConnections\";}', 0, 0, 1, 2);
+
+-- PAGE: profile relations
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_profile_relations', 'persons-profile-relations', '_bx_persons_page_title_sys_profile_relations', '_bx_persons_page_title_profile_relations', 'bx_persons', 5, 2147483647, 1, 'page.php?i=persons-profile-relations', '', '', '', 0, 1, 0, 'BxPersonsPageEntry', 'modules/boonex/persons/classes/BxPersonsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_persons_profile_relations', 1, 'bx_persons', '_bx_persons_page_block_title_system_profile_relations', '_bx_persons_page_block_title_profile_relations', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:6:"system";s:6:"method";s:15:"relations_table";s:5:"class";s:23:"TemplServiceConnections";}', 0, 0, 1, 1),
+('bx_persons_profile_relations', 1, 'bx_persons', '_bx_persons_page_block_title_system_profile_related_me', '_bx_persons_page_block_title_profile_related_me', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:6:"system";s:6:"method";s:16:"related_me_table";s:5:"class";s:23:"TemplServiceConnections";}', 0, 0, 1, 2);
+
+-- PAGE: view entry comments
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_profile_comments', '_bx_persons_page_title_sys_profile_comments', '_bx_persons_page_title_profile_comments', 'bx_persons', 5, 2147483647, 1, 'persons-profile-comments', '', '', '', '', 0, 1, 0, 'BxPersonsPageEntry', 'modules/boonex/persons/classes/BxPersonsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_persons_profile_comments', 1, 'bx_persons', '_bx_persons_page_block_title_profile_comments', '_bx_persons_page_block_title_profile_comments_link', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:15:\"entity_comments\";}', 0, 0, 0, 1);
+
+
+-- PAGE: module home
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_home', '_bx_persons_page_title_sys_recent', '_bx_persons_page_title_recent', 'bx_persons', 5, 2147483647, 1, 'persons-home', 'page.php?i=persons-home', '', '', '', 0, 1, 0, 'BxPersonsPageBrowse', 'modules/boonex/persons/classes/BxPersonsPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
+('bx_persons_home', 1, 'bx_persons', '_bx_persons_page_block_title_featured_profiles', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:10:"bx_persons";s:6:"method";s:15:"browse_featured";s:6:"params";a:1:{i:0;s:7:"gallery";}}', 0, 1, 0),
+('bx_persons_home', 1, 'bx_persons', '_bx_persons_page_block_title_latest_profiles', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:22:\"browse_recent_profiles\";s:6:"params";a:1:{i:0;b:1;}}', 0, 1, 1);
+
+-- PAGE: active profiles
+
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_active', '_bx_persons_page_title_sys_active', '_bx_persons_page_title_active', 'bx_persons', 5, 2147483647, 1, 'persons-active', 'page.php?i=persons-active', '', '', '', 0, 1, 0, 'BxPersonsPageBrowse', 'modules/boonex/persons/classes/BxPersonsPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_persons_active', 1, 'bx_persons', '_bx_persons_page_block_title_active_profiles', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:10:"bx_persons";s:6:"method";s:22:"browse_active_profiles";s:6:"params";a:2:{s:9:"unit_view";s:7:"gallery";s:13:"empty_message";b:1;}}', 0, 1, 0);
+
+-- PAGE: online profiles
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_online', '_bx_persons_page_title_sys_online', '_bx_persons_page_title_online', 'bx_persons', 5, 2147483647, 1, 'persons-online', 'page.php?i=persons-online', '', '', '', 0, 1, 0, 'BxPersonsPageBrowse', 'modules/boonex/persons/classes/BxPersonsPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_persons_online', 1, 'bx_persons', '_bx_persons_page_block_title_online_profiles', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:22:\"browse_online_profiles\";s:6:"params";a:1:{i:0;b:1;}}', 0, 1, 0);
+
+-- PAGE: search for entries
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_search', '_bx_persons_page_title_sys_entries_search', '_bx_persons_page_title_entries_search', 'bx_persons', 5, 2147483647, 1, 'persons-search', 'page.php?i=persons-search', '', '', '', 0, 1, 0, 'BxPersonsPageBrowse', 'modules/boonex/persons/classes/BxPersonsPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_persons_search', 1, 'bx_persons', '_bx_persons_page_block_title_search_form', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:8:"get_form";s:6:"params";a:1:{i:0;a:1:{s:6:"object";s:10:"bx_persons";}}s:5:"class";s:27:"TemplSearchExtendedServices";}', 0, 1, 1, 1),
+('bx_persons_search', 1, 'bx_persons', '_bx_persons_page_block_title_search_results', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:11:"get_results";s:6:"params";a:1:{i:0;a:2:{s:6:"object";s:10:"bx_persons";s:10:"show_empty";b:1;}}s:5:"class";s:27:"TemplSearchExtendedServices";}', 0, 1, 1, 2),
+('bx_persons_search', 1, 'bx_persons', '_bx_persons_page_block_title_search_form_cmts', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:8:"get_form";s:6:"params";a:1:{i:0;a:1:{s:6:"object";s:15:"bx_persons_cmts";}}s:5:"class";s:27:"TemplSearchExtendedServices";}', 0, 1, 0, 3),
+('bx_persons_search', 1, 'bx_persons', '_bx_persons_page_block_title_search_results_cmts', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:11:"get_results";s:6:"params";a:1:{i:0;a:2:{s:6:"object";s:15:"bx_persons_cmts";s:10:"show_empty";b:1;}}s:5:"class";s:27:"TemplSearchExtendedServices";}', 0, 1, 0, 4);
+
+-- PAGE: module manage own
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_manage', '_bx_persons_page_title_sys_manage', '_bx_persons_page_title_manage', 'bx_persons', 5, 2147483647, 1, 'persons-manage', 'page.php?i=persons-manage', '', '', '', 0, 1, 0, 'BxPersonsPageBrowse', 'modules/boonex/persons/classes/BxPersonsPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_persons_manage', 1, 'bx_persons', '_bx_persons_page_block_title_system_manage', '_bx_persons_page_block_title_manage', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:12:\"manage_tools\";}}', 0, 1, 0);
+
+-- PAGE: module manage all
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_administration', '_bx_persons_page_title_sys_manage_administration', '_bx_persons_page_title_manage', 'bx_persons', 5, 192, 1, 'persons-administration', 'page.php?i=persons-administration', '', '', '', 0, 1, 0, 'BxPersonsPageBrowse', 'modules/boonex/persons/classes/BxPersonsPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_persons_administration', 1, 'bx_persons', '_bx_persons_page_block_title_system_manage_administration', '_bx_persons_page_block_title_manage', 11, 192, 'service', 'a:3:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:12:\"manage_tools\";s:6:\"params\";a:1:{i:0;s:14:\"administration\";}}', 0, 1, 0);
+
+-- PAGE: add block to homepage
+
+SET @iBlockOrder = (SELECT `order` FROM `sys_pages_blocks` WHERE `object` = 'sys_home' AND `cell_id` = 1 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES
+('sys_home', 1, 'bx_persons', '' , '_bx_persons_page_block_title_latest_profiles', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:10:"bx_persons";s:6:"method";s:22:"browse_recent_profiles";}', 1, 0, 0, IFNULL(@iBlockOrder, 0) + 1),
+('sys_home', 1, 'bx_persons', '_bx_persons_page_block_title_sys_recommended_entries_view_showcase', '_bx_persons_page_block_title_recommended_entries_view_showcase', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:18:\"browse_recommended\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:8:\"showcase\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 1, 0, 0, IFNULL(@iBlockOrder, 0) + 2);
+
+-- PAGE: service blocks
+
+SET @iBlockOrder = (SELECT `order` FROM `sys_pages_blocks` WHERE `object` = '' AND `cell_id` = 0 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('', 0, 'bx_persons', '_bx_persons_page_block_title_sys_featured_entries_view_showcase', '_bx_persons_page_block_title_featured_entries_view_showcase', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:15:\"browse_featured\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:8:\"showcase\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 0, 1, 1, IFNULL(@iBlockOrder, 0) + 1),
+('', 0, 'bx_persons', '_bx_persons_page_block_title_sys_recommended_entries_view_showcase', '_bx_persons_page_block_title_recommended_entries_view_showcase', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:18:\"browse_recommended\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:8:\"showcase\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 0, 1, 1, IFNULL(@iBlockOrder, 0) + 2),
+('', 0, 'bx_persons', '_bx_persons_page_block_title_sys_active_entries_view_showcase', '_bx_persons_page_block_title_active_entries_view_showcase', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:22:\"browse_active_profiles\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:16:\"showcase_wo_info\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 0, 1, 1, IFNULL(@iBlockOrder, 0) + 3),
+('', 0, 'bx_persons', '_bx_persons_page_block_title_sys_active_profiles', '_bx_persons_page_block_title_active_profiles', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:10:\"bx_persons\";s:6:\"method\";s:22:\"browse_active_profiles\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:15:\"gallery_wo_info\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 0, 1, 1, IFNULL(@iBlockOrder, 0) + 4);
+
+-- MENU
+
+-- MENU: add to site menu
+
+SET @iSiteMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_site' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_site', 'bx_persons', 'persons-home', '_bx_persons_menu_item_title_system_entries_home', '_bx_persons_menu_item_title_entries_home', 'page.php?i=persons-home', '', '', 'user col-blue3', 'bx_persons_submenu', 2147483647, 1, 1, IFNULL(@iSiteMenuOrder, 0) + 1);
+
+-- MENU: add to homepage menu
+
+SET @iHomepageMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_homepage' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_homepage', 'bx_persons', 'persons-home', '_bx_persons_menu_item_title_system_entries_home', '_bx_persons_menu_item_title_entries_home', 'page.php?i=persons-home', '', '', 'user col-blue3', 'bx_persons_submenu', 2147483647, 1, 1, IFNULL(@iHomepageMenuOrder, 0) + 1);
+
+-- SET @iCreateProfileMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_profiles_create' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
+-- INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES
+-- ('sys_profiles_create', 'bx_persons', 'create-person-profile', '_bx_persons_menu_item_title_system_profile_type', '_bx_persons_menu_item_title_profile_type', 'page.php?i=create-persons-profile', '', '', 'user', '', 2147483647, 1, 1, IFNULL(@iCreateProfileMenuOrder, 0) + 1);
+
+SET @iAddMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_add_profile_links' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_add_profile_links', 'bx_persons', 'create-persons-profile', '_bx_persons_menu_item_title_system_create_profile', '_bx_persons_menu_item_title_create_profile', 'page.php?i=create-persons-profile', '', '', 'user col-blue3', '', 2147483647, 1, 1, IFNULL(@iAddMenuOrder, 0) + 1);
+
+-- MENU: view actions
+
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_view_actions', '_bx_persons_menu_title_view_profile_actions', 'bx_persons_view_actions', 'bx_persons', 9, 0, 1, 'BxPersonsMenuViewActions', 'modules/boonex/persons/classes/BxPersonsMenuViewActions.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_persons_view_actions', 'bx_persons', '_bx_persons_menu_set_title_view_profile_actions', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `submenu_popup`, `visible_for_levels`, `visibility_custom`, `active`, `copyable`, `order`) VALUES 
+('bx_persons_view_actions', 'bx_persons', 'profile-friend-add', '_bx_persons_menu_item_title_system_befriend', '{title_add_friend}', 'javascript:void(0)', 'bx_conn_action(this, \'sys_profiles_friends\', \'add\', \'{profile_id}\')', '', 'user-plus', '', 0, 2147483647, '', 1, 0, 10),
+('bx_persons_view_actions', 'bx_persons', 'profile-relation-add', '_bx_persons_menu_item_title_system_relation_add', '_bx_persons_menu_item_title_relation_add', 'javascript:void(0)', 'bx_menu_popup(''sys_add_relation'', window, {}, {profile_id: {profile_id}});', '', 'sync', '', 0, 2147483647, '', 1, 0, 15),
+('bx_persons_view_actions', 'bx_persons', 'profile-subscribe-add', '_bx_persons_menu_item_title_system_subscribe', '_bx_persons_menu_item_title_subscribe', 'javascript:void(0)', 'bx_conn_action(this, \'sys_profiles_subscriptions\', \'add\', \'{profile_id}\')', '', 'check', '', 0, 2147483647, '', 1, 0, 20),
+('bx_persons_view_actions', 'bx_persons', 'profile-set-acl-level', '_sys_menu_item_title_system_set_acl_level', '_sys_menu_item_title_set_acl_level', 'javascript:void(0)', 'bx_menu_popup(''sys_set_acl_level'', window, {}, {profile_id: {profile_id}});', '', 'certificate', '', 0, 2147483647, '', 1, 0, 30),
+('bx_persons_view_actions', 'bx_persons', 'profile-set-badges', '_sys_menu_item_title_system_set_badges', '_sys_menu_item_title_set_badges', 'javascript:void(0)', 'bx_menu_popup(''sys_set_badges'', window, {}, {module: ''bx_persons'', content_id: {content_id}});', '', 'check-circle', '', 0, 192, 'a:2:{s:6:"module";s:10:"bx_persons";s:6:"method";s:19:"is_badges_avaliable";}', 1, 0, 30),
+('bx_persons_view_actions', 'bx_persons', 'profile-actions-more', '_bx_persons_menu_item_title_system_more_actions', '_bx_persons_menu_item_title_more_actions', 'javascript:void(0)', 'bx_menu_popup(''bx_persons_view_actions_more'', this, {}, {profile_id:{profile_id}});', '', 'cog', 'bx_persons_view_actions_more', 1, 2147483647, '', 1, 0, 9999);
+
+-- MENU: view actions more
+
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_view_actions_more', '_bx_persons_menu_title_view_profile_actions_more', 'bx_persons_view_actions_more', 'bx_persons', 6, 0, 1, 'BxPersonsMenuViewActions', 'modules/boonex/persons/classes/BxPersonsMenuViewActions.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_persons_view_actions_more', 'bx_persons', '_bx_persons_menu_set_title_view_profile_actions_more', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('bx_persons_view_actions_more', 'bx_persons', 'profile-friend-remove', '_bx_persons_menu_item_title_system_unfriend', '{title_remove_friend}', 'javascript:void(0)', 'bx_conn_action(this, \'sys_profiles_friends\', \'remove\', \'{profile_id}\')', '', 'user-times', '', 2147483647, 1, 0, 10),
+('bx_persons_view_actions_more', 'bx_persons', 'profile-relation-remove', '_bx_persons_menu_item_title_system_relation_delete', '_bx_persons_menu_item_title_relation_delete', 'javascript:void(0)', 'bx_conn_action(this, \'sys_profiles_relations\', \'remove\', \'{profile_id}\')', '', 'sync', '', 2147483647, 1, 0, 15),
+('bx_persons_view_actions_more', 'bx_persons', 'profile-subscribe-remove', '_bx_persons_menu_item_title_system_unsubscribe', '_bx_persons_menu_item_title_unsubscribe', 'javascript:void(0)', 'bx_conn_action(this, \'sys_profiles_subscriptions\', \'remove\', \'{profile_id}\')', '', 'check', '', 2147483647, 1, 0, 20),
+('bx_persons_view_actions_more', 'bx_persons', 'edit-persons-cover', '_bx_persons_menu_item_title_system_edit_cover', '_bx_persons_menu_item_title_edit_cover', 'page.php?i=edit-persons-cover&id={content_id}', '', '', 'edit', '', 2147483647, 1, 0, 25),
+('bx_persons_view_actions_more', 'bx_persons', 'edit-persons-profile', '_bx_persons_menu_item_title_system_edit_profile', '_bx_persons_menu_item_title_edit_profile', 'page.php?i=edit-persons-profile&id={content_id}', '', '', 'pencil-alt', '', 2147483647, 1, 0, 30),
+('bx_persons_view_actions_more', 'bx_persons', 'delete-persons-profile', '_bx_persons_menu_item_title_system_delete_profile', '_bx_persons_menu_item_title_delete_profile', 'page.php?i=delete-persons-profile&id={content_id}', '', '', 'remove', '', 2147483647, 1, 0, 40),
+('bx_persons_view_actions_more', 'bx_persons', 'delete-persons-account', '_bx_persons_menu_item_title_system_delete_account', '_bx_persons_menu_item_title_delete_account', 'page.php?i=account-settings-delete&id={account_id}', '', '', 'user-times', '', 128, 1, 0, 50),
+('bx_persons_view_actions_more', 'bx_persons', 'delete-persons-account-content', '_bx_persons_menu_item_title_system_delete_account_content', '_bx_persons_menu_item_title_delete_account_content', 'page.php?i=account-settings-delete&id={account_id}&content=1', '', '', 'trash', '', 128, 1, 0, 60);
+
+-- MENU: all actions menu for view entry 
+
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_view_actions_all', '_sys_menu_title_view_actions', 'bx_persons_view_actions_all', 'bx_persons', 15, 0, 1, 'BxPersonsMenuViewActionsAll', 'modules/boonex/persons/classes/BxPersonsMenuViewActionsAll.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_persons_view_actions_all', 'bx_persons', '_sys_menu_set_title_view_actions', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `submenu_popup`, `visible_for_levels`, `visibility_custom`, `active`, `copyable`, `order`) VALUES 
+('bx_persons_view_actions_all', 'bx_persons', 'profile-friend-add', '_bx_persons_menu_item_title_system_befriend', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 10),
+('bx_persons_view_actions_all', 'bx_persons', 'profile-friend-remove', '_bx_persons_menu_item_title_system_unfriend', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 20),
+('bx_persons_view_actions_all', 'bx_persons', 'profile-relation-add', '_bx_persons_menu_item_title_system_relation_add', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 23),
+('bx_persons_view_actions_all', 'bx_persons', 'profile-relation-remove', '_bx_persons_menu_item_title_system_relation_delete', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 27),
+('bx_persons_view_actions_all', 'bx_persons', 'profile-subscribe-add', '_bx_persons_menu_item_title_system_subscribe', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 30),
+('bx_persons_view_actions_all', 'bx_persons', 'profile-subscribe-remove', '_bx_persons_menu_item_title_system_unsubscribe', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 40),
+('bx_persons_view_actions_all', 'bx_persons', 'profile-set-acl-level', '_sys_menu_item_title_system_set_acl_level', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 50),
+('bx_persons_view_actions_all', 'bx_persons', 'profile-set-badges', '_sys_menu_item_title_system_set_badges', '', '', '', '', '', '', '', 0, 192, 'a:2:{s:6:"module";s:10:"bx_persons";s:6:"method";s:19:"is_badges_avaliable";}', 1, 0, 60),
+('bx_persons_view_actions_all', 'bx_persons', 'comment', '_sys_menu_item_title_system_va_comment', '', '', '', '', '', '', '', 0, 2147483647, '', 0, 0, 200),
+('bx_persons_view_actions_all', 'bx_persons', 'view', '_sys_menu_item_title_system_va_view', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 210),
+('bx_persons_view_actions_all', 'bx_persons', 'vote', '_sys_menu_item_title_system_va_vote', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 215),
+('bx_persons_view_actions_all', 'bx_persons', 'score', '_sys_menu_item_title_system_va_score', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 220),
+('bx_persons_view_actions_all', 'bx_persons', 'favorite', '_sys_menu_item_title_system_va_favorite', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 230),
+('bx_persons_view_actions_all', 'bx_persons', 'feature', '_sys_menu_item_title_system_va_feature', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 240),
+('bx_persons_view_actions_all', 'bx_persons', 'report', '_sys_menu_item_title_system_va_report', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 250),
+('bx_persons_view_actions_all', 'bx_persons', 'edit-persons-cover', '_bx_persons_menu_item_title_system_edit_cover', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 400),
+('bx_persons_view_actions_all', 'bx_persons', 'edit-persons-profile', '_bx_persons_menu_item_title_system_edit_profile', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 410),
+('bx_persons_view_actions_all', 'bx_persons', 'delete-persons-profile', '_bx_persons_menu_item_title_system_delete_profile', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 420),
+('bx_persons_view_actions_all', 'bx_persons', 'delete-persons-account', '_bx_persons_menu_item_title_system_delete_account', '', '', '', '', '', '', '', 0, 128, '', 1, 0, 430),
+('bx_persons_view_actions_all', 'bx_persons', 'delete-persons-account-content', '_bx_persons_menu_item_title_system_delete_account_content', '', '', '', '', '', '', '', 0, 128, '', 1, 0, 440),
+('bx_persons_view_actions_all', 'bx_persons', 'more-auto', '_sys_menu_item_title_system_va_more_auto', '_sys_menu_item_title_va_more_auto', 'javascript:void(0)', '', '', 'ellipsis-v', '', '', 0, 2147483647, '', 1, 0, 9999);
+
+-- MENU: module sub-menu
+
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_submenu', '_bx_persons_menu_title_submenu', 'bx_persons_submenu', 'bx_persons', 8, 0, 1, '', '');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_persons_submenu', 'bx_persons', '_bx_persons_menu_set_title_submenu', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('bx_persons_submenu', 'bx_persons', 'persons-home', '_bx_persons_menu_item_title_system_entries_recent', '_bx_persons_menu_item_title_entries_recent', 'page.php?i=persons-home', '', '', '', '', 2147483647, 1, 1, 1),
+('bx_persons_submenu', 'bx_persons', 'persons-active', '_bx_persons_menu_item_title_system_entries_active', '_bx_persons_menu_item_title_entries_active', 'page.php?i=persons-active', '', '', '', '', 2147483647, 1, 1, 2),
+('bx_persons_submenu', 'bx_persons', 'persons-online', '_bx_persons_menu_item_title_system_entries_online', '_bx_persons_menu_item_title_entries_online', 'page.php?i=persons-online', '', '', '', '', 2147483647, 1, 1, 3),
+('bx_persons_submenu', 'bx_persons', 'persons-search', '_bx_persons_menu_item_title_system_entries_search', '_bx_persons_menu_item_title_entries_search', 'page.php?i=persons-search', '', '', '', '', 2147483647, 1, 1, 4),
+('bx_persons_submenu', 'bx_persons', 'persons-manage', '_bx_persons_menu_item_title_system_entries_manage', '_bx_persons_menu_item_title_entries_manage', 'page.php?i=persons-manage', '', '', '', '', 2147483646, 1, 1, 5);
+
+-- MENU: view submenu
+
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_view_submenu', '_bx_persons_menu_title_view_profile_submenu', 'bx_persons_view_submenu', 'bx_persons', 8, 0, 1, 'BxPersonsMenuView', 'modules/boonex/persons/classes/BxPersonsMenuView.php'),
+('bx_persons_view_submenu_cover', '_bx_persons_menu_title_view_profile_submenu_cover', 'bx_persons_view_submenu', 'bx_persons', 7, 0, 1, 'BxPersonsMenuView', 'modules/boonex/persons/classes/BxPersonsMenuView.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_persons_view_submenu', 'bx_persons', '_bx_persons_menu_set_title_view_profile_submenu', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `submenu_popup`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('bx_persons_view_submenu', 'bx_persons', 'view-persons-profile', '_bx_persons_menu_item_title_system_view_profile_view', '_bx_persons_menu_item_title_view_profile_view', 'page.php?i=view-persons-profile&id={content_id}', '', '', 'user col-blue3', '', '', 0, 2147483647, 1, 0, 1),
+('bx_persons_view_submenu', 'bx_persons', 'persons-profile-info', '_bx_persons_menu_item_title_system_view_profile_info', '_bx_persons_menu_item_title_view_profile_info', 'page.php?i=persons-profile-info&id={content_id}', '', '', 'info-circle col-gray', '', '', 0, 2147483647, 1, 0, 2),
+('bx_persons_view_submenu', 'bx_persons', 'persons-profile-friends', '_bx_persons_menu_item_title_system_view_profile_friends', '_bx_persons_menu_item_title_view_profile_friends', 'page.php?i=persons-profile-friends&profile_id={profile_id}', '', '', 'users col-blue3', '', '', 0, 2147483647, 1, 0, 3),
+('bx_persons_view_submenu', 'bx_persons', 'persons-profile-relations', '_bx_persons_menu_item_title_system_view_profile_relations', '_bx_persons_menu_item_title_view_profile_relations', 'page.php?i=persons-profile-relations&profile_id={profile_id}', '', '', 'sync col-blue3', '', '', 0, 2147483647, 1, 0, 4),
+('bx_persons_view_submenu', 'bx_persons', 'persons-profile-subscriptions', '_bx_persons_menu_item_title_system_view_profile_subscriptions', '_bx_persons_menu_item_title_view_profile_subscriptions', 'page.php?i=persons-profile-subscriptions&profile_id={profile_id}', '', '', 'check col-blue3', '', '', 0, 2147483647, 1, 0, 5),
+('bx_persons_view_submenu', 'bx_persons', 'persons-profile-comments', '_bx_persons_menu_item_title_system_view_profile_comments', '_bx_persons_menu_item_title_view_profile_comments', 'page.php?i=persons-profile-comments&id={content_id}', '', '', '', '', '', 0, 2147483647, 0, 0, 6),
+('bx_persons_view_submenu', 'bx_persons', 'more-auto', '_bx_persons_menu_item_title_system_view_profile_more_auto', '_bx_persons_menu_item_title_view_profile_more_auto', 'javascript:void(0)', '', '', 'ellipsis-v', '', '', 0, 2147483647, 1, 0, 9999);
+
+-- MENU: custom menu for snippet meta info
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_snippet_meta', '_sys_menu_title_snippet_meta', 'bx_persons_snippet_meta', 'bx_persons', 15, 0, 1, 'BxPersonsMenuSnippetMeta', 'modules/boonex/persons/classes/BxPersonsMenuSnippetMeta.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_persons_snippet_meta', 'bx_persons', '_sys_menu_set_title_snippet_meta', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `editable`, `order`) VALUES
+('bx_persons_snippet_meta', 'bx_persons', 'date', '_sys_menu_item_title_system_sm_date', '_sys_menu_item_title_sm_date', '', '', '', '', '', 2147483647, 0, 0, 1, 1),
+('bx_persons_snippet_meta', 'bx_persons', 'tags', '_sys_menu_item_title_system_sm_tags', '_sys_menu_item_title_sm_tags', '', '', '', '', '', 2147483647, 0, 0, 1, 2),
+('bx_persons_snippet_meta', 'bx_persons', 'views', '_sys_menu_item_title_system_sm_views', '_sys_menu_item_title_sm_views', '', '', '', '', '', 2147483647, 0, 0, 1, 3),
+('bx_persons_snippet_meta', 'bx_persons', 'comments', '_sys_menu_item_title_system_sm_comments', '_sys_menu_item_title_sm_comments', '', '', '', '', '', 2147483647, 0, 0, 1, 4),
+('bx_persons_snippet_meta', 'bx_persons', 'friends', '_sys_menu_item_title_system_sm_friends', '_sys_menu_item_title_sm_friends', '', '', '', '', '', 2147483647, 1, 0, 1, 5),
+('bx_persons_snippet_meta', 'bx_persons', 'subscribers', '_sys_menu_item_title_system_sm_subscribers', '_sys_menu_item_title_sm_subscribers', '', '', '', '', '', 2147483647, 1, 0, 1, 6),
+('bx_persons_snippet_meta', 'bx_persons', 'membership', '_sys_menu_item_title_system_sm_membership', '_sys_menu_item_title_sm_membership', '', '', '', '', '', 2147483647, 0, 0, 1, 7),
+('bx_persons_snippet_meta', 'bx_persons', 'nl', '_sys_menu_item_title_system_sm_nl', '_sys_menu_item_title_sm_nl', '', '', '', '', '', 2147483647, 1, 0, 1, 8),
+('bx_persons_snippet_meta', 'bx_persons', 'befriend', '_sys_menu_item_title_system_sm_befriend', '_sys_menu_item_title_sm_befriend', '', '', '', '', '', 2147483647, 1, 0, 1, 9),
+('bx_persons_snippet_meta', 'bx_persons', 'unfriend', '_sys_menu_item_title_system_sm_unfriend', '_sys_menu_item_title_sm_unfriend', '', '', '', '', '', 2147483647, 0, 0, 1, 10),
+('bx_persons_snippet_meta', 'bx_persons', 'subscribe', '_sys_menu_item_title_system_sm_subscribe', '_sys_menu_item_title_sm_subscribe', '', '', '', '', '', 2147483647, 1, 0, 1, 11),
+('bx_persons_snippet_meta', 'bx_persons', 'unsubscribe', '_sys_menu_item_title_system_sm_unsubscribe', '_sys_menu_item_title_sm_unsubscribe', '', '', '', '', '', 2147483647, 0, 0, 1, 12);
+
+-- MENU: notifications menu in account popup
+SET @iNotifMenuOrder = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_menu_items` WHERE `set_name` = 'sys_account_notifications' AND `active` = 1 AND `order` < 9999 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `visibility_custom`, `active`, `copyable`, `order`) VALUES
+('sys_account_notifications', 'bx_persons', 'notifications-friend-requests', '_bx_persons_menu_item_title_system_friends', '_bx_persons_menu_item_title_friends', 'page.php?i=persons-profile-friends&profile_id={member_id}', '', '', 'users col-blue3', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:31:"get_unconfirmed_connections_num";s:6:"params";a:1:{i:0;s:20:"sys_profiles_friends";}s:5:"class";s:23:"TemplServiceConnections";}', '', 2147483646, '', 1, 0, @iNotifMenuOrder + 1),
+('sys_account_notifications', 'bx_persons', 'notifications-relation-requests', '_bx_persons_menu_item_title_system_relations', '_bx_persons_menu_item_title_relations', 'page.php?i=persons-profile-relations&profile_id={member_id}', '', '', 'sync col-blue3', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:31:"get_unconfirmed_connections_num";s:6:"params";a:1:{i:0;s:22:"sys_profiles_relations";}s:5:"class";s:23:"TemplServiceConnections";}', '', 2147483646, 'a:2:{s:6:"module";s:10:"bx_persons";s:6:"method";s:19:"is_enable_relations";}', 1, 0, @iNotifMenuOrder + 2);
+
+-- MENU: profile stats
+SET @iNotifMenuOrder = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_menu_items` WHERE `set_name` = 'sys_profile_stats' AND `active` = 1 LIMIT 1);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES
+('sys_profile_stats', 'bx_persons', 'profile-stats-friend-requests', '_bx_persons_menu_item_title_system_friend_requests', '_bx_persons_menu_item_title_friend_requests', 'page.php?i=persons-profile-friends&profile_id={member_id}', '', '', 'users col-blue3', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:31:"get_unconfirmed_connections_num";s:6:"params";a:1:{i:0;s:20:"sys_profiles_friends";}s:5:"class";s:23:"TemplServiceConnections";}', '', 2147483646, 1, 0, @iNotifMenuOrder + 1),
+('sys_profile_stats', 'bx_persons', 'profile-stats-manage-profiles', '_bx_persons_menu_item_title_system_manage_my_profiles', '_bx_persons_menu_item_title_manage_my_profiles', 'page.php?i=persons-manage', '', '_self', 'users col-blue3', 'a:2:{s:6:"module";s:10:"bx_persons";s:6:"method";s:41:"get_menu_addon_manage_tools_profile_stats";}', '', 2147483646, 1, 0, @iNotifMenuOrder + 2),
+('sys_profile_stats', 'bx_persons', 'profile-stats-favorite-persons', '_bx_persons_menu_item_title_system_favorites', '_bx_persons_menu_item_title_favorites', 'page.php?i=persons-profile-favorites&profile_id={member_id}', '', '', 'star col-blue3', 'a:2:{s:6:"module";s:10:"bx_persons";s:6:"method";s:38:"get_menu_addon_favorites_profile_stats";}', '', 2147483646, 1, 0, @iNotifMenuOrder + 3),
+('sys_profile_stats', 'bx_persons', 'profile-stats-subscriptions', '_bx_persons_menu_item_title_system_subscriptions', '_bx_persons_menu_item_title_subscriptions', 'page.php?i=persons-profile-subscriptions&profile_id={member_id}#subscriptions', '', '_self', 'rss col-blue3', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:25:"get_connected_content_num";s:6:"params";a:1:{i:0;s:26:"sys_profiles_subscriptions";}s:5:"class";s:23:"TemplServiceConnections";}', '', 2147483646, 1, 0, @iNotifMenuOrder + 4),
+('sys_profile_stats', 'bx_persons', 'profile-stats-subscribed-me', '_bx_persons_menu_item_title_system_subscribed_me', '_bx_persons_menu_item_title_subscribed_me', 'page.php?i=persons-profile-subscriptions&profile_id={member_id}#subscribers', '', '_self', 'rss col-blue3', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:28:"get_connected_initiators_num";s:6:"params";a:1:{i:0;s:26:"sys_profiles_subscriptions";}s:5:"class";s:23:"TemplServiceConnections";}', '', 2147483646, 1, 0, @iNotifMenuOrder + 5),
+('sys_profile_stats', 'bx_persons', 'profile-stats-relations', '_bx_persons_menu_item_title_system_relations', '_bx_persons_menu_item_title_relations', 'page.php?i=persons-profile-relations&profile_id={member_id}#relations', '', '_self', 'sync col-blue3', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:25:"get_connected_content_num";s:6:"params";a:3:{i:0;s:22:"sys_profiles_relations";i:1;i:0;i:2;i:1;}s:5:"class";s:23:"TemplServiceConnections";}', '', 2147483646, 1, 0, @iNotifMenuOrder + 6),
+('sys_profile_stats', 'bx_persons', 'profile-stats-related-me', '_bx_persons_menu_item_title_system_related_me', '_bx_persons_menu_item_title_related_me', 'page.php?i=persons-profile-relations&profile_id={member_id}#related-me', '', '_self', 'sync col-blue3', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:28:"get_connected_initiators_num";s:6:"params";a:3:{i:0;s:22:"sys_profiles_relations";i:1;i:0;i:2;i:1;}s:5:"class";s:23:"TemplServiceConnections";}', '', 2147483646, 1, 0, @iNotifMenuOrder + 7);
+
+-- MENU: manage tools submenu
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_persons_menu_manage_tools', '_bx_persons_menu_title_manage_tools', 'bx_persons_menu_manage_tools', 'bx_persons', 6, 0, 1, 'BxPersonsMenuManageTools', 'modules/boonex/persons/classes/BxPersonsMenuManageTools.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_persons_menu_manage_tools', 'bx_persons', '_bx_persons_menu_set_title_manage_tools', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('bx_persons_menu_manage_tools', 'bx_persons', 'delete', '_bx_persons_menu_item_title_system_delete', '_bx_persons_menu_item_title_delete', 'javascript:void(0)', 'javascript:{js_object}.onClickDelete({content_id});', '_self', 'far trash-alt', '', 2147483647, 1, 0, 1),
+('bx_persons_menu_manage_tools', 'bx_persons', 'delete-with-content', '_bx_persons_menu_item_title_system_delete_with_content', '_bx_persons_menu_item_title_delete_with_content', 'javascript:void(0)', 'javascript:{js_object}.onClickDeleteWithContent({content_id});', '_self', 'far trash-alt', '', 2147483647, 1, 0, 2);
+
+-- MENU: dashboard manage tools
+SET @iManageMenuOrder = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_menu_items` WHERE `set_name`='sys_account_dashboard_manage_tools' LIMIT 1);
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_account_dashboard_manage_tools', 'bx_persons', 'persons-administration', '_bx_persons_menu_item_title_system_admt_persons', '_bx_persons_menu_item_title_admt_persons', 'page.php?i=persons-administration', '', '_self', 'user', 'a:2:{s:6:"module";s:10:"bx_persons";s:6:"method";s:27:"get_menu_addon_manage_tools";}', '', 192, 1, 0, @iManageMenuOrder + 1);
+
+
+-- ACL
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_persons', 'create entry', NULL, '_bx_persons_acl_action_create_profile', '', 1, 1);
+SET @iIdActionProfileCreate = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_persons', 'delete entry', NULL, '_bx_persons_acl_action_delete_profile', '', 1, 1);
+SET @iIdActionProfileDelete = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_persons', 'view entry', NULL, '_bx_persons_acl_action_view_profile', '', 1, 0);
+SET @iIdActionProfileView = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_persons', 'edit any entry', NULL, '_bx_persons_acl_action_edit_any_profile', '', 1, 3);
+SET @iIdActionProfileEditAny = LAST_INSERT_ID();
+
+
+SET @iUnauthenticated = 1;
+SET @iAccount = 2;
+SET @iStandard = 3;
+SET @iUnconfirmed = 4;
+SET @iPending = 5;
+SET @iSuspended = 6;
+SET @iModerator = 7;
+SET @iAdministrator = 8;
+SET @iPremium = 9;
+
+
+INSERT INTO `sys_acl_matrix` (`IDLevel`, `IDAction`) VALUES
+
+-- profile create
+(@iAccount, @iIdActionProfileCreate),
+(@iStandard, @iIdActionProfileCreate),
+(@iUnconfirmed, @iIdActionProfileCreate),
+(@iPending, @iIdActionProfileCreate),
+(@iModerator, @iIdActionProfileCreate),
+(@iAdministrator, @iIdActionProfileCreate),
+(@iPremium, @iIdActionProfileCreate),
+
+-- profile delete
+(@iAccount, @iIdActionProfileDelete),
+(@iStandard, @iIdActionProfileDelete),
+(@iUnconfirmed, @iIdActionProfileDelete),
+(@iPending, @iIdActionProfileDelete),
+(@iModerator, @iIdActionProfileDelete),
+(@iAdministrator, @iIdActionProfileDelete),
+(@iPremium, @iIdActionProfileDelete),
+
+-- profile view
+(@iUnauthenticated, @iIdActionProfileView),
+(@iAccount, @iIdActionProfileView),
+(@iStandard, @iIdActionProfileView),
+(@iUnconfirmed, @iIdActionProfileView),
+(@iPending, @iIdActionProfileView),
+(@iModerator, @iIdActionProfileView),
+(@iAdministrator, @iIdActionProfileView),
+(@iPremium, @iIdActionProfileView),
+
+-- any profile edit
+(@iModerator, @iIdActionProfileEditAny),
+(@iAdministrator, @iIdActionProfileEditAny);
+
+-- METATAGS
+INSERT INTO `sys_objects_metatags` (`object`, `table_keywords`, `table_locations`, `table_mentions`, `override_class_name`, `override_class_file`) VALUES
+('bx_persons', 'bx_persons_meta_keywords', 'bx_persons_meta_locations', 'bx_persons_meta_mentions', '', '');
+
+-- SEARCH
+SET @iSearchOrder = (SELECT IFNULL(MAX(`Order`), 0) FROM `sys_objects_search`);
+INSERT INTO `sys_objects_search` (`ObjectName`, `Title`, `Order`, `ClassName`, `ClassPath`) VALUES
+('bx_persons', '_bx_persons', @iSearchOrder + 1, 'BxPersonsSearchResult', 'modules/boonex/persons/classes/BxPersonsSearchResult.php'),
+('bx_persons_cmts', '_bx_persons_cmts', @iSearchOrder + 2, 'BxPersonsCmtsSearchResult', 'modules/boonex/persons/classes/BxPersonsCmtsSearchResult.php');
+
+-- STATS
+SET @iMaxOrderStats = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_statistics`);
+INSERT INTO `sys_statistics` (`module`, `name`, `title`, `link`, `icon`, `query`, `order`) VALUES 
+('bx_persons', 'bx_persons', '_bx_persons', 'page.php?i=persons-home', 'user col-blue3', 'SELECT COUNT(*) FROM `bx_persons_data` AS `td` LEFT JOIN `sys_profiles` AS `tp` ON `td`.`id` = `tp`.`content_id` AND `tp`.`type`=''bx_persons'' WHERE 1 AND `tp`.`status`=''active''', @iMaxOrderStats + 1);
+
+-- CHARTS
+SET @iMaxOrderCharts = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_objects_chart`);
+INSERT INTO `sys_objects_chart` (`object`, `title`, `table`, `field_date_ts`, `field_date_dt`, `field_status`, `query`, `active`, `order`, `class_name`, `class_file`) VALUES
+('bx_persons_growth', '_bx_persons_chart_growth', 'bx_persons_data', 'added', '', '', 'SELECT {field_date_formatted} AS `period`, COUNT(*) AS {object} FROM {table} LEFT JOIN `sys_profiles` AS `tp` ON {table}.`id` = `tp`.`content_id` AND `tp`.`type`=''bx_persons'' WHERE 1 AND `tp`.`status`=''active'' {where_inteval} GROUP BY `period` ORDER BY {table}.{field_date} ASC', 1, @iMaxOrderCharts + 1, 'BxDolChartGrowth', ''),
+('bx_persons_growth_speed', '_bx_persons_chart_growth_speed', 'bx_persons_data', 'added', '', '', 'SELECT {field_date_formatted} AS `period`, COUNT(*) AS {object} FROM {table} LEFT JOIN `sys_profiles` AS `tp` ON {table}.`id` = `tp`.`content_id` AND `tp`.`type`=''bx_persons'' WHERE 1 AND `tp`.`status`=''active'' {where_inteval} GROUP BY `period` ORDER BY {table}.{field_date} ASC', 1, @iMaxOrderCharts + 2, 'BxDolChartGrowthSpeed', '');
+
+-- GRIDS: administration
+INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `field_active`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_fields_translatable`, `filter_mode`, `sorting_fields`, `sorting_fields_translatable`, `visible_for_levels`, `override_class_name`, `override_class_file`) VALUES
+('bx_persons_administration', 'Sql', 'SELECT `td`.*, `ta`.`email` AS `account`, `ta`.`logged` AS `last_online`, `tp`.`status` AS `status` FROM `bx_persons_data` AS `td` LEFT JOIN `sys_profiles` AS `tp` ON `td`.`id`=`tp`.`content_id` AND `tp`.`type`=''bx_persons'' LEFT JOIN `sys_accounts` AS `ta` ON `tp`.`account_id`=`ta`.`id` WHERE 1 ', 'bx_persons_data', 'id', 'last_online', 'status', '', 20, NULL, 'start', '', 'fullname,email', '', 'like', 'reports', '', 192, 'BxPersonsGridAdministration', 'modules/boonex/persons/classes/BxPersonsGridAdministration.php'),
+('bx_persons_common', 'Sql', 'SELECT `td`.*, `ta`.`email` AS `account`, `ta`.`logged` AS `last_online`, `tp`.`status` AS `status` FROM `bx_persons_data` AS `td` LEFT JOIN `sys_profiles` AS `tp` ON `td`.`id`=`tp`.`content_id` AND `tp`.`type`=''bx_persons'' LEFT JOIN `sys_accounts` AS `ta` ON `tp`.`account_id`=`ta`.`id` WHERE 1 ', 'bx_persons_data', 'id', 'last_online', 'status', '', 20, NULL, 'start', '', 'fullname', '', 'like', '', '', 2147483647, 'BxPersonsGridCommon', 'modules/boonex/persons/classes/BxPersonsGridCommon.php');
+
+INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `order`) VALUES
+('bx_persons_administration', 'checkbox', '_sys_select', '2%', 0, '', '', 1),
+('bx_persons_administration', 'switcher', '_bx_persons_grid_column_title_adm_active', '8%', 0, '', '', 2),
+('bx_persons_administration', 'reports', '_sys_txt_reports_title', '5%', 0, '', '', 3),
+('bx_persons_administration', 'fullname', '_bx_persons_grid_column_title_adm_fullname', '25%', 0, '', '', 4),
+('bx_persons_administration', 'last_online', '_bx_persons_grid_column_title_adm_last_online', '20%', 1, '25', '', 5),
+('bx_persons_administration', 'account', '_bx_persons_grid_column_title_adm_account', '20%', 0, '25', '', 6),
+('bx_persons_administration', 'actions', '', '20%', 0, '', '', 7),
+('bx_persons_common', 'checkbox', '_sys_select', '2%', 0, '', '', 1),
+('bx_persons_common', 'fullname', '_bx_persons_grid_column_title_adm_fullname', '48%', 0, '', '', 2),
+('bx_persons_common', 'last_online', '_bx_persons_grid_column_title_adm_last_online', '30%', 1, '25', '', 3),
+('bx_persons_common', 'actions', '', '20%', 0, '', '', 4);
+
+INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon_only`, `confirm`, `order`) VALUES
+('bx_persons_administration', 'bulk', 'set_acl_level', '_bx_persons_grid_action_title_adm_set_acl_level', '', 0, 0, 1),
+('bx_persons_administration', 'bulk', 'delete', '_bx_persons_grid_action_title_adm_delete', '', 0, 1, 2),
+('bx_persons_administration', 'bulk', 'delete_with_content', '_bx_persons_grid_action_title_adm_delete_with_content', '', 0, 1, 3),
+('bx_persons_administration', 'single', 'set_acl_level', '_bx_persons_grid_action_title_adm_set_acl_level', 'certificate', 1, 0, 1),
+('bx_persons_administration', 'single', 'settings', '_bx_persons_grid_action_title_adm_more_actions', 'cog', 1, 0, 2),
+('bx_persons_administration', 'single', 'audit_content', '_bx_persons_grid_action_title_adm_audit_content', 'search', 1, 0, 3),
+('bx_persons_administration', 'single', 'audit_profile', '_bx_persons_grid_action_title_adm_audit_profile', 'search-location', 1, 0, 4),
+('bx_persons_common', 'bulk', 'delete', '_bx_persons_grid_action_title_adm_delete', '', 0, 1, 1),
+('bx_persons_common', 'bulk', 'delete_with_content', '_bx_persons_grid_action_title_adm_delete_with_content', '', 0, 1, 2),
+('bx_persons_common', 'single', 'settings', '_bx_persons_grid_action_title_adm_more_actions', 'cog', 1, 0, 1);
+
+-- LIVE UPDATES
+INSERT INTO `sys_objects_live_updates`(`name`, `frequency`, `service_call`, `active`) VALUES
+('bx_persons_friend_requests', 1, 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:40:"get_live_updates_unconfirmed_connections";s:6:"params";a:5:{i:0;s:10:"bx_persons";i:1;s:20:"sys_profiles_friends";i:2;a:2:{s:11:"menu_object";s:18:"sys_toolbar_member";s:9:"menu_item";s:7:"account";}i:3;a:2:{s:11:"menu_object";s:25:"sys_account_notifications";s:9:"menu_item";s:29:"notifications-friend-requests";}i:4;s:7:"{count}";}s:5:"class";s:23:"TemplServiceConnections";}', 1);
+
+-- ALERTS
+INSERT INTO `sys_alerts_handlers` (`name`, `class`, `file`, `service_call`) VALUES 
+('bx_persons', 'BxPersonsAlertsResponse', 'modules/boonex/persons/classes/BxPersonsAlertsResponse.php', '');
+SET @iHandler := LAST_INSERT_ID();
+
+INSERT INTO `sys_alerts` (`unit`, `action`, `handler_id`) VALUES
+('system', 'save_setting', @iHandler),
+('sys_profiles_friends', 'connection_added', @iHandler),
+('bx_timeline', 'post_common', @iHandler),
+('bx_persons_pictures', 'file_deleted', @iHandler),
+('bx_persons', 'timeline_view', @iHandler),
+('bx_persons', 'timeline_post', @iHandler),
+('bx_persons', 'timeline_delete', @iHandler),
+('bx_persons', 'timeline_comment', @iHandler),
+('bx_persons', 'timeline_vote', @iHandler),
+('bx_persons', 'timeline_score', @iHandler),
+('bx_persons', 'timeline_report', @iHandler),
+('bx_persons', 'timeline_repost', @iHandler),
+('bx_persons', 'timeline_pin', @iHandler),
+('bx_persons', 'timeline_promote', @iHandler);
+
+-- PRIVACY 
+INSERT INTO `sys_objects_privacy` (`object`, `module`, `action`, `title`, `default_group`, `spaces`, `table`, `table_field_id`, `table_field_author`, `override_class_name`, `override_class_file`) VALUES
+('bx_persons_allow_view_to', 'bx_persons', 'view', '_bx_persons_form_profile_input_allow_view_to', '3', '', 'bx_persons_data', 'id', 'author', 'BxPersonsPrivacy', 'modules/boonex/persons/classes/BxPersonsPrivacy.php'),
+('bx_persons_allow_post_to', 'bx_persons', 'post', '_bx_persons_form_profile_input_allow_post_to', '5', '', 'bx_persons_data', 'id', 'author', 'BxPersonsPrivacyPost', 'modules/boonex/persons/classes/BxPersonsPrivacyPost.php'),
+('bx_persons_allow_contact_to', 'bx_persons', 'contact', '_bx_persons_form_profile_input_allow_contact_to', '3', '', 'bx_persons_data', 'id', 'author', 'BxPersonsPrivacyContact', 'modules/boonex/persons/classes/BxPersonsPrivacyContact.php');
+
+-- EMAIL TEMPLATES
+INSERT INTO `sys_email_templates` (`Module`, `NameSystem`, `Name`, `Subject`, `Body`) VALUES
+('bx_persons', '_bx_persons_email_friend_request', 'bx_persons_friend_request', '_bx_persons_email_friend_request_subject', '_bx_persons_email_friend_request_body');
+
+-- UPLOADERS
+INSERT INTO `sys_objects_uploader` (`object`, `active`, `override_class_name`, `override_class_file`) VALUES
+('bx_persons_cover_crop', 1, 'BxPersonsUploaderCoverCrop', 'modules/boonex/persons/classes/BxPersonsUploaderCoverCrop.php'),
+('bx_persons_picture_crop', 1, 'BxPersonsUploaderPictureCrop', 'modules/boonex/persons/classes/BxPersonsUploaderPictureCrop.php');

+ 51 - 0
modules/boonex/photos/updates/11.0.1_11.0.2/install/config.php

@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'title' => 'Photos',
+    'version_from' => '11.0.1',
+    'version_to' => '11.0.2',
+    'vendor' => 'BoonEx',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/photos/updates/update_11.0.1_11.0.2/',
+    'home_uri' => 'photos_update_1101_1102',
+
+    'module_dir' => 'boonex/photos/',
+    'module_uri' => 'photos',
+
+    'db_prefix' => 'bx_photos_',
+    'class_prefix' => 'BxPhotos',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 0,
+        'update_files' => 1,
+        'update_languages' => 0,
+        'clear_db_cache' => 0,
+    ),
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Photos',
+
+    /**
+     * Files Section
+     */
+    'delete_files' => array(),
+);

+ 13 - 0
modules/boonex/photos/updates/11.0.1_11.0.2/install/installer.php

@@ -0,0 +1,13 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+class BxPhotosUpdater extends BxDolStudioUpdater
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+}

+ 159 - 0
modules/boonex/photos/updates/11.0.1_11.0.2/source/classes/BxPhotosModule.php

@@ -0,0 +1,159 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Photos Photos
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Photos module
+ */
+class BxPhotosModule extends BxBaseModTextModule
+{
+    function __construct(&$aModule)
+    {
+        parent::__construct($aModule);
+    }
+
+    public function actionViewEntryBrief()
+    {
+        echo BxDolPage::getObjectInstance($this->_oConfig->CNF['OBJECT_PAGE_VIEW_ENTRY_BRIEF'], $this->_oTemplate)->getCodeDynamic();
+    }
+
+    /**
+     * Display entries of the author
+     * @return HTML string
+     */
+    public function serviceBrowseAuthor ($iProfileId = 0, $aParams = array())
+    {
+        $mixedResult = parent::serviceBrowseAuthor ($iProfileId, $aParams);
+        if(empty($mixedResult))
+            return;
+
+        $sJsCode = $this->_oTemplate->getJsCode('main');
+
+        if(is_string($mixedResult))
+            $mixedResult .= $sJsCode;
+        else if(is_array($mixedResult) && isset($mixedResult['content']))
+            $mixedResult['content'] .= $sJsCode;
+
+        $this->_oTemplate->addJs(array('main.js'));
+        return $mixedResult;
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_photos Photos
+     * @subsection bx_photos-page_blocks Page Blocks
+     * @subsubsection bx_photos-entity_photo_block entity_photo_block
+     * 
+     * @code bx_srv('bx_photos', 'entity_photo_block', [...]); @endcode
+     * 
+     * Get page block with photo.
+     *
+     * @param $iContentId (optional) photo ID. If empty value is provided, an attempt to get it from GET/POST arrays will be performed.
+     * @return HTML string with block content to display on the site or false if there is no enough input data. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxPhotosModule::serviceEntityPhotoBlock
+     */
+    /** 
+     * @ref bx_photos-entity_photo_block "entity_photo_block"
+     */
+    public function serviceEntityPhotoBlock ($iContentId = 0)
+    {
+        $mixedContent = $this->_getContent($iContentId);
+        if($mixedContent === false)
+            return false;
+
+        list($iContentId, $aContentInfo) = $mixedContent;
+
+        return $this->_oTemplate->entryPhoto($aContentInfo);
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_photos Photos
+     * @subsection bx_photos-page_blocks Page Blocks
+     * @subsubsection bx_photos-entity_photo_block entity_photo_block
+     * 
+     * @code bx_srv('bx_photos', 'entity_photo_switcher_block', [...]); @endcode
+     * 
+     * Get page block with photo and Prev/Next controls.
+     *
+     * @param $iContentId (optional) photo ID. If empty value is provided, an attempt to get it from GET/POST arrays will be performed.
+     * @return HTML string with block content to display on the site or false if there is no enough input data. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxPhotosModule::serviceEntityPhotoBlock
+     */
+    /** 
+     * @ref bx_photos-entity_photo_block "entity_photo_switcher_block"
+     */
+    public function serviceEntityPhotoSwitcherBlock ($iContentId = 0, $sMode = '')
+    {
+        $mixedContent = $this->_getContent($iContentId);
+        if($mixedContent === false)
+            return false;
+
+        list($iContentId, $aContentInfo) = $mixedContent;
+
+        if(!$sMode)
+            $sMode = bx_process_input(bx_get('mode'));
+
+        return $this->_oTemplate->entryPhotoSwitcher($aContentInfo, $sMode);
+    }
+
+	/**
+     * @page service Service Calls
+     * @section bx_photos Photos
+     * @subsection bx_photos-page_blocks Page Blocks
+     * @subsubsection bx_photos-entity_rating entity_rating
+     * 
+     * @code bx_srv('bx_photos', 'entity_rating', [...]); @endcode
+     * 
+     * Get page block with Stars based photo's rating.
+     *
+     * @param $iContentId (optional) photo ID. If empty value is provided, an attempt to get it from GET/POST arrays will be performed.
+     * @return HTML string with block content to display on the site or false if there is no enough input data. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxPhotosModule::serviceEntityRating
+     */
+    /** 
+     * @ref bx_photos-entity_rating "entity_rating"
+     */
+    public function serviceEntityRating($iContentId = 0)
+    {
+    	return $this->_serviceTemplateFunc ('entryRating', $iContentId);
+    }
+    
+    public function checkAllowedSetThumb ($iContentId = 0)
+    {
+        return $iContentId > 0 ? CHECK_ACTION_RESULT_ALLOWED : CHECK_ACTION_RESULT_NOT_ALLOWED;
+    }
+
+    protected function _getContentForTimelinePost($aEvent, $aContentInfo, $aBrowseParams = array())
+    {
+        $aResult = parent::_getContentForTimelinePost($aEvent, $aContentInfo, $aBrowseParams);
+        if(empty($aResult['title'])) 
+            $aResult['title'] = _t('_sys_txt_no_title');
+
+        return $aResult;
+    }
+
+    protected function _getImagesForTimelinePost($aEvent, $aContentInfo, $sUrl, $aBrowseParams = array())
+    {
+        $aImages = parent::_getImagesForTimelinePost($aEvent, $aContentInfo, $sUrl, $aBrowseParams);
+
+        $bView = $this->checkAllowedView($aContentInfo) === CHECK_ACTION_RESULT_ALLOWED;
+        foreach($aImages as $iKey => $aImage)
+            if(!$bView)
+                unset($aImages[$iKey]['src_orig']);
+
+        return $aImages;
+    }
+}
+
+/** @} */

+ 136 - 0
modules/boonex/photos/updates/11.0.1_11.0.2/source/install/config.php

@@ -0,0 +1,136 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Photos Photos
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_MODULE,
+    'name' => 'bx_photos',
+    'title' => 'Photos',
+    'note' => 'Basic photo posting module.',
+    'version' => '11.0.2',
+    'vendor' => 'BoonEx',
+    'help_url' => 'http://feed.una.io/?section={module_name}',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/photos/',
+    'home_uri' => 'photos',
+
+    'db_prefix' => 'bx_photos_',
+    'class_prefix' => 'BxPhotos',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Photos',
+
+    /**
+     * List of page triggers.
+     */
+    'page_triggers' => array (
+    	'trigger_page_profile_view_entry',
+    ),
+    
+    /**
+     * Menu triggers.
+     */
+    'menu_triggers' => array(
+    	'trigger_profile_view_submenu',
+        'trigger_group_view_submenu'
+    ),
+
+    /**
+     * Storage objects to automatically delete files from upon module uninstallation.
+     * Note. Don't add storage objects used in transcoder objects.
+     */
+    'storages' => array(
+    	'bx_photos_files'
+    ),
+
+    /**
+     * Transcoders.
+     */
+    'transcoders' => array(
+		'bx_photos_preview',
+        'bx_photos_gallery',
+        'bx_photos_cover'
+    ),
+
+    /**
+     * Extended Search Forms.
+     */
+    'esearches' => array(
+        'bx_photos',
+    	'bx_photos_cmts'
+    ),
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'uninstall' => array (
+    	'process_esearches' => 1,
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable' => array(
+        'execute_sql' => 1,
+        'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable_success' => array(
+        'process_menu_triggers' => 1,
+        'process_page_triggers' => 1,
+    	'process_esearches' => 1,
+        'register_transcoders' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable' => array (
+        'execute_sql' => 1,
+        'update_relations' => 1,
+        'unregister_transcoders' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable_failed' => array (
+        'register_transcoders' => 1,
+        'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Dependencies Section
+     */
+    'dependencies' => array(),
+
+    /**
+     * Relations Section
+     */
+    'relations' => array(
+    	'bx_timeline',
+    	'bx_notifications'
+    ),
+
+);
+
+/** @} */

+ 51 - 0
modules/boonex/polls/updates/11.0.0_11.0.1/install/config.php

@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'title' => 'Polls',
+    'version_from' => '11.0.0',
+    'version_to' => '11.0.1',
+    'vendor' => 'BoonEx',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/polls/updates/update_11.0.0_11.0.1/',
+    'home_uri' => 'polls_update_1100_1101',
+
+    'module_dir' => 'boonex/polls/',
+    'module_uri' => 'polls',
+
+    'db_prefix' => 'bx_polls_',
+    'class_prefix' => 'BxPolls',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 0,
+        'update_files' => 1,
+        'update_languages' => 0,
+        'clear_db_cache' => 0,
+    ),
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Polls',
+
+    /**
+     * Files Section
+     */
+    'delete_files' => array(),
+);

+ 13 - 0
modules/boonex/polls/updates/11.0.0_11.0.1/install/installer.php

@@ -0,0 +1,13 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+class BxPollsUpdater extends BxDolStudioUpdater
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+}

+ 292 - 0
modules/boonex/polls/updates/11.0.0_11.0.1/source/classes/BxPollsTemplate.php

@@ -0,0 +1,292 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Polls Polls
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/*
+ * Module representation.
+ */
+class BxPollsTemplate extends BxBaseModTextTemplate
+{
+    /**
+     * Constructor
+     */
+    function __construct(&$oConfig, &$oDb)
+    {
+        $this->MODULE = 'bx_polls';
+        parent::__construct($oConfig, $oDb);
+    }
+
+    public function embedEntry($mixedContentInfo, $aParams = array())
+    {
+        $oModule = $this->getModule();
+        $CNF = &$oModule->_oConfig->CNF;
+
+        $aContentInfo = is_array($mixedContentInfo) ? $mixedContentInfo : $this->_oDb->getContentInfoById((int)$mixedContentInfo);
+        if(empty($aContentInfo) || !is_array($aContentInfo))
+            return;
+
+        /**
+         * Anonymous voting MUST be enabled for Embeded poll,
+         * because a list of voters cannot be correctly displayed
+         * in Embeded iframe.
+         */
+        $aContentInfo[$CNF['FIELD_ANONYMOUS_VOTING']] = 1;
+
+        $aBlock = $this->{$oModule->isPerformed((int)$aContentInfo[$CNF['FIELD_ID']]) ? 'entryResults' : 'entrySubentries'}($aContentInfo);
+
+        $this->addJs(array('entry.js'));
+        $this->addCss(array('entry.css'));
+
+        $oTemplate = BxDolTemplate::getInstance();
+        $oTemplate->addCssStyle($CNF['STYLES_POLLS_EMBED_CLASS'], $CNF['STYLES_POLLS_EMBED_CONTENT']);
+        $oTemplate->setPageNameIndex(BX_PAGE_EMBED);
+        $oTemplate->setPageHeader($this->getTitleAuto($aContentInfo));
+        $oTemplate->setPageContent('page_main_code', $this->getJsCode('entry') . $aBlock['content']);
+        $oTemplate->getPageCode();
+        exit;
+    }
+
+    public function getJsCode($sType, $aParams = array(), $bWrap = true)
+    {
+        $aParams = array_merge(array(
+            'aHtmlIds' => $this->_oConfig->getHtmlIds()
+        ), $aParams);
+
+        return parent::getJsCode($sType, $aParams, $bWrap);
+    }
+
+    public function entrySubentries ($aData, $bDynamic = false)
+    {
+        $sContent = $this->_getGetBlockContentSubentries($aData, $bDynamic);
+        if(empty($sContent))
+            return '';
+
+    	return array(
+            'content' => $sContent,
+            'menu' => $this->_getGetBlockMenu($aData, 'subentries')
+        );
+    }
+
+    public function entryResults($aData, $bDynamic = false)
+    {
+        $sContent = $this->_getGetBlockContentResults($aData, $bDynamic);
+        if(empty($sContent))
+            return '';
+
+        return array(
+            'content' => $sContent,
+            'menu' => $this->_getGetBlockMenu($aData, 'results')
+        );
+    }
+
+    public function entryTextAndSubentries($aData, $bForceDisplaySubentries = false)
+    {
+        $oModule = $this->getModule();
+        $CNF = &$oModule->_oConfig->CNF;
+
+        $sMethod = '_getGetBlockContent';
+        $sMenuItem = '';
+        if(!$bForceDisplaySubentries && $oModule->isPerformed($aData[$CNF['FIELD_ID']])) {
+            $sMethod .= 'Results';
+            $sMenuItem = 'results';
+        }
+        else {
+            $sMethod .= 'Subentries';
+            $sMenuItem = 'subentries';
+        };
+
+        $sSubentries = $this->$sMethod($aData);
+        $oMenu = $this->_getGetBlockMenu($aData, $sMenuItem);
+
+        $sMenu = str_replace('_', '-', $this->_oConfig->getName()) . '-menu-db';
+        $sMenuId = $sMenu . '-' . $aData['salt'];        
+
+        $aTmplVars = parent::getTmplVarsText($aData);
+        $aTmplVars = array_merge($aTmplVars, array(
+            'menu' => BxTemplFunctions::getInstance()->designBoxMenu($oMenu, array(
+                'menu' => array(
+                    'id' => $sMenuId, 
+                    'class' => $sMenu, 
+                    'onclick' => "bx_menu_slide_inline('#" . $sMenuId . "', this, $(this).parents('.bx-db-menu:first'))"
+                )
+            )),
+            'bx_if:show_subentries' => array(
+                'condition' => !empty($sSubentries),
+                'content' => array(
+                    'entry_subentries' => $sSubentries
+                )
+            )
+        ));
+
+        return array(
+            'content' => $this->parseHtmlByName('entry-text-subentries.html', $aTmplVars),
+            'menu' => $oMenu
+        );
+    }
+
+    public function getTitleAuto($aData, $iMaxLen = 32, $sEllipsisSign = '...')
+    {
+        $sResult = $this->getTitle($aData);
+        if(strlen($sResult) > 0 && $iMaxLen > 0)
+            $sResult = strmaxtextlen($sResult, $iMaxLen, $sEllipsisSign);
+
+        return $sResult;
+    }
+
+    public function getTitle($aData, $mixedProcessOutput = BX_DATA_TEXT)
+    {
+        $sResult = $this->_oConfig->getTitle($aData);
+        if($mixedProcessOutput !== false && !empty($sResult))
+            $sResult = bx_process_output($sResult, (int)$mixedProcessOutput);
+
+        return $sResult;
+    }
+
+    protected function getSummary($aData, $sTitle = '', $sText = '', $sUrl = '')
+    {
+        $oModule = $this->getModule();
+        $CNF = &$oModule->_oConfig->CNF;
+
+        $aBlock = $this->{$oModule->isPerformed($aData[$CNF['FIELD_ID']]) ? 'entryResults' : 'entrySubentries'}($aData);
+
+        return $aBlock['content'];
+    }
+
+    protected function getUnit ($aData, $aParams = array())
+    {
+        $CNF = &$this->getModule()->_oConfig->CNF;
+
+        $aResult = parent::getUnit($aData, $aParams);
+        
+        $oMenuMeta = BxDolMenu::getObjectInstance($CNF['OBJECT_MENU_SNIPPET_META'], $this);
+        if($oMenuMeta) {
+            $oMenuMeta->setContent($aData);
+
+            $aResult = array_merge($aResult, array(
+                'bx_if:meta' => array(
+                    'condition' => true,
+                    'content' => array(
+                        'meta' => $oMenuMeta->getCode()
+                    )
+                ),
+            ));
+        }
+
+        return $aResult;
+    }
+
+    protected function getUnitThumbAndGallery ($aData)
+    {
+        return array('', '');
+    }
+
+    protected function _getGetBlockMenu($aData, $sSelected = '')
+    {
+        $oModule = $this->getModule();
+        $CNF = &$oModule->_oConfig->CNF;
+
+        $sJsObject = $this->_oConfig->getJsObject('entry');
+        $iContentId = $aData[$CNF['FIELD_ID']];
+
+        $aBlocks = array(
+            'subentries' => true, 
+            'results' => (int)$aData[$CNF['FIELD_HIDDEN_RESULTS']] == 0 || $oModule->isPerformed($iContentId)
+        );
+
+        $aMenu = array();
+        foreach($aBlocks as $sBlock => $bActive) {
+            if(!$bActive) 
+                continue;
+
+            $sId = $this->_oConfig->getHtmlIds('block_link_' . $sBlock) . $aData['salt'];
+            if(!empty($sSelected) && $sSelected == $sBlock)
+                $sSelected = $sId;
+
+            $aMenu[] = array('id' => $sId, 'name' => $sId, 'class' => '', 'link' => 'javascript:void(0)', 'onclick' => 'javascript:' . $sJsObject . '.changeBlock(this, \'' . $sBlock . '\', ' . bx_js_string(json_encode(array('content_id' => $iContentId, 'salt' => $aData['salt']))) . ')', 'target' => '_self', 'title' => _t('_bx_polls_menu_item_view_' . $sBlock));
+        }
+
+        if(count($aMenu) <= 1)
+            return '';
+
+        $sMenu = $this->_oConfig->getHtmlIds('block_menu');
+        $oMenu = new BxTemplMenuInteractive(array('object' => $sMenu, 'menu_id' => $sMenu . '-' . $aData['salt'], 'menu_items' => $aMenu, 'template' => 'menu_interactive_vertical.html'));
+        if(!empty($sSelected))
+            $oMenu->setSelected('', $sSelected);
+
+        return $oMenu;
+    }
+    
+    protected function _getGetBlockContentSubentries($aData, $bDynamic = false)
+    {
+        $CNF = &$this->getModule()->_oConfig->CNF;
+
+        $aSubentries = $this->_oDb->getSubentries(array('type' => 'entry_id', 'entry_id' => $aData[$CNF['FIELD_ID']]));
+        if(empty($aSubentries) || !is_array($aSubentries))
+            return '';
+
+        $aTmplVarsSubentries = array();
+        foreach($aSubentries as $aSubentry) {
+            $oVotes = BxDolVote::getObjectInstance($CNF['OBJECT_VOTES_SUBENTRIES'], $aSubentry['id']);
+            $oVotes->setEntry($aData);
+
+            $aTmplVarsSubentries[] = array(
+                'subentry' => $oVotes->getElementBlock(array(
+                    'dynamic_mode' => $bDynamic
+                ))
+            );
+        }
+
+    	return $this->parseHtmlByName('subentries.html', array(
+            'html_id' => $this->_oConfig->getHtmlIds('content') . $aData[$CNF['FIELD_ID']],
+            'bx_repeat:subentries' => $aTmplVarsSubentries,
+            'bx_if:show_public' => array(
+                'condition' => (int)$aData[$CNF['FIELD_ANONYMOUS_VOTING']] == 0,
+                'content' => array()
+            )
+        ));
+    }
+    
+    protected function _getGetBlockContentResults($aData, $bDynamic = false)
+    {
+        $CNF = &$this->getModule()->_oConfig->CNF;
+
+        $bAnonymous = (int)$aData[$CNF['FIELD_ANONYMOUS_VOTING']] == 1;
+
+        $aSubentries = $this->_oDb->getSubentries(array('type' => 'entry_id', 'entry_id' => $aData[$CNF['FIELD_ID']]));
+        if(empty($aSubentries) || !is_array($aSubentries))
+            return '';
+
+        $iTotal = 0;
+        foreach($aSubentries as $aSubentry)
+            $iTotal += $aSubentry['votes'];
+
+        $aTmplVarsSubentries = array();
+        foreach($aSubentries as $aSubentry) {
+            $oVotes = BxDolVote::getObjectInstance($CNF['OBJECT_VOTES_SUBENTRIES'], $aSubentry['id']);
+            $oVotes->setEntry($aData);
+
+            $fPercent = $iTotal > 0 ? 100 * (float)$aSubentry['votes']/$iTotal : 0;
+            $aTmplVarsSubentries[] = array(
+                'title' => bx_process_output($aSubentry['title']),
+                'width' => (int)round($fPercent) . '%',
+                'votes' => $oVotes->getCounter(array('show_counter_empty' => true, 'show_counter_in_brackets' => false)),
+                'percent' => _t('_bx_polls_txt_subentry_vote_percent', $iTotal > 0 ? round($fPercent, 2) : 0),
+                'js_code' => $oVotes->getJsScript(array('dynamic_mode' => $bDynamic))
+            );
+        }
+
+        return $this->parseHtmlByName('subentries_results.html', array(
+            'html_id' => $this->_oConfig->getHtmlIds('content') . $aData[$CNF['FIELD_ID']],
+            'bx_repeat:subentries' => $aTmplVarsSubentries,
+        ));
+    }
+}
+
+/** @} */

+ 136 - 0
modules/boonex/polls/updates/11.0.0_11.0.1/source/install/config.php

@@ -0,0 +1,136 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Polls Polls
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_MODULE,
+    'name' => 'bx_polls',
+    'title' => 'Polls',
+    'note' => 'Basic poll module.',
+    'version' => '11.0.1',
+    'vendor' => 'BoonEx',
+    'help_url' => 'http://feed.una.io/?section={module_name}',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/polls/',
+    'home_uri' => 'polls',
+
+    'db_prefix' => 'bx_polls_',
+    'class_prefix' => 'BxPolls',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Polls',
+
+    /**
+     * List of page triggers.
+     */
+    'page_triggers' => array (
+    	'trigger_page_profile_view_entry',
+    ),
+    
+    /**
+     * Menu triggers.
+     */
+    'menu_triggers' => array(
+    	'trigger_profile_view_submenu',
+        'trigger_group_view_submenu'
+    ),
+
+	/**
+     * Storage objects to automatically delete files from upon module uninstallation.
+     * Note. Don't add storage objects used in transcoder objects.
+     */
+    'storages' => array(
+    	'bx_polls_files'
+    ),
+
+    /**
+     * Transcoders.
+     */
+    'transcoders' => array(
+		'bx_polls_preview',
+        'bx_polls_gallery',
+        'bx_polls_cover'
+    ),
+
+	/**
+     * Extended Search Forms.
+     */
+    'esearches' => array(
+        'bx_polls',
+    	'bx_polls_cmts',
+    ),
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'uninstall' => array (
+    	'process_esearches' => 1,
+        'execute_sql' => 1,
+        'update_languages' => 1,
+    	'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable' => array(
+        'execute_sql' => 1,
+    	'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable_success' => array(
+        'process_menu_triggers' => 1,
+        'process_page_triggers' => 1,
+    	'process_esearches' => 1,
+    	'register_transcoders' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable' => array (
+        'execute_sql' => 1,
+    	'update_relations' => 1,
+    	'unregister_transcoders' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable_failed' => array (
+    	'register_transcoders' => 1,
+    	'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Dependencies Section
+     */
+    'dependencies' => array(),
+
+    /**
+     * Relations Section
+     */
+    'relations' => array(
+    	'bx_timeline',
+    	'bx_notifications'
+    ),
+
+);
+
+/** @} */

+ 51 - 0
modules/boonex/posts/updates/11.0.0_11.0.1/install/config.php

@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'title' => 'Posts',
+    'version_from' => '11.0.0',
+    'version_to' => '11.0.1',
+    'vendor' => 'BoonEx',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/posts/updates/update_11.0.0_11.0.1/',
+    'home_uri' => 'posts_update_1100_1101',
+
+    'module_dir' => 'boonex/posts/',
+    'module_uri' => 'posts',
+
+    'db_prefix' => 'bx_posts_',
+    'class_prefix' => 'BxPosts',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_files' => 1,
+        'update_languages' => 0,
+        'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Posts',
+
+    /**
+     * Files Section
+     */
+    'delete_files' => array(),
+);

+ 13 - 0
modules/boonex/posts/updates/11.0.0_11.0.1/install/installer.php

@@ -0,0 +1,13 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+class BxPostsUpdater extends BxDolStudioUpdater
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+}

+ 2 - 0
modules/boonex/posts/updates/11.0.0_11.0.1/install/sql/install.sql

@@ -0,0 +1,2 @@
+-- FORMS
+UPDATE `sys_form_inputs` SET `db_pass`='DateTimeTs' WHERE `object`='bx_posts' AND `name`='published';

+ 150 - 0
modules/boonex/posts/updates/11.0.0_11.0.1/source/install/config.php

@@ -0,0 +1,150 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Posts Posts
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_MODULE,
+    'name' => 'bx_posts',
+    'title' => 'Posts',
+    'note' => 'Basic blogging module.',
+    'version' => '11.0.1',
+    'vendor' => 'BoonEx',
+    'help_url' => 'http://feed.una.io/?section={module_name}',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/posts/',
+    'home_uri' => 'posts',
+
+    'db_prefix' => 'bx_posts_',
+    'class_prefix' => 'BxPosts',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Posts',
+
+    /**
+     * List of page triggers.
+     */
+    'page_triggers' => array (
+    	'trigger_page_profile_view_entry',
+    ),
+    
+    /**
+     * Menu triggers.
+     */
+    'menu_triggers' => array(
+        'trigger_profile_view_submenu',
+        'trigger_group_view_submenu',
+    ),
+
+    /**
+     * Storage objects to automatically delete files from upon module uninstallation.
+     * Note. Don't add storage objects used in transcoder objects.
+     */
+    'storages' => array(
+        'bx_posts_covers',
+    	'bx_posts_photos',
+        'bx_posts_videos',
+        'bx_posts_files'
+    ),
+
+    /**
+     * Transcoders.
+     */
+    'transcoders' => array(
+        'bx_posts_preview',
+        'bx_posts_gallery',
+        'bx_posts_cover',
+
+        'bx_posts_preview_photos',
+        'bx_posts_gallery_photos', 
+
+        'bx_posts_videos_poster',
+        'bx_posts_videos_poster_preview',
+        'bx_posts_videos_mp4',
+        'bx_posts_videos_mp4_hd',
+
+        'bx_posts_preview_files',
+        'bx_posts_gallery_files'
+    ),
+
+    /**
+     * Extended Search Forms.
+     */
+    'esearches' => array(
+        'bx_posts',
+    	'bx_posts_cmts'
+    ),
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'uninstall' => array (
+    	'process_esearches' => 1,
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable' => array(
+        'execute_sql' => 1,
+        'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable_success' => array(
+        'process_menu_triggers' => 1,
+        'process_page_triggers' => 1,
+    	'process_esearches' => 1,
+        'register_transcoders' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable' => array (
+        'execute_sql' => 1,
+        'update_relations' => 1,
+        'unregister_transcoders' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable_failed' => array (
+        'register_transcoders' => 1,
+        'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Dependencies Section
+     */
+    'dependencies' => array(),
+
+    /**
+     * Relations Section
+     */
+    'relations' => array(
+    	'bx_timeline',
+    	'bx_notifications'
+    ),
+
+);
+
+/** @} */

+ 555 - 0
modules/boonex/posts/updates/11.0.0_11.0.1/source/install/sql/install.sql

@@ -0,0 +1,555 @@
+-- TABLE: entries
+CREATE TABLE IF NOT EXISTS `bx_posts_posts` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `author` int(11) NOT NULL,
+  `added` int(11) NOT NULL,
+  `changed` int(11) NOT NULL,
+  `published` int(11) NOT NULL,
+  `thumb` int(11) NOT NULL,
+  `title` varchar(255) NOT NULL,
+  `cat` int(11) NOT NULL,
+  `multicat` text NOT NULL,
+  `text` mediumtext NOT NULL,
+  `labels` text NOT NULL,
+  `location` text NOT NULL,
+  `views` int(11) NOT NULL default '0',
+  `rate` float NOT NULL default '0',
+  `votes` int(11) NOT NULL default '0',
+  `rrate` float NOT NULL default '0',
+  `rvotes` int(11) NOT NULL default '0',
+  `score` int(11) NOT NULL default '0',
+  `sc_up` int(11) NOT NULL default '0',
+  `sc_down` int(11) NOT NULL default '0',
+  `favorites` int(11) NOT NULL default '0',
+  `comments` int(11) NOT NULL default '0',
+  `reports` int(11) NOT NULL default '0',
+  `featured` int(11) NOT NULL default '0',
+  `allow_view_to` varchar(16) NOT NULL DEFAULT '3',
+  `disable_comments` tinyint(4) NOT NULL DEFAULT '0',
+  `status` enum('active','awaiting','failed','hidden') NOT NULL DEFAULT 'active',
+  `status_admin` enum('active','hidden') NOT NULL DEFAULT 'active',
+  PRIMARY KEY (`id`),
+  FULLTEXT KEY `title_text` (`title`,`text`)
+);
+
+-- TABLE: storages & transcoders
+CREATE TABLE IF NOT EXISTS `bx_posts_covers` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(128) NOT NULL,
+  `path` varchar(255) NOT NULL,
+  `file_name` varchar(255) NOT NULL,
+  `mime_type` varchar(128) NOT NULL,
+  `ext` varchar(32) NOT NULL,
+  `size` bigint(20) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_posts_files` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(128) NOT NULL,
+  `path` varchar(255) NOT NULL,
+  `file_name` varchar(255) NOT NULL,
+  `mime_type` varchar(128) NOT NULL,
+  `ext` varchar(32) NOT NULL,
+  `size` bigint(20) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_posts_photos` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(128) NOT NULL,
+  `path` varchar(255) NOT NULL,
+  `file_name` varchar(255) NOT NULL,
+  `mime_type` varchar(128) NOT NULL,
+  `ext` varchar(32) NOT NULL,
+  `size` bigint(20) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_posts_photos_resized` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(128) NOT NULL,
+  `path` varchar(255) NOT NULL,
+  `file_name` varchar(255) NOT NULL,
+  `mime_type` varchar(128) NOT NULL,
+  `ext` varchar(32) NOT NULL,
+  `size` bigint(20) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_posts_videos` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(128) NOT NULL,
+  `path` varchar(255) NOT NULL,
+  `file_name` varchar(255) NOT NULL,
+  `mime_type` varchar(128) NOT NULL,
+  `ext` varchar(32) NOT NULL,
+  `size` bigint(20) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_posts_videos_resized` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(128) NOT NULL,
+  `path` varchar(255) NOT NULL,
+  `file_name` varchar(255) NOT NULL,
+  `mime_type` varchar(128) NOT NULL,
+  `ext` varchar(32) NOT NULL,
+  `size` bigint(20) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+-- TABLE: comments
+CREATE TABLE IF NOT EXISTS `bx_posts_cmts` (
+  `cmt_id` int(11) NOT NULL AUTO_INCREMENT,
+  `cmt_parent_id` int(11) NOT NULL DEFAULT '0',
+  `cmt_vparent_id` int(11) NOT NULL DEFAULT '0',
+  `cmt_object_id` int(11) NOT NULL DEFAULT '0',
+  `cmt_author_id` int(11) NOT NULL DEFAULT '0',
+  `cmt_level` int(11) NOT NULL DEFAULT '0',
+  `cmt_text` text NOT NULL,
+  `cmt_mood` tinyint(4) NOT NULL DEFAULT '0',
+  `cmt_rate` int(11) NOT NULL DEFAULT '0',
+  `cmt_rate_count` int(11) NOT NULL DEFAULT '0',
+  `cmt_time` int(11) unsigned NOT NULL DEFAULT '0',
+  `cmt_replies` int(11) NOT NULL DEFAULT '0',
+  PRIMARY KEY (`cmt_id`),
+  KEY `cmt_object_id` (`cmt_object_id`,`cmt_parent_id`),
+  FULLTEXT KEY `search_fields` (`cmt_text`)
+);
+
+-- TABLE: votes
+CREATE TABLE IF NOT EXISTS `bx_posts_votes` (
+  `object_id` int(11) NOT NULL default '0',
+  `count` int(11) NOT NULL default '0',
+  `sum` int(11) NOT NULL default '0',
+  UNIQUE KEY `object_id` (`object_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_posts_votes_track` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `object_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `author_nip` int(11) unsigned NOT NULL default '0',
+  `value` tinyint(4) NOT NULL default '0',
+  `date` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  KEY `vote` (`object_id`, `author_nip`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_posts_reactions` (
+  `object_id` int(11) NOT NULL default '0',
+  `reaction` varchar(32) NOT NULL default '',
+  `count` int(11) NOT NULL default '0',
+  `sum` int(11) NOT NULL default '0',
+  UNIQUE KEY `reaction` (`object_id`, `reaction`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_posts_reactions_track` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `object_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `author_nip` int(11) unsigned NOT NULL default '0',
+  `reaction` varchar(32) NOT NULL default '',
+  `value` tinyint(4) NOT NULL default '0',
+  `date` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  KEY `vote` (`object_id`, `author_nip`)
+);
+
+-- TABLE: views
+CREATE TABLE `bx_posts_views_track` (
+  `object_id` int(11) NOT NULL default '0',
+  `viewer_id` int(11) NOT NULL default '0',
+  `viewer_nip` int(11) unsigned NOT NULL default '0',
+  `date` int(11) NOT NULL default '0',
+  KEY `id` (`object_id`,`viewer_id`,`viewer_nip`)
+);
+
+-- TABLE: metas
+CREATE TABLE `bx_posts_meta_keywords` (
+  `object_id` int(10) unsigned NOT NULL,
+  `keyword` varchar(255) NOT NULL,
+  KEY `object_id` (`object_id`),
+  KEY `keyword` (`keyword`)
+);
+
+CREATE TABLE `bx_posts_meta_mentions` (
+  `object_id` int(10) unsigned NOT NULL,
+  `profile_id` int(10) unsigned NOT NULL,
+  KEY `object_id` (`object_id`),
+  KEY `profile_id` (`profile_id`)
+);
+
+CREATE TABLE `bx_posts_meta_locations` (
+  `object_id` int(10) unsigned NOT NULL,
+  `lat` double NOT NULL,
+  `lng` double NOT NULL,
+  `country` varchar(2) NOT NULL,
+  `state` varchar(255) NOT NULL,
+  `city` varchar(255) NOT NULL,
+  `zip` varchar(255) NOT NULL,
+  `street` varchar(255) NOT NULL,
+  `street_number` varchar(255) NOT NULL,
+  PRIMARY KEY (`object_id`),
+  KEY `country_state_city` (`country`,`state`(8),`city`(8))
+);
+
+-- TABLE: reports
+CREATE TABLE IF NOT EXISTS `bx_posts_reports` (
+  `object_id` int(11) NOT NULL default '0',
+  `count` int(11) NOT NULL default '0',
+  UNIQUE KEY `object_id` (`object_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_posts_reports_track` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `object_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `author_nip` int(11) unsigned NOT NULL default '0',
+  `type` varchar(32) NOT NULL default '',
+  `text` text NOT NULL default '',
+  `date` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  KEY `report` (`object_id`, `author_nip`)
+);
+
+-- TABLE: favorites
+CREATE TABLE `bx_posts_favorites_track` (
+  `object_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `date` int(11) NOT NULL default '0',
+  KEY `id` (`object_id`,`author_id`)
+);
+
+-- TABLE: scores
+CREATE TABLE IF NOT EXISTS `bx_posts_scores` (
+  `object_id` int(11) NOT NULL default '0',
+  `count_up` int(11) NOT NULL default '0',
+  `count_down` int(11) NOT NULL default '0',
+  UNIQUE KEY `object_id` (`object_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_posts_scores_track` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `object_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `author_nip` int(11) unsigned NOT NULL default '0',
+  `type` varchar(8) NOT NULL default '',
+  `date` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  KEY `vote` (`object_id`, `author_nip`)
+);
+
+-- TABLE: polls
+CREATE TABLE IF NOT EXISTS `bx_posts_polls` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `author_id` int(11) NOT NULL default '0',
+  `content_id` int(11) NOT NULL default '0',
+  `text` text NOT NULL,
+  PRIMARY KEY (`id`),
+  KEY `content_id` (`content_id`),
+  FULLTEXT KEY `search_fields` (`text`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_posts_polls_answers` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `poll_id` int(11) unsigned NOT NULL default '0',
+  `title` varchar(255) NOT NULL,
+  `rate` float NOT NULL default '0',
+  `votes` int(11) NOT NULL default '0',
+  `order` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  KEY `poll_id` (`poll_id`),
+  FULLTEXT KEY `title` (`title`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_posts_polls_answers_votes` (
+  `object_id` int(11) NOT NULL default '0',
+  `count` int(11) NOT NULL default '0',
+  `sum` int(11) NOT NULL default '0',
+  UNIQUE KEY `object_id` (`object_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_posts_polls_answers_votes_track` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `object_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `author_nip` int(11) unsigned NOT NULL default '0',
+  `value` tinyint(4) NOT NULL default '0',
+  `date` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  KEY `vote` (`object_id`, `author_nip`)
+);
+
+-- STORAGES & TRANSCODERS
+SET @sStorageEngine = (SELECT `value` FROM `sys_options` WHERE `name` = 'sys_storage_default');
+
+INSERT INTO `sys_objects_storage` (`object`, `engine`, `params`, `token_life`, `cache_control`, `levels`, `table_files`, `ext_mode`, `ext_allow`, `ext_deny`, `quota_size`, `current_size`, `quota_number`, `current_number`, `max_file_size`, `ts`) VALUES
+('bx_posts_covers', @sStorageEngine, '', 360, 2592000, 3, 'bx_posts_covers', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0),
+
+('bx_posts_photos', @sStorageEngine, '', 360, 2592000, 3, 'bx_posts_photos', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0),
+('bx_posts_photos_resized', @sStorageEngine, '', 360, 2592000, 3, 'bx_posts_photos_resized', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0),
+
+('bx_posts_videos', @sStorageEngine, '', 360, 2592000, 3, 'bx_posts_videos', 'allow-deny', 'avi,flv,mpg,mpeg,wmv,mp4,m4v,mov,qt,divx,xvid,3gp,3g2,webm,mkv,ogv,ogg,rm,rmvb,asf,drc', '', 0, 0, 0, 0, 0, 0),
+('bx_posts_videos_resized', @sStorageEngine, '', 360, 2592000, 3, 'bx_posts_videos_resized', 'allow-deny', 'jpg,jpeg,jpe,gif,png,avi,flv,mpg,mpeg,wmv,mp4,m4v,mov,qt,divx,xvid,3gp,3g2,webm,mkv,ogv,ogg,rm,rmvb,asf,drc', '', 0, 0, 0, 0, 0, 0),
+
+('bx_posts_files', @sStorageEngine, '', 360, 2592000, 3, 'bx_posts_files', 'deny-allow', '', 'action,apk,app,bat,bin,cmd,com,command,cpl,csh,exe,gadget,inf,ins,inx,ipa,isu,job,jse,ksh,lnk,msc,msi,msp,mst,osx,out,paf,pif,prg,ps1,reg,rgs,run,sct,shb,shs,u3p,vb,vbe,vbs,vbscript,workflow,ws,wsf', 0, 0, 0, 0, 0, 0);
+
+INSERT INTO `sys_objects_transcoder` (`object`, `storage_object`, `source_type`, `source_params`, `private`, `atime_tracking`, `atime_pruning`, `ts`, `override_class_name`, `override_class_file`) VALUES 
+('bx_posts_preview', 'bx_posts_photos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_posts_covers";}', 'no', '1', '2592000', '0', '', ''),
+('bx_posts_gallery', 'bx_posts_photos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_posts_covers";}', 'no', '1', '2592000', '0', '', ''),
+('bx_posts_cover', 'bx_posts_photos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_posts_covers";}', 'no', '1', '2592000', '0', '', ''),
+
+('bx_posts_preview_photos', 'bx_posts_photos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_posts_photos";}', 'no', '1', '2592000', '0', '', ''),
+('bx_posts_gallery_photos', 'bx_posts_photos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_posts_photos";}', 'no', '1', '2592000', '0', '', ''),
+
+('bx_posts_videos_poster', 'bx_posts_videos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_posts_videos";}', 'no', '0', '0', '0', 'BxDolTranscoderVideo', ''),
+('bx_posts_videos_poster_preview', 'bx_posts_videos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_posts_videos";}', 'no', '0', '0', '0', 'BxDolTranscoderVideo', ''),
+('bx_posts_videos_mp4', 'bx_posts_videos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_posts_videos";}', 'no', '0', '0', '0', 'BxDolTranscoderVideo', ''),
+('bx_posts_videos_mp4_hd', 'bx_posts_videos_resized', 'Storage', 'a:1:{s:6:"object";s:15:"bx_posts_videos";}', 'no', '0', '0', '0', 'BxDolTranscoderVideo', ''),
+
+('bx_posts_preview_files', 'bx_posts_photos_resized', 'Storage', 'a:1:{s:6:"object";s:14:"bx_posts_files";}', 'no', '1', '2592000', '0', '', ''),
+('bx_posts_gallery_files', 'bx_posts_photos_resized', 'Storage', 'a:1:{s:6:"object";s:14:"bx_posts_files";}', 'no', '1', '2592000', '0', '', '');
+
+INSERT INTO `sys_transcoder_filters` (`transcoder_object`, `filter`, `filter_params`, `order`) VALUES 
+('bx_posts_preview', 'Resize', 'a:3:{s:1:"w";s:3:"300";s:1:"h";s:3:"200";s:11:"crop_resize";s:1:"1";}', '0'),
+('bx_posts_gallery', 'Resize', 'a:1:{s:1:"w";s:3:"500";}', '0'),
+('bx_posts_cover', 'Resize', 'a:1:{s:1:"w";s:4:"2000";}', '0'),
+
+('bx_posts_preview_photos', 'Resize', 'a:3:{s:1:"w";s:3:"300";s:1:"h";s:3:"200";s:11:"crop_resize";s:1:"1";}', '0'),
+('bx_posts_gallery_photos', 'Resize', 'a:1:{s:1:"w";s:4:"2000";}', '0'),
+
+('bx_posts_videos_poster_preview', 'Resize', 'a:3:{s:1:"w";s:3:"300";s:1:"h";s:3:"200";s:13:"square_resize";s:1:"1";}', 10),
+('bx_posts_videos_poster_preview', 'Poster', 'a:2:{s:1:"h";s:3:"480";s:10:"force_type";s:3:"jpg";}', 0),
+('bx_posts_videos_poster', 'Poster', 'a:2:{s:1:"h";s:3:"318";s:10:"force_type";s:3:"jpg";}', 0),
+('bx_posts_videos_mp4', 'Mp4', 'a:2:{s:1:"h";s:3:"318";s:10:"force_type";s:3:"mp4";}', 0),
+('bx_posts_videos_mp4_hd', 'Mp4', 'a:3:{s:1:"h";s:3:"720";s:13:"video_bitrate";s:4:"1536";s:10:"force_type";s:3:"mp4";}', 0),
+
+('bx_posts_preview_files', 'Resize', 'a:3:{s:1:"w";s:3:"300";s:1:"h";s:3:"200";s:11:"crop_resize";s:1:"1";}', '0'),
+('bx_posts_gallery_files', 'Resize', 'a:1:{s:1:"w";s:3:"500";}', '0');
+
+
+-- FORMS: entry (post)
+INSERT INTO `sys_objects_form`(`object`, `module`, `title`, `action`, `form_attrs`, `table`, `key`, `uri`, `uri_title`, `submit_name`, `params`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_posts', 'bx_posts', '_bx_posts_form_entry', '', 'a:1:{s:7:"enctype";s:19:"multipart/form-data";}', 'bx_posts_posts', 'id', '', '', 'a:2:{i:0;s:9:"do_submit";i:1;s:10:"do_publish";}', '', 0, 1, 'BxPostsFormEntry', 'modules/boonex/posts/classes/BxPostsFormEntry.php');
+
+INSERT INTO `sys_form_displays`(`object`, `display_name`, `module`, `view_mode`, `title`) VALUES 
+('bx_posts', 'bx_posts_entry_add', 'bx_posts', 0, '_bx_posts_form_entry_display_add'),
+('bx_posts', 'bx_posts_entry_delete', 'bx_posts', 0, '_bx_posts_form_entry_display_delete'),
+('bx_posts', 'bx_posts_entry_edit', 'bx_posts', 0, '_bx_posts_form_entry_display_edit'),
+('bx_posts', 'bx_posts_entry_view', 'bx_posts', 1, '_bx_posts_form_entry_display_view');
+
+INSERT INTO `sys_form_inputs`(`object`, `module`, `name`, `value`, `values`, `checked`, `type`, `caption_system`, `caption`, `info`, `required`, `collapsed`, `html`, `attrs`, `attrs_tr`, `attrs_wrapper`, `checker_func`, `checker_params`, `checker_error`, `db_pass`, `db_params`, `editable`, `deletable`) VALUES 
+('bx_posts', 'bx_posts', 'allow_view_to', '', '', 0, 'custom', '_bx_posts_form_entry_input_sys_allow_view_to', '_bx_posts_form_entry_input_allow_view_to', '', 1, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_posts', 'bx_posts', 'delete_confirm', 1, '', 0, 'checkbox', '_bx_posts_form_entry_input_sys_delete_confirm', '_bx_posts_form_entry_input_delete_confirm', '_bx_posts_form_entry_input_delete_confirm_info', 1, 0, 0, '', '', '', 'Avail', '', '_bx_posts_form_entry_input_delete_confirm_error', '', '', 1, 0),
+('bx_posts', 'bx_posts', 'do_publish', '_bx_posts_form_entry_input_do_publish', '', 0, 'submit', '_bx_posts_form_entry_input_sys_do_publish', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_posts', 'bx_posts', 'do_submit', '_bx_posts_form_entry_input_do_submit', '', 0, 'submit', '_bx_posts_form_entry_input_sys_do_submit', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_posts', 'bx_posts', 'location', '', '', 0, 'location', '_sys_form_input_sys_location', '_sys_form_input_location', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_posts', 'bx_posts', 'covers', 'a:1:{i:0;s:14:"bx_posts_html5";}', 'a:2:{s:15:"bx_posts_simple";s:26:"_sys_uploader_simple_title";s:14:"bx_posts_html5";s:25:"_sys_uploader_html5_title";}', 0, 'files', '_bx_posts_form_entry_input_sys_covers', '_bx_posts_form_entry_input_covers', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_posts', 'bx_posts', 'pictures', 'a:1:{i:0;s:21:"bx_posts_photos_html5";}', 'a:2:{s:22:"bx_posts_photos_simple";s:26:"_sys_uploader_simple_title";s:21:"bx_posts_photos_html5";s:25:"_sys_uploader_html5_title";}', 0, 'files', '_bx_posts_form_entry_input_sys_pictures', '_bx_posts_form_entry_input_pictures', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_posts', 'bx_posts', 'videos', 'a:1:{i:0;s:21:"bx_posts_videos_html5";}', 'a:2:{s:22:"bx_posts_videos_simple";s:26:"_sys_uploader_simple_title";s:21:"bx_posts_videos_html5";s:25:"_sys_uploader_html5_title";}', 0, 'files', '_bx_posts_form_entry_input_sys_videos', '_bx_posts_form_entry_input_videos', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_posts', 'bx_posts', 'files', 'a:1:{i:0;s:20:"bx_posts_files_html5";}', 'a:2:{s:21:"bx_posts_files_simple";s:26:"_sys_uploader_simple_title";s:20:"bx_posts_files_html5";s:25:"_sys_uploader_html5_title";}', 0, 'files', '_bx_posts_form_entry_input_sys_files', '_bx_posts_form_entry_input_files', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_posts', 'bx_posts', 'polls', '', '', 0, 'custom', '_bx_posts_form_entry_input_sys_polls', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_posts', 'bx_posts', 'text', '', '', 0, 'textarea', '_bx_posts_form_entry_input_sys_text', '_bx_posts_form_entry_input_text', '', 1, 0, 2, '', '', '', 'Avail', '', '_bx_posts_form_entry_input_text_err', 'XssHtml', '', 1, 0),
+('bx_posts', 'bx_posts', 'title', '', '', 0, 'text', '_bx_posts_form_entry_input_sys_title', '_bx_posts_form_entry_input_title', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_posts_form_entry_input_title_err', 'Xss', '', 1, 0),
+('bx_posts', 'bx_posts', 'cat', '', '#!bx_posts_cats', 0, 'select', '_bx_posts_form_entry_input_sys_cat', '_bx_posts_form_entry_input_cat', '', 1, 0, 0, '', '', '', 'avail', '', '_bx_posts_form_entry_input_cat_err', 'Xss', '', 1, 0),
+('bx_posts', 'bx_posts', 'multicat', '', '', 0, 'custom', '_bx_posts_form_entry_input_sys_multicat', '_bx_posts_form_entry_input_multicat', '', 1, 0, 0, '', '', '', 'avail', '', '_bx_posts_form_entry_input_multicat_err', 'Xss', '', 1, 0),
+('bx_posts', 'bx_posts', 'added', '', '', 0, 'datetime', '_bx_posts_form_entry_input_sys_date_added', '_bx_posts_form_entry_input_date_added', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_posts', 'bx_posts', 'changed', '', '', 0, 'datetime', '_bx_posts_form_entry_input_sys_date_changed', '_bx_posts_form_entry_input_date_changed', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_posts', 'bx_posts', 'published', '', '', 0, 'datetime', '_bx_posts_form_entry_input_sys_date_published', '_bx_posts_form_entry_input_date_published', '_bx_posts_form_entry_input_date_published_info', 0, 0, 0, '', '', '', '', '', '', 'DateTimeTs', '', 1, 0),
+('bx_posts', 'bx_posts', 'attachments', '', '', 0, 'custom', '_bx_posts_form_entry_input_sys_attachments', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_posts', 'bx_posts', 'labels', '', '', 0, 'custom', '_sys_form_input_sys_labels', '_sys_form_input_labels', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_posts', 'bx_posts', 'anonymous', '', '', 0, 'switcher', '_sys_form_input_sys_anonymous', '_sys_form_input_anonymous', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_posts', 'bx_posts', 'disable_comments', '1', '', 0, 'switcher', '_bx_posts_form_entry_input_sys_disable_comments', '_bx_posts_form_entry_input_disable_comments', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 1, 0);
+
+
+
+INSERT INTO `sys_form_display_inputs`(`display_name`, `input_name`, `visible_for_levels`, `active`, `order`) VALUES 
+('bx_posts_entry_add', 'delete_confirm', 2147483647, 0, 1),
+('bx_posts_entry_add', 'title', 2147483647, 1, 2),
+('bx_posts_entry_add', 'cat', 2147483647, 1, 3),
+('bx_posts_entry_add', 'text', 2147483647, 1, 4),
+('bx_posts_entry_add', 'attachments', 2147483647, 1, 5),
+('bx_posts_entry_add', 'pictures', 2147483647, 1, 6),
+('bx_posts_entry_add', 'videos', 2147483647, 1, 7),
+('bx_posts_entry_add', 'files', 2147483647, 1, 8),
+('bx_posts_entry_add', 'polls', 2147483647, 1, 9),
+('bx_posts_entry_add', 'covers', 2147483647, 1, 10),
+('bx_posts_entry_add', 'allow_view_to', 2147483647, 1, 11),
+('bx_posts_entry_add', 'location', 2147483647, 1, 12),
+('bx_posts_entry_add', 'published', 192, 1, 13),
+('bx_posts_entry_add', 'disable_comments', 192, 1, 14),
+('bx_posts_entry_add', 'do_publish', 2147483647, 1, 15),
+
+('bx_posts_entry_delete', 'delete_confirm', 2147483647, 1, 1),
+('bx_posts_entry_delete', 'do_submit', 2147483647, 1, 2),
+
+('bx_posts_entry_edit', 'do_publish', 2147483647, 0, 1),
+('bx_posts_entry_edit', 'delete_confirm', 2147483647, 0, 2),
+('bx_posts_entry_edit', 'title', 2147483647, 1, 3),
+('bx_posts_entry_edit', 'cat', 2147483647, 1, 4),
+('bx_posts_entry_edit', 'text', 2147483647, 1, 5),
+('bx_posts_entry_edit', 'attachments', 2147483647, 1, 6),
+('bx_posts_entry_edit', 'pictures', 2147483647, 1, 7),
+('bx_posts_entry_edit', 'videos', 2147483647, 1, 8),
+('bx_posts_entry_edit', 'files', 2147483647, 1, 9),
+('bx_posts_entry_edit', 'polls', 2147483647, 1, 10),
+('bx_posts_entry_edit', 'covers', 2147483647, 1, 11),
+('bx_posts_entry_edit', 'allow_view_to', 2147483647, 1, 12),
+('bx_posts_entry_edit', 'location', 2147483647, 1, 13),
+('bx_posts_entry_edit', 'disable_comments', 192, 1, 14),
+('bx_posts_entry_edit', 'published', 192, 1, 15),
+('bx_posts_entry_edit', 'do_submit', 2147483647, 1, 16),
+
+('bx_posts_entry_view', 'cat', 2147483647, 1, 1),
+('bx_posts_entry_view', 'added', 2147483647, 1, 2),
+('bx_posts_entry_view', 'changed', 2147483647, 1, 3),
+('bx_posts_entry_view', 'published', 192, 1, 4);
+
+-- FORMS: poll
+INSERT INTO `sys_objects_form` (`object`, `module`, `title`, `action`, `form_attrs`, `submit_name`, `table`, `key`, `uri`, `uri_title`, `params`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES
+('bx_posts_poll', 'bx_posts', '_bx_posts_form_poll', '', '', 'do_submit', 'bx_posts_polls', 'id', '', '', 'a:1:{s:14:"checker_helper";s:28:"BxPostsFormPollCheckerHelper";}', 0, 1, 'BxPostsFormPoll', 'modules/boonex/posts/classes/BxPostsFormPoll.php');
+
+INSERT INTO `sys_form_displays` (`display_name`, `module`, `object`, `title`, `view_mode`) VALUES
+('bx_posts_poll_add', 'bx_posts', 'bx_posts_poll', '_bx_posts_form_poll_display_add', 0);
+
+INSERT INTO `sys_form_inputs` (`object`, `module`, `name`, `value`, `values`, `checked`, `type`, `caption_system`, `caption`, `info`, `required`, `collapsed`, `html`, `attrs`, `attrs_tr`, `attrs_wrapper`, `checker_func`, `checker_params`, `checker_error`, `db_pass`, `db_params`, `editable`, `deletable`) VALUES
+('bx_posts_poll', 'bx_posts', 'text', '', '', 0, 'text', '_bx_posts_form_poll_input_sys_text', '_bx_posts_form_poll_input_text', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_posts_form_poll_input_text_err', 'Xss', '', 1, 0),
+('bx_posts_poll', 'bx_posts', 'answers', '', '', 0, 'custom', '_bx_posts_form_poll_input_sys_answers', '_bx_posts_form_poll_input_answers', '', 1, 0, 0, '', '', '', 'AvailAnswers', '', '_bx_posts_form_poll_input_answers_err', '', '', 1, 0),
+('bx_posts_poll', 'bx_posts', 'controls', '', 'do_submit,do_cancel', 0, 'input_set', '', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 0, 0),
+('bx_posts_poll', 'bx_posts', 'do_submit', '_bx_posts_form_poll_input_do_submit', '', 0, 'submit', '_bx_posts_form_poll_input_sys_do_submit', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 0, 0),
+('bx_posts_poll', 'bx_posts', 'do_cancel', '_bx_posts_form_poll_input_do_cancel', '', 0, 'button', '_bx_posts_form_poll_input_do_cancel', '', '', 0, 0, 0, 'a:2:{s:7:"onclick";s:45:"$(''.bx-popup-applied:visible'').dolPopupHide()";s:5:"class";s:22:"bx-def-margin-sec-left";}', '', '', '', '', '', '', '', 0, 0);
+
+INSERT INTO `sys_form_display_inputs` (`display_name`, `input_name`, `visible_for_levels`, `active`, `order`) VALUES
+('bx_posts_poll_add', 'text', 2147483647, 1, 1),
+('bx_posts_poll_add', 'answers', 2147483647, 1, 2),
+('bx_posts_poll_add', 'controls', 2147483647, 1, 3),
+('bx_posts_poll_add', 'do_submit', 2147483647, 1, 4),
+('bx_posts_poll_add', 'do_cancel', 2147483647, 1, 5);
+
+-- PRE-VALUES
+INSERT INTO `sys_form_pre_lists`(`key`, `title`, `module`, `use_for_sets`) VALUES
+('bx_posts_cats', '_bx_posts_pre_lists_cats', 'bx_posts', '0');
+
+INSERT INTO `sys_form_pre_values`(`Key`, `Value`, `Order`, `LKey`, `LKey2`) VALUES
+('bx_posts_cats', '', 0, '_sys_please_select', ''),
+('bx_posts_cats', '1', 1, '_bx_posts_cat_Animals_Pets', ''),
+('bx_posts_cats', '2', 2, '_bx_posts_cat_Architecture', ''),
+('bx_posts_cats', '3', 3, '_bx_posts_cat_Art', ''),
+('bx_posts_cats', '4', 4, '_bx_posts_cat_Cars_Motorcycles', ''),
+('bx_posts_cats', '5', 5, '_bx_posts_cat_Celebrities', ''),
+('bx_posts_cats', '6', 6, '_bx_posts_cat_Design', ''),
+('bx_posts_cats', '7', 7, '_bx_posts_cat_DIY_Crafts', ''),
+('bx_posts_cats', '8', 8, '_bx_posts_cat_Education', ''),
+('bx_posts_cats', '9', 9, '_bx_posts_cat_Film_Music_Books', ''),
+('bx_posts_cats', '10', 10, '_bx_posts_cat_Food_Drink', ''),
+('bx_posts_cats', '11', 11, '_bx_posts_cat_Gardening', ''),
+('bx_posts_cats', '12', 12, '_bx_posts_cat_Geek', ''),
+('bx_posts_cats', '13', 13, '_bx_posts_cat_Hair_Beauty', ''),
+('bx_posts_cats', '14', 14, '_bx_posts_cat_Health_Fitness', ''),
+('bx_posts_cats', '15', 15, '_bx_posts_cat_History', ''),
+('bx_posts_cats', '16', 16, '_bx_posts_cat_Holidays_Events', ''),
+('bx_posts_cats', '17', 17, '_bx_posts_cat_Home_Decor', ''),
+('bx_posts_cats', '18', 18, '_bx_posts_cat_Humor', ''),
+('bx_posts_cats', '19', 19, '_bx_posts_cat_Illustrations_Posters', ''),
+('bx_posts_cats', '20', 20, '_bx_posts_cat_Kids_Parenting', ''),
+('bx_posts_cats', '21', 21, '_bx_posts_cat_Mens_Fashion', ''),
+('bx_posts_cats', '22', 22, '_bx_posts_cat_Outdoors', ''),
+('bx_posts_cats', '23', 23, '_bx_posts_cat_Photography', ''),
+('bx_posts_cats', '24', 24, '_bx_posts_cat_Products', ''),
+('bx_posts_cats', '25', 25, '_bx_posts_cat_Quotes', ''),
+('bx_posts_cats', '26', 26, '_bx_posts_cat_Science_Nature', ''),
+('bx_posts_cats', '27', 27, '_bx_posts_cat_Sports', ''),
+('bx_posts_cats', '28', 28, '_bx_posts_cat_Tattoos', ''),
+('bx_posts_cats', '29', 29, '_bx_posts_cat_Technology', ''),
+('bx_posts_cats', '30', 30, '_bx_posts_cat_Travel', ''),
+('bx_posts_cats', '31', 31, '_bx_posts_cat_Weddings', ''),
+('bx_posts_cats', '32', 32, '_bx_posts_cat_Womens_Fashion', '');
+
+-- COMMENTS
+INSERT INTO `sys_objects_cmts` (`Name`, `Module`, `Table`, `CharsPostMin`, `CharsPostMax`, `CharsDisplayMax`, `Html`, `PerView`, `PerViewReplies`, `BrowseType`, `IsBrowseSwitch`, `PostFormPosition`, `NumberOfLevels`, `IsDisplaySwitch`, `IsRatable`, `ViewingThreshold`, `IsOn`, `RootStylePrefix`, `BaseUrl`, `ObjectVote`, `TriggerTable`, `TriggerFieldId`, `TriggerFieldAuthor`, `TriggerFieldTitle`, `TriggerFieldComments`, `ClassName`, `ClassFile`) VALUES
+('bx_posts', 'bx_posts', 'bx_posts_cmts', 1, 5000, 1000, 3, 5, 3, 'tail', 1, 'bottom', 1, 1, 1, -3, 1, 'cmt', 'page.php?i=view-post&id={object_id}', '', 'bx_posts_posts', 'id', 'author', 'title', 'comments', '', '');
+
+-- VOTES
+INSERT INTO `sys_objects_vote` (`Name`, `TableMain`, `TableTrack`, `PostTimeout`, `MinValue`, `MaxValue`, `IsUndo`, `IsOn`, `TriggerTable`, `TriggerFieldId`, `TriggerFieldAuthor`, `TriggerFieldRate`, `TriggerFieldRateCount`, `ClassName`, `ClassFile`) VALUES 
+('bx_posts', 'bx_posts_votes', 'bx_posts_votes_track', '604800', '1', '1', '0', '1', 'bx_posts_posts', 'id', 'author', 'rate', 'votes', '', ''),
+('bx_posts_reactions', 'bx_posts_reactions', 'bx_posts_reactions_track', '604800', '1', '1', '1', '1', 'bx_posts_posts', 'id', 'author', 'rrate', 'rvotes', 'BxTemplVoteReactions', ''),
+('bx_posts_poll_answers', 'bx_posts_polls_answers_votes', 'bx_posts_polls_answers_votes_track', '604800', '1', '1', '0', '1', 'bx_posts_polls_answers', 'id', 'author_id', 'rate', 'votes', 'BxPostsVotePollAnswers', 'modules/boonex/posts/classes/BxPostsVotePollAnswers.php');
+
+-- SCORES
+INSERT INTO `sys_objects_score` (`name`, `module`, `table_main`, `table_track`, `post_timeout`, `is_on`, `trigger_table`, `trigger_field_id`, `trigger_field_author`, `trigger_field_score`, `trigger_field_cup`, `trigger_field_cdown`, `class_name`, `class_file`) VALUES 
+('bx_posts', 'bx_posts', 'bx_posts_scores', 'bx_posts_scores_track', '604800', '0', 'bx_posts_posts', 'id', 'author', 'score', 'sc_up', 'sc_down', '', '');
+
+-- REPORTS
+INSERT INTO `sys_objects_report` (`name`, `table_main`, `table_track`, `is_on`, `base_url`, `trigger_table`, `trigger_field_id`, `trigger_field_author`, `trigger_field_count`, `class_name`, `class_file`) VALUES 
+('bx_posts', 'bx_posts_reports', 'bx_posts_reports_track', '1', 'page.php?i=view-post&id={object_id}', 'bx_posts_posts', 'id', 'author', 'reports', '', '');
+
+-- VIEWS
+INSERT INTO `sys_objects_view` (`name`, `table_track`, `period`, `is_on`, `trigger_table`, `trigger_field_id`, `trigger_field_author`, `trigger_field_count`, `class_name`, `class_file`) VALUES 
+('bx_posts', 'bx_posts_views_track', '86400', '1', 'bx_posts_posts', 'id', 'author', 'views', '', '');
+
+-- FAFORITES
+INSERT INTO `sys_objects_favorite` (`name`, `table_track`, `is_on`, `is_undo`, `is_public`, `base_url`, `trigger_table`, `trigger_field_id`, `trigger_field_author`, `trigger_field_count`, `class_name`, `class_file`) VALUES 
+('bx_posts', 'bx_posts_favorites_track', '1', '1', '1', 'page.php?i=view-post&id={object_id}', 'bx_posts_posts', 'id', 'author', 'favorites', '', '');
+
+-- FEATURED
+INSERT INTO `sys_objects_feature` (`name`, `is_on`, `is_undo`, `base_url`, `trigger_table`, `trigger_field_id`, `trigger_field_author`, `trigger_field_flag`, `class_name`, `class_file`) VALUES 
+('bx_posts', '1', '1', 'page.php?i=view-post&id={object_id}', 'bx_posts_posts', 'id', 'author', 'featured', '', '');
+
+-- CONTENT INFO
+INSERT INTO `sys_objects_content_info` (`name`, `title`, `alert_unit`, `alert_action_add`, `alert_action_update`, `alert_action_delete`, `class_name`, `class_file`) VALUES
+('bx_posts', '_bx_posts', 'bx_posts', 'added', 'edited', 'deleted', '', ''),
+('bx_posts_cmts', '_bx_posts_cmts', 'bx_posts', 'commentPost', 'commentUpdated', 'commentRemoved', 'BxDolContentInfoCmts', '');
+
+INSERT INTO `sys_content_info_grids` (`object`, `grid_object`, `grid_field_id`, `condition`, `selection`) VALUES
+('bx_posts', 'bx_posts_administration', 'id', '', ''),
+('bx_posts', 'bx_posts_common', 'id', '', '');
+
+-- SEARCH EXTENDED
+INSERT INTO `sys_objects_search_extended` (`object`, `object_content_info`, `module`, `title`, `active`, `class_name`, `class_file`) VALUES
+('bx_posts', 'bx_posts', 'bx_posts', '_bx_posts_search_extended', 1, '', ''),
+('bx_posts_cmts', 'bx_posts_cmts', 'bx_posts', '_bx_posts_search_extended_cmts', 1, 'BxTemplSearchExtendedCmts', '');
+
+-- STUDIO: page & widget
+INSERT INTO `sys_std_pages`(`index`, `name`, `header`, `caption`, `icon`) VALUES
+(3, 'bx_posts', '_bx_posts', '_bx_posts', 'bx_posts@modules/boonex/posts/|std-icon.svg');
+SET @iPageId = LAST_INSERT_ID();
+
+SET @iParentPageId = (SELECT `id` FROM `sys_std_pages` WHERE `name` = 'home');
+SET @iParentPageOrder = (SELECT MAX(`order`) FROM `sys_std_pages_widgets` WHERE `page_id` = @iParentPageId);
+INSERT INTO `sys_std_widgets` (`page_id`, `module`, `url`, `click`, `icon`, `caption`, `cnt_notices`, `cnt_actions`) VALUES
+(@iPageId, 'bx_posts', '{url_studio}module.php?name=bx_posts', '', 'bx_posts@modules/boonex/posts/|std-icon.svg', '_bx_posts', '', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:11:"get_actions";s:6:"params";a:0:{}s:5:"class";s:18:"TemplStudioModules";}');
+INSERT INTO `sys_std_pages_widgets` (`page_id`, `widget_id`, `order`) VALUES
+(@iParentPageId, LAST_INSERT_ID(), IF(ISNULL(@iParentPageOrder), 1, @iParentPageOrder + 1));
+

+ 51 - 0
modules/boonex/protean/updates/11.0.2_11.0.3/install/config.php

@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'title' => 'Protean',
+    'version_from' => '11.0.2',
+    'version_to' => '11.0.3',
+    'vendor' => 'BoonEx',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/protean/updates/update_11.0.2_11.0.3/',
+    'home_uri' => 'protean_update_1102_1103',
+
+    'module_dir' => 'boonex/protean/',
+    'module_uri' => 'protean',
+
+    'db_prefix' => 'bx_protean_',
+    'class_prefix' => 'BxProtean',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_files' => 1,
+        'update_languages' => 0,
+        'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Boonex Protean Template',
+
+    /**
+     * Files Section
+     */
+    'delete_files' => array(),
+);

+ 26 - 0
modules/boonex/protean/updates/11.0.2_11.0.3/install/installer.php

@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+class BxProteanUpdater extends BxDolStudioUpdater
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+
+    public function update($aParams)
+    {
+        $aResult = parent::update($aParams);
+        if(!$aResult['result'])
+            	return $aResult;
+
+        $oCacheUtilities = BxDolCacheUtilities::getInstance();
+        $oCacheUtilities->clear('css');
+        $oCacheUtilities->clear('template');
+
+        return $aResult;
+    }
+}

Разница между файлами не показана из-за своего большого размера
+ 5 - 0
modules/boonex/protean/updates/11.0.2_11.0.3/install/sql/install.sql


+ 30 - 0
modules/boonex/protean/updates/11.0.2_11.0.3/source/data/template/bx_timeline/css/view.less

@@ -0,0 +1,30 @@
+@import (reference) '../../system/css/default.less';
+@import '../../../../../timeline/template/css/view.css';
+
+/*--- Item Content Style ---*/
+div.bx-tl-item-text div.bx-tl-content.bx-tl-overflow:before {
+    background: -webkit-linear-gradient(top, rgba(255, 255,255, 0), @bx-color-box);
+    background: -moz-linear-gradient(top, rgba(255, 255,255, 0), @bx-color-box);
+    background: -o-linear-gradient(top, rgba(255, 255,255, 0), @bx-color-box);
+    background: linear-gradient(to bottom, rgba(255, 255,255, 0), @bx-color-box);
+}
+
+/*--- Item Owner Styles ---*/
+div.bx-tl-item div.bx-tl-owner-name > * {
+    display: inline-block;
+}
+
+/*--- Meta and Activity Styles ---*/
+div.bx-tl-item-meta-activity {
+    display: -webkit-flex;
+    display: flex;
+    -webkit-justify-content: space-between;
+    justify-content: space-between;
+    -webkit-align-items: center;
+    align-items: center;
+}
+
+.bx-media-phone div.bx-tl-item-meta-activity {
+    -webkit-flex-wrap: wrap;
+    flex-wrap: wrap;
+}

+ 885 - 0
modules/boonex/protean/updates/11.0.2_11.0.3/source/data/template/system/css/default.less

@@ -0,0 +1,885 @@
+@import '../../../../../../../template/css/default.less';
+
+/**
+ * Is used for inputs and buttons. They should have the same value 
+ * because Input and Button can be positioned in one line.
+ */
+@base-input-box-sizing: border-box;
+
+
+/* viewport */
+html.bx-media-tablet {
+    font-size: @bx-viewport-font-tablet !important;
+}
+
+html.bx-media-phone {
+    font-size: @bx-viewport-font-mobile !important;
+}
+
+/* height */
+.bx-header {
+	height: @bx-height-header !important;
+}
+.bx-menu-toolbar-padding {
+	padding-top: @bx-height-header !important;
+}
+
+/* content paddings */
+.bx-content-padding-header {
+	padding: @bx-content-padding-header;
+}
+.bx-content-padding-footer {
+	padding: @bx-content-padding-footer;
+}
+.bx-content-padding-block {
+	padding: @bx-content-padding-block;
+}
+
+/* shadow */
+.bx-shadow-header {
+    -webkit-box-shadow: @bx-shadow-header;
+    -moz-box-shadow: @bx-shadow-header;
+    box-shadow: @bx-shadow-header;
+}
+.bx-shadow-footer {
+    -webkit-box-shadow: @bx-shadow-footer;
+    -moz-box-shadow: @bx-shadow-footer;
+    box-shadow: @bx-shadow-footer;
+}
+.bx-shadow-block {
+    -webkit-box-shadow: @bx-shadow-block;
+    -moz-box-shadow: @bx-shadow-block;
+    box-shadow: @bx-shadow-block;
+}
+.bx-def-box {
+    -webkit-box-shadow: @bx-shadow-card;
+    -moz-box-shadow: @bx-shadow-card;
+    box-shadow: @bx-shadow-card;
+}
+.bx-popup-applied {
+    border-radius: @bx-border-radius-popup;
+    background-clip: padding-box;
+}
+.bx-popup-applied:not(.bx-popup-chain),
+.bx-popup-applied.bx-popup-chain .bx-popup-chain-item {
+    -webkit-box-shadow: @bx-shadow-popup;
+    -moz-box-shadow: @bx-shadow-popup;
+    box-shadow: @bx-shadow-popup;
+}
+.bx-popup-applied.bx-popup-chain .bx-popup-chain-item a:hover {
+    background-color: @bx-color-hl;
+}
+.bx-popup-wrapper.bx-popup-slide-wrapper {
+    -webkit-box-shadow: @bx-shadow-menu-slide;
+    -moz-box-shadow: @bx-shadow-menu-slide;
+    box-shadow: @bx-shadow-menu-slide;
+}
+.bx-btn {
+    -webkit-box-shadow: @bx-shadow-button;
+    -moz-box-shadow: @bx-shadow-button;
+    box-shadow: @bx-shadow-button;
+}
+.bx-btn.bx-btn-small {
+    -webkit-box-shadow: @bx-shadow-button-small;
+    -moz-box-shadow: @bx-shadow-button-small;
+    box-shadow: @bx-shadow-button-small;
+}
+
+
+/* background images */
+.bx-def-image-bg-header,
+.bx-def-image-bg-footer,
+.bx-def-image-bg-page,
+.bx-def-image-bg-block,
+.bx-def-box,
+.bx-popup-color-bg,
+.bx-popup-wrapper.bx-popup-slide-wrapper,
+#bx-sliding-menu-sys_site.bx-sliding-menu-main,
+#bx-sliding-menu-sys_add_content.bx-sliding-menu-main,
+#bx-sliding-menu-account.bx-sliding-menu-main,
+.bx-menu-main-bar-wrapper {
+    background-position: center center;
+}
+.bx-def-image-bg-header {
+	background-image: @bx-image-bg-header;
+	background-repeat: @bx-image-bg-header-repeat;
+	background-attachment: @bx-image-bg-header-attachment;
+    background-size: @bx-image-bg-header-size;
+}
+.bx-def-image-bg-footer {
+	background-image: @bx-image-bg-footer;
+	background-repeat: @bx-image-bg-footer-repeat;
+	background-attachment: @bx-image-bg-footer-attachment;
+    background-size: @bx-image-bg-footer-size;
+}
+.bx-def-image-bg-page {
+	background-image: @bx-image-bg-page;
+	background-repeat: @bx-image-bg-page-repeat;
+	background-attachment: @bx-image-bg-page-attachment;
+    background-size: @bx-image-bg-page-size;
+}
+.bx-def-image-bg-block {
+	background-image: @bx-image-bg-block;
+	background-repeat: @bx-image-bg-block-repeat;
+	background-attachment: @bx-image-bg-block-attachment;
+    background-size: @bx-image-bg-block-size;
+}
+.bx-def-box {
+	background-image: @bx-image-bg-box;
+	background-repeat: @bx-image-bg-box-repeat;
+	background-attachment: @bx-image-bg-box-attachment;
+    background-size: @bx-image-bg-box-size;
+}
+
+/* body */
+a {
+    color: @bx-color-link-body; 
+}
+a:hover {
+    color: @bx-color-link-body-hover; 
+}
+.sys-icon:not(.sys-colored),
+.sys-icon-a:not(.sys-colored) {
+    color: @bx-color-icon-body; 
+}
+a:hover > .sys-icon:not(.sys-colored),
+a:hover > .sys-icon-a:not(.sys-colored) {
+    color: @bx-color-icon-body-hover; 
+}
+.sys-icon-a i {
+    .background-color (@bx-color-icon-body) !important;
+    color: @bx-color-icon-body;
+}
+a:hover > .sys-icon-a i {
+    .background-color (@bx-color-icon-body-hover) !important;
+    color: @bx-color-icon-body-hover;
+}
+
+/* header */
+.bx-header.bx-def-color-bg-header {
+    .background-color (@bx-color-header);
+}
+.bx-header.bx-def-border-header {
+    border-bottom-width: @bx-border-width-header;
+    border-bottom-style: @bx-border-type;
+    border-bottom-color: @bx-color-border-header;
+}
+.bx-header a {
+	color: @bx-color-link-header; 
+}
+.bx-header a:hover {
+	color: @bx-color-link-header-hover;
+}
+.bx-header .sys-icon,
+.bx-header .sys-icon-a {
+	color: @bx-color-icon-header; 
+}
+.bx-header a:hover .sys-icon,
+.bx-header a:hover .sys-icon-a {
+	color: @bx-color-icon-header-hover; 
+} 
+.bx-header .sys-icon-a i {
+	.background-color (@bx-color-icon-header) !important;
+	color: @bx-color-icon-header;
+}
+.bx-header a:hover .sys-icon-a i {
+	.background-color (@bx-color-icon-header-hover) !important;
+	color: @bx-color-icon-header-hover;
+}
+
+/* footer */
+.bx-def-color-bg-footer {
+    .background-color (@bx-color-footer);    
+}
+.bx-def-border-footer {
+    border-top-width: @bx-border-width-footer;
+    border-top-style: @bx-border-type;
+    border-top-color: @bx-color-border-footer;
+}
+.bx-footer {
+	color: @bx-font-color-footer;
+}
+.bx-footer a {
+	color: @bx-color-link-footer; 
+}
+.bx-footer a:hover {
+	color: @bx-color-link-footer-hover; 
+}
+.bx-footer .sys-icon,
+.bx-footer .sys-icon-a {
+	color: @bx-color-icon-footer; 
+}
+.bx-footer a:hover .sys-icon,
+.bx-footer a:hover .sys-icon-a {
+	color: @bx-color-icon-footer-hover; 
+}
+.bx-footer .sys-icon-a i {
+	.background-color (@bx-color-icon-footer) !important;
+	color: @bx-color-icon-footer;
+}
+.bx-footer a:hover .sys-icon-a i {
+	.background-color (@bx-color-icon-footer-hover) !important;
+	color: @bx-color-icon-footer-hover;
+}
+
+/* fonts */
+.bx-def-font-inputs {
+	font-family: @bx-font-family-form-input;
+	font-size: @bx-font-size-form-input;
+	color: @bx-font-color-form-input;
+}
+
+h1,
+.bx-def-font-h1 {
+	font-weight: @bx-font-weight-h1;
+	color: @bx-font-color-default-h1;
+}
+h1.bx-def-font-grayed,
+h1 .bx-def-font-grayed,
+.bx-def-font-h1.bx-def-font-grayed,
+.bx-def-font-h1 .bx-def-font-grayed {
+	color: @bx-font-color-grayed-h1;
+}
+h1.bx-def-font-contrasted,
+h1.bx-def-font-contrasted:after,
+h1.bx-def-font-contrasted:before,
+h1 .bx-def-font-contrasted,
+h1 .bx-def-font-contrasted:after,
+h1 .bx-def-font-contrasted:before,
+.bx-def-font-h1.bx-def-font-contrasted,
+.bx-def-font-h1.bx-def-font-contrasted:after,
+.bx-def-font-h1.bx-def-font-contrasted:before,
+.bx-def-font-h1 .bx-def-font-contrasted,
+.bx-def-font-h1 .bx-def-font-contrasted:after,
+.bx-def-font-h1 .bx-def-font-contrasted:before {
+	color: @bx-font-color-contrasted-h1;
+}
+h1 a,
+.bx-def-font-h1 a,
+a.bx-def-font-h1 {
+	color: @bx-font-color-link-h1;
+}
+h1 a:hover,
+.bx-def-font-h1 a:hover,
+a.bx-def-font-h1:hover {
+	color: @bx-font-color-link-h1-hover;
+}
+
+h2,
+.bx-def-font-h2 {
+	font-weight: @bx-font-weight-h2;
+	color: @bx-font-color-default-h2;
+}
+h2.bx-def-font-grayed,
+h2 .bx-def-font-grayed,
+.bx-def-font-h2.bx-def-font-grayed,
+.bx-def-font-h2 .bx-def-font-grayed {
+	color: @bx-font-color-grayed-h2;
+}
+h2.bx-def-font-contrasted,
+h2.bx-def-font-contrasted:after,
+h2.bx-def-font-contrasted:before,
+h2 .bx-def-font-contrasted,
+h2 .bx-def-font-contrasted:after,
+h2 .bx-def-font-contrasted:before,
+.bx-def-font-h2.bx-def-font-contrasted,
+.bx-def-font-h2.bx-def-font-contrasted:after,
+.bx-def-font-h2.bx-def-font-contrasted:before,
+.bx-def-font-h2 .bx-def-font-contrasted,
+.bx-def-font-h2 .bx-def-font-contrasted:after,
+.bx-def-font-h2 .bx-def-font-contrasted:before {
+	color: @bx-font-color-contrasted-h2;
+}
+h2 a,
+.bx-def-font-h2 a,
+a.bx-def-font-h2 {
+	color: @bx-font-color-link-h2;
+}
+h2 a:hover,
+.bx-def-font-h2 a:hover,
+a.bx-def-font-h2:hover {
+	color: @bx-font-color-link-h2-hover;
+}
+
+h3,
+.bx-def-font-h3 {
+	font-weight: @bx-font-weight-h3;
+	color: @bx-font-color-default-h3;
+}
+h3.bx-def-font-grayed,
+h3 .bx-def-font-grayed,
+.bx-def-font-h3.bx-def-font-grayed,
+.bx-def-font-h3 .bx-def-font-grayed {
+	color: @bx-font-color-grayed-h3;
+}
+h3.bx-def-font-contrasted,
+h3.bx-def-font-contrasted:after,
+h3.bx-def-font-contrasted:before,
+h3 .bx-def-font-contrasted,
+h3 .bx-def-font-contrasted:after,
+h3 .bx-def-font-contrasted:before,
+.bx-def-font-h3.bx-def-font-contrasted,
+.bx-def-font-h3.bx-def-font-contrasted:after,
+.bx-def-font-h3.bx-def-font-contrasted:before,
+.bx-def-font-h3 .bx-def-font-contrasted,
+.bx-def-font-h3 .bx-def-font-contrasted:after,
+.bx-def-font-h3 .bx-def-font-contrasted:before {
+	color: @bx-font-color-contrasted-h3;
+}
+h3 a,
+.bx-def-font-h3 a,
+a.bx-def-font-h3 {
+	color: @bx-font-color-link-h3;
+}
+h3 a:hover,
+.bx-def-font-h3 a:hover,
+a.bx-def-font-h3:hover {
+	color: @bx-font-color-link-h3-hover;
+}
+
+/* cover */
+.bx-menu-toolbar-padding .bx-def-cover-color-bg {
+    background-color: @bx-color-cover;
+}
+
+.bx-menu-toolbar-padding .bx-cover-wrapper {
+    border-width: @bx-border-width-cover;
+    border-style: @bx-border-type;
+    border-color: @bx-color-border-cover;
+
+    border-radius: @bx-border-radius-cover;
+    background-clip: padding-box;
+
+    -webkit-box-shadow: @bx-shadow-cover;
+    -moz-box-shadow: @bx-shadow-cover;
+    box-shadow: @bx-shadow-cover;
+}
+.bx-cover-wrapper .bx-cover {
+    min-height: @bx-height-cover;
+}
+.bx-cover-wrapper .bx-cover,
+.bx-cover-wrapper .bx-cover .bx-cover-actions .bx-menu-btns-hor {
+    text-align: @bx-text-align-cover;
+}
+.bx-cover-wrapper .bx-cover.bx-def-padding {
+    padding: @bx-content-padding-cover;
+}
+.bx-cover-wrapper .bx-cover .bx-cover-image img {
+    border-width: @bx-border-width-cover-icon;
+    border-style: @bx-border-type;
+    border-color: @bx-color-border-cover-icon;
+
+    border-radius: @bx-border-radius-cover-icon;
+    background-clip: padding-box;
+    
+    -webkit-box-shadow: @bx-shadow-cover-icon;
+    -moz-box-shadow: @bx-shadow-cover-icon;
+    box-shadow: @bx-shadow-cover-icon;
+}
+
+.bx-cover-wrapper .bx-cover .bx-cover-title {
+    text-shadow: @bx-shadow-text-cover;
+
+    font-family: @bx-font-family-cover;
+}
+.bx-cover-wrapper .bx-cover .bx-cover-title,
+.bx-cover-wrapper .bx-cover .bx-cover-title .bx-def-font-contrasted,
+.bx-cover-wrapper .bx-cover .bx-cover-title .bx-def-font-contrasted:after,
+.bx-cover-wrapper .bx-cover .bx-cover-title .bx-def-font-contrasted:before {
+    color: @bx-color-font-cover;
+}
+.bx-cover-wrapper .bx-cover .bx-cover-title,
+.bx-cover-wrapper .bx-cover .bx-cover-title.bx-def-font-h1 {
+    font-size: @bx-font-size-cover;
+    font-weight: @bx-font-weight-cover;
+}
+
+
+/* block */
+.bx-def-border-block {
+    border-width: @bx-border-width-block;
+    border-style: @bx-border-type;
+    border-color: @bx-color-border-block;
+
+    border-radius: @bx-border-radius-block;
+    background-clip: padding-box;
+}
+.bx-def-border-radius-block {
+    border-radius: @bx-border-radius-block;
+    background-clip: padding-box;
+}
+.bx-def-border-radius-block-int {
+    border-radius: @bx-border-radius-block-itl @bx-border-radius-block-itr @bx-border-radius-block-ibr @bx-border-radius-block-ibl;
+    background-clip: padding-box;
+}
+.bx-def-border-radius-block-int-top {
+    border-radius: @bx-border-radius-block-itl @bx-border-radius-block-itr 0 0;
+    background-clip: padding-box;
+}
+.bx-def-border-radius-block-int-bottom {
+    border-radius: 0 0 @bx-border-radius-block-ibr @bx-border-radius-block-ibl;
+    background-clip: padding-box;
+}
+.bx-db-header {
+    padding: @bx-title-padding-block;
+
+    border-width: @bx-border-width-block-title;
+    border-style: solid;
+    border-color: @bx-color-border-block-title;
+
+    border-radius: @bx-border-radius-block-title;
+}
+.bx-def-color-bg-block .bx-db-header,
+.bx-def-image-bg-block .bx-db-header {
+    background-clip: padding-box;
+    background-color: @bx-color-block-title;
+}
+.bx-db-header .bx-db-title {
+	font-family: @bx-font-family-block-title;
+        font-size: @bx-font-size-block-title;
+	font-weight: @bx-font-weight-block-title;
+	color: @bx-color-font-block-title;
+}
+.bx-db-divider {
+	border-top:@bx-height-block-title-div @bx-border-type @bx-color-block-title-div;
+}
+
+
+/* box */
+.bx-def-box {
+    border-width: @bx-border-width-box;
+    border-style: @bx-border-type;
+    border-color: @bx-color-border-box;
+}
+.bx-def-box.bx-def-padding {
+    padding: @bx-content-padding-card;
+}
+.bx-def-box.bx-def-color-bg-box {
+    .background-color (@bx-color-box);
+}
+.bx-def-box.bx-def-color-bg-box-active,
+.bx-def-box.bx-def-color-bg-box-hover:hover {
+    .background-color (@bx-color-box-hover);
+}
+.bx-def-box-round-corners,
+.bx-def-box.bx-def-round-corners {
+    border-radius: @bx-border-radius-box;
+    background-clip: padding-box;
+}
+.bx-def-box-round-corners-int {
+    border-radius: @bx-border-radius-box-itl @bx-border-radius-box-itr @bx-border-radius-box-ibr @bx-border-radius-box-ibl;
+    background-clip: padding-box;
+}
+.bx-def-box-round-corners-int-top {
+    border-radius: @bx-border-radius-box-itl @bx-border-radius-box-itr 0 0;
+    background-clip: padding-box;
+}
+.bx-def-box-round-corners-int-bottom {
+    border-radius: 0 0 @bx-border-radius-box-ibr @bx-border-radius-box-ibl;
+    background-clip: padding-box;
+}
+.bx-base-pofile-unit-with-cover .bx-def-round-corners .bx-base-pofile-unit-cover {
+    border-radius: @bx-border-radius-box-itl @bx-border-radius-box-itr 0 0;
+}
+.bx-base-text-unit.bx-base-text-unit-ext.bx-def-round-corners img.bx-base-text-unit-cover.bx-def-round-corners,
+.bx-base-text-unit.bx-base-text-unit-ext .bx-def-round-corners img.bx-base-text-unit-cover.bx-def-round-corners {
+    border-radius: @bx-border-radius-box-itl @bx-border-radius-box-itr 0 0;
+}
+.bx-base-text-unit.bx-base-text-unit-gallery.bx-def-round-corners .bx-base-text-unit-thumb.bx-def-round-corners,
+.bx-base-text-unit.bx-base-text-unit-gallery .bx-def-round-corners .bx-base-text-unit-thumb.bx-def-round-corners {
+    border-radius: @bx-border-radius-box-itl @bx-border-radius-box-itr 0 0;
+}
+
+/* popup */
+.bx-popup-border {
+    border-width: @bx-border-width-popup;
+    border-style: solid;
+    border-color: @bx-color-border-popup;
+
+    border-radius: @bx-border-radius-popup;
+    background-clip: padding-box;
+}
+.bx-popup-color-bg {
+    background-color: @bx-color-popup;
+
+    background-image: @bx-image-bg-popup;
+    background-repeat: @bx-image-bg-popup-repeat;
+    background-attachment: @bx-image-bg-popup-attachment;
+    background-size: @bx-image-bg-popup-size;
+}
+.bx-popup-content-indent {
+	padding: @bx-content-padding-popup;
+}
+.bx-popup-header {
+	padding: @bx-title-padding-popup;
+}
+.bx-popup-header-color-bg {
+	background-color: @bx-color-popup-title;
+}
+.bx-popup-header h2 {
+    line-height: 1.8rem;
+    font-family: @bx-font-family-popup-title;
+    font-size: @bx-font-size-popup-title;
+}
+.bx-popup-header h2,
+.bx-popup-header.bx-def-font-contrasted h2,
+.bx-popup-header .bx-popup-element-close,
+.bx-popup-header.bx-def-font-contrasted .bx-popup-element-close,
+.bx-popup-header .bx-popup-element-close .sys-icon,
+.bx-popup-header.bx-def-font-contrasted .bx-popup-element-close .sys-icon {
+	color: @bx-color-font-popup-title;
+}
+
+/* slide menu */
+.bx-popup-wrapper.bx-popup-slide-wrapper {
+	border-width: @bx-border-width-menu-slide;
+	border-style: solid;
+	border-color: @bx-color-border-menu-slide;
+
+	.background-color (@bx-color-menu-slide);
+
+	background-image: @bx-image-bg-menu-slide;
+	background-repeat: @bx-image-bg-menu-slide-repeat;
+	background-attachment: @bx-image-bg-menu-slide-attachment;
+    background-size: @bx-image-bg-menu-slide-size;
+}
+.bx-popup-wrapper.bx-popup-slide-wrapper.bx-def-padding {
+	padding: @bx-content-padding-menu-slide;
+}
+.bx-popup-wrapper.bx-popup-slide-wrapper li a {
+	text-shadow: @bx-shadow-font-menu-slide;
+
+	font-family: @bx-font-family-menu-slide;
+	font-size: @bx-font-size-menu-slide;
+	font-weight: @bx-font-weight-menu-slide;
+	color: @bx-font-color-menu-slide;
+}
+.bx-popup-wrapper.bx-popup-slide-wrapper li a:hover {
+	color: @bx-font-color-menu-slide-hover;
+}
+.bx-popup-wrapper.bx-popup-slide-wrapper li.bx-menu-tab-active a,
+.bx-popup-wrapper.bx-popup-slide-wrapper li.bx-menu-inter-act {
+	color: @bx-font-color-menu-slide-active;
+}
+
+/* main menu */
+#bx-sliding-menu-sys_site.bx-sliding-menu-main,
+#bx-sliding-menu-sys_add_content.bx-sliding-menu-main {
+    -webkit-box-shadow: @bx-shadow-menu-main;
+    -moz-box-shadow: @bx-shadow-menu-main;
+    box-shadow: @bx-shadow-menu-main;
+
+    border-width: @bx-border-width-menu-main;
+    border-style: solid;
+    border-color: @bx-color-border-menu-main;
+
+    background-color: @bx-color-menu-main;
+
+    background-image: @bx-image-bg-menu-main;
+    background-repeat: @bx-image-bg-menu-main-repeat;
+    background-attachment: @bx-image-bg-menu-main-attachment;
+    background-size: @bx-image-bg-menu-main-size;
+
+    text-align: center;
+}
+#bx-sliding-menu-sys_site.bx-sliding-menu-main .bx-sliding-menu-main-cnt,
+#bx-sliding-menu-sys_add_content.bx-sliding-menu-main .bx-sliding-menu-main-cnt {
+    padding: @bx-content-padding-menu-main;
+}
+#bx-sliding-menu-sys_site.bx-sliding-menu-main .bx-sliding-menu-main-cnt li a,
+#bx-sliding-menu-sys_add_content.bx-sliding-menu-main .bx-sliding-menu-main-cnt li a {
+	text-shadow: @bx-shadow-font-menu-main;
+
+	font-family: @bx-font-family-menu-main;
+	font-size: @bx-font-size-menu-main;
+	font-weight: @bx-font-weight-menu-main;
+	color: @bx-font-color-menu-main;
+}
+#bx-sliding-menu-sys_site.bx-sliding-menu-main .bx-sliding-menu-main-cnt li.bx-menu-tab-active a,
+#bx-sliding-menu-sys_add_content.bx-sliding-menu-main .bx-sliding-menu-main-cnt li.bx-menu-tab-active a {
+	color: @bx-font-color-menu-main-active;
+}
+#bx-sliding-menu-sys_site.bx-sliding-menu-main .bx-sliding-menu-main-cnt li a:hover,
+#bx-sliding-menu-sys_add_content.bx-sliding-menu-main .bx-sliding-menu-main-cnt li a:hover {
+	color: @bx-font-color-menu-main-hover;
+}
+
+/* account menu */
+#bx-sliding-menu-account.bx-sliding-menu-main {
+    -webkit-box-shadow: @bx-shadow-menu-account;
+    -moz-box-shadow: @bx-shadow-menu-account;
+    box-shadow: @bx-shadow-menu-account;
+
+    border-width: @bx-border-width-menu-account;
+    border-style: solid;
+    border-color: @bx-color-border-menu-account;
+
+    background-color: @bx-color-menu-account;
+
+    background-image: @bx-image-bg-menu-account;
+    background-repeat: @bx-image-bg-menu-account-repeat;
+    background-attachment: @bx-image-bg-menu-account-attachment;
+    background-size: @bx-image-bg-menu-account-size;
+}
+#bx-sliding-menu-account.bx-sliding-menu-main .bx-sliding-menu-main-cnt {
+    padding: @bx-content-padding-menu-account;
+}
+#bx-sliding-menu-account.bx-sliding-menu-main .bx-menu-account-popup li a {
+    text-shadow: @bx-shadow-font-menu-account;
+
+    font-family: @bx-font-family-menu-account;
+    font-size: @bx-font-size-menu-account;
+    font-weight: @bx-font-weight-menu-account;
+    color: @bx-font-color-menu-account;
+}
+#bx-sliding-menu-account.bx-sliding-menu-main .bx-menu-account-popup li.bx-menu-tab-active a {
+    color: @bx-font-color-menu-account-active;
+}
+#bx-sliding-menu-account.bx-sliding-menu-main .bx-menu-account-popup li a:hover {
+    color: @bx-font-color-menu-account-hover;
+}
+
+/* page menu */
+.bx-menu-main-bar-wrapper {
+    -webkit-box-shadow: @bx-shadow-menu-page;
+    -moz-box-shadow: @bx-shadow-menu-page;
+    box-shadow: @bx-shadow-menu-page;
+
+    border-width: @bx-border-width-menu-page;
+    border-style: solid;
+    border-color: @bx-color-border-menu-page;
+    border-bottom-right-radius: @bx-border-radius-block-br;
+    border-bottom-left-radius: @bx-border-radius-block-bl;
+
+    background-color: @bx-color-menu-page;
+
+    background-image: @bx-image-bg-menu-page;
+    background-repeat: @bx-image-bg-menu-page-repeat;
+    background-attachment: @bx-image-bg-menu-page-attachment;
+    background-size: @bx-image-bg-menu-page-size;
+    background-clip: border-box;
+}
+.bx-menu-main-bar-wrapper .bx-menu-main-submenu {
+	padding: @bx-content-padding-menu-page;
+}
+.bx-menu-main-bar-wrapper .bx-menu-main-submenu li a {
+	text-shadow: @bx-shadow-font-menu-page;
+
+	font-family: @bx-font-family-menu-page;
+	font-size: @bx-font-size-menu-page;
+	font-weight: @bx-font-weight-menu-page;
+	color: @bx-font-color-menu-page;
+}
+.bx-menu-main-bar-wrapper .bx-menu-main-submenu li a:hover {
+	color: @bx-font-color-menu-page-hover;
+}
+.bx-menu-main-bar-wrapper .bx-menu-main-submenu li.bx-menu-tab-active a {
+	color: @bx-font-color-menu-page-active;
+}
+
+/* form */
+.bx-form-value .bx-form-input-slider,
+.bx-form-value .bx-form-input-doublerange,
+.bx-form-value .bx-form-input-select_multiple,
+.bx-form-value .bx-form-input-select,
+.bx-form-value .bx-form-input-radio_set,
+.bx-form-value .bx-form-input-checkbox_set,
+.bx-form-value .bx-form-input-number,
+.bx-form-value .bx-form-input-time,
+.bx-form-value .bx-form-input-datepicker,
+.bx-form-value .bx-form-input-datetime,
+.bx-form-value .bx-form-input-textarea,
+.bx-form-value .bx-form-input-text,
+.bx-form-value .bx-form-input-wrapper-password {
+    .box-sizing(@base-input-box-sizing);
+
+    border-color: @bx-color-border-form-input;
+    border-width: @bx-border-width-form-input;
+
+    background-color: @bx-color-form-input;
+
+    -webkit-box-shadow: @bx-shadow-form-input;
+    -moz-box-shadow: @bx-shadow-form-input;
+    box-shadow: @bx-shadow-form-input;
+}
+.bx-form-value .bx-form-input-slider,
+.bx-form-value .bx-form-input-doublerange,
+.bx-form-value .bx-form-input-select,
+.bx-form-value .bx-form-input-number,
+.bx-form-value .bx-form-input-time,
+.bx-form-value .bx-form-input-datepicker,
+.bx-form-value .bx-form-input-datetime,
+.bx-form-value .bx-form-input-text,
+.bx-form-value .bx-form-input-wrapper-password {
+    height: @bx-height-form-input;
+}
+.bx-form-value .bx-form-input-text.bx-form-input-autotoken b {
+    line-height: @bx-height-form-input;
+}
+.bx-form-value .bx-form-input-text.bx-form-input-autotoken b .bx-def-thumb-size {
+    width: @bx-height-form-input;
+    height: @bx-height-form-input;
+    line-height: @bx-height-form-input;
+}
+.bx-form-value .bx-form-input-slider:focus,
+.bx-form-value .bx-form-input-doublerange:focus,
+.bx-form-value .bx-form-input-number:focus,
+.bx-form-value .bx-form-input-time:focus,
+.bx-form-value .bx-form-input-datepicker:focus,
+.bx-form-value .bx-form-input-datetime:focus,
+.bx-form-value .bx-form-input-textarea:focus,
+.bx-form-value .bx-form-input-text:focus,
+.bx-form-value .bx-form-input-wrapper-password.bx-form-input-focus {
+    border-color: @bx-color-border-form-input-active;
+    background-color: @bx-color-form-input-active;
+}
+
+.bx-form-value .bx-switcher-cont,
+.bx-grid-table .bx-switcher-cont {
+    border-color: @bx-color-border-form-input;
+    border-width: @bx-border-width-form-input;
+
+    background-color: @bx-color-form-input;
+
+    -webkit-box-shadow: @bx-shadow-form-input;
+    -moz-box-shadow: @bx-shadow-form-input;
+    box-shadow: @bx-shadow-form-input;
+}
+
+/* button large */
+.bx-btn,
+.bx-btn.bx-btn-primary {
+    .box-sizing(@base-input-box-sizing);
+
+    height: @bx-height-button;
+    line-height: (@bx-height-button - 0.2);
+
+    .background-color (@bx-color-button);
+
+    border-width: @bx-border-width-button;
+    border-style: solid;
+    border-color: @bx-color-border-button;
+
+    border-radius: @bx-border-radius-button;
+    background-clip: padding-box;
+
+    text-shadow: @bx-shadow-font-button;
+
+    font-family: @bx-font-family-button;
+    font-size: @bx-font-size-button;
+    font-weight: @bx-font-weight-button;
+    color: @bx-font-color-button;
+}
+.bx-btn-height {
+    height: @bx-height-button;
+    line-height: (@bx-height-button - 0.2);
+}
+.bx-btn-border {
+    border-width: @bx-border-width-button;
+    border-style: solid;
+    border-color: transparent;
+}
+.bx-btn:hover,
+.bx-btn:active,
+.bx-btn.bx-btn-primary:hover,
+.bx-btn.bx-btn-primary:active {
+    border-width: @bx-border-width-button;
+    border-style: solid;
+    border-color: @bx-color-border-button-hover;
+
+    .background-color (@bx-color-button-hover);
+
+    color: @bx-font-color-button-hover;
+}
+.bx-btn .sys-icon:not(.sys-colored) {
+    color: @bx-font-color-button;
+}
+.bx-btn:hover .sys-icon:not(.sys-colored),
+.bx-btn:active .sys-icon:not(.sys-colored),
+.bx-btn.bx-btn-primary:hover .sys-icon:not(.sys-colored),
+.bx-btn.bx-btn-primary:active .sys-icon:not(.sys-colored) {
+    color: @bx-font-color-button-hover;
+}
+.bx-btn .bx-loading-ajax-btn,
+.bx-btn.bx-btn-primary .bx-loading-ajax-btn {
+    margin-top: -@bx-border-width-button;
+}
+
+/* button small */
+.bx-btn.bx-btn-small {
+    .box-sizing(@base-input-box-sizing);
+
+    height: @bx-height-button-small;
+    line-height: (@bx-height-button-small - 0.1);
+
+    .background-color (@bx-color-button-small);
+
+    border-width: @bx-border-width-button-small;
+    border-style: solid;
+    border-color: @bx-color-border-button-small;
+
+    border-radius: @bx-border-radius-button-small;
+    background-clip: padding-box;
+
+    text-shadow: @bx-shadow-font-button-small;
+
+    font-family: @bx-font-family-button-small;
+    font-size: @bx-font-size-button-small;
+    font-weight: @bx-font-weight-button-small;
+    color: @bx-font-color-button-small;
+}
+.bx-btn-small-height {
+    height: @bx-height-button-small;
+    line-height: (@bx-height-button-small - 0.1);
+}
+.bx-btn-small-border {
+    border-width: @bx-border-width-button-small;
+    border-style: solid;
+    border-color: transparent;
+}
+.bx-btn.bx-btn-small:hover,
+.bx-btn.bx-btn-small:active {
+    border-width: @bx-border-width-button-small;
+    border-style: solid;
+    border-color: @bx-color-border-button-small-hover;
+
+    .background-color (@bx-color-button-small-hover);
+
+    color: @bx-font-color-button-small-hover;
+}
+.bx-btn.bx-btn-small .sys-icon {
+    color: @bx-font-color-button-small;
+}
+.bx-btn.bx-btn-small:hover .sys-icon,
+.bx-btn.bx-btn-small:active .sys-icon {
+    color: @bx-font-color-button-small-hover;
+}
+.bx-btn.bx-btn-small .bx-loading-ajax-btn {
+    margin-top: -@bx-border-width-button-small;
+}
+
+/* colors */
+.bx-def-color-bg-hl,
+.bx-def-color-bg-hl-even:nth-child(even),
+.bx-def-color-bg-hl-hover:hover {
+    -webkit-transition: background-color 0.2s ease-in-out;
+    -moz-transition: background-color 0.2s ease-in-out;
+    -o-transition: background-color 0.2s ease-in-out;
+    transition: background-color 0.2s ease-in-out;
+}
+
+
+/* grid */
+.bx-def-color-bg-page .bx-grid-table-wrapper2:before {
+    background: @bx-color-page-gradient-left;
+}
+.bx-def-color-bg-page .bx-grid-table-wrapper2:after {
+    background: @bx-color-page-gradient-right;
+}
+
+.bx-def-color-bg-block .bx-grid-table-wrapper2:before {
+    background: @bx-color-block-gradient-left;
+}
+.bx-def-color-bg-block .bx-grid-table-wrapper2:after {
+    background: @bx-color-block-gradient-right;
+}

+ 68 - 0
modules/boonex/protean/updates/11.0.2_11.0.3/source/install/config.php

@@ -0,0 +1,68 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Protean Protean template
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_TEMPLATE,
+    'name' => 'bx_protean',
+    'title' => 'Protean',
+    'note' => 'Design template',
+    'version' => '11.0.3',
+    'vendor' => 'Boonex',
+    'help_url' => 'http://feed.una.io/?section={module_name}',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/protean/',
+    'home_uri' => 'protean',
+
+    'db_prefix' => 'bx_protean_',
+    'class_prefix' => 'BxProtean',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Boonex Protean Template',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+    	'clear_db_cache' => 1
+    ),
+    'uninstall' => array (
+        'execute_sql' => 1,
+        'update_languages' => 1,
+    	'clear_db_cache' => 1
+    ),
+    'enable' => array(
+        'execute_sql' => 1
+    ),
+    'disable' => array(
+        'execute_sql' => 1
+    ),
+
+    /**
+     * Dependencies Section
+     */
+    'dependencies' => array(),
+);
+
+/** @} */

Разница между файлами не показана из-за своего большого размера
+ 1131 - 0
modules/boonex/protean/updates/11.0.2_11.0.3/source/install/sql/install.sql


+ 56 - 0
modules/boonex/russian/updates/11.0.3_11.0.4/install/config.php

@@ -0,0 +1,56 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'title' => 'Russian',
+    'version_from' => '11.0.3',
+    'version_to' => '11.0.4',
+    'vendor' => 'BoonEx',
+
+    'compatible_with' => array(
+        '11.0.x'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/russian/updates/update_11.0.3_11.0.4/',
+    'home_uri' => 'ru_update_1103_1104',
+
+    'module_dir' => 'boonex/russian/',
+    'module_uri' => 'ru',
+
+    'db_prefix' => 'bx_rsn_',
+    'class_prefix' => 'BxRsn',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 0,
+        'update_files' => 1,
+        'update_languages' => 1,
+        'restore_languages' => 0,
+        'clear_db_cache' => 0,
+    ),
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => array(
+        array('name' => 'Accounts', 'path' => 'bx_accounts/'),
+        array('name' => 'Timeline', 'path' => 'bx_timeline/'),
+        array('name' => 'System', 'path' => 'system/'),
+    ),
+
+    /**
+     * Files Section
+     */
+    'delete_files' => array(),
+);

+ 13 - 0
modules/boonex/russian/updates/11.0.3_11.0.4/install/installer.php

@@ -0,0 +1,13 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+class BxRsnUpdater extends BxDolStudioUpdater
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+}

+ 4 - 0
modules/boonex/russian/updates/11.0.3_11.0.4/install/langs/bx_accounts/ru.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources name="ru" flag="ru" title="Russian">
+	<string_add name="_bx_accnt_grid_column_title_adm_added"><![CDATA[Создана]]></string_add>
+</resources>

+ 4 - 0
modules/boonex/russian/updates/11.0.3_11.0.4/install/langs/bx_timeline/ru.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources name="ru" flag="ru" title="Russian">
+	<string_add name="_bx_timeline_form_post_display_view"><![CDATA[Просмотреть сообщение (для индивидуальных полей)]]></string_add>
+</resources>

+ 15 - 0
modules/boonex/russian/updates/11.0.3_11.0.4/install/langs/system/ru.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources name="ru" flag="ru" title="Russian">
+	<string_add name="_unlimited"><![CDATA[без ограничений]]></string_add>
+	<string_add name="_adm_dsg_txt_logo_redefinition"><![CDATA[Заметка. Все лого параметры могут быть переопределены в активном на данный момент шаблонном приложении.]]></string_add>
+	<string_add name="_adm_form_dsc_field_privacy"><![CDATA[Отметьте, если для данного поля настройки "Конфиденциальности" могут быть изменены]]></string_add>
+	<string_add name="_adm_form_txt_field_privacy"><![CDATA[Конфиденциальность]]></string_add>
+	<string_add name="_adm_stg_cpt_option_sys_account_hide_unconfirmed_accounts"><![CDATA[Скрывать профили у неподтвержденных аккаунтов]]></string_add>
+	<string_add name="_sys_acl_action_set_form_fields_privacy"><![CDATA[Назначение приватности для полей форм]]></string_add>
+	<string_add name="_sys_acl_action_set_form_fields_privacy_desc"><![CDATA[Разрешать менять приватность для полей форм]]></string_add>
+	<string_add name="_sys_page_block_title_membership_stats"><![CDATA[Лимиты членства]]></string_add>
+	<string_add name="_sys_profile_storage_quota_size"><![CDATA[Хранилище]]></string_add>
+	<string_add name="_sys_profile_storage_quota_number"><![CDATA[Количество файлов]]></string_add>
+	<string_add name="_sys_privacy_forms_input_allow_view_to"><![CDATA[Видимость]]></string_add>
+	<string_add name="_sys_storage_files"><![CDATA[файл(ов)]]></string_add>
+</resources>

+ 87 - 0
modules/boonex/russian/updates/11.0.3_11.0.4/source/data/langs/bx_accounts/ru.xml

@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources name="ru" flag="ru" title="Russian">
+    <string name="_bx_accnt"><![CDATA[Аккаунты]]></string>
+    <string name="_bx_accounts"><![CDATA[Аккаунты]]></string>
+
+    <string name="_bx_accounts_form_display_account_settings_email_popup"><![CDATA[Изменить email]]></string>
+    <string name="_bx_accounts_form_display_account_create_popup"><![CDATA[Создать новый аккаунт]]></string>
+    <string name="_bx_accounts_form_display_account_settings_password_popup"><![CDATA[Сбросить пароль]]></string>
+
+    <string name="_bx_accnt_page_title_sys_manage_administration"><![CDATA[Управление всеми аккаунтами]]></string>
+    <string name="_bx_accnt_page_title_manage"><![CDATA[Управление аккаунтами]]></string>
+    <string name="_bx_accnt_page_title_browse"><![CDATA[Аккаунты]]></string>
+
+    <string name="_bx_accnt_page_block_title_system_manage_administration"><![CDATA[Управление всеми аккаунтами]]></string>
+    <string name="_bx_accnt_page_block_title_manage"><![CDATA[Управление аккаунтами]]></string>
+
+    <string name="_bx_accnt_menu_set_title_manage_tools"><![CDATA[Управление меню инструментов]]></string>
+    <string name="_bx_accnt_menu_title_manage_tools"><![CDATA[Управление меню инструментов]]></string>
+    <string name="_bx_accnt_menu_item_title_system_edit_email"><![CDATA[Изменить email]]></string>
+    <string name="_bx_accnt_menu_item_title_edit_email"><![CDATA[Изменить email]]></string>
+    <string name="_bx_accnt_menu_item_title_system_resend_cemail"><![CDATA[Переслать подтверждение]]></string>
+    <string name="_bx_accnt_menu_item_title_resend_cemail"><![CDATA[Переслать подтверждение]]></string>
+    <string name="_bx_accnt_menu_item_title_system_confirm"><![CDATA[Подтвердить]]></string>
+    <string name="_bx_accnt_menu_item_title_confirm"><![CDATA[Подтвердить]]></string>
+    <string name="_bx_accnt_menu_item_title_system_reset_password"><![CDATA[Сбросить пароль]]></string>
+    <string name="_bx_accnt_menu_item_title_reset_password"><![CDATA[Сбросить пароль]]></string>
+    <string name="_bx_accnt_menu_item_title_system_unlock_account"><![CDATA[Разблокировать]]></string>
+    <string name="_bx_accnt_menu_item_title_unlock_account"><![CDATA[Разблокировать]]></string>
+    <string name="_bx_accnt_menu_item_title_system_delete"><![CDATA[Удалить]]></string>
+    <string name="_bx_accnt_menu_item_title_delete"><![CDATA[Удалить]]></string>
+    <string name="_bx_accnt_menu_item_title_system_delete_with_content"><![CDATA[Удалить вместе с содержимым]]></string>
+    <string name="_bx_accnt_menu_item_title_delete_with_content"><![CDATA[Удалить вместе с содержимым]]></string>
+    <string name="_bx_accnt_menu_item_title_system_make_operator"><![CDATA[Дать доступ Оператора]]></string>
+    <string name="_bx_accnt_menu_item_title_make_operator"><![CDATA[Дать доступ Оператора]]></string>
+    <string name="_bx_accnt_menu_item_title_system_unmake_operator"><![CDATA[Отменить доступ Оператора]]></string>
+    <string name="_bx_accnt_menu_item_title_unmake_operator"><![CDATA[Отменить доступ Оператора]]></string>
+    <string name="_bx_accnt_menu_item_title_system_admt_accounts"><![CDATA[Аккаунты]]></string>
+    <string name="_bx_accnt_menu_item_title_admt_accounts"><![CDATA[Аккаунты]]></string>
+    <string name="_bx_accnt_menu_item_title_manage"><![CDATA[Управление]]></string>
+    <string name="_bx_accnt_menu_dashboard_manage_tools_addon_counter1_caption"><![CDATA[неподтверждено]]></string>
+
+    <string name="_bx_accnt_acl_action_edit_any_account"><![CDATA[Редактировать мой аккаунт]]></string>
+
+    <string name="_bx_accnt_grid_filter_item_title_adm_select_one_filter1"><![CDATA[Все статусы]]></string>
+    <string name="_bx_accnt_grid_filter_item_title_adm_select_one_filter2"><![CDATA[Все]]></string>
+    <string name="_bx_accnt_grid_filter_item_title_adm_active"><![CDATA[Активный]]></string>
+    <string name="_bx_accnt_grid_filter_item_title_adm_operators"><![CDATA[Операторы]]></string>
+    <string name="_bx_accnt_grid_filter_item_title_adm_pending"><![CDATA[Неактивный]]></string>
+    <string name="_bx_accnt_grid_filter_item_title_adm_suspended"><![CDATA[Приостановленный]]></string>
+    <string name="_bx_accnt_grid_filter_item_title_adm_unconfirmed"><![CDATA[Неподтверждённый]]></string>
+    <string name="_bx_accnt_grid_filter_item_title_adm_locked"><![CDATA[Заблокированный]]></string>
+
+    <string name="_bx_accnt_grid_column_title_adm_active"><![CDATA[Активный]]></string>
+    <string name="_bx_accnt_grid_column_title_adm_name"><![CDATA[Имя]]></string>
+    <string name="_bx_accnt_grid_column_title_adm_email"><![CDATA[Email]]></string>
+    <string name="_bx_accnt_grid_column_title_adm_ip"><![CDATA[IP]]></string>
+    <string name="_bx_accnt_grid_column_title_adm_is_confirmed"><![CDATA[Подтверждён]]></string>
+    <string name="_bx_accnt_grid_column_title_adm_profiles"><![CDATA[Профили]]></string>
+    <string name="_bx_accnt_grid_column_title_adm_logged"><![CDATA[Последнее посещение]]></string>
+    <string name="_bx_accnt_grid_column_title_adm_added"><![CDATA[Создана]]></string>
+    <string name="_bx_accnt_grid_action_title_adm_activate"><![CDATA[Активировать]]></string>
+    <string name="_bx_accnt_grid_action_title_adm_suspend"><![CDATA[Заблокировать]]></string>
+    <string name="_bx_accnt_grid_action_title_adm_confirm"><![CDATA[Подтвердить]]></string>
+    <string name="_bx_accnt_grid_action_title_adm_edit_email"><![CDATA[Изменить email]]></string>
+    <string name="_bx_accnt_grid_action_title_adm_resend_cemail"><![CDATA[Переслать подтверждение]]></string>
+    <string name="_bx_accnt_grid_action_title_adm_reset_password"><![CDATA[Сбросить пароль]]></string>
+    <string name="_bx_accnt_grid_action_title_adm_unlock_account"><![CDATA[Разблокировать]]></string>
+    <string name="_bx_accnt_grid_action_title_adm_delete"><![CDATA[Удалить]]></string>
+    <string name="_bx_accnt_grid_action_title_adm_delete_with_content"><![CDATA[Удалить вместе с содержимым]]></string>
+    <string name="_bx_accnt_grid_action_title_adm_more_actions"><![CDATA[Дополнительно]]></string>
+    <string name="_bx_accnt_grid_action_title_adm_more_add"><![CDATA[Добавить новый]]></string>
+    <string name="_bx_accnt_grid_action_err_delete"><![CDATA[Невозможно удалить выбранный(ные) аккаунт(ы).]]></string>
+    <string name="_bx_accnt_grid_action_err_perform"><![CDATA[Невозможно выполнить действие для выбранного(ных) аккаунта(ов).]]></string>
+    <string name="_bx_accnt_grid_action_unlock_successed"><![CDATA[Успешно разблокирован]]></string>
+    <string name="_bx_accnt_grid_action_unlock_error"><![CDATA[Аккаунт не является заблокированным]]></string>
+    <string name="_bx_accnt_grid_confirmation_status_none"><![CDATA[Нет]]></string>
+    <string name="_bx_accnt_grid_confirmation_status_email"><![CDATA[Email]]></string>
+    <string name="_bx_accnt_grid_confirmation_status_phone"><![CDATA[Телефон]]></string>
+    <string name="_bx_accnt_grid_confirmation_status_email_and_phone"><![CDATA[Все]]></string>
+
+    <string name="_bx_accnt_form_login_input_caption_system_email_confirmed"><![CDATA[Email подтвержден]]></string>
+    <string name="_bx_accnt_form_account_input_email_confirmed"><![CDATA[Email подтвержден]]></string>
+
+    <string name="_bx_accnt_txt_more"><![CDATA[{0} ещё]]></string>
+    <string name="_bx_accnt_txt_see_more"><![CDATA[Ещё]]></string>
+    <string name="_bx_accnt_txt_copy_to_clipboard"><![CDATA[Скопировать]]></string>
+</resources>

+ 303 - 0
modules/boonex/russian/updates/11.0.3_11.0.4/source/data/langs/bx_timeline/ru.xml

@@ -0,0 +1,303 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources name="ru" flag="ru" title="Russian">
+    <string name="_bx_timeline"><![CDATA[Лента]]></string>
+    <string name="_bx_timeline_cmts"><![CDATA[Лента - Комментарии]]></string>
+    <string name="_bx_timeline_reactions"><![CDATA[Лента - Реакции]]></string>
+
+    <string name="_bx_timeline_option_enable_edit"><![CDATA[Разрешить пользователю изменять собственные сообщения]]></string>
+    <string name="_bx_timeline_option_enable_delete"><![CDATA[Разрешить владельцу ленты удалять сообщения]]></string>
+    <string name="_bx_timeline_option_enable_show_all"><![CDATA[Показывать все сообщения в 'Общей хронике', включая те, что были написаны в персональных Хрониках]]></string>
+    <string name="_bx_timeline_option_enable_count_all_views"><![CDATA[Считать просмотры для всех событий в хронике]]></string>
+    <string name="_bx_timeline_option_events_per_page_profile"><![CDATA[Количество элементов на странице профайла]]></string>
+    <string name="_bx_timeline_option_events_per_page_account"><![CDATA[Количество элементов на странице "панель аккаунта"]]></string>
+    <string name="_bx_timeline_option_events_per_page_home"><![CDATA[Количество элементов на главной странице сайта]]></string>
+    <string name="_bx_timeline_option_events_per_page"><![CDATA[Количество элементов на странице]]></string>
+    <string name="_bx_timeline_option_enable_infinite_scroll"><![CDATA[Включить 'Бесконечную прокрутку' (экспериментально)]]></string>
+    <string name="_bx_timeline_option_events_per_preload"><![CDATA[Бесконечная прокрутка: Количество элементов, получаемых при авто-подгрузке]]></string>
+    <string name="_bx_timeline_option_auto_preloads"><![CDATA[Бесконечная прокрутка: Количество авто-подгрузок]]></string>
+    <string name="_bx_timeline_option_rss_length"><![CDATA[Количество элементов в RSS-ленте]]></string>
+    <string name="_bx_timeline_option_events_hide"><![CDATA[Показывать события]]></string>
+    <string name="_bx_timeline_option_videos_autoplay"><![CDATA[Автоматически проигрывать видео ролики (доступно только для Ленты)]]></string>
+    <string name="_bx_timeline_option_videos_autoplay_off"><![CDATA[Отключено]]></string>
+    <string name="_bx_timeline_option_videos_autoplay_on_mute"><![CDATA[Включено (без звука)]]></string>
+    <string name="_bx_timeline_option_videos_autoplay_on"><![CDATA[Включено (cо звуком)]]></string>
+    <string name="_bx_timeline_option_preload_comments"><![CDATA[Количество предварительно загруженных комментариев (до 7 штук)]]></string>
+    <string name="_bx_timeline_option_enable_jump_to_switcher"><![CDATA[Показывать переключатель 'Перейти к']]></string>
+    <string name="_bx_timeline_option_attachments_layout"><![CDATA[Показывать вложения как]]></string>
+    <string name="_bx_timeline_option_attachments_layout_gallery"><![CDATA[Галерея]]></string>
+    <string name="_bx_timeline_option_attachments_layout_showcase"><![CDATA[Витрина]]></string>
+    <string name="_bx_timeline_option_enable_hot"><![CDATA[Включить сбор данных для листа 'горячих' сообщений]]></string>
+    <string name="_bx_timeline_option_hot_interval"><![CDATA[Интервал времени (в часах) для получения 'горячих' сообщений]]></string>
+    <string name="_bx_timeline_option_enable_cache_item"><![CDATA[Включить кэш элемента]]></string>
+    <string name="_bx_timeline_option_cache_item_engine"><![CDATA[Механизм кэширования элемента (отличный от FileHtml может потребовать дополнительную настройку сервера)]]></string>
+    <string name="_bx_timeline_option_cache_item_lifetime"><![CDATA[Время жизни кэша элемента]]></string>
+    <string name="_bx_timeline_option_enable_cache_list"><![CDATA[Включить кэш хроники]]></string>
+    <string name="_bx_timeline_option_enable_editor_toolbar"><![CDATA[Включить панель инструментов в форме создания сообщения]]></string>
+
+    <string name="_bx_timeline_form_post"><![CDATA[Сообщение]]></string>
+    <string name="_bx_timeline_form_post_display_add"><![CDATA[Написать сообщение]]></string>
+    <string name="_bx_timeline_form_post_display_add_public"><![CDATA[Написать публичное сообщение]]></string>
+    <string name="_bx_timeline_form_post_display_add_profile"><![CDATA[Написать сообщение в профиль]]></string>
+    <string name="_bx_timeline_form_post_display_edit"><![CDATA[Изменить сообщение]]></string>
+    <string name="_bx_timeline_form_post_display_view"><![CDATA[Просмотреть сообщение (для индивидуальных полей)]]></string>
+    <string name="_bx_timeline_form_post_input_sys_owner_id"><![CDATA[ID владельца]]></string>
+    <string name="_bx_timeline_form_post_input_owner_id_own"><![CDATA[Собственный профиль]]></string>
+    <string name="_bx_timeline_form_post_input_owner_id_following_group"><![CDATA[{0}]]></string>
+    <string name="_bx_timeline_form_post_input_sys_action"><![CDATA[Действие]]></string>
+    <string name="_bx_timeline_form_post_input_sys_type"><![CDATA[Тип]]></string>
+    <string name="_bx_timeline_form_post_input_sys_text"><![CDATA[Содержимое]]></string>
+    <string name="_bx_timeline_form_post_input_text"><![CDATA[]]></string>
+    <string name="_bx_timeline_form_post_input_sys_object_privacy_view"><![CDATA[Видимость]]></string>
+    <string name="_bx_timeline_form_post_input_object_privacy_view"><![CDATA[Видимость]]></string>
+    <string name="_bx_timeline_form_post_input_sys_date"><![CDATA[Создано]]></string>
+    <string name="_bx_timeline_form_post_input_date"><![CDATA[Создано]]></string>
+    <string name="_bx_timeline_form_post_input_sys_date_published"><![CDATA[Время публикации]]></string>
+    <string name="_bx_timeline_form_post_input_date_published"><![CDATA[Время публикации]]></string>
+    <string name="_bx_timeline_form_post_input_date_published_info"><![CDATA[Оставьте пустым, чтобы опубликовать немедленно.]]></string>
+    <string name="_bx_timeline_form_post_input_sys_link"><![CDATA[Ссылка]]></string>
+    <string name="_bx_timeline_form_post_input_link_alt"><![CDATA[Добавить ссылку]]></string>
+    <string name="_bx_timeline_form_post_input_link_err_delete"><![CDATA[Невозможно удалить ссылку. Пожалуйста, оповестите нас о проблеме.]]></string>
+    <string name="_bx_timeline_form_post_input_sys_photo"><![CDATA[Фото]]></string>
+    <string name="_bx_timeline_form_post_input_photo"><![CDATA[]]></string>
+    <string name="_bx_timeline_form_post_input_photo_alt"><![CDATA[Добавить фото]]></string>
+    <string name="_bx_timeline_form_post_input_sys_video"><![CDATA[Видео]]></string>
+    <string name="_bx_timeline_form_post_input_video"><![CDATA[]]></string>
+    <string name="_bx_timeline_form_post_input_video_alt"><![CDATA[Добавить видео]]></string>
+    <string name="_bx_timeline_form_post_input_sys_attachments"><![CDATA[Прикрепления]]></string>
+    <string name="_bx_timeline_form_post_input_sys_do_submit"><![CDATA[Создать]]></string>
+    <string name="_bx_timeline_form_post_input_do_submit"><![CDATA[Создать]]></string>
+    <string name="_bx_timeline_form_post_input_sys_do_cancel"><![CDATA[Отмена]]></string>
+    <string name="_bx_timeline_form_post_input_do_cancel"><![CDATA[Отмена]]></string>
+
+    <string name="_bx_timeline_form_attach_link"><![CDATA[Прикрепить ссылку]]></string>
+    <string name="_bx_timeline_form_attach_link_display_add"><![CDATA[Прикрепить ссылку]]></string>
+    <string name="_bx_timeline_form_attach_link_input_sys_url"><![CDATA[Url]]></string>
+    <string name="_bx_timeline_form_attach_link_input_url"><![CDATA[Добавить ссылку]]></string>
+    <string name="_bx_timeline_form_attach_link_input_url_err"><![CDATA[Необходима правильная ссылка. Пожалуйста, заполните это поле.]]></string>
+    <string name="_bx_timeline_form_attach_link_input_sys_do_submit"><![CDATA[Добавить]]></string>
+    <string name="_bx_timeline_form_attach_link_input_do_submit"><![CDATA[Добавить]]></string>
+    <string name="_bx_timeline_form_attach_link_input_do_cancel"><![CDATA[Закрыть]]></string>
+
+    <string name="_bx_timeline_privacy_view"><![CDATA[Просматривать события]]></string>
+
+    <string name="_bx_timeline_acl_action_post"><![CDATA[Писать сообщения]]></string>
+    <string name="_bx_timeline_acl_action_edit"><![CDATA[Изменять любое сообщение]]></string>
+    <string name="_bx_timeline_acl_action_delete"><![CDATA[Удалять любое сообщение]]></string>
+    <string name="_bx_timeline_acl_action_vote"><![CDATA[Голосовать]]></string>
+    <string name="_bx_timeline_acl_action_repost"><![CDATA[Делать репост]]></string>
+    <string name="_bx_timeline_acl_action_send"><![CDATA[Послать]]></string>
+    <string name="_bx_timeline_acl_action_pin"><![CDATA['Приколоть тут' любое сообщение]]></string>
+    <string name="_bx_timeline_acl_action_stick"><![CDATA['Приколоть для всех' любое сообщение]]></string>
+    <string name="_bx_timeline_acl_action_promote"><![CDATA[Рекламировать любое сообщение]]></string>
+
+    <!-- Pages -->
+    <string name="_bx_timeline_page_title_sys_view"><![CDATA[Хроника новостей профайла]]></string>
+    <string name="_bx_timeline_page_title_view"><![CDATA[Хроника новостей профайла]]></string>
+    <string name="_bx_timeline_page_title_sys_view_home"><![CDATA[Общая хроника новостей]]></string>
+    <string name="_bx_timeline_page_title_view_home"><![CDATA[Общая хроника новостей]]></string>
+    <string name="_bx_timeline_page_title_sys_view_hot"><![CDATA[Хроника 'горячих' новостей]]></string>
+    <string name="_bx_timeline_page_title_view_hot"><![CDATA[Хроника 'горячих' новостей]]></string>
+    <string name="_bx_timeline_page_title_sys_item"><![CDATA[Элемент хроники]]></string>
+    <string name="_bx_timeline_page_title_item"><![CDATA[Элемент хроники]]></string>
+    <string name="_bx_timeline_page_title_sys_item_brief"><![CDATA[Предпросмотр элемента хроники]]></string>
+    <string name="_bx_timeline_page_title_item_brief"><![CDATA[Предпросмотр элемента хроники]]></string>
+    <string name="_bx_timeline_page_title_sys_account"><![CDATA[Хроника новостей]]></string>
+    <string name="_bx_timeline_page_title_sys_manage_administration"><![CDATA[Управление всеми событями ленты]]></string>
+    <string name="_bx_timeline_page_title_manage"><![CDATA[Управление]]></string>
+    <string name="_bx_timeline_page_title_account"><![CDATA[Хроника новостей]]></string>
+    <string name="_bx_timeline_page_block_title_system_post_profile"><![CDATA[Создать публикацию (в контекст)]]></string>
+    <string name="_bx_timeline_page_block_title_post_profile"><![CDATA[Создать публикацию]]></string>
+    <string name="_bx_timeline_page_block_title_system_view_profile"><![CDATA[Хроника новостей профайла (лента)]]></string>
+    <string name="_bx_timeline_page_block_title_view_profile"><![CDATA[Хроника новостей профайла]]></string>
+    <string name="_bx_timeline_page_block_title_system_view_profile_outline"><![CDATA[Хроника новостей профайла (сводка)]]></string>
+    <string name="_bx_timeline_page_block_title_view_profile_outline"><![CDATA[Хроника новостей профайла]]></string>
+    <string name="_bx_timeline_page_block_title_item"><![CDATA[Элемент]]></string>
+    <string name="_bx_timeline_page_block_title_item_content"><![CDATA[Содержимое]]></string>
+    <string name="_bx_timeline_page_block_title_item_info"><![CDATA[Информация]]></string>
+    <string name="_bx_timeline_page_block_title_item_comments"><![CDATA[Комментарии]]></string>
+    <string name="_bx_timeline_page_block_title_system_post_account"><![CDATA[Создать публикацию]]></string>
+    <string name="_bx_timeline_page_block_title_post_account"><![CDATA[Создать публикацию]]></string>
+    <string name="_bx_timeline_page_block_title_system_view_account"><![CDATA[Хроника новостей (лента)]]></string>
+    <string name="_bx_timeline_page_block_title_view_account"><![CDATA[Хроника новостей]]></string>
+    <string name="_bx_timeline_page_block_title_system_view_account_outline"><![CDATA[Хроника новостей (сводка)]]></string>
+    <string name="_bx_timeline_page_block_title_view_account_outline"><![CDATA[Хроника новостей]]></string>
+    <string name="_bx_timeline_page_block_title_system_views_timeline"><![CDATA[Все хроники (лента)]]></string>
+    <string name="_bx_timeline_page_block_title_views_timeline"><![CDATA[Хроники]]></string>
+    <string name="_bx_timeline_page_block_title_system_views_outline"><![CDATA[Все хроники (сводка)]]></string>
+    <string name="_bx_timeline_page_block_title_views_outline"><![CDATA[Хроники]]></string>
+    <string name="_bx_timeline_page_block_title_system_post_home"><![CDATA[Создать публичную публикацию]]></string>
+    <string name="_bx_timeline_page_block_title_post_home"><![CDATA[Создать публикацию]]></string>
+    <string name="_bx_timeline_page_block_title_system_view_home"><![CDATA[Общая хроника новостей (лента)]]></string>
+    <string name="_bx_timeline_page_block_title_view_home"><![CDATA[Общая хроника новостей]]></string>
+    <string name="_bx_timeline_page_block_title_system_view_home_outline"><![CDATA[Общая хроника новостей (сводка)]]></string>
+    <string name="_bx_timeline_page_block_title_view_home_outline"><![CDATA[Общая хроника новостей]]></string>
+    <string name="_bx_timeline_page_block_title_system_view_hot"><![CDATA[Хроника 'горячих' новостей (лента)]]></string>
+    <string name="_bx_timeline_page_block_title_view_hot"><![CDATA[Хроника 'горячих' новостей]]></string>
+    <string name="_bx_timeline_page_block_title_system_view_hot_outline"><![CDATA[Хроника 'горячих' новостей (сводка)]]></string>
+    <string name="_bx_timeline_page_block_title_view_hot_outline"><![CDATA[Хроника 'горячих' новостей]]></string>
+    <string name="_bx_timeline_page_block_title_browse_cmts"><![CDATA[Хроника новостей - Комментарии]]></string>
+    <string name="_bx_timeline_page_block_title_system_manage_administration"><![CDATA[Управление всеми событями ленты]]></string>
+    <string name="_bx_timeline_page_block_title_manage"><![CDATA[Управление]]></string>
+
+    <!-- Menus -->
+    <string name="_bx_timeline_menu_title_view"><![CDATA[Просмотр]]></string>
+    <string name="_bx_timeline_menu_set_title_view"><![CDATA[Просмотр]]></string>
+    <string name="_bx_timeline_menu_item_title_system_channels"><![CDATA[Каналы]]></string>
+    <string name="_bx_timeline_menu_item_title_channels"><![CDATA[Каналы]]></string>
+    <string name="_bx_timeline_menu_item_title_system_feed"><![CDATA[Хроника]]></string>
+    <string name="_bx_timeline_menu_item_title_feed"><![CDATA[Хроника]]></string>
+    <string name="_bx_timeline_menu_item_title_system_public"><![CDATA[Публичное]]></string>
+    <string name="_bx_timeline_menu_item_title_public"><![CDATA[Публичное]]></string>
+    <string name="_bx_timeline_menu_item_title_system_hot"><![CDATA[Популярное]]></string>
+    <string name="_bx_timeline_menu_item_title_hot"><![CDATA[Популярное]]></string>
+
+    <string name="_bx_timeline_menu_item_view_all"><![CDATA[Все сообщения]]></string>
+    <string name="_bx_timeline_menu_item_view_owner"><![CDATA[Сообщения от {0}]]></string>
+    <string name="_bx_timeline_menu_item_view_other"><![CDATA[Сообщения от других]]></string>
+    <string name="_bx_timeline_menu_item_get_rss"><![CDATA[RSS]]></string>
+
+    <string name="_bx_timeline_menu_title_item_share"><![CDATA[Поделиться]]></string>
+    <string name="_bx_timeline_menu_set_title_item_share"><![CDATA[Поделиться]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_repost"><![CDATA[Сделать репост]]></string>
+    <string name="_bx_timeline_menu_item_title_item_repost"><![CDATA[Сделать репост]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_send"><![CDATA[Послать]]></string>
+    <string name="_bx_timeline_menu_item_title_item_send"><![CDATA[Послать другу]]></string>
+    <string name="_bx_timeline_menu_item_title_system_admt_timeline"><![CDATA[Лента]]></string>
+    <string name="_bx_timeline_menu_item_title_admt_timeline"><![CDATA[Лента]]></string>
+
+    <string name="_bx_timeline_menu_title_item_manage"><![CDATA[Элемент - Управление]]></string>
+    <string name="_bx_timeline_menu_set_title_item_manage"><![CDATA[Элемент - Управление]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_pin"><![CDATA[Приколоть тут]]></string>
+    <string name="_bx_timeline_menu_item_title_item_pin"><![CDATA[Приколоть тут]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_unpin"><![CDATA[Отколоть тут]]]]></string>
+    <string name="_bx_timeline_menu_item_title_item_unpin"><![CDATA[Отколоть тут]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_stick"><![CDATA[Приколоть для всех]]></string>
+    <string name="_bx_timeline_menu_item_title_item_stick"><![CDATA[Приколоть для всех]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_unstick"><![CDATA[Отколоть для всех]]></string>
+    <string name="_bx_timeline_menu_item_title_item_unstick"><![CDATA[Отколоть для всех]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_promote"><![CDATA[Рекламировать]]></string>
+    <string name="_bx_timeline_menu_item_title_item_promote"><![CDATA[Рекламировать]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_unpromote"><![CDATA[Не рекламировать]]></string>
+    <string name="_bx_timeline_menu_item_title_item_unpromote"><![CDATA[Не рекламировать]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_edit"><![CDATA[Изменить]]></string>
+    <string name="_bx_timeline_menu_item_title_item_edit"><![CDATA[Изменить]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_delete"><![CDATA[Удалить]]></string>
+    <string name="_bx_timeline_menu_item_title_item_delete"><![CDATA[{delete_title}]]></string>
+    <string name="_bx_timeline_menu_item_title_item_delete_common"><![CDATA[Удалить]]></string>  
+    <string name="_bx_timeline_menu_item_title_item_delete_system"><![CDATA[Скрыть из хроник]]></string>
+
+    <string name="_bx_timeline_menu_title_item_actions"><![CDATA[Элемент - Действия]]></string>
+    <string name="_bx_timeline_menu_set_title_item_actions"><![CDATA[Элемент - Действия]]></string>
+    <string name="_bx_timeline_menu_title_item_actions_all"><![CDATA[Элемент - Все действия]]></string>
+    <string name="_bx_timeline_menu_set_title_item_actions_all"><![CDATA[Элемент - Все действия]]></string>
+    <string name="_bx_timeline_menu_title_item_counters"><![CDATA[Элемент - Счетчики]]></string>
+    <string name="_bx_timeline_menu_set_title_item_counters"><![CDATA[Элемент - Счетчики]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_comment"><![CDATA[Комментарий]]></string>
+    <string name="_bx_timeline_menu_item_title_item_comment"><![CDATA[Прокомментировать]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_view"><![CDATA[Посмотреть]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_vote"><![CDATA[Голосовать (Нравится)]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_score"><![CDATA[Голосовать (За/Против)]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_reaction"><![CDATA[Отреагировать]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_share"><![CDATA[Поделиться]]></string>
+    <string name="_bx_timeline_menu_item_title_item_share"><![CDATA[Поделиться]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_report"><![CDATA[Пожаловаться]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_more"><![CDATA[Дополнительные действия]]></string>
+    <string name="_bx_timeline_menu_item_title_item_more"><![CDATA[]]></string>
+
+    <string name="_bx_timeline_menu_title_post_attachments"><![CDATA[Форма - Прикрепления]]></string>
+    <string name="_bx_timeline_menu_set_title_post_attachments"><![CDATA[Форма - Прикрепления]]></string>
+    <string name="_bx_timeline_menu_item_title_system_add_emoji"><![CDATA[Добавить Emoji]]></string>
+    <string name="_bx_timeline_menu_item_title_add_emoji"><![CDATA[Добавить Emoji]]></string>
+    <string name="_bx_timeline_menu_item_title_system_add_link"><![CDATA[Добавить ссылку]]></string>
+    <string name="_bx_timeline_menu_item_title_add_link"><![CDATA[Добавить ссылку]]></string>
+    <string name="_bx_timeline_menu_item_title_system_add_photo_simple"><![CDATA[Добавить фото (Обычная загрузка)]]></string>
+    <string name="_bx_timeline_menu_item_title_system_add_photo_html5"><![CDATA[Добавить фото (Множественная загрузка)]]></string>
+    <string name="_bx_timeline_menu_item_title_add_photo"><![CDATA[Добавить фото]]></string>
+    <string name="_bx_timeline_menu_item_title_system_add_video_simple"><![CDATA[Добавить видео (Обычная загрузка)]]></string>
+    <string name="_bx_timeline_menu_item_title_system_add_video_html5"><![CDATA[Добавить видео (Множественная загрузка)]]></string>
+    <string name="_bx_timeline_menu_item_title_add_video"><![CDATA[Добавить видео]]></string>
+    <string name="_bx_timeline_menu_item_title_system_timeline"><![CDATA[Лента]]></string>
+    <string name="_bx_timeline_menu_item_title_timeline"><![CDATA[Лента]]></string>
+    <string name="_bx_timeline_menu_item_title_system_create_entry"><![CDATA[Статус]]></string>
+    <string name="_bx_timeline_menu_item_title_create_entry"><![CDATA[Статус]]></string>
+    <string name="_bx_timeline_menu_item_title_system_view_timeline_view"><![CDATA[Лента]]></string>
+    <string name="_bx_timeline_menu_item_title_view_timeline_view"><![CDATA[Лента]]></string>
+
+    <string name="_bx_timeline_grid_column_title_adm_active"><![CDATA[Активные]]></string>
+    <string name="_bx_timeline_grid_column_title_adm_description"><![CDATA[Событие]]></string>
+    <string name="_bx_timeline_grid_column_title_adm_added"><![CDATA[Добавлено]]></string>
+    <string name="_bx_timeline_grid_column_title_adm_author"><![CDATA[Автор]]></string>
+    <string name="_bx_timeline_grid_action_title_adm_delete"><![CDATA[Удалить]]></string>
+    <string name="_bx_timeline_grid_action_title_adm_audit_content"><![CDATA[Аудит действий]]></string>
+    <string name="_bx_timeline_grid_action_err_delete"><![CDATA[Невозможно удалить выбранную(ные) событие(я) ленты.]]></string>
+    <string name="_bx_timeline_grid_txt_account_manager"><![CDATA[Перенаправить в Управление аккаунтом.]]></string>
+
+    <string name="_bx_timeline_alert_module_timeline_common_post"><![CDATA[Лента (разместить)]]></string>
+    <string name="_bx_timeline_alert_module_timeline_common_repost"><![CDATA[Лента (сделать репост)]]></string>
+    <string name="_bx_timeline_alert_action_added"><![CDATA[добавить]]></string>
+    <string name="_bx_timeline_alert_action_post_common"><![CDATA[добавить сообщение]]></string>
+    <string name="_bx_timeline_alert_action_repost"><![CDATA[добавить репост]]></string>
+    <string name="_bx_timeline_alert_action_post_common_personal"><![CDATA[Новый контент]]></string>
+    <string name="_bx_timeline_alert_action_post_common_follow_member"><![CDATA[Новый контент]]></string>
+    <string name="_bx_timeline_alert_action_post_common_follow_context"><![CDATA[Новый контент]]></string>
+    <string name="_bx_timeline_alert_action_repost_follow_member"><![CDATA[Новый репост контента]]></string>
+    <string name="_bx_timeline_alert_action_repost_follow_context"><![CDATA[Новый репост контента]]></string>
+
+    <string name="_bx_timeline_txt_msg_no_results"><![CDATA[Пусто]]></string>
+    <string name="_bx_timeline_txt_msg_performed_action"><![CDATA[Действие было успешно выполнено.]]></string>
+    <string name="_bx_timeline_txt_msg_posted"><![CDATA[Успешно опубликовано.]]></string>
+    <string name="_bx_timeline_txt_err_cannot_perform_action"><![CDATA[Невозможно выполнить действие. Пожалуйста, оповестите нас об этой проблеме.]]></string>
+    <string name="_bx_timeline_txt_err_empty_post"><![CDATA[Сообщение пусто.]]></string>
+
+    <string name="_bx_timeline_txt_to"><![CDATA[в]]></string>
+    <string name="_bx_timeline_txt_load_more"><![CDATA[Загрузить ещё]]></string>
+    <string name="_bx_timeline_txt_loading"><![CDATA[Загрузка...]]></string>
+    <string name="_bx_timeline_txt_or_jump_to"><![CDATA[... или перейти к:]]></string>
+    <string name="_bx_timeline_txt_jump_to_n_year"><![CDATA[Перейти к {0} году]]></string>
+    <string name="_bx_timeline_txt_jump_to_recent"><![CDATA[Перейти к недавним сообщениям]]></string>
+    <string name="_bx_timeline_txt_status_deleted"><![CDATA[Удалено]]></string>
+    <string name="_bx_timeline_txt_hot"><![CDATA['Горячее' событие]]></string>
+    <string name="_bx_timeline_txt_pinned"><![CDATA[Приколотое событие]]></string>
+    <string name="_bx_timeline_txt_sticked"><![CDATA[Событие приколотое для всех]]></string>
+    <string name="_bx_timeline_txt_promoted"><![CDATA[Рекламируемое]]></string>
+    <string name="_bx_timeline_txt_note_scheduled_awaiting"><![CDATA[Дата публикации: {0}]]></string>
+    <string name="_bx_timeline_txt_note_processing_awaiting"><![CDATA[Обновление будет опубликована как только сконвертируется видео.]]></string>
+    <string name="_bx_timeline_txt_note_processing_failed"><![CDATA[Обновление не было опубликовано, тк произошла ошибка при конвертации видео. Обновите видео, чтобы решить проблему.]]></string>
+    <string name="_bx_timeline_txt_rss_caption"><![CDATA[Лента {0}]]></string>
+    <string name="_bx_timeline_txt_added_sample"><![CDATA[добавил {0}]]></string>
+    <string name="_bx_timeline_txt_user_added_sample"><![CDATA[{0} добавил {1}]]></string>
+    <string name="_bx_timeline_txt_user_repost"><![CDATA[Репост от {0}]]></string>
+    <string name="_bx_timeline_txt_user_reposted_user_sample"><![CDATA[{0} сделал репост {1} {2}]]></string>
+    <string name="_bx_timeline_txt_sample"><![CDATA[сообщение]]></string>
+    <string name="_bx_timeline_txt_sample_with_article"><![CDATA[сообщение]]></string>
+    <string name="_bx_timeline_txt_sample_ext"><![CDATA[сообщение в ленте]]></string>
+    <string name="_bx_timeline_txt_sample_comment_single"><![CDATA[комментарий к сообщению в ленте]]></string>
+    <string name="_bx_timeline_txt_sample_vote_single"><![CDATA[голос за сообщение в ленте]]></string>
+    <string name="_bx_timeline_txt_sample_reaction_single"><![CDATA[реакция '{0}' к сообщению в ленте]]></string>
+    <string name="_bx_timeline_txt_sample_score_up_single"><![CDATA[голос за сообщение в ленте]]></string>
+    <string name="_bx_timeline_txt_sample_score_down_single"><![CDATA[голос против сообщения в ленте]]></string>
+    <string name="_bx_timeline_txt_sample_with_link"><![CDATA[со ссылкой]]></string>
+    <string name="_bx_timeline_txt_sample_with_image"><![CDATA[с изображением]]></string>
+    <string name="_bx_timeline_txt_sample_with_video"><![CDATA[с видео]]></string>
+    <string name="_bx_timeline_txt_sample_with_media"><![CDATA[с медиа]]></string>
+    <string name="_bx_timeline_txt_today"><![CDATA[Сегодня]]></string>
+    <string name="_bx_timeline_txt_some_text_here"><![CDATA[Поделитесь своими мыслями]]></string>
+    <string name="_bx_timeline_txt_show"><![CDATA[Показать]]></string>
+    <string name="_bx_timeline_txt_new_content"><![CDATA[Новый контент]]></string>
+
+    <string name="_bx_timeline_txt_do_repost"><![CDATA[Сделать репост]]></string>
+    <string name="_bx_timeline_txt_reposted"><![CDATA[Сделал репост {0} {1}.]]></string>
+    <string name="_bx_timeline_txt_reposted_by"><![CDATA[Сделал репост]]></string>
+    <string name="_bx_timeline_txt_err_cannot_repost"><![CDATA[Невозможно сделать репост. Пожалуйста, сообщите нам об этой проблеме.]]></string>
+    <string name="_bx_timeline_txt_err_already_reposted"><![CDATA[Вы уже сделали репост этого элемента.]]></string>
+    <string name="_bx_timeline_txt_msg_success_repost"><![CDATA[Репост данного элемента был сделан успешно.]]></string>
+    <string name="_bx_timeline_txt_object_reposted"><![CDATA[<b class="bx-ntfs-content-profile">{owner_name}</b> - {entry_sample} <b class="bx-ntfs-content-entry">{entry_caption}</b>]]> (репост)</string>
+
+    <!-- EMAIL TEMPLATES -->
+    <string name="_bx_timeline_et_txt_name_send"><![CDATA[Послать другу.]]></string>
+    <string name="_bx_timeline_et_txt_subject_send"><![CDATA[Это может быть интересно для вас.]]></string>
+    <string name="_bx_timeline_et_txt_body_send"><![CDATA[{email_header}
+<p>Привет.</p>
+<p>Взгляните на <a href="{ViewLink}">это сообщение</a>, оно может быть интересно для вас.</p>
+{email_footer}]]></string>
+</resources>

+ 3146 - 0
modules/boonex/russian/updates/11.0.3_11.0.4/source/data/langs/system/ru.xml

@@ -0,0 +1,3146 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources name="ru" flag="ru" title="Russian">
+	<string name="_ADM_PROFILE_SEND_MSG"><![CDATA[Сообщение было удачно отправлено]]></string>
+	<string name="_ATT_ACTIVE_E"><![CDATA[Вы полноправный член нашего Сообщества. Но Вы можете заблокировать свой профиль, чтобы он был временно недоступен для других.]]></string>
+	<string name="_ATT_APPROVAL_E"><![CDATA[Активация Вашего профиля в процессе. Обычно это занимает до 24 часов. Спасибо за Ваше терпение.]]></string>
+	<string name="_ATT_REJECTED_E"><![CDATA[Ваш профиль быт отвергнут системным администратором, потому что он содержит неразрешённую или недостаточную информацию. Если у Вас есть вопросы, пожалуйста, <a target=_blank href="contact.php">напишите нам</a>. Не забудьте указать ID своего профиля.]]></string>
+	<string name="_ATT_SUSPENDED_E"><![CDATA[Ваш профиль временно не обслуживается {0} системой. Вы можете его активировать <a target=_blank href="change_status.php">здесь</a>. Если у Вас есть вопросы, пожалуйста, <a target=_blank href="contact.php">напишите Администратору</a>.]]></string>
+	<string name="_ATT_UNCONFIRMED_E"><![CDATA[Вам нужно нажать на ссылку, присланную в эл. сообщении, чтобы запросить активацию своего аккаунта. <br />Прислать мне <a target=_blank href="activation_email.php">письмо с подтверждением</a>.]]></string>
+	<string name="_Access denied"><![CDATA[Доступ запрещён]]></string>
+	<string name="_Action"><![CDATA[Действие]]></string>
+	<string name="_all"><![CDATA[Все]]></string>
+	<string name="_Allowed Since"><![CDATA[Разрешено с]]></string>
+	<string name="_Allowed Until"><![CDATA[Разрешено до]]></string>
+    <string name="_Allowed actions"><![CDATA[Разрешённые действия]]></string>
+    <string name="_anonymous"><![CDATA[Аноним]]></string>
+    <string name="_anonymous_f"><![CDATA[Аноним ({0})]]></string>
+	<string name="_Are_you_sure"><![CDATA[Вы уверены?]]></string>
+	<string name="_Auth type"><![CDATA[Тип авторизации]]></string>
+	<string name="_Basic"><![CDATA[Базовая]]></string>
+	<string name="_CONTACT_H"><![CDATA[Написать нам]]></string>
+	<string name="_CONTACT_H1"><![CDATA[Написать]]></string>
+	<string name="_Can not delete comments with replies"><![CDATA[Невозможно удалить комментарии с ответами]]></string>
+	<string name="_Cancel"><![CDATA[Отменить]]></string>
+	<string name="_Content"><![CDATA[Содержимое]]></string>
+	<string name="_Count"><![CDATA[Счётчик]]></string>
+	<string name="_DELETE_SUCCESS"><![CDATA[Ваш аккаунт был удачно удалён]]></string>
+	<string name="_DELETE_TEXT"><![CDATA[Всё Ваше содержимое будет удалено. Вы уверены, что ходите удалить свой аккаунт?]]></string>
+	<string name="_Date"><![CDATA[Дата]]></string>
+	<string name="_Delete"><![CDATA[Удалить]]></string>
+	<string name="_Delete account"><![CDATA[Удалить аккаунт]]></string>
+	<string name="_Description"><![CDATA[Описание]]></string>
+	<string name="_EXPLANATION_H"><![CDATA[Объяснение]]></string>
+	<string name="_Edit"><![CDATA[Редактировать]]></string>
+	<string name="_Email"><![CDATA[Email]]></string>
+	<string name="_Email sent failed"><![CDATA[Невозможно послать письмо]]></string>
+	<string name="_Empty"><![CDATA[Пусто]]></string>
+	<string name="_Enter_value_here"><![CDATA[Пожалуйста, введите значение]]></string>
+	<string name="_Error"><![CDATA[Ошибка]]></string>
+	<string name="_Failed"><![CDATA[Неудача]]></string>
+	<string name="_favorite_counter"><![CDATA[{0}]]></string>
+	<string name="_favorite_do_favorite"><![CDATA[В избранное]]></string>
+	<string name="_favorite_do_unfavorite"><![CDATA[Из избранного]]></string>
+	<string name="_favorite_do_favorite_by"><![CDATA[Добавили в избранное]]></string>
+	<string name="_favorite_err_cannot_perform_action"><![CDATA[Невозможно выполнить действие.]]></string>
+	<string name="_favorite_err_duplicate_favorite"><![CDATA[Вы уже добавляли данный объект в избранное ранее.]]></string>
+	<string name="_favorite_err_not_enabled"><![CDATA[Действие не доступно в данный момент. Пожалуйста, попробуйте позднее.]]></string>
+    <string name="_feature_do_feature"><![CDATA[В продвинутые]]></string>
+    <string name="_feature_do_unfeature"><![CDATA[Из продвинутых]]></string>
+    <string name="_feature_err_cannot_perform_action"><![CDATA[Невозможно выполнить действие.]]></string>
+    <string name="_feature_err_duplicate_feature"><![CDATA[Данный объект уже добавлен в список продвинутых.]]></string>
+    <string name="_feature_err_not_enabled"><![CDATA[Действие не доступно в данный момент. Пожалуйста, попробуйте позднее.]]></string>
+	<string name="_Female"><![CDATA[Женщина]]></string>
+	<string name="_From"><![CDATA[От]]></string>
+	<string name="_Header"><![CDATA[Заголовок]]></string>
+	<string name="_Incorrect Captcha"><![CDATA[Неправильная капча]]></string>
+	<string name="_Incorrect Email"><![CDATA[Введите правильный адрес электронной почты]]></string>
+	<string name="_Info"><![CDATA[Инфо]]></string>
+	<string name="_Keyword"><![CDATA[Ключевое слово]]></string>
+	<string name="_LookinFemale"><![CDATA[Женщина]]></string>
+	<string name="_LookinMale"><![CDATA[Мужчина]]></string>
+	<string name="_MEMBERSHIP_EXPIRES_IN_DAYS"><![CDATA[окончание срока: через {0} дней]]></string>
+	<string name="_MEMBERSHIP_EXPIRES_NEVER"><![CDATA[окончание срока: никогда]]></string>
+	<string name="_MEMBERSHIP_EXPIRES_TODAY"><![CDATA[окончание срока: сегодня в {0}. (Время сервера: {1})]]></string>
+	<string name="_MEMBERSHIP_STANDARD"><![CDATA[Вы стандартный пользователь.]]></string>
+	<string name="_MEMBERSHIP_UPGRADE_FROM_STANDARD"><![CDATA[]]></string>
+	<string name="_Male"><![CDATA[Мужчина]]></string>
+	<string name="_Manage"><![CDATA[Управление]]></string>
+	<string name="_Member"><![CDATA[Пользователь]]></string>
+	<string name="_Member Login"><![CDATA[Войти]]></string>
+	<string name="_Message text"><![CDATA[Текст сообщения]]></string>
+	<string name="_N_point"><![CDATA[<span>{0}</span> плюс]]></string>
+	<string name="_N_points"><![CDATA[<span>{0}</span> плюсов]]></string>
+	<string name="_Name"><![CDATA[Имя]]></string>
+	<string name="_Name is required"><![CDATA[Необходимо указать имя]]></string>
+	<string name="_No"><![CDATA[Нет]]></string>
+	<string name="_None"><![CDATA[Никакой]]></string>
+	<string name="_No actions allowed for this membership"><![CDATA[Нет разрешённых действий для данного членства]]></string>
+	<string name="_No such comment"><![CDATA[Нет такого комментария]]></string>
+	<string name="_Ok"><![CDATA[ОК]]></string>
+	<string name="_Period"><![CDATA[Период]]></string>
+	<string name="_Please Wait"><![CDATA[Пожалуйста, подождите]]></string>
+	<string name="_Please enter n1-n2 characters"><![CDATA[Пожалуйста, введите {0}-{1} символов]]></string>
+	<string name="_Please select value"><![CDATA[Пожалуйста, выберите значение из списка]]></string>
+	<string name="_Preview"><![CDATA[Предпросмотр]]></string>
+	<string name="_report_counter"><![CDATA[{0}]]></string>
+	<string name="_report_do_report"><![CDATA[Пожаловаться]]></string>
+	<string name="_report_do_report_by"><![CDATA[Пожаловались]]></string>
+	<string name="_report_err_cannot_perform_action"><![CDATA[Невозможно выполнить действие.]]></string>
+	<string name="_report_err_duplicate_report"><![CDATA[Ваша жалоба уже была принята ранее.]]></string>
+	<string name="_report_err_not_enabled"><![CDATA[Жалоба не может быть принята в данный момент. Пожалуйста, попробуйте позднее.]]></string>
+	<string name="_report_err_wrong_type"><![CDATA[Неправильный тип жалобы.]]></string>
+	<string name="_report_reported_as"><![CDATA[Тип жалобы:]]></string>
+	<string name="_RSS_Feed_Title_Common"><![CDATA[{0} RSS]]></string>
+	<string name="_RSS_Feed_Title_Profile"><![CDATA[{0} недавние {1}]]></string>
+	<string name="_Rate"><![CDATA[Оценить]]></string>
+	<string name="_Read"><![CDATA[Читать]]></string>
+	<string name="_Read more"><![CDATA[Читать ещё]]></string>
+	<string name="_Reset"><![CDATA[Сбросить]]></string>
+	<string name="_Search"><![CDATA[Поиск]]></string>
+  <string name="_search_in_all_section"><![CDATA[Искать во всех отделах]]></string>
+	<string name="_Section"><![CDATA[Отдел]]></string>
+	<string name="_Select_one"><![CDATA[Выберите один...]]></string>
+	<string name="_Select_all"><![CDATA[Выбрать всё]]></string>
+	<string name="_Show"><![CDATA[Показать]]></string>
+	<string name="_Sorry, your IP been banned"><![CDATA[Извините, Ваш IP был забанен]]></string>
+	<string name="_Subject"><![CDATA[Тема]]></string>
+	<string name="_Submit"><![CDATA[Выполнить]]></string>
+	<string name="_Success"><![CDATA[Удачно]]></string>
+	<string name="_Times allowed"><![CDATA[Сколько раз разрешено]]></string>
+	<string name="_Title"><![CDATA[Заголовок]]></string>
+	<string name="_To"><![CDATA[кому]]></string>
+        <string name="_unlimited"><![CDATA[без ограничений]]></string>
+	<string name="_VIEW_MEMBERSHIP_ACTIONS"><![CDATA[Просмотреть разрешённые действия]]></string>
+	<string name="_View"><![CDATA[Просмотреть]]></string>
+	<string name="_Yes"><![CDATA[Да]]></string>
+	<string name="_Your email"><![CDATA[Ваш эл. адрес]]></string>
+	<string name="_Your name"><![CDATA[Ваше имя]]></string>
+	<string name="__Afghanistan"><![CDATA[Афганистан]]></string>
+	<string name="__Afrikaans"><![CDATA[Африкаанс]]></string>
+	<string name="__Aland_Islands"><![CDATA[Аландские острова]]></string>
+	<string name="__Albania"><![CDATA[Албания]]></string>
+	<string name="__Algeria"><![CDATA[Алжир]]></string>
+	<string name="__American Samoa"><![CDATA[Американское Самоа]]></string>
+	<string name="__Andorra"><![CDATA[Андорра]]></string>
+	<string name="__Angola"><![CDATA[Ангола]]></string>
+	<string name="__Anguilla"><![CDATA[Ангилья]]></string>
+	<string name="__Antarctica"><![CDATA[Антарктика]]></string>
+	<string name="__Antigua and Barbuda"><![CDATA[Антигуа и Барбуда]]></string>
+	<string name="__Arabic"><![CDATA[Арабский]]></string>
+	<string name="__Argentina"><![CDATA[Аргентина]]></string>
+	<string name="__Armenia"><![CDATA[Армения]]></string>
+	<string name="__Aruba"><![CDATA[Аруба]]></string>
+	<string name="__Australia"><![CDATA[Австралия]]></string>
+	<string name="__Austria"><![CDATA[Австрия]]></string>
+	<string name="__Azerbaijan"><![CDATA[Азербайджан]]></string>
+	<string name="__Bahrain"><![CDATA[Бахрейн]]></string>
+	<string name="__Bangladesh"><![CDATA[Бангладеш]]></string>
+	<string name="__Barbados"><![CDATA[Барбадос]]></string>
+	<string name="__Belarus"><![CDATA[Белоруссия]]></string>
+	<string name="__Belgium"><![CDATA[Бельгия]]></string>
+	<string name="__Belize"><![CDATA[Белиз]]></string>
+	<string name="__Benin"><![CDATA[Бенин]]></string>
+	<string name="__Bermuda"><![CDATA[Бермуды]]></string>
+	<string name="__Bhutan"><![CDATA[Бутан]]></string>
+	<string name="__Bolivia"><![CDATA[Боливия]]></string>
+	<string name="__Bosnia and Herzegovina"><![CDATA[Босния и Герцеговина]]></string>
+	<string name="__Botswana"><![CDATA[Ботсвана]]></string>
+	<string name="__Bouvet Island"><![CDATA[Буве о-в]]></string>
+	<string name="__Brazil"><![CDATA[Бразилия]]></string>
+	<string name="__British Indian Ocean Territory"><![CDATA[Британская территория в Индийском океане]]></string>
+	<string name="__British Virgin Islands"><![CDATA[Британские Виргинские о-ва]]></string>
+	<string name="__Brunei Darussalam"><![CDATA[Бруней]]></string>
+	<string name="__Bulgaria"><![CDATA[Болгария]]></string>
+	<string name="__Bulgarian"><![CDATA[Болгарский]]></string>
+	<string name="__Burkina Faso"><![CDATA[Буркина-Фасо]]></string>
+	<string name="__Burma"><![CDATA[Бирма]]></string>
+	<string name="__Burmese"><![CDATA[Бирманский]]></string>
+	<string name="__Burundi"><![CDATA[Бурунди]]></string>
+	<string name="__Cambodia"><![CDATA[Камбоджа]]></string>
+	<string name="__Cameroon"><![CDATA[Камерун]]></string>
+	<string name="__Canada"><![CDATA[Канада]]></string>
+	<string name="__Cantonese"><![CDATA[Кантонский]]></string>
+	<string name="__Cape Verde"><![CDATA[Кабо-Верде]]></string>
+	<string name="__Cayman Islands"><![CDATA[Каймановы о-ва]]></string>
+	<string name="__Central African Republic"><![CDATA[Центральноафриканская республика]]></string>
+	<string name="__Chad"><![CDATA[Чад]]></string>
+	<string name="__Chile"><![CDATA[Чили]]></string>
+	<string name="__China"><![CDATA[Китай]]></string>
+	<string name="__Christmas Island"><![CDATA[Рождества о-ва]]></string>
+	<string name="__Cocos (Keeling) Islands"><![CDATA[Кокосовы (Килинг) о-ва]]></string>
+	<string name="__Colombia"><![CDATA[Колумбия]]></string>
+	<string name="__Comoros"><![CDATA[Коморские о-ва]]></string>
+	<string name="__Congo, Democratic Republic of the"><![CDATA[Конго, Демократическая республика]]></string>
+	<string name="__Congo, Republic of the"><![CDATA[Конго, Республика]]></string>
+	<string name="__Cook Islands"><![CDATA[Кука о-ва]]></string>
+	<string name="__Costa Rica"><![CDATA[Коста-Рика]]></string>
+	<string name="__Cote d'Ivoire"><![CDATA[Кот-д'Ивуар]]></string>
+	<string name="__Croatia"><![CDATA[Хорватия]]></string>
+	<string name="__Croatian"><![CDATA[Хорватский]]></string>
+	<string name="__Cuba"><![CDATA[Куба]]></string>
+	<string name="__Cyprus"><![CDATA[Кипр]]></string>
+	<string name="__Czech Republic"><![CDATA[Чешская Республика]]></string>
+	<string name="__Danish"><![CDATA[Датский]]></string>
+	<string name="__Denmark"><![CDATA[Дания]]></string>
+	<string name="__Djibouti"><![CDATA[Джибути]]></string>
+	<string name="__Dominica"><![CDATA[Доминика]]></string>
+	<string name="__Dominican Republic"><![CDATA[Доминиканская Республика]]></string>
+	<string name="__Dutch"><![CDATA[Голландский]]></string>
+	<string name="__East Timor"><![CDATA[Восточный Тимор]]></string>
+	<string name="__Ecuador"><![CDATA[Эквадор]]></string>
+	<string name="__Egypt"><![CDATA[Египет]]></string>
+	<string name="__El Salvador"><![CDATA[Сальвадор]]></string>
+	<string name="__English"><![CDATA[Английский]]></string>
+	<string name="__Equatorial Guinea"><![CDATA[Экваториальная Гвинея]]></string>
+	<string name="__Eritrea"><![CDATA[Эритрея]]></string>
+	<string name="__Esperanto"><![CDATA[Эсперанто]]></string>
+	<string name="__Estonia"><![CDATA[Эстония]]></string>
+	<string name="__Estonian"><![CDATA[Эстонский]]></string>
+	<string name="__Ethiopia"><![CDATA[Эфиопия]]></string>
+	<string name="__Falkland Islands (Islas Malvinas)"><![CDATA[Фолклендские (Мальвинские) о-ва]]></string>
+	<string name="__Faroe Islands"><![CDATA[Фарерские о-ва]]></string>
+	<string name="__Fiji"><![CDATA[Фиджи]]></string>
+	<string name="__Finland"><![CDATA[Финляндия]]></string>
+	<string name="__Finnish"><![CDATA[Финский]]></string>
+	<string name="__France"><![CDATA[Франция]]></string>
+	<string name="__French"><![CDATA[Французский]]></string>
+	<string name="__French Guiana"><![CDATA[Французская Гвиана]]></string>
+	<string name="__French Polynesia"><![CDATA[Французская Полинезия]]></string>
+	<string name="__French Southern and Antarctic Lands"><![CDATA[Французские Южные и Антарктические территории]]></string>
+	<string name="__Gabon"><![CDATA[Габон]]></string>
+	<string name="__Georgia"><![CDATA[Грузия]]></string>
+	<string name="__German"><![CDATA[Немецкий]]></string>
+	<string name="__Germany"><![CDATA[Германия]]></string>
+	<string name="__Ghana"><![CDATA[Гана]]></string>
+	<string name="__Gibraltar"><![CDATA[Гибралтар]]></string>
+	<string name="__Greece"><![CDATA[Греция]]></string>
+	<string name="__Greek"><![CDATA[Греческий]]></string>
+	<string name="__Greenland"><![CDATA[Гренландия]]></string>
+	<string name="__Grenada"><![CDATA[Гренада]]></string>
+	<string name="__Guadeloupe"><![CDATA[Гваделупа]]></string>
+	<string name="__Guam"><![CDATA[Гуам]]></string>
+	<string name="__Guatemala"><![CDATA[Гватемала]]></string>
+	<string name="__Guernsey"><![CDATA[Гернси о-в]]></string>
+	<string name="__Guinea"><![CDATA[Гвинея]]></string>
+	<string name="__Guinea-Bissau"><![CDATA[Гвинея-Бисау]]></string>
+	<string name="__Gujrati"><![CDATA[Гуджаратский]]></string>
+	<string name="__Guyana"><![CDATA[Гайана]]></string>
+	<string name="__Haiti"><![CDATA[Гаити]]></string>
+	<string name="__Heard Island and McDonald Islands"><![CDATA[Херд о-в и Макдональд о-ва]]></string>
+	<string name="__Hebrew"><![CDATA[Иврит]]></string>
+	<string name="__Hindi"><![CDATA[Хинди]]></string>
+	<string name="__Holy See (Vatican City)"><![CDATA[Ватикан, Государство-город]]></string>
+	<string name="__Honduras"><![CDATA[Гондурас]]></string>
+	<string name="__Hong Kong (SAR)"><![CDATA[Гонконг]]></string>
+	<string name="__Hungarian"><![CDATA[Венгерский]]></string>
+	<string name="__Hungary"><![CDATA[Венгрия]]></string>
+	<string name="__Iceland"><![CDATA[Исландия]]></string>
+	<string name="__Icelandic"><![CDATA[Исландский]]></string>
+	<string name="__India"><![CDATA[Индия]]></string>
+	<string name="__Indonesia"><![CDATA[Индонезия]]></string>
+	<string name="__Indonesian"><![CDATA[Индонезийский]]></string>
+	<string name="__Iran"><![CDATA[Иран]]></string>
+	<string name="__Iraq"><![CDATA[Ирак]]></string>
+	<string name="__Ireland"><![CDATA[Ирландия]]></string>
+	<string name="__Isle_of_Man"><![CDATA[Мэн о-в]]></string>
+	<string name="__Israel"><![CDATA[Израиль]]></string>
+	<string name="__Italian"><![CDATA[Итальянский]]></string>
+	<string name="__Italy"><![CDATA[Италия]]></string>
+	<string name="__Jamaica"><![CDATA[Ямайка]]></string>
+	<string name="__Japan"><![CDATA[Япония]]></string>
+	<string name="__Japanese"><![CDATA[Японский]]></string>
+	<string name="__Jersey"><![CDATA[Джерси о-в]]></string>
+	<string name="__Jordan"><![CDATA[Иордания]]></string>
+	<string name="__Kazakhstan"><![CDATA[Казахстан]]></string>
+	<string name="__Kenya"><![CDATA[Кения]]></string>
+	<string name="__Kiribati"><![CDATA[Кирибати]]></string>
+	<string name="__Korea, North"><![CDATA[Корея Северная]]></string>
+	<string name="__Korea, South"><![CDATA[Корея Южная]]></string>
+	<string name="__Korean"><![CDATA[Корейский]]></string>
+	<string name="__Kuwait"><![CDATA[Кувейт]]></string>
+	<string name="__Kyrgyzstan"><![CDATA[Киргизстан]]></string>
+	<string name="__Laos"><![CDATA[Лаос]]></string>
+	<string name="__Latvia"><![CDATA[Латвия]]></string>
+	<string name="__Latvian"><![CDATA[Латышский]]></string>
+	<string name="__Lebanon"><![CDATA[Ливан]]></string>
+	<string name="__Lesotho"><![CDATA[Лесото]]></string>
+	<string name="__Liberia"><![CDATA[Либерия]]></string>
+	<string name="__Libya"><![CDATA[Ливия]]></string>
+	<string name="__Liechtenstein"><![CDATA[Лихтенштейн]]></string>
+	<string name="__Lithuania"><![CDATA[Литва]]></string>
+	<string name="__Lithuanian"><![CDATA[Литовский]]></string>
+	<string name="__Luxembourg"><![CDATA[Люксембург]]></string>
+	<string name="__Macao"><![CDATA[Макао]]></string>
+	<string name="__Macedonia, The Former Yugoslav Republic of"><![CDATA[Македония]]></string>
+	<string name="__Madagascar"><![CDATA[Мадагаскар]]></string>
+	<string name="__Malawi"><![CDATA[Малави]]></string>
+	<string name="__Malay"><![CDATA[Малайский]]></string>
+	<string name="__Malaysia"><![CDATA[Малайзия]]></string>
+	<string name="__Maldives"><![CDATA[Мальдивские о-ва]]></string>
+	<string name="__Mali"><![CDATA[Мали]]></string>
+	<string name="__Malta"><![CDATA[Мальта]]></string>
+	<string name="__Mandarin"><![CDATA[Мандаринский китайский]]></string>
+	<string name="__Marathi"><![CDATA[Маратхи]]></string>
+	<string name="__Marshall Islands"><![CDATA[Маршаллова о-ва]]></string>
+	<string name="__Martinique"><![CDATA[Мартиника]]></string>
+	<string name="__Mauritania"><![CDATA[Мавритания]]></string>
+	<string name="__Mauritius"><![CDATA[Маврикий]]></string>
+	<string name="__Mayotte"><![CDATA[Майотта о-в]]></string>
+	<string name="__Mexico"><![CDATA[Мексика]]></string>
+	<string name="__Micronesia, Federated States of"><![CDATA[Микронезия]]></string>
+	<string name="__Moldova"><![CDATA[Молдавия]]></string>
+	<string name="__Moldovian"><![CDATA[Молдавский]]></string>
+	<string name="__Monaco"><![CDATA[Монако]]></string>
+	<string name="__Mongolia"><![CDATA[Монголия]]></string>
+	<string name="__Montenegro"><![CDATA[Черногория]]></string>
+	<string name="__Montserrat"><![CDATA[Монтсеррат, о-в]]></string>
+	<string name="__Morocco"><![CDATA[Морокко]]></string>
+	<string name="__Mozambique"><![CDATA[Мозамбик]]></string>
+	<string name="__Namibia"><![CDATA[Намибия]]></string>
+	<string name="__Nauru"><![CDATA[Науру]]></string>
+	<string name="__Nepal"><![CDATA[Непал]]></string>
+	<string name="__Nepalese"><![CDATA[Непальский]]></string>
+	<string name="__Netherlands"><![CDATA[Нидерланды]]></string>
+	<string name="__Netherlands Antilles"><![CDATA[Нидерландские Антильские о-ва]]></string>
+	<string name="__New Caledonia"><![CDATA[Новая Каледония, о-в]]></string>
+	<string name="__New Zealand"><![CDATA[Новая Зеландия]]></string>
+	<string name="__Nicaragua"><![CDATA[Никарагуа]]></string>
+	<string name="__Niger"><![CDATA[Нигер]]></string>
+	<string name="__Nigeria"><![CDATA[Нигерия]]></string>
+	<string name="__Niue"><![CDATA[Ниуэ, о-в]]></string>
+	<string name="__Norfolk Island"><![CDATA[Норфолк, о-в]]></string>
+	<string name="__Northern Mariana Islands"><![CDATA[Северные Марианские о-ва]]></string>
+	<string name="__Norway"><![CDATA[Норвегия]]></string>
+	<string name="__Norwegian"><![CDATA[Норвежский]]></string>
+	<string name="__Oman"><![CDATA[Оман]]></string>
+	<string name="__Pakistan"><![CDATA[пакистан]]></string>
+	<string name="__Palau"><![CDATA[Палау]]></string>
+	<string name="__Palestinian Territory, Occupied"><![CDATA[Палестина]]></string>
+	<string name="__Panama"><![CDATA[Панама]]></string>
+	<string name="__Papua New Guinea"><![CDATA[Папуа - Новая Гвинея]]></string>
+	<string name="__Paraguay"><![CDATA[Парагвай]]></string>
+	<string name="__Persian"><![CDATA[Персидский]]></string>
+	<string name="__Peru"><![CDATA[Перу]]></string>
+	<string name="__Philippines"><![CDATA[Филиппины]]></string>
+	<string name="__Pitcairn Islands"><![CDATA[Питкэрн, о-ва]]></string>
+	<string name="__Poland"><![CDATA[Польша]]></string>
+	<string name="__Polish"><![CDATA[Польский]]></string>
+	<string name="__Portugal"><![CDATA[Португалия]]></string>
+	<string name="__Portuguese"><![CDATA[Португальский]]></string>
+	<string name="__Puerto Rico"><![CDATA[Пуэрто-Рико]]></string>
+	<string name="__Punjabi"><![CDATA[Пенджаби]]></string>
+	<string name="__Qatar"><![CDATA[Катар]]></string>
+	<string name="__Reunion"><![CDATA[Реюньон]]></string>
+	<string name="__Romania"><![CDATA[Румыния]]></string>
+	<string name="__Romanian"><![CDATA[Румынский]]></string>
+	<string name="__Russia"><![CDATA[Россия]]></string>
+	<string name="__Russian"><![CDATA[Русский]]></string>
+	<string name="__Rwanda"><![CDATA[Руанда]]></string>
+	<string name="__Saint Helena"><![CDATA[Святой Елены, о-в]]></string>
+	<string name="__Saint Kitts and Nevis"><![CDATA[Сент-Китс и Невис]]></string>
+	<string name="__Saint Lucia"><![CDATA[Сент-Люсия]]></string>
+	<string name="__Saint Pierre and Miquelon"><![CDATA[Сен-Пьер и Микелон]]></string>
+	<string name="__Saint Vincent and the Grenadines"><![CDATA[Сент-Винсент и Гренадины]]></string>
+	<string name="__Saint_Barthelemy"><![CDATA[Сен-Бартелеми́]]></string>
+	<string name="__Saint_Martin_French_part"><![CDATA[Сен-Мартен]]></string>
+	<string name="__Samoa"><![CDATA[Самоа]]></string>
+	<string name="__San Marino"><![CDATA[Сан-Марино]]></string>
+	<string name="__Sao Tome and Principe"><![CDATA[Сан-Томе и Принсипи]]></string>
+	<string name="__Saudi Arabia"><![CDATA[Саудовская Аравия]]></string>
+	<string name="__Senegal"><![CDATA[Сенегал]]></string>
+	<string name="__Serbia"><![CDATA[Сербия]]></string>
+	<string name="__Serbian"><![CDATA[Сербский]]></string>
+	<string name="__Seychelles"><![CDATA[Сейшельские о-ва]]></string>
+	<string name="__Sierra Leone"><![CDATA[Сьерра-Леоне]]></string>
+	<string name="__Singapore"><![CDATA[Сингапур]]></string>
+	<string name="__Slovakia"><![CDATA[Словакия]]></string>
+	<string name="__Slovenia"><![CDATA[Словения]]></string>
+	<string name="__Solomon Islands"><![CDATA[Соломоновы о-ва]]></string>
+	<string name="__Somalia"><![CDATA[Сомали]]></string>
+	<string name="__South Africa"><![CDATA[Южноафриканская Республика]]></string>
+	<string name="__South Georgia and the South Sandwich Islands"><![CDATA[Южная Георгия и Южные Сандвичевы Острова]]></string>
+	<string name="__Spain"><![CDATA[Испания]]></string>
+	<string name="__Spanish"><![CDATA[Испанский]]></string>
+	<string name="__Sri Lanka"><![CDATA[Шри-Ланка]]></string>
+	<string name="__Sudan"><![CDATA[Судан]]></string>
+	<string name="__Suriname"><![CDATA[Суринам]]></string>
+	<string name="__Svalbard"><![CDATA[Шпицберген, о-в]]></string>
+	<string name="__Swaziland"><![CDATA[Свазиленд]]></string>
+	<string name="__Sweden"><![CDATA[Швеция]]></string>
+	<string name="__Swedish"><![CDATA[Шведский]]></string>
+	<string name="__Switzerland"><![CDATA[Швейцария]]></string>
+	<string name="__Syria"><![CDATA[Сирия]]></string>
+	<string name="__Tagalog"><![CDATA[Тагальский]]></string>
+	<string name="__Taiwan"><![CDATA[Тайвань]]></string>
+	<string name="__Taiwanese"><![CDATA[Тайваньский]]></string>
+	<string name="__Tajikistan"><![CDATA[Таджикистан]]></string>
+	<string name="__Tamil"><![CDATA[Тамильский]]></string>
+	<string name="__Tanzania"><![CDATA[Танзания]]></string>
+	<string name="__Telugu"><![CDATA[Телугу]]></string>
+	<string name="__Thai"><![CDATA[Тайский]]></string>
+	<string name="__Thailand"><![CDATA[Таиланд]]></string>
+	<string name="__The Bahamas"><![CDATA[Багамские о-ва]]></string>
+	<string name="__The Gambia"><![CDATA[Гамбия]]></string>
+	<string name="__Togo"><![CDATA[Того]]></string>
+	<string name="__Tokelau"><![CDATA[Токелау]]></string>
+	<string name="__Tonga"><![CDATA[Тонга]]></string>
+	<string name="__Tongan"><![CDATA[Тонганский]]></string>
+	<string name="__Trinidad and Tobago"><![CDATA[Тринидад и Тобаго]]></string>
+	<string name="__Tunisia"><![CDATA[Тунис]]></string>
+	<string name="__Turkey"><![CDATA[Турция]]></string>
+	<string name="__Turkish"><![CDATA[Турецкий]]></string>
+	<string name="__Turkmenistan"><![CDATA[Туркменистан]]></string>
+	<string name="__Turks and Caicos Islands"><![CDATA[Теркс и Кайкос, о-ва]]></string>
+	<string name="__Tuvalu"><![CDATA[Тувалу]]></string>
+	<string name="__Uganda"><![CDATA[Уганда]]></string>
+	<string name="__Ukraine"><![CDATA[Украина]]></string>
+	<string name="__Ukrainian"><![CDATA[Украинский]]></string>
+	<string name="__United Arab Emirates"><![CDATA[Объединённые Арабские Эмираты]]></string>
+	<string name="__United Kingdom"><![CDATA[Великобритания]]></string>
+	<string name="__United States"><![CDATA[Соединённые Штаты Америки]]></string>
+	<string name="__United States Minor Outlying Islands"><![CDATA[Внешние малые острова США]]></string>
+	<string name="__Urdu"><![CDATA[Урду]]></string>
+	<string name="__Uruguay"><![CDATA[Уругвай]]></string>
+	<string name="__Uzbekistan"><![CDATA[Узбекистан]]></string>
+	<string name="__Vanuatu"><![CDATA[Вануату]]></string>
+	<string name="__Venezuela"><![CDATA[Венесуэла]]></string>
+	<string name="__Vietnam"><![CDATA[Вьетнам]]></string>
+	<string name="__Vietnamese"><![CDATA[Вьетнамский]]></string>
+	<string name="__Virgin Islands"><![CDATA[Виргинские о-ва]]></string>
+	<string name="__Visayan"><![CDATA[Бисайский]]></string>
+	<string name="__Wallis and Futuna"><![CDATA[Уоллис и Футуна]]></string>
+	<string name="__Western Sahara"><![CDATA[Западная Сахара]]></string>
+	<string name="__Yemen"><![CDATA[Йемен]]></string>
+	<string name="__Zambia"><![CDATA[Замбия]]></string>
+	<string name="__Zimbabwe"><![CDATA[Зимбабве]]></string>
+	<string name="_adm_act_err_failed_page_loading"><![CDATA[Невозможно загрузить страницу]]></string>
+	<string name="_adm_action_cpt_checkout"><![CDATA[Оплата]]></string>
+	<string name="_adm_action_cpt_delete_all"><![CDATA[Удалить всё]]></string>
+	<string name="_adm_action_cpt_see_all"><![CDATA[Смотреть все]]></string>
+	<string name="_adm_admtools_Audit"><![CDATA[Аудит]]></string>
+	<string name="_adm_admtools_Current_level"><![CDATA[Настоящий статус]]></string>
+	<string name="_adm_admtools_Desired_level"><![CDATA[Желательный статус]]></string>
+	<string name="_adm_admtools_Executable"><![CDATA[Исполняемый]]></string>
+	<string name="_adm_admtools_Non_Executable"><![CDATA[Неисполняемый]]></string>
+	<string name="_adm_admtools_Non_Writable"><![CDATA[Незаписываемый]]></string>
+	<string name="_adm_admtools_Not_Exists"><![CDATA[Несуществующий]]></string>
+	<string name="_adm_admtools_Path"><![CDATA[Путь]]></string>
+	<string name="_adm_admtools_Permissions"><![CDATA[Разрешения]]></string>
+	<string name="_adm_admtools_Writable"><![CDATA[Записываемый]]></string>
+	<string name="_adm_admtools_title"><![CDATA[Инструменты администратора]]></string>
+	<string name="_adm_block_cpt_categories"><![CDATA[Категории]]></string>
+	<string name="_adm_block_cpt_category"><![CDATA[Категория: {0}]]></string>
+	<string name="_adm_block_cpt_checkout"><![CDATA[Оплата]]></string>
+	<string name="_adm_block_cpt_checkout_by_vendor_ccode"><![CDATA[Товары от {0} ({1} {2})]]></string>
+	<string name="_adm_block_cpt_checkout_by_vendor_csign"><![CDATA[Товры от  {0} ({1}{2})]]></string>
+	<string name="_adm_block_cpt_downloaded_modules"><![CDATA[Модули]]></string>
+	<string name="_adm_block_cpt_downloaded_updates"><![CDATA[Обновления]]></string>
+	<string name="_adm_block_cpt_featured"><![CDATA[Избранные]]></string>
+	<string name="_adm_block_cpt_goodies"><![CDATA[Витрина]]></string>
+	<string name="_adm_block_cpt_latest"><![CDATA[Новые]]></string>
+	<string name="_adm_block_cpt_modules_upload"><![CDATA[Добавить новый модуль]]></string>
+	<string name="_adm_block_cpt_popular"><![CDATA[Популярные]]></string>
+	<string name="_adm_block_cpt_purchases"><![CDATA[Покупки]]></string>
+	<string name="_adm_block_cpt_search"><![CDATA[Поиск]]></string>
+	<string name="_adm_block_cpt_space"><![CDATA[Использовано места]]></string>
+	<string name="_adm_block_cpt_tag"><![CDATA[Хэштег: {0}]]></string>
+	<string name="_adm_block_cpt_tags"><![CDATA[Хэштеги]]></string>
+	<string name="_adm_block_cpt_updates"><![CDATA[Обновления]]></string>
+	<string name="_adm_block_cpt_versions"><![CDATA[Версии]]></string>
+	<string name="_adm_bp_btn_add_block"><![CDATA[Добавить блоки]]></string>
+	<string name="_adm_bp_btn_block_add"><![CDATA[Добавить на страницу]]></string>
+	<string name="_adm_bp_btn_block_cancel"><![CDATA[Отменить]]></string>
+	<string name="_adm_bp_btn_block_delete"><![CDATA[Удалить]]></string>
+	<string name="_adm_bp_btn_block_save"><![CDATA[Сохранить]]></string>
+	<string name="_adm_bp_btn_create_new"><![CDATA[Добавить новую Страницу]]></string>
+	<string name="_adm_bp_btn_delete"><![CDATA[Удалить]]></string>
+	<string name="_adm_bp_btn_page_apply"><![CDATA[Применить]]></string>
+	<string name="_adm_bp_btn_page_cancel"><![CDATA[Отменить]]></string>
+	<string name="_adm_bp_btn_page_create"><![CDATA[Создать]]></string>
+	<string name="_adm_bp_btn_settings"><![CDATA[Настройки]]></string>
+	<string name="_adm_bp_btn_view_page"><![CDATA[Просмотреть страницу]]></string>
+	<string name="_adm_bp_cpt_type_custom"><![CDATA[Индивидуальный]]></string>
+	<string name="_adm_bp_cpt_type_modules"><![CDATA[Модули]]></string>
+	<string name="_adm_bp_cpt_type_system"><![CDATA[Система]]></string>
+	<string name="_adm_bp_dsc_block_content_image_file"><![CDATA[Картинка будет отображена в блоке]]></string>
+	<string name="_adm_bp_dsc_block_content_lang"><![CDATA[Введите содержимое в соответствии с выбранным языком]]></string>
+	<string name="_adm_bp_dsc_block_content_raw"><![CDATA[Введите здесь HTML-содержимое]]></string>
+	<string name="_adm_bp_dsc_block_content_rss_length"><![CDATA[Введите здесь количество отображаемых элементов]]></string>
+	<string name="_adm_bp_dsc_block_content_rss_url"><![CDATA[Введите здесь URL RSS-ресурса]]></string>
+	<string name="_adm_bp_dsc_block_title"><![CDATA[Короткое название для блока, отображаемое в заголовке блока.]]></string>
+	<string name="_adm_bp_dsc_block_visible_for_levels"><![CDATA[Выбрать уровни пользователей, которые могут видеть этот блок]]></string>
+	<string name="_adm_bp_dsc_page_cache_lifetime"><![CDATA[Сохранять страницу в кэше в течение данного количества секунд]]></string>
+	<string name="_adm_bp_dsc_page_meta_description"><![CDATA[Используйте 10-50 слов, чтобы описать назначение страницы для поисковых машин.]]></string>
+	<string name="_adm_bp_dsc_page_meta_keywords"><![CDATA[Используйте 5-10 ключевых слов, разделённых запятыми, связанных с содержимым страницы.]]></string>
+	<string name="_adm_bp_dsc_page_meta_robots"><![CDATA[Стандартные команды для поисковых роботов. Например: noindex, nofollow.]]></string>
+	<string name="_adm_bp_dsc_page_title"><![CDATA[Название страницы, отображаемое в заголовке. Используйте как минимум 3 символа.]]></string>
+	<string name="_adm_bp_dsc_page_title_system"><![CDATA[Название страницы, отображаемое только в Студии.]]></string>
+	<string name="_adm_bp_dsc_page_uri"><![CDATA[Адрес страницы, используемый после 'youdomain.com/page/'. Он должен быть уникальным и не может быть изменён в дальнейшем.]]></string>
+	<string name="_adm_bp_dsc_page_url"><![CDATA[Ссылка на страницу для доступа к ней.]]></string>
+	<string name="_adm_bp_dsc_page_visible_for_levels"><![CDATA[Выберите уровни пользователей, разрешённые для просмотра этой страницы]]></string>
+	<string name="_adm_bp_err_block_added"><![CDATA[Невозможно добавть блок(и)]]></string>
+	<string name="_adm_bp_err_block_content_image_preview_delete"><![CDATA[Невозможно удалить картинку.]]></string>
+	<string name="_adm_bp_err_block_delete"><![CDATA[Невозможно удалить блок]]></string>
+	<string name="_adm_bp_err_block_designbox"><![CDATA[Выберите способ отображения для блока]]></string>
+	<string name="_adm_bp_err_block_edit"><![CDATA[Невозможно обновить блок]]></string>
+	<string name="_adm_bp_err_block_not_deletable"><![CDATA[Невозможно удалить нужный блок.]]></string>
+	<string name="_adm_bp_err_block_not_found"><![CDATA[Невозможно найти нужный блок.]]></string>
+	<string name="_adm_bp_err_block_title"><![CDATA[Введите заголовок, более 3 символов]]></string>
+	<string name="_adm_bp_err_cannot_process_action"><![CDATA[Невозможно выполнить действие. Отсутствует связанный обработчик.]]></string>
+	<string name="_adm_bp_err_nothing_changed"><![CDATA[Ничего не было изменено или произошла ошибкаNothing.]]></string>
+	<string name="_adm_bp_err_page_create"><![CDATA[Невозможно создать страницу.]]></string>
+	<string name="_adm_bp_err_page_delete"><![CDATA[Невозможно удалить страницу.]]></string>
+	<string name="_adm_bp_err_page_layout"><![CDATA[Пожалуйста, выберите отображение страницы.]]></string>
+	<string name="_adm_bp_err_page_title"><![CDATA[Необходимо указать заголовок из как минимум 3 символов.]]></string>
+	<string name="_adm_bp_err_page_title_system"><![CDATA[Необходимо указать название из как минимум 3 символов.]]></string>
+	<string name="_adm_bp_err_page_uri"><![CDATA[Необходимо указать уникальный URL из как минимум 3 символов.]]></string>
+	<string name="_adm_bp_err_page_visible_for_levels"><![CDATA[Настройки видимости определяются индивидуальным кодом или не применимы в данном случае.]]></string>
+	<string name="_adm_bp_err_save"><![CDATA[Невозможно сохранить или ничего не изменилось.]]></string>
+	<string name="_adm_bp_mi_page_cache"><![CDATA[Кэш]]></string>
+	<string name="_adm_bp_mi_page_cover"><![CDATA[Обложка]]></string>
+	<string name="_adm_bp_mi_page_layout"><![CDATA[Отображение]]></string>
+	<string name="_adm_bp_mi_page_options"><![CDATA[Опции]]></string>
+	<string name="_adm_bp_mi_page_seo"><![CDATA[Оптимизация для поисковых машин]]></string>
+	<string name="_adm_bp_mi_page_visibility"><![CDATA[Видимость]]></string>
+	<string name="_adm_bp_scs_save"><![CDATA[Изменения успешно сохранены]]></string>
+	<string name="_adm_bp_txt_block_active"><![CDATA[Активный]]></string>
+	<string name="_adm_bp_txt_block_content_attachments_html"><![CDATA[Вложения]]></string>
+	<string name="_adm_bp_txt_block_content_image_align"><![CDATA[Выравнивание]]></string>
+	<string name="_adm_bp_txt_block_content_image_align_center"><![CDATA[по центру]]></string>
+	<string name="_adm_bp_txt_block_content_image_align_empty"><![CDATA[Выбрать выравнивание...]]></string>
+	<string name="_adm_bp_txt_block_content_image_align_left"><![CDATA[слева]]></string>
+	<string name="_adm_bp_txt_block_content_image_align_right"><![CDATA[справа]]></string>
+	<string name="_adm_bp_txt_block_content_image_file"><![CDATA[Загрузить новую картинку]]></string>
+	<string name="_adm_bp_txt_block_content_image_preview"><![CDATA[Текущая картинка]]></string>
+	<string name="_adm_bp_txt_block_content_lang"><![CDATA[Содержимое]]></string>
+	<string name="_adm_bp_txt_block_content_menu"><![CDATA[Меню]]></string>
+	<string name="_adm_bp_txt_block_content_menu_empty"><![CDATA[Выбрать меню...]]></string>
+	<string name="_adm_bp_txt_block_content_raw"><![CDATA[Содержимое]]></string>
+	<string name="_adm_bp_txt_block_content_rss_length"><![CDATA[Длина]]></string>
+	<string name="_adm_bp_txt_block_content_rss_url"><![CDATA[URL]]></string>
+	<string name="_adm_bp_txt_block_content_service_method"><![CDATA[Метод]]></string>
+	<string name="_adm_bp_txt_block_content_service_module"><![CDATA[Модуль]]></string>
+	<string name="_adm_bp_txt_block_designbox"><![CDATA[Отображение блока]]></string>
+	<string name="_adm_bp_txt_block_designbox_empty"><![CDATA[Выбрать отображение...]]></string>
+	<string name="_adm_bp_txt_block_hidden_on"><![CDATA[Скрыть на]]></string>
+	<string name="_adm_bp_txt_block_hidden_on_phone"><![CDATA[телефоне]]></string>
+	<string name="_adm_bp_txt_block_hidden_on_tablet"><![CDATA[планшете]]></string>
+	<string name="_adm_bp_txt_block_hidden_on_desktop"><![CDATA[настольном компьютере]]></string>
+        <string name="_adm_bp_txt_block_hidden_on_mobile"><![CDATA[мобильное приложение]]></string>
+	<string name="_adm_bp_txt_block_selected"><![CDATA[блоков выбрано]]></string>
+	<string name="_adm_bp_txt_block_title"><![CDATA[Заголовок]]></string>
+	<string name="_adm_bp_txt_block_visible_for"><![CDATA[Видимо для]]></string>
+	<string name="_adm_bp_txt_block_visible_for_all"><![CDATA[Всех]]></string>
+	<string name="_adm_bp_txt_block_visible_for_levels"><![CDATA[Выбрать уровни]]></string>
+	<string name="_adm_bp_txt_block_visible_for_selected"><![CDATA[Выбранные уровни]]></string>
+	<string name="_adm_bp_txt_create_popup"><![CDATA[Создать новую страницу]]></string>
+	<string name="_adm_bp_txt_edit_block_popup"><![CDATA[Редактировать "{0}" блок]]></string>
+	<string name="_adm_bp_txt_new_block_popup"><![CDATA[Добавить новый блок]]></string>
+	<string name="_adm_bp_txt_page_cache_lifetime"><![CDATA[Кэш]]></string>
+	<string name="_adm_bp_txt_page_cover"><![CDATA[Обложка]]></string>
+	<string name="_adm_bp_txt_page_cover_image"><![CDATA[Собственная обложка]]></string>
+        <string name="_adm_bp_txt_page_cover_0"><![CDATA[Отключен]]></string>
+        <string name="_adm_bp_txt_page_cover_1"><![CDATA[Включен для всех]]></string>
+        <string name="_adm_bp_txt_page_cover_2"><![CDATA[Включен только для гостей]]></string>
+        <string name="_adm_bp_txt_page_cover_3"><![CDATA[Включен только для пользователей]]></string>
+	<string name="_adm_bp_txt_page_layout"><![CDATA[Отображение]]></string>
+	<string name="_adm_bp_txt_page_layout_empty"><![CDATA[Выбрать отображение...]]></string>
+	<string name="_adm_bp_txt_page_meta_description"><![CDATA[Мета-описание страницы]]></string>
+	<string name="_adm_bp_txt_page_meta_keywords"><![CDATA[Ключевые слова]]></string>
+	<string name="_adm_bp_txt_page_meta_robots"><![CDATA[Мета-роботы]]></string>
+        <string name="_adm_bp_txt_page_submenu"><![CDATA[Подменю]]></string>
+	<string name="_adm_bp_dsc_page_submenu"><![CDATA[В данном поле можно выбрать подменю страницы]]></string>
+	<string name="_adm_bp_txt_page_title"><![CDATA[Заголовок]]></string>
+	<string name="_adm_bp_txt_page_title_system"><![CDATA[Системное имя]]></string>
+	<string name="_adm_bp_txt_page_type_id"><![CDATA[Тип]]></string>
+	<string name="_adm_bp_dsc_page_type_id"><![CDATA[Способ отображения страницы]]></string>
+	<string name="_adm_bp_txt_page_uri"><![CDATA[URL]]></string>
+	<string name="_adm_bp_txt_page_url"><![CDATA[Ссылка]]></string>
+	<string name="_adm_bp_txt_page_visible_for_levels"><![CDATA[Выбрать уровни]]></string>
+	<string name="_adm_bp_txt_select_page"><![CDATA[Выбрать страницу...]]></string>
+	<string name="_adm_bp_txt_settings_popup"><![CDATA[Настройки]]></string>
+	<string name="_adm_bp_txt_visible_for"><![CDATA[Видимо для {0}]]></string>
+	<string name="_adm_bp_wrn_page_delete"><![CDATA[Вы уверены, что хотите удалить эту страницу?]]></string>
+	<string name="_adm_bp_wrn_page_block_delete"><![CDATA[Вы уверены, что хотите удалить этот блок?]]></string>
+	<string name="_adm_btn_cancel_submit"><![CDATA[Отменить]]></string>
+	<string name="_adm_btn_checkout_submit"><![CDATA[Оплатить]]></string>
+	<string name="_adm_btn_delete_submit"><![CDATA[Удалить]]></string>
+	<string name="_adm_btn_designer_submit"><![CDATA[Выполнить]]></string>
+	<string name="_adm_btn_download_submit"><![CDATA[Скачать]]></string>
+	<string name="_adm_btn_install_submit"><![CDATA[Установить]]></string>
+	<string name="_adm_btn_installed_submit"><![CDATA[Установленные]]></string>
+	<string name="_adm_btn_login_submit"><![CDATA[Вход в Студию]]></string>
+	<string name="_adm_btn_queued_submit"><![CDATA[В очереди]]></string>
+	<string name="_adm_btn_settings_import"><![CDATA[Импортировать]]></string>
+	<string name="_adm_btn_settings_save"><![CDATA[Сохранить]]></string>
+	<string name="_adm_btn_settings_mix_create"><![CDATA[Создать набор]]></string>
+        <string name="_adm_btn_settings_mix_import"><![CDATA[Импортировать]]></string>
+	<string name="_adm_btn_settings_mix_export"><![CDATA[Экспортировать]]></string>
+	<string name="_adm_btn_settings_mix_delete"><![CDATA[Удалить]]></string>
+        <string name="_adm_btn_settings_mix_hide"><![CDATA[Скрыть]]></string>
+        <string name="_adm_btn_settings_mix_publish"><![CDATA[Публиковать]]></string>
+	<string name="_adm_btn_store_search"><![CDATA[Поиск]]></string>
+	<string name="_adm_dbd_btn_update"><![CDATA[Обновить]]></string>
+	<string name="_adm_dbd_txt_version_n_available"><![CDATA[Новая версия UNA {0}!]]></string>
+	<string name="_adm_dbd_txt_script_on"><![CDATA[UNA на]]></string>
+	<string name="_adm_dbd_txt_htools_status"><![CDATA[{0} - <b>{1}</b>]]></string>
+	<string name="_adm_dbd_txt_installed"><![CDATA[Установлено:]]></string>
+	<string name="_adm_dbd_txt_version"><![CDATA[Версия:]]></string>
+	<string name="_adm_dbd_msg_upgrade_started"><![CDATA[Сайт будет обновлён через минуту. <br />После этого нужно <a href="{0}store.php?page=updates">проверить обновления для модулей</a>.]]></string>
+	<string name="_adm_dbd_txt_su_database"><![CDATA[База данных]]></string>
+	<string name="_adm_dbd_txt_su_system"><![CDATA[Система]]></string>
+	<string name="_adm_dbd_txt_su_system_media"><![CDATA[Системные медиа]]></string>
+	<string name="_adm_dbd_txt_c_clear_all"><![CDATA[Очистить весь кэш]]></string>
+	<string name="_adm_dbd_txt_c_db"><![CDATA[БД]]></string>
+	<string name="_adm_dbd_txt_c_clear_db"><![CDATA[Очистить кэш БД]]></string>
+	<string name="_adm_dbd_txt_c_template"><![CDATA[Тема]]></string>
+	<string name="_adm_dbd_txt_c_clear_template"><![CDATA[Очистить кэш темы]]></string>
+	<string name="_adm_dbd_txt_c_css"><![CDATA[CSS]]></string>
+	<string name="_adm_dbd_txt_c_clear_css"><![CDATA[Очистить кэш CSS]]></string>
+        <string name="_adm_dbd_txt_c_less"><![CDATA[LESS]]></string>
+        <string name="_adm_dbd_txt_c_clear_less"><![CDATA[Очистить кэш LESS]]></string>
+	<string name="_adm_dbd_txt_c_js"><![CDATA[JavaScript]]></string>
+	<string name="_adm_dbd_txt_c_clear_js"><![CDATA[Очистить кэш JavaScript]]></string>
+        <string name="_adm_dbd_txt_c_clear_custom"><![CDATA[Очистить специальный кэш]]></string>
+	<string name="_adm_dbd_err_c_clean_failed"><![CDATA[Не удалось очистить кэш]]></string>
+	<string name="_adm_dbd_msg_c_clean_success"><![CDATA[Кэш был удачно очищен]]></string>
+	<string name="_adm_dbd_msg_c_all_disabled"><![CDATA[Весь кэш был отключён]]></string>
+    <string name="_adm_dsn_cnf_uninstall"><![CDATA[<h3>Удалить тему "{0}"?</h3><p>Удаление темы "{0}" также удалит все связанные с ней данные. Вы хотите продолжить?</p>]]></string>
+    <string name="_adm_dsg_btn_delete"><![CDATA[Удалить]]></string>
+	<string name="_adm_dsg_btn_make_default"><![CDATA[Сделать основным]]></string>
+	<string name="_adm_dsg_dsc_alt_text"><![CDATA[Используется для дополнительного текста для лого-картинки. Используется в качестве лого, если картинка не загружена.]]></string>
+	<string name="_adm_dsg_dsc_splash_warning"><![CDATA[Заметьте, что неправильное применение HTML может испортить дизайн сайта.]]></string>
+	<string name="_adm_dsg_err_cannot_process_action"><![CDATA[Невозможно выполнить действие. Отсутствует связанный обработчик.]]></string>
+	<string name="_adm_dsg_err_deactivate_default"><![CDATA[Невозможно деактивировать тему, выбранную в качестве основной]]></string>
+	<string name="_adm_dsg_err_last_active"><![CDATA[Нужно иметь как минимум одну активную тему.]]></string>
+	<string name="_adm_dsg_err_make_default"><![CDATA[Невозможно сделать тему основной.]]></string>
+	<string name="_adm_dsg_err_remove_old_cover"><![CDATA[Невозможно удалить текущее изображение обложки.]]></string>
+	<string name="_adm_dsg_err_remove_old_icon"><![CDATA[Невозможно удалить текущую иконку.]]></string>
+	<string name="_adm_dsg_err_remove_old_logo"><![CDATA[Невозможно удалить текущую лого-картинку.]]></string>
+	<string name="_adm_dsg_err_save"><![CDATA[Невозможно сохранить: ]]></string>
+	<string name="_adm_dsg_err_save_changes"><![CDATA[Невозможно сохранить изменения.]]></string>
+	<string name="_adm_dsg_scs_save"><![CDATA[Изменения удачно сохранены]]></string>
+        <string name="_adm_dsg_txt_logo_redefinition"><![CDATA[Заметка. Все лого параметры могут быть переопределены в активном на данный момент шаблонном приложении.]]></string>
+	<string name="_adm_dsg_txt_alt_text"><![CDATA[Текст лого]]></string>
+	<string name="_adm_dsg_txt_cover_common"><![CDATA[Стандартная обложка страницы]]></string>
+	<string name="_adm_dsg_txt_cover_unit_profile"><![CDATA[Стандартная обложка миниатюры профиля]]></string>
+	<string name="_adm_dsg_txt_splash_enabled"><![CDATA[Включить титульную страницу]]></string>
+	<string name="_adm_dsg_txt_default"><![CDATA[по умолчанию]]></string>
+	<string name="_adm_dsg_txt_icon_apple"><![CDATA[Устройства Apple Touch (152x152)]]></string>
+	<string name="_adm_dsg_txt_icon_facebook"><![CDATA[Facebook (100x100)]]></string>
+	<string name="_adm_dsg_txt_icon_favicon"><![CDATA[Favicon (16x16)]]></string>
+	<string name="_adm_dsg_txt_upload_cover_common"><![CDATA[Загрузить новое изображение обложки обычных страниц]]></string>
+	<string name="_adm_dsg_txt_upload_cover_unit_profile"><![CDATA[Загрузить новое изображение обложки миниатюры профиля]]></string>
+	<string name="_adm_dsg_txt_upload_icon"><![CDATA[Загрузить новую иконку сайта]]></string>
+	<string name="_adm_dsg_txt_upload_image"><![CDATA[Загрузить новую лого-картинку]]></string>
+	<string name="_adm_dsg_txt_upload_image_preview"><![CDATA[Текущая лого-картинка]]></string>
+	<string name="_adm_dsg_txt_inj_head"><![CDATA[&lt;HEAD&gt; инъекция]]></string>
+	<string name="_adm_dsg_txt_inj_head_inf"><![CDATA[Код для вставки перед закрывающим HEAD тагом]]></string>
+	<string name="_adm_dsg_txt_inj_body"><![CDATA[&lt;BODY&gt; инъекция]]></string>
+	<string name="_adm_dsg_txt_inj_body_inf"><![CDATA[Код для вставки перед закрывающим BODY тагом]]></string>
+	<string name="_adm_err_cannot_process_action"><![CDATA[Невозможно выполнить действие. Отсутствует связанный обработчик.]]></string>
+	<string name="_adm_err_form_view_iu_delete"><![CDATA[Невозможно удалить текущую картинку.]]></string>
+	<string name="_adm_err_form_view_iu_save"><![CDATA[Невозможно сохранить: ]]></string>
+	<string name="_adm_err_modules_already_disabled"><![CDATA[Модуль уже отключён.]]></string>
+	<string name="_adm_err_modules_already_enabled"><![CDATA[Модуль уже включён.]]></string>
+	<string name="_adm_err_modules_already_installed"><![CDATA[Модуль уже установлен.]]></string>
+	<string name="_adm_err_modules_already_uninstalled"><![CDATA[Модуль уже удалён.]]></string>
+	<string name="_adm_err_modules_cannot_add_to_cart"><![CDATA[Невозможно добавить товар в корзину.]]></string>
+	<string name="_adm_err_modules_cannot_checkout_empty_vendor"><![CDATA[Невозможно произвести оплату. Не задан провайдер.]]></string>
+	<string name="_adm_err_modules_cannot_delete_from_cart"><![CDATA[Невозможно удалить товар(ы) из корзины.]]></string>
+	<string name="_adm_err_modules_cannot_remove_package"><![CDATA[Невозможно удалить пакет.]]></string>
+	<string name="_adm_err_modules_cannot_subscribe"><![CDATA[Невозможно инициировать подписку.]]></string>
+	<string name="_adm_err_modules_module_not_found"><![CDATA[Модуль не найден]]></string>
+	<string name="_adm_err_modules_module_not_match"><![CDATA[Обновление не применимо к данному модулю.]]></string>
+	<string name="_adm_err_modules_module_not_installed"><![CDATA[Модуль не установлен]]></string>
+	<string name="_adm_err_modules_module_was_modified"><![CDATA[Модуль был изменён]]></string>
+	<string name="_adm_err_modules_pending_uninstall"><![CDATA[Удаление модуль отложено. Модуль будет удалён автоматически после удаления всех его файлов.]]></string>
+	<string name="_adm_err_modules_pending_uninstall_already"><![CDATA[Модуль уже находится в ожидании удаления.]]></string>
+	<string name="_adm_err_modules_process_action_failed"><![CDATA[Произошла ошибка. Свяжитесь с продавцом модуля]]></string>
+	<string name="_adm_err_modules_wrong_dependency_disable"><![CDATA[Невозможно деактивировать. У модуля есть следующие зависимые модули. Нужно сначала как минимум деактивировать их.]]></string>
+	<string name="_adm_err_modules_wrong_dependency_install"><![CDATA[Сначала нужно установить и активировать следующие модули:]]></string>
+	<string name="_adm_err_modules_wrong_dependency_uninstall"><![CDATA[Невозможно удалить. У модуля есть следующие зависимые модули. Нужно сначала удалить их.]]></string>
+	<string name="_adm_err_modules_wrong_mysql_query"><![CDATA[В следующих MySQL-запросах имеются ошибки:]]></string>
+	<string name="_adm_err_modules_wrong_mysql_query_msg"><![CDATA[Ошибка: {0}]]></string>
+	<string name="_adm_err_modules_wrong_permissions_change"><![CDATA[Невозможно автоматически изменить разрешения. Вам нужно сделать это вручную для следующих файлов и папок:]]></string>
+	<string name="_adm_err_modules_wrong_permissions_check"><![CDATA[Вам нужно изменить разрешения для следующих файлов и папок:]]></string>
+	<string name="_adm_err_modules_wrong_permissions_msg"><![CDATA[{0} - {1}]]></string>
+	<string name="_adm_err_modules_wrong_version"><![CDATA[Модуль имеет несовместимую версию]]></string>
+	<string name="_adm_err_modules_wrong_version_script"><![CDATA[Модуль несовместим с Вашей версией UNA]]></string>
+	<string name="_adm_err_modules_wrong_version_script_update"><![CDATA[Новая версия модуля {0} несовместима с Вашей версией UNA. Пожалуйста, сначала обновите UNA (Студия &gt; Панель &gt; Версия) и затем попробуйте обновить модуль.]]></string>
+	<string name="_adm_err_oauth_cannot_get_token"><![CDATA[Невозможно соединиться с <b>UNA</b>. Пожалуйста, попробуйте позднее.]]></string>
+	<string name="_adm_err_oauth_cannot_read_answer"><![CDATA[Невозможно получить отклик от <b>UNA</b>. Пожалуйста, попробуйте позднее.]]></string>
+	<string name="_adm_err_oauth_empty_key_secret"><![CDATA[Нужно ввести Key и Secret, предоставленные <b>UNA</b> в Настройки -> Общие.]]></string>
+	<string name="_adm_err_operation_failed"><![CDATA[Операция не удалась. Пожалуйста, оповестите нас.]]></string>
+	<string name="_adm_form_btn_displays_cancel"><![CDATA[Отменить]]></string>
+	<string name="_adm_form_btn_displays_edit"><![CDATA[Редактировать дисплей]]></string>
+	<string name="_adm_form_btn_displays_save"><![CDATA[Сохранить]]></string>
+	<string name="_adm_form_btn_field_add"><![CDATA[Добавить]]></string>
+	<string name="_adm_form_btn_field_cancel"><![CDATA[Отменить]]></string>
+	<string name="_adm_form_btn_field_delete"><![CDATA[Удалить поле]]></string>
+	<string name="_adm_form_btn_field_edit"><![CDATA[Редактировать поле]]></string>
+	<string name="_adm_form_btn_field_save"><![CDATA[Сохранить]]></string>
+	<string name="_adm_form_btn_fields_create"><![CDATA[Добавить новое поле]]></string>
+	<string name="_adm_form_btn_fields_visible"><![CDATA[Видимо для]]></string>
+	<string name="_adm_form_btn_forms_cancel"><![CDATA[Отменить]]></string>
+	<string name="_adm_form_btn_forms_edit"><![CDATA[Редактировать Форму]]></string>
+	<string name="_adm_form_btn_forms_save"><![CDATA[Сохранить]]></string>
+        <string name="_adm_form_btn_labels_add"><![CDATA[Добавить]]></string>
+        <string name="_adm_form_btn_labels_back"><![CDATA[Назад]]></string>
+        <string name="_adm_form_btn_labels_cancel"><![CDATA[Отменить]]></string>
+        <string name="_adm_form_btn_labels_submit"><![CDATA[Отправить]]></string>
+  <string name="_adm_form_btn_badges_add"><![CDATA[Добавить бейдж]]></string>
+  <string name="_adm_form_btn_badges_delete"><![CDATA[Удалить]]></string>
+	<string name="_adm_form_btn_pre_lists_add"><![CDATA[Добавить]]></string>
+	<string name="_adm_form_btn_pre_lists_cancel"><![CDATA[Отменить]]></string>
+	<string name="_adm_form_btn_pre_lists_create"><![CDATA[Добавить новый список]]></string>
+	<string name="_adm_form_btn_pre_lists_delete"><![CDATA[Удалить список]]></string>
+	<string name="_adm_form_btn_pre_lists_edit"><![CDATA[Редактировать список]]></string>
+	<string name="_adm_form_btn_pre_lists_save"><![CDATA[Сохранить]]></string>
+	<string name="_adm_form_btn_pre_values_add"><![CDATA[Добавить]]></string>
+	<string name="_adm_form_btn_pre_values_cancel"><![CDATA[Отменить]]></string>
+	<string name="_adm_form_btn_pre_values_delete"><![CDATA[Удалить]]></string>
+	<string name="_adm_form_btn_pre_values_create"><![CDATA[Добавить новый элемент]]></string>
+	<string name="_adm_form_btn_pre_values_delete_item"><![CDATA[Удалить элемент]]></string>
+	<string name="_adm_form_btn_pre_values_edit_item"><![CDATA[Редактировать элемент]]></string>
+	<string name="_adm_form_btn_search_forms_edit"><![CDATA[Редактировать форму поиска]]></string>
+    <string name="_adm_form_btn_search_forms_fields_edit"><![CDATA[Редактировать поле формы поиска]]></string>
+    <string name="_adm_form_btn_search_forms_fields_reset"><![CDATA[Сбросить]]></string>
+    <string name="_adm_form_btn_search_forms_save"><![CDATA[Сохранить]]></string>
+    <string name="_adm_form_btn_search_forms_cancel"><![CDATA[Отменить]]></string>
+	<string name="_adm_form_dsc_displays_title"><![CDATA[Название режима отображения Формы. Видимо только в Студии.]]></string>
+	<string name="_adm_form_dsc_field_attrs_max"><![CDATA[Введите числовое значение]]></string>
+	<string name="_adm_form_dsc_field_attrs_min"><![CDATA[Введите числовое значение]]></string>
+	<string name="_adm_form_dsc_field_attrs_src"><![CDATA[Введите правильный URL картинки]]></string>
+	<string name="_adm_form_dsc_field_attrs_step"><![CDATA[Введите числовое значение]]></string>
+	<string name="_adm_form_dsc_field_caption"><![CDATA[Название элемента, отображаемое на сайте]]></string>
+	<string name="_adm_form_dsc_field_caption_block_header"><![CDATA[Заголовок для группы полей]]></string>
+	<string name="_adm_form_dsc_field_caption_system"><![CDATA[Заголовок поля, отображается только в Студии.]]></string>
+	<string name="_adm_form_dsc_field_checker_error_captcha"><![CDATA[Сообщение об ошибке, когда текст на картинке не соответствует введённому тексту]]></string>
+	<string name="_adm_form_dsc_field_checker_params_preg"><![CDATA[Используйте стандартные <a href="http://en.wikipedia.org/wiki/Regular_expression" target="_blank">регулярные выражения</a>. Например: #^[A-Za-z0-9]{3,16}$#]]></string>
+	<string name="_adm_form_dsc_field_collapsed"><![CDATA[Упаковать группу данного поля по умолчанию]]></string>
+	<string name="_adm_form_dsc_field_html"><![CDATA[Выбрать тип HTML-редактора]]></string>
+	<string name="_adm_form_dsc_field_info"><![CDATA[Введите описание поля (необязательно)]]></string>
+        <string name="_adm_form_dsc_field_privacy"><![CDATA[Отметьте, если для данного поля настройки "Конфиденциальности" могут быть изменены]]></string>
+	<string name="_adm_form_dsc_field_required"><![CDATA[Отметьте, если поле должно иметь значение]]></string>
+	<string name="_adm_form_dsc_field_unique"><![CDATA[Отметьте, если поле должно иметь уникальное значение]]></string>
+	<string name="_adm_form_dsc_field_value_button"><![CDATA[Введите заголовок для кнопки]]></string>
+	<string name="_adm_form_dsc_field_value_checkbox"><![CDATA[Послать эти данные, если фладок отмечен и форма отослана]]></string>
+	<string name="_adm_form_dsc_field_value_reset"><![CDATA[Заголовок для кнопки (этот тип кнопки используется для сброса формы в исходное состояние)]]></string>
+	<string name="_adm_form_dsc_field_value_submit"><![CDATA[Заголовок для кнопки (этот тип кнопки используется для посылки данных формы)]]></string>
+	<string name="_adm_form_dsc_field_visible_for_levels"><![CDATA[Выбрать членства, разрешённые для просмотра элемента данного меню]]></string>
+	<string name="_adm_form_dsc_field_db_pass"><![CDATA[Выберите, как данные поля будут обрабатываться перед записью в базу данных]]></string>
+	<string name="_adm_form_dsc_forms_title"><![CDATA[Название Формы. Отображается только в Студии.]]></string>
+	<string name="_adm_form_dsc_pre_lists_title"><![CDATA[Название списка для использования только в Студии]]></string>
+	<string name="_adm_form_dsc_pre_values_empty"><![CDATA[Вы можете использовать его для элементов, таких как "Пожалуйста, выберите...", которые не могут быть отправлены.]]></string>
+	<string name="_adm_form_dsc_pre_values_lkey"><![CDATA[Название злемента, отображаемое на сайте]]></string>
+	<string name="_adm_form_dsc_search_forms_fields_search_type"><![CDATA[Тип элемента управления в форме поиска]]></string>
+    <string name="_adm_form_dsc_search_forms_title"><![CDATA[Название Формы поиска. Отображается только в Студии.]]></string>
+	<string name="_adm_form_err_cannot_process_action"><![CDATA[Невозможно выполнить действие. Отсутствует связанный обработчик.]]></string>
+	<string name="_adm_form_err_displays_edit"><![CDATA[Невозможно обновить дисплей]]></string>
+	<string name="_adm_form_err_displays_title"><![CDATA[Введите заголовок, более 3 символов]]></string>
+	<string name="_adm_form_err_field_add"><![CDATA[Невозможно добавить новое поле]]></string>
+        <string name="_adm_form_err_field_add_already_exists"><![CDATA[Поле с таким же именем уже существует]]></string>
+	<string name="_adm_form_err_field_add_not_allowed"><![CDATA[Поля не могут быть добавлены в эту форму]]></string>
+        <string name="_adm_form_err_field_caption"><![CDATA[Необходимо имя из как минимум 3 символов.]]></string>
+	<string name="_adm_form_err_field_caption_system"><![CDATA[Необходимо имя из как минимум 3 символов.]]></string>
+	<string name="_adm_form_err_field_checker_error"><![CDATA[Нужно ввести сообщение об ошибке]]></string>
+	<string name="_adm_form_err_field_checker_func"><![CDATA[Нужно выбрать проверочную функцию]]></string>
+	<string name="_adm_form_err_field_checker_params_length_max"><![CDATA[Введите макс. значение, положительное целое число]]></string>
+	<string name="_adm_form_err_field_checker_params_length_min"><![CDATA[Введите мин. значение, положительное целое число]]></string>
+	<string name="_adm_form_err_field_checker_params_preg"><![CDATA[Введите правильное регулярное выражение]]></string>
+	<string name="_adm_form_err_field_edit"><![CDATA[Невозможно обновить поле]]></string>
+	<string name="_adm_form_err_field_show_to"><![CDATA[Невозможно обновить поле]]></string>
+	<string name="_adm_form_err_field_value_doublerange"><![CDATA[Значение по умолчанию должно быть пустым или выглядеть как 12-23]]></string>
+	<string name="_adm_form_err_field_value_number"><![CDATA[Используйте только числовые символы]]></string>
+	<string name="_adm_form_err_field_values"><![CDATA[Нужно выбрать набор данных из списка.]]></string>
+	<string name="_adm_form_err_forms_edit"><![CDATA[Невозможно обновить форму]]></string>
+	<string name="_adm_form_err_forms_title"><![CDATA[Введите название, более 3 символов]]></string>
+        <string name="_adm_form_err_labels_add"><![CDATA[Невозможно добавить метку]]></string>
+        <string name="_adm_form_err_labels_edit"><![CDATA[Невозможно обновить метку]]></string>
+        <string name="_adm_form_err_labels_value"><![CDATA[Метка должна иметь уникальное, не пустое значение.]]></string>
+	<string name="_adm_form_err_missing_params"><![CDATA[Отсутствуют необходимые параметры.]]></string>
+	<string name="_adm_form_err_pre_lists_create"><![CDATA[Невозможно добавить список]]></string>
+	<string name="_adm_form_err_pre_lists_edit"><![CDATA[Невозможно обновить список]]></string>
+	<string name="_adm_form_err_pre_lists_title"><![CDATA[Введите заголовок, более 3 символов]]></string>
+	<string name="_adm_form_err_pre_values_create"><![CDATA[Невозможно добавить элемент]]></string>
+	<string name="_adm_form_err_pre_values_create_forbidden"><![CDATA[Этот список уже используется. Невозможно добавить элемент, не являющийся числом, а также менее 1 или более {0} элементов.]]></string>
+	<string name="_adm_form_err_pre_values_delete"><![CDATA[Невозможно удалить элемент]]></string>
+	<string name="_adm_form_err_pre_values_edit"><![CDATA[Невозможно обновить элемент]]></string>
+	<string name="_adm_form_err_pre_values_lkey"><![CDATA[Введите заголовок, более 1 символа]]></string>
+	<string name="_adm_form_err_search_forms_essential"><![CDATA[Это важное поле. Заполните его, пожалуйста.]]></string>
+    <string name="_adm_form_err_search_forms_fields_edit"><![CDATA[Не могу обновить поле формы поиска.]]></string>
+    <string name="_adm_from_err_search_forms_fields_reset"><![CDATA[Не могу сбросить форму поиска.]]></string>
+    <string name="_adm_form_err_search_forms_edit"><![CDATA[Не могу обновить выбранную форму поиска.]]></string>
+    <string name="_adm_form_err_search_forms_title"><![CDATA[Введите имя, более 3 символов]]></string>
+	<string name="_adm_form_txt_all_modules"><![CDATA[Все модули]]></string>
+	<string name="_adm_form_txt_confirm_delete"><![CDATA[Вы уверены, что хотите удалить это поле? Оно будет удалено со всех дисплеев! Вместо этого можно просто отключить его.]]></string>
+  <string name="_adm_form_txt_audit_added"><![CDATA[Добавлено]]></string>
+  <string name="_adm_form_txt_audit_profile"><![CDATA[Профиль]]></string>
+  <string name="_adm_form_txt_audit_content"><![CDATA[Контент]]></string>
+  <string name="_adm_form_txt_audit_module"><![CDATA[Модуль]]></string>
+  <string name="_adm_pgt_txt_audit_context"><![CDATA[Контекст]]></string>
+  <string name="_adm_pgt_txt_audit_action"><![CDATA[Действие]]></string>
+
+  <string name="_adm_form_txt_badges_text"><![CDATA[Текст]]></string>
+  <string name="_adm_form_txt_badges_view"><![CDATA[Вид]]></string>
+  <string name="_adm_form_txt_badges_color"><![CDATA[Цвет фона]]></string>
+  <string name="_adm_form_dsc_badges_color"><![CDATA[Цвет фона]]></string>
+  <string name="_adm_form_txt_badges_is_icon_only"><![CDATA[Показывать только иконку]]></string>
+  <string name="_adm_form_txt_badges_btn_current_icon_image_delete"><![CDATA[Удалить]]></string>
+  <string name="_adm_form_txt_badges_icon"><![CDATA[Иконка]]></string>
+  <string name="_adm_form_txt_badges_icon_image"><![CDATA[]]></string>
+  <string name="_adm_form_txt_badges_icon_image_new"><![CDATA[]]></string>
+  <string name="_adm_form_txt_badges_icon_image_old"><![CDATA[Текущая иконка]]></string>
+  <string name="_adm_form_dsc_badges_icon"><![CDATA[Вы можете использовать здесь иконку для шрифта]]></string>
+  <string name="_adm_form_dsc_badges_items_icon_image_current"><![CDATA[]]></string>
+  <string name="_adm_form_dsc_badges_icon_image"><![CDATA[или загрузить маленькую картинку для отображения рядом со ссылкой.]]></string>
+  <string name="_adm_form_dsc_badges_icon_image_current"><![CDATA[Картинка не загружена. В бейдже будет использован текст.]]></string>
+  <string name="_adm_form_err_badges_icon"><![CDATA[Вы должны ввести иконку для шрифта]]></string>
+  <string name="_adm_form_err_badges_icon_image"><![CDATA[невозможно обработать изображение: ]]></string>
+  <string name="_adm_form_err_badges_icon_image_remove"><![CDATA[Нельзя удалить изображение иконки: ]]></string>
+  <string name="_adm_form_btn_badges_submit"><![CDATA[Отправить]]></string>
+  <string name="_adm_form_btn_badges_cancel"><![CDATA[Отменить]]></string>
+  <string name="_adm_form_txt_badges_added"><![CDATA[Добавлено]]></string>
+  <string name="_adm_form_txt_badges_module"><![CDATA[Модуль]]></string>
+  <string name="_adm_form_txt_badges_add_popup"><![CDATA[Добавить новый бейдж]]></string>
+  <string name="_adm_form_txt_badges_edit_popup"><![CDATA[Изменить "{0}" бейдж]]></string>
+  <string name="_adm_pgt_txt_badges_text"><![CDATA[Текст]]></string>
+  <string name="_adm_pgt_txt_badges_icon"><![CDATA[Иконка]]></string>
+  
+	<string name="_adm_form_txt_displays_edit_popup"><![CDATA[Редактировать "{0}" дисплей]]></string>
+	<string name="_adm_form_txt_displays_gl_fields"><![CDATA[Поля]]></string>
+	<string name="_adm_form_txt_displays_gl_form"><![CDATA[Форма]]></string>
+	<string name="_adm_form_txt_displays_gl_module"><![CDATA[Модуль]]></string>
+	<string name="_adm_form_txt_displays_gl_title"><![CDATA[Системное имя]]></string>
+	<string name="_adm_form_txt_displays_manage_fields"><![CDATA[Управление полями]]></string>
+	<string name="_adm_form_txt_displays_title"><![CDATA[Системное имя]]></string>
+	<string name="_adm_form_txt_field_add_popup"><![CDATA[Добавить новое Поле]]></string>
+	<string name="_adm_form_txt_field_attrs_max"><![CDATA[Макс. значение]]></string>
+	<string name="_adm_form_txt_field_attrs_min"><![CDATA[Мин. значение]]></string>
+	<string name="_adm_form_txt_field_attrs_src"><![CDATA[Адрес картинки]]></string>
+	<string name="_adm_form_txt_field_attrs_step"><![CDATA[Шаг]]></string>
+	<string name="_adm_form_txt_field_caption"><![CDATA[Заголовок]]></string>
+	<string name="_adm_form_txt_field_caption_system"><![CDATA[Системный заголовок]]></string>
+	<string name="_adm_form_txt_field_checked"><![CDATA[Отмечено по умолчанию]]></string>
+	<string name="_adm_form_txt_field_checked_switcher"><![CDATA[Включено по умолчанию]]></string>
+	<string name="_adm_form_txt_field_checker_avail"><![CDATA[Доступность данных (нужно ввести значение)]]></string>
+	<string name="_adm_form_txt_field_checker_captcha"><![CDATA[Капча (проверка корректного текста для картинки безопасности)]]></string>
+        <string name="_adm_form_txt_field_checker_custom"><![CDATA[Индивидуальная проверка]]></string>
+	<string name="_adm_form_txt_field_checker_date"><![CDATA[Дата (проверка правильного формата даты)]]></string>
+        <string name="_adm_form_txt_field_checker_date_range"><![CDATA[Возрастной диапазон]]></string>
+	<string name="_adm_form_txt_field_checker_date_time"><![CDATA[Дата и время (проверка правильного формата даты и времени)]]></string>
+	<string name="_adm_form_txt_field_checker_email"><![CDATA[Email (формат правильного эл. адреса)]]></string>
+	<string name="_adm_form_txt_field_checker_empty"><![CDATA[Выбрать...]]></string>
+	<string name="_adm_form_txt_field_checker_error"><![CDATA[Сообщение об ошибке, если не прошло проверку]]></string>
+	<string name="_adm_form_txt_field_checker_func"><![CDATA[Проверить на]]></string>
+        <string name="_adm_form_txt_field_checker_func_info_custom"><![CDATA[Заметка. Не рекомендуется редактировать это поле без крайней необходимости.]]></string>
+	<string name="_adm_form_txt_field_checker_length"><![CDATA[Длина данных (ограничить число символов)]]></string>
+        <string name="_adm_form_txt_field_checker_location"><![CDATA[Данные местоположения (проверка корректности данных местоположение)]]></string>
+	<string name="_adm_form_txt_field_checker_no_spam"><![CDATA[Свобода от спама (проверить, чтобы ввод был свободен от спама)]]></string>
+	<string name="_adm_form_txt_field_checker_params_length_max"><![CDATA[Макс. значение]]></string>
+	<string name="_adm_form_txt_field_checker_params_length_min"><![CDATA[Мин. значение]]></string>
+	<string name="_adm_form_txt_field_checker_params_required"><![CDATA[Значение обязательно]]></string>
+	<string name="_adm_form_txt_field_checker_params_preg"><![CDATA[Выражение]]></string>
+	<string name="_adm_form_txt_field_checker_preg"><![CDATA[Регулярное выражение (нужно ввести что-то специфичное)]]></string>
+	<string name="_adm_form_txt_field_collapsed"><![CDATA[Свёрнуто]]></string>
+	<string name="_adm_form_txt_field_edit_popup"><![CDATA[Редактировать "{0}" поле]]></string>
+	<string name="_adm_form_txt_field_html"><![CDATA[HTML-редактор]]></string>
+	<string name="_adm_form_txt_field_html_full"><![CDATA[Полный]]></string>
+	<string name="_adm_form_txt_field_html_mini"><![CDATA[Минимальный]]></string>
+	<string name="_adm_form_txt_field_html_none"><![CDATA[Без редактора]]></string>
+	<string name="_adm_form_txt_field_html_standard"><![CDATA[Стандартный]]></string>
+	<string name="_adm_form_txt_field_info"><![CDATA[Описание]]></string>
+	<string name="_adm_form_txt_field_module"><![CDATA[Модуль]]></string>
+	<string name="_adm_form_txt_field_name"><![CDATA[Имя]]></string>
+	<string name="_adm_form_txt_field_object"><![CDATA[Форма]]></string>
+        <string name="_adm_form_txt_field_privacy"><![CDATA[Конфиденциальность]]></string>
+	<string name="_adm_form_txt_field_required"><![CDATA[Необходимое]]></string>
+	<string name="_adm_form_txt_field_show_to_popup"><![CDATA[Показывать "{0}" поле формы для: ]]></string>
+        <string name="_adm_form_txt_field_type_block_end"><![CDATA[конец блока]]></string>
+	<string name="_adm_form_txt_field_type_block_header"><![CDATA[заголовок блока]]></string>
+	<string name="_adm_form_txt_field_type_button"><![CDATA[кнопка]]></string>
+	<string name="_adm_form_txt_field_type_captcha"><![CDATA[капча]]></string>
+	<string name="_adm_form_txt_field_type_checkbox"><![CDATA[флажок]]></string>
+	<string name="_adm_form_txt_field_type_checkbox_set"><![CDATA[набор флажков]]></string>
+	<string name="_adm_form_txt_field_type_custom"><![CDATA[индивидуальный]]></string>
+	<string name="_adm_form_txt_field_type_datepicker"><![CDATA[дата]]></string>
+	<string name="_adm_form_txt_field_type_datepicker_range"><![CDATA[диапазон даты]]></string>
+	<string name="_adm_form_txt_field_type_datepicker_range_age"><![CDATA[диапазон возраста]]></string>
+	<string name="_adm_form_txt_field_type_datetime"><![CDATA[дата и время]]></string>
+	<string name="_adm_form_txt_field_type_datetime_range"><![CDATA[диапазон даты и времени]]></string>
+	<string name="_adm_form_txt_field_type_datetime_range_age"><![CDATA[диапазон возраста]]></string>
+	<string name="_adm_form_txt_field_type_display"><![CDATA[Тип]]></string>
+	<string name="_adm_form_txt_field_type_doublerange"><![CDATA[ползунок с двойным направлением]]></string>
+	<string name="_adm_form_txt_field_type_file"><![CDATA[файл]]></string>
+	<string name="_adm_form_txt_field_type_files"><![CDATA[файлы]]></string>
+	<string name="_adm_form_txt_field_type_hidden"><![CDATA[спрятано]]></string>
+	<string name="_adm_form_txt_field_type_image"><![CDATA[картинка]]></string>
+	<string name="_adm_form_txt_field_type_input_set"><![CDATA[набор полей ввода]]></string>
+	<string name="_adm_form_txt_field_type_location"><![CDATA[местонахождение]]></string>
+  <string name="_adm_form_txt_field_type_location_radius"><![CDATA[радиус местонахождения]]></string>
+	<string name="_adm_form_txt_field_type_number"><![CDATA[число]]></string>
+	<string name="_adm_form_txt_field_type_password"><![CDATA[пароль]]></string>
+	<string name="_adm_form_txt_field_type_radio_set"><![CDATA[набор переключателей]]></string>
+	<string name="_adm_form_txt_field_type_reset"><![CDATA[сброс]]></string>
+	<string name="_adm_form_txt_field_type_select"><![CDATA[выбор]]></string>
+	<string name="_adm_form_txt_field_type_select_multiple"><![CDATA[выбор (множественный)]]></string>
+	<string name="_adm_form_txt_field_type_slider"><![CDATA[ползунок]]></string>
+	<string name="_adm_form_txt_field_type_submit"><![CDATA[отправка]]></string>
+	<string name="_adm_form_txt_field_type_switcher"><![CDATA[переключатель]]></string>
+	<string name="_adm_form_txt_field_type_text"><![CDATA[текст]]></string>
+	<string name="_adm_form_txt_field_type_text_auto"><![CDATA[авто текст]]></string>
+	<string name="_adm_form_txt_field_type_textarea"><![CDATA[текстовое поле]]></string>
+        <string name="_adm_form_txt_field_type_time"><![CDATA[время]]></string>
+	<string name="_adm_form_txt_field_type_value"><![CDATA[инфо]]></string>
+	<string name="_adm_form_txt_field_unique"><![CDATA[Уникальное]]></string>
+	<string name="_adm_form_txt_field_value_button"><![CDATA[Заголовок]]></string>
+	<string name="_adm_form_txt_field_value_checkbox"><![CDATA[Значение]]></string>
+	<string name="_adm_form_txt_field_value_custom_text"><![CDATA[Индивидуальный текст]]></string>
+	<string name="_adm_form_txt_field_value_default"><![CDATA[Значение по умолчанию]]></string>
+	<string name="_adm_form_txt_field_value_files"><![CDATA[Активные загрузчики]]></string>
+	<string name="_adm_form_txt_field_value_select_value"><![CDATA[Выбрать значение...]]></string>
+	<string name="_adm_form_txt_field_values"><![CDATA[Значения]]></string>
+	<string name="_adm_form_txt_field_values_manage"><![CDATA[Управление значениями]]></string>
+	<string name="_adm_form_txt_field_values_select_list"><![CDATA[Выбрать список...]]></string>
+	<string name="_adm_form_txt_field_visible_for"><![CDATA[Видимо для]]></string>
+	<string name="_adm_form_txt_field_visible_for_all"><![CDATA[Всех]]></string>
+	<string name="_adm_form_txt_field_visible_for_levels"><![CDATA[Выбрать уровни]]></string>
+	<string name="_adm_form_txt_field_visible_for_selected"><![CDATA[Выбранные уровни]]></string>
+	<string name="_adm_form_txt_field_db_pass"><![CDATA[Обработать как]]></string>
+        <string name="_adm_form_txt_field_db_pass_date"><![CDATA[Дата]]></string>
+        <string name="_adm_form_txt_field_db_pass_date_ts"><![CDATA[Дата (метка времени Unix)]]></string>
+        <string name="_adm_form_txt_field_db_pass_date_utc"><![CDATA[UTC дата (метка времени Unix)]]></string>
+        <string name="_adm_form_txt_field_db_pass_date_time"><![CDATA[Дата и время]]></string>
+        <string name="_adm_form_txt_field_db_pass_date_time_ts"><![CDATA[Дата и время (метка времени Unix)]]></string>
+        <string name="_adm_form_txt_field_db_pass_date_time_utc"><![CDATA[UTC дата и время (метка времени Unix)]]></string>
+        <string name="_adm_form_txt_field_db_pass_select_value"><![CDATA[Выбрать значение...]]></string>
+	<string name="_adm_form_txt_fields_caption_system"><![CDATA[Системное имя]]></string>
+	<string name="_adm_form_txt_fields_manage_visibility"><![CDATA[Управление настройками видимости]]></string>
+	<string name="_adm_form_txt_fields_module"><![CDATA[Модуль]]></string>
+	<string name="_adm_form_txt_fields_type"><![CDATA[Тип]]></string>
+	<string name="_adm_form_txt_fields_visible"><![CDATA[Видимо для]]></string>
+	<string name="_adm_form_txt_forms_edit_popup"><![CDATA[Редактировать "{0}" форму]]></string>
+	<string name="_adm_form_txt_forms_gl_displays"><![CDATA[Дисплеи]]></string>
+	<string name="_adm_form_txt_forms_gl_module"><![CDATA[Модуль]]></string>
+	<string name="_adm_form_txt_forms_gl_title"><![CDATA[Системное имя]]></string>
+	<string name="_adm_form_txt_forms_manage_displays"><![CDATA[Управление дисплеями]]></string>
+	<string name="_adm_form_txt_forms_n_displays"><![CDATA[{0} дисплеев]]></string>
+	<string name="_adm_form_txt_forms_n_fields"><![CDATA[{0} полей]]></string>
+	<string name="_adm_form_txt_forms_title"><![CDATA[Системное имя]]></string>
+        <string name="_adm_form_txt_labels_add_popup"><![CDATA[Добавить метку]]></string>
+        <string name="_adm_form_txt_labels_edit_popup"><![CDATA[Изменить "{0}" метку]]></string>
+        <string name="_adm_form_txt_labels_items"><![CDATA[Элементы]]></string>
+        <string name="_adm_form_txt_labels_manage_items"><![CDATA[Управление дочерними метками]]></string>
+        <string name="_adm_form_txt_labels_n_items"><![CDATA[{0} элемент]]></string>
+        <string name="_adm_form_txt_labels_parent"><![CDATA[Родитель]]></string>
+        <string name="_adm_form_txt_labels_parent_empty"><![CDATA[Нет родителя]]></string>
+        <string name="_adm_form_txt_labels_grandparent_label"><![CDATA[Прородительская метка]]></string>
+        <string name="_adm_form_txt_labels_parent_label"><![CDATA[Родительская метка]]></string>
+        <string name="_adm_form_txt_labels_sibling_labels"><![CDATA[Метки того же уровня]]></string>
+        <string name="_adm_form_txt_labels_value"><![CDATA[Метка]]></string>        
+	<string name="_adm_form_txt_pre_lists_country"><![CDATA[Страна]]></string>
+	<string name="_adm_form_txt_pre_lists_create_popup"><![CDATA[Добавить новый список]]></string>
+	<string name="_adm_form_txt_pre_lists_edit_popup"><![CDATA[Редактировать "{0}" список]]></string>
+	<string name="_adm_form_txt_pre_lists_gl_module"><![CDATA[Модуль]]></string>
+	<string name="_adm_form_txt_pre_lists_gl_title"><![CDATA[Системное имя]]></string>
+	<string name="_adm_form_txt_pre_lists_gl_use_for_sets"><![CDATA[Использовать для наборов]]></string>
+	<string name="_adm_form_txt_pre_lists_gl_values"><![CDATA[Значения]]></string>
+	<string name="_adm_form_txt_pre_lists_language"><![CDATA[Язык]]></string>
+	<string name="_adm_form_txt_pre_lists_manage_values"><![CDATA[Управление значениями]]></string>
+	<string name="_adm_form_txt_pre_lists_n_values"><![CDATA[{0} элементов]]></string>
+	<string name="_adm_form_txt_pre_lists_no"><![CDATA[Нет]]></string>
+	<string name="_adm_form_txt_pre_lists_sex"><![CDATA[Пол]]></string>
+	<string name="_adm_form_txt_pre_lists_title"><![CDATA[Системное имя]]></string>
+	<string name="_adm_form_txt_pre_lists_yes"><![CDATA[Да]]></string>
+	<string name="_adm_form_txt_pre_values_create_popup"><![CDATA[Добавить новый элемент]]></string>
+	<string name="_adm_form_txt_pre_values_edit_popup"><![CDATA[Редактировать "{0}" элемент]]></string>
+	<string name="_adm_form_txt_pre_values_empty"><![CDATA[Использовать пустое значение для данного элемента]]></string>
+	<string name="_adm_form_txt_pre_values_gl_lkey"><![CDATA[Заголовок]]></string>
+	<string name="_adm_form_txt_pre_values_lkey"><![CDATA[Заголовок]]></string>
+	<string name="_adm_form_txt_search_forms_edit_popup"><![CDATA[Редактировать "{0}" форму поиска]]></string>
+    <string name="_adm_form_txt_search_forms_fields"><![CDATA[Поля]]></string>
+    <string name="_adm_form_txt_search_forms_fields_type"><![CDATA[Тип]]></string>
+    <string name="_adm_form_txt_search_forms_fields_caption"><![CDATA[Заголовок]]></string>
+    <string name="_adm_form_txt_search_forms_fields_info"><![CDATA[Описание]]></string>
+    <string name="_adm_form_txt_search_forms_fields_search_type"><![CDATA[Тип поиска]]></string>
+    <string name="_adm_form_txt_search_forms_fields_select_object"><![CDATA[Выбрать форму...]]></string>
+    <string name="_adm_form_txt_search_forms_fields_edit_popup"><![CDATA[Редактировать "{0}" поле формы поиска]]></string>
+    <string name="_adm_form_txt_search_forms_manage_fields"><![CDATA[Управление полями]]></string>
+    <string name="_adm_form_txt_search_forms_module"><![CDATA[Модуль]]></string>
+    <string name="_adm_form_txt_search_forms_n_fields"><![CDATA[{0} полей]]></string>
+    <string name="_adm_form_txt_search_forms_title"><![CDATA[Системное имя]]></string>
+	<string name="_adm_form_txt_select_display"><![CDATA[Выбрать дисплей...]]></string>
+	<string name="_adm_form_txt_select_form"><![CDATA[Выбрать форму...]]></string>
+	<string name="_adm_form_txt_select_list"><![CDATA[Выбрать список...]]></string>
+	<string name="_adm_from_err_field_delete"><![CDATA[Невозможно удалить поле]]></string>
+	<string name="_adm_from_err_pre_lists_delete"><![CDATA[Невозможно удалить список]]></string>
+	<string name="_adm_ipbl_Date_of_finish"><![CDATA[Дата окончания срока]]></string>
+	<string name="_adm_ipbl_IP_Role"><![CDATA[IP-роль]]></string>
+	<string name="_adm_ipbl_Stored_members_caption"><![CDATA[Сохранённые IP посещавших сайт пользователей]]></string>
+	<string name="_adm_ipbl_Type0_desc"><![CDATA[Тип IP-списка 0: отключён]]></string>
+	<string name="_adm_ipbl_Type1_desc"><![CDATA[Тип IP-списка 1: Все IP разрешены, кроме перечисленных]]></string>
+	<string name="_adm_ipbl_Type2_desc"><![CDATA[Тип IP-списка 2: Все IP заблокированы, кроме перечисленных]]></string>
+	<string name="_adm_ipbl_sample"><![CDATA[образец]]></string>
+    <string name="_adm_lang_cnf_uninstall"><![CDATA[<h3>Удалить "{0}" язык?</h3><p>Удаление "{0}" языка также удалит все его данные. Вы хотите продолжить?</p>]]></string>
+	<string name="_adm_lmi_cpt_actions"><![CDATA[Действия]]></string>
+    <string name="_adm_lmi_cpt_badges"><![CDATA[Бейджи]]></string>
+	<string name="_adm_lmi_cpt_categories"><![CDATA[Категории]]></string>
+	<string name="_adm_lmi_cpt_checkout"><![CDATA[Оплата {checkout_counter}]]></string>
+	<string name="_adm_lmi_cpt_cover"><![CDATA[Обложка]]></string>
+	<string name="_adm_lmi_cpt_search"><![CDATA[Поиск]]></string>
+	<string name="_adm_lmi_cpt_search_forms"><![CDATA[Формы поиска]]></string>
+    <string name="_adm_lmi_cpt_search_fields"><![CDATA[Поля поиска]]></string>
+	<string name="_adm_lmi_cpt_splash"><![CDATA[Заставка]]></string>
+	<string name="_adm_lmi_cpt_displays"><![CDATA[Дисплеи]]></string>
+	<string name="_adm_lmi_cpt_downloaded"><![CDATA[Скачано]]></string>
+	<string name="_adm_lmi_cpt_etemplates"><![CDATA[Email-ы]]></string>
+	<string name="_adm_lmi_cpt_etemplates_hf"><![CDATA[Email-шаблон]]></string>
+	<string name="_adm_lmi_cpt_featured"><![CDATA[Избранные]]></string>
+	<string name="_adm_lmi_cpt_fields"><![CDATA[Поля]]></string>
+	<string name="_adm_lmi_cpt_files"><![CDATA[Файлы]]></string>
+	<string name="_adm_lmi_cpt_forms"><![CDATA[Формы]]></string>
+	<string name="_adm_lmi_cpt_general"><![CDATA[Общие]]></string>
+	<string name="_adm_lmi_cpt_goodies"><![CDATA[Витрина]]></string>
+	<string name="_adm_lmi_cpt_icon"><![CDATA[Иконка сайта]]></string>
+	<string name="_adm_lmi_cpt_injections"><![CDATA[Вставки]]></string>
+	<string name="_adm_lmi_cpt_images"><![CDATA[Изображения]]></string>
+	<string name="_adm_lmi_cpt_items"><![CDATA[Элементы]]></string>
+	<string name="_adm_lmi_cpt_keys"><![CDATA[Ключи]]></string>
+        <string name="_adm_lmi_cpt_labels"><![CDATA[Метки]]></string>
+	<string name="_adm_lmi_cpt_latest"><![CDATA[Новые]]></string>
+	<string name="_adm_lmi_cpt_levels"><![CDATA[Уровни]]></string>
+	<string name="_adm_lmi_cpt_logo"><![CDATA[Лого]]></string>
+	<string name="_adm_lmi_cpt_menus"><![CDATA[Меню]]></string>
+	<string name="_adm_lmi_cpt_pre_lists"><![CDATA[Списки данных]]></string>
+	<string name="_adm_lmi_cpt_pre_values"><![CDATA[Элементы данных]]></string>
+	<string name="_adm_lmi_cpt_popular"><![CDATA[Популярные]]></string>
+	<string name="_adm_lmi_cpt_purchases"><![CDATA[Покупки]]></string>
+	<string name="_adm_lmi_cpt_sets"><![CDATA[Наборы]]></string>
+	<string name="_adm_lmi_cpt_settings"><![CDATA[Настройки]]></string>
+	<string name="_adm_lmi_cpt_updates"><![CDATA[Обновления]]></string>
+	<string name="_adm_mobile_page_homepage"><![CDATA[Домашняя страница]]></string>
+	<string name="_adm_mobile_page_profile"><![CDATA[Профиль]]></string>
+    <string name="_adm_mod_cnf_uninstall"><![CDATA[<h3>Удалить "{0}" модуль?</h3><p>Удаление "{0}" модуля также удалит все его данные. Вы хотите продолжить?</p>]]></string>
+	<string name="_adm_mod_err_cannot_process_action"><![CDATA[Невозможно выполнить действие. Отсутствует связанный обработчик.]]></string>
+    <string name="_adm_mod_err_only_admin_can_perform_operations_with_modules"><![CDATA[Только админ может выполнять операции над модулями]]></string>
+	<string name="_adm_mod_err_process_operation_failed"><![CDATA[Невозможно {0} модуль из "{1}" директории]]></string>
+	<string name="_adm_mod_msg_process_operation_scheduled"><![CDATA[Операция добавлена в очередь и будет выполнена через несколько минут. Пожалуйста, подождите.]]></string>
+	<string name="_adm_msg_modules_success_added_to_cart"><![CDATA[Товар был успешно добавлен в корзину.]]></string>
+	<string name="_adm_msg_modules_success_checkouted"><![CDATA[Оплата успешно принята и будет автоматически обработана через несколько минут. Затем приобретённые товары будут доступны в меню Приложения -> Покупки. Если по какой-то причине этого не произошло, пожалуйста свяжитесь с продавцом товара, предоставив ему детали транзакции.]]></string>
+	<string name="_adm_msg_modules_success_delete"><![CDATA[Пакет удачно удалён]]></string>
+	<string name="_adm_msg_modules_success_disable"><![CDATA[Пакет удачно отключён]]></string>
+	<string name="_adm_msg_modules_success_enable"><![CDATA[Пакет удачно подключён]]></string>
+	<string name="_adm_msg_modules_success_install"><![CDATA[Пакет удачно установлен]]></string>
+	<string name="_adm_msg_modules_success_uninstall"><![CDATA[Пакет удачно отменён]]></string>
+	<string name="_adm_msg_oauth_need_authorize"><![CDATA[Вам нужно зайти в свой <b>UNA</b> аккаунт, чтобы запросить данные. Нажмите <a href="{0}">здесь</a> для входа.]]></string>
+        <string name="_adm_msg_oauth_non_owner_logged"><![CDATA[Заметьте. Вы вошли в систему, используя UNA аккаунт, который не является владельцем пары Key&Secret.]]></string>
+	<string name="_adm_nav_btn_current_icon_image_delete"><![CDATA[Удалить]]></string>
+	<string name="_adm_nav_btn_items_add"><![CDATA[Добавить]]></string>
+	<string name="_adm_nav_btn_items_cancel"><![CDATA[Отменить]]></string>
+	<string name="_adm_nav_btn_items_delete"><![CDATA[Удалить элемент]]></string>
+	<string name="_adm_nav_btn_items_done"><![CDATA[Выполнено]]></string>
+	<string name="_adm_nav_btn_items_edit"><![CDATA[Редактировать элемент]]></string>
+	<string name="_adm_nav_btn_items_gl_create"><![CDATA[Добавить новый элемент]]></string>
+	<string name="_adm_nav_btn_items_gl_import"><![CDATA[Импортировать элементы]]></string>
+	<string name="_adm_nav_btn_items_gl_visible"><![CDATA[Видимо для]]></string>
+	<string name="_adm_nav_btn_items_import"><![CDATA[Импортировать элемент]]></string>
+	<string name="_adm_nav_btn_items_save"><![CDATA[Сохранить]]></string>
+	<string name="_adm_nav_btn_menus_add"><![CDATA[Добавить]]></string>
+	<string name="_adm_nav_btn_menus_cancel"><![CDATA[Отменить]]></string>
+	<string name="_adm_nav_btn_menus_create"><![CDATA[Добавить новое меню]]></string>
+	<string name="_adm_nav_btn_menus_delete"><![CDATA[Удалить меню]]></string>
+	<string name="_adm_nav_btn_menus_edit"><![CDATA[Редактировать меню]]></string>
+	<string name="_adm_nav_btn_menus_save"><![CDATA[Сохранить]]></string>
+	<string name="_adm_nav_btn_sets_add"><![CDATA[Добавить]]></string>
+	<string name="_adm_nav_btn_sets_cancel"><![CDATA[Отменить]]></string>
+	<string name="_adm_nav_btn_sets_create"><![CDATA[Добавить новый набор]]></string>
+	<string name="_adm_nav_btn_sets_delete"><![CDATA[Удалить набор]]></string>
+	<string name="_adm_nav_btn_sets_edit"><![CDATA[Редактировать набор]]></string>
+	<string name="_adm_nav_dsc_items_icon"><![CDATA[Вы можете использовать здесь иконку для шрифта]]></string>
+	<string name="_adm_nav_dsc_items_icon_image"><![CDATA[или загрузить маленькую картинку для отображения рядом со ссылкой.]]></string>
+	<string name="_adm_nav_dsc_items_icon_image_current"><![CDATA[Картинка не загружена. В элементе меню будет использован текст.]]></string>
+	<string name="_adm_nav_dsc_items_link"><![CDATA[Введите URL ссылки]]></string>
+	<string name="_adm_nav_dsc_items_onclick"><![CDATA[Введите корректный JavaScript код для ссылки]]></string>
+	<string name="_adm_nav_dsc_items_submenu"><![CDATA[Выберите, если у ссылки должно быть подменю.]]></string>
+	<string name="_adm_nav_dsc_items_target"><![CDATA[Выберите, если ссылка должна открываться на новой или текущей странице.]]></string>
+	<string name="_adm_nav_dsc_items_title"><![CDATA[Название ссылки для отображения в меню сайта. Используйте как минимум 3 символа.]]></string>
+	<string name="_adm_nav_dsc_items_title_system"><![CDATA[Имя элемента, отображаемое только в Студии.]]></string>
+	<string name="_adm_nav_dsc_items_visible_for_levels"><![CDATA[Выбрать членства, разрешённые для просмотра элемента данного меню]]></string>
+	<string name="_adm_nav_dsc_menus_set_name"><![CDATA[Назначить набор для элемента меню]]></string>
+	<string name="_adm_nav_dsc_menus_set_title"><![CDATA[Описательное имя для использования только в Студии. Используйте как минимум 3 символа.]]></string>
+	<string name="_adm_nav_dsc_menus_style"><![CDATA[Выбрать стиль презентации - способа, каким будет отображаться данное меню на сайте]]></string>
+	<string name="_adm_nav_dsc_menus_title"><![CDATA[Описательное имя для использования только в Студии. Используйте как минимум 3 символа.]]></string>
+	<string name="_adm_nav_dsc_sets_title"><![CDATA[Описательное имя для использования только в Студии. Используйте как минимум 3 символа.]]></string>
+	<string name="_adm_nav_err_cannot_process_action"><![CDATA[Невозможно выполнить действие. Отсутствует связанный обработчик.]]></string>
+	<string name="_adm_nav_err_items_create"><![CDATA[Невозможно создать элемент]]></string>
+	<string name="_adm_nav_err_items_delete"><![CDATA[Невозможно удалить элемент]]></string>
+	<string name="_adm_nav_err_items_edit"><![CDATA[Невозможно обновить элемент]]></string>
+	<string name="_adm_nav_err_items_icon"><![CDATA[Нужно ввести название иконки для шрифта.]]></string>
+	<string name="_adm_nav_err_items_icon_image"><![CDATA[Невозможно обработать изображение: ]]></string>
+	<string name="_adm_nav_err_items_icon_image_remove"><![CDATA[Невозможно удалить изображение иконки: ]]></string>
+	<string name="_adm_nav_err_items_import"><![CDATA[Невозможно импортировать элемент(ы)]]></string>
+	<string name="_adm_nav_err_items_link"><![CDATA[Нужно ввести URL элемента]]></string>
+	<string name="_adm_nav_err_items_onclick"><![CDATA[Нужно ввести OnClick элемента]]></string>
+	<string name="_adm_nav_err_items_show_to"><![CDATA[Невозможно обновить элемент]]></string>
+	<string name="_adm_nav_err_menus_create"><![CDATA[Невозможно создать меню]]></string>
+	<string name="_adm_nav_err_menus_delete"><![CDATA[Невозможно удалить меню]]></string>
+	<string name="_adm_nav_err_menus_edit"><![CDATA[Невозможно обновить меню]]></string>
+	<string name="_adm_nav_err_menus_set_name"><![CDATA[Пожалуйста, задайте набор.]]></string>
+	<string name="_adm_nav_err_menus_set_title"><![CDATA[Необходимо указать уникальный заголовок из как минимум 3 символов.]]></string>
+	<string name="_adm_nav_err_menus_style"><![CDATA[Пожалуйста, выберите стиль презентации.]]></string>
+	<string name="_adm_nav_err_menus_title"><![CDATA[Необходимо указать заголовок из как минимум 3 символов.]]></string>
+	<string name="_adm_nav_err_missing_params"><![CDATA[Отсутствуют необходимые параметры.]]></string>
+	<string name="_adm_nav_err_sets_create"><![CDATA[Невозможно создать набор]]></string>
+	<string name="_adm_nav_err_sets_delete"><![CDATA[Невозможно удалить набор]]></string>
+	<string name="_adm_nav_err_sets_delete_used"><![CDATA[Невозможно удалить набор, так как он используется]]></string>
+	<string name="_adm_nav_err_sets_edit"><![CDATA[Невозможно обновить набор]]></string>
+	<string name="_adm_nav_err_sets_title"><![CDATA[Необходимо указать заголовок из как минимум 3 символов.]]></string>
+	<string name="_adm_nav_txt_all_modules"><![CDATA[Все модули]]></string>
+	<string name="_adm_nav_txt_items_create_popup"><![CDATA[Добавить новый элемент]]></string>
+	<string name="_adm_nav_txt_items_edit_popup"><![CDATA[Редактировать {0} элемент]]></string>
+	<string name="_adm_nav_txt_items_gl_icon"><![CDATA[Иконка]]></string>
+	<string name="_adm_nav_txt_items_gl_link"><![CDATA[URL]]></string>
+	<string name="_adm_nav_txt_items_gl_link_custom"><![CDATA[Индивидуальное действие]]></string>
+	<string name="_adm_nav_txt_items_gl_link_menu"><![CDATA[Меню:]]></string>
+	<string name="_adm_nav_txt_items_gl_module"><![CDATA[Модуль]]></string>
+	<string name="_adm_nav_txt_items_gl_title_system"><![CDATA[Системное имя]]></string>
+	<string name="_adm_nav_txt_items_gl_visible"><![CDATA[Видимо для]]></string>
+	<string name="_adm_nav_txt_items_icon"><![CDATA[Иконка]]></string>
+	<string name="_adm_nav_txt_items_icon_image"><![CDATA[]]></string>
+	<string name="_adm_nav_txt_items_icon_image_new"><![CDATA[]]></string>
+	<string name="_adm_nav_txt_items_icon_image_old"><![CDATA[Текущая иконка]]></string>
+	<string name="_adm_nav_txt_items_import_popup"><![CDATA[Импортировать элементы]]></string>
+	<string name="_adm_nav_txt_items_link"><![CDATA[URL]]></string>
+	<string name="_adm_nav_txt_items_onclick"><![CDATA[OnClick]]></string>
+	<string name="_adm_nav_txt_items_show_to_popup"><![CDATA[Отображать "{0}" элемент меню для: ]]></string>
+	<string name="_adm_nav_txt_items_submenu"><![CDATA[Подменю]]></string>
+	<string name="_adm_nav_txt_items_submenu_empty"><![CDATA[Без подменю]]></string>
+	<string name="_adm_nav_txt_items_submenu_popup"><![CDATA[Выводить подменю во всплывающем окне]]></string>
+	<string name="_adm_nav_txt_items_target"><![CDATA[Цель]]></string>
+	<string name="_adm_nav_txt_items_target_blank"><![CDATA[Новая страница]]></string>
+	<string name="_adm_nav_txt_items_target_self"><![CDATA[Эта же страница]]></string>
+	<string name="_adm_nav_txt_items_title"><![CDATA[Заголовок]]></string>
+	<string name="_adm_nav_txt_items_title_system"><![CDATA[Системное имя]]></string>
+	<string name="_adm_nav_txt_items_visible_for"><![CDATA[Видимо для]]></string>
+	<string name="_adm_nav_txt_items_visible_for_all"><![CDATA[Всех]]></string>
+	<string name="_adm_nav_txt_items_visible_for_levels"><![CDATA[Выбрать уровни]]></string>
+	<string name="_adm_nav_txt_items_visible_for_selected"><![CDATA[Выбранные уровни]]></string>
+	<string name="_adm_nav_txt_manage_items"><![CDATA[Управление элементами]]></string>
+	<string name="_adm_nav_txt_manage_visibility"><![CDATA[Управление настройками видимости]]></string>
+	<string name="_adm_nav_txt_menus_create_popup"><![CDATA[Добавить новое меню]]></string>
+	<string name="_adm_nav_txt_menus_edit_popup"><![CDATA[Редактировать "{0}" меню]]></string>
+	<string name="_adm_nav_txt_menus_gl_items"><![CDATA[Элементы]]></string>
+	<string name="_adm_nav_txt_menus_gl_module"><![CDATA[Модуль]]></string>
+	<string name="_adm_nav_txt_menus_gl_set_title"><![CDATA[Набор]]></string>
+	<string name="_adm_nav_txt_menus_gl_template_title"><![CDATA[Стиль]]></string>
+	<string name="_adm_nav_txt_menus_gl_title"><![CDATA[Системное имя]]></string>
+	<string name="_adm_nav_txt_menus_set_name"><![CDATA[Набор]]></string>
+	<string name="_adm_nav_txt_menus_set_name_new"><![CDATA[Создать новый]]></string>
+	<string name="_adm_nav_txt_menus_set_name_select"><![CDATA[Выбрать набор...]]></string>
+	<string name="_adm_nav_txt_menus_set_title"><![CDATA[Заголовок набора]]></string>
+	<string name="_adm_nav_txt_menus_style"><![CDATA[Стиль]]></string>
+	<string name="_adm_nav_txt_menus_style_select"><![CDATA[Выбрать стиль...]]></string>
+	<string name="_adm_nav_txt_menus_title"><![CDATA[Системное имя]]></string>
+	<string name="_adm_nav_txt_n_items"><![CDATA[{0} элементов]]></string>
+	<string name="_adm_nav_txt_select_set"><![CDATA[Выбрать набор...]]></string>
+	<string name="_adm_nav_txt_sets_create_popup"><![CDATA[Добавить новый набор]]></string>
+	<string name="_adm_nav_txt_sets_edit_popup"><![CDATA[Редактировать "{0}" набор]]></string>
+	<string name="_adm_nav_txt_sets_gl_items"><![CDATA[Элементы]]></string>
+	<string name="_adm_nav_txt_sets_gl_module"><![CDATA[Модуль]]></string>
+	<string name="_adm_nav_txt_sets_gl_title"><![CDATA[Системное имя]]></string>
+	<string name="_adm_nav_txt_sets_title"><![CDATA[Системное имя]]></string>
+        <string name="_adm_nav_txt_block_hidden_on"><![CDATA[Скрыть на]]></string>
+        <string name="_adm_nav_txt_block_hidden_on_phone"><![CDATA[телефоне]]></string>
+        <string name="_adm_nav_txt_block_hidden_on_tablet"><![CDATA[планшете]]></string>
+        <string name="_adm_nav_txt_block_hidden_on_desktop"><![CDATA[настольном компьютере]]></string>
+        <string name="_adm_nav_txt_block_hidden_on_mobile"><![CDATA[мобильное приложение]]></string>
+  <string name="_adm_page_cpt_audit"><![CDATA[Аудит]]></string>
+  <string name="_adm_page_cpt_badges"><![CDATA[Бейджи]]></string>
+	<string name="_adm_page_cpt_builder_forms"><![CDATA[Формы]]></string>
+	<string name="_adm_page_cpt_builder_menus"><![CDATA[Навигация]]></string>
+	<string name="_adm_page_cpt_builder_mobile"><![CDATA[Мобильный построитель]]></string>
+	<string name="_adm_page_cpt_builder_pages"><![CDATA[Страницы]]></string>
+	<string name="_adm_page_cpt_builder_permissions"><![CDATA[Разрешения]]></string>
+	<string name="_adm_page_cpt_dashboard"><![CDATA[Панель]]></string>
+	<string name="_adm_page_cpt_designer"><![CDATA[Дизайнер]]></string>
+	<string name="_adm_page_cpt_home"><![CDATA[Студия]]></string>
+	<string name="_adm_page_cpt_login"><![CDATA[Войти]]></string>
+	<string name="_adm_page_cpt_polyglot"><![CDATA[Полиглот]]></string>
+	<string name="_adm_page_cpt_settings"><![CDATA[Настройки]]></string>
+	<string name="_adm_page_cpt_storages"><![CDATA[Хранилище]]></string>
+	<string name="_adm_page_cpt_store"><![CDATA[Приложения]]></string>
+	<string name="_adm_pgt_btn_add_new_key"><![CDATA[Создать новый ключ]]></string>
+	<string name="_adm_pgt_btn_delete"><![CDATA[Удалить]]></string>
+	<string name="_adm_pgt_btn_delete_title"><![CDATA[Удалить ключ]]></string>
+	<string name="_adm_pgt_btn_edit_title"><![CDATA[Редактировать ключ]]></string>
+	<string name="_adm_pgt_btn_etemplates_cancel"><![CDATA[Отменить]]></string>
+	<string name="_adm_pgt_btn_etemplates_gl_edit_title"><![CDATA[Редактировать тему]]></string>
+	<string name="_adm_pgt_btn_etemplates_save"><![CDATA[Сохранить]]></string>
+	<string name="_adm_pgt_btn_nkp_close"><![CDATA[Закрыть]]></string>
+	<string name="_adm_pgt_btn_nkp_create"><![CDATA[Создать]]></string>
+	<string name="_adm_pgt_btn_nkp_save"><![CDATA[Сохранить]]></string>
+	<string name="_adm_pgt_dsc_etemplates_body"><![CDATA[Тело сообщения]]></string>
+	<string name="_adm_pgt_dsc_etemplates_name_system"><![CDATA[Название шаблона. Отображается только в Студии.]]></string>
+	<string name="_adm_pgt_dsc_etemplates_subject"><![CDATA[Тема сообщения]]></string>
+	<string name="_adm_pgt_err_cannot_process_action"><![CDATA[Невозможно выполнить действие. Отсутствует связанный обработчик.]]></string>
+	<string name="_adm_pgt_err_cannot_recompile_lang"><![CDATA[Невозможно перекомпилировать язык(и).]]></string>
+	<string name="_adm_pgt_err_cannot_restore_lang"><![CDATA[Невозможно восстановить язык(и).]]></string>
+	<string name="_adm_pgt_err_create_key"><![CDATA[Невозможно создать ключ]]></string>
+	<string name="_adm_pgt_err_create_key_empty_fields"><![CDATA[Необходимо заполнить форму.]]></string>
+	<string name="_adm_pgt_err_deactivate_default"><![CDATA[Невозможно деактивировать язык, выбранный основным]]></string>
+	<string name="_adm_pgt_err_etemplates_body"><![CDATA[Введите тело]]></string>
+	<string name="_adm_pgt_err_etemplates_edit"><![CDATA[Невозможно обновить шаблон]]></string>
+	<string name="_adm_pgt_err_etemplates_name_system"><![CDATA[Введите название, более 3 символов]]></string>
+	<string name="_adm_pgt_err_etemplates_subject"><![CDATA[Введите тему]]></string>
+	<string name="_adm_pgt_err_last_active"><![CDATA[Нужно выбрать как минимум один активный язык.]]></string>
+	<string name="_adm_pgt_err_save"><![CDATA[Невозможно сохранить изменения]]></string>
+	<string name="_adm_pgt_scs_recompiled"><![CDATA[Произошла удачная компиляция языка(ков).]]></string>
+	<string name="_adm_pgt_scs_restored"><![CDATA[Язык(и) был(и) удачно восстановлен(ы).]]></string>
+	<string name="_adm_pgt_txt_all_modules"><![CDATA[Все модули]]></string>
+	<string name="_adm_pgt_txt_etemplates_body"><![CDATA[Тело]]></string>
+	<string name="_adm_pgt_txt_etemplates_edit_popup"><![CDATA[Редактировать "{0}" шаблон]]></string>
+	<string name="_adm_pgt_txt_etemplates_gl_module"><![CDATA[Модуль]]></string>
+	<string name="_adm_pgt_txt_etemplates_gl_name_system"><![CDATA[Системный заголовок]]></string>
+	<string name="_adm_pgt_txt_etemplates_name_system"><![CDATA[Системное имя]]></string>
+	<string name="_adm_pgt_txt_etemplates_subject"><![CDATA[Тема]]></string>
+	<string name="_adm_pgt_txt_key"><![CDATA[Ключ]]></string>
+	<string name="_adm_pgt_txt_keyword"><![CDATA[Ключевое слово...]]></string>
+	<string name="_adm_pgt_txt_languages"><![CDATA[Языки]]></string>
+	<string name="_adm_pgt_txt_module"><![CDATA[Модуль]]></string>
+	<string name="_adm_pgt_txt_nkp_add_popup"><![CDATA[Создать новый ключ]]></string>
+	<string name="_adm_pgt_txt_nkp_edit_popup"><![CDATA[Редактировать "{0}" ключ]]></string>
+	<string name="_adm_pgt_txt_nkp_key_name"><![CDATA[Имя ключа]]></string>
+	<string name="_adm_pgt_txt_nkp_module"><![CDATA[Модуль]]></string>
+	<string name="_adm_pgt_txt_text"><![CDATA[Текст]]></string>
+    <string name="_adm_pgt_txt_et_hf_inf"><![CDATA[Внимание. Неправильное применение HTML может повредить дизайн email сообщения. Также убедитесь в том, что маркер {unsubscribe} присутствует хотя бы в одном из темплейтов (заголовок и/или основание).]]></string>
+    <string name="_adm_pgt_btn_et_hf_submit"><![CDATA[Выполнить]]></string>
+    <string name="_adm_pgt_scs_et_hf_save"><![CDATA[Изменения сохранены.]]></string>
+    <string name="_adm_pgt_err_et_hf_save"><![CDATA[Невозможно сохранить изменения.]]></string>
+    <string name="_adm_pgt_err_et_hf_save_unsubscribe"><![CDATA[Невозможно сохранить изменения, так как маркер {unsubscribe} был удален из темплейтов заголовка и основания одновременно.]]></string>
+	<string name="_adm_prm_btn_actions_cancel"><![CDATA[Отменить]]></string>
+	<string name="_adm_prm_btn_actions_options"><![CDATA[Редактировать опции]]></string>
+	<string name="_adm_prm_btn_actions_save"><![CDATA[Сохранить]]></string>
+	<string name="_adm_prm_btn_add_level"><![CDATA[Добавить новый уровень]]></string>
+	<string name="_adm_prm_btn_add_price"><![CDATA[Добавить новую ценовую опцию]]></string>
+	<string name="_adm_prm_btn_level_add"><![CDATA[Добавить уровень]]></string>
+	<string name="_adm_prm_btn_level_cancel"><![CDATA[Отменить]]></string>
+	<string name="_adm_prm_btn_level_delete"><![CDATA[Удалить уровень]]></string>
+	<string name="_adm_prm_btn_level_edit"><![CDATA[Редактировать уровень]]></string>
+	<string name="_adm_prm_btn_level_save"><![CDATA[Сохранить]]></string>
+	<string name="_adm_prm_btn_price_add"><![CDATA[Добавить]]></string>
+	<string name="_adm_prm_btn_price_cancel"><![CDATA[Отменить]]></string>
+	<string name="_adm_prm_btn_price_delete"><![CDATA[Удалить ценовую опцию]]></string>
+	<string name="_adm_prm_btn_price_edit"><![CDATA[Редактировать ценовую опцию]]></string>
+	<string name="_adm_prm_btn_price_save"><![CDATA[Сохранить]]></string>
+	<string name="_adm_prm_dsc_actions_avail"><![CDATA[Оставьте пустым, если действие всегда доступно]]></string>
+	<string name="_adm_prm_dsc_actions_number"><![CDATA[Оставьте пустым для бесконечных действий]]></string>
+	<string name="_adm_prm_dsc_actions_reset"><![CDATA[В часах. Оставьте пустым, если не хотите сбрасывать счётчик]]></string>
+	<string name="_adm_prm_dsc_level_description"><![CDATA[Краткое описание достоинств и правил данного членства.]]></string>
+	<string name="_adm_prm_dsc_level_icon"><![CDATA[Здесь можно использовать иконку шрифта]]></string>
+	<string name="_adm_prm_dsc_level_icon_image"><![CDATA[или загрузить изображение.]]></string>
+	<string name="_adm_prm_dsc_level_name"><![CDATA[Короткое название для членства (например, Premium, Gold, Newcomer, и т.д.)]]></string>
+	<string name="_adm_prm_dsc_level_quota_max_file_size"><![CDATA[Ограничить макс размер файлов для пользователей данного членства во всех модулях (0 - без ограничений, могут быть задействованы другие системные ограничения).]]></string>
+	<string name="_adm_prm_dsc_level_quota_number"><![CDATA[Ограничить количество файлов для пользователей данного членства (0 - без ограничений).]]></string>
+	<string name="_adm_prm_dsc_level_quota_size"><![CDATA[Ограничить дисковое пространство для пользователей данного членства во всех модулях (0 - без ограничений).]]></string>
+	<string name="_adm_prm_dsc_price_add_days"><![CDATA[Используйте 0 для отсутствия ограничений]]></string>
+	<string name="_adm_prm_err_level_create"><![CDATA[Невозможно создать членство]]></string>
+	<string name="_adm_prm_err_level_delete"><![CDATA[Невозможно удалить членство]]></string>
+	<string name="_adm_prm_err_level_edit"><![CDATA[Невозможно обновить членство]]></string>
+	<string name="_adm_prm_err_level_icon"><![CDATA[Нужно ввести имя иконки для шрифта.]]></string>
+	<string name="_adm_prm_err_level_icon_image"><![CDATA[Невозможно загрузить иконку: ]]></string>
+	<string name="_adm_prm_err_level_icon_image_remove"><![CDATA[Невозможно удалить иконку]]></string>
+	<string name="_adm_prm_err_level_id"><![CDATA[Достигнут предел для членств.]]></string>
+	<string name="_adm_prm_err_level_name"><![CDATA[Нужно ввести имя (3, 100) для всех языков]]></string>
+	<string name="_adm_prm_err_level_quota_max_file_size"><![CDATA[Нужно ввести числовое значение, оставьте 0 для отсутствия ограничений]]></string>
+	<string name="_adm_prm_err_level_quota_number"><![CDATA[Нужно ввести числовое значение, оставьте 0 для отсутствия ограничений]]></string>
+	<string name="_adm_prm_err_level_quota_size"><![CDATA[Нужно ввести числовое значение, оставьте 0 для отсутствия ограничений]]></string>
+	<string name="_adm_prm_err_price_create"><![CDATA[Невозможно создать ценовую опцию]]></string>
+	<string name="_adm_prm_err_price_duplicate"><![CDATA[Такая ценовая опция уже существует для данного членства.]]></string>
+	<string name="_adm_prm_err_price_update"><![CDATA[Невозможно обновить ценовую опцию]]></string>
+	<string name="_adm_prm_txt_actions"><![CDATA[Действия]]></string>
+	<string name="_adm_prm_txt_actions_avail_end"><![CDATA[Это действие доступно до]]></string>
+	<string name="_adm_prm_txt_actions_avail_start"><![CDATA[Это действие доступно начиная с]]></string>
+	<string name="_adm_prm_txt_actions_number"><![CDATA[Число доступных действий]]></string>
+	<string name="_adm_prm_txt_actions_options_popup"><![CDATA[Редактировать "{0}" действие]]></string>
+	<string name="_adm_prm_txt_actions_reset"><![CDATA[Число действий сбрасывается каждые]]></string>
+	<string name="_adm_prm_txt_all_modules"><![CDATA[Все модули]]></string>
+	<string name="_adm_prm_txt_description"><![CDATA[Описание]]></string>
+	<string name="_adm_prm_txt_enable"><![CDATA[Включить]]></string>
+	<string name="_adm_prm_txt_icon"><![CDATA[Иконка]]></string>
+	<string name="_adm_prm_txt_level_account"><![CDATA[Аккаунт]]></string>
+	<string name="_adm_prm_txt_level_actions_copy"><![CDATA[Скопировать действия из]]></string>
+	<string name="_adm_prm_txt_level_administrator"><![CDATA[Администратор]]></string>
+	<string name="_adm_prm_txt_level_create_popup"><![CDATA[Добавить новый уровень]]></string>
+	<string name="_adm_prm_txt_level_description"><![CDATA[Описание]]></string>
+	<string name="_adm_prm_txt_level_edit_popup"><![CDATA[Редактировать "{0}" уровень]]></string>
+	<string name="_adm_prm_txt_level_icon"><![CDATA[Иконка]]></string>
+	<string name="_adm_prm_txt_level_icon_image"><![CDATA[]]></string>
+	<string name="_adm_prm_txt_level_icon_image_new"><![CDATA[]]></string>
+	<string name="_adm_prm_txt_level_icon_image_old"><![CDATA[Текущая иконка]]></string>
+	<string name="_adm_prm_txt_level_moderator"><![CDATA[Модератор]]></string>
+	<string name="_adm_prm_txt_level_name"><![CDATA[Заголовок]]></string>
+	<string name="_adm_prm_txt_level_pending"><![CDATA[Неактивный]]></string>
+	<string name="_adm_prm_txt_level_premium"><![CDATA[Premium]]></string>
+	<string name="_adm_prm_txt_level_quota_max_file_size"><![CDATA[Лимит макс. размера файла (Mb)]]></string>
+	<string name="_adm_prm_txt_level_quota_number"><![CDATA[Лимит макс. числа файлов]]></string>
+	<string name="_adm_prm_txt_level_quota_size"><![CDATA[Лимит дискового пространства (Mb)]]></string>
+	<string name="_adm_prm_txt_level_standard"><![CDATA[Стандарт]]></string>
+	<string name="_adm_prm_txt_level_suspended"><![CDATA[Заблокирпованный]]></string>
+	<string name="_adm_prm_txt_level_unauthenticated"><![CDATA[Неавторизованный]]></string>
+	<string name="_adm_prm_txt_level_unconfirmed"><![CDATA[Неподтверждённый]]></string>
+	<string name="_adm_prm_txt_manage_actions"><![CDATA[Управление действиями]]></string>
+	<string name="_adm_prm_txt_max_file_size"><![CDATA[Макс. размер файла]]></string>
+	<string name="_adm_prm_txt_max_files"><![CDATA[Макс. число файлов]]></string>
+	<string name="_adm_prm_txt_module"><![CDATA[Модуль]]></string>
+	<string name="_adm_prm_txt_n_actions"><![CDATA[{0} действий]]></string>
+	<string name="_adm_prm_txt_price"><![CDATA[Цена]]></string>
+	<string name="_adm_prm_txt_price_add_days"><![CDATA[Количество дней]]></string>
+	<string name="_adm_prm_txt_price_add_popup"><![CDATA[Добавить новую ценовую опцию]]></string>
+	<string name="_adm_prm_txt_price_add_price"><![CDATA[Цена]]></string>
+	<string name="_adm_prm_txt_price_edit_popup"><![CDATA[Редактировать "{0} дней" ценовую опцию]]></string>
+	<string name="_adm_prm_txt_select_level"><![CDATA[Выбрать уровень]]></string>
+	<string name="_adm_prm_txt_storage"><![CDATA[Хранилище]]></string>
+	<string name="_adm_prm_txt_term"><![CDATA[Условия]]></string>
+	<string name="_adm_prm_txt_title"><![CDATA[Заголовок]]></string>
+	<string name="_adm_prm_txt_visibility_items_anyone"><![CDATA[Всех]]></string>
+	<string name="_adm_prm_txt_visibility_items_n_user_levels"><![CDATA[{0} пользовательские членства]]></string>
+	<string name="_adm_prm_txt_visibility_items_nobody"><![CDATA[Никого]]></string>
+	<string name="_adm_scs_operation_done"><![CDATA[]]></string>
+	<string name="_adm_stg_cpt_category_account"><![CDATA[Аккаунт]]></string>
+	<string name="_adm_stg_cpt_category_acl"><![CDATA[Уровни доступа]]></string>
+  <string name="_adm_stg_cpt_category_audit"><![CDATA[Аудит]]></string>
+	<string name="_adm_stg_cpt_category_notifications"><![CDATA[Оповещения]]></string>
+	<string name="_adm_stg_cpt_category_notifications_push"><![CDATA[Push - оповещения]]></string>
+	<string name="_adm_stg_cpt_category_cache"><![CDATA[Кэш]]></string>
+	<string name="_adm_stg_cpt_category_general"><![CDATA[Общие]]></string>
+	<string name="_adm_stg_cpt_category_hidden"><![CDATA[Скрытые]]></string>
+	<string name="_adm_stg_cpt_category_languages"><![CDATA[Языки]]></string>
+	<string name="_adm_stg_cpt_category_permalinks"><![CDATA[Пермалинки]]></string>
+	<string name="_adm_stg_cpt_category_security"><![CDATA[Безопасность]]></string>
+	<string name="_adm_stg_cpt_category_site_settings"><![CDATA[Настройки сайта]]></string>
+	<string name="_adm_stg_cpt_category_storage"><![CDATA[Дисковое пространство]]></string>
+	<string name="_adm_stg_cpt_category_system"><![CDATA[Система]]></string>
+	<string name="_adm_stg_cpt_category_templates"><![CDATA[Темы]]></string>
+    <string name="_adm_stg_cpt_category_twilio_gate"><![CDATA[Twilio]]></string>
+    <string name="_adm_stg_cpt_option_client_image_resize_width"><![CDATA[Изменять ширину картинки перед загрузкой (0 - отключить)]]></string>
+    <string name="_adm_stg_cpt_option_client_image_resize_height"><![CDATA[Изменять высоту картинки перед загрузкой (0 - отключить)]]></string>    
+	<string name="_adm_stg_cpt_option_currency_code"><![CDATA[Код валюты (для платёжных систем)]]></string>
+	<string name="_adm_stg_err_option_currency_code"><![CDATA[Не должно быть пустым.]]></string>
+	<string name="_adm_stg_cpt_option_currency_sign"><![CDATA[Знак валюты (только для отображения)]]></string>
+	<string name="_adm_stg_err_option_currency_sign"><![CDATA[Не должно быть пустым.]]></string>
+	<string name="_adm_stg_cpt_option_enable_gd"><![CDATA[Использовать библиотеку GD для обработки изображений]]></string>
+	<string name="_adm_stg_cpt_option_enable_notification_account"><![CDATA[Оповещать о новых аккаунтах]]></string>
+	<string name="_adm_stg_cpt_option_enable_notification_pruning"><![CDATA[Оповещать о результатах очистки]]></string>
+	<string name="_adm_stg_cpt_option_expire_notification_days"><![CDATA[Оповещать перед тем, как истечёт срок членства за такое количество дней ( -1 = после истечения срока )]]></string>
+	<string name="_adm_stg_cpt_option_expire_notify_once"><![CDATA[Оповещать об истечении срока членства только один раз (иначе, каждый день)]]></string>
+	<string name="_adm_stg_cpt_option_lang_default"><![CDATA[Основной Язык]]></string>
+	<string name="_adm_stg_cpt_option_lang_subst_from_en"><![CDATA[Заменить (на этапе компиляции) отсутствующий перевод английским эквивалентом]]></string>	
+	<string name="_adm_stg_cpt_option_permalinks_modules"><![CDATA[Задействовать дружественные ссылки для модулей]]></string>
+    <string name="_adm_stg_cpt_option_permalinks_pages"><![CDATA[Задействовать дружественные ссылки для страниц]]></string>
+    <string name="_adm_stg_cpt_option_permalinks_storage"><![CDATA[Задействовать дружественные ссылки для локального хранилища]]></string>
+	<string name="_adm_stg_cpt_option_site_email"><![CDATA[Email для получения критических уведомлений от сайта]]></string>
+	<string name="_adm_stg_cpt_option_site_email_notify"><![CDATA[Email, с которого будут посылаться сообщения от сайта]]></string>
+	<string name="_adm_stg_cpt_option_site_email_html_template_header"><![CDATA[Заголовок HTML шаблона email сообщения]]></string>
+    <string name="_adm_stg_cpt_option_site_email_html_template_footer"><![CDATA[Основание HTML шаблона email сообщения]]></string>
+    <string name="_adm_stg_cpt_option_site_login_social_compact"><![CDATA[Задействовать компактный вид входа через соц. сети]]></string>
+	<string name="_adm_stg_cpt_option_site_title"><![CDATA[Название сайта]]></string>
+	<string name="_adm_stg_cpt_option_site_tour_home"><![CDATA[Экскурсия по главной странице сайта]]></string>
+    <string name="_adm_stg_cpt_option_site_tour_studio"><![CDATA[Экскурсия по главной странице Студии]]></string>
+    <string name="_adm_stg_cpt_option_smart_app_banner"><![CDATA[Smart App Banner]]></string>
+    <string name="_adm_stg_cpt_option_smart_app_banner_ios_app_id"><![CDATA[Идентификатор iOS прилижения для Smart App Banner]]></string>
+	<string name="_adm_stg_cpt_option_sys_account_activation_letter"><![CDATA[Включить сообщение об активации аккаунта]]></string>
+	<string name="_adm_stg_cpt_option_sys_account_confirmation_type"><![CDATA[Аккаунт подтвержден когда]]></string>
+    <string name="_adm_stg_cpt_option_sys_account_hide_unconfirmed_accounts"><![CDATA[Скрывать профили у неподтвержденных аккаунтов]]></string>
+	<string name="_adm_stg_cpt_option_sys_account_2fa_enable"><![CDATA[Включить двухфакторную аутентификацию]]></string>
+    <string name="_adm_stg_cpt_option_sys_account_autoapproval"><![CDATA[Автоматическая активация аккаунта после создания]]></string>
+    <string name="_adm_stg_cpt_option_sys_account_auto_profile_creation"><![CDATA[Автоматическое создание профайла из аккаунта]]></string>
+	<string name="_adm_stg_cpt_option_sys_account_online_time"><![CDATA[Временные рамки статуса "онлайн" (минуты)]]></string>
+    <string name="_adm_stg_err_option_sys_account_online_time"><![CDATA[Вам необходимо ввести значение больше нуля.]]></string>
+    <string name="_adm_stg_cpt_option_sys_account_default_profile_type"><![CDATA[Тип профиля по умолчанию]]></string>
+  <string name="_adm_stg_cpt_option_sys_account_limit_profiles_number"><![CDATA[Ограничить число профилей (0 - без ограничений)]]></string>
+  <string name="_adm_stg_cpt_option_sys_account_limit_incorrect_login_attempts"><![CDATA[Количество попыток ввода пароля (0 - без ограничений)]]></string>
+	<string name="_adm_stg_cpt_option_sys_acl_expire_notification_days"><![CDATA[За сколько дней до окончания членства оповестить пользователя об окончании (-1 = после окончания)]]></string>
+	<string name="_adm_stg_cpt_option_sys_acl_expire_notify_once"><![CDATA[Оповещать пользователей об окончании членства только одинажды (каждый день в противном случае)]]></string>
+	<string name="_adm_stg_cpt_option_sys_add_nofollow"><![CDATA[Добавить атрибут "nofollow" для внешних ссылок]]></string>
+  <string name="_adm_stg_cpt_option_sys_audit_enable"><![CDATA[Активно]]></string>
+  <string name="_adm_stg_cpt_option_sys_audit_max_records"><![CDATA[Количество записей в логе]]></string>
+  <string name="_adm_stg_cpt_option_sys_audit_days_before_expire"><![CDATA[Удалять записи в логе старше, чем (дней)]]></string>
+  <string name="_adm_stg_cpt_option_sys_audit_acl_levels"><![CDATA[Активно для уровней]]></string>
+	<string name="_adm_stg_cpt_option_sys_autoupdate_force_modified_files"><![CDATA[Инициировать автообновление, даже если какие-то файлы были модифицированы]]></string>
+	<string name="_adm_stg_cpt_option_sys_autoupdate"><![CDATA[Включить автообновление]]></string>
+	<string name="_adm_stg_cpt_option_sys_cache_memcache_host"><![CDATA[Memcached - адрес сервера]]></string>
+	<string name="_adm_stg_cpt_option_sys_cache_memcache_port"><![CDATA[Memcached - порт сервера]]></string>
+	<string name="_adm_stg_cpt_option_sys_captcha_default"><![CDATA[CAPTCHA по умолчанию]]></string>
+	<string name="_adm_stg_cpt_option_sys_email_attachable_email_templates"><![CDATA[Список присоединяемых email темплейтов]]></string>
+	<string name="_adm_stg_cpt_option_sys_db_cache_enable"><![CDATA[Задействовать кэш БД]]></string>
+	<string name="_adm_stg_cpt_option_sys_db_cache_engine"><![CDATA[Кэш-движок для БД (значение, отличное от File, может потребовать дополнительной настройки сервера)]]></string>
+	<string name="_adm_stg_cpt_option_sys_default_payment"><![CDATA[Модуль оплаты]]></string>
+	<string name="_adm_stg_cpt_option_sys_editor_default"><![CDATA[HTML редактор по умолчанию]]></string>
+	<string name="_adm_stg_cpt_option_sys_player_default"><![CDATA[Плеер по умолчанию]]></string>
+	<string name="_adm_stg_cpt_option_sys_player_default_quality"><![CDATA[Качество видео по умолчанию]]></string>
+	<string name="_adm_stg_cpt_option_sys_format_date"><![CDATA[Формат даты]]></string>
+	<string name="_adm_stg_cpt_option_sys_format_datetime"><![CDATA[Формат даты и времени]]></string>
+	<string name="_adm_stg_cpt_option_sys_format_time"><![CDATA[Формат времени]]></string>
+	<string name="_adm_stg_cpt_option_sys_format_timeago"><![CDATA[Использовать формат 'времени назад' для дат, меньших чем данное количество секунд]]></string>
+	<string name="_adm_stg_cpt_option_sys_ftp_dir"><![CDATA[Путь к скрипту на FTP-сервере]]></string>
+	<string name="_adm_stg_cpt_option_sys_ftp_login"><![CDATA[FTP-сервер - Логин]]></string>
+	<string name="_adm_stg_cpt_option_sys_ftp_password"><![CDATA[FTP-сервер - Пароль]]></string>
+	<string name="_adm_stg_cpt_option_sys_cron_time"><![CDATA[Дата последнего запуска планировщика]]></string>
+    <string name="_adm_stg_cpt_option_sys_install_time"><![CDATA[Дата установки]]></string>
+    <string name="_adm_stg_cpt_option_sys_upgrade_channel"><![CDATA[Канал обновлений]]></string>
+    <string name="_adm_stg_cpt_option_sys_live_updates_interval"><![CDATA[Интервал обновлений (в миллисекундах)]]></string>
+    <string name="_adm_stg_cpt_option_sys_maps_api_key"><![CDATA[Ключ Google Maps API]]></string>
+    <string name="_adm_stg_cpt_option_sys_embed_default"><![CDATA[Поставщик встраиваемого кода]]></string>
+    <string name="_adm_stg_cpt_option_sys_embedly_api_key"><![CDATA[Ключ Embed.ly API (заполните, чтобы использовать вместо Iframely)]]></string>
+    <string name="_adm_stg_cpt_option_sys_embedly_api_pattern"><![CDATA[Шаблон Embed.ly API (заполните, чтобы использовать вместо Iframely)]]></string>
+    <string name="_adm_stg_cpt_option_sys_iframely_api_key"><![CDATA[Ключ Iframely API]]></string>
+    <string name="_adm_stg_cpt_option_sys_eq_time"><![CDATA[Флаг выполнения email очереди]]></string>
+    <string name="_adm_stg_cpt_option_sys_eq_send_per_start"><![CDATA[Количество сообщенией, отправляемое из email очереди при каждом запуске]]></string>
+    <string name="_adm_stg_cpt_option_sys_eq_send_per_start_to_recipient"><![CDATA[Количество сообщенией, отправляемое из email очереди одному и тому же получателю при каждом запуске]]></string>
+	<string name="_adm_stg_cpt_option_sys_oauth_key"><![CDATA[UNA-аккаунт - Key (ключ)]]></string>
+	<string name="_adm_stg_cpt_option_sys_oauth_secret"><![CDATA[UNA-аккаунт - Secret (секретное слово)]]></string>
+	<string name="_adm_stg_cpt_option_sys_page_cache_enable"><![CDATA[Задействовать кэш для страниц]]></string>
+	<string name="_adm_stg_cpt_option_sys_page_cache_engine"><![CDATA[Кэш-движок для страниц (значение, отличное от File, может потребовать дополнительной настройки сервера)]]></string>
+	<string name="_adm_stg_cpt_option_sys_pb_cache_enable"><![CDATA[Задействовать кэш для блоков страниц]]></string>
+	<string name="_adm_stg_cpt_option_sys_pb_cache_engine"><![CDATA[Кэш-движок для блоков страниц (значение, отличное от File, может потребовать дополнительной настройки сервера)]]></string>
+	<string name="_adm_stg_cpt_option_sys_per_page_search_keyword_single"><![CDATA[Число элементов на странице в результатах поиска по ключевому слову]]></string>
+    <string name="_adm_stg_cpt_option_sys_per_page_search_keyword_plural"><![CDATA[Число элементов на странице в результатах поиска по сайту]]></string>
+    <string name="_adm_stg_cpt_option_sys_push_app_id"><![CDATA[OneSignal App ID]]></string>
+    <string name="_adm_stg_cpt_option_sys_push_rest_api"><![CDATA[REST API Key]]></string>
+    <string name="_adm_stg_cpt_option_sys_push_short_name"><![CDATA[Короткое имя (требуется только если у вас https сайт. Оно должно совпадать с поддоменом, введёным, в настройках пуш оповещений на OneSignal)]]></string>
+    <string name="_adm_stg_cpt_option_sys_push_safari_id"><![CDATA[Apple Safari Web ID в натройках Web Push]]></string>
+    <string name="_adm_stg_cpt_option_sys_push_queue_time"><![CDATA[Флаг выполнения Push очереди]]></string>
+    <string name="_adm_stg_cpt_option_sys_push_queue_send_per_start"><![CDATA[Количество сообщенией, отправляемое из Push очереди при каждом запуске]]></string>
+    <string name="_adm_stg_cpt_option_sys_push_queue_send_per_start_to_recipient"><![CDATA[Количество сообщенией, отправляемое из Push очереди одному и тому же получателю при каждом запуске]]></string>
+	<string name="_adm_stg_cpt_option_sys_twilio_gate_sid"><![CDATA[Account SID]]></string>
+	<string name="_adm_stg_cpt_option_sys_twilio_gate_token"><![CDATA[Auth token]]></string>
+	<string name="_adm_stg_cpt_option_sys_twilio_gate_from_number"><![CDATA[Номер для отправки SMS по умолчанию]]></string>
+	<string name="_adm_stg_cpt_option_sys_recaptcha_key_private"><![CDATA[reCAPTCHA - приватный ключ]]></string>
+	<string name="_adm_stg_cpt_option_sys_recaptcha_key_public"><![CDATA[reCAPTCHA - публичный ключ]]></string>
+	<string name="_adm_stg_cpt_option_sys_redirect_after_account_added"><![CDATA[Перенаправлять после создания аккаунта на]]></string>
+    <string name="_adm_stg_cpt_option_sys_redirect_after_email_confirmation"><![CDATA[Перенаправлять после подтверждения email-а на]]></string>
+    <string name="_adm_stg_cpt_option_sys_relations"><![CDATA[Разрешить связи между]]></string>
+    <string name="_adm_stg_cpt_option_sys_revision"><![CDATA[Номер ревизии]]></string>
+	<string name="_adm_stg_cpt_option_sys_security_form_token_enable"><![CDATA[Задействовать CSRF токен в формах]]></string>
+	<string name="_adm_stg_cpt_option_sys_security_form_token_lifetime"><![CDATA[CSRF token - срок жизни в секундах (0 - не вести отчёт времени)]]></string>
+	<string name="_adm_stg_cpt_option_sys_security_impact_threshold_block"><![CDATA[Общий порог угрозы бесопасности перед тем, как послать отчёт и заблокировать агрессора]]></string>
+	<string name="_adm_stg_cpt_option_sys_security_impact_threshold_log"><![CDATA[Общий порог угрозы бесопасности перед тем, как послать отчёт]]></string>
+	<string name="_adm_stg_cpt_option_sys_site_logo_height"><![CDATA[Высота лого]]></string>
+	<string name="_adm_stg_cpt_option_sys_site_logo_width"><![CDATA[Ширина лого]]></string>
+	<string name="_adm_stg_cpt_option_sys_storage_default"><![CDATA[Основной движок хранения (отличный от Local может потребовать дополнительную настройку)]]></string>
+	<string name="_adm_stg_cpt_option_sys_storage_s3_access_key"><![CDATA[AWS - ключ доступа]]></string>
+	<string name="_adm_stg_cpt_option_sys_storage_s3_bucket"><![CDATA[AWS - сегмент (bucket)]]></string>
+	<string name="_adm_stg_cpt_option_sys_storage_s3_domain"><![CDATA[AWS - дополнительный домен (требует дополнительной настройки DNS)]]></string>
+	<string name="_adm_stg_cpt_option_sys_storage_s3_secret_key"><![CDATA[AWS - секретный ключ]]></string>
+	<string name="_adm_stg_cpt_option_sys_template_cache_image_enable"><![CDATA[Задействовать кэш для изображений]]></string>
+	<string name="_adm_stg_cpt_option_sys_template_cache_image_max_size"><![CDATA[Максимальный размер кэшируемого изображения (в Кб)]]></string>
+	<string name="_adm_stg_cpt_option_sys_template_cache_compress_enable"><![CDATA[Задействовать сжатие для файлов JS/CSS (кэш должен быть задействован)]]></string>
+	<string name="_adm_stg_cpt_option_sys_template_cache_css_enable"><![CDATA[Задействовать кэш для файлов CSS]]></string>
+	<string name="_adm_stg_cpt_option_sys_template_cache_enable"><![CDATA[Задействовать кэш для файлов HTML]]></string>
+	<string name="_adm_stg_cpt_option_sys_template_cache_engine"><![CDATA[Кэш-движок для темы (темплейта) (отличный от FileHtml может потребовать дополнительную настройку сервера)]]></string>
+	<string name="_adm_stg_cpt_option_sys_template_cache_js_enable"><![CDATA[Задействовать кэш для файлов JS]]></string>
+	<string name="_adm_stg_cpt_option_sys_template_cache_minify_css_enable"><![CDATA[Задействовать уменьшение для файлов CSS (кэш должен быть задействован)]]></string>
+	<string name="_adm_stg_cpt_option_sys_template_cache_minify_js_enable"><![CDATA[Задействовать уменьшение для файлов JS (кэш должен быть задействован)]]></string>
+	<string name="_adm_stg_cpt_option_sys_transcoder_queue_storage"><![CDATA[Удалённая раскодировка видео (требуется дополнительная настройка)]]></string>
+  <string name="_adm_stg_cpt_option_sys_session_lifetime_in_min"><![CDATA[Время жизни сессии (в минутах)]]></string>
+	<string name="_adm_stg_cpt_option_template"><![CDATA[Основная тема]]></string>
+	<string name="_adm_stg_err_option_template"><![CDATA[Тема не может быть пустой и должна иметь приемлемое название.]]></string>
+    <string name="_adm_stg_cpt_option_use_like_operator"><![CDATA[Использовать для поиска оператор LIKE (рекомендуется для небольшого содержимого)]]></string>
+    <string name="_adm_stg_cpt_option_sys_tinymce_plugins_mini"><![CDATA[TinyMCE компоненты для мини редактора]]></string>
+    <string name="_adm_stg_cpt_option_sys_tinymce_toolbar_mini"><![CDATA[TinyMCE кнопки для мини редактора]]></string>
+    <string name="_adm_stg_cpt_option_sys_tinymce_plugins_standard"><![CDATA[TinyMCE компоненты для стандартного редактора]]></string>
+    <string name="_adm_stg_cpt_option_sys_tinymce_toolbar_standard"><![CDATA[TinyMCE кнопки для стандартного редактора]]></string>
+    <string name="_adm_stg_cpt_option_sys_tinymce_plugins_full"><![CDATA[TinyMCE компоненты для полного редактора]]></string>
+    <string name="_adm_stg_cpt_option_sys_tinymce_toolbar_full"><![CDATA[TinyMCE кнопки для полного редактора]]></string>
+    <string name="_adm_stg_cpt_option_sys_metatags_hashtags_max"><![CDATA[Максимальное число хэш-тагов в одной публикации]]></string>
+    <string name="_adm_stg_cpt_option_sys_metatags_mentions_max"><![CDATA[Максимальное число упоминаний кого-либо в одной публикации]]></string>
+    <string name="_adm_stg_cpt_option_sys_hide_post_to_context_for_privacy"><![CDATA[Скрыть из поля "Конфиденциальность" возможность добавления контента в контекст модулей]]></string>
+    <string name="_adm_stg_cpt_option_sys_search_keyword_min_len"><![CDATA[Минимальная длина слова в поиске по сайту]]></string>
+    <string name="_adm_stg_cpt_option_sys_profile_bot"><![CDATA[Профиль системного бота]]></string>
+	<string name="_adm_stg_cpt_type_system"><![CDATA[Система]]></string>
+	<string name="_adm_stg_scs_save"><![CDATA[Настройки удачно сохранены]]></string>
+	<string name="_adm_stg_err_save_error_message"><![CDATA[Ошибка в '{0}': {1}]]></string>
+	<string name="_adm_stg_err_cannot_perform"><![CDATA[Не могу выполнить действие.]]></string>
+	<string name="_adm_stg_err_mix_already_exists"><![CDATA[Набор с таким именем уже существует.]]></string>
+	<string name="_adm_stg_txt_create_mix_popup"><![CDATA[Добавить новый набор]]></string>
+	<string name="_adm_stg_txt_import_mix_popup"><![CDATA[Импортировать набор]]></string>
+	<string name="_adm_stg_txt_mix_duplicate"><![CDATA[Продублировать]]></string>
+	<string name="_adm_stg_txt_mix_duplicate_inf"><![CDATA[Используйте 'Никакой', чтобы продублировать Системные значения]]></string>
+	<string name="_adm_stg_txt_mix_title"><![CDATA[Название набора]]></string>
+        <string name="_adm_stg_txt_mix_title_inf"><![CDATA[Создайте <b>_sys_template_mixed_[template_name]_[mix_name]</b> языковой ключ в Polyglot, чтобы изменить публичное отображение. <b>[template_name]</b> и <b>[mix_name]</b>: строчные буквы, пробелы заменены на подчеркивания.]]></string>
+	<string name="_adm_stg_txt_mix_title_err"><![CDATA[Нужно указать название. Пожалуйста, заполните это поле.]]></string>
+	<string name="_adm_stg_txt_mix_system"><![CDATA[Системный]]></string>
+	<string name="_adm_stg_err_remove_old_image"><![CDATA[Невозможно удалить текущее изображение.]]></string>
+	<string name="_adm_str_cpt_files_file"><![CDATA[Файл]]></string>
+	<string name="_adm_str_cpt_files_version"><![CDATA[Версия]]></string>
+	<string name="_adm_str_err_cannot_connect_to_ftp"><![CDATA[Невозможно соединиться с FTP-сервером. Проверьте детали доступа к FTP в Настройки -> Общие.]]></string>
+	<string name="_adm_str_err_cannot_unzip_package"><![CDATA[Невозможно распаковать ZIP-архив.]]></string>
+	<string name="_adm_str_err_cannot_write"><![CDATA[Невозможно сохранить скачанный файл.]]></string>
+	<string name="_adm_str_err_destination_not_valid"><![CDATA[Папка назначения FTP не является корневой папкой для скрипта.]]></string>
+	<string name="_adm_str_err_download_failed"><![CDATA[Скачка не удалась. Пожалуйста, оповестите нас.]]></string>
+	<string name="_adm_str_err_files_copy_failed"><![CDATA[Загрузка файла не удалась. Пожалуйста, проверьте разрешение на запись.]]></string>
+	<string name="_adm_str_err_no_ftp_info"><![CDATA[Реквизиты доступа к FTP не указаны. Вы можете их ввести в Настройки -> Общие.]]></string>
+	<string name="_adm_str_err_no_product_info"><![CDATA[Невозможно загрузить информацию о товаре. Попробуйте позднее.]]></string>
+	<string name="_adm_str_err_wrong_package_format"><![CDATA[Неверный формат пакета.]]></string>
+	<string name="_adm_str_err_zip_not_available"><![CDATA[ZIP-библиотека не доступна.]]></string>
+	<string name="_adm_str_msg_download_scheduled"><![CDATA[Закачка добавлена в очередь. Через несколько минут закачанный пакет будет доступен в  Приложения -> Скачанные.]]></string>
+	<string name="_adm_str_msg_download_and_install_scheduled"><![CDATA[Закачка и последующая установка добавлены в очередь. Это может занять несколько минут.]]></string>
+	<string name="_adm_str_msg_download_successfully"><![CDATA[Закачка удачно завершена. Вы можете установить модуль через Приложения -> Скачанные.]]></string>
+	<string name="_adm_str_msg_download_and_install_successfully"><![CDATA[Закачка и последующая установка удачно завершены.]]></string>
+	<string name="_adm_str_txt_discount_csign"><![CDATA[({0}{1} для Премиум)]]></string>
+	<string name="_adm_str_txt_items_by"><![CDATA[элементов от]]></string>
+	<string name="_adm_str_txt_or"><![CDATA[или]]></string>
+	<string name="_adm_str_txt_per_week"><![CDATA[неделю]]></string>
+    <string name="_adm_str_txt_per_week_short"><![CDATA[нед]]></string>
+    <string name="_adm_str_txt_per_month"><![CDATA[месяц]]></string>
+    <string name="_adm_str_txt_per_month_short"><![CDATA[мес]]></string>
+    <string name="_adm_str_txt_per_year"><![CDATA[год]]></string>
+    <string name="_adm_str_txt_per_year_short"><![CDATA[год]]></string>
+	<string name="_adm_str_txt_price_free"><![CDATA[Бесплатно]]></string>
+	<string name="_adm_str_txt_price_recurring"><![CDATA[{0}{1}/{2}]]></string>
+	<string name="_adm_str_txt_price_single"><![CDATA[{0}{1}]]></string>
+	<string name="_adm_str_txt_pv_category"><![CDATA[Категория]]></string>
+	<string name="_adm_str_txt_pv_created"><![CDATA[Созданные]]></string>
+	<string name="_adm_str_txt_pv_description"><![CDATA[Описание]]></string>
+	<string name="_adm_str_txt_pv_discount"><![CDATA[Скидка]]></string>
+	<string name="_adm_str_txt_pv_discount_off_csign"><![CDATA[{0}% ({1}{2}) скидка для Премиум]]></string>
+	<string name="_adm_str_txt_pv_price"><![CDATA[Цена]]></string>
+	<string name="_adm_str_txt_pv_rent"><![CDATA[Рента]]></string>
+	<string name="_adm_str_txt_pv_stats"><![CDATA[Статистика]]></string>
+	<string name="_adm_str_txt_pv_stats_votes"><![CDATA[{0} лайков]]></string>
+	<string name="_adm_str_txt_pv_stats_reviews"><![CDATA[{0} обзоров]]></string>
+	<string name="_adm_str_txt_pv_stats_views"><![CDATA[{0} просмотров]]></string>
+	<string name="_adm_str_txt_pv_tags"><![CDATA[Тэги]]></string>
+	<string name="_adm_str_txt_pv_title"><![CDATA[Заголовок]]></string>
+	<string name="_adm_str_txt_pv_updated"><![CDATA[Обновлено]]></string>
+	<string name="_adm_str_txt_pv_vendor"><![CDATA[Продавец]]></string>
+	<string name="_adm_str_txt_pv_version"><![CDATA[Версия]]></string>
+	<string name="_adm_str_txt_pv_version_mask"><![CDATA[{0} ({1} доступно)]]></string>
+	<string name="_adm_str_txt_update_from_to"><![CDATA[{0} - {1}]]></string>
+	<string name="_adm_strg_err_cannot_process_action"><![CDATA[Невозможно выполнить действие. Отсутствует связанный обработчик.]]></string>
+	<string name="_adm_strg_err_files_delete"><![CDATA[Не возможно удалить файл(ы).]]></string>
+	<string name="_adm_strg_msg_files_delete"><![CDATA[Файлы были добавлены в очередь на удаление. Они будут удалены немного позже.]]></string>
+	<string name="_adm_strg_err_images_delete"><![CDATA[Не возможно удалить изображение(я).]]></string>
+	<string name="_adm_strg_msg_images_delete"><![CDATA[Изображение были добавлены в очередь на удаление. Они будут удалены немного позже.]]></string>
+	<string name="_adm_strg_err_images_resize"><![CDATA[Не возможно изменить размер изображения.]]></string>
+	<string name="_adm_strg_txt_file_name"><![CDATA[Имя]]></string>
+	<string name="_adm_strg_txt_path"><![CDATA[ЮРЛ]]></string>
+	<string name="_adm_strg_txt_mime_type"><![CDATA[Тип]]></string>
+	<string name="_adm_strg_txt_added"><![CDATA[Дата]]></string>
+	<string name="_adm_strg_btn_delete"><![CDATA[Удалить]]></string>
+	<string name="_adm_strg_btn_add"><![CDATA[Добавить]]></string>
+	<string name="_adm_strg_btn_cancel"><![CDATA[Отмена]]></string>
+	<string name="_adm_strg_btn_done"><![CDATA[Готово]]></string>
+	<string name="_adm_strg_btn_download"><![CDATA[Скачать]]></string>
+	<string name="_adm_strg_btn_resize"><![CDATA[Изменять размеры]]></string>
+	<string name="_adm_strg_txt_files_add_popup"><![CDATA[Добавить файл]]></string>
+	<string name="_adm_strg_txt_images_add_popup"><![CDATA[Добавить изображение]]></string>
+	<string name="_adm_strg_txt_images_resize_popup"><![CDATA[Изменить размер изображения]]></string>
+	<string name="_adm_strg_txt_size_mime_type"><![CDATA[{0}x{1}, {2}]]></string>
+	<string name="_adm_strg_txt_width"><![CDATA[Ширина]]></string>
+	<string name="_adm_strg_err_width"><![CDATA[Нужно указать ширину. Пожалуйста, заполните это поле.]]></string>
+	<string name="_adm_strg_txt_height"><![CDATA[Высота]]></string>
+	<string name="_adm_strg_err_height"><![CDATA[Нужно указать высоту. Пожалуйста, заполните это поле.]]></string>
+	<string name="_adm_tmi_cpt_edit"><![CDATA[Управление загрузчиком]]></string>
+	<string name="_adm_tmi_cpt_extensions"><![CDATA[Добавить приложения]]></string>
+	<string name="_adm_tmi_cpt_favorite"><![CDATA[Показывать только Избранное]]></string>
+        <string name="_adm_tmi_cpt_language"><![CDATA[Язык]]></string>
+	<string name="_adm_tmi_cpt_logout"><![CDATA[Выйти]]></string>
+	<string name="_adm_tmi_cpt_site"><![CDATA[Перейти на сайт]]></string>
+	<string name="_adm_tmi_cpt_tour"><![CDATA[Инструкции]]></string>
+	<string name="_adm_tmi_cpt_launcher"><![CDATA[Назад к загрузчику]]></string>
+	<string name="_adm_txt_confirm_cancel"><![CDATA[Отменить]]></string>
+	<string name="_adm_txt_confirm_ok"><![CDATA[OK]]></string>
+	<string name="_adm_txt_forgot_password"><![CDATA[Забыли пароль?]]></string>
+	<string name="_adm_txt_form_view_iu_delete"><![CDATA[Удалить]]></string>
+	<string name="_adm_txt_form_view_iu_preview"><![CDATA[Текущее изображение]]></string>
+	<string name="_adm_txt_form_view_iu_preview_empty"><![CDATA[Ни одно изображение не было загружено.]]></string>
+	<string name="_adm_txt_form_view_missing"><![CDATA[отсутствует]]></string>
+	<string name="_adm_txt_login_password"><![CDATA[пароль]]></string>
+	<string name="_adm_txt_login_email"><![CDATA[эл. адрес]]></string>
+	<string name="_adm_txt_module_custom"><![CDATA[Индивидуальный]]></string>
+	<string name="_adm_txt_module_skeletons"><![CDATA[Скелеты]]></string>
+	<string name="_adm_txt_module_system"><![CDATA[Система]]></string>
+	<string name="_adm_txt_modules_check_dependencies"><![CDATA[Проверка зависимостей для модуля:]]></string>
+	<string name="_adm_txt_modules_check_module_exists"><![CDATA[Проверка модуля на существование:]]></string>
+	<string name="_adm_txt_modules_check_module_matches"><![CDATA[Проверка модуля на соответствие:]]></string>
+	<string name="_adm_txt_modules_check_module_hash"><![CDATA[Проверка хэш модуля:]]></string>
+	<string name="_adm_txt_modules_check_module_version"><![CDATA[Проверка версии модуля:]]></string>
+	<string name="_adm_txt_modules_check_script_version"><![CDATA[Проверка версии скрипта на совместимость:]]></string>
+	<string name="_adm_txt_modules_clear_db_cache"><![CDATA[Очистка кэша БД:]]></string>
+	<string name="_adm_txt_modules_clear_template_cache"><![CDATA[Очистка кэша шаблона:]]></string>
+	<string name="_adm_txt_modules_delete"><![CDATA[Удалить]]></string>
+	<string name="_adm_txt_modules_disable"><![CDATA[Отключить]]></string>
+	<string name="_adm_txt_modules_enable"><![CDATA[Включить]]></string>
+	<string name="_adm_txt_modules_executable"><![CDATA[Исполняемый]]></string>
+	<string name="_adm_txt_modules_execute_sql"><![CDATA[Изменение БД:]]></string>
+	<string name="_adm_txt_modules_ftp_access"><![CDATA[Доступ FTP]]></string>
+	<string name="_adm_txt_modules_install"><![CDATA[Установить]]></string>
+	<string name="_adm_txt_modules_install_language"><![CDATA[Установка языка:]]></string>
+	<string name="_adm_txt_modules_login"><![CDATA[Войти]]></string>
+	<string name="_adm_txt_modules_market"><![CDATA[UNA Market]]></string>
+	<string name="_adm_txt_modules_move_sources"><![CDATA[Перенос файлов исходного кода:]]></string>
+	<string name="_adm_txt_modules_operation_update"><![CDATA[Установка обновления <b>{0}</b> от {1} до {2}]]></string>
+	<string name="_adm_txt_modules_package_module"><![CDATA[Модуль]]></string>
+	<string name="_adm_txt_modules_package_to_upload"><![CDATA[Пакет для загрузки]]></string>
+	<string name="_adm_txt_modules_params_used"><![CDATA[Модуль с аналогичными уникальными параметрами уже установлен.]]></string>
+	<string name="_adm_txt_modules_password"><![CDATA[Пароль]]></string>
+	<string name="_adm_txt_modules_process_action_success"><![CDATA[Выполнено]]></string>
+	<string name="_adm_txt_modules_process_connections"><![CDATA[Обработка связей:]]></string>
+	<string name="_adm_txt_modules_process_deleted_profiles"><![CDATA[Обработка удалённых профилей:]]></string>
+	<string name="_adm_txt_modules_process_menu_triggers"><![CDATA[Обработка триггеров меню:]]></string>
+	<string name="_adm_txt_modules_process_page_triggers"><![CDATA[Обработка триггеров страниц:]]></string>
+	<string name="_adm_txt_modules_process_storages"><![CDATA[Обработка хранилищ:]]></string>
+	<string name="_adm_txt_modules_process_failed"><![CDATA[Неудача]]></string>
+	<string name="_adm_txt_modules_process_success"><![CDATA[Выполнено]]></string>
+	<string name="_adm_txt_modules_process_esearches"><![CDATA[Обработка форм поиска:]]></string>
+	<string name="_adm_txt_modules_register_transcoders"><![CDATA[Регистрация транскодеров:]]></string>
+	<string name="_adm_txt_modules_unregister_transcoders"><![CDATA[Отмена регистрации транскодеров:]]></string>
+	<string name="_adm_txt_modules_show_conclusion"><![CDATA[Заключение от продавца:]]></string>
+	<string name="_adm_txt_modules_show_introduction"><![CDATA[Введение от продавца:]]></string>
+	<string name="_adm_txt_modules_update_files"><![CDATA[Обновление файлов:]]></string>
+	<string name="_adm_txt_modules_update_relations"><![CDATA[Обновление связей:]]></string>
+	<string name="_adm_txt_modules_update_relations_for_all"><![CDATA[Обновление связей для всех зависимых модулей:]]></string>
+	<string name="_adm_txt_modules_update_languages"><![CDATA[Обновление языков:]]></string>
+	<string name="_adm_txt_modules_update_latest"><![CDATA[У Вас самая свежая версия.]]></string>
+	<string name="_adm_txt_modules_update_text"><![CDATA[Доступна новая версия {0}.]]></string>
+	<string name="_adm_txt_modules_updates"><![CDATA[Доступные обновления]]></string>
+	<string name="_adm_txt_modules_upload"><![CDATA[Добавить новый Модуль]]></string>
+	<string name="_adm_txt_modules_writable"><![CDATA[Записываемый]]></string>
+	<string name="_adm_txt_pca_active"><![CDATA[Активные]]></string>
+	<string name="_adm_txt_pca_favorite"><![CDATA[Избранные]]></string>
+	<string name="_adm_txt_remember_me"><![CDATA[Запомнить меня]]></string>
+	<string name="_adm_txt_select_module"><![CDATA[Выбрать модуль...]]></string>
+	<string name="_adm_txt_show_actions"><![CDATA[Действия]]></string>
+	<string name="_adm_txt_show_help"><![CDATA[Помощь]]></string>
+	<string name="_adm_txt_show_help_content_empty"><![CDATA[Помошь недоступна]]></string>
+	<string name="_adm_txt_uninstall"><![CDATA[Демонтировать]]></string>
+  <string name="_adm_wgt_cpt_audit"><![CDATA[Аудит]]></string>
+  <string name="_adm_wgt_cpt_badges"><![CDATA[Бейджи]]></string>
+	<string name="_adm_wgt_cpt_builder_forms"><![CDATA[Формы]]></string>
+	<string name="_adm_wgt_cpt_builder_menus"><![CDATA[Навигация]]></string>
+	<string name="_adm_wgt_cpt_builder_pages"><![CDATA[Страницы]]></string>
+	<string name="_adm_wgt_cpt_builder_permissions"><![CDATA[Разрешения]]></string>
+	<string name="_adm_wgt_cpt_dashboard"><![CDATA[Панель]]></string>
+	<string name="_adm_wgt_cpt_designer"><![CDATA[Дизайнер]]></string>
+	<string name="_adm_wgt_cpt_polyglot"><![CDATA[Полиглот]]></string>
+	<string name="_adm_wgt_cpt_settings"><![CDATA[Настройки]]></string>
+	<string name="_adm_wgt_cpt_storages"><![CDATA[Хранилище]]></string>
+	<string name="_adm_wgt_cpt_store"><![CDATA[Магазин приложений]]></string>
+	<string name="_cmt_block_comments_title"><![CDATA[Комментарии ({0})]]></string>
+	<string name="_cmt_browse_all"><![CDATA[Все]]></string>
+	<string name="_cmt_browse_friends"><![CDATA[Друзья]]></string>
+	<string name="_cmt_browse_head"><![CDATA[Старейшие]]></string>
+	<string name="_cmt_browse_popular"><![CDATA[Популярные]]></string>
+	<string name="_cmt_browse_subscriptions"><![CDATA[Подписки]]></string>
+	<string name="_cmt_browse_tail"><![CDATA[Новейшие]]></string>
+	<string name="_cmt_display_flat"><![CDATA[Целиком]]></string>
+	<string name="_cmt_display_threaded"><![CDATA[Поэтапно]]></string>
+	<string name="_cmt_err_cannot_perform_action"><![CDATA[Невозможно выполнить действие. Пожалуйста, оповестите нас об этой проблеме.]]></string>
+	<string name="_cmt_msg_login_required"><![CDATA[Чтобы оставить комментарий, вам необходимо <a href="{0}">войти</a> или <a href="{1}">зарегистрироваться</a>.]]></string>
+	<string name="_cmt_page_view_header"><![CDATA[Комментарий к '{object_title}']]></string>
+	<string name="_cmt_page_view_title"><![CDATA[Комментарий к <a href="{object_url}">{object_title}</a>]]></string>
+	<string name="_cmt_download_attached_file"><![CDATA[Скачать файл]]></string>
+	<string name="_cmt_view_attached_image"><![CDATA[Просмотреть изображение]]></string>
+	<string name="_cmt_load_more_comments_head"><![CDATA[Увидеть новые комментарии...]]></string>
+	<string name="_cmt_load_more_comments_tail"><![CDATA[Увидеть старые комментарии...]]></string>
+	<string name="_cmt_load_more_comments_popular"><![CDATA[Увидеть ещё комментарии...]]></string>
+	<string name="_cmt_load_more_replies_head"><![CDATA[Увидеть новые ответы...]]></string>
+	<string name="_cmt_load_more_replies_tail"><![CDATA[Увидеть старые ответы...]]></string>
+	<string name="_cmt_load_more_replies_popular"><![CDATA[Увидеть ещё ответы...]]></string>
+        <string name="_cmt_txt_new_content"><![CDATA[Новое сообщение]]></string>
+	<string name="_cmt_txt_link_show"><![CDATA[Прочитать]]></string>
+	<string name="_cmt_txt_link_reply"><![CDATA[Ответить]]></string>
+        <string name="_cmt_txt_added_sample"><![CDATA[добавил новый комментарий]]></string>
+	<string name="_cmt_txt_or"><![CDATA[или]]></string>
+	<string name="_cmt_txt_sample_comment_single"><![CDATA[комментарий]]></string>
+        <string name="_cmt_txt_sample_reaction_single"><![CDATA[реакция '{0}' к комментарию]]></string>
+	<string name="_cmt_txt_sample_reply_to"><![CDATA[ответ на комментарий]]></string>
+        <string name="_cmt_txt_sample_score_up_single"><![CDATA[голос за комментарий]]></string>
+        <string name="_cmt_txt_sample_score_down_single"><![CDATA[голос против комментария]]></string>
+        <string name="_cmt_txt_sample_vote_single"><![CDATA[голос за комментарий]]></string>
+	<string name="_cmt_txt_n_comments"><![CDATA[{0} комментариев]]></string>	
+        <string name="_cmt_txt_do"><![CDATA[Комментировать]]></string>
+        <string name="_cmt_txt_counter"><![CDATA[{0}]]></string>
+	<string name="_cmt_txt_counter_empty"><![CDATA[Комментировать]]></string>
+        <string name="_cmt_txt_min_form_placeholder"><![CDATA[{0}, здесь Вы можете оставить комментарий.]]></string>
+        <string name="_cmt_rvw_block_rating_title"><![CDATA[Оценка по обзорам]]></string>
+        <string name="_cmt_rvw_block_reviews_title"><![CDATA[Обзоры ({0})]]></string>
+        <string name="_cmt_rvw_txt_min_form_placeholder"><![CDATA[{0}, здесь Вы можете написать обзор.]]></string>
+        <string name="_cmt_rvw_txt_sample_comment_single"><![CDATA[обзор]]></string>
+        <string name="_cmt_rvw_txt_sample_reaction_single"><![CDATA[реакция '{0}' к обзору]]></string>
+        <string name="_cmt_rvw_txt_sample_score_up_single"><![CDATA[голос за обзор]]></string>
+        <string name="_cmt_rvw_txt_sample_score_down_single"><![CDATA[голос против обзора]]></string>
+        <string name="_cmt_rvw_txt_sample_vote_single"><![CDATA[голос за обзор]]></string>
+        <string name="_cmt_rvw_txt_empty"><![CDATA[Нет обзоров]]></string>
+	<string name="_copyright"><![CDATA[&copy; {0} Компания]]></string>
+	<string name="_delete"><![CDATA[удалить]]></string>
+	<string name="_error occured"><![CDATA[Произошла ошибка]]></string>
+	<string name="_from"><![CDATA[от]]></string>
+	<string name="_hidden_comment"><![CDATA[Комментарий от <b>{0}</b> спрятан.]]></string>
+	<string name="_in_reply_to"><![CDATA[В ответ на]]></string>
+        <string name="_in_reply_to_x"><![CDATA[В ответ на {0}]]></string>
+	<string name="_item"><![CDATA[элемент]]></string>
+	<string name="_items"><![CDATA[элементы]]></string>
+	<string name="_member_banned"><![CDATA[Извините, Вас забанили]]></string>
+	<string name="_message_subject"><![CDATA[Тема сообщения]]></string>
+	<string name="_mma_comments_edit_own"><![CDATA[комментарии - редактировать свои]]></string>
+	<string name="_mma_comments_post"><![CDATA[комментарии - разместить]]></string>
+	<string name="_mma_comments_remove_own"><![CDATA[комментарии - удалить свои]]></string>
+	<string name="_mma_comments_vote"><![CDATA[комментарии - голосовать]]></string>
+	<string name="_mma_get_other_members_emails"><![CDATA[получать эл. адреса других пользователей]]></string>
+	<string name="_mma_send_greetings"><![CDATA[посылать приветствия]]></string>
+	<string name="_mma_send_messages"><![CDATA[посылать сообщения]]></string>
+	<string name="_mma_view_profiles"><![CDATA[просматривать профили]]></string>
+	<string name="_mma_vote"><![CDATA[голосовать]]></string>
+	<string name="_month_next"><![CDATA[Следующий месяц]]></string>
+	<string name="_month_prev"><![CDATA[Предыдущий месяц]]></string>
+	<string name="_no limit"><![CDATA[без ограничений]]></string>
+	<string name="_powered_by"><![CDATA[Регулируется]]></string>
+	<string name="_see_more"><![CDATA[смотреть ещё]]></string>
+	<string name="_show_replacement"><![CDATA[Показать]]></string>
+	<string name="_sys_accept"><![CDATA[Принять]]></string>
+	<string name="_sys_accounts"><![CDATA[Учётные записи]]></string>
+	<string name="_sys_access_denied_to_private_content"><![CDATA[Доступ запрещён. Это приватное содержимое.]]></string>
+	<string name="_sys_actions"><![CDATA[Действия]]></string>
+	<string name="_sys_active"><![CDATA[Активный]]></string>
+  <string name="_sys_account_settings_email_successfully_submitted"><![CDATA[Настройки email-а успешно сохранены]]></string>
+  <string name="_sys_account_settings_pwd_successfully_submitted"><![CDATA[Пароль был успешно изменен]]></string>
+  <string name="_sys_account_settings_info_successfully_submitted"><![CDATA[Настройки аккаунта успешно сохранены]]></string>
+	<string name="_sys_acc_confirmation_type_none"><![CDATA[Нет подтверждения]]></string>
+	<string name="_sys_acc_confirmation_type_email"><![CDATA[email подтвержден]]></string>
+	<string name="_sys_acc_confirmation_type_phone"><![CDATA[телефон подтвержден]]></string>
+	<string name="_sys_acc_confirmation_type_email_and_phone"><![CDATA[email и телефон подтвержден]]></string>
+	<string name="_sys_acl_action_account"><![CDATA[Вы не создали ни одного профиля, поэтому Вы не можете '{1}'.]]></string>
+	<string name="_sys_acl_action_chart_view"><![CDATA[Диаграммы - Просматривать]]></string>
+    <string name="_sys_acl_action_chart_view_desc"><![CDATA[Просматривать статистические диаграммы]]></string>
+	<string name="_sys_acl_action_comments_edit_all"><![CDATA[Комментарии - Редактировать Все]]></string>
+	<string name="_sys_acl_action_comments_edit_own"><![CDATA[Комментарии - Редактировать Свои]]></string>
+	<string name="_sys_acl_action_comments_post"><![CDATA[Комментарии - Размещать]]></string>
+	<string name="_sys_acl_action_comments_remove_all"><![CDATA[Комментарии - Удалить Все]]></string>
+	<string name="_sys_acl_action_comments_remove_own"><![CDATA[Комментарии - Удалить Собственные]]></string>
+	<string name="_sys_acl_action_connect"><![CDATA[Установить связь (подружиться, следить и т.п.)]]></string>
+	<string name="_sys_acl_action_create_account"><![CDATA[Создать Аккаунт]]></string>
+	<string name="_sys_acl_action_create_account_desc"><![CDATA[Это имеет смысл только для гостей. Например, Вы можете временно отключить или задать лимит по времени для этого пункта.]]></string>
+	<string name="_sys_acl_action_delete_account"><![CDATA[Удалить Аккаунт]]></string>
+	<string name="_sys_acl_action_delete_account_desc"><![CDATA[Удалить аккаунт, также удалить содержимое аккаунта.]]></string>
+	<string name="_sys_acl_action_every_period"><![CDATA[ каждые {4} часа, новый период начнется {8}]]></string>
+	<string name="_sys_acl_action_favorite"><![CDATA[Избранное - Добавлять]]></string>
+	<string name="_sys_acl_action_favorite_view"><![CDATA[Избранное - Просматривать]]></string>
+	<string name="_sys_acl_action_feature"><![CDATA[Продвинутое - Добавлять]]></string>
+	<string name="_sys_acl_action_view_view"><![CDATA[Просмотры - Просматривать]]></string>
+	<string name="_sys_acl_action_view_view_viewers_own"><![CDATA[Просмотры - Просматривать смотревших для своего контента]]></string>
+	<string name="_sys_acl_action_limit_reached"><![CDATA[Вы достигли лимита. Ваше текущее членство ({2}) позволяет {1} не более {3} раз]]></string>
+	<string name="_sys_acl_action_not_allowed"><![CDATA[Ваше текущее членство ({2}) не позволяет '{1}'.]]></string>
+	<string name="_sys_acl_action_not_allowed_after"><![CDATA[Ваше текущее членство ({2}) более не позволяет '{1}' {5}.]]></string>
+	<string name="_sys_acl_action_not_allowed_before"><![CDATA[Ваше текущее членство ({2}) позволит '{1}' {6}.]]></string>
+    <string name="_sys_acl_action_pending"><![CDATA[В данный момент вы неактивный пользователь. Пожалуйста, попросите <a href="mailto:{7}">администратора сайта</a> активировать Вас, чтобы Вы могли <b>{1}</b>.]]></string>
+	<string name="_sys_acl_action_post_links"><![CDATA[Публикация ссылок]]></string>
+    <string name="_sys_acl_action_post_links_desc"><![CDATA[Публикация ссылок в формах]]></string>
+	<string name="_sys_acl_action_use_macros"><![CDATA[Использовать макросы]]></string>
+    <string name="_sys_acl_action_use_macros_desc"><![CDATA[Использовать специально сконструированный вызов, для вставки динамического контента практически в любой текст]]></string>
+	<string name="_sys_acl_action_set_acl_level"><![CDATA[Назначить членство]]></string>
+	<string name="_sys_acl_action_set_acl_level_desc"><![CDATA[Назначить членство для профилей]]></string>
+  <string name="_sys_acl_action_show_membership_levels_in_privacy_groups"><![CDATA[Показывать членство в группах конфиденциальности]]></string>
+  <string name="_sys_acl_action_show_membership_levels_in_privacy_groups_desc"><![CDATA[Показывать членство в группах конфиденциальности]]></string>
+  <string name="_sys_acl_action_show_membership_private_info"><![CDATA[Показывать конфиденциальную информацию о членстве]]></string>
+  <string name="_sys_acl_action_show_membership_private_info_desc"><![CDATA[Показывать конфиденциальную информацию о членстве]]></string>
+  <string name="_sys_acl_action_set_badge"><![CDATA[Назначение бейджей]]></string>
+  <string name="_sys_acl_action_set_badge_desc"><![CDATA[Назначение бейджей для контента]]></string>
+  <string name="_sys_acl_action_switch_to_any_profile"><![CDATA[Переключиться на любой профиль]]></string>
+  <string name="_sys_acl_action_switch_to_any_profile_desc"><![CDATA[Разрешать переключаться на любой профиль]]></string>
+        <string name="_sys_acl_action_set_acl_as_privacy"><![CDATA[Использовать уровень членства в настройках приватности]]></string>
+	<string name="_sys_acl_action_set_acl_as_privacy_desc"><![CDATA[Использовать уровень членства в настройках приватности в формах добавления контента]]></string>
+        <string name="_sys_acl_action_set_form_fields_privacy"><![CDATA[Назначение приватности для полей форм]]></string>
+	<string name="_sys_acl_action_set_form_fields_privacy_desc"><![CDATA[Разрешать менять приватность для полей форм]]></string>
+	<string name="_sys_acl_action_suspended"><![CDATA[Вы не можете '{1}', потому что Ваш профайл заблокирован. Если Вы не знаете, почему, постарайтесь связаться с <a href="mailto:{7}">администратором</a>.]]></string>
+	<string name="_sys_acl_action_unauthenticated"><![CDATA[Не вошедшие пользователи не могут '{1}'.]]></string>
+	<string name="_sys_acl_action_unconfirmed"><![CDATA[Вы не подтвердили свой профиль. Пожалуйста, проверьте эл. сообщение со ссылкой на активацию профиля. Неподтверждённые пользователи не могут <b>{1}</b>.]]></string>
+	<string name="_sys_acl_action_vote"><![CDATA[Голосовать]]></string>
+        <string name="_sys_acl_action_vote_view"><![CDATA[Просматривать голоса]]></string>
+        <string name="_sys_acl_action_vote_view_voters"><![CDATA[Просматривать проголосовавших]]></string>
+	<string name="_sys_acl_action_report"><![CDATA[Жаловаться]]></string>
+	<string name="_sys_acl_action_report_view"><![CDATA[Просматривать жалобы]]></string>
+	<string name="_sys_acl_action_add_block"><![CDATA[Вики: добавление блока]]></string>
+	<string name="_sys_acl_action_edit_block"><![CDATA[Вики: редактирование блока]]></string>
+	<string name="_sys_acl_action_translate_block"><![CDATA[Вики: перевод блока]]></string>
+	<string name="_sys_acl_action_delete_version"><![CDATA[Вики: удаление версии]]></string>
+	<string name="_sys_acl_action_delete_block"><![CDATA[Вики: удаление блока]]></string>
+	<string name="_sys_acl_action_history"><![CDATA[Вики: просмотр истории]]></string>
+	<string name="_sys_acl_action_unsafe"><![CDATA[Вики: разрешить HTML]]></string>
+	<string name="_sys_acl_start"><![CDATA[Начало: ]]></string>
+	<string name="_sys_acl_expire"><![CDATA[Окончание: ]]></string>
+	<string name="_sys_acl_expire_never"><![CDATA[никогда]]></string>
+
+  <string name="_sys_audit_action_edit_content"><![CDATA[Контент изменен]]></string>
+  <string name="_sys_audit_action_add_content"><![CDATA[Контент добавлен]]></string>
+  <string name="_sys_audit_action_detete_content"><![CDATA[Контент удален]]></string>
+  <string name="_sys_audit_action_edit_comment"><![CDATA[Комментарий изменен]]></string>
+  <string name="_sys_audit_action_add_comment"><![CDATA[Комментарий добавлен]]></string>
+  <string name="_sys_audit_action_delete_comment"><![CDATA[Комментарий удален]]></string>
+  <string name="_sys_audit_action_feature"><![CDATA[Добавлен в избранные]]></string>
+  <string name="_sys_audit_action_unfeature"><![CDATA[Удален из избранных]]></string>
+  <string name="_sys_audit_action_group_to_admins"><![CDATA[Добавлен в администраторы группы]]></string>
+  <string name="_sys_audit_action_group_from_admins"><![CDATA[Удален из администраторов группы]]></string>
+  <string name="_sys_audit_action_group_join_request_accepted"><![CDATA[Запрос принят]]></string>
+  <string name="_sys_audit_action_account_change_role_to_3"><![CDATA[Добавлен в операторы]]></string>
+  <string name="_sys_audit_action_account_change_role_to_1"><![CDATA[Удален из операторов]]></string>
+  <string name="_sys_audit_action_account_unlock"><![CDATA[Разблокирован]]></string>
+  <string name="_sys_audit_action_account_reset_password"><![CDATA[Пароль сброшен]]></string>
+  <string name="_sys_audit_action_account_resend_confirmation_email"><![CDATA[Письмо с подтверждением отправлено повторно]]></string>
+  <string name="_sys_audit_action_account_deleted_with_content"><![CDATA[Удален вместе с контентом]]></string>
+  <string name="_sys_audit_action_account_deleted"><![CDATA[Удален]]></string>
+  <string name="_sys_audit_action_account_email_changed"><![CDATA[Адрес электронной почты изменен]]></string>
+  <string name="_sys_audit_action_account_activated"><![CDATA[Активирован]]></string>
+  <string name="_sys_audit_action_account_suspended"><![CDATA[Приостановлен]]></string>
+  <string name="_sys_audit_action_content_enabled"><![CDATA[Включено]]></string>
+  <string name="_sys_audit_action_content_disabled"><![CDATA[Выключено]]></string>
+  <string name="_sys_audit_action_set_membership"><![CDATA[Набор участников]]></string>
+  <string name="_sys_audit_action_set_status_approve"><![CDATA[Статус: принято]]></string>
+  <string name="_sys_audit_action_set_status_active"><![CDATA[Статус: активно]]></string>
+  <string name="_sys_audit_action_set_status_disapprove"><![CDATA[Статус: не одобрено]]></string>
+  <string name="_sys_audit_action_set_status_suspended"><![CDATA[Статус: приостановлено]]></string>
+  <string name="_sys_audit_action_report"><![CDATA[Новая жалоба]]></string>
+  <string name="_sys_audit_action_lock"><![CDATA[Заблокировно]]></string>
+  <string name="_sys_audit_action_unlock"><![CDATA[Разблокировано]]></string>
+  <string name="_sys_audit_action_stick"><![CDATA[Приклеено]]></string>
+  <string name="_sys_audit_action_unstick"><![CDATA[Отклеено]]></string>
+  <string name="_sys_audit_action_promote"><![CDATA[Продвинуно]]></string>
+  <string name="_sys_audit_action_unpromote"><![CDATA[Продвижение снято]]></string>
+
+  <string name="_sys_add_friend"><![CDATA[Добавить в друзья]]></string>
+        <string name="_sys_add_relation"><![CDATA[Добавить связь]]></string>
+	<string name="_sys_adm_installed"><![CDATA[Установленные]]></string>
+	<string name="_sys_admin_apply"><![CDATA[Применить]]></string>
+	<string name="_sys_admin_filter"><![CDATA[Фильтр:]]></string>
+	<string name="_sys_audit_cron_jobs"><![CDATA[Планировщик]]></string>
+	<string name="_sys_audit_cron_jobs_exec_time"><![CDATA[Последний запуск планировщика]]></string>
+	<string name="_sys_audit_header_manual_audit"><![CDATA[Ручной аудит сервера]]></string>
+	<string name="_sys_audit_header_requirements"><![CDATA[Требования]]></string>
+	<string name="_sys_audit_header_site_optimization"><![CDATA[Оптимизация сайта]]></string>
+	<string name="_sys_audit_header_site_setup"><![CDATA[Настройка сайта]]></string>
+	<string name="_sys_audit_mail_sending"><![CDATA[Посылка почты]]></string>
+	<string name="_sys_audit_msg_apache_module_fail"><![CDATA[Вам нужно установить {0} для Apache]]></string>
+	<string name="_sys_audit_msg_apache_module_undef"><![CDATA[проверьте вручную: apachectl -M 2>&1 | grep {0}]]></string>
+	<string name="_sys_audit_msg_cron_jobs"><![CDATA[<pre class="code">{0}</pre> если Вы не уверены, корректен ли вывод, может понадобиться <a href="#manual_audit">ручной аудит сервера</a>]]></string>
+	<string name="_sys_audit_msg_optimization_fail"><![CDATA[пожалуйста, задействуйте этот кэш в Студии &gt; Настройки &gt; Кэш]]></string>
+	<string name="_sys_audit_msg_optimization_warn"><![CDATA[установка PHP-акселератора ускорит кэширование файлов]]></string>
+	<string name="_sys_audit_msg_x_based_cache_engine"><![CDATA[ ({0} кэш-движок)]]></string>
+	<string name="_sys_audit_msg_ffmpeg"><![CDATA[<pre class="code">{0}</pre>если Вы не уверены, корректен ли вывод, может понадобиться <a href="#manual_audit">ручной аудит сервера</a>.]]></string>
+	<string name="_sys_audit_msg_hardware_requirements"><![CDATA[Требования к "железу" невозможно установить автоматически - может быть необходим <a href="#manual_audit">ручной аудит сервера</a>.]]></string>
+	<string name="_sys_audit_msg_mail_send_failed"><![CDATA[не удалось отослать письмо]]></string>
+	<string name="_sys_audit_msg_mail_sending"><![CDATA[<span id="bx-sys-adm-audit-test-email"><a href="javascript:void(0);" onclick="bx_sys_adm_audit_test_email()">нажмите здесь</a>, чтобы отослать тестовое сообщение</span>]]></string>
+	<string name="_sys_audit_msg_mail_sent"><![CDATA[тестовое сообщение отослано, пожалуйста, проверьте {0} эл. ящик]]></string>
+	<string name="_sys_audit_msg_manual_audit"><![CDATA[<p>
+Некоторые пункты не могут быть автоматически определены, ручной аудит сервера необходим для проверки. 
+Если Вы не знаете, как провести его самостоятельно, Вы можете запросить <a target="_blank" href="mailto:support@una.io?subject=Ручной аудит сервера">ручной аудит сервера</a>.
+</p>]]></string>
+	<string name="_sys_audit_msg_must_be"><![CDATA[нужно {0} {1}]]></string>
+	<string name="_sys_audit_msg_optimization_apache_module"><![CDATA[Чтобы применить эту оптимизацию, Вам нужно иметь <b>{0}</b> - {1}]]></string>
+	<string name="_sys_audit_msg_permissions"><![CDATA[пожалуйста <a href="javascript:void(0);" onclick="oBxDolStudioDashboard.permissions()">нажмите здесь</a>, чтобы выяснить, корректны ли разрешения.]]></string>
+	<string name="_sys_audit_msg_php_accelerator_missing"><![CDATA[Можно значительно ускорить работу скрипта, если установить PHP-акселератор]]></string>
+	<string name="_sys_audit_msg_php_setup_inefficient"><![CDATA[Ваши PHP-настройки могут быть очень неэффективными, <a href="javascript:void(0)" onclick="bx_sys_adm_audit_phpinfo()">проверьте их</a> и попробуйте переключиться на mod_php, apache dso module или FastCGI]]></string>
+	<string name="_sys_audit_msg_serverside_compression"><![CDATA[
+может быть проверено <a href="#manual_audit">вручную</a> или с помощью интсрумента "Page Speed", встроенного в браузер.<br />
+Если он не задействован, тогда попробуйте применить эту оптимизацию, так как она улучшает скорость сайта и сохраняет трафик, обратитесь к <a href="http://www.boonex.com/trac/dolphin/wiki/HostingServerSetupRecommendations#Serversidecontentcompression">этому руководству</a>, чтобы узнать больше.<br />{0}]]></string>
+	<string name="_sys_audit_msg_should_be"><![CDATA[хорошо бы {0} {1}]]></string>
+	<string name="_sys_audit_msg_userside_caching"><![CDATA[
+<a href="{0}">нажмите здесь для проверки в Google Page Speed</a><br />
+Если он не задействован, тогда попробуйте применить эту оптимизацию, так как она улучшает скорость сайта и сохраняет трафик, обратитесь к <a target="_blank" href="http://www.boonex.com/trac/dolphin/wiki/HostingServerSetupRecommendations#Usersidecachingforstaticcontent">этому руководству</a>, чтобы узнать больше.<br />{1}]]></string>
+	<string name="_sys_audit_msg_value_checking_failed"><![CDATA[проверка значения не удалась]]></string>
+	<string name="_sys_audit_msg_version_is_incompatible"><![CDATA[Ваша версия несовместима с UNA, нужно как минимум {0}]]></string>
+	<string name="_sys_audit_msg_version_is_outdated"><![CDATA[Ваша версия устарела, может потребоваться обновление до последней версии {0}]]></string>
+	<string name="_sys_audit_permissions"><![CDATA[Разрешения файлов и папок]]></string>
+	<string name="_sys_audit_php_accelerator"><![CDATA[PHP-акселератор]]></string>
+	<string name="_sys_audit_php_setup"><![CDATA[PHP-настройка]]></string>
+	<string name="_sys_audit_section_hardware"><![CDATA[Железо]]></string>
+	<string name="_sys_audit_section_os"><![CDATA[ОС]]></string>
+	<string name="_sys_audit_section_webserver"><![CDATA[Web-сервер]]></string>
+	<string name="_sys_audit_serverside_compression"><![CDATA[Сжатие содержимого на стороне сервера]]></string>
+	<string name="_sys_audit_title_fail"><![CDATA[ПРОВАЛ]]></string>
+	<string name="_sys_audit_title_ok"><![CDATA[ПОРЯДОК]]></string>
+	<string name="_sys_audit_title_undef"><![CDATA[НЕ ОПРЕДЕЛЕНО]]></string>
+	<string name="_sys_audit_title_warn"><![CDATA[ПРЕДУПРЕЖДЕНИЕ]]></string>
+	<string name="_sys_audit_userside_caching"><![CDATA[Кэширование статичного содержимого на стороне пользователя]]></string>
+	<string name="_sys_audit_version"><![CDATA[версия]]></string>
+	<string name="_sys_audit_version_script"><![CDATA[Версия UNA]]></string>
+        <string name="_sys_block_type_custom"><![CDATA[индивидуальный]]></string>
+	<string name="_sys_block_type_html"><![CDATA[html]]></string>
+	<string name="_sys_block_type_image"><![CDATA[изображение]]></string>
+	<string name="_sys_block_type_lang"><![CDATA[язык]]></string>
+	<string name="_sys_block_type_menu"><![CDATA[меню]]></string>
+	<string name="_sys_block_type_raw"><![CDATA[без обработки]]></string>
+	<string name="_sys_block_type_rss"><![CDATA[rss]]></string>
+        <string name="_sys_block_type_wiki"><![CDATA[вики]]></string>
+	<string name="_sys_block_type_service"><![CDATA[сервис]]></string>
+	<string name="_sys_block_types_custom"><![CDATA[Индивидуальный]]></string>
+	<string name="_sys_block_types_skeletons"><![CDATA[Скелеты]]></string>
+	<string name="_sys_block_types_system"><![CDATA[Система]]></string>
+  
+  <string name="_sys_cmts_administration_grid_column_title_adm_cmt_text"><![CDATA[Текст]]></string>
+  <string name="_sys_cmts_administration_grid_column_title_adm_cmt_time"><![CDATA[Добавлено]]></string>
+  <string name="_sys_cmts_administration_grid_column_title_adm_cmt_author_id"><![CDATA[Автор]]></string>
+  <string name="_sys_cmts_administration_grid_action_title_adm_delete"><![CDATA[Удалить]]></string>
+	
+    <string name="_sys_chart_growth_object"><![CDATA[Вывести]]></string>
+    <string name="_sys_chart_growth_date_from"><![CDATA[С]]></string>
+    <string name="_sys_chart_growth_date_to"><![CDATA[По]]></string>
+    <string name="_sys_chart_accounts_growth"><![CDATA[Аккаунты: Развитие]]></string>
+    <string name="_sys_chart_accounts_growth_speed"><![CDATA[Аккаунты: Скорость развития]]></string>
+	<string name="_sys_close"><![CDATA[Закрыть]]></string>
+        <string name="_sys_confirm"><![CDATA[Подтвердить]]></string>
+        <string name="_sys_confirmed"><![CDATA[Подтвержденный]]></string>
+	<string name="_sys_conn_err_connection_already_exists"><![CDATA[Связь уже существует]]></string>
+	<string name="_sys_conn_err_connection_does_not_exists"><![CDATA[Связь не существует]]></string>
+	<string name="_sys_conn_err_connection_is_awaiting_confirmation"><![CDATA[Запрос на связь ожидает подтверждения]]></string>
+	<string name="_sys_conn_err_input_data_is_not_defined"><![CDATA[Входные данные не определены]]></string>
+    <string name="_sys_conn_msg_success"><![CDATA[Операция удачно завершена]]></string>
+
+    <string name="_sys_connect_information"><![CDATA[Информация о настройке]]></string>
+    <string name="_sys_connect_error_join_unavailable"><![CDATA[Извините, но регистрация на данный момент недоступна. Пожалуйста попробуйте снова попозже.]]></string>
+    <string name="_sys_connect_profile_error_info"><![CDATA[Невозможно получить информацию о профиле]]></string>
+	<string name="_sys_connect_state_invalid"><![CDATA["State" параметр не совпадает]]></string>
+    <string name="_sys_connect_adm_stg_cpt_category_general"><![CDATA[Общие]]></string>
+    <string name="_sys_connect_option_redirect"><![CDATA[Перенаправление после захода на сайт]]></string>
+    <string name="_sys_connect_option_module"><![CDATA[Модуль в котором создавать профили]]></string>
+    <string name="_sys_connect_option_confirm_email"><![CDATA[Всегда подтверждать email, когда заходят через это соединение]]></string>
+    <string name="_sys_connect_option_approve"><![CDATA[Всегда одобрять профиль, когда заходят через это соединение]]></string>
+    <string name="_sys_connect_option_privacy"><![CDATA[Настройки конфиденциальности для созданных профилей]]></string>
+
+	<string name="_sys_currency"><![CDATA[{0}{1}]]></string>
+        <string name="_sys_decline"><![CDATA[Отклонить]]></string>
+	<string name="_sys_designbox_0"><![CDATA[Содержимое]]></string>
+	<string name="_sys_designbox_1"><![CDATA[Содержимое + заголовок + фон]]></string>
+	<string name="_sys_designbox_10"><![CDATA[Содержимое + отступ]]></string>
+	<string name="_sys_designbox_11"><![CDATA[Содержимое + заголовок + фон + отступ]]></string>
+	<string name="_sys_designbox_13"><![CDATA[Содержимое + фон + отступ]]></string>
+	<string name="_sys_designbox_14"><![CDATA[Содержимое + заголовок + отступ]]></string>
+	<string name="_sys_designbox_2"><![CDATA[Пустой квадратик]]></string>
+	<string name="_sys_designbox_3"><![CDATA[Содержимое + фон]]></string>
+	<string name="_sys_designbox_4"><![CDATA[Содержимое + заголовок]]></string>
+	<string name="_sys_done"><![CDATA[Готово]]></string>
+	<string name="_sys_et_txt_about_us"><![CDATA[О нас]]></string>
+	<string name="_sys_et_txt_body_admin_email"><![CDATA[{email_header}
+<p>Сообщение от администрации сайта <a href="{site_url}">{site_name}</a>:</p>
+<p> </p>
+<p>{MessageText}</p>
+<p> </p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_comment_replied"><![CDATA[{email_header}
+<p>{sender_display_name} ответил на Ваш комментарий:</p>
+<p> </p>
+<p>{reply_text}</p>
+<p> </p>
+<p>Ответ можно посмотреть здесь: <a href="{page_url}">{page_title}</a>.</p>
+<p> </p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_system_reported"><![CDATA[{email_header}
+<p>Была получена новая жалоба <b>{report_type}</b>:</p>
+<p> </p>
+<p>{report_text}</p>
+<p> </p>
+<p><a href="{report_url}">Посмотреть жалобу</a>.</p>
+<p> </p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_confirmation"><![CDATA[{email_header}
+<p>Привет, {name}.</p>
+<p>Пожалуйста, подтвердите ваш email, нажав по ссылке:</p>
+<p> </p>
+<p><a href="{conf_link}">{conf_link}</a></p>
+<p> </p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_delayed_module_uninstall"><![CDATA[{email_header}
+<p>Модуль: <b>{Module}</b></p>
+<p>Результат демонтажа: {Result}</p>
+<p> </p>
+<p>{Message}</p>
+<p> </p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_forgot"><![CDATA[{email_header}
+<p>Пожалуйста, нажмите по ссылке, чтобы сбросить свой пароль:</p>
+<p> </p>
+<p><a href="{forgot_password_url}">Сбросить мой пароль</a>.</p>
+<p> </p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_mem_changed"><![CDATA[{email_header}
+<p>Уровень членства профиля <b>{profile_name}</b> изменён на <b>{membership_level}</b>.</p>
+<p> </p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_mem_expiration"><![CDATA[{email_header}
+<p>Ваше {membership_name} членство истекает через {expire_days} дней (-1 означает: уже истекло).</p>
+<p>Нажмите по ссылке, чтобы обновить ваше членство:</p>
+<p> </p>
+<p><a href="{page_url}">Обновить моё членство</a>.</p>
+<p> </p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_password_reset"><![CDATA[{email_header}
+<p>Ваш новый пароль:</p>
+<p> </p>
+<p><b>{password}</b></p>
+<p> </p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_profile_change_status_active"><![CDATA[{email_header}
+<p>Данные вашего аккаунта на сайте {site_name}:</p>
+<p> </p>
+<p>Имя: {account_name}</p>
+<p>Email: {account_email}</p>
+<p>URL: <a href="{site_url}">{site_url}</a></p>
+<p> </p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_profile_change_status_pending"><![CDATA[{email_header}
+<p>Привет {profile_name},</p>
+<p>Ваш профиль ожидает одобрения. Мы сообщим Вам о результатах в ближайшее время.</p>
+<p> </p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_profile_change_status_suspended"><![CDATA[{email_header}
+<p>Ваш профиль заблокирован.</p>
+<p> </p>
+{email_footer}]]></string>
+  <string name="_sys_et_txt_body_account_change_status_activate">
+    <![CDATA[{email_header}
+<p>Ваш аккаунт и все связанные с ним профили активированы.</p>
+<p></p>
+{email_footer}]]>
+  </string>
+  <string name="_sys_et_txt_body_account_change_status_suspended">
+    <![CDATA[{email_header}
+<p>Ваш аккаунт и все связанные с ним профили заблокированы.</p>
+<p> </p>
+{email_footer}]]>
+  </string>
+	<string name="_sys_et_txt_body_account"><![CDATA[{email_header}
+<p>{account_output}</p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_pruning"><![CDATA[{email_header}
+<p>{pruning_output}</p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_upgrade_failed"><![CDATA[{email_header}
+<p>Обновление не удалось в связи со следующей ошибкой:</p>
+<p> </p>
+<p>{error_msg}</p>
+<p> </p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_upgrade_modules_failed"><![CDATA[{email_header}
+<p>В процессе обновления модулей произошли следующие ошибки:</p>
+<p> </p>
+<p>{conclusion}</p>
+<p> </p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_upgrade_success"><![CDATA[{email_header}
+<p>Сайт был удачно обновлён до {new_version}.</p>
+<p>Нужно зайти в <b>Студию &gt; Магазин Приложений &gt; Обновления</b>, чтобы проверить обновления для модулей.</p>
+<p> </p>
+{conclusion}
+<p> </p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_upgrade_modules_success"><![CDATA[{email_header}
+<p>Следующие модули были удачно обновлены.</p>
+<p> </p>
+{conclusion}
+<p> </p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_bg_operation_failed"><![CDATA[{email_header}
+<p>Фоновый процесс завершился ошибкой со следующим сообщением.</p>
+<p> </p>
+{conclusion}
+<p> </p>
+{email_footer}]]></string>
+	<string name="_sys_et_txt_body_modules_upgrade_success"><![CDATA[<b>{0}</b> модуль: up to {1} версия.<br />]]></string>
+	<string name="_sys_et_txt_body_modules_upgrade_failed"><![CDATA[<b>{0}</b> молуль: {1}<br />]]></string>
+	<string name="_sys_et_txt_name_system_admin_email"><![CDATA[Посылка сообщения из Студии]]></string>
+	<string name="_sys_et_txt_name_system_comment_replied"><![CDATA[Сообщение для посылки пользователям, чьи комментарии были отвечены]]></string>
+	<string name="_sys_et_txt_name_system_reported"><![CDATA[Уведомление о новой жалобе]]></string>
+	<string name="_sys_et_txt_name_system_confirmation"><![CDATA[Сообщение для подтверждения эл. адреса профиля]]></string>
+	<string name="_sys_et_txt_name_system_delayed_module_uninstall"><![CDATA[Уведомление об отложенном демонтировании модуля]]></string>
+	<string name="_sys_et_txt_name_system_forgot"><![CDATA[Сообщение о сбросе пароля]]></string>
+	<string name="_sys_et_txt_name_system_mem_changed"><![CDATA[Сообщение для посылки пользователям, чей уровень членства был изменён]]></string>
+	<string name="_sys_et_txt_name_system_mem_expiration"><![CDATA[Сообщение об истечении срока членства]]></string>
+	<string name="_sys_et_txt_name_system_password_reset"><![CDATA[Сообщение о новом пароле]]></string>
+	<string name="_sys_et_txt_name_profile_change_status_active"><![CDATA[Статус профиля изменён на Активный]]></string>
+	<string name="_sys_et_txt_name_profile_change_status_pending"><![CDATA[Статус профиля изменён на Ожидающий]]></string>
+	<string name="_sys_et_txt_name_profile_change_status_suspended"><![CDATA[Статус профиля изменён на Заблокированный]]></string>
+  <string name="_sys_et_txt_name_account_change_status_activate"><![CDATA[Статус аккаунта изменён на Активный]]></string>
+  <string name="_sys_et_txt_name_account_change_status_suspended"><![CDATA[Статус аккаунта изменён на Заблокированный]]></string>
+	<string name="_sys_et_txt_name_system_account"><![CDATA[Новые аккаунты]]></string>
+	<string name="_sys_et_txt_name_system_pruning"><![CDATA[Результат очистки]]></string>
+	<string name="_sys_et_txt_name_upgrade_failed"><![CDATA[Обновление не удалось]]></string>
+	<string name="_sys_et_txt_name_upgrade_modules_failed"><![CDATA[Обновление модулей не удалось]]></string>
+	<string name="_sys_et_txt_name_upgrade_success"><![CDATA[Обновление сайта прошло удачно]]></string>
+	<string name="_sys_et_txt_name_upgrade_modules_success"><![CDATA[Обновление модулей прошло удачно]]></string>
+	<string name="_sys_et_txt_name_bg_operation_failed"><![CDATA[Фоновая операция не удалась]]></string>
+	<string name="_sys_et_txt_subject_admin_email"><![CDATA[Сообщение от администратора сайта <SiteName>: <MessageSubject>]]></string>
+	<string name="_sys_et_txt_subject_comment_replied"><![CDATA[{sender_display_name} ответил на Ваш комментарий]]></string>
+	<string name="_sys_et_txt_subject_system_reported"><![CDATA[Уведомление о новой жалобе]]></string>
+	<string name="_sys_et_txt_subject_confirmation"><![CDATA[Пожалуйста, подтвердите свой email. (ОБЯЗАТЕЛЬНО)]]></string>
+	<string name="_sys_et_txt_subject_delayed_module_uninstall"><![CDATA[Отложенный демонтаж модуля {Module}: {Result}]]></string>
+	<string name="_sys_et_txt_subject_forgot"><![CDATA[Сбросьте свой пароль]]></string>
+	<string name="_sys_et_txt_subject_mem_changed"><![CDATA[Уровень Вашего членства был изменён]]></string>
+	<string name="_sys_et_txt_subject_mem_expiration"><![CDATA[Срок Вашего членства истекает]]></string>
+	<string name="_sys_et_txt_subject_password_reset"><![CDATA[Новый пароль]]></string>
+	<string name="_sys_et_txt_subject_profile_change_status_active"><![CDATA[Профиль активирован]]></string>
+	<string name="_sys_et_txt_subject_profile_change_status_pending"><![CDATA[Профиль в ожидании одобрения]]></string>
+	<string name="_sys_et_txt_subject_profile_change_status_suspended"><![CDATA[Профиль заблокирован]]></string>
+  <string name="_sys_et_txt_subject_account_change_status_activate"><![CDATA[Аккаунт активирован]]></string>
+  <string name="_sys_et_txt_subject_account_change_status_suspended"><![CDATA[Аккаунт заблокирован]]></string>
+	<string name="_sys_et_txt_subject_account"><![CDATA[{site_name} - {account_count} аккаунтов, созданных вчера]]></string>
+	<string name="_sys_et_txt_subject_pruning"><![CDATA[{site_name} - результат очистки]]></string>
+	<string name="_sys_et_txt_subject_upgrade_failed"><![CDATA[{site_name} - обновление не удалось]]></string>
+	<string name="_sys_et_txt_subject_upgrade_modules_failed"><![CDATA[Не удалось обновить модули на сайте {site_name}]]></string>
+	<string name="_sys_et_txt_subject_upgrade_success"><![CDATA[{site_name} - обновление успешно]]></string>
+	<string name="_sys_et_txt_subject_upgrade_modules_success"><![CDATA[Успешное обновление модулей на сайте {site_name}]]></string>
+	<string name="_sys_et_txt_subject_bg_operation_failed"><![CDATA[Фоновая операция не удалась]]></string>
+    <string name="_sys_et_txt_unsubscribe"><![CDATA[Отписаться]]></string>
+	<string name="_sys_file_handlers_ms_viewer"><![CDATA[Microsoft Office просмотрщик]]></string>
+	<string name="_sys_file_handlers_google_viewer"><![CDATA[Google просмотрщик]]></string>
+	<string name="_sys_file_handlers_images_viewer"><![CDATA[Просмотр изображений]]></string>
+	<string name="_sys_file_handlers_code_viewer"><![CDATA[Просмотр програмного кода]]></string>
+	<string name="_sys_form_account"><![CDATA[Аккаунт]]></string>
+	<string name="_sys_form_account_input_agreement"><![CDATA[]]></string>
+	<string name="_sys_form_account_input_agreement_value"><![CDATA[<div class="bx-def-font-small bx-def-font-grayed">Присоединяясь, Вы соглашаетесь с <a href="{0}">Правилами пользования</a> и <a href="{1}">Политикой конфиденциальности</a>.</div>]]></string>
+	<string name="_sys_form_account_input_captcha"><![CDATA[Капча]]></string>
+	<string name="_sys_form_account_input_captcha_error"><![CDATA[Проверка CAPTCHA не удалась. Попытайтесь ещё раз.]]></string>
+	<string name="_sys_form_account_input_captcha_label_text_image"><![CDATA[Введите текст:]]></string>
+	<string name="_sys_form_account_input_captcha_label_text_audio"><![CDATA[Введите услышанный текст:]]></string>
+	<string name="_sys_form_account_input_captcha_action_refresh"><![CDATA[обновить]]></string>
+	<string name="_sys_form_account_input_captcha_action_title_refresh"><![CDATA[Получить другую CAPTCHA]]></string>
+	<string name="_sys_form_account_input_captcha_action_audio"><![CDATA[аудио]]></string>
+	<string name="_sys_form_account_input_captcha_action_title_audio"><![CDATA[Прослушать CAPTCHA]]></string>
+	<string name="_sys_form_account_input_captcha_action_image"><![CDATA[изображение]]></string>
+	<string name="_sys_form_account_input_captcha_action_title_image"><![CDATA[Получить CAPTCHA в виде изображения]]></string>
+	<string name="_sys_form_account_input_captcha_action_help"><![CDATA[помощь]]></string>
+	<string name="_sys_form_account_input_captcha_action_title_help"><![CDATA[Получить помощь]]></string>
+	<string name="_sys_form_account_input_delete_confirm"><![CDATA[Я уверен, что хочу удалить аккаунт вместе с содержимым.]]></string>
+	<string name="_sys_form_account_input_delete_confirm_error"><![CDATA[Пожалуйста, отметьте этот флажок, если Вы действительно хотите удалить свой аккаунт вместе с содержимым.]]></string>
+	<string name="_sys_form_account_input_delete_confirm_info"><![CDATA[Это действие не может быть отменено.]]></string>
+	<string name="_sys_form_account_input_email"><![CDATA[Email]]></string>
+	<string name="_sys_form_account_input_email_error"><![CDATA[Введите правильный адрес электронной почты]]></string>
+	<string name="_sys_form_account_input_email_uniq_error"><![CDATA[Этот эл. адрес уже зарегистрирован. Пожалуйста, воспользуйтесь ссылкой <a href="{0}">Забыли пароль?</a>, чтобы восстановить доступ к своему аккаунту.]]></string>
+	<string name="_sys_form_account_input_email_uniq_error_loggedin"><![CDATA[Этот эл. адрес уже кем-то используется.]]></string>
+	<string name="_sys_form_account_input_name"><![CDATA[Имя пользователя]]></string>
+	<string name="_sys_form_account_input_name_error"><![CDATA[Это обязательное поле.]]></string>
+	<string name="_sys_form_account_input_password"><![CDATA[Создать пароль]]></string>
+	<string name="_sys_form_account_input_password_confirm"><![CDATA[Подтвердить пароль]]></string>
+	<string name="_sys_form_account_input_password_confirm_error"><![CDATA[Не удалось подтвердить пароль]]></string>
+	<string name="_sys_form_account_input_password_current"><![CDATA[Текущий пароль]]></string>
+	<string name="_sys_form_account_input_password_current_error"><![CDATA[Неправильный текущий пароль. Введите пароль, который Вы используете для доступа к этому сайту.]]></string>
+	<string name="_sys_form_account_input_password_error"><![CDATA[Пароль должен иметь как минимум 8 символов, содержать 1 заглавную латинскую букву, 1 строчную букву и 1 число.]]></string>
+	<string name="_sys_form_account_input_phone_error"><![CDATA[Это обязательное поле.]]></string>
+	<string name="_sys_form_account_input_receive_news"><![CDATA[Получать новости]]></string>
+	<string name="_sys_form_account_input_receive_updates"><![CDATA[Получать обновления сайта]]></string>
+	<string name="_sys_form_account_input_submit"><![CDATA[Отправить]]></string>
+	<string name="_sys_form_checkbox_value_off"><![CDATA[Нет]]></string>
+	<string name="_sys_form_checkbox_value_on"><![CDATA[Да]]></string>
+	<string name="_sys_form_comment"><![CDATA[Комментарий]]></string>
+	<string name="_sys_form_comment_input_caption_cmt_author_id"><![CDATA[Автор]]></string>
+	<string name="_sys_form_comment_input_caption_cmt_text"><![CDATA[Текст]]></string>
+	<string name="_sys_form_comment_input_caption_system_action"><![CDATA[Действие]]></string>
+        <string name="_sys_form_comment_input_caption_system_cmt_author_id"><![CDATA[Автор]]></string>
+	<string name="_sys_form_comment_input_caption_system_cmt_id"><![CDATA[Комментировать ID]]></string>
+	<string name="_sys_form_comment_input_caption_system_cmt_image"><![CDATA[Изображение]]></string>
+	<string name="_sys_form_comment_input_caption_system_cmt_parent_id"><![CDATA[Родительский ID]]></string>
+	<string name="_sys_form_comment_input_caption_system_cmt_submit"><![CDATA[Отправить]]></string>
+	<string name="_sys_form_comment_input_caption_system_cmt_text"><![CDATA[Текст]]></string>
+	<string name="_sys_form_comment_input_caption_system_id"><![CDATA[ID объекта]]></string>
+	<string name="_sys_form_comment_input_caption_system_sys"><![CDATA[Тип объекта]]></string>
+	<string name="_sys_form_comment_input_submit"><![CDATA[Отправить]]></string>
+	<string name="_sys_form_confirm_email"><![CDATA[Подтверждение email-а]]></string>
+	<string name="_sys_form_confirm_email_input_caption_system_code"><![CDATA[Код верификации]]></string>
+	<string name="_sys_form_confirm_email_input_caption_system_do_submit"><![CDATA[Выполнить]]></string>
+	<string name="_sys_form_confirm_email_input_code"><![CDATA[Код верификации]]></string>
+	<string name="_sys_form_confirm_email_input_code_error"><![CDATA[Код верификации неправилен или просрочен. Зайдите в свой аккаунт и запросите письмо верификации.]]></string>
+	<string name="_sys_form_confirm_email_input_submit"><![CDATA[Выполнить]]></string>
+	<string name="_sys_form_confirm_phone"><![CDATA[Подтверждение телефона]]></string>
+	<string name="_sys_form_confirm_phone_input_caption_system_phone"><![CDATA[Телефон]]></string>
+	<string name="_sys_form_confirm_phone_input_phone"><![CDATA[Телефон]]></string>
+        <string name="_sys_form_confirm_phone_input_phone_info"><![CDATA[Введите телефон с кодом страны]]></string>
+	<string name="_sys_form_confirm_phone_input_phone_error_format"><![CDATA[Телефон должен содержать только цифры и начинаться с '+']]></string>
+	<string name="_sys_form_confirm_phone_input_phone_error_not_unique"><![CDATA[Этот телефон уже кем-то используется]]></string>
+	<string name="_sys_form_confirm_phone_input_caption_system_code"><![CDATA[Код]]></string>
+	<string name="_sys_form_confirm_phone_confirmation_input_code"><![CDATA[Код]]></string>
+	<string name="_sys_form_confirm_phone_input_submit"><![CDATA[Выполнить]]></string>
+	<string name="_sys_form_confirm_phone_input_caption_system_do_submit"><![CDATA[Выполнить]]></string>
+	<string name="_sys_form_confirm_phone_input_sendsms"><![CDATA[Отправить SMS]]></string>
+	<string name="_sys_form_confirm_phone_input_caption_system_do_sendsms"><![CDATA[Отправить SMS]]></string>
+	<string name="_sys_form_confirm_phone_input_code_error_empty"><![CDATA[Обязательное поле.]]></string>
+	<string name="_sys_form_confirm_phone_input_code_error_invalid"><![CDATA[Неправильный код проверки. Пожалуйста, повторите код или  <a href="{0}">измените телефонный номер и начните сначала</a>.]]></string>
+	<string name="_sys_form_display_account_create"><![CDATA[Создать аккаунт]]></string>
+	<string name="_sys_form_display_account_settings_delete"><![CDATA[Удалить аккаунт]]></string>
+	<string name="_sys_form_display_account_settings_email"><![CDATA[Настройки email-а]]></string>
+	<string name="_sys_form_display_account_settings_info"><![CDATA[Редактировать аккаунт]]></string>
+	<string name="_sys_form_display_account_settings_password"><![CDATA[Изменить пароль]]></string>
+	<string name="_sys_form_display_comment_edit"><![CDATA[Редактировать форму комментария]]></string>
+	<string name="_sys_form_display_comment_post"><![CDATA[Разместить форму комментария]]></string>
+	<string name="_sys_form_display_confirm_email"><![CDATA[Подтверждение email-а]]></string>
+	<string name="_sys_form_display_confirm_phone_set_phone"><![CDATA[Сохраниение телефона]]></string>
+	<string name="_sys_form_display_confirm_phone_confirmation"><![CDATA[Подтверждение телефона]]></string>
+	<string name="_sys_form_display_forgot_password"><![CDATA[Забыли пароль?]]></string>
+	<string name="_sys_form_display_login"><![CDATA[Войти]]></string>
+	<string name="_sys_form_display_login_step2"><![CDATA[Войти - шаг 2]]></string>
+	<string name="_sys_form_display_login_step3"><![CDATA[Войти - шаг 3]]></string>
+	<string name="_sys_form_display_report_post"><![CDATA[Форма добавления жалобы]]></string>
+	<string name="_sys_form_display_unsubscribe_news"><![CDATA[Отписаться от новостей]]></string>
+	<string name="_sys_form_display_unsubscribe_updates"><![CDATA[Отписаться от обновлений]]></string>
+	<string name="_sys_form_forgot_password"><![CDATA[Забыли пароль?]]></string>
+	<string name="_sys_form_forgot_password_email_not_recognized"><![CDATA[Этот эл. адрес не принадлежит ни одному аккаунту. Удостоверьтесь, что он введён правильно.]]></string>
+	<string name="_sys_form_forgot_password_phone_not_recognized"><![CDATA[Этот телефон не принадлежит ни одному аккаунту. Удостоверьтесь, что он введён правильно.]]></string>
+	<string name="_sys_form_forgot_password_phone_error_format"><![CDATA[Телефон должен содержать только цифры и начинаться с '+']]></string>
+	<string name="_sys_form_forgot_password_phone_and_email_empty_error"><![CDATA[Нужно ввести либо телефон, либо email]]></string>
+	<string name="_sys_form_forgot_password_input_caption_system_do_submit"><![CDATA[Выполнить]]></string>
+	<string name="_sys_form_forgot_password_input_caption_system_email"><![CDATA[Email]]></string>
+	<string name="_sys_form_forgot_password_input_email"><![CDATA[Email]]></string>
+	<string name="_sys_form_forgot_password_input_caption_system_phone"><![CDATA[Телефон]]></string>
+	<string name="_sys_form_forgot_password_input_phone"><![CDATA[Телефон]]></string>
+	<string name="_sys_form_forgot_password_input_submit"><![CDATA[Выполнить]]></string>
+	<string name="_sys_form_input_age"><![CDATA[Возраст]]></string>
+	<string name="_sys_form_input_sys_location"><![CDATA[Расположение]]></string>
+  <string name="_sys_form_input_location"><![CDATA[Расположение по радиусу]]></string>
+  <string name="_sys_form_input_location_radius_label"><![CDATA[Радиус (в км)]]></string>
+  <string name="_sys_form_input_sys_labels"><![CDATA[Метки]]></string>
+    <string name="_sys_form_input_labels"><![CDATA[Метки]]></string>
+	<string name="_sys_form_input_sys_anonymous"><![CDATA[Анонимная публикация]]></string>
+	<string name="_sys_form_input_anonymous"><![CDATA[Анонимная публикация]]></string>
+	<string name="_sys_form_login"><![CDATA[Вход]]></string>
+	<string name="_sys_form_login_input_caption_system_agreement"><![CDATA[Соглашение]]></string>
+	<string name="_sys_form_login_input_caption_system_captcha"><![CDATA[Капча]]></string>
+	<string name="_sys_form_login_input_caption_system_checkcode"><![CDATA[Выполнить]]></string>
+	<string name="_sys_form_login_input_caption_system_code"><![CDATA[Код из SMS]]></string>
+	<string name="_sys_form_login_input_caption_system_back"><![CDATA[<a href="javascript:history.back()">Отправить новый код</a>]]></string>
+	<string name="_sys_form_login_input_caption_system_delete_confirm"><![CDATA[Подтвердить удаление]]></string>
+	<string name="_sys_form_login_input_caption_system_delete_content"><![CDATA[Удалить с контентом]]></string>
+	<string name="_sys_form_login_input_caption_system_do_submit"><![CDATA[Присоединиться]]></string>
+	<string name="_sys_form_login_input_caption_system_email"><![CDATA[Email]]></string>
+	<string name="_sys_form_login_input_caption_system_id"><![CDATA[ID]]></string>
+	<string name="_sys_form_login_input_caption_system_name"><![CDATA[Имя пользователя]]></string>
+	<string name="_sys_form_login_input_caption_system_password"><![CDATA[Пароль]]></string>
+	<string name="_sys_form_login_input_caption_system_password_confirm"><![CDATA[Подтвердить пароль]]></string>
+	<string name="_sys_form_login_input_caption_system_password_current"><![CDATA[Текущий пароль]]></string>
+	<string name="_sys_form_login_input_caption_system_phone"><![CDATA[Телефон]]></string>
+	<string name="_sys_form_login_input_caption_system_receive_news"><![CDATA[Получать новости]]></string>
+	<string name="_sys_form_login_input_caption_system_receive_updates"><![CDATA[Получать обновления]]></string>
+	<string name="_sys_form_login_input_caption_system_relocate"><![CDATA[Переместить]]></string>
+	<string name="_sys_form_login_input_caption_system_remember_me"><![CDATA[Запомнить меня]]></string>
+	<string name="_sys_form_login_input_caption_system_role"><![CDATA[Роль]]></string>
+	<string name="_sys_form_login_input_caption_system_sendsms"><![CDATA[Отправить SMS]]></string>
+	<string name="_sys_form_login_input_caption_system_submit"><![CDATA[Выполнить]]></string>
+	<string name="_sys_form_login_input_caption_system_submit_text"><![CDATA[Текст отправки]]></string>
+	<string name="_sys_form_login_input_checkcode"><![CDATA[Выполнить]]></string>
+	<string name="_sys_form_login_input_code"><![CDATA[Код из SMS]]></string>
+	<string name="_sys_form_login_input_back"><![CDATA[<a href="javascript:history.back()">Отправить новый код</a>]]></string>
+	<string name="_sys_form_login_input_email"><![CDATA[Email]]></string>
+	<string name="_sys_form_login_input_password"><![CDATA[Пароль]]></string>
+	<string name="_sys_form_login_input_phone"><![CDATA[Телефон]]></string>
+        <string name="_sys_form_login_input_phone_info"><![CDATA[Введите телефон с кодом страны]]></string>
+	<string name="_sys_form_login_input_remember_me"><![CDATA[Запомнить меня]]></string>
+	<string name="_sys_form_login_input_sendsms"><![CDATA[Отправить SMS]]></string>
+	<string name="_sys_form_login_input_submit"><![CDATA[Вход]]></string>
+	<string name="_sys_form_login_input_code_error_empty"><![CDATA[Обязательное поле.]]></string>
+	<string name="_sys_form_login_input_phone_error_format"><![CDATA[Телефон должен содержать только цифры и начинаться с '+']]></string>
+	<string name="_sys_form_login_input_phone_error_not_unique"><![CDATA[Этот телефон уже кем-то используется]]></string>
+	<string name="_sys_form_login_input_code_error_invalid"><![CDATA[Неправильный код проверки. Пожалуйста, повторите код или  <a href="{0}">измените телефонный номер и начните сначала</a>.]]></string>
+	<string name="_sys_form_paceholder_profiles_suggestions"><![CDATA[Введите имя...]]></string>
+        <string name="_sys_form_ps_group_custom"><![CDATA[Конфиденциальность: Пользовательская группа]]></string>
+        <string name="_sys_form_display_ps_gc_manage"><![CDATA[Конфиденциальность: Управлять пользовательской группой]]></string>
+        <string name="_sys_form_ps_gc_input_caption_system_profile_id"><![CDATA[ID профиля]]></string>
+        <string name="_sys_form_ps_gc_input_caption_system_content_id"><![CDATA[ID контента]]></string>
+        <string name="_sys_form_ps_gc_input_caption_system_object"><![CDATA[Объект]]></string>
+        <string name="_sys_form_ps_gc_input_caption_system_action"><![CDATA[Действие]]></string>
+        <string name="_sys_form_ps_gc_input_caption_system_group_id"><![CDATA[ID группы]]></string>
+        <string name="_sys_form_ps_gc_input_caption_system_search"><![CDATA[Поиск]]></string>
+        <string name="_sys_form_ps_gc_input_caption_search"><![CDATA[Найти]]></string>
+        <string name="_sys_form_ps_gc_input_caption_system_list"><![CDATA[Список]]></string>
+        <string name="_sys_form_ps_gc_input_caption_list"><![CDATA[или выбрать]]></string>
+        <string name="_sys_form_ps_gc_input_caption_system_do_submit"><![CDATA[Отправить]]></string>
+        <string name="_sys_form_ps_gc_input_caption_do_submit"><![CDATA[Отправить]]></string>
+        <string name="_sys_form_ps_gc_input_caption_system_do_cancel"><![CDATA[Отменить]]></string>
+        <string name="_sys_form_ps_gc_input_caption_do_cancel"><![CDATA[Отменить]]></string>
+	<string name="_sys_form_report"><![CDATA[Пожаловаться]]></string>
+	<string name="_sys_form_report_input_caption_submit"><![CDATA[Пожаловаться]]></string>
+	<string name="_sys_form_report_input_caption_text"><![CDATA[Текст жалобы]]></string>
+	<string name="_sys_form_report_input_caption_type"><![CDATA[Тип жалобы]]></string>
+	<string name="_sys_form_report_input_caption_system_action"><![CDATA[Действие]]></string>
+	<string name="_sys_form_report_input_caption_system_object_id"><![CDATA[ID объекта]]></string>
+	<string name="_sys_form_report_input_caption_system_id"><![CDATA[ID жалобы]]></string>
+	<string name="_sys_form_report_input_caption_system_submit"><![CDATA[Пожаловаться]]></string>
+	<string name="_sys_form_report_input_caption_system_text"><![CDATA[Текст жалобы]]></string>
+	<string name="_sys_form_report_input_caption_system_type"><![CDATA[Тип жалобы]]></string>
+	<string name="_sys_form_report_input_caption_system_sys"><![CDATA[Тип объекта]]></string>
+        <string name="_sys_form_review"><![CDATA[Обзор]]></string>
+        <string name="_sys_form_review_display_edit"><![CDATA[Редактировать обзор]]></string>
+	<string name="_sys_form_review_display_post"><![CDATA[Разместить обзор]]></string>
+	<string name="_sys_form_review_input_caption_cmt_author_id"><![CDATA[Автор]]></string>
+	<string name="_sys_form_review_input_caption_cmt_text"><![CDATA[Текст]]></string>
+	<string name="_sys_form_review_input_caption_system_action"><![CDATA[Действие]]></string>
+        <string name="_sys_form_review_input_caption_system_cmt_author_id"><![CDATA[Автор]]></string>
+	<string name="_sys_form_review_input_caption_system_cmt_id"><![CDATA[ID]]></string>
+	<string name="_sys_form_review_input_caption_system_cmt_image"><![CDATA[Изображение]]></string>
+	<string name="_sys_form_review_input_caption_system_cmt_parent_id"><![CDATA[Родительский ID]]></string>
+	<string name="_sys_form_review_input_caption_system_cmt_submit"><![CDATA[Отправить]]></string>
+	<string name="_sys_form_review_input_caption_system_cmt_text"><![CDATA[Текст]]></string>
+        <string name="_sys_form_review_input_caption_system_cmt_mood"><![CDATA[Оценка]]></string>
+	<string name="_sys_form_review_input_caption_system_id"><![CDATA[ID объекта]]></string>
+	<string name="_sys_form_review_input_caption_system_sys"><![CDATA[Тип объекта]]></string>
+	<string name="_sys_form_review_input_submit"><![CDATA[Отправить]]></string>
+	<string name="_sys_form_unsubscribe"><![CDATA[Отписаться]]></string>
+	<string name="_sys_form_unsubscribe_input_caption_system_code"><![CDATA[Код безопасности]]></string>
+	<string name="_sys_form_unsubscribe_input_caption_system_do_submit"><![CDATA[Выполнить]]></string>
+	<string name="_sys_form_unsubscribe_input_caption_system_id"><![CDATA[ID аккаунта]]></string>
+	<string name="_sys_form_unsubscribe_input_caption_system_receive_news"><![CDATA[Получать новости]]></string>
+	<string name="_sys_form_unsubscribe_input_caption_system_receive_updates"><![CDATA[Получать обновления сайта]]></string>
+	<string name="_sys_form_unsubscribe_input_receive_news"><![CDATA[Получать новости]]></string>
+	<string name="_sys_form_unsubscribe_input_receive_updates"><![CDATA[Получать обновления сайта]]></string>
+	<string name="_sys_form_unsubscribe_input_submit"><![CDATA[Выполнить]]></string>
+	<string name="_sys_form_err_not_unique_value"><![CDATA[Поле должно иметь уникальное значение]]></string>
+	<string name="_sys_form_txt_select_file"><![CDATA[Выбрать файл]]></string>
+    <string name="_sys_form_wiki"><![CDATA[Вики]]></string>
+    <string name="_sys_form_display_wiki_edit"><![CDATA[Вики: редактирование]]></string>
+    <string name="_sys_form_display_wiki_translate"><![CDATA[Вики: перевод]]></string>
+	<string name="_sys_form_wiki_input_caption_block_id"><![CDATA[Идентификатор блока]]></string>
+	<string name="_sys_form_wiki_input_caption_lang"><![CDATA[Язык]]></string>
+    <string name="_sys_form_wiki_input_caption_lang_info"><![CDATA[★ - основной(оригинальный) язык, красным помечен отсутствующий или устаревший перевод]]></string>
+    <string name="_sys_form_wiki_input_caption_lang_err"><![CDATA[Пожалуйста выберите значение]]></string>
+	<string name="_sys_form_wiki_input_caption_content"><![CDATA[Содержимое]]></string>
+    <string name="_sys_form_wiki_input_caption_content_info"><![CDATA[Можно использовать маркдаун cинтаксис и макросы.]]></string>
+    <string name="_sys_form_wiki_input_caption_content_main"><![CDATA[Основное(оригинальное) содержимое]]></string>
+	<string name="_sys_form_wiki_input_caption_notes"><![CDATA[Заметки]]></string>
+	<string name="_sys_form_wiki_input_caption_submit"><![CDATA[Сохранить]]></string>
+	<string name="_sys_format_size_b"><![CDATA[{0} байт]]></string>
+	<string name="_sys_format_size_gb"><![CDATA[{0} ГБ]]></string>
+	<string name="_sys_format_size_kb"><![CDATA[{0} КБ]]></string>
+	<string name="_sys_format_size_mb"><![CDATA[{0} МБ]]></string>
+	<string name="_sys_format_size_tb"><![CDATA[{0} ТБ]]></string>
+	<string name="_sys_grid_confirmation"><![CDATA[Вы уверены?]]></string>
+	<string name="_sys_grid_delete_failed"><![CDATA[Удалить ошибочные]]></string>
+	<string name="_sys_grid_search"><![CDATA[Поиск...]]></string>
+  <string name="_sys_grid_txt_account_manager"><![CDATA[Перенаправить в Управление аккаунтом.]]></string>
+	<string name="_sys_inst_conf_desc"><![CDATA[{0}{1}<br />Пример: {2}]]></string>
+	<string name="_sys_inst_conf_desc_admin_email"><![CDATA[Администратор - email.]]></string>
+	<string name="_sys_inst_conf_desc_admin_pwd"><![CDATA[Администратор - пароль.]]></string>
+	<string name="_sys_inst_conf_desc_admin_username"><![CDATA[Администратор - имя.]]></string>
+	<string name="_sys_inst_conf_desc_db_host"><![CDATA[MySQL БД - имя хоста.]]></string>
+	<string name="_sys_inst_conf_desc_db_name"><![CDATA[MySQL БД - название.]]></string>
+	<string name="_sys_inst_conf_desc_db_port"><![CDATA[Оставьте пустым или укажите другой адрес порта.]]></string>
+	<string name="_sys_inst_conf_desc_db_pwd"><![CDATA[MySQL БД - пароль.]]></string>
+	<string name="_sys_inst_conf_desc_db_sock"><![CDATA[Оставьте пустым или укажите другой путь к сокету.]]></string>
+	<string name="_sys_inst_conf_desc_db_user"><![CDATA[MySQL БД - имя пользователя с правами чтения/записи.]]></string>
+	<string name="_sys_inst_conf_desc_language"><![CDATA[Язык для установки по умолчанию.]]></string>
+	<string name="_sys_inst_conf_desc_profiles"><![CDATA[Модуль профилей для установки по умолчанию.]]></string>
+	<string name="_sys_inst_conf_desc_oauth_key_secret"><![CDATA[<a target="_blank" href="http://www.una.io/page/kands-manage">Получить UNA Key & Secret</a>]]></string>
+	<string name="_sys_inst_conf_desc_path_to_binary"><![CDATA[Если '{0}' программа не существует, нужно установить <a target="_blank" href="http://www.imagemagick.org/">ImageMagick</a>.]]></string>
+	<string name="_sys_inst_conf_desc_root_dir"><![CDATA[Путь к директории, где содержатся файлы UNA.]]></string>
+	<string name="_sys_inst_conf_desc_site_email"><![CDATA[Email, с которого будут отправляться сообщения от сайта.]]></string>
+	<string name="_sys_inst_conf_desc_site_title"><![CDATA[Название Вашего сайта.]]></string>
+	<string name="_sys_inst_conf_desc_site_url"><![CDATA[URL Вашего сайта (косая черта в конце необходима).]]></string>
+	<string name="_sys_inst_conf_desc_template"><![CDATA[Тема для установки по умолчанию.]]></string>
+	<string name="_sys_inst_conf_error"><![CDATA[Тут нужно ввести верные данные]]></string>
+	<string name="_sys_inst_conf_field_admin_email"><![CDATA[Email админа]]></string>
+	<string name="_sys_inst_conf_field_admin_pwd"><![CDATA[Пароль админа]]></string>
+	<string name="_sys_inst_conf_field_admin_username"><![CDATA[Администратор - имя]]></string>
+	<string name="_sys_inst_conf_field_db_host"><![CDATA[База Данных - имя хоста]]></string>
+	<string name="_sys_inst_conf_field_db_name"><![CDATA[База Данных - название]]></string>
+	<string name="_sys_inst_conf_field_db_port"><![CDATA[База Данных - номер порта]]></string>
+	<string name="_sys_inst_conf_field_db_pwd"><![CDATA[База Данных - пароль]]></string>
+	<string name="_sys_inst_conf_field_db_sock"><![CDATA[База Данных - путь к сокету]]></string>
+	<string name="_sys_inst_conf_field_db_user"><![CDATA[База Данных - имя пользователя]]></string>
+	<string name="_sys_inst_conf_field_language"><![CDATA[Язык]]></string>
+	<string name="_sys_inst_conf_field_profiles"><![CDATA[Профили]]></string>
+	<string name="_sys_inst_conf_field_oauth_key"><![CDATA[UNA key]]></string>
+	<string name="_sys_inst_conf_field_oauth_secret"><![CDATA[UNA secret]]></string>
+	<string name="_sys_inst_conf_field_path_to_binary"><![CDATA[Путь к '{0}' программе]]></string>
+	<string name="_sys_inst_conf_field_root_dir"><![CDATA[Директория сайта]]></string>
+	<string name="_sys_inst_conf_field_site_email"><![CDATA[Email сайта]]></string>
+	<string name="_sys_inst_conf_field_site_title"><![CDATA[Заголовок сайта]]></string>
+	<string name="_sys_inst_conf_field_site_url"><![CDATA[URL сайта]]></string>
+	<string name="_sys_inst_conf_field_template"><![CDATA[Тема]]></string>
+	<string name="_sys_inst_conf_found"><![CDATA[<span style="color:green">Найдено</span>]]></string>
+	<string name="_sys_inst_conf_no_example"><![CDATA[нет примера]]></string>
+	<string name="_sys_inst_conf_not_found"><![CDATA[<span style="color:red">Не найдено</span>]]></string>
+	<string name="_sys_inst_conf_section_db_config"><![CDATA[БД - конфигурация]]></string>
+	<string name="_sys_inst_conf_section_link_with_market"><![CDATA[Связать с UNA Market]]></string>
+	<string name="_sys_inst_conf_section_modules"><![CDATA[Модули]]></string>
+	<string name="_sys_inst_conf_section_paths"><![CDATA[пути сайта]]></string>
+	<string name="_sys_inst_conf_section_site_info"><![CDATA[Инфо сайта]]></string>
+	<string name="_sys_inst_continue"><![CDATA[Продолжить]]></string>
+	<string name="_sys_inst_finish"><![CDATA[Установка удачно завершена]]></string>
+	<string name="_sys_inst_help_finish"><![CDATA[Помощь по планировщику заданий]]></string>
+	<string name="_sys_inst_help_permissions"><![CDATA[Помощь по установке разрешений]]></string>
+	<string name="_sys_inst_help_site_config"><![CDATA[Помощь по созданию базы данных]]></string>
+	<string name="_sys_inst_hosting_fails"><![CDATA[Ваш хостинг не соответствует минимальным требованиям:]]></string>
+	<string name="_sys_inst_hosting_warnings"><![CDATA[Есть некоторые замечания к настройкам сервера, можно перейти к <a href="?action=audit">аудиту сервера</a> для более подробной информации.]]></string>
+	<string name="_sys_inst_msg_admin_account_not_found"><![CDATA[Аккаунт админа не был найден по эл. адресу - {0}]]></string>
+	<string name="_sys_inst_msg_db_err_connect"><![CDATA[Ошибка соединения с базой]]></string>
+	<string name="_sys_inst_msg_db_err_select"><![CDATA[Ошибка выбора базы]]></string>
+	<string name="_sys_inst_msg_file_read_failed"><![CDATA[Ошибка чтения файла: {0}]]></string>
+	<string name="_sys_inst_msg_file_write_failed"><![CDATA[Ошибка записи файла: {0}]]></string>
+	<string name="_sys_inst_msg_finish"><![CDATA[Но необходимы дополнительные ручные шаги:]]></string>
+	<string name="_sys_inst_msg_finish_cron_jobs"><![CDATA[Установите следующую команду для планировщика:]]></string>
+	<string name="_sys_inst_msg_finish_delete_install_folder"><![CDATA[Удалите папку <b>/install/</b> из корневой папки скрипта.]]></string>
+	<string name="_sys_inst_msg_finish_goto_studio"><![CDATA[<a href="{0}studio/">Перейти в Студию</a>, чтобы добавить дополнительные модули и модифицировать сайт.]]></string>
+	<string name="_sys_inst_msg_form_error"><![CDATA[Пожалуйста, исправьте ошибки формы.]]></string>
+	<string name="_sys_inst_msg_module_error"><![CDATA[{0} - {1}]]></string>
+	<string name="_sys_inst_msg_permissions_wrong"><![CDATA[Неправильные разрешения для некоторых файлов и папок, установите правильные и нажмите "Продолжить".]]></string>
+	<string name="_sys_inst_msg_remove_install"><![CDATA[Пожалуйста, удалите директорию INSTALL с сервера и перегрузите страницу, чтобы активировать сайт.<br />После удаления, Вы можете перейти по ссылке <a href="../studio/">в Студию</a>, чтобы добавить дополнительные модули и модифицировать сайт.]]></string>
+	<string name="_sys_inst_msg_script_isnt_installed"><![CDATA[Скрипт не установлен]]></string>
+	<string name="_sys_inst_refresh"><![CDATA[Обновить]]></string>
+	<string name="_sys_inst_server_audit"><![CDATA[Аудит сервера]]></string>
+	<string name="_sys_inst_site_config"><![CDATA[Конфигурация сайта]]></string>
+	<string name="_sys_inst_start_installation"><![CDATA[Начать установку]]></string>
+	<string name="_sys_inst_title"><![CDATA[Установка UNA {0}]]></string>
+	<string name="_sys_layout_1_column"><![CDATA[1 столбец]]></string>
+	<string name="_sys_layout_2_columns"><![CDATA[2 столбца]]></string>
+	<string name="_sys_layout_3_columns"><![CDATA[3 столбца]]></string>
+	<string name="_sys_layout_bar_left"><![CDATA[С левой линейкой]]></string>
+	<string name="_sys_layout_bar_content_bar"><![CDATA[С левой и правой линейками]]></string>
+	<string name="_sys_layout_bar_right"><![CDATA[С правой линейкой]]></string>
+	<string name="_sys_layout_bottom_area_2_columns"><![CDATA[Нижнее пространство с 2 столбцами сверху]]></string>
+	<string name="_sys_layout_top_area_2_columns"><![CDATA[Верхнее пространство с 2 столбцами]]></string>
+	<string name="_sys_layout_top_area_3_columns"><![CDATA[Верхнее пространство с 3 столбцами]]></string>
+	<string name="_sys_layout_top_area_bar_left"><![CDATA[Верхнее пространство с левой линейкой]]></string>
+	<string name="_sys_layout_top_area_bar_content_bar"><![CDATA[Верхнее пространство с левой и правой линейками]]></string>
+	<string name="_sys_layout_top_area_bar_right"><![CDATA[Верхнее пространство с правой линейкой]]></string>
+	<string name="_sys_layout_topbottom_area_2_columns"><![CDATA[Верхнее и нижнее пространства с 2 столбцами посередине]]></string>
+	<string name="_sys_layout_topbottom_area_bar_left"><![CDATA[Верхнее и нижнее пространства с левой линейкой посередине]]></string>
+	<string name="_sys_layout_topbottom_area_bar_right"><![CDATA[Верхнее и нижнее пространства с правой линейкой посередине]]></string>
+	<string name="_sys_loading"><![CDATA[Загрузка...]]></string>
+	<string name="_sys_location_country"><![CDATA[<i class="sys-icon location-arrow"></i> {0}]]></string>
+	<string name="_sys_location_country_city"><![CDATA[<i class="sys-icon location-arrow"></i> {2}, {1}, {0}]]></string>
+    <string name="_sys_location_country_city_street"><![CDATA[<i class="sys-icon location-arrow"></i> {4} {3}, {2}, {1}, {0} ]]></string>
+	<string name="_sys_location_determining"><![CDATA[Определение местоположения...]]></string>
+	<string name="_sys_location_geolocation_not_supported_by_browser"><![CDATA[Геолокация не поддерживается этим браузером]]></string>
+	<string name="_sys_location_undefined"><![CDATA[Отключить местоположение]]></string>
+    <string name="_sys_macros_malformed"><![CDATA[Ошибка: некорректный макрос]]></string>
+    <string name="_sys_macros_unsafe"><![CDATA[Ошибка: небезопасный макрос]]></string>
+    <string name="_sys_macros_output_not_displayable"><![CDATA[Ошибка: некорректный вывод макроса]]></string>
+    <string name="_sys_macros_method_or_class_not_found"><![CDATA[Ошибка: нет такого макроса]]></string>
+    <string name="_sys_macros_required_args_missing"><![CDATA[Ошибка: остутствуют обязательные аргументы]]></string>
+    <string name="_sys_macros_too_many_args"><![CDATA[Ошибка: слишком много аргументов]]></string>
+	<string name="_sys_menu_item_title_about"><![CDATA[О нас]]></string>
+        <string name="_sys_menu_item_title_copyright"><![CDATA[Копирайт]]></string>
+	<string name="_sys_menu_item_title_privacy"><![CDATA[Конфиденциальность]]></string>
+	<string name="_sys_menu_item_title_search"><![CDATA[Поиск]]></string>
+	<string name="_sys_menu_item_title_switch_language"><![CDATA[Язык]]></string>
+	<string name="_sys_menu_item_title_switch_language_mask"><![CDATA[{1} {0}]]></string>
+	<string name="_sys_menu_item_title_switch_template"><![CDATA[Дизайн]]></string>
+	<string name="_sys_menu_item_title_switch_template_mask"><![CDATA[{0}]]></string>
+	<string name="_sys_menu_item_title_terms"><![CDATA[Правила]]></string>
+	<string name="_sys_menu_item_title_account_menu"><![CDATA[{member_display_name}]]></string>
+	<string name="_sys_menu_item_title_account_profile_context"><![CDATA[Профили]]></string>
+	<string name="_sys_menu_item_title_account_dashboard"><![CDATA[Панель]]></string>
+	<string name="_sys_menu_item_title_account_dashboard_administration"><![CDATA[Администрация]]></string>
+	<string name="_sys_menu_item_title_account_settings"><![CDATA[Настройки]]></string>
+	<string name="_sys_menu_item_title_account_settings_delete"><![CDATA[Удалить]]></string>
+	<string name="_sys_menu_item_title_account_settings_email"><![CDATA[Email]]></string>
+	<string name="_sys_menu_item_title_account_settings_info"><![CDATA[Аккаунт]]></string>
+	<string name="_sys_menu_item_title_account_settings_pwd"><![CDATA[Пароль]]></string>
+	<string name="_sys_menu_item_title_add_content"><![CDATA[Добавить...]]></string>
+	<string name="_sys_menu_item_title_cart"><![CDATA[Корзина]]></string>
+	<string name="_sys_menu_item_title_cmts_administration"><![CDATA[Комментарии]]></string>
+  <string name="_sys_menu_item_title_audit_administration"><![CDATA[Аудит]]></string>
+	<string name="_sys_menu_item_title_cmts_item_delete"><![CDATA[Удалить]]></string>
+	<string name="_sys_menu_item_title_cmts_item_edit"><![CDATA[Редактировать]]></string>
+        <string name="_sys_menu_item_title_cmts_item_quote"><![CDATA[]]></string>
+        <string name="_sys_menu_item_title_cmts_item_reaction"><![CDATA[]]></string>
+	<string name="_sys_menu_item_title_cmts_item_reply"><![CDATA[]]></string>
+	<string name="_sys_menu_item_title_cmts_item_score"><![CDATA[]]></string>
+	<string name="_sys_menu_item_title_cmts_item_vote"><![CDATA[]]></string>
+	<string name="_sys_menu_item_title_cmts_item_more"><![CDATA[]]></string>
+	<string name="_sys_menu_item_title_dashboard"><![CDATA[Панель]]></string>
+	<string name="_sys_menu_item_title_home"><![CDATA[Домой]]></string>
+	<string name="_sys_menu_item_title_logout"><![CDATA[Выйти]]></string>
+	<string name="_sys_menu_item_title_more"><![CDATA[Ещё]]></string>
+	<string name="_sys_menu_item_title_orders"><![CDATA[Заказы]]></string>
+	<string name="_sys_menu_item_title_profile"><![CDATA[Профиль]]></string>
+	<string name="_sys_menu_item_title_set_acl_level"><![CDATA[Назначить членство]]></string>
+  <string name="_sys_menu_item_title_set_badges"><![CDATA[Назначить бейджи]]></string>
+	<string name="_sys_menu_item_title_studio"><![CDATA[Студия]]></string>
+	<string name="_sys_menu_item_title_subscriptions"><![CDATA[Подписки]]></string>
+	<string name="_sys_menu_item_title_social_sharing_facebook"><![CDATA[Поделиться в Facebook]]></string>
+    <string name="_sys_menu_item_title_social_sharing_twitter"><![CDATA[Поделиться в Twitter]]></string>
+    <string name="_sys_menu_item_title_social_sharing_pinterest"><![CDATA[Поделиться в Pinterest]]></string>
+    <string name="_sys_menu_item_title_sm_author"><![CDATA[Автор]]></string>
+    <string name="_sys_menu_item_title_sm_date"><![CDATA[Дата]]></string>
+    <string name="_sys_menu_item_title_sm_category"><![CDATA[Категория]]></string>
+    <string name="_sys_menu_item_title_sm_tags"><![CDATA[Тэги]]></string>
+    <string name="_sys_menu_item_title_sm_views"><![CDATA[Просмотры]]></string>
+    <string name="_sys_menu_item_title_sm_votes"><![CDATA[Голоса]]></string>
+    <string name="_sys_menu_item_title_sm_rating"><![CDATA[Рейтинг]]></string>
+    <string name="_sys_menu_item_title_sm_comments"><![CDATA[Комментарии]]></string>
+    <string name="_sys_menu_item_title_sm_actions"><![CDATA[Действия]]></string>
+    <string name="_sys_menu_item_title_sm_befriend"><![CDATA[Добавить в друзья]]></string>
+    <string name="_sys_menu_item_title_sm_befriend_confirm"><![CDATA[Принять запрос о дружбе]]></string>
+    <string name="_sys_menu_item_title_sm_unfriend"><![CDATA[Удалить из друзей]]></string>
+    <string name="_sys_menu_item_title_sm_unfriend_cancel"><![CDATA[Отменить запрос о дружбе]]></string>
+    <string name="_sys_menu_item_title_sm_unfriend_reject"><![CDATA[Отвергнуть запрос о дружбе]]></string>
+    <string name="_sys_menu_item_title_sm_join"><![CDATA[Присоединиться]]></string>
+    <string name="_sys_menu_item_title_sm_join_confirm"><![CDATA[Одобрить присоединение]]></string>
+    <string name="_sys_menu_item_title_sm_leave"><![CDATA[Покинуть]]></string>
+    <string name="_sys_menu_item_title_sm_leave_cancel"><![CDATA[Отменить присоединение]]></string>
+    <string name="_sys_menu_item_title_sm_leave_reject"><![CDATA[Отвергнуть присоединение]]></string>
+    <string name="_sys_menu_item_title_sm_nl"><![CDATA[Новая строка]]></string>
+    <string name="_sys_menu_item_title_sm_subscribe"><![CDATA[Получать уведомления]]></string>
+    <string name="_sys_menu_item_title_sm_unsubscribe"><![CDATA[Отключить уведомления]]></string>
+    <string name="_sys_menu_item_title_sm_friends"><![CDATA[Друзья: {0}]]></string>
+    <string name="_sys_menu_item_title_sm_members"><![CDATA[Участники: {0}]]></string>
+    <string name="_sys_menu_item_title_sm_subscribers"><![CDATA[Подписчики: {0}]]></string>
+    <string name="_sys_menu_item_title_sm_country"><![CDATA[Страна]]></string>
+    <string name="_sys_menu_item_title_sm_country_city"><![CDATA[Страна и город]]></string>
+	<string name="_sys_menu_item_title_system_about"><![CDATA[Об...]]></string>
+        <string name="_sys_menu_item_title_system_copyright"><![CDATA[Копирайт]]></string>
+	<string name="_sys_menu_item_title_system_privacy"><![CDATA[Конфиденциальность]]></string>
+	<string name="_sys_menu_item_title_system_switch_language"><![CDATA[Язык]]></string>
+	<string name="_sys_menu_item_title_system_switch_template"><![CDATA[Тема]]></string>
+	<string name="_sys_menu_item_title_system_terms"><![CDATA[Правила]]></string>
+	<string name="_sys_menu_item_title_system_account_menu"><![CDATA[Аккаунт]]></string>
+	<string name="_sys_menu_item_title_system_account_profile_context"><![CDATA[Профили]]></string>
+	<string name="_sys_menu_item_title_system_account_dashboard"><![CDATA[Панель]]></string>
+	<string name="_sys_menu_item_title_system_account_dashboard_administration"><![CDATA[Администрация]]></string>
+	<string name="_sys_menu_item_title_system_account_settings"><![CDATA[Настройки]]></string>
+	<string name="_sys_menu_item_title_system_account_settings_delete"><![CDATA[Удалить]]></string>
+	<string name="_sys_menu_item_title_system_account_settings_email"><![CDATA[Email]]></string>
+	<string name="_sys_menu_item_title_system_account_settings_info"><![CDATA[Аккаунт]]></string>
+	<string name="_sys_menu_item_title_system_account_settings_pwd"><![CDATA[Пароль]]></string>
+	<string name="_sys_menu_item_title_system_add_content"><![CDATA[Добавить Содержимое]]></string>
+	<string name="_sys_menu_item_title_system_cart"><![CDATA[Корзина]]></string>
+  <string name="_sys_menu_item_title_system_cmts_administration"><![CDATA[Комментарии]]></string>
+  <string name="_sys_menu_item_title_system_audit_administration"><![CDATA[Аудит]]></string>
+	<string name="_sys_menu_item_title_system_cmts_item_delete"><![CDATA[Удалить]]></string>
+	<string name="_sys_menu_item_title_system_cmts_item_edit"><![CDATA[Редактировать]]></string>
+        <string name="_sys_menu_item_title_system_cmts_item_quote"><![CDATA[Цитировать]]></string>
+        <string name="_sys_menu_item_title_system_cmts_item_reaction"><![CDATA[Реагировать]]></string>
+	<string name="_sys_menu_item_title_system_cmts_item_reply"><![CDATA[Ответить]]></string>
+	<string name="_sys_menu_item_title_system_cmts_item_report"><![CDATA[Пожаловаться]]></string>
+	<string name="_sys_menu_item_title_system_cmts_item_score"><![CDATA[Голосовать (За/Против)]]></string>
+	<string name="_sys_menu_item_title_system_cmts_item_vote"><![CDATA[Голосовать (Нравится)]]></string>
+	<string name="_sys_menu_item_title_system_cmts_item_more"><![CDATA[Ещё]]></string>
+	<string name="_sys_menu_item_title_system_dashboard"><![CDATA[Панель]]></string>
+	<string name="_sys_menu_item_title_system_home"><![CDATA[Домой]]></string>
+	<string name="_sys_menu_item_title_system_login"><![CDATA[Вход]]></string>
+	<string name="_sys_menu_item_title_system_logout"><![CDATA[Выйти]]></string>
+	<string name="_sys_menu_item_title_system_main_menu"><![CDATA[Главное Меню]]></string>
+	<string name="_sys_menu_item_title_system_more"><![CDATA[Ещё]]></string>
+    <string name="_sys_menu_item_title_system_orders"><![CDATA[Заказы]]></string>
+    <string name="_sys_menu_item_title_system_powered_by"><![CDATA[Сделано с помощью]]></string>
+	<string name="_sys_menu_item_title_system_profile"><![CDATA[Профиль]]></string>
+	<string name="_sys_menu_item_title_system_search"><![CDATA[Поиск]]></string>
+	<string name="_sys_menu_item_title_system_set_acl_level"><![CDATA[Назначить членство]]></string>
+  <string name="_sys_menu_item_title_system_set_badges"><![CDATA[Назначить бейджи]]></string>
+	<string name="_sys_menu_item_title_system_studio"><![CDATA[Студия]]></string>
+	<string name="_sys_menu_item_title_system_subscriptions"><![CDATA[Подписки]]></string>
+        <string name="_sys_menu_title_view_actions"><![CDATA[Просмотр - Действия]]></string>
+        <string name="_sys_menu_set_title_view_actions"><![CDATA[Просмотр - Действия]]></string>
+        <string name="_sys_menu_item_title_system_va_comment"><![CDATA[Комментировать]]></string>
+	<string name="_sys_menu_item_title_system_va_view"><![CDATA[Посмотреть]]></string>
+        <string name="_sys_menu_item_title_system_va_vote"><![CDATA[Проголосовать (за)]]></string>
+        <string name="_sys_menu_item_title_system_va_score"><![CDATA[Проголосовать (за/против)]]></string>
+        <string name="_sys_menu_item_title_system_va_favorite"><![CDATA[В избранное]]></string>
+        <string name="_sys_menu_item_title_system_va_feature"><![CDATA[В продвинутые]]></string>
+        <string name="_sys_menu_item_title_system_va_reaction"><![CDATA[Отреагировать]]></string>
+        <string name="_sys_menu_item_title_system_va_repost"><![CDATA[Сделать репост]]></string>
+        <string name="_sys_menu_item_title_system_va_report"><![CDATA[Пожаловаться]]></string>
+        <string name="_sys_menu_item_title_system_va_more_auto"><![CDATA[Еще]]></string>
+        <string name="_sys_menu_item_title_va_more_auto"><![CDATA[]]></string>
+        <string name="_sys_menu_item_title_system_social_sharing_facebook"><![CDATA[Поделиться в Facebook]]></string>
+    <string name="_sys_menu_item_title_system_social_sharing_twitter"><![CDATA[Поделиться в Twitter]]></string>
+    <string name="_sys_menu_item_title_system_social_sharing_pinterest"><![CDATA[Поделиться в Pinterest]]></string>
+    <string name="_sys_menu_item_title_system_sm_author"><![CDATA[Автор]]></string>
+    <string name="_sys_menu_item_title_system_sm_date"><![CDATA[Дата]]></string>
+    <string name="_sys_menu_item_title_system_sm_category"><![CDATA[Категория]]></string>
+    <string name="_sys_menu_item_title_system_sm_tags"><![CDATA[Тэги]]></string>
+    <string name="_sys_menu_item_title_system_sm_views"><![CDATA[Просмотры]]></string>
+    <string name="_sys_menu_item_title_system_sm_votes"><![CDATA[Голоса]]></string>
+    <string name="_sys_menu_item_title_system_sm_rating"><![CDATA[Рейтинг]]></string>
+    <string name="_sys_menu_item_title_system_sm_comments"><![CDATA[Комментарии]]></string>
+    <string name="_sys_menu_item_title_system_sm_actions"><![CDATA[Действия]]></string>
+    <string name="_sys_menu_item_title_system_sm_befriend"><![CDATA[Добавить в друзья]]></string>
+    <string name="_sys_menu_item_title_system_sm_unfriend"><![CDATA[Удалить из друзей]]></string>
+    <string name="_sys_menu_item_title_system_sm_join"><![CDATA[Присоединиться]]></string>
+    <string name="_sys_menu_item_title_system_sm_leave"><![CDATA[Покинуть]]></string>
+    <string name="_sys_menu_item_title_system_sm_nl"><![CDATA[Новая строка]]></string>
+    <string name="_sys_menu_item_title_system_sm_subscribe"><![CDATA[Получать уведомления]]></string>
+    <string name="_sys_menu_item_title_system_sm_unsubscribe"><![CDATA[Отключить уведомления]]></string>
+    <string name="_sys_menu_item_title_system_sm_country"><![CDATA[Страна]]></string>
+    <string name="_sys_menu_item_title_system_sm_country_city"><![CDATA[Страна и город]]></string>
+    <string name="_sys_menu_item_title_system_sm_friends"><![CDATA[Друзья]]></string>
+    <string name="_sys_menu_item_title_system_sm_members"><![CDATA[Участники]]></string>
+    <string name="_sys_menu_item_title_system_sm_membership"><![CDATA[Членство]]></string>
+    <string name="_sys_menu_item_title_system_sm_subscribers"><![CDATA[Подписки]]></string>
+	<string name="_sys_menu_set_title_account_dashboard"><![CDATA[Панель аккаунта]]></string>
+	<string name="_sys_menu_set_title_account_dashboard_manage_tools"><![CDATA[Панель аккаунта - Инструменты управления]]></string>
+	<string name="_sys_menu_set_title_account_settings"><![CDATA[Аккаунт - Настройки]]></string>
+	<string name="_sys_menu_set_title_account_settings_more"><![CDATA[Аккаунт - Дополнительные настройки]]></string>
+	<string name="_sys_menu_set_title_account_notifications"><![CDATA[Аккаунт - Уведомления]]></string>
+	<string name="_sys_menu_set_title_add_content"><![CDATA[Добавить содержимое]]></string>
+	<string name="_sys_menu_set_title_add_profile"><![CDATA[Добавить профиль]]></string>
+	<string name="_sys_menu_set_title_cmts_item_actions"><![CDATA[Комментарий - Действия]]></string>
+	<string name="_sys_menu_set_title_cmts_item_manage"><![CDATA[Комментарий - Управление]]></string>
+        <string name="_sys_menu_set_title_cmts_item_meta"><![CDATA[Комментарий - Мета инфо]]></string>
+	<string name="_sys_menu_set_title_switch_language"><![CDATA[Переключить язык]]></string>
+	<string name="_sys_menu_set_title_switch_template"><![CDATA[Переключить тему]]></string>
+	<string name="_sys_menu_set_title_sys_social_sharing"><![CDATA[Социальные сети]]></string>
+	<string name="_sys_menu_set_title_footer"><![CDATA[Основание]]></string>
+	<string name="_sys_menu_set_title_profile_create_links"><![CDATA[Профиль - Создание]]></string>
+	<string name="_sys_menu_set_title_profile_stats"><![CDATA[Профиль - Статистика]]></string>
+	<string name="_sys_menu_set_title_site"><![CDATA[Сайт]]></string>
+	<string name="_sys_menu_set_title_homepage"><![CDATA[Модули с содержимым]]></string>
+	<string name="_sys_menu_set_title_toolbar_member"><![CDATA[Панель инструментов - Пользователь]]></string>
+	<string name="_sys_menu_set_title_toolbar_site"><![CDATA[Панель инструментов - Сайт]]></string>
+	<string name="_sys_menu_set_title_snippet_meta"><![CDATA[Мета информация в карточке]]></string>
+	<string name="_sys_menu_template_title_buttons_hor"><![CDATA[Горизонтальные кнопки]]></string>
+        <string name="_sys_menu_template_title_buttons_icon_hor"><![CDATA[Горизонтальные кнопки (только иконки)]]></string>
+	<string name="_sys_menu_template_title_buttons_ver"><![CDATA[Вертикальные кнопки]]></string>
+	<string name="_sys_menu_template_title_floating_blocks"><![CDATA[Подвесные блоки]]></string>
+	<string name="_sys_menu_template_title_floating_blocks_wide"><![CDATA[Широкие подвесные блоки с оповещениями]]></string>
+	<string name="_sys_menu_template_title_floating_blocks_big"><![CDATA[Подвесные блоки - Большие]]></string>
+	<string name="_sys_menu_template_title_floating_blocks_dash"><![CDATA[Подвесные блоки с иконками и подписями]]></string>
+	<string name="_sys_menu_template_title_footer"><![CDATA[Основание - Ссылки]]></string>
+	<string name="_sys_menu_template_title_hor"><![CDATA[Горизонтальные ссылки]]></string>
+	<string name="_sys_menu_template_title_inline"><![CDATA[В тексте]]></string>
+	<string name="_sys_menu_template_title_inline_sbtn"><![CDATA[В тексте ('спец' кнопки)]]></string>
+	<string name="_sys_menu_template_title_interactive"><![CDATA[Интерактивные горизонтальные ссылки]]></string>
+	<string name="_sys_menu_template_title_interactive_vertical"><![CDATA[Интерактивные вертикальные ссылки]]></string>
+	<string name="_sys_menu_template_title_empty"><![CDATA[Пустое меню]]></string>
+	<string name="_sys_menu_template_title_main_submenu"><![CDATA[Навигация по сайту - Подменю]]></string>
+	<string name="_sys_menu_template_title_toolbar"><![CDATA[Панель инструментов - Кнопки]]></string>
+	<string name="_sys_menu_template_title_ver"><![CDATA[Вертикальные ссылки]]></string>
+	<string name="_sys_menu_template_title_ver_lite"><![CDATA[Вертикальные ссылки (облегчённые)]]></string>
+	<string name="_sys_menu_template_title_account_notifications"><![CDATA[Аккаунт - Уведомления]]></string>
+	<string name="_sys_menu_template_title_account_popup"><![CDATA[Аккаунт - Всплывающие]]></string>
+	<string name="_sys_menu_template_title_custom_hor"><![CDATA[Горизонтальное меню с индивидуальными элементами]]></string>
+    <string name="_sys_menu_template_title_custom_ver"><![CDATA[Вертикальное меню с индивидуальными элементами]]></string>
+    <string name="_sys_menu_template_title_profile_stats"><![CDATA[Статистика профиля - Меню]]></string>
+	<string name="_sys_menu_title_account_dashboard"><![CDATA[Панель аккаунта - Меню]]></string>
+	<string name="_sys_menu_title_account_dashboard_manage_tools"><![CDATA[Панель аккаунта - Меню инструментов управления]]></string>
+    <string name="_sys_menu_title_account_notifications"><![CDATA[Меню с уведомлениями]]></string>
+    <string name="_sys_menu_title_account_popup"><![CDATA[Аккаунт - Всплывающее меню]]></string>
+	<string name="_sys_menu_title_account_settings"><![CDATA[Аккаунт - Меню настроек]]></string>
+	<string name="_sys_menu_title_account_settings_more"><![CDATA[Аккаунт - Меню дополнительных настроек]]></string>
+	<string name="_sys_menu_title_add_content"><![CDATA[Добавить содержимое - Меню]]></string>
+	<string name="_sys_menu_title_add_profile"><![CDATA[Добавить профиль - Меню]]></string>
+	<string name="_sys_menu_title_add_profile_vertical"><![CDATA[Добавить профиль - Меню вертикальное]]></string>
+	<string name="_sys_menu_title_cmts_item_actions"><![CDATA[Комментарий - Действия]]></string>
+	<string name="_sys_menu_title_cmts_item_manage"><![CDATA[Комментарий - Управление]]></string>
+        <string name="_sys_menu_title_cmts_item_meta"><![CDATA[Комментарий - Мета инфо]]></string>
+	<string name="_sys_menu_title_footer"><![CDATA[Основание - Ссылки]]></string>
+	<string name="_sys_menu_title_main"><![CDATA[Сайт - Навигация]]></string>
+	<string name="_sys_menu_title_homepage"><![CDATA[Меню на главной странице]]></string>
+        <string name="_sys_menu_title_homepage_submenu"><![CDATA[Подменю на главной странице]]></string>
+	<string name="_sys_menu_set_title_homepage_submenu"><![CDATA[Подменю на главной странице]]></string>
+	<string name="_sys_menu_item_title_system_explore"><![CDATA[Открытия]]></string>
+	<string name="_sys_menu_item_title_explore"><![CDATA[Открытия]]></string>
+	<string name="_sys_menu_item_title_system_updates"><![CDATA[Обновления]]></string>
+	<string name="_sys_menu_item_title_updates"><![CDATA[Обновления]]></string>
+	<string name="_sys_menu_item_title_system_trends"><![CDATA[Тренды]]></string>
+	<string name="_sys_menu_item_title_trends"><![CDATA[Тренды]]></string>
+	<string name="_sys_menu_title_profiles_create"><![CDATA[Профиль - Создание]]></string>
+	<string name="_sys_menu_title_profile_stats"><![CDATA[Профиль - Статистика]]></string>
+	<string name="_sys_menu_title_rss"><![CDATA[RSS]]></string>
+	<string name="_sys_menu_title_set_acl_level"><![CDATA[Уровни доступа]]></string>
+  <string name="_sys_menu_title_set_badges"><![CDATA[Бейджи]]></string>
+	<string name="_sys_menu_title_social_sharing"><![CDATA[Социальные сети]]></string>
+        <string name="_sys_menu_title_create_post"><![CDATA[Создать пост - Меню]]></string>
+        <string name="_sys_menu_title_add_relation"><![CDATA[Добавить связь - Меню]]></string>
+	<string name="_sys_menu_title_submenu"><![CDATA[Подменю сайта]]></string>
+	<string name="_sys_menu_title_toolbar_member"><![CDATA[Панель инструментов - Пользователь]]></string>
+	<string name="_sys_menu_title_toolbar_site"><![CDATA[Панель инструментов - Сайт]]></string>
+	<string name="_sys_menu_title_switch_language_popup"><![CDATA[Переключатель языка (попап)]]></string>
+	<string name="_sys_menu_title_switch_language_inline"><![CDATA[Переключатель языка (встроенный)]]></string>
+	<string name="_sys_menu_title_switch_template"><![CDATA[Переключить тему]]></string>
+	<string name="_sys_menu_title_snippet_meta"><![CDATA[Мета информация в карточке]]></string>
+    <string name="_sys_menu_title_vote_reactions_do"><![CDATA[Отреагировать - Меню]]></string>
+  <string name="_sys_menu_title_wiki"><![CDATA[Вики]]></string>
+  <string name="_sys_menu_set_title_sys_wiki"><![CDATA[Вики]]></string>
+  <string name="_sys_menu_item_title_wiki_edit"><![CDATA[Редактировать]]></string>
+  <string name="_sys_menu_item_title_wiki_delete_version"><![CDATA[Удалить версию]]></string>
+  <string name="_sys_menu_item_title_wiki_delete_block"><![CDATA[Удалить блок]]></string>
+  <string name="_sys_menu_item_title_wiki_translate"><![CDATA[Перевести]]></string>
+  <string name="_sys_menu_item_title_wiki_history"><![CDATA[История]]></string>
+  <string name="_sys_menu_dashboard_manage_tools_addon_counter1_caption_default"><![CDATA[спрятано]]></string>
+  <string name="_sys_menu_dashboard_manage_tools_addon_counter1_caption_profile_default"><![CDATA[неодобрено]]></string>
+  <string name="_sys_menu_dashboard_manage_tools_addon_counter2_caption_default"><![CDATA[жалоб]]></string>
+	<string name="_sys_metatags_mention_added"><![CDATA[<b class="bx-ntfs-content-profile">{owner_name}</b> упомянул <b class="bx-ntfs-content-entry">{entry_caption}</b>]]></string>
+	<string name="_sys_mobile_friends"><![CDATA[Друзья]]></string>
+	<string name="_sys_mobile_info"><![CDATA[Инфо]]></string>
+	<string name="_sys_mobile_mail"><![CDATA[Сообщения]]></string>
+	<string name="_sys_mobile_profile_contact"><![CDATA[Написать]]></string>
+	<string name="_sys_mobile_profile_friends"><![CDATA[Друзья]]></string>
+	<string name="_sys_mobile_profile_info"><![CDATA[Профиль - Инфо]]></string>
+	<string name="_sys_mobile_search"><![CDATA[Поиск]]></string>
+	<string name="_sys_mobile_status"><![CDATA[Статус]]></string>
+    <string name="_sys_name"><![CDATA[Имя]]></string>
+    <string name="_sys_added"><![CDATA[Добавлено]]></string>
+    <string name="_sys_next"><![CDATA[Ещё]]></string>
+    <string name="_sys_notification_account"><![CDATA[Аккаунты, созданные за последние 24 часа:]]></string>
+    <string name="_sys_no_menu"><![CDATA[Меню отсутствует]]></string>
+    <string name="_sys_not_available"><![CDATA[н/д]]></string>
+    <string name="_sys_not_specified"><![CDATA[Не указано]]></string>
+    <string name="_sys_on"><![CDATA[вкл.]]></string>
+    <string name="_sys_off"><![CDATA[выкл.]]></string>
+    <string name="_sys_pages"><![CDATA[Страницы]]></string>
+	<string name="_sys_page_block_title_about"><![CDATA[Об...]]></string>
+	<string name="_sys_page_block_title_account_profile_create"><![CDATA[Создать профиль...]]></string>
+	<string name="_sys_page_block_title_account_profile_switcher"><![CDATA[Использовать сайт как ...]]></string>
+	<string name="_sys_page_block_title_account_settings_delete"><![CDATA[Удалить аккаунт]]></string>
+	<string name="_sys_page_block_title_account_settings_email"><![CDATA[Настройки email-а]]></string>
+	<string name="_sys_page_block_title_account_settings_info"><![CDATA[Редактировать аккаунт]]></string>
+	<string name="_sys_page_block_title_account_settings_menu"><![CDATA[Аккаунт - Настройки]]></string>
+	<string name="_sys_page_block_title_account_settings_pwd"><![CDATA[Изменить пароль]]></string>
+    <string name="_sys_page_block_title_add_content"><![CDATA[Добавить содержимое]]></string>
+    <string name="_sys_page_block_title_chart_growth"><![CDATA[Диаграммы развития]]></string>
+    <string name="_sys_page_block_title_chart_stats"><![CDATA[Содержимое]]></string>    
+	<string name="_sys_page_block_title_cmts_administration"><![CDATA[Управление комментариями]]></string>
+  <string name="_sys_page_block_title_audit_administration"><![CDATA[Аудит]]></string>
+	<string name="_sys_page_block_title_confirm_email"><![CDATA[Email - Подтверждение]]></string>
+	<string name="_sys_page_block_title_confirm_phone"><![CDATA[Телефон - Подтверждение]]></string>
+	<string name="_sys_page_block_title_create_account"><![CDATA[Присоединиться]]></string>
+        <string name="_sys_page_block_title_sys_create_post"><![CDATA[Создать публикацию]]></string>
+	<string name="_sys_page_block_title_create_post"><![CDATA[Добавить...]]></string>
+	<string name="_sys_page_block_title_sys_create_post_context"><![CDATA[Создать публикацию (в контекст)]]></string>
+	<string name="_sys_page_block_title_create_post_context"><![CDATA[Добавить...]]></string>
+	<string name="_sys_page_block_title_sys_create_post_public"><![CDATA[Создать публикацию (публично)]]></string>
+	<string name="_sys_page_block_title_create_post_public"><![CDATA[Добавить...]]></string>
+	<string name="_sys_page_block_title_dashboard"><![CDATA[Панель]]></string>
+    <string name="_sys_page_block_title_homepage_menu"><![CDATA[Меню модулей с содержимым]]></string>
+    <string name="_sys_page_block_title_homepage_splash"><![CDATA[Заставка]]></string>
+	<string name="_sys_page_block_title_forgot_password"><![CDATA[Забыли пароль]]></string>
+        <string name="_sys_page_block_title_membership_stats"><![CDATA[Лимиты членства]]></string>
+	<string name="_sys_page_block_system_title_login"><![CDATA[Вход с линкой регистрации]]></string>
+	<string name="_sys_page_block_system_title_login_step2"><![CDATA[Вход - шаг 2]]></string>
+	<string name="_sys_page_block_system_title_login_step3"><![CDATA[Вход - шаг 3]]></string>
+	<string name="_sys_page_block_system_title_login_only"><![CDATA[Вход]]></string>
+	<string name="_sys_page_block_title_system_cmts_administration"><![CDATA[Управление комментариями]]></string>
+  <string name="_sys_page_block_title_system_audit_administration"><![CDATA[Аудит]]></string>
+	<string name="_sys_page_block_title_login"><![CDATA[Вход]]></string>
+	<string name="_sys_page_block_title_login_step2"><![CDATA[Вход - шаг 2]]></string>
+	<string name="_sys_page_block_title_login_step3"><![CDATA[Вход - шаг 3]]></string>
+	<string name="_sys_page_block_title_manage_tools"><![CDATA[Управление]]></string>
+	<string name="_sys_page_block_title_privacy"><![CDATA[Политика конфиденциальности]]></string>
+	<string name="_sys_page_block_title_profile_stats"><![CDATA[Профиль - Статистика]]></string>
+	<string name="_sys_page_block_title_profile_membership"><![CDATA[Членство]]></string>
+	<string name="_sys_page_block_title_unsubscribe_news"><![CDATA[Отписаться от новостей сайта]]></string>
+	<string name="_sys_page_block_title_unsubscribe_notifications"><![CDATA[Отписаться от уведомлений сайта]]></string>
+	<string name="_sys_page_block_title_std_dash_version"><![CDATA[Версия]]></string>
+	<string name="_sys_page_block_title_std_dash_space"><![CDATA[Использование дискового пространства]]></string>
+	<string name="_sys_page_block_title_std_dash_host_tools"><![CDATA[Инструменты хоста]]></string>
+	<string name="_sys_page_block_title_std_dash_cache"><![CDATA[Кэш]]></string>
+	<string name="_sys_page_block_title_terms"><![CDATA[Правила пользования]]></string>
+	<string name="_sys_page_lang_block_about"><![CDATA[Этот сайт сделан на UNA. Остальное - тайна, покрытая мраком.]]></string>
+	<string name="_sys_page_lang_block_terms"><![CDATA[Правила пользования нашим сайтом.]]></string>
+	<string name="_sys_page_lang_block_privacy"><![CDATA[Политика конфиденциальности нашего сайта.]]></string>
+	<string name="_sys_page_title_about"><![CDATA[Об...]]></string>
+	<string name="_sys_page_title_account_profile_switcher"><![CDATA[Мои профили]]></string>
+	<string name="_sys_page_title_account_settings_delete"><![CDATA[Удалить аккаунт]]></string>
+	<string name="_sys_page_title_account_settings_email"><![CDATA[Настройки email-а]]></string>
+	<string name="_sys_page_title_account_settings_info"><![CDATA[Редактировать аккаунт]]></string>
+	<string name="_sys_page_title_account_settings_pwd"><![CDATA[Изменить пароль]]></string>
+	<string name="_sys_page_title_add_content"><![CDATA[Добавить содержимое]]></string>
+  <string name="_sys_page_title_cmts_administration"><![CDATA[Управление комментариями]]></string>
+  <string name="_sys_page_title_audit_administration"><![CDATA[Аудит]]></string>
+	<string name="_sys_page_title_confirm_email"><![CDATA[Email - Подтверждение]]></string>
+	<string name="_sys_page_title_confirm_phone"><![CDATA[Телефон - Подтверждение]]></string>
+	<string name="_sys_page_title_create_account"><![CDATA[Присоединиться]]></string>
+	<string name="_sys_page_title_dashboard"><![CDATA[Панель]]></string>
+	<string name="_sys_page_title_forgot_password"><![CDATA[Забыли пароль]]></string>
+	<string name="_sys_page_title_home"><![CDATA[{site_title} :: Домашняя страница]]></string>
+	<string name="_sys_page_title_login"><![CDATA[Вход]]></string>
+	<string name="_sys_page_title_login_step2"><![CDATA[Вход - шаг 2]]></string>
+	<string name="_sys_page_title_login_step3"><![CDATA[Вход - шаг 3]]></string>
+	<string name="_sys_page_title_privacy"><![CDATA[Политика конфиденциальности]]></string>
+        <string name="_sys_page_title_explore"><![CDATA[Открытия]]></string>
+        <string name="_sys_page_title_updates"><![CDATA[Обновления]]></string>
+        <string name="_sys_page_title_trends"><![CDATA[Тренды]]></string>
+	<string name="_sys_page_title_terms"><![CDATA[Правила пользования]]></string>
+	<string name="_sys_page_title_system_about"><![CDATA[Об...]]></string>
+	<string name="_sys_page_title_system_account_profile_switcher"><![CDATA[Мои профили]]></string>
+	<string name="_sys_page_title_system_account_settings_delete"><![CDATA[Удалить аккаунт]]></string>
+	<string name="_sys_page_title_system_account_settings_email"><![CDATA[Email настройки]]></string>
+	<string name="_sys_page_title_system_account_settings_info"><![CDATA[Редактировать аккаунт]]></string>
+	<string name="_sys_page_title_system_account_settings_pwd"><![CDATA[Изменить пароль]]></string>
+	<string name="_sys_page_title_system_add_content"><![CDATA[Добавить содержимое]]></string>
+        <string name="_sys_page_title_system_cmts_administration"><![CDATA[Управление комментариями]]></string>
+  <string name="_sys_page_title_system_audit_administration"><![CDATA[Аудит]]></string>
+	<string name="_sys_page_title_system_confirm_email"><![CDATA[Email подтверждение]]></string>
+	<string name="_sys_page_title_system_confirm_phone"><![CDATA[Подтверждение телефона]]></string>
+	<string name="_sys_page_title_system_create_account"><![CDATA[Присоединиться]]></string>
+	<string name="_sys_page_title_system_dashboard"><![CDATA[Панель]]></string>
+	<string name="_sys_page_title_system_forgot_password"><![CDATA[Забыли пароль]]></string>
+	<string name="_sys_page_title_system_home"><![CDATA[Домашняя страница]]></string>
+	<string name="_sys_page_title_system_login"><![CDATA[Вход]]></string>
+	<string name="_sys_page_title_system_login_step2"><![CDATA[Вход - шаг2]]></string>
+	<string name="_sys_page_title_system_login_step3"><![CDATA[Вход - шаг3]]></string>
+	<string name="_sys_page_title_system_privacy"><![CDATA[Политика конфиденциальности]]></string>
+        <string name="_sys_page_title_sys_explore"><![CDATA[Открытия]]></string>
+	<string name="_sys_page_title_sys_updates"><![CDATA[Обновления]]></string>
+	<string name="_sys_page_title_sys_trends"><![CDATA[Тренды]]></string>
+	<string name="_sys_page_title_system_terms"><![CDATA[Правила пользования]]></string>
+	<string name="_sys_page_title_system_unsubscribe_news"><![CDATA[Отписаться от новостей]]></string>
+	<string name="_sys_page_title_system_unsubscribe_notifications"><![CDATA[Отписаться от уведомлений]]></string>
+	<string name="_sys_page_title_system_studio_dashboard"><![CDATA[Студия - Панель]]></string>
+	<string name="_sys_page_title_unsubscribe_news"><![CDATA[Отписаться от новостей сайта]]></string>
+	<string name="_sys_page_title_unsubscribe_notifications"><![CDATA[Отписаться от уведомлений сайта]]></string>
+	<string name="_sys_page_title_studio_dashboard"><![CDATA[Студия - Панель]]></string>
+	<string name="_sys_page_type_default"><![CDATA[Стандартная]]></string>
+	<string name="_sys_page_type_default_wo_hf"><![CDATA[Без заголовка и основания]]></string>
+	<string name="_sys_paginate_info"><![CDATA[{0}-{1}]]></string>
+	<string name="_sys_paginate_view_all"><![CDATA[Просмотреть все]]></string>
+	<string name="_sys_please_select"><![CDATA[Пожалуйста, выберите...]]></string>
+        <string name="_sys_pre_lists_relations"><![CDATA[Отношения]]></string>
+        <string name="_sys_pre_lists_relations_husband"><![CDATA[муж]]></string>
+        <string name="_sys_pre_lists_relations_wife"><![CDATA[жена]]></string>
+        <string name="_sys_pre_lists_relations_father"><![CDATA[отец]]></string>
+        <string name="_sys_pre_lists_relations_mother"><![CDATA[мать]]></string>
+        <string name="_sys_pre_lists_relations_son"><![CDATA[сын]]></string>
+        <string name="_sys_pre_lists_relations_daughter"><![CDATA[дочь]]></string>
+        <string name="_sys_pre_lists_relations_brother"><![CDATA[брат]]></string>
+        <string name="_sys_pre_lists_relations_sister"><![CDATA[сестра]]></string>
+	<string name="_sys_pre_lists_report_types"><![CDATA[Типы жалоб]]></string>
+	<string name="_sys_pre_lists_report_types_spam"><![CDATA[спам]]></string>
+	<string name="_sys_pre_lists_report_types_scam"><![CDATA[скам]]></string>
+	<string name="_sys_pre_lists_report_types_fraud"><![CDATA[обман]]></string>
+	<string name="_sys_pre_lists_report_types_nude"><![CDATA[обнаженность]]></string>
+	<string name="_sys_pre_lists_report_types_other"><![CDATA[другое]]></string>
+        <string name="_sys_pre_lists_vote_reactions"><![CDATA[Реакции]]></string>
+        <string name="_sys_pre_lists_vote_reactions_like"><![CDATA[Нравится]]></string>
+        <string name="_sys_pre_lists_vote_reactions_love"><![CDATA[Люблю]]></string>
+        <string name="_sys_pre_lists_vote_reactions_joy"><![CDATA[Ха-ха]]></string>
+        <string name="_sys_pre_lists_vote_reactions_surprise"><![CDATA[Вау!]]></string>
+        <string name="_sys_pre_lists_vote_reactions_sadness"><![CDATA[Грустно]]></string>
+        <string name="_sys_pre_lists_vote_reactions_anger"><![CDATA[Злюсь]]></string>
+	<string name="_sys_profile_sample_single"><![CDATA[профиль]]></string>
+    <string name="_sys_profile_with_type"><![CDATA[{0} ({1})]]></string>
+        <string name="_sys_profile_friend_request_added"><![CDATA[<b class="bx-ntfs-content-profile">{owner_name}</b> предложил дружбу <b class="bx-ntfs-content-entry">{entry_caption}</b>]]></string>
+	<string name="_sys_profile_friendship_added"><![CDATA[<b class="bx-ntfs-content-profile">{owner_name}</b> и <b class="bx-ntfs-content-entry">{entry_caption}</b> теперь друзья]]></string>
+	<string name="_sys_profile_subscription_added"><![CDATA[<b class="bx-ntfs-content-profile">{owner_name}</b> следит за <b class="bx-ntfs-content-entry">{entry_caption}</b>]]></string>
+	<string name="_sys_profile_status_active"><![CDATA[Активный]]></string>
+    <string name="_sys_profile_status_pending"><![CDATA[В ожидании]]></string>
+    <string name="_sys_profile_status_suspended"><![CDATA[Заблокированный]]></string>
+    <string name="_sys_profile_storage_quota_size"><![CDATA[Хранилище]]></string>
+        <string name="_sys_profile_storage_quota_number"><![CDATA[Количество файлов]]></string>
+	<string name="_sys_private"><![CDATA[Приватные]]></string>
+        <string name="_sys_privacy_forms_input_allow_view_to"><![CDATA[Видимость]]></string>
+        <string name="_sys_privacy_groups_acl"><![CDATA[Членство]]></string>
+    <string name="_sys_pruning_db"><![CDATA[<h3>Очистка базы данных:</h3>
+        <ul>
+            <li><b>{0}</b> удалено просроченных членств</li>
+            <li><b>{1}</b> удалено просроченных сессий</li>
+            <li><b>{2}</b> удалено просроченных ключей</li>
+            <li><b>{3}</b> удалено просроченных токенов хранилища</li>
+            <li><b>{4}</b> удалено просроченных транскодированных изображений</li>
+        </ul>]]></string>
+    <string name="_sys_pruning_files"><![CDATA[<h3>Очистка Файлов:</h3>
+        <ul>
+            <li><b>{0}</b> всего</li>
+            <li><b>{1}</b> удалено</li>
+        </ul>]]></string>
+        <string name="_sys_ps_group_title_custom"><![CDATA[Индивидуально]]></string>
+        <string name="_sys_ps_group_title_followers"><![CDATA[Подписчики]]></string>
+	<string name="_sys_ps_group_title_friends"><![CDATA[Друзья]]></string>
+        <string name="_sys_ps_group_title_friends_selected"><![CDATA[Избранные друзья...]]></string>
+        <string name="_sys_ps_group_title_relations"><![CDATA[Отношения]]></string>
+        <string name="_sys_ps_group_title_relations_selected"><![CDATA[Избранные отношения...]]></string>
+	<string name="_sys_ps_group_title_me_only"><![CDATA[Только я]]></string>
+	<string name="_sys_ps_group_title_members"><![CDATA[Пользователи]]></string>
+	<string name="_sys_ps_group_title_public"><![CDATA[Все]]></string>
+        <string name="_sys_ps_group_title_participants"><![CDATA[Участники]]></string>
+	<string name="_sys_ps_group_title_closed"><![CDATA[Закрытая]]></string>
+    <string name="_sys_ps_group_title_secret"><![CDATA[Секретная]]></string>
+    <string name="_sys_ps_ferr_incorrect_gc_not_allowed"><![CDATA[Пользовательские группы конфиденциальности не доступны.]]></string>
+    <string name="_sys_ps_ferr_incorrect_gc_owner"><![CDATA[Вы не являетесь владельцем данного контента.]]></string>
+    <string name="_sys_ps_ferr_incorrect_select"><![CDATA[Вам нужно выбрать значение]]></string>
+    <string name="_sys_ps_space_title_friend"><![CDATA[друг]]></string>
+    <string name="_sys_push_notification_request"><![CDATA[Хотите получать уведомления с сайта {0}?]]></string>   
+    <string name="_sys_push_notification_request_yes"><![CDATA[Да]]></string>   
+    <string name="_sys_push_notification_request_no"><![CDATA[Нет, спасибо]]></string>
+    <string name="_sys_read_more"><![CDATA[Продолжить чтение "{0}"]]></string>
+    <string name="_sys_relation"><![CDATA[Связь]]></string>
+	<string name="_sys_request_module_not_found_cpt"><![CDATA[Модуль не найден]]></string>
+	<string name="_sys_request_module_not_found_cnt"><![CDATA[Модуль({0}) не найден]]></string>
+	<string name="_sys_request_page_not_found_cpt"><![CDATA[Страница не найдена]]></string>
+	<string name="_sys_request_page_not_found_cnt"><![CDATA[Страница({0}) не найдена в модуле ({1})]]></string>
+	<string name="_sys_request_method_not_found_cpt"><![CDATA[Метод не найден]]></string>
+	<string name="_sys_request_method_not_found_cnt"><![CDATA[Метод ({0}) не найден в модуле ({1})]]></string>
+	<string name="_sys_score_counter"><![CDATA[{0}]]></string>
+	<string name="_sys_score_counter_empty"><![CDATA[Проголосовать]]></string>
+    <string name="_sys_score_do_up"><![CDATA[Проголосовать за]]></string>
+    <string name="_sys_score_do_down"><![CDATA[Проголосовать против]]></string>
+    <string name="_sys_score_do_by"><![CDATA[Проголосовали]]></string>
+    <string name="_sys_score_err_not_enabled"><![CDATA[Ваш голос не может быть принят в данный момент. Пожалуйста, попробуйте позднее.]]></string>
+    <string name="_sys_score_err_duplicate_vote"><![CDATA[Повторный голос]]></string>
+	<string name="_sys_search_main_title"><![CDATA[Поиск - Домой]]></string>
+	<string name="_sys_select"><![CDATA[Выбрать]]></string>
+	<string name="_sys_send"><![CDATA[Отправить]]></string>
+    <string name="_sys_search_placeholder"><![CDATA[Поиск...]]></string>
+    <string name="_sys_show_more"><![CDATA[Показать ещё]]></string>
+	<string name="_sys_spam_detected"><![CDATA[Ваше действие привело к блокировке]]></string>
+	<string name="_sys_spam_detected_contact"><![CDATA[Ваше действие привело к блокировке, сзяжитесь с нами для проверки происходящего: {0}]]></string>
+	<string name="_sys_splash_btn_start"><![CDATA[Начало]]></string>
+	<string name="_sys_splash_err_domain_incorrect"><![CDATA[Нужно указать домен. Пожалуйста, заполните это поле, например, my-first-site.]]></string>
+	<string name="_sys_splash_err_domain_is_used"><![CDATA[Имя домена уже используется. Выберите другое.]]></string>
+	<string name="_sys_splash_err_service_not_available"><![CDATA[Сервис сейчас не доступен. Попытайтесь позднее.]]></string>
+	<string name="_sys_splash_inp_placeholder"><![CDATA[адрес сайта]]></string>
+	<string name="_sys_splash_inp_postfix"><![CDATA[.online.me]]></string>
+	<string name="_sys_splash_slogan"><![CDATA[Самый простой способ создать свой собственный социальный сайт.]]></string>
+        <string name="_sys_status"><![CDATA[Статус]]></string>
+        <string name="_sys_status_awaiting"><![CDATA[ожидающий]]></string>
+        <string name="_sys_status_failed"><![CDATA[неудавшийся]]></string>
+	<string name="_sys_storage_err_db"><![CDATA[ошибка базы данных]]></string>
+	<string name="_sys_storage_err_engine_add"><![CDATA[произошла ошибка]]></string>
+	<string name="_sys_storage_err_engine_get"><![CDATA[произошла ошибка]]></string>
+	<string name="_sys_storage_err_file_not_found"><![CDATA[файл не найден]]></string>
+	<string name="_sys_storage_err_file_too_big"><![CDATA[файл слишком большой]]></string>
+	<string name="_sys_storage_err_filesystem_perm"><![CDATA[ошибка в разрешениях]]></string>
+	<string name="_sys_storage_err_no_file"><![CDATA[не выбран файл для загрузки]]></string>
+	<string name="_sys_storage_err_no_input_method"><![CDATA[нет такого метода ввода]]></string>
+	<string name="_sys_storage_err_object_quota_exceeded"><![CDATA[квота превышена]]></string>
+	<string name="_sys_storage_err_permission_denied"><![CDATA[нет разрешения]]></string>
+	<string name="_sys_storage_err_site_quota_exceeded"><![CDATA[квота превышена]]></string>
+	<string name="_sys_storage_err_unlink"><![CDATA[не удалось удалить файл]]></string>
+	<string name="_sys_storage_err_user_quota_exceeded"><![CDATA[квота пользователя превышена]]></string>
+	<string name="_sys_storage_err_wrong_ext"><![CDATA[неправильное расширение файла]]></string>
+        <string name="_sys_storage_files"><![CDATA[файл(ов)]]></string>
+	<string name="_sys_storage_invalid_file"><![CDATA[неправильный файл]]></string>
+	<string name="_sys_storage_restriction_ext_all_allowed"><![CDATA[Ого, разрешены файлы всех типов!]]></string>
+	<string name="_sys_storage_restriction_ext_all_denied"><![CDATA[Извините, добавление файлов любого вида сейчас запрещено.]]></string>
+	<string name="_sys_storage_restriction_ext_allowed"><![CDATA[Пожалуйста, загружайте файлы только следующих типов: {0}]]></string>
+	<string name="_sys_storage_restriction_ext_denied"><![CDATA[Вы можете загружать любые типы файлов, кроме {0}]]></string>
+	<string name="_sys_storage_restriction_size"><![CDATA[Максимальный разрешённый размер файла {0}]]></string>
+	<string name="_sys_switch_profile"><![CDATA[Переключить профиль]]></string>
+	<string name="_sys_submit"><![CDATA[Выполнить]]></string>
+	<string name="_sys_subscribe"><![CDATA[Получать уведомления]]></string>
+        <string name="_sys_template_mixed_mask"><![CDATA[{0} ({1})]]></string>
+
+	<string name="_sys_tour_launcher_welcome_title"><![CDATA[Добро пожаловать в UNA Студию!]]></string>
+	<string name="_sys_tour_launcher_welcome_txt"><![CDATA[Студия это место, где можно настроить свой сайт: добавлять приложения и управлять ими; управлять языками и изменять дизайн; контролировать уровни доступа для пользователей; настраивать страницы и навигацию, а также многое другое. Текущая страница - стартовый экран Студии.]]></string>
+	<string name="_sys_tour_launcher_apps_title"><![CDATA[Добавь новые приложения]]></string>
+	<string name="_sys_tour_launcher_apps_txt"><![CDATA[Приложения это модули, языковые переводы, инструменты, различные дизайны сайта - кирпичики из которых складывается твой уникальный сайт. После скачивания и установки проложения, оно появляется на этой страничке. Приложения дополняют и изменяют функциональность сайта.]]></string>
+	<string name="_sys_tour_launcher_designer_title"><![CDATA[Сделай сайт особенным]]></string>
+    <string name="_sys_tour_launcher_designer_txt"><![CDATA[Дизайнер - это лучшее место, чтобы начать изменять свой сайт. Поменяйте логотоп сайта, выберете дизайн и отредактируйте "Обложку сайта". Сайт сейчас показывает "Обложку" для всех гостей сайта. Можно отредактировать её, или просто отключить, тогда гостям будет показываться полноценная главная страница, как для зарегестрированных пользователей.]]></string>
+    <string name="_sys_tour_launcher_accounts_title"><![CDATA[Больше чем администратор]]></string>
+    <string name="_sys_tour_launcher_accounts_txt"><![CDATA[Администраторы и модераторы могут управлять профилями и их содержимым, это не обязательно должно быть в Студии, куда имеет доступ только оператор сайта. Все что нужно, это назначить права для администраторов и модераторов в "Разрешениях". Чтобы назначить профилю права администратора или модератора, нужно перейти в профиль и нажать "Назначить членство".]]></string>    
+	<string name="_sys_tour_launcher_dashboard_title"><![CDATA[Основная информация под рукой]]></string>
+	<string name="_sys_tour_launcher_dashboard_txt"><![CDATA["Приборная панель" показывает основную информацию о сайте: версию UNA, использование места, инструменты хостинга и кэш. Различные проложения могут добавлять свои блоки на эту страничку.]]></string>
+	<string name="_sys_tour_launcher_builder_page_title"><![CDATA[Перестрой свой сайт под себя]]></string>
+	<string name="_sys_tour_launcher_builder_page_txt"><![CDATA[Построитель страниц позволяет редактировать страницы перемещая, удаляя и добавляя секции на конкретной странице. Можно даже создавать новые страницы различного вида. Также можно контролировать доступ к странице, поисковую оптимизацию, кэш и дизайн страницы.]]></string>
+    <string name="_sys_tour_launcher_builder_permissions_title"><![CDATA[Определи уровни доступа пользователей]]></string>
+    <string name="_sys_tour_launcher_builder_permissions_txt"><![CDATA[Возможно редактировать уровни доступа для членств и создавать новые членства.]]></string>
+	<string name="_sys_tour_launcher_builder_forms_title"><![CDATA[Формируй и переформируй формы]]></string>
+	<string name="_sys_tour_launcher_builder_forms_txt"><![CDATA[Построитель форм это мощный инструмент, который позволяет менять формы сайта и базы данных. Возможно создавать списки, новые поля для форм и различные представления одной и той-же формы (такие как добавление, редактирование и др.). Формы определяют структуру и тему Вашего сайта.]]></string>
+	<string name="_sys_tour_launcher_builder_menus_title"><![CDATA[Показывай что угодно]]></string>
+	<string name="_sys_tour_launcher_builder_menus_txt"><![CDATA[Добавляй новые пункты в навигационное меню и меняй существующие. Возможно редактировать ссылки, передвигать их, менять иконки, а также контролировать видимость пунктов в зависимости от членства пользователя.]]></string>
+	<string name="_sys_tour_launcher_polyglot_title"><![CDATA[Говори на их языке]]></string>
+	<string name="_sys_tour_launcher_polyglot_txt"><![CDATA["Величайшее богатство народа — его язык". Полиглот позволяет поменять язык сайта, формат даты и времени, редактировать слова и фразы для всех языков и даже редактировать шаблоны писем.]]></string>
+	<string name="_sys_tour_launcher_reorganize_title"><![CDATA[<i class="sys-icon move"></i> Реорганизуй приложения]]></string>
+	<string name="_sys_tour_launcher_reorganize_txt"><![CDATA[Активируй этот режим, чтобы передвигать приложения и удалять неактивные.]]></string>
+	<string name="_sys_tour_launcher_favourites_title"><![CDATA[<i class="sys-icon star"></i> Выбери лучшие]]></string>
+	<string name="_sys_tour_launcher_favourites_txt"><![CDATA[В Студии может быть сотни приложений, выбери те, которыми пользуешся чаще всего. Их можно отфильтровать нажав на иконку звезды.]]></string>
+	<string name="_sys_tour_launcher_add_apps_title"><![CDATA[<i class="sys-icon plus"></i> А сейчас, добавь новые приложения!]]></string>
+	<string name="_sys_tour_launcher_add_apps_txt"><![CDATA[В UNA уже входят самые необходимые приложения. Выбери нужные, скачай и затем проинсталлируй приложения, чтобы добавить разные виды профайлов, модулей, системных утилит, языков и дизайнов. Проинсталлированные приложения можно активировать и деактивировать. UNA очень гибкий и имеет модульную архитектуру, тем самым позволяя создать сайт мечты выбрав нужную функциональность, настройки и структуру базы данных. Но даже не меняя ничего вы получите прекрасно фунционирующий сайт!]]></string>
+
+	<string name="_sys_tour_homepage_welcome_title"><![CDATA[Это главная страница сайта]]></string>
+	<string name="_sys_tour_homepage_welcome_txt"><![CDATA[В самом начале, тут не много информации, но после инсталляции нескольких модулей, добавлении дополнительных секций на страницу из Студии и добавлении содержимого - сайт оживёт!]]></string>
+	<string name="_sys_tour_homepage_account_menu_title"><![CDATA[Узнай меню своей учётной записи]]></string>
+	<string name="_sys_tour_homepage_account_menu_txt"><![CDATA[Здесь можно добавлять и управлять профилями, следить за уведомлениями, открывать настройки своей учётной записи. Администраторы и модераторы сайта могут использовать это меню, чтобы открыть приборную панель со ссылками по администрации сайта.]]></string>
+
+	<string name="_sys_txt_access_denied"><![CDATA[Доступ запрещён]]></string>
+	<string name="_sys_txt_account_pending"><![CDATA[Ваш аккаунт ожидает одобрения, пожалуйста, дождитесь его активации.]]></string>
+	<string name="_sys_txt_account_profile_context_change_suggestion"><![CDATA[Это Ваш профиль, Вы можете <a href="{0}">изменить свой текущий профиль</a> на этот]]></string>
+  <string name="_sys_txt_account_profile_context_change_to_another_suggestion"><![CDATA[Вы можете <a href="{0}">изменить свой текущий профиль</a> на этот]]></string>
+	<string name="_sys_txt_account_profile_context_changed_success"><![CDATA[Текущий профиль удачно изменён на: <b>{0}</b>]]></string>
+	<string name="_sys_txt_account_suspended"><![CDATA[Ваш аккаунт заблокирован.]]></string>
+	<string name="_sys_txt_account_unconfirmed_email"><![CDATA[Ваш email не подтверждён. Пожалуйста, проверьте свой эл. ящик ({1}) на наличие письма подтверждения и перейдите по ссылке в нём. <br />Не можете найти письмо? Проверьте папку "спам" или <a href="{0}">снова запросите письмо верификации</a>.]]></string>
+	<string name="_sys_txt_account_unconfirmed_phone"><![CDATA[Ваш телефон не подтверждён. Пожалуйста, подтвердите его на  <a href="{0}">странице верификации</a>.]]></string>
+	<string name="_sys_txt_account_profile_system"><![CDATA[Пожалуйста, <a href="{0}">создайте профиль</a>, чтобы начать пользоваться сайтом.]]></string>
+	<string name="_sys_txt_captcha_not_available"><![CDATA[CAPTCHA недоступна]]></string>
+    <string name="_sys_txt_change_image"><![CDATA[Изменить картинку]]></string>
+    <string name="_sys_txt_cmt_loading"><![CDATA[Загрузка...]]></string>
+	<string name="_sys_txt_confirm_email_already_confirmed"><![CDATA[Ваш email уже подтверждён.]]></string>
+	<string name="_sys_txt_confirm_email_desc"><![CDATA[Пожалуйста, введите код подтверждения, который был послан на Ваш эл. адрес, или просто перейдите по ссылке в присланном сообщении.]]></string>
+	<string name="_sys_txt_confirm_email_error_occured"><![CDATA[Произошла ошибка, пожалуйста, войдите в свой аккаунт и снова запросите письмо верификации.]]></string>
+	<string name="_sys_txt_confirm_email_sent"><![CDATA[Письмо верификации было отослано, пожалуйста, проверьте свой эл. ящик.]]></string>
+	<string name="_sys_txt_confirm_email_sent_failed"><![CDATA[Произошла ошибка, пожалуйста, уведомите о ней администратора сайта.]]></string>
+	<string name="_sys_txt_confirm_email_success"><![CDATA[Ваш эл. адрес был удачно подтверждён.]]></string>
+	
+	<string name="_sys_txt_confirm_phone_already_confirmed"><![CDATA[Ваш телефон уже подтверждён.]]></string>
+	<string name="_sys_txt_confirm_phone_set_phone_error_occured"><![CDATA[Произошла ошибка, пожалуйста, войдите в свой аккаунт и снова перейдите на страничку верификации.]]></string>
+	<string name="_sys_txt_confirm_phone_send_sms_error_occured"><![CDATA[Произошла ошибка, пожалуйста, уведомите о ней администратора сайта.]]></string>
+	<string name="_sys_txt_confirm_phone_sms_text"><![CDATA[Ваш код проверки телефона - {0}.]]></string>
+	<string name="_sys_txt_confirm_phone_confirm_success"><![CDATA[Ваш телефон успешно подтверждён.]]></string>
+	<string name="_sys_txt_confirm_phone_set_phone_desc_set_phone"><![CDATA[Пожалуйста, введите телефонный номер на который будет отправлено SMS с кодом подтверждения.]]></string>
+	<string name="_sys_txt_confirm_phone_set_phone_desc_phone_confirmation"><![CDATA[Пожалуйста, введите код проверки из SMS]]></string>
+
+	<string name="_sys_txt_create_post_placeholder"><![CDATA[Что нового, {0}]]></string>
+
+    <string name="_sys_txt_current_picture"><![CDATA[Текущая картинка]]></string>
+	<string name="_sys_txt_data_successfully_submitted"><![CDATA[Выполнено]]></string>
+    <string name="_sys_txt_delete"><![CDATA[Удалить]]></string>
+    <string name="_sys_txt_discard"><![CDATA[Отменить]]></string>
+	<string name="_sys_txt_empty"><![CDATA[Пусто]]></string>
+	<string name="_sys_txt_error_account_creation"><![CDATA[Не удалось создать аккаунт]]></string>
+	<string name="_sys_txt_error_account_delete"><![CDATA[Не удалось удалить аккаунт]]></string>
+	<string name="_sys_txt_error_account_is_not_defined"><![CDATA[Аккаунт не определён]]></string>
+	<string name="_sys_txt_error_account_update"><![CDATA[Не удалось обновить аккаунт]]></string>
+
+	<string name="_sys_txt_error_entry_creation"><![CDATA[Ошибка создания элемента]]></string>
+	<string name="_sys_txt_error_entry_delete"><![CDATA[Ошибка удаления элемента]]></string>
+	<string name="_sys_txt_error_entry_is_not_defined"><![CDATA[Запрашиваемый ресурс не существует]]></string>
+	<string name="_sys_txt_error_entry_update"><![CDATA[Ошибка обновления элемента]]></string>
+	<string name="_sys_txt_error_occured"><![CDATA[Произошла ошибка]]></string>
+	<string name="_sys_txt_forgot_pasword"><![CDATA[Забыли пароль?]]></string>
+	<string name="_sys_txt_forgot_pasword_check_email"><![CDATA[Email отослан, пожалуйста, следуйте инструкциям в нём.]]></string>
+	<string name="_sys_txt_forgot_pasword_check_phone"><![CDATA[SMS отослано, пожалуйста, следуйте инструкциям в нём.]]></string>
+	<string name="_sys_txt_forgot_pasword_desc"><![CDATA[Введите эл. адрес своего аккаунта, чтобы запросить ссылку на изменение пароля.]]></string>
+	<string name="_sys_txt_forgot_pasword_by_both_desc"><![CDATA[Введите эл. адрес или телефон своего аккаунта, чтобы запросить ссылку на изменение пароля.]]></string>
+	<string name="_sys_txt_forgot_pasword_by_phone_desc"><![CDATA[Введите телефон своего аккаунта, чтобы запросить ссылку на изменение пароля.]]></string>
+	<string name="_sys_txt_forgot_pasword_email_send_failed"><![CDATA[Не удалось отослать email, пожалуйста, попытайтесь позднее.]]></string>
+	<string name="_sys_txt_forgot_pasword_error_occured"><![CDATA[Произошла ошибка, пожалуйста, уведомите о ней администратора сайта.]]></string>
+	<string name="_sys_txt_forgot_pasword_sms_text"><![CDATA[Чтобы восстановить пароль нажмите на ссылку {0}]]></string>
+
+    <string name="_sys_txt_form_entry_input_picture_delete"><![CDATA[Удалить]]></string>
+    <string name="_sys_txt_form_entry_input_picture_insert"><![CDATA[Вставить в сообщение]]></string>
+	<string name="_sys_txt_form_entry_input_picture_pic_url"><![CDATA[URL прикрепления:]]></string>
+    <string name="_sys_txt_form_entry_input_picture_use_as_thumb"><![CDATA[Использовать в качестве миниатюры]]></string>
+	<string name="_sys_txt_form_submission_error"><![CDATA[Неправильная информация. Пожалуйста, проверьте ввод и отправьте снова.]]></string>
+	<string name="_sys_txt_form_submission_error_csrf_expired"><![CDATA[Маркер устарел. Пожалуйста попробуйте снова.]]></string>
+
+    <string name="_sys_txt_homepage_cover"><![CDATA[Сплоченность людей — нерушимая крепость.<br /><button class="bx-btn bx-hide-when-logged-in bx-def-margin-top" onclick="document.location='{0}'">Присоединиться!</button>]]></string>
+    <string name="_sys_txt_login_2fa_description"><![CDATA[Двухэтапная авторизация включена. В дополнении к email-у и паролю, Вам нужно будет ввести код проверки, который мы вышлем вам в SMS.]]></string>
+	<string name="_sys_txt_login_2fa_sms_text"><![CDATA[Ваш код проверки {0}.]]></string>
+	<string name="_sys_txt_login_2fa_sms_error_occured"><![CDATA[Произошла ошибка, пожалуйста, уведомите о ней администратора сайта.]]></string>
+	<string name="_sys_txt_join_description"><![CDATA[Уже зарегистрировались? <a href="{0}">Заходите.</a>]]></string>
+	<string name="_sys_txt_login_description"><![CDATA[Ещё нет аккаунта? <a href="{0}">Зарегистрируйтесь.</a>]]></string>
+	<string name="_sys_txt_login_error"><![CDATA[Введённый email или пароль неправильны. Пожалуйста, попытайтесь снова.]]></string>
+  <string name="_sys_txt_login_locked"><![CDATA[Ваш аккаунт заблокирован, для разблокировки, пожалуйста, используйте  <a href="{0}">страницу сброса пароля</a>.]]></string>
+	<string name="_sys_txt_login_invalid_role"><![CDATA[Доступ запрещён]]></string>
+    <string name="_sys_txt_my_profiles"><![CDATA[Создать новый профайл]]></string>
+    <string name="_sys_txt_new_picture"><![CDATA[Новая картинка]]></string>
+    <string name="_sys_txt_no_picture_uploaded"><![CDATA[Картинка не загружена]]></string>
+    <string name="_sys_txt_no_title"><![CDATA[Без заголовка]]></string>
+    <string name="_sys_txt_n_by"><![CDATA[{0}]]></string>
+    <string name="_sys_txt_n_friends"><![CDATA[{0} друзей]]></string>
+    <string name="_sys_txt_n_mutual_friends"><![CDATA[{0} общих друзей]]></string>
+    <string name="_sys_txt_one_mutual_friend"><![CDATA[<a href="{0}">{1}</a> общий друг]]></string>
+    <string name="_sys_txt_powered_by"><![CDATA[Сделано с помощью UNA - системя для управления сообществами]]></string>
+	<string name="_sys_txt_reset_pasword_email_send_failed"><![CDATA[Ваш новый пароль <b>{0}</b>. Пожалуйста, сохраните его в надёжном месте, так как нам не удалось отослать Вам его по эл. почте. Вы можете его поменять при первом входе в аккаунт.]]></string>
+	<string name="_sys_txt_reset_pasword_email_sent"><![CDATA[Ваш новый пароль - <b>{0}</b> - был отослан Вам по эл. почте. Вы можете его поменять при первом входе в аккаунт.]]></string>
+	<string name="_sys_txt_reset_pasword_error_occured"><![CDATA[Произошла ошибка, пожалуйста <a href="{0}">попытайтесь снова</a>.]]></string>
+        <string name="_sys_txt_splash_btn_join"><![CDATA[Зарегистрироваться]]></string>
+	<string name="_sys_txt_splash_slide01_title"><![CDATA[Узнайте людей, которые разделяют Ваши увлечения]]></string>
+	<string name="_sys_txt_splash_slide01_desc"><![CDATA[Истории, идеи, фотографии, видео, вопросы, шутки, обсуждения, что угодно.<br />Следите за интересными людьми и будьте интересными для других.]]></string>
+	<string name="_sys_txt_splash_slide02_txt"><![CDATA["Присядь на стул. Попробуй.<br />Зарегистрируйся. Жизнь такая<br />сладкая."]]></string>
+	<string name="_sys_txt_splash_slide03_txt"><![CDATA["Лучший способ завести друзей - быть кому-то другом."]]></string>
+        <string name="_sys_txt_splash_slide04_txt"><![CDATA[Уже один из нас?]]></string>
+	<string name="_sys_txt_splash_title"><![CDATA[Присоединяйся. Делись. Создавай.]]></string>
+	<string name="_sys_txt_splash_slogan"><![CDATA[Вступай в наше сообщество сейчас, чтобы найти единомышленников, дулиться захватывающими новостями и создавать вдохновляющий контент.]]></string>
+        <string name="_sys_txt_splash_login"><![CDATA[Войти]]></string>
+        <string name="_sys_txt_splash_join"><![CDATA[Зарегистрироваться]]></string>
+	<string name="_sys_txt_splash_connect"><![CDATA[Присоединяйся]]></string>
+        <string name="_sys_txt_splash_connect_text"><![CDATA[Найди единомышленников, новых друзей, слуди за интересными авторами и будь в курсе событий, где бы ты ни был.]]></string>
+        <string name="_sys_txt_splash_share"><![CDATA[Делись]]></string>
+        <string name="_sys_txt_splash_share_text"><![CDATA[Рассказывай последние новости, делись интересными статьями, восхитительными сайтами, классными фотографиями и потрясающими видео.]]></string>
+        <string name="_sys_txt_splash_create"><![CDATA[Создавай]]></string>
+        <string name="_sys_txt_splash_create_text"><![CDATA[Создай свой профайл, изменяй статус, пиши заметки, создавай голосования и загружай медиа альбомы.]]></string>
+        <string name="_sys_txt_switch_profile_context"><![CDATA[Переключиться]]></string>
+	<string name="_sys_txt_unsubscribe_email_settings_update_success"><![CDATA[Ваши email-установки были удачно обновлены.]]></string>
+	<string name="_sys_txt_unsubscribe_error_occured"><![CDATA[Произошла ошибка, пожалуйста, зайдите в свой аккаунт и обновите email-установки или свяжитесь с администратором сайта, чтобы он Вас отписал вручную.]]></string>
+	<string name="_sys_txt_unsubscribe_info"><![CDATA[Обновить email-установки для <b>{0}</b>]]></string>
+        <string name="_sys_txt_unsubscribe_wrong_link"><![CDATA[Ссылка отписки неправильная.]]></string>
+        <string name="_sys_txt_user_n"><![CDATA[Пользователь #{0}]]></string>
+        <string name="_sys_txt_reports_title"><![CDATA[Жалобы]]></string>
+        <string name="_sys_unconfirmed"><![CDATA[Неподтвержденный]]></string>
+	<string name="_sys_upgrade_conclusion"><![CDATA[<h3>Важная информация:</h3><p>{0}</p>]]></string>
+	<string name="_sys_upgrade_db_and_files_versions_different"><![CDATA[База данных и версии файлов отличаются, возможно, предыдущий патч не был правильно применён.]]></string>
+	<string name="_sys_upgrade_files_checksum_failed"><![CDATA[Невозможно применить обновление, так как следующие файлы были изменены: {0}]]></string>
+	<string name="_sys_upgrade_files_checksum_failed_too_many"><![CDATA[Невозможно применить обновление, потому что слишком много файлов ({0}%) было изменено]]></string>
+	<string name="_sys_upgrade_files_checksum_failed_too_many_module"><![CDATA[Невозможно применить обновление, потому что слишком много файлов ({0}%) было изменено в {1} модуле]]></string>
+	<string name="_sys_upgrade_get_version_info_failed"><![CDATA[Невозможно получить информацию о версии. Пожалуйста, проверьте соединение с Интернетом на веб-сервере или в брандмауэре.]]></string>
+        <string name="_sys_upgrade_modules_upgrade_first"><![CDATA[Некоторые из ваших модулей устарели. Для начала Вам нужно обновить их в Студии &gt; Магазин приложений &gt; Обновления.]]></string>
+	<string name="_sys_upgrade_patch_checksum_failed"><![CDATA[Проверочная сумма загруженного патч-файла неверна]]></string>
+	<string name="_sys_upgrade_patch_download_failed"><![CDATA[Не удалось скачать патч или скачанный файл не может быть сохранён]]></string>
+	<string name="_sys_upgrade_patch_invalid"><![CDATA[Неправильный патч, он не может быть применён для Вашей версии или имеет неправильную структуру файлов.]]></string>
+	<string name="_sys_upgrade_patch_unpack_failed"><![CDATA[Не удалось распаковать патч]]></string>
+	<string name="_sys_uploader_button_name_single"><![CDATA[Загрузить файл]]></string>
+	<string name="_sys_uploader_close"><![CDATA[Закрыть]]></string>
+	<string name="_sys_uploader_confirm_close_popup"><![CDATA[О нет! Вы уверены? Это может прервать загрузку файлов.]]></string>
+    <string name="_sys_uploader_confirm_leaving_page"><![CDATA[Загрузка в процессе! Не закрывайте эту страницу, или загрузка будет прервана на полпути.]]></string>
+    <string name="_sys_uploader_crop_button_name"><![CDATA[Загрузить и обрезать]]></string>
+    <string name="_sys_uploader_crop_rotate_left"><![CDATA[Повернуть налево]]></string>
+	<string name="_sys_uploader_crop_rotate_right"><![CDATA[Повернуть направо]]></string>
+	<string name="_sys_uploader_crop_submit_button"><![CDATA[Загрузить]]></string>    
+    <string name="_sys_uploader_crop_title"><![CDATA[Обрезка картинки]]></string>
+    <string name="_sys_uploader_crop_err_upload"><![CDATA[Ошибка загрузки.]]></string>
+    <string name="_sys_uploader_crop_wrong_ext"><![CDATA[Неправильное расширение файла, можно обрезать только изображения в формате: jpg, jpeg, png, gif.]]></string>
+	<string name="_sys_uploader_err_msg"><![CDATA[Ой! Случилась проблема с файлом {0}: {1}]]></string>
+	<string name="_sys_uploader_html5_button_name"><![CDATA[Множественная загрузка]]></string>
+	<string name="_sys_uploader_html5_drop_area"><![CDATA[Перетащите файлы сюда для загрузки]]></string>
+	<string name="_sys_uploader_html5_shoose_file"><![CDATA[Выбрать файл]]></string>
+    <string name="_sys_uploader_html5_title"><![CDATA[Множественная загрузка]]></string>
+    <string name="_sys_uploader_html5_default_message"><![CDATA[Перетащите сюда файлы для загрузки]]></string>
+    <string name="_sys_uploader_html5_file_is_too_big"><![CDATA[Файл слишком большой - {{filesize}} МБ, максимальный размер - {{maxFilesize}} МБ.]]></string>
+    <string name="_sys_uploader_html5_number_of_files_exceeded"><![CDATA[Количество загружаемых файлов ограничено.]]></string>
+    <string name="_sys_uploader_html5_invalid_file_type"><![CDATA[Неправильный тип файла.]]></string>
+	<string name="_sys_uploader_simple_attach_one_more_file"><![CDATA[+ Добавить ещё файлы]]></string>
+	<string name="_sys_uploader_simple_button_name"><![CDATA[Обычная загрузка]]></string>
+	<string name="_sys_uploader_simple_submit_button"><![CDATA[Загрузить]]></string>
+	<string name="_sys_uploader_simple_title"><![CDATA[Обычная загрузка]]></string>
+	<string name="_sys_uploader_upload_canceled"><![CDATA[Очень жаль. Загрузка прервана.]]></string>
+	<string name="_sys_edit_profile"><![CDATA[Редактировать профиль]]></string>    
+	<string name="_sys_exit"><![CDATA[Закончить]]></string>    
+	<string name="_sys_warn"><![CDATA[предупреждение]]></string>
+	<string name="_sys_x_days"><![CDATA[{0} дней]]></string>
+	<string name="_to"><![CDATA[кому]]></string>
+	<string name="_top"><![CDATA[Топ]]></string>
+	<string name="_uknown"><![CDATA[неизвестно]]></string>
+	<string name="_undefined"><![CDATA[неопределено]]></string>
+	<string name="_view_counter"><![CDATA[{0}]]></string>
+	<string name="_view_do_view"><![CDATA[Посмотреть]]></string>
+	<string name="_view_do_view_by"><![CDATA[Просмотрено]]></string>
+	<string name="_view_do_view_by_counter"><![CDATA[{0} просмотров]]></string>
+	<string name="_view_n_views"><![CDATA[{0} просмотров]]></string>
+	<string name="_vote_counter"><![CDATA[{0}]]></string>
+	<string name="_vote_do_like"><![CDATA[Спасибо!]]></string>
+	<string name="_vote_do_unlike"><![CDATA[Нет, спасибо]]></string>
+	<string name="_vote_do_by"><![CDATA[Поблагодарили]]></string>
+        <string name="_vote_do_by_reactions"><![CDATA[Отреагировали]]></string>
+        <string name="_vote_do_by_x_reaction"><![CDATA["{0}" от]]></string>
+        <string name="_vote_do_by_summary"><![CDATA[Все]]></string>
+	<string name="_vote_err_not_enabled"><![CDATA[Ваш голос не может быть принят в данный момент. Пожалуйста, попробуйте позднее.]]></string>
+	<string name="_vote_err_duplicate_vote"><![CDATA[Повторный голос]]></string>
+        <string name="_vote_n_votes"><![CDATA[{0} голосов]]></string>
+	<string name="_week_fri"><![CDATA[Пятница]]></string>
+	<string name="_week_mon"><![CDATA[Понедельник]]></string>
+	<string name="_week_sat"><![CDATA[Суббота]]></string>
+	<string name="_week_sun"><![CDATA[Воскресенье]]></string>
+	<string name="_week_thu"><![CDATA[Четверг]]></string>
+	<string name="_week_tue"><![CDATA[Вторник]]></string>
+    <string name="_week_wed"><![CDATA[Среда]]></string>
+    <string name="_sys_option_labels"><![CDATA[Метки]]></string>
+	<string name="_sys_option_per_page_browse_showcase"><![CDATA[Количество позиций при отображении витриной]]></string>
+  <string name="_sys_option_per_page_browse_recommended"><![CDATA[Количество позиций при отображении рекомендованных]]></string>
+  <string name="_sys_javascript_requred"><![CDATA[Для корректной работы нужен включенный JavaScript! Пожалуйста, включите его в барузере!]]></string>
+	<string name="_sys_wiki_system_title"><![CDATA[Системная Вики]]></string>
+	<string name="_sys_wiki_error_page_exists"><![CDATA[Страница с таким именем ({0}) уже существует]]></string>
+    <string name="_sys_wiki_error_no_rev"><![CDATA[Ревизия {0} для {1} языка не существует]]></string>
+    <string name="_sys_wiki_error_no_revs"><![CDATA[Нет ревизий для данного блока]]></string>
+    <string name="_sys_wiki_error_missing_wiki_object"><![CDATA[Вики объект ({0}) не найден]]></string>
+    <string name="_sys_wiki_error_action_not_allowed"><![CDATA[Не разрешенное действие ({0}) для вики объекта ({1})]]></string>
+    <string name="_sys_wiki_error_incorrect_page_uri"><![CDATA["{0}" - неправильная ссылка на страницу]]></string>
+    <string name="_sys_wiki_error_no_such_lang"><![CDATA[Нет такого языка]]></string>
+    <string name="_sys_wiki_error_occured"><![CDATA[Ошибка (код:{0})]]></string>
+    <string name="_sys_wiki_view_rev"><![CDATA[Версия <b>{0}</b> от <a href="{1}">{2}</a>, {3}]]></string>
+    <string name="_sys_wiki_lang_mask"><![CDATA[{0} {1} <span class="bx-def-font-grayed bx-def-font-small">{2}</span>]]></string>
+    <string name="_sys_wiki_lang_mask_warn"><![CDATA[{0} {1} <span class="bx-def-font-small" style="color:red;">{2}</span>]]></string>
+    <string name="_sys_wiki_lang_missing"><![CDATA[отсутствует]]></string>
+    <string name="_sys_wiki_revisions_deleted"><![CDATA[{0} ревизий было удалено]]></string>
+    <string name="_sys_wiki_confirm_block_deletion"><![CDATA[Подтвердите удаление блока со всей историей и переводами?]]></string>
+    <string name="_sys_wiki_block_deleted"><![CDATA[Блок был успешно удален]]></string>
+    <string name="_sys_wiki_add_block"><![CDATA[Добавить блок]]></string>
+	<string name="_sys_wiki_add_page"><![CDATA[Добавить страницу]]></string>
+	<string name="_sys_wiki_add_page_text"><![CDATA[Такой вики страницы не существует.]]></string>
+	<string name="_sys_wiki_no_missing_translations"><![CDATA[Все переводы на {0} язык присутствуют.]]></string>
+	<string name="_sys_wiki_all_translations_up_to_date"><![CDATA[Все переводы на {0} язык обновлены.]]></string>
+    <string name="_sys_wiki_title_title"><![CDATA[Страница]]></string>
+    <string name="_sys_wiki_title_lang_missing"><![CDATA[Отсут. язык]]></string>
+    <string name="_sys_wiki_title_author"><![CDATA[{0} автор]]></string>
+    <string name="_sys_wiki_title_content"><![CDATA[{0} содержимое]]></string>
+    <string name="_sys_wiki_title_time"><![CDATA[{0} обновлен]]></string>
+    <string name="_sys_wiki_orig"><![CDATA[Ориг.]]></string>
+</resources>

+ 71 - 0
modules/boonex/russian/updates/11.0.3_11.0.4/source/install/config.php

@@ -0,0 +1,71 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Russian Russian language
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_LANGUAGE,
+    'name' => 'bx_ru',
+    'title' => 'Russian',
+    'note' => 'Language file',
+    'version' => '11.0.4',
+    'vendor' => 'Boonex',
+    'help_url' => 'http://feed.una.io/?section={module_name}',
+
+    'compatible_with' => array(
+        '11.0.x'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/russian/',
+    'home_uri' => 'ru',
+
+    'db_prefix' => 'bx_rsn_',
+    'class_prefix' => 'BxRsn',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'BoonEx Russian',
+
+    /**
+     * Installation/Uninstallation Section.
+     * NOTE. The sequence of actions is critical. Don't change the order.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'install_language' => 1,
+        'clear_db_cache' => 1
+    ),
+    'uninstall' => array (
+        'update_languages' => 1,
+        'execute_sql' => 1,
+        'clear_db_cache' => 1
+    ),
+    'enable' => array(
+        'execute_sql' => 1
+    ),
+    'disable' => array(
+        'execute_sql' => 1
+    ),
+
+    /**
+     * Dependencies Section
+     */
+    'dependencies' => array(),
+
+);
+
+/** @} */

+ 51 - 0
modules/boonex/spaces/updates/11.0.0_11.0.1/install/config.php

@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'title' => 'Spaces',
+    'version_from' => '11.0.0',
+    'version_to' => '11.0.1',
+    'vendor' => 'BoonEx',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/spaces/updates/update_11.0.0_11.0.1/',
+    'home_uri' => 'spaces_update_1100_1101',
+
+    'module_dir' => 'boonex/spaces/',
+    'module_uri' => 'spaces',
+
+    'db_prefix' => 'bx_spaces_',
+    'class_prefix' => 'BxSpaces',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 0,
+        'update_files' => 1,
+        'update_languages' => 0,
+        'clear_db_cache' => 0,
+    ),
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Spaces',
+
+    /**
+     * Files Section
+     */
+    'delete_files' => array(),
+);

+ 13 - 0
modules/boonex/spaces/updates/11.0.0_11.0.1/install/installer.php

@@ -0,0 +1,13 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+class BxSpacesUpdater extends BxDolStudioUpdater
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+}

+ 225 - 0
modules/boonex/spaces/updates/11.0.0_11.0.1/source/classes/BxSpacesConfig.php

@@ -0,0 +1,225 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defdroup    Spaces Spaces
+ * @indroup     UnaModules
+ *
+ * @{
+ */
+
+class BxSpacesConfig extends BxBaseModGroupsConfig
+{
+    function __construct($aModule)
+    {
+        parent::__construct($aModule);
+
+        $this->_aMenuItems2MethodsActions = array_merge($this->_aMenuItems2MethodsActions, array(
+            'view-space-profile' => 'checkAllowedView',
+            'edit-space-profile' => 'checkAllowedEdit',
+            'edit-space-cover' => 'checkAllowedChangeCover',
+            'invite-to-space' => 'checkAllowedInvite',
+            'delete-space-profile' => 'checkAllowedDelete'
+        ));
+
+        $this->CNF = array (
+
+            // module icon
+            'ICON' => 'object-group col-red2',
+
+            // database tables
+            'TABLE_ENTRIES' => $aModule['db_prefix'] . 'data',
+            'TABLE_ENTRIES_FULLTEXT' => 'search_fields',
+            'TABLE_ADMINS' => $aModule['db_prefix'] . 'admins',
+            'TABLE_INVITES' => $aModule['db_prefix'] . 'invites',
+
+            // database fields
+            'FIELD_ID' => 'id',
+            'FIELD_AUTHOR' => 'author',
+            'FIELD_ADDED' => 'added',
+            'FIELD_CHANGED' => 'changed',
+            'FIELD_NAME' => 'space_name',
+            'FIELD_PARENT' => 'parent_space',
+            'FIELD_LEVEL' => 'level',
+            'FIELD_TITLE' => 'space_name',
+            'FIELD_TEXT' => 'space_desc',
+            'FIELD_PICTURE' => 'picture',
+            'FIELD_COVER' => 'cover',
+            'FIELD_JOIN_CONFIRMATION' => 'join_confirmation',
+            'FIELD_ALLOW_VIEW_TO' => 'allow_view_to',
+            'FIELD_ALLOW_POST_TO' => 'allow_post_to',
+            'FIELD_VIEWS' => 'views',
+            'FIELD_COMMENTS' => 'comments',
+            'FIELDS_QUICK_SEARCH' => array('space_name'),
+            'FIELD_LOCATION' => 'location',
+            'FIELD_LOCATION_PREFIX' => 'location',
+            'FIELDS_WITH_KEYWORDS' => 'auto', // can be 'auto', array of fields or comma separated string of field names, works only when OBJECT_METATAGS is specified
+            'FIELD_LABELS' => 'labels',
+
+            // page URIs
+            'URI_VIEW_ENTRY' => 'view-space-profile',
+            'URI_EDIT_ENTRY' => 'edit-space-profile',
+            'URI_EDIT_COVER' => 'edit-space-cover',
+            'URI_JOINED_ENTRIES' => 'joined-spaces',
+            'URI_MANAGE_COMMON' => 'spaces-manage',
+
+            'URL_HOME' => 'page.php?i=spaces-home',
+            'URL_ENTRY_FANS' => 'page.php?i=space-fans',
+            'URL_MANAGE_COMMON' => 'page.php?i=spaces-manage',
+            'URL_MANAGE_ADMINISTRATION' => 'page.php?i=spaces-administration',
+
+            'PARAM_MULTILEVEL_HIERARCHY' => 'bx_spaces_enable_multilevel_hierarchy',
+            'PARAM_NUM_RSS' => 'bx_spaces_num_rss',
+            'PARAM_NUM_CONNECTIONS_QUICK' => 'bx_spaces_num_connections_quick',
+            'PARAM_SEARCHABLE_FIELDS' => 'bx_spaces_searchable_fields',
+            'PARAM_PER_PAGE_BROWSE_SHOWCASE' => 'bx_spaces_per_page_browse_showcase',
+            'PARAM_PER_PAGE_BROWSE_RECOMMENDED' => 'bx_spaces_per_page_browse_recommended',
+
+            // objects
+            'OBJECT_STORAGE' => 'bx_spaces_pics',
+            'OBJECT_STORAGE_COVER' => 'bx_spaces_pics',
+            'OBJECT_IMAGES_TRANSCODER_THUMB' => 'bx_spaces_thumb',
+            'OBJECT_IMAGES_TRANSCODER_ICON' => 'bx_spaces_icon',
+            'OBJECT_IMAGES_TRANSCODER_AVATAR' => 'bx_spaces_avatar',
+            'OBJECT_IMAGES_TRANSCODER_AVATAR_BIG' => 'bx_spaces_avatar_big',
+            'OBJECT_IMAGES_TRANSCODER_PICTURE' => 'bx_spaces_picture',
+            'OBJECT_IMAGES_TRANSCODER_COVER' => 'bx_spaces_cover',
+            'OBJECT_IMAGES_TRANSCODER_COVER_THUMB' => 'bx_spaces_cover_thumb',
+            'OBJECT_IMAGES_TRANSCODER_GALLERY' => 'bx_spaces_gallery',
+            'OBJECT_VIEWS' => 'bx_spaces',
+            'OBJECT_VOTES' => 'bx_spaces',
+            'OBJECT_SCORES' => 'bx_spaces',
+            'OBJECT_FAVORITES' => 'bx_spaces',
+            'OBJECT_FEATURED' => 'bx_spaces',
+            'OBJECT_COMMENTS' => 'bx_spaces',
+            'OBJECT_REPORTS' => 'bx_spaces',
+            'OBJECT_METATAGS' => 'bx_spaces',
+            'OBJECT_FORM_ENTRY' => 'bx_space',
+            'OBJECT_FORM_ENTRY_DISPLAY_VIEW' => 'bx_space_view',
+            'OBJECT_FORM_ENTRY_DISPLAY_VIEW_FULL' => 'bx_space_view_full', // for "info" tab on view space page
+            'OBJECT_FORM_ENTRY_DISPLAY_ADD' => 'bx_space_add',
+            'OBJECT_FORM_ENTRY_DISPLAY_EDIT' => 'bx_space_edit',
+            'OBJECT_FORM_ENTRY_DISPLAY_EDIT_COVER' => 'bx_space_edit_cover',
+            'OBJECT_FORM_ENTRY_DISPLAY_DELETE' => 'bx_space_delete',
+            'OBJECT_FORM_ENTRY_DISPLAY_INVITE' => 'bx_space_invite',
+            'OBJECT_MENU_ACTIONS_VIEW_ENTRY' => 'bx_spaces_view_actions', // actions menu on view entry page
+            'OBJECT_MENU_ACTIONS_VIEW_ENTRY_MORE' => 'bx_spaces_view_actions_more', // actions menu on view entry page for "more" popup
+            'OBJECT_MENU_ACTIONS_VIEW_ENTRY_ALL' => 'bx_spaces_view_actions_all', // all actions menu on view entry page
+            'OBJECT_MENU_ACTIONS_MY_ENTRIES' => 'bx_spaces_my', // actions menu on profile entries page
+            'OBJECT_MENU_SUBMENU' => 'bx_spaces_submenu', // main module submenu
+            'OBJECT_MENU_SUBMENU_VIEW_ENTRY' => 'bx_spaces_view_submenu',  // view entry submenu
+            'OBJECT_MENU_SUBMENU_VIEW_ENTRY_COVER' => 'bx_spaces_view_submenu_cover',  // view entry submenu displayed in cover
+            'OBJECT_MENU_SUBMENU_VIEW_ENTRY_MAIN_SELECTION' => 'spaces-home', // first item in view entry submenu from main module submenu
+            'OBJECT_MENU_SNIPPET_META' => 'bx_spaces_snippet_meta', // menu for snippet meta info
+            'OBJECT_MENU_MANAGE_TOOLS' => 'bx_spaces_menu_manage_tools', //manage menu in content administration tools
+            'OBJECT_PAGE_VIEW_ENTRY' => 'bx_spaces_view_profile',
+            'OBJECT_PAGE_VIEW_ENTRY_CLOSED' => 'bx_spaces_view_profile_closed',
+            'OBJECT_PRIVACY_VIEW' => 'bx_spaces_allow_view_to',
+            'OBJECT_PRIVACY_VIEW_NOTIFICATION_EVENT' => 'bx_spaces_allow_view_notification_to',
+            'OBJECT_PRIVACY_POST' => 'bx_spaces_allow_post_to',
+            'OBJECT_GRID_ADMINISTRATION' => 'bx_spaces_administration',
+            'OBJECT_GRID_COMMON' => 'bx_spaces_common',
+            'OBJECT_GRID_CONNECTIONS' => 'bx_spaces_fans',
+             'OBJECT_GRID_INVITES' => 'bx_spaces_invites',
+            'OBJECT_CONNECTIONS' => 'bx_spaces_fans',
+            'OBJECT_UPLOADERS_COVER' => array('bx_spaces_cover_crop'),
+            'OBJECT_UPLOADERS_PICTURE' => array('bx_spaces_picture_crop'),
+            
+            'BADGES_AVALIABLE' => true,
+            'INVITES_KEYS_LIFETIME' => 86400,
+
+            'EMAIL_INVITATION' => 'bx_spaces_invitation',
+            'EMAIL_JOIN_REQUEST' => 'bx_spaces_join_request',
+            'EMAIL_JOIN_CONFIRM' => 'bx_spaces_join_confirm',
+            'EMAIL_FAN_BECOME_ADMIN' => 'bx_spaces_fan_become_admin',
+            'EMAIL_ADMIN_BECOME_FAN' => 'bx_spaces_admin_become_fan',
+            'EMAIL_FAN_REMOVE' => 'bx_spaces_fan_remove',
+            'EMAIL_JOIN_REJECT' => 'bx_spaces_join_reject',
+
+            'TRIGGER_MENU_PROFILE_VIEW_SUBMENU' => 'trigger_group_view_submenu',
+            'TRIGGER_MENU_PROFILE_SNIPPET_META' => 'trigger_group_snippet_meta',
+            'TRIGGER_MENU_PROFILE_VIEW_ACTIONS' => 'trigger_group_view_actions',
+            'TRIGGER_PAGE_VIEW_ENTRY' => 'trigger_page_group_view_entry',
+
+            // menu items which visibility depends on custom visibility checking
+            'MENU_ITEM_TO_METHOD' => array (
+                'bx_spaces_view_actions' => $this->_aMenuItems2MethodsActions,
+                'bx_spaces_view_actions_more' => $this->_aMenuItems2MethodsActions,
+                'bx_spaces_view_actions_all' => $this->_aMenuItems2MethodsActions,
+            ),
+
+            // informer messages
+            'INFORMERS' => array (
+                'status' => array (
+                    'name' => 'bx-spaces-status-not-active',
+                    'map' => array (
+                        BX_PROFILE_STATUS_PENDING => '_bx_spaces_txt_account_pending',
+                        BX_PROFILE_STATUS_SUSPENDED => '_bx_spaces_txt_account_suspended',
+                    ),
+                ),
+            ),
+
+            // some language keys
+            'T' => array (
+                'txt_sample_single' => '_bx_spaces_txt_sample_single',
+                'txt_sample_single_with_article' => '_bx_spaces_txt_sample_single_with_article',
+                'txt_sample_comment_single' => '_bx_spaces_txt_sample_comment_single',
+                'txt_sample_vote_single' => '_bx_spaces_txt_sample_vote_single',
+                'txt_sample_score_up_single' => '_bx_spaces_txt_sample_score_up_single',
+                'txt_sample_score_down_single' => '_bx_spaces_txt_sample_score_down_single',
+                'txt_private_group' => '_bx_spaces_txt_private_space',
+                'txt_N_fans' => '_bx_spaces_txt_N_fans',
+                'txt_ntfs_join_request' => '_bx_spaces_txt_ntfs_join_request',
+                'txt_ntfs_fan_added' => '_bx_spaces_txt_ntfs_fan_added',
+                'txt_ntfs_timeline_post_common' => '_bx_spaces_txt_ntfs_timeline_post_common',
+                'form_field_author' => '_bx_spaces_form_entry_input_author',
+                'menu_item_title_befriend_sent' => '_bx_spaces_menu_item_title_befriend_sent',
+                'menu_item_title_unfriend_cancel_request' => '_bx_spaces_menu_item_title_unfriend_cancel_request',
+                'menu_item_title_befriend_confirm' => '_bx_spaces_menu_item_title_befriend_confirm',
+                'menu_item_title_unfriend_reject_request' => '_bx_spaces_menu_item_title_unfriend_reject_request',
+                'menu_item_title_befriend' => '_bx_spaces_menu_item_title_befriend',
+                'menu_item_title_unfriend' => '_bx_spaces_menu_item_title_unfriend',
+                'grid_action_err_delete' => '_bx_spaces_grid_action_err_delete',
+                'grid_txt_account_manager' => '_bx_spaces_grid_txt_account_manager',
+                'filter_item_active' => '_bx_spaces_grid_filter_item_title_adm_active',
+                'filter_item_pending' => '_bx_spaces_grid_filter_item_title_adm_pending',
+                'filter_item_suspended' => '_bx_spaces_grid_filter_item_title_adm_suspended',
+                'filter_item_select_one_filter1' => '_bx_spaces_grid_filter_item_title_adm_select_one_filter1',
+                'menu_item_manage_my' => '_bx_spaces_menu_item_title_manage_my',
+                'menu_item_manage_all' => '_bx_spaces_menu_item_title_manage_all',
+                'menu_item_title_become_fan_sent' => '_bx_spaces_menu_item_title_become_fan_sent',
+                'menu_item_title_leave_group_cancel_request' => '_bx_spaces_menu_item_title_leave_space_cancel_request',
+                'menu_item_title_become_fan' => '_bx_spaces_menu_item_title_become_fan',
+                'menu_item_title_leave_group' => '_bx_spaces_menu_item_title_leave_space',
+                'txt_all_entries_by_author' => '_bx_spaces_page_title_browse_by_author',
+                'txt_invitation_popup_title' => '_bx_spaces_txt_invite_popup_title',
+                'txt_invitation_popup_text' => '_bx_spaces_txt_invite_popup_text',
+				'txt_invitation_popup_accept_button' => '_bx_spaces_txt_invite_popup_button_accept',
+				'txt_invitation_popup_decline_button' => '_bx_spaces_txt_invite_popup_button_decline',
+                'txt_invitation_popup_error_invitation_absent' => '_bx_spaces_txt_invite_popup_error_invitation_absent',
+				'txt_invitation_popup_error_wrong_user' => '_bx_spaces_txt_invite_popup_error_invitation_wrong_user',
+            ),
+
+        );
+
+        $this->_aJsClasses = array(
+            'manage_tools' => 'BxSpacesManageTools',
+            'invite_popup' => 'BxSpacesInvitePopup'
+        );
+
+        $this->_aJsObjects = array(
+            'manage_tools' => 'oBxSpacesManageTools',
+            'invite_popup' => 'oBxSpacesInvitePopup'
+        );
+
+        $this->_aGridObjects = array(
+            'common' => $this->CNF['OBJECT_GRID_COMMON'],
+            'administration' => $this->CNF['OBJECT_GRID_ADMINISTRATION'],
+            
+        );
+    }
+
+}
+
+/** @} */

+ 152 - 0
modules/boonex/spaces/updates/11.0.0_11.0.1/source/install/config.php

@@ -0,0 +1,152 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defdroup    Spaces Spaces
+ * @indroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_MODULE,
+    'name' => 'bx_spaces',
+    'title' => 'Spaces',
+    'note' => 'Spaces functionality.',
+    'version' => '11.0.1',
+    'vendor' => 'BoonEx',
+    'help_url' => 'http://feed.una.io/?section={module_name}',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/spaces/',
+    'home_uri' => 'spaces',
+
+    'db_prefix' => 'bx_spaces_',
+    'class_prefix' => 'BxSpaces',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Spaces',
+
+    /**
+     * Connections.
+     */
+    'connections' => array(
+        'sys_profiles_friends' => array ('type' => 'profiles'),
+        'sys_profiles_subscriptions' => array ('type' => 'profiles'),
+    ),
+
+    /**
+     * Menu triggers.
+     */
+    'menu_triggers' => array(
+        'trigger_profile_view_submenu',
+        'trigger_group_view_submenu',
+        'trigger_group_snippet_meta',
+        'trigger_group_view_actions',
+    ),
+
+    /**
+     * Page triggers.
+     */
+    'page_triggers' => array (
+        'trigger_page_group_view_entry',
+    ),
+
+    /**
+     * Storage objects to automatically delete files from upon module uninstallation.
+     * Note. Don't add storage objects used in transcoder objects.
+     */
+    'storages' => array(
+        'bx_spaces_pics'
+    ),
+
+    /**
+     * Transcoders.
+     */
+    'transcoders' => array(
+        'bx_spaces_icon',
+        'bx_spaces_thumb',
+        'bx_spaces_avatar',
+        'bx_spaces_avatar_big',
+        'bx_spaces_picture',
+        'bx_spaces_cover',
+        'bx_spaces_cover_thumb',
+        'bx_spaces_gallery'
+    ),
+
+    /**
+     * Extended Search Forms.
+     */
+    'esearches' => array(
+        'bx_spaces',
+        'bx_spaces_cmts',
+    ),
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'uninstall' => array (
+        'process_esearches' => 1,
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'process_connections' => 1,
+        'process_deleted_profiles' => 1,
+        'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable' => array(
+        'execute_sql' => 1,
+        'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable_success' => array(
+        'process_menu_triggers' => 1,
+        'process_page_triggers' => 1,
+        'process_esearches' => 1,
+        'register_transcoders' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable' => array (
+        'execute_sql' => 1,
+        'unregister_transcoders' => 1,
+        'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable_failed' => array (
+        'register_transcoders' => 1,
+        'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Dependencies Section
+     */
+    'dependencies' => array(),
+
+    /**
+     * Connections Section
+     */
+    'relations' => array(
+        'bx_timeline',
+        'bx_notifications',
+    ),
+);
+
+/** @} */

+ 51 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/install/config.php

@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'title' => 'Timeline',
+    'version_from' => '11.0.3',
+    'version_to' => '11.0.4',
+    'vendor' => 'BoonEx',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/timeline/updates/update_11.0.3_11.0.4/',
+    'home_uri' => 'timeline_update_1103_1104',
+
+    'module_dir' => 'boonex/timeline/',
+    'module_uri' => 'timeline',
+
+    'db_prefix' => 'bx_timeline_',
+    'class_prefix' => 'BxTimeline',
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_files' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Timeline',
+
+    /**
+     * Files Section
+     */
+    'delete_files' => array(),
+);

+ 13 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/install/installer.php

@@ -0,0 +1,13 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ */
+
+class BxTimelineUpdater extends BxDolStudioUpdater
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+}

+ 4 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/install/langs/en.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources name="en" flag="gb" title="English">
+	<string_add name="_bx_timeline_form_post_display_view"><![CDATA[View Post (for custom fields)]]></string_add>
+</resources>

+ 13 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/install/sql/enable.sql

@@ -0,0 +1,13 @@
+SET @sName = 'bx_timeline';
+
+
+-- PAGES
+UPDATE `sys_objects_page` SET `layout_id`='2' WHERE `object`='bx_timeline_item';
+
+DELETE FROM `sys_pages_blocks` WHERE `object`='bx_timeline_item' AND `title`='_bx_timeline_page_block_title_item_info';
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES
+('bx_timeline_item', 2, 'bx_timeline', '', '_bx_timeline_page_block_title_item_info', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:19:"get_block_item_info";}', 0, 0, 1, 1);
+
+
+-- PRIVACY 
+UPDATE `sys_objects_privacy` SET `table_field_author`='owner_id' WHERE `object`='bx_timeline_privacy_view';

+ 7 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/install/sql/install.sql

@@ -0,0 +1,7 @@
+SET @sName = 'bx_timeline';
+
+
+-- FORMS
+DELETE FROM `sys_form_displays` WHERE `display_name`='bx_timeline_post_view';
+INSERT INTO `sys_form_displays` (`display_name`, `module`, `object`, `title`, `view_mode`) VALUES
+('bx_timeline_post_view', @sName, 'bx_timeline_post', '_bx_timeline_form_post_display_view', 1);

+ 679 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/source/classes/BxTimelineConfig.php

@@ -0,0 +1,679 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Timeline Timeline
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+bx_import('BxDolPrivacy');
+
+class BxTimelineConfig extends BxBaseModNotificationsConfig
+{
+    protected $_aTypeToFormDisplay;
+
+    protected $_bAllowEdit;
+    protected $_bAllowDelete;
+    protected $_bShowAll;
+    protected $_bCountAllViews;
+
+    protected $_bCacheItem;
+    protected $_sCacheItemEngine;
+    protected $_iCacheItemLifetime;
+    protected $_bCacheList;
+    protected $_aCacheListExceptions;
+
+    protected $_bInfScroll;
+    protected $_iInfScrollAutoPreloads;
+
+    protected $_iRssLength;
+    protected $_iLiveUpdateLength;
+    protected $_iCharsDisplayMinTitle;
+    protected $_iCharsDisplayMaxTitle;
+
+    protected $_sVideosAutoplay;
+    protected $_iPreloadComments;
+    protected $_iPreloadCommentsMax;
+    protected $_bJumpTo;
+    protected $_sAttachmentsLayout;
+
+    protected $_bHot;
+    protected $_iHotInterval;
+
+    protected $_bEditorToolbar;
+    protected $_bUnhideRestored;
+
+    protected $_sStorageObject;
+    protected $_sTranscoderObjectPreview;
+    protected $_sTranscoderObjectView;
+    protected $_aPhotoUploaders;
+    protected $_aVideoUploaders;
+
+    protected $_sMenuItemManage;
+    protected $_sMenuItemActions;
+
+    protected $_aRepostDefaults;
+
+    protected $_iTimelineVisibilityThreshold;
+    protected $_aPregPatterns;
+
+    /**
+     * Constructor
+     */
+    public function __construct($aModule)
+    {
+        parent::__construct($aModule);
+
+        $this->CNF = array (
+            'ICON' => 'far clock col-green1',
+
+            // database tables
+            'TABLE_ENTRIES' => $aModule['db_prefix'] . 'events',
+
+            // database fields
+            'FIELD_ID' => 'id',
+            'FIELD_OWNER_ID' => 'owner_id',
+            'FIELD_SYSTEM' => 'system',
+            'FIELD_OBJECT_ID' => 'object_id', //Note. For 'Direct Timeline Posts' ('system' db field == 0) this field contains post's author profile ID.
+            'FIELD_OBJECT_PRIVACY_VIEW' => 'object_privacy_view',
+            'FIELD_ADDED' => 'date',
+            'FIELD_PUBLISHED' => 'published',
+            'FIELD_TITLE' => 'title',
+            'FIELD_TEXT' => 'description',
+            'FIELD_STATUS' => 'status',
+            'FIELD_DATE' => 'date',
+            'FIELD_ANONYMOUS' => 'anonymous',
+            'FIELD_CONTROLS' => 'controls',
+            'FIELD_LOCATION' => 'location',
+            'FIELD_LOCATION_PREFIX' => 'location',
+            'FIELDS_DELAYED_PROCESSING' => 'video', // can be array of fields or comma separated string of field names
+
+            // page URIs
+            'URI_VIEW_LIST' => 'timeline-view',
+            'URI_VIEW_ENTRY' => 'item',
+
+            'URL_HOME' => 'page.php?i=timeline-view-home',
+
+            // objects
+            'OBJECT_STORAGE' => $this->_sName . '_photos',
+            'OBJECT_STORAGE_VIDEOS' => $this->_sName . '_videos',
+            'OBJECT_IMAGES_TRANSCODER_PREVIEW' => $this->_sName . '_photos_preview',
+            'OBJECT_VIDEOS_TRANSCODERS' => array(
+                'poster' => 'bx_timeline_videos_poster', 
+            	'mp4' => 'bx_timeline_videos_mp4', 
+            	'mp4_hd' => 'bx_timeline_videos_mp4_hd'
+            ),
+            'OBJECT_GRID_ADMINISTRATION' => $this->_sName . '_administration',
+            'OBJECT_MENU_ENTRY_ATTACHMENTS' => $this->_sName . '_menu_post_attachments',
+            'OBJECT_METATAGS' => $this->_sName,
+            'OBJECT_COMMENTS' => $this->_sName,
+            'OBJECT_VIEWS' => $this->_sName,
+            'OBJECT_VOTES' => $this->_sName,
+            'OBJECT_REACTIONS' => $this->_sName . '_reactions',
+            'OBJECT_SCORES' => $this->_sName,
+            'OBJECT_REPORTS' => $this->_sName,
+            'OBJECT_PRIVACY_VIEW' => $this->_sName . '_privacy_view',
+
+            // some language keys
+            'T' => array (
+                'txt_status_deleted' => '_bx_timeline_txt_status_deleted',
+                'txt_sample_single' => '_bx_timeline_txt_sample',
+                'txt_sample_single_ext' => '_bx_timeline_txt_sample_ext',
+            	'txt_sample_comment_single' => '_bx_timeline_txt_sample_comment_single',
+                'txt_sample_vote_single' => '_bx_timeline_txt_sample_vote_single',
+                'txt_sample_reaction_single' => '_bx_timeline_txt_sample_reaction_single',
+                'txt_sample_score_up_single' => '_bx_timeline_txt_sample_score_up_single',
+                'txt_sample_score_down_single' => '_bx_timeline_txt_sample_score_down_single',
+                'txt_sample_with_link' => '_bx_timeline_txt_sample_with_link',
+                'txt_sample_with_image' => '_bx_timeline_txt_sample_with_image',
+                'txt_sample_with_video' => '_bx_timeline_txt_sample_with_video',
+                'txt_sample_with_media' => '_bx_timeline_txt_sample_with_media',
+                'grid_action_err_delete' => '_bx_timeline_grid_action_err_delete', 
+                'grid_txt_account_manager' => '_bx_timeline_grid_txt_account_manager',
+                'form_input_title_object_privacy_view' => '_bx_timeline_form_post_input_object_privacy_view',
+                'option_vap_off' => '_bx_timeline_option_videos_autoplay_off',
+                'option_vap_on_mute' => '_bx_timeline_option_videos_autoplay_on_mute',
+                'option_vap_on' => '_bx_timeline_option_videos_autoplay_on',
+                'option_al_gallery' => '_bx_timeline_option_attachments_layout_gallery',
+                'option_al_showcase' => '_bx_timeline_option_attachments_layout_showcase'
+            ),
+        );
+
+        $this->_aTypeToFormDisplay = array(
+            BX_BASE_MOD_NTFS_TYPE_OWNER => 'form_display_post_add_profile',
+            BX_BASE_MOD_NTFS_TYPE_PUBLIC => 'form_display_post_add_public',
+            BX_TIMELINE_TYPE_CHANNELS => 'form_display_post_add',
+            BX_TIMELINE_TYPE_FEED => 'form_display_post_add',
+            BX_TIMELINE_TYPE_OWNER_AND_CONNECTIONS => 'form_display_post_add'
+        );
+
+        $this->_aPrefixes = array(
+            'style' => 'bx-tl',
+            'language' => '_bx_timeline',
+            'option' => 'bx_timeline_',
+            'common_post' => 'timeline_common_',
+            'cache_item' => 'bx_timeline_item_'
+        );
+
+        $this->_aObjects = array_merge($this->_aObjects, array(
+            'comment' => $this->CNF['OBJECT_COMMENTS'],
+            'view' => $this->CNF['OBJECT_VIEWS'],
+            'vote' => $this->CNF['OBJECT_VOTES'],
+            'reaction' => $this->CNF['OBJECT_REACTIONS'],
+            'score' => $this->CNF['OBJECT_SCORES'],
+            'report' => $this->CNF['OBJECT_REPORTS'],
+            'privacy_view' => $this->CNF['OBJECT_PRIVACY_VIEW'],
+            'metatags' => $this->_sName,
+
+            'storage_photos' => $this->CNF['OBJECT_STORAGE'],
+            'storage_videos' => $this->CNF['OBJECT_STORAGE_VIDEOS'],
+            'transcoder_photos_preview' => $this->CNF['OBJECT_IMAGES_TRANSCODER_PREVIEW'],
+            'transcoder_photos_view' => $this->_sName . '_photos_view',
+            'transcoder_photos_medium' => $this->_sName . '_photos_medium',
+            'transcoder_photos_big' => $this->_sName . '_photos_big',
+            'transcoder_videos_poster' => $this->CNF['OBJECT_VIDEOS_TRANSCODERS']['poster'],
+            'transcoder_videos_mp4' => $this->CNF['OBJECT_VIDEOS_TRANSCODERS']['mp4'],
+            'transcoder_videos_mp4_hd' => $this->CNF['OBJECT_VIDEOS_TRANSCODERS']['mp4_hd'],
+
+            'page_item_brief' => $this->_sName . '_item_brief',
+
+            'menu_view' => $this->_sName . '_menu_view',
+            'menu_item_manage' => $this->_sName . '_menu_item_manage',
+            'menu_item_actions' => $this->_sName . '_menu_item_actions',
+            'menu_item_actions_all' => $this->_sName . '_menu_item_actions_all',
+            'menu_item_counters' => $this->_sName . '_menu_item_counters',
+            'menu_item_meta' => $this->_sName . '_menu_item_meta',
+            'menu_post_attachments' => $this->CNF['OBJECT_MENU_ENTRY_ATTACHMENTS'],
+
+            'form_post' => $this->_sName . '_post',
+            'form_attach_link' => $this->_sName . '_attach_link',
+            'form_display_post_add' => $this->_sName . '_post_add',
+            'form_display_post_add_public' => $this->_sName . '_post_add_public',
+            'form_display_post_add_profile' => $this->_sName . '_post_add_profile',
+            'form_display_post_edit' => $this->_sName . '_post_edit',
+            'form_display_post_view' => $this->_sName . '_post_view',
+            'form_display_attach_link_add' => $this->_sName . '_attach_link_add'
+        ));
+
+        $this->_aHandlerDescriptor = array('module_name' => '', 'module_method' => '', 'module_class' => '', 'groupable' => '', 'group_by' => '');
+        $this->_sHandlersMethod = 'get_timeline_data';
+
+        $this->_aPhotoUploaders = array($this->_sName . '_simple_photo');
+        $this->_aVideoUploaders = array($this->_sName . '_simple_video');
+
+        $this->_bJsMode = false;
+        $this->_aJsClasses = array(
+            'main' => 'BxTimelineMain',
+            'view' => 'BxTimelineView',
+            'post' => 'BxTimelinePost',
+            'repost' => 'BxTimelineRepost',
+            'manage_tools' => 'BxTimelineManageTools'
+        );
+        $this->_aJsObjects = array(
+            'view' => 'oTimelineView',
+            'post' => 'oTimelinePost',
+            'repost' => 'oTimelineRepost',
+            'manage_tools' => 'oBxTimelineManageTools'
+        );
+
+        $this->_aGridObjects = array(
+            'administration' => $this->CNF['OBJECT_GRID_ADMINISTRATION']
+        );
+
+        $sHp = str_replace('_', '-', $this->_sName);
+        $sHpT = BX_TIMELINE_VIEW_TIMELINE;
+        $sHpO = BX_TIMELINE_VIEW_OUTLINE;
+        $this->_aHtmlIds = array(
+            'view' => array(
+                'edit_form' => $sHp . '-edit-',
+
+                'menu_popup' => $sHp . '-menu-popup-',
+
+                'video_iframe' => $sHp . '-video-iframe-',
+                'video' => $sHp . '-video-',
+
+                'live_update_popup' => $sHp . '-live-update-popup-',
+            ),
+            'post' => array(
+                'attach_link_popup' =>  $sHp . '-attach-link-popup',
+                'attach_link_form_field' => $sHp . '-attach-link-form_field',
+                'attach_link_item' => $sHp . '-attach-link-item-',
+                'textarea' => $sHp . '-textarea-',
+
+                'main_' . $sHpT => $sHp . '-' . $sHpT,
+                'main_' . $sHpO => $sHp . '-' . $sHpO,
+            ),
+            'repost' => array(
+                'main' => $sHp . '-repost-',
+                'counter' => $sHp . '-repost-counter-',
+                'by_popup' => $sHp . '-repost-by-',
+            )
+        );
+
+        $this->_aRepostDefaults = array(
+            'show_do_repost_as_button' => false,
+            'show_do_repost_as_button_small' => false,
+            'show_do_repost_image' => false,
+            'show_do_repost_icon' => true,
+            'show_do_repost_text' => false,
+            'show_counter' => true,
+
+            //--- Images
+            'image_do_repost' => '',
+
+            //--- Icons
+            'icon_do_repost' => 'sync-alt',
+
+            //--- Texts
+            'text_do_repost' => '_bx_timeline_txt_do_repost',
+
+            //--- Templates
+            'template_do_repost_label' => '',
+            'template_do_repost_label_name' => 'repost_do_repost_label.html',
+        );
+
+        $this->_iTimelineVisibilityThreshold = 0;
+
+        $this->_aPregPatterns = array(
+            "meta_title" => "/<title>(.*)<\/title>/",
+            "meta_description" => "/<meta[\s]+[^>]*?name[\s]?=[\s\"\']+description[\s\"\']+content[\s]?=[\s\"\']+(.*?)[\"\']+.*?>/",
+        	"url" => "/(([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?/"
+        );
+    }
+
+    public function init(&$oDb)
+    {
+    	parent::init($oDb);
+
+    	$sOptionPrefix = $this->getPrefix('option');
+    	$this->_bAllowEdit = getParam($sOptionPrefix . 'enable_edit') == 'on';
+        $this->_bAllowDelete = getParam($sOptionPrefix . 'enable_delete') == 'on';
+        $this->_bShowAll = getParam($sOptionPrefix . 'enable_show_all') == 'on';
+        $this->_bCountAllViews = getParam($sOptionPrefix . 'enable_count_all_views') == 'on';
+
+        $this->_bCacheItem = getParam($sOptionPrefix . 'enable_cache_item') == 'on';
+        $this->_sCacheItemEngine = getParam($sOptionPrefix . 'cache_item_engine');
+        $this->_iCacheItemLifetime = (int)getParam($sOptionPrefix . 'cache_item_lifetime');
+        $this->_bCacheList = getParam($sOptionPrefix . 'enable_cache_list') == 'on';
+        $this->_aCacheListExceptions = array(BX_TIMELINE_TYPE_HOT);
+
+        $this->_aPerPage = array(
+            'default' => (int)getParam($sOptionPrefix . 'events_per_page'),
+            'profile' => (int)getParam($sOptionPrefix . 'events_per_page_profile'),
+            'account' => (int)getParam($sOptionPrefix . 'events_per_page_account'),
+            'home' => (int)getParam($sOptionPrefix . 'events_per_page_home'),
+            'preload' => (int)getParam($sOptionPrefix . 'events_per_preload')
+    	);
+
+        $this->_bInfScroll = getParam($sOptionPrefix . 'enable_infinite_scroll') == 'on';
+        $this->_iInfScrollAutoPreloads = (int)getParam($sOptionPrefix . 'auto_preloads');
+
+        $this->_iRssLength = (int)getParam($sOptionPrefix . 'rss_length');
+        $this->_iLiveUpdateLength = 10;
+        $this->_iCharsDisplayMinTitle = 32;
+        $this->_iCharsDisplayMaxTitle = 64;
+
+        $this->_sVideosAutoplay = getParam($sOptionPrefix . 'videos_autoplay');
+
+        $this->_iPreloadCommentsMax = 7;
+        $this->_iPreloadComments = (int)getParam($sOptionPrefix . 'preload_comments');
+        if($this->_iPreloadComments > $this->_iPreloadCommentsMax)
+            $this->_iPreloadComments = $this->_iPreloadCommentsMax;
+
+        $this->_bJumpTo = getParam($sOptionPrefix . 'enable_jump_to_switcher') == 'on';
+        $this->_sAttachmentsLayout = getParam($sOptionPrefix . 'attachments_layout');
+
+        $this->_bHot = getParam($sOptionPrefix . 'enable_hot') == 'on';
+        $this->_iHotInterval = (int)getParam($sOptionPrefix . 'hot_interval');
+
+        $this->_bEditorToolbar = getParam($sOptionPrefix . 'enable_editor_toolbar') == 'on';
+
+        $this->_bUnhideRestored = false;
+    }
+
+    /**
+     * Generate name from parameters.
+     * 
+     * @param type $aParams - parameters whose values will be used during generation.
+     * @param type $aRules - generation rules.
+     * @return string
+     */
+    protected function getNameView($aParams, $aRules = array())
+    {
+        $bWithView = !isset($aRules['with_view']) || $aRules['with_view'] === true;
+        $bWithType = !isset($aRules['with_type']) || $aRules['with_type'] === true;
+        $bWithOwner = isset($aRules['with_owner']) && $aRules['with_owner'] === true;
+        $sGlue = !empty($aRules['glue']) ? $aRules['glue'] : '_';
+
+        $aAddons = array();
+        if(!empty($aParams['name']))
+            $aAddons[] = $aParams['name'];
+        else {
+            if($bWithView && !empty($aParams['view']))
+                $aAddons[] = $aParams['view'];
+
+            if($bWithType && !empty($aParams['type']))
+                $aAddons[] = $aParams['type'];
+        }
+
+        if($bWithOwner)
+            $aAddons[] = $aParams['owner_id'];
+
+        return !empty($aAddons) ? implode($sGlue, $aAddons) : '';
+    }
+
+    /**
+     * Generates unique JS object name for View events block.
+     * 
+     * @param array $aParams - an array with browsing params received in View block service method
+     * @return string with JS object name
+     */
+    public function getJsObjectView($aParams = array())
+    {
+        return parent::getJsObject('view') . bx_gen_method_name($this->getNameView($aParams));
+    }
+
+    public function getHtmlIdView($sKey, $aParams, $aRules = array())
+    {
+        $bWhole = !isset($aRules['whole']) || $aRules['whole'] === true;
+        $sGlue = !empty($aRules['glue']) ? $aRules['glue'] : '_';
+
+        return str_replace($sGlue, '-', $this->_sName  . $sGlue . $sKey . $sGlue . $this->getNameView($aParams, $aRules) . (!$bWhole ? $sGlue : ''));
+    }
+
+    public function isAllowEdit()
+    {
+        return $this->_bAllowEdit;
+    }
+
+    public function isAllowDelete()
+    {
+        return $this->_bAllowDelete;
+    }
+
+    public function isInfiniteScroll()
+    {
+        return $this->_bInfScroll;
+    }
+
+    public function isShowAll()
+    {
+        return $this->_bShowAll;
+    }
+
+    public function isCountAllViews()
+    {
+        return $this->_bCountAllViews;
+    }
+
+    public function isJumpTo()
+    {
+        return $this->_bJumpTo;
+    }
+
+    public function isHot()
+    {
+        return $this->_bHot;
+    }
+
+    public function isEmoji()
+    {
+        $oMenu = BxDolMenu::getObjectInstance($this->getObject('menu_post_attachments'));
+        if(!$oMenu)
+            return false;
+
+        return $oMenu->isMenuItem('add-emoji');
+    }
+
+    public function isEditorToolbar()
+    {
+    	return $this->_bEditorToolbar;
+    }
+
+    public function isUnhideRestored()
+    {
+        return $this->_bUnhideRestored;
+    }
+
+    public function isCacheItem()
+    {
+        return $this->_bCacheItem;
+    }
+
+    public function isCacheList()
+    {
+        return $this->_bCacheList;
+    }
+
+    public function isCacheListException($sType)
+    {
+        return in_array($sType, $this->_aCacheListExceptions);
+    }
+
+    public function getCacheItemEngine()
+    {
+        return $this->_sCacheItemEngine;
+    }
+
+    public function getCacheItemLifetime()
+    {
+        return $this->_iCacheItemLifetime;
+    }
+
+    public function getCacheItemKey($iId, $sPostfix = '')
+    {
+        return $this->getPrefix('cache_item') . $iId . (bx_is_mobile() ? '_m' : '') . '_r' . bx_get_device_pixel_ratio() . '_' . (!empty($sPostfix) ? '_' . $sPostfix : '') . '.php';
+    }
+
+    public function getPostFormDisplay($sType)
+    {
+        if(empty($sType) || !array_key_exists($sType, $this->_aTypeToFormDisplay))
+            $sType = BX_TIMELINE_TYPE_DEFAULT;
+
+        return $this->_aTypeToFormDisplay[$sType];
+    }
+
+    public function getUploaders($sType)
+    {
+        $aResult = array();
+
+        switch($sType) {
+            case 'photo':
+                $aResult = $this->_aPhotoUploaders;
+                break;
+            case 'video':
+                $aResult = $this->_aVideoUploaders;
+                break;
+        }
+
+        return $aResult;
+    }
+
+    public function getPerPage($sType = 'default')
+    {
+        if($this->isInfiniteScroll())
+            $sType = 'preload';
+
+        return parent::getPerPage($sType);
+    }
+
+    public function getAutoPreloads()
+    {
+        return $this->_iInfScrollAutoPreloads;
+    }
+
+    public function getRssLength()
+    {
+        return $this->_iRssLength;
+    }
+
+    public function getLiveUpdateLength()
+    {
+        return $this->_iLiveUpdateLength;
+    }
+
+    public function getCharsDisplayMinTitle()
+    {
+        return $this->_iCharsDisplayMinTitle;
+    }
+
+    public function getCharsDisplayMaxTitle()
+    {
+        return $this->_iCharsDisplayMaxTitle;
+    }
+
+    public function getVideosAutoplay()
+    {
+        return $this->_sVideosAutoplay;
+    }
+
+    public function getPreloadComments()
+    {
+        return $this->_iPreloadComments;
+    }
+
+    public function getAttachmentsLayout()
+    {
+        return $this->_sAttachmentsLayout;
+    }
+
+    public function getHotInterval()
+    {
+        return $this->_iHotInterval;
+    }
+
+    public function getRepostDefaults()
+    {
+        return $this->_aRepostDefaults;
+    }
+
+    public function getPregPattern($sType)
+    {
+        return $this->_aPregPatterns[$sType];
+    }
+
+    /**
+     * Ancillary functions
+     */
+    public function getTitle($s, $mixedProfile = false, $sMethodLength = 'getCharsDisplayMaxTitle')
+    {
+        if(get_mb_substr($s, 0, 1) == '_' && strcmp($s, _t($s)) != 0)
+            return $s;
+
+        if($mixedProfile !== false) {
+            if(is_numeric($mixedProfile))
+                $mixedProfile = BxDolProfile::getInstanceMagic((int)$mixedProfile);
+
+            if($mixedProfile instanceof BxDolProfile)
+                $s = bx_replace_markers($s, array(
+                    'profile_name' => $mixedProfile->getDisplayName()
+                ));
+        }
+
+        if(!method_exists($this, $sMethodLength))
+            $sMethodLength = 'getCharsDisplayMaxTitle';
+
+        return strmaxtextlen($s, $this->$sMethodLength(), '...');
+    }
+
+    public function getTitleShort($s, $mixedProfile = false)
+    {
+        return $this->getTitle($s, $mixedProfile, 'getCharsDisplayMinTitle');
+    }
+
+    public function getTitleDefault($bL, $bP, $bV)
+    {
+        $sResult = '';
+
+        if($bL && !$bP && !$bV)
+            $sResult = 'link';
+        else if(!$bL && $bP && !$bV)
+            $sResult = 'image';
+        else if(!$bL && !$bP && $bV)
+            $sResult = 'video';
+        else 
+            $sResult = 'media';
+
+        return $this->CNF['T']['txt_sample_with_' . $sResult];
+    }
+
+    public function getViewUrl($iOwnerId)
+    {
+        return BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php', array(
+        	'i' => $this->CNF['URI_VIEW_LIST'], 
+        	'id' => $iOwnerId
+        ));
+    }
+
+    public function getHomeViewUrl()
+    {
+        return BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink($this->CNF['URL_HOME']);
+    }
+
+    public function getItemViewUrl($aEvent)
+    {
+        return BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php', array(
+        	'i' => $this->CNF['URI_VIEW_ENTRY'], 
+        	'id' => $aEvent['id']
+        ));
+    }
+
+    public function getLiveUpdateKey($aParams)
+    {
+        return $this->getName() . '_live_update_' . $this->getNameView($aParams, array('with_owner' => true));
+    }
+
+    //TODO: isCommon and isSystem can be updated to use new 'system' db field.
+    public function isCommon($sType, $sAction)
+    {
+        return !$this->isSystem($sType, $sAction);
+    }
+
+    public function isSystem($sType, $sAction)
+    {
+        $sPrefix = $this->getPrefix('common_post');
+        return strpos($sType, $sPrefix) === false && !empty($sAction);
+    }
+
+    public function getSystemData(&$aEvent, $aBrowseParams = array())
+    {
+        $aHandler = $this->getHandler($aEvent);
+        if($aHandler === false)
+            return false;
+
+        return BxDolService::call($aHandler['module_name'], $aHandler['module_method'], array($aEvent, $aBrowseParams), $aHandler['module_class']);
+    }
+
+    public function getSystemDataByDescriptor($sType, $sAction, $iObjectId)
+    {
+    	$aDescriptor = array(
+            'type' => $sType, 
+            'action' => $sAction,
+            'object_id' => $iObjectId
+    	);
+    	return $this->getSystemData($aDescriptor);
+    }
+
+    public function isEqualUrls($sUrl1, $sUrl2)
+    {
+        $sUrl1 = trim($sUrl1, "/");
+        $sUrl2 = trim($sUrl2, "/");
+
+        return strncmp($sUrl1, $sUrl2, strlen($sUrl1)) === 0;
+    }
+
+    public function addBrowseParams($sUrl, $aParams, $sKey = 'bp')
+    {
+        return bx_append_url_params($sUrl, array($sKey => urlencode(base64_encode(serialize($aParams)))));
+    }
+
+    public function getBrowseParams($sValue)
+    {
+        return unserialize(base64_decode(urldecode($sValue)));
+    }
+}
+
+/** @} */

+ 319 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/source/classes/BxTimelineFormPost.php

@@ -0,0 +1,319 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Timeline Timeline
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Create/Edit entry form
+ */
+class BxTimelineFormPost extends BxBaseModGeneralFormEntry
+{
+    protected $_bAccountMode;
+    protected $_bPublicMode;
+    protected $_bProfileMode;
+
+    protected $_bVisibilityAutoselect;
+
+    public function __construct($aInfo, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_timeline';
+
+        parent::__construct($aInfo, $oTemplate);
+
+        $this->_bAccountMode = isset($this->aParams['display']) && $this->aParams['display'] == $this->_oModule->_oConfig->getObject('form_display_post_add');
+        $this->_bPublicMode = isset($this->aParams['display']) && $this->aParams['display'] == $this->_oModule->_oConfig->getObject('form_display_post_add_public');
+        $this->_bProfileMode = isset($this->aParams['display']) && $this->aParams['display'] == $this->_oModule->_oConfig->getObject('form_display_post_add_profile');
+
+        $this->_bVisibilityAutoselect = true;
+    }
+
+    public function getCode($bDynamicMode = false)
+    {
+    	$sResult = parent::getCode($bDynamicMode);
+
+    	return $this->_oModule->_oTemplate->parseHtmlByContent($sResult, array(
+            'attachments_menu' => $this->_oModule->getAttachmentsMenuObject()->getCode()
+    	));
+    }
+
+    function initChecker($aValues = array (), $aSpecificValues = array())
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        if($this->aParams['display'] == $this->_oModule->_oConfig->getObject('form_display_post_edit') && isset($CNF['FIELD_PUBLISHED']) && isset($this->aInputs[$CNF['FIELD_PUBLISHED']]))
+            if(isset($aValues[$CNF['FIELD_STATUS']]) && in_array($aValues[$CNF['FIELD_STATUS']], array(BX_TIMELINE_STATUS_ACTIVE, BX_TIMELINE_STATUS_HIDDEN)))
+                unset($this->aInputs[$CNF['FIELD_PUBLISHED']]);
+
+        if(isset($CNF['FIELD_ANONYMOUS']) && isset($this->aInputs[$CNF['FIELD_ANONYMOUS']]) && isset($aValues[$CNF['FIELD_OBJECT_ID']]))
+            $this->aInputs[$CNF['FIELD_ANONYMOUS']]['checked'] = $aValues[$CNF['FIELD_OBJECT_ID']] < 0;
+
+        parent::initChecker ($aValues, $aSpecificValues);
+    }
+
+    public function insert($aValsToAdd = array(), $isIgnore = false)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        $aValsToAdd[$CNF['FIELD_SYSTEM']] = 0;
+        $aValsToAdd[$CNF['FIELD_OBJECT_ID']] *= isset($CNF['FIELD_ANONYMOUS']) && isset($this->aInputs[$CNF['FIELD_ANONYMOUS']]) && $this->getCleanValue($CNF['FIELD_ANONYMOUS']) ? -1 : 1;
+
+        if(isset($CNF['FIELD_ADDED']) && empty($aValsToAdd[$CNF['FIELD_ADDED']])) {
+            $iAdded = 0;
+            if(isset($this->aInputs[$CNF['FIELD_ADDED']]))
+                $iAdded = $this->getCleanValue($CNF['FIELD_ADDED']);
+            
+            if(empty($iAdded))
+                 $iAdded = time();
+
+            $aValsToAdd[$CNF['FIELD_ADDED']] = $iAdded;
+        }
+
+        if(empty($aValsToAdd[$CNF['FIELD_PUBLISHED']])) {
+            $iPublished = 0;
+            if(isset($this->aInputs[$CNF['FIELD_PUBLISHED']]))
+                $iPublished = $this->getCleanValue($CNF['FIELD_PUBLISHED']);
+                
+             if(empty($iPublished))
+                 $iPublished = time();
+
+             $aValsToAdd[$CNF['FIELD_PUBLISHED']] = $iPublished;
+        }
+
+        $aValsToAdd[$CNF['FIELD_STATUS']] = $aValsToAdd[$CNF['FIELD_PUBLISHED']] > $aValsToAdd[$CNF['FIELD_ADDED']] ? BX_TIMELINE_STATUS_AWAITING : BX_TIMELINE_STATUS_ACTIVE;
+
+        return parent::insert ($aValsToAdd, $isIgnore);
+    }
+
+    function update($iContentId, $aValsToAdd = array(), &$aTrackTextFieldsChanges = null)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        if (isset($CNF['FIELD_ANONYMOUS']) && isset($this->aInputs[$CNF['FIELD_ANONYMOUS']])) {
+            $aContentInfo = $this->_oModule->_oDb->getContentInfoById($iContentId);
+
+            $aValsToAdd[$CNF['FIELD_OBJECT_ID']] = ($this->getCleanValue($CNF['FIELD_ANONYMOUS']) ? -1 : 1) * abs($aContentInfo[$CNF['FIELD_OBJECT_ID']]);
+        }
+
+        if(empty($aValsToAdd[$CNF['FIELD_PUBLISHED']]) && isset($this->aInputs[$CNF['FIELD_PUBLISHED']])) {
+            $iPublished = $this->getCleanValue($CNF['FIELD_PUBLISHED']);
+            if(empty($iPublished))
+                $iPublished = time();
+
+            $aValsToAdd[$CNF['FIELD_PUBLISHED']] = $iPublished;
+        }
+
+        return parent::update($iContentId, $aValsToAdd, $aTrackTextFieldsChanges);
+    }
+
+    public function addHtmlEditor($iViewMode, &$aInput)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        $oEditor = BxDolEditor::getObjectInstance(false, $this->oTemplate);
+        if (!$oEditor)
+            return false;
+
+        if(in_array($this->aParams['display'], array($this->_oModule->_oConfig->getObject('form_display_post_add'), $this->_oModule->_oConfig->getObject('form_display_post_add_public'))))
+            $oEditor->setCustomConf("
+                placeholderText: '" . _t('_bx_timeline_txt_some_text_here') . "',
+                initOnClick: false,
+            ");
+
+        if(!$this->_oModule->_oConfig->isEditorToolbar())
+        	$oEditor->setCustomToolbarButtons('');
+
+        $this->_sCodeAdd .= $oEditor->attachEditor ('#' . $this->aFormAttrs['id'] . ' [name='.$aInput['name'].']', $iViewMode, $this->_bDynamicMode);
+
+        return true;
+    }
+
+    public function init()
+    {
+        $iUserId = $this->_oModule->getUserId();
+        $iOwnerId = $this->_oModule->getOwnerId();
+
+        $this->aFormAttrs['action'] = BX_DOL_URL_ROOT . $this->_oModule->_oConfig->getBaseUri() . 'post/';
+
+        $this->aInputs['owner_id']['value'] = $iOwnerId;
+
+        if(isset($this->aInputs['text'])) {
+            if(empty($this->aInputs['text']['attrs']) || !is_array($this->aInputs['text']['attrs']))
+                $this->aInputs['text']['attrs'] = array();
+
+            $this->aInputs['text']['attrs']['id'] = $this->_oModule->_oConfig->getHtmlIds('post', 'textarea') . time();
+        }
+
+        $aPrivacyFields = $this->_getPrivacyFields();
+        foreach($aPrivacyFields as $sField => $sPrivacyObject)
+            $this->_initPrivacyField($sField, $sPrivacyObject);
+
+        if(isset($this->aInputs['link']))
+            $this->aInputs['link']['content'] = $this->_oModule->_oTemplate->getAttachLinkField($iUserId);
+
+        if(isset($this->aInputs['photo'])) {
+            $aFormNested = array(
+                'params' =>array(
+                    'nested_form_template' => 'uploader_nfw.html'
+                ),
+                'inputs' => array(),
+            );
+
+            $oFormNested = new BxDolFormNested('photo', $aFormNested, 'tlb_do_submit', $this->_oModule->_oTemplate);
+
+            $this->aInputs['photo']['storage_object'] = $this->_oModule->_oConfig->getObject('storage_photos');
+            $this->aInputs['photo']['images_transcoder'] = $this->_oModule->_oConfig->getObject('transcoder_photos_preview');
+            $this->aInputs['photo']['uploaders'] = !empty($this->aInputs['photo']['value']) ? unserialize($this->aInputs['photo']['value']) : $this->_oModule->_oConfig->getUploaders('photo');
+            $this->aInputs['photo']['upload_buttons_titles'] = array('Simple' => 'camera');
+            $this->aInputs['photo']['multiple'] = true;
+            $this->aInputs['photo']['ghost_template'] = $oFormNested;
+        }
+
+        if(isset($this->aInputs['video'])) {
+            $aFormNested = array(
+                'params' =>array(
+                    'nested_form_template' => 'uploader_nfw.html'
+                ),
+                'inputs' => array(),
+            );
+
+            $oFormNested = new BxDolFormNested('video', $aFormNested, 'tlb_do_submit', $this->_oModule->_oTemplate);
+
+            $this->aInputs['video']['storage_object'] = $this->_oModule->_oConfig->getObject('storage_videos');
+            $this->aInputs['video']['images_transcoder'] = $this->_oModule->_oConfig->getObject('transcoder_videos_poster');
+            $this->aInputs['video']['uploaders'] = !empty($this->aInputs['video']['value']) ? unserialize($this->aInputs['video']['value']) : $this->_oModule->_oConfig->getUploaders('video');
+            $this->aInputs['video']['upload_buttons_titles'] = array('Simple' => 'video');
+            $this->aInputs['video']['multiple'] = true;
+            $this->aInputs['video']['ghost_template'] = $oFormNested;
+        }
+
+        if(isset($this->aInputs['attachments']))
+            $this->aInputs['attachments']['content'] = '__attachments_menu__';
+
+        if (isset($this->_oModule->_oConfig->CNF['FIELD_LOCATION_PREFIX']) && isset($this->aInputs[$this->_oModule->_oConfig->CNF['FIELD_LOCATION_PREFIX']]))
+            $this->aInputs[$this->_oModule->_oConfig->CNF['FIELD_LOCATION_PREFIX']]['manual_input'] = false;
+    }
+
+    public function setVisibilityAutoselect($bVisibilityAutoselect)
+    {
+        $this->_bVisibilityAutoselect = $bVisibilityAutoselect;
+    }
+
+    protected function _getPrivacyFields($aKeysF2O = array())
+    {
+        if(empty($aKeysF2O))
+            $aKeysF2O = array(
+                'FIELD_OBJECT_PRIVACY_VIEW' => 'OBJECT_PRIVACY_VIEW'
+            );
+
+        return parent::_getPrivacyFields($aKeysF2O);
+    }
+
+    /**
+     * The method inherited from BxBaseModGeneralFormEntry class is disabled
+     * because own variant (method BxTimelineFormPost::_initPrivacyField) is
+     * used instead.
+     */
+    protected function _preparePrivacyField($sField, $sPrivacyObject)
+    {
+        return;
+    }
+
+    protected function _initPrivacyField($sField, $sPrivacyObject)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+    	$iUserId = $this->_oModule->getUserId();
+        $iOwnerId = $this->_oModule->getOwnerId();
+
+        $this->aInputs[$sField] = array_merge($this->aInputs[$sField], BxDolPrivacy::getGroupChooser($sPrivacyObject, 0, array(
+            'title' => _t($CNF['T']['form_input_title_' . $sField]),
+            'dynamic_mode' => $this->_bDynamicMode
+        )));
+
+        //--- Show field as is when 'Autoselect' is disabled.
+        if(!$this->_bVisibilityAutoselect)
+            return;
+
+        //--- Show default privacy groups and followed contexts on Account (Profile + Connections) post form.
+        if($this->_bAccountMode)
+            return;
+
+        //--- Preselect Context and hide privacy selector when posting in some context (profile, group, space, etc).
+        if($this->_bProfileMode && $iOwnerId != $iUserId) {
+            $this->aInputs[$sField]['type'] = 'hidden';
+	    $this->aInputs[$sField]['value'] = -$iOwnerId;
+
+            return;
+        }
+
+        $bProfileModeOwner = $this->_bProfileMode && $iOwnerId == $iUserId;
+        if($this->_bPublicMode || $bProfileModeOwner) {
+            $iGc = 0;
+            $iKeyGh = false;
+            foreach($this->aInputs[$sField]['values'] as $iKey => $aValue) {
+                if(isset($aValue['type']) && in_array($aValue['type'], array('group_header', 'group_end'))) {
+                    if($iKeyGh !== false && $iGc == 0) {
+                        unset($this->aInputs[$sField]['values'][$iKeyGh]);
+                        $iKeyGh = false;
+
+                        if($aValue['type'] == 'group_end')
+                            unset($this->aInputs[$sField]['values'][$iKey]);
+                    }
+
+                    if($aValue['type'] == 'group_header') {
+                        $iGc = 0;
+                        $iKeyGh = $iKey;
+                    }
+
+                    continue;
+                }
+
+                //--- Show 'Public' privacy group only in Public post form. 
+                if($this->_bPublicMode && $aValue['key'] == BX_DOL_PG_ALL) {
+                    $iGc += 1;
+                    continue;
+                }
+
+                //--- Show a default privacy groups in Profile (for Owner) post form.
+                if($bProfileModeOwner && (int)$aValue['key'] >= 0) {
+                    $iGc += 1;
+                    continue;
+                }
+
+                unset($this->aInputs[$sField]['values'][$iKey]);
+            }
+        }
+    }
+    
+    protected function _preloadPrivacyField($sField, $sPrivacyObject, $aValues)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        $oPrivacy = BxDolPrivacy::getObjectInstance($sPrivacyObject);
+        if(!$oPrivacy) 
+            return;
+
+        $iContentId = !empty($aValues[$CNF['FIELD_ID']]) ? (int)$aValues[$CNF['FIELD_ID']] : 0;
+        $iProfileId = !empty($iContentId) ? (int)$this->getContentOwnerProfileId($iContentId) : bx_get_logged_profile_id();
+        $iGroupId = !empty($aValues[$sField]) ? $aValues[$sField] : 0;
+
+        if(!isset($this->aInputs[$sField]['content']))
+            $this->aInputs[$sField]['content'] = '';
+
+        $this->aInputs[$sField]['content'] .= $oPrivacy->initGroupChooser($sPrivacyObject, $iProfileId, array(
+            'content_id' => $iContentId,
+            'group_id' => $iGroupId,
+            'html_ids' => array(
+                'form' => $this->getId()
+            )
+        ));
+    }
+}
+
+/** @} */

+ 4144 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/source/classes/BxTimelineModule.php

@@ -0,0 +1,4144 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Timeline Timeline
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+bx_import('BxDolAcl');
+bx_import('BxBaseModNotificationsModule');
+
+define('BX_TIMELINE_TYPE_ITEM', 'view_item');
+define('BX_TIMELINE_TYPE_OWNER_AND_CONNECTIONS', 'owner_and_connections');
+define('BX_TIMELINE_TYPE_CHANNELS', 'channels'); //--- Followed channels only.
+define('BX_TIMELINE_TYPE_FEED', 'feed'); //--- Owner and folloved contexts excluding channels.
+define('BX_TIMELINE_TYPE_HOT', 'hot'); //--- Aggrigated hot content.
+define('BX_TIMELINE_TYPE_DEFAULT', BX_BASE_MOD_NTFS_TYPE_OWNER);
+
+define('BX_TIMELINE_VIEW_ITEM', 'item');
+define('BX_TIMELINE_VIEW_TIMELINE', 'timeline');
+define('BX_TIMELINE_VIEW_OUTLINE', 'outline');
+define('BX_TIMELINE_VIEW_SEARCH', 'search');
+define('BX_TIMELINE_VIEW_DEFAULT', BX_TIMELINE_VIEW_OUTLINE);
+
+define('BX_TIMELINE_FILTER_ALL', 'all');
+define('BX_TIMELINE_FILTER_OWNER', 'owner');
+define('BX_TIMELINE_FILTER_OTHER', 'other');
+define('BX_TIMELINE_FILTER_OTHER_VIEWER', 'other_viewer');
+
+define('BX_TIMELINE_PARSE_TYPE_POST', 'post');
+define('BX_TIMELINE_PARSE_TYPE_REPOST', 'repost');
+define('BX_TIMELINE_PARSE_TYPE_DEFAULT', BX_TIMELINE_PARSE_TYPE_POST);
+
+define('BX_TIMELINE_STATUS_ACTIVE', 'active');
+define('BX_TIMELINE_STATUS_AWAITING', 'awaiting');
+define('BX_TIMELINE_STATUS_FAILED', 'failed');
+define('BX_TIMELINE_STATUS_HIDDEN', 'hidden');
+define('BX_TIMELINE_STATUS_DELETED', 'deleted');
+
+define('BX_TIMELINE_MEDIA_PHOTO', 'photo');
+define('BX_TIMELINE_MEDIA_VIDEO', 'video');
+
+//--- Video Auto Play 
+define('BX_TIMELINE_VAP_OFF', 'off');
+define('BX_TIMELINE_VAP_ON_MUTE', 'on_mute');
+define('BX_TIMELINE_VAP_ON', 'on');
+
+//--- Media Layouts
+define('BX_TIMELINE_ML_SINGLE', 'single');
+define('BX_TIMELINE_ML_GALLERY', 'gallery');
+define('BX_TIMELINE_ML_SHOWCASE', 'showcase');
+
+//--- Default Attachments Media Layout
+define('BX_TIMELINE_AML_DEFAULT', BX_TIMELINE_ML_GALLERY);
+
+class BxTimelineModule extends BxBaseModNotificationsModule implements iBxDolContentInfoService
+{
+    protected $_sJsPostObject;
+    protected $_sJsViewObject;
+    protected $_aPostElements;
+    protected $_sJsOutlineObject;
+
+    protected $_sDividerTemplate;
+    protected $_sBalloonTemplate;
+    protected $_sCmtPostTemplate;
+    protected $_sCmtViewTemplate;
+    protected $_sCmtTemplate;
+
+    /**
+     * Constructor
+     */
+    function __construct($aModule)
+    {
+        parent::__construct($aModule);
+    }
+
+    /**
+     * ACTION METHODS
+     */
+    public function actionVideo($iEventId, $iVideoId)
+    {
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iEventId));
+        if(empty($aEvent) || !is_array($aEvent))
+            return;
+
+        $aData = $this->_oTemplate->getDataCached($aEvent);
+        if($aData === false || !isset($aData['content']['videos'][$iVideoId]))
+            return;
+
+        $oTemplate = BxDolTemplate::getInstance();
+        $oTemplate->addJs(array(
+            'embedly-player.min.js'
+        ));
+        $oTemplate->setPageNameIndex (BX_PAGE_EMBED);
+        $oTemplate->setPageContent ('page_main_code', $this->_oTemplate->getVideo($aEvent, $aData['content']['videos'][$iVideoId]));
+        $oTemplate->getPageCode();
+    }
+
+    public function actionPost()
+    {
+        $this->_iOwnerId = bx_process_input(bx_get('owner_id'), BX_DATA_INT);
+
+        $mixedAllowed = $this->isAllowedPost(true);
+        if($mixedAllowed !== true)
+            return echoJson(array('message' => strip_tags($mixedAllowed)));
+
+        echoJson($this->getFormPost());
+    }
+
+    public function actionEdit($iId)
+    {
+        $this->_iOwnerId = bx_process_input(bx_get('owner_id'), BX_DATA_INT);
+
+        $aBrowseParams = array();
+        if(bx_get('bp') !== false)
+            $aBrowseParams = $this->_oConfig->getBrowseParams(bx_process_input(bx_get('bp')));
+
+        $mixedAllowed = $this->isAllowedPost(true);
+        if($mixedAllowed !== true)
+            return echoJson(array('message' => strip_tags($mixedAllowed)));
+
+        echoJson($this->getFormEdit($iId, array('dynamic_mode' => true), $aBrowseParams));
+    }
+
+    function actionPin()
+    {
+        $iId = bx_process_input(bx_get('id'), BX_DATA_INT);
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iId));
+        if(empty($aEvent) || !is_array($aEvent))
+            return echoJson(array('code' => 1));
+
+        $aParams = $this->_prepareParamsGet();
+        $this->_iOwnerId = $aParams['owner_id'];
+        
+        $mixedAllowed = $this->{'isAllowed' . ((int)$aEvent['pinned'] == 0 ? 'Pin' : 'Unpin')}($aEvent, true);
+        if($mixedAllowed !== true)
+            return echoJson(array('code' => 2, 'message' => strip_tags($mixedAllowed)));
+
+        $aEvent['pinned'] = (int)$aEvent['pinned'] == 0 ? time() : 0;
+        if(!$this->_oDb->updateEvent(array('pinned' => $aEvent['pinned']), array('id' => $iId)))
+            return echoJson(array('code' => 3));
+
+        $this->_oDb->deleteCache(array('context_id' => $this->_iOwnerId)); //--- Delete cache for context
+
+        echoJson(array(
+            'code' => 0, 
+            'id' => $iId, 
+            'eval' => $this->_oConfig->getJsObjectView($aParams) . '.onPinPost(oData)'
+        ));
+    }
+
+    function actionStick()
+    {
+    	$iId = bx_process_input(bx_get('id'), BX_DATA_INT);
+    	$aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iId));
+        if(empty($aEvent) || !is_array($aEvent))
+            return echoJson(array('code' => 1));
+
+        $aParams = $this->_prepareParamsGet();
+        $this->_iOwnerId = $aParams['owner_id'];
+
+    	$mixedAllowed = $this->{'isAllowed' . ((int)$aEvent['sticked'] == 0 ? 'Stick' : 'Unstick')}($aEvent, true);
+    	if($mixedAllowed !== true)
+            return echoJson(array('code' => 2, 'message' => strip_tags($mixedAllowed)));
+
+    	$aEvent['sticked'] = (int)$aEvent['sticked'] == 0 ? time() : 0;
+    	if(!$this->_oDb->updateEvent(array('sticked' => $aEvent['sticked']), array('id' => $iId)))
+            return echoJson(array('code' => 3));
+
+        $this->_oDb->deleteCache(array('context_id' => 0)); //--- Delete cache for Public feed
+        $this->_oDb->deleteCache(array('context_id' => $this->_iOwnerId)); //--- Delete cache for context
+
+        bx_audit(
+            $iId, 
+            $this->getName(), 
+            '_sys_audit_action_' . ((int)$aEvent['sticked'] == 0 ? 'stick' : 'unstick'),  
+            $this->_prepareAuditParams($aEvent, false)
+        );
+        
+    	echoJson(array(
+            'code' => 0,
+            'id' => $iId,
+            'eval' => $this->_oConfig->getJsObjectView($aParams) . '.onStickPost(oData)'
+        ));
+    }
+
+    function actionPromote()
+    {
+        $this->_iOwnerId = bx_process_input(bx_get('owner_id'), BX_DATA_INT);
+
+        $iId = bx_process_input(bx_get('id'), BX_DATA_INT);
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iId));
+
+        $sAction = (int)$aEvent['promoted'] == 0 ? 'promote' : 'unpromote';
+
+        $mixedAllowed = $this->{'isAllowed' . ucfirst($sAction)}($aEvent, true);
+        if($mixedAllowed !== true)
+            return echoJson(array('code' => 1, 'message' => strip_tags($mixedAllowed)));
+
+        $aEvent['promoted'] = (int)$aEvent['promoted'] == 0 ? time() : 0;
+        if(!$this->_oDb->updateEvent(array('promoted' => $aEvent['promoted']), array('id' => $iId)))
+            return echoJson(array('code' => 2));
+
+        $this->_oDb->deleteCache(array('context_id' => 0)); //--- Delete cache for Public feed
+        $this->_oDb->deleteCache(array('context_id' => $this->_iOwnerId)); //--- Delete cache for context
+
+        bx_alert($this->_oConfig->getObject('alert'), $sAction . 'd', $iId, (int)$this->getUserId(), array(
+            'owner_id' => $aEvent['owner_id'],
+            'object_id' => $aEvent['object_id'],
+            'object_author_id' => $this->_oConfig->isSystem($aEvent['type'], $aEvent['action']) ? $aEvent['owner_id'] : $aEvent['object_id']
+        ));
+        
+        bx_audit(
+            $iId, 
+            $this->getName(), 
+            '_sys_audit_action_' . ((int)$aEvent['promoted'] == 0 ? 'promote' : 'unpromote'),  
+            $this->_prepareAuditParams($aEvent, false)
+        );
+
+        echoJson(array(
+            'code' => 0, 
+            'message' => _t('_bx_timeline_txt_msg_performed_action')
+        ));
+    }
+
+    function actionDelete()
+    {
+        $iId = bx_process_input(bx_get('id'), BX_DATA_INT);
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iId));
+        if(empty($aEvent) || !is_array($aEvent))
+            return echoJson(array('code' => 1));
+
+        $aParams = $this->_prepareParamsGet();
+        $this->_iOwnerId = $aParams['owner_id'];
+
+        $mixedAllowed = $this->isAllowedDelete($aEvent, true);
+        if($mixedAllowed !== true)
+            return echoJson(array('code' => 2, 'message' => strip_tags($mixedAllowed)));
+
+        if(!$this->deleteEvent($aEvent))
+            return echoJson(array('code' => 3));
+
+        $this->_oDb->deleteCache(array('event_id' => $iId));
+
+        echoJson(array(
+            'code' => 0, 
+            'id' => $aEvent['id'], 
+            'eval' => $this->_oConfig->getJsObjectView($aParams) . '.onDeletePost(oData)'
+        ));
+    }
+
+    public function actionRepost()
+    {
+    	$iAuthorId = $this->getUserId();
+        $iOwnerId = bx_process_input(bx_get('owner_id'), BX_DATA_INT);
+        $sType = bx_process_input(bx_get('type'), BX_DATA_TEXT);
+        $sAction = bx_process_input(bx_get('action'), BX_DATA_TEXT);
+        $iObjectId = bx_process_input(bx_get('object_id'), BX_DATA_INT);
+
+        $aResult = $this->serviceRepost($iAuthorId, $iOwnerId, $sType, $sAction, $iObjectId);
+        if(!empty($aResult) && is_array($aResult))
+            return echoJson($aResult);
+
+        $aReposted = $this->_oDb->getReposted($sType, $sAction, $iObjectId);
+        $sCounter = $this->_oTemplate->getRepostCounter($aReposted);
+
+        echoJson(array(
+            'code' => 0, 
+            'message' => _t('_bx_timeline_txt_msg_success_repost'), 
+            'count' => $aReposted['reposts'], 
+            'countf' => (int)$aReposted['reposts'] > 0 ? $this->_oTemplate->getRepostCounterLabel($aReposted['reposts']) : '',
+            'counter' => $sCounter,
+            'disabled' => true
+        ));
+    }
+
+    function actionGetView()
+    {
+        $aParams = $this->_prepareParamsGet();
+
+        $sConten = $this->_oTemplate->getViewBlock($aParams);
+        if(empty($sConten))
+            return echoJson(array());
+
+        echoJson(array(
+            'code' => 0, 
+            'content' => $sConten,
+        ));
+    }
+
+    function actionGetPost()
+    {
+        $aParams = $this->_prepareParamsGet();
+        $aParams['dynamic_mode'] = true;
+
+        $this->_iOwnerId = $aParams['owner_id'];
+
+        $sJsObject = ''; 
+        if(bx_get('js_object') !== false)
+            $sJsObject = bx_process_input(bx_get('js_object'));
+        if(empty($sJsObject))
+            $sJsObject = $this->_oConfig->getJsObject('post');
+
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => bx_process_input(bx_get('id'), BX_DATA_INT)));
+        if(empty($aEvent) || !is_array($aEvent))
+            return echoJson(array());
+
+        /**
+         * Note. Disabled for now, because Own posts on Timelines of Following members 
+         * became visible on posts' author Dashboard Timeline.
+         */
+        /*
+        $bAfpsLoading = (int)bx_get('afps_loading') === 1;
+        if($bAfpsLoading && $this->_iOwnerId != $aEvent['owner_id'])
+            return echoJson(array('message' => _t('_bx_timeline_txt_msg_posted')));
+        */
+
+        echoJson(array(
+            'id' => $aEvent['id'],
+            'name' => $aParams['name'],
+            'view' => $aParams['view'],
+            'type' => $aParams['type'],
+            'item' => $this->_oTemplate->getPost($aEvent, $aParams),
+            'eval' => $sJsObject . "._onGetPost(oData)"
+        ));
+    }
+
+    function actionGetPosts()
+    {
+        $aParams = $this->_prepareParamsGet();
+        list($sItems, $sLoadMore, $sBack, $sEmpty) = $this->_oTemplate->getPosts($aParams);
+
+        echoJson(array(
+            'view' => $aParams['view'],
+            'items' => $sItems, 
+            'load_more' => $sLoadMore, 
+            'back' => $sBack,
+            'empty' => $sEmpty,
+            'eval' => $this->_oConfig->getJsObjectView($aParams) . "._onGetPosts(oData)"
+        ));
+    }
+
+    public function actionGetPostForm()
+    {
+        $this->_iOwnerId = bx_process_input(bx_get('owner_id'), BX_DATA_INT);
+        $sType = bx_process_input(bx_get('type'));
+
+        echoJson($this->getFormPost(array(
+            'type' => $sType,
+            'form_display' => $this->_oConfig->getPostFormDisplay($sType)
+        )));
+    }
+
+    public function actionGetEditForm($iId)
+    {
+        $aParams = $this->_prepareParamsGet();
+        $this->_iOwnerId = $aParams['owner_id'];
+
+        echoJson($this->getFormEdit($iId, array('dynamic_mode' => true), $aParams));
+    }
+
+    public function actionGetComments()
+    {
+        $this->_iOwnerId = bx_process_input(bx_get('owner_id'), BX_DATA_INT);
+
+        $sSystem = bx_process_input(bx_get('system'), BX_DATA_TEXT);
+        $iId = bx_process_input(bx_get('id'), BX_DATA_INT);
+        $sComments = $this->_oTemplate->getComments($sSystem, $iId, array('dynamic_mode' => true));
+
+        echoJson(array('content' => $sComments));
+    }
+
+    public function actionAddAttachLink()
+    {
+        $sUrl = bx_process_input(bx_get('url'));
+        if(empty($sUrl))
+            return echoJson(array());
+
+        echoJson($this->addAttachLink(array(
+            'url' => $sUrl
+        )));
+    }
+
+    public function actionDeleteAttachLink()
+    {
+    	$iUserId = $this->getUserId();
+        $iLinkId = bx_process_input(bx_get('id'), BX_DATA_INT);
+        if(empty($iLinkId)) {
+            echoJson(array());
+            return;
+        }
+
+        $aLink = $this->_oDb->getUnusedLinks($iUserId, $iLinkId);
+    	if(empty($aLink) || !is_array($aLink)) {
+            echoJson(array());
+            return;
+        }
+
+		if(!empty($aLink['media_id']))
+			BxDolStorage::getObjectInstance($this->_oConfig->getObject('storage_photos'))->deleteFile($aLink['media_id']);
+
+        $aResult = array();
+        if($this->_oDb->deleteUnusedLinks($iUserId, $iLinkId))
+            $aResult = array('code' => 0);
+        else
+            $aResult = array('code' => 1, 'message' => _t('_bx_timeline_form_post_input_link_err_delete'));
+
+        echoJson($aResult);
+    }
+
+    public function actionGetAttachLinkForm()
+    {
+        echo $this->_oTemplate->getAttachLinkForm();
+    }
+
+    public function actionSubmitAttachLinkForm()
+    {
+        echoJson($this->getFormAttachLink());
+    }
+
+    public function actionGetRepostedBy()
+    {
+        $iRepostedId = bx_process_input(bx_get('id'), BX_DATA_INT);
+
+        echo $this->_oTemplate->getRepostedBy($iRepostedId);
+    }
+
+    public function actionGetItemBrief()
+    {
+        $iEvent = bx_process_input(bx_get('id'), BX_DATA_INT);
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iEvent));
+        if(empty($aEvent) || !is_array($aEvent)) {
+            echo MsgBox(_t('_Empty'));
+            return;
+        }
+
+        if(!$this->isAllowedView($aEvent)) {
+            echo MsgBox(_t('_sys_access_denied_to_private_content'));
+            return;
+        }        
+
+        echo BxDolPage::getObjectInstance($this->_oConfig->getObject('page_item_brief'), $this->_oTemplate)->getCodeDynamic();
+    }
+
+    public function actionGetJumpTo()
+    {
+        $aParams = $this->_prepareParamsGet();
+        $this->_iOwnerId = $aParams['owner_id'];
+
+        $sJsObjectView = $this->_oConfig->getJsObjectView($aParams);
+
+        echoJson(array(
+            'content' => $this->_oTemplate->getJumpTo($aParams),
+            'eval' => $sJsObjectView . '.onGetJumpTo(oData)'
+        ));
+    }
+
+    public function actionResumeLiveUpdate()
+    {
+        $aParams = $this->_prepareParamsGet();
+    	$sKey = $this->_oConfig->getLiveUpdateKey($aParams);
+
+    	bx_import('BxDolSession');
+    	BxDolSession::getInstance()->unsetValue($sKey);
+    }
+
+    public function actionPauseLiveUpdate()
+    {
+        $aParams = $this->_prepareParamsGet();
+    	$sKey = $this->_oConfig->getLiveUpdateKey($aParams);
+
+    	bx_import('BxDolSession');
+    	BxDolSession::getInstance()->setValue($sKey, 1);
+    }
+
+    function actionRss()
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $aArgs = func_get_args();
+
+        $sType = array_shift($aArgs);
+        $iOwnerId = 0;
+
+        switch($sType) {
+            case BX_BASE_MOD_NTFS_TYPE_OWNER:
+                $iOwnerId = array_shift($aArgs);
+                list($sUserName) = $this->getUserInfo($iOwnerId);
+
+                $sRssCaption = _t('_bx_timeline_txt_rss_caption', $sUserName);
+                $sRssLink = $this->_oConfig->getViewUrl($iOwnerId);
+                break;
+
+            case BX_BASE_MOD_NTFS_TYPE_PUBLIC:
+                $sRssCaption = _t('_bx_timeline_page_title_view_home');
+                $sRssLink = $this->_oConfig->getHomeViewUrl();
+                break;
+        }
+
+        $aParams = $this->_prepareParams(array(
+            'view' => BX_TIMELINE_VIEW_DEFAULT,
+            'type' => $sType,
+            'owner_id' => $iOwnerId,
+            'start' => 0, 
+            'per_page' => $this->_oConfig->getRssLength(), 
+            'timeline' => 0, 
+            'filter' => '', 
+            'modules' => array()
+        ));
+        $aEvents = $this->_oDb->getEvents($aParams);
+
+        $oPrivacy = BxDolPrivacy::getObjectInstance($this->_oConfig->getObject('privacy_view'));
+
+        $aRssData = array();
+        foreach($aEvents as $aEvent) {
+            if(empty($aEvent['title'])) 
+                continue;
+
+            $iEventId = (int)$aEvent[$CNF['FIELD_ID']];
+            $sEventFieldAuthor = $this->_oConfig->isSystem($aEvent['type'], $aEvent['action']) ? 'owner_id' : 'object_id';
+
+            if($oPrivacy) {
+                $oPrivacy->setTableFieldAuthor($sEventFieldAuthor);
+                if(!$oPrivacy->check($iEventId))
+                    continue;
+            }
+
+            $iOwner = $aEvent[$sEventFieldAuthor];
+            $oOwner = BxDolProfile::getInstanceMagic($iOwner);
+
+            $aRssData[$iEventId] = array(
+               'UnitID' => $iEventId,
+               'UnitTitle' => $aEvent['title'],
+               'UnitLink' => $this->_oConfig->getItemViewUrl($aEvent),
+               'UnitDesc' => bx_replace_markers($aEvent['description'], array(
+                    'profile_name' => $oOwner->getDisplayName()
+                )),
+               'UnitDateTimeUTS' => $aEvent['date'],
+            );
+        }
+
+        $oRss = new BxDolRssFactory();
+
+        header('Content-Type: application/xml; charset=utf-8');
+        echo $oRss->GenRssByData($aRssData, $sRssCaption, $sRssLink);
+    }
+
+
+    /**
+     * SERVICE METHODS
+     */
+
+    public function serviceGetSafeServices()
+    {
+        $a = parent::serviceGetSafeServices();
+        return array_merge($a, array (
+            'GetCreatePostForm' => '',
+            'GetSearchResultUnit' => '',
+            'GetBlockPost' => '',
+            'GetBlockPostProfile' => '',
+            'GetBlockPostHome' => '',
+            'GetBlockPostAccount' => '',
+            'GetBlockView' => '',
+            'GetBlockViewOutline' => '',
+            'GetBlockViewProfile' => '',
+            'GetBlockViewProfileOutline' => '',
+            'GetBlockViewsTimeline' => '',
+            'GetBlockViewsOutline' => '',
+            'GetBlockViewHome' => '',
+            'GetBlockViewHomeOutline' => '',
+            'GetBlockViewHot' => '',
+            'GetBlockViewHotOutline' => '',
+            'GetBlockViewAccount' => '',
+            'GetBlockViewAccountOutline' => '',
+        ));
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-get_content_owner_profile_id get_content_owner_profile_id
+     * 
+     * @code bx_srv('bx_timeline', 'get_content_owner_profile_id', [...]); @endcode
+     * 
+     * Get event's owner profile id.
+     * 
+     * @param $mixedEvent integer value with event ID or an array with event info.
+     * @return event's owner profile id.
+     * 
+     * @see BxTimelineModule::serviceGetContentOwnerProfileId
+     */
+    /** 
+     * @ref bx_timeline-get_content_owner_profile_id "get_content_owner_profile_id"
+     */
+    public function serviceGetContentOwnerProfileId($mixedEvent)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $iProfile = (int)bx_get_logged_profile_id();
+        if(empty($mixedEvent))
+            return $iProfile;
+
+        if(!is_array($mixedEvent))
+            $mixedEvent = $this->_oDb->getContentInfoById((int)$mixedEvent);
+
+        if(empty($mixedEvent) || !is_array($mixedEvent) || !isset($mixedEvent[$CNF['FIELD_SYSTEM']]))
+            return $iProfile;
+
+        if((int)$mixedEvent[$CNF['FIELD_SYSTEM']] == 0)
+            return (int)$mixedEvent[$CNF['FIELD_OBJECT_ID']];
+
+        if(!empty($mixedEvent['object_owner_id']))
+            return (int)$mixedEvent['object_owner_id'];
+
+        if(!empty($mixedEvent['content'])) {
+            $aContent = unserialize($mixedEvent['content']);
+
+            if(!empty($aContent) && is_array($aContent) && !empty($aContent['object_author_id']))
+                return (int)$aContent['object_author_id'];
+        }
+
+        $aEventData = $this->_oTemplate->getData($mixedEvent);
+        if(!empty($aEventData) && is_array($aEventData) && !empty($aEventData['object_owner_id']))
+            return (int)$aEventData['object_owner_id'];
+
+        return $iProfile;
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-get_create_post_form get_create_post_form
+     * 
+     * @code bx_srv('bx_timeline', 'get_create_post_form', [...]); @endcode
+     * 
+     * Get form code for add content. Is needed for United Post Form.
+     * 
+     * @param $aParams optional array with parameters(display name, etc)
+     * @return form code or error
+     * 
+     * @see BxTimelineModule::serviceGetCreatePostForm
+     */
+    /** 
+     * @ref bx_timeline-get_create_post_form "get_create_post_form"
+     */
+    public function serviceGetCreatePostForm($aParams = array())
+    {
+    	$aParams = array_merge($this->_aFormParams, $aParams);
+
+        $bContext = $aParams['context_id'] !== false;
+        $this->_iOwnerId = $bContext ? abs($aParams['context_id']) : 0;
+
+    	$oForm = $this->serviceGetObjectForm('add', $aParams);
+    	if(!$oForm)
+            return '';
+
+        $aParams['type'] = BX_BASE_MOD_NTFS_TYPE_PUBLIC;
+        $aParams['form_display'] = 'form_display_post_add_public';
+        if($bContext) {
+            if($aParams['context_id'] < 0) {
+                $aParams['type'] = BX_BASE_MOD_NTFS_TYPE_OWNER;
+                $aParams['form_display'] = 'form_display_post_add_profile';
+            }
+            else {
+                $aParams['type'] = BX_TIMELINE_TYPE_FEED;
+                $aParams['form_display'] = 'form_display_post_add';
+            }
+        }
+
+        if(!empty($aParams['display']))
+            $aParams['form_display'] = $aParams['display'];
+
+    	$aResult = $this->getFormPost($aParams);
+    	if(!empty($aResult['form'])) {
+            $bDynamicMode = isset($aParams['dynamic_mode']) && $aParams['dynamic_mode'];
+
+            $sCode = '';
+            $sCode .= $this->_oTemplate->getJsCodePost($this->_iOwnerId, $aParams, true, $bDynamicMode);
+            $sCode .= $aResult['form'];
+            return $sCode;
+        }
+
+        if(!empty($aResult['message']))
+            return $aResult['message'];
+
+        return '';
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-get_object_form get_object_form
+     * 
+     * @code bx_srv('bx_timeline', 'get_object_form', [...]); @endcode
+     * 
+     * Get form object for add, edit, view or delete the content.
+     * 
+     * @param $sType 'add' is supported only 
+     * @param $aParams optional array with parameters(display name, etc)
+     * @return form object or false on error
+     * 
+     * @see BxTimelineModule::serviceGetObjectForm
+     */
+    /** 
+     * @ref bx_timeline-get_object_form "get_object_form"
+     */
+    public function serviceGetObjectForm ($sType, $aParams = array())
+    {
+    	if(!in_array($sType, array('add')))
+            return false;
+
+        $bContext = $aParams['context_id'] !== false;
+        if($bContext && ($oContextProfile = BxDolProfile::getInstance(abs($aParams['context_id']))) !== false)
+            if($oContextProfile->checkAllowedPostInProfile() !== CHECK_ACTION_RESULT_ALLOWED)
+                return false;
+
+        $aParams['type'] = BX_BASE_MOD_NTFS_TYPE_PUBLIC;
+        $aParams['form_display'] = 'form_display_post_add_public';
+        if($bContext) {
+            if($aParams['context_id'] < 0) {
+                $aParams['type'] = BX_BASE_MOD_NTFS_TYPE_OWNER;
+                $aParams['form_display'] = 'form_display_post_add_profile';
+            }
+            else {
+                $aParams['type'] = BX_TIMELINE_TYPE_OWNER_AND_CONNECTIONS;
+                $aParams['form_display'] = 'form_display_post_add';
+            }
+        }
+
+        if(!empty($aParams['display']))
+            $aParams['form_display'] = $aParams['display'];
+
+        $oForm = $this->getFormPostObject($aParams);
+
+        bx_alert('system', 'get_object_form', 0, 0, array(
+            'module' => $this->_oConfig->getName(),
+            'type' => $sType,
+            'params' => $aParams,
+            'form' => &$oForm
+        ));
+
+    	return $oForm;
+    }
+    
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection get_timeline_post
+     * @see BxTimelineModule::serviceGetTimelinePost
+     *
+     * Get Timeline post. It's needed for Timeline module.
+     * 
+     * @param $aEvent timeline event array from Timeline module
+     * @return array in special format which is needed specifically for Timeline module to display the data.
+     */
+    public function serviceGetTimelinePost($aEvent, $aBrowseParams = array())
+    {
+        $aContentInfo = $this->_oDb->getContentInfoById($aEvent['object_id']);
+        if(empty($aContentInfo) || !is_array($aContentInfo))
+            return false;
+
+        $aEvent = array_merge($aEvent, array(
+            'owner_id' => $aContentInfo['owner_id'],
+            'object_privacy_view' => $aContentInfo['object_privacy_view']
+        ));
+
+        /*
+         * Note. For 'Direct Timeline Posts' FIELD_OBJECT_ID contains post's author profile ID.
+         */
+        $this->_oConfig->CNF['FIELD_AUTHOR'] = $this->_oConfig->CNF['FIELD_OBJECT_ID'];
+        return parent::serviceGetTimelinePost($aEvent, $aBrowseParams);
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection get_timeline_post
+     * @see BxTimelineModule::serviceGetTimelinePostAllowedView
+     *
+     * Check Timeline post's visibility. It's needed for Timeline module, when its events 
+     * are accessed and checked from outside. For example, when they are referenced 
+     * from Channels module.
+     * 
+     * @param $aEvent timeline event array from Timeline module
+     * @return mixed value: CHECK_ACTION_RESULT_ALLOWED or text of some error message.
+     */
+    public function serviceGetTimelinePostAllowedView($aEvent)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $iOwnerId = (int)$aEvent[$CNF['FIELD_OWNER_ID']];
+        if($iOwnerId == 0)
+            return CHECK_ACTION_RESULT_ALLOWED;
+
+        $oOwner = BxDolProfile::getInstance($iOwnerId);
+        if(!$oOwner)
+            return CHECK_ACTION_RESULT_ALLOWED;
+
+        $sModule = $oOwner->getModule();
+        $aOwnerInfo = BxDolService::call($sModule, 'get_info', array($oOwner->getContentId(), false));
+        if(empty($aOwnerInfo) || !is_array($aOwnerInfo))
+            return CHECK_ACTION_RESULT_ALLOWED;
+
+        return BxDolService::call($sModule, 'check_allowed_view_for_profile', array($aOwnerInfo));
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-get_author get_author
+     * 
+     * @code bx_srv('bx_timeline', 'get_author', [...]); @endcode
+     * 
+     * Get author ID from content info by content ID. Is used in "Content Info Objects" system.
+     * 
+     * @param $iContentId integer value with content ID.
+     * @return integer value with author ID.
+     * 
+     * @see BxTimelineModule::serviceGetAuthor
+     */
+    /** 
+     * @ref bx_timeline-get_author "get_author"
+     */
+    public function serviceGetAuthor ($iContentId)
+    {
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iContentId));
+        if(empty($aEvent) || !is_array($aEvent))
+            return 0;
+
+        return $this->_oConfig->isSystem($aEvent['type'], $aEvent['action']) ? (int)$aEvent['owner_id'] : (int)$aEvent['object_id'];
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-get_date_changed get_date_changed
+     * 
+     * @code bx_srv('bx_timeline', 'get_date_changed', [...]); @endcode
+     * 
+     * Get date when the content was changed last time. Is used in "Content Info Objects" system.
+     * Note. In case of Timeline event 0 is returned everytime.
+     * 
+     * @param $iContentId integer value with content ID.
+     * @return integer value with changing date.
+     * 
+     * @see BxTimelineModule::serviceGetDateChanged
+     */
+    /** 
+     * @ref bx_timeline-get_date_changed "get_date_changed"
+     */
+    public function serviceGetDateChanged ($iContentId)
+    {
+        return 0;
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-get_link get_link
+     * 
+     * @code bx_srv('bx_timeline', 'get_link', [...]); @endcode
+     * 
+     * Get content view page link. Is used in "Content Info Objects" system.
+     * 
+     * @param $iContentId integer value with content ID.
+     * @return string value with view page link.
+     * 
+     * @see BxTimelineModule::serviceGetLink
+     */
+    /** 
+     * @ref bx_timeline-get_link "get_link"
+     */
+    public function serviceGetLink ($iContentId)
+    {
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iContentId));
+        if(empty($aEvent) || !is_array($aEvent))
+            return '';
+
+        return $this->_oConfig->getItemViewUrl($aEvent);
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-get_thumb get_thumb
+     * 
+     * @code bx_srv('bx_timeline', 'get_thumb', [...]); @endcode
+     * 
+     * Get content thumbnail link. Is used in "Content Info Objects" system.
+     * Note. In case of Timeline event an empty string is returned everytime.
+     * 
+     * @param $iContentId integer value with content ID.
+     * @param $sTranscoder (optional) string value with transcoder name which should be applied to thumbnail image.
+     * @return string value with thumbnail link.
+     * 
+     * @see BxTimelineModule::serviceGetThumb
+     */
+    /** 
+     * @ref bx_timeline-get_thumb "get_thumb"
+     */
+    public function serviceGetThumb ($iContentId, $sTranscoder = '') 
+    {
+        return '';
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-get_info get_info
+     * 
+     * @code bx_srv('bx_timeline', 'get_info', [...]); @endcode
+     * 
+     * Get content info by content ID. Is used in "Content Info Objects" system.
+     * 
+     * @param $iContentId integer value with content ID.
+     * @param $bSearchableFieldsOnly (optional) boolean value determining all info or "searchable fields" only will be returned.
+     * @return an array with content info. Empty array is returned if something is wrong.
+     * 
+     * @see BxTimelineModule::serviceGetInfo
+     */
+    /** 
+     * @ref bx_timeline-get_info "get_info"
+     */
+    public function serviceGetInfo ($iContentId, $bSearchableFieldsOnly = true)
+    {
+        $aContentInfo = $this->_oDb->getEvents(array(
+        	'browse' => 'id', 
+        	'value' => $iContentId)
+        );
+
+        return BxDolContentInfo::formatFields($aContentInfo);
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-get_search_result_unit get_search_result_unit
+     * 
+     * @code bx_srv('bx_timeline', 'get_search_result_unit', [...]); @endcode
+     * 
+     * Get search result unit by content ID. Is used in "Content Info Objects" system.
+     * 
+     * @param $iContentId integer value with content ID.
+     * @param $sUnitTemplate (optional) string value with template name.
+     * @return HTML string with search result unit. Empty string is returned if something is wrong.
+     * 
+     * @see BxTimelineModule::serviceGetSearchResultUnit
+     */
+    /** 
+     * @ref bx_timeline-get_search_result_unit "get_search_result_unit"
+     */
+    public function serviceGetSearchResultUnit ($iContentId, $sUnitTemplate = '')
+    {
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iContentId));
+        if(empty($aEvent) || !is_array($aEvent))
+            return '';
+
+        if(empty($sUnitTemplate))
+            $sUnitTemplate = 'unit.html';
+
+        return $this->_oTemplate->unit($aEvent, true, $sUnitTemplate);
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-page_blocks Page Blocks
+     * @subsubsection bx_timeline-get_block_post get_block_post
+     * 
+     * @code bx_srv('bx_timeline', 'get_block_post', [...]); @endcode
+     * 
+     * Get Post block for a separate page.
+     *
+     * @param $iProfileId (optional) profile ID. If empty value is provided, an attempt to get it from GET/POST arrays will be performed.
+     * @return an array describing a block to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetBlockPost
+     */
+    /** 
+     * @ref bx_timeline-get_block_post "get_block_post"
+     */
+    public function serviceGetBlockPost($iProfileId = 0)
+    {
+    	if(empty($iProfileId) && bx_get('profile_id') !== false)
+            $iProfileId = bx_process_input(bx_get('profile_id'), BX_DATA_INT);
+
+        if(empty($iProfileId) && isLogged())
+            $iProfileId = bx_get_logged_profile_id();
+
+        if(!$iProfileId)
+            return array();
+
+        $sType = BX_BASE_MOD_NTFS_TYPE_OWNER;
+        return $this->_getBlockPost($iProfileId, array(
+            'type' => $sType,
+            'form_display' => $this->_oConfig->getPostFormDisplay($sType)
+        ));
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-page_blocks Page Blocks
+     * @subsubsection bx_timeline-get_block_post_profile get_block_post_profile
+     * 
+     * @code bx_srv('bx_timeline', 'get_block_post_profile', [...]); @endcode
+     * 
+     * Get Post block for the Profile page.
+     *
+     * @param $sProfileModule (optional) string value with profile based module name. Persons module is used by default.
+     * @param $iProfileContentId (optional) profile's content ID. If empty value is provided, an attempt to get it from GET/POST arrays will be performed.
+     * @return an array describing a block to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetBlockPostProfile
+     */
+    /** 
+     * @ref bx_timeline-get_block_post_profile "get_block_post_profile"
+     */
+    public function serviceGetBlockPostProfile($sProfileModule = 'bx_persons', $iProfileContentId = 0)
+    {
+        if(empty($sProfileModule))
+            return array();
+
+    	if(empty($iProfileContentId) && bx_get('id') !== false)
+            $iProfileContentId = bx_process_input(bx_get('id'), BX_DATA_INT);
+
+        $oProfile = BxDolProfile::getInstanceByContentAndType($iProfileContentId, $sProfileModule);
+        if(empty($oProfile))
+            return array();
+
+        $iProfileId = $oProfile->id();
+        $sType = BX_BASE_MOD_NTFS_TYPE_OWNER;
+        return $this->_getBlockPost($iProfileId, array(
+            'type' => $sType,
+            'form_display' => $this->_oConfig->getPostFormDisplay($sType)
+        ));
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-page_blocks Page Blocks
+     * @subsubsection bx_timeline-get_block_post_home get_block_post_home
+     * 
+     * @code bx_srv('bx_timeline', 'get_block_post_home', [...]); @endcode
+     * 
+     * Get Post block for site's Home page.
+     *
+     * @return an array describing a block to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetBlockPostHome
+     */
+    /** 
+     * @ref bx_timeline-get_block_post_home "get_block_post_home"
+     */
+    public function serviceGetBlockPostHome()
+    {
+        $iProfileId = 0;
+        $sType = BX_BASE_MOD_NTFS_TYPE_PUBLIC;
+        return $this->_getBlockPost($iProfileId, array(
+            'type' => $sType,
+            'form_display' => $this->_oConfig->getPostFormDisplay($sType)
+        ));
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-page_blocks Page Blocks
+     * @subsubsection bx_timeline-get_block_post_account get_block_post_account
+     * 
+     * @code bx_srv('bx_timeline', 'get_block_post_account', [...]); @endcode
+     * 
+     * Get Post block for the Dashboard page.
+     *
+     * @return an array describing a block to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetBlockPostAccount
+     */
+    /** 
+     * @ref bx_timeline-get_block_post_account "get_block_post_account"
+     */
+    public function serviceGetBlockPostAccount()
+    {
+        if(!isLogged())
+            return '';
+
+        $iProfileId = $this->getProfileId();
+        $sType = BX_TIMELINE_TYPE_FEED;
+        return $this->_getBlockPost($iProfileId, array(
+            'type' => $sType,
+            'form_display' => $this->_oConfig->getPostFormDisplay($sType)
+        ));
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-page_blocks Page Blocks
+     * @subsubsection bx_timeline-get_block_view get_block_view
+     * 
+     * @code bx_srv('bx_timeline', 'get_block_view', [...]); @endcode
+     * 
+     * Get Timeline View block for a separate page.
+     *
+     * @param $iProfileId (optional) profile ID. If empty value is provided, an attempt to get it from GET/POST arrays will be performed.
+     * @return an array describing a block to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetBlockView
+     */
+    /** 
+     * @ref bx_timeline-get_block_view "get_block_view"
+     */
+    public function serviceGetBlockView($iProfileId = 0)
+    {
+    	return $this->_serviceGetBlockView($iProfileId, array(
+            'view' => BX_TIMELINE_VIEW_TIMELINE, 
+            'type' => BX_BASE_MOD_NTFS_TYPE_OWNER, 
+            'start' => -1, 
+            'per_page' => -1, 
+            'per_page_default' => $this->_oConfig->getPerPage('profile'), 
+            'timeline' => -1, 
+            'filter' => '', 
+            'modules' => array()
+        ));
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-page_blocks Page Blocks
+     * @subsubsection bx_timeline-get_block_view_outline get_block_view_outline
+     * 
+     * @code bx_srv('bx_timeline', 'get_block_view_outline', [...]); @endcode
+     * 
+     * Get Outline View block for a separate page.
+     * 
+     * @param $iProfileId (optional) profile ID. If empty value is provided, an attempt to get it from GET/POST arrays will be performed.
+     * @return an array describing a block to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetBlockViewOutline
+     */
+    /** 
+     * @ref bx_timeline-get_block_view_outline "get_block_view_outline"
+     */
+    public function serviceGetBlockViewOutline($iProfileId = 0)
+    {
+        return $this->_serviceGetBlockView($iProfileId, array(
+            'view' => BX_TIMELINE_VIEW_OUTLINE, 
+            'type' => BX_BASE_MOD_NTFS_TYPE_OWNER, 
+            'start' => -1, 
+            'per_page' => -1, 
+            'per_page_default' => $this->_oConfig->getPerPage('profile'), 
+            'timeline' => -1, 
+            'filter' => '', 
+            'modules' => array()
+        ));
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-page_blocks Page Blocks
+     * @subsubsection bx_timeline-get_block_view_profile get_block_view_profile
+     * 
+     * @code bx_srv('bx_timeline', 'get_block_view_profile', [...]); @endcode
+     * 
+     * Get Timeline View block for the Profile page.
+     * 
+     * @param $sProfileModule (optional) string value with profile based module name. Persons module is used by default.
+     * @param $iProfileContentId (optional) profile's content ID. If empty value is provided, an attempt to get it from GET/POST arrays will be performed.
+     * @param $iStart (optional) integer value with a page number. Is used in pagination.
+     * @param $iPerPage (optional) integer value with a number of items per page. Is used in pagination. 
+     * @param $sFilter (optional) string value with filter name.
+     * @param $aModules (optional) an array of modules from which the events should be displayed. All available modules are used by default.
+     * @param $iTimeline (optional) integer value determining whether the timeline should be displayed or not.
+     * @return an array describing a block to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetBlockViewProfile
+     */
+    /** 
+     * @ref bx_timeline-get_block_view_profile "get_block_view_profile"
+     */
+    public function serviceGetBlockViewProfile($sProfileModule = 'bx_persons', $iProfileContentId = 0, $iStart = -1, $iPerPage = -1, $sFilter = '', $aModules = array(), $iTimeline = -1)
+    {
+        return $this->_serviceGetBlockViewProfile($sProfileModule, $iProfileContentId, array(
+            'view' => BX_TIMELINE_VIEW_TIMELINE, 
+            'type' => BX_BASE_MOD_NTFS_TYPE_OWNER, 
+            'start' => $iStart, 
+            'per_page' => $iPerPage, 
+            'per_page_default' => $this->_oConfig->getPerPage('profile'), 
+            'timeline' => $iTimeline, 
+            'filter' => $sFilter, 
+            'modules' => $aModules
+        ));
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-page_blocks Page Blocks
+     * @subsubsection bx_timeline-get_block_view_profile_outline get_block_view_profile_outline
+     * 
+     * @code bx_srv('bx_timeline', 'get_block_view_profile_outline', [...]); @endcode
+     * 
+     * Get Outline View block for the Profile page.
+     * 
+     * @param $sProfileModule (optional) string value with profile based module name. Persons module is used by default.
+     * @param $iProfileContentId (optional) profile's content ID. If empty value is provided, an attempt to get it from GET/POST arrays will be performed.
+     * @param $iStart (optional) integer value with a page number. Is used in pagination.
+     * @param $iPerPage (optional) integer value with a number of items per page. Is used in pagination. 
+     * @param $sFilter (optional) string value with filter name.
+     * @param $aModules (optional) an array of modules from which the events should be displayed. All available modules are used by default.
+     * @param $iTimeline (optional) integer value determining whether the timeline should be displayed or not.
+     * @return an array describing a block to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetBlockViewProfileOutline
+     */
+    /** 
+     * @ref bx_timeline-get_block_view_profile_outline "get_block_view_profile_outline"
+     */
+    public function serviceGetBlockViewProfileOutline($sProfileModule = 'bx_persons', $iProfileContentId = 0, $iStart = -1, $iPerPage = -1, $sFilter = '', $aModules = array(), $iTimeline = -1)
+    {
+        return $this->_serviceGetBlockViewProfile($sProfileModule, $iProfileContentId, array(
+            'view' => BX_TIMELINE_VIEW_OUTLINE, 
+            'type' => BX_BASE_MOD_NTFS_TYPE_OWNER, 
+            'start' => $iStart, 
+            'per_page' => $iPerPage, 
+            'per_page_default' => $this->_oConfig->getPerPage('profile'), 
+            'timeline' => $iTimeline, 
+            'filter' => $sFilter, 
+            'modules' => $aModules
+        ));
+    }
+
+    public function serviceGetBlockViewsTimeline($sType = BX_BASE_MOD_NTFS_TYPE_PUBLIC, $iProfileId = 0, $iStart = -1, $iPerPage = -1, $iTimeline = -1, $sFilter = '', $aModules = array())
+    {
+        return $this->_serviceGetBlockViews(array(
+            'view' => BX_TIMELINE_VIEW_TIMELINE, 
+            'type' => $sType,
+            'owner_id' => $iProfileId,
+            'start' => $iStart, 
+            'per_page' => $iPerPage, 
+            'per_page_default' => $this->_oConfig->getPerPage(), 
+            'timeline' => $iTimeline, 
+            'filter' => $sFilter, 
+            'modules' => $aModules
+        ));
+    }
+    
+    public function serviceGetBlockViewsOutline($sType = BX_BASE_MOD_NTFS_TYPE_PUBLIC, $iProfileId = 0, $iStart = -1, $iPerPage = -1, $iTimeline = -1, $sFilter = '', $aModules = array())
+    {
+        return $this->_serviceGetBlockViews(array(
+            'view' => BX_TIMELINE_VIEW_OUTLINE, 
+            'type' => $sType,
+            'owner_id' => $iProfileId,
+            'start' => $iStart, 
+            'per_page' => $iPerPage, 
+            'per_page_default' => $this->_oConfig->getPerPage(), 
+            'timeline' => $iTimeline, 
+            'filter' => $sFilter, 
+            'modules' => $aModules
+        ));
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-page_blocks Page Blocks
+     * @subsubsection bx_timeline-get_block_view_home get_block_view_home
+     * 
+     * @code bx_srv('bx_timeline', 'get_block_view_home', [...]); @endcode
+     * 
+     * Get Timeline View block for site's Home page.
+     * 
+     * @param $iProfileId (optional) profile ID. 0 should be used here.
+     * @param $iStart (optional) integer value with a page number. Is used in pagination.
+     * @param $iPerPage (optional) integer value with a number of items per page. Is used in pagination.
+     * @param $iTimeline (optional) integer value determining whether the timeline should be displayed or not. 
+     * @param $sFilter (optional) string value with filter name.
+     * @param $aModules (optional) an array of modules from which the events should be displayed. All available modules are used by default.
+     * @return an array describing a block to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetBlockViewHome
+     */
+    /** 
+     * @ref bx_timeline-get_block_view_home "get_block_view_home"
+     */
+    public function serviceGetBlockViewHome($iProfileId = 0, $iStart = -1, $iPerPage = -1, $iTimeline = -1, $sFilter = '', $aModules = array())
+    {
+        return $this->_serviceGetBlockViewHome(array(
+            'view' => BX_TIMELINE_VIEW_TIMELINE, 
+            'type' => BX_BASE_MOD_NTFS_TYPE_PUBLIC,
+            'owner_id' => $iProfileId,
+            'start' => $iStart, 
+            'per_page' => $iPerPage, 
+            'per_page_default' => $this->_oConfig->getPerPage('home'), 
+            'timeline' => $iTimeline, 
+            'filter' => $sFilter, 
+            'modules' => $aModules
+        ));
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-page_blocks Page Blocks
+     * @subsubsection bx_timeline-get_block_view_home_outline get_block_view_home_outline
+     * 
+     * @code bx_srv('bx_timeline', 'get_block_view_home_outline', [...]); @endcode
+     * 
+     * Get Outline View block for site's Home page.
+     * 
+     * @param $iProfileId (optional) profile ID. 0 should be used here.
+     * @param $iStart (optional) integer value with a page number. Is used in pagination.
+     * @param $iPerPage (optional) integer value with a number of items per page. Is used in pagination.
+     * @param $iTimeline (optional) integer value determining whether the timeline should be displayed or not. 
+     * @param $sFilter (optional) string value with filter name.
+     * @param $aModules (optional) an array of modules from which the events should be displayed. All available modules are used by default.
+     * @return an array describing a block to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetBlockViewHomeOutline
+     */
+    /** 
+     * @ref bx_timeline-get_block_view_home_outline "get_block_view_home_outline"
+     */
+    public function serviceGetBlockViewHomeOutline($iProfileId = 0, $iStart = -1, $iPerPage = -1, $iTimeline = -1, $sFilter = '', $aModules = array())
+    {
+        return $this->_serviceGetBlockViewHome(array(
+            'view' => BX_TIMELINE_VIEW_OUTLINE, 
+            'type' => BX_BASE_MOD_NTFS_TYPE_PUBLIC,
+            'owner_id' => $iProfileId,
+            'start' => $iStart, 
+            'per_page' => $iPerPage, 
+            'per_page_default' => $this->_oConfig->getPerPage('home'), 
+            'timeline' => $iTimeline, 
+            'filter' => $sFilter, 
+            'modules' => $aModules
+        ));
+    }
+
+	/**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-page_blocks Page Blocks
+     * @subsubsection bx_timeline-get_block_view_hot get_block_view_hot
+     * 
+     * @code bx_srv('bx_timeline', 'get_block_view_hot', [...]); @endcode
+     * 
+     * Get Timeline View block with Hot public events.
+     * 
+     * @param $iProfileId (optional) profile ID. 0 should be used here.
+     * @param $iStart (optional) integer value with a page number. Is used in pagination.
+     * @param $iPerPage (optional) integer value with a number of items per page. Is used in pagination.
+     * @param $iTimeline (optional) integer value determining whether the timeline should be displayed or not. 
+     * @param $sFilter (optional) string value with filter name.
+     * @param $aModules (optional) an array of modules from which the events should be displayed. All available modules are used by default.
+     * @return an array describing a block to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetBlockViewHot
+     */
+    /** 
+     * @ref bx_timeline-get_block_view_hot "get_block_view_hot"
+     */
+    public function serviceGetBlockViewHot($iProfileId = 0, $iStart = -1, $iPerPage = -1, $iTimeline = -1, $sFilter = '', $aModules = array())
+    {
+        return $this->_serviceGetBlockViewHot(array(
+            'view' => BX_TIMELINE_VIEW_TIMELINE, 
+            'type' => BX_TIMELINE_TYPE_HOT,
+            'owner_id' => $iProfileId,
+            'start' => $iStart, 
+            'per_page' => $iPerPage, 
+            'per_page_default' => $this->_oConfig->getPerPage('home'), 
+            'timeline' => $iTimeline, 
+            'filter' => $sFilter, 
+            'modules' => $aModules
+        ));
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-page_blocks Page Blocks
+     * @subsubsection bx_timeline-get_block_view_hot_outline get_block_view_hot_outline
+     * 
+     * @code bx_srv('bx_timeline', 'get_block_view_hot_outline', [...]); @endcode
+     * 
+     * Get Outline View block with Hot public events.
+     * 
+     * @param $iProfileId (optional) profile ID. 0 should be used here.
+     * @param $iStart (optional) integer value with a page number. Is used in pagination.
+     * @param $iPerPage (optional) integer value with a number of items per page. Is used in pagination.
+     * @param $iTimeline (optional) integer value determining whether the timeline should be displayed or not. 
+     * @param $sFilter (optional) string value with filter name.
+     * @param $aModules (optional) an array of modules from which the events should be displayed. All available modules are used by default.
+     * @return an array describing a block to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetBlockViewHotOutline
+     */
+    /** 
+     * @ref bx_timeline-get_block_view_hot_outline "get_block_view_hot_outline"
+     */
+	public function serviceGetBlockViewHotOutline($iProfileId = 0, $iStart = -1, $iPerPage = -1, $iTimeline = -1, $sFilter = '', $aModules = array())
+    {
+        return $this->_serviceGetBlockViewHot(array(
+            'view' => BX_TIMELINE_VIEW_OUTLINE, 
+            'type' => BX_TIMELINE_TYPE_HOT, 
+            'owner_id' => $iProfileId, 
+            'start' => $iStart, 
+            'per_page' => $iPerPage, 
+            'per_page_default' => $this->_oConfig->getPerPage('home'), 
+            'timeline' => $iTimeline, 
+            'filter' => $sFilter, 
+            'modules' => $aModules
+        ));
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-page_blocks Page Blocks
+     * @subsubsection bx_timeline-get_block_view_account get_block_view_account
+     * 
+     * @code bx_srv('bx_timeline', 'get_block_view_account', [...]); @endcode
+     * 
+     * Get Timeline View block for the Dashboard page.
+     * 
+     * @param $iProfileId (optional) profile ID. 0 should be used here.
+     * @param $iStart (optional) integer value with a page number. Is used in pagination.
+     * @param $iPerPage (optional) integer value with a number of items per page. Is used in pagination.
+     * @param $iTimeline (optional) integer value determining whether the timeline should be displayed or not. 
+     * @param $sFilter (optional) string value with filter name.
+     * @param $aModules (optional) an array of modules from which the events should be displayed. All available modules are used by default.
+     * @return an array describing a block to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetBlockViewAccount
+     */
+    /** 
+     * @ref bx_timeline-get_block_view_account "get_block_view_account"
+     */
+    public function serviceGetBlockViewAccount($iProfileId = 0, $iStart = -1, $iPerPage = -1, $iTimeline = -1, $sFilter = '', $aModules = array())
+    {
+        if(!isLogged())
+            return '';
+
+        return $this->_serviceGetBlockViewByType(array(
+            'view' => BX_TIMELINE_VIEW_TIMELINE, 
+            'type' => BX_TIMELINE_TYPE_OWNER_AND_CONNECTIONS, 
+            'owner_id' => $iProfileId, 
+            'start' => $iStart, 
+            'per_page' => $iPerPage, 
+            'per_page_default' => $this->_oConfig->getPerPage('account'), 
+            'timeline' => $iTimeline, 
+            'filter' => $sFilter, 
+            'modules' => $aModules
+        ));
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-page_blocks Page Blocks
+     * @subsubsection bx_timeline-get_block_view_account_outline get_block_view_account_outline
+     * 
+     * @code bx_srv('bx_timeline', 'get_block_view_account_outline', [...]); @endcode
+     * 
+     * Get Outline View block for the Dashboard page.
+     * 
+     * @param $iProfileId (optional) profile ID. 0 should be used here.
+     * @param $iStart (optional) integer value with a page number. Is used in pagination.
+     * @param $iPerPage (optional) integer value with a number of items per page. Is used in pagination.
+     * @param $iTimeline (optional) integer value determining whether the timeline should be displayed or not. 
+     * @param $sFilter (optional) string value with filter name.
+     * @param $aModules (optional) an array of modules from which the events should be displayed. All available modules are used by default.
+     * @return an array describing a block to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetBlockViewAccountOutline
+     */
+    /** 
+     * @ref bx_timeline-get_block_view_account_outline "get_block_view_account_outline"
+     */
+    public function serviceGetBlockViewAccountOutline($iProfileId = 0, $iStart = -1, $iPerPage = -1, $iTimeline = -1, $sFilter = '', $aModules = array())
+    {
+        if(!isLogged())
+            return '';
+
+        return $this->_serviceGetBlockViewByType(array(
+            'view' => BX_TIMELINE_VIEW_OUTLINE, 
+            'type' => BX_TIMELINE_TYPE_OWNER_AND_CONNECTIONS,
+            'owner_id' => $iProfileId, 
+            'start' => $iStart, 
+            'per_page' => $iPerPage, 
+            'per_page_default' => $this->_oConfig->getPerPage('account'), 
+            'timeline' => $iTimeline, 
+            'filter' => $sFilter, 
+            'modules' => $aModules
+        ));
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-page_blocks Page Blocks
+     * @subsubsection bx_timeline-get_block_view_custom get_block_view_custom
+     * 
+     * @code bx_srv('bx_timeline', 'get_block_view_custom', [...]); @endcode
+     * 
+     * Get custom Timeline View block.
+     *
+     * @param $aParams (optional) an array with block parameneters.
+     * @return an array describing a block to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetBlockViewCustom
+     */
+    /** 
+     * @ref bx_timeline-get_block_view_custom "get_block_view_custom"
+     */
+    public function serviceGetBlockViewCustom($aParams = array())
+    {
+    	return $this->_serviceGetBlockViewByType($aParams);
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-page_blocks Page Blocks
+     * @subsubsection bx_timeline-get_block_item get_block_item
+     * 
+     * @code bx_srv('bx_timeline', 'get_block_item', [...]); @endcode
+     * 
+     * Get View Item block.
+     * 
+     * @return an array describing a block to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetBlockItem
+     */
+    /** 
+     * @ref bx_timeline-get_block_item "get_block_item"
+     */
+    public function serviceGetBlockItem()
+    {
+        $iItemId = bx_process_input(bx_get('id'), BX_DATA_INT);
+        if(!$iItemId)
+            return array();
+
+        $aParams = array(
+            'view' => BX_TIMELINE_VIEW_ITEM, 
+            'type' => BX_TIMELINE_TYPE_ITEM
+        );
+        $aParams = $this->_prepareParams($aParams);
+
+        return $this->_oTemplate->getItemBlock($iItemId, $aParams);
+    }
+
+    public function serviceGetBlockItemContent()
+    {
+        $iItemId = bx_process_input(bx_get('id'), BX_DATA_INT);
+        $sMode = bx_process_input(bx_get('mode'));
+        if(!$iItemId || !$sMode)
+            return '';
+            
+        return $this->_oTemplate->getItemBlockContent($iItemId, $sMode);
+    }
+    
+    public function serviceGetBlockItemInfo()
+    {
+        $iItemId = bx_process_input(bx_get('id'), BX_DATA_INT);
+        if(!$iItemId)
+            return '';
+
+        return $this->_oTemplate->getItemBlockInfo($iItemId);
+    }
+
+    public function serviceGetBlockItemComments()
+    {
+        $iItemId = bx_process_input(bx_get('id'), BX_DATA_INT);
+        if(!$iItemId)
+            return '';
+
+        return $this->_oTemplate->getItemBlockComments($iItemId);
+    }
+    
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-integration_notifications Integration with Notifications
+     * @subsubsection bx_timeline-get_notifications_data get_notifications_data
+     * 
+     * @code bx_srv('bx_timeline', 'get_notifications_data', [...]); @endcode
+     * 
+     * Data for Notifications module.
+     * 
+     * @return an array with special format.
+     * 
+     * @see BxTimelineModule::serviceGetNotificationsData
+     */
+    /** 
+     * @ref bx_timeline-get_notifications_data "get_notifications_data"
+     */
+    public function serviceGetNotificationsData()
+    {
+    	$sModule = $this->_aModule['name'];
+
+        return array(
+            'handlers' => array(
+                array('group' => $sModule . '_object', 'type' => 'insert', 'alert_unit' => $sModule, 'alert_action' => 'post_common', 'module_name' => $sModule, 'module_method' => 'get_notifications_post', 'module_class' => 'Module'),
+                array('group' => $sModule . '_object', 'type' => 'delete', 'alert_unit' => $sModule, 'alert_action' => 'delete'),
+
+                array('group' => $sModule . '_object_publish_failed', 'type' => 'insert', 'alert_unit' => $sModule, 'alert_action' => 'publish_failed', 'module_name' => $sModule, 'module_method' => 'get_notifications_post_publish_failed', 'module_class' => 'Module'),
+                array('group' => $sModule . '_object_publish_succeeded', 'type' => 'insert', 'alert_unit' => $sModule, 'alert_action' => 'publish_succeeded', 'module_name' => $sModule, 'module_method' => 'get_notifications_post_publish_succeeded', 'module_class' => 'Module'),
+
+                array('group' => $sModule . '_repost', 'type' => 'insert', 'alert_unit' => $sModule, 'alert_action' => 'repost', 'module_name' => $sModule, 'module_method' => 'get_notifications_repost', 'module_class' => 'Module'),
+                array('group' => $sModule . '_repost', 'type' => 'delete', 'alert_unit' => $sModule, 'alert_action' => 'delete_repost'),
+
+                array('group' => $sModule . '_comment', 'type' => 'insert', 'alert_unit' => $sModule, 'alert_action' => 'commentPost', 'module_name' => $sModule, 'module_method' => 'get_notifications_comment', 'module_class' => 'Module'),
+                array('group' => $sModule . '_comment', 'type' => 'delete', 'alert_unit' => $sModule, 'alert_action' => 'commentRemoved'),
+
+                array('group' => $sModule . '_vote', 'type' => 'insert', 'alert_unit' => $sModule, 'alert_action' => 'doVote', 'module_name' => $sModule, 'module_method' => 'get_notifications_vote', 'module_class' => 'Module'),
+                array('group' => $sModule . '_vote', 'type' => 'delete', 'alert_unit' => $sModule, 'alert_action' => 'undoVote'),
+
+                array('group' => $sModule . '_reaction', 'type' => 'insert', 'alert_unit' => $sModule . '_reactions', 'alert_action' => 'doVote', 'module_name' => $sModule, 'module_method' => 'get_notifications_reaction', 'module_class' => 'Module'),
+                array('group' => $sModule . '_reaction', 'type' => 'delete', 'alert_unit' => $sModule . '_reactions', 'alert_action' => 'undoVote'),
+
+                array('group' => $sModule . '_score_up', 'type' => 'insert', 'alert_unit' => $sModule, 'alert_action' => 'doVoteUp', 'module_name' => $sModule, 'module_method' => 'get_notifications_score_up', 'module_class' => 'Module'),
+
+                array('group' => $sModule . '_score_down', 'type' => 'insert', 'alert_unit' => $sModule, 'alert_action' => 'doVoteDown', 'module_name' => $sModule, 'module_method' => 'get_notifications_score_down', 'module_class' => 'Module'),
+            ),
+            'settings' => array(
+                array('group' => 'content', 'unit' => $sModule, 'action' => 'post_common', 'types' => array('personal', 'follow_member', 'follow_context')),
+                array('group' => 'content', 'unit' => $sModule, 'action' => 'publish_failed', 'types' => array('personal')),
+                array('group' => 'content', 'unit' => $sModule, 'action' => 'publish_succeeded', 'types' => array('personal')),
+                array('group' => 'content', 'unit' => $sModule, 'action' => 'repost', 'types' => array('follow_member', 'follow_context')),
+                array('group' => 'comment', 'unit' => $sModule, 'action' => 'commentPost', 'types' => array('personal', 'follow_member', 'follow_context')),
+                array('group' => 'vote', 'unit' => $sModule, 'action' => 'doVote', 'types' => array('personal', 'follow_member', 'follow_context')),
+                array('group' => 'vote', 'unit' => $sModule . '_reactions', 'action' => 'doVote', 'types' => array('personal', 'follow_member', 'follow_context')),
+                array('group' => 'score_up', 'unit' => $sModule, 'action' => 'doVoteUp', 'types' => array('personal', 'follow_member', 'follow_context')),
+                array('group' => 'score_down', 'unit' => $sModule, 'action' => 'doVoteDown', 'types' => array('personal', 'follow_member', 'follow_context'))
+            ),
+            'alerts' => array(
+                array('unit' => $sModule, 'action' => 'post_common'),
+                array('unit' => $sModule, 'action' => 'publish_failed'),
+                array('unit' => $sModule, 'action' => 'publish_succeeded'),
+                array('unit' => $sModule, 'action' => 'delete'),
+
+                array('unit' => $sModule, 'action' => 'repost'),
+                array('unit' => $sModule, 'action' => 'delete_repost'),
+                
+                array('unit' => $sModule, 'action' => 'commentPost'),
+                array('unit' => $sModule, 'action' => 'commentRemoved'),
+                
+                array('unit' => $sModule, 'action' => 'doVote'),
+                array('unit' => $sModule, 'action' => 'undoVote'),
+
+                array('unit' => $sModule . '_reactions', 'action' => 'doVote'),
+                array('unit' => $sModule . '_reactions', 'action' => 'undoVote'),
+
+                array('unit' => $sModule, 'action' => 'doVoteUp'),
+                array('unit' => $sModule, 'action' => 'doVoteDown'),
+            )
+        );
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-integration_notifications Integration with Notifications
+     * @subsubsection bx_timeline-get_notifications_repost get_notifications_repost
+     * 
+     * @code bx_srv('bx_timeline', 'get_notifications_repost', [...]); @endcode
+     * 
+     * Get data for Repost event to display in Notifications module.
+     * 
+     * @param $aEvent an array with event description.
+     * @return an array with special format.
+     * 
+     * @see BxTimelineModule::serviceGetNotificationsRepost
+     */
+    /** 
+     * @ref bx_timeline-get_notifications_repost "get_notifications_repost"
+     */
+    public function serviceGetNotificationsRepost($aEvent)
+    {
+        $aResult = $this->serviceGetNotificationsPost($aEvent);
+        $aResult['lang_key'] = '_bx_timeline_txt_object_reposted';
+
+        return $aResult;
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-integration_notifications Integration with Notifications
+     * @subsubsection bx_timeline-get_notifications_post get_notifications_post
+     * 
+     * @code bx_srv('bx_timeline', 'get_notifications_post', [...]); @endcode
+     * 
+     * Get data for Post event to display in Notifications module.
+     * 
+     * @param $aEvent an array with event description.
+     * @return an array with special format.
+     * 
+     * @see BxTimelineModule::serviceGetNotificationsPost
+     */
+    /** 
+     * @ref bx_timeline-get_notifications_post "get_notifications_post"
+     */
+    public function serviceGetNotificationsPost($aEvent)
+    {
+    	$CNF = &$this->_oConfig->CNF;
+
+        $iContent = (int)$aEvent['object_id'];
+        $aContent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iContent));
+        if(empty($aContent) || !is_array($aContent))
+            return array();
+
+        if($this->_oConfig->isSystem($aContent['type'], $aContent['action']))
+            $iEntryAuthor = (int)$aContent['owner_id'];
+        else
+            $iEntryAuthor = (int)$aContent['object_id'];
+
+        $sEntryCaption = call_user_func_array(array($this->_oConfig, 'getTitleShort'), !empty($aContent['title']) ? array($aContent['title']) : array($aContent['description'], $aContent['object_id']));
+
+        return array(
+            'entry_sample' => $CNF['T']['txt_sample_single_ext'],
+            'entry_url' => $this->_oConfig->getItemViewUrl($aContent),
+            'entry_caption' => $sEntryCaption,
+            'entry_author' => $iEntryAuthor,
+            'lang_key' => '' //may be empty or not specified. In this case the default one from Notification module will be used.
+        );
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-integration_notifications Integration with Notifications
+     * @subsubsection bx_timeline-get_notifications_comment get_notifications_comment
+     * 
+     * @code bx_srv('bx_timeline', 'get_notifications_comment', [...]); @endcode
+     * 
+     * Get data for Post Comment event to display in Notifications module.
+     * 
+     * @param $aEvent an array with event description.
+     * @return an array with special format.
+     * 
+     * @see BxTimelineModule::serviceGetNotificationsComment
+     */
+    /** 
+     * @ref bx_timeline-get_notifications_comment "get_notifications_comment"
+     */
+    public function serviceGetNotificationsComment($aEvent)
+    {
+    	$CNF = &$this->_oConfig->CNF;
+
+        $iContent = (int)$aEvent['object_id'];
+        $aContent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iContent));
+        if(empty($aContent) || !is_array($aContent))
+            return array();
+
+        $oComment = BxDolCmts::getObjectInstance($CNF['OBJECT_COMMENTS'], $iContent);
+        if(!$oComment || !$oComment->isEnabled())
+            return array();
+
+        $sEntryCaption = call_user_func_array(array($this->_oConfig, 'getTitleShort'), !empty($aContent['title']) ? array($aContent['title']) : array($aContent['description'], $aContent['object_id']));
+
+        return array(
+            'entry_sample' => $CNF['T']['txt_sample_single'],
+            'entry_url' => $this->_oConfig->getItemViewUrl($aContent),
+            'entry_caption' => $sEntryCaption,
+            'entry_author' => $aContent['owner_id'],
+            'subentry_sample' => $CNF['T']['txt_sample_comment_single'],
+            'subentry_url' => $oComment->getViewUrl((int)$aEvent['subobject_id']),
+            'lang_key' => '', //may be empty or not specified. In this case the default one from Notification module will be used.
+        );
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-integration_notifications Integration with Notifications
+     * @subsubsection bx_timeline-get_notifications_vote get_notifications_vote
+     * 
+     * @code bx_srv('bx_timeline', 'get_notifications_vote', [...]); @endcode
+     * 
+     * Get data for Vote event to display in Notifications module.
+     * 
+     * @param $aEvent an array with event description.
+     * @return an array with special format.
+     * 
+     * @see BxTimelineModule::serviceGetNotificationsVote
+     */
+    /** 
+     * @ref bx_timeline-get_notifications_vote "get_notifications_vote"
+     */
+    public function serviceGetNotificationsVote($aEvent)
+    {
+    	$CNF = &$this->_oConfig->CNF;
+
+        $iContent = (int)$aEvent['object_id'];
+        $aContent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iContent));
+        if(empty($aContent) || !is_array($aContent))
+            return array();
+
+        $oVote = BxDolVote::getObjectInstance($CNF['OBJECT_VOTES'], $iContent);
+        if(!$oVote || !$oVote->isEnabled())
+            return array();
+
+        $sEntryCaption = call_user_func_array(array($this->_oConfig, 'getTitleShort'), !empty($aContent['title']) ? array($aContent['title']) : array($aContent['description'], $aContent['object_id']));
+
+        return array(
+            'entry_sample' => $CNF['T']['txt_sample_single'],
+            'entry_url' => $this->_oConfig->getItemViewUrl($aContent),
+            'entry_caption' => $sEntryCaption,
+            'entry_author' => $aContent['owner_id'],
+            'subentry_sample' => $CNF['T']['txt_sample_vote_single'],
+            'lang_key' => '', //may be empty or not specified. In this case the default one from Notification module will be used.
+        );
+    }
+
+    /**
+     * Entry post vote for Notifications module
+     */
+    public function serviceGetNotificationsReaction($aEvent)
+    {
+    	$CNF = &$this->_oConfig->CNF;
+
+    	$iContent = (int)$aEvent['object_id'];
+        $aContent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iContent));
+        if(empty($aContent) || !is_array($aContent))
+            return array();
+
+        $oReaction = BxDolVote::getObjectInstance($CNF['OBJECT_REACTIONS'], $iContent);
+        if(!$oReaction || !$oReaction->isEnabled())
+            return array();
+
+        $aSubentry = $oReaction->getTrackBy(array('type' => 'id', 'id' => (int)$aEvent['subobject_id']));
+        if(empty($aSubentry) || !is_array($aSubentry))
+            return array();
+
+        $aSubentrySampleParams = array();
+        $aReaction = $oReaction->getReaction($aSubentry['reaction']);
+        if(!empty($aReaction['title']))
+            $aSubentrySampleParams[] = $aReaction['title'];
+        else
+            $aSubentrySampleParams[] = '_undefined';
+
+        $sEntryCaption = call_user_func_array(array($this->_oConfig, 'getTitleShort'), !empty($aContent['title']) ? array($aContent['title']) : array($aContent['description'], $aContent['object_id']));
+
+        return array(
+            'entry_sample' => $CNF['T']['txt_sample_single'],
+            'entry_url' => $this->_oConfig->getItemViewUrl($aContent),
+            'entry_caption' => $sEntryCaption,
+            'entry_author' => $aContent['owner_id'],
+            'subentry_sample' => $CNF['T']['txt_sample_reaction_single'],
+            'subentry_sample_params' => $aSubentrySampleParams,
+            'lang_key' => '', //may be empty or not specified. In this case the default one from Notification module will be used.
+        );
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-integration_notifications Integration with Notifications
+     * @subsubsection bx_timeline-get_notifications_score_up get_notifications_score_up
+     * 
+     * @code bx_srv('bx_timeline', 'get_notifications_score_up', [...]); @endcode
+     * 
+     * Get data for Score Up Vote event to display in Notifications module.
+     * 
+     * @param $aEvent an array with event description.
+     * @return an array with special format.
+     * 
+     * @see BxTimelineModule::serviceGetNotificationsScoreUp
+     */
+    /** 
+     * @ref bx_timeline-get_notifications_score_up "get_notifications_score_up"
+     */
+    public function serviceGetNotificationsScoreUp($aEvent)
+    {
+    	return $this->_serviceGetNotificationsScore('up', $aEvent);
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-integration_notifications Integration with Notifications
+     * @subsubsection bx_timeline-get_notifications_score_down get_notifications_score_down
+     * 
+     * @code bx_srv('bx_timeline', 'get_notifications_score_down', [...]); @endcode
+     * 
+     * Get data for Score Down Vote event to display in Notifications module.
+     * 
+     * @param $aEvent an array with event description.
+     * @return an array with special format.
+     * 
+     * @see BxTimelineModule::serviceGetNotificationsScoreDown
+     */
+    /** 
+     * @ref bx_timeline-get_notifications_score_down "get_notifications_score_down"
+     */
+    public function serviceGetNotificationsScoreDown($aEvent)
+    {
+    	return $this->_serviceGetNotificationsScore('down', $aEvent);
+    }
+
+
+    protected function _serviceGetNotificationsScore($sType, $aEvent)
+    {
+    	$CNF = &$this->_oConfig->CNF;
+
+        $iContent = (int)$aEvent['object_id'];
+        $aContent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iContent));
+        if(empty($aContent) || !is_array($aContent))
+            return array();
+
+        $oScore = BxDolScore::getObjectInstance($CNF['OBJECT_SCORES'], $iContent);
+        if(!$oScore || !$oScore->isEnabled())
+            return array();
+
+        $sEntryCaption = call_user_func_array(array($this->_oConfig, 'getTitleShort'), !empty($aContent['title']) ? array($aContent['title']) : array($aContent['description'], $aContent['object_id']));
+
+        return array(
+            'entry_sample' => $CNF['T']['txt_sample_single'],
+            'entry_url' => $this->_oConfig->getItemViewUrl($aContent),
+            'entry_caption' => $sEntryCaption,
+            'entry_author' => $aContent['owner_id'],
+            'subentry_sample' => $CNF['T']['txt_sample_score_' . $sType . '_single'],
+            'lang_key' => '', //may be empty or not specified. In this case the default one from Notification module will be used.
+        );
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-repost Repost
+     * @subsubsection bx_timeline-get_repost_element_block get_repost_element_block
+     * 
+     * @code bx_srv('bx_timeline', 'get_repost_element_block', [...]); @endcode
+     * 
+     * Get repost element for content based modules.
+     * 
+     * @param $iOwnerId integer value with owner profile ID.
+     * @param $sType string value with type (module name). 
+     * @param $sAction string value with action (module action). 
+     * @param $iObjectId integer value with object ID to be reposted. 
+     * @param $aParams (optional) an array with additional params.
+     * @return HTML string with repost element to display on the site, all necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetRepostElementBlock
+     */
+    /** 
+     * @ref bx_timeline-get_repost_element_block "get_repost_element_block"
+     */
+    public function serviceGetRepostElementBlock($iOwnerId, $sType, $sAction, $iObjectId, $aParams = array())
+    {
+    	if(!$this->isEnabled())
+    		return '';
+
+        $aParams = array_merge($this->_oConfig->getRepostDefaults(), $aParams);
+        return $this->_oTemplate->getRepostElement($iOwnerId, $sType, $sAction, $iObjectId, $aParams);
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-repost Repost
+     * @subsubsection bx_timeline-get_repost_counter get_repost_counter
+     * 
+     * @code bx_srv('bx_timeline', 'get_repost_counter', [...]); @endcode
+     * 
+     * Get repost counter.
+     * 
+     * @param $sType string value with type (module name). 
+     * @param $sAction string value with action (module action). 
+     * @param $iObjectId integer value with object ID to be reposted. 
+     * @return HTML string with repost counter to display on the site, all necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetRepostCounter
+     */
+    /** 
+     * @ref bx_timeline-get_repost_counter "get_repost_counter"
+     */
+    public function serviceGetRepostCounter($sType, $sAction, $iObjectId)
+    {
+    	if(!$this->isEnabled())
+    		return '';
+
+		$aReposted = $this->_oDb->getReposted($sType, $sAction, $iObjectId);
+
+        return $this->_oTemplate->getRepostCounter($aReposted);
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-repost Repost
+     * @subsubsection bx_timeline-get_repost_js_script get_repost_js_script
+     * 
+     * @code bx_srv('bx_timeline', 'get_repost_js_script', [...]); @endcode
+     * 
+     * Get repost JavaScript code.
+     * 
+     * @return HTML string with JavaScript code to display on the site, all necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxTimelineModule::serviceGetRepostJsScript
+     */
+    /** 
+     * @ref bx_timeline-get_repost_js_script "get_repost_js_script"
+     */
+    public function serviceGetRepostJsScript()
+    {
+    	if(!$this->isEnabled())
+    		return '';
+
+        return $this->_oTemplate->getRepostJsScript();
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-repost Repost
+     * @subsubsection bx_timeline-get_repost_js_click get_repost_js_click
+     * 
+     * @code bx_srv('bx_timeline', 'get_repost_js_click', [...]); @endcode
+     * 
+     * Get repost JavaScript code for OnClick event.
+     * 
+     * @param $iOwnerId integer value with owner profile ID.
+     * @param $sType string value with type (module name). 
+     * @param $sAction string value with action (module action). 
+     * @param $iObjectId integer value with object ID to be reposted. 
+     * @return HTML string with JavaScript code to display in OnClick events of HTML elements.
+     * 
+     * @see BxTimelineModule::serviceGetRepostJsClick
+     */
+    /** 
+     * @ref bx_timeline-get_repost_js_click "get_repost_js_click"
+     */
+    public function serviceGetRepostJsClick($iOwnerId, $sType, $sAction, $iObjectId)
+    {
+    	if(!$this->isEnabled())
+    		return '';
+
+        return $this->_oTemplate->getRepostJsClick($iOwnerId, $sType, $sAction, $iObjectId);
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-repost Repost
+     * @subsubsection bx_timeline-repost repost
+     * 
+     * @code bx_srv('bx_timeline', 'repost', [...]); @endcode
+     * 
+     * Perform repost action.
+     * 
+     * @param $iAuthorId integer value with performer profile ID.
+     * @param $iOwnerId integer value with repost event owner profile ID.
+     * @param $sType string value with type (module name). 
+     * @param $sAction string value with action (module action). 
+     * @param $iObjectId integer value with object ID to be reposted. 
+     * @parem $bForce boolean value force reposting without ACL check.
+     * @return an array with error (code and message) or integer with newly created repost event ID.
+     * 
+     * @see BxTimelineModule::serviceRepost
+     */
+    /** 
+     * @ref bx_timeline-repost "repost"
+     */
+    public function serviceRepost($iAuthorId, $iOwnerId, $sType, $sAction, $iObjectId, $bForce = false)
+    {
+        $aReposted = $this->_oDb->getReposted($sType, $sAction, $iObjectId);
+        if(empty($aReposted) || !is_array($aReposted))
+            return array('code' => 1, 'message' => _t('_bx_timeline_txt_err_cannot_repost'));
+
+        $mixedAllowed = $this->isAllowedRepost($aReposted, true);
+        if(!$bForce && $mixedAllowed !== true)
+            return array('code' => 2, 'message' => strip_tags($mixedAllowed));
+
+        $bReposted = $this->_oDb->isReposted($aReposted['id'], $iOwnerId, $iAuthorId);
+        if($bReposted)
+            return array('code' => 3, 'message' => _t('_bx_timeline_txt_err_already_reposted'));
+
+        $iId = $this->_oDb->insertEvent(array(
+            'owner_id' => $iOwnerId,
+            'system' => 0,
+            'type' => $this->_oConfig->getPrefix('common_post') . 'repost',
+            'action' => '',
+            'object_id' => $iAuthorId,
+            'object_privacy_view' => $this->_oConfig->getPrivacyViewDefault('object'),
+            'content' => serialize(array(
+                'type' => $sType,
+                'action' => $sAction,
+                'object_id' => $iObjectId,
+            )),
+            'title' => '',
+            'description' => ''
+        ));
+
+        if(empty($iId))
+            return array('code' => 4, 'message' => _t('_bx_timeline_txt_err_cannot_repost'));
+
+        $this->onRepost($iId, $aReposted);
+
+        return $iId;
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-repost Repost
+     * @subsubsection bx_timeline-repost_by_id repost_by_id
+     * 
+     * @code bx_srv('bx_timeline', 'repost_by_id', [...]); @endcode
+     * 
+     * Perform repost action by Timeline event ID.
+     * 
+     * @param $iAuthorId integer value with performer profile ID.
+     * @param $iOwnerId integer value with repost event owner profile ID.
+     * @param $iEventId integer value with event ID which will be reposted.
+     * @parem $bForce boolean value force reposting without ACL check.
+     * @return an array with error (code and message) or integer with newly created repost event ID.
+     * 
+     * @see BxTimelineModule::serviceRepostById
+     */
+    /** 
+     * @ref bx_timeline-repost_by_id "repost_by_id"
+     */
+    public function serviceRepostById($iAuthorId, $iOwnerId, $iEventId, $bForce = false)
+    {
+        $aEvent = $this->_oDb->getEntriesBy(array('type' => 'id', 'id' => $iEventId));
+        if(empty($aEvent) || !is_array($aEvent))
+            return array('code' => 1, 'message' => _t('_bx_timeline_txt_err_cannot_repost'));
+
+        $sType = $aEvent['type'];
+        $sAction = $aEvent['action'];
+        $iObjectId = $this->_oConfig->isSystem($sType, $sAction) ? $aEvent['object_id'] : $aEvent['id'];
+
+        $sCommonPrefix = $this->_oConfig->getPrefix('common_post');
+        if(str_replace($sCommonPrefix, '', $sType) == BX_TIMELINE_PARSE_TYPE_REPOST) {
+            $aReposted = $this->_oDb->getReposted($sType, $sAction, $iObjectId);
+            if(empty($aReposted) || !is_array($aReposted))
+                return array('code' => 1, 'message' => _t('_bx_timeline_txt_err_cannot_repost'));
+
+            $aRepostedData = unserialize($aEvent['content']);
+
+            $sType = $aRepostedData['type'];
+            $sAction = $aRepostedData['action'];
+            $iObjectId = $aRepostedData['object_id'];
+        }
+
+        return $this->serviceRepost($iAuthorId, $iOwnerId, $sType, $sAction, $iObjectId, $bForce);
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-update update
+     * 
+     * @code bx_srv('bx_timeline', 'update', [...]); @endcode
+     * 
+     * Update timeline event by ID.
+     * 
+     * @param $iEventId integer value with event ID.
+     * @param $aSet an array with key=>value pairs for fields which should be updated. 
+     * @return boolean value with the result of operation.
+     * 
+     * @see BxTimelineModule::serviceUpdate
+     */
+    /** 
+     * @ref bx_timeline-update "update"
+     */
+    public function serviceUpdate($iEventId, $aSet)
+    {
+        if(empty($iEventId))
+            return false;
+
+        return (int)$this->_oDb->updateEvent($aSet, array('id' => $iEventId)) > 0;
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-get_menu_item_addon_comment get_menu_item_addon_comment
+     * 
+     * @code bx_srv('bx_timeline', 'get_menu_item_addon_comment', [...]); @endcode
+     * 
+     * Get addon for Comment menu item.
+     * NOTE. The service isn't used for now because comment functionality in card was updated.
+     * 
+     * @param $sSystem string value with comments engine system.
+     * @param $iObjectId integer value with object ID. 
+     * @return HTML string to display in menu item.
+     * 
+     * @see BxTimelineModule::serviceGetMenuItemAddonComment
+     */
+    /** 
+     * @ref bx_timeline-get_menu_item_addon_comment "get_menu_item_addon_comment"
+     */
+    public function serviceGetMenuItemAddonComment($sSystem, $iObjectId, $aBrowseParams = array())
+    {
+        if(empty($sSystem) || empty($iObjectId))
+            return '';
+        
+        $oCmts = $this->getCmtsObject($sSystem, $iObjectId);
+        if($oCmts === false)
+            return '';
+
+        $iCounter = (int)$oCmts->getCommentsCount();
+        if(empty($iCounter))
+            return '';
+
+        return  $this->_oTemplate->parseLink('javascript:void(0)', $iCounter, array(
+            'class' => 'bx-menu-item-addon',
+            'title' => _t('_bx_timeline_menu_item_title_item_comment'),
+            'onclick' => "javascript:" . $this->_oConfig->getJsObjectView($aBrowseParams) . ".commentItem(this, '" . $sSystem . "', " . $iObjectId . ")" 
+        ));
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-get_settings_checker_helper get_settings_checker_helper
+     * 
+     * @code bx_srv('bx_timeline', 'get_settings_checker_helper', [...]); @endcode
+     * 
+     * Get Checker Helper class name for Forms engine.
+     * 
+     * @return string with Checker Helper class name.
+     * 
+     * @see BxTimelineModule::serviceGetSettingsCheckerHelper
+     */
+    /** 
+     * @ref bx_timeline-get_settings_checker_helper "get_settings_checker_helper"
+     */
+    public function serviceGetSettingsCheckerHelper()
+    {
+        bx_import('FormCheckerHelper', $this->_aModule);
+        return 'BxTimelineFormCheckerHelper';
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-get_options_videos_autoplay get_options_videos_autoplay
+     * 
+     * @code bx_srv('bx_timeline', 'get_options_videos_autoplay', [...]); @endcode
+     * 
+     * Get an array with available options for 'Videos autoplay in Timeline' setting.
+     *
+     * @return an array with available options represented as key => value pairs.
+     * 
+     * @see BxTimelineModule::serviceGetOptionsVideosAutoplay
+     */
+    /** 
+     * @ref bx_timeline-get_options_videos_autoplay "get_options_videos_autoplay"
+     */
+    public function serviceGetOptionsVideosAutoplay()
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $aOptions = array(BX_TIMELINE_VAP_OFF, BX_TIMELINE_VAP_ON_MUTE, BX_TIMELINE_VAP_ON);
+
+        $aResult = array();
+        foreach($aOptions as $sOption)
+            $aResult[] = array(
+                'key' => $sOption,
+                'value' => _t($CNF['T']['option_vap_' . $sOption])
+            );
+
+        return $aResult;
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-get_options_attachments_layout get_options_attachments_layout
+     * 
+     * @code bx_srv('bx_timeline', 'get_options_attachments_layout', [...]); @endcode
+     * 
+     * Get an array with available options for 'Show attachments as' setting.
+     *
+     * @return an array with available options represented as key => value pairs.
+     * 
+     * @see BxTimelineModule::serviceGetOptionsAttachmentsLayout
+     */
+    /** 
+     * @ref bx_timeline-get_options_attachments_layout "get_options_attachments_layout"
+     */
+    public function serviceGetOptionsAttachmentsLayout()
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $aOptions = array(BX_TIMELINE_ML_GALLERY, BX_TIMELINE_ML_SHOWCASE);
+
+        $aResult = array();
+        foreach($aOptions as $sOption)
+            $aResult[] = array(
+                'key' => $sOption,
+                'value' => _t($CNF['T']['option_al_' . $sOption])
+            );
+
+        return $aResult;
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-get_live_update get_live_update
+     * 
+     * @code bx_srv('bx_timeline', 'get_live_update', [...]); @endcode
+     * 
+     * Get an array with actual Live Update info. Only one live update notification for all new events.
+     *
+     * @return an array with Live Update info.
+     * 
+     * @see BxTimelineModule::serviceGetLiveUpdate
+     */
+    /** 
+     * @ref bx_timeline-get_live_update "get_live_update"
+     */
+    public function serviceGetLiveUpdate($aBrowseParams, $iProfileId, $iValue = 0, $iInit = 0)
+    {
+        $sKey = $this->_oConfig->getLiveUpdateKey($aBrowseParams);
+
+        bx_import('BxDolSession');
+        if((int)BxDolSession::getInstance()->getValue($sKey) == 1)
+            return false;
+
+        $aParams = $this->_prepareParams($aBrowseParams);
+        $aParams = array_merge($aParams, array(
+            'per_page' => 1,
+            'filter' => BX_TIMELINE_FILTER_OTHER_VIEWER
+        ));
+        $aEvents = $this->_oDb->getEvents($aParams);
+        if(empty($aEvents) || !is_array($aEvents) || count($aEvents) != 1)
+            return false;
+        
+        $iValueNew = $aEvents[0]['id'];
+        if($iValueNew == $iValue)
+            return false;
+
+        if((int)$iInit != 0)
+            return array('count' => $iValueNew);
+
+        return array(
+            'count' => $iValueNew, // required (for initialization and visualization)
+            'method' => $this->_oConfig->getJsObjectView($aBrowseParams) . '.showLiveUpdate(oData)', // required (for visualization)
+            'data' => array(
+                'code' => $this->_oTemplate->getLiveUpdate($aBrowseParams, $iProfileId, $iValue, $iValueNew)
+            ),  // optional, may have some additional data to be passed in JS method provided using 'method' param above.
+        );
+    }
+
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Timeline
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-get_live_updates get_live_updates
+     * 
+     * @code bx_srv('bx_timeline', 'get_live_updates', [...]); @endcode
+     * 
+     * Get an array with actual Live Update info. Separate live update notification for each new Event.
+     * 
+     * Note. This way to display live update notifications isn't used for now. 
+     * See BxTimelineModule::serviceGetLiveUpdate method instead.
+     *
+     * @return an array with Live Update info.
+     * 
+     * @see BxTimelineModule::serviceGetLiveUpdates
+     */
+    /** 
+     * @ref bx_timeline-get_live_updates "get_live_updates"
+     */
+    public function serviceGetLiveUpdates($aBrowseParams, $iProfileId, $iCount = 0, $iInit = 0)
+    {
+        $sKey = $this->_oConfig->getLiveUpdateKey($aBrowseParams);
+
+        bx_import('BxDolSession');
+        if((int)BxDolSession::getInstance()->getValue($sKey) == 1)
+            return false;
+
+        $aParams = $this->_prepareParams($aBrowseParams);
+        $aParams['filter'] = BX_TIMELINE_FILTER_OTHER_VIEWER;
+        $aParams['count'] = true;
+
+        $iCountNew = $this->_oDb->getEvents($aParams);
+        if($iCountNew == $iCount)
+            return false;
+
+        if((int)$iInit != 0)
+            return array('count' => $iCountNew);
+
+        return array(
+            'count' => $iCountNew, // required (for initialization and visualization)
+            'method' => $this->_oConfig->getJsObjectView($aBrowseParams) . '.showLiveUpdates(oData)', // required (for visualization)
+            'data' => array(
+                'code' => $this->_oTemplate->getLiveUpdates($aBrowseParams, $iProfileId, $iCount, $iCountNew)
+            ),  // optional, may have some additional data to be passed in JS method provided using 'method' param above.
+        );
+    }
+    
+    /**
+     * @page service Service Calls
+     * @section bx_timeline Accounts
+     * @subsection bx_timeline-other Other
+     * @subsubsection bx_timeline-get_menu_addon_manage_tools get_menu_addon_manage_tools
+     * 
+     * @code bx_srv('bx_timeline', 'get_menu_addon_manage_tools', [...]); @endcode
+     * 
+     * Get number of 'hidden' events for User End -> Dasboard page -> Manage block.
+     *
+     * @return integer number of 'hidden' events
+     * 
+     * @see BxTimelineModule::serviceGetMenuAddonManageTools
+     */
+    /** 
+     * @ref bx_timeline-get_menu_addon_manage_tools "get_menu_addon_manage_tools"
+     */
+    public function serviceGetMenuAddonManageTools()
+    {
+        bx_import('SearchResult', $this->_aModule);
+        $sClass = $this->_aModule['class_prefix'] . 'SearchResult';
+        $oSearch = new $sClass();
+        $oSearch->fillFilters(array(
+            'status' => BX_TIMELINE_STATUS_HIDDEN
+        ));
+        $oSearch->unsetPaginate();
+
+        return $oSearch->getNum();
+    }
+
+    /*
+     * COMMON METHODS
+     */
+    public function deleteEvent($aEvent)
+    {
+    	if(empty($aEvent) || !is_array($aEvent) || !$this->_oDb->deleteEvent(array('id' => (int)$aEvent['id'])))
+            return false;
+
+        $this->onDelete($aEvent);
+        return true;
+    }
+    
+
+    public function addAttachLink($aValues, $sDisplay = false)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        if(!$sDisplay)
+            $sDisplay = $this->_oConfig->getObject('form_display_attach_link_add');
+
+        $oForm = BxDolForm::getObjectInstance($this->_oConfig->getObject('form_attach_link'), $sDisplay, $this->_oTemplate);
+        if(!$oForm)
+            return array('message' => '_sys_txt_error_occured');
+
+        $oForm->aFormAttrs['method'] = BX_DOL_FORM_METHOD_SPECIFIC;
+        $oForm->aParams['csrf']['disable'] = true;
+        if(!empty($oForm->aParams['db']['submit_name'])) {
+            $sSubmitName = $oForm->aParams['db']['submit_name'];
+            if(!isset($oForm->aInputs[$sSubmitName])) {
+                if(isset($oForm->aInputs[$CNF['FIELD_CONTROLS']]))
+                    foreach($oForm->aInputs[$CNF['FIELD_CONTROLS']] as $mixedIndex => $aInput) {
+                        if(!is_numeric($mixedIndex) || empty($aInput['name']) || $aInput['name'] != $sSubmitName)
+                            continue;
+    
+                        $aValues[$sSubmitName] = $aInput['value'];
+                    }
+            }
+            else            
+                $aValues[$sSubmitName] = $oForm->aInputs[$sSubmitName]['value'];
+        }
+
+        $oForm->aInputs['url']['checker']['params']['preg'] = $this->_oConfig->getPregPattern('url');
+
+        $oForm->initChecker(array(), $aValues);
+        if(!$oForm->isSubmittedAndValid())
+            return array('message' => '_sys_txt_error_occured');
+
+        return $this->_addLink($oForm);
+    }
+
+    public function getFormAttachLink()
+    {
+        $oForm = BxDolForm::getObjectInstance($this->_oConfig->getObject('form_attach_link'), $this->_oConfig->getObject('form_display_attach_link_add'), $this->_oTemplate);
+        $oForm->aFormAttrs['action'] = BX_DOL_URL_ROOT . $this->_oConfig->getBaseUri() . 'submit_attach_link_form/';
+        $oForm->aInputs['url']['checker']['params']['preg'] = $this->_oConfig->getPregPattern('url');
+
+        $oForm->initChecker();
+        if($oForm->isSubmittedAndValid())
+            return $this->_addLink($oForm);
+
+        return array('form' => $oForm->getCode(), 'form_id' => $oForm->id);
+    }
+
+    public function getFormPost($aParams = array())
+    {
+        $iUserId = $this->getUserId();
+
+        $oForm = $this->getFormPostObject($aParams);
+        $oForm->initChecker();
+
+        $bAjaxMode = $oForm->isAjaxMode();
+        $bDynamicMode = $bAjaxMode;
+
+        if($oForm->isSubmittedAndValid()) {
+            list($sUserName) = $this->getUserInfo($iUserId);
+
+            $sType = $oForm->getCleanValue('type');
+            $sType = $this->_oConfig->getPrefix('common_post') . $sType;
+            BxDolForm::setSubmittedValue('type', $sType, $oForm->aFormAttrs['method']);
+
+            $aContent = array();
+
+            //--- Process Text ---//
+            $sText = $oForm->getCleanValue('text');
+            $sText = $this->_prepareTextForSave($sText);
+            $bText = !empty($sText);
+
+            if($bText)
+            	$aContent['text'] = $sText;
+
+            //--- Process Context and Privacy ---//
+            $iOwnerId = (int)$oForm->getCleanValue('owner_id');
+            $iObjectPrivacyView = (int)$oForm->getCleanValue('object_privacy_view');
+            $iObjectPrivacyViewDefault = $this->_oConfig->getPrivacyViewDefault('object');
+            if(empty($iObjectPrivacyView))
+                $iObjectPrivacyView = $iObjectPrivacyViewDefault;
+            else if($iObjectPrivacyView < 0)
+                $iOwnerId = abs($iObjectPrivacyView);
+
+            //--- Process Link ---//
+            $aLinkIds = $oForm->getCleanValue('link');
+            $bLinkIds = !empty($aLinkIds) && is_array($aLinkIds);
+
+            //--- Process Media ---//
+            $aPhotoIds = $oForm->getCleanValue(BX_TIMELINE_MEDIA_PHOTO);
+            $bPhotoIds = !empty($aPhotoIds) && is_array($aPhotoIds);
+
+            $aVideoIds = $oForm->getCleanValue(BX_TIMELINE_MEDIA_VIDEO);
+            $bVideoIds = !empty($aVideoIds) && is_array($aVideoIds);
+
+            if(!$bText && !$bLinkIds && !$bPhotoIds && !$bVideoIds) {
+                $oForm->aInputs['text']['error'] =  _t('_bx_timeline_txt_err_empty_post');
+                $oForm->setValid(false);
+
+            	return $this->_prepareResponse(array('form' => $oForm->getCode($bDynamicMode), 'form_id' => $oForm->id), $bAjaxMode);
+            }
+
+            $sTitle = $bText ? $this->_oConfig->getTitle($sText) : $this->_oConfig->getTitleDefault($bLinkIds, $bPhotoIds, $bVideoIds);
+            $sDescription = _t('_bx_timeline_txt_user_added_sample', '{profile_name}', _t('_bx_timeline_txt_sample_with_article'));
+
+            /**
+             * Unset 'text' input because its data was already processed 
+             * and will be saved via additional values which were passed 
+             * to BxDolForm::insert method.
+             */
+            unset($oForm->aInputs['text']);
+
+            $iId = $oForm->insert(array(
+                'owner_id' => $iOwnerId,
+                'object_id' => $iUserId,
+                'object_privacy_view' => $iObjectPrivacyView,
+                'content' => serialize($aContent),
+                'title' => $sTitle,
+                'description' => $sDescription
+            ));
+
+            if(!empty($iId)) {
+                $aContent = array_merge($aContent, array(
+                    'timeline_group' => array(
+                        'by' => $this->getName() . '_' . $iUserId . '_' . $iId,
+                        'field' => 'owner_id'
+                    )
+                ));
+                $this->_oDb->updateEvent(array('content' => serialize($aContent)), array('id' => $iId));
+
+                //--- Process Meta ---//
+            	$oMetatags = BxDolMetatags::getObjectInstance($this->_oConfig->getObject('metatags'));
+            	if($bText)
+                    $oMetatags->metaAdd($iId, $sText);
+                $oMetatags->locationsAddFromForm($iId, $this->_oConfig->CNF['FIELD_LOCATION_PREFIX']);
+
+                //--- Process Link ---//
+                if($bLinkIds)
+                    foreach($aLinkIds as $iLinkId)
+                        $this->_oDb->saveLink($iId, $iLinkId);
+
+                //--- Process Media ---//
+                if($bPhotoIds) 
+                    $this->_saveMedia(BX_TIMELINE_MEDIA_PHOTO, $iId, $aPhotoIds);
+
+                if($bVideoIds)
+                    $this->_saveMedia(BX_TIMELINE_MEDIA_VIDEO, $iId, $aVideoIds);
+
+                $this->onPost($iId);
+
+                return $this->_prepareResponse(array('id' => $iId), $bAjaxMode, array(
+                    'redirect' => $this->_oConfig->getItemViewUrl(array('id' => $iId))
+                ));
+            }
+
+            return $this->_prepareResponse(array('message' => _t('_bx_timeline_txt_err_cannot_perform_action')), $bAjaxMode);
+        }
+
+        return $this->_prepareResponse(array('form' => $oForm->getCode($bDynamicMode), 'form_id' => $oForm->id), $bAjaxMode && $oForm->isSubmitted());
+    }
+
+    public function getFormEdit($iId, $aParams = array(), $aBrowseParams = array())
+    {
+        $CNF = &$this->_oConfig->CNF;
+        $sJsObjectView = $this->_oConfig->getJsObjectView($aBrowseParams);
+
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iId));
+        if(empty($aEvent) || !is_array($aEvent))
+            return array();
+
+        $aContent = unserialize($aEvent['content']);
+        if(is_array($aContent) && !empty($aContent['text']))
+            $aEvent['text'] = $aContent['text'];
+
+        $bDynamicMode = isset($aParams['dynamic_mode']) ? (bool)$aParams['dynamic_mode'] : false;
+        $sFormObject = !empty($aParams['form_object']) ? $aParams['form_object'] : 'form_post';
+        $sFormDisplay = !empty($aParams['form_display']) ? $aParams['form_display'] : 'form_display_post_edit';
+        $oForm = BxDolForm::getObjectInstance($this->_oConfig->getObject($sFormObject), $this->_oConfig->getObject($sFormDisplay), $this->_oTemplate);
+        $oForm->setId($this->_oConfig->getHtmlIds('view', 'edit_form') . $iId);
+
+        $oForm->aFormAttrs['action'] = BX_DOL_URL_ROOT . $this->_oConfig->getBaseUri() . 'edit/' . $iId ;
+        if(!empty($aBrowseParams) && is_array($aBrowseParams))
+            $oForm->aFormAttrs['action'] = $this->_oConfig->addBrowseParams($oForm->aFormAttrs['action'], $aBrowseParams);
+
+        foreach($oForm->aInputs[$CNF['FIELD_CONTROLS']] as $mixedIndex => $aInput) {
+            if(!is_numeric($mixedIndex))
+                continue;
+
+            $oForm->aInputs[$CNF['FIELD_CONTROLS']][$mixedIndex]['attrs'] = bx_replace_markers($aInput['attrs'], array(
+                'js_object_view' => $sJsObjectView,
+            	'content_id' => $iId
+            ));
+        }
+
+        $oForm->initChecker($aEvent);
+        if($oForm->isSubmittedAndValid()) {
+            $aContent = array();
+
+            //--- Process Text ---//
+            $sText = $oForm->getCleanValue('text');
+            $sText = $this->_prepareTextForSave($sText);
+            $bText = !empty($sText);
+            unset($oForm->aInputs['text']);
+
+            if($bText)
+            	$aContent['text'] = $sText;
+
+            $aValsToAdd = array(
+            	'content' => serialize($aContent)
+            );
+
+            //--- Process Privacy ---//
+            $iObjectPrivacyView = (int)$oForm->getCleanValue('object_privacy_view');
+            $iObjectPrivacyViewDefault = $this->_oConfig->getPrivacyViewDefault('object');
+            if(empty($iObjectPrivacyView))
+                $aValsToAdd = array_merge($aValsToAdd, array(
+                    'object_privacy_view' => $iObjectPrivacyViewDefault
+                ));
+            else if($iObjectPrivacyView < 0) 
+                $aValsToAdd = array_merge($aValsToAdd, array(
+                    'owner_id' => abs($iObjectPrivacyView),
+                    'object_privacy_view' => $iObjectPrivacyViewDefault
+                ));
+
+            if(!$oForm->update($iId, $aValsToAdd))
+                return array('message' => _t('_bx_timeline_txt_err_cannot_perform_action'));
+
+            $oMetatags = BxDolMetatags::getObjectInstance($this->_oConfig->getObject('metatags'));
+            if($bText)
+                $oMetatags->metaAdd($iId, $sText);
+            $oMetatags->locationsAddFromForm($iId, $this->_oConfig->CNF['FIELD_LOCATION_PREFIX']);
+
+            $this->getCacheItemObject()->removeAllByPrefix($this->_oConfig->getPrefix('cache_item') . $iId);
+            $this->_oDb->deleteCache(array('event_id' => $iId));
+
+            return array(
+                'id' => $iId
+            );
+        }
+
+        return array(
+            'id' => $iId, 
+            'form' => $oForm->getCode($bDynamicMode), 
+            'form_id' => $oForm->id,
+            'eval' => $sJsObjectView . '.onEditPost(oData)'
+        );
+    }
+
+    public function getFormPostObject($aParams)
+    {
+    	$sFormObject = !empty($aParams['form_object']) ? $aParams['form_object'] : 'form_post';
+        $sFormDisplay = !empty($aParams['form_display']) ? $aParams['form_display'] : 'form_display_post_add';
+
+        $oForm = BxDolForm::getObjectInstance($this->_oConfig->getObject($sFormObject), $this->_oConfig->getObject($sFormDisplay), $this->_oTemplate);        
+
+        /**
+         * Note. 'ajax_mode' parameter isn't checked because
+         * timeline post form works as Ajax form by default.
+         */
+        $sParamsKey = 'visibility_autoselect';
+        if(isset($aParams[$sParamsKey]) && (bool)$aParams[$sParamsKey] === true)
+            $oForm->setVisibilityAutoselect((bool)$aParams[$sParamsKey]);
+
+        $oForm->init();
+        return $oForm;
+    }
+
+    public function getCmtsObject($sSystem, $iId)
+    {
+        if(empty($sSystem) || (int)$iId == 0)
+            return false;
+
+        $oCmts = BxDolCmts::getObjectInstance($sSystem, $iId, true, $this->_oTemplate);
+        if(!$oCmts || !$oCmts->isEnabled())
+            return false;
+
+        return $oCmts;
+    }
+
+    public function getViewObject($sSystem, $iId)
+    {
+        if(empty($sSystem) || (int)$iId == 0)
+            return false;
+
+        $oView = BxDolView::getObjectInstance($sSystem, $iId, true, $this->_oTemplate);
+        if(!$oView || !$oView->isEnabled())
+            return false;
+
+        return $oView;
+    }
+
+    public function getVoteObject($sSystem, $iId)
+    {
+        if(empty($sSystem) || (int)$iId == 0)
+            return false;
+
+        $oVote = BxDolVote::getObjectInstance($sSystem, $iId, true, $this->_oTemplate);
+        if(!$oVote || !$oVote->isEnabled())
+            return false;
+
+        return $oVote;
+    }
+    
+    public function getReactionObject($sSystem, $iId)
+    {
+        if(empty($sSystem) || (int)$iId == 0)
+            return false;
+
+        $oReaction = BxDolVote::getObjectInstance($sSystem, $iId, true, $this->_oTemplate);
+        if(!$oReaction || !$oReaction->isEnabled())
+            return false;
+
+        return $oReaction;
+    }
+
+    public function getScoreObject($sSystem, $iId)
+    {
+        if(empty($sSystem) || (int)$iId == 0)
+            return false;
+
+        $oScore = BxDolScore::getObjectInstance($sSystem, $iId, true, $this->_oTemplate);
+        if(!$oScore || !$oScore->isEnabled())
+            return false;
+
+        return $oScore;
+    }
+
+	public function getReportObject($sSystem, $iId)
+    {
+        if(empty($sSystem) || (int)$iId == 0)
+            return false;
+
+        $oReport = BxDolReport::getObjectInstance($sSystem, $iId, true, $this->_oTemplate);
+        if(!$oReport || !$oReport->isEnabled())
+            return false;
+
+        return $oReport;
+    }
+
+    public function getAttachmentsMenuObject()
+    {
+        $oMenu = BxDolMenu::getObjectInstance($this->_oConfig->getObject('menu_post_attachments'), $this->_oTemplate);
+        $oMenu->addMarkers(array(
+            'js_object' => $this->_oConfig->getJsObject('post'),
+        ));
+
+        return $oMenu;
+    }
+
+    public function getManageMenuObject()
+    {
+        return BxDolMenu::getObjectInstance($this->_oConfig->getObject('menu_item_manage'), $this->_oTemplate);
+    }
+
+    public function getCacheItemObject()
+    {
+        $oCacheEngine = bx_instance('BxDolCache' . $this->_oConfig->getCacheItemEngine());
+        if(!$oCacheEngine->isAvailable())
+            $oCacheEngine = bx_instance('BxDolCacheFile');
+
+        return $oCacheEngine;
+    }
+
+    //--- Check permissions methods ---//
+    public function serviceCheckAllowedViewForProfile ($aDataEntry, $isPerformAction = false, $iProfileId = false)
+    {
+        if(!$iProfileId)
+            $iProfileId = $this->_iProfileId;
+
+        $CNF = &$this->_oConfig->CNF;
+
+        // moderator and owner always have access
+        $iOwnerId = (int)$aDataEntry['owner_id'];
+        if(!empty($iProfileId) && (abs($iOwnerId) == (int)$iProfileId || $this->isModerator()))
+            return CHECK_ACTION_RESULT_ALLOWED;
+
+        // check ACL
+        if($iOwnerId != 0 && ($oOwner = BxDolProfile::getInstanceMagic($iOwnerId)) !== false) {
+            $mixedCheckResult = BxDolService::call($oOwner->getModule(), 'check_allowed_with_content_for_profile', array('view', $oOwner->getContentId(), $iProfileId));
+            if($mixedCheckResult !== CHECK_ACTION_RESULT_ALLOWED)
+                return $mixedCheckResult;
+        }
+
+        // check privacy
+        if(!empty($CNF['OBJECT_PRIVACY_VIEW'])) {
+            $oPrivacy = BxDolPrivacy::getObjectInstance($CNF['OBJECT_PRIVACY_VIEW']);
+            if($oPrivacy && !$oPrivacy->check($aDataEntry[$CNF['FIELD_ID']], $iProfileId))
+                return _t('_sys_access_denied_to_private_content');
+        }
+
+        // check alert to allow custom checks
+        $mixedResult = null;
+        bx_alert('system', 'check_allowed_view', 0, 0, array('module' => $this->getName(), 'content_info' => $aDataEntry, 'profile_id' => $iProfileId, 'override_result' => &$mixedResult));
+        if($mixedResult !== null)
+            return $mixedResult;
+
+        return CHECK_ACTION_RESULT_ALLOWED;
+    }
+
+    public function isModerator()
+    {
+        $sModule = $this->getName();
+        $iUserId = (int)$this->getUserId();
+
+        $aCheckResult = checkActionModule($iUserId, 'edit', $sModule);
+        if($aCheckResult[CHECK_ACTION_RESULT] === CHECK_ACTION_RESULT_ALLOWED)
+            return true;
+
+        $aCheckResult = checkActionModule($iUserId, 'delete', $sModule);
+        if($aCheckResult[CHECK_ACTION_RESULT] === CHECK_ACTION_RESULT_ALLOWED)
+            return true;
+
+        return false;
+    }
+
+    public function isAllowedPost($bPerform = false)
+    {
+        if(isAdmin())
+            return true;
+
+        $iUserId = $this->getUserId();
+
+        $aCheckResult = checkActionModule($iUserId, 'post', $this->getName(), $bPerform);
+        if($aCheckResult[CHECK_ACTION_RESULT] !== CHECK_ACTION_RESULT_ALLOWED)
+            return $aCheckResult[CHECK_ACTION_MESSAGE];
+        
+        if(!empty($this->_iOwnerId) && ($oProfileOwner = BxDolProfile::getInstance($this->_iOwnerId)) !== false) {
+            if($oProfileOwner->checkAllowedPostInProfile() !== CHECK_ACTION_RESULT_ALLOWED)
+                return _t('_sys_txt_access_denied');
+
+            bx_alert($oProfileOwner->getModule(), $this->_oConfig->getUri() . '_post', $oProfileOwner->id(), $iUserId, array('check_result' => &$aCheckResult));
+        }
+
+        return $aCheckResult[CHECK_ACTION_RESULT] !== CHECK_ACTION_RESULT_ALLOWED ? $aCheckResult[CHECK_ACTION_MESSAGE] : true;
+    }
+
+    public function isAllowedView($aEvent, $bPerform = false)
+    {
+        $CNF = $this->_oConfig->CNF;
+
+        if((int)$aEvent[$CNF['FIELD_OWNER_ID']] == 0)
+            return true;
+
+        $oProfileOwner = BxDolProfile::getInstance($aEvent[$CNF['FIELD_OWNER_ID']]);
+        if($oProfileOwner && $oProfileOwner->checkAllowedProfileView() !== CHECK_ACTION_RESULT_ALLOWED)
+            return false;
+
+        return true;
+    }
+
+    public function isAllowedEdit($aEvent, $bPerform = false)
+    {
+        if(!isLogged())
+            return false;
+            
+        //--- System posts and Reposts cannot be edited at all.
+        if(!$this->_oConfig->isCommon($aEvent['type'], $aEvent['action']) || $aEvent['type'] == $this->_oConfig->getPrefix('common_post') . 'repost')
+            return false;
+
+        if(isAdmin())
+            return true;
+
+        $iUserId = (int)$this->getUserId();
+        $iOwnerId = (int)$aEvent['owner_id'];
+        $iObjectId = abs((int)$aEvent['object_id']);
+        if($iObjectId == $iUserId && $this->_oConfig->isAllowEdit())
+           return true;
+
+        $aCheckResult = checkActionModule($iUserId, 'edit', $this->getName(), $bPerform);
+        if(!empty($iOwnerId) && ($oProfileOwner = BxDolProfile::getInstance($iOwnerId)) !== false)
+            bx_alert($oProfileOwner->getModule(), $this->_oConfig->getUri() . '_edit', $oProfileOwner->id(), $iUserId, array('check_result' => &$aCheckResult));
+
+        return $aCheckResult[CHECK_ACTION_RESULT] !== CHECK_ACTION_RESULT_ALLOWED ? $aCheckResult[CHECK_ACTION_MESSAGE] : true;
+    }
+
+    public function isAllowedDelete($aEvent, $bPerform = false)
+    {
+        if(!isLogged())
+            return false;
+
+        if(isAdmin())
+            return true;
+
+        $iUserId = (int)$this->getUserId();
+        $iOwnerId = (int)$aEvent['owner_id'];
+        $iObjectId = abs((int)$aEvent['object_id']);
+        if((($iOwnerId == $iUserId && $this->_oConfig->isAllowDelete()) || ($this->_oConfig->isCommon($aEvent['type'], $aEvent['action']) && $iObjectId == $iUserId)))
+           return true;
+
+        $aCheckResult = checkActionModule($iUserId, 'delete', $this->getName(), $bPerform);
+        if(!empty($iOwnerId) && ($oProfileOwner = BxDolProfile::getInstance($iOwnerId)) !== false)
+            bx_alert($oProfileOwner->getModule(), $this->_oConfig->getUri() . '_delete', $oProfileOwner->id(), $iUserId, array('check_result' => &$aCheckResult));
+
+        return $aCheckResult[CHECK_ACTION_RESULT] !== CHECK_ACTION_RESULT_ALLOWED ? $aCheckResult[CHECK_ACTION_MESSAGE] : true;
+    }
+
+    public function isAllowedComment($aEvent, $bPerform = false)
+    {
+        $mixedComments = $this->getCommentsData($aEvent['comments']);
+        if($mixedComments === false)
+            return false;
+
+        list($sSystem, $iObjectId) = $mixedComments;
+        $oCmts = $this->getCmtsObject($sSystem, $iObjectId);
+        
+        if($oCmts->isViewAllowed() !== CHECK_ACTION_RESULT_ALLOWED)
+            return false;
+        
+        $oCmts->addCssJs();
+
+        $bResult = true;
+        if(!empty($aEvent['owner_id']) && $this->_oConfig->isCommon($aEvent['type'], $aEvent['action'])) {
+            $oProfileOwner = BxDolProfile::getInstance($aEvent['owner_id']);
+            if($oProfileOwner !== false) {
+                if($oProfileOwner->checkAllowedPostInProfile() !== CHECK_ACTION_RESULT_ALLOWED)
+                    return false;
+
+                bx_alert($oProfileOwner->getModule(), $this->_oConfig->getUri() . '_comment', $oProfileOwner->id(), (int)$this->getUserId(), array('result' => &$bResult));
+            }
+        }
+
+        return $bResult;
+    }
+
+    public function isAllowedViewCounter($aEvent, $bPerform = false)
+    {
+        $mixedViews = $this->getViewsData($aEvent['views']);
+        if($mixedViews === false)
+            return false;
+
+        list($sSystem, $iObjectId) = $mixedViews;
+        $oView = $this->getViewObject($sSystem, $iObjectId);
+
+        if(!$oView->isAllowedViewView($bPerform))
+        	return false;
+
+        $bResult = true;
+        if(!empty($aEvent['owner_id']) && ($oProfileOwner = BxDolProfile::getInstance($aEvent['owner_id'])) !== false)
+            bx_alert($oProfileOwner->getModule(), $this->_oConfig->getUri() . '_view_counter', $oProfileOwner->id(), (int)$this->getUserId(), array('result' => &$bResult));
+
+        return $bResult;
+    }
+
+    public function isAllowedVote($aEvent, $bPerform = false)
+    {
+        $mixedVotes = $this->getVotesData($aEvent['votes']);
+        if($mixedVotes === false)
+            return false;
+
+        list($sSystem, $iObjectId) = $mixedVotes;
+        $oVote = $this->getVoteObject($sSystem, $iObjectId);
+
+        if(!$oVote->isAllowedVote($bPerform))
+        	return false;
+
+        $bResult = true;
+        if(!empty($aEvent['owner_id']) && ($oProfileOwner = BxDolProfile::getInstance($aEvent['owner_id'])) !== false)
+            bx_alert($oProfileOwner->getModule(), $this->_oConfig->getUri() . '_vote', $oProfileOwner->id(), (int)$this->getUserId(), array('result' => &$bResult));
+
+        return $bResult;
+    }
+
+    public function isAllowedReaction($aEvent, $bPerform = false)
+    {
+        $mixedReactions = $this->getReactionsData($aEvent['reactions']);
+        if($mixedReactions === false)
+            return false;
+
+        list($sSystem, $iObjectId) = $mixedReactions;
+        $oReaction = $this->getReactionObject($sSystem, $iObjectId);
+
+        if(!$oReaction->isAllowedVote($bPerform))
+            return false;
+
+        $bResult = true;
+        if(!empty($aEvent['owner_id']) && ($oProfileOwner = BxDolProfile::getInstance($aEvent['owner_id'])) !== false)
+            bx_alert($oProfileOwner->getModule(), $this->_oConfig->getUri() . '_reaction', $oProfileOwner->id(), (int)$this->getUserId(), array('result' => &$bResult));
+
+        return $bResult;
+    }
+
+    public function isAllowedScore($aEvent, $bPerform = false)
+    {
+        $mixedScores = $this->getScoresData($aEvent['scores']);
+        if($mixedScores === false)
+            return false;
+
+        list($sSystem, $iObjectId) = $mixedScores;
+        $oScore = $this->getScoreObject($sSystem, $iObjectId);
+
+        if(!$oScore->isAllowedVote($bPerform))
+        	return false;
+
+        $bResult = true;
+        if(!empty($aEvent['owner_id']) && ($oProfileOwner = BxDolProfile::getInstance($aEvent['owner_id'])) !== false)
+            bx_alert($oProfileOwner->getModule(), $this->_oConfig->getUri() . '_score', $oProfileOwner->id(), (int)$this->getUserId(), array('result' => &$bResult));
+
+        return $bResult;
+    }
+
+    public function isAllowedReport($aEvent, $bPerform = false)
+    {
+        $mixedReports = $this->getReportsData($aEvent['reports']);
+        if($mixedReports === false)
+            return false;
+
+        list($sSystem, $iObjectId) = $mixedReports;
+        $oReport = $this->getReportObject($sSystem, $iObjectId);
+
+        if(!$oReport->isAllowedReport($bPerform))
+        	return false;
+
+        $bResult = true;
+        if(!empty($aEvent['owner_id']) && ($oProfileOwner = BxDolProfile::getInstance($aEvent['owner_id'])) !== false)
+            bx_alert($oProfileOwner->getModule(), $this->_oConfig->getUri() . '_report', $oProfileOwner->id(), (int)$this->getUserId(), array('result' => &$bResult));
+
+        return $bResult;
+    }
+
+    public function isAllowedRepost($aEvent, $bPerform = false)
+    {
+        $iUserId = (int)$this->getUserId();
+        if($iUserId == 0)
+            return false;
+
+        $iPrivacy = (int)$aEvent['object_privacy_view'];
+        if($iPrivacy >= 0 && !in_array($iPrivacy, array(BX_DOL_PG_ALL, BX_DOL_PG_MEMBERS)))
+            return false;      
+
+        if(isAdmin())
+            return true;
+
+        $aCheckResult = checkActionModule($iUserId, 'repost', $this->getName(), $bPerform);
+        if(!empty($aEvent['owner_id']) && ($oProfileOwner = BxDolProfile::getInstance($aEvent['owner_id'])) !== false)
+            bx_alert($oProfileOwner->getModule(), $this->_oConfig->getUri() . '_repost', $oProfileOwner->id(), $iUserId, array('check_result' => &$aCheckResult));
+
+        return $aCheckResult[CHECK_ACTION_RESULT] !== CHECK_ACTION_RESULT_ALLOWED ? $aCheckResult[CHECK_ACTION_MESSAGE] : true;
+    }
+
+    public function isAllowedSend($aEvent, $bPerform = false)
+    {
+        if(!$this->_oDb->isEnabledByName('bx_convos'))
+            return false;
+
+        if(isAdmin())
+            return true;
+
+        $iUserId = (int)$this->getUserId();
+        if($iUserId == 0)
+            return false;
+
+        $aCheckResult = checkActionModule($iUserId, 'send', $this->getName(), $bPerform);
+        if(!empty($aEvent['owner_id']) && ($oProfileOwner = BxDolProfile::getInstance($aEvent['owner_id'])) !== false)
+            bx_alert($oProfileOwner->getModule(), $this->_oConfig->getUri() . '_send', $oProfileOwner->id(), $iUserId, array('check_result' => &$aCheckResult));
+
+        return $aCheckResult[CHECK_ACTION_RESULT] !== CHECK_ACTION_RESULT_ALLOWED ? $aCheckResult[CHECK_ACTION_MESSAGE] : true;
+    }
+
+    /**
+     * Pin - "Pin here" - pin the post on Profile Timeline for profile owner.
+     * Can be done by profile owner for himself or by admin for profile owner to see.
+     * @param type $aEvent
+     * @param type $bPerform
+     * @return boolean
+     */
+    public function isAllowedPin($aEvent, $bPerform = false)
+    {
+    	if((int)$aEvent['pinned'] != 0)
+    		return false;
+
+        return $this->_isAllowedPin($aEvent, $bPerform);
+    }
+
+    public function isAllowedUnpin($aEvent, $bPerform = false)
+    {
+    	if((int)$aEvent['pinned'] == 0)
+    		return false;
+
+        return $this->_isAllowedPin($aEvent, $bPerform);
+    }
+
+    /**
+     * Stick - "Pin for All" - pin the post on Public Timeline for everybody to see.
+     * Is available for Administrators/Moderators only.
+     * @param type $aEvent
+     * @param type $bPerform
+     * @return boolean
+     */
+    public function isAllowedStick($aEvent, $bPerform = false)
+    {
+    	if((int)$aEvent['sticked'] != 0)
+    		return false;
+    
+    	return $this->_isAllowedStick($aEvent, $bPerform);
+    }
+    
+    public function isAllowedUnstick($aEvent, $bPerform = false)
+    {
+    	if((int)$aEvent['sticked'] == 0)
+    		return false;
+    
+    	return $this->_isAllowedStick($aEvent, $bPerform);
+    }
+    
+    public function isAllowedPromote($aEvent, $bPerform = false)
+    {
+    	if((int)$aEvent['promoted'] != 0)
+    		return false;
+
+        return $this->_isAllowedPromote($aEvent, $bPerform);
+    }
+
+	public function isAllowedUnpromote($aEvent, $bPerform = false)
+    {
+    	if((int)$aEvent['promoted'] == 0)
+    		return false;
+
+        return $this->_isAllowedPromote($aEvent, $bPerform);
+    }
+
+    public function isAllowedMore($aEvent, $bPerform = false)
+    {
+    	$oMoreMenu = $this->getManageMenuObject();
+    	$oMoreMenu->setEvent($aEvent);
+    	return $oMoreMenu->isVisible();
+    }
+
+    public function checkAllowedView ($aContentInfo, $isPerformAction = false)
+    {
+        if(!$this->isAllowedView($aContentInfo, $isPerformAction))
+            return _t('_sys_txt_access_denied');
+
+        return CHECK_ACTION_RESULT_ALLOWED;
+    }
+
+    public function checkAllowedCommentsView ($aContentInfo, $isPerformAction = false)
+    {
+        $CNF = $this->_oConfig->CNF;
+
+        $iOwner = (int)$aContentInfo[$CNF['FIELD_OWNER_ID']];
+        if($iOwner == 0) //--- in case of Public Timeline.
+            return CHECK_ACTION_RESULT_ALLOWED;
+
+        $oOwner = BxDolProfile::getInstance($iOwner);
+        if(!$oOwner) //--- in case of non-existed Timeline owner.
+            return _t('_sys_txt_access_denied');
+
+        $mixedResult = $oOwner->checkAllowedProfileView();
+        if($mixedResult !== CHECK_ACTION_RESULT_ALLOWED)
+            return $mixedResult;
+
+        return CHECK_ACTION_RESULT_ALLOWED;
+    }
+
+    public function checkAllowedCommentsPost ($aContentInfo, $isPerformAction = false)
+    {
+        $sError = '_sys_txt_access_denied';
+
+        $aContentInfo = array_merge($aContentInfo, $this->_oTemplate->getDataCached($aContentInfo));
+        if($aContentInfo === false)
+            return _t($sError);
+
+        if(!$this->isAllowedComment($aContentInfo, $isPerformAction))
+            return _t($sError);
+
+        return CHECK_ACTION_RESULT_ALLOWED;
+    }
+
+    public function onPost($iContentId)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iContentId));
+
+        if($this->_oConfig->isSystem($aEvent['type'], $aEvent['action'])) {
+            //--- Request event's data from content module and update it in the Timeline DB.
+            $this->_oTemplate->getDataCached($aEvent);
+
+            $sPostType = 'system';
+            $iSenderId = $iObjectAuthorId = (int)$aEvent['owner_id'];
+        } 
+        else {
+            $sPostType = 'common';
+            $iSenderId = $iObjectAuthorId = (int)$aEvent['object_id'];
+        }
+
+        //--- Event -> Post/Defer for Alerts Engine ---//
+        $sAction = ($aEvent[$CNF['FIELD_STATUS']] == BX_TIMELINE_STATUS_AWAITING ? 'defer' : 'post') . '_' . $sPostType;
+        bx_alert($this->_oConfig->getObject('alert'), $sAction, $iContentId, $iSenderId, array(
+            'owner_id' => $aEvent['owner_id'],
+            'object_author_id' => $iObjectAuthorId,
+            'privacy_view' => $aEvent['object_privacy_view'],
+        ));
+        //--- Event -> Post for Alerts Engine ---//
+    }
+
+    public function onPublished($iContentId)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iContentId));
+
+        //--- Clear Item cache
+        $this->getCacheItemObject()->removeAllByPrefix($this->_oConfig->getPrefix('cache_item') . $iContentId);
+        
+        //--- Clear Feed cache
+        $this->_oDb->deleteCache(array('context_id' => $aEvent[$CNF['FIELD_OWNER_ID']]));
+
+        $this->onPost($iContentId);
+    }
+    
+    public function onFailed($iContentId)
+    {
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iContentId));
+
+        //--- Clear Item cache
+        $this->getCacheItemObject()->removeAllByPrefix($this->_oConfig->getPrefix('cache_item') . $iContentId);
+
+        if($this->_oConfig->isSystem($aEvent['type'], $aEvent['action'])) {
+            //--- Request event's data from content module and update it in the Timeline DB.
+            $this->_oTemplate->getDataCached($aEvent);
+
+            $sPostType = 'system';
+            $iSenderId = $iObjectAuthorId = (int)$aEvent['owner_id'];
+        } 
+        else {
+            $sPostType = 'common';
+            $iSenderId = $iObjectAuthorId = (int)$aEvent['object_id'];
+        }
+
+        //--- Event -> Fail for Alerts Engine ---//
+        bx_alert($this->_oConfig->getObject('alert'), 'fail_' . $sPostType, $iContentId, $iSenderId, array(
+            'owner_id' => $aEvent['owner_id'],
+            'object_author_id' => $iObjectAuthorId,
+            'privacy_view' => $aEvent['object_privacy_view'],
+        ));
+        //--- Event -> Post for Alerts Engine ---//
+    }
+
+    public function onRepost($iContentId, $aReposted = array())
+    {
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iContentId));
+
+        if(empty($aReposted)) {
+            $aContent = unserialize($aEvent['content']);
+
+            $aReposted = $this->_oDb->getReposted($aContent['type'], $aContent['action'], $aContent['object_id']);
+            if(empty($aReposted) || !is_array($aReposted))
+                return;
+        }
+
+        $iUserId = $this->getUserId();
+        $this->_oDb->insertRepostTrack($aEvent['id'], $iUserId, $this->getUserIp(), $aReposted['id']);
+        $this->_oDb->updateRepostCounter($aReposted['id'], $aReposted['reposts']);
+
+        //--- Timeline -> Update for Alerts Engine ---//
+        bx_alert($this->_oConfig->getObject('alert'), 'repost', $aReposted['id'], $iUserId, array(
+            'privacy_view' => $aEvent['object_privacy_view'],
+            'object_author_id' => $aReposted['owner_id'],
+            'repost_id' => $iContentId,
+        ));
+        //--- Timeline -> Update for Alerts Engine ---//
+    }
+
+    public function onDelete($aEvent)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $iUserId = $this->getUserId();
+    	$sCommonPostPrefix = $this->_oConfig->getPrefix('common_post');
+    	$sCommonPostComment = $this->_oConfig->getObject('comment');
+    	
+    	//--- Delete comments for Common posts.
+    	if($this->_oConfig->isCommon($aEvent['type'], $aEvent['action'])) {
+            $oComments = $this->getCmtsObject($sCommonPostComment, $aEvent[$CNF['FIELD_ID']]);
+            if($oComments !== false)
+                $oComments->onObjectDelete($aEvent[$CNF['FIELD_ID']]);
+    	}
+
+    	//--- Delete attached photos, videos and links when common event was deleted.
+    	if($aEvent['type'] == $sCommonPostPrefix . BX_TIMELINE_PARSE_TYPE_POST) {
+    		$this->_deleteMedia(BX_TIMELINE_MEDIA_PHOTO, $aEvent[$CNF['FIELD_ID']]);
+    		$this->_deleteMedia(BX_TIMELINE_MEDIA_VIDEO, $aEvent[$CNF['FIELD_ID']]);
+
+	        $this->_deleteLinks($aEvent[$CNF['FIELD_ID']]);
+    	}
+
+    	//--- Update parent event when repost event was deleted.
+    	$bRepost = $aEvent['type'] == $sCommonPostPrefix . BX_TIMELINE_PARSE_TYPE_REPOST;
+        if($bRepost) {
+            $this->_oDb->deleteRepostTrack($aEvent[$CNF['FIELD_ID']]);
+
+            $aContent = unserialize($aEvent['content']);
+            $aReposted = $this->_oDb->getReposted($aContent['type'], $aContent['action'], $aContent['object_id']);
+            if(!empty($aReposted) && is_array($aReposted))
+                $this->_oDb->updateRepostCounter($aReposted[$CNF['FIELD_ID']], $aReposted['reposts'], -1);
+        }
+
+        //--- Find and delete repost events when parent event was deleted.
+        $bSystem = $this->_oConfig->isSystem($aEvent['type'], $aEvent['action']);
+	    $aRepostEvents = $this->_oDb->getEvents(array('browse' => 'reposted_by_descriptor', 'type' => $aEvent['type']));
+		foreach($aRepostEvents as $aRepostEvent) {
+			$aContent = unserialize($aRepostEvent['content']);
+			if(isset($aContent['type']) && $aContent['type'] == $aEvent['type'] && isset($aContent['object_id']) && (($bSystem && (int)$aContent['object_id'] == (int)$aEvent['object_id']) || (!$bSystem  && (int)$aContent['object_id'] == (int)$aEvent[$CNF['FIELD_ID']])) && (int)$this->_oDb->deleteEvent(array('id' => (int)$aRepostEvent[$CNF['FIELD_ID']])) > 0) {
+			    $oComments = $this->getCmtsObject($sCommonPostComment, $aRepostEvent[$CNF['FIELD_ID']]);
+                if($oComments !== false)
+                    $oComments->onObjectDelete($aRepostEvent[$CNF['FIELD_ID']]);
+
+                bx_alert($this->_oConfig->getObject('alert'), 'delete_repost', $aEvent[$CNF['FIELD_ID']], $iUserId, array(
+                    'repost_id' => $aRepostEvent[$CNF['FIELD_ID']],
+                ));
+            }
+		}
+
+        //--- Delete associated meta.
+        $oMetatags = BxDolMetatags::getObjectInstance($this->_oConfig->getObject('metatags'));
+        $oMetatags->onDeleteContent($aEvent[$CNF['FIELD_ID']]);
+
+        //--- Delete feed cache.
+        $this->_oDb->deleteCache(array('event_id' => $aEvent[$CNF['FIELD_ID']]));
+        
+        //--- Delete item cache.
+        $sCacheItemKey = $this->_oConfig->getCacheItemKey($aEvent[$CNF['FIELD_ID']]);
+        $this->getCacheItemObject()->delData($sCacheItemKey);
+
+        //--- Event -> Delete for Alerts Engine ---//
+        if($bRepost)
+            bx_alert($this->_oConfig->getObject('alert'), 'delete_repost', $aReposted[$CNF['FIELD_ID']], $iUserId, array(
+                'repost_id' => $aEvent[$CNF['FIELD_ID']],
+            ));
+        else
+            bx_alert($this->_oConfig->getObject('alert'), 'delete', $aEvent[$CNF['FIELD_ID']], $iUserId);
+        //--- Event -> Delete for Alerts Engine ---//
+    }
+
+    public function getParams($sView = '', $sType = '', $iOwnerId = 0, $iStart = 0, $iPerPage = 0, $sFilter = BX_TIMELINE_FILTER_ALL, $aModules = array(), $iTimeline = 0)
+    {
+        return $this->_prepareParams(array(
+            'view' => $sView,
+            'type' => $sType,
+            'owner_id' => $iOwnerId,
+            'start' => $iStart, 
+            'per_page' => $iPerPage, 
+            'timeline' => $iTimeline, 
+            'filter' => $sFilter, 
+            'modules' => $aModules
+        ));
+    }
+
+    public function getParamsExt($aParams = array())
+    {
+        return $this->_prepareParams($aParams);
+    }
+
+    public function getViewsData(&$aViews)
+    {
+        if(empty($aViews) || !is_array($aViews))
+            return false;
+
+        $sSystem = isset($aViews['system']) ? $aViews['system'] : '';
+        $iObjectId = isset($aViews['object_id']) ? (int)$aViews['object_id'] : 0;
+        $iCount = isset($aViews['count']) ? (int)$aViews['count'] : 0;
+        if($sSystem == '' || $iObjectId == 0)
+            return false;
+
+        return array($sSystem, $iObjectId, $iCount);
+    }
+
+    public function getVotesData(&$aVotes)
+    {
+        if(empty($aVotes) || !is_array($aVotes))
+            return false;
+
+        $sSystem = isset($aVotes['system']) ? $aVotes['system'] : '';
+        $iObjectId = isset($aVotes['object_id']) ? (int)$aVotes['object_id'] : 0;
+        $iCount = isset($aVotes['count']) ? (int)$aVotes['count'] : 0;
+        if($sSystem == '' || $iObjectId == 0)
+            return false;
+
+        return array($sSystem, $iObjectId, $iCount);
+    }
+
+    public function getReactionsData(&$aReactions)
+    {
+        if(empty($aReactions) || !is_array($aReactions))
+            return false;
+
+        $sSystem = isset($aReactions['system']) ? $aReactions['system'] : '';
+        $iObjectId = isset($aReactions['object_id']) ? (int)$aReactions['object_id'] : 0;
+        $iCount = isset($aReactions['count']) ? (int)$aReactions['count'] : 0;
+        if($sSystem == '' || $iObjectId == 0)
+            return false;
+
+        return array($sSystem, $iObjectId, $iCount);
+    }
+
+    public function getScoresData(&$aScores)
+    {
+        if(empty($aScores) || !is_array($aScores))
+            return false;
+
+        $sSystem = isset($aScores['system']) ? $aScores['system'] : '';
+        $iObjectId = isset($aScores['object_id']) ? (int)$aScores['object_id'] : 0;
+        $iScore = isset($aScores['score']) ? (int)$aScores['score'] : 0;
+        if($sSystem == '' || $iObjectId == 0)
+            return false;
+
+        return array($sSystem, $iObjectId, $iScore);
+    }
+
+    public function getReportsData(&$aReports)
+    {
+        if(empty($aReports) || !is_array($aReports))
+            return false;
+
+        $sSystem = isset($aReports['system']) ? $aReports['system'] : '';
+        $iObjectId = isset($aReports['object_id']) ? (int)$aReports['object_id'] : 0;
+        $iCount = isset($aReports['count']) ? (int)$aReports['count'] : 0;
+        if($sSystem == '' || $iObjectId == 0)
+            return false;
+
+        return array($sSystem, $iObjectId, $iCount);
+    }
+
+    public function getCommentsData(&$aComments)
+    {
+        if(empty($aComments) || !is_array($aComments))
+            return false;
+
+        $sSystem = isset($aComments['system']) ? $aComments['system'] : '';
+        $iObjectId = isset($aComments['object_id']) ? (int)$aComments['object_id'] : 0;
+        $iCount = isset($aComments['count']) ? (int)$aComments['count'] : 0;
+        if($sSystem == '' || $iObjectId == 0 || ($iCount == 0 && !isLogged()))
+            return false;
+
+        return array($sSystem, $iObjectId, $iCount);
+    }
+
+    public function getUserInfo($iUserId = 0)
+    {
+        $iLoggedId = $this->getUserId();
+        $iUserId = (int)$iUserId;
+        return parent::getUserInfo($iUserId);
+    }
+
+    public function getUserInfoWithBadges($iUserId = 0)
+    {
+        $iLoggedId = $this->getUserId();
+        $iUserId = (int)$iUserId;
+        return parent::getUserInfoWithBadges($iUserId);
+    }
+
+    public function getEventLinks($iEventId)
+    {
+        $aLinks = $this->_oDb->getLinks($iEventId);
+        if(empty($aLinks) || !is_array($aLinks))
+            return array();
+
+        $oTranscoder = BxDolTranscoderImage::getObjectInstance($this->_oConfig->getObject('transcoder_photos_preview'));
+
+        $aResult = array();
+        foreach($aLinks as $aLink)
+            $aResult[] = array(
+                'url' => $aLink['url'],
+                'title' => $aLink['title'],
+                'text' => $aLink['text'],
+                'thumbnail' => (int)$aLink['media_id'] != 0 ? $oTranscoder->getFileUrl($aLink['media_id']) : ''
+            );
+
+        return $aResult;
+    }
+
+    public function getEventImages($iEventId)
+    {
+        $aPhotos = $this->_oDb->getMedia(BX_TIMELINE_MEDIA_PHOTO, $iEventId);
+        if(empty($aPhotos) || !is_array($aPhotos))
+            return array();
+
+        $oTranscoder = BxDolTranscoderImage::getObjectInstance($this->_oConfig->getObject('transcoder_photos_view'));
+        $oTranscoderMedium = BxDolTranscoderImage::getObjectInstance($this->_oConfig->getObject('transcoder_photos_medium'));
+        $oTranscoderBig = BxDolTranscoderImage::getObjectInstance($this->_oConfig->getObject('transcoder_photos_big'));
+
+        $aResult = array();
+        foreach($aPhotos as $iPhotoId) {
+            $sPhotoSrc = $oTranscoder->getFileUrl($iPhotoId);
+            $sPhotoSrcMedium = $oTranscoderMedium->getFileUrl($iPhotoId);
+            $sPhotoSrcBig = $oTranscoderBig->getFileUrl($iPhotoId);
+            if(empty($sPhotoSrcMedium) && !empty($sPhotoSrc))
+                $sPhotoSrcMedium = $sPhotoSrc;
+            if(empty($sPhotoSrcBig) && !empty($sPhotoSrcMedium))
+                $sPhotoSrcBig = $sPhotoSrcMedium;
+
+            $aResult[] = array(
+                'id' => $iPhotoId,
+                'src' => $sPhotoSrc,
+                'src_medium' => $sPhotoSrcMedium,
+                'src_orig' => $sPhotoSrcBig,
+            );
+        }
+
+        return $aResult;
+    }
+
+    public function getEventVideos($iEventId)
+    {
+        $aVideos = $this->_oDb->getMedia(BX_TIMELINE_MEDIA_VIDEO, $iEventId);
+        if(empty($aVideos) || !is_array($aVideos))
+            return array();
+
+        $oStorage = BxDolStorage::getObjectInstance($this->_oConfig->getObject('storage_videos'));
+
+        $oTranscoderPoster = BxDolTranscoderVideo::getObjectInstance($this->_oConfig->getObject('transcoder_videos_poster'));
+        $oTranscoderMp4 = BxDolTranscoderVideo::getObjectInstance($this->_oConfig->getObject('transcoder_videos_mp4'));
+        $oTranscoderMp4Hd = BxDolTranscoderVideo::getObjectInstance($this->_oConfig->getObject('transcoder_videos_mp4_hd'));
+
+        $aResult = array();
+        foreach($aVideos as $iVideoId) {
+            $sVideoUrl = $oStorage->getFileUrlById($iVideoId);
+            $aVideoSize = $oTranscoderMp4Hd->getVideoSize($sVideoUrl);
+
+            $sVideoUrlHd = '';
+            if(!empty($aVideoSize) && is_array($aVideoSize) && (int)$aVideoSize['h'] >= 720)
+                $sVideoUrlHd = $oTranscoderMp4Hd->getFileUrl($iVideoId);
+
+            $aResult[$iVideoId] = array(
+                'id' => $iVideoId,
+                'src_poster' => $oTranscoderPoster->getFileUrl($iVideoId),
+                'src_mp4' => $oTranscoderMp4->getFileUrl($iVideoId),
+                'src_mp4_hd' => $sVideoUrlHd,
+            );
+        }
+
+        return $aResult;
+    }
+
+    /**
+     * Protected Methods 
+     */
+    protected function _serviceGetBlockView($iProfileId = 0, $aBrowseParams = array())
+    {
+        if(empty($iProfileId) && bx_get('profile_id') !== false)
+            $iProfileId = bx_process_input(bx_get('profile_id'), BX_DATA_INT);
+
+        if(empty($iProfileId) && isLogged())
+            $iProfileId = bx_get_logged_profile_id();
+
+        $aBrowseParams['owner_id'] = $iProfileId;
+
+        $aBlock = $this->_getBlockView($aBrowseParams);
+        if(!empty($aBlock))
+            return $aBlock;
+
+        return array('content' => MsgBox(_t('_bx_timeline_txt_msg_no_results')));
+    }
+
+    protected function _serviceGetBlockViewProfile($sProfileModule = 'bx_persons', $iProfileContentId = 0, $aBrowseParams = array())
+    {
+        if(empty($sProfileModule))
+            return array();
+
+        if(empty($iProfileContentId) && bx_get('id') !== false)
+            $iProfileContentId = bx_process_input(bx_get('id'), BX_DATA_INT);
+
+        $oProfile = BxDolProfile::getInstanceByContentAndType($iProfileContentId, $sProfileModule);
+        if(empty($oProfile))
+            return array();
+
+        $aBrowseParams['owner_id'] = $oProfile->id();
+
+        return $this->_getBlockView($aBrowseParams);
+    }
+
+    protected function _serviceGetBlockViews($aBrowseParams = array())
+    {
+        $aParams = $this->_prepareParams($aBrowseParams);
+
+        $this->_iOwnerId = $aParams['owner_id'];
+
+        return array(
+            'content' => $this->_oTemplate->getViewsBlock($aParams)
+        );
+    }
+
+    protected function _serviceGetBlockViewHome($aBrowseParams = array())
+    {
+        $sRssUrl = BX_DOL_URL_ROOT . $this->_oConfig->getBaseUri() . 'rss/' . $aBrowseParams['type'] . '/';
+        BxDolTemplate::getInstance()->addPageRssLink(_t('_bx_timeline_page_title_view_home'), $sRssUrl);
+
+        return $this->_serviceGetBlockViewByType($aBrowseParams);
+    }
+
+    protected function _serviceGetBlockViewHot($aBrowseParams = array())
+    {
+        $sRssUrl = BX_DOL_URL_ROOT . $this->_oConfig->getBaseUri() . 'rss/' . $aBrowseParams['type'] . '/';
+        BxDolTemplate::getInstance()->addPageRssLink(_t('_bx_timeline_page_title_view_hot'), $sRssUrl);
+
+        return $this->_serviceGetBlockViewByType($aBrowseParams);
+    }
+
+    protected function _serviceGetBlockViewByType($aBrowseParams = array())
+    {
+        $aParams = $this->_prepareParams($aBrowseParams);
+
+        $this->_iOwnerId = $aParams['owner_id'];
+
+        return array(
+            'content' => $this->_oTemplate->getViewBlock($aParams)
+        );
+    }
+
+    protected function _getBlockPost($iProfileId, $aParams = array())
+    {
+        $this->_iOwnerId = $iProfileId;
+
+        if($this->isAllowedPost() !== true)
+            return array();
+
+        return array(
+            'content' => $this->_oTemplate->getPostBlock($this->_iOwnerId, $aParams)
+        );
+    }
+
+    protected function _getBlockView($aBrowseParams = array())
+    {
+        if(empty($aBrowseParams['owner_id']))
+            return array();
+
+        $aParams = $this->_prepareParams($aBrowseParams);
+        if(empty($aParams['per_page']))
+            $aParams['per_page'] = $this->_oConfig->getPerPage('profile');
+
+        $this->_iOwnerId = $aParams['owner_id'];
+        $oProfileOwner = BxDolProfile::getInstance($this->_iOwnerId);
+
+        $mixedResult = $oProfileOwner->checkAllowedProfileView();
+        if($mixedResult !== CHECK_ACTION_RESULT_ALLOWED)
+            return array('content' => MsgBox($mixedResult));
+
+        list($sUserName) = $this->getUserInfo($aParams['owner_id']);
+
+        $sView = $aParams['view'];
+        $sRssUrl = BX_DOL_URL_ROOT . $this->_oConfig->getBaseUri() . 'rss/' . BX_BASE_MOD_NTFS_TYPE_OWNER . '/' . $this->_iOwnerId . '/';
+        $sJsObject = $this->_oConfig->getJsObjectView($aParams);
+        $aMenu = array(
+            array('id' => $sView . '-view-all', 'name' => $sView . '-view-all', 'class' => '', 'link' => 'javascript:void(0)', 'onclick' => 'javascript:' . $sJsObject . '.changeFilter(this)', 'target' => '_self', 'title' => _t('_bx_timeline_menu_item_view_all'), 'active' => 1),
+            array('id' => $sView . '-view-owner', 'name' => $sView . '-view-owner', 'class' => '', 'link' => 'javascript:void(0)', 'onclick' => 'javascript:' . $sJsObject . '.changeFilter(this)', 'target' => '_self', 'title' => _t('_bx_timeline_menu_item_view_owner', $sUserName)),
+            array('id' => $sView . '-view-other', 'name' => $sView . '-view-other', 'class' => '', 'link' => 'javascript:void(0)', 'onclick' => 'javascript:' . $sJsObject . '.changeFilter(this)', 'target' => '_self', 'title' => _t('_bx_timeline_menu_item_view_other')),
+            array('id' => $sView . '-get-rss', 'name' => $sView . '-get-rss', 'class' => '', 'link' => $sRssUrl, 'onclick' => '', 'target' => '_blank', 'title' => _t('_bx_timeline_menu_item_get_rss')),
+        );
+
+        $sContent = '';
+        bx_alert($oProfileOwner->getModule(), $this->_oConfig->getUri() . '_view', $this->_iOwnerId, $this->getUserId(), array('override_content' => &$sContent, 'params' => &$aParams, 'menu' => &$aMenu));
+
+        $oMenu = new BxTemplMenuInteractive(array('template' => 'menu_interactive_vertical.html', 'menu_id'=> $sView . '-view-all', 'menu_items' => $aMenu));
+        $oMenu->setSelected('', $sView . '-view-all');
+
+        if (!$sContent)
+            $sContent = $this->_oTemplate->getViewBlock($aParams);
+
+        BxDolTemplate::getInstance()->addPageRssLink(_t('_bx_timeline_page_title_view'), $sRssUrl);
+
+        return array('content' => $sContent, 'menu' => $oMenu);
+    }
+    
+    protected function _getContentForTimelinePost($aEvent, $aContentInfo, $aBrowseParams = array())
+    {
+    	$CNF = &$this->_oConfig->CNF;
+
+        $iId = (int)$aContentInfo[$CNF['FIELD_ID']];
+    	$sUrl = BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URI_VIEW_ENTRY'] . '&id=' . $iId);
+
+        $sText = ''; 
+        if(isset($aContentInfo['content'])){
+            $aTmp = unserialize($aContentInfo['content']);
+            if(isset($aTmp['text']))
+                $sText = $aTmp['text'];
+        }
+
+        if(empty($sText) && !empty($aContentInfo[$CNF['FIELD_TITLE']]))
+            $sText = $aContentInfo[$CNF['FIELD_TITLE']];
+
+        if(!empty($CNF['OBJECT_METATAGS']) && !empty($sText)) {
+            $oMetatags = BxDolMetatags::getObjectInstance($CNF['OBJECT_METATAGS']);
+            $sText = $oMetatags->metaParse($iId, $sText);
+        }
+
+        return array(
+            'sample' => isset($CNF['T']['txt_sample_single_with_article']) ? $CNF['T']['txt_sample_single_with_article'] : $CNF['T']['txt_sample_single'],
+            'sample_wo_article' => $CNF['T']['txt_sample_single'],
+            'sample_action' => isset($CNF['T']['txt_sample_action']) ? $CNF['T']['txt_sample_action'] : '',
+            'url' => $sUrl,
+            'title' => '',
+            'text' => $sText,
+            'links' => $this->getEventLinks($iId),
+            'images' => array(),
+            'images_attach' => $this->getEventImages($iId),
+            'videos' => array(),
+            'videos_attach' => $this->getEventVideos($iId),
+            'files' => array(),
+            'files_attach' => array()
+        );
+    }
+
+	protected function _isAllowedPin($aEvent, $bPerform = false)
+    {
+    	$iUserId = (int)$this->getUserId();
+    	if($iUserId == 0)
+    		return false;
+
+		if(isAdmin() || (int)$aEvent['owner_id'] == $iUserId || ((int)$aEvent['owner_id'] == 0 && $this->_oConfig->isCommon($aEvent['type'], $aEvent['action']) && (int)$aEvent['object_id'] == $iUserId))
+           return true;
+
+        $aCheckResult = checkActionModule($iUserId, 'pin', $this->getName(), $bPerform);
+        if(!empty($aEvent['owner_id']) && ($oProfileOwner = BxDolProfile::getInstance($aEvent['owner_id'])) !== false)
+            bx_alert($oProfileOwner->getModule(), $this->_oConfig->getUri() . '_pin', $oProfileOwner->id(), $iUserId, array('check_result' => &$aCheckResult));
+
+        return $aCheckResult[CHECK_ACTION_RESULT] !== CHECK_ACTION_RESULT_ALLOWED ? $aCheckResult[CHECK_ACTION_MESSAGE] : true;
+    }
+
+    protected function _isAllowedStick($aEvent, $bPerform = false)
+    {
+    	$iUserId = (int)$this->getUserId();
+    	if($iUserId == 0)
+    		return false;
+
+    	if(isAdmin())
+    		return true;
+
+    	$aCheckResult = checkActionModule($iUserId, 'stick', $this->getName(), $bPerform);
+    	if(!empty($aEvent['owner_id']) && ($oProfileOwner = BxDolProfile::getInstance($aEvent['owner_id'])) !== false)
+            bx_alert($oProfileOwner->getModule(), $this->_oConfig->getUri() . '_stick', $oProfileOwner->id(), $iUserId, array('check_result' => &$aCheckResult));
+    
+    	return $aCheckResult[CHECK_ACTION_RESULT] !== CHECK_ACTION_RESULT_ALLOWED ? $aCheckResult[CHECK_ACTION_MESSAGE] : true;
+    }
+
+    protected function _isAllowedPromote($aEvent, $bPerform = false)
+    {
+        if(isAdmin())
+            return true;
+
+        $iUserId = (int)$this->getUserId();
+        if($iUserId == 0)
+            return false;
+
+        $aCheckResult = checkActionModule($iUserId, 'promote', $this->getName(), $bPerform);
+        if(!empty($aEvent['owner_id']) && ($oProfileOwner = BxDolProfile::getInstance($aEvent['owner_id'])) !== false)
+            bx_alert($oProfileOwner->getModule(), $this->_oConfig->getUri() . '_promote', $oProfileOwner->id(), $iUserId, array('check_result' => &$aCheckResult));
+
+        return $aCheckResult[CHECK_ACTION_RESULT] !== CHECK_ACTION_RESULT_ALLOWED ? $aCheckResult[CHECK_ACTION_MESSAGE] : true;
+    }
+
+    protected function _addLink(&$oForm)
+    {
+        $iUserId = $this->getUserId();
+
+        $sLink = $oForm->getCleanValue('url');
+
+        $aMatches = array();
+        preg_match($this->_oConfig->getPregPattern('url'), $sLink, $aMatches);
+        $sLink = (empty($aMatches[2]) ? 'http://' : '') . $aMatches[0];
+
+        $aSiteInfo = bx_get_site_info($sLink, array(
+            'thumbnailUrl' => array('tag' => 'link', 'content_attr' => 'href'),
+            'OGImage' => array('name_attr' => 'property', 'name' => 'og:image'),
+        ));
+
+        $sTitle = !empty($aSiteInfo['title']) ? $aSiteInfo['title'] : _t('_Empty');
+        $sDescription = !empty($aSiteInfo['description']) ? $aSiteInfo['description'] : _t('_Empty');
+
+        $sMediaUrl = '';
+        if(!empty($aSiteInfo['thumbnailUrl']))
+        	$sMediaUrl = $aSiteInfo['thumbnailUrl'];
+        else if(!empty($aSiteInfo['OGImage']))
+        	$sMediaUrl = $aSiteInfo['OGImage'];
+
+		$iMediaId = 0;
+		$oStorage = null;
+        if(!empty($sMediaUrl)) {
+        	$oStorage = BxDolStorage::getObjectInstance($this->_oConfig->getObject('storage_' . BX_TIMELINE_MEDIA_PHOTO . 's'));
+
+        	$iMediaId = $oStorage->storeFileFromUrl($sMediaUrl, true, $iUserId);
+        }
+
+        $iId = (int)$oForm->insert(array('profile_id' => $iUserId, 'media_id' => $iMediaId, 'url' => $sLink, 'title' => $sTitle, 'text' => $sDescription, 'added' => time()));
+        if(!empty($iId)) {
+        	if(!empty($oStorage) && !empty($iMediaId))
+        		$oStorage->afterUploadCleanup($iMediaId, $iUserId);
+
+            return array('id' => $iId, 'item' => $this->_oTemplate->getAttachLinkItem($iUserId, $iId));
+        }
+
+        return array('message' => _t('_bx_timeline_txt_err_cannot_perform_action'));
+    }
+
+	protected function _deleteLinks($iId)
+    {
+	    $aLinks = $this->_oDb->getLinks($iId);
+	    if(empty($aLinks) || !is_array($aLinks))
+	    	return;
+
+		$oStorage = BxDolStorage::getObjectInstance($this->_oConfig->getObject('storage_photos'));
+		foreach($aLinks as $aLink)
+			if(!empty($aLink['media_id']))
+				$oStorage->deleteFile($aLink['media_id']);
+
+		$this->_oDb->deleteLinks($iId);
+    }
+
+    protected function _saveMedia($sType, $iId, $aItemIds)
+    {
+    	if(empty($aItemIds) || !is_array($aItemIds))
+    		return; 
+
+    	$iUserId = $this->getUserId();
+
+		$oStorage = BxDolStorage::getObjectInstance($this->_oConfig->getObject('storage_' . strtolower($sType) . 's'));
+		foreach($aItemIds as $iItemId)
+        	if($this->_oDb->saveMedia($sType, $iId, $iItemId))
+            	$oStorage->afterUploadCleanup($iItemId, $iUserId);
+    }
+
+    protected function _deleteMedia($sType, $iId)
+    {
+	    $aItems = $this->_oDb->getMedia($sType, $iId);
+	    if(empty($aItems) || !is_array($aItems))
+	    	return;
+
+		$oStorage = BxDolStorage::getObjectInstance($this->_oConfig->getObject('storage_' . strtolower($sType) . 's'));
+		foreach($aItems as $iItemId)
+			$oStorage->deleteFile($iItemId);
+
+		$this->_oDb->deleteMedia($sType, $iId);
+    }
+
+    protected function _prepareParams($aParams)
+    {
+        if(empty($aParams['name']))
+            $aParams['name'] = '';
+        
+        if(empty($aParams['view']))
+            $aParams['view'] = BX_TIMELINE_VIEW_DEFAULT;
+
+        if(empty($aParams['type']))
+            $aParams['type'] = BX_TIMELINE_TYPE_DEFAULT;
+
+        if(empty($aParams['owner_id']))
+            $aParams['owner_id'] = $this->getUserId();
+
+        if(!isset($aParams['start']) || (int)$aParams['start'] < 0)
+            $aParams['start'] = 0;
+
+        if(!isset($aParams['per_page']) || (int)$aParams['per_page'] <= 0)
+            $aParams['per_page'] = isset($aParams['per_page_default']) && (int)$aParams['per_page_default'] > 0 ? $aParams['per_page_default'] : $this->_oConfig->getPerPage();
+
+        if(empty($aParams['timeline']) || (int)$aParams['timeline'] < 0)
+            $aParams['timeline'] = 0;
+
+        if(empty($aParams['filter']))
+            $aParams['filter'] = BX_TIMELINE_FILTER_ALL;
+
+        if(empty($aParams['modules']) || !is_array($aParams['modules']))
+            $aParams['modules'] = array();
+
+        if(empty($aParams['blink']) || !is_array($aParams['blink']))
+            $aParams['blink'] = array();
+
+        if($this->_oConfig->isHot())
+            $aParams['hot'] = $this->_oDb->getHot();
+
+        $aParams = array_merge($aParams, array(
+            'browse' => 'list',
+            'status' => BX_TIMELINE_STATUS_ACTIVE,
+            'dynamic_mode' => false,
+        ));
+
+        return $aParams;
+    }
+
+    protected function _prepareParamsGet()
+    {
+        $aParams = array();
+
+        $aParams['name'] = bx_get('name');
+        $aParams['name'] = $aParams['name'] !== false ? bx_process_input($aParams['name'], BX_DATA_TEXT) : '';
+
+        $aParams['view'] = bx_get('view');
+        $aParams['view'] = $aParams['view'] !== false ? bx_process_input($aParams['view'], BX_DATA_TEXT) : BX_TIMELINE_VIEW_DEFAULT;
+
+        $aParams['type'] = bx_get('type');
+        $aParams['type'] = $aParams['type'] !== false ? bx_process_input($aParams['type'], BX_DATA_TEXT) : BX_TIMELINE_TYPE_DEFAULT;
+
+        $aParams['owner_id'] = bx_get('owner_id');
+        $aParams['owner_id'] = $aParams['owner_id'] !== false ? bx_process_input($aParams['owner_id'], BX_DATA_INT) : $this->getUserId();
+
+        $aParams['start'] = bx_get('start');
+        $aParams['start'] = $aParams['start'] !== false ? bx_process_input($aParams['start'], BX_DATA_INT) : 0;
+
+        $aParams['per_page'] = bx_get('per_page');
+        $aParams['per_page'] = $aParams['per_page'] !== false ? bx_process_input($aParams['per_page'], BX_DATA_INT) : $this->_oConfig->getPerPage();
+
+        $aParams['timeline'] = bx_get('timeline');
+        $aParams['timeline'] = $aParams['timeline'] !== false ? bx_process_input($aParams['timeline']) : '';
+
+        $aParams['filter'] = bx_get('filter');
+        $aParams['filter'] = $aParams['filter'] !== false ? bx_process_input($aParams['filter'], BX_DATA_TEXT) : BX_TIMELINE_FILTER_ALL;
+
+        $aParams['modules'] = bx_get('modules');
+        $aParams['modules'] = $aParams['modules'] !== false ? bx_process_input($aParams['modules'], BX_DATA_TEXT) : array();
+
+        $aParams['blink'] = bx_get('blink');
+        $aParams['blink'] = $aParams['blink'] !== false ? explode(',', bx_process_input($aParams['blink'], BX_DATA_TEXT)) : array();
+
+        if($this->_oConfig->isHot())
+            $aParams['hot'] = $this->_oDb->getHot();
+
+        $aParams = array_merge($aParams, array(
+            'browse' => 'list',
+            'status' => BX_TIMELINE_STATUS_ACTIVE,
+            'dynamic_mode' => true,
+        ));
+
+        return $aParams;
+    }
+
+    protected function _prepareTextForSave($s)
+    {
+        return bx_process_input($s, BX_DATA_HTML);
+    }
+
+    protected function _getFieldValue($sField, $iContentId)
+    {
+        $CNF = &$this->_oConfig->CNF;
+        if(empty($CNF[$sField]))
+            return false;
+
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iContentId));
+        if(empty($aEvent) || empty($aEvent[$CNF[$sField]]))
+            return false;
+
+        return $aEvent[$CNF[$sField]];
+    }
+
+    /**
+     * Returns records for React Jot using OAuth2
+     * @param int $iProfileId
+     * @param string $sPage
+     * @param string $sTab
+     * @param int $iStart
+     * @param int $iPerPage
+     * @return array
+     */
+    public function serviceGetUserPosts($iProfileId = 0, $sPage = 'home', $sTab = 'hot', $iStart = 0, $iPerPage = 0)
+    {
+        $iProfileId = (int)$iProfileId ? (int)$iProfileId : bx_get_logged_profile_id();
+        if(empty($iProfileId))
+            return array(
+                'code' => 1,
+                'result' => array(),
+                'message' => _t('_bx_timeline_txt_msg_no_profile_id'),
+                'page' => $sPage,
+                'tab' => $sTab
+            );
+
+        $sType = BX_TIMELINE_TYPE_OWNER_AND_CONNECTIONS;
+        $sView = BX_TIMELINE_VIEW_DEFAULT;
+        $sFilter = BX_TIMELINE_FILTER_ALL;
+
+        $aModules = array();
+
+        switch($sPage){
+            case 'profile':
+                $sType = BX_BASE_MOD_NTFS_TYPE_OWNER;
+                $sFilter = BX_TIMELINE_FILTER_OWNER;
+                break;
+            default:
+                if ($this -> _oDb -> isModuleByName($sPage))
+                   $aModules = array($sPage);
+        }
+
+        switch($sTab)
+        {
+            case 'latest':
+                $sType = BX_BASE_MOD_NTFS_TYPE_PUBLIC;
+                break;
+            case 'popular':
+                $sType = BX_TIMELINE_TYPE_HOT;
+                break;
+            case 'feed':
+                $sType = BX_TIMELINE_TYPE_OWNER_AND_CONNECTIONS;
+                break;
+            default:
+                if ($this -> _oDb -> isModuleByName($sTab))
+                    $aModules = array($sTab);
+        }
+
+        $aParams = $this->getParams($sView, $sType, $iProfileId, $iStart, $iPerPage, $sFilter, $aModules);
+        $aData = $this->_oDb->getEvents($aParams, true);
+
+        list($aEvents, $iCount) = $aData;
+
+        if(empty($aEvents) || !is_array($aEvents))
+            return array(
+                'code' => 0,
+                'result' => array(),
+                'message' => _t('_bx_timeline_txt_msg_no_results'),
+                'page' => $sPage,
+                'tab' => $sTab
+            );
+
+        $aBrowseParams = array();
+        $aItems = array();
+
+        foreach($aEvents as $aEvent) {
+            $aResult = $this->_oTemplate->getData($aEvent, $aBrowseParams);
+
+            if($aResult === false)
+                continue;
+
+            $oOwnerProfile = BxDolProfile::getInstance($aResult['owner_id']);
+
+            $aFiles = array();
+            $aContent = &$aResult['content'];
+
+            if (!empty($aContent['image']))
+                $aFiles['images'] = array_values($aContent['images']);
+            if (!empty($aContent['images_attach']))
+                $aFiles['images'] = array_values($aContent['images_attach']);
+
+            if (!empty($aContent['videos']))
+                $aFiles['videos'] = array_values($aContent['videos']);
+            else
+            if (!empty($aContent['videos_attach']))
+                $aFiles['videos'] = array_values($aContent['videos_attach']);
+
+            if (!empty($aContent['files']))
+                $aFiles['files'] = array_values($aContent['files']);
+            else
+                if (!empty($aContent['files_attach']))
+                    $aFiles['files'] = array_values($aContent['files_attach']);
+
+            $aItems[$aEvent['id']] = array_merge(array(
+                'owner' => array(
+                    'icon' => $oOwnerProfile -> getThumb(),
+                    'name' => $oOwnerProfile -> getDisplayName(),
+                    'url' => $oOwnerProfile -> getUrl()
+                ),
+                'sample' => !empty($aResult['sample']) ? _t($aResult['sample']) : _t('_bx_timeline_txt_sample'),
+                'sample_action' => !empty($aResult['sample_action']) ? _t($aResult['sample_action']) : _t('_bx_timeline_txt_added_sample'),
+                'url' => isset($aResult['url']) ? $aResult['url'] : '',
+                'raw' => isset($aContent['raw']) ? strip_tags($aContent['raw']) : '',
+                'text' => isset($aContent['text']) ? strip_tags($aContent['text']) : '',
+                'views' => isset($aResult['views']['count']) ? (int)$aResult['views']['count'] : 0,
+                'votes' => isset($aResult['votes']['count']) ? (int)$aResult['votes']['count'] : 0,
+                'reactions' => isset($aResult['reactions']['count']) ? (int)$aResult['reactions']['count'] : 0,
+                'scores' => isset($aResult['scores']['count']) ? (int)$aResult['scores']['count'] : 0,
+                'reports' => isset($aResult['reports']['count']) ? (int)$aResult['reports']['count'] : 0,
+                'comments' => isset($aResult['comments']['count']) ? (int)$aResult['comments']['count'] : 0,
+                'date' => isset($aResult['date']) ? $aResult['date'] : $aEvent['date'],
+                'type' => stripos($aEvent['type'], 'timeline') !== false ? 'bx_timeline' : $aEvent['type'],
+                'event_type' => $aEvent['type'],
+                'id' => $aEvent['id'],
+                'content' => $aResult['content'],
+                'title' => isset($aResult['title']) ? _t($aResult['title']) : '',
+                'description' => isset($aResult['description']) ? $aResult['description'] : ''
+            ), $aFiles);
+        }
+
+        return array(
+            'result' => $aItems,
+            'code' => 0,
+            'message' => '',
+            'page' => $sPage,
+            'tab' => $sTab,
+            'total' => $iCount,
+            'start' => (int)$iStart
+        );
+    }
+}
+
+/** @} */

+ 2641 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/source/classes/BxTimelineTemplate.php

@@ -0,0 +1,2641 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Timeline Timeline
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxTimelineTemplate extends BxBaseModNotificationsTemplate
+{
+    protected static $_aMemoryCacheItems;
+    protected static $_sMemoryCacheItemsKeyMask;
+
+    protected static $_sTmplContentItemItem;
+    protected static $_sTmplContentItemOutline;
+    protected static $_sTmplContentItemTimeline;
+    protected static $_sTmplContentItemSearch;
+    protected static $_sTmplContentTypePost;
+    protected static $_sTmplContentTypeRepost;
+
+    protected $_bShowTimelineDividers;
+
+    function __construct(&$oConfig, &$oDb)
+    {
+        parent::__construct($oConfig, $oDb);
+
+        $this->_bShowTimelineDividers = false;
+    }
+
+    public function init()
+    {
+        parent::init();
+
+        self::$_aMemoryCacheItems = array();
+        self::$_sMemoryCacheItemsKeyMask = "%s_%d";
+    }
+
+    public function getAddedCss($sType = '', $bDynamic = false)
+    {
+        $aCss = array();
+        switch($sType) {
+            case 'view':
+                $aCss = array(
+                    BX_DIRECTORY_PATH_PLUGINS_PUBLIC . 'flickity/|flickity.css',
+                    'cmts.css',
+                    'view.css',
+                    'view-media-tablet.css',
+                    'view-media-desktop.css',
+                    'repost.css',
+                );
+
+                if($this->_oConfig->isJumpTo())
+                    $aCss[] = 'jquery-ui/jquery-ui.css';
+                break;
+
+            case 'post':
+                if($this->_oConfig->isEmoji())
+                    $aCss[] = BX_DIRECTORY_PATH_PLUGINS_PUBLIC . 'emoji/css/|emoji.css';
+
+                $aCss[] = 'post.css';
+                break;
+        }
+
+        $mixedResult = $this->addCss($aCss, $bDynamic);
+        if($bDynamic)
+            return $mixedResult; 
+    }
+
+    public function getAddedJs($sType = '', $bDynamic = false)
+    {
+        $aJs = array(
+            'autosize.min.js',
+            'jquery.anim.js',
+            'main.js',
+        );
+        switch($sType) {
+            case 'view':
+                $aJs = array_merge($aJs, array(
+                    'jquery.ba-resize.min.js',
+                    'masonry.pkgd.min.js',
+                    'flickity/flickity.pkgd.min.js',
+                    'embedly-player.min.js',
+                    'BxDolCmts.js',
+                    'view.js',
+                    'repost.js',
+                ));
+
+                if($this->_oConfig->isJumpTo())
+                    $aJs = array_merge($aJs, array(
+                        'jquery-ui/jquery.ui.core.min.js',
+                        'jquery-ui/jquery.ui.datepicker.min.js',
+                    ));
+                    
+                break;
+
+            case 'post':
+                $aJs = array_merge($aJs, array(
+                    'jquery.form.min.js',
+                    'post.js',
+                ));
+                break;
+        }
+
+        $mixedResult = $this->addJs($aJs, $bDynamic);
+        if($bDynamic)
+            return $mixedResult; 
+    }
+
+    public function getJsCode($sType, $aParams = array(), $bWrap = true, $bDynamic = false)
+    {
+        $oModule = $this->getModule();
+
+        $aParams = array_merge(array(
+            'bInfScroll' => $this->_oConfig->isInfiniteScroll(),
+            'iInfScrollAutoPreloads' => $this->_oConfig->getAutoPreloads()
+        ), $aParams);
+
+        return parent::getJsCode($sType, $aParams, $bWrap, $bDynamic);
+    }
+
+    public function getJsCodePost($iOwnerId, $aParams = array(), $bWrap = true, $bDynamic = false)
+    {
+        return $this->getJsCode('post', array(
+            'bEmoji' => $this->_oConfig->isEmoji(),
+            'sVideosAutoplay' => $this->_oConfig->getVideosAutoplay(),
+            'oRequestParams' => array_merge(array(
+                'type' => isset($aParams['type']) ? $aParams['type'] : BX_TIMELINE_TYPE_DEFAULT, 
+                'owner_id' => $iOwnerId
+            ), $aParams)
+        ), $bWrap, $bDynamic);
+    }
+
+    public function getPostBlock($iOwnerId, $aParams = array())
+    {
+        $aForm = $this->getModule()->getFormPost($aParams);
+
+        return $this->parseHtmlByName('block_post.html', array (
+            'style_prefix' => $this->_oConfig->getPrefix('style'),
+            'js_object' => $this->_oConfig->getJsObject('post'),
+            'js_content' => $this->getJsCodePost($iOwnerId, $aParams),
+            'form' => $aForm['form']
+        ));
+    }
+
+    public function getViewsBlock($aParams)
+    {
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+        $sJsObject = $this->_oConfig->getJsObjectView($aParams);
+        
+        $sType = isset($aParams['type']) ? $aParams['type'] : '';
+
+        $sMenu = $this->_oConfig->getObject('menu_view');
+        $oMenu = BxDolMenu::getObjectInstance($sMenu);
+
+    	$aMenuItems = $oMenu->getMenuItems();
+    	if(empty($aMenuItems) || !is_array($aMenuItems))
+            return '';
+
+    	if(empty($sType)) {
+            $aMenuItem = array_shift($aMenuItems);
+            $sType = $aMenuItem['name'];
+    	}
+    	$oMenu->setSelected($this->_oConfig->getName(), $sType);
+        $oMenu->addMarkers(array(
+            'js_object_view' => $sJsObject
+        ));
+
+        $sTitle = _t('_bx_timeline_page_block_title_views_' . $aParams['view']);
+
+        return $this->parseHtmlByName('block_views.html', array(
+            'style_prefix' => $sStylePrefix,
+            'html_id' => $this->_oConfig->getHtmlIdView('views', $aParams, array('with_type' => false)),
+            'html_id_content' => $this->_oConfig->getHtmlIdView('views_content', $aParams, array('with_type' => false)),
+            'title' => $sTitle,
+            'menu' => $oMenu->getCode(),
+            'content' => $this->getViewBlock($aParams)
+        ));
+    }
+
+    public function getViewBlock($aParams)
+    {
+        $oModule = $this->getModule();
+
+        list($sContent, $sLoadMore, $sBack, $sEmpty, $iEvent) = $this->getPosts($aParams);
+
+        //--- Add live update
+        $oModule->actionResumeLiveUpdate($aParams['type'], $aParams['owner_id']);
+
+        $sModuleName = $oModule->getName();
+        $sModuleMethod = !empty($aParams['get_live_updates']) ? $aParams['get_live_updates'] : 'get_live_update';
+        $sService = BxDolService::getSerializedService($sModuleName, $sModuleMethod, array($aParams, $oModule->getUserId(), '{count}', '{init}'));
+
+        $aLiveUpdatesParams = array($this->_oConfig->getLiveUpdateKey($aParams), 1, $sService, true);
+        if($sModuleMethod == 'get_live_update')
+            $aLiveUpdatesParams[] = $iEvent;
+
+        $sLiveUpdatesCode = call_user_func_array(array(BxDolLiveUpdates::getInstance(), 'add'), $aLiveUpdatesParams);
+        //--- Add live update
+
+        $sJsObject = $this->_oConfig->getJsObjectView($aParams);
+        return $sLiveUpdatesCode . $this->parseHtmlByName('block_view.html', array(
+            'style_prefix' => $this->_oConfig->getPrefix('style'),
+            'html_id' => $this->_oConfig->getHtmlIdView('main', $aParams),
+            'view' => $aParams['view'],
+            'back' => $sBack,
+            'empty' => $sEmpty, 
+            'content' => $sContent,
+            'load_more' =>  $sLoadMore,
+            'show_more' => $this->_getShowMore($aParams),
+            'view_image_popup' => $this->_getImagePopup($aParams),
+            'js_content' => $this->getJsCode('view', array(
+                'sObjName' => $sJsObject,
+                'sVideosAutoplay' => $this->_oConfig->getVideosAutoplay(),
+            	'oRequestParams' => $aParams
+            ), array(
+                'wrap' => true,
+                'mask_markers' => array('object' => $sJsObject)
+            )) . $this->getJsCode('repost')
+        ));
+    }
+
+    public function getSearchBlock($sContent)
+    {
+        $oModule = $this->getModule();
+        $aParams = $oModule->getParams(BX_TIMELINE_VIEW_SEARCH);
+
+        return $this->parseHtmlByName('block_search.html', array(
+            'style_prefix' => $this->_oConfig->getPrefix('style'),
+            'html_id' => $this->_oConfig->getHtmlIdView('main', $aParams),
+            'view' => $aParams['view'],
+            'content' => $sContent,
+            'view_image_popup' => $this->_getImagePopup($aParams),
+            'js_content' => $this->getJsCode('view', array(
+            	'oRequestParams' => $aParams
+            ))
+        ));
+    }
+
+    public function getItemBlock($iId, $aBrowseParams = array())
+    {
+        $CNF = $this->_oConfig->CNF;
+
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iId));
+        if(empty($aEvent))
+            return array('content' => MsgBox(_t('_Empty')), 'designbox_id' => 13);
+
+        $iProfile = (int)$aEvent[$CNF['FIELD_OWNER_ID']];
+        if(!empty($iProfile)) {
+            $oProfile = BxDolProfile::getInstance($iProfile);
+            if(!$oProfile)
+                return array('content' => MsgBox(_t('_Empty')), 'designbox_id' => 13);
+
+            $mixedResult = $oProfile->checkAllowedProfileView();
+            if($mixedResult !== CHECK_ACTION_RESULT_ALLOWED)
+                return array('content' => MsgBox($mixedResult), 'designbox_id' => 13);
+        }
+
+        $sContent = $this->getPost($aEvent, $aBrowseParams);
+
+        $sKey = 'allowed_view';
+        if(isset($aEvent[$sKey]) && $aEvent[$sKey] !== CHECK_ACTION_RESULT_ALLOWED) 
+            return array('content' => MsgBox($aEvent[$sKey]), 'designbox_id' => 13);
+
+        $oModule = $this->getModule();
+        if($oModule->isAllowedView($aEvent) !== true)
+            return array('content' => MsgBox(_t('_Access denied')), 'designbox_id' => 13);
+
+        if(!$this->_oConfig->isSystem($aEvent['type'], $aEvent['action'])) {
+            $mixedViews = $oModule->getViewsData($aEvent['views']);
+            if($mixedViews !== false) {
+                list($sSystem, $iObjectId) = $mixedViews;
+                $oModule->getViewObject($sSystem, $iObjectId)->doView();
+            }
+        }
+
+        list($sAuthorName) = $oModule->getUserInfo($aEvent['object_owner_id']);
+
+        $sTitle = $sAuthorName . ' ' . _t($aEvent['sample_action'], _t($aEvent['sample']));
+        $sDescription = $aEvent['title'];
+        if(get_mb_substr($sDescription, 0, 1) == '_')
+            $sDescription = _t($sDescription);
+
+        $oTemplate = BxDolTemplate::getInstance();
+        $oTemplate->setPageHeader(strip_tags($sTitle));
+        $oTemplate->setPageDescription(strip_tags($sDescription));
+
+        $oMetatags = BxDolMetatags::getObjectInstance($this->_oConfig->getObject('metatags'));
+        if($oMetatags)
+            $oMetatags->addPageMetaInfo($aEvent[$CNF['FIELD_ID']]);
+
+        $sReferrer = '';
+        if(isset($_SERVER['HTTP_REFERER']) && mb_stripos($_SERVER['HTTP_REFERER'], BX_DOL_URL_ROOT) === 0)
+            $sReferrer = $_SERVER['HTTP_REFERER'];
+        else 
+            $sReferrer = BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink($this->_oConfig->CNF['URL_HOME']);
+
+        $sJsObject = $this->_oConfig->getJsObjectView($aBrowseParams);
+        return array('content' => $this->parseHtmlByName('block_item.html', array(
+            'style_prefix' => $this->_oConfig->getPrefix('style'),
+            'html_id' => $this->_oConfig->getHtmlIdView('main', $aBrowseParams),
+            'content' => $sContent,
+            'show_more' => $this->_getShowMore($aBrowseParams),
+            'view_image_popup' => $this->_getImagePopup($aBrowseParams),
+            'js_content' => $this->getJsCode('view', array(
+                'sObjName' => $sJsObject,
+                'sVideosAutoplay' => $this->_oConfig->getVideosAutoplay(),
+                'sReferrer' => $sReferrer,
+                'oRequestParams' => $aBrowseParams
+            ), array(
+                'wrap' => true,
+                'mask_markers' => array('object' => $sJsObject)
+            )) . $this->getJsCode('repost')
+        )));
+    }
+
+    /**
+     * Get event's content.
+     * @param integer $iId - event ID.
+     * @param string $sMode - 'photo' is only one mode which is available for now.
+     */
+    public function getItemBlockContent($iId, $sMode) {
+        $CNF = $this->_oConfig->CNF;
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iId));
+        if(empty($aEvent))
+            return '';
+
+        $aTmplVars = array(
+        	'style_prefix' => $sStylePrefix,
+            'bx_if:show_image' => array(
+                'condition' => false,
+                'content' => array()
+            )
+        );
+
+        switch($sMode) {
+            case 'photo':
+                $aTmplVars['bx_if:show_image']['condition'] = true;
+                $aTmplVars['bx_if:show_image']['content'] = array(
+                    'style_prefix' => $sStylePrefix,
+                    'src' => base64_decode(bx_process_input(bx_get('src'))),
+                );
+                break;
+        }
+
+        return $this->parseHtmlByName('block_item_content.html', $aTmplVars);
+    }
+
+    public function getItemBlockInfo($iId) {
+        $CNF = $this->_oConfig->CNF;
+
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iId));
+        if(empty($aEvent))
+            return '';
+
+        $aResult = $this->getDataCached($aEvent);
+        if($aResult === false)
+            return '';
+
+        list($sAuthorName, $sAuthorUrl, $sAuthorIcon, $sAuthorUnit) = $this->getModule()->getUserInfo($aResult['object_owner_id']);
+
+        $oForm = BxDolForm::getObjectInstance($this->_oConfig->getObject('form_post'), $this->_oConfig->getObject('form_display_post_view'), $this);
+        $oForm->initChecker($aEvent);
+
+        return $this->parseHtmlByName('block_item_info.html', array(
+            'style_prefix' => $this->_oConfig->getPrefix('style'),
+            'author' => $sAuthorUnit,
+            'fields' => $oForm->getCode()
+        ));
+    }
+
+    public function getItemBlockComments($iId) {
+        $CNF = &$this->_oConfig->CNF;
+
+        $aEvent = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $iId));
+        if(empty($aEvent))
+            return '';
+
+        $aResult = $this->getDataCached($aEvent);
+        if($aResult === false)
+            return '';
+
+        return $this->parseHtmlByName('block_item_comments.html', array(
+            'style_prefix' => $this->_oConfig->getPrefix('style'),
+            'content' => $this->_getComments($aResult['comments'])
+        ));
+                
+    }
+
+    public function getUnit(&$aEvent, $aBrowseParams = array())
+    {
+        $oModule = $this->getModule();
+
+        if(empty($aBrowseParams) || !is_array($aBrowseParams))
+            $aBrowseParams = $oModule->getParams(BX_TIMELINE_VIEW_SEARCH);
+
+        return $this->getPost($aEvent, $aBrowseParams);
+    }
+
+    public function getPost(&$aEvent, $aBrowseParams = array())
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $iEventId = (int)$aEvent[$CNF['FIELD_ID']];
+
+        $sMemoryCacheItemsKey = sprintf(self::$_sMemoryCacheItemsKeyMask, $aBrowseParams['view'], $iEventId);
+        if(array_key_exists($sMemoryCacheItemsKey, self::$_aMemoryCacheItems))
+            return self::$_aMemoryCacheItems[$sMemoryCacheItemsKey];
+
+        /**
+         * Add all items in memory cache even if they are empty.
+         */
+        self::$_aMemoryCacheItems[$sMemoryCacheItemsKey] = '';
+
+        $oPrivacy = BxDolPrivacy::getObjectInstance($this->_oConfig->getObject('privacy_view'));
+        if($oPrivacy) {
+            $oPrivacy->setTableFieldAuthor($this->_oConfig->isSystem($aEvent['type'], $aEvent['action']) ? 'owner_id' : 'object_id');
+            if(!$oPrivacy->check($iEventId)) {
+                if($this->_oConfig->isCacheList())
+                    $this->_oDb->deleteCache(array(
+                        'type' => $aBrowseParams['type'], 
+                        'profile_id' => bx_get_logged_profile_id(),
+                        'event_id' => $iEventId
+                    ));
+
+                return '';
+            }
+        }
+
+        $aResult = $this->getDataCached($aEvent, $aBrowseParams);
+        if($aResult === false)
+            return '';
+
+        if(isset($aResult['owner_id']))
+            $aEvent['owner_id'] = $aResult['owner_id'];
+
+        $aEvent['object_owner_id'] = $aResult['object_owner_id'];
+        $aEvent['icon'] = !empty($aResult['icon']) ? $aResult['icon'] : '';
+        $aEvent['sample'] = !empty($aResult['sample']) ? $aResult['sample'] : '_bx_timeline_txt_sample';
+        $aEvent['sample_action'] = !empty($aResult['sample_action']) ? $aResult['sample_action'] : '_bx_timeline_txt_added_sample';
+        $aEvent['content'] = $aResult['content'];
+        $aEvent['views'] = $aResult['views'];
+        $aEvent['votes'] = $aResult['votes'];
+        $aEvent['reactions'] = $aResult['reactions'];
+        $aEvent['scores'] = $aResult['scores'];
+        $aEvent['reports'] = $aResult['reports'];
+        $aEvent['comments'] = $aResult['comments'];
+
+        $sKey = 'allowed_view';
+        $aEvent[$sKey] = CHECK_ACTION_RESULT_ALLOWED;
+        if(isset($aResult[$sKey], $aResult[$sKey]['module'], $aResult[$sKey]['method']))
+            $aEvent[$sKey] = BxDolService::call($aResult[$sKey]['module'], $aResult[$sKey]['method'], array($aEvent));
+        else if(($aHandler = $this->_oConfig->getHandler($aEvent)) !== false && BxDolRequest::serviceExists($aHandler['module_name'], 'get_timeline_post_allowed_view'))
+            $aEvent[$sKey] = BxDolService::call($aHandler['module_name'], 'get_timeline_post_allowed_view', array($aEvent));
+
+        if(isset($aEvent[$sKey]) && $aEvent[$sKey] !== CHECK_ACTION_RESULT_ALLOWED) 
+            return '';
+
+        if($this->_oConfig->isCacheList())
+            $this->_cacheEvent(bx_get_logged_profile_id(), $aEvent, $aBrowseParams);
+
+        $sType = !empty($aResult['content_type']) ? $aResult['content_type'] : BX_TIMELINE_PARSE_TYPE_DEFAULT;
+        self::$_aMemoryCacheItems[$sMemoryCacheItemsKey] = $this->_getPost($sType, $aEvent, $aBrowseParams);
+
+        return self::$_aMemoryCacheItems[$sMemoryCacheItemsKey];
+    }
+
+    public function getPosts($aParams)
+    {
+        $bViewTimeline = $aParams['view'] == BX_TIMELINE_VIEW_TIMELINE;
+
+        $iStart = $aParams['start'];
+        $iPerPage = $aParams['per_page'];
+
+        $aParamsDb = $aParams;
+
+        //--- Before: Check for Previous
+        $iDays = -1;
+        $bPrevious = false;
+        if($iStart - 1 >= 0) {
+            $aParamsDb['start'] -= 1;
+            $aParamsDb['per_page'] += 1;
+            $bPrevious = true;
+        }
+
+        //--- Before: Check for Next
+        $aParamsDb['per_page'] += 1;
+
+        $aEvents = $this->_getPosts($aParamsDb);
+
+        //--- After: Check for Previous
+        if($bPrevious) {
+            $aEvent = array_shift($aEvents);
+            $iDays = (int)$aEvent['days'];
+        }
+
+        //--- After: Check for Next
+        $bNext = false;
+        if(count($aEvents) > $iPerPage) {
+            $aEvent = array_pop($aEvents);
+            $bNext = true;
+        }
+
+        $sContent = '';
+        $sContent .= $this->getSizer($aParams);
+
+        $iFirst = 0;
+        $iEvents = count($aEvents);
+        if($iEvents > 0)
+            $iFirst = (int)$aEvents[0]['id'];
+        else 
+            $sContent .= $bViewTimeline ? $this->getDividerToday() : '';
+
+        //--- Check for Visual Grouping
+        $aGroups = array();
+        foreach($aEvents as $iIndex => $aEvent) {
+            $aContent = unserialize($aEvent['content']);
+            if(!isset($aContent['timeline_group']))
+                continue;
+
+            $aGroup = $aContent['timeline_group'];
+            $sGroup = $aGroup['by'];
+            if(!isset($aGroups[$sGroup]))
+               $aGroups[$sGroup] = array('field' => $aGroup['field'], 'indexes' => array(), 'processed' => false);
+
+            $aGroups[$sGroup]['indexes'][] = $iIndex;
+        }
+
+        //--- Perform Visual Grouping
+        foreach($aGroups as $sGroup => $aGroup) {
+            if(empty($aGroup['field']) || empty($aGroup['indexes']))
+                continue;
+
+            switch($aGroup['field']) {
+                case 'owner_id':
+                    $aOwnerIds = array();
+                    foreach($aGroup['indexes'] as $iIndex)
+                        if(!in_array($aEvents[$iIndex]['owner_id'], $aOwnerIds))
+                            $aOwnerIds[] = $aEvents[$iIndex]['owner_id'];
+
+                    $iGroupIndex = (int)array_shift($aGroup['indexes']);
+                    if(is_null($iGroupIndex))
+                        break;
+
+                    foreach($aGroup['indexes'] as $iIndex)
+                        unset($aEvents[$iIndex]);
+
+                    $aEvents[$iGroupIndex]['owner_id_grouped'] = $aOwnerIds;
+                    break;
+            }
+        }
+
+        $bFirst = true;
+        $sEvents = '';
+        foreach($aEvents as $aEvent) {
+            $iEvent = (int)$aEvent['id'];
+
+            $sEvent = $this->getPost($aEvent, $aParams);
+            if(empty($sEvent))
+                continue;
+
+            if($bFirst && $bViewTimeline) {
+                $sEvents .= $this->getDividerToday($aEvent);
+
+                $bFirst = false;
+            }
+
+            $sEvents .= $bViewTimeline ? $this->getDivider($iDays, $aEvent) : '';
+            $sEvents .= $sEvent;
+        }
+        $sContent .= $sEvents;
+
+        $bEvents = !empty($sEvents);
+
+        $sBack = $this->getBack($aParams);
+
+        $iPerPage = $this->_oConfig->getPerPage();
+        $iPreloads = $this->_oConfig->getAutoPreloads();
+        if(!$this->_oConfig->isInfiniteScroll() || (($aParams['start'] - $iPerPage * ($iPreloads - 1)) % ($iPerPage * $iPreloads) == 0))
+            $sLoadMore = $this->getLoadMore($aParams, $bNext, $iEvents > 0 && $bEvents);
+        else
+            $sLoadMore = $this->getLoadMoreAuto();
+
+        $sEmpty = $this->getEmpty($iEvents <= 0 || !$bEvents);
+
+        return array($sContent, $sLoadMore, $sBack, $sEmpty, $iFirst);
+    }
+
+    public function getEmpty($bVisible)
+    {
+        return $this->parseHtmlByName('empty.html', array(
+            'style_prefix' => $this->_oConfig->getPrefix('style'),
+            'visible' => $bVisible ? 'block' : 'none',
+            'content' => MsgBox(_t('_bx_timeline_txt_msg_no_results'))
+        ));
+    }
+
+    public function getDivider(&$iDays, &$aEvent)
+    {
+        if(!$this->_bShowTimelineDividers || $iDays == $aEvent['days'])
+            return '';
+
+        $iDays = $aEvent['days'];
+        $iDaysAgo = (int)$aEvent['ago_days'];
+        if($aEvent['today'] == $aEvent['days'] || (($aEvent['today'] - $aEvent['days']) == 1 && $iDaysAgo == 0))
+            return '';
+
+        return $this->parseHtmlByName('divider.html', array(
+        	'style_prefix' => $this->_oConfig->getPrefix('style'),
+            'type' => 'common',
+            'bx_if:show_hidden' => array(
+                'condition' => false,
+                'content' => array()
+            ),
+            'content' => bx_time_js($aEvent['date'])
+        ));
+    }
+
+    public function getDividerToday($aEvent = array())
+    {
+        if(!$this->_bShowTimelineDividers)
+            return '';
+
+    	$bToday = !empty($aEvent) && ($aEvent['today'] == $aEvent['days'] || (($aEvent['today'] - $aEvent['days']) == 1 && (int)$aEvent['ago_days'] == 0));
+
+        return $this->parseHtmlByName('divider.html', array(
+        	'style_prefix' => $this->_oConfig->getPrefix('style'),
+            'type' => 'today',
+        	'bx_if:show_hidden' => array(
+                'condition' => !$bToday,
+                'content' => array()
+            ),
+            'content' => _t('_bx_timeline_txt_today')
+        ));
+    }
+
+    public function getSizer($aParams)
+    {
+        if($aParams['view'] != BX_TIMELINE_VIEW_OUTLINE)
+            return '';
+
+        return $this->parseHtmlByName('sizer_' . $aParams['view'] . '.html', array(
+        	'style_prefix' => $this->_oConfig->getPrefix('style')
+        ));
+    }
+
+    public function getBack($aParams)
+    {
+        $iYearSel = (int)$aParams['timeline'];
+        if($iYearSel == 0)
+            return '';
+
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+        $sJsObject = $this->_oConfig->getJsObjectView($aParams);
+
+        $iYearNow = date('Y', time());
+        return $this->parseHtmlByName('back.html', array(
+        	'style_prefix' => $sStylePrefix,
+            'content' => $this->parseLink('javascript:void(0)', _t('_bx_timeline_txt_jump_to_recent'), array(
+                'title' => _t('_bx_timeline_txt_jump_to_n_year', $iYearNow),
+        		'onclick' => 'javascript:' . $sJsObject . '.changeTimeline(this, 0)'
+            ))
+        ));
+    }
+
+    public function getLoadMore($aParams, $bEnabled, $bVisible = true)
+    {
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+        $sJsObject = $this->_oConfig->getJsObjectView($aParams);
+
+        $iStart = $aParams['start'];
+        $iPerPage = $aParams['per_page'];
+
+        $aTmplVars = array(
+            'style_prefix' => $sStylePrefix,
+            'visible' => ($aParams['view'] == BX_TIMELINE_VIEW_TIMELINE && $bVisible) || ($aParams['view'] == BX_TIMELINE_VIEW_OUTLINE && $bEnabled && $bVisible) ? 'block' : 'none',
+            'bx_if:is_disabled' => array(
+                'condition' => !$bEnabled,
+                'content' => array()
+            ),
+            'bx_if:show_on_click' => array(
+                'condition' => $bEnabled,
+                'content' => array(
+                    'on_click' => 'javascript:' . $sJsObject . '.changePage(this, ' . ($iStart + $iPerPage) . ', ' . $iPerPage . ')'
+                )
+            ),
+            'bx_if:show_jump_to' => array(
+                'condition' => $this->_oConfig->isJumpTo(),
+                'content' => array(
+                    'style_prefix' => $sStylePrefix,
+                    'content' => $this->getJumpTo($aParams)
+                )
+            )
+        );
+        return $this->parseHtmlByName('load_more.html', $aTmplVars);
+    }
+
+    public function getLoadMoreAuto()
+    {
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+
+        return $this->parseHtmlByName('load_more_auto.html', array(
+            'style_prefix' => $sStylePrefix,
+        ));
+    }
+
+    /**
+     * Note. For now both List and Caledar based Jump To elements are available.
+     * Calendar based element is used by default. List based one can be removed 
+     * later if it won't be used completely.
+     */
+    public function getJumpTo($aParams)
+    {
+        if(!$this->_oConfig->isJumpTo())
+            return '';
+
+        $bList = false;
+        $bDynamicMode = isset($aParams['dynamic_mode']) && (bool)$aParams['dynamic_mode'] === true;
+
+        if($bList && !$bDynamicMode)
+            return '';
+
+        return $this->{'_getJumpTo' . ($bList ? 'List' : 'Caledar')}($aParams);
+    }
+
+    public function getComments($sSystem, $iId, $aBrowseParams = array())
+    {
+        $oModule = $this->getModule();
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+
+        $oCmts = $oModule->getCmtsObject($sSystem, $iId);
+        if($oCmts === false)
+            return '';
+
+        $aCmtsBp = array();
+        if(!empty($aBrowseParams['cmts_preload_number']))
+            $aCmtsBp['per_view'] = $aBrowseParams['cmts_preload_number'];
+
+        $aCmtsDp = array(
+            'in_designbox' => false, 
+            'dynamic_mode' => isset($aBrowseParams['dynamic_mode']) && $aBrowseParams['dynamic_mode'] === true
+        );
+        if(!empty($aBrowseParams['cmts_min_post_form']))
+            $aCmtsDp['min_post_form'] = $aBrowseParams['cmts_min_post_form'];
+
+        $aComments = $oCmts->getCommentsBlock($aCmtsBp, $aCmtsDp);
+        if(empty($aComments) || !is_array($aComments))
+            return '';
+
+        return $this->parseHtmlByName('comments.html', array(
+            'style_prefix' => $sStylePrefix,
+            'id' => $iId,
+            'content' => $aComments['content']
+        ));
+    }
+
+    public function getRepostElement($iOwnerId, $sType, $sAction, $iObjectId, $aParams = array())
+    {
+        $aReposted = $this->_oDb->getReposted($sType, $sAction, $iObjectId);
+        if(empty($aReposted) || !is_array($aReposted))
+            return '';
+
+		$oModule = $this->getModule();
+		$bDisabled = $oModule->isAllowedRepost($aReposted) !== true || $this->_oDb->isReposted($aReposted['id'], $iOwnerId, $oModule->getUserId());
+		if($bDisabled && (int)$aReposted['reposts'] == 0)
+            return '';
+
+		$sStylePrefix = $this->_oConfig->getPrefix('style');
+        $sStylePrefixRepost = $sStylePrefix . '-repost-';
+
+        $bDynamicMode = isset($aParams['dynamic_mode']) && $aParams['dynamic_mode'] === true;
+
+        $bShowDoRepostAsButtonSmall = isset($aParams['show_do_repost_as_button_small']) && $aParams['show_do_repost_as_button_small'] == true;
+        $bShowDoRepostAsButton = !$bShowDoRepostAsButtonSmall && isset($aParams['show_do_repost_as_button']) && $aParams['show_do_repost_as_button'] == true;
+
+        $bShowDoRepostImage = isset($aParams['show_do_repost_image']) && $aParams['show_do_repost_image'] == true && !empty($aParams['image_do_repost']);
+        $bShowDoRepostIcon = isset($aParams['show_do_repost_icon']) && $aParams['show_do_repost_icon'] == true && !empty($aParams['icon_do_repost']);
+        $bShowDoRepostText = isset($aParams['show_do_repost_text']) && $aParams['show_do_repost_text'] == true && !empty($aParams['text_do_repost']);
+        $bShowCounter = isset($aParams['show_counter']) && $aParams['show_counter'] === true;
+
+        //--- Do repost link ---//
+		$sClass = $sStylePrefixRepost . 'do-repost';
+		if($bShowDoRepostAsButton)
+			$sClass .= ' bx-btn';
+		else if($bShowDoRepostAsButtonSmall)
+			$sClass .= ' bx-btn bx-btn-small';
+
+                $sOnClick = '';
+                if(!$bDisabled) {
+                    $sCommonPrefix = $this->_oConfig->getPrefix('common_post');
+                    if(str_replace($sCommonPrefix, '', $sType) == BX_TIMELINE_PARSE_TYPE_REPOST) {
+                        $aRepostedData = unserialize($aReposted['content']);
+
+                        $sOnClick = $this->_getRepostJsClick($iOwnerId, $aRepostedData['type'], $aRepostedData['action'], $aRepostedData['object_id']);
+                    }
+                    else
+                        $sOnClick = $this->_getRepostJsClick($iOwnerId, $sType, $sAction, $iObjectId);
+                }
+                else
+                    $sClass .= $bShowDoRepostAsButton || $bShowDoRepostAsButtonSmall ? ' bx-btn-disabled' : ' ' . $sStylePrefixRepost . 'disabled';
+
+		$aOnClickAttrs = array(
+			'title' => _t('_bx_timeline_txt_do_repost')
+		);
+		if(!empty($sClass))
+			$aOnClickAttrs['class'] = $sClass;
+		if(!empty($sOnClick))
+			$aOnClickAttrs['onclick'] = $sOnClick;
+
+		//--- Do repost label ---//
+		$sMethodDoRepostLabel = ''; 
+		$sTemplateDoRepostLabel = '';
+		if(!empty($aParams['template_do_repost_label'])) {
+			$sMethodDoRepostLabel = 'parseHtmlByContent';
+			$sTemplateDoRepostLabel = $aParams['template_do_repost_label'];
+		}
+		else {
+			$sMethodDoRepostLabel = 'parseHtmlByName';
+			$sTemplateDoRepostLabel = $aParams['template_do_repost_label_name'];
+		}
+
+		$sDoRepost = $this->$sMethodDoRepostLabel($sTemplateDoRepostLabel, array(
+        	'bx_if:show_image' => array(
+        		'condition' => $bShowDoRepostImage,
+        		'content' => array(
+        			'src' => $this->getIconUrl($aParams['image_do_repost'])
+        		)
+        	),
+        	'bx_if:show_icon' => array(
+        		'condition' => $bShowDoRepostIcon,
+        		'content' => array(
+        			'name' => $aParams['icon_do_repost']
+        		)
+        	),
+        	'bx_if:show_text' => array(
+        		'condition' => $bShowDoRepostText,
+        		'content' => array(
+        			'text' => _t($aParams['text_do_repost'])
+        		)
+        	)
+        ));
+
+        return $this->parseHtmlByName('repost_element_block.html', array(
+            'style_prefix' => $sStylePrefix,
+            'html_id' => $this->_oConfig->getHtmlIds('repost', 'main') . $aReposted['id'],
+            'class' => ($bShowDoRepostAsButton ? $sStylePrefixRepost . 'button' : '') . ($bShowDoRepostAsButtonSmall ? $sStylePrefixRepost . 'button-small' : ''),
+            'count' => $aReposted['reposts'],
+            'do_repost' => $this->parseLink('javascript:void(0)', $sDoRepost, $aOnClickAttrs),
+            'bx_if:show_counter' => array(
+                'condition' => $bShowCounter,
+                'content' => array(
+                    'style_prefix' => $sStylePrefix,
+        			'bx_if:show_hidden' => array(
+        				'condition' => (int)$aReposted['reposts'] == 0,
+        				'content' => array()
+        			),
+                    'counter' => $this->getRepostCounter($aReposted, $aParams)
+                )
+            ),
+            'script' => $this->getRepostJsScript($bDynamicMode)
+        ));
+    }
+
+    public function getRepostCounter($aEvent, $aParams = array())
+    {
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+        $sJsObject = $this->_oConfig->getJsObject('repost');
+
+        $bShowDoRepostAsButtonSmall = isset($aParams['show_do_repost_as_button_small']) && $aParams['show_do_repost_as_button_small'] == true;
+        $bShowDoRepostAsButton = !$bShowDoRepostAsButtonSmall && isset($aParams['show_do_repost_as_button']) && $aParams['show_do_repost_as_button'] == true;
+
+        $sClass = $sStylePrefix . '-repost-counter';
+        if($bShowDoRepostAsButtonSmall)
+            $sClass .= ' bx-btn-small-height';
+        if($bShowDoRepostAsButton)
+            $sClass .= ' bx-btn-height';
+
+        return $this->parseLink('javascript:void(0)', !empty($aEvent['reposts']) && (int)$aEvent['reposts'] > 0 ? $this->getRepostCounterLabel($aEvent['reposts']) : '', array(
+            'id' => $this->_oConfig->getHtmlIds('repost', 'counter') . $aEvent['id'],
+            'class' => $sClass,
+            'title' => _t('_bx_timeline_txt_reposted_by'),
+            'onclick' => 'javascript:' . $sJsObject . '.toggleByPopup(this, ' . $aEvent['id'] . ')'
+        ));
+    }
+
+    public function getRepostCounterLabel($iCount)
+    {
+        return $iCount;
+    }
+
+    public function getRepostedBy($iId)
+    {
+        $aTmplUsers = array();
+        $oModule = $this->getModule();
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+
+        $aUserIds = $this->_oDb->getRepostedBy($iId);
+        foreach($aUserIds as $iUserId) {
+            list($sUserName, $sUserUrl, $sUserIcon, $sUserUnit) = $oModule->getUserInfo($iUserId);
+            $aTmplUsers[] = array(
+                'style_prefix' => $sStylePrefix,
+                'user_unit' => $sUserUnit
+            );
+        }
+
+        if(empty($aTmplUsers))
+            $aTmplUsers = MsgBox(_t('_Empty'));
+
+        return $this->parseHtmlByName('repost_by_list.html', array(
+            'style_prefix' => $sStylePrefix,
+            'bx_repeat:list' => $aTmplUsers
+        ));
+    }
+
+    public function getRepostJsScript($bDynamicMode = false)
+    {
+        $sCode = $this->getJsCode('repost', array(), array('mask' => '{object} = new {class}({params});', 'wrap' => false));
+
+        if($bDynamicMode) {
+            $sJsObject = $this->_oConfig->getJsObject('repost');
+
+            $sCode = "var " . $sJsObject . " = null; 
+            $.getScript('" . bx_js_string($this->getJsUrl('main.js'), BX_ESCAPE_STR_APOS) . "', function(data, textStatus, jqxhr) {
+                $.getScript('" . bx_js_string($this->getJsUrl('repost.js'), BX_ESCAPE_STR_APOS) . "', function(data, textStatus, jqxhr) {
+                    bx_get_style('" . bx_js_string($this->getCssUrl('repost.css'), BX_ESCAPE_STR_APOS) . "');
+                    " . $sCode . "
+                });
+            }); ";
+        }
+        else {
+            $sCode = "var " . $sCode;
+
+            $this->addCss(array('repost.css'));
+            $this->addJs(array('main.js', 'repost.js'));
+        }
+
+        return $this->_wrapInTagJsCode($sCode);
+    }
+
+    public function getRepostJsClick($iOwnerId, $sType, $sAction, $iObjectId)
+    {
+        $aReposted = $this->_oDb->getReposted($sType, $sAction, $iObjectId);
+        if(empty($aReposted) || !is_array($aReposted))
+            return '';
+
+        $sResult = '';
+        $sCommonPrefix = $this->_oConfig->getPrefix('common_post');
+        if(str_replace($sCommonPrefix, '', $sType) == BX_TIMELINE_PARSE_TYPE_REPOST) {
+            $aRepostedData = unserialize($aReposted['content']);
+
+            $sResult = $this->_getRepostJsClick($iOwnerId, $aRepostedData['type'], $aRepostedData['action'], $aRepostedData['object_id']);
+        }
+        else
+            $sResult = $this->_getRepostJsClick($iOwnerId, $sType, $sAction, $iObjectId);
+
+        return $sResult;
+    }
+
+    public function getAttachLinkForm()
+    {
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+        $sJsObject = $this->_oConfig->getJsObject('post');
+
+        $aForm = $this->getModule()->getFormAttachLink();
+
+        return $this->parseHtmlByName('attach_link_form.html', array(
+            'style_prefix' => $sStylePrefix,
+            'js_object' => $sJsObject,
+            'form_id' => $aForm['form_id'],
+            'form' => $aForm['form'],
+        ));
+    }
+
+    public function getAttachLinkField($iUserId)
+    {
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+
+        $aLinks = $this->_oDb->getUnusedLinks($iUserId);
+
+        $sLinks = '';
+        foreach($aLinks as $aLink)
+            $sLinks .= $this->getAttachLinkItem($iUserId, $aLink);
+
+        return $this->parseHtmlByName('attach_link_form_field.html', array(
+            'html_id' => $this->_oConfig->getHtmlIds('post', 'attach_link_form_field'),
+            'style_prefix' => $sStylePrefix,
+            'links' => $sLinks
+        ));
+    }
+
+    public function getAttachLinkItem($iUserId, $mixedLink)
+    {
+        $aLink = is_array($mixedLink) ? $mixedLink : $this->_oDb->getUnusedLinks($iUserId, (int)$mixedLink);
+        if(empty($aLink) || !is_array($aLink))
+            return '';
+
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+        $sJsObject = $this->_oConfig->getJsObject('post');
+        $sLinkIdPrefix = $this->_oConfig->getHtmlIds('post', 'attach_link_item');
+
+        $bTmplVarsEmbed = false;
+        $aTmplVarsEmbed = array();
+        $oEmbed = BxDolEmbed::getObjectInstance();
+        if($oEmbed) {
+            $bTmplVarsEmbed = true;
+            $aTmplVarsEmbed = array(
+                'style_prefix' => $sStylePrefix,
+                'embed' => $oEmbed->getLinkHTML($aLink['url'], $aLink['title'], 300),
+            );
+        }
+        else {
+            $aLinkAttrs = array(
+            	'title' => bx_html_attribute($aLink['title'])
+            );
+            if(!$this->_oConfig->isEqualUrls(BX_DOL_URL_ROOT, $aLink['url'])) {
+                $aLinkAttrs['target'] = '_blank';
+    
+                if($this->_oDb->getParam('sys_add_nofollow') == 'on')
+            	    $aLinkAttrs['rel'] = 'nofollow';
+            }
+
+            $sThumbnail = "";
+            if((int)$aLink['media_id'] != 0)
+                $sThumbnail = BxDolTranscoderImage::getObjectInstance($this->_oConfig->getObject('transcoder_photos_preview'))->getFileUrl($aLink['media_id']);
+
+            $aTmplVarsEmbed = array(
+                'style_prefix' => $sStylePrefix,
+            	'bx_if:show_thumbnail' => array(
+            		'condition' => !empty($sThumbnail),
+            		'content' => array(
+            			'style_prefix' => $sStylePrefix,
+            			'thumbnail' => $sThumbnail
+            		)
+            	),
+    			'url' => $aLink['url'],
+            	'link' => $this->parseLink($aLink['url'], $aLink['title'], $aLinkAttrs)
+            );
+        }
+
+        return $this->parseHtmlByName('attach_link_item.html', array(
+            'html_id' => $sLinkIdPrefix . $aLink['id'],
+            'style_prefix' => $sStylePrefix,
+            'js_object' => $sJsObject,
+            'id' => $aLink['id'],
+        	'bx_if:show_embed_outer' => array(
+        		'condition' => $bTmplVarsEmbed,
+        		'content' => $aTmplVarsEmbed
+        	),
+        	'bx_if:show_embed_inner' => array(
+        		'condition' => !$bTmplVarsEmbed,
+        		'content' => $aTmplVarsEmbed
+            ),
+        ));
+    }
+
+    public function getData(&$aEvent, $aBrowseParams = array())
+    {
+        $aResult = $this->_oConfig->isSystem($aEvent['type'], $aEvent['action']) ? $this->_getSystemData($aEvent, $aBrowseParams) : $this->_getCommonData($aEvent, $aBrowseParams);
+        if(empty($aResult) || empty($aResult['object_owner_id']) || empty($aResult['content']))
+            return false;
+
+        list($sUserName) = $this->getModule()->getUserInfo($aResult['object_owner_id']);
+
+        $sSample = !empty($aResult['sample']) ? $aResult['sample'] : '_bx_timeline_txt_sample';
+        if(empty($aEvent['title']) || empty($aEvent['description'])) {
+            $sTitle = !empty($aResult['title']) ? $this->_oConfig->getTitle($aResult['title']) : _t($sSample);
+
+            $sDescription = !empty($aResult['description']) ? $aResult['description'] : _t('_bx_timeline_txt_user_added_sample', $sUserName, _t($sSample));
+            if($sDescription == '' && !empty($aResult['content']['text']))
+                $sDescription = $aResult['content']['text'];
+
+            $this->_oDb->updateEvent(array(
+                'title' => bx_process_input(strip_tags($sTitle)),
+                'description' => bx_process_input(strip_tags($sDescription))
+            ), array('id' => $aEvent['id']));
+        }
+
+        return $aResult;
+    }
+
+    public function getDataCached($aEvent, $aBrowseParams = array())
+    {
+        if(!$this->_oConfig->isCacheItem()) 
+            return $this->getData($aEvent, $aBrowseParams);
+
+        /**
+         * For now parameters from $aBrowseParams array aren't used during data retrieving.
+         * If they will then the cache should be created depending on their values.
+         */
+        $sCacheKey = $this->_oConfig->getCacheItemKey($aEvent['id']);
+        $iCacheLifetime = $this->_oConfig->getCacheItemLifetime();
+
+        $oCache = $this->getModule()->getCacheItemObject();
+        $aCached = $oCache->getData($sCacheKey, $iCacheLifetime);
+        if(!empty($aCached)) 
+            return unserialize($aCached);
+
+        $aBrowseParams['dynamic_mode'] = true;
+        $aResult = $this->getData($aEvent, $aBrowseParams);
+        if(!empty($aResult) && isset($aResult['_cache']) && (bool)$aResult['_cache'] === false)
+            return $aResult;
+
+        $oCache->setData($sCacheKey, serialize($aResult), $iCacheLifetime);           
+        return $aResult;
+    }
+
+    public function getVideo($aEvent, $aVideo)
+    {
+        $sVideoId = $this->_oConfig->getHtmlIds('view', 'video') . $aEvent['id'] . '-' . $aVideo['id'];
+        $oPlayer = BxDolPlayer::getObjectInstance();
+        if (!$oPlayer)
+            return '';
+
+        $sPlayer = $oPlayer->getCodeVideo (BX_PLAYER_EMBED, array(
+            'poster' => $aVideo['src_poster'],
+            'mp4' => array('sd' => $aVideo['src_mp4'], 'hd' => $aVideo['src_mp4_hd']),
+            'attrs' => array('id' => $sVideoId),
+        ));
+        return $this->parseHtmlByName('video_player.html', array(
+            'player' => $sPlayer,
+            'html_id' => $sVideoId
+        ));
+    }
+
+    /*
+     * Show only one Live Update notification for all new Events.
+     */
+    function getLiveUpdate($aBrowseParams, $iProfileId, $iCountOld = 0, $iCountNew = 0)
+    {
+        $oModule = $this->getModule();
+
+    	$iCount = (int)$iCountNew - (int)$iCountOld;
+    	if($iCount < 0)
+            return '';
+
+        $aParams = $oModule->getParamsExt($aBrowseParams);
+        $aParams['start'] = 0;
+        $aParams['per_page'] = 1;
+        $aParams['newest'] = true;
+        $aParams['filter'] = BX_TIMELINE_FILTER_OTHER_VIEWER;
+        $aEvents = $this->_oDb->getEvents($aParams);
+        if(empty($aEvents) || !is_array($aEvents))
+            return '';
+
+        $aEvent = array_shift($aEvents);
+        if(empty($aEvent) || !is_array($aEvent))
+            return '';
+
+        $sJsObject = $this->_oConfig->getJsObjectView($aParams);
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+
+        return $this->parseHtmlByName('live_update_button.html', array(
+            'style_prefix' => $sStylePrefix,
+            'html_id' => $this->_oConfig->getHtmlIds('view', 'live_update_popup') . $aBrowseParams['type'],
+            'onclick_show' => "javascript:" . $sJsObject . ".goToBtn(this, 'timeline-event-" . $aEvent['id'] . "', '" . $aEvent['id'] . "');",
+        ));
+    }
+
+    /*
+     * Show Live Update notification separately for each new Event. Popup Chain is used here.
+     * 
+     * Note. This way to display live update notifications isn't used for now. 
+     * See BxTimelineTemplate::getLiveUpdate method instead.
+     */
+    function getLiveUpdates($aBrowseParams, $iProfileId, $iCountOld = 0, $iCountNew = 0)
+    {
+        $bShowAll = true;
+        $bShowActions = false;
+        $oModule = $this->getModule();
+
+    	$iCount = (int)$iCountNew - (int)$iCountOld;
+    	if($iCount < 0)
+            return '';
+
+        $iCountMax = $this->_oConfig->getLiveUpdateLength();
+        if($iCount > $iCountMax)
+            $iCount = $iCountMax;
+
+        $aParams = $oModule->getParamsExt($aBrowseParams);
+        $aParams['start'] = 0;
+        $aParams['per_page'] = $iCount;
+        $aParams['filter'] = BX_TIMELINE_FILTER_OTHER_VIEWER;
+        $aEvents = $this->_oDb->getEvents($aParams);
+        if(empty($aEvents) || !is_array($aEvents))
+            return '';
+
+        $sJsObject = $this->_oConfig->getJsObjectView($aParams);
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+
+        $iUserId = $oModule->getUserId();
+        $bModerator = $oModule->isModerator();
+
+        $aEvents = array_reverse($aEvents);
+        $iEvents = count($aEvents);
+
+        $aTmplVarsItems = array();
+        foreach($aEvents as $iIndex => $aEvent) {
+            $aData = $this->getDataCached($aEvent);
+            if($aData === false)
+                continue;
+
+            $iEventId = $aEvent['id'];
+            $iEventAuthorId = $this->_oConfig->isSystem($aEvent['type'], $aEvent['action']) ? (int)$aEvent['owner_id'] : (int)$aEvent['object_id'];
+            if($iEventAuthorId < 0) {
+                if(abs($iEventAuthorId) == $iUserId)
+                    continue;
+                else if($bModerator)
+                    $iEventAuthorId *= -1;
+            }
+
+            $oAuthor = $oModule->getObjectUser($iEventAuthorId);
+            $sAuthorName = $oAuthor->getDisplayName();
+
+            $aTmplVarsItems[] = array(
+                'bx_if:show_as_hidden' => array(
+                    'condition' => !$bShowAll && $iIndex < ($iEvents - 1),
+                    'content' => array(),
+                ),
+                'item' => $this->parseHtmlByName('live_update_notification.html', array(
+                    'style_prefix' => $sStylePrefix,
+                    'onclick_show' => "javascript:" . $sJsObject . ".goTo(this, 'timeline-event-" . $iEventId . "', '" . $iEventId . "');",
+                    'author_link' => $oAuthor->getUrl(), 
+                    'author_title' => bx_html_attribute($sAuthorName),
+                    'author_name' => $sAuthorName,
+                    'author_unit' => $oAuthor->getUnit(0, array('template' => 'unit_wo_info_links')), 
+                    'text' => _t($aData['sample_action'], _t($aData['sample'])),
+                )),
+                'bx_if:show_previous' => array(
+                    'condition' => $bShowActions && $iIndex > 0,
+                    'content' => array(
+                        'onclick_previous' => $sJsObject . '.previousLiveUpdate(this)'
+                    )
+                ),
+                'bx_if:show_close' => array(
+                    'condition' => $bShowActions,
+                    'content' => array(
+                        'onclick_close' => $sJsObject . '.hideLiveUpdate(this)'
+                    )
+                )
+            );
+        }
+
+        return $this->parseHtmlByName('popup_chain.html', array(
+            'html_id' => $this->_oConfig->getHtmlIds('view', 'live_update_popup') . $aBrowseParams['type'],
+            'bx_repeat:items' => $aTmplVarsItems
+        ));
+    }
+
+    protected function _cacheEvent($iProfileId, &$aEvent, &$aParams)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $aParamsSet = array(
+            'type' => $aParams['type'],
+            'context_id' => is_array($aEvent[$CNF['FIELD_OWNER_ID']]) ? $aEvent[$CNF['FIELD_OWNER_ID']][0] : $CNF['FIELD_OWNER_ID'],  
+            'profile_id' => $iProfileId, 
+            'event_id' => $aEvent[$CNF['FIELD_ID']], 
+            'date' => $aEvent[$CNF['FIELD_ADDED']]
+        );
+
+        switch ($aParams['type']) {
+            case BX_BASE_MOD_NTFS_TYPE_PUBLIC:
+                $aParamsSet['context_id'] = 0;
+                break;
+
+            case BX_BASE_MOD_NTFS_TYPE_OWNER:
+            case BX_TIMELINE_TYPE_CHANNELS:
+            case BX_TIMELINE_TYPE_FEED:
+            case BX_TIMELINE_TYPE_OWNER_AND_CONNECTIONS:
+                $aParamsSet['context_id'] = $iProfileId;
+                break;
+        }
+
+        return $this->_oDb->insertCache($aParamsSet);
+    }
+
+    protected function _cacheEvents($aParams)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $iPerPage = (int)$aParams['per_page'];
+        $aParamsCopy = $aParams;
+
+        $aIds = array();
+        while(count($aIds) < $iPerPage) {
+            $aEvents = $this->_oDb->getEvents($aParamsCopy);
+            if(empty($aEvents))
+                break;
+
+            foreach($aEvents as $aEvent) {
+                if($this->getPost($aEvent, $aParamsCopy) == '')
+                    continue;
+
+                $aIds[] = $aEvent[$CNF['FIELD_ID']];
+                if(count($aIds) == $iPerPage)
+                    break 2;
+            }
+
+            $aParamsCopy['start'] += $iPerPage;
+        }
+
+        return $aIds;
+    }
+
+    protected function _cacheEventsFrom($iId, $aParams)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $iPerPage = (int)$aParams['per_page'];
+
+        $aParamsCopy = $aParams;
+        $aParamsCopy['browse'] = 'list_from';
+        $aParamsCopy['from'] = $iId;
+        $aParamsCopy['start'] = 0;
+
+        $aIds = array();
+        while(count($aIds) < $iPerPage) {
+            $aEvents = $this->_oDb->getEvents($aParamsCopy);
+            if(empty($aEvents))
+                break;
+
+            foreach($aEvents as $aEvent) {
+                if($this->getPost($aEvent, $aParamsCopy) == '')
+                    continue;
+
+                $aIds[] = $aEvent[$CNF['FIELD_ID']];
+                if(count($aIds) == $iPerPage)
+                    break 2;
+            }
+
+            $aParamsCopy['start'] += $iPerPage;
+        }
+
+        return $aIds;
+    }
+
+    protected function _getCachedEvents($iProfileId, &$aParams)
+    {
+        return $this->_oDb->getCache(array(
+            'browse' => $aParams['browse'], 
+            'type' => $aParams['type'], 
+            'context_id' => $aParams['owner_id'], 
+            'profile_id' => $iProfileId, 
+            'start' => $aParams['start'], 
+            'per_page' => $aParams['per_page']
+        ));
+    }
+
+    protected function _getPosts($aParams)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        if(!$this->_oConfig->isCacheList() || $this->_oConfig->isCacheListException($aParams['type']))
+            return $this->_oDb->getEvents($aParams);
+
+        $iPerPage = (int)$aParams['per_page'];
+        $iProfileId = (int)bx_get_logged_profile_id(); 
+
+        /*
+         * Get cached data.
+         */
+        $aCache = $this->_getCachedEvents($iProfileId, $aParams);
+        if(is_array($aCache) && !empty($aCache)) {
+
+            /*
+             * Check received data for relevance.
+             */
+            if(($iCache = count($aCache)) != $iPerPage) {
+                $aRecachedIds = $this->_cacheEventsFrom(reset($aCache)['event_id'], $aParams);
+                if(is_array($aRecachedIds) && count($aRecachedIds) > $iCache)
+                    $aCache = $this->_getCachedEvents($iProfileId, $aParams);
+            }
+
+            $bFound = false;
+            $bUpdated = false;
+
+            $aCachedItem = reset($aCache);
+            $aCachedIds = array_keys($aCache);
+
+            $aParamsCopy = $aParams;
+            while(true) {
+                $aEvents = $this->_oDb->getEvents($aParamsCopy);
+                if(empty($aEvents))
+                    break;
+
+                foreach($aEvents as $aEvent) {
+                    if($aEvent[$CNF['FIELD_ID']] == $aCachedItem['event_id']) {
+                        $bFound = true;
+                        break 2;
+                    }
+
+                    if(!in_array($aEvent[$CNF['FIELD_ID']], $aCachedIds) && $this->getPost($aEvent, $aParamsCopy) == '')
+                        continue;
+
+                    $bUpdated = true;
+                }
+
+                $aParamsCopy['start'] += $iPerPage;
+            }
+
+            /**
+             * If cached event wasn't found in real events list, 
+             * then clear cache and start the process from the beginning.
+             */
+            if(!$bFound) {
+                $this->_oModule->_oDb->deleteCache(array('type' => $aParams['type'], 'profile_id' => $iProfileId));
+
+                return $this->_getPosts($aParams);
+            }
+
+            if($bUpdated)
+                $aCachedIds = array_keys($this->_getCachedEvents($iProfileId, $aParams));
+
+            return $this->_oDb->getEvents(array('browse' => 'ids', 'type' => $aParams['type'], 'ids' => $aCachedIds));
+        }
+
+        /*
+         * Cache data.
+         */
+        $aIds = $this->_cacheEvents($aParams);
+        return $this->_oDb->getEvents(array('browse' => 'ids', 'type' => $aParams['type'], 'ids' => $aIds));
+    }
+
+    protected function _getPost($sType, $aEvent, $aBrowseParams = array())
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $oModule = $this->getModule();
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+        $sJsObject = $this->_oConfig->getJsObjectView($aBrowseParams);
+
+        $bViewItem = isset($aBrowseParams['view']) && $aBrowseParams['view'] == BX_TIMELINE_VIEW_ITEM;
+        $bViewOutline = isset($aBrowseParams['view']) && $aBrowseParams['view'] == BX_TIMELINE_VIEW_OUTLINE;
+
+        list($sAuthorName, $sAuthorUrl, $sAuthorIcon, $sAuthorUnit, $sAuthorUnitShort, $sAuthorBadges) = $oModule->getUserInfoWithBadges($aEvent['object_owner_id']);
+        $bAuthorIcon = !empty($sAuthorIcon);
+
+        if(($bViewItem || $this->_oConfig->isCountAllViews()) && !empty($aEvent['views']) && is_array($aEvent['views']) && isset($aEvent['views']['system']))
+            $oModule->getViewObject($aEvent['views']['system'], $aEvent['views']['object_id'])->doView();
+
+        $aTmplVarsNote = $this->_getTmplVarsNote($aEvent);
+        $aTmplVarsMenuItemCounters = $this->_getTmplVarsMenuItemCounters($aEvent, $aBrowseParams);
+        $aTmplVarsMenuItemActions = $this->_getTmplVarsMenuItemActions($aEvent, $aBrowseParams);
+        $aTmplVarsMenuItemMeta = $this->_getTmplVarsMenuItemMeta($aEvent, $aBrowseParams);
+
+        $aTmplVarsOwnerActions = $this->_getTmplVarsOwnerActions($aEvent, $aBrowseParams);
+        $bTmplVarsOwnerActions = !empty($aTmplVarsOwnerActions); 
+
+        $aTmplVarsTimelineOwner = $this->_getTmplVarsTimelineOwner($aEvent);
+
+        $bPinned = (int)$aEvent['pinned'] > 0;
+        $bSticked = (int)$aEvent['sticked'] > 0;
+        $bPromoted = (int)$aEvent['promoted'] > 0;
+
+        $sClass = $aEvent['type'] . ' ' . (!empty($aEvent['action']) ? $aEvent['action'] . ' ' : '') . $sStylePrefix . '-view-sizer';
+        if($bViewOutline) {
+            $sClass = $sStylePrefix . '-grid-item-sizer';
+            if($bPinned || $bSticked || $bPromoted) {
+                $sClass .= ' ' . $sStylePrefix . '-gis';
+
+            if($bPinned)
+                $sClass .= '-pnd';
+            if($bSticked)
+                $sClass .= '-psd';
+            if($bPromoted)
+                $sClass .= '-pmd';
+            }
+        }
+        if(!empty($aBrowseParams['blink']) && in_array($aEvent['id'], $aBrowseParams['blink']))
+            $sClass .= ' ' . $sStylePrefix . '-blink';
+        if($bPinned)
+            $sClass .= ' ' . $sStylePrefix . '-pinned';
+        if($bSticked)
+            $sClass .= ' ' . $sStylePrefix . '-sticked';
+        if($bPromoted)
+            $sClass .= ' ' . $sStylePrefix . '-promoted';
+
+        $sClassOwner = $bTmplVarsOwnerActions ? $sStylePrefix . '-io-with-actions' : '';
+
+        $oMetatags = BxDolMetatags::getObjectInstance($this->_oConfig->getObject('metatags'));
+        $sLocation = $oMetatags->locationsString($aEvent['id']);
+ 
+        $sFields = '';
+        if(!$bViewItem) {
+            $oForm = BxDolForm::getObjectInstance($this->_oConfig->getObject('form_post'), $this->_oConfig->getObject('form_display_post_view'), $this, $aEvent['id']);
+            $oForm->initChecker($aEvent);
+
+            if(!empty($oForm->aInputs) && is_array($oForm->aInputs))
+                $sFields = $oForm->getCode();
+        }
+
+        $aTmplVars = array (
+            'style_prefix' => $sStylePrefix,
+            'js_object' => $sJsObject,
+            'html_id' => $this->_oConfig->getHtmlIdView('item', $aBrowseParams, array('whole' => false)) . $aEvent['id'],
+            'class' => $sClass,
+            'class_owner' => $sClassOwner,
+            'class_content' => $bViewItem ? 'bx-def-color-bg-block' : 'bx-def-color-bg-box',
+            'id' => $aEvent['id'],
+            'bx_if:show_note' => array(
+                'condition' => !empty($aTmplVarsNote),
+                'content' => $aTmplVarsNote
+            ),
+            'bx_if:show_owner_icon' => array(
+                'condition' => $bAuthorIcon,
+                'content' => array(
+                    'owner_icon' => $sAuthorIcon
+                )
+            ),
+            'bx_if:show_owner_icon_empty' => array(
+                'condition' => !$bAuthorIcon,
+                'content' => array()
+            ),
+            'bx_if:show_owner_actions' => array(
+                'condition' => $bTmplVarsOwnerActions,
+                'content' => $aTmplVarsOwnerActions
+            ),
+            'item_icon' => !empty($aEvent['icon']) ? $aEvent['icon'] : $CNF['ICON'],
+            'item_owner_url' => $sAuthorUrl,
+            'item_owner_title' => bx_html_attribute($sAuthorName),
+            'item_owner_name' => $sAuthorName .' '. $sAuthorBadges,
+            'item_owner_unit' => $sAuthorUnitShort,
+            'item_owner_action' => _t($aEvent['sample_action'], _t($aEvent['sample'])),
+            'bx_if:show_timeline_owner' => array(
+                'condition' => !empty($aTmplVarsTimelineOwner),
+                'content' => $aTmplVarsTimelineOwner
+            ),
+            'item_view_url' => $this->_oConfig->getItemViewUrl($aEvent),
+            'item_date' => bx_time_js($aEvent['date']),
+            'bx_if:show_pinned' => array(
+            	'condition' => $bPinned,
+            	'content' => array(
+                    'style_prefix' => $sStylePrefix,
+            	)
+            ),
+            'bx_if:show_sticked' => array(
+            	'condition' => $bSticked,
+            	'content' => array(
+                    'style_prefix' => $sStylePrefix,
+            	)
+            ),
+            'bx_if:show_hot' => array(
+            	'condition' => isset($aBrowseParams['hot']) && is_array($aBrowseParams['hot']) && in_array($aEvent['id'], $aBrowseParams['hot']),
+            	'content' => array(
+                    'style_prefix' => $sStylePrefix,
+            	)
+            ),
+            'content' => is_string($aEvent['content']) ? $aEvent['content'] : $this->_getContent($sType, $aEvent, $aBrowseParams),
+            'bx_if:show_location' => array(
+            	'condition' => !empty($sLocation),
+            	'content' => array(
+                    'style_prefix' => $sStylePrefix,
+                    'location' => $sLocation
+            	)
+            ),
+            'bx_if:show_fields' => array(
+                'condition' => !empty($sFields),
+                'content' => array(
+                    'style_prefix' => $sStylePrefix,
+                    'fields' => $sFields
+            	)
+            ),
+            'bx_if:show_menu_item_counters' => array(
+                'condition' => !empty($aTmplVarsMenuItemCounters),
+                'content' => $aTmplVarsMenuItemCounters
+            ),
+            'bx_if:show_menu_item_actions' => array(
+                'condition' => !empty($aTmplVarsMenuItemActions),
+                'content' => $aTmplVarsMenuItemActions
+            ),
+            'bx_if:show_menu_item_meta' => array(
+                'condition' => !empty($aTmplVarsMenuItemMeta),
+                'content' => $aTmplVarsMenuItemMeta
+            ),
+            'comments' => '',
+        );
+
+        $iPreloadComments = $this->_oConfig->getPreloadComments();
+        if($iPreloadComments > 0 && $oModule->isAllowedComment($aEvent) && in_array($aBrowseParams['view'], array(BX_TIMELINE_VIEW_TIMELINE, BX_TIMELINE_VIEW_OUTLINE)))
+            $aTmplVars['comments'] = $this->_getComments($aEvent['comments'], array_merge($aBrowseParams, array(
+                'cmts_preload_number' => $iPreloadComments,
+                'cmts_min_post_form' => false
+            )));
+
+        $sVariable = '_sTmplContentItem' . bx_gen_method_name($aBrowseParams['view']);
+        if(empty(self::$$sVariable))
+            self::$$sVariable = $this->getHtml('item_' . $aBrowseParams['view'] . '.html');
+
+        $sTmplCode = self::$$sVariable;
+        bx_alert($this->_oConfig->getName(), 'get_post', 0, 0, array(
+            'type' => $sType,
+            'event' => $aEvent,
+            'browse_params' => $aBrowseParams,
+            'tmpl_code' => &$sTmplCode,
+            'tmpl_vars' => &$aTmplVars
+        ));
+
+        return $this->parseHtmlByContent($sTmplCode, $aTmplVars);
+    }
+
+    protected function _getContent($sType, $aEvent, $aBrowseParams = array())
+    {
+        $sMethod = '_getTmplVarsContent' . ucfirst($sType);
+        if(!method_exists($this, $sMethod))
+            return '';
+
+        $sVariable = '_sTmplContentType' . bx_gen_method_name($sType);
+        if(empty(self::$$sVariable))
+            self::$$sVariable = $this->getHtml('type_' . $sType . '.html');
+
+		return $this->parseHtmlByContent(self::$$sVariable, $this->$sMethod($aEvent, $aBrowseParams));
+    }
+
+    protected function _getComments($aComments, $aBrowseParams = array())
+    {
+        $mixedComments = $this->getModule()->getCommentsData($aComments);
+        if($mixedComments === false)
+            return '';
+
+        list($sSystem, $iObjectId, $iCount) = $mixedComments;
+        return $this->getComments($sSystem, $iObjectId, $aBrowseParams);
+    }
+
+    protected function _getShowMore($aParams)
+    {
+        return $this->parseHtmlByName('show_more.html', array(
+            'style_prefix' => $this->_oConfig->getPrefix('style'),
+            'js_object' => $this->_oConfig->getJsObjectView($aParams),
+        ));
+    }
+
+    protected function _getImagePopup($aParams)
+    {
+        $sViewImagePopupId = $this->_oConfig->getHtmlIdView('photo_popup', $aParams);
+        $sViewImagePopupContent = $this->parseHtmlByName('popup_image.html', array(
+            'image_url' => ''
+    	));
+
+    	return BxTemplFunctions::getInstance()->transBox($sViewImagePopupId, $sViewImagePopupContent, true);
+    }
+
+    protected function _getRepostJsClick($iOwnerId, $sType, $sAction, $iObjectId)
+    {
+        $sJsObject = $this->_oConfig->getJsObject('repost');
+        $sFormat = "%s.repostItem(this, %d, '%s', '%s', %d);";
+
+        $iOwnerId = !empty($iOwnerId) ? (int)$iOwnerId : $this->getModule()->getUserId(); //--- in whose timeline the content will be reposted
+        return sprintf($sFormat, $sJsObject, $iOwnerId, $sType, $sAction, (int)$iObjectId);
+    }
+
+    protected function _getJumpToList($aParams)
+    {
+        $iYearSel = (int)$aParams['timeline'];
+        $iYearMin = $this->_oDb->getMaxDuration($aParams);      
+        if(empty($iYearMin))
+            return '';
+
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+        $sJsObject = $this->_oConfig->getJsObjectView($aParams);
+
+        $aYears = array();
+        $iYearMax = date('Y', time()) - 1;
+        for($i = $iYearMax; $i >= $iYearMin; $i--) {
+            $bCurrent = $i == $iYearSel;
+            $aYears[] = array(
+                'style_prefix' => $sStylePrefix,
+                'bx_if:show_link' => array(
+                    'condition' => !$bCurrent,
+                    'content' => array(
+                        'title' => _t('_bx_timeline_txt_jump_to_n_year', $i),
+                        'onclick' => 'javascript:' . $sJsObject . '.changeTimeline(this, \'' . $i . '-12-31\')',
+                        'content' => $i
+                    )
+                ),
+                'bx_if:show_text' => array(
+                    'condition' => $bCurrent,
+                    'content' => array(
+                        'content' => $i
+                    )
+                ),
+            );
+        }
+
+        return $this->parseHtmlByName('jump_to.html', array(
+            'bx_if:show_list' => array(
+                'condition' => true,
+                'content' => array(
+                    'style_prefix' => $sStylePrefix,
+                    'bx_repeat:links' => $aYears,
+                )
+            ),
+            'bx_if:show_calendar' => array(
+                'condition' => false,
+                'content' => array()
+            )
+        ));
+    }
+
+    protected function _getJumpToCaledar($aParams)
+    {
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+        $sJsObject = $this->_oConfig->getJsObjectView($aParams);
+                
+        return $this->parseHtmlByName('jump_to.html', array(
+            'bx_if:show_list' => array(
+                'condition' => false,
+                'content' => array()
+            ),
+            'bx_if:show_calendar' => array(
+                'condition' => true,
+                'content' => array(
+                    'style_prefix' => $sStylePrefix,
+                    'onclick' => 'javascript:' . $sJsObject . '.showCalendar(this)',
+                )
+            )
+        ));
+    }
+
+    protected function _getTmplVarsMenuItemActions(&$aEvent, $aBrowseParams = array())
+    {
+        $oMenu = BxDolMenu::getObjectInstance($this->_oConfig->getObject('menu_item_actions_all'));
+        if(!$oMenu)
+            $oMenu = BxDolMenu::getObjectInstance($this->_oConfig->getObject('menu_item_actions'));
+        $oMenu->setEvent($aEvent, $aBrowseParams);
+        $oMenu->setDynamicMode(isset($aBrowseParams['dynamic_mode']) && $aBrowseParams['dynamic_mode'] === true);
+
+        $sMenu = $oMenu->getCode();
+        if(empty($sMenu))
+            return array();
+
+        return array(
+            'style_prefix' => $this->_oConfig->getPrefix('style'),
+            'js_object' => $this->_oConfig->getJsObjectView($aBrowseParams),
+            'menu_item_actions' => $sMenu
+        );
+    }
+
+    protected function _getTmplVarsMenuItemCounters(&$aEvent, $aBrowseParams = array())
+    {
+        $oMenu = BxDolMenu::getObjectInstance($this->_oConfig->getObject('menu_item_counters'));
+        $oMenu->setEvent($aEvent, $aBrowseParams);
+        $oMenu->setDynamicMode(isset($aBrowseParams['dynamic_mode']) && $aBrowseParams['dynamic_mode'] === true);
+
+        $sMenu = $oMenu->getCode();
+        if(empty($sMenu))
+            return array();
+
+        return array(
+            'style_prefix' => $this->_oConfig->getPrefix('style'),
+            'js_object' => $this->_oConfig->getJsObjectView($aBrowseParams),
+            'menu_item_counters' => $sMenu
+        );
+    }
+
+    protected function _getTmplVarsMenuItemMeta(&$aEvent, $aBrowseParams = array())
+    {
+        $oMenu = BxDolMenu::getObjectInstance($this->_oConfig->getObject('menu_item_meta'));
+        if(!$oMenu)
+            return array();
+
+        $oMenu->setEvent($aEvent);
+
+        $sMenu = $oMenu->getCode();
+        if(empty($sMenu))
+            return array();
+
+        return array(
+            'style_prefix' => $this->_oConfig->getPrefix('style'),
+            'meta' => $sMenu
+        );
+    }
+
+    protected function _getTmplVarsTimelineOwner(&$aEvent)
+    {
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+        $iUser = bx_get_logged_profile_id();
+        $oModule = $this->getModule();
+
+        $sConnection = $this->_oConfig->getObject('conn_subscriptions');
+        $oConnection = BxDolConnection::getObjectInstance($sConnection);
+        $sConnectionTitle = _t('_sys_menu_item_title_sm_subscribe');
+
+        $sKeyOwnerId = isset($aEvent['owner_id_grouped']) ? 'owner_id_grouped' : 'owner_id';
+        $aOwnerIds = is_array($aEvent[$sKeyOwnerId]) ? $aEvent[$sKeyOwnerId] : array($aEvent[$sKeyOwnerId]);
+
+        $aTmplVarsOwners = array();
+        foreach($aOwnerIds as $iOwnerId) {
+            $iOwnerId = (int)$iOwnerId;
+            $iObjectOwner = (int)$aEvent['object_owner_id'];
+            if($iObjectOwner < 0 && abs($iObjectOwner) == $iUser)
+                $iObjectOwner *= -1;
+
+            if($iOwnerId == 0 || $iOwnerId == $iObjectOwner)
+                continue;
+
+            list($sToName, $sToUrl, $sToThumb, $sToUnit, $sToUnitWoInfo) = $oModule->getUserInfo($iOwnerId);
+            $sToType = $oModule->getObjectUser($iOwnerId)->getModule();
+
+            $aTmplVarsActions = array();
+            if(!empty($iUser) && $iUser != $iOwnerId && $oConnection->checkAllowedConnect($iUser, $iOwnerId) === CHECK_ACTION_RESULT_ALLOWED) {
+                $aTmplVarsActions[] = array(
+                    'href' => "javascript:void(0)",
+                    'onclick' => "bx_conn_action(this, '" . $sConnection . "', 'add', '" . $iOwnerId . "')",
+                    'title' => bx_html_attribute($sConnectionTitle),
+                    'content' => $sConnectionTitle,
+                    'icon' => 'check'
+                );
+            }
+
+            $aTmplVarsOwners[] =  array(
+                'style_prefix' => $sStylePrefix,
+                'owner_type' => _t('_' . $sToType),
+                'owner_url' => $sToUrl,
+                'owner_username' => $sToName,
+                'owner_thumb' => $sToThumb,
+                'owner_unit' => $sToUnit,
+                'owner_unit_wo_info' => $sToUnitWoInfo,
+                'bx_if:show_timeline_owner_actions' => array(
+                    'condition' => !empty($aTmplVarsActions),
+                    'content' => array(
+                        'style_prefix' => $sStylePrefix,
+                        'bx_repeat:timeline_owner_actions' => $aTmplVarsActions
+                    )
+                )
+            );
+        }
+
+        if(empty($aTmplVarsOwners))
+            return array();
+
+        return array(
+            'style_prefix' => $sStylePrefix,
+            'bx_repeat:owners' => $aTmplVarsOwners
+        );
+    }
+
+    protected function _getTmplVarsContentPost(&$aEvent, $aBrowseParams = array())
+    {
+    	$aContent = &$aEvent['content'];
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+
+        $bViewItem = isset($aBrowseParams['view']) && $aBrowseParams['view'] == BX_TIMELINE_VIEW_ITEM;
+        $bViewSearch = isset($aBrowseParams['view']) && $aBrowseParams['view'] == BX_TIMELINE_VIEW_SEARCH;
+
+        //--- Process Raw ---//
+        $sRaw = isset($aContent['raw']) ? $aContent['raw'] : '';
+
+        //--- Process Text ---//
+        $sUrl = isset($aContent['url']) ? bx_html_attribute($aContent['url']) : '';
+        $sTitle = '';
+        if(isset($aContent['title']))
+            $sTitle = bx_process_output($aContent['title']);
+
+        if(!empty($sUrl) && !empty($sTitle))
+            $sTitle = $this->parseLink($sUrl, $sTitle, array(
+            	'class' => $sStylePrefix . '-title',
+                'title' => $sTitle
+            ));
+
+        $sText = isset($aContent['text']) ? $aContent['text'] : '';
+        $sText = $this->_prepareTextForOutput($sText, $aEvent['id']);
+
+        //--- Process Links ---//
+        $bAddNofollow = $this->_oDb->getParam('sys_add_nofollow') == 'on';
+
+        $aTmplVarsLinks = array();
+        if(!empty($aContent['links']))
+            foreach($aContent['links'] as $aLink) {
+                $sLink = '';
+
+                $oEmbed = BxDolEmbed::getObjectInstance();
+                if ($oEmbed) {
+                    $sLink = $this->parseHtmlByName('link_embed_provider.html', array(
+                        'style_prefix' => $sStylePrefix,
+                        'embed' => $oEmbed->getLinkHTML($aLink['url'], $aLink['title']),
+                    ));
+                }
+                else {
+                    $aLinkAttrs = array(
+                    	'title' => $aLink['title']
+                    );
+                    if(!$this->_oConfig->isEqualUrls(BX_DOL_URL_ROOT, $aLink['url'])) {
+                        $aLinkAttrs['target'] = '_blank';
+    
+                        if($bAddNofollow)
+                    	    $aLinkAttrs['rel'] = 'nofollow';
+                    }
+
+                    $sLinkAttrs = '';
+                    foreach($aLinkAttrs as $sKey => $sValue)
+                        $sLinkAttrs .= ' ' . $sKey . '="' . bx_html_attribute($sValue) . '"';
+
+                    $sLink = $this->parseHtmlByName('link_embed_common.html', array(
+                        'bx_if:show_thumbnail' => array(
+                            'condition' => !empty($aLink['thumbnail']),
+                            'content' => array(
+                                'style_prefix' => $sStylePrefix,
+                                'thumbnail' => $aLink['thumbnail'],
+                                'link' => !empty($aLink['url']) ? $aLink['url'] : 'javascript:void(0)',
+                                'attrs' => $sLinkAttrs
+                            )
+                        ),
+                        'link' => !empty($aLink['url']) ? $aLink['url'] : 'javascript:void(0)',
+                        'attrs' => $sLinkAttrs,
+                        'content' => $aLink['title'],
+                        'bx_if:show_text' => array(
+                            'condition' => !empty($aLink['text']),
+                            'content' => array(
+                                'style_prefix' => $sStylePrefix,
+                                'text' => $aLink['text']
+                            )
+                        )
+                    ));
+                }
+
+                $aTmplVarsLinks[] = array(
+                    'style_prefix' => $sStylePrefix,
+                    'link' => $sLink
+                );
+            }
+
+        /*
+         * View Item page and Snippet in Search Results should use Gallery layout.
+         */
+        $sAttachmentsLayout = $this->_oConfig->getAttachmentsLayout();
+        if($bViewItem || $bViewSearch)
+            $sAttachmentsLayout = BX_TIMELINE_ML_GALLERY;
+
+        $iAttachmentsTotal = 0;
+        $aTmplVarsImages = $aTmplVarsVideos = $aTmplVarsAttachments = array();
+
+        //--- Process Photos ---//
+        $bImages = !empty($aContent['images']) && is_array($aContent['images']);
+        if($bImages) {
+            $aImages = $this->_getTmplVarsImages($aContent['images'], true, $aEvent, $aBrowseParams);
+            if(!empty($aImages))
+                $aTmplVarsImages = array(
+                    'style_prefix' => $sStylePrefix,
+                    'display' => $aImages['display'],
+                    'bx_repeat:items' => $aImages['items']
+                );
+        }
+
+        $bImagesAttach = !empty($aContent['images_attach']) && is_array($aContent['images_attach']);
+        if($bImagesAttach) {
+            $aImagesAttach = $this->_getTmplVarsImages($aContent['images_attach'], array('layout' => $sAttachmentsLayout, 'first' => empty($aTmplVarsAttachments)), $aEvent, $aBrowseParams);
+            if(!empty($aImagesAttach)) {
+                $iAttachmentsTotal += $aImagesAttach['total'];
+                $aTmplVarsAttachments = array_merge($aTmplVarsAttachments, $aImagesAttach['items']);
+            }
+        }
+
+        //--- Add Meta Image when Item is viewed on a separate page ---//
+        if($bViewItem) {
+            $sMetaImageSrc = '';
+            if($bImages && !empty($aContent['images'][0]['src']))
+                $sMetaImageSrc = $aContent['images'][0]['src'];
+            else if($bImagesAttach && !empty($aContent['images_attach'][0]['src']))
+                $sMetaImageSrc = $aContent['images_attach'][0]['src'];
+
+            if(!empty($sMetaImageSrc))
+                BxDolTemplate::getInstance()->addPageMetaImage($sMetaImageSrc);
+        }
+
+    	//--- Process Videos ---//
+        $bVideos = !empty($aContent['videos']) && is_array($aContent['videos']);
+        if($bVideos) {
+            $aVideos = $this->_getTmplVarsVideos($aContent['videos'], true, $aEvent, $aBrowseParams);
+            if(!empty($aVideos))
+                $aTmplVarsVideos = array(
+                    'style_prefix' => $sStylePrefix,
+                    'display' => $aVideos['display'],
+                    'bx_repeat:items' => $aVideos['items']
+                );
+        }
+
+        $bVideosAttach = !empty($aContent['videos_attach']) && is_array($aContent['videos_attach']);
+        if($bVideosAttach) {
+            $aVideosAttach = $this->_getTmplVarsVideos($aContent['videos_attach'], array('layout' => $sAttachmentsLayout, 'first' => empty($aTmplVarsAttachments)), $aEvent, $aBrowseParams);
+            if(!empty($aVideosAttach)) {
+                $iAttachmentsTotal += $aVideosAttach['total'];
+                $aTmplVarsAttachments = array_merge($aTmplVarsAttachments, $aVideosAttach['items']);
+            }
+        }
+
+        //--- Process Files ---//
+        $bFiles = !empty($aContent['files']) && is_array($aContent['files']);
+        if($bFiles) {
+            $aFiles = $this->_getTmplVarsFiles($aContent['files'], $aEvent, $aBrowseParams);
+            if(!empty($aFiles))
+                $aTmplVarsFiles = array(
+                    'style_prefix' => $sStylePrefix,
+                    'display' => $aFiles['display'],
+                    'bx_repeat:items' => $aFiles['items']
+                );
+        }
+
+        $bFilesAttach = !empty($aContent['files_attach']) && is_array($aContent['files_attach']);
+        if($bFilesAttach) {
+            $aFilesAttach = $this->_getTmplVarsFiles($aContent['files_attach'], $aEvent, $aBrowseParams);
+            if(!empty($aFilesAttach)) {
+                $iAttachmentsTotal += $aFilesAttach['total'];
+                $aTmplVarsAttachments = array_merge($aTmplVarsAttachments, $aFilesAttach['items']);
+            }
+        }
+
+        /*
+         *  Process collected attachments in case of Showcase layout.
+         */
+        $iAttachmentsShow = 4;
+        $iAttachmentsCount = count($aTmplVarsAttachments);
+        if($sAttachmentsLayout == BX_TIMELINE_ML_SHOWCASE && $iAttachmentsCount > 0) {
+            $aTmplVarsAttachments[0]['class'] .= ' ' . $sStylePrefix . '-ia-first';
+
+            if($iAttachmentsCount > $iAttachmentsShow)
+                $aTmplVarsAttachments = array_slice($aTmplVarsAttachments, 0, $iAttachmentsShow);
+
+            if($iAttachmentsTotal > $iAttachmentsShow)
+                $aTmplVarsAttachments[$iAttachmentsShow - 1]['item'] .= $this->parseHtmlByName('attach_more.html', array(
+                    'style_prefix' => $sStylePrefix,
+                    'more' => $iAttachmentsTotal - $iAttachmentsShow
+                ));
+        }
+
+        return array(
+            'style_prefix' => $sStylePrefix,
+            'bx_if:show_title' => array(
+                'condition' => !empty($sTitle),
+                'content' => array(
+                    'style_prefix' => $sStylePrefix,
+                    'title' => $sTitle,
+                )
+            ),
+            'bx_if:show_content' => array(
+                'condition' => !empty($sText),
+                'content' => array(
+                    'style_prefix' => $sStylePrefix,
+                    'item_content' => $sText
+                )
+            ),
+            'bx_if:show_raw' => array(
+                'condition' => !empty($sRaw),
+                'content' => array(
+                    'style_prefix' => $sStylePrefix,
+                    'item_content_raw' => $sRaw
+                )
+            ),
+            'bx_if:show_links' => array(
+                'condition' => !empty($aTmplVarsLinks),
+                'content' => array(
+                    'style_prefix' => $sStylePrefix,
+                    'bx_repeat:links' => $aTmplVarsLinks
+                )
+            ),
+            'bx_if:show_images' => array(
+                'condition' => !empty($aTmplVarsImages),
+                'content' => $aTmplVarsImages
+            ),
+            'bx_if:show_videos' => array(
+                'condition' => !empty($aTmplVarsVideos),
+                'content' => $aTmplVarsVideos
+            ),
+            'bx_if:show_attachments' => array(
+                'condition' => !empty($aTmplVarsAttachments),
+                'content' => array(
+                    'style_prefix' => $sStylePrefix,
+                    'display' => $sAttachmentsLayout,
+                    'count' => count($aTmplVarsAttachments),
+                    'bx_repeat:items' => $aTmplVarsAttachments
+                )
+            )
+        );
+    }
+
+    protected function _getTmplVarsContentRepost(&$aEvent, $aBrowseParams = array())
+    {
+    	$aContent = &$aEvent['content'];
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+
+        $sOwnerLink = $this->parseLink($aContent['owner_url'], $aContent['owner_name']);
+
+        $sSample = _t($aContent['sample']);
+        $sSampleLink = empty($aContent['url']) ? $sSample : $this->parseLink($aContent['url'], $sSample);
+
+        $sTitle = _t('_bx_timeline_txt_reposted', $sOwnerLink, $sSampleLink);
+        $sText = $this->_getContent($aContent['parse_type'], $aEvent, $aBrowseParams);
+
+        return array(
+            'bx_if:show_title' => array(
+                'condition' => !empty($sTitle),
+                'content' => array(
+                    'style_prefix' => $sStylePrefix,
+                    'title' => $sTitle,
+                )
+            ),
+            'bx_if:show_content' => array(
+                'condition' => !empty($sText),
+                'content' => array(
+                    'style_prefix' => $sStylePrefix,
+                    'content' => $sText,
+                )
+            )
+        );
+    }
+
+    protected function _getTmplVarsNote(&$aEvent)
+    {
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+
+        $iUser = bx_get_logged_profile_id();
+        $iOwner = $this->_oConfig->isSystem($aEvent['type'], $aEvent['action']) ? $aEvent['owner_id'] : $aEvent['object_id'];
+
+        $aTmplVars = array();
+        if(!empty($iOwner) && !is_array($iOwner) && !empty($aEvent['promoted'])) {
+            $sConnection = $this->_oConfig->getObject('conn_subscriptions');
+            $oConnection = BxDolConnection::getObjectInstance($sConnection);
+            if(!$oConnection->isConnected($iUser, $iOwner))
+                $aTmplVars[] = array(
+                    'style_prefix' => $sStylePrefix,
+                    'class' => '',
+                    'bx_if:show_note_color' => array(
+                        'condition' => false,
+                        'content' => array(
+                            'item_note_color' => 'red1',
+                        )
+                    ),
+                    'item_note' => _t('_bx_timeline_txt_promoted')
+                );
+        }
+
+        //--- Awaiting status related notes.
+        if($aEvent['status'] == BX_TIMELINE_STATUS_AWAITING) {
+            $sNote = '';
+            if((int)$aEvent['published'] > (int)$aEvent['date'])
+                $sNote = _t('_bx_timeline_txt_note_scheduled_awaiting', bx_time_js($aEvent['published'], BX_FORMAT_DATE, true));
+            else
+                $sNote = _t('_bx_timeline_txt_note_processing_awaiting');
+
+            $aTmplVars[] = array(
+                'style_prefix' => $sStylePrefix,
+                'bx_if:show_note_color' => array(
+                    'condition' => true,
+                    'content' => array(
+                        'item_note_color' => 'red3'
+                    )
+                ),
+                'item_note' => $sNote
+            );
+        }
+
+        //--- Failed status related notes.
+        if($aEvent['status'] == BX_TIMELINE_STATUS_FAILED)
+            $aTmplVars[] = array(
+                'style_prefix' => $sStylePrefix,
+                'bx_if:show_note_color' => array(
+                    'condition' => true,
+                    'content' => array(
+                        'item_note_color' => 'red2'
+                    )
+                ),
+                'item_note' => _t('_bx_timeline_txt_note_processing_failed')
+            );
+
+        return empty($aTmplVars) ? array() : array(
+            'style_prefix' => $sStylePrefix,
+            'bx_repeat:notes' => $aTmplVars
+        );
+    }
+
+    protected function _getTmplVarsOwnerActions(&$aEvent, $aBrowseParams = array())
+    {
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+
+        $iUser = bx_get_logged_profile_id();
+        $iOwner = $this->_oConfig->isSystem($aEvent['type'], $aEvent['action']) ? $aEvent['object_owner_id'] : $aEvent['object_id'];
+
+        $aTmplVarsActions = array();
+        if(!empty($iUser) && !empty($iOwner) && $iUser != $iOwner) {
+            $sConnection = $this->_oConfig->getObject('conn_subscriptions');
+            if(BxDolConnection::getObjectInstance($sConnection)->checkAllowedConnect($iUser, $iOwner) === CHECK_ACTION_RESULT_ALLOWED) {
+                $sJsObject = $this->_oConfig->getJsObjectView($aBrowseParams);
+
+                $sContent = _t('_sys_menu_item_title_sm_subscribe');
+                $aTmplVarsActions[] = array(
+                    'href' => "javascript:void(0)",
+                    'onclick' => "bx_conn_action(this, '" . $sConnection . "', 'add', '" . $iOwner . "', false, function(oData, eElement) {" . $sJsObject . ".onConnect(eElement, oData);})",
+                    'title' => bx_html_attribute($sContent),
+                    'content' => $sContent,
+                    'icon' => 'check'
+                );
+            }
+        }
+
+        return array(
+            'style_prefix' => $sStylePrefix,
+            'bx_repeat:owner_actions' => $aTmplVarsActions
+        );
+    }
+
+    protected function _getTmplVarsImages($aImages, $mixedLayout, &$aEvent, &$aBrowseParams)
+    {
+        if(empty($aImages) || !is_array($aImages))
+            return array();
+
+        $iTotal = 0; //--- Total count of images related to the event.
+        if(isset($aImages['total']) && isset($aImages['items'])) {
+            $iTotal = (int)$aImages['total'];
+            $aImages = $aImages['items'];
+        }
+        else
+            $iTotal = count($aImages);
+
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+        $sJsObject = $this->_oConfig->getJsObjectView($aBrowseParams);
+
+        $bViewItem = isset($aBrowseParams['view']) && $aBrowseParams['view'] == BX_TIMELINE_VIEW_ITEM;
+
+        $sDisplay = '';
+        $aTmplVarsImages = array();
+
+        $sImageSrcKey = $sImageSrcKeyBig = '';
+        $sImageSrcKeyDefault = 'src';
+        if(count($aImages) == 1) {
+            $sDisplay = BX_TIMELINE_ML_SINGLE;
+            $sImageSrcKey = $bViewItem ? 'src_orig' : 'src_medium';
+        }
+        else if(is_array($mixedLayout) && !empty($mixedLayout['layout'])) {
+            $sDisplay = $mixedLayout['layout'];
+            $sImageSrcKey = 'src';
+            $sImageSrcKeyBig = 'src_orig';
+        }
+        else {
+            $sDisplay = BX_TIMELINE_ML_GALLERY;
+            $sImageSrcKey = 'src';
+            $sImageSrcKeyBig = 'src_orig';
+        }
+
+        $bAttachFirst = false;
+        if($sDisplay == BX_TIMELINE_ML_SHOWCASE)
+            $bAttachFirst = isset($mixedLayout['first']) && $mixedLayout['first'] === true;
+
+        $aImageFirst = reset($aImages);
+        $iImageFirst = isset($aImageFirst['id']) ? (int)$aImageFirst['id'] : 0;
+
+        foreach($aImages as $aImage) {
+            $sImageSrcKeyCur = $sImageSrcKey;
+            if($bAttachFirst && isset($aImage['id']) && (int)$aImage['id'] == $iImageFirst)
+                $sImageSrcKeyCur = $sImageSrcKeyBig;
+
+            $sImageSrc = !empty($aImage[$sImageSrcKeyCur]) ? $aImage[$sImageSrcKeyCur] : $aImage[$sImageSrcKeyDefault];
+            if(empty($sImageSrc))
+                continue;
+
+            $sImage = $this->parseImage($sImageSrc, array(
+                'class' => $sStylePrefix . '-item-image'
+            ));
+
+            $aAttrs = array();
+            if(isset($aImage['onclick']))
+                $aAttrs['onclick'] = $aImage['onclick'];
+            else if(!$bViewItem && !empty($aImage['src_orig']))
+                $aAttrs['onclick'] = 'return ' . $sJsObject . '.showItem(this, \'' . $aEvent['id'] . '\', \'photo\', ' . json_encode(array('src' => base64_encode($aImage['src_orig']))) . ')'; 
+
+            $sImage = $this->parseLink(isset($aImage['url']) ? $aImage['url'] : 'javascript:void(0)', $sImage, $aAttrs);
+
+            $aTmplVarsImages[] = array(
+                'style_prefix' => $sStylePrefix,
+                'class' => '',
+                'item' => $sImage
+            );
+        }
+        
+        return array(
+            'display' => $sDisplay,
+            'total' => $iTotal,
+            'items' => $aTmplVarsImages
+        );
+    }
+
+    protected function _getTmplVarsVideos($aVideos, $mixedLayout, &$aEvent, &$aBrowseParams)
+    {
+        if(empty($aVideos) || !is_array($aVideos))
+            return array();
+
+        $iTotal = 0; //--- Total count of videos related to the event.
+        if(isset($aVideos['total']) && isset($aVideos['items'])) {
+            $iTotal = (int)$aVideos['total'];
+            $aVideos = $aVideos['items'];
+        }
+        else
+            $iTotal = count($aVideos);
+
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+        $aTmplVarsVideos = array();
+
+        /*
+         * For now Main Section may have only one video which can use 'autoplay' feature.
+         */
+        $bMain = $mixedLayout === true;
+        if($bMain) {
+            $sDisplay = BX_TIMELINE_ML_SINGLE;
+            if(count($aVideos) > 1)
+                $aVideos = array_slice($aVideos, 0, 1);
+        }
+        else
+            $sDisplay = is_array($mixedLayout) && !empty($mixedLayout['layout']) ? $mixedLayout['layout'] : BX_TIMELINE_AML_DEFAULT;
+
+        /*
+         * Main Section: Autoplay feature is only available here.
+         */
+        $sVap = $sVapId = $sVapSrc = $sVapTmpl = '';
+        if($bMain) {
+            $sVap = $this->_oConfig->getVideosAutoplay();
+            if($sVap != BX_TIMELINE_VAP_OFF) {
+                $sVapId = $this->_oConfig->getHtmlIds('view', 'video_iframe') . $aEvent['id'] . '-';
+                $sVapSrc = BX_DOL_URL_ROOT . $this->_oConfig->getBaseUri() . 'video/' . $aEvent['id'] . '/';
+                $sVapTmpl = $this->getHtml('video_iframe.html'); 
+            }
+        }
+
+        /*
+         * Attachments Section.
+         */
+        $sAttachTmpl = '';
+        $bAttachFirst = false;
+        if($sDisplay == BX_TIMELINE_ML_SHOWCASE) {
+            $sAttachTmpl = $this->getHtml('attach_video_preview.html');
+            $bAttachFirst = isset($mixedLayout['first']) && $mixedLayout['first'] === true;
+        }
+
+        $iVideoFirst = reset($aVideos)['id'];
+        foreach($aVideos as $aVideo) {
+            $iVideo = (int)$aVideo['id'];
+
+            if($bMain && $sVap != BX_TIMELINE_VAP_OFF)
+                $aTmplVarsVideos[] = array(
+                    'style_prefix' => $sStylePrefix,
+                    'class' => '',
+                    'item' => $this->parseHtmlByContent($sVapTmpl, array(
+                        'style_prefix' => $sStylePrefix,
+                        'html_id' => $sVapId . $iVideo,
+                        'src' => $sVapSrc . $iVideo . '/'
+                    )) 
+                );
+            else {
+                if($bMain || $sDisplay == BX_TIMELINE_ML_GALLERY || ($bAttachFirst && $iVideo == $iVideoFirst))
+                    $aTmplVarsVideos[] = array(
+                        'style_prefix' => $sStylePrefix,
+                        'class' => '',
+                        'item' => BxTemplFunctions::getInstance()->videoPlayer($aVideo['src_poster'], $aVideo['src_mp4'], $aVideo['src_mp4_hd'], array(
+                            'preload' => 'auto'
+                        ), '', $aBrowseParams['dynamic_mode'])
+                    );
+                else {
+                    $bUrl = !empty($aVideo['url']);
+                    $sUrl = $bUrl ? $aVideo['url'] : '';
+                    
+                    $bDuration = !empty($aVideo['duration']);
+                    $sDuration = _t_format_duration($bDuration ? $aVideo['duration'] : 0);
+
+                    $aTmplVarsVideos[] = array(
+                        'style_prefix' => $sStylePrefix,
+                        'class' => '',
+                        'item' => $this->parseHtmlByContent($sAttachTmpl, array(
+                            'style_prefix' => $sStylePrefix,
+                            'bx_if:show_link' => array(
+                                'condition' => $bUrl,
+                                'content' => array(
+                                    'style_prefix' => $sStylePrefix,
+                                    'url' => $sUrl,
+                                    'src' => $aVideo['src_poster'],
+                                )
+                            ),
+                            'bx_if:show_non_link' => array(
+                                'condition' => !$bUrl,
+                                'content' => array(
+                                    'style_prefix' => $sStylePrefix,
+                                    'src' => $aVideo['src_poster'],
+                                )
+                            ),
+                            'bx_if:show_duration' => array(
+                                'condition' => $bDuration,
+                                'content' => array(
+                                    'style_prefix' => $sStylePrefix,
+                                    'duration' => $sDuration,
+                                )
+                            )
+                        ))
+                    );
+                }
+            }
+                
+        }
+
+        return array( 
+            'display' => $sDisplay,
+            'total' => $iTotal,
+            'items' => $aTmplVarsVideos
+        );
+    }
+
+    protected function _getTmplVarsFiles($aFiles, &$aEvent, &$aBrowseParams)
+    {
+        if(empty($aFiles) || !is_array($aFiles))
+            return array();
+
+        $iTotal = 0; //--- Total count of files related to the event.
+        if(isset($aFiles['total']) && isset($aFiles['items'])) {
+            $iTotal = (int)$aFiles['total'];
+            $aFiles = $aFiles['items'];
+        }
+        else
+            $iTotal = count($aFiles);
+
+        $sStylePrefix = $this->_oConfig->getPrefix('style');
+        $sJsObject = $this->_oConfig->getJsObjectView($aBrowseParams);
+
+        $bViewItem = isset($aBrowseParams['view']) && $aBrowseParams['view'] == BX_TIMELINE_VIEW_ITEM;
+
+        $sDisplay = '';
+        $aTmplVarsFiles = array();
+
+        $sFileSrcKey = '';
+        $sFileSrcKeyDefault = 'src';
+        if(count($aFiles) == 1) {
+            $sDisplay = 'single';
+            $sFileSrcKey = $bViewItem ? 'src_orig' : 'src_medium';
+        }
+        else {
+            $sDisplay = 'gallery';
+            $sFileSrcKey = 'src';
+        }
+
+        foreach($aFiles as $aFile) {
+            $sFileSrc = !empty($aFile[$sFileSrcKey]) ? $aFile[$sFileSrcKey] : $aFile[$sFileSrcKeyDefault];
+            if(empty($sFileSrc))
+                continue;
+
+            $sImage = $this->parseImage($sFileSrc, array(
+                'class' => $sStylePrefix . '-item-file'
+            ));
+
+            $aAttrs = array();
+            if(isset($aFile['onclick']))
+                $aAttrs['onclick'] = $aFile['onclick'];
+            else if(!$bViewItem && !empty($aFile['src_orig']))
+                $aAttrs['onclick'] = 'return ' . $sJsObject . '.showItem(this, \'' . $aEvent['id'] . '\', \'photo\', ' . json_encode(array('src' => base64_encode($aFile['src_orig']))) . ')'; 
+
+            $sImage = $this->parseLink(isset($aFile['url']) ? $aFile['url'] : 'javascript:void(0)', $sImage, $aAttrs);
+
+            $aTmplVarsFiles[] = array(
+                'style_prefix' => $sStylePrefix,
+                'class' => '',
+                'item' => $sImage
+            );
+        }
+
+        return array(
+            'display' => $sDisplay,
+            'total' => $iTotal,
+            'items' => $aTmplVarsFiles
+        );
+    }
+
+    protected function _getSystemData(&$aEvent, $aBrowseParams = array())
+    {
+        $mixedResult = $this->_oConfig->getSystemData($aEvent, $aBrowseParams);
+        if($mixedResult === false) {
+            $sMethod = 'display' . bx_gen_method_name($aEvent['type'] . '_' . $aEvent['action']);
+            if(method_exists($this, $sMethod))
+                $mixedResult = $this->$sMethod($aEvent);
+        }
+
+        if($mixedResult === false)
+            return '';
+
+        $this->_preparetDataActions($aEvent, $mixedResult);
+        return $mixedResult;
+    }
+
+    protected function _getCommonData(&$aEvent, $aBrowseParams = array())
+    {
+        $CNF = $this->_oConfig->CNF;
+
+        $oModule = $this->getModule();
+        $sJsObject = $this->_oConfig->getJsObjectView($aBrowseParams);
+        $sPrefix = $this->_oConfig->getPrefix('common_post');
+        $sType = str_replace($sPrefix, '', $aEvent['type']);
+
+        $oObjectOwner = BxDolProfile::getInstanceMagic($aEvent['object_id']);
+
+        $iOwnerId = $aEvent['owner_id'];
+        if(is_array($aEvent['owner_id']))
+            $iOwnerId = is_numeric($aEvent['object_privacy_view']) && (int)$aEvent['object_privacy_view'] < 0 ? abs((int)$aEvent['object_privacy_view']) : (int)array_shift($aEvent['owner_id']);
+
+        $aResult = array(
+            'owner_id' => $iOwnerId,
+            'object_owner_id' => $aEvent['object_id'],
+            'icon' => $CNF['ICON'],
+            'sample' => '_bx_timeline_txt_sample_with_article',
+            'sample_wo_article' => '_bx_timeline_txt_sample',
+            'sample_action' => '_bx_timeline_txt_added_sample',
+            'content_type' => $sType,
+            'content' => array(
+                'sample' => '_bx_timeline_txt_sample_with_article',
+                'sample_wo_article' => '_bx_timeline_txt_sample',
+                'sample_action' => '_bx_timeline_txt_added_sample',
+                'url' => $this->_oConfig->getItemViewUrl($aEvent)
+            ), //a string to display or array to parse default template before displaying.
+            'views' => '',
+            'votes' => '',
+            'reactions' => '',
+            'scores' => '',
+            'reports' => '',
+            'comments' => '',
+            'title' => $aEvent['title'], //may be empty.
+            'description' => bx_replace_markers($aEvent['description'], array(
+                'profile_name' => $oObjectOwner->getDisplayName()
+            )) //may be empty.
+        );
+
+        switch($sType) {
+            case BX_TIMELINE_PARSE_TYPE_POST:
+                if(!empty($aEvent['content']))
+                    $aResult['content'] = array_merge($aResult['content'], unserialize($aEvent['content']));
+
+                $aResult['content']['links'] = $oModule->getEventLinks($aEvent['id']);
+                $aResult['content']['images_attach'] = $oModule->getEventImages($aEvent['id']);
+                $aResult['content']['videos_attach'] = $oModule->getEventVideos($aEvent['id']);
+                break;
+
+            case BX_TIMELINE_PARSE_TYPE_REPOST:
+                if(empty($aEvent['content']))
+                    return array();
+
+                $aContent = unserialize($aEvent['content']);
+
+                if(!$this->_oConfig->isSystem($aContent['type'] , $aContent['action'])) {
+                    $aReposted = $this->_oDb->getEvents(array('browse' => 'id', 'value' => $aContent['object_id']));
+                    $aReposted = $this->_getCommonData($aReposted, $aBrowseParams);
+                } 
+                else {
+                    $aReposted = $this->_oDb->getEvents(array_merge(array('browse' => 'descriptor'), $aContent));
+                    $aReposted = $this->_getSystemData($aReposted, $aBrowseParams);
+                }
+
+                if(empty($aReposted) || !is_array($aReposted))
+                    return array();
+
+                $aResult['content'] = array_merge($aContent, $aReposted['content']);
+                $aResult['content']['parse_type'] = !empty($aReposted['content_type']) ? $aReposted['content_type'] : BX_TIMELINE_PARSE_TYPE_DEFAULT;
+                $aResult['content']['owner_id'] = $aReposted['object_owner_id'];
+                list($aResult['content']['owner_name'], $aResult['content']['owner_url']) = $oModule->getUserInfo($aReposted['object_owner_id']);
+
+                if(!empty($aReposted['sample']))
+                    $aResult['content']['sample'] = $aReposted['sample'];
+                if(!empty($aReposted['sample_wo_article']))
+                    $aResult['content']['sample'] = $aReposted['sample_wo_article'];
+
+                list($sUserName) = $oModule->getUserInfo($aEvent['object_id']);
+                $aResult['title'] = _t('_bx_timeline_txt_user_repost', $sUserName, _t($aResult['content']['sample']));
+                $aResult['description'] = _t('_bx_timeline_txt_user_reposted_user_sample', $sUserName, $aResult['content']['owner_name'], _t($aResult['content']['sample']));
+                break;
+        }
+
+        $this->_preparetDataActions($aEvent, $aResult);
+        return $aResult;
+    }
+
+    protected function _preparetDataActions(&$aEvent, &$aResult)
+    {
+        if(empty($aEvent) || !is_array($aEvent) || empty($aEvent['id']))
+            return;
+
+        $oModule = $this->getModule();
+
+        $sSystem = $this->_oConfig->getObject('view');
+        if(empty($aResult['views']) && $oModule->getViewObject($sSystem, $aEvent['id']) !== false)
+            $aResult['views'] = array(
+                'system' => $sSystem,
+                'object_id' => $aEvent['id'],
+                'count' => $aEvent['views']
+            );
+
+        $sSystem = $this->_oConfig->getObject('vote');
+        if(empty($aResult['votes']) && $oModule->getVoteObject($sSystem, $aEvent['id']) !== false)
+            $aResult['votes'] = array(
+                'system' => $sSystem,
+                'object_id' => $aEvent['id'],
+                'count' => $aEvent['votes']
+            );
+        
+        $sSystem = $this->_oConfig->getObject('reaction');
+        if(empty($aResult['reactions']) && $oModule->getReactionObject($sSystem, $aEvent['id']) !== false)
+            $aResult['reactions'] = array(
+                'system' => $sSystem,
+                'object_id' => $aEvent['id'],
+                'count' => $aEvent['rvotes']
+            );
+
+        $sSystem = $this->_oConfig->getObject('score');
+        if(empty($aResult['scores']) && $oModule->getScoreObject($sSystem, $aEvent['id']) !== false)
+            $aResult['scores'] = array(
+                'system' => $sSystem,
+                'object_id' => $aEvent['id'],
+                'score' => $aEvent['score']
+            );
+
+		$sSystem = $this->_oConfig->getObject('report');
+        if(empty($aResult['reports']) && $oModule->getReportObject($sSystem, $aEvent['id']) !== false)
+            $aResult['reports'] = array(
+                'system' => $sSystem,
+                'object_id' => $aEvent['id'],
+                'count' => $aEvent['reports']
+            );
+
+        $sSystem = $this->_oConfig->getObject('comment');
+        if(empty($aResult['comments']) && $oModule->getCmtsObject($sSystem, $aEvent['id']) !== false)
+            $aResult['comments'] = array(
+                'system' => $sSystem,
+                'object_id' => $aEvent['id'],
+                'count' => $aEvent['comments']
+            );
+    }
+
+    protected function _prepareTextForOutput($s, $iEventId = 0)
+    {
+    	$s = bx_process_output($s, BX_DATA_HTML);
+
+        $oMetatags = BxDolMetatags::getObjectInstance($this->_oConfig->getObject('metatags'));
+		$s = $oMetatags->metaParse($iEventId, $s);
+
+        return $s;
+    }
+}
+
+/** @} */

+ 135 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/source/install/config.php

@@ -0,0 +1,135 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Timeline Timeline
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_MODULE,
+    'name' => 'bx_timeline',
+    'title' => 'Timeline',
+    'note' => 'Timeline module.',
+    'version' => '11.0.4',
+    'vendor' => 'BoonEx',
+    'help_url' => 'http://feed.una.io/?section={module_name}',
+
+    'compatible_with' => array(
+        '11.0.1'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/timeline/',
+    'home_uri' => 'timeline',
+
+    'db_prefix' => 'bx_timeline_',
+    'class_prefix' => 'BxTimeline',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Timeline',
+
+    /**
+     * List of page triggers.
+     */
+    'page_triggers' => array (
+        'trigger_page_profile_view_entry',
+        'trigger_page_group_view_entry',
+    ),
+
+    /**
+     * Menu triggers.
+     */
+    'menu_triggers' => array(
+    	'trigger_profile_view_submenu',
+    	'trigger_group_view_submenu',
+    ),
+
+	/**
+     * Storage objects to automatically delete files from upon module uninstallation.
+     * Note. Don't add storage objects used in transcoder objects.
+     */
+    'storages' => array(
+    	'bx_timeline_photos',
+    	'bx_timeline_videos'
+    ),
+
+    /**
+     * Transcoders.
+     */
+    'transcoders' => array(
+    	'bx_timeline_photos_preview',
+    	'bx_timeline_photos_view',
+        'bx_timeline_photos_big',
+    	'bx_timeline_videos_poster',
+    	'bx_timeline_videos_mp4',
+    	'bx_timeline_videos_mp4_hd'
+    ),
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'uninstall' => array (
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable' => array(
+        'execute_sql' => 1,
+    	'update_relations_for_all' => 1,
+    	'update_relations' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable_success' => array(
+    	'process_page_triggers' => 1,
+		'process_menu_triggers' => 1,
+    	'register_transcoders' => 1,
+    	'clear_db_cache' => 1,
+    ),
+    'disable' => array (
+        'execute_sql' => 1,
+    	'update_relations_for_all' => 1,
+    	'update_relations' => 1,
+    	'unregister_transcoders' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable_failed' => array (
+    	'register_transcoders' => 1,
+    	'clear_db_cache' => 1,
+    ),
+
+    /**
+     * Dependencies Section
+     */
+    'dependencies' => array(),
+
+    /**
+     * Relations Section
+     */
+    'relation_handlers' => array(
+    	'on_install' => '',
+    	'on_uninstall' => 'delete_module_events',
+	    'on_enable' => 'add_handlers',
+	    'on_disable' => 'delete_handlers',
+    ),
+    'relations' => array(
+    	'bx_notifications'
+    )
+);
+
+/** @} */

+ 302 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/source/install/langs/en.xml

@@ -0,0 +1,302 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources name="en" flag="gb" title="English">
+    <string name="_bx_timeline"><![CDATA[Timeline]]></string>
+    <string name="_bx_timeline_cmts"><![CDATA[Timeline's Comments]]></string>
+    <string name="_bx_timeline_reactions"><![CDATA[Timeline's Reactions]]></string>
+
+    <string name="_bx_timeline_option_enable_edit"><![CDATA[Allow user to edit his items]]></string>
+    <string name="_bx_timeline_option_enable_delete"><![CDATA[Allow Timeline owner to remove items]]></string>
+    <string name="_bx_timeline_option_enable_show_all"><![CDATA[Show all items in Public Feed including ones which were posted in personal Feeds]]></string>
+    <string name="_bx_timeline_option_enable_count_all_views"><![CDATA[Count views for all items in the Feed]]></string>
+    <string name="_bx_timeline_option_events_per_page_profile"><![CDATA[Number of items on profile page]]></string>
+    <string name="_bx_timeline_option_events_per_page_account"><![CDATA[Number of items on dashboard page]]></string>
+    <string name="_bx_timeline_option_events_per_page_home"><![CDATA[Number of items on site home page]]></string>
+    <string name="_bx_timeline_option_events_per_page"><![CDATA[Number of items per page]]></string>
+    <string name="_bx_timeline_option_enable_infinite_scroll"><![CDATA[Enable Infinite Scroll (experimental)]]></string>
+    <string name="_bx_timeline_option_events_per_preload"><![CDATA[Infinite Scroll: Number of items per preload]]></string>
+    <string name="_bx_timeline_option_auto_preloads"><![CDATA[Infinite Scroll: Number of auto preloads]]></string>
+    <string name="_bx_timeline_option_rss_length"><![CDATA[The length of RSS feed]]></string>
+    <string name="_bx_timeline_option_events_hide"><![CDATA[Show events]]></string>
+    <string name="_bx_timeline_option_videos_autoplay"><![CDATA[Videos autoplay (for Timeline view only)]]></string>
+    <string name="_bx_timeline_option_videos_autoplay_off"><![CDATA[Disabled]]></string>
+    <string name="_bx_timeline_option_videos_autoplay_on_mute"><![CDATA[Enabled without sound]]></string>
+    <string name="_bx_timeline_option_videos_autoplay_on"><![CDATA[Enabled with sound]]></string>
+    <string name="_bx_timeline_option_preload_comments"><![CDATA[Number of preloaded comments (up to 7 items)]]></string>
+    <string name="_bx_timeline_option_enable_jump_to_switcher"><![CDATA[Show 'Jump to' switcher]]></string>
+    <string name="_bx_timeline_option_attachments_layout"><![CDATA[Show attachments as]]></string>
+    <string name="_bx_timeline_option_attachments_layout_gallery"><![CDATA[Gallery]]></string>
+    <string name="_bx_timeline_option_attachments_layout_showcase"><![CDATA[Showcase]]></string>
+    <string name="_bx_timeline_option_enable_hot"><![CDATA[Enable Hot list aggregation]]></string>
+    <string name="_bx_timeline_option_hot_interval"><![CDATA[Interval of time (in hours) to get Hot events]]></string>
+    <string name="_bx_timeline_option_enable_cache_item"><![CDATA[Enable item cache]]></string>
+    <string name="_bx_timeline_option_cache_item_engine"><![CDATA[Item cache engine (other than File option may require custom server setup)]]></string>
+    <string name="_bx_timeline_option_cache_item_lifetime"><![CDATA[Item cache lifetime]]></string>
+    <string name="_bx_timeline_option_enable_cache_list"><![CDATA[Enable feed cache]]></string>
+    <string name="_bx_timeline_option_enable_editor_toolbar"><![CDATA[Enable post form editor toolbar]]></string>
+
+    <string name="_bx_timeline_form_post"><![CDATA[Post]]></string>
+    <string name="_bx_timeline_form_post_display_add"><![CDATA[Write Post]]></string>
+    <string name="_bx_timeline_form_post_display_add_public"><![CDATA[Write Public Post]]></string>
+    <string name="_bx_timeline_form_post_display_add_profile"><![CDATA[Write Profile Post]]></string>
+    <string name="_bx_timeline_form_post_display_edit"><![CDATA[Edit Post]]></string>
+    <string name="_bx_timeline_form_post_display_view"><![CDATA[View Post (for custom fields)]]></string>
+    <string name="_bx_timeline_form_post_input_sys_owner_id"><![CDATA[Owner ID]]></string>
+    <string name="_bx_timeline_form_post_input_owner_id_own"><![CDATA[Your profile]]></string>
+    <string name="_bx_timeline_form_post_input_owner_id_following_group"><![CDATA[{0}]]></string>
+    <string name="_bx_timeline_form_post_input_sys_action"><![CDATA[Action]]></string>
+    <string name="_bx_timeline_form_post_input_sys_type"><![CDATA[Type]]></string>
+    <string name="_bx_timeline_form_post_input_sys_text"><![CDATA[Content]]></string>
+    <string name="_bx_timeline_form_post_input_text"><![CDATA[]]></string>
+    <string name="_bx_timeline_form_post_input_sys_object_privacy_view"><![CDATA[Visibility]]></string>
+    <string name="_bx_timeline_form_post_input_object_privacy_view"><![CDATA[Visibility]]></string>
+    <string name="_bx_timeline_form_post_input_sys_date"><![CDATA[Created at]]></string>
+    <string name="_bx_timeline_form_post_input_date"><![CDATA[Created at]]></string>
+    <string name="_bx_timeline_form_post_input_sys_date_published"><![CDATA[Publishing time]]></string>
+    <string name="_bx_timeline_form_post_input_date_published"><![CDATA[Publishing time]]></string>
+    <string name="_bx_timeline_form_post_input_date_published_info"><![CDATA[Leave empty to publish immediately.]]></string>
+    <string name="_bx_timeline_form_post_input_sys_link"><![CDATA[Link]]></string>
+    <string name="_bx_timeline_form_post_input_link_alt"><![CDATA[Add Link]]></string>
+    <string name="_bx_timeline_form_post_input_link_err_delete"><![CDATA[Cannot remove the link. Please report.]]></string>
+    <string name="_bx_timeline_form_post_input_sys_photo"><![CDATA[Photo]]></string>
+    <string name="_bx_timeline_form_post_input_photo"><![CDATA[]]></string>
+    <string name="_bx_timeline_form_post_input_photo_alt"><![CDATA[Add Photo]]></string>
+    <string name="_bx_timeline_form_post_input_sys_video"><![CDATA[Video]]></string>
+    <string name="_bx_timeline_form_post_input_video"><![CDATA[]]></string>
+    <string name="_bx_timeline_form_post_input_video_alt"><![CDATA[Add Video]]></string>
+    <string name="_bx_timeline_form_post_input_sys_attachments"><![CDATA[Attachments]]></string>
+    <string name="_bx_timeline_form_post_input_sys_do_submit"><![CDATA[Post]]></string>
+    <string name="_bx_timeline_form_post_input_do_submit"><![CDATA[Post]]></string>
+    <string name="_bx_timeline_form_post_input_sys_do_cancel"><![CDATA[Cancel]]></string>
+    <string name="_bx_timeline_form_post_input_do_cancel"><![CDATA[Cancel]]></string>
+
+    <string name="_bx_timeline_form_attach_link"><![CDATA[Attach Link]]></string>
+    <string name="_bx_timeline_form_attach_link_display_add"><![CDATA[Attach Link]]></string>
+    <string name="_bx_timeline_form_attach_link_input_sys_url"><![CDATA[Url]]></string>
+    <string name="_bx_timeline_form_attach_link_input_url"><![CDATA[Add Link]]></string>
+    <string name="_bx_timeline_form_attach_link_input_url_err"><![CDATA[Correct Link is essential. Please, fill in this field.]]></string>
+    <string name="_bx_timeline_form_attach_link_input_sys_do_submit"><![CDATA[Add]]></string>
+    <string name="_bx_timeline_form_attach_link_input_do_submit"><![CDATA[Add]]></string>
+    <string name="_bx_timeline_form_attach_link_input_do_cancel"><![CDATA[Close]]></string>
+
+    <string name="_bx_timeline_privacy_view"><![CDATA[View event]]></string>
+
+    <string name="_bx_timeline_acl_action_post"><![CDATA[Post]]></string>
+    <string name="_bx_timeline_acl_action_edit"><![CDATA[Edit Any Post]]></string>
+    <string name="_bx_timeline_acl_action_delete"><![CDATA[Delete Any Post]]></string>
+    <string name="_bx_timeline_acl_action_vote"><![CDATA[Vote]]></string>
+    <string name="_bx_timeline_acl_action_repost"><![CDATA[Repost]]></string>
+    <string name="_bx_timeline_acl_action_send"><![CDATA[Send]]></string>
+    <string name="_bx_timeline_acl_action_pin"><![CDATA['Pin here' Any Post]]></string>
+    <string name="_bx_timeline_acl_action_stick"><![CDATA['Pin for all' Any Post]]></string>
+    <string name="_bx_timeline_acl_action_promote"><![CDATA[Promote Any Post]]></string>
+
+    <!-- Pages -->
+    <string name="_bx_timeline_page_title_sys_view"><![CDATA[Profile Feed]]></string>
+    <string name="_bx_timeline_page_title_view"><![CDATA[Profile Feed]]></string>
+    <string name="_bx_timeline_page_title_sys_view_home"><![CDATA[Public Feed]]></string>
+    <string name="_bx_timeline_page_title_view_home"><![CDATA[Public Feed]]></string>
+    <string name="_bx_timeline_page_title_sys_view_hot"><![CDATA[Hot Feed]]></string>
+    <string name="_bx_timeline_page_title_view_hot"><![CDATA[Hot Feed]]></string>
+    <string name="_bx_timeline_page_title_sys_item"><![CDATA[Feed Item]]></string>
+    <string name="_bx_timeline_page_title_item"><![CDATA[Feed Item]]></string>
+    <string name="_bx_timeline_page_title_sys_item_brief"><![CDATA[Feed Item Preview]]></string>
+    <string name="_bx_timeline_page_title_item_brief"><![CDATA[Feed Item Preview]]></string>
+    <string name="_bx_timeline_page_title_sys_account"><![CDATA[Feed]]></string>
+    <string name="_bx_timeline_page_title_account"><![CDATA[Feed]]></string>
+    <string name="_bx_timeline_page_title_sys_manage_administration"><![CDATA[Manage All]]></string>
+    <string name="_bx_timeline_page_title_manage"><![CDATA[Manage]]></string>
+    <string name="_bx_timeline_page_block_title_system_post_profile"><![CDATA[Post to Сontext Feed]]></string>
+    <string name="_bx_timeline_page_block_title_post_profile"><![CDATA[Post to Feed]]></string>
+    <string name="_bx_timeline_page_block_title_system_view_profile"><![CDATA[Profile Feed (Timeline)]]></string>
+    <string name="_bx_timeline_page_block_title_view_profile"><![CDATA[Profile Feed]]></string>
+    <string name="_bx_timeline_page_block_title_system_view_profile_outline"><![CDATA[Profile Feed (Outline)]]></string>
+    <string name="_bx_timeline_page_block_title_view_profile_outline"><![CDATA[Profile Feed]]></string>
+    <string name="_bx_timeline_page_block_title_item"><![CDATA[Item]]></string>
+    <string name="_bx_timeline_page_block_title_item_content"><![CDATA[Content]]></string>
+    <string name="_bx_timeline_page_block_title_item_info"><![CDATA[Info]]></string>
+    <string name="_bx_timeline_page_block_title_item_comments"><![CDATA[Comments]]></string>
+    <string name="_bx_timeline_page_block_title_system_post_account"><![CDATA[Post to Feed]]></string>
+    <string name="_bx_timeline_page_block_title_post_account"><![CDATA[Post to Feed]]></string>
+    <string name="_bx_timeline_page_block_title_system_view_account"><![CDATA[Feed (Timeline)]]></string>
+    <string name="_bx_timeline_page_block_title_view_account"><![CDATA[Feed]]></string>
+    <string name="_bx_timeline_page_block_title_system_view_account_outline"><![CDATA[Feed (Outline)]]></string>
+    <string name="_bx_timeline_page_block_title_view_account_outline"><![CDATA[Feed]]></string>
+    <string name="_bx_timeline_page_block_title_system_views_timeline"><![CDATA[All Feeds (Timeline)]]></string>
+    <string name="_bx_timeline_page_block_title_views_timeline"><![CDATA[Feed]]></string>
+    <string name="_bx_timeline_page_block_title_system_views_outline"><![CDATA[All Feeds (Outline)]]></string>
+    <string name="_bx_timeline_page_block_title_views_outline"><![CDATA[Feed]]></string>        
+    <string name="_bx_timeline_page_block_title_system_post_home"><![CDATA[Post to Public Feed]]></string>
+    <string name="_bx_timeline_page_block_title_post_home"><![CDATA[Post to Feed]]></string>
+    <string name="_bx_timeline_page_block_title_system_view_home"><![CDATA[Public Feed (Timeline)]]></string>
+    <string name="_bx_timeline_page_block_title_view_home"><![CDATA[Public Feed]]></string>
+    <string name="_bx_timeline_page_block_title_system_view_home_outline"><![CDATA[Public Feed (Outline)]]></string>
+    <string name="_bx_timeline_page_block_title_view_home_outline"><![CDATA[Public Feed]]></string>
+    <string name="_bx_timeline_page_block_title_system_view_hot"><![CDATA[Hot Feed (Timeline)]]></string>
+    <string name="_bx_timeline_page_block_title_view_hot"><![CDATA[Hot Feed]]></string>
+    <string name="_bx_timeline_page_block_title_system_view_hot_outline"><![CDATA[Hot Feed (Outline)]]></string>
+    <string name="_bx_timeline_page_block_title_view_hot_outline"><![CDATA[Hot Feed]]></string>
+    <string name="_bx_timeline_page_block_title_browse_cmts"><![CDATA[Feeds' Comments]]></string>
+    <string name="_bx_timeline_page_block_title_system_manage_administration"><![CDATA[Manage All]]></string>
+    <string name="_bx_timeline_page_block_title_manage"><![CDATA[Manage]]></string>
+
+    <!-- Menus -->
+    <string name="_bx_timeline_menu_title_view"><![CDATA[View]]></string>
+    <string name="_bx_timeline_menu_set_title_view"><![CDATA[View]]></string>
+    <string name="_bx_timeline_menu_item_title_system_channels"><![CDATA[Channels]]></string>
+    <string name="_bx_timeline_menu_item_title_channels"><![CDATA[Channels]]></string>
+    <string name="_bx_timeline_menu_item_title_system_feed"><![CDATA[Feed]]></string>
+    <string name="_bx_timeline_menu_item_title_feed"><![CDATA[Feed]]></string>
+    <string name="_bx_timeline_menu_item_title_system_public"><![CDATA[Public]]></string>
+    <string name="_bx_timeline_menu_item_title_public"><![CDATA[Public]]></string>
+    <string name="_bx_timeline_menu_item_title_system_hot"><![CDATA[Hot]]></string>
+    <string name="_bx_timeline_menu_item_title_hot"><![CDATA[Hot]]></string>
+
+    <string name="_bx_timeline_menu_item_view_all"><![CDATA[All posts]]></string>
+    <string name="_bx_timeline_menu_item_view_owner"><![CDATA[Posts by {0}]]></string>
+    <string name="_bx_timeline_menu_item_view_other"><![CDATA[Posts by others]]></string>
+    <string name="_bx_timeline_menu_item_get_rss"><![CDATA[RSS]]></string>
+
+    <string name="_bx_timeline_menu_title_item_share"><![CDATA[Share Item]]></string>
+    <string name="_bx_timeline_menu_set_title_item_share"><![CDATA[Share Item]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_repost"><![CDATA[Repost]]></string>
+    <string name="_bx_timeline_menu_item_title_item_repost"><![CDATA[Repost]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_send"><![CDATA[Send]]></string>
+    <string name="_bx_timeline_menu_item_title_item_send"><![CDATA[Send to Friend]]></string>
+    <string name="_bx_timeline_menu_item_title_system_admt_timeline"><![CDATA[Timeline]]></string>
+    <string name="_bx_timeline_menu_item_title_admt_timeline"><![CDATA[Timeline]]></string>
+
+    <string name="_bx_timeline_menu_title_item_manage"><![CDATA[Manage Item]]></string>
+    <string name="_bx_timeline_menu_set_title_item_manage"><![CDATA[Manage Item]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_pin"><![CDATA[Pin here]]></string>
+    <string name="_bx_timeline_menu_item_title_item_pin"><![CDATA[Pin here]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_unpin"><![CDATA[Unpin here]]></string>
+    <string name="_bx_timeline_menu_item_title_item_unpin"><![CDATA[Unpin here]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_stick"><![CDATA[Pin for all]]></string>
+    <string name="_bx_timeline_menu_item_title_item_stick"><![CDATA[Pin for all]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_unstick"><![CDATA[Unpin for all]]></string>
+    <string name="_bx_timeline_menu_item_title_item_unstick"><![CDATA[Unpin for all]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_promote"><![CDATA[Promote]]></string>
+    <string name="_bx_timeline_menu_item_title_item_promote"><![CDATA[Promote]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_unpromote"><![CDATA[Unpromote]]></string>
+    <string name="_bx_timeline_menu_item_title_item_unpromote"><![CDATA[Unpromote]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_edit"><![CDATA[Edit]]></string>
+    <string name="_bx_timeline_menu_item_title_item_edit"><![CDATA[Edit]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_delete"><![CDATA[Delete]]></string>
+    <string name="_bx_timeline_menu_item_title_item_delete"><![CDATA[{delete_title}]]></string>
+    <string name="_bx_timeline_menu_item_title_item_delete_common"><![CDATA[Delete]]></string>
+    <string name="_bx_timeline_menu_item_title_item_delete_system"><![CDATA[Hide from feeds]]></string>
+
+    <string name="_bx_timeline_menu_title_item_actions"><![CDATA[Item Actions]]></string>
+    <string name="_bx_timeline_menu_set_title_item_actions"><![CDATA[Item Actions]]></string>
+    <string name="_bx_timeline_menu_title_item_actions_all"><![CDATA[Item Actions All]]></string>
+    <string name="_bx_timeline_menu_set_title_item_actions_all"><![CDATA[Item Actions All]]></string>
+    <string name="_bx_timeline_menu_title_item_counters"><![CDATA[Item Counters]]></string>
+    <string name="_bx_timeline_menu_set_title_item_counters"><![CDATA[Item Counters]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_comment"><![CDATA[Comment]]></string>
+    <string name="_bx_timeline_menu_item_title_item_comment"><![CDATA[Comment]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_view"><![CDATA[View]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_vote"><![CDATA[Vote (Like)]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_score"><![CDATA[Vote (Up/Down)]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_reaction"><![CDATA[Reaction]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_share"><![CDATA[Share]]></string>
+    <string name="_bx_timeline_menu_item_title_item_share"><![CDATA[Share]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_report"><![CDATA[Report]]></string>
+    <string name="_bx_timeline_menu_item_title_system_item_more"><![CDATA[More Actions]]></string>
+    <string name="_bx_timeline_menu_item_title_item_more"><![CDATA[]]></string>
+
+    <string name="_bx_timeline_menu_title_post_attachments"><![CDATA[Form Attachments]]></string>
+    <string name="_bx_timeline_menu_set_title_post_attachments"><![CDATA[Form Attachments]]></string>
+    <string name="_bx_timeline_menu_item_title_system_add_emoji"><![CDATA[Add Emoji]]></string>
+    <string name="_bx_timeline_menu_item_title_add_emoji"><![CDATA[Add Emoji]]></string>
+    <string name="_bx_timeline_menu_item_title_system_add_link"><![CDATA[Add Link]]></string>
+    <string name="_bx_timeline_menu_item_title_add_link"><![CDATA[Add Link]]></string>
+    <string name="_bx_timeline_menu_item_title_system_add_photo_simple"><![CDATA[Add Photo (Simple)]]></string>
+    <string name="_bx_timeline_menu_item_title_system_add_photo_html5"><![CDATA[Add Photo (HTML5)]]></string>
+    <string name="_bx_timeline_menu_item_title_add_photo"><![CDATA[Add Photo]]></string>
+    <string name="_bx_timeline_menu_item_title_system_add_video_simple"><![CDATA[Add Video (Simple)]]></string>
+    <string name="_bx_timeline_menu_item_title_system_add_video_html5"><![CDATA[Add Video (HTML5)]]></string>
+    <string name="_bx_timeline_menu_item_title_add_video"><![CDATA[Add Video]]></string>
+    <string name="_bx_timeline_menu_item_title_system_timeline"><![CDATA[Timeline]]></string>
+    <string name="_bx_timeline_menu_item_title_timeline"><![CDATA[Timeline]]></string>
+    <string name="_bx_timeline_menu_item_title_system_create_entry"><![CDATA[Update]]></string>
+    <string name="_bx_timeline_menu_item_title_create_entry"><![CDATA[Update]]></string>
+    <string name="_bx_timeline_menu_item_title_system_view_timeline_view"><![CDATA[Timeline]]></string>
+    <string name="_bx_timeline_menu_item_title_view_timeline_view"><![CDATA[Timeline]]></string>
+
+    <string name="_bx_timeline_grid_column_title_adm_active"><![CDATA[Active]]></string>
+    <string name="_bx_timeline_grid_column_title_adm_description"><![CDATA[Event]]></string>
+    <string name="_bx_timeline_grid_column_title_adm_added"><![CDATA[Added]]></string>
+    <string name="_bx_timeline_grid_column_title_adm_author"><![CDATA[Author]]></string>
+    <string name="_bx_timeline_grid_action_title_adm_delete"><![CDATA[Delete]]></string>
+    <string name="_bx_timeline_grid_action_title_adm_audit_content"><![CDATA[Audit actions]]></string>
+    <string name="_bx_timeline_grid_txt_account_manager"><![CDATA[Redirect to manage account.]]></string>
+
+    <string name="_bx_timeline_alert_module_timeline_common_post"><![CDATA[Timeline (post)]]></string>
+    <string name="_bx_timeline_alert_module_timeline_common_repost"><![CDATA[Timeline (repost)]]></string>
+    <string name="_bx_timeline_alert_action_added"><![CDATA[add]]></string>
+    <string name="_bx_timeline_alert_action_post_common"><![CDATA[add post]]></string>
+    <string name="_bx_timeline_alert_action_repost"><![CDATA[repost]]></string>
+    <string name="_bx_timeline_alert_action_post_common_personal"><![CDATA[New content]]></string>
+    <string name="_bx_timeline_alert_action_post_common_follow_member"><![CDATA[New content]]></string>
+    <string name="_bx_timeline_alert_action_post_common_follow_context"><![CDATA[New content]]></string>
+    <string name="_bx_timeline_alert_action_repost_follow_member"><![CDATA[New content repost]]></string>
+    <string name="_bx_timeline_alert_action_repost_follow_context"><![CDATA[New content repost]]></string>
+
+    <string name="_bx_timeline_txt_msg_no_results"><![CDATA[Empty]]></string>
+    <string name="_bx_timeline_txt_msg_performed_action"><![CDATA[The action was successfully performed.]]></string>
+    <string name="_bx_timeline_txt_msg_posted"><![CDATA[Posted successfully.]]></string>
+    <string name="_bx_timeline_grid_action_err_delete"><![CDATA[Cannot delete the selected timeline events(s).]]></string>
+    <string name="_bx_timeline_txt_err_cannot_perform_action"><![CDATA[Cannot perform action. Please report.]]></string>
+    <string name="_bx_timeline_txt_err_empty_post"><![CDATA[The post is empty.]]></string>
+
+    <string name="_bx_timeline_txt_to"><![CDATA[to]]></string>
+    <string name="_bx_timeline_txt_load_more"><![CDATA[Load More]]></string>
+    <string name="_bx_timeline_txt_loading"><![CDATA[Loading...]]></string>
+    <string name="_bx_timeline_txt_or_jump_to"><![CDATA[... or jump to:]]></string>
+    <string name="_bx_timeline_txt_jump_to_n_year"><![CDATA[Jump to {0} year]]></string>
+    <string name="_bx_timeline_txt_jump_to_recent"><![CDATA[Jump to recent posts]]></string>
+    <string name="_bx_timeline_txt_status_deleted"><![CDATA[Deleted]]></string>
+    <string name="_bx_timeline_txt_hot"><![CDATA[Hot post]]></string>
+    <string name="_bx_timeline_txt_pinned"><![CDATA[Pinned post]]></string>
+    <string name="_bx_timeline_txt_sticked"><![CDATA[Pinned for all post]]></string>
+    <string name="_bx_timeline_txt_promoted"><![CDATA[Promoted]]></string>
+    <string name="_bx_timeline_txt_note_scheduled_awaiting"><![CDATA[Update publishing date is {0}]]></string>
+    <string name="_bx_timeline_txt_note_processing_awaiting"><![CDATA[Update will be published as soon as video is converted]]></string>
+    <string name="_bx_timeline_txt_note_processing_failed"><![CDATA[Update isn't published because video conversion failed, edit video to fix the issue.]]></string>
+    <string name="_bx_timeline_txt_rss_caption"><![CDATA[{0}'s timeline]]></string>
+    <string name="_bx_timeline_txt_added_sample"><![CDATA[added {0}]]></string>
+    <string name="_bx_timeline_txt_user_added_sample"><![CDATA[{0} added {1}]]></string>
+    <string name="_bx_timeline_txt_user_repost"><![CDATA[{0}'s repost]]></string>
+    <string name="_bx_timeline_txt_user_reposted_user_sample"><![CDATA[{0} reposted {1}'s {2}]]></string>
+    <string name="_bx_timeline_txt_sample"><![CDATA[post]]></string>
+    <string name="_bx_timeline_txt_sample_with_article"><![CDATA[a post]]></string>
+    <string name="_bx_timeline_txt_sample_ext"><![CDATA[timeline post]]></string>
+    <string name="_bx_timeline_txt_sample_comment_single"><![CDATA[comment to timeline post]]></string>
+    <string name="_bx_timeline_txt_sample_vote_single"><![CDATA[vote to timeline post]]></string>
+    <string name="_bx_timeline_txt_sample_reaction_single"><![CDATA['{0}' reaction to timeline post]]></string>
+    <string name="_bx_timeline_txt_sample_score_up_single"><![CDATA[score up vote to timeline post]]></string>
+    <string name="_bx_timeline_txt_sample_score_down_single"><![CDATA[score down vote to timeline post]]></string>
+    <string name="_bx_timeline_txt_sample_with_link"><![CDATA[with link]]></string>
+    <string name="_bx_timeline_txt_sample_with_image"><![CDATA[with image]]></string>
+    <string name="_bx_timeline_txt_sample_with_video"><![CDATA[with video]]></string>
+    <string name="_bx_timeline_txt_sample_with_media"><![CDATA[with media]]></string>
+    <string name="_bx_timeline_txt_today"><![CDATA[Today]]></string>
+    <string name="_bx_timeline_txt_some_text_here"><![CDATA[Share your thoughts, location, photos or video]]></string>
+    <string name="_bx_timeline_txt_show"><![CDATA[Show]]></string>
+    <string name="_bx_timeline_txt_new_content"><![CDATA[New content]]></string>
+
+    <string name="_bx_timeline_txt_do_repost"><![CDATA[Repost]]></string>
+    <string name="_bx_timeline_txt_reposted"><![CDATA[Reposted {0}'s {1}.]]></string>
+    <string name="_bx_timeline_txt_reposted_by"><![CDATA[Reposted by]]></string>
+    <string name="_bx_timeline_txt_err_cannot_repost"><![CDATA[Cannot repost. Please report.]]></string>
+    <string name="_bx_timeline_txt_err_already_reposted"><![CDATA[You already reposted the item.]]></string>
+    <string name="_bx_timeline_txt_msg_success_repost"><![CDATA[The item was successfully reposted.]]></string>
+    <string name="_bx_timeline_txt_object_reposted"><![CDATA[<b class="bx-ntfs-content-profile">{owner_name}</b> reposted a {entry_sample} <b class="bx-ntfs-content-entry">{entry_caption}</b>]]></string>
+
+    <!-- EMAIL TEMPLATES -->
+    <string name="_bx_timeline_et_txt_name_send"><![CDATA[Send to Friend.]]></string>
+    <string name="_bx_timeline_et_txt_subject_send"><![CDATA[It may be interesting for you.]]></string>
+    <string name="_bx_timeline_et_txt_body_send"><![CDATA[
+<p>Hello.</p>
+<p>Take a look at <a href="{ViewLink}">this post</a>, it may be interesting for you.</p>]]></string>
+</resources>

+ 416 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/source/install/sql/enable.sql

@@ -0,0 +1,416 @@
+-- PAGES & BLOCKS
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_timeline_view', '_bx_timeline_page_title_sys_view', '_bx_timeline_page_title_view', 'bx_timeline', 5, 2147483647, 1, 'timeline-view', 'page.php?i=timeline-view', '', '', '', 0, 1, 0, 'BxTimelinePageView', 'modules/boonex/timeline/classes/BxTimelinePageView.php'),
+('bx_timeline_view_home', '_bx_timeline_page_title_sys_view_home', '_bx_timeline_page_title_view_home', 'bx_timeline', 5, 2147483647, 1, 'timeline-view-home', 'page.php?i=timeline-view-home', '', '', '', 0, 1, 0, '', ''),
+('bx_timeline_view_hot', '_bx_timeline_page_title_sys_view_hot', '_bx_timeline_page_title_view_hot', 'bx_timeline', 5, 2147483647, 1, 'timeline-view-hot', 'page.php?i=timeline-view-hot', '', '', '', 0, 1, 0, '', ''),
+
+('bx_timeline_item', '_bx_timeline_page_title_sys_item', '_bx_timeline_page_title_item', 'bx_timeline', 2, 2147483647, 1, 'item', 'page.php?i=item', '', '', '', 0, 1, 0, '', ''),
+('bx_timeline_item_brief', '_bx_timeline_page_title_sys_item_brief', '_bx_timeline_page_title_item_brief', 'bx_timeline', 2, 2147483647, 1, 'item-quick', 'page.php?i=item-quick', '', '', '', 0, 1, 0, '', '');
+
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES
+('bx_timeline_view', 1, 'bx_timeline', '_bx_timeline_page_block_title_system_post_profile', '_bx_timeline_page_block_title_post_profile', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:14:"get_block_post";}', 0, 0, 1, 1),
+('bx_timeline_view', 1, 'bx_timeline', '_bx_timeline_page_block_title_system_view_profile', '_bx_timeline_page_block_title_view_profile', 0, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:14:"get_block_view";}', 0, 0, 1, 2),
+('bx_timeline_view', 1, 'bx_timeline', '_bx_timeline_page_block_title_system_view_profile_outline', '_bx_timeline_page_block_title_view_profile_outline', 0, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:22:"get_block_view_outline";}', 0, 0, 0, 3),
+
+('bx_timeline_view_home', 1, 'bx_timeline', '_bx_timeline_page_block_title_system_post_home', '_bx_timeline_page_block_title_post_home', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:19:"get_block_post_home";}', 0, 0, 1, 1),
+('bx_timeline_view_home', 1, 'bx_timeline', '_bx_timeline_page_block_title_system_view_home', '_bx_timeline_page_block_title_view_home', 0, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:19:"get_block_view_home";}', 0, 0, 0, 2),
+('bx_timeline_view_home', 1, 'bx_timeline', '_bx_timeline_page_block_title_system_view_home_outline', '_bx_timeline_page_block_title_view_home_outline', 0, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:27:"get_block_view_home_outline";}', 0, 0, 1, 3),
+
+('bx_timeline_view_hot', 1, 'bx_timeline', '_bx_timeline_page_block_title_system_view_hot', '_bx_timeline_page_block_title_view_hot', 0, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:18:"get_block_view_hot";}', 0, 1, 0, 1),
+('bx_timeline_view_hot', 1, 'bx_timeline', '_bx_timeline_page_block_title_system_view_hot_outline', '_bx_timeline_page_block_title_view_hot_outline', 0, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:26:"get_block_view_hot_outline";}', 0, 1, 1, 2),
+
+('bx_timeline_item', 1, 'bx_timeline', '', '_bx_timeline_page_block_title_item', 0, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:14:"get_block_item";}', 0, 0, 1, 1),
+('bx_timeline_item', 1, 'bx_timeline', '', '_bx_timeline_page_block_title_item_comments', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:23:"get_block_item_comments";}', 0, 0, 1, 2),
+('bx_timeline_item', 2, 'bx_timeline', '', '_bx_timeline_page_block_title_item_info', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:19:"get_block_item_info";}', 0, 0, 1, 1),
+
+('bx_timeline_item_brief', 1, 'bx_timeline', '', '_bx_timeline_page_block_title_item_content', 0, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:22:"get_block_item_content";}', 0, 0, 1, 1),
+('bx_timeline_item_brief', 2, 'bx_timeline', '', '_bx_timeline_page_block_title_item_info', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:19:"get_block_item_info";}', 0, 0, 1, 1),
+('bx_timeline_item_brief', 2, 'bx_timeline', '', '_bx_timeline_page_block_title_item_comments', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:23:"get_block_item_comments";}', 0, 0, 1, 2);
+
+
+-- PAGES: add page block on dashboard
+SET @iPBCellDashboard = 2;
+SET @iPBOrderDashboard = 1; --(SELECT IFNULL(MAX(`order`), 0) FROM `sys_pages_blocks` WHERE `object` = 'sys_dashboard' AND `cell_id` = @iPBCellDashboard LIMIT 1);
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES
+('sys_dashboard', @iPBCellDashboard, 'bx_timeline', '_bx_timeline_page_block_title_system_post_account', '_bx_timeline_page_block_title_post_account', 11, 2147483644, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:22:"get_block_post_account";}', 0, 1, 0, @iPBOrderDashboard),
+('sys_dashboard', @iPBCellDashboard, 'bx_timeline', '_bx_timeline_page_block_title_system_views_timeline', '_bx_timeline_page_block_title_views_timeline', 3, 2147483644, 'service', 'a:3:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:24:"get_block_views_timeline";s:6:"params";a:1:{i:0;s:4:"feed";}}', 0, 0, 0, @iPBOrderDashboard + 1),
+('sys_dashboard', @iPBCellDashboard, 'bx_timeline', '_bx_timeline_page_block_title_system_views_outline', '_bx_timeline_page_block_title_views_outline', 3, 2147483644, 'service', 'a:3:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:23:"get_block_views_outline";s:6:"params";a:1:{i:0;s:4:"feed";}}', 0, 0, 0, @iPBOrderDashboard + 1);
+
+-- PAGES: add page block on home
+SET @iPBCellHome = 3;
+SET @iPBOrderHome = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_pages_blocks` WHERE `object` = 'sys_home' AND `cell_id` = @iPBCellHome ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('sys_home', @iPBCellHome, 'bx_timeline', '_bx_timeline_page_block_title_system_post_home', '_bx_timeline_page_block_title_post_home', 11, 2147483644, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:19:"get_block_post_home";}', 0, 1, 0, @iPBOrderHome + 1),
+('sys_home', @iPBCellHome, 'bx_timeline', '_bx_timeline_page_block_title_system_views_timeline', '_bx_timeline_page_block_title_views_timeline', 3, 2147483644, 'service', 'a:3:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:24:"get_block_views_timeline";s:6:"params";a:1:{i:0;s:4:"feed";}}', 0, 0, 1, @iPBOrderHome + 2);
+
+SET @iPBCellHome = 4;
+SET @iPBOrderHome = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_pages_blocks` WHERE `object` = 'sys_home' AND `cell_id` = @iPBCellHome ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('sys_home', @iPBCellHome, 'bx_timeline', '_bx_timeline_page_block_title_system_view_home_outline', '_bx_timeline_page_block_title_view_home_outline', 0, 1, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:27:"get_block_view_home_outline";}', 0, 0, 1, @iPBOrderHome + 1);
+
+-- PAGES: add page block to profiles modules (trigger* page objects are processed separately upon modules enable/disable)
+SET @iPBCellProfile = 2;
+SET @iPBCellGroup = 4;
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES
+('trigger_page_profile_view_entry', @iPBCellProfile, 'bx_timeline', '_bx_timeline_page_block_title_system_post_profile', '_bx_timeline_page_block_title_post_profile', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:22:"get_block_post_profile";s:6:"params";a:1:{i:0;s:6:"{type}";}}', 0, 0, 1, 0),
+('trigger_page_profile_view_entry', @iPBCellProfile, 'bx_timeline', '_bx_timeline_page_block_title_system_view_profile', '_bx_timeline_page_block_title_view_profile', 0, 2147483647, 'service', 'a:3:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:22:"get_block_view_profile";s:6:"params";a:1:{i:0;s:6:"{type}";}}', 0, 0, 1, 0),
+('trigger_page_profile_view_entry', @iPBCellProfile, 'bx_timeline', '_bx_timeline_page_block_title_system_view_profile_outline', '_bx_timeline_page_block_title_view_profile_outline', 0, 2147483647, 'service', 'a:3:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:30:"get_block_view_profile_outline";s:6:"params";a:1:{i:0;s:6:"{type}";}}', 0, 0, 0, 0),
+
+('trigger_page_group_view_entry', @iPBCellGroup, 'bx_timeline', '_bx_timeline_page_block_title_system_post_profile', '_bx_timeline_page_block_title_post_profile', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:22:"get_block_post_profile";s:6:"params";a:1:{i:0;s:6:"{type}";}}', 0, 0, 1, 0),
+('trigger_page_group_view_entry', @iPBCellGroup, 'bx_timeline', '_bx_timeline_page_block_title_system_view_profile', '_bx_timeline_page_block_title_view_profile', 0, 2147483647, 'service', 'a:3:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:22:"get_block_view_profile";s:6:"params";a:1:{i:0;s:6:"{type}";}}', 0, 0, 1, 0),
+('trigger_page_group_view_entry', @iPBCellGroup, 'bx_timeline', '_bx_timeline_page_block_title_system_view_profile_outline', '_bx_timeline_page_block_title_view_profile_outline', 0, 2147483647, 'service', 'a:3:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:30:"get_block_view_profile_outline";s:6:"params";a:1:{i:0;s:6:"{type}";}}', 0, 0, 0, 0);
+
+-- PAGE: module manage all
+INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_timeline_administration', '_bx_timeline_page_title_sys_manage_administration', '_bx_timeline_page_title_manage', 'bx_timeline', 5, 192, 1, 'timeline-administration', 'page.php?i=timeline-administration', '', '', '', 0, 1, 0, 'BxTimelinePageBrowse', 'modules/boonex/timeline/classes/BxTimelinePageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_timeline_administration', 1, 'bx_timeline', '_bx_timeline_page_block_title_system_manage_administration', '_bx_timeline_page_block_title_manage', 11, 192, 'service', 'a:3:{s:6:\"module\";s:11:\"bx_timeline\";s:6:\"method\";s:12:\"manage_tools\";s:6:\"params\";a:1:{i:0;s:14:\"administration\";}}', 0, 1, 0);
+
+
+-- PAGE: service blocks
+SET @iBlockOrder = (SELECT `order` FROM `sys_pages_blocks` WHERE `object` = '' AND `cell_id` = 0 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('', 0, 'bx_timeline', '_bx_timeline_page_block_title_system_views_timeline', '_bx_timeline_page_block_title_views_timeline', 3, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:24:"get_block_views_timeline";}', 0, 1, 1, @iPBOrderHome + 1),
+('', 0, 'bx_timeline', '_bx_timeline_page_block_title_system_views_outline', '_bx_timeline_page_block_title_views_outline', 3, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:23:"get_block_views_outline";}', 0, 1, 1, @iPBOrderHome + 2),
+('', 0, 'bx_timeline', '_bx_timeline_page_block_title_system_view_home', '_bx_timeline_page_block_title_view_home', 0, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:19:"get_block_view_home";}', 0, 1, 1, @iBlockOrder + 3),
+('', 0, 'bx_timeline', '_bx_timeline_page_block_title_system_view_home_outline', '_bx_timeline_page_block_title_view_home_outline', 0, 2147483647, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:27:"get_block_view_home_outline";}', 0, 1, 1, @iBlockOrder + 4),
+('', 0, 'bx_timeline', '_bx_timeline_page_block_title_system_view_account', '_bx_timeline_page_block_title_view_account', 0, 2147483644, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:22:"get_block_view_account";}', 0, 1, 1, @iBlockOrder + 5),
+('', 0, 'bx_timeline', '_bx_timeline_page_block_title_system_view_account_outline', '_bx_timeline_page_block_title_view_account_outline', 0, 2147483644, 'service', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:30:"get_block_view_account_outline";}', 0, 1, 1, @iBlockOrder + 6);
+
+
+-- MENU: Feeds
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_timeline_menu_view', '_bx_timeline_menu_title_view', 'bx_timeline_menu_view', 'bx_timeline', 22, 0, 1, 'BxTimelineMenuView', 'modules/boonex/timeline/classes/BxTimelineMenuView.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_timeline_menu_view', 'bx_timeline', '_bx_timeline_menu_set_title_view', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES
+('bx_timeline_menu_view', 'bx_timeline', 'feed', '_bx_timeline_menu_item_title_system_feed', '_bx_timeline_menu_item_title_feed', 'javascript:void(0)', 'javascript:{js_object_view}.changeView(this, ''feed'')', '_self', '', '', 2147483647, 1, 0, 1),
+('bx_timeline_menu_view', 'bx_timeline', 'public', '_bx_timeline_menu_item_title_system_public', '_bx_timeline_menu_item_title_public', 'javascript:void(0)', 'javascript:{js_object_view}.changeView(this, ''public'')', '_self', '', '', 2147483647, 1, 0, 2),
+('bx_timeline_menu_view', 'bx_timeline', 'channels', '_bx_timeline_menu_item_title_system_channels', '_bx_timeline_menu_item_title_channels', 'javascript:void(0)', 'javascript:{js_object_view}.changeView(this, ''channels'')', '_self', '', '', 2147483647, 0, 0, 3),
+('bx_timeline_menu_view', 'bx_timeline', 'hot', '_bx_timeline_menu_item_title_system_hot', '_bx_timeline_menu_item_title_hot', 'javascript:void(0)', 'javascript:{js_object_view}.changeView(this, ''hot'')', '_self', '', '', 2147483647, 1, 0, 4);
+
+-- MENU: Item Share (Repost, Send to Friend, etc)
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_timeline_menu_item_share', '_bx_timeline_menu_title_item_share', 'bx_timeline_menu_item_share', 'bx_timeline', 6, 0, 1, 'BxTimelineMenuItemShare', 'modules/boonex/timeline/classes/BxTimelineMenuItemShare.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_timeline_menu_item_share', 'bx_timeline', '_bx_timeline_menu_set_title_item_share', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES
+('bx_timeline_menu_item_share', 'bx_timeline', 'item-repost', '_bx_timeline_menu_item_title_system_item_repost', '_bx_timeline_menu_item_title_item_repost', 'javascript:void(0)', 'javascript:{js_onclick_repost}', '_self', 'redo', '', 2147483647, 1, 0, 1),
+('bx_timeline_menu_item_share', 'bx_timeline', 'item-send', '_bx_timeline_menu_item_title_system_item_send', '_bx_timeline_menu_item_title_item_send', 'page.php?i=start-convo&et={et_send}', '', '_self', 'envelope', '', 2147483647, 1, 0, 2);
+
+-- MENU: Item Manage (Pin, Delete, etc)
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_timeline_menu_item_manage', '_bx_timeline_menu_title_item_manage', 'bx_timeline_menu_item_manage', 'bx_timeline', 20, 0, 1, 'BxTimelineMenuItemManage', 'modules/boonex/timeline/classes/BxTimelineMenuItemManage.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_timeline_menu_item_manage', 'bx_timeline', '_bx_timeline_menu_set_title_item_manage', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('bx_timeline_menu_item_manage', 'bx_timeline', 'item-pin', '_bx_timeline_menu_item_title_system_item_pin', '_bx_timeline_menu_item_title_item_pin', 'javascript:void(0)', 'javascript:{js_object_view}.pinPost(this, {content_id}, 1)', '_self', 'thumbtack', '', 2147483647, 1, 0, 0),
+('bx_timeline_menu_item_manage', 'bx_timeline', 'item-unpin', '_bx_timeline_menu_item_title_system_item_unpin', '_bx_timeline_menu_item_title_item_unpin', 'javascript:void(0)', 'javascript:{js_object_view}.pinPost(this, {content_id}, 0)', '_self', 'thumbtack', '', 2147483647, 1, 0, 1),
+('bx_timeline_menu_item_manage', 'bx_timeline', 'item-stick', '_bx_timeline_menu_item_title_system_item_stick', '_bx_timeline_menu_item_title_item_stick', 'javascript:void(0)', 'javascript:{js_object_view}.stickPost(this, {content_id}, 1)', '_self', 'thumbtack', '', 2147483647, 1, 0, 2),
+('bx_timeline_menu_item_manage', 'bx_timeline', 'item-unstick', '_bx_timeline_menu_item_title_system_item_unstick', '_bx_timeline_menu_item_title_item_unstick', 'javascript:void(0)', 'javascript:{js_object_view}.stickPost(this, {content_id}, 0)', '_self', 'thumbtack', '', 2147483647, 1, 0, 3),
+('bx_timeline_menu_item_manage', 'bx_timeline', 'item-promote', '_bx_timeline_menu_item_title_system_item_promote', '_bx_timeline_menu_item_title_item_promote', 'javascript:void(0)', 'javascript:{js_object_view}.promotePost(this, {content_id}, 1)', '_self', 'certificate ', '', 2147483647, 1, 0, 4),
+('bx_timeline_menu_item_manage', 'bx_timeline', 'item-unpromote', '_bx_timeline_menu_item_title_system_item_unpromote', '_bx_timeline_menu_item_title_item_unpromote', 'javascript:void(0)', 'javascript:{js_object_view}.promotePost(this, {content_id}, 0)', '_self', 'certificate', '', 2147483647, 1, 0, 5),
+('bx_timeline_menu_item_manage', 'bx_timeline', 'item-report', '_bx_timeline_menu_item_title_system_item_report', '', 'javascript:void(0)', '', '', '', '', 2147483647, 1, 0, 6),
+('bx_timeline_menu_item_manage', 'bx_timeline', 'item-edit', '_bx_timeline_menu_item_title_system_item_edit', '_bx_timeline_menu_item_title_item_edit', 'javascript:void(0)', 'javascript:{js_object_view}.editPost(this, {content_id})', '_self', 'pencil-alt', '', 2147483647, 1, 0, 7),
+('bx_timeline_menu_item_manage', 'bx_timeline', 'item-delete', '_bx_timeline_menu_item_title_system_item_delete', '_bx_timeline_menu_item_title_item_delete', 'javascript:void(0)', 'javascript:{js_object_view}.deletePost(this, {content_id})', '_self', 'remove', '', 2147483647, 1, 0, 8);
+
+-- MENU: Item Actions (Comment, Vote, Share, Report, etc)
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_timeline_menu_item_actions', '_bx_timeline_menu_title_item_actions', 'bx_timeline_menu_item_actions', 'bx_timeline', 15, 0, 1, 'BxTimelineMenuItemActions', 'modules/boonex/timeline/classes/BxTimelineMenuItemActions.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_timeline_menu_item_actions', 'bx_timeline', '_bx_timeline_menu_set_title_item_actions', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `submenu_popup`, `visible_for_levels`, `active`, `copyable`, `editable`, `order`) VALUES
+('bx_timeline_menu_item_actions', 'bx_timeline', 'item-view', '_bx_timeline_menu_item_title_system_item_view', '', 'javascript:void(0)', '', '', '', '', '', 0, 2147483647, 0, 0, 1, 0),
+('bx_timeline_menu_item_actions', 'bx_timeline', 'item-comment', '_bx_timeline_menu_item_title_system_item_comment', '_bx_timeline_menu_item_title_item_comment', 'javascript:void(0)', 'javascript:{comment_onclick}', '_self', 'comment', '', '', 0, 2147483647, 1, 0, 1, 10),
+('bx_timeline_menu_item_actions', 'bx_timeline', 'item-vote', '_bx_timeline_menu_item_title_system_item_vote', '', 'javascript:void(0)', '', '', '', '', '', 0, 2147483647, 0, 0, 1, 20),
+('bx_timeline_menu_item_actions', 'bx_timeline', 'item-reaction', '_bx_timeline_menu_item_title_system_item_reaction', '', 'javascript:void(0)', '', '', '', '', '', 0, 2147483647, 1, 0, 1, 30),
+('bx_timeline_menu_item_actions', 'bx_timeline', 'item-score', '_bx_timeline_menu_item_title_system_item_score', '', 'javascript:void(0)', '', '', '', '', '', 0, 2147483647, 0, 0, 1, 40),
+('bx_timeline_menu_item_actions', 'bx_timeline', 'item-share', '_bx_timeline_menu_item_title_system_item_share', '_bx_timeline_menu_item_title_item_share', 'javascript:void(0)', 'bx_menu_popup(''bx_timeline_menu_item_share'', this, {''id'':''bx_timeline_menu_item_share_{content_id}''}, {content_id:{content_id}, name:''{name}'', view:''{view}'', type:''{type}''});', '', 'share-alt', '', 'bx_timeline_menu_item_share', 1, 2147483647, 1, 0, 1, 50),
+('bx_timeline_menu_item_actions', 'bx_timeline', 'item-more', '_bx_timeline_menu_item_title_system_item_more', '_bx_timeline_menu_item_title_item_more', 'javascript:void(0)', 'bx_menu_popup(''bx_timeline_menu_item_manage'', this, {''id'':''bx_timeline_menu_item_manage_{content_id}''}, {content_id:{content_id}, name:''{name}'', view:''{view}'', type:''{type}''});', '', 'ellipsis-h', '', 'bx_timeline_menu_item_manage', 1, 2147483647, 1, 0, 1, 60);
+
+-- MENU: all actions menu for view entry 
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_timeline_menu_item_actions_all', '_bx_timeline_menu_title_item_actions_all', 'bx_timeline_menu_item_actions_all', 'bx_timeline', 15, 0, 1, 'BxTimelineMenuItemActionsAll', 'modules/boonex/timeline/classes/BxTimelineMenuItemActionsAll.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_timeline_menu_item_actions_all', 'bx_timeline', '_bx_timeline_menu_set_title_item_actions_all', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `submenu_popup`, `visible_for_levels`, `active`, `copyable`, `editable`, `order`) VALUES 
+('bx_timeline_menu_item_actions_all', 'bx_timeline', 'item-view', '_bx_timeline_menu_item_title_system_item_view', '', '', '', '', '', '', '', 0, 2147483647, 0, 0, 1, 0),
+('bx_timeline_menu_item_actions_all', 'bx_timeline', 'item-comment', '_bx_timeline_menu_item_title_system_item_comment', '', '', '', '', '', '', '', 0, 2147483647, 1, 0, 1, 10),
+('bx_timeline_menu_item_actions_all', 'bx_timeline', 'item-vote', '_bx_timeline_menu_item_title_system_item_vote', '', '', '', '', '', '', '', 0, 2147483647, 0, 0, 1, 20),
+('bx_timeline_menu_item_actions_all', 'bx_timeline', 'item-reaction', '_bx_timeline_menu_item_title_system_item_reaction', '', '', '', '', '', '', '', 0, 2147483647, 1, 0, 1, 30),
+('bx_timeline_menu_item_actions_all', 'bx_timeline', 'item-score', '_bx_timeline_menu_item_title_system_item_score', '', '', '', '', '', '', '', 0, 2147483647, 0, 0, 1, 40),
+('bx_timeline_menu_item_actions_all', 'bx_timeline', 'item-share', '_bx_timeline_menu_item_title_system_item_share', '', '', '', '', '', '', '', 0, 2147483647, 1, 0, 1, 50),
+('bx_timeline_menu_item_actions_all', 'bx_timeline', 'item-pin', '_bx_timeline_menu_item_title_system_item_pin', '', '', '', '', '', '', '', 0, 2147483647, 1, 0, 1, 100),
+('bx_timeline_menu_item_actions_all', 'bx_timeline', 'item-unpin', '_bx_timeline_menu_item_title_system_item_unpin', '', '', '', '', '', '', '', 0, 2147483647, 1, 0, 1, 110),
+('bx_timeline_menu_item_actions_all', 'bx_timeline', 'item-stick', '_bx_timeline_menu_item_title_system_item_stick', '', '', '', '', '', '', '', 0, 2147483647, 1, 0, 1, 120),
+('bx_timeline_menu_item_actions_all', 'bx_timeline', 'item-unstick', '_bx_timeline_menu_item_title_system_item_unstick', '', '', '', '', '', '', '', 0, 2147483647, 1, 0, 1, 130),
+('bx_timeline_menu_item_actions_all', 'bx_timeline', 'item-promote', '_bx_timeline_menu_item_title_system_item_promote', '', '', '', '', '', '', '', 0, 2147483647, 1, 0, 1, 140),
+('bx_timeline_menu_item_actions_all', 'bx_timeline', 'item-unpromote', '_bx_timeline_menu_item_title_system_item_unpromote', '', '', '', '', '', '', '', 0, 2147483647, 1, 0, 1, 150),
+('bx_timeline_menu_item_actions_all', 'bx_timeline', 'item-report', '_bx_timeline_menu_item_title_system_item_report', '', '', '', '', '', '', '', 0, 2147483647, 1, 0, 1, 160),
+('bx_timeline_menu_item_actions_all', 'bx_timeline', 'item-edit', '_bx_timeline_menu_item_title_system_item_edit', '', '', '', '', '', '', '', 0, 2147483647, 1, 0, 1, 170),
+('bx_timeline_menu_item_actions_all', 'bx_timeline', 'item-delete', '_bx_timeline_menu_item_title_system_item_delete', '', '', '', '', '', '', '', 0, 2147483647, 1, 0, 1, 180),
+('bx_timeline_menu_item_actions_all', 'bx_timeline', 'more-auto', '_sys_menu_item_title_system_va_more_auto', '_sys_menu_item_title_va_more_auto', 'javascript:void(0)', '', '', 'ellipsis-v', '', '', 0, 2147483647, 1, 0, 1, 9999);
+
+-- MENU: Item Counters (Comments, Votes, Reactions, etc)
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_timeline_menu_item_counters', '_bx_timeline_menu_title_item_counters', 'bx_timeline_menu_item_counters', 'bx_timeline', 15, 0, 1, 'BxTimelineMenuItemCounters', 'modules/boonex/timeline/classes/BxTimelineMenuItemCounters.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_timeline_menu_item_counters', 'bx_timeline', '_bx_timeline_menu_set_title_item_counters', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `submenu_popup`, `visible_for_levels`, `active`, `copyable`, `editable`, `order`) VALUES
+('bx_timeline_menu_item_counters', 'bx_timeline', 'item-vote', '_bx_timeline_menu_item_title_system_item_vote', '', 'javascript:void(0)', '', '', '', '', '', 0, 2147483647, 0, 0, 1, 0),
+('bx_timeline_menu_item_counters', 'bx_timeline', 'item-reaction', '_bx_timeline_menu_item_title_system_item_reaction', '', 'javascript:void(0)', '', '', '', '', '', 0, 2147483647, 1, 0, 1, 10),
+('bx_timeline_menu_item_counters', 'bx_timeline', 'item-score', '_bx_timeline_menu_item_title_system_item_score', '', 'javascript:void(0)', '', '', '', '', '', 0, 2147483647, 0, 0, 1, 20),
+('bx_timeline_menu_item_counters', 'bx_timeline', 'item-view', '_bx_timeline_menu_item_title_system_item_view', '', 'javascript:void(0)', '', '', '', '', '', 0, 2147483647, 0, 0, 1, 30),
+('bx_timeline_menu_item_counters', 'bx_timeline', 'item-comment', '_bx_timeline_menu_item_title_system_item_comment', '', 'javascript:void(0)', '', '', '', '', '', 0, 2147483647, 1, 0, 1, 40);
+
+-- MENU: Item Meta Info
+INSERT INTO `sys_objects_menu` (`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES
+('bx_timeline_menu_item_meta', '_sys_menu_title_snippet_meta', 'bx_timeline_menu_item_meta', 'bx_timeline', 15, 0, 1, 'BxTimelineMenuSnippetMeta', 'modules/boonex/timeline/classes/BxTimelineMenuSnippetMeta.php');
+
+INSERT INTO `sys_menu_sets` (`set_name`, `module`, `title`, `deletable`) VALUES
+('bx_timeline_menu_item_meta', 'bx_timeline', '_sys_menu_set_title_snippet_meta', 0);
+
+-- comment meta info menu
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `submenu_popup`, `visible_for_levels`, `active`, `copyable`, `editable`, `order`) VALUES 
+('bx_timeline_menu_item_meta', 'bx_timeline', 'date', '_sys_menu_item_title_system_sm_date', '_sys_menu_item_title_sm_date', '', '', '', '', '', '', 0, 2147483647, 1, 0, 1, 1),
+('bx_timeline_menu_item_meta', 'bx_timeline', 'membership', '_sys_menu_item_title_system_sm_membership', '_sys_menu_item_title_sm_membership', '', '', '', '', '', '', 0, 2147483647, 0, 0, 1, 2);
+
+-- MENU: Post form attachments (Link, Photo, Video)
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_timeline_menu_post_attachments', '_bx_timeline_menu_title_post_attachments', 'bx_timeline_menu_post_attachments', 'bx_timeline', 23, 0, 1, 'BxTimelineMenuPostAttachments', 'modules/boonex/timeline/classes/BxTimelineMenuPostAttachments.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_timeline_menu_post_attachments', 'bx_timeline', '_bx_timeline_menu_set_title_post_attachments', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `editable`, `order`) VALUES 
+('bx_timeline_menu_post_attachments', 'bx_timeline', 'add-emoji', '_bx_timeline_menu_item_title_system_add_emoji', '_bx_timeline_menu_item_title_add_emoji', 'javascript:void(0)', '', '_self', 'far smile', '', '', 2147483647, 0, 0, 1, 0),
+('bx_timeline_menu_post_attachments', 'bx_timeline', 'add-link', '_bx_timeline_menu_item_title_system_add_link', '_bx_timeline_menu_item_title_add_link', 'javascript:void(0)', 'javascript:{js_object}.showAttachLink(this);', '_self', 'link', '', '', 2147483647, 1, 0, 1, 1),
+('bx_timeline_menu_post_attachments', 'bx_timeline', 'add-photo-simple', '_bx_timeline_menu_item_title_system_add_photo_simple', '_bx_timeline_menu_item_title_add_photo', 'javascript:void(0)', 'javascript:{js_object_uploader_simple_photo}.showUploaderForm();', '_self', 'camera', '', '', 2147483647, 0, 0, 1, 2),
+('bx_timeline_menu_post_attachments', 'bx_timeline', 'add-photo-html5', '_bx_timeline_menu_item_title_system_add_photo_html5', '_bx_timeline_menu_item_title_add_photo', 'javascript:void(0)', 'javascript:{js_object_uploader_html5_photo}.showUploaderForm();', '_self', 'camera', '', '', 2147483647, 1, 0, 1, 3),
+('bx_timeline_menu_post_attachments', 'bx_timeline', 'add-video-simple', '_bx_timeline_menu_item_title_system_add_video_simple', '_bx_timeline_menu_item_title_add_video', 'javascript:void(0)', 'javascript:{js_object_uploader_simple_video}.showUploaderForm();', '_self', 'video', '', '', 2147483647, 0, 0, 1, 4),
+('bx_timeline_menu_post_attachments', 'bx_timeline', 'add-video-html5', '_bx_timeline_menu_item_title_system_add_video_html5', '_bx_timeline_menu_item_title_add_video', 'javascript:void(0)', 'javascript:{js_object_uploader_html5_video}.showUploaderForm();', '_self', 'video', '', '', 2147483647, 1, 0, 1, 5);
+
+-- MENU: add to "add content" menu
+SET @iAddMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_add_content_links' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_add_content_links', 'bx_timeline', 'create-item', '_bx_timeline_menu_item_title_system_create_entry', '_bx_timeline_menu_item_title_create_entry', 'page.php?i=timeline-view', '', '', 'far clock col-green1', '', 2147483647, 1, 1, IFNULL(@iAddMenuOrder, 0) + 1);
+
+-- MENU: add menu item to profiles modules (trigger* menu sets are processed separately upon modules enable/disable)
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('trigger_profile_view_submenu', 'bx_timeline', 'timeline-view', '_bx_timeline_menu_item_title_system_view_timeline_view', '_bx_timeline_menu_item_title_view_timeline_view', 'page.php?i=timeline-view&profile_id={profile_id}', '', '', 'far clock col-green1', '', 2147483647, 1, 0, 0),
+('trigger_group_view_submenu', 'bx_timeline', 'timeline-view', '_bx_timeline_menu_item_title_system_view_timeline_view', '_bx_timeline_menu_item_title_view_timeline_view', 'page.php?i=timeline-view&profile_id={profile_id}', '', '', 'far clock col-green1', '', 2147483647, 1, 0, 0);
+
+-- MENU: dashboard manage tools
+SET @iManageMenuOrder = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_menu_items` WHERE `set_name`='sys_account_dashboard_manage_tools' LIMIT 1);
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_account_dashboard_manage_tools', 'bx_timeline', 'timeline-administration', '_bx_timeline_menu_item_title_system_admt_timeline', '_bx_timeline_menu_item_title_admt_timeline', 'page.php?i=timeline-administration', '', '_self', 'clock', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:27:"get_menu_addon_manage_tools";}', '', 192, 1, 0, @iManageMenuOrder + 1);
+
+-- SETTINGS
+SET @iTypeOrder = (SELECT MAX(`order`) FROM `sys_options_types` WHERE `group` = 'modules');
+INSERT INTO `sys_options_types`(`group`, `name`, `caption`, `icon`, `order`) VALUES 
+('modules', 'bx_timeline', '_bx_timeline', 'bx_timeline@modules/boonex/timeline/|std-icon.svg', IF(ISNULL(@iTypeOrder), 1, @iTypeOrder + 1));
+SET @iTypeId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options_categories` (`type_id`, `name`, `caption`, `order`)
+VALUES (@iTypeId, 'bx_timeline', '_bx_timeline', 1);
+SET @iCategId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `check`, `check_params`, `check_error`, `extra`, `order`) VALUES
+-- View/Browse related settings
+('bx_timeline_enable_edit', 'on', @iCategId, '_bx_timeline_option_enable_edit', 'checkbox', '', '', '', '', 0),
+('bx_timeline_enable_delete', 'on', @iCategId, '_bx_timeline_option_enable_delete', 'checkbox', '', '', '', '', 1),
+('bx_timeline_enable_show_all', '', @iCategId, '_bx_timeline_option_enable_show_all', 'checkbox', '', '', '', '', 5),
+('bx_timeline_enable_count_all_views', '', @iCategId, '_bx_timeline_option_enable_count_all_views', 'checkbox', '', '', '', '', 6),
+('bx_timeline_events_per_page_profile', '12', @iCategId, '_bx_timeline_option_events_per_page_profile', 'digit', '', '', '', '', 10),
+('bx_timeline_events_per_page_account', '12', @iCategId, '_bx_timeline_option_events_per_page_account', 'digit', '', '', '', '', 11),
+('bx_timeline_events_per_page_home', '24', @iCategId, '_bx_timeline_option_events_per_page_home', 'digit', '', '', '', '', 12),
+('bx_timeline_events_per_page', '24', @iCategId, '_bx_timeline_option_events_per_page', 'digit', '', '', '', '', 13),
+('bx_timeline_enable_infinite_scroll', '', @iCategId, '_bx_timeline_option_enable_infinite_scroll', 'checkbox', '', '', '', '', 15),
+('bx_timeline_events_per_preload', '5', @iCategId, '_bx_timeline_option_events_per_preload', 'digit', '', '', '', '', 16),
+('bx_timeline_auto_preloads', '10', @iCategId, '_bx_timeline_option_auto_preloads', 'digit', '', '', '', '', 17),
+('bx_timeline_rss_length', '5', @iCategId, '_bx_timeline_option_rss_length', 'digit', '', '', '', '', 20),
+('bx_timeline_events_hide', '', @iCategId, '_bx_timeline_option_events_hide', 'rlist', '', '', '', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:21:"get_actions_checklist";}', 30),
+('bx_timeline_videos_autoplay', 'off', @iCategId, '_bx_timeline_option_videos_autoplay', 'select', '', '', '', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:27:"get_options_videos_autoplay";}', 50),
+('bx_timeline_preload_comments', '0', @iCategId, '_bx_timeline_option_preload_comments', 'digit', '', '', '', '', 51),
+('bx_timeline_enable_jump_to_switcher', '', @iCategId, '_bx_timeline_option_enable_jump_to_switcher', 'checkbox', '', '', '', '', 52),
+('bx_timeline_attachments_layout', 'gallery', @iCategId, '_bx_timeline_option_attachments_layout', 'select', '', '', '', 'a:2:{s:6:"module";s:11:"bx_timeline";s:6:"method";s:30:"get_options_attachments_layout";}', 53),
+('bx_timeline_enable_hot', 'on', @iCategId, '_bx_timeline_option_enable_hot', 'checkbox', '', '', '', '', 60),
+('bx_timeline_hot_interval', '48', @iCategId, '_bx_timeline_option_hot_interval', 'digit', '', '', '', '', 61),
+('bx_timeline_enable_cache_item', 'on', @iCategId, '_bx_timeline_option_enable_cache_item', 'checkbox', '', '', '', '', 70),
+('bx_timeline_cache_item_engine', 'File', @iCategId, '_bx_timeline_option_cache_item_engine', 'select', '', '', '', 'File,Memcache,APC,XCache', 71),
+('bx_timeline_cache_item_lifetime', '604800', @iCategId, '_bx_timeline_option_cache_item_lifetime', 'digit', '', '', '', '', 72),
+('bx_timeline_enable_cache_list', 'on', @iCategId, '_bx_timeline_option_enable_cache_list', 'checkbox', '', '', '', '', 73),
+
+-- Post related settings
+('bx_timeline_enable_editor_toolbar', '', @iCategId, '_bx_timeline_option_enable_editor_toolbar', 'checkbox', '', '', '', '', 100);
+
+
+-- PRIVACY 
+INSERT INTO `sys_objects_privacy` (`object`, `module`, `action`, `title`, `default_group`, `table`, `table_field_id`, `table_field_author`, `override_class_name`, `override_class_file`) VALUES
+('bx_timeline_privacy_view', 'bx_timeline', 'view', '_bx_timeline_privacy_view', '3', 'bx_timeline_events', 'id', 'owner_id', 'BxTimelinePrivacy', 'modules/boonex/timeline/classes/BxTimelinePrivacy.php');
+
+
+-- ACL
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_timeline', 'post', NULL, '_bx_timeline_acl_action_post', '', 1, 3);
+SET @iIdActionPost = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_timeline', 'edit', NULL, '_bx_timeline_acl_action_edit', '', 1, 3);
+SET @iIdActionEdit = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_timeline', 'delete', NULL, '_bx_timeline_acl_action_delete', '', 1, 3);
+SET @iIdActionDelete = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_timeline', 'vote', NULL, '_bx_timeline_acl_action_vote', '', 1, 0);
+SET @iIdActionVote = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_timeline', 'repost', NULL, '_bx_timeline_acl_action_repost', '', 1, 3);
+SET @iIdActionRepost = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_timeline', 'send', NULL, '_bx_timeline_acl_action_send', '', 1, 3);
+SET @iIdActionSend = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_timeline', 'pin', NULL, '_bx_timeline_acl_action_pin', '', 1, 3);
+SET @iIdActionPin = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_timeline', 'stick', NULL, '_bx_timeline_acl_action_stick', '', 1, 3);
+SET @iIdActionStick = LAST_INSERT_ID();
+
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_timeline', 'promote', NULL, '_bx_timeline_acl_action_promote', '', 1, 3);
+SET @iIdActionPromote = LAST_INSERT_ID();
+
+SET @iUnauthenticated = 1;
+SET @iAccount = 2;
+SET @iStandard = 3;
+SET @iUnconfirmed = 4;
+SET @iPending = 5;
+SET @iSuspended = 6;
+SET @iModerator = 7;
+SET @iAdministrator = 8;
+SET @iPremium = 9;
+
+INSERT INTO `sys_acl_matrix` (`IDLevel`, `IDAction`) VALUES
+
+-- post
+(@iStandard, @iIdActionPost),
+(@iModerator, @iIdActionPost),
+(@iAdministrator, @iIdActionPost),
+(@iPremium, @iIdActionPost),
+
+-- edit any post
+(@iModerator, @iIdActionEdit),
+(@iAdministrator, @iIdActionEdit),
+
+-- delete any post
+(@iModerator, @iIdActionDelete),
+(@iAdministrator, @iIdActionDelete),
+
+-- vote
+(@iStandard, @iIdActionVote),
+(@iModerator, @iIdActionVote),
+(@iAdministrator, @iIdActionVote),
+(@iPremium, @iIdActionVote),
+
+-- repost
+(@iStandard, @iIdActionRepost),
+(@iModerator, @iIdActionRepost),
+(@iAdministrator, @iIdActionRepost),
+(@iPremium, @iIdActionRepost),
+
+-- send
+(@iStandard, @iIdActionSend),
+(@iModerator, @iIdActionSend),
+(@iAdministrator, @iIdActionSend),
+(@iPremium, @iIdActionSend),
+
+-- pin any post
+(@iModerator, @iIdActionPin),
+(@iAdministrator, @iIdActionPin),
+
+-- stick any post
+(@iModerator, @iIdActionStick),
+(@iAdministrator, @iIdActionStick),
+
+-- promote any post
+(@iModerator, @iIdActionPromote),
+(@iAdministrator, @iIdActionPromote);
+
+
+-- ALERTS
+INSERT INTO `sys_alerts_handlers`(`name`, `class`, `file`, `service_call`) VALUES 
+('bx_timeline', 'BxTimelineResponse', 'modules/boonex/timeline/classes/BxTimelineResponse.php', '');
+SET @iHandler := LAST_INSERT_ID();
+
+INSERT INTO `sys_alerts` (`unit`, `action`, `handler_id`) VALUES
+('system', 'clear_cache', @iHandler),
+('profile', 'delete', @iHandler),
+
+('bx_timeline_videos_mp4', 'transcoded', @iHandler);
+
+
+-- SEARCH
+SET @iSearchOrder = (SELECT IFNULL(MAX(`Order`), 0) FROM `sys_objects_search`);
+INSERT INTO `sys_objects_search` (`ObjectName`, `Title`, `Order`, `ClassName`, `ClassPath`) VALUES
+('bx_timeline', '_bx_timeline', @iSearchOrder + 1, 'BxTimelineSearchResult', 'modules/boonex/timeline/classes/BxTimelineSearchResult.php'),
+('bx_timeline_cmts', '_bx_timeline_cmts', @iSearchOrder + 2, 'BxTimelineCmtsSearchResult', 'modules/boonex/timeline/classes/BxTimelineCmtsSearchResult.php');
+
+
+-- GRIDS: moderation tools
+INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `field_active`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_fields_translatable`, `filter_mode`, `sorting_fields`, `sorting_fields_translatable`, `visible_for_levels`, `override_class_name`, `override_class_file`) VALUES
+('bx_timeline_administration', 'Sql', 'SELECT * FROM `bx_timeline_events` WHERE 1 AND `active`=''1'' ', 'bx_timeline_events', 'id', 'date', 'status', '', 20, NULL, 'start', '', 'title,description', '', 'like', 'reports', '', 192, 'BxTimelineGridAdministration', 'modules/boonex/timeline/classes/BxTimelineGridAdministration.php');
+
+INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `order`) VALUES
+('bx_timeline_administration', 'checkbox', '_sys_select', '2%', 0, '', '', 1),
+('bx_timeline_administration', 'switcher', '_bx_timeline_grid_column_title_adm_active', '8%', 0, '', '', 2),
+('bx_timeline_administration', 'reports', '_sys_txt_reports_title', '5%', 0, '', '', 3),
+('bx_timeline_administration', 'description', '_bx_timeline_grid_column_title_adm_description', '25%', 0, '25', '', 4),
+('bx_timeline_administration', 'date', '_bx_timeline_grid_column_title_adm_added', '20%', 1, '25', '', 5),
+('bx_timeline_administration', 'owner_id', '_bx_timeline_grid_column_title_adm_author', '20%', 0, '25', '', 6),
+('bx_timeline_administration', 'actions', '', '20%', 0, '', '', 7);
+
+INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon_only`, `confirm`, `order`) VALUES
+('bx_timeline_administration', 'bulk', 'delete', '_bx_timeline_grid_action_title_adm_delete', '', 0, 1, 1),
+('bx_timeline_administration', 'single', 'delete', '_bx_timeline_grid_action_title_adm_delete', 'remove', 1, 1, 2),
+('bx_timeline_administration', 'single', 'audit_content', '_bx_timeline_grid_action_title_adm_audit_content', 'search', 1, 0, 4);
+
+-- METATAGS
+INSERT INTO `sys_objects_metatags` (`object`, `table_keywords`, `table_locations`, `table_mentions`, `override_class_name`, `override_class_file`) VALUES
+('bx_timeline', 'bx_timeline_meta_keywords', 'bx_timeline_meta_locations', 'bx_timeline_meta_mentions', '', '');
+
+
+-- EMAIL TEMPLATES
+INSERT INTO `sys_email_templates` (`Module`, `NameSystem`, `Name`, `Subject`, `Body`) VALUES 
+('bx_timeline', '_bx_timeline_et_txt_name_send', 'bx_timeline_send', '_bx_timeline_et_txt_subject_send', '_bx_timeline_et_txt_body_send');
+
+
+-- CRON
+INSERT INTO `sys_cron_jobs` (`name`, `time`, `class`, `file`, `service_call`) VALUES
+('bx_timeline_hot', '0 * * * *', 'BxTimelineCronHot', 'modules/boonex/timeline/classes/BxTimelineCronHot.php', ''),
+('bx_timeline_publishing', '* * * * *', 'BxTimelineCronPublishing', 'modules/boonex/timeline/classes/BxTimelineCronPublishing.php', '');
+
+
+-- PRELOADER
+SET @iOrderPreloader = (SELECT IFNULL(MAX(`order`), 9999) FROM `sys_preloader` WHERE `type`='js_system' AND `order` > 9999 LIMIT 1);
+INSERT INTO `sys_preloader`(`module`, `type`, `content`, `active`, `order`) VALUES
+('bx_timeline', 'js_system', 'modernizr.min.js', 1, @iOrderPreloader + 1);

+ 501 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/source/install/sql/install.sql

@@ -0,0 +1,501 @@
+SET @sName = 'bx_timeline';
+
+-- TABLES
+CREATE TABLE IF NOT EXISTS `bx_timeline_events` (
+  `id` int(11) NOT NULL auto_increment,
+  `owner_id` int(11) NOT NULL default '0',
+  `system` tinyint(4) NOT NULL default '1',
+  `type` varchar(255) NOT NULL,
+  `action` varchar(255) NOT NULL,
+  `object_id` int(11) NOT NULL default '0',
+  `object_privacy_view` varchar(16) NOT NULL default '3',
+  `content` text NOT NULL,
+  `title` varchar(255) NOT NULL,
+  `description` text NOT NULL,
+  `location` text NOT NULL,
+  `views` int(11) unsigned NOT NULL default '0',
+  `rate` float NOT NULL default '0',
+  `votes` int(11) unsigned NOT NULL default '0',
+  `rrate` float NOT NULL default '0',
+  `rvotes` int(11) NOT NULL default '0',
+  `score` int(11) NOT NULL default '0',
+  `sc_up` int(11) NOT NULL default '0',
+  `sc_down` int(11) NOT NULL default '0',
+  `comments` int(11) unsigned NOT NULL default '0',
+  `reports` int(11) unsigned NOT NULL default '0',
+  `reposts` int(11) unsigned NOT NULL default '0',
+  `date` int(11) NOT NULL default '0',
+  `published` int(11) NOT NULL default '0',
+  `status` enum ('active', 'awaiting', 'failed', 'hidden', 'deleted') NOT NULL DEFAULT 'active',
+  `active` tinyint(4) NOT NULL default '1',
+  `pinned` int(11) NOT NULL default '0',
+  `sticked` int(11) NOT NULL default '0',
+  `promoted` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  KEY `owner_id` (`owner_id`),
+  KEY `object_id` (`object_id`),
+  FULLTEXT KEY `search_fields` (`title`, `description`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_timeline_handlers` (
+  `id` int(11) NOT NULL auto_increment,
+  `group` varchar(64) NOT NULL default '',
+  `type` enum('insert','update','delete') NOT NULL DEFAULT 'insert',
+  `alert_unit` varchar(64) NOT NULL default '',
+  `alert_action` varchar(64) NOT NULL default '',
+  `content` text NOT NULL,
+  `privacy` varchar(64) NOT NULL default '',
+  PRIMARY KEY  (`id`),
+  UNIQUE `handler` (`group`, `type`),
+  UNIQUE `alert` (`alert_unit`, `alert_action`)
+);
+
+INSERT INTO `bx_timeline_handlers`(`group`, `type`, `alert_unit`, `alert_action`, `content`) VALUES
+('common_post', 'insert', 'timeline_common_post', '', ''),
+('common_repost', 'insert', 'timeline_common_repost', '', ''),
+('profile', 'delete', 'profile', 'delete', '');
+
+CREATE TABLE IF NOT EXISTS `bx_timeline_cache` (
+  `type` varchar(32) NOT NULL default '',
+  `context_id` int(11) NOT NULL default '0',
+  `profile_id` int(11) NOT NULL default '0',
+  `event_id` int(11) NOT NULL default '0',
+  `date` int(11) NOT NULL default '0',
+  PRIMARY KEY `item` (`type`, `context_id`, `profile_id`, `event_id`)
+);
+
+-- TABLES: STORAGES, TRANSCODERS, UPLOADERS
+CREATE TABLE IF NOT EXISTS `bx_timeline_photos` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(128) NOT NULL,
+  `path` varchar(255) NOT NULL,
+  `file_name` varchar(255) NOT NULL,
+  `mime_type` varchar(128) NOT NULL,
+  `ext` varchar(32) NOT NULL,
+  `size` bigint(20) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_timeline_photos_processed` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(128) NOT NULL,
+  `path` varchar(255) NOT NULL,
+  `file_name` varchar(255) NOT NULL,
+  `mime_type` varchar(128) NOT NULL,
+  `ext` varchar(32) NOT NULL,
+  `size` bigint(20) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_timeline_photos2events` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `event_id` int(11) NOT NULL DEFAULT '0',
+  `media_id` int(11) NOT NULL DEFAULT '0',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `media` (`event_id`, `media_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_timeline_videos` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(128) NOT NULL,
+  `path` varchar(255) NOT NULL,
+  `file_name` varchar(255) NOT NULL,
+  `mime_type` varchar(128) NOT NULL,
+  `ext` varchar(32) NOT NULL,
+  `size` bigint(20) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_timeline_videos_processed` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(128) NOT NULL,
+  `path` varchar(255) NOT NULL,
+  `file_name` varchar(255) NOT NULL,
+  `mime_type` varchar(128) NOT NULL,
+  `ext` varchar(32) NOT NULL,
+  `size` bigint(20) NOT NULL,
+  `added` int(11) NOT NULL,
+  `modified` int(11) NOT NULL,
+  `private` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `remote_id` (`remote_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_timeline_videos2events` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `event_id` int(11) NOT NULL DEFAULT '0',
+  `media_id` int(11) NOT NULL DEFAULT '0',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `media` (`event_id`, `media_id`)
+);
+
+-- TABLES: LINKS
+CREATE TABLE IF NOT EXISTS `bx_timeline_links` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `media_id` int(11) NOT NULL DEFAULT '0',
+  `url` varchar(255) NOT NULL,
+  `title` varchar(255) NOT NULL,
+  `text` text NOT NULL,
+  `added` int(11) NOT NULL,
+  PRIMARY KEY (`id`),
+  KEY `profile_id` (`profile_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_timeline_links2events` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `event_id` int(11) NOT NULL DEFAULT '0',
+  `link_id` int(11) NOT NULL DEFAULT '0',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `link` (`link_id`, `event_id`)
+);
+
+-- TABLES: REPOSTS
+CREATE TABLE IF NOT EXISTS `bx_timeline_reposts_track` (
+  `event_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `author_nip` int(11) unsigned NOT NULL default '0',
+  `reposted_id` int(11) NOT NULL default '0',
+  `date` int(11) NOT NULL default '0',
+  UNIQUE KEY `event_id` (`event_id`),
+  KEY `repost` (`reposted_id`, `author_nip`)
+);
+
+-- TABLES: COMMENTS
+CREATE TABLE IF NOT EXISTS `bx_timeline_comments` (
+  `cmt_id` int(11) NOT NULL AUTO_INCREMENT,
+  `cmt_parent_id` int(11) NOT NULL DEFAULT '0',
+  `cmt_vparent_id` int(11) NOT NULL DEFAULT '0',
+  `cmt_object_id` int(11) NOT NULL DEFAULT '0',
+  `cmt_author_id` int(11) NOT NULL DEFAULT '0',
+  `cmt_level` int(11) NOT NULL DEFAULT '0',
+  `cmt_text` text NOT NULL,
+  `cmt_time` int(11) unsigned NOT NULL DEFAULT '0',
+  `cmt_replies` int(11) NOT NULL DEFAULT '0',
+  PRIMARY KEY (`cmt_id`),
+  KEY `cmt_object_id` (`cmt_object_id`,`cmt_parent_id`),
+  FULLTEXT KEY `search_fields` (`cmt_text`)
+);
+
+-- TABLE: views
+CREATE TABLE IF NOT EXISTS `bx_timeline_views_track` (
+  `object_id` int(11) NOT NULL default '0',
+  `viewer_id` int(11) NOT NULL default '0',
+  `viewer_nip` int(11) unsigned NOT NULL default '0',
+  `date` int(11) NOT NULL default '0',
+  KEY `id` (`object_id`,`viewer_id`,`viewer_nip`)
+);
+
+-- TABLES: VOTES
+CREATE TABLE IF NOT EXISTS `bx_timeline_votes` (
+  `object_id` int(11) NOT NULL default '0',
+  `count` int(11) NOT NULL default '0',
+  `sum` int(11) NOT NULL default '0',
+  UNIQUE KEY `object_id` (`object_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_timeline_votes_track` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `object_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `author_nip` int(11) unsigned NOT NULL default '0',
+  `value` tinyint(4) NOT NULL default '0',
+  `date` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  KEY `vote` (`object_id`, `author_nip`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_timeline_reactions` (
+  `object_id` int(11) NOT NULL default '0',
+  `reaction` varchar(32) NOT NULL default '',
+  `count` int(11) NOT NULL default '0',
+  `sum` int(11) NOT NULL default '0',
+  UNIQUE KEY `reaction` (`object_id`, `reaction`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_timeline_reactions_track` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `object_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `author_nip` int(11) unsigned NOT NULL default '0',
+  `reaction` varchar(32) NOT NULL default '',
+  `value` tinyint(4) NOT NULL default '0',
+  `date` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  KEY `vote` (`object_id`, `author_nip`)
+);
+
+-- TABLE: metas
+CREATE TABLE IF NOT EXISTS `bx_timeline_meta_keywords` (
+  `object_id` int(10) unsigned NOT NULL,
+  `keyword` varchar(255) NOT NULL,
+  KEY `object_id` (`object_id`),
+  KEY `keyword` (`keyword`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_timeline_meta_locations` (
+  `object_id` int(10) unsigned NOT NULL,
+  `lat` double NOT NULL,
+  `lng` double NOT NULL,
+  `country` varchar(2) NOT NULL,
+  `state` varchar(255) NOT NULL,
+  `city` varchar(255) NOT NULL,
+  `zip` varchar(255) NOT NULL,
+  `street` varchar(255) NOT NULL,
+  `street_number` varchar(255) NOT NULL,
+  PRIMARY KEY (`object_id`),
+  KEY `country_state_city` (`country`,`state`(8),`city`(8))
+);
+
+CREATE TABLE IF NOT EXISTS `bx_timeline_meta_mentions` (
+  `object_id` int(10) unsigned NOT NULL,
+  `profile_id` int(10) unsigned NOT NULL,
+  KEY `object_id` (`object_id`),
+  KEY `profile_id` (`profile_id`)
+);
+
+-- TABLE: reports
+CREATE TABLE IF NOT EXISTS `bx_timeline_reports` (
+  `object_id` int(11) NOT NULL default '0',
+  `count` int(11) NOT NULL default '0',
+  UNIQUE KEY `object_id` (`object_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_timeline_reports_track` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `object_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `author_nip` int(11) unsigned NOT NULL default '0',
+  `type` varchar(32) NOT NULL default '',
+  `text` text NOT NULL default '',
+  `date` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  KEY `report` (`object_id`, `author_nip`)
+);
+
+-- TABLE: hot track
+CREATE TABLE IF NOT EXISTS `bx_timeline_hot_track` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `event_id` int(11) NOT NULL default '0',
+  `value` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `event_id` (`event_id`)
+);
+
+-- TABLE: scores
+CREATE TABLE IF NOT EXISTS `bx_timeline_scores` (
+  `object_id` int(11) NOT NULL default '0',
+  `count_up` int(11) NOT NULL default '0',
+  `count_down` int(11) NOT NULL default '0',
+  UNIQUE KEY `object_id` (`object_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_timeline_scores_track` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `object_id` int(11) NOT NULL default '0',
+  `author_id` int(11) NOT NULL default '0',
+  `author_nip` int(11) unsigned NOT NULL default '0',
+  `type` varchar(8) NOT NULL default '',
+  `date` int(11) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  KEY `vote` (`object_id`, `author_nip`)
+);
+
+
+-- STORAGES, TRANSCODERS, UPLOADERS
+SET @sStorageEngine = (SELECT `value` FROM `sys_options` WHERE `name` = 'sys_storage_default');
+
+INSERT INTO `sys_objects_uploader` (`object`, `active`, `override_class_name`, `override_class_file`) VALUES
+('bx_timeline_simple_photo', 1, 'BxTimelineUploaderSimpleAttach', 'modules/boonex/timeline/classes/BxTimelineUploaderSimpleAttach.php'),
+('bx_timeline_simple_video', 1, 'BxTimelineUploaderSimpleAttach', 'modules/boonex/timeline/classes/BxTimelineUploaderSimpleAttach.php'),
+('bx_timeline_html5_photo', 1, 'BxTimelineUploaderHTML5Attach', 'modules/boonex/timeline/classes/BxTimelineUploaderHTML5Attach.php'),
+('bx_timeline_html5_video', 1, 'BxTimelineUploaderHTML5Attach', 'modules/boonex/timeline/classes/BxTimelineUploaderHTML5Attach.php');
+
+INSERT INTO `sys_objects_storage` (`object`, `engine`, `params`, `token_life`, `cache_control`, `levels`, `table_files`, `ext_mode`, `ext_allow`, `ext_deny`, `quota_size`, `current_size`, `quota_number`, `current_number`, `max_file_size`, `ts`) VALUES
+('bx_timeline_photos', @sStorageEngine, '', 360, 2592000, 3, 'bx_timeline_photos', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0),
+('bx_timeline_photos_processed', @sStorageEngine, '', 360, 2592000, 3, 'bx_timeline_photos_processed', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0),
+
+('bx_timeline_videos', @sStorageEngine, '', 360, 2592000, 3, 'bx_timeline_videos', 'allow-deny', 'avi,flv,mpg,mpeg,wmv,mp4,m4v,mov,qt,divx,xvid,3gp,3g2,webm,mkv,ogv,ogg,rm,rmvb,asf,drc', '', 0, 0, 0, 0, 0, 0),
+('bx_timeline_videos_processed', @sStorageEngine, '', 360, 2592000, 3, 'bx_timeline_videos_processed', 'allow-deny', 'jpg,jpeg,jpe,gif,png,avi,flv,mpg,mpeg,wmv,mp4,m4v,mov,qt,divx,xvid,3gp,3g2,webm,mkv,ogv,ogg,rm,rmvb,asf,drc', '', 0, 0, 0, 0, 0, 0);
+
+INSERT INTO `sys_objects_transcoder` (`object`, `storage_object`, `source_type`, `source_params`, `private`, `atime_tracking`, `atime_pruning`, `ts`, `override_class_name`, `override_class_file`) VALUES
+('bx_timeline_photos_preview', 'bx_timeline_photos_processed', 'Storage', 'a:1:{s:6:"object";s:18:"bx_timeline_photos";}', 'no', '1', '2592000', '0', '', ''),
+('bx_timeline_photos_view', 'bx_timeline_photos_processed', 'Storage', 'a:1:{s:6:"object";s:18:"bx_timeline_photos";}', 'no', '1', '2592000', '0', '', ''),
+('bx_timeline_photos_medium', 'bx_timeline_photos_processed', 'Storage', 'a:1:{s:6:"object";s:18:"bx_timeline_photos";}', 'no', '1', '2592000', '0', '', ''),
+('bx_timeline_photos_big', 'bx_timeline_photos_processed', 'Storage', 'a:1:{s:6:"object";s:18:"bx_timeline_photos";}', 'no', '1', '2592000', '0', '', ''),
+
+('bx_timeline_videos_poster', 'bx_timeline_videos_processed', 'Storage', 'a:1:{s:6:"object";s:18:"bx_timeline_videos";}', 'no', '0', '0', '0', 'BxDolTranscoderVideo', ''),
+('bx_timeline_videos_mp4', 'bx_timeline_videos_processed', 'Storage', 'a:1:{s:6:"object";s:18:"bx_timeline_videos";}', 'no', '0', '0', '0', 'BxDolTranscoderVideo', ''),
+('bx_timeline_videos_mp4_hd', 'bx_timeline_videos_processed', 'Storage', 'a:1:{s:6:"object";s:18:"bx_timeline_videos";}', 'no', '0', '0', '0', 'BxDolTranscoderVideo', '');
+
+INSERT INTO `sys_transcoder_filters` (`transcoder_object`, `filter`, `filter_params`, `order`) VALUES
+('bx_timeline_photos_preview', 'Resize', 'a:3:{s:1:"w";s:3:"100";s:1:"h";s:3:"100";s:13:"square_resize";s:1:"1";}', '0'),
+('bx_timeline_photos_view', 'Resize', 'a:1:{s:1:"w";s:3:"300";}', '0'),
+('bx_timeline_photos_medium', 'Resize', 'a:1:{s:1:"w";s:3:"600";}', '0'),
+('bx_timeline_photos_big', 'Resize', 'a:2:{s:1:"w";s:4:"1200";s:1:"h";s:4:"1200";}', '0'),
+
+('bx_timeline_videos_poster', 'Poster', 'a:2:{s:1:"h";s:3:"318";s:10:"force_type";s:3:"jpg";}', 0),
+('bx_timeline_videos_mp4', 'Mp4', 'a:2:{s:1:"h";s:3:"318";s:10:"force_type";s:3:"mp4";}', 0),
+('bx_timeline_videos_mp4_hd', 'Mp4', 'a:3:{s:1:"h";s:3:"720";s:13:"video_bitrate";s:4:"1536";s:10:"force_type";s:3:"mp4";}', 0);
+
+
+-- Forms -> Post
+INSERT INTO `sys_objects_form` (`object`, `module`, `title`, `action`, `form_attrs`, `submit_name`, `table`, `key`, `uri`, `uri_title`, `params`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES
+('bx_timeline_post', @sName, '_bx_timeline_form_post', '', '', 'tlb_do_submit', 'bx_timeline_events', 'id', '', '', '', 0, 1, 'BxTimelineFormPost', 'modules/boonex/timeline/classes/BxTimelineFormPost.php');
+
+INSERT INTO `sys_form_displays` (`display_name`, `module`, `object`, `title`, `view_mode`) VALUES
+('bx_timeline_post_add', @sName, 'bx_timeline_post', '_bx_timeline_form_post_display_add', 0),
+('bx_timeline_post_add_public', @sName, 'bx_timeline_post', '_bx_timeline_form_post_display_add_public', 0),
+('bx_timeline_post_add_profile', @sName, 'bx_timeline_post', '_bx_timeline_form_post_display_add_profile', 0),
+
+('bx_timeline_post_edit', @sName, 'bx_timeline_post', '_bx_timeline_form_post_display_edit', 0),
+
+('bx_timeline_post_view', @sName, 'bx_timeline_post', '_bx_timeline_form_post_display_view', 1);
+
+INSERT INTO `sys_form_inputs` (`object`, `module`, `name`, `value`, `values`, `checked`, `type`, `caption_system`, `caption`, `info`, `required`, `collapsed`, `html`, `attrs`, `attrs_tr`, `attrs_wrapper`, `checker_func`, `checker_params`, `checker_error`, `db_pass`, `db_params`, `editable`, `deletable`) VALUES
+('bx_timeline_post', @sName, 'type', 'post', '', 0, 'hidden', '_bx_timeline_form_post_input_sys_type', '', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
+('bx_timeline_post', @sName, 'action', '', '', 0, 'hidden', '_bx_timeline_form_post_input_sys_action', '', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
+('bx_timeline_post', @sName, 'owner_id', '0', '', 0, 'hidden', '_bx_timeline_form_post_input_sys_owner_id', '', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 1, 0),
+('bx_timeline_post', @sName, 'text', '', '', 0, 'textarea', '_bx_timeline_form_post_input_sys_text', '_bx_timeline_form_post_input_text', '', 0, 0, 3, 'a:1:{s:12:"autocomplete";s:3:"off";}', '', '', '', '', '', 'XssHtml', '', 1, 0),
+('bx_timeline_post', @sName, 'anonymous', '', '', 0, 'switcher', '_sys_form_input_sys_anonymous', '_sys_form_input_anonymous', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_timeline_post', @sName, 'date', '', '', 0, 'datetime', '_bx_timeline_form_post_input_sys_date', '_bx_timeline_form_post_input_date', '', 0, 0, 0, '', '', '', '', '', '', 'DateTimeUtc', '', 1, 0),
+('bx_timeline_post', @sName, 'published', '', '', 0, 'datetime', '_bx_timeline_form_post_input_sys_date_published', '_bx_timeline_form_post_input_date_published', '_bx_timeline_form_post_input_date_published_info', 0, 0, 0, '', '', '', '', '', '', 'DateTimeUtc', '', 1, 0),
+('bx_timeline_post', @sName, 'object_privacy_view', '', '', 0, 'custom', '_bx_timeline_form_post_input_sys_object_privacy_view', '_bx_timeline_form_post_input_object_privacy_view', '', 1, 0, 0, '', '', '', '', '', '', '', '', 0, 0),
+('bx_timeline_post', @sName, 'location', '', '', 0, 'location', '_sys_form_input_sys_location', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_timeline_post', @sName, 'link', '', '', 0, 'custom', '_bx_timeline_form_post_input_sys_link', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_timeline_post', @sName, 'photo', 'a:1:{i:0;s:23:"bx_timeline_html5_photo";}', 'a:2:{s:24:"bx_timeline_simple_photo";s:26:"_sys_uploader_simple_title";s:23:"bx_timeline_html5_photo";s:25:"_sys_uploader_html5_title";}', 0, 'files', '_bx_timeline_form_post_input_sys_photo', '_bx_timeline_form_post_input_photo', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_timeline_post', @sName, 'video', 'a:1:{i:0;s:23:"bx_timeline_html5_video";}', 'a:2:{s:24:"bx_timeline_simple_video";s:26:"_sys_uploader_simple_title";s:23:"bx_timeline_html5_video";s:25:"_sys_uploader_html5_title";}', 0, 'files', '_bx_timeline_form_post_input_sys_video', '_bx_timeline_form_post_input_video', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_timeline_post', @sName, 'attachments', '', '', 0, 'custom', '_bx_timeline_form_post_input_sys_attachments', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_timeline_post', @sName, 'controls', '', 'tlb_do_submit,tlb_do_cancel', 0, 'input_set', '', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 0, 0),
+('bx_timeline_post', @sName, 'tlb_do_submit', '_bx_timeline_form_post_input_do_submit', '', 0, 'submit', '_bx_timeline_form_post_input_sys_do_submit', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 0, 0),
+('bx_timeline_post', @sName, 'tlb_do_cancel', '_bx_timeline_form_post_input_do_cancel', '', 0, 'button', '_bx_timeline_form_post_input_sys_do_cancel', '', '', 0, 0, 0, 'a:2:{s:7:"onclick";s:51:"{js_object_view}.editPostCancel(this, {content_id})";s:5:"class";s:22:"bx-def-margin-sec-left";}', '', '', '', '', '', '', '', 0, 0);
+
+INSERT INTO `sys_form_display_inputs` (`display_name`, `input_name`, `visible_for_levels`, `active`, `order`) VALUES
+('bx_timeline_post_add', 'type', 2147483647, 1, 0),
+('bx_timeline_post_add', 'action', 2147483647, 1, 1),
+('bx_timeline_post_add', 'text', 2147483647, 1, 2),
+('bx_timeline_post_add', 'attachments', 2147483647, 1, 3),
+('bx_timeline_post_add', 'owner_id', 2147483647, 1, 4),
+('bx_timeline_post_add', 'object_privacy_view', 2147483647, 1, 5),
+('bx_timeline_post_add', 'published', 192, 1, 6),
+('bx_timeline_post_add', 'location', 2147483647, 1, 7),
+('bx_timeline_post_add', 'link', 2147483647, 1, 8),
+('bx_timeline_post_add', 'photo', 2147483647, 1, 9),
+('bx_timeline_post_add', 'video', 2147483647, 1, 10),
+('bx_timeline_post_add', 'tlb_do_submit', 2147483647, 1, 11),
+
+('bx_timeline_post_add_public', 'type', 2147483647, 1, 0),
+('bx_timeline_post_add_public', 'action', 2147483647, 1, 1),
+('bx_timeline_post_add_public', 'owner_id', 2147483647, 1, 2),
+('bx_timeline_post_add_public', 'text', 2147483647, 1, 3),
+('bx_timeline_post_add_public', 'attachments', 2147483647, 1, 4),
+('bx_timeline_post_add_public', 'object_privacy_view', 2147483647, 1, 5),
+('bx_timeline_post_add_public', 'published', 192, 1, 6),
+('bx_timeline_post_add_public', 'location', 2147483647, 1, 7),
+('bx_timeline_post_add_public', 'link', 2147483647, 1, 8),
+('bx_timeline_post_add_public', 'photo', 2147483647, 1, 9),
+('bx_timeline_post_add_public', 'video', 2147483647, 1, 10),
+('bx_timeline_post_add_public', 'tlb_do_submit', 2147483647, 1, 11),
+
+('bx_timeline_post_add_profile', 'type', 2147483647, 1, 0),
+('bx_timeline_post_add_profile', 'action', 2147483647, 1, 1),
+('bx_timeline_post_add_profile', 'owner_id', 2147483647, 1, 2),
+('bx_timeline_post_add_profile', 'text', 2147483647, 1, 3),
+('bx_timeline_post_add_profile', 'attachments', 2147483647, 1, 4),
+('bx_timeline_post_add_profile', 'object_privacy_view', 2147483647, 1, 5),
+('bx_timeline_post_add_profile', 'published', 192, 1, 6),
+('bx_timeline_post_add_profile', 'location', 2147483647, 1, 7),
+('bx_timeline_post_add_profile', 'link', 2147483647, 1, 8),
+('bx_timeline_post_add_profile', 'photo', 2147483647, 1, 9),
+('bx_timeline_post_add_profile', 'video', 2147483647, 1, 10),
+('bx_timeline_post_add_profile', 'tlb_do_submit', 2147483647, 1, 11),
+
+('bx_timeline_post_edit', 'type', 2147483647, 1, 1),
+('bx_timeline_post_edit', 'action', 2147483647, 1, 2),
+('bx_timeline_post_edit', 'owner_id', 2147483647, 1, 3),
+('bx_timeline_post_edit', 'text', 2147483647, 1, 4),
+('bx_timeline_post_edit', 'published', 192, 1, 5),
+('bx_timeline_post_edit', 'location', 2147483647, 1, 6),
+('bx_timeline_post_edit', 'controls', 2147483647, 1, 7),
+('bx_timeline_post_edit', 'tlb_do_submit', 2147483647, 1, 8),
+('bx_timeline_post_edit', 'tlb_do_cancel', 2147483647, 1, 9);
+
+-- Forms -> Attach link
+INSERT INTO `sys_objects_form` (`object`, `module`, `title`, `action`, `form_attrs`, `submit_name`, `table`, `key`, `uri`, `uri_title`, `params`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES
+('bx_timeline_attach_link', @sName, '_bx_timeline_form_attach_link', '', '', 'do_submit', 'bx_timeline_links', 'id', '', '', '', 0, 1, '', '');
+
+INSERT INTO `sys_form_displays` (`display_name`, `module`, `object`, `title`, `view_mode`) VALUES
+('bx_timeline_attach_link_add', @sName, 'bx_timeline_attach_link', '_bx_timeline_form_attach_link_display_add', 0);
+
+INSERT INTO `sys_form_inputs` (`object`, `module`, `name`, `value`, `values`, `checked`, `type`, `caption_system`, `caption`, `info`, `required`, `collapsed`, `html`, `attrs`, `attrs_tr`, `attrs_wrapper`, `checker_func`, `checker_params`, `checker_error`, `db_pass`, `db_params`, `editable`, `deletable`) VALUES
+('bx_timeline_attach_link', @sName, 'url', '', '', 0, 'text', '_bx_timeline_form_attach_link_input_sys_url', '_bx_timeline_form_attach_link_input_url', '', 0, 0, 0, '', '', '', 'Preg', 'a:1:{s:4:"preg";s:0:"";}', '_bx_timeline_form_attach_link_input_url_err', '', '', 0, 0),
+('bx_timeline_attach_link', @sName, 'controls', '', 'do_submit,do_cancel', 0, 'input_set', '', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 0, 0),
+('bx_timeline_attach_link', @sName, 'do_submit', '_bx_timeline_form_attach_link_input_do_submit', '', 0, 'submit', '_bx_timeline_form_attach_link_input_sys_do_submit', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 0, 0),
+('bx_timeline_attach_link', @sName, 'do_cancel', '_bx_timeline_form_attach_link_input_do_cancel', '', 0, 'button', '_bx_timeline_form_attach_link_input_do_cancel', '', '', 0, 0, 0, 'a:2:{s:7:"onclick";s:45:"$(''.bx-popup-applied:visible'').dolPopupHide()";s:5:"class";s:22:"bx-def-margin-sec-left";}', '', '', '', '', '', '', '', 0, 0);
+
+INSERT INTO `sys_form_display_inputs` (`display_name`, `input_name`, `visible_for_levels`, `active`, `order`) VALUES
+('bx_timeline_attach_link_add', 'url', 2147483647, 1, 1),
+('bx_timeline_attach_link_add', 'controls', 2147483647, 1, 2),
+('bx_timeline_attach_link_add', 'do_submit', 2147483647, 1, 3),
+('bx_timeline_attach_link_add', 'do_cancel', 2147483647, 1, 4);
+
+
+-- COMMENTS
+INSERT INTO `sys_objects_cmts` (`Name`, `Module`, `Table`, `CharsPostMin`, `CharsPostMax`, `CharsDisplayMax`, `Html`, `PerView`, `PerViewReplies`, `BrowseType`, `IsBrowseSwitch`, `PostFormPosition`, `NumberOfLevels`, `IsDisplaySwitch`, `IsRatable`, `ViewingThreshold`, `IsOn`, `RootStylePrefix`, `BaseUrl`, `ObjectVote`, `TriggerTable`, `TriggerFieldId`, `TriggerFieldAuthor`, `TriggerFieldTitle`, `TriggerFieldComments`, `ClassName`, `ClassFile`) VALUES
+('bx_timeline', 'bx_timeline', 'bx_timeline_comments', 1, 5000, 1000, 3, 5, 3, 'tail', 1, 'bottom', 1, 1, 1, -3, 1, 'cmt', 'page.php?i=item&id={object_id}', '', 'bx_timeline_events', 'id', 'object_id', 'title', 'comments', '', '');
+
+
+-- VIEWS
+INSERT INTO `sys_objects_view` (`name`, `table_track`, `period`, `is_on`, `trigger_table`, `trigger_field_id`, `trigger_field_author`, `trigger_field_count`, `class_name`, `class_file`) VALUES 
+('bx_timeline', 'bx_timeline_views_track', '86400', '1', 'bx_timeline_events', 'id', 'object_id', 'views', '', '');
+
+
+-- VOTES
+INSERT INTO `sys_objects_vote`(`Name`, `TableMain`, `TableTrack`, `PostTimeout`, `MinValue`, `MaxValue`, `IsUndo`, `IsOn`, `TriggerTable`, `TriggerFieldId`, `TriggerFieldAuthor`, `TriggerFieldRate`, `TriggerFieldRateCount`, `ClassName`, `ClassFile`) VALUES 
+('bx_timeline', 'bx_timeline_votes', 'bx_timeline_votes_track', '604800', '1', '1', '0', '1', 'bx_timeline_events', 'id', 'object_id', 'rate', 'votes', 'BxTimelineVoteLikes', 'modules/boonex/timeline/classes/BxTimelineVoteLikes.php'),
+('bx_timeline_reactions', 'bx_timeline_reactions', 'bx_timeline_reactions_track', '604800', '1', '1', '1', '1', 'bx_timeline_events', 'id', 'object_id', 'rrate', 'rvotes', 'BxTemplVoteReactions', '');
+
+
+-- SCORES
+INSERT INTO `sys_objects_score` (`name`, `module`, `table_main`, `table_track`, `post_timeout`, `is_on`, `trigger_table`, `trigger_field_id`, `trigger_field_author`, `trigger_field_score`, `trigger_field_cup`, `trigger_field_cdown`, `class_name`, `class_file`) VALUES 
+('bx_timeline', 'bx_timeline', 'bx_timeline_scores', 'bx_timeline_scores_track', '604800', '0', 'bx_timeline_events', 'id', 'object_id', 'score', 'sc_up', 'sc_down', '', '');
+
+
+-- REPORTS
+INSERT INTO `sys_objects_report` (`name`, `table_main`, `table_track`, `is_on`, `base_url`, `trigger_table`, `trigger_field_id`, `trigger_field_author`, `trigger_field_count`, `class_name`, `class_file`) VALUES 
+('bx_timeline', 'bx_timeline_reports', 'bx_timeline_reports_track', '1', 'page.php?i=item&id={object_id}', 'bx_timeline_events', 'id', 'owner_id', 'reports',  'BxTimelineReport', 'modules/boonex/timeline/classes/BxTimelineReport.php');
+
+
+-- CONTENT INFO
+INSERT INTO `sys_objects_content_info` (`name`, `title`, `alert_unit`, `alert_action_add`, `alert_action_update`, `alert_action_delete`, `class_name`, `class_file`) VALUES
+('bx_timeline', '_bx_timeline', 'bx_timeline', 'post_common', '', 'delete', '', ''),
+('bx_timeline_cmts', '_bx_timeline_cmts', 'bx_timeline', 'commentPost', 'commentUpdated', 'commentRemoved', 'BxDolContentInfoCmts', '');
+
+
+-- STUDIO PAGE & WIDGET
+INSERT INTO `sys_std_pages`(`index`, `name`, `header`, `caption`, `icon`) VALUES
+(3, 'bx_timeline', '_bx_timeline', '_bx_timeline', 'bx_timeline@modules/boonex/timeline/|std-icon.svg');
+SET @iPageId = LAST_INSERT_ID();
+
+SET @iParentPageId = (SELECT `id` FROM `sys_std_pages` WHERE `name` = 'home');
+SET @iParentPageOrder = (SELECT MAX(`order`) FROM `sys_std_pages_widgets` WHERE `page_id` = @iParentPageId);
+INSERT INTO `sys_std_widgets` (`page_id`, `module`, `url`, `click`, `icon`, `caption`, `cnt_notices`, `cnt_actions`) VALUES
+(@iPageId, 'bx_timeline', '{url_studio}module.php?name=bx_timeline', '', 'bx_timeline@modules/boonex/timeline/|std-icon.svg', '_bx_timeline', '', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:11:"get_actions";s:6:"params";a:0:{}s:5:"class";s:18:"TemplStudioModules";}');
+INSERT INTO `sys_std_pages_widgets` (`page_id`, `widget_id`, `order`) VALUES
+(@iParentPageId, LAST_INSERT_ID(), IF(ISNULL(@iParentPageOrder), 1, @iParentPageOrder + 1));

+ 1100 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/source/js/view.js

@@ -0,0 +1,1100 @@
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Timeline Timeline
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+function BxTimelineView(oOptions) {
+    this._sActionsUri = oOptions.sActionUri;
+    this._sActionsUrl = oOptions.sActionUrl;
+    this._sObjName = oOptions.sObjName == undefined ? 'oTimelineView' : oOptions.sObjName;
+    this._iOwnerId = oOptions.iOwnerId == undefined ? 0 : oOptions.iOwnerId;
+    this._sReferrer = oOptions.sReferrer == undefined ? '' : oOptions.sReferrer;
+    this._sAnimationEffect = oOptions.sAnimationEffect == undefined ? 'slide' : oOptions.sAnimationEffect;
+    this._iAnimationSpeed = oOptions.iAnimationSpeed == undefined ? 'slow' : oOptions.iAnimationSpeed;
+    this._sVideosAutoplay = oOptions.sVideosAutoplay == undefined ? 'off' : oOptions.sVideosAutoplay;
+    this._aHtmlIds = oOptions.aHtmlIds == undefined ? {} : oOptions.aHtmlIds;
+    this._oRequestParams = oOptions.oRequestParams == undefined ? {} : oOptions.oRequestParams;
+
+    this._bInfScroll = oOptions.bInfScroll == undefined ? false : oOptions.bInfScroll;
+    this._iInfScrollAutoPreloads = oOptions.iInfScrollAutoPreloads == undefined ? 10 : oOptions.iInfScrollAutoPreloads;
+    this._sInfScrollAfter = 'item';
+    this._iInfScrollAfterItem = 2; //--- Preload more info when scroll reached N item from the end of Timeline block.
+    this._fInfScrollAfterPercent = 0.25; //--- Preload more info when specified portion of Timeline block's content was already scrolled.
+    this._bInfScrollBusy = false;
+    this._iInfScrollPreloads = 1; //--- First portion is loaded with page loading or 'Load More' button click.
+
+    this._fOutsideOffset = 0.8;
+    this._oSaved = {};
+
+    this._fVapOffsetStart = 0.8;
+    this._fVapOffsetStop = 0.2;
+
+    this._bLiveUpdatePaused = false;
+
+    if(typeof window.glBxTimelineVapPlayers === 'undefined')
+        window.glBxTimelineVapPlayers = [];
+
+    var $this = this;
+    $(document).ready(function() {
+    	$this.init();
+    });
+
+    
+}
+
+BxTimelineView.prototype = new BxTimelineMain();
+
+BxTimelineView.prototype.init = function()
+{
+    var $this = this;
+
+    this.oView = $(this._getHtmlId('main', this._oRequestParams));
+    if(this.oView.length > 0) {
+        if(this.oView.hasClass(this.sClassView + '-timeline'))
+            this.bViewTimeline = true;
+        else if(this.oView.hasClass(this.sClassView + '-outline'))
+            this.bViewOutline = true;
+        else if(this.oView.hasClass(this.sClassView + '-item'))
+            this.bViewItem = true;
+    }
+
+    if(this.bViewTimeline) {
+        var oItems = this.oView.find('.' + this.sClassItem);
+        oItems.find('.bx-tl-item-text .bx-tl-content').checkOverflowHeight(this.sSP + '-overflow', function(oElement) {
+            $this.onFindOverflow(oElement);
+        });
+
+        //--- Hide timeline Events which are outside the viewport
+        this.hideEvents(oItems, this._fOutsideOffset);
+
+        //--- on scolling, show/animate timeline Events when enter the viewport
+        $(window).on('scroll', function() {
+            if(!window.requestAnimationFrame) 
+                setTimeout(function() {
+                    $this.showEvents(oItems, $this._fOutsideOffset);
+                }, 100);
+            else
+                window.requestAnimationFrame(function() {
+                    $this.showEvents(oItems, $this._fOutsideOffset);
+                });
+        });
+
+        //--- Init Video Autoplay
+        if(this._sVideosAutoplay != 'off') {
+            this.initVideosAutoplay(this.oView);
+
+            this.oView.on('hide')
+
+            $(window).on('scroll', function() {
+                if(!$this.oView.is(':visible'))
+                    return;
+
+                if(!window.requestAnimationFrame) 
+                    setTimeout(function() {
+                        $this.autoplayVideos($this.oView, $this._fVapOffsetStart, $this._fVapOffsetStop);
+                    }, 100);
+                else
+                    window.requestAnimationFrame(function() {
+                        $this.autoplayVideos($this.oView, $this._fVapOffsetStart, $this._fVapOffsetStop);
+                    });
+            });
+        }
+
+        //--- Blink (highlight) necessary items
+        this.blink(this.oView);
+
+        //--- Load 'Jump To'
+        this.initJumpTo(this.oView);
+
+        //--- Init 'Infinite Scroll'
+        this.initInfiniteScroll(this.oView);
+    }
+
+    if(this.bViewOutline) {
+        this.initMasonry();
+
+        this.oView.find('.' + this.sClassItem).resize(function() {
+            $this.reloadMasonry();
+        });
+        this.oView.find('img.' + this.sClassItemImage).load(function() {
+            $this.reloadMasonry();
+        });
+
+        //--- Init Video Layout
+        if(this._sVideosAutoplay != 'off')
+            this.initVideos(this.oView);
+
+        //--- Blink (highlight) necessary items
+        this.blink(this.oView);
+
+        //--- Load 'Jump To'
+        this.initJumpTo(this.oView);
+    }
+
+    if(this.bViewItem) {
+        this.oView.find('.bx-tl-item-text .bx-tl-content').checkOverflowHeight(this.sSP + '-overflow', function(oElement) {
+            $this.onFindOverflow(oElement);
+        });
+
+        //--- Init Video Layout
+        if(this._sVideosAutoplay != 'off')
+            this.initVideos(this.oView);
+    }
+
+    this.initFlickity();
+};
+
+BxTimelineView.prototype.initJumpTo = function(oParent)
+{
+    var oJumpTo = $(oParent).find('.' + this.sClassJumpTo);
+    if(!oJumpTo || oJumpTo.length == 0 || oJumpTo.html() != '')
+        return;
+
+    bx_loading_btn(oJumpTo, true);
+
+    jQuery.post (
+        this._sActionsUrl + 'get_jump_to/',
+        this._getDefaultData(oParent),
+        function(oData) {
+            oData.holder = oJumpTo;
+
+            processJsonData(oData);
+        },
+        'json'
+    );
+};
+
+BxTimelineView.prototype.onGetJumpTo = function(oData)
+{
+    if(!oData.holder || oData.content == undefined)
+        return;
+
+    $(oData.holder).html(oData.content);
+};
+
+BxTimelineView.prototype.initInfiniteScroll = function(oParent)
+{
+    var $this = this;
+
+    if(!this._bInfScroll)
+        return;
+
+    $(window).bind('scroll', function(oEvent) {
+        if($this._bInfScrollBusy || $this._iInfScrollPreloads >= $this._iInfScrollAutoPreloads)
+            return;
+
+        var iScrollTop = parseInt($(window).scrollTop());
+        var iWindowHeight = $(window).height();
+
+        //--- Auto-scroll by reaching the N item from the end of parent block.
+        if($this._sInfScrollAfter == 'item') {
+            var oItems = oParent.find('.' + $this.sClassItem);
+            if((iScrollTop + iWindowHeight) <= ($(oItems.get(oItems.length - $this._iInfScrollAfterItem)).offset().top))
+                return;
+        }
+
+        //--- Auto-scroll by reaching the percent of parent block's height.
+        if($this._sInfScrollAfter == 'percent') {
+            var iParentTop = parseInt(oParent.offset().top);
+            var iParentHeight = parseInt(oParent.height());
+            if((iScrollTop + iWindowHeight) <= (iParentTop + iParentHeight * $this._fInfScrollAfterPercent))
+                return;
+        }
+
+        $this._bInfScrollBusy = true;
+        $this._getPage(undefined, $this._oRequestParams.start + $this._oRequestParams.per_page, $this._oRequestParams.per_page, function(oData) {
+            $this._iInfScrollPreloads += 1;
+            $this._bInfScrollBusy = false;
+        });
+    });
+};
+
+BxTimelineView.prototype.initVideosAutoplay = function(oParent)
+{
+    var $this = this;
+
+    if(this._sVideosAutoplay == 'off')
+        return;
+
+    this.initVideos(oParent);
+
+    var sPrefix = oParent.attr('id');
+    oParent.find('iframe').each(function() {
+        var sPlayer = sPrefix + '_' + $(this).attr('id');
+        if(window.glBxTimelineVapPlayers[sPlayer])
+            return;
+
+        var oPlayer = new playerjs.Player(this);
+        if($this._sVideosAutoplay == 'on_mute')
+            oPlayer.mute();
+
+        var fFixHeight = function () {
+            $('#' + sPlayer).height(($('#' + sPlayer).contents().find('video').height()) + 'px');
+        };
+        oPlayer.on('ready', fFixHeight);
+        oPlayer.on('play', fFixHeight);
+
+        window.glBxTimelineVapPlayers[sPlayer] = oPlayer;
+    });
+};
+
+BxTimelineView.prototype.hideEvents = function(oEvents, fOffset)
+{
+    oEvents.each(function(iIndex, oElement) {
+        (iIndex >=3 && $(this).offset().top > $(window).scrollTop() + $(window).height() * fOffset ) && $(this).find('.bx-tl-item-type, .bx-tl-item-cnt').addClass('is-hidden');
+    });
+};
+
+BxTimelineView.prototype.showEvents = function(oEvents, fOffset)
+{
+    oEvents.each(function() {
+        ( $(this).offset().top <= $(window).scrollTop() + $(window).height() * fOffset && $(this).find('.bx-tl-item-type').hasClass('is-hidden') ) && $(this).find('.bx-tl-item-type, .bx-tl-item-cnt').removeClass('is-hidden').addClass('bounce-in');
+    });
+};
+
+BxTimelineView.prototype.autoplayVideos = function(oView, fOffsetStart, fOffsetStop)
+{
+    var $this = this;
+
+    var oItems = oView.find('.' + this.sClassItem);
+    var sPrefix = oView.attr('id') + '_';
+
+    oItems.each(function() {
+        $(this).find('iframe').each(function() {
+            var oFrame = $(this);
+            var oPlayer = window.glBxTimelineVapPlayers[sPrefix + oFrame.attr('id')];
+            if(!oPlayer)
+                return;
+
+            var iFrameTop = oFrame.offset().top;
+            var iFrameBottom = iFrameTop + oFrame.height();
+            var iWindowTop = $(window).scrollTop();
+            var iWindowHeight = $(window).height();
+            if(iFrameTop <= iWindowTop + iWindowHeight * fOffsetStart && iFrameBottom >= iWindowTop + iWindowHeight * fOffsetStop)
+                oPlayer.play();
+            else
+                oPlayer.pause();
+        });
+    });
+};
+
+BxTimelineView.prototype.playVideos = function(oView)
+{
+    var $this = this;
+
+    var oItems = oView.find('.' + this.sClassItem);
+    var sPrefix = oView.attr('id') + '_';
+
+    oItems.each(function() {
+        $(this).find('iframe').each(function() {
+            var oFrame = $(this);
+            var oPlayer = window.glBxTimelineVapPlayers[sPrefix + oFrame.attr('id')];
+            if(!oPlayer)
+                return;
+
+            oPlayer.play();
+        });
+    });
+};
+
+BxTimelineView.prototype.pauseVideos = function(oView)
+{
+    var $this = this;
+
+    var oItems = oView.find('.' + this.sClassItem);
+    var sPrefix = oView.attr('id') + '_';
+
+    oItems.each(function() {
+        $(this).find('iframe').each(function() {
+            var oFrame = $(this);
+            var oPlayer = window.glBxTimelineVapPlayers[sPrefix + oFrame.attr('id')];
+            if(!oPlayer)
+                return;
+
+            oPlayer.pause();
+        });
+    });
+};
+
+BxTimelineView.prototype.changeView = function(oLink, sType, oRequestParams)
+{
+    var $this = this;
+    var oViews = $(this._getHtmlId('views_content', this._oRequestParams, {with_type: false})); 
+
+    var oViewBefore = $(this._getHtmlId('main', this._oRequestParams));
+    if(!oViewBefore.length)
+        oViewBefore = oViews.children(':visible');
+
+    if(this._sVideosAutoplay != 'off')
+        this.pauseVideos(oViewBefore);
+
+    this._oRequestParams.start = 0;
+    this._oRequestParams.type = sType;
+
+    var sView = this._getHtmlId('main', this._oRequestParams);
+    if(oViews.find(sView).length !== 0) {
+        oViewBefore.hide();
+        oViews.find(sView).show();
+
+        return;
+    }
+
+    var oData = this._getDefaultData(oLink);
+    if(oRequestParams != undefined)
+        oData = jQuery.extend({}, oData, oRequestParams);
+
+    this.loadingIn(oLink, true);
+
+    jQuery.get (
+        this._sActionsUrl + 'get_view',
+        oData,
+        function(oResponse) {
+            if(oLink)
+                $this.loadingIn(oLink, false);
+
+            if(!oResponse.content)
+                return;
+
+            var oContent = $(oResponse.content);
+            oContent.filter(sView).bxProcessHtml().hide();
+
+            oViewBefore.hide();
+            oViews.append(oContent).find(sView).show();
+        },
+        'json'
+    );
+};
+
+BxTimelineView.prototype.changePage = function(oLink, iStart, iPerPage, onLoad)
+{
+    if(this._bInfScroll)
+        this._iInfScrollPreloads = 1;
+
+    this._getPage(oLink, iStart, iPerPage, onLoad);
+};
+
+BxTimelineView.prototype.changeFilter = function(oLink)
+{
+    var sId = $(oLink).attr('id');
+    sId = sId.substr(sId.lastIndexOf('-') + 1, sId.length);
+
+    this.loadingInBlock(oLink, true);
+
+    this._oRequestParams.start = 0;
+    this._oRequestParams.filter = sId;
+    this._getPosts(oLink);
+};
+
+BxTimelineView.prototype.changeTimeline = function(oLink, sDate)
+{
+    var $this = this;
+
+    oLink = $(oLink);
+    var bLink = oLink.length > 0;
+    var bLoadingInButton = bLink && oLink.hasClass('bx-btn');
+
+    if(bLink) {
+        if(bLoadingInButton)
+            this.loadingInButton(oLink, true);
+        else
+            this.loadingInBlock(oLink, true);
+    }
+
+    this._oRequestParams.start = 0;
+    this._oRequestParams.timeline = sDate;
+    this._getPosts(oLink, function(oData) {
+        if(bLink) {
+            if(bLoadingInButton)
+                $this.loadingInButton(oLink, false);
+            else
+                $this.loadingInBlock(oLink, false);
+        }
+
+        window.scrollTo(0, $this.oView.offset().top - 150);
+
+        processJsonData(oData);
+    });
+};
+
+BxTimelineView.prototype.showCalendar = function(oLink)
+{
+    var $this = this;
+    var oInput = $(oLink).siblings('.' + this.sSP + '-jump-to-calendar');
+    if(!oInput.length)
+        return;
+
+    var sClassProcessed = this.sSP + '-datepicker-processed';
+    if(!oInput.hasClass(sClassProcessed)) {
+        oInput.datepicker({
+            changeYear: true,
+            changeMonth: true,
+            dateFormat: 'yy-mm-dd',
+            yearRange: '1900:2100',
+            onSelect: function(sDate, oPicker){
+		$this.changeTimeline(oLink, sDate);
+            }
+        });
+        oInput.addClass(sClassProcessed);
+    }
+
+    oInput.datepicker('show');
+};
+
+BxTimelineView.prototype.showMore = function(oLink)
+{
+    var sClassOverflow = this.sSP + '-overflow';
+
+    $(oLink).parents('.' + this.sClassItem + ':first').find('.' + sClassOverflow).css('max-height', 'none').removeClass(sClassOverflow);
+    $(oLink).parents('.' + this.sSP + '-content-show-more:first').remove();
+
+    if(this.bViewOutline)
+        this.reloadMasonry();
+};
+
+BxTimelineView.prototype.showItem = function(oLink, iId, sMode, oParams)
+{
+    var oData = $.extend({}, this._getDefaultData(), {id: iId, mode: sMode}, (oParams != undefined ? oParams : {}));
+
+    $(".bx-popup-full-screen.bx-popup-applied:visible").dolPopupHide();
+
+    $(window).dolPopupAjax({
+        id: {
+            value: this._getHtmlId('item_popup', this._oRequestParams, {whole: false, hash: false}) + iId, 
+            force: true
+        },
+        url: bx_append_url_params(this._sActionsUrl + 'get_item_brief', oData),
+        closeOnOuterClick: false,
+        removeOnClose: true,
+        fullScreen: true
+    });
+
+    return false;
+};
+
+BxTimelineView.prototype.commentItem = function(oLink, sSystem, iId)
+{
+    var $this = this;
+    var oData = this._getDefaultData(oLink);
+    oData['system'] = sSystem;
+    oData['id'] = iId;
+
+    var oComments = $(oLink).parents('.' + this.sClassItem + ':first').find('.' + this.sClassItemComments);
+    if(oComments.children().length > 0) {
+    	oComments.bx_anim('toggle', this._sAnimationEffect, this._iAnimationSpeed);
+    	return;
+    }
+
+    if(oLink)
+    	this.loadingInItem(oLink, true);
+
+    jQuery.get (
+        this._sActionsUrl + 'get_comments',
+        oData,
+        function(oData) {
+            if(oLink)
+                $this.loadingInItem(oLink, false);
+
+            if(!oData.content)
+                return;
+
+            oComments.html($(oData.content).hide()).children(':hidden').bxProcessHtml().bx_anim('show', $this._sAnimationEffect, $this._iAnimationSpeed);
+        },
+        'json'
+    );
+};
+
+BxTimelineView.prototype.pinPost = function(oLink, iId, iWay)
+{
+    this._markPost(oLink, iId, iWay, 'pin');
+};
+
+BxTimelineView.prototype.onPinPost = function(oData)
+{
+    this._onMarkPost(oData, 'pin');
+};
+
+BxTimelineView.prototype.stickPost = function(oLink, iId, iWay)
+{
+    this._markPost(oLink, iId, iWay, 'stick');
+};
+
+BxTimelineView.prototype.onStickPost = function(oData)
+{
+    this._onMarkPost(oData, 'stick');
+};
+
+BxTimelineView.prototype.promotePost = function(oLink, iId, iWay)
+{
+    var $this = this;
+    var oData = this._getDefaultData();
+    oData['id'] = iId;
+
+    $(oLink).parents('.bx-popup-applied:first:visible').dolPopupHide({
+        onHide: function(oPopup) {
+            $(oPopup).remove();
+        }
+    });
+
+    var oLoadingContainer = $(this._getHtmlId('item', this._oRequestParams, {whole: false}) + iId);
+
+    this.loadingInItem(oLoadingContainer, true);
+
+    $.post(
+        this._sActionsUrl + 'promote/',
+        oData,
+        function(oData) {
+            $this.loadingInItem(oLoadingContainer, false);
+
+            processJsonData(oData);
+        },
+        'json'
+    );
+};
+
+BxTimelineView.prototype.initFormEdit = function(sFormId)
+{
+    var $this = this;
+    var oForm = $('#' + sFormId);
+
+    autosize(oForm.find('textarea'));
+    oForm.ajaxForm({
+        dataType: "json",
+        beforeSubmit: function (formData, jqForm, options) {
+            window[$this._sObjName].beforeFormEditSubmit(oForm);
+        },
+        success: function (oData) {
+            window[$this._sObjName].afterFormEditSubmit(oForm, oData);
+        }
+    });
+};
+
+BxTimelineView.prototype.beforeFormEditSubmit = function(oForm)
+{
+    this.loadingInButton($(oForm).children().find(':submit'), true);
+};
+
+BxTimelineView.prototype.afterFormEditSubmit = function (oForm, oData)
+{
+    var $this = this;
+    var fContinue = function() {
+        if(oData && oData.id != undefined) {
+            var iId = parseInt(oData.id);
+            if(iId <= 0) 
+                return;
+
+            $this._getPost($this.oView, iId, $this._oRequestParams);
+            return;
+        }
+
+        if(oData && oData.form != undefined && oData.form_id != undefined) {
+            $('#' + oData.form_id).replaceWith(oData.form);
+            $this.initFormEdit(oData.form_id);
+
+            return;
+        }
+    };
+
+    this.loadingInButton($(oForm).children().find(':submit'), false);
+
+    if(oData && oData.message != undefined)
+        bx_alert(oData.message, fContinue);
+    else
+        fContinue();
+};
+
+BxTimelineView.prototype.editPost = function(oLink, iId)
+{
+    var $this = this;
+    var oData = this._getDefaultData(oLink);
+    oData['id'] = iId;
+
+    $(oLink).parents('.bx-popup-applied:first:visible').dolPopupHide();
+
+    var oItem = this.oView.find(this._getHtmlId('item', this._oRequestParams, {whole: false}) + iId);
+
+    var oContent = oItem.find('.' + this.sClassItemContent);
+    if(oContent.find('form').length) {
+        $(oContent).bx_anim('hide', this._sAnimationEffect, this._iAnimationSpeed, function() {
+            $(this).html($this._oSaved[iId]).bx_anim('show', $this._sAnimationEffect, $this._iAnimationSpeed);
+        });
+        return;
+    }
+    else
+        this._oSaved[iId] = oContent.html();
+
+    this.loadingInItem(oItem, true);
+
+    jQuery.post (
+        this._sActionsUrl + 'get_edit_form/' + iId + '/',
+        oData,
+        function (oData) {
+            processJsonData(oData);
+        },
+        'json'
+    );
+};
+
+BxTimelineView.prototype.onEditPost = function(oData)
+{
+    var $this = this;
+
+    if(!oData || !oData.id)
+        return;
+
+    var oItem = $(this._getHtmlId('item', this._oRequestParams, {whole: false}) + oData.id);
+
+    this.loadingInItem(oItem, false);
+
+    if(oData && oData.form != undefined && oData.form_id != undefined) {
+        oItem.find('.' + this.sClassItemContent).bx_anim('hide', this._sAnimationEffect, this._iAnimationSpeed, function() {
+            $(this).html(oData.form).bx_anim('show', $this._sAnimationEffect, $this._iAnimationSpeed, function() {
+                $this.initFormEdit(oData.form_id);
+            });
+        });
+    }
+};
+
+BxTimelineView.prototype.editPostCancel = function(oButton, iId)
+{
+    this.editPost(oButton, iId);
+};
+
+BxTimelineView.prototype.deletePost = function(oLink, iId)
+{
+    var $this = this;
+
+    $(oLink).parents('.bx-popup-applied:first:visible').dolPopupHide();
+
+    bx_confirm('', function() {
+        var oData = $this._getDefaultData();
+        oData['id'] = iId;
+
+        $this.loadingInItem($($this._getHtmlId('item', $this._oRequestParams, {whole: false}) + iId), true);
+
+        $.post(
+            $this._sActionsUrl + 'delete/',
+            oData,
+            function(oData) {
+                processJsonData(oData);
+            },
+            'json'
+        );
+    });
+};
+
+BxTimelineView.prototype.onDeletePost = function(oData)
+{
+    var $this = this;
+    var oItem = $(this._getHtmlId('item', this._oRequestParams, {whole: false}) + oData.id);
+
+    //--- Delete from 'Timeline' (if available)
+    if(this.bViewTimeline) {
+        oItem.bx_anim('hide', this._sAnimationEffect, this._iAnimationSpeed, function() {
+            $(this).remove();
+
+            if($this.oView.find('.' + $this.sClassItem).length == 0) {
+                $this.oView.find('.' + $this.sClassDividerToday).hide();
+                $this.oView.find('.' + $this.sSP + '-load-more').hide();
+                $this.oView.find('.' + $this.sSP + '-empty').show();
+            }
+        });
+
+        return;
+    }
+
+    //--- Delete from 'Outline' (if available)
+    if(this.bViewOutline) {
+        oItem.bx_anim('hide', this._sAnimationEffect, this._iAnimationSpeed, function() {
+            $(this).remove();
+
+            if($this.oView.find('.' + $this.sClassItem).length == 0) {
+                $this.destroyMasonry();
+
+                $this.oView.find('.' + $this.sSP + '-load-more').hide();
+                $this.oView.find('.' + $this.sSP + '-empty').show();
+            } 
+            else
+                $this.reloadMasonry();
+        });
+
+        return;
+    }
+
+    //--- Delete from 'View Item' page.
+    if(this._sReferrer.length != 0)
+        document.location = this._sReferrer;
+};
+
+BxTimelineView.prototype.onConnect = function(eElement, oData)
+{
+    $(eElement).remove();
+};
+
+/*----------------------------*/
+/*--- Live Updates methods ---*/
+/*----------------------------*/
+BxTimelineView.prototype.goTo = function(oLink, sGoToId, sBlinkIds, onLoad)
+{
+    var $this = this;
+
+    this.loadingInPopup(oLink, true);
+
+    this._oRequestParams.start = 0;
+    this._oRequestParams.blink = sBlinkIds;
+    this._getPosts(this.oView, function(oData) {
+        $this.loadingInPopup(oLink, false);
+
+        $(oLink).parents('.bx-popup-applied:first:visible').dolPopupHide();
+
+        oData.go_to = sGoToId;
+        processJsonData(oData);
+    });
+};
+
+BxTimelineView.prototype.goToBtn = function(oLink, sGoToId, sBlinkIds, onLoad)
+{
+    var $this = this;
+
+    this.loadingInButton(oLink, true);
+
+    this._oRequestParams.start = 0;
+    this._oRequestParams.blink = sBlinkIds;
+    this._getPosts(this.oView, function(oData) {
+        oData.go_to = sGoToId;
+        processJsonData(oData);
+
+        $this.loadingInButton(oLink, false);
+        $(oLink).parents('.' + $this.sSP + '-live-update-button:first').remove();
+
+        $this.resumeLiveUpdates();
+    });
+};
+
+/*
+ * Show only one live update notification for all new events.
+ * 
+ * Note. oData.count_old and oData.count_new are also available and can be checked or used in notification popup.  
+ */
+BxTimelineView.prototype.showLiveUpdate = function(oData)
+{
+    if(!oData.code)
+        return;
+
+    var oButton = $(oData.code);
+    var sId = oButton.attr('id');
+    $('#' + sId).remove();
+
+    oButton.prependTo(this.oView);
+};
+
+/*
+ * Show separate live update notification for each new Event.
+ * 
+ * Note. This way to display live update notifications isn't used for now. 
+ * See BxTimelineView::showLiveUpdate method instead.
+ * 
+ * Note. oData.count_old and oData.count_new are also available and can be checked or used in notification popup.  
+ */
+BxTimelineView.prototype.showLiveUpdates = function(oData)
+{
+    if(!oData.code)
+        return;
+
+    var $this = this;
+
+    var oItems = $(oData.code);
+    var sId = oItems.attr('id');
+    $('#' + sId).remove();
+
+    oItems.prependTo('body').dolPopup({
+        position: 'fixed',
+        left: '1rem',
+        top: 'auto',
+        bottom: '1rem',
+        fog: false,
+        onBeforeShow: function() {
+        },
+        onBeforeHide: function() {
+        },
+        onShow: function() {
+            setTimeout(function() {
+                $('.bx-popup-chain.bx-popup-applied:visible:first').dolPopupHide();
+            }, 5000);
+        },
+        onHide: function() {
+            $this.resumeLiveUpdates();
+        }
+    });
+};
+
+BxTimelineView.prototype.previousLiveUpdate = function(oLink)
+{
+    var fPrevious = function() {
+        var sClass = 'bx-popup-chain-item';
+        $(oLink).parents('.' + sClass + ':first').hide().prev('.' + sClass).show();
+    };
+
+    if(!this.pauseLiveUpdates(fPrevious));
+        fPrevious();
+};
+
+BxTimelineView.prototype.hideLiveUpdate = function(oLink)
+{
+    $(oLink).parents('.bx-popup-applied:visible:first').dolPopupHide();
+};
+
+BxTimelineView.prototype.resumeLiveUpdates = function(onLoad)
+{
+    if(!this._bLiveUpdatePaused)
+        return false;
+
+    var $this = this;
+    this.changeLiveUpdates('resume_live_update', function() {
+        $this._bLiveUpdatePaused = false;
+
+        if(typeof onLoad == 'function')
+            onLoad();
+    });
+
+    return true;
+};
+
+BxTimelineView.prototype.pauseLiveUpdates = function(onLoad)
+{
+    if(this._bLiveUpdatePaused)
+        return false;
+
+    var $this = this;
+    this.changeLiveUpdates('pause_live_update', function() {
+        $this._bLiveUpdatePaused = true;
+
+        if(typeof onLoad == 'function')
+            onLoad();
+    });
+
+    return true;
+};
+
+BxTimelineView.prototype.changeLiveUpdates = function(sAction, onLoad)
+{
+    var $this = this;
+    var oParams = this._getDefaultActions();
+    oParams['action'] = sAction;
+
+    jQuery.get(
+        this._sActionsUrl + sAction + '/',
+        oParams,
+        function() {
+            if(typeof onLoad == 'function')
+                onLoad();
+        }
+    );
+};
+
+BxTimelineView.prototype.blink = function(oParent)
+{
+	oParent.find('.' + this.sClassBlink + '-plate:visible').animate({
+		opacity: 0
+	}, 
+	5000, 
+	function() {
+		oParent.find('.' + this.sClassBlink).removeClass(this.sClassBlink);
+	});
+};
+
+
+/*------------------------------------*/
+/*--- Internal (protected) methods ---*/
+/*------------------------------------*/
+BxTimelineView.prototype._getPage = function(oElement, iStart, iPerPage, onLoad)
+{
+    var $this = this;
+
+    if(oElement)
+        this.loadingIn(oElement, true);
+
+    this._oRequestParams.start = iStart;
+    this._oRequestParams.per_page = iPerPage;
+    this._getPosts(oElement, function(oData) {
+        if(oElement)
+            $this.loadingIn(oElement, false);
+
+    	var sItems = $.trim(oData.items);
+
+        if($this.bViewTimeline)
+            $this.oView.find('.' + $this.sClassItems).append($(sItems).hide()).find('.' + $this.sClassItem + ':hidden').bx_anim('show', $this._sAnimationEffect, $this._iAnimationSpeed, function() {
+                $(this).bxProcessHtml().find('.bx-tl-item-text .bx-tl-content').checkOverflowHeight($this.sSP + '-overflow', function(oElement) {
+                    $this.onFindOverflow(oElement);
+                });
+
+                $this.initFlickity();
+
+                //--- Init Video Autoplay
+                $this.initVideosAutoplay($this.oView);
+            });
+
+        if($this.bViewOutline)
+            $this.appendMasonry($(sItems).bxProcessHtml(), function(oItems) {
+                oItems.find('.bx-tl-item-text .bx-tl-content').checkOverflowHeight($this.sSP + '-overflow', function(oElement) {
+                    $this.onFindOverflow(oElement);
+                });
+
+                $this.initFlickity();
+
+                //--- Init Video Layout
+                if($this._sVideosAutoplay != 'off') 
+                    $this.initVideos($this.oView);
+            });
+
+    	if(oData && oData.load_more != undefined)
+            $this.oView.find('.' + $this.sSP + '-load-more-holder').html($.trim(oData.load_more));
+
+    	if(oData && oData.back != undefined)
+            $this.oView.find('.' + $this.sSP + '-back-holder').html($.trim(oData.back));
+
+    	if(oData && oData.empty != undefined && !$this.oView.find('.' + $this.sClassItem).length)
+            $this.oView.find('.' + $this.sSP + '-empty-holder').html($.trim(oData.empty));
+
+        if(typeof onLoad == 'function')
+            onLoad(oData);
+    });
+};
+
+BxTimelineView.prototype._getPosts = function(oElement, onComplete)
+{
+    var $this = this;
+    var oData = this._getDefaultData(oElement);
+
+    jQuery.get(
+        this._sActionsUrl + 'get_posts/',
+        oData,
+        function(oData) {
+            if(typeof onComplete === 'function')
+                return onComplete(oData);
+
+            if(oElement)
+                $this.loadingInBlock(oElement, false);
+
+            processJsonData(oData);
+        },
+        'json'
+    );
+};
+
+BxTimelineView.prototype._onGetPosts = function(oData)
+{
+    var $this = this;
+
+    var onComplete = function() {
+        if(oData && oData.go_to != undefined)
+            location.hash = oData.go_to;
+
+        if(oData && oData.load_more != undefined)
+            $this.oView.find('.' + $this.sSP + '-load-more-holder').html($.trim(oData.load_more));
+
+        if(oData && oData.back != undefined)
+            $this.oView.find('.' + $this.sSP + '-back-holder').html($.trim(oData.back));
+
+        if(oData && oData.empty != undefined)
+            $this.oView.find('.' + $this.sSP + '-empty-holder').html($.trim(oData.empty));
+    };
+
+    if(oData && oData.items != undefined) {
+        var sItems = $.trim(oData.items);
+
+        if(this.bViewTimeline) {
+            var oItems = this.oView.find('.' + this.sClassItems);
+            oItems.html(sItems).bxProcessHtml();
+
+            this.blink(oItems);
+            this.initFlickity();
+
+            onComplete();
+            return;
+        }
+
+        if(this.bViewOutline) {
+            oItems = this.oView.find('.' + this.sClassItems);
+            oItems.html(sItems).bxProcessHtml();
+
+            if(this.isMasonry())
+                this.destroyMasonry();
+
+            if(!this.isMasonryEmpty())
+                this.initMasonry();
+
+            this.blink(oItems);
+            this.initFlickity();
+
+            onComplete();
+            return;
+        }
+    }
+};
+
+BxTimelineView.prototype._onGetPost = function(oData)
+{
+    if(!$.trim(oData.item).length) 
+        return;
+
+    var $this = this;
+    var sItem = this._getHtmlId('item', this._oRequestParams, {whole:false}) + oData.id;
+    this.oView.find(sItem).replaceWith($(oData.item).bxProcessHtml());
+    this.oView.find(sItem).find('.bx-tl-item-text .bx-tl-content').checkOverflowHeight(this.sSP + '-overflow', function(oElement) {
+        $this.onFindOverflow(oElement);
+    });
+};
+
+BxTimelineView.prototype._markPost = function(oLink, iId, iWay, sAction)
+{
+    var oData = this._getDefaultData();
+    oData['id'] = iId;
+
+    $(oLink).parents('.bx-popup-applied:first:visible').dolPopupHide({
+        onHide: function(oPopup) {
+            $(oPopup).remove();
+        }
+    });
+
+    this.loadingInItem($(this._getHtmlId('item', this._oRequestParams, {whole:false}) + iId), true);
+
+    $.post(
+        this._sActionsUrl + sAction + '/',
+        oData,
+        function(oData) {
+        	processJsonData(oData);
+        },
+        'json'
+    );
+};
+
+BxTimelineView.prototype._onMarkPost = function(oData, sAction)
+{
+    var $this = this;
+    var sItem = this._getHtmlId('item', this._oRequestParams, {whole:false}) + oData.id;
+
+    this._oRequestParams.start = 0;
+
+    //--- Mark on Timeline (if available)
+    if(this.bViewTimeline)
+        this._getPosts(this.oView, function(oData) {
+            $(sItem).bx_anim('hide', $this._sAnimationEffect, $this._iAnimationSpeed, function() {
+                $(this).remove();
+
+                processJsonData(oData);
+            });
+        });
+
+    //--- Mark on Outline (if available)
+    if(this.bViewOutline)
+        this._getPosts(this.oView, function(oData) {
+            $this.removeMasonry(sItem, function() {
+                processJsonData(oData);
+            });
+        });
+};

+ 6 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/source/template/block_item_info.html

@@ -0,0 +1,6 @@
+<div class="__style_prefix__-view-info">
+    <div class="__style_prefix__-view-cnt">
+        <div class="__style_prefix__-view-author">__author__</div>
+        <div class="__style_prefix__-view-fields bx-def-margin-top">__fields__</div>
+    </div>
+</div>

+ 867 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/source/template/css/view.css

@@ -0,0 +1,867 @@
+/*--- General section ---*/
+
+
+/*--- Views Block Style ---*/
+.bx-tl-views {
+    position: relative;
+}
+
+.bx-tl-views .bx-loading-ajax {
+    display: -webkit-flex;
+    display: flex;
+    -webkit-align-items: center;
+    align-items: center;
+    -webkit-justify-content: center;
+    justify-content: center;
+
+    top: 0;
+    width: 100%;
+    height: 100%;
+}
+
+.bx-tl-v-header {
+    position: relative;
+    display: -webkit-flex;
+    display: flex;
+
+    border-bottom-color: #e6f0fa;
+    border-bottom-width: 2px;
+}
+.bx-tl-v-title,
+.bx-tl-v-submenu {
+    -webkit-flex: 0 1 auto; 
+    -ms-flex:  0 1 auto; 
+    flex:  0 1 auto;
+    line-height: 3.125rem;
+}
+.bx-tl-v-title,
+.bx-tl-v-submenu-cnt {
+    height: 3.125rem;
+}
+
+.bx-tl-v-title {
+    -webkit-flex-grow: 3;
+    flex-grow: 3;
+
+    border-bottom: 2px solid rgba(0,0,0,0.1);
+
+    white-space: nowrap;
+    font-size: 1rem;
+    font-weight: 400;
+}
+.bx-tl-v-submenu {
+    overflow-x: auto;
+    overflow-y: hidden;
+
+    -webkit-overflow-scrolling: touch;
+}
+.bx-tl-v-submenu::-webkit-scrollbar {
+    width: 0.5rem;
+}
+.bx-tl-v-submenu::-webkit-scrollbar-track {
+    -webkit-border-radius: 0.5rem;
+    border-radius: 0.5rem;
+
+    background-color: rgba(0, 0, 0, 0.1); 
+}
+.bx-tl-v-submenu::-webkit-scrollbar-thumb {
+    -webkit-border-radius: 0.5rem;
+    border-radius: 0.5rem;
+
+    background: rgba(255, 255, 255, 0.9); 
+    -webkit-box-shadow: inset 0 0 1px rgba(0, 0, 0, 0.5);
+}
+.bx-tl-v-submenu::-webkit-scrollbar-thumb:window-inactive {
+    background: rgba(255, 255, 255, 0.4); 
+}
+.bx-tl-v-submenu-cnt ul {
+    display: -webkit-flex;
+    display: flex;
+}
+.bx-tl-v-submenu-cnt ul li {
+    -webkit-flex: 0 1 auto; 
+    -ms-flex:  0 1 auto; 
+    flex:  0 1 auto;
+    box-sizing: border-box;
+    height: 3.125rem;
+
+    border-bottom: 2px solid rgba(0,0,0,0.1);
+    border-radius: 0;
+
+    line-height: 3.125rem;
+    white-space: nowrap;
+    
+}
+.bx-tl-v-submenu-cnt ul li div {
+    padding: 0 0.625rem;
+}
+.bx-tl-v-submenu-cnt ul li.bx-menu-inter-act {
+    border-bottom-color: #364f6b;
+}
+.bx-tl-v-submenu-cnt ul li.bx-menu-inter-act > div {
+    font-weight: bold;
+}
+.bx-tl-v-submenu-item .bx-cnc-psi-icon,
+.bx-tl-v-submenu-item .bx-cnc-psi-icon img {
+    width: 1.5rem;
+    height: 1.5rem;
+}
+.bx-tl-v-submenu-item .bx-cnc-psi-icon img {
+    color: #002e74;
+}
+
+.bx-tl-v-submenu-item .bx-cnc-psi-icon .sys-icon {
+    vertical-align: middle;
+    font-size: 1.5rem;
+}
+.bx-tl-v-submenu-item .bx-cnc-psi-title {
+    text-align: center;
+}
+.bx-tl-v-submenu-item.bx-cnc-psi-main .bx-cnc-psi-title {
+    text-align: left;
+}
+.bx-tl-v-view {
+    position: relative;
+}
+.bx-tl-v-form .bx-tl-v-user {
+    position: absolute;
+    top: 0;
+    left: 0;
+}
+.bx-tl-v-form .bx-tl-v-content {
+    display: -webkit-flex;
+    display: flex;
+    -webkit-align-items: center;
+    align-items: center;
+}
+.bx-tl-v-form.bx-tl-v-default .bx-tl-v-content {
+    -webkit-align-items: stretch;
+    align-items: stretch;   
+}
+.bx-tl-v-form.bx-tl-v-default .bx-tl-v-content > div {
+    width: 100%;
+    cursor: text;
+}
+.bx-tl-v-form .bx-uploader-ghost .bx-base-general-icon-wrapper img {
+    max-width: 9.375rem;
+}
+
+.bx-db-container .bx-tl-v-gap {
+    padding: 1rem;
+}
+
+/*--- View Block Style ---*/
+div.bx-tl-view {
+	position: relative;
+}
+
+.bx-tl-grid-sizer {
+	width: 100%;
+}
+.bx-tl-grid-item-sizer {
+    width: 100%;
+}
+
+.bx-tl-view-sizer {
+	width: 100%;
+}
+.bx-tl-view-sizer div.bx-tl-item-ind {
+	padding: 0px;
+}
+div.bx-tl-items-wrapper {
+	position: relative;
+}
+
+/*--- Back Style ---*/
+
+
+/*--- Load More Style ---*/
+div.bx-tl-view-timeline div.bx-tl-load-more {
+    padding-top: 0px;
+}
+
+div.bx-tl-jump-to {
+    position: relative;
+    float: right;
+    line-height: 36px;
+    line-height: 2.25rem;
+}
+div.bx-tl-jump-to .bx-tl-jt-divider:last-child {
+    display: none;
+}
+div.bx-tl-jump-to .bx-btn {
+    display: inline-block;
+    float: none;
+}
+div.bx-tl-jump-to .bx-tl-jump-to-calendar {
+    position: relative;
+    display: inline-block;
+    visibility: hidden;
+    width: 0;
+    height: 100%;
+}
+
+
+/*--- Divider Styles ---*/
+div.bx-tl-divider {
+    position: relative;
+}
+
+div.bx-tl-divider-cnt {
+    position: relative;
+    box-sizing: border-box;
+
+    width: 100%;
+
+    border: 2px solid rgba(0, 0, 0, 0.1);
+    border-radius: 20px;
+    -moz-border-radius: 20px;
+    -webkit-border-radius: 20px;
+    background-color: rgba(0, 0, 0, 0.1);
+    
+    text-align: center;
+    text-transform: uppercase;
+    font-weight: bold;
+    color: #ffffff;
+}
+
+/*--- Item Style ---*/
+div.bx-tl-item,
+div.bx-tl-item-cnt {
+    position: relative;
+}
+
+div.bx-tl-blink-plate {
+    position: absolute;
+    display: none;
+    top: -10px;
+    left: -10px;
+    width: 100%;
+    height: 100%;
+    padding: 10px;
+    background-color: rgb(255, 244, 213);
+    background-color: rgba(255, 234, 193, 0.5);
+}
+
+div.bx-tl-item.bx-tl-blink div.bx-tl-blink-plate {
+    display: block;
+}
+
+/*--- Item Owner Style ---*/
+div.bx-tl-item div.bx-tl-item-owner {
+    position: relative;
+    text-align: left;
+}
+div.bx-tl-item div.bx-tl-owner-avatar {
+    position: absolute;
+    top: 0px;
+    left: 0px;
+}
+div.bx-tl-item div.bx-tl-owner-info {
+    display: -webkit-flex;
+    display: flex;
+    -webkit-align-items: center;
+    align-items: center;
+}
+div.bx-tl-item div.bx-tl-item-owner.bx-tl-io-with-actions div.bx-tl-owner-info {
+    margin-right: 68px;
+    margin-right: 4.25rem;
+}
+div.bx-tl-item div.bx-tl-owner-name {
+    position: relative;
+    display: -webkit-flex;
+    display: flex;
+    -webkit-align-items: center;
+    align-items: center;
+    -webkit-flex-wrap: wrap;
+    flex-wrap: wrap;
+
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
+
+div.bx-tl-item div.bx-tl-owner-name .bx-badge-compact {
+    display:inline-block;
+}
+
+div.bx-tl-item div.bx-tl-owner-name > * {
+    vertical-align: middle;
+}
+
+div.bx-tl-item div.bx-tl-owner-name > .bx-tl-on-nl {
+    width: 100%;
+    height: 0;
+}
+
+div.bx-tl-item div.bx-tl-owner-name a.bx-tl-owner-name,
+div.bx-tl-item div.bx-tl-owner-name .bx-tl-timeline-owner-name a.bx-tl-ton-item {
+    font-weight: 700;
+}
+div.bx-tl-item div.bx-tl-owner-name .bx-tl-timeline-owner-name .bx-tl-ton-div:first-child {
+    display: none;
+}
+div.bx-tl-item div.bx-tl-owner-name .bx-tl-date,
+div.bx-tl-item div.bx-tl-owner-name .bx-tl-pinned .sys-icon,
+div.bx-tl-item div.bx-tl-owner-name .bx-tl-sticked .sys-icon,
+div.bx-tl-item div.bx-tl-owner-name .bx-tl-hot .sys-icon {
+    color: rgba(40, 60, 80, 0.5);
+}
+div.bx-tl-item div.bx-tl-owner-name .bx-tl-pinned .sys-icon,
+div.bx-tl-item div.bx-tl-owner-name .bx-tl-sticked .sys-icon,
+div.bx-tl-item div.bx-tl-owner-name .bx-tl-hot .sys-icon {
+    display: inline-block;
+    cursor: default;
+}
+div.bx-tl-item div.bx-tl-owner-actions {
+    position: absolute;
+    top: 0px;
+    right: 0px;
+	line-height: 48px;
+	line-height: 3rem;
+}
+div.bx-tl-item div.bx-tl-owner-actions .bx-btn {
+    display: inline-block;
+	float: none;
+	vertical-align: middle;
+}
+
+/*--- Item Meta Info Style ---*/
+.bx-tl-item-meta {
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    text-align: left;
+}
+.bx-tl-item-meta ul.bx-menu-custom.bx-menu-hor {
+    position: relative;
+    display: inline-block;
+}
+.bx-tl-item-meta ul.bx-menu-custom.bx-menu-hor > li {
+    vertical-align: top;
+}
+.bx-tl-item-meta ul.bx-menu-custom.bx-menu-hor > li > span {
+    margin-right: 0;
+}
+.bx-tl-item-meta ul.bx-menu-custom li:first-child .bx-tl-item-meta-div {
+    display: none;
+}
+.bx-tl-item-meta ul.bx-menu-custom li .bx-tl-item-meta-item,
+.bx-tl-item-meta ul.bx-menu-custom li .bx-tl-item-meta-div,
+.bx-tl-item-meta ul.bx-menu-custom li .bx-btn {
+    position: relative;
+    float: none;
+    display: inline-block;
+    vertical-align: top;
+}
+
+/*--- Item Content Style ---*/
+div.bx-tl-item-content {
+    position: relative;
+    text-align: left;
+}
+div.bx-tl-item-content form {
+    padding-left: 1rem;
+    padding-right: 1rem;
+}
+div.bx-tl-item-content div.bx-tl-title {
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
+div.bx-tl-item-content div.bx-tl-content iframe {
+    width: 100%;
+    min-height: 240px !important;
+}
+div.bx-tl-item-text div.bx-tl-content {
+    position: relative;
+    max-height: 250px;
+
+    text-overflow: ellipsis;
+    overflow: hidden;
+}
+div.bx-tl-item-text div.bx-tl-content > p:first-child {
+    margin-top: 0;
+    padding-top: 0;
+}
+div.bx-tl-item-text div.bx-tl-content > p:last-child {
+    margin-bottom: 0;
+    padding-bottom: 0;
+}
+div.bx-tl-item-text div.bx-tl-content.bx-tl-overflow:before {
+    position: absolute;
+    bottom: 0;
+    width: 100%;
+    height: 20%;
+
+    background: -webkit-linear-gradient(top, transparent, #ffffff);
+    background: -moz-linear-gradient(top, transparent, #ffffff);
+    background: -o-linear-gradient(top, transparent, #ffffff);
+    background: linear-gradient(to bottom, transparent, #ffffff);
+
+    content: '';
+}
+div.bx-tl-item-text div.bx-tl-content-show-more {
+    position: relative;
+}
+div.bx-tl-item-text div.bx-tl-content p {
+	margin-top: 10px;
+	margin-top: 0.625rem;
+	margin-bottom: 10px;
+	margin-bottom: 0.625rem;
+}
+div.bx-tl-item-text div.bx-tl-content img {
+	max-width: 100%;
+	height: auto;
+}
+
+/*--- Item Images Style ---*/
+div.bx-tl-item div.bx-tl-item-images {
+    position: relative;
+    white-space: nowrap;
+    overflow: hidden;
+}
+div.bx-tl-item div.bx-tl-item-image {
+    display: inline-block;
+}
+
+/*--- Item Activity (Actions and Manage are different menus) ---*/
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom:not(.bx-menu-submenu-more-auto) {
+    position: relative;
+    display: -webkit-flex;
+    display: flex;
+    -webkit-justify-content: flex-start;
+    justify-content: flex-start;
+}
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom:not(.bx-menu-submenu-more-auto).bx-mma-ready {
+    -webkit-justify-content: space-around;
+    justify-content: space-around;
+}
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom:not(.bx-menu-submenu-more-auto)::before,
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom:not(.bx-menu-submenu-more-auto)::after {
+    display: none;
+}
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom li > a,
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom li > span {
+    display: block;
+}
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom.bx-menu-hor.bx-menu-more-auto:not(.bx-menu-submenu-more-auto) li > a,
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom.bx-menu-hor.bx-menu-more-auto:not(.bx-menu-submenu-more-auto) li > span {
+    margin-right: 0.5rem;
+}
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom li > span {
+    margin-right: 0;
+}
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom li > span.bx-def-margin-thd-topbottom {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom li > span img {
+    background-size: contain;
+    background-repeat: no-repeat;
+    background-position: center center;
+}
+
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom li .sys-action-do-icon,
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom li .bx-menu-item-icon {
+    box-sizing: border-box;
+
+    width: 2.0rem;
+    height: 2.0rem;
+
+    background-color: rgba(232, 232, 232, 1.0);
+    border: 1px solid #ffffff;
+    border-radius: 1rem;
+
+    font-size: 1.0rem;
+}
+
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom li .sys-action-do-icon .sys-icon,
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom li .bx-menu-item-icon .sys-icon {
+    vertical-align: top;
+}
+
+/*--- Item Activity (all actions in one menu) ---*/
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom.bx-menu-more-auto > li.bx-menu-item {
+    padding: 0;
+    white-space: nowrap;
+}
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom.bx-menu-more-auto > li.bx-menu-item.bx-menu-item-more-auto a {
+    padding: 0;
+}
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom.bx-menu-more-auto .bx-popup .bx-menu-custom.bx-menu-submenu-more-auto > li.bx-menu-item  a > span {
+    margin-left: 0;
+}
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom.bx-menu-more-auto .bx-popup .bx-menu-custom.bx-menu-submenu-more-auto > li.bx-menu-item  a .sys-action-do-icon,
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom.bx-menu-more-auto .bx-popup .bx-menu-custom.bx-menu-submenu-more-auto > li.bx-menu-item  a .sys-action-do-icon > .sys-icon,
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom.bx-menu-more-auto .bx-popup .bx-menu-custom.bx-menu-submenu-more-auto > li.bx-menu-item  a .bx-menu-item-icon,
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom.bx-menu-more-auto .bx-popup .bx-menu-custom.bx-menu-submenu-more-auto > li.bx-menu-item  a .bx-menu-item-icon > .sys-icon {
+    width: 1.5rem;
+    height: 1.5rem;
+
+    background-color: transparent;
+    border-color: transparent;
+
+    line-height: 1.5rem;
+    font-size: 1.0rem;
+}
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom.bx-menu-more-auto .bx-popup .bx-menu-custom.bx-menu-submenu-more-auto > li.bx-menu-item  a .sys-action-do-text,
+div.bx-tl-item div.bx-tl-item-activity .bx-menu-custom.bx-menu-more-auto .bx-popup .bx-menu-custom.bx-menu-submenu-more-auto > li.bx-menu-item  a .bx-menu-item-title {
+    margin-left: 0.5rem;
+}
+
+/*--- Item Style: Timeline ---*/
+div.bx-tl-view-timeline div.bx-tl-items:before {
+    content: '';
+    position: absolute;
+    top: 0px;
+    left: 0.875rem;
+    width: 4px;
+    height: 100%;
+
+    background: #dddddd;
+}
+div.bx-tl-view-timeline div.bx-tl-items,
+div.bx-tl-view-search div.bx-tl-items,
+div.bx-tl-view-item div.bx-tl-items {
+	margin-left: 0px;
+	margin-right: 0px;
+}
+div.bx-tl-view-timeline div.bx-tl-item,
+div.bx-tl-view-search div.bx-tl-item,
+div.bx-tl-view-item div.bx-tl-item {
+    position: relative;
+}
+div.bx-tl-view-timeline div.bx-tl-item-type {
+    position: absolute;
+    top: 0px;
+    left: 0px;
+}
+div.bx-tl-view-timeline div.bx-tl-item-circle {
+    position: relative;
+    display: -webkit-flex;
+    display: flex;
+    -webkit-align-items: center;
+    align-items: center;
+    -webkit-justify-content: center;
+    justify-content: center;
+
+    width: 2rem;
+    height: 2rem;
+
+    background-color: #dddddd;
+    background-clip: padding-box;
+    border-radius: 2rem;
+
+    text-align: center;
+    color: #999999;
+
+    overflow: hidden;
+}
+div.bx-tl-view-timeline div.bx-tl-item-circle .sys-icon {
+    font-size: 1.0rem;
+}
+
+
+/*--- Item Style: Outline ---*/
+div.bx-tl-view-outline div.bx-tl-item {
+	position: relative;
+}
+div.bx-tl-view-outline div.bx-tl-item div.bx-tl-item-owner.bx-tl-io-with-actions div.bx-tl-owner-info {
+    margin-right: 48px;
+    margin-right: 3.0rem;
+}
+div.bx-tl-view-outline div.bx-tl-item-ind {
+	position: relative;
+}
+
+/*+++ Item Text +++*/
+div.bx-tl-view-outline div.bx-tl-item-text div.bx-tl-title {
+	font-weight: bold;
+}
+div.bx-tl-view-outline div.bx-tl-content-show-more a {
+	font-weight: bold;
+}
+
+/*+++ Item Image +++*/
+div.bx-tl-view-search div.bx-tl-item-images {
+	margin-left: 0px;
+	margin-right: 0px;
+}
+div.bx-tl-view-search div.bx-tl-item-image {
+	margin-right: 2px;
+	margin-right: 0.125rem;
+}
+div.bx-tl-view-timeline div.bx-tl-item-image,
+div.bx-tl-view-outline div.bx-tl-item-image,
+div.bx-tl-view-item div.bx-tl-item-image {
+    width: 100%;
+    text-align: center;
+    overflow: hidden;
+}
+div.bx-tl-view-search div.bx-tl-item-image img {
+    height: 12.5rem;
+}
+div.bx-tl-view-timeline div.bx-tl-item-images.bx-tl-ii-gallery div.bx-tl-item-image img,
+div.bx-tl-view-item div.bx-tl-item-images.bx-tl-ii-gallery div.bx-tl-item-image img,
+div.bx-tl-view-timeline div.bx-tl-item-images.bx-tl-ii-single div.bx-tl-item-image img,
+div.bx-tl-view-item  div.bx-tl-item-images.bx-tl-ii-single div.bx-tl-item-image img {
+    position: relative;
+    display: block;
+    max-width: 100%;
+    margin-left: auto;
+    margin-right: auto;
+}
+div.bx-tl-view-outline div.bx-tl-item-image img {
+    max-width: 100%;
+    object-fit: cover;
+    object-position: center center;
+}
+
+/*+++ Item Video +++*/
+div.bx-tl-view-timeline div.bx-tl-item-video,
+div.bx-tl-view-outline div.bx-tl-item-video,
+div.bx-tl-view-item div.bx-tl-item-video {
+    width: 100%;
+}
+.bx-tl-video-iframe {
+    width: 100%;
+    border: none;
+}
+div.bx-tl-view div.bx-tl-item-videos.bx-tl-iv-gallery div.bx-tl-item-video video,
+div.bx-tl-view div.bx-tl-item-videos.bx-tl-iv-single div.bx-tl-item-video video {
+    display: block;
+    max-width: 100%;
+    margin-left: auto;
+    margin-right: auto;
+}
+
+/*+++ Item Attachment +++*/
+div.bx-tl-view-timeline div.bx-tl-item-attachment,
+div.bx-tl-view-outline div.bx-tl-item-attachment,
+div.bx-tl-view-item div.bx-tl-item-attachment,
+div.bx-tl-view-search div.bx-tl-item-attachment {
+    position: relative;
+    display: -webkit-flex;
+    display: flex;
+    -webkit-justify-content: center;
+    justify-content: center;  
+
+    width: 100%;
+}
+div.bx-tl-view-timeline div.bx-tl-item-attachments.bx-tl-ia-gallery div.bx-tl-item-attachment img,
+div.bx-tl-view-item div.bx-tl-item-attachments.bx-tl-ia-gallery div.bx-tl-item-attachment img,
+div.bx-tl-view-search div.bx-tl-item-attachments.bx-tl-ia-gallery div.bx-tl-item-attachment img {
+    position: relative;
+    display: block;
+    max-width: 100%;
+    margin-left: auto;
+    margin-right: auto;
+}
+div.bx-tl-view-outline div.bx-tl-item-attachment img {
+    max-width: 100%;
+    object-fit: cover;
+    object-position: center center;
+}
+
+/*+++ Video +++*/
+div.bx-tl-view-timeline div.bx-tl-item-attachment video,
+div.bx-tl-view-outline div.bx-tl-item-attachment video,
+div.bx-tl-view-item div.bx-tl-item-attachment video {
+    display: block;
+    max-width: 100%;
+    margin-left: auto;
+    margin-right: auto;
+}
+div.bx-tl-item-attachment .bx-tl-item-video {
+    position: relative;
+}
+div.bx-tl-item-attachment .bx-tl-iv-duration {
+    position: absolute;
+    right: 0.25rem;
+    bottom: 0.25rem;
+    background-color: rgba(255, 255, 255, 0.8);
+}
+
+/*+++ Showcase Layout +++*/
+div.bx-tl-item-attachments.bx-tl-ia-showcase {
+    display: -webkit-flex;
+    display: flex;
+    -webkit-flex-wrap: wrap;
+    flex-wrap: wrap;
+    -webkit-justify-content: space-between;
+    justify-content: space-between;
+}
+div.bx-tl-item-attachments.bx-tl-ia-showcase div.bx-tl-item-attachment {
+    box-sizing: border-box;
+    width: 33.2%;
+    height: 8.5rem;
+    border: 1px solid transparent;
+}
+div.bx-tl-item-attachments.bx-tl-ia-showcase div.bx-tl-item-attachment.bx-tl-ia-first,
+div.bx-tl-item-attachments.bx-tl-ia-showcase.bx-tl-ia-i2 div.bx-tl-item-attachment {
+    width: 100%;
+    height: auto;
+}
+div.bx-tl-item-attachments.bx-tl-ia-showcase.bx-tl-ia-i3 div.bx-tl-item-attachment:not(.bx-tl-ia-first) {
+    width: 50%;
+}
+div.bx-tl-item-attachments.bx-tl-ia-showcase a,
+div.bx-tl-item-attachments.bx-tl-ia-showcase img {
+    position: relative;
+    display: block;
+    width: 100%;
+    height: 100%;
+}
+div.bx-tl-item-attachments.bx-tl-ia-showcase img {
+    object-fit: cover;
+}
+div.bx-tl-item-attachments.bx-tl-ia-showcase .bx-tl-item-more {
+    position: absolute;
+    display: -webkit-flex;
+    display: flex;
+    -webkit-align-items: center;
+    align-items: center;
+    -webkit-justify-content: center;
+    justify-content: center;
+
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    background-color: rgba(0, 0, 0, 0.7);
+
+    font-size: 2.5rem;
+    color: #ffffff;
+}
+
+
+/*+++ Slider Styles  +++*/
+div.bx-tl-item-images .flickity-slider,
+div.bx-tl-item-videos .flickity-slider,
+div.bx-tl-item-attachments .flickity-slider {
+    display: -webkit-flex;
+    display: flex;
+    -webkit-align-items: center;
+    align-items: center;
+}
+
+/*+++ Item Link +++*/
+div.bx-tl-view-outline div.bx-tl-item-link {
+	text-align: center;
+}
+div.bx-tl-view-outline div.bx-tl-il-thumbnail img {
+	width: 100%;
+	max-width: 100px;
+	height: 100%;
+	max-height: 100px;
+}
+div.bx-tl-view-outline div.bx-tl-il-embed iframe,
+div.bx-tl-view-timeline div.bx-tl-il-embed iframe {
+    width: 100%;
+}
+
+/*+++ Item Reposted +++*/
+div.bx-tl-view-outline div.bx-tl-reposted div.bx-tl-item-text {
+	padding-left: 5px;
+	padding-left: 0.3rem;
+
+	border-left: 1px solid #999999;
+	border-left: 0.07rem solid #999999;
+}
+div.bx-tl-view-outline div.bx-tl-reposted div.bx-tl-title {
+	font-size: 1.0rem;
+}
+div.bx-tl-view-outline div.bx-tl-reposted div.bx-tl-title a {
+	color: #999999;
+}
+div.bx-tl-view-outline div.bx-tl-reposted div.bx-tl-content {
+	font-size: 0.875rem;
+	color: #999999;
+}
+
+/*--- Item Style: View page ---*/
+div.bx-tl-view-item-comments .bx-tl-item-comments {
+    margin-top: 0;
+}
+div.bx-tl-view-item-comments .cmts .cmt:first-child  {
+    padding-top: 0;
+}
+
+div.bx-tl-view-info {
+    position: relative;
+}
+div.bx-tl-view-info .bx-base-pofile-unit {
+    float: none;
+}
+
+/*--- Item Brief Style ---*/
+div.bx-tl-bview-image {
+    text-align: center;
+}
+div.bx-tl-bview-image img {
+    max-width: 100%;
+}
+
+
+/*--- Empty Style ---*/
+div.bx-tl-empty div.bx-msg-box-container {
+    margin-top: 0px;
+    margin-bottom: 0px;
+}
+
+
+/*--- Comments Styles ---*/
+div.bx-tl-item-comments-holder .cmt.bx-def-box {
+    border-width: 0px;
+}
+
+
+/*--- Live Update Alert Styles ---*/
+div.bx-tl-live-update-button {
+    position: relative;
+    text-align: center;
+}
+@supports(position:sticky) {
+    div.bx-tl-live-update-button {
+        position: sticky;
+        top: 1rem;
+        z-index: 1;
+    }
+}
+@supports(position:-webkit-sticky) {
+    div.bx-tl-live-update-button {
+        position: -webkit-sticky;
+        top: 1rem;
+        z-index: 1;
+    }
+}
+div.bx-tl-live-update-button .bx-btn {
+    display: inline-block;
+    float: none;
+}
+
+/*--- Live Update Notifications Styles ---*/
+.bx-tl-live-update-item {
+    position: relative;
+    display: block;
+}
+div.bx-tl-lui-cnt {
+    position: relative;
+}
+div.bx-tl-lui-avatar {
+    position: absolute;
+    top: 0px;
+    left: 0px;
+    text-align: center;
+}
+div.bx-tl-lui-info {
+    position: realtive;
+    display: -webkit-flex;
+    display: flex;
+    -webkit-align-items: center;
+    align-items: center;
+}
+div.bx-tl-luii-username {
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+}

+ 72 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/source/template/item_outline.html

@@ -0,0 +1,72 @@
+<div id="__html_id__" class="__style_prefix__-item __class__">
+    <a name="timeline-event-__id__"></a>
+    <div class="__style_prefix__-item-ind bx-def-padding-sec">
+        <div class="__style_prefix__-item-cnt bx-def-box bx-def-padding-topbottom bx-def-round-corners __class_content__">
+            <div class="__style_prefix__-blink-plate"></div>
+            <bx_if:show_note>
+                <bx_repeat:notes>
+                    <div class="__style_prefix__-item-note bx-def-margin-leftright">
+                        <div class="__style_prefix__-in-text bx-def-font-grayed<bx_if:show_note_color> col-__item_note_color__</bx_if:show_note_color>">__item_note__</div>
+                    </div>
+                </bx_repeat:notes>
+                <div class="__style_prefix__-in-divider bx-def-hr bx-def-margin-sec-topbottom"></div>
+            </bx_if:show_note>
+            <div class="__style_prefix__-item-owner bx-def-margin-leftright __class_owner__"> 
+                <div class="__style_prefix__-owner-avatar bx-def-thumb-size">__item_owner_unit__</div>
+                    <div class="__style_prefix__-owner-info bx-def-thumb-size-min-height bx-def-thumb-size-left-indent">
+                        <!-- NOTE: Spaces after and between elements in 'owner-name' DIV are needed for better line folding -->
+                        <div class="__style_prefix__-owner-name bx-def-font-middle bx-def-font-grayed">
+                            <a href="__item_owner_url__" class="__style_prefix__-owner-name" title="__item_owner_title__">__item_owner_name__</a><span>&nbsp;__item_owner_action__&nbsp;</span> 
+                            <bx_if:show_timeline_owner>
+                                <span><bx_text:_bx_timeline_txt_to />&nbsp;</span> 
+                                <span class="__style_prefix__-timeline-owner-name">
+                                    <bx_repeat:owners><span class="__style_prefix__-ton-div">, </span><a href="__owner_url__" class="__style_prefix__-ton-item">__owner_username__</a></bx_repeat:owners>
+                                </span>
+                            </bx_if:show_timeline_owner>
+                            <bx_if:show_menu_item_meta>
+                                <span class="bx-tl-on-nl"></span>
+                                <span class="__style_prefix__-item-meta bx-def-font-grayed">__meta__</span>
+                            </bx_if:show_menu_item_meta>
+                            <bx_if:show_pinned>
+                                <span class="__style_prefix__-pinned bx-def-margin-sec-left">
+                                    <i class="sys-icon thumbtack" title="<bx_text_attribute:_bx_timeline_txt_pinned />"></i>
+                                </span>
+                            </bx_if:show_pinned>
+                            <bx_if:show_sticked>
+                                <span class="__style_prefix__-sticked bx-def-margin-sec-left">
+                                    <i class="sys-icon thumbtack" title="<bx_text_attribute:_bx_timeline_txt_sticked />"></i>
+                                </span>
+                            </bx_if:show_sticked>
+                            <bx_if:show_hot>
+                                <span class="__style_prefix__-hot bx-def-margin-sec-left">
+                                    <i class="sys-icon fire" title="<bx_text_attribute:_bx_timeline_txt_hot />"></i>
+                                </span>
+                            </bx_if:show_hot>
+                        </div>
+                    </div>
+                    <bx_if:show_owner_actions>
+                    <div class="__style_prefix__-owner-actions bx-def-thumb-size-min-height">
+                        <bx_repeat:owner_actions>
+                            <a class="bx-btn bx-btn-small" href="__href__" onclick="__onclick__" title="__title__"><i class="sys-icon __icon__"></i></a>
+                        </bx_repeat:owner_actions>
+                    </div>
+                </bx_if:show_owner_actions>
+            </div>
+            <div class="__style_prefix__-item-content bx-clearfix">__content__</div>
+            <bx_if:show_location>
+                <div class="__style_prefix__-item-location bx-def-margin-leftright bx-def-margin-sec-top bx-def-font-grayed bx-clearfix">__location__</div>
+            </bx_if:show_location>
+            <bx_if:show_fields>
+                <div class="__style_prefix__-item-fields bx-def-margin-leftright bx-def-margin-sec-top bx-def-font-grayed bx-clearfix">__fields__</div>
+            </bx_if:show_fields>
+            <bx_if:show_menu_item_counters>
+                <div class="__style_prefix__-item-activity __style_prefix__-ia-counters bx-def-margin-leftright bx-def-margin-sec-top bx-clearfix">__menu_item_counters__</div>
+            </bx_if:show_menu_item_counters>
+            <bx_if:show_menu_item_actions>
+                <div class="__style_prefix__-item-activity-divider bx-def-hr bx-def-margin-top"></div>
+                <div class="__style_prefix__-item-activity bx-def-margin-leftright bx-def-margin-top bx-clearfix">__menu_item_actions__</div>
+            </bx_if:show_menu_item_actions>
+            <div class="__style_prefix__-item-comments-holder bx-def-margin-leftright">__comments__</div>
+        </div>
+    </div>
+</div>

+ 75 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/source/template/item_timeline.html

@@ -0,0 +1,75 @@
+<div id="__html_id__" class="__style_prefix__-item __class__ bx-def-thumb-size-min-height bx-def-padding-bottom bx-clearfix">
+    <a name="timeline-event-__id__"></a>
+    <div class="__style_prefix__-item-type bx-def-media-phone-hide">
+        <div class="__style_prefix__-item-circle">
+            <i class="sys-icon __item_icon__"></i>
+        </div>
+    </div>
+    <div class="__style_prefix__-item-cnt bx-def-box bx-def-padding-topbottom bx-def-round-corners __class_content__">
+        <div class="__style_prefix__-blink-plate"></div>
+        <bx_if:show_note>
+            <bx_repeat:notes>
+                <div class="__style_prefix__-item-note">
+                    <div class="__style_prefix__-in-text bx-def-margin-leftright bx-def-font-grayed<bx_if:show_note_color> col-__item_note_color__</bx_if:show_note_color>">__item_note__</div>
+                </div>
+            </bx_repeat:notes>
+            <div class="__style_prefix__-in-divider bx-def-hr bx-def-margin-topbottom"></div>
+        </bx_if:show_note>
+        <div class="__style_prefix__-item-owner bx-def-margin-leftright __class_owner__"> 
+            <div class="__style_prefix__-owner-avatar bx-def-thumb-size">__item_owner_unit__</div>
+            <div class="__style_prefix__-owner-info bx-def-thumb-size-min-height bx-def-thumb-size-left-indent">
+                <!-- NOTE: Spaces after and between elements in 'owner-name' DIV are needed for better line folding -->
+                <div class="__style_prefix__-owner-name bx-def-font-middle bx-def-font-grayed">
+                    <a href="__item_owner_url__" class="__style_prefix__-owner-name" title="__item_owner_title__">__item_owner_name__</a><span>&nbsp;__item_owner_action__&nbsp;</span> 
+                    <bx_if:show_timeline_owner>
+                        <span><bx_text:_bx_timeline_txt_to />&nbsp;</span> 
+                        <span class="__style_prefix__-timeline-owner-name">
+                            <bx_repeat:owners><span class="__style_prefix__-ton-div">, </span><a href="__owner_url__" class="__style_prefix__-ton-item">__owner_username__</a></bx_repeat:owners>
+                        </span> 
+                    </bx_if:show_timeline_owner>
+                    <bx_if:show_menu_item_meta>
+                        <span class="bx-tl-on-nl"></span>
+                        <span class="__style_prefix__-item-meta bx-def-font-grayed">__meta__</span>
+                    </bx_if:show_menu_item_meta>
+                    <bx_if:show_pinned>
+                        <span class="__style_prefix__-pinned bx-def-margin-sec-left">
+                            <i class="sys-icon thumbtack" title="<bx_text_attribute:_bx_timeline_txt_pinned />"></i>
+                        </span>
+                    </bx_if:show_pinned>
+                    <bx_if:show_sticked>
+                        <span class="__style_prefix__-sticked bx-def-margin-sec-left">
+                            <i class="sys-icon thumbtack" title="<bx_text_attribute:_bx_timeline_txt_sticked />"></i>
+                        </span>
+                    </bx_if:show_sticked>
+                    <bx_if:show_hot>
+                        <span class="__style_prefix__-hot bx-def-margin-sec-left">
+                            <i class="sys-icon fire" title="<bx_text_attribute:_bx_timeline_txt_hot />"></i>
+                        </span>
+                    </bx_if:show_hot>
+                </div>
+            </div>
+            <bx_if:show_owner_actions>
+                <div class="__style_prefix__-owner-actions bx-def-thumb-size-min-height">
+                    <bx_repeat:owner_actions>
+                        <a class="bx-btn bx-btn-small" href="__href__" onclick="__onclick__">__content__</a>
+                    </bx_repeat:owner_actions>
+                </div>
+            </bx_if:show_owner_actions>
+        </div>
+        <div class="__style_prefix__-item-content bx-clearfix">__content__</div>
+        <bx_if:show_location>
+            <div class="__style_prefix__-item-location bx-def-margin-leftright bx-def-margin-sec-top bx-def-font-grayed bx-clearfix">__location__</div>
+        </bx_if:show_location>
+        <bx_if:show_fields>
+            <div class="__style_prefix__-item-fields bx-def-margin-leftright bx-def-margin-sec-top bx-def-font-grayed bx-clearfix">__fields__</div>
+        </bx_if:show_fields>
+        <bx_if:show_menu_item_counters>
+            <div class="__style_prefix__-item-activity __style_prefix__-ia-counters bx-def-margin-leftright bx-def-margin-sec-top bx-clearfix">__menu_item_counters__</div>
+        </bx_if:show_menu_item_counters>
+        <bx_if:show_menu_item_actions>
+            <div class="__style_prefix__-item-activity-divider bx-def-hr bx-def-margin-top"></div>
+            <div class="__style_prefix__-item-activity bx-def-margin-leftright bx-def-margin-top bx-clearfix">__menu_item_actions__</div>
+        </bx_if:show_menu_item_actions>
+        <div class="__style_prefix__-item-comments-holder bx-def-margin-leftright">__comments__</div>
+    </div>
+</div>

+ 1 - 0
modules/boonex/timeline/updates/11.0.3_11.0.4/source/template/video_iframe.html

@@ -0,0 +1 @@
+<iframe id="__html_id__" class="__style_prefix__-video-iframe" src="__src__" scrolling="no" allowfullscreen="true"></iframe>

Некоторые файлы не были показаны из-за большого количества измененных файлов