Просмотр исходного кода

Merge branch 'master' of github.com:boonex/dolphin

Alex Trofimov 13 лет назад
Родитель
Сommit
fb6696e4c5
35 измененных файлов с 390 добавлено и 170 удалено
  1. 21 4
      inc/classes/BxDolCmts.php
  2. 12 0
      inc/classes/BxDolCmtsQuery.php
  3. 93 53
      inc/js/classes/BxDolCmts.js
  4. 15 1
      inc/utils.inc.php
  5. 3 1
      install/index.php
  6. 25 3
      install/sql/v70.sql
  7. 1 1
      modules/boonex/developer/classes/BxDevBuilderPage.php
  8. 1 8
      modules/boonex/developer/classes/BxDevNavigationItems.php
  9. 4 4
      modules/boonex/developer/install/sql/install.sql
  10. 20 4
      modules/boonex/english/data/langs/system.xml
  11. 1 1
      modules/boonex/notes/install/sql/install.sql
  12. 23 6
      modules/boonex/russian/data/langs/system.xml
  13. 1 1
      samples/comments.php
  14. 1 1
      studio/template/scripts/BxBaseStudioNavigationItems.php
  15. 8 0
      template/_header.html
  16. 1 0
      template/bx_img.html
  17. 12 1
      template/comment.html
  18. 1 0
      template/comment_image.html
  19. 1 2
      template/comments_block.html
  20. 5 10
      template/comments_controls.html
  21. 1 1
      template/comments_uploader_bs.html
  22. 2 2
      template/comments_uploader_nfw.html
  23. 33 32
      template/css/cmts.css
  24. 2 1
      template/css/menu.css
  25. BIN
      template/images/icons/apple-touch-icon-114x114.png
  26. BIN
      template/images/icons/apple-touch-icon-120x120.png
  27. BIN
      template/images/icons/apple-touch-icon-144x144.png
  28. BIN
      template/images/icons/apple-touch-icon-152x152.png
  29. BIN
      template/images/icons/apple-touch-icon-57x57.png
  30. BIN
      template/images/icons/apple-touch-icon-72x72.png
  31. BIN
      template/images/icons/apple-touch-icon.png
  32. BIN
      template/images/icons/favicon.ico
  33. 18 0
      template/menu_interactive_vertical.html
  34. 84 32
      template/scripts/BxBaseCmtsView.php
  35. 1 1
      template/scripts/BxBaseFunctions.php

+ 21 - 4
inc/classes/BxDolCmts.php

@@ -31,7 +31,6 @@ define('BX_CMT_ORDER_WAY_DESC', 'desc');
 
 define('BX_CMT_PFP_TOP', 'top');
 define('BX_CMT_PFP_BOTTOM', 'bottom');
-define('BX_CMT_PFP_BOTH', 'both');
 
 define('BX_CMT_RATE_VALUE_PLUS', 1);
 define('BX_CMT_RATE_VALUE_MINUS', -1);
@@ -492,7 +491,7 @@ class BxDolCmts extends BxDol
         if (!$this->isEnabled())
            return '';
 
-        $iCmtId= isset($_REQUEST['CmtId']) ? bx_process_input($_REQUEST['CmtId'], BX_DATA_INT) : 0;
+        $iCmtId = isset($_REQUEST['CmtId']) ? bx_process_input($_REQUEST['CmtId'], BX_DATA_INT) : 0;
         return $this->getPlusedBy($iCmtId);
     }
 
@@ -525,6 +524,15 @@ class BxDolCmts extends BxDol
         return $this->getComments(array('vparent_id' => $iCmtVParentId, 'start' => $iCmtStart, 'per_view' => $iCmtPerView, 'type' => $sCmtBrowse), array('type' => $sCmtDisplay));
     }
 
+	function actionGetImage ()
+    {
+    	if (!$this->isEnabled())
+           return '';
+
+		$iImgId = bx_process_input(bx_get('ImgId'), BX_DATA_INT);
+        return $this->getImage($iImgId);
+    }
+
     function actionSubmitPostForm()
     {
         if(!$this->isEnabled() || !$this->isPostReplyAllowed()) {
@@ -584,6 +592,15 @@ class BxDolCmts extends BxDol
         if($this->_oQuery->removeComment ($this->getId(), $aCmt['cmt_id'], $aCmt['cmt_parent_id'])) {
         	$this->_triggerComment();
 
+        	bx_import('BxDolStorage');
+			$oStorage = BxDolStorage::getObjectInstance($this->_sStorageObject);
+
+			$aImages = $this->_oQuery->getImages($this->_aSystem['system_id'], $aCmt['cmt_id']);
+			foreach($aImages as $aImage)
+				$oStorage->deleteFile($aImage['image_id']);
+
+        	$this->_oQuery->deleteImages($this->_aSystem['system_id'], $aCmt['cmt_id']);
+
 	        if($aCmt['cmt_author_id'] == $iCmtAuthorId)
 				$this->isRemoveAllowed(true);
 
@@ -606,7 +623,7 @@ class BxDolCmts extends BxDol
         }
 
         if (!$this->isRateAllowed()) {
-        	$this->_echoResultJson(array('msg' => _t('_Access denied')));
+        	$this->_echoResultJson(array('msg' => $this->msgErrRateAllowed()));
         	return ;
         }
 
@@ -642,7 +659,7 @@ class BxDolCmts extends BxDol
 	        return;
         }
 
-        $this->_echoResultJson(array('msg' => _t('_cmt_err_cannot_perform_action')));
+        $this->_echoResultJson(array('msg' => _t('_cmt_err_duplicate')));
     }
 
     /** 

+ 12 - 0
inc/classes/BxDolCmtsQuery.php

@@ -193,6 +193,18 @@ class BxDolCmtsQuery extends BxDolDb
 		return (int)$this->query($sQuery) > 0;
 	}
 
+    function getImages($iSystemId, $iCmtId)
+    {
+    	$sQuery = $this->prepare("SELECT * FROM `{$this->_sTableImages2Entries}` WHERE `system_id`=? AND `cmt_id`=?", $iSystemId, $iCmtId);
+    	return $this->getAll($sQuery);
+    }
+
+	function deleteImages($iSystemId, $iCmtId)
+	{
+		$sQuery = $this->prepare("DELETE FROM `{$this->_sTableImages2Entries}` WHERE `system_id`=? AND `cmt_id`=?", $iSystemId, $iCmtId);
+    	return $this->query($sQuery);
+	}
+
     function updateRepliesCount($iCmtId, $iCount)
     {
     	$sQuery = $this->prepare("UPDATE `{$this->_sTable}` SET `cmt_replies`=`cmt_replies`+? WHERE `cmt_id`=? LIMIT 1", $iCount, $iCmtId);

+ 93 - 53
inc/js/classes/BxDolCmts.js

@@ -61,9 +61,10 @@ BxDolCmts.prototype.cmtAfterPostSubmit = function (oCmtForm, oData)
 	if(oData && oData.id != undefined) {
 		var iCmtId = parseInt(oData.id);
         if(iCmtId > 0) {
-            $(oCmtForm).find(':input:not(:button,:submit,[type = hidden],[type = radio],[type = checkbox])').val('');
-            $(oCmtForm).find('.bx-form-warn').hide().html('');
             this._getCmt(oCmtForm, iCmtId);
+            this._getForm(undefined, parseInt(oData.parent_id), function(sForm) {
+            	oCmtForm.parents('.cmt-reply:first').hide().html($(sForm).html()).show();
+            });
         }
 
         return;
@@ -220,9 +221,9 @@ BxDolCmts.prototype.cmtRate = function(e, iCmtId, iRate)
                 alert(oData.msg);
 
             if(oData && oData.id != undefined && oData.rate != undefined) {
-	            var oPoints = $(e).parents('.cmt:first').find('.cmt-points span');
+	            var oPoints = $(e).parents('.cmt:first').find('.cmt-points:first span');
 	            oPoints.html(parseInt(oPoints.html()) + oData.rate).parents('.cmt-points-wrp:first').bx_anim(parseInt(oPoints.html()) > 0 ? 'show' : 'hide');
-	
+
 	            $(e).hide().siblings('.cmt-comment-vote:hidden').show();
             }
         },
@@ -280,58 +281,66 @@ BxDolCmts.prototype.showMore = function(oLink)
 	$(oLink).parent('span').next('span').show().prev('span').remove();
 };
 
+BxDolCmts.prototype.showImage = function(oLink, iId) {
+	var $this = this;
+
+    var oData = this._getDefaultActions();
+    oData['action'] = 'GetImage';
+    oData['ImgId'] = iId;
+
+    if(oLink)
+    	this._loadingInContent(oLink, true);
+
+    jQuery.post (
+        this._sActionsUrl,
+        oData,
+        function (s) {
+        	var oPopup = $(s).hide(); 
+
+	    	$('#' + oPopup.attr('id')).remove();
+	        oPopup.prependTo('body').find('img').bind('load', function() {
+	        	if(oLink)
+	        		$this._loadingInContent(oLink, false);
+
+	        	$(this).parents('.cmt-attached-image').dolPopup({
+		        	fog: {
+						color: '#fff',
+						opacity: .7
+		            }
+		        });	        	
+	        });	        
+        }
+    );
+};
+
 BxDolCmts.prototype.toggleReply = function(e, iCmtParentId)
 {
+	var $this = this;
 	var sParentId = this._sRootId + ' #cmt' + iCmtParentId;
-	var sReplyId = sParentId + ' > .cmt-reply';
 
-    if ($(sReplyId).length)
+	var sReplyId = sParentId + ' > .cmt-reply';
+    if ($(sReplyId).length) {
 		$(sReplyId).bx_anim('toggle', this._sAnimationEffect, this._iAnimationSpeed);
-    else {
-        var $this = this;
-        var oData = this._getDefaultActions();
-        oData['action'] = 'GetFormPost';
-        oData['CmtType'] = 'reply';
-        oData['CmtParent'] = iCmtParentId;
-        oData['CmtBrowse'] = this._sBrowseType;
-        oData['CmtDisplay'] = this._sDisplayType;
-
-        $this._loadingInContent(e, true);
-
-        jQuery.post (
-            this._sActionsUrl,
-            oData,
-            function (s) {
-                $this._loadingInContent(e, false);
-
-                var oForm = $(s).css('display', 'none');
-                var sFormClass = oForm.attr('class');
-                var oFormSibling = $(sParentId + ' > ul.cmts:first');
-                switch($this._sPostFormPosition) {
-                	case 'top':
-                		oForm.addClass('cmt-reply-margin').addClass(sFormClass + '-' + $this._sPostFormPosition);
-                		oFormSibling.before(oForm);
-                		break;
-
-                	case 'bottom':
-                		oForm.addClass('cmt-reply-margin').addClass(sFormClass + '-' + $this._sPostFormPosition);
-                		oFormSibling.after(oForm);
-                		break;
-
-                	case 'both':
-                		var oFormClone = oForm.clone();
-
-                		oForm.addClass('cmt-reply-margin').addClass(sFormClass + '-top');
-                		oFormSibling.before(oForm);
-
-                		oFormClone.addClass('cmt-reply-margin').addClass(sFormClass + '-bottom');
-                		oFormSibling.after(oFormClone);
-                		break;
-                }
-            	$(sParentId).children('.cmt-reply').bx_anim('toggle', $this._sAnimationEffect, $this._iAnimationSpeed);
-            }
-        );
+		return;
     }
+
+	this._getForm(e, iCmtParentId, function(sForm) {
+		var oForm = $(sForm).css('display', 'none');
+        var sFormClass = oForm.attr('class');
+        var oFormSibling = $(sParentId + ' > ul.cmts:first');
+        switch($this._sPostFormPosition) {
+        	case 'top':
+        		oForm.addClass('cmt-reply-margin').addClass(sFormClass + '-' + $this._sPostFormPosition);
+        		oFormSibling.before(oForm);
+        		break;
+
+        	case 'bottom':
+        		oForm.addClass('cmt-reply-margin').addClass(sFormClass + '-' + $this._sPostFormPosition);
+        		oFormSibling.after(oForm);
+        		break;
+        }
+    	$(sParentId).children('.cmt-reply').bx_anim('toggle', $this._sAnimationEffect, $this._iAnimationSpeed);    		
+	});
 };
 
 BxDolCmts.prototype.toggleManagePopup = function(oLink, iCmtId) {
@@ -360,7 +369,7 @@ BxDolCmts.prototype.togglePlusedByPopup = function(oLink, iCmtId) {
     	return;
     }
 
-	$this._loadingInContent(oLink, true);
+	this._loadingInContent(oLink, true);
 
 	jQuery.post (
 		this._sActionsUrl,
@@ -451,6 +460,35 @@ BxDolCmts.prototype._getCmts = function (e, iCmtParentId, iStart, iPerView, sBro
     );
 };
 
+BxDolCmts.prototype._getForm = function (e, iCmtParentId, onLoad)
+{
+	var $this = this;
+
+    var oData = this._getDefaultActions();
+    oData['action'] = 'GetFormPost';
+    oData['CmtType'] = 'reply';
+    oData['CmtParent'] = iCmtParentId;
+    oData['CmtBrowse'] = this._sBrowseType;
+    oData['CmtDisplay'] = this._sDisplayType;
+
+    
+    
+    if(e)
+    	this._loadingInContent(e, true);
+
+    jQuery.post (
+        this._sActionsUrl,
+        oData,
+        function (s) {
+        	if(e)
+        		$this._loadingInContent(e, false);
+
+            if(typeof onLoad == 'function')
+    			onLoad(s);
+        }
+    );
+};
+
 BxDolCmts.prototype._cmtsAppend = function(sIdTo, sContent)
 {
 	$(sIdTo).append($(sContent).hide()).children(':hidden').bx_anim('show', this._sAnimationEffect, this._iAnimationSpeed);
@@ -478,9 +516,11 @@ BxDolCmts.prototype._cmtsReplaceContent = function(oParent, sContent)
 };
 
 BxDolCmts.prototype._getDefaultActions = function() {
+	var oDate = new Date();
     return {
-        'sys': this._sSystem,
-        'id': this._iObjId
+        sys: this._sSystem,
+        id: this._iObjId,
+        _t: oDate.getTime()
     };
 };
 

+ 15 - 1
inc/utils.inc.php

@@ -630,7 +630,21 @@ function _format_when ($iSec) {
             $s .= (0 == $i || 1 == $i) ? _t('_x_hour_ago', '1', '') : _t('_x_hour_ago', $i, 's');
         } else {
             $i = round($iSec/60/60/24);
-            $s .= (0 == $i || 1 == $i) ? _t('_1_day_ago') : _t('_x_day_ago', $i, 's');
+            if(0 == $i || 1 == $i)
+            	$s .= _t('_1_day_ago');
+            else if($i > 1 && $i <= 5)
+            	$s .= _t('_x_day_ago', $i, 's');
+            else {
+            	$iNow = mktime();
+            	$iNowDayOfYear = date('z', $iNow);
+
+            	$iDate = $iNow - $iSec; 
+            	$iDay = date('j', $iDate);
+            	$iMonth = date('n', $iDate);
+            	$iYear = date('Y', $iDate);
+
+            	$s .= trim(_t('_day_of_' . $iMonth . '_short', $iDay, ($i > $iNowDayOfYear ? $iYear : '')));
+            }
         }
     } else {
         if ($iSec > -3600) {

+ 3 - 1
install/index.php

@@ -124,6 +124,7 @@ define('BX_DOL_INT_MAX', 2147483647);
 define('BX_DOL_TRANSCODER_OBJ_ICON_APPLE', 'sys_icon_apple');
 define('BX_DOL_TRANSCODER_OBJ_ICON_FACEBOOK', 'sys_icon_facebook');
 define('BX_DOL_TRANSCODER_OBJ_ICON_FAVICON', 'sys_icon_favicon');
+define('BX_DOL_TRANSCODER_OBJ_IMAGE_PREVIEW_CMTS', 'sys_images_cmts_preview');
 
 //--- Module types ---//
 define('BX_DOL_MODULE_TYPE_MODULE', 'module');
@@ -1203,7 +1204,8 @@ function genMainDolphinPage() {
     $aTranscoders = array(
         BX_DOL_TRANSCODER_OBJ_ICON_APPLE, 
         BX_DOL_TRANSCODER_OBJ_ICON_FACEBOOK, 
-        BX_DOL_TRANSCODER_OBJ_ICON_FAVICON
+        BX_DOL_TRANSCODER_OBJ_ICON_FAVICON,
+        BX_DOL_TRANSCODER_OBJ_IMAGE_PREVIEW_CMTS
     );
 
     bx_import('BxDolImageTranscoder');

+ 25 - 3
install/sql/v70.sql

@@ -1018,6 +1018,27 @@ CREATE TABLE IF NOT EXISTS `sys_images_cmts` (
 
 -- --------------------------------------------------------
 
+--
+-- Table structure for table `sys_images_cmts_preview`
+--
+CREATE TABLE IF NOT EXISTS `sys_images_cmts_preview` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `remote_id` varchar(255) 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` int(11) 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 structure for table `sys_images_cmts2entries`
 --
@@ -1313,7 +1334,8 @@ CREATE TABLE IF NOT EXISTS `sys_objects_storage` (
 
 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
 ('sys_images', 'Local', '', 360, 2592000, 0, 'sys_images', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0),
-('sys_images_cmts', 'Local', '', 360, 2592000, 3, 'sys_images_cmts', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0);
+('sys_images_cmts', 'Local', '', 360, 2592000, 3, 'sys_images_cmts', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0),
+('sys_images_cmts_preview', 'Local', '', 360, 2592000, 3, 'sys_images_cmts_preview', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0);
 
 CREATE TABLE IF NOT EXISTS `sys_storage_user_quotas` (
   `profile_id` int(11) NOT NULL,
@@ -2481,7 +2503,7 @@ INSERT INTO `sys_form_display_inputs` (`display_name`, `input_name`, `visible_fo
 ('sys_comment_edit', 'cmt_id', 2147483647, 1, 4),
 ('sys_comment_edit', 'cmt_parent_id', 2147483647, 1, 5),
 ('sys_comment_edit', 'cmt_text', 2147483647, 1, 6),
-('sys_comment_edit', 'cmt_image', 2147483647, 1, 7),
+('sys_comment_edit', 'cmt_image', 2147483647, 0, 7),
 ('sys_comment_edit', 'cmt_submit', 2147483647, 1, 8);
 
 
@@ -3185,7 +3207,7 @@ INSERT INTO `sys_objects_transcoder_images` (`object`, `storage_object`, `source
 ('sys_icon_apple', 'sys_images', 'Storage', 'a:1:{s:6:"object";s:10:"sys_images";}', 'no', '0', '0', '0'),
 ('sys_icon_facebook', 'sys_images', 'Storage', 'a:1:{s:6:"object";s:10:"sys_images";}', 'no', '0', '0', '0'),
 ('sys_icon_favicon', 'sys_images', 'Storage', 'a:1:{s:6:"object";s:10:"sys_images";}', 'no', '0', '0', '0'),
-('sys_images_cmts_preview', 'sys_images_cmts', 'Storage', 'a:1:{s:6:"object";s:15:"sys_images_cmts";}', 'no', '1', '2592000', '0');
+('sys_images_cmts_preview', 'sys_images_cmts_preview', 'Storage', 'a:1:{s:6:"object";s:15:"sys_images_cmts";}', 'no', '1', '2592000', '0');
 
 
 CREATE TABLE IF NOT EXISTS `sys_transcoder_images_files` (

+ 1 - 1
modules/boonex/developer/classes/BxDevBuilderPage.php

@@ -412,7 +412,7 @@ class BxDevBuilderPage extends BxTemplStudioBuilderPage {
         parent::onSaveBlock($oForm, $aBlock);
 
         if($aBlock['type'] == BX_DOL_STUDIO_BP_BLOCK_SERVICE && isset($oForm->aInputs['content'])) {
-            $sValue = BxDolForm::getSubmittedValue('content', $oForm->aFormAttrs['method']);
+            $sValue = $oForm->getCleanValue('content');
             $sValue = BxDevFunctions::serializeString($sValue);
             BxDolForm::setSubmittedValue('content', $sValue, $oForm->aFormAttrs['method']);
         }

+ 1 - 8
modules/boonex/developer/classes/BxDevNavigationItems.php

@@ -105,7 +105,7 @@ class BxDevNavigationItems extends BxTemplStudioNavigationItems {
         }
         else {
             bx_import('BxTemplStudioFunctions');
-            $sContent = BxTemplStudioFunctions::getInstance()->popupBox('bx-dev-nav-item-edit-popup', _t('_bx_dev_nav_txt_items_edit_popup', _t($aItem['title'])), $this->oModule->_oTemplate->parseHtmlByName('nav_add_item.html', array(
+            $sContent = BxTemplStudioFunctions::getInstance()->popupBox('bx-dev-nav-item-edit-popup', _t('_bx_dev_nav_txt_items_edit_popup', _t($aItem['title_system'])), $this->oModule->_oTemplate->parseHtmlByName('nav_add_item.html', array(
                 'form_id' => $oForm->aFormAttrs['id'],
                 'form' => $oForm->getCode(true),
                 'object' => $this->_sObject,
@@ -124,13 +124,6 @@ class BxDevNavigationItems extends BxTemplStudioNavigationItems {
         $aInputs['module']['values'] = array_merge(array('' => _t('_bx_dev_nav_txt_select_module')), BxDolStudioUtils::getModules());
         $aInputs['module']['value'] = $this->sModule;
 
-        $aSets = array();
-        $this->oDb->getSets(array('type' => 'by_module', 'value' => $this->sModule), $aSets, false);
-        foreach($aSets as $aSet)
-            $aInputs['set_name']['values'][$aSet['set_name']] = _t($aSet['title']);
-
-        asort($aInputs['set_name']['values']);
-        $aInputs['set_name']['values'] = array_merge(array('' => _t('_bx_dev_nav_txt_select_set')), $aInputs['set_name']['values']);
         $aInputs['set_name']['value'] = $this->sSet;
     }
 }

+ 4 - 4
modules/boonex/developer/install/sql/install.sql

@@ -393,10 +393,10 @@ INSERT INTO `sys_form_displays` (`display_name`, `module`, `object`, `title`, `v
 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
 ('mod_dev_nav_item', @sName, 'id', '0', '', 0, 'hidden', '_bx_dev_nav_txt_sys_items_id', '', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 0, 0),
 ('mod_dev_nav_item', @sName, 'module', '', '', 0, 'select', '_bx_dev_nav_txt_sys_items_module', '_bx_dev_nav_txt_items_module', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_dev_nav_err_items_module', 'Xss', '', 0, 0),
-('mod_dev_nav_item', @sName, 'set_name', '', '', 0, 'select', '_bx_dev_nav_txt_sys_items_set_name', '_bx_dev_nav_txt_items_set_name', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_dev_nav_err_items_set_name', 'Xss', '', 0, 0),
-('mod_dev_nav_item', @sName, 'name', '', '', 0, 'text', '_bx_dev_nav_txt_sys_items_name', '_bx_dev_nav_txt_items_name', '', 1, 0, 0, '', '', '', 'Length', 'a:2:{s:3:"min";i:6;s:3:"max";i:100;}', '_bx_dev_nav_err_items_name', 'Xss', '', 0, 0),
-('mod_dev_nav_item', @sName, 'title_system', '', '', 0, 'text', '_bx_dev_nav_txt_sys_items_title_system', '_bx_dev_nav_txt_items_title_system', '', 1, 0, 0, '', '', '', 'Length', 'a:2:{s:3:"min";i:6;s:3:"max";i:100;}', '_bx_dev_nav_err_items_title_system', 'Xss', '', 0, 0),
-('mod_dev_nav_item', @sName, 'title', '', '', 0, 'text', '_bx_dev_nav_txt_sys_items_title', '_bx_dev_nav_txt_items_title', '', 1, 0, 0, '', '', '', 'Length', 'a:2:{s:3:"min";i:6;s:3:"max";i:100;}', '_bx_dev_nav_err_items_title', 'Xss', '', 0, 0),
+('mod_dev_nav_item', @sName, 'set_name', '', '', 0, 'text', '_bx_dev_nav_txt_sys_items_set_name', '_bx_dev_nav_txt_items_set_name', '', 0, 0, 0, 'a:1:{s:8:"readonly";s:8:"readonly";}', '', '', 'Avail', '', '_bx_dev_nav_err_items_set_name', 'Xss', '', 0, 0),
+('mod_dev_nav_item', @sName, 'name', '', '', 0, 'text', '_bx_dev_nav_txt_sys_items_name', '_bx_dev_nav_txt_items_name', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_dev_nav_err_items_name', 'Xss', '', 0, 0),
+('mod_dev_nav_item', @sName, 'title_system', '', '', 0, 'text', '_bx_dev_nav_txt_sys_items_title_system', '_bx_dev_nav_txt_items_title_system', '', 1, 0, 0, '', '', '', 'Avail', '', '_bx_dev_nav_err_items_title_system', 'Xss', '', 0, 0),
+('mod_dev_nav_item', @sName, 'title', '', '', 0, 'text', '_bx_dev_nav_txt_sys_items_title', '_bx_dev_nav_txt_items_title', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('mod_dev_nav_item', @sName, 'link', '', '', 0, 'text', '_bx_dev_nav_txt_sys_items_link', '_bx_dev_nav_txt_items_link', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('mod_dev_nav_item', @sName, 'onclick', '', '', 0, 'text', '_bx_dev_nav_txt_sys_items_onclick', '_bx_dev_nav_txt_items_onclick', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),
 ('mod_dev_nav_item', @sName, 'target', '', '', 0, 'text', '_bx_dev_nav_txt_sys_items_target', '_bx_dev_nav_txt_items_target', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 0, 0),

+ 20 - 4
modules/boonex/english/data/langs/system.xml

@@ -1139,10 +1139,11 @@ Please click "Continue" below to navigate to the home page of the site.]]></stri
 	<string name="_enable able to rate"><![CDATA[Enable rate]]></string>
 	<string name="_disable able to rate"><![CDATA[Disable rate]]></string>
 	<string name="_member_banned"><![CDATA[Sorry, you\'ve been banned]]></string>
-	<string name="_1_minute_ago"><![CDATA[Just now]]></string>
-	<string name="_x_minute_ago"><![CDATA[{0} minute{1} ago]]></string>
-	<string name="_x_hour_ago"><![CDATA[{0} hour{1} ago]]></string>
-	<string name="_x_day_ago"><![CDATA[{0} day{1} ago]]></string>
+	<string name="_1_minute_ago"><![CDATA[Now]]></string>
+	<string name="_x_minute_ago"><![CDATA[{0} m ago]]></string>
+	<string name="_x_hour_ago"><![CDATA[{0} h ago]]></string>
+	<string name="_x_day_ago"><![CDATA[{0} d ago]]></string>
+	<string name="_x_day_y_month"><![CDATA[{0} {1}]]></string>
 	<string name="_1_day_ago"><![CDATA[Yesterday]]></string>
 	<string name="_in_1_minute"><![CDATA[Just now]]></string>
 	<string name="_in_x_minute"><![CDATA[In {0} minute{1}]]></string>
@@ -1180,7 +1181,10 @@ Please click "Continue" below to navigate to the home page of the site.]]></stri
 	<string name="_cmt_browse_connection"><![CDATA[Connection]]></string>
 	<string name="_cmt_page_view_header"><![CDATA[Comment to {0}]]></string>
 	<string name="_cmt_page_view_title"><![CDATA[Comment to <a href="{0}">{1}</a>]]></string>
+	<string name="_cmt_block_comments_title"><![CDATA[Comments ({0})]]></string>
+	<string name="_cmt_view_attached_image"><![CDATA[View attached image]]></string>
 	<string name="_cmt_err_cannot_perform_action"><![CDATA[Cannot perform action. Please report.]]></string>
+	<string name="_cmt_err_duplicate"><![CDATA[Duplicate vote.]]></string>
 	<string name="_Reply_to_this_comment"><![CDATA[Reply]]></string>
 	<string name="_Add Your Comment"><![CDATA[Comment]]></string>
 	<string name="_load_more_comments_head"><![CDATA[See Newer Comments...]]></string>
@@ -1222,17 +1226,29 @@ Please click "Continue" below to navigate to the home page of the site.]]></stri
 	<string name="_FieldValues_Suspended"><![CDATA[Suspended]]></string>
 	<string name="_for"><![CDATA[for]]></string>
 	<string name="_day_of_1"><![CDATA[{0} January, {1}]]></string>
+	<string name="_day_of_1_short"><![CDATA[{0} Jan {1}]]></string>
 	<string name="_day_of_2"><![CDATA[{0} February, {1}]]></string>
+	<string name="_day_of_2_short"><![CDATA[{0} Feb {1}]]></string>
 	<string name="_day_of_3"><![CDATA[{0} March, {1}]]></string>
+	<string name="_day_of_3_short"><![CDATA[{0} Mar {1}]]></string>
 	<string name="_day_of_4"><![CDATA[{0} April, {1}]]></string>
+	<string name="_day_of_4_short"><![CDATA[{0} Apr {1}]]></string>
 	<string name="_day_of_5"><![CDATA[{0} May, {1}]]></string>
+	<string name="_day_of_5_short"><![CDATA[{0} May {1}]]></string>
 	<string name="_day_of_6"><![CDATA[{0} June, {1}]]></string>
+	<string name="_day_of_6_short"><![CDATA[{0} Jun {1}]]></string>
 	<string name="_day_of_7"><![CDATA[{0} July, {1}]]></string>
+	<string name="_day_of_7_short"><![CDATA[{0} Jul {1}]]></string>
 	<string name="_day_of_8"><![CDATA[{0} August, {1}]]></string>
+	<string name="_day_of_8_short"><![CDATA[{0} Aug {1}]]></string>
 	<string name="_day_of_9"><![CDATA[{0} September, {1}]]></string>
+	<string name="_day_of_9_short"><![CDATA[{0} Sep {1}]]></string>
 	<string name="_day_of_10"><![CDATA[{0} October, {1}]]></string>
+	<string name="_day_of_10_short"><![CDATA[{0} Oct {1}]]></string>
 	<string name="_day_of_11"><![CDATA[{0} November, {1}]]></string>
+	<string name="_day_of_11_short"><![CDATA[{0} Nov {1}]]></string>
 	<string name="_day_of_12"><![CDATA[{0} December, {1}]]></string>
+	<string name="_day_of_12_short"><![CDATA[{0} Dec {1}]]></string>
 	<string name="_Clear"><![CDATA[Clear]]></string>
 	<string name="_SubCategory is required"><![CDATA[SubCategory is required]]></string>
 	<string name="_Send eCard"><![CDATA[Send eCard]]></string>

+ 1 - 1
modules/boonex/notes/install/sql/install.sql

@@ -61,7 +61,7 @@ CREATE TABLE IF NOT EXISTS `bx_notes_cmts` (
   `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` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+  `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`)

+ 23 - 6
modules/boonex/russian/data/langs/system.xml

@@ -1139,12 +1139,17 @@ Please click "Continue" below to navigate to the home page of the site.]]></stri
 	<string name="_enable able to rate"><![CDATA[Enable rate]]></string>
 	<string name="_disable able to rate"><![CDATA[Disable rate]]></string>
 	<string name="_member_banned"><![CDATA[Sorry, you\'ve been banned]]></string>
-	<string name="_x_minute_ago"><![CDATA[{0} Minute{1} Ago]]></string>
-	<string name="_x_hour_ago"><![CDATA[{0} Hour{1} Ago]]></string>
-	<string name="_x_day_ago"><![CDATA[{0} Day{1} Ago]]></string>
-	<string name="_in_x_minute"><![CDATA[In {0} Minute{1}]]></string>
-	<string name="_in_x_hour"><![CDATA[In {0} Hour{1}]]></string>
-	<string name="_in_x_day"><![CDATA[In {0} Day{1}]]></string>
+	<string name="_1_minute_ago"><![CDATA[Now]]></string>
+	<string name="_x_minute_ago"><![CDATA[{0} m ago]]></string>
+	<string name="_x_hour_ago"><![CDATA[{0} h ago]]></string>
+	<string name="_x_day_ago"><![CDATA[{0} d ago]]></string>
+	<string name="_x_day_y_month"><![CDATA[{0} {1}]]></string>
+	<string name="_1_day_ago"><![CDATA[Yesterday]]></string>
+	<string name="_in_1_minute"><![CDATA[Just now]]></string>
+	<string name="_in_x_minute"><![CDATA[In {0} minute{1}]]></string>
+	<string name="_in_x_hour"><![CDATA[In {0} hour{1}]]></string>
+	<string name="_in_x_day"><![CDATA[In {0} day{1}]]></string>
+	<string name="_in_1_day"><![CDATA[Tomorrow]]></string>
 	<string name="_Shoutbox"><![CDATA[Shoutbox]]></string>
 	<string name="_powered_by"><![CDATA[Powered by]]></string>
 	<string name="_about_BoonEx"><![CDATA[BoonEx - Community Software;  Dating And Social Networking Scripts; Video Chat And More.]]></string>
@@ -1198,17 +1203,29 @@ Please click "Continue" below to navigate to the home page of the site.]]></stri
 	<string name="_FieldValues_Suspended"><![CDATA[Suspended]]></string>
 	<string name="_for"><![CDATA[for]]></string>
 	<string name="_day_of_1"><![CDATA[{0} January, {1}]]></string>
+	<string name="_day_of_1_short"><![CDATA[{0} Jan {1}]]></string>
 	<string name="_day_of_2"><![CDATA[{0} February, {1}]]></string>
+	<string name="_day_of_2_short"><![CDATA[{0} Feb {1}]]></string>
 	<string name="_day_of_3"><![CDATA[{0} March, {1}]]></string>
+	<string name="_day_of_3_short"><![CDATA[{0} Mar {1}]]></string>
 	<string name="_day_of_4"><![CDATA[{0} April, {1}]]></string>
+	<string name="_day_of_4_short"><![CDATA[{0} Apr {1}]]></string>
 	<string name="_day_of_5"><![CDATA[{0} May, {1}]]></string>
+	<string name="_day_of_5_short"><![CDATA[{0} May {1}]]></string>
 	<string name="_day_of_6"><![CDATA[{0} June, {1}]]></string>
+	<string name="_day_of_6_short"><![CDATA[{0} Jun {1}]]></string>
 	<string name="_day_of_7"><![CDATA[{0} July, {1}]]></string>
+	<string name="_day_of_7_short"><![CDATA[{0} Jul {1}]]></string>
 	<string name="_day_of_8"><![CDATA[{0} August, {1}]]></string>
+	<string name="_day_of_8_short"><![CDATA[{0} Aug {1}]]></string>
 	<string name="_day_of_9"><![CDATA[{0} September, {1}]]></string>
+	<string name="_day_of_9_short"><![CDATA[{0} Sep {1}]]></string>
 	<string name="_day_of_10"><![CDATA[{0} October, {1}]]></string>
+	<string name="_day_of_10_short"><![CDATA[{0} Oct {1}]]></string>
 	<string name="_day_of_11"><![CDATA[{0} November, {1}]]></string>
+	<string name="_day_of_11_short"><![CDATA[{0} Nov {1}]]></string>
 	<string name="_day_of_12"><![CDATA[{0} December, {1}]]></string>
+	<string name="_day_of_12_short"><![CDATA[{0} Dec {1}]]></string>
 	<string name="_Clear"><![CDATA[Clear]]></string>
 	<string name="_SubCategory is required"><![CDATA[SubCategory is required]]></string>
 	<string name="_Send eCard"><![CDATA[Send eCard]]></string>

+ 1 - 1
samples/comments.php

@@ -83,7 +83,7 @@ function PageCompMainCode() {
 	if(!$oCmts->isEnabled())
 		return '';
 
-    return DesignBoxContent("Comments",  $oCmts->getCommentsBlock(), BX_DB_PADDING_DEF);
+    return $oCmts->getCommentsBlock();
 }
 
 /** @} */

+ 1 - 1
studio/template/scripts/BxBaseStudioNavigationItems.php

@@ -220,7 +220,7 @@ class BxBaseStudioNavigationItems extends BxDolStudioNavigationItems {
                 bx_import('BxDolStudioLanguagesUtils');
                 $sLanguage = BxDolStudioLanguagesUtils::getInstance()->getCurrentLangName(false);
 
-                $sName = BxDolForm::getSubmittedValue('title-' . $sLanguage, $aForm['form_attrs']['method']);
+                $sName = BxDolForm::getSubmittedValue('title_system-' . $sLanguage, $aForm['form_attrs']['method']);
                 $sName = uriGenerate($sName, 'sys_menu_items', 'name', 'item');
             }
 

+ 8 - 0
template/_header.html

@@ -11,6 +11,14 @@
     __page_icons__
 
     <meta http-equiv="Content-Style-Type" content="text/css" />
+	<link rel="shortcut icon" href="<bx_icon_url:favicon.ico />" type="image/x-icon" />
+	<link rel="apple-touch-icon" href="<bx_icon_url:apple-touch-icon.png />" />
+	<link rel="apple-touch-icon" sizes="57x57" href="<bx_icon_url:apple-touch-icon-57x57.png />" />
+	<link rel="apple-touch-icon" sizes="72x72" href="<bx_icon_url:apple-touch-icon-72x72.png />" />
+	<link rel="apple-touch-icon" sizes="114x114" href="<bx_icon_url:apple-touch-icon-114x114.png />" />
+	<link rel="apple-touch-icon" sizes="120x120" href="<bx_icon_url:apple-touch-icon-120x120.png />" />
+	<link rel="apple-touch-icon" sizes="144x144" href="<bx_icon_url:apple-touch-icon-144x144.png />" />
+	<link rel="apple-touch-icon" sizes="152x152" href="<bx_icon_url:apple-touch-icon-152x152.png />" />    
     <style>
         .bx-def-page-width {
             width:__main_div_width__;

+ 1 - 0
template/bx_img.html

@@ -0,0 +1 @@
+<img <bx_if:class>class="__content__"</bx_if:class> src="__src__" alt="__alt__" title="__alt__" />

+ 12 - 1
template/comment.html

@@ -1,5 +1,5 @@
 <li id="cmt__id__" class="__style_prefix____class__">
-	<a id="__system____id__" class="bx-anchor-invisible">&nbsp;</a>
+	<a id="__system____id__" class="__style_prefix__-anchor bx-anchor-invisible">&nbsp;</a>
 	<div class="__style_prefix__-author">
 		<div class="__style_prefix__-icon bx-def-icon bx-def-icon-size">
 			<bx_if:show_icon>
@@ -30,6 +30,17 @@
 			<div class="__style_prefix__-body bx-def-margin-thd-topbottom">
 				__text__<bx_if:show_more><span class="__style_prefix__-body-see-more">... <a class="bx-def-font-small" href="javascript:void(0)" onclick="__js_object__.showMore(this);"><bx_text:_see_more /></a></span><span style="display:none;"> __text_more__</span></bx_if:show_more>
 			</div>
+			<bx_if:show_attached>
+				<div class="__style_prefix__-attached bx-def-margin-thd-topbottom bx-clearfix">
+					<bx_repeat:attached>
+						<div class="__style_prefix__-attached-preview bx-def-thumb bx-def-margin-sec-left-auto">
+							<a href="javascript:void(0)" onclick="__js_object__.showImage(this, __id__); return false;" title="<bx_text:_cmt_view_attached_image />">
+								<img src="<bx_image_url:spacer.gif />" style="background-image:url(__image__)" />
+							</a>
+						</div>
+					</bx_repeat:attached>
+				</div>
+			</bx_if:show_attached>
 		</div>
 	</div>
 	__actions__

+ 1 - 0
template/comment_image.html

@@ -0,0 +1 @@
+<div id="__id__" class="__style_prefix__-attached-image" style="display:none;">__content__</div>

+ 1 - 2
template/comments_block.html

@@ -1,7 +1,6 @@
 <div id="cmts-box-__system__-__id__">
 	__post_form_top__
-	__controls__
-	<div id="cmt0" class="cmts bx-def-margin-top">
+	<div id="cmt0" class="cmts">
 		<ul class="cmts">
 			<bx_if:show_empty>
 				<li class="__style_prefix__-no">

+ 5 - 10
template/comments_controls.html

@@ -1,10 +1,5 @@
-<div class="__style_prefix__-browse bx-def-margin-top-auto bx-clearfix">
-	<div class="__style_prefix__-browse-left bx-def-font-h3">__comments_count__</div>
-	<div class="__style_prefix__-browse-right bx-def-font-small bx-clearfix">
-		__display_switcher__
-		<bx_if:is_divider>
-			<div class="__style_prefix__-browse-type-div">|</div>
-		</bx_if:is_divider>
-		__browse_switcher__
-	</div>
-</div>
+__display_switcher__
+<bx_if:is_divider>
+	<div class="bx-def-hr bx-def-margin-sec-topbottom"></div>
+</bx_if:is_divider>
+__browse_switcher__

+ 1 - 1
template/comments_uploader_bs.html

@@ -1,4 +1,4 @@
-    <a href="javascript:void(0);" onclick="__uploader_instance_name__.showUploaderForm();" class="bx-btn bx-btn-small bx-def-margin-sec-left cmts-uploader-button">
+    <a href="javascript:void(0);" onclick="__uploader_instance_name__.showUploaderForm();" class="bx-btn bx-btn-small bx-def-margin-sec-top bx-def-margin-sec-left cmts-uploader-button">
     	<i class="sys-icon __button_title__"></i>
     </a>
     <script>

+ 2 - 2
template/comments_uploader_nfw.html

@@ -1,6 +1,6 @@
 <div id="bx-uploader-file-{file_id}" class="cmts-uploader-file bx-def-margin-sec-top bx-def-margin-sec-left-auto">
-    <div class="cmts-uploader-file-preview bx-def-border">
-        <img src="{file_icon}" />
+    <div class="cmts-uploader-file-preview bx-def-thumb">
+    	<img src="<bx_image_url:spacer.gif />" style="background-image:url({file_icon})" />
     </div>
     <div class="cmts-uploader-file-actions bx-def-margin-thd-top bx-clearfix">
     	<a class="bx-btn bx-btn-small" href="javascript:void(0);" onclick="{js_instance_name}.deleteGhost('{file_id}')"><bx_text:_Delete /></a>

+ 33 - 32
template/css/cmts.css

@@ -40,35 +40,6 @@
        color: #333333;
     }
 
-	/*--- Browse Styles ---*/
-    div.cmt-browse {
-
-    }
-    div.cmt-browse-left {
-		position: relative;
-    	float: left;
-    }
-    div.cmt-browse-right {
-    	position: relative;
-    	float: right;
-	}
-	div.cmt-browse-right ul.bx-menu-inter  {
-		float: left;
-	}
-
-	div.cmt-browse-item,
-	div.cmt-browse-item-div,
-	div.cmt-browse-type-div {
-		position: relative;
-		float: left;
-	}
-	div.cmt-browse-item-div {
-		padding: 0px 3px;
-	}
-	div.cmt-browse-type-div {
-		padding: 0px 5px;
-	}
-
 	/*--- More ---*/
     li.cmt-more {}
 	li.cmt-more-root {}
@@ -181,6 +152,26 @@
 		font-weight: bold;
     }
 
+    div.cmt-attached-preview,
+    div.cmt-attached-preview img {
+    	width: 100px;
+    	height: 100px;
+    }
+    div.cmt-attached-preview {
+    	position: relative;
+    	float: left;
+	}
+	div.cmt-attached-preview img {
+		background-position: center center;
+		background-repeat: no-repeat;
+	}
+
+	div.cmt-attached-image img {
+		position: relative;
+		max-width: 600px;
+		max-height: 600px;
+	}
+	
     /*--- Comment Actions ---*/
 	div.cmt-actions {
 		position: relative;
@@ -191,6 +182,8 @@
 		text-decoration: none;
     }
     div.cmt-actions i.sys-icon {
+    	display: inline-block;
+    	 
     	font-size: 1.5em;
 	}
     div.cmt-comment-manage {
@@ -240,18 +233,26 @@
     form.cmt-post-reply .bx-form-input-submit {
     	text-transform: uppercase;
     }
+    form.cmt-post-reply div#bx-form-element-cmt_image,
     form.cmt-post-reply .bx-form-input-files-uploaders {
-		text-align: right;
+		margin-top: 0px;
     }
 
     a.cmts-uploader-button {
-		
+		position: absolute;
+    	right: 0px;
+    	text-decoration: none;
     }
     div.cmts-uploader-file {
 		position: relative;
     	float: left;
     }
-    div.cmts-uploader-file-preview {
+    div.cmts-uploader-file-preview,
+    div.cmts-uploader-file-preview img {
 		width: 100px;
     	height: 100px;
+    }
+    div.cmts-uploader-file-preview img {
+		background-position: center center;
+		background-repeat: no-repeat;
     }

+ 2 - 1
template/css/menu.css

@@ -411,7 +411,8 @@ ul.bx-menu-action {
 }
 
 /* --------------- interactive block menu */
-ul.bx-menu-inter {
+ul.bx-menu-inter,
+ul.bx-menu-inter-vert {
 	padding:0;
     margin:0;
 	list-style:none;

BIN
template/images/icons/apple-touch-icon-114x114.png


BIN
template/images/icons/apple-touch-icon-120x120.png


BIN
template/images/icons/apple-touch-icon-144x144.png


BIN
template/images/icons/apple-touch-icon-152x152.png


BIN
template/images/icons/apple-touch-icon-57x57.png


BIN
template/images/icons/apple-touch-icon-72x72.png


BIN
template/images/icons/apple-touch-icon.png


BIN
template/images/icons/favicon.ico


+ 18 - 0
template/menu_interactive_vertical.html

@@ -0,0 +1,18 @@
+<ul id="bx-menu-inter-__id__" class="bx-menu-inter-vert bx-menu-object-__object__">
+	<bx_repeat:menu_items>
+	    <li id="__id__-act" class="bx-menu-inter-act bx-def-margin-sec-top-auto __class_wrp_act__">
+	        <span class="__class__">__title__</span>
+	    </li>
+	    <li id="__id__-pas" class="bx-menu-inter-pas bx-def-margin-sec-top-auto __class_wrp_pas__">
+	        <a id="__id__" class="__class__" href="__link__" target="__target__" onclick="__onclick__">__title__</a>
+	    </li>
+	</bx_repeat:menu_items>
+</ul>
+<script type="text/javascript" language="javascript">
+    $(document).ready(function() {
+    	$('#bx-menu-inter-__id__').find('a').bind('click', function() {
+    		var sId = $(this).attr('id');
+			$(this).parent().siblings('.bx-menu-inter-act:visible').hide().siblings('.bx-menu-inter-pas:hidden').show().siblings('#' + sId + '-pas:visible').hide().siblings('#' + sId + '-act:hidden').show();
+    	});
+    });
+</script>

+ 84 - 32
template/scripts/BxBaseCmtsView.php

@@ -85,12 +85,13 @@ class BxBaseCmtsView extends BxDolCmts {
     /**
      * get full comments block with initializations
      */
-    function getCommentsBlock($iParentId = 0, $iVParentId = 0) {
+    function getCommentsBlock($iParentId = 0, $iVParentId = 0, $bInDesignbox = true) {
     	$aBp = array('parent_id' => $iParentId, 'vparent_id' => $iVParentId);
 
     	$sCmts = $this->getComments($aBp);
 
-    	return BxDolTemplate::getInstance()->parseHtmlByName('comments_block.html', array(
+    	$sCaption = _t('_cmt_block_comments_title', $this->_oQuery->getCommentsCount($this->_iId));
+    	$sContent = BxDolTemplate::getInstance()->parseHtmlByName('comments_block.html', array(
     		'system' => $this->_sSystem,
     		'id' => $this->getId(),
     		'bx_if:show_empty' => array(
@@ -99,12 +100,13 @@ class BxBaseCmtsView extends BxDolCmts {
 					'style_prefix' => $this->_sStylePrefix
 				)
 			),
-			'controls' => $this->_getControlsBox(),
     		'comments' => $sCmts,
     		'post_form_top' => $this->getFormBoxPost($aBp, array('type' => $this->_sDisplayType, 'position' => BX_CMT_PFP_TOP)),
 			'post_form_bottom'  => $this->getFormBoxPost($aBp, array('type' => $this->_sDisplayType, 'position' => BX_CMT_PFP_BOTTOM)),
     		'script' => $this->getScript()
     	));
+
+    	return $bInDesignbox ? DesignBoxContent($sCaption, $sContent, BX_DB_PADDING_DEF, $this->_getControlsBox()) : $sContent;
     }
 
     /**
@@ -205,7 +207,22 @@ class BxBaseCmtsView extends BxDolCmts {
         		'par_cmt_author' => $sParAuthorName
         	);
 		}
- 
+
+		$aTmplImages = array();
+		$aImages = $this->_oQuery->getImages($this->_aSystem['system_id'], $r['cmt_id']);
+		if(!empty($aImages) && is_array($aImages)) {
+			bx_import('BxDolImageTranscoder');
+        	$oTranscoder = BxDolImageTranscoder::getObjectInstance($this->_sTranscoderPreview);
+
+        	foreach($aImages as $aImage)
+        		$aTmplImages[] = array(
+        			'style_prefix' => $this->_sStylePrefix,
+        			'js_object' => $this->_sJsObjName,
+        			'id' => $aImage['image_id'],
+        			'image' => $oTranscoder->getImageUrl($aImage['image_id'])
+        		);
+		}
+
 		$sReplies = '';
 		if((int)$r['cmt_replies'] > 0 && !empty($aDp) && $aDp['type'] == BX_CMT_DISPLAY_THREADED)
 			$sReplies = $this->getComments(array('parent_id' => $r['cmt_id'], 'vparent_id' => $r['cmt_id'], 'type' => $aBp['type']), $aDp);
@@ -264,6 +281,13 @@ class BxBaseCmtsView extends BxDolCmts {
         			'text_more' => $sTextMore
         		)
         	),
+        	'bx_if:show_attached' => array(
+        		'condition' => !empty($aTmplImages),
+        		'content' => array(
+        			'style_prefix' => $this->_sStylePrefix,
+        			'bx_repeat:attached' => $aTmplImages
+        		)
+        	),
         	'actions' => $sActions,
         	'replies' =>  $sReplies
         ));
@@ -312,7 +336,31 @@ class BxBaseCmtsView extends BxDolCmts {
 
         return $oTemplate->parseHtmlByName('comment_plused_by.html', array(
         	'style_prefix' => $this->_sStylePrefix,
-        	'id' => $this->_sSystem . '-plused-by' . $iCmtId,
+        	'id' => $this->_sSystem . '-plused-by',
+        	'content' => $sContent
+        ));
+    }
+
+    function getImage($iImgId)
+    {
+    	$oTemplate = BxDolTemplate::getInstance();
+
+    	bx_import('BxDolStorage');
+		$oStorage = BxDolStorage::getObjectInstance($this->_sStorageObject);
+
+    	bx_import('BxTemplStudioFunctions');
+        $sContent = BxTemplStudioFunctions::getInstance()->transBox($oTemplate->parseHtmlByName('bx_img.html', array(
+    		'bx_if:class' => array(
+        		'condition' => false,
+        		'content' => array()
+        	),
+    		'src' => $oStorage->getFileUrlById($iImgId),
+        	'alt' => _t('_cmt_view_attached_image')
+    	)));
+
+        return $oTemplate->parseHtmlByName('comment_image.html', array(
+        	'style_prefix' => $this->_sStylePrefix,
+        	'id' => $this->_sSystem . '-attached-image', 
         	'content' => $sContent
         ));
     }
@@ -333,7 +381,7 @@ class BxBaseCmtsView extends BxDolCmts {
 			);
 
     		bx_import('BxTemplMenuInteractive');
-			$oMenu = new BxTemplMenuInteractive(array('template' => 'menu_interactive.html', 'menu_id'=> $this->_sSystem . '-display', 'menu_items' => $aDisplayLinks));
+			$oMenu = new BxTemplMenuInteractive(array('template' => 'menu_interactive_vertical.html', 'menu_id'=> $this->_sSystem . '-display', 'menu_items' => $aDisplayLinks));
 			$oMenu->setSelected('', $this->_sSystem . '-' . $this->_sDisplayType);
         	$sDisplay = $oMenu->getCode();
     	}
@@ -349,15 +397,12 @@ class BxBaseCmtsView extends BxDolCmts {
     		);
 
     		bx_import('BxTemplMenuInteractive');
-			$oMenu = new BxTemplMenuInteractive(array('template' => 'menu_interactive.html', 'menu_id'=> $this->_sSystem . '-browse', 'menu_items' => $aBrowseLinks));
+			$oMenu = new BxTemplMenuInteractive(array('template' => 'menu_interactive_vertical.html', 'menu_id'=> $this->_sSystem . '-browse', 'menu_items' => $aBrowseLinks));
 			$oMenu->setSelected('', $this->_sSystem . '-' . $this->_sBrowseType);
         	$sBrowse = $oMenu->getCode();
     	}
-    	
+
     	return $oTemplate->parseHtmlByName('comments_controls.html', array(
-			'js_object' => $this->_sJsObjName,
-			'style_prefix' => $this->_sStylePrefix,
-			'comments_count' => _t('_N_comments', $this->_oQuery->getCommentsCount($this->_iId)),
     		'display_switcher' => $bDisplay ? $sDisplay : '',
     		'bx_if:is_divider' => array(
     			'condition' => $bDisplay && $bBrowse,
@@ -454,7 +499,7 @@ class BxBaseCmtsView extends BxDolCmts {
     	list($sAuthorName, $sAuthorLink, $sAuthorIcon) = $this->_getAuthorInfo();
 
 		$sPositionSystem = $this->_aSystem['post_form_position'];
-		if(!empty($sPosition) && $sPositionSystem != BX_CMT_PFP_BOTH && $sPositionSystem != $sPosition)
+		if(!empty($sPosition) && $sPositionSystem != $sPosition)
 			return '';
 
 		$sMethod = '_getForm' . ucfirst($sType);
@@ -527,9 +572,14 @@ class BxBaseCmtsView extends BxDolCmts {
 			$iCmtId = (int)$oForm->insert(array('cmt_vparent_id' => $iCmtVisualParentId, 'cmt_object_id' => $this->_iId, 'cmt_author_id' => $iCmtAuthorId, 'cmt_level' => $iLevel, 'cmt_time' => mktime()));
 			if($iCmtId != 0) {
 				$aImages = $oForm->getCleanValue('cmt_image');
-				if(!empty($aImages) || is_array($aImages))
-					foreach($aImages as $iImage)
-						$this->_oQuery->saveImages($this->_aSystem['system_id'], $iCmtId, $iImage);
+				if(!empty($aImages) || is_array($aImages)) {
+					bx_import('BxDolStorage');
+					$oStorage = BxDolStorage::getObjectInstance($this->_sStorageObject);
+
+					foreach($aImages as $iImageId)
+						if($this->_oQuery->saveImages($this->_aSystem['system_id'], $iCmtId, $iImageId))
+							$oStorage->afterUploadCleanup($iImageId, $iCmtAuthorId);
+				}
 
 				if($iCmtParentId) 
         			$this->_oQuery->updateRepliesCount($iCmtParentId, 1);
@@ -542,7 +592,7 @@ class BxBaseCmtsView extends BxDolCmts {
 		        $oZ = new BxDolAlerts($this->_sSystem, 'commentPost', $this->getId(), $iCmtAuthorId, array('comment_id' => $iCmtId, 'comment_author_id' => $iCmtAuthorId));
 		        $oZ->alert();
 
-		        return array('id' => $iCmtId);
+		        return array('id' => $iCmtId, 'parent_id' => $iCmtParentId);
 			}
 
 			return array('msg' => _t('_cmt_err_cannot_perform_action'));
@@ -603,22 +653,24 @@ class BxBaseCmtsView extends BxDolCmts {
         $oForm->aInputs['id']['value'] = $this->_iId;
         $oForm->aInputs['action']['value'] = 'Submit' . $sActionCap . 'Form';
 
-        $aFormNested = array(
-        	'params' =>array(
-        		'nested_form_template' => 'comments_uploader_nfw.html'
-        	),
-	        'inputs' => array(),
-	    );
-
-	    bx_import('BxDolFormNested');
-	    $oFormNested = new BxDolFormNested('cmt_image', $aFormNested, 'cmt_submit');
-
-        $oForm->aInputs['cmt_image']['storage_object'] = $this->_sStorageObject;
-        $oForm->aInputs['cmt_image']['images_transcoder'] = $this->_sTranscoderPreview;
-        $oForm->aInputs['cmt_image']['uploaders'] = array('sys_simple_cmts');
-        $oForm->aInputs['cmt_image']['upload_buttons_titles'] = array('Simple' => 'camera');
-        $oForm->aInputs['cmt_image']['multiple'] = true;
-        $oForm->aInputs['cmt_image']['ghost_template'] = $oFormNested;
+	    if(isset($oForm->aInputs['cmt_image'])) {
+	    	$aFormNested = array(
+	        	'params' =>array(
+	        		'nested_form_template' => 'comments_uploader_nfw.html'
+	        	),
+		        'inputs' => array(),
+		    );
+
+		    bx_import('BxDolFormNested');
+		    $oFormNested = new BxDolFormNested('cmt_image', $aFormNested, 'cmt_submit');
+	
+	        $oForm->aInputs['cmt_image']['storage_object'] = $this->_sStorageObject;
+	        $oForm->aInputs['cmt_image']['images_transcoder'] = $this->_sTranscoderPreview;
+	        $oForm->aInputs['cmt_image']['uploaders'] = array('sys_simple_cmts');
+	        $oForm->aInputs['cmt_image']['upload_buttons_titles'] = array('Simple' => 'camera');
+	        $oForm->aInputs['cmt_image']['multiple'] = true;
+	        $oForm->aInputs['cmt_image']['ghost_template'] = $oFormNested;
+	    }
 
         if(isset($oForm->aInputs['cmt_text'])) {
         	$iCmtTextMin = (int)$this->_aSystem['chars_post_min'];

+ 1 - 1
template/scripts/BxBaseFunctions.php

@@ -546,7 +546,7 @@ EOF;
 
                 bx_import('BxTemplMenu');
                 $oMenu = BxTemplMenu::getObjectInstance($mixedMenu);
-                $sMenu = $oMenu ? $oMenu->getCode () : '';
+                $sMenu = $oMenu ? $oMenu->getCode () : $mixedMenu;
 
             } elseif (is_object($mixedMenu) && is_a($mixedMenu, 'BxTemplMenu')) {