AntonLV 12 лет назад
Родитель
Сommit
e7e4ee61bf

+ 7 - 4
get_rss_feed.php

@@ -20,12 +20,15 @@ $aPredefinedRssFeeds = array (
     'boonex_unity_market_featured' => 'http://www.boonex.com/unity/extensions/featured_posts?rss=1',
 );
 
-if (isset($aPredefinedRssFeeds[$mixedBlockId])) {
+$sCont = "";
 
+$aMatches = array();
+$sPattern = "/((https?|ftp|news):\/\/)?([a-z]([a-z0-9\-]*\.)+(aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|[a-z]{2})|(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-z][a-z0-9_]*)?/";
+if(preg_match($sPattern, $mixedBlockId, $aMatches))
+	$sCont = $aMatches[0];
+else if(isset($aPredefinedRssFeeds[$mixedBlockId]))
     $sCont = $aPredefinedRssFeeds[$mixedBlockId];
-
-} else {
-
+else {
     bx_import('BxDolPageQuery');
     $oPageQuery = new BxDolPageQuery(array());
     $sCont = $oPageQuery->getPageBlockContent($mixedBlockId);

+ 1 - 0
inc/classes/BxDolModuleQuery.php

@@ -134,6 +134,7 @@ class BxDolModuleQuery extends BxDolDb implements iBxDolSingleton
                 `version`,
                 `product_url`,
                 `update_url`,
+                `help_url`,
                 `path`,
                 `uri`,
                 `class_prefix`,

+ 71 - 56
inc/js/jquery.dolRSSFeed.js

@@ -6,81 +6,96 @@
 
 // jQuery plugin - Dolphin RSS Aggregator
 (function($){
-	$.fn.dolRSSFeed = function(sForceUrl) {
+	$.fn.dolRSSFeed = function(oOptions) {
+		var oOptions = oOptions || {};
+
 		return this.each( function(){
-			
+
 			var $Cont = $(this);
 			var iRSSID = $Cont.attr( 'rssid' );
-			if( !iRSSID && sForceUrl == undefined )
+			if( !iRSSID && oOptions.forceUrl == undefined )
 				return false;
-			
+
 			var iMaxNum = parseInt( $Cont.attr( 'rssnum' ) || 0 );
 			var iMemID  = parseInt( $Cont.attr( 'member' ) || 0 );
 
-			var sFeedURL = (sForceUrl != undefined) ? sForceUrl : sUrlRoot + 'get_rss_feed.php?ID=' + iRSSID + '&member=' + iMemID;
+			var sFeedURL = (oOptions.forceUrl != undefined) ? oOptions.forceUrl : sUrlRoot + 'get_rss_feed.php?ID=' + iRSSID + '&member=' + iMemID;
 
             bx_loading_animate($(this).find('.bx-loading-ajax'));
 
             $.getFeed( {
 				url: sFeedURL,
+				error: function(oResponse) {
+					if(typeof oOptions.onError == 'function')
+						oOptions.onError();
+				},
 				success: function(feed) {
+					if (feed == undefined || !feed.items) 
+						return;
+
+					if(typeof oOptions.onLoad == 'function')
+						oOptions.onLoad();
+
+					var sCode =
+						'<div class="sys-rss-feed-wrapper bx-def-bc-margin bx-def-padding-sec-top">';
+					var sTarget, iCount = 0;
+					for( var iItemId = 0; iItemId < feed.items.length; iItemId ++ ) {
+						var item = feed.items[iItemId];
+						var sDate = '', oDate, a;
+
+                        if (null != (a = item.updated.match(/(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)Z/))) {
+                            oDate = new Date( a[1], a[2]-1, a[3], a[4], a[5], a[6], 0 );
+                            sDate = oDate.toLocaleString();
+                        } else if (item.updated.length > 0) {
+							oDate = new Date(item.updated.replace(/z$/i, "-00:00"));
+                            sDate = isNaN(oDate) ? '' : oDate.toLocaleString();
+                        }
 
-					if (feed != undefined && feed.items) {
-						var sCode =
-							'<div class="sys-rss-feed-wrapper bx-def-bc-margin bx-def-padding-sec-top">';
-						var sTarget, iCount = 0;
-						for( var iItemId = 0; iItemId < feed.items.length; iItemId ++ ) {
-							var item = feed.items[iItemId];
-							var sDate = '', oDate, a;
-
-                            if (null != (a = item.updated.match(/(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)Z/))) {
-                                oDate = new Date( a[1], a[2]-1, a[3], a[4], a[5], a[6], 0 );
-                                sDate = oDate.toLocaleString();
-                            } else if (item.updated.length > 0) {
-    							oDate = new Date(item.updated.replace(/z$/i, "-00:00"));
-                                sDate = isNaN(oDate) ? '' : oDate.toLocaleString();
-                            }
-
-                            sTarget = '';
-                            if (item.link.substring(0, sUrlRoot.length) != sUrlRoot) // open external links in new window
-                                sTarget = 'target="_blank"';
-                            
-							sCode +=								
-								'<div class="sys-rss-item-wrapper">' +
-									'<div class="sys-rss-item-header bx-def-font-h2">' +
-										'<a href="' + item.link + '" ' + sTarget + '>' + item.title + '</a>' +
-									'</div>' +
-									'<div class="sys-rss-item-desc">' + item.description + '</div>' +
-									'<div class="sys-rss-item-info bx-def-font-small bx-def-font-grayed">' +
-										'<span>' +
-											sDate +
-										'</span>' +
-									'</div>' +
-								'</div>' +
-                                '<hr class="bx-def-hr bx-def-margin-sec-top bx-def-margin-sec-bottom" />';
-							
-							iCount ++;
-							if( iCount == iMaxNum )
-								break;
-						}
-						
                         sTarget = '';
-                        if (feed.link.substring(0, sUrlRoot.length) != sUrlRoot) // open external links in new window
+                        if (item.link.substring(0, sUrlRoot.length) != sUrlRoot) // open external links in new window
                             sTarget = 'target="_blank"';
-
-						sCode +=
+                        
+						sCode +=								
+							'<div class="sys-rss-item-wrapper">' +
+								'<div class="sys-rss-item-header bx-def-font-h2">' +
+									'<a href="' + item.link + '" ' + sTarget + '>' + item.title + '</a>' +
+								'</div>' +
+								'<div class="sys-rss-item-desc">' + item.description + '</div>' +
+								'<div class="sys-rss-item-info bx-def-font-small bx-def-font-grayed">' +
+									'<span>' +
+										sDate +
+									'</span>' +
+								'</div>' +
 							'</div>' +
-                            
-                            '<div class="sys-rss-read-more">' +
-                                '<i class="sys-icon link"></i><a href="' + feed.link + '" ' + sTarget + ' class="bx-def-margin-sec-left sys-rss-read-more-link">' + feed.title + '</a>' +
-                            '</div>';
+                            '<hr class="bx-def-hr bx-def-margin-sec-top bx-def-margin-sec-bottom" />';
 						
-						$Cont.html( sCode );
+						iCount ++;
+						if( iCount == iMaxNum )
+							break;
 					}
+						
+                    sTarget = '';
+                    if (feed.link.substring(0, sUrlRoot.length) != sUrlRoot) // open external links in new window
+                        sTarget = 'target="_blank"';
+
+					sCode +=
+						'</div>' +
+                        
+                        '<div class="sys-rss-read-more">' +
+                            '<i class="sys-icon link"></i><a href="' + feed.link + '" ' + sTarget + ' class="bx-def-margin-sec-left sys-rss-read-more-link">' + feed.title + '</a>' +
+                        '</div>';
+
+					$Cont.hide().html( sCode );
+
+					if(typeof oOptions.onBeforeShow == 'function')
+						oOptions.onBeforeShow();
+
+					$Cont.show();
+
+					if(typeof oOptions.onShow == 'function')
+						oOptions.onShow();
 				}
-			} );
-			
-		} );
+            });
+		});
 	};
 })(jQuery);
-

+ 1 - 0
install/sql/system.sql

@@ -709,6 +709,7 @@ CREATE TABLE `sys_modules` (
   `version` varchar(32) NOT NULL default '',
   `product_url` varchar(128) NOT NULL default '',
   `update_url` varchar(128) NOT NULL default '',
+  `help_url` varchar(128) NOT NULL default '',
   `path` varchar(255) NOT NULL default '',  
   `uri` varchar(32) NOT NULL default '',
   `class_prefix` varchar(32) NOT NULL default '',

+ 3 - 2
modules/boonex/antispam/install/config.php

@@ -19,8 +19,9 @@ $aConfig = array(
     'note' => 'Antispam tools',
     'version' => '8.0.0',
     'vendor' => 'BoonEx',
-    'product_url' => 'http://www.boonex.com/products/{uri}',
-    'update_url' => '',
+	'product_url' => 'http://www.boonex.com/products/{uri}',
+    'update_url' => 'http://www.boonex.com/products/{uri}',
+	'help_url' => 'http://feed.boonex.com/?section={module_name}',
 
     'compatible_with' => array(
         '8.0.x'

+ 4 - 1
modules/boonex/contact/install/config.php

@@ -19,7 +19,10 @@ $aConfig = array(
     'note' => 'Contact module.',
     'version' => '8.0.0',
     'vendor' => 'BoonEx',
-    'update_url' => '',
+	'product_url' => 'http://www.boonex.com/products/{uri}',
+    'update_url' => 'http://www.boonex.com/products/{uri}',
+	'help_url' => 'http://feed.boonex.com/?section={module_name}',
+    
 
     'compatible_with' => array(
         '8.0.x'

+ 2 - 1
modules/boonex/convos/install/config.php

@@ -20,8 +20,9 @@ $aConfig = array(
     'note' => 'Conversations module.',
     'version' => '8.0.0',
     'vendor' => 'BoonEx',
-    'product_url' => 'http://www.boonex.com/products/{uri}',
+	'product_url' => 'http://www.boonex.com/products/{uri}',
     'update_url' => 'http://www.boonex.com/products/{uri}',
+	'help_url' => 'http://feed.boonex.com/?section={module_name}',
 
     'compatible_with' => array(
         '8.0.x'

+ 2 - 1
modules/boonex/developer/install/config.php

@@ -19,8 +19,9 @@ $aConfig = array(
     'note' => 'Developer tools...',
     'version' => '8.0.0',
     'vendor' => 'BoonEx',
-    'product_url' => 'http://www.boonex.com/products/{uri}',
+	'product_url' => 'http://www.boonex.com/products/{uri}',
     'update_url' => 'http://www.boonex.com/products/{uri}',
+	'help_url' => 'http://feed.boonex.com/?section={module_name}',
 
     'compatible_with' => array(
         '8.0.x'

+ 3 - 2
modules/boonex/english/install/config.php

@@ -19,8 +19,9 @@ $aConfig = array(
     'note' => 'Language file',
     'version' => '8.0.0',
     'vendor' => 'Boonex',
-    'product_url' => 'http://www.boonex.com/m/{uri}',
-    'update_url' => 'http://www.boonex.com/m/{uri}',
+	'product_url' => 'http://www.boonex.com/products/{uri}',
+    'update_url' => 'http://www.boonex.com/products/{uri}',
+	'help_url' => 'http://feed.boonex.com/?section={module_name}',
 
     'compatible_with' => array(
         '8.0.x'

+ 2 - 1
modules/boonex/notes/install/config.php

@@ -20,8 +20,9 @@ $aConfig = array(
     'note' => 'Basic blogging module.',
     'version' => '8.0.0',
     'vendor' => 'BoonEx',
-    'product_url' => 'http://www.boonex.com/products/{uri}',
+	'product_url' => 'http://www.boonex.com/products/{uri}',
     'update_url' => 'http://www.boonex.com/products/{uri}',
+	'help_url' => 'http://feed.boonex.com/?section={module_name}',
 
     'compatible_with' => array(
         '8.0.x'

+ 3 - 1
modules/boonex/notifications/install/config.php

@@ -19,7 +19,9 @@ $aConfig = array(
     'note' => 'Notifications module.',
     'version' => '8.0.0',
     'vendor' => 'BoonEx',
-    'update_url' => '',
+	'product_url' => 'http://www.boonex.com/products/{uri}',
+    'update_url' => 'http://www.boonex.com/products/{uri}',
+	'help_url' => 'http://feed.boonex.com/?section={module_name}',
 
     'compatible_with' => array(
         '8.0.x'

+ 2 - 1
modules/boonex/organizations/install/config.php

@@ -20,8 +20,9 @@ $aConfig = array(
     'note' => 'Basic organization profiles functionality.',
     'version' => '8.0.0',
     'vendor' => 'BoonEx',
-    'product_url' => 'http://www.boonex.com/products/{uri}',
+	'product_url' => 'http://www.boonex.com/products/{uri}',
     'update_url' => 'http://www.boonex.com/products/{uri}',
+	'help_url' => 'http://feed.boonex.com/?section={module_name}',
 
     'compatible_with' => array(
         '8.0.x'

+ 2 - 1
modules/boonex/persons/install/config.php

@@ -20,8 +20,9 @@ $aConfig = array(
     'note' => 'Basic person profiles functionality.',
     'version' => '8.0.0',
     'vendor' => 'BoonEx',
-    'product_url' => 'http://www.boonex.com/products/{uri}',
+	'product_url' => 'http://www.boonex.com/products/{uri}',
     'update_url' => 'http://www.boonex.com/products/{uri}',
+	'help_url' => 'http://feed.boonex.com/?section={module_name}',
 
     'compatible_with' => array(
         '8.0.x'

+ 3 - 2
modules/boonex/profiler/install/config.php

@@ -19,8 +19,9 @@ $aConfig = array(
     'note' => 'Measure different site timings.',
     'version' => '8.0.0',
     'vendor' => 'Boonex',
-    'product_url' => 'http://www.boonex.com/products/{uri}',
-    'update_url' => '',
+	'product_url' => 'http://www.boonex.com/products/{uri}',
+    'update_url' => 'http://www.boonex.com/products/{uri}',
+	'help_url' => 'http://feed.boonex.com/?section={module_name}',
 
     'compatible_with' => array(
         '8.0.x'

+ 3 - 2
modules/boonex/russian/install/config.php

@@ -19,8 +19,9 @@ $aConfig = array(
     'note' => 'Language file',
     'version' => '8.0.0',
     'vendor' => 'Boonex',
-    'product_url' => 'http://www.boonex.com/m/{uri}',
-    'update_url' => 'http://www.boonex.com/m/{uri}',
+	'product_url' => 'http://www.boonex.com/products/{uri}',
+    'update_url' => 'http://www.boonex.com/products/{uri}',
+	'help_url' => 'http://feed.boonex.com/?section={module_name}',
 
     'compatible_with' => array(
         '8.0.x'

+ 2 - 1
modules/boonex/sites/install/config.php

@@ -20,8 +20,9 @@ $aConfig = array(
     'note' => 'Sites module.',
     'version' => '8.0.0',
     'vendor' => 'Boonex',
-    'product_url' => 'http://www.boonex.com/products/{uri}',
+	'product_url' => 'http://www.boonex.com/products/{uri}',
     'update_url' => 'http://www.boonex.com/products/{uri}',
+	'help_url' => 'http://feed.boonex.com/?section={module_name}',
 
     'compatible_with' => array(
         '8.0.x'

+ 3 - 2
modules/boonex/smtpmailer/install/config.php

@@ -19,8 +19,9 @@ $aConfig = array(
     'note' => 'Use remote SMTP server for sending mails.',
     'version' => '8.0.0',
     'vendor' => 'BoonEx',
-    'product_url' => 'http://www.boonex.com/products/{uri}',
-    'update_url' => '',
+	'product_url' => 'http://www.boonex.com/products/{uri}',
+    'update_url' => 'http://www.boonex.com/products/{uri}',
+	'help_url' => 'http://feed.boonex.com/?section={module_name}',
 
     'compatible_with' => array(
         '8.0.x'

+ 3 - 1
modules/boonex/timeline/install/config.php

@@ -19,7 +19,9 @@ $aConfig = array(
     'note' => 'Timeline module.',
     'version' => '8.0.0',
     'vendor' => 'BoonEx',
-    'update_url' => '',
+	'product_url' => 'http://www.boonex.com/products/{uri}',
+    'update_url' => 'http://www.boonex.com/products/{uri}',
+	'help_url' => 'http://feed.boonex.com/?section={module_name}',
 
     'compatible_with' => array(
         '8.0.x'

+ 3 - 2
modules/boonex/uni/install/config.php

@@ -19,8 +19,9 @@ $aConfig = array(
     'note' => 'Design template',
     'version' => '8.0.0',
     'vendor' => 'Boonex',
-    'product_url' => 'http://www.boonex.com/m/{uri}',
-    'update_url' => 'http://www.boonex.com/m/{uri}',
+	'product_url' => 'http://www.boonex.com/products/{uri}',
+    'update_url' => 'http://www.boonex.com/products/{uri}',
+	'help_url' => 'http://feed.boonex.com/?section={module_name}',
 
     'compatible_with' => array(
         '8.0.x'

+ 2 - 1
studio/classes/BxDolStudioInstallerQuery.php

@@ -45,12 +45,13 @@ class BxDolStudioInstallerQuery extends BxDolModuleQuery
     {
         $sProductUrl = isset($aConfig['product_url']) ? $aConfig['product_url'] : '';
         $sUpdateUrl = isset($aConfig['update_url']) ? $aConfig['update_url'] : '';
+        $sHelpUrl = isset($aConfig['help_url']) ? $aConfig['help_url'] : '';
 
         $sDependencies = '';
         if(isset($aConfig['dependencies']) && is_array($aConfig['dependencies']))
             $sDependencies = implode(',', $aConfig['dependencies']);
 
-        $sQuery = $this->prepare("INSERT IGNORE INTO `sys_modules`(`type`, `name`, `title`, `vendor`, `version`, `product_url`, `update_url`, `path`, `uri`, `class_prefix`, `db_prefix`, `lang_category`, `dependencies`, `date`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, UNIX_TIMESTAMP())", $aConfig['type'], $aConfig['name'], $aConfig['title'], $aConfig['vendor'], $aConfig['version'], $sProductUrl, $sUpdateUrl, $aConfig['home_dir'], $aConfig['home_uri'], $aConfig['class_prefix'], $aConfig['db_prefix'], $aConfig['language_category'], $sDependencies);
+        $sQuery = $this->prepare("INSERT IGNORE INTO `sys_modules`(`type`, `name`, `title`, `vendor`, `version`, `product_url`, `update_url`, `help_url`, `path`, `uri`, `class_prefix`, `db_prefix`, `lang_category`, `dependencies`, `date`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, UNIX_TIMESTAMP())", $aConfig['type'], $aConfig['name'], $aConfig['title'], $aConfig['vendor'], $aConfig['version'], $sProductUrl, $sUpdateUrl, $sHelpUrl, $aConfig['home_dir'], $aConfig['home_uri'], $aConfig['class_prefix'], $aConfig['db_prefix'], $aConfig['language_category'], $sDependencies);
         $iResult = (int)$this->query($sQuery);
 
         return $iResult > 0 ? (int)$this->lastId() : 0;

+ 10 - 2
studio/classes/BxDolStudioModule.php

@@ -36,7 +36,7 @@ class BxDolStudioModule extends BxTemplStudioPage
             $this->sPage = $sPage;
     }
 
-    function init()
+    public function init()
     {
         //--- Check Actions ---//
         if(($sAction = bx_get('mod_action')) !== false) {
@@ -61,6 +61,12 @@ class BxDolStudioModule extends BxTemplStudioPage
         if(empty($this->aModule) || !is_array($this->aModule))
             BxDolStudioTemplate::getInstance()->displayPageNotFound();
 
+		$this->addMarkers(array(
+			'module_name' => $this->aModule['name'],
+			'module_uri' => $this->aModule['uri'],
+			'module_title' => $this->aModule['title']
+		));
+
         $this->addAction(array(
             'type' => 'switcher',
             'name' => 'activate',
@@ -68,9 +74,11 @@ class BxDolStudioModule extends BxTemplStudioPage
             'checked' => (int)$this->aModule['enabled'] == 1,
             'onchange' => "javascript:" . $this->getPageJsObject() . ".activate('" . $this->sModule . "', this)"
         ), false);
+
+        $this->sPageRssHelpUrl = $this->aModule['help_url'];
     }
 
-    function activate($sModule)
+    public function activate($sModule)
     {
         $aModule = $this->oDb->getModuleByName($sModule);
         if(empty($aModule) || !is_array($aModule))

+ 32 - 3
studio/classes/BxDolStudioPage.php

@@ -20,10 +20,16 @@ define('BX_DOL_STUDIO_MIT_ITEM', 'item');
 class BxDolStudioPage extends BxDol
 {
     protected $oDb;
+
     protected $aPage;
     protected $bPageMultiple;
     protected $sPageSelected;
+
     protected $aActions;
+    protected $aMarkers;
+
+    protected $sPageRssHelpUrl;
+    protected $iPageRssHelpLength;
 
     function __construct($mixedPageName)
     {
@@ -34,8 +40,12 @@ class BxDolStudioPage extends BxDol
         $this->aPage = array();
         $this->bPageMultiple = false;
         $this->sPageSelected = '';
+
         $this->aActions = array();
 
+        $this->sPageRssHelpUrl = 'http://feed.boonex.com/?section={page_name}';
+        $this->iPageRssHelpLength = 5;
+
         if(is_string($mixedPageName)) {
             $this->oDb->getPages(array('type' => 'by_page_name_full', 'value' => $mixedPageName), $this->aPage, false);
             if(empty($this->aPage) || !is_array($this->aPage))
@@ -59,6 +69,11 @@ class BxDolStudioPage extends BxDol
             }
         }
 
+        $this->aMarkers = array(
+        	'page_name' => $this->aPage['name'],
+        	'page_caption' => $this->aPage['caption'],
+        );
+
         if(!$this->bPageMultiple)
             $this->addAction(array(
                 'type' => 'switcher',
@@ -69,7 +84,7 @@ class BxDolStudioPage extends BxDol
             ));
     }
 
-    function addAction($aAction, $bOnRight = true)
+    public function addAction($aAction, $bOnRight = true)
     {
         if($bOnRight)
             $this->aActions[] = $aAction;
@@ -77,12 +92,26 @@ class BxDolStudioPage extends BxDol
             $this->aActions = array_merge(array($aAction), $this->aActions);
     }
 
-    function removeActions()
+    public function removeActions()
     {
         $this->aActions = array();
     }
 
-    function bookmark()
+    /**
+     * Add replace markers.
+     * @param $a array of markers as key => value
+     * @return true on success or false on error
+     */
+    public function addMarkers($a)
+    {
+        if(empty($a) || !is_array($a))
+            return false;
+
+        $this->aMarkers = array_merge($this->aMarkers, $a);
+        return true;
+    }
+
+    public function bookmark()
     {
         $bResult = $this->oDb->bookmark($this->aPage);
         if(!$bResult)

+ 35 - 8
studio/js/page.js

@@ -41,6 +41,8 @@ BxDolStudioPage.prototype.processJson = function (oData) {
 };
 
 BxDolStudioPage.prototype.togglePopup = function(sName, oLink) {
+	var $this = this;
+
 	var sId = '#bx-std-pcap-menu-popup-' + sName;
 	if($(sId + ':visible').length > 0) {
 		$(sId).dolPopupHide();
@@ -49,15 +51,40 @@ BxDolStudioPage.prototype.togglePopup = function(sName, oLink) {
 
 	$(oLink).parent().addClass('bx-menu-tab-active');
 
+	var oPopupOptions = {
+		pointer:{
+			el:$(oLink)
+		},
+		onHide: function() {
+			$(oLink).parent().removeClass('bx-menu-tab-active');
+		}
+	};
+
+	switch(sName) {
+		case 'help':
+			oPopupOptions = $.extend({}, oPopupOptions, {
+				onShow: function() {
+					var oPopup = $(this);
+					var oPopupRss = oPopup.find('.RSSAggrCont');
+					if(!oPopupRss.find('.bx-loading-ajax').length)
+						return;
+
+					oPopupRss.dolRSSFeed({
+						onError: function() {
+							oPopupRss.html(_t('_adm_txt_show_help_content_empty'));
+							oPopup._dolPopupSetPosition(oPopupOptions);
+						},
+						onShow: function() {
+							oPopup._dolPopupSetPosition(oPopupOptions);
+						}
+					});
+				}
+			});
+			break;
+	}
+
 	if($(sId).html().length > 0)
-		$(sId).dolPopup({
-			pointer:{
-				el:$(oLink)
-			},
-			onHide: function() {
-				$(oLink).parent().removeClass('bx-menu-tab-active');
-			}
-		});
+		$(sId).dolPopup(oPopupOptions);
 };
 
 BxDolStudioPage.prototype.showMessage = function(oData) {

+ 27 - 19
studio/template/scripts/BxBaseStudioPage.php

@@ -19,7 +19,7 @@ class BxBaseStudioPage extends BxDolStudioPage
         parent::__construct($mixedPageName);
     }
 
-    function getPageIndex()
+    public function getPageIndex()
     {
         if(!is_array($this->aPage) || empty($this->aPage))
             return BX_PAGE_DEFAULT;
@@ -30,22 +30,22 @@ class BxBaseStudioPage extends BxDolStudioPage
             return !empty($this->aPage[$this->sPageSelected]['index']) ? (int)$this->aPage[$this->sPageSelected]['index'] : BX_PAGE_DEFAULT;
     }
 
-    function getPageJs()
+    public function getPageJs()
     {
-        return array('jquery.anim.js', 'page.js');
+        return array('jquery.anim.js', 'jquery.jfeed.pack.js', 'jquery.dolRSSFeed.js', 'page.js');
     }
 
-    function getPageJsClass()
+    public function getPageJsClass()
     {
         return '';
     }
 
-    function getPageJsObject()
+    public function getPageJsObject()
     {
         return '';
     }
 
-    function getPageJsCode($aOptions = array(), $bWrap = true)
+    public function getPageJsCode($aOptions = array(), $bWrap = true)
     {
         $sJsClass = $this->getPageJsClass();
         $sJsObject = $this->getPageJsObject();
@@ -63,7 +63,7 @@ class BxBaseStudioPage extends BxDolStudioPage
         return $sContent;
     }
 
-    function getPageCss()
+    public function getPageCss()
     {
         $aCss = array('page.css', 'menu_top.css');
         if((int)$this->aPage['index'] == 3)
@@ -72,7 +72,7 @@ class BxBaseStudioPage extends BxDolStudioPage
         return $aCss;
     }
 
-    function getPageHeader()
+    public function getPageHeader()
     {
         if(empty($this->aPage) || !is_array($this->aPage))
             return '';
@@ -80,12 +80,12 @@ class BxBaseStudioPage extends BxDolStudioPage
         return _t(!$this->bPageMultiple ? $this->aPage['caption'] : $this->aPage[$this->sPageSelected]['caption']);
     }
 
-    function getPageBreadcrumb()
+    public function getPageBreadcrumb()
     {
         return array();
     }
 
-    function getPageCaption()
+    public function getPageCaption()
     {
         if(empty($this->aPage) || !is_array($this->aPage))
             return '';
@@ -144,12 +144,12 @@ class BxBaseStudioPage extends BxDolStudioPage
         return $oTemplate->parseHtmlByName('page_caption.html', $aTmplVars);
     }
 
-    function getPageAttributes()
+    public function getPageAttributes()
     {
         return '';
     }
 
-    function getPageMenu($aMenu, $aMarkers = array())
+    public function getPageMenu($aMenu, $aMarkers = array())
     {
         bx_import('BxTemplStudioMenu');
         $oMenu = new BxTemplStudioMenu(array('template' => 'menu_side.html', 'menu_items' => $aMenu));
@@ -159,14 +159,22 @@ class BxBaseStudioPage extends BxDolStudioPage
         return $oMenu->getCode();
     }
 
-    function getPageCode($bHidden = false) {}
+    public function getPageCode($bHidden = false) {}
 
     protected function getPageCaptionHelp()
     {
-        $oTemplate = BxDolStudioTemplate::getInstance();
+    	$this->sPageRssHelpUrl = bx_replace_markers($this->sPageRssHelpUrl, $this->aMarkers);
+
+    	$GLOBALS['gbBxSysIsRssInitialized'] = true;
 
-        $sContent = _t('_adm_txt_show_help_content_empty');
-        return $oTemplate->parseHtmlByName('page_caption_help.html', array('content' => $sContent));
+    	bx_import('BxTemplFunctions');
+    	$sContent = BxTemplFunctions::getInstance()->getRssHolder($this->sPageRssHelpUrl, $this->iPageRssHelpLength);
+
+        $oTemplate = BxDolStudioTemplate::getInstance();
+    	$oTemplate->addJsTranslation('_adm_txt_show_help_content_empty');
+        return $oTemplate->parseHtmlByName('page_caption_help.html', array(
+        	'content' => $sContent
+        ));
     }
 
     protected function getPageCaptionActions()
@@ -214,7 +222,7 @@ class BxBaseStudioPage extends BxDolStudioPage
      * Block Methods
      *
      */
-    function getBlockCaption($aBlock)
+    public function getBlockCaption($aBlock)
     {
         if(empty($aBlock) || !is_array($aBlock))
             return '';
@@ -252,7 +260,7 @@ class BxBaseStudioPage extends BxDolStudioPage
         return $oTemplate->parseHtmlByName('block_caption.html', $aTmplVars);
     }
 
-    function getBlockPanelTop($aBlock)
+    public function getBlockPanelTop($aBlock)
     {
         if(empty($aBlock) || !is_array($aBlock))
             return '';
@@ -265,7 +273,7 @@ class BxBaseStudioPage extends BxDolStudioPage
         return $oTemplate->parseHtmlByName('block_panel_top.html', $aTmplVars);
     }
 
-    function getBlockPanelBottom($aBlock)
+    public function getBlockPanelBottom($aBlock)
     {
         if(empty($aBlock) || !is_array($aBlock))
             return '';