Alex Trofimov 10 лет назад
Родитель
Сommit
d263b5689e
60 измененных файлов с 3017 добавлено и 35 удалено
  1. 17 8
      inc/classes/BxDolForm.php
  2. 2 2
      inc/utils.inc.php
  3. 1 1
      modules/base/profile/classes/BxBaseModProfileModule.php
  4. 21 0
      modules/boonex/events/classes/BxEventsAlertsResponse.php
  5. 185 0
      modules/boonex/events/classes/BxEventsConfig.php
  6. 30 0
      modules/boonex/events/classes/BxEventsDb.php
  7. 181 0
      modules/boonex/events/classes/BxEventsFormEntry.php
  8. 39 0
      modules/boonex/events/classes/BxEventsFormsEntryHelper.php
  9. 21 0
      modules/boonex/events/classes/BxEventsGridAdministration.php
  10. 21 0
      modules/boonex/events/classes/BxEventsGridCommon.php
  11. 21 0
      modules/boonex/events/classes/BxEventsGridConnections.php
  12. 25 0
      modules/boonex/events/classes/BxEventsMenuManageTools.php
  13. 25 0
      modules/boonex/events/classes/BxEventsMenuView.php
  14. 56 0
      modules/boonex/events/classes/BxEventsModule.php
  15. 24 0
      modules/boonex/events/classes/BxEventsPageBrowse.php
  16. 24 0
      modules/boonex/events/classes/BxEventsPageEntry.php
  17. 24 0
      modules/boonex/events/classes/BxEventsPageJoinedEntries.php
  18. 22 0
      modules/boonex/events/classes/BxEventsPrivacy.php
  19. 21 0
      modules/boonex/events/classes/BxEventsPrivacyNotifications.php
  20. 186 0
      modules/boonex/events/classes/BxEventsSearchResult.php
  21. 24 0
      modules/boonex/events/classes/BxEventsTemplate.php
  22. 21 0
      modules/boonex/events/classes/BxEventsUploaderCoverCrop.php
  23. 21 0
      modules/boonex/events/classes/BxEventsUploaderPictureCrop.php
  24. 139 0
      modules/boonex/events/install/config.php
  25. 20 0
      modules/boonex/events/install/installer.php
  26. 328 0
      modules/boonex/events/install/langs/en.xml
  27. 68 0
      modules/boonex/events/install/sql/disable.sql
  28. 416 0
      modules/boonex/events/install/sql/enable.sql
  29. 361 0
      modules/boonex/events/install/sql/install.sql
  30. 37 0
      modules/boonex/events/install/sql/uninstall.sql
  31. 164 0
      modules/boonex/events/js/intervals.js
  32. 57 0
      modules/boonex/events/js/manage_tools.js
  33. 18 0
      modules/boonex/events/request.php
  34. 1 0
      modules/boonex/events/template/account_link.html
  35. 1 0
      modules/boonex/events/template/cover.html
  36. 1 0
      modules/boonex/events/template/css/forms.css
  37. 1 0
      modules/boonex/events/template/css/main.css
  38. 1 0
      modules/boonex/events/template/css/manage_tools.css
  39. 3 0
      modules/boonex/events/template/entry-share.html
  40. 1 0
      modules/boonex/events/template/entry-text.html
  41. 16 0
      modules/boonex/events/template/form_field_reoccurring.html
  42. 1 0
      modules/boonex/events/template/form_ghost_template.html
  43. 6 0
      modules/boonex/events/template/form_ghost_template_wrapper.html
  44. 1 0
      modules/boonex/events/template/image_popup.html
  45. BIN
      modules/boonex/events/template/images/icons/std-mi.png
  46. BIN
      modules/boonex/events/template/images/icons/std-pi.png
  47. BIN
      modules/boonex/events/template/images/icons/std-si.png
  48. BIN
      modules/boonex/events/template/images/icons/std-wi.png
  49. BIN
      modules/boonex/events/template/images/no-pciture-big.png
  50. BIN
      modules/boonex/events/template/images/no-picture-icon.png
  51. BIN
      modules/boonex/events/template/images/no-picture-preview.png
  52. BIN
      modules/boonex/events/template/images/no-picture-thumb.png
  53. 1 0
      modules/boonex/events/template/name_link.html
  54. 1 0
      modules/boonex/events/template/picture_preview.html
  55. 1 0
      modules/boonex/events/template/set_acl_popup.html
  56. 1 0
      modules/boonex/events/template/unit.html
  57. 1 0
      modules/boonex/events/template/unit_live_search.html
  58. 1 0
      modules/boonex/events/template/uploader_form_crop_cover.html
  59. 327 0
      modules/boonex/russian/data/langs/bx_events/ru.xml
  60. 31 24
      template/scripts/BxBaseFormView.php

+ 17 - 8
inc/classes/BxDolForm.php

@@ -836,7 +836,7 @@ class BxDolForm extends BxDol implements iBxDolReplaceable
     function insert ($aValsToAdd = array(), $isIgnore = false)
     {
         $oChecker = new BxDolFormChecker($this->_sCheckerHelper);
-        $oChecker->setFormMethod($this->aFormAttrs['method']);
+        $oChecker->setFormMethod($this->aFormAttrs['method'], $this->_aSpecificValues);
         $sSql = $oChecker->dbInsert($this->aParams['db'], $this->aInputs, $aValsToAdd, $isIgnore);
         if (!$sSql)
             return false;
@@ -849,7 +849,7 @@ class BxDolForm extends BxDol implements iBxDolReplaceable
     function update ($val, $aValsToAdd = array(), &$aTrackTextFieldsChanges = null)
     {
         $oChecker = new BxDolFormChecker($this->_sCheckerHelper);
-        $oChecker->setFormMethod($this->aFormAttrs['method']);
+        $oChecker->setFormMethod($this->aFormAttrs['method'], $this->_aSpecificValues);
         $sSql = $oChecker->dbUpdate($val, $this->aParams['db'], $this->aInputs, $aValsToAdd, $aTrackTextFieldsChanges);
         if (!$sSql)
             return false;
@@ -859,7 +859,7 @@ class BxDolForm extends BxDol implements iBxDolReplaceable
     function delete ($val)
     {
         $oChecker = new BxDolFormChecker($this->_sCheckerHelper);
-        $oChecker->setFormMethod($this->aFormAttrs['method']);
+        $oChecker->setFormMethod($this->aFormAttrs['method'], $this->_aSpecificValues);
         $sSql = $oChecker->dbDelete($val, $this->aParams['db'], $this->aInputs);
         if (!$sSql)
             return false;
@@ -876,7 +876,7 @@ class BxDolForm extends BxDol implements iBxDolReplaceable
     function getCleanValue ($sName)
     {
         $oChecker = new BxDolFormChecker($this->_sCheckerHelper);
-        $oChecker->setFormMethod($this->aFormAttrs['method']);
+        $oChecker->setFormMethod($this->aFormAttrs['method'], $this->_aSpecificValues);
         $a = isset($this->aInputs[$sName]) ? $this->aInputs[$sName] : false;
         if ($a && isset($a['db']['pass']))
             return $oChecker->get ($a['name'], $a['db']['pass'], isset($a['db']['params']) && $a['db']['params'] ? $a['db']['params'] : array());
@@ -920,6 +920,11 @@ class BxDolForm extends BxDol implements iBxDolReplaceable
         return ($this->isSubmitted() && $this->isValid());
     }
 
+    function getSpecificValues()
+    {
+        return $this->_aSpecificValues;
+    }
+
     public static function getSubmittedValue($sKey, $sMethod, &$aSpecificValues = false)
     {
         $aData = array();
@@ -999,7 +1004,7 @@ class BxDolForm extends BxDol implements iBxDolReplaceable
         // process nested forms
         foreach ($this->aInputs as $sKey => $aInput) {
 
-            if ((isset($aInput['type']) && $aInput['type'] != 'files') || !isset($aInput['ghost_template']))
+            if (!isset($aInput['ghost_template']))
                 continue;
 
             if (!(is_array($aInput['ghost_template']) && isset($aInput['ghost_template']['inputs'])) && !(is_object($aInput['ghost_template']) && $aInput['ghost_template'] instanceof BxDolFormNested))
@@ -1020,7 +1025,10 @@ class BxDolForm extends BxDol implements iBxDolReplaceable
                 } else {
                     $oFormNested = new BxDolFormNested($aInput['name'], $aInput['ghost_template'], $this->aParams['db']['submit_name'], $this->oTemplate);
                 }
-                $aNestedForms[$iFileId] = $oFormNested;
+                if ($iFileId && 0 != $iFileId)
+                    $aNestedForms[$iFileId] = $oFormNested;
+                else
+                    $aNestedForms[] = $oFormNested;
 
                 // collect nested form values
                 $aSpecificValues = array ();
@@ -1237,8 +1245,9 @@ class BxDolFormChecker
         // get values from form description array
         foreach ($aInputs as $k => $a) {
             if (!isset ($a['db']) || !BxDolForm::isVisible($a)) continue;
-            $valClean = $this->get ($a['name'], $a['db']['pass'], !empty($a['db']['params']) ? $a['db']['params'] : array());
-            $aValsToUpdate[$a['name']] = $valClean;
+            $sKey = str_replace('[]', '', $a['name']);
+            $valClean = $this->get ($sKey, $a['db']['pass'], !empty($a['db']['params']) ? $a['db']['params'] : array());
+            $aValsToUpdate[$sKey] = $valClean;
             $aInputs[$k]['db']['value'] = $valClean;
 
             if (null !== $aTrackTextFieldsChanges && isset(BxDolForm::$TYPES_TEXT[$aInputs[$k]['type']]) && isset($aTrackTextFieldsChanges['data'][$a['name']]) && $aTrackTextFieldsChanges['data'][$a['name']] != $valClean)

+ 2 - 2
inc/utils.inc.php

@@ -184,9 +184,9 @@ function bx_process_output ($mixedData, $iDataType = BX_DATA_TEXT, $mixedParams
     case BX_DATA_DATE:
         return $mixedData;
     case BX_DATA_DATE_TS:
-        return empty($mixedData) ? '' : date("Y-m-d", $mixedData);
+        return empty($mixedData) ? '' : date("Y-m-d", (int)$mixedData);
     case BX_DATA_DATETIME_TS:
-        return empty($mixedData) ? '' : date("Y-m-d H:i", $mixedData);
+        return empty($mixedData) ? '' : date("Y-m-d H:i", (int)$mixedData);
 
     case BX_DATA_HTML:
         return $mixedData;

+ 1 - 1
modules/base/profile/classes/BxBaseModProfileModule.php

@@ -400,7 +400,7 @@ class BxBaseModProfileModule extends BxBaseModGeneralModule implements iBxDolPro
      */
     public function checkAllowedAdd ($isPerformAction = false)
     {
-        if (BxDolAccount::getInstance()->isProfilesLimitReached())
+        if ($this->serviceActAsProfile() && BxDolAccount::getInstance()->isProfilesLimitReached())
             return _t('_sys_txt_access_denied');
         return parent::checkAllowedAdd ($isPerformAction);
     }   

+ 21 - 0
modules/boonex/events/classes/BxEventsAlertsResponse.php

@@ -0,0 +1,21 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+class BxEventsAlertsResponse extends BxBaseModGroupsAlertsResponse
+{
+    public function __construct()
+    {
+    	$this->MODULE = 'bx_events';
+        parent::__construct();
+    }
+}
+
+/** @} */

+ 185 - 0
modules/boonex/events/classes/BxEventsConfig.php

@@ -0,0 +1,185 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+class BxEventsConfig extends BxBaseModProfileConfig
+{
+    function __construct($aModule)
+    {
+        parent::__construct($aModule);
+
+        $aMenuItems2Methods = array (
+            'view-event-profile' => 'checkAllowedView',
+            'edit-event-profile' => 'checkAllowedEdit',
+            'edit-event-cover' => 'checkAllowedChangeCover',
+            'delete-event-profile' => 'checkAllowedDelete',
+            'profile-fan-add' => 'checkAllowedFanAdd',
+            'profile-fan-remove' => 'checkAllowedFanRemove',
+            'profile-subscribe-add' => 'checkAllowedSubscribeAdd',
+            'profile-subscribe-remove' => 'checkAllowedSubscribeRemove',
+            'profile-actions-more' => 'checkAllowedViewMoreMenu',
+            'convos-compose' => 'checkAllowedSubscribeAdd',
+        );
+
+        $this->CNF = array (
+
+            // module icon
+            'ICON' => 'calendar col-red2',
+
+            // database tables
+            'TABLE_ENTRIES' => $aModule['db_prefix'] . 'data',
+            'TABLE_ADMINS' => $aModule['db_prefix'] . 'admins',
+
+            // database fields
+            'FIELD_ID' => 'id',
+            'FIELD_AUTHOR' => 'author',
+            'FIELD_ADDED' => 'added',
+            'FIELD_CHANGED' => 'changed',
+            'FIELD_NAME' => 'event_name',
+            'FIELD_TITLE' => 'event_name',
+            'FIELD_TEXT' => 'event_desc',
+            'FIELD_PICTURE' => 'picture',
+            'FIELD_COVER' => 'cover',
+            'FIELD_ALLOW_VIEW_TO' => 'allow_view_to',
+            'FIELDS_QUICK_SEARCH' => array('event_name'),
+            'FIELDS_WITH_KEYWORDS' => 'auto', // can be 'auto', array of fields or comma separated string of field names, works only when OBJECT_METATAGS is specified
+
+            // page URIs
+            'URI_VIEW_ENTRY' => 'view-event-profile',
+            'URI_EDIT_ENTRY' => 'edit-event-profile',
+            'URI_EDIT_COVER' => 'edit-event-cover',
+            'URI_JOINED_ENTRIES' => 'joined-events',
+        	'URI_MANAGE_COMMON' => 'events-manage',
+
+            'URL_HOME' => 'page.php?i=events-home',
+        	'URL_MANAGE_COMMON' => 'page.php?i=events-manage',
+        	'URL_MANAGE_ADMINISTRATION' => 'page.php?i=events-administration',
+
+            'PARAM_NUM_RSS' => 'bx_events_num_rss',
+            'PARAM_NUM_CONNECTIONS_QUICK' => 'bx_events_num_connections_quick',
+
+            // objects
+            'OBJECT_STORAGE' => 'bx_events_pics',
+            'OBJECT_STORAGE_COVER' => 'bx_events_pics',
+            'OBJECT_IMAGES_TRANSCODER_THUMB' => 'bx_events_thumb',
+            'OBJECT_IMAGES_TRANSCODER_ICON' => 'bx_events_icon',
+            'OBJECT_IMAGES_TRANSCODER_AVATAR' => 'bx_events_avatar',
+            'OBJECT_IMAGES_TRANSCODER_PICTURE' => 'bx_events_picture',
+            'OBJECT_IMAGES_TRANSCODER_COVER' => 'bx_events_cover',
+            'OBJECT_IMAGES_TRANSCODER_COVER_THUMB' => 'bx_events_cover_thumb',
+            'OBJECT_VIEWS' => 'bx_events',
+            'OBJECT_VOTES' => 'bx_events',
+            'OBJECT_REPORTS' => 'bx_events',
+            'OBJECT_METATAGS' => 'bx_events',
+            'OBJECT_FORM_ENTRY' => 'bx_event',
+            'OBJECT_FORM_ENTRY_DISPLAY_VIEW' => 'bx_event_view',
+        	'OBJECT_FORM_ENTRY_DISPLAY_VIEW_FULL' => 'bx_event_view_full', // for "info" tab on view group page
+            'OBJECT_FORM_ENTRY_DISPLAY_ADD' => 'bx_event_add',
+            'OBJECT_FORM_ENTRY_DISPLAY_EDIT' => 'bx_event_edit',
+            'OBJECT_FORM_ENTRY_DISPLAY_EDIT_COVER' => 'bx_event_edit_cover',
+            'OBJECT_FORM_ENTRY_DISPLAY_DELETE' => 'bx_event_delete',
+            'OBJECT_MENU_ACTIONS_VIEW_ENTRY' => 'bx_events_view_actions', // actions menu on view entry page
+            'OBJECT_MENU_ACTIONS_VIEW_ENTRY_MORE' => 'bx_events_view_actions_more', // actions menu on view entry page for "more" popup
+            'OBJECT_MENU_SUBMENU' => 'bx_events_submenu', // main module submenu
+            'OBJECT_MENU_SUBMENU_VIEW_ENTRY' => 'bx_events_view_submenu',  // view entry submenu
+            'OBJECT_MENU_SUBMENU_VIEW_ENTRY_COVER' => 'bx_events_view_submenu_cover',  // view entry submenu displayed in cover
+            'OBJECT_MENU_SUBMENU_VIEW_ENTRY_MAIN_SELECTION' => 'events-home', // first item in view entry submenu from main module submenu
+            'OBJECT_MENU_MANAGE_TOOLS' => 'bx_events_menu_manage_tools', //manage menu in content administration tools
+            'OBJECT_PAGE_VIEW_ENTRY' => 'bx_events_view_profile',
+            'OBJECT_PAGE_VIEW_ENTRY_CLOSED' => 'bx_events_view_profile_closed',
+            'OBJECT_PRIVACY_VIEW' => 'bx_events_allow_view_to',
+            'OBJECT_PRIVACY_VIEW_NOTIFICATION_EVENT' => 'bx_events_allow_view_notification_to',
+            'OBJECT_GRID_ADMINISTRATION' => 'bx_events_administration',
+        	'OBJECT_GRID_COMMON' => 'bx_events_common',
+            'OBJECT_GRID_CONNECTIONS' => 'bx_events_fans',
+            'OBJECT_CONNECTIONS' => 'bx_events_fans',
+            'OBJECT_UPLOADERS_COVER' => array('bx_events_cover_crop'),
+            'OBJECT_UPLOADERS_PICTURE' => array('bx_events_picture_crop'),
+
+            'EMAIL_INVITATION' => 'bx_events_invitation',
+            'EMAIL_JOIN_REQUEST' => 'bx_events_join_request',
+            'EMAIL_JOIN_CONFIRM' => 'bx_events_join_confirm',
+            'EMAIL_FAN_BECOME_ADMIN' => 'bx_events_fan_become_admin',
+            'EMAIL_ADMIN_BECOME_FAN' => 'bx_events_admin_become_fan',
+            'EMAIL_FAN_REMOVE' => 'bx_events_fan_remove',
+            'EMAIL_JOIN_REJECT' => 'bx_events_join_reject',
+
+            'TRIGGER_MENU_PROFILE_VIEW_SUBMENU' => 'trigger_group_view_submenu',
+            '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_events_view_actions' => $aMenuItems2Methods,
+                'bx_events_view_actions_more' => $aMenuItems2Methods,
+            ),
+
+            // informer messages
+            'INFORMERS' => array (
+                'status' => array (
+                    'name' => 'bx-events-status-not-active',
+                    'map' => array (
+                        BX_PROFILE_STATUS_PENDING => '_bx_events_txt_account_pending',
+                        BX_PROFILE_STATUS_SUSPENDED => '_bx_events_txt_account_suspended',
+                    ),
+                ),
+            ),
+
+            // some language keys
+            'T' => array (
+                'txt_sample_single' => '_bx_events_txt_sample_single',
+                'txt_sample_vote_single' => '_bx_events_txt_sample_vote_single',
+                'txt_private_group' => '_bx_events_txt_private_group',
+                'txt_N_fans' => '_bx_events_txt_N_fans',
+                'txt_ntfs_join_request' => '_bx_events_txt_ntfs_join_request',
+                'txt_ntfs_fan_added' => '_bx_events_txt_ntfs_fan_added',
+                'menu_item_title_befriend_sent' => '_bx_events_menu_item_title_befriend_sent',
+                'menu_item_title_unfriend_cancel_request' => '_bx_events_menu_item_title_unfriend_cancel_request',
+                'menu_item_title_befriend_confirm' => '_bx_events_menu_item_title_befriend_confirm',
+                'menu_item_title_unfriend_reject_request' => '_bx_events_menu_item_title_unfriend_reject_request',
+                'menu_item_title_befriend' => '_bx_events_menu_item_title_befriend',
+                'menu_item_title_unfriend' => '_bx_events_menu_item_title_unfriend',
+            	'grid_action_err_delete' => '_bx_events_grid_action_err_delete',
+            	'grid_txt_account_manager' => '_bx_events_grid_txt_account_manager',
+				'filter_item_active' => '_bx_events_grid_filter_item_title_adm_active',
+            	'filter_item_pending' => '_bx_events_grid_filter_item_title_adm_pending',
+            	'filter_item_suspended' => '_bx_events_grid_filter_item_title_adm_suspended',
+            	'filter_item_select_one_filter1' => '_bx_events_grid_filter_item_title_adm_select_one_filter1',
+            	'menu_item_manage_my' => '_bx_events_menu_item_title_manage_my',
+                'menu_item_manage_all' => '_bx_events_menu_item_title_manage_all',
+                'menu_item_title_become_fan_sent' => '_bx_events_menu_item_title_become_fan_sent',
+                'menu_item_title_leave_group_cancel_request' => '_bx_events_menu_item_title_leave_group_cancel_request',
+                'menu_item_title_become_fan' => '_bx_events_menu_item_title_become_fan',
+                'menu_item_title_leave_group' => '_bx_events_menu_item_title_leave_group',
+                
+                'menu_item_title_become_fan_sent' => '_bx_events_menu_item_title_become_fan_sent',
+                'menu_item_title_become_fan' => '_bx_events_menu_item_title_become_fan',
+            ),
+
+        );
+
+        $this->_aJsClasses = array(
+        	'manage_tools' => 'BxEventsManageTools'
+        );
+
+        $this->_aJsObjects = array(
+        	'manage_tools' => 'oBxEventsManageTools'
+        );
+
+        $this->_aGridObjects = array(
+        	'common' => $this->CNF['OBJECT_GRID_COMMON'],
+        	'administration' => $this->CNF['OBJECT_GRID_ADMINISTRATION'],
+        	
+        );
+    }
+
+}
+
+/** @} */

+ 30 - 0
modules/boonex/events/classes/BxEventsDb.php

@@ -0,0 +1,30 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+/**
+ * Groups module database queries
+ */
+class BxEventsDb extends BxBaseModGroupsDb
+{
+    public function __construct(&$oConfig)
+    {
+        parent::__construct($oConfig);
+    }
+
+    public function getIntervals ($iContentId) 
+    {
+        return $this->getAllWithKey("SELECT * FROM `bx_events_intervals` WHERE `event_id` = :event_id", 'interval_id', array(
+            'event_id' => $iContentId,
+        ));
+    }
+}
+
+/** @} */

+ 181 - 0
modules/boonex/events/classes/BxEventsFormEntry.php

@@ -0,0 +1,181 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+/**
+ * Create/Edit Group Form.
+ */
+class BxEventsFormEntry extends BxBaseModGroupsFormEntry
+{
+    protected $_iContentId = 0;
+
+    public function __construct($aInfo, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_events';
+        parent::__construct($aInfo, $oTemplate);
+
+        if (isset($this->aInputs['reoccurring'])) {
+            $this->aInputs['reoccurring']['ghost_template'] = array (
+                
+                'params' => array(
+                    'nested_form_template' => 'form_ghost_template_wrapper.html',
+                    'db' => array(
+                        'table' => 'bx_events_intervals',
+                        'key' => 'interval_id',
+                        'submit_name' => 'interval_id',
+                    ),
+                ),
+                'inputs' => array (
+                    'interval_id' => array (
+                        'type' => 'hidden',
+                        'name' => 'interval_id[]',
+                        'value' => '{interval_id}',
+                        'caption' => _t('Interval ID'),
+                        'db' => array (
+                            'pass' => 'Int',
+                        ),
+                    ),                
+                    'repeat_year' => array (
+                        'type' => 'select',                    
+                        'name' => 'repeat_year[]',
+                        'value' => '{repeat_year}',
+                        'values' => BxDolForm::getDataItems('bx_events_repeat_year'),
+                        'caption' => _t('_bx_events_form_input_repeat_year'),
+                        'db' => array (
+                            'pass' => 'Int',
+                        ),
+                    ),
+                    'repeat_month' => array (
+                        'type' => 'select',
+                        'name' => 'repeat_month[]',
+                        'value' => '{repeat_month}',
+                        'values' => BxDolForm::getDataItems('bx_events_repeat_month'),
+                        'caption' => _t('_bx_events_form_input_repeat_month'),
+                        'db' => array (
+                            'pass' => 'Int',
+                        ),
+                    ),
+                    'repeat_week_of_month' => array (
+                        'type' => 'select',
+                        'name' => 'repeat_week_of_month[]',
+                        'value' => '{repeat_week_of_month}',
+                        'values' => BxDolForm::getDataItems('bx_events_repeat_week_of_month'),
+                        'caption' => _t('_bx_events_form_input_repeat_week_of_month'),
+                        'db' => array (
+                            'pass' => 'Int',
+                        ),
+                    ),                
+                    'repeat_day_of_month' => array (
+                        'type' => 'select',
+                        'name' => 'repeat_day_of_month[]',
+                        'value' => '{repeat_day_of_month}',
+                        'values' => BxDolForm::getDataItems('bx_events_repeat_day_of_month'),
+                        'caption' => _t('_bx_events_form_input_repeat_day_of_month'),
+                        'db' => array (
+                            'pass' => 'Int',
+                        ),
+                    ),
+                    'repeat_day_of_week' => array (
+                        'type' => 'select',
+                        'name' => 'repeat_day_of_week[]',
+                        'value' => '{repeat_day_of_week}',
+                        'values' => BxDolForm::getDataItems('bx_events_repeat_day_of_week'),
+                        'caption' => _t('_bx_events_form_input_repeat_day_of_week'),
+                        'db' => array (
+                            'pass' => 'Int',
+                        ),
+                    ),
+                    'repeat_stop' => array (
+                        'type' => 'datepicker',
+                        'name' => 'repeat_stop[]',
+                        'value' => '{repeat_stop}',
+                        'caption' => _t('_bx_events_form_input_stop_repeating'),
+                        'db' => array (
+                            'pass' => 'Date',
+                        ),
+                    ),
+                ),
+            );
+        }
+    }
+
+    function initChecker ($aValues = array (), $aSpecificValues = array())
+    {
+        if (isset($aValues[$this->_oModule->_oConfig->CNF['FIELD_ID']]))
+            $this->_iContentId = $aValues[$this->_oModule->_oConfig->CNF['FIELD_ID']];
+
+        parent::initChecker($aValues, $aSpecificValues);
+    }
+    
+    protected function genCustomRowReoccurring (&$aInput)
+    {
+        return $this->genRowCustom($aInput, 'genInputReoccurring');
+    }
+
+    protected function genInputReoccurring (&$aInput, $sInfo = '', $sError = '')
+    {
+        $sUniqId = genRndPwd (8, false);
+
+        return $this->oTemplate->parseHtmlByName('form_field_reoccurring.html', array(
+            'info' => $sInfo,
+            'error' => $sError,
+            'uniq_id' => $sUniqId,
+            'js_instance_name' => 'oBxEventsIntervals_' . $sUniqId,
+            'options' => json_encode(array(
+                'uniq_id' => $sUniqId,
+                'js_instance_name' => 'oBxEventsIntervals_' . $sUniqId,
+                'template_ghost' => $this->genGhostTemplate($aInput),
+                'content_id' => $this->_iContentId, 
+            )),
+        ));
+    }
+
+    public function insert ($aValsToAdd = array(), $isIgnore = false)
+    {
+        $iContentId = parent::insert ($aValsToAdd, $isIgnore);
+
+        if (isset($this->aInputs['reoccurring']) && is_array($this->aInputs['reoccurring']['ghost_template']) && !isset($this->aInputs['reoccurring']['ghost_template']['inputs'])) {
+            foreach ($this->aInputs['reoccurring']['ghost_template'] as $oFormNested) {
+                $oFormNested->insert(array('event_id' => $iContentId));
+            }
+        }
+        
+        return $iContentId;
+    }
+
+    function update ($val, $aValsToAdd = array(), &$aTrackTextFieldsChanges = null)
+    {
+        $iAffectedRows = parent::update($val, $aValsToAdd, $aTrackTextFieldsChanges);
+
+        if (isset($this->aInputs['reoccurring']) && is_array($this->aInputs['reoccurring']['ghost_template']) && !isset($this->aInputs['reoccurring']['ghost_template']['inputs'])) {
+            foreach ($this->aInputs['reoccurring']['ghost_template'] as $oFormNested) {
+                $aSpecificValues = $oFormNested->getSpecificValues();
+                $iIntervalId = $oFormNested->getSubmittedValue('interval_id', BX_DOL_FORM_METHOD_SPECIFIC, $aSpecificValues);
+                if ($iIntervalId) {
+                    $oFormNested->update($iIntervalId);
+                } else {
+                    $oFormNested->insert(array('event_id' => $this->_iContentId));
+                }
+            }
+        }
+        
+        return $iAffectedRows;
+    }
+    
+    function addCssJs ()
+    {
+        if (!self::$_isCssJsAdded)
+            $this->oTemplate->addJs('intervals.js');
+
+        parent::addCssJs ();
+    }
+}
+
+/** @} */

+ 39 - 0
modules/boonex/events/classes/BxEventsFormsEntryHelper.php

@@ -0,0 +1,39 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+/**
+ * Group profile forms functions
+ */
+class BxEventsFormsEntryHelper extends BxBaseModGroupsFormsEntryHelper
+{
+    public function __construct($oModule)
+    {
+        parent::__construct($oModule);
+    }
+
+    public function onDataAddAfter ($iAccountId, $iContentId)
+    {
+        if ($s = parent::onDataAddAfter($iAccountId, $iContentId))
+            return $s;
+
+        return '';
+    }
+
+    public function onDataDeleteAfter ($iContentId, $aContentInfo, $oProfile)
+    {
+        if ($s = parent::onDataDeleteAfter($iAccountId, $iContentId))
+            return $s;
+
+        return '';
+    }
+}
+
+/** @} */

+ 21 - 0
modules/boonex/events/classes/BxEventsGridAdministration.php

@@ -0,0 +1,21 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ * 
+ * @{
+ */
+
+class BxEventsGridAdministration extends BxBaseModGroupsGridAdministration
+{
+    public function __construct ($aOptions, $oTemplate = false)
+    {
+    	$this->MODULE = 'bx_events';
+        parent::__construct ($aOptions, $oTemplate);
+    }
+}
+
+/** @} */

+ 21 - 0
modules/boonex/events/classes/BxEventsGridCommon.php

@@ -0,0 +1,21 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ * 
+ * @{
+ */
+
+class BxEventsGridCommon extends BxBaseModGroupsGridCommon
+{
+    public function __construct ($aOptions, $oTemplate = false)
+    {
+    	$this->MODULE = 'bx_events';
+        parent::__construct ($aOptions, $oTemplate);
+    }
+}
+
+/** @} */

+ 21 - 0
modules/boonex/events/classes/BxEventsGridConnections.php

@@ -0,0 +1,21 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ * 
+ * @{
+ */
+
+class BxEventsGridConnections extends BxBaseModGroupsGridConnections
+{
+    public function __construct ($aOptions, $oTemplate = false)
+    {
+        $this->_sContentModule = 'bx_events';
+        parent::__construct ($aOptions, $oTemplate);
+    }
+}
+
+/** @} */

+ 25 - 0
modules/boonex/events/classes/BxEventsMenuManageTools.php

@@ -0,0 +1,25 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+/**
+ * 'Groups manage tools' menu.
+ */
+class BxEventsMenuManageTools extends BxBaseModGroupsMenuManageTools
+{
+
+    public function __construct($aObject, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_events';
+        parent::__construct($aObject, $oTemplate);
+    }
+}
+
+/** @} */

+ 25 - 0
modules/boonex/events/classes/BxEventsMenuView.php

@@ -0,0 +1,25 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+/**
+ * 'View group' menu.
+ */
+class BxEventsMenuView extends BxBaseModGroupsMenuView
+{
+
+    public function __construct($aObject, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_events';
+        parent::__construct($aObject, $oTemplate);
+    }
+}
+
+/** @} */

+ 56 - 0
modules/boonex/events/classes/BxEventsModule.php

@@ -0,0 +1,56 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+/**
+ * Groups profiles module.
+ */
+class BxEventsModule extends BxBaseModGroupsModule
+{
+    function __construct(&$aModule)
+    {
+        parent::__construct($aModule);
+    }
+
+    public function actionIntervals()
+    {
+        $sAction = bx_get('a');
+        $sMethodName = 'subaction' . ucfirst($sAction);
+        if (!method_exists($this, $sMethodName)) {
+            $this->_oTemplate->pageNotFound();
+            return;
+        }
+        $this->$sMethodName();
+    }
+
+    public function subactionRestore()
+    {
+        // TODO: check permissions
+
+        $iContentId = (int)bx_get('c');
+        $a = $this->_oDb->getIntervals($iContentId);
+        foreach ($a as $iIntervalId => $r) {
+            $a[$iIntervalId]['file_id'] = $r['interval_id'];
+            $a[$iIntervalId]['repeat_stop'] = bx_process_output ($r['repeat_stop'], BX_DATA_DATE_TS);
+        }
+
+        if ('json' == bx_get('f')) {
+            header('Content-type: text/html; charset=utf-8');
+            echo json_encode($a);
+        }
+    }
+
+    public function subactionDelete()
+    {
+        // TODO: check permissions        
+    }
+}
+
+/** @} */

+ 24 - 0
modules/boonex/events/classes/BxEventsPageBrowse.php

@@ -0,0 +1,24 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+/**
+ * Browse entries pages.
+ */
+class BxEventsPageBrowse extends BxBaseModGroupsPageBrowse
+{
+    public function __construct($aObject, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_events';
+        parent::__construct($aObject, $oTemplate);
+    }
+}
+
+/** @} */

+ 24 - 0
modules/boonex/events/classes/BxEventsPageEntry.php

@@ -0,0 +1,24 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+/**
+ * Profile create/edit/delete pages.
+ */
+class BxEventsPageEntry extends BxBaseModGroupsPageEntry
+{
+    public function __construct($aObject, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_events';
+        parent::__construct($aObject, $oTemplate);
+    }
+}
+
+/** @} */

+ 24 - 0
modules/boonex/events/classes/BxEventsPageJoinedEntries.php

@@ -0,0 +1,24 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+/**
+ * Entries user joined to.
+ */
+class BxEventsPageJoinedEntries extends BxBaseModGroupsPageJoinedEntries
+{
+    public function __construct($aObject, $oTemplate = false)
+    {
+        parent::__construct($aObject, $oTemplate);
+    }
+
+}
+
+/** @} */

+ 22 - 0
modules/boonex/events/classes/BxEventsPrivacy.php

@@ -0,0 +1,22 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+class BxEventsPrivacy extends BxBaseModGroupsPrivacy
+{
+    public function __construct($aOptions, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_events';
+        $this->_aPrivacyParticallyVisible = array ('c', 5);
+        parent::__construct($aOptions, $oTemplate);
+    }
+}
+
+/** @} */

+ 21 - 0
modules/boonex/events/classes/BxEventsPrivacyNotifications.php

@@ -0,0 +1,21 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+class BxEventsPrivacyNotifications extends BxBaseModGroupsPrivacyNotifications
+{
+    function __construct($aOptions, $oTemplate = false)
+    {
+    	$this->MODULE = 'bx_events';
+        parent::__construct($aOptions, $oTemplate);
+    }
+}
+
+/** @} */

+ 186 - 0
modules/boonex/events/classes/BxEventsSearchResult.php

@@ -0,0 +1,186 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+class BxEventsSearchResult extends BxBaseModProfileSearchResult
+{
+    function __construct($sMode = '', $aParams = false)
+    {
+        parent::__construct($sMode, $aParams); 
+
+        $this->aCurrent =  array(
+            'name' => 'bx_events',
+            'module_name' => 'bx_events',
+            'object_metatags' => 'bx_events',
+            'title' => _t('_bx_events_page_title_browse'),
+            'table' => 'sys_profiles',
+            'tableSearch' => 'bx_events_data',
+            'ownFields' => array(),
+            'searchFields' => array('event_name', 'event_desc'),
+            'restriction' => array(
+        		'account_id' => array('value' => '', 'field' => 'account_id', 'operator' => '='),
+                'perofileStatus' => array('value' => 'active', 'field' => 'status', 'operator' => '='),
+                'perofileType' => array('value' => 'bx_events', 'field' => 'type', 'operator' => '='),
+                'owner' => array('value' => '', 'field' => 'author', 'operator' => '=', 'table' => 'bx_events_data'),
+            ),
+            'join' => array (
+                'profile' => array(
+                    'type' => 'INNER',
+                    'table' => 'bx_events_data',
+                    'mainField' => 'content_id',
+                    'onField' => 'id',
+                    'joinFields' => array('id', 'event_name', 'picture', 'cover', 'added', 'author', 'allow_view_to'),
+                ),
+                'account' => array(
+                    'type' => 'INNER',
+                    'table' => 'sys_accounts',
+                    'mainField' => 'account_id',
+                    'onField' => 'id',
+                    'joinFields' => array(),
+                ),
+            ),
+            'paginate' => array('perPage' => 20, 'start' => 0),
+            'sorting' => 'none',
+            'rss' => array(
+                'title' => '',
+                'link' => '',
+                'image' => '',
+                'profile' => 0,
+                'fields' => array (
+                    'Guid' => 'link',
+                    'Link' => 'link',
+                    'Title' => 'event_name',
+                    'DateTimeUTS' => 'added',
+                    'Desc' => 'event_name',
+                    'Picture' => 'picture',
+                ),
+            ),
+            'ident' => 'id'
+        );
+
+        $this->sFilterName = 'bx_events_data_filter';
+        $this->oModule = $this->getMain();
+
+        $oJoinedProfile = null;
+        $bProcessConditionsForPrivateContent = true;
+
+        $CNF = &$this->oModule->_oConfig->CNF;
+
+        switch ($sMode) {
+
+            case 'joined_entries':
+                $oJoinedProfile = BxDolProfile::getInstance((int)$aParams['joined_profile']);
+                if (!$oJoinedProfile) {
+                    $this->isError = true;
+                    break;
+                }
+
+                $bProcessConditionsForPrivateContent = false;
+
+                $this->aCurrent['join']['fans'] = array(
+                    'type' => 'INNER',
+                    'table' => 'bx_events_fans',
+                    'mainField' => 'id',
+                    'onField' => 'content',
+                    'joinFields' => array('initiator'),
+                );
+
+                $this->aCurrent['restriction']['fans'] = array('value' => $oJoinedProfile->id(), 'field' => 'initiator', 'operator' => '=', 'table' => 'bx_events_fans');
+
+                $this->sBrowseUrl = 'page.php?i=' . $CNF['URI_JOINED_ENTRIES'] . '&profile_id={profile_id}';
+                $this->aCurrent['title'] = _t('_bx_events_page_title_joined_entries');
+                $this->aCurrent['rss']['link'] = 'modules/?r=events/rss/' . $sMode . '/' . $oJoinedProfile->id();
+                break;
+
+            case 'connections':
+                if ($this->_setConnectionsConditions($aParams)) {
+                    $bProcessConditionsForPrivateContent = false;
+                    $oProfile = BxDolProfile::getInstance($aParams['profile']);
+                    $oProfile2 = isset($aParams['profile2']) ? BxDolProfile::getInstance($aParams['profile2']) : null;
+
+                    if (isset($aParams['type']) && $aParams['type'] == 'common' && $oProfile && $oProfile2)
+                        $this->aCurrent['title'] = _t('_bx_events_page_title_browse_connections_mutual', $oProfile->getDisplayName(), $oProfile2->getDisplayName());
+                    elseif ((!isset($aParams['type']) || $aParams['type'] != 'common') && $oProfile)
+                        $this->aCurrent['title'] = _t('_bx_events_page_title_browse_connections', $oProfile->getDisplayName());
+
+                    $this->aCurrent['rss']['link'] = 'modules/?r=events/rss/' . $sMode . '/' . $aParams['object'] . '/' . $aParams['type'] . '/' . (int)$aParams['profile'] . '/' . (int)$aParams['profile2'] . '/' . (int)$aParams['mutual'];
+                }
+                break;
+
+            case 'recent':
+                $this->aCurrent['rss']['link'] = 'modules/?r=events/rss/' . $sMode;
+                $this->aCurrent['title'] = _t('_bx_events_page_title_browse_recent');
+                $this->aCurrent['sorting'] = 'last';
+                $this->sBrowseUrl = 'page.php?i=events-home';
+                break;
+
+            case 'top':
+                $this->aCurrent['rss']['link'] = 'modules/?r=events/rss/' . $sMode;
+                $this->aCurrent['title'] = _t('_bx_events_page_title_browse_top');
+                $this->aCurrent['sorting'] = 'top';
+                $this->sBrowseUrl = 'page.php?i=events-top';
+                break;
+
+            case '': // search results
+                $this->sBrowseUrl = BX_DOL_SEARCH_KEYWORD_PAGE;
+                $this->aCurrent['title'] = _t('_bx_events');
+                $this->aCurrent['paginate']['perPage'] = 5;
+                unset($this->aCurrent['rss']);
+                break;
+
+            default:
+                $this->isError = true;
+        }
+
+        if ($bProcessConditionsForPrivateContent)
+            $this->addConditionsForPrivateContent($CNF, $oJoinedProfile);
+
+        $this->sCenterContentUnitSelector = false;
+    }
+
+    protected function addConditionsForPrivateContent($CNF, $oJoinedProfile) 
+    {
+        // add conditions for private content
+        $oPrivacy = BxDolPrivacy::getObjectInstance($CNF['OBJECT_PRIVACY_VIEW']);
+        $a = $oPrivacy ? $oPrivacy->getContentPublicAsCondition($oJoinedProfile ? $oJoinedProfile->id() : 0, $oPrivacy->getPartiallyVisiblePrivacyGroups()) : array();
+        if (isset($a['restriction']))
+            $this->aCurrent['restriction'] = array_merge($this->aCurrent['restriction'], $a['restriction']);
+        if (isset($a['join']))
+            $this->aCurrent['join'] = array_merge($this->aCurrent['join'], $a['join']);
+
+        $this->setProcessPrivateContent(false);
+    }
+
+    function getAlterOrder()
+    {
+        switch ($this->aCurrent['sorting']) {
+        case 'none':
+            return array('order' => ' ORDER BY `sys_accounts`.`logged` DESC ');
+        case 'top':
+            return array('order' => ' ORDER BY `bx_events_data`.`views` DESC ');
+        case 'last':
+        default:                        
+            return array('order' => ' ORDER BY `bx_events_data`.`added` DESC ');
+        }
+    }
+
+    function _getPseud ()
+    {
+        return array(
+            'id' => 'id',
+            'event_name' => 'event_name',
+            'added' => 'added',
+            'author' => 'author',
+            'picture' => 'picture',
+        );
+    }
+}
+
+/** @} */

+ 24 - 0
modules/boonex/events/classes/BxEventsTemplate.php

@@ -0,0 +1,24 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+/*
+ * Groups module representation.
+ */
+class BxEventsTemplate extends BxBaseModGroupsTemplate
+{
+    function __construct(&$oConfig, &$oDb)
+    {
+        $this->MODULE = 'bx_events';
+        parent::__construct($oConfig, $oDb);
+    }
+}
+
+/** @} */

+ 21 - 0
modules/boonex/events/classes/BxEventsUploaderCoverCrop.php

@@ -0,0 +1,21 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+class BxEventsUploaderCoverCrop extends BxBaseModProfileUploaderCoverCrop
+{
+    public function __construct ($aObject, $sStorageObject, $sUniqId, $oTemplate)
+    {
+        $this->_oModule = BxDolModule::getInstance('bx_events');
+        parent::__construct($aObject, $sStorageObject, $sUniqId, $oTemplate);
+    }
+}
+
+/** @} */

+ 21 - 0
modules/boonex/events/classes/BxEventsUploaderPictureCrop.php

@@ -0,0 +1,21 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+class BxEventsUploaderPictureCrop extends BxBaseModProfileUploaderPictureCrop
+{
+    public function __construct ($aObject, $sStorageObject, $sUniqId, $oTemplate)
+    {
+        $this->_oModule = BxDolModule::getInstance('bx_events');
+        parent::__construct($aObject, $sStorageObject, $sUniqId, $oTemplate);
+    }
+}
+
+/** @} */

+ 139 - 0
modules/boonex/events/install/config.php

@@ -0,0 +1,139 @@
+<?php
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_MODULE,
+    'name' => 'bx_events',
+    'title' => 'Events',
+    'note' => 'Events functionality.',
+    'version' => '9.0.0.DEV',
+    'vendor' => 'BoonEx',
+	'help_url' => 'http://feed.boonex.com/?section={module_name}',
+
+    'compatible_with' => array(
+        '9.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/events/',
+    'home_uri' => 'events',
+
+    'db_prefix' => 'bx_events_',
+    'class_prefix' => 'BxEvents',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Events',
+
+    /**
+     * 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_view_actions',
+    ),
+
+    /**
+     * Page triggers.
+     */
+    'page_triggers' => array (
+    	'trigger_page_group_view_entry', 
+    ),
+
+    /**
+     * Storages.
+     */
+    'storages' => array(
+    	'bx_events_pics'
+    ),
+
+	/**
+     * Transcoders.
+     */
+    'transcoders' => array(
+    	'bx_events_icon', 
+    	'bx_events_thumb', 
+    	'bx_events_avatar', 
+    	'bx_events_picture', 
+    	'bx_events_cover', 
+    	'bx_events_cover_thumb'
+    ),
+
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'execute_sql' => 1,
+        'update_languages' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'uninstall' => array (
+    	'process_storages' => 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,
+    	'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',
+    ),
+);
+
+/** @} */

+ 20 - 0
modules/boonex/events/install/installer.php

@@ -0,0 +1,20 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+class BxEventsInstaller extends BxBaseModProfileInstaller
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+}
+
+/** @} */

+ 328 - 0
modules/boonex/events/install/langs/en.xml

@@ -0,0 +1,328 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources name="en" flag="gb" title="English">
+
+	<string name="_bx_events"><![CDATA[Events]]></string>
+
+	<string name="_bx_events_option_num_connections_quick"><![CDATA[Number of items in friends block]]></string>
+	<string name="_bx_events_option_num_rss"><![CDATA[Number of items in RSS feed]]></string>
+
+	<string name="_bx_events_form_profile"><![CDATA[Events]]></string>
+	<string name="_bx_events_form_profile_display_add"><![CDATA[Add Event]]></string>
+	<string name="_bx_events_form_profile_display_edit"><![CDATA[Edit Event]]></string>
+	<string name="_bx_events_form_profile_display_edit_cover"><![CDATA[Edit Cover]]></string>
+	<string name="_bx_events_form_profile_display_delete"><![CDATA[Delete Event]]></string>
+	<string name="_bx_events_form_profile_display_view"><![CDATA[View Event]]></string>
+	<string name="_bx_events_form_profile_display_view_full"><![CDATA[Full View Event]]></string>
+	<string name="_bx_events_form_profile_input_sys_do_submit"><![CDATA[Submit]]></string>
+    <string name="_bx_events_form_profile_input_sys_join_confirm"><![CDATA[Join confirmation]]></string>
+    <string name="_bx_events_form_profile_input_join_confirm"><![CDATA[Join confirmation]]></string>
+    <string name="_bx_events_form_profile_input_sys_allow_view_to"><![CDATA[Privacy]]></string>
+    <string name="_bx_events_form_profile_input_allow_view_to"><![CDATA[Privacy]]></string>
+    <string name="_bx_events_form_profile_input_allow_view_to_desc"><![CDATA[Closed - anyone can find the event and see who's in it, only members can see posts. Secret - only members can find the event and see posts.]]></string>
+    <string name="_bx_events_form_profile_input_sys_initial_members"><![CDATA[Invite Members]]></string>
+    <string name="_bx_events_form_profile_input_initial_members"><![CDATA[Invite Members]]></string>
+    <string name="_bx_events_form_profile_input_sys_event_name"><![CDATA[Event Name]]></string>
+    <string name="_bx_events_form_profile_input_event_name"><![CDATA[Event Name]]></string>
+    <string name="_bx_events_form_profile_input_event_name_err"><![CDATA[This information is essential. Please, fill in this field.]]></string>
+    <string name="_bx_events_form_profile_input_sys_event_desc"><![CDATA[Description]]></string>
+    <string name="_bx_events_form_profile_input_event_desc"><![CDATA[Description]]></string>
+    <string name="_bx_events_form_profile_input_sys_event_cat"><![CDATA[Category]]></string>
+	<string name="_bx_events_form_profile_input_event_cat"><![CDATA[Category]]></string>
+    <string name="_bx_events_form_profile_input_event_cat_err"><![CDATA[Category field is mandatory]]></string>
+	<string name="_bx_events_form_profile_input_sys_picture"><![CDATA[Event Picture]]></string>
+	<string name="_bx_events_form_profile_input_picture"><![CDATA[Upload New Event Picture]]></string>
+	<string name="_bx_events_form_profile_input_picture_err"><![CDATA[Event picture is mandatory.]]></string>
+	<string name="_bx_events_form_profile_input_sys_cover"><![CDATA[Cover Picture]]></string>
+	<string name="_bx_events_form_profile_input_cover"><![CDATA[Upload New Cover Picture]]></string>
+	<string name="_bx_events_form_profile_input_sys_delete_confirm"><![CDATA[Delete confirmation]]></string>
+	<string name="_bx_events_form_profile_input_delete_confirm"><![CDATA[I am sure I want to delete this event]]></string>
+	<string name="_bx_events_form_profile_input_delete_confirm_info"><![CDATA[This action can not be undone.]]></string>
+	<string name="_bx_events_form_profile_input_delete_confirm_error"><![CDATA[Please check this checkbox if you really want to delete event.]]></string>
+    <string name="_bx_events_form_profile_input_sys_reoccurring"><![CDATA[Reoccurring]]></string>
+    <string name="_bx_events_form_profile_input_reoccurring"><![CDATA[Reoccurring]]></string>
+    <string name="_bx_events_form_profile_input_reoccurring_add_interval"><![CDATA[Add repeating interval]]></string>
+
+    <string name="_bx_events_form_input_repeat_year"><![CDATA[Repeat year]]></string>
+    <string name="_bx_events_form_input_repeat_month"><![CDATA[Repeat month]]></string>
+    <string name="_bx_events_form_input_repeat_week_of_month"><![CDATA[Repeat week of month]]></string>
+    <string name="_bx_events_form_input_repeat_day_of_month"><![CDATA[Repeat day of month]]></string>
+    <string name="_bx_events_form_input_repeat_day_of_week"><![CDATA[Repeat day of week]]></string>
+    <string name="_bx_events_form_input_stop_repeating"><![CDATA[Stop repeating]]></string>
+
+	<string name="_bx_events_acl_action_create_profile"><![CDATA[Create Event]]></string>
+	<string name="_bx_events_acl_action_delete_profile"><![CDATA[Delete Event]]></string>
+	<string name="_bx_events_acl_action_view_profile"><![CDATA[View Event]]></string>
+	<string name="_bx_events_acl_action_edit_any_profile"><![CDATA[Edit Any Event]]></string>
+
+	<string name="_bx_events_page_title_sys_joined_entries"><![CDATA[Joined Events]]></string>
+	<string name="_bx_events_page_title_joined_entries"><![CDATA[Joined Events]]></string>
+	<string name="_bx_events_page_title_sys_create_profile"><![CDATA[Create Event]]></string>
+	<string name="_bx_events_page_title_create_profile"><![CDATA[Create Event]]></string>
+	<string name="_bx_events_page_title_sys_edit_profile"><![CDATA[Edit Event]]></string>
+	<string name="_bx_events_page_title_edit_profile"><![CDATA[Edit Event]]></string>
+	<string name="_bx_events_page_title_sys_edit_profile_cover"><![CDATA[Edit Event Cover]]></string>
+	<string name="_bx_events_page_title_edit_profile_cover"><![CDATA[Edit Cover]]></string>
+	<string name="_bx_events_page_title_sys_delete_profile"><![CDATA[Delete Event]]></string>
+	<string name="_bx_events_page_title_delete_profile"><![CDATA[Delete Event]]></string>
+	<string name="_bx_events_page_title_sys_view_profile_closed"><![CDATA[View Closed Event]]></string>
+	<string name="_bx_events_page_title_sys_view_profile"><![CDATA[View Event]]></string>
+	<string name="_bx_events_page_title_view_profile"><![CDATA[{display_name}]]></string>
+	<string name="_bx_events_page_title_browse"><![CDATA[Events]]></string>
+	<string name="_bx_events_page_title_browse_top"><![CDATA[Top Events]]></string>
+	<string name="_bx_events_page_title_browse_recent"><![CDATA[New Events]]></string>
+	<string name="_bx_events_page_title_browse_connections"><![CDATA[{0} connections]]></string>
+	<string name="_bx_events_page_title_browse_connections_mutual"><![CDATA[{0} and {1} mutual connections]]></string>
+	<string name="_bx_events_page_title_sys_profile_friends"><![CDATA[Friends]]></string>
+	<string name="_bx_events_page_title_profile_friends"><![CDATA[Friends]]></string>
+	<string name="_bx_events_page_title_sys_group_fans"><![CDATA[Members]]></string>
+	<string name="_bx_events_page_title_group_fans"><![CDATA[Members]]></string>
+	<string name="_bx_events_page_title_sys_profile_info"><![CDATA[Event Info]]></string>
+	<string name="_bx_events_page_title_profile_info"><![CDATA[Info about {display_name}]]></string>
+	<string name="_bx_events_page_title_sys_recent"><![CDATA[New Events]]></string>
+	<string name="_bx_events_page_title_recent"><![CDATA[New Events]]></string>
+	<string name="_bx_events_page_title_sys_manage"><![CDATA[Manage Own Events]]></string>
+	<string name="_bx_events_page_title_sys_manage_administration"><![CDATA[Manage All Events]]></string>
+	<string name="_bx_events_page_title_manage"><![CDATA[Manage Events]]></string>
+	<string name="_bx_events_page_title_sys_top"><![CDATA[Top Events]]></string>
+	<string name="_bx_events_page_title_top"><![CDATA[Top Events]]></string>
+
+	<string name="_bx_events_page_block_title_sys_joined_entries"><![CDATA[Joined Events]]></string>
+	<string name="_bx_events_page_block_title_joined_entries"><![CDATA[Joined Events]]></string>
+	<string name="_bx_events_page_block_title_create_profile"><![CDATA[Create Event]]></string>
+	<string name="_bx_events_page_block_title_edit_profile"><![CDATA[Edit Event]]></string>
+	<string name="_bx_events_page_block_title_edit_profile_cover"><![CDATA[Edit Cover]]></string>
+	<string name="_bx_events_page_block_title_delete_profile"><![CDATA[Delete Event]]></string>
+	<string name="_bx_events_page_block_title_profile_info_link"><![CDATA[About <a href="{profile_link}">{display_name}</a>]]></string>
+	<string name="_bx_events_page_block_title_profile_info"><![CDATA[Info]]></string>
+	<string name="_bx_events_page_block_title_system_profile_info"><![CDATA[Info]]></string>
+	<string name="_bx_events_page_block_title_profile_description"><![CDATA[Description]]></string>
+	<string name="_bx_events_page_block_title_profile_friends_link"><![CDATA[Friends of <a href="{profile_link}">{display_name}</a>]]></string>
+	<string name="_bx_events_page_block_title_profile_friends"><![CDATA[Friends]]></string>
+	<string name="_bx_events_page_block_title_system_profile_friends"><![CDATA[Friends]]></string>
+	<string name="_bx_events_page_block_title_fans_link"><![CDATA[Members of <a href="{profile_link}">{display_name}</a>]]></string>
+    <string name="_bx_events_page_block_title_fans"><![CDATA[Members]]></string>
+	<string name="_bx_events_page_block_title_system_fans"><![CDATA[Members]]></string>
+	<string name="_bx_events_page_block_title_profile_actions"><![CDATA[Actions]]></string>
+	<string name="_bx_events_page_block_title_latest_profiles"><![CDATA[New Events]]></string>
+	<string name="_bx_events_page_block_title_system_manage"><![CDATA[Manage Own Events]]></string>
+	<string name="_bx_events_page_block_title_system_manage_administration"><![CDATA[Manage All Events]]></string>
+	<string name="_bx_events_page_block_title_manage"><![CDATA[Manage Events]]></string>
+    <string name="_bx_events_page_block_title_top_profiles"><![CDATA[Top Events]]></string>
+    <string name="_bx_events_page_block_title_entry_social_sharing"><![CDATA[Share]]></string>
+
+    <string name="_bx_events_page_block_title_categories"><![CDATA[Event categories]]></string>
+
+    <string name="_bx_events_menu_title_submenu"><![CDATA[Events Submenu]]></string>
+    <string name="_bx_events_menu_set_title_submenu"><![CDATA[Events Submenu]]></string>
+    <string name="_bx_events_menu_set_title_view_profile_actions"><![CDATA[Event Actions]]></string>
+    <string name="_bx_events_menu_title_view_profile_actions"><![CDATA[Event Actions]]></string>
+    <string name="_bx_events_menu_set_title_view_profile_actions_more"><![CDATA[Event More Actions]]></string>
+    <string name="_bx_events_menu_title_view_profile_actions_more"><![CDATA[Event More Actions]]></string>
+    <string name="_bx_events_menu_set_title_view_profile_submenu"><![CDATA[View Event Submenu]]></string>
+    <string name="_bx_events_menu_title_view_profile_submenu"><![CDATA[View Event Submenu]]></string>
+    <string name="_bx_events_menu_title_view_profile_submenu_cover"><![CDATA[Event Cover Submenu]]></string>
+	<string name="_bx_events_menu_set_title_manage_tools"><![CDATA[Manage Tools Submenu]]></string>
+    <string name="_bx_events_menu_title_manage_tools"><![CDATA[Manage Tools Submenu]]></string>
+    <string name="_bx_events_menu_item_title_system_delete"><![CDATA[Delete]]></string>
+    <string name="_bx_events_menu_item_title_delete"><![CDATA[Delete]]></string>
+    <string name="_bx_events_menu_item_title_system_delete_with_content"><![CDATA[Delete With Content]]></string>
+    <string name="_bx_events_menu_item_title_delete_with_content"><![CDATA[Delete With Content]]></string>
+    <string name="_bx_events_menu_item_title_system_edit_cover"><![CDATA[Edit Cover]]></string>
+    <string name="_bx_events_menu_item_title_edit_cover"><![CDATA[Edit Cover]]></string>
+    <string name="_bx_events_menu_item_title_system_edit_profile"><![CDATA[Edit Event]]></string>
+    <string name="_bx_events_menu_item_title_edit_profile"><![CDATA[Edit Event]]></string>
+    <string name="_bx_events_menu_item_title_system_delete_profile"><![CDATA[Delete Event]]></string>
+    <string name="_bx_events_menu_item_title_delete_profile"><![CDATA[Delete Event]]></string>
+    <string name="_bx_events_menu_item_title_system_delete_account"><![CDATA[Delete Account]]></string>
+    <string name="_bx_events_menu_item_title_delete_account"><![CDATA[Delete Account]]></string>
+    <string name="_bx_events_menu_item_title_system_profile_type"><![CDATA[Event]]></string>
+    <string name="_bx_events_menu_item_title_profile_type"><![CDATA[Event]]></string>
+    <string name="_bx_events_menu_item_title_system_create_profile"><![CDATA[New Event]]></string>
+    <string name="_bx_events_menu_item_title_create_profile"><![CDATA[New Event]]></string>
+    <string name="_bx_events_menu_item_title_system_view_profile_friends"><![CDATA[Friends]]></string>
+    <string name="_bx_events_menu_item_title_view_profile_friends"><![CDATA[Friends]]></string>
+    <string name="_bx_events_menu_item_title_system_view_joined_groups"><![CDATA[Events]]></string>
+    <string name="_bx_events_menu_item_title_view_joined_groups"><![CDATA[Events]]></string>
+    <string name="_bx_events_menu_item_title_system_view_fans"><![CDATA[Members]]></string>
+    <string name="_bx_events_menu_item_title_view_fans"><![CDATA[Members]]></string>
+    <string name="_bx_events_menu_item_title_system_view_profile_info"><![CDATA[Info]]></string>
+    <string name="_bx_events_menu_item_title_view_profile_info"><![CDATA[Info]]></string>
+    <string name="_bx_events_menu_item_title_system_view_profile_view"><![CDATA[Event]]></string>
+    <string name="_bx_events_menu_item_title_view_profile_view"><![CDATA[Event]]></string>
+
+    <string name="_bx_events_menu_item_title_system_befriend"><![CDATA[Add friend]]></string>
+    <string name="_bx_events_menu_item_title_befriend"><![CDATA[Add friend]]></string>
+    <string name="_bx_events_menu_item_title_befriend_sent"><![CDATA[Add friend (requested)]]></string>
+    <string name="_bx_events_menu_item_title_befriend_confirm"><![CDATA[Accept friend request]]></string>
+    <string name="_bx_events_menu_item_title_system_unfriend"><![CDATA[Unfriend]]></string>
+    <string name="_bx_events_menu_item_title_unfriend"><![CDATA[Unfriend]]></string>
+    <string name="_bx_events_menu_item_title_unfriend_cancel_request"><![CDATA[Cancel friend request]]></string>
+    <string name="_bx_events_menu_item_title_unfriend_reject_request"><![CDATA[Reject friend request]]></string>
+
+    <string name="_bx_events_menu_item_title_system_become_fan"><![CDATA[Join Event]]></string>
+    <string name="_bx_events_menu_item_title_become_fan"><![CDATA[Join Event]]></string>
+    <string name="_bx_events_menu_item_title_become_fan_sent"><![CDATA[Join Event (requested)]]></string>
+    <string name="_bx_events_menu_item_title_become_fan_confirm"><![CDATA[Accept Request]]></string>
+    <string name="_bx_events_menu_item_title_system_leave_group"><![CDATA[Leave Event]]></string>
+    <string name="_bx_events_menu_item_title_leave_group"><![CDATA[Leave Event]]></string>
+    <string name="_bx_events_menu_item_title_leave_group_cancel_request"><![CDATA[Cancel Request]]></string>
+    <string name="_bx_events_menu_item_title_leave_group_reject_request"><![CDATA[Reject Request]]></string>
+
+    <string name="_bx_events_menu_item_title_system_subscribe"><![CDATA[Subscribe]]></string>
+    <string name="_bx_events_menu_item_title_subscribe"><![CDATA[Subscribe]]></string>
+    <string name="_bx_events_menu_item_title_system_unsubscribe"><![CDATA[Unsubscribe]]></string>
+    <string name="_bx_events_menu_item_title_unsubscribe"><![CDATA[Unsubscribe]]></string>
+    <string name="_bx_events_menu_item_title_system_more_actions"><![CDATA[More Actions]]></string>
+    <string name="_bx_events_menu_item_title_more_actions"><![CDATA[]]></string>
+    <string name="_bx_events_menu_item_title_system_friends"><![CDATA[Friends]]></string>
+    <string name="_bx_events_menu_item_title_friends"><![CDATA[Friends]]></string>
+    <string name="_bx_events_menu_item_title_system_friend_requests"><![CDATA[Friend requests number]]></string>
+    <string name="_bx_events_menu_item_title_friend_requests"><![CDATA[{addon} friend requests]]></string>
+    <string name="_bx_events_menu_item_title_system_manage_my_groups"><![CDATA[My events]]></string>
+    <string name="_bx_events_menu_item_title_manage_my_groups"><![CDATA[{addon} events]]></string>
+    <string name="_bx_events_menu_item_title_system_entries_recent"><![CDATA[New]]></string>
+    <string name="_bx_events_menu_item_title_entries_recent"><![CDATA[New]]></string>
+    <string name="_bx_events_menu_item_title_system_entries_manage"><![CDATA[Manage]]></string>
+    <string name="_bx_events_menu_item_title_entries_manage"><![CDATA[Manage]]></string>
+    <string name="_bx_events_menu_item_title_system_entries_home"><![CDATA[Events]]></string>
+    <string name="_bx_events_menu_item_title_entries_home"><![CDATA[Events]]></string>
+    <string name="_bx_events_menu_item_title_system_admt_groups"><![CDATA[Events]]></string>
+	<string name="_bx_events_menu_item_title_admt_groups"><![CDATA[Events - {addon} unapproved]]></string>
+	<string name="_bx_events_menu_item_title_manage_my"><![CDATA[My Events]]></string>
+	<string name="_bx_events_menu_item_title_manage_all"><![CDATA[All Events]]></string>
+	<string name="_bx_events_menu_item_title_system_entries_top"><![CDATA[Top]]></string>
+	<string name="_bx_events_menu_item_title_entries_top"><![CDATA[Top]]></string>
+
+	<string name="_bx_events_grid_filter_item_title_adm_select_one_filter1"><![CDATA[All Statuses]]></string>
+	<string name="_bx_events_grid_filter_item_title_adm_active"><![CDATA[Active]]></string>
+	<string name="_bx_events_grid_filter_item_title_adm_pending"><![CDATA[Pending]]></string>
+	<string name="_bx_events_grid_filter_item_title_adm_suspended"><![CDATA[Suspended]]></string>
+	<string name="_bx_events_grid_column_title_adm_active"><![CDATA[Active]]></string>
+    <string name="_bx_events_grid_column_title_adm_event_name"><![CDATA[Name]]></string>
+    <string name="_bx_events_grid_column_title_adm_added"><![CDATA[Created]]></string>
+    <string name="_bx_events_grid_column_title_adm_account"><![CDATA[Account]]></string>
+    <string name="_bx_events_grid_action_title_adm_delete"><![CDATA[Delete]]></string>
+    <string name="_bx_events_grid_action_title_adm_delete_with_content"><![CDATA[Delete With Content]]></string>
+    <string name="_bx_events_grid_action_title_adm_more_actions"><![CDATA[More Actions]]></string>
+	<string name="_bx_events_grid_action_err_delete"><![CDATA[Cannot delete the selected event(s).]]></string>
+	<string name="_bx_events_grid_txt_account_manager"><![CDATA[Redirect to manage account.]]></string>
+
+    <string name="_bx_events_txt_account_pending"><![CDATA[This event is pending approval, please wait until it is activated.]]></string>
+    <string name="_bx_events_txt_account_suspended"><![CDATA[This event is suspended.]]></string>
+    <string name="_bx_events_txt_N_fans"><![CDATA[{0} members]]></string>
+    <string name="_bx_events_txt_sample_single"><![CDATA[event]]></string>
+    <string name="_bx_events_txt_sample_vote_single"><![CDATA[event's vote]]></string>
+    <string name="_bx_events_txt_to_admins"><![CDATA[To Admins]]></string>
+    <string name="_bx_events_txt_from_admins"><![CDATA[From Admins]]></string>
+    <string name="_bx_events_txt_private_group"><![CDATA[Private event]]></string>
+
+    <string name="_bx_events_txt_ntfs_fan_added"><![CDATA[<a class="bx-ntfs-content-profile" href="{owner_link}">{owner_name}</a> event has got new member - <a href="{subentry_url}">{subentry_sample}</a>]]></string>
+    <string name="_bx_events_txt_ntfs_join_request"><![CDATA[<a class="bx-ntfs-content-profile" href="{owner_link}">{owner_name}</a> event has new request from <a href="{subentry_url}">{subentry_sample}</a>]]></string>
+    <string name="_bx_events_txt_ntfs_timeline_post_common"><![CDATA[New post in <a class="bx-ntfs-content-profile" href="{owner_link}">{owner_name}</a> event timeline  from <a href="{subentry_url}">{subentry_sample}</a>]]></string>
+
+    <string name="_bx_events_privacy_group_closed"><![CDATA[Closed]]></string>
+    <string name="_bx_events_privacy_group_secret"><![CDATA[Secret]]></string>
+
+    <string name="_bx_events_pre_lists_cats"><![CDATA[Event categories]]></string>
+    <string name="_bx_events_cat_General"><![CDATA[General]]></string>
+    <string name="_bx_events_cat_Business"><![CDATA[Business]]></string>
+    <string name="_bx_events_cat_Interests"><![CDATA[Interests]]></string>
+    <string name="_bx_events_cat_Causes"><![CDATA[Causes]]></string>
+    <string name="_bx_events_cat_Fun"><![CDATA[Fun]]></string>
+    <string name="_bx_events_cat_Uncategorised"><![CDATA[Uncategorised]]></string>
+
+    <string name="_bx_events_pre_lists_repeat_year"><![CDATA[Repeat year]]></string>
+    <string name="_bx_events_cat_repeat_year_every_year"><![CDATA[Every year]]></string>
+    <string name="_bx_events_cat_repeat_year_every_2_years"><![CDATA[Every 2 years]]></string>
+    <string name="_bx_events_cat_repeat_year_every_3_years"><![CDATA[Every 3 years]]></string>
+    <string name="_bx_events_cat_repeat_year_every_4_years"><![CDATA[Every 4 years]]></string>
+
+    <string name="_bx_events_pre_lists_repeat_month"><![CDATA[Repeat month]]></string>
+    <string name="_bx_events_cat_repeat_month_every_month"><![CDATA[Every month]]></string>
+    <string name="_bx_events_cat_repeat_month_jan"><![CDATA[Every January]]></string>
+    <string name="_bx_events_cat_repeat_month_feb"><![CDATA[Every February]]></string>
+    <string name="_bx_events_cat_repeat_month_mar"><![CDATA[Every March]]></string>
+    <string name="_bx_events_cat_repeat_month_apr"><![CDATA[Every April]]></string>
+    <string name="_bx_events_cat_repeat_month_may"><![CDATA[Every May]]></string>
+    <string name="_bx_events_cat_repeat_month_jun"><![CDATA[Every June]]></string>
+    <string name="_bx_events_cat_repeat_month_jul"><![CDATA[Every July]]></string>
+    <string name="_bx_events_cat_repeat_month_aug"><![CDATA[Every August]]></string>
+    <string name="_bx_events_cat_repeat_month_sep"><![CDATA[Every September]]></string>
+    <string name="_bx_events_cat_repeat_month_oct"><![CDATA[Every October]]></string>
+    <string name="_bx_events_cat_repeat_month_nov"><![CDATA[Every November]]></string>
+    <string name="_bx_events_cat_repeat_month_dec"><![CDATA[Every December]]></string>
+
+    <string name="_bx_events_pre_lists_repeat_week_of_month"><![CDATA[Repeat week of the month]]></string>
+    <string name="_bx_events_cat_repeat_week_of_month_every_week"><![CDATA[Every week]]></string>
+    <string name="_bx_events_cat_repeat_week_of_month_first_week_of_month"><![CDATA[Every 1st week of the month]]></string>
+    <string name="_bx_events_cat_repeat_week_of_month_second_week_of_month"><![CDATA[Every 2nd week of the month]]></string>
+    <string name="_bx_events_cat_repeat_week_of_month_third_week_of_month"><![CDATA[Every 3rd week of the month]]></string>
+    <string name="_bx_events_cat_repeat_week_of_month_fourth_week_of_month"><![CDATA[Every 4th week of the month]]></string>
+    <string name="_bx_events_cat_repeat_week_of_month_fifth_week_of_month"><![CDATA[Every 5th week of the month]]></string>
+
+    <string name="_bx_events_pre_lists_repeat_day_of_month"><![CDATA[Repeat day of the month]]></string>
+    <string name="_bx_events_cat_repeat_day_of_month_every_day"><![CDATA[Every day]]></string>
+
+    <string name="_bx_events_pre_lists_repeat_day_of_week"><![CDATA[Repeat day of the week]]></string>
+    <string name="_bx_events_cat_repeat_day_of_week_every_day"><![CDATA[Every day of the week]]></string>
+    <string name="_bx_events_cat_repeat_day_of_week_mon"><![CDATA[Every Monday]]></string>
+    <string name="_bx_events_cat_repeat_day_of_week_tue"><![CDATA[Every Tuesday]]></string>
+    <string name="_bx_events_cat_repeat_day_of_week_wed"><![CDATA[Every Wednesday]]></string>
+    <string name="_bx_events_cat_repeat_day_of_week_thu"><![CDATA[Every Thursday]]></string>
+    <string name="_bx_events_cat_repeat_day_of_week_fri"><![CDATA[Every Friday]]></string>
+    <string name="_bx_events_cat_repeat_day_of_week_sat"><![CDATA[Every Saturday]]></string>
+    <string name="_bx_events_cat_repeat_day_of_week_sun"><![CDATA[Every Sunday]]></string>
+
+    <string name="_bx_events_email_join_request"><![CDATA[Event join request]]></string>
+    <string name="_bx_events_email_join_request_subject"><![CDATA[Request to join your event]]></string>
+    <string name="_bx_events_email_join_request_body"><![CDATA[
+<bx_include_auto:_email_header.html />
+<p>New request to join <a href="{EntryUrl}">{EntryTitle}</a> event from <a href="{NewMemberUrl}">{NewMemberDisplayName}</a></p>
+<bx_include_auto:_email_footer.html />]]></string>
+
+    <string name="_bx_events_email_join_reject"><![CDATA[Event join request was rejected]]></string>
+    <string name="_bx_events_email_join_reject_subject"><![CDATA[Request to join an event was rejected]]></string>
+    <string name="_bx_events_email_join_reject_body"><![CDATA[
+<bx_include_auto:_email_header.html />
+<p>Your request to join <a href="{EntryUrl}">{EntryTitle}</a> event was rejected by event admin.</p>
+<bx_include_auto:_email_footer.html />]]></string>
+
+    <string name="_bx_events_email_join_confirm"><![CDATA[Event join request was confirmed]]></string>
+    <string name="_bx_events_email_join_confirm_subject"><![CDATA[Your request to join an event was confirmed]]></string>
+    <string name="_bx_events_email_join_confirm_body"><![CDATA[
+<bx_include_auto:_email_header.html />
+<p>Your request to join <a href="{EntryUrl}">{EntryTitle}</a> event was confirmed by the event admin.</p>
+<bx_include_auto:_email_footer.html />]]></string>
+
+    <string name="_bx_events_email_fan_remove"><![CDATA[Profile was removed from event participants]]></string>
+    <string name="_bx_events_email_fan_remove_subject"><![CDATA[Your profile was removed from the event]]></string>
+    <string name="_bx_events_email_fan_remove_body"><![CDATA[
+<bx_include_auto:_email_header.html />
+<p>Your profile was removed from <a href="{EntryUrl}">{EntryTitle}</a> event by the event admin.</p>
+<bx_include_auto:_email_footer.html />]]></string>
+
+    <string name="_bx_events_email_fan_become_admin"><![CDATA[Event admin status was granted]]></string>
+    <string name="_bx_events_email_fan_become_admin_subject"><![CDATA[You are an event admin now]]></string>
+    <string name="_bx_events_email_fan_become_admin_body"><![CDATA[
+<bx_include_auto:_email_header.html />
+<p>You are an admin of <a href="{EntryUrl}">{EntryTitle}</a> event now.</p>
+<bx_include_auto:_email_footer.html />]]></string>
+
+    <string name="_bx_events_email_admin_become_fan"><![CDATA[Event admin status was revoked]]></string>
+    <string name="_bx_events_email_admin_become_fan_subject"><![CDATA[Your event admin status was revoked]]></string>
+    <string name="_bx_events_email_admin_become_fan_body"><![CDATA[
+<bx_include_auto:_email_header.html />
+<p>Your admin status was revoked from <a href="{EntryUrl}">{EntryTitle}</a> event.</p>
+<bx_include_auto:_email_footer.html />]]></string>
+
+    <string name="_bx_events_email_invitation"><![CDATA[Invitation to event]]></string>
+    <string name="_bx_events_email_invitation_subject"><![CDATA[Invitation to "{EntryTitle}" event]]></string>
+    <string name="_bx_events_email_invitation_body"><![CDATA[
+<bx_include_auto:_email_header.html />
+<p><a href="{InviterUrl}">{InviterDisplayName}</a> invited you to <a href="{EntryUrl}">{EntryTitle} event</a>.</p>
+<bx_include_auto:_email_footer.html />]]></string>
+
+    <string name="_bx_ntfs_alert_action_fan_added"><![CDATA[member joined]]></string>
+    <string name="_bx_ntfs_alert_action_join_request"><![CDATA[join request]]></string>
+    <string name="_bx_ntfs_alert_action_timeline_post_common"><![CDATA[post to timeline]]></string>
+</resources>

+ 68 - 0
modules/boonex/events/install/sql/disable.sql

@@ -0,0 +1,68 @@
+
+-- SETTINGS
+
+SET @iTypeId = (SELECT `ID` FROM `sys_options_types` WHERE `name` = 'bx_events' LIMIT 1);
+SET @iCategId = (SELECT `ID` FROM `sys_options_categories` WHERE `type_id` = @iTypeId LIMIT 1);
+DELETE FROM `sys_options` WHERE `category_id` = @iCategId;
+DELETE FROM `sys_options_categories` WHERE `type_id` = @iTypeId;
+DELETE FROM `sys_options_types` WHERE `id` = @iTypeId;
+
+-- PAGES
+
+DELETE FROM `sys_objects_page` WHERE `module` = 'bx_events';
+DELETE FROM `sys_pages_blocks` WHERE `module` = 'bx_events' OR `object` IN('bx_events_create_profile', 'bx_events_delete_profile', 'bx_events_edit_profile', 'bx_events_edit_profile_cover', 'bx_events_view_profile', 'bx_events_view_profile_closed', 'bx_events_profile_info', 'bx_events_home', 'bx_events_fans', 'bx_events_joined', 'bx_events_top', 'bx_events_manage', 'bx_events_administration');
+
+-- MENU
+
+DELETE FROM `sys_objects_menu` WHERE `module` = 'bx_events';
+DELETE FROM `sys_menu_sets` WHERE `module` = 'bx_events';
+DELETE FROM `sys_menu_items` WHERE `module` = 'bx_events' OR `set_name` IN('bx_events_view_submenu', 'bx_events_submenu', 'bx_events_view_actions', 'bx_events_view_actions_more');
+
+-- ACL
+DELETE `sys_acl_actions`, `sys_acl_matrix` FROM `sys_acl_actions`, `sys_acl_matrix` WHERE `sys_acl_matrix`.`IDAction` = `sys_acl_actions`.`ID` AND `sys_acl_actions`.`Module` = 'bx_events';
+DELETE FROM `sys_acl_actions` WHERE `Module` = 'bx_events';
+
+-- VIEWS
+DELETE FROM `sys_objects_view` WHERE `name` = 'bx_events';
+
+-- VOTES
+DELETE FROM `sys_objects_vote` WHERE `Name` = 'bx_events';
+
+-- REPORTS
+DELETE FROM `sys_objects_report` WHERE `name` = 'bx_events';
+
+-- METATAGS
+DELETE FROM `sys_objects_metatags` WHERE `object` = 'bx_events';
+
+-- CATEGORY
+DELETE FROM `sys_objects_category` WHERE `object` = 'bx_events_cats';
+
+-- SEARCH
+DELETE FROM `sys_objects_search` WHERE `ObjectName` = 'bx_events';
+
+-- CONNECTIONS
+DELETE FROM `sys_objects_connection` WHERE `object` = 'bx_events_fans';
+
+-- GRIDS
+DELETE FROM `sys_objects_grid` WHERE `object` IN ('bx_events_administration', 'bx_events_moderation', 'bx_events_common', 'bx_events_fans');
+DELETE FROM `sys_grid_fields` WHERE `object` IN ('bx_events_administration', 'bx_events_moderation', 'bx_events_common', 'bx_events_fans');
+DELETE FROM `sys_grid_actions` WHERE `object` IN ('bx_events_administration', 'bx_events_moderation', 'bx_events_common', 'bx_events_fans');
+
+-- ALERTS
+
+SET @iHandler := (SELECT `id` FROM `sys_alerts_handlers` WHERE `name` = 'bx_events' LIMIT 1);
+DELETE FROM `sys_alerts` WHERE `handler_id` = @iHandler;
+DELETE FROM `sys_alerts_handlers` WHERE `id` = @iHandler;
+
+-- PRIVACY 
+
+DELETE FROM `sys_objects_privacy` WHERE `object` IN('bx_events_allow_view_to', 'bx_events_allow_view_notification_to');
+
+-- EMAIL TEMPLATES
+
+DELETE FROM `sys_email_templates` WHERE `Module` = 'bx_events';
+
+-- UPLOADERS
+
+DELETE FROM `sys_objects_uploader` WHERE `object` IN('bx_events_cover_crop', 'bx_events_picture_crop');
+

+ 416 - 0
modules/boonex/events/install/sql/enable.sql

@@ -0,0 +1,416 @@
+
+-- 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_events', '_bx_events', 'bx_events@modules/boonex/events/|std-mi.png', IF(ISNULL(@iTypeOrder), 1, @iTypeOrder + 1));
+SET @iTypeId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options_categories` (`type_id`, `name`, `caption`, `order`)
+VALUES (@iTypeId, 'bx_events', '_bx_events', 1);
+SET @iCategId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `extra`, `check`, `check_error`, `order`) VALUES
+('bx_events_num_connections_quick', '4', @iCategId, '_bx_events_option_num_connections_quick', 'digit', '', '', '', 10),
+('bx_events_num_rss', '10', @iCategId, '_bx_events_option_num_rss', 'digit', '', '', '', 12);
+
+-- 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_events_create_profile', 'create-event-profile', '_bx_events_page_title_sys_create_profile', '_bx_events_page_title_create_profile', 'bx_events', 5, 2147483647, 1, 'page.php?i=create-event-profile', '', '', '', 0, 1, 0, '', '');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_events_create_profile', 1, 'bx_events', '_bx_events_page_block_title_create_profile', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:9:\"bx_events\";s:6:\"method\";s:13:\"entity_create\";}', 0, 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_events_view_profile', 'view-event-profile', '_bx_events_page_title_sys_view_profile', '_bx_events_page_title_view_profile', 'bx_events', 10, 2147483647, 1, 'page.php?i=view-event-profile', '', '', '', 0, 1, 0, 'BxEventsPageEntry', 'modules/boonex/events/classes/BxEventsPageEntry.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_events_view_profile', 1, 'bx_events', '', '_bx_events_page_block_title_entry_social_sharing', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:9:\"bx_events\";s:6:\"method\";s:21:\"entity_social_sharing\";}', 0, 0, 1, 0),
+('bx_events_view_profile', 2, 'bx_events', '', '_bx_events_page_block_title_profile_info', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:9:\"bx_events\";s:6:\"method\";s:11:\"entity_info\";}', 0, 0, 1, 0),
+('bx_events_view_profile', 3, 'bx_events', '', '_bx_events_page_block_title_fans', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:9:\"bx_events\";s:6:\"method\";s:4:\"fans\";}', 0, 0, 1, 0),
+('bx_events_view_profile', 4, 'bx_events', '', '_bx_events_page_block_title_profile_description', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:9:\"bx_events\";s:6:\"method\";s:17:\"entity_text_block\";}', 0, 0, 1, 0);
+
+-- 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_events_view_profile_closed', 'view-event-profile-closed', '_bx_events_page_title_sys_view_profile_closed', '_bx_events_page_title_view_profile', 'bx_events', 10, 2147483647, 1, 'page.php?i=view-event-profile', '', '', '', 0, 1, 0, 'BxEventsPageEntry', 'modules/boonex/events/classes/BxEventsPageEntry.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_events_view_profile_closed', 2, 'bx_events', '', '_bx_events_page_block_title_profile_info', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:9:\"bx_events\";s:6:\"method\";s:11:\"entity_info\";}', 0, 0, 1, 0),
+('bx_events_view_profile_closed', 3, 'bx_events', '', '_bx_events_page_block_title_fans', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:9:\"bx_events\";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_events_edit_profile', 'edit-event-profile', '_bx_events_page_title_sys_edit_profile', '_bx_events_page_title_edit_profile', 'bx_events', 5, 2147483647, 1, 'page.php?i=edit-event-profile', '', '', '', 0, 1, 0, 'BxEventsPageEntry', 'modules/boonex/events/classes/BxEventsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_events_edit_profile', 1, 'bx_events', '_bx_events_page_block_title_edit_profile', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:9:\"bx_events\";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_events_edit_profile_cover', 'edit-event-cover', '_bx_events_page_title_sys_edit_profile_cover', '_bx_events_page_title_edit_profile_cover', 'bx_events', 5, 2147483647, 1, 'page.php?i=edit-event-cover', '', '', '', 0, 1, 0, 'BxEventsPageEntry', 'modules/boonex/events/classes/BxEventsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_events_edit_profile_cover', 1, 'bx_events', '_bx_events_page_block_title_edit_profile_cover', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:9:\"bx_events\";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_events_delete_profile', 'delete-event-profile', '_bx_events_page_title_sys_delete_profile', '_bx_events_page_title_delete_profile', 'bx_events', 5, 2147483647, 1, 'page.php?i=delete-event-profile', '', '', '', 0, 1, 0, 'BxEventsPageEntry', 'modules/boonex/events/classes/BxEventsPageEntry.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_events_delete_profile', 1, 'bx_events', '_bx_events_page_block_title_delete_profile', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:9:\"bx_events\";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_events_profile_info', 'event-profile-info', '_bx_events_page_title_sys_profile_info', '_bx_events_page_title_profile_info', 'bx_events', 5, 2147483647, 1, 'page.php?i=event-profile-info', '', '', '', 0, 1, 0, 'BxEventsPageEntry', 'modules/boonex/events/classes/BxEventsPageEntry.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_events_profile_info', 1, 'bx_events', '_bx_events_page_block_title_system_profile_info', '_bx_events_page_block_title_profile_info_link', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:9:\"bx_events\";s:6:\"method\";s:16:\"entity_info_full\";}', 0, 0, 1, 1),
+('bx_events_profile_info', 1, 'bx_events', '', '_bx_events_page_block_title_profile_description', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:9:\"bx_events\";s:6:\"method\";s:17:\"entity_text_block\";}', 0, 0, 1, 2);
+
+-- PAGE: event 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_events_fans', 'event-fans', '_bx_events_page_title_sys_group_fans', '_bx_events_page_title_group_fans', 'bx_events', 5, 2147483647, 1, 'page.php?i=event-fans', '', '', '', 0, 1, 0, 'BxEventsPageEntry', 'modules/boonex/events/classes/BxEventsPageEntry.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_events_fans', 1, 'bx_events', '_bx_events_page_block_title_system_fans', '_bx_events_page_block_title_fans_link', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:9:"bx_events";s:6:"method";s:10:"fans_table";}', 0, 0, 1, 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_events_home', '_bx_events_page_title_sys_recent', '_bx_events_page_title_recent', 'bx_events', 5, 2147483647, 1, 'events-home', 'page.php?i=events-home', '', '', '', 0, 1, 0, 'BxEventsPageBrowse', 'modules/boonex/events/classes/BxEventsPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_events_home', 1, 'bx_events', '_bx_events_page_block_title_latest_profiles', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:9:\"bx_events\";s:6:\"method\";s:22:\"browse_recent_profiles\";s:6:"params";a:1:{i:0;b:1;}}', 0, 1, 0);
+
+-- PAGE: top 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_events_top', '_bx_events_page_title_sys_top', '_bx_events_page_title_top', 'bx_events', 5, 2147483647, 1, 'events-top', 'page.php?i=events-top', '', '', '', 0, 1, 0, 'BxEventsPageBrowse', 'modules/boonex/events/classes/BxEventsPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('bx_events_top', 1, 'bx_events', '_bx_events_page_block_title_top_profiles', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:9:\"bx_events\";s:6:\"method\";s:19:\"browse_top_profiles\";s:6:"params";a:1:{i:0;b:1;}}', 0, 1, 0);
+
+-- 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_events_manage', '_bx_events_page_title_sys_manage', '_bx_events_page_title_manage', 'bx_events', 5, 2147483647, 1, 'events-manage', 'page.php?i=events-manage', '', '', '', 0, 1, 0, 'BxEventsPageBrowse', 'modules/boonex/events/classes/BxEventsPageBrowse.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_events_manage', 1, 'bx_events', '_bx_events_page_block_title_system_manage', '_bx_events_page_block_title_manage', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:9:\"bx_events\";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_events_administration', '_bx_events_page_title_sys_manage_administration', '_bx_events_page_title_manage', 'bx_events', 5, 192, 1, 'events-administration', 'page.php?i=events-administration', '', '', '', 0, 1, 0, 'BxEventsPageBrowse', 'modules/boonex/events/classes/BxEventsPageBrowse.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_events_administration', 1, 'bx_events', '_bx_events_page_block_title_system_manage_administration', '_bx_events_page_block_title_manage', 11, 192, 'service', 'a:3:{s:6:\"module\";s:9:\"bx_events\";s:6:\"method\";s:12:\"manage_tools\";s:6:\"params\";a:1:{i:0;s:14:\"administration\";}}', 0, 1, 0);
+
+-- PAGE: user's events
+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_events_joined', 'joined-events', '_bx_events_page_title_sys_joined_entries', '_bx_events_page_title_joined_entries', 'bx_events', 5, 2147483647, 1, '', '', '', '', 0, 1, 0, 'BxEventsPageJoinedEntries', 'modules/boonex/events/classes/BxEventsPageJoinedEntries.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_events_joined', 1, 'bx_events', '_bx_events_page_block_title_sys_joined_entries', '_bx_events_page_block_title_joined_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:9:"bx_events";s:6:"method";s:21:"browse_joined_entries";s:6:"params";a:2:{i:0;i:0;i:1;b:1;}}', 0, 0, 1, 1);
+
+-- 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`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES
+('sys_home', 1, 'bx_events', '_bx_events_page_block_title_latest_profiles', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:9:"bx_events";s:6:"method";s:22:"browse_recent_profiles";}', 1, 0, 0, IFNULL(@iBlockOrder, 0) + 1);
+
+-- 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_events', '', '_bx_events_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:14:"bx_events_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);
+
+
+-- 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_events', 'events-home', '_bx_events_menu_item_title_system_entries_home', '_bx_events_menu_item_title_entries_home', 'page.php?i=events-home', '', '', 'calendar col-red2', 'bx_events_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_events', 'events-home', '_bx_events_menu_item_title_system_entries_home', '_bx_events_menu_item_title_entries_home', 'page.php?i=events-home', '', '', 'calendar col-red2', 'bx_events_submenu', 2147483647, 1, 1, IFNULL(@iHomepageMenuOrder, 0) + 1);
+
+-- 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_events', 'create-event-profile', '_bx_events_menu_item_title_system_create_profile', '_bx_events_menu_item_title_create_profile', 'page.php?i=create-event-profile', '', '', 'calendar 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_events_view_actions', '_bx_events_menu_title_view_profile_actions', 'bx_events_view_actions', 'bx_events', 9, 0, 1, 'BxEventsMenuView', 'modules/boonex/events/classes/BxEventsMenuView.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_events_view_actions', 'bx_events', '_bx_events_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`, `active`, `copyable`, `order`) VALUES 
+('bx_events_view_actions', 'bx_events', 'profile-fan-add', '_bx_events_menu_item_title_system_become_fan', '{title_add_fan}', 'javascript:void(0)', 'bx_conn_action(this, \'bx_events_fans\', \'add\', \'{profile_id}\')', '', 'user-plus', '', 0, 2147483647, 1, 0, 5),
+('bx_events_view_actions', 'bx_events', 'profile-subscribe-add', '_bx_events_menu_item_title_system_subscribe', '_bx_events_menu_item_title_subscribe', 'javascript:void(0)', 'bx_conn_action(this, \'sys_profiles_subscriptions\', \'add\', \'{profile_id}\')', '', 'check', '', 0, 2147483647, 1, 0, 20),
+('bx_events_view_actions', 'bx_events', 'profile-actions-more', '_bx_events_menu_item_title_system_more_actions', '_bx_events_menu_item_title_more_actions', 'javascript:void(0)', 'bx_menu_popup(''bx_events_view_actions_more'', this, {}, {profile_id:{profile_id}});', '', 'cog', 'bx_events_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_events_view_actions_more', '_bx_events_menu_title_view_profile_actions_more', 'bx_events_view_actions_more', 'bx_events', 6, 0, 1, 'BxEventsMenuView', 'modules/boonex/events/classes/BxEventsMenuView.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_events_view_actions_more', 'bx_events', '_bx_events_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_events_view_actions_more', 'bx_events', 'profile-fan-remove', '_bx_events_menu_item_title_system_leave_group', '{title_remove_fan}', 'javascript:void(0)', 'bx_conn_action(this, \'bx_events_fans\', \'remove\', \'{profile_id}\')', '', 'user-times', '', 2147483647, 1, 0, 10),
+('bx_events_view_actions_more', 'bx_events', 'profile-subscribe-remove', '_bx_events_menu_item_title_system_unsubscribe', '_bx_events_menu_item_title_unsubscribe', 'javascript:void(0)', 'bx_conn_action(this, \'sys_profiles_subscriptions\', \'remove\', \'{profile_id}\')', '', 'check', '', 2147483647, 1, 0, 20),
+('bx_events_view_actions_more', 'bx_events', 'edit-event-cover', '_bx_events_menu_item_title_system_edit_cover', '_bx_events_menu_item_title_edit_cover', 'page.php?i=edit-event-cover&id={content_id}', '', '', 'pencil', '', 2147483647, 1, 0, 30),
+('bx_events_view_actions_more', 'bx_events', 'edit-event-profile', '_bx_events_menu_item_title_system_edit_profile', '_bx_events_menu_item_title_edit_profile', 'page.php?i=edit-event-profile&id={content_id}', '', '', 'pencil', '', 2147483647, 1, 0, 40),
+('bx_events_view_actions_more', 'bx_events', 'delete-event-profile', '_bx_events_menu_item_title_system_delete_profile', '_bx_events_menu_item_title_delete_profile', 'page.php?i=delete-event-profile&id={content_id}', '', '', 'remove', '', 2147483647, 1, 0, 50);
+
+-- 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_events_submenu', '_bx_events_menu_title_submenu', 'bx_events_submenu', 'bx_events', 8, 0, 1, '', '');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_events_submenu', 'bx_events', '_bx_events_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_events_submenu', 'bx_events', 'events-home', '_bx_events_menu_item_title_system_entries_recent', '_bx_events_menu_item_title_entries_recent', 'page.php?i=events-home', '', '', '', '', 2147483647, 1, 1, 1),
+('bx_events_submenu', 'bx_events', 'events-top', '_bx_events_menu_item_title_system_entries_top', '_bx_events_menu_item_title_entries_top', 'page.php?i=events-top', '', '', '', '', 2147483647, 1, 1, 2),
+('bx_events_submenu', 'bx_events', 'events-manage', '_bx_events_menu_item_title_system_entries_manage', '_bx_events_menu_item_title_entries_manage', 'page.php?i=events-manage', '', '', '', '', 2147483646, 1, 1, 3);
+
+-- 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_events_view_submenu', '_bx_events_menu_title_view_profile_submenu', 'bx_events_view_submenu', 'bx_events', 8, 0, 1, 'BxEventsMenuView', 'modules/boonex/events/classes/BxEventsMenuView.php'),
+('bx_events_view_submenu_cover', '_bx_events_menu_title_view_profile_submenu_cover', 'bx_events_view_submenu', 'bx_events', 7, 0, 1, 'BxEventsMenuView', 'modules/boonex/events/classes/BxEventsMenuView.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_events_view_submenu', 'bx_events', '_bx_events_menu_set_title_view_profile_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_events_view_submenu', 'bx_events', 'view-event-profile', '_bx_events_menu_item_title_system_view_profile_view', '_bx_events_menu_item_title_view_profile_view', 'page.php?i=view-event-profile&id={content_id}', '', '', 'calendar col-red2', '', 2147483647, 1, 0, 1),
+('bx_events_view_submenu', 'bx_events', 'event-profile-info', '_bx_events_menu_item_title_system_view_profile_info', '_bx_events_menu_item_title_view_profile_info', 'page.php?i=event-profile-info&id={content_id}', '', '', 'info-circle col-gray', '', 2147483647, 1, 0, 2),
+('bx_events_view_submenu', 'bx_events', 'event-fans', '_bx_events_menu_item_title_system_view_fans', '_bx_events_menu_item_title_view_fans', 'page.php?i=event-fans&profile_id={profile_id}', '', '', 'calendar col-blue3', '', 2147483647, 1, 0, 3);
+
+-- 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_events', 'profile-stats-manage-groups', '_bx_events_menu_item_title_system_manage_my_groups', '_bx_events_menu_item_title_manage_my_groups', 'page.php?i=events-manage', '', '_self', 'calendar col-red2', 'a:2:{s:6:"module";s:9:"bx_events";s:6:"method";s:41:"get_menu_addon_manage_tools_profile_stats";}', '', 2147483646, 1, 0, @iNotifMenuOrder + 2);
+
+-- 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_events_menu_manage_tools', '_bx_events_menu_title_manage_tools', 'bx_events_menu_manage_tools', 'bx_events', 6, 0, 1, 'BxEventsMenuManageTools', 'modules/boonex/events/classes/BxEventsMenuManageTools.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_events_menu_manage_tools', 'bx_events', '_bx_events_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_events_menu_manage_tools', 'bx_events', 'delete', '_bx_events_menu_item_title_system_delete', '_bx_events_menu_item_title_delete', 'javascript:void(0)', 'javascript:{js_object}.onClickDelete({content_id});', '_self', 'trash-o', '', 2147483647, 1, 0, 1),
+('bx_events_menu_manage_tools', 'bx_events', 'delete-with-content', '_bx_events_menu_item_title_system_delete_with_content', '_bx_events_menu_item_title_delete_with_content', 'javascript:void(0)', 'javascript:{js_object}.onClickDeleteWithContent({content_id});', '_self', 'trash-o', '', 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_events', 'events-administration', '_bx_events_menu_item_title_system_admt_groups', '_bx_events_menu_item_title_admt_groups', 'page.php?i=events-administration', '', '_self', '', 'a:2:{s:6:"module";s:9:"bx_events";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_events', 'joined-events', '_bx_events_menu_item_title_system_view_joined_groups', '_bx_events_menu_item_title_view_joined_groups', 'page.php?i=joined-events&profile_id={profile_id}', '', '', 'calendar col-red2', '', 2147483647, 1, 0, 0);
+
+-- ACL
+INSERT INTO `sys_acl_actions` (`Module`, `Name`, `AdditionalParamName`, `Title`, `Desc`, `Countable`, `DisabledForLevels`) VALUES
+('bx_events', 'create entry', NULL, '_bx_events_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_events', 'delete entry', NULL, '_bx_events_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_events', 'view entry', NULL, '_bx_events_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_events', 'edit any entry', NULL, '_bx_events_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);
+
+
+-- VIEWS
+INSERT INTO `sys_objects_view` (`name`, `table_track`, `period`, `is_on`, `trigger_table`, `trigger_field_id`, `trigger_field_count`, `class_name`, `class_file`) VALUES 
+('bx_events', 'bx_events_views_track', '86400', '1', 'bx_events_data', '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_events', 'bx_events_votes', 'bx_events_votes_track', '604800', '1', '1', '0', '1', 'bx_events_data', 'id', 'author', 'rate', 'votes', '', '');
+
+-- 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_events', 'bx_events_reports', 'bx_events_reports_track', '1', 'page.php?i=view-event-profile&id={object_id}', 'bx_events_data', 'id', 'author', 'reports', '', '');
+
+-- METATAGS
+INSERT INTO `sys_objects_metatags` (`object`, `table_keywords`, `table_locations`, `table_mentions`, `override_class_name`, `override_class_file`) VALUES
+('bx_events', 'bx_events_meta_keywords', '', '', '', '');
+
+-- 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_events_cats', 'bx_events', 'bx_event', 'bx_events_cats', 'bx_events_data', 'event_cat', 'INNER JOIN `sys_profiles` ON (`sys_profiles`.`content_id` = `bx_events_data`.`id` AND `sys_profiles`.`type` = ''bx_events'')', '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_events', '_bx_events', @iSearchOrder + 1, 'BxEventsSearchResult', 'modules/boonex/events/classes/BxEventsSearchResult.php');
+
+-- CONNECTIONS
+INSERT INTO `sys_objects_connection` (`object`, `table`, `type`, `override_class_name`, `override_class_file`) VALUES
+('bx_events_fans', 'bx_events_fans', 'mutual', '', '');
+
+-- 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`, `override_class_name`, `override_class_file`) VALUES
+('bx_events_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, 'BxEventsGridConnections', 'modules/boonex/events/classes/BxEventsGridConnections.php');
+
+INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `params`, `order`) VALUES
+('bx_events_fans', 'name', '_sys_name', '50%', '', 10),
+('bx_events_fans', 'actions', '', '50%', '', 20);
+
+INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `confirm`, `order`) VALUES
+('bx_events_fans', 'single', 'accept', '_sys_accept', '', 0, 10),
+('bx_events_fans', 'single', 'to_admins', '_bx_events_txt_to_admins', '', 0, 20),
+('bx_events_fans', 'single', 'from_admins', '_bx_events_txt_from_admins', '', 0, 30),
+('bx_events_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_events_administration', 'Sql', 'SELECT `td`.*, `ta`.`email` AS `account`, `td`.`added` AS `added_ts`, `tp`.`status` AS `status` FROM `bx_events_data` AS `td` LEFT JOIN `sys_profiles` AS `tp` ON `td`.`id`=`tp`.`content_id` AND `tp`.`type`=''bx_events'' LEFT JOIN `sys_accounts` AS `ta` ON `tp`.`account_id`=`ta`.`id` WHERE 1 ', 'bx_events_data', 'id', 'added', 'status', '', 20, NULL, 'start', '', 'event_name', '', 'like', '', '', 192, 'BxEventsGridAdministration', 'modules/boonex/events/classes/BxEventsGridAdministration.php'),
+('bx_events_common', 'Sql', 'SELECT `td`.*, `ta`.`email` AS `account`, `ta`.`added` AS `added_ts`, `tp`.`status` AS `status` FROM `bx_events_data` AS `td` LEFT JOIN `sys_profiles` AS `tp` ON `td`.`id`=`tp`.`content_id` AND `tp`.`type`=''bx_events'' LEFT JOIN `sys_accounts` AS `ta` ON `tp`.`account_id`=`ta`.`id` WHERE 1 ', 'bx_events_data', 'id', 'added', 'status', '', 20, NULL, 'start', '', 'event_name', '', 'like', '', '', 2147483647, 'BxEventsGridCommon', 'modules/boonex/events/classes/BxEventsGridCommon.php');
+
+INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `order`) VALUES
+('bx_events_administration', 'checkbox', '_sys_select', '2%', 0, '', '', 1),
+('bx_events_administration', 'switcher', '_bx_events_grid_column_title_adm_active', '8%', 0, '', '', 2),
+('bx_events_administration', 'event_name', '_bx_events_grid_column_title_adm_event_name', '25%', 0, '', '', 3),
+('bx_events_administration', 'added_ts', '_bx_events_grid_column_title_adm_added', '20%', 1, '25', '', 4),
+('bx_events_administration', 'account', '_bx_events_grid_column_title_adm_account', '25%', 0, '25', '', 5),
+('bx_events_administration', 'actions', '', '20%', 0, '', '', 6),
+('bx_events_common', 'checkbox', '_sys_select', '2%', 0, '', '', 1),
+('bx_events_common', 'event_name', '_bx_events_grid_column_title_adm_event_name', '48%', 0, '', '', 2),
+('bx_events_common', 'added_ts', '_bx_events_grid_column_title_adm_added', '30%', 1, '25', '', 3),
+('bx_events_common', 'actions', '', '20%', 0, '', '', 4);
+
+INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon_only`, `confirm`, `order`) VALUES
+('bx_events_administration', 'bulk', 'delete', '_bx_events_grid_action_title_adm_delete', '', 0, 1, 2),
+('bx_events_administration', 'bulk', 'delete_with_content', '_bx_events_grid_action_title_adm_delete_with_content', '', 0, 1, 3),
+('bx_events_administration', 'single', 'settings', '_bx_events_grid_action_title_adm_more_actions', 'cog', 1, 0, 2),
+('bx_events_common', 'bulk', 'delete', '_bx_events_grid_action_title_adm_delete', '', 0, 1, 1),
+('bx_events_common', 'bulk', 'delete_with_content', '_bx_events_grid_action_title_adm_delete_with_content', '', 0, 1, 2),
+('bx_events_common', 'single', 'settings', '_bx_events_grid_action_title_adm_more_actions', 'cog', 1, 0, 1);
+
+
+-- ALERTS
+
+INSERT INTO `sys_alerts_handlers` (`name`, `class`, `file`, `service_call`) VALUES 
+('bx_events', 'BxEventsAlertsResponse', 'modules/boonex/events/classes/BxEventsAlertsResponse.php', '');
+SET @iHandler := LAST_INSERT_ID();
+
+INSERT INTO `sys_alerts` (`unit`, `action`, `handler_id`) VALUES
+('bx_timeline', 'post_common', @iHandler),
+('bx_events_pics', 'file_deleted', @iHandler),
+('bx_events_fans', 'connection_added', @iHandler),
+('bx_events_fans', 'connection_removed', @iHandler),
+('profile', 'delete', @iHandler),
+('bx_events', 'fan_added', @iHandler),
+('bx_events', 'join_invitation', @iHandler),
+('bx_events', 'join_request', @iHandler),
+('bx_events', 'join_request_accepted', @iHandler),
+('bx_events', 'timeline_view', @iHandler),
+('bx_events', 'timeline_post', @iHandler),
+('bx_events', 'timeline_delete', @iHandler),
+('bx_events', 'timeline_comment', @iHandler),
+('bx_events', 'timeline_vote', @iHandler),
+('bx_events', 'timeline_report', @iHandler),
+('bx_events', 'timeline_share', @iHandler);
+
+-- 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_events_allow_view_to', 'bx_events', 'view', '_bx_events_form_profile_input_allow_view_to', '3', 'bx_events_data', 'id', 'author', 'BxEventsPrivacy', 'modules/boonex/events/classes/BxEventsPrivacy.php'),
+('bx_events_allow_view_notification_to', 'bx_events', 'view_event', '_bx_events_form_profile_input_allow_view_notification_to', '3', 'bx_notifications_events', 'id', 'object_owner_id', 'BxEventsPrivacyNotifications', 'modules/boonex/events/classes/BxEventsPrivacyNotifications.php');
+
+-- EMAIL TEMPLATES
+
+INSERT INTO `sys_email_templates` (`Module`, `NameSystem`, `Name`, `Subject`, `Body`) VALUES
+('bx_events', '_bx_events_email_join_request', 'bx_events_join_request', '_bx_events_email_join_request_subject', '_bx_events_email_join_request_body'),
+('bx_events', '_bx_events_email_join_reject', 'bx_events_join_reject', '_bx_events_email_join_reject_subject', '_bx_events_email_join_reject_body'),
+('bx_events', '_bx_events_email_join_confirm', 'bx_events_join_confirm', '_bx_events_email_join_confirm_subject', '_bx_events_email_join_confirm_body'),
+('bx_events', '_bx_events_email_fan_remove', 'bx_events_fan_remove', '_bx_events_email_fan_remove_subject', '_bx_events_email_fan_remove_body'),
+('bx_events', '_bx_events_email_fan_become_admin', 'bx_events_fan_become_admin', '_bx_events_email_fan_become_admin_subject', '_bx_events_email_fan_become_admin_body'),
+('bx_events', '_bx_events_email_admin_become_fan', 'bx_events_admin_become_fan', '_bx_events_email_admin_become_fan_subject', '_bx_events_email_admin_become_fan_body'),
+('bx_events', '_bx_events_email_invitation', 'bx_events_invitation', '_bx_events_email_invitation_subject', '_bx_events_email_invitation_body');
+
+-- UPLOADERS
+
+INSERT INTO `sys_objects_uploader` (`object`, `active`, `override_class_name`, `override_class_file`) VALUES
+('bx_events_cover_crop', 1, 'BxEventsUploaderCoverCrop', 'modules/boonex/events/classes/BxEventsUploaderCoverCrop.php'),
+('bx_events_picture_crop', 1, 'BxEventsUploaderPictureCrop', 'modules/boonex/events/classes/BxEventsUploaderPictureCrop.php');
+

+ 361 - 0
modules/boonex/events/install/sql/install.sql

@@ -0,0 +1,361 @@
+
+-- TABLE: EVENTS
+CREATE TABLE IF NOT EXISTS `bx_events_data` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `author` int(10) unsigned NOT NULL,
+  `added` int(11) NOT NULL,
+  `changed` int(11) NOT NULL,
+  `picture` int(11) NOT NULL,
+  `cover` int(11) NOT NULL,
+  `event_name` varchar(255) NOT NULL,
+  `event_cat` int(11) NOT NULL,
+  `event_desc` text NOT NULL,
+  `views` int(11) NOT NULL default '0',
+  `rate` float NOT NULL default '0',
+  `votes` int(11) NOT NULL default '0',
+  `reports` int(11) NOT NULL default '0',
+  `join_confirmation` tinyint(4) NOT NULL DEFAULT '1',
+  `allow_view_to` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  FULLTEXT KEY `event_name` (`event_name`)
+);
+
+-- TABLE: REPEATING INTERVALS
+CREATE TABLE IF NOT EXISTS `bx_events_intervals` (
+  `interval_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `event_id` int(10) unsigned NOT NULL,
+  `repeat_year` int(11) NOT NULL,
+  `repeat_month` int(11) NOT NULL,
+  `repeat_week_of_month` int(11) NOT NULL,
+  `repeat_day_of_month` int(11) NOT NULL,
+  `repeat_day_of_week` int(11) NOT NULL,
+  `repeat_stop` int(10) unsigned NOT NULL,
+  PRIMARY KEY (`interval_id`),
+  KEY `event_id` (`event_id`)
+) AUTO_INCREMENT=1000;
+
+-- TABLE: STORAGES & TRANSCODERS
+CREATE TABLE `bx_events_pics` (
+  `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`)
+);
+
+CREATE TABLE `bx_events_pics_resized` (
+  `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: VIEWS
+CREATE TABLE `bx_events_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`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+-- TABLE: VOTES
+CREATE TABLE IF NOT EXISTS `bx_events_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`)
+) ENGINE=MYISAM DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `bx_events_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`)
+) ENGINE=MYISAM DEFAULT CHARSET=utf8;
+
+-- TABLE: REPORTS
+CREATE TABLE IF NOT EXISTS `bx_events_reports` (
+  `object_id` int(11) NOT NULL default '0',
+  `count` int(11) NOT NULL default '0',
+  UNIQUE KEY `object_id` (`object_id`)
+) ENGINE=MYISAM DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `bx_events_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`)
+) ENGINE=MYISAM DEFAULT CHARSET=utf8;
+
+-- TABLE: metas
+CREATE TABLE `bx_events_meta_keywords` (
+  `object_id` int(10) unsigned NOT NULL,
+  `keyword` varchar(255) NOT NULL,
+  KEY `object_id` (`object_id`),
+  KEY `keyword` (`keyword`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+-- TABLE: fans
+CREATE TABLE IF NOT EXISTS `bx_events_fans` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `initiator` int(11) NOT NULL,
+  `content` int(11) NOT NULL,
+  `mutual` tinyint(4) NOT NULL,
+  `added` int(10) unsigned NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `initiator` (`initiator`,`content`),
+  KEY `content` (`content`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+-- TABLE: admins
+CREATE TABLE IF NOT EXISTS `bx_events_admins` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `group_profile_id` int(10) unsigned NOT NULL,
+  `fan_id` int(10) unsigned NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `admin` (`group_profile_id`,`fan_id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+-- STORAGES & TRANSCODERS
+
+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_events_pics', 'Local', '', 360, 2592000, 3, 'bx_events_pics', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0),
+('bx_events_pics_resized', 'Local', '', 360, 2592000, 3, 'bx_events_pics_resized', 'allow-deny', 'jpg,jpeg,jpe,gif,png', '', 0, 0, 0, 0, 0, 0);
+
+INSERT INTO `sys_objects_transcoder` (`object`, `storage_object`, `source_type`, `source_params`, `private`, `atime_tracking`, `atime_pruning`, `ts`) VALUES 
+('bx_events_icon', 'bx_events_pics_resized', 'Storage', 'a:1:{s:6:"object";s:14:"bx_events_pics";}', 'no', '1', '2592000', '0'),
+('bx_events_thumb', 'bx_events_pics_resized', 'Storage', 'a:1:{s:6:"object";s:14:"bx_events_pics";}', 'no', '1', '2592000', '0'),
+('bx_events_avatar', 'bx_events_pics_resized', 'Storage', 'a:1:{s:6:"object";s:14:"bx_events_pics";}', 'no', '1', '2592000', '0'),
+('bx_events_picture', 'bx_events_pics_resized', 'Storage', 'a:1:{s:6:"object";s:14:"bx_events_pics";}', 'no', '1', '2592000', '0'),
+('bx_events_cover', 'bx_events_pics_resized', 'Storage', 'a:1:{s:6:"object";s:14:"bx_events_pics";}', 'no', '1', '2592000', '0'),
+('bx_events_cover_thumb', 'bx_events_pics_resized', 'Storage', 'a:1:{s:6:"object";s:14:"bx_events_pics";}', 'no', '1', '2592000', '0');
+
+INSERT INTO `sys_transcoder_filters` (`transcoder_object`, `filter`, `filter_params`, `order`) VALUES 
+('bx_events_icon', 'Resize', 'a:3:{s:1:"w";s:2:"32";s:1:"h";s:2:"32";s:13:"square_resize";s:1:"1";}', '0'),
+('bx_events_thumb', 'Resize', 'a:3:{s:1:"w";s:2:"48";s:1:"h";s:2:"48";s:13:"square_resize";s:1:"1";}', '0'),
+('bx_events_avatar', 'Resize', 'a:3:{s:1:"w";s:2:"96";s:1:"h";s:2:"96";s:13:"square_resize";s:1:"1";}', '0'),
+('bx_events_picture', 'Resize', 'a:3:{s:1:"w";s:4:"1024";s:1:"h";s:4:"1024";s:13:"square_resize";s:1:"0";}', '0'),
+('bx_events_cover', 'Resize', 'a:1:{s:1:"w";s:4:"1024";}', '0'),
+('bx_events_cover_thumb', 'Resize', 'a:3:{s:1:"w";s:2:"48";s:1:"h";s:2:"48";s:13:"square_resize";s:1:"1";}', '0');
+
+-- FORMS
+
+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_event', 'bx_events', '_bx_events_form_profile', '', 'a:1:{s:7:\"enctype\";s:19:\"multipart/form-data\";}', 'bx_events_data', 'id', '', '', 'do_submit', '', 0, 1, 'BxEventsFormEntry', 'modules/boonex/events/classes/BxEventsFormEntry.php');
+
+INSERT INTO `sys_form_displays`(`object`, `display_name`, `module`, `view_mode`, `title`) VALUES 
+('bx_event', 'bx_event_add', 'bx_events', 0, '_bx_events_form_profile_display_add'),
+('bx_event', 'bx_event_delete', 'bx_events', 0, '_bx_events_form_profile_display_delete'),
+('bx_event', 'bx_event_edit', 'bx_events', 0, '_bx_events_form_profile_display_edit'),
+('bx_event', 'bx_event_edit_cover', 'bx_events', 0, '_bx_events_form_profile_display_edit_cover'),
+('bx_event', 'bx_event_view', 'bx_events', 1, '_bx_events_form_profile_display_view'),
+('bx_event', 'bx_event_view_full', 'bx_events', 1, '_bx_events_form_profile_display_view_full');
+
+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_event', 'bx_events', 'allow_view_to', 3, '', 0, 'custom', '_bx_events_form_profile_input_sys_allow_view_to', '_bx_events_form_profile_input_allow_view_to', '_bx_events_form_profile_input_allow_view_to_desc', 0, 0, 0, '', '', '', '', '', '', '', '', 0, 0),
+('bx_event', 'bx_events', 'delete_confirm', 1, '', 0, 'checkbox', '_bx_events_form_profile_input_sys_delete_confirm', '_bx_events_form_profile_input_delete_confirm', '_bx_events_form_profile_input_delete_confirm_info', 1, 0, 0, '', '', '', 'avail', '', '_bx_events_form_profile_input_delete_confirm_error', '', '', 1, 0),
+('bx_event', 'bx_events', 'do_submit', '_sys_form_account_input_submit', '', 0, 'submit', '_bx_events_form_profile_input_sys_do_submit', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_event', 'bx_events', 'event_desc', '', '', 0, 'textarea', '_bx_events_form_profile_input_sys_event_desc', '_bx_events_form_profile_input_event_desc', '', 0, 0, 0, '', '', '', '', '', '', 'XssMultiline', '', 1, 1),
+('bx_event', 'bx_events', 'event_cat', '', '#!bx_events_cats', 0, 'select', '_bx_events_form_profile_input_sys_event_cat', '_bx_events_form_profile_input_event_cat', '', 1, 0, 0, '', '', '', 'avail', '', '_bx_events_form_profile_input_event_cat_err', 'Xss', '', 1, 1),
+('bx_event', 'bx_events', 'event_name', '', '', 0, 'text', '_bx_events_form_profile_input_sys_event_name', '_bx_events_form_profile_input_event_name', '', 1, 0, 0, '', '', '', 'avail', '', '_bx_events_form_profile_input_event_name_err', 'Xss', '', 1, 0),
+('bx_event', 'bx_events', 'initial_members', '', '', 0, 'custom', '_bx_events_form_profile_input_sys_initial_members', '_bx_events_form_profile_input_initial_members', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 1),
+('bx_event', 'bx_events', 'join_confirmation', 1, '', 1, 'switcher', '_bx_events_form_profile_input_sys_join_confirm', '_bx_events_form_profile_input_join_confirm', '', 0, 0, 0, '', '', '', '', '', '', 'Xss', '', 1, 0),
+('bx_event', 'bx_events', 'cover', 'a:1:{i:0;s:20:"bx_events_cover_crop";}', 'a:1:{s:20:"bx_events_cover_crop";s:24:"_sys_uploader_crop_title";}', 0, 'files', '_bx_events_form_profile_input_sys_cover', '_bx_events_form_profile_input_cover', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
+('bx_event', 'bx_events', 'picture', 'a:1:{i:0;s:22:"bx_events_picture_crop";}', 'a:1:{s:22:"bx_events_picture_crop";s:24:"_sys_uploader_crop_title";}', 0, 'files', '_bx_events_form_profile_input_sys_picture', '_bx_events_form_profile_input_picture', '', 0, 0, 0, '', '', '', '', '', '_bx_events_form_profile_input_picture_err', '', '', 1, 0);
+
+INSERT INTO `sys_form_display_inputs`(`display_name`, `input_name`, `visible_for_levels`, `active`, `order`) VALUES 
+('bx_event_add', 'delete_confirm', 2147483647, 0, 3),
+('bx_event_add', 'cover', 2147483647, 0, 4),
+('bx_event_add', 'initial_members', 2147483647, 1, 5),
+('bx_event_add', 'picture', 2147483647, 1, 6),
+('bx_event_add', 'event_name', 2147483647, 1, 7),
+('bx_event_add', 'event_cat', 2147483647, 1, 8),
+('bx_event_add', 'event_desc', 2147483647, 1, 9),
+('bx_event_add', 'join_confirmation', 2147483647, 1, 10),
+('bx_event_add', 'allow_view_to', 2147483647, 1, 11),
+('bx_event_add', 'do_submit', 2147483647, 1, 12),
+
+('bx_event_delete', 'delete_confirm', 2147483647, 1, 0),
+('bx_event_delete', 'cover', 2147483647, 0, 0),
+('bx_event_delete', 'picture', 2147483647, 0, 0),
+('bx_event_delete', 'do_submit', 2147483647, 1, 1),
+('bx_event_delete', 'event_name', 2147483647, 0, 2),
+('bx_event_delete', 'event_cat', 2147483647, 0, 3),
+
+('bx_event_edit', 'delete_confirm', 2147483647, 0, 2),
+('bx_event_edit', 'cover', 2147483647, 0, 3),
+('bx_event_edit', 'picture', 2147483647, 1, 5),
+('bx_event_edit', 'event_name', 2147483647, 1, 6),
+('bx_event_edit', 'event_cat', 2147483647, 1, 7),
+('bx_event_edit', 'event_desc', 2147483647, 1, 8),
+('bx_event_edit', 'join_confirmation', 2147483647, 1, 9),
+('bx_event_edit', 'allow_view_to', 2147483647, 1, 10),
+('bx_event_edit', 'do_submit', 2147483647, 1, 11),
+
+('bx_event_edit_cover', 'join_confirmation', 2147483647, 0, 0),
+('bx_event_edit_cover', 'event_desc', 2147483647, 0, 0),
+('bx_event_edit_cover', 'delete_confirm', 2147483647, 0, 1),
+('bx_event_edit_cover', 'event_name', 2147483647, 0, 2),
+('bx_event_edit_cover', 'picture', 2147483647, 0, 3),
+('bx_event_edit_cover', 'event_cat', 2147483647, 0, 5),
+('bx_event_edit_cover', 'cover', 2147483647, 1, 7),
+('bx_event_edit_cover', 'do_submit', 2147483647, 1, 8),
+
+('bx_event_view', 'delete_confirm', 2147483647, 0, 3),
+('bx_event_view', 'picture', 2147483647, 0, 4),
+('bx_event_view', 'cover', 2147483647, 0, 5),
+('bx_event_view', 'do_submit', 2147483647, 0, 6),
+('bx_event_view', 'event_name', 2147483647, 1, 7),
+('bx_event_view', 'event_cat', 2147483647, 1, 8),
+('bx_event_view', 'event_desc', 2147483647, 0, 9),
+
+('bx_event_view_full', 'event_name', 2147483647, 1, 1),
+('bx_event_view_full', 'event_cat', 2147483647, 1, 2),
+('bx_event_view_full', 'event_desc', 2147483647, 1, 3);
+
+-- PRE-VALUES
+
+INSERT INTO `sys_form_pre_lists`(`key`, `title`, `module`, `use_for_sets`) VALUES
+('bx_events_cats', '_bx_events_pre_lists_cats', 'bx_events', '0');
+
+INSERT INTO `sys_form_pre_values`(`Key`, `Value`, `Order`, `LKey`, `LKey2`) VALUES
+('bx_events_cats', '', 0, '_sys_please_select', ''),
+('bx_events_cats', '1', 1, '_bx_events_cat_General', ''),
+('bx_events_cats', '2', 2, '_bx_events_cat_Business', ''),
+('bx_events_cats', '3', 3, '_bx_events_cat_Interests', ''),
+('bx_events_cats', '4', 4, '_bx_events_cat_Causes', ''),
+('bx_events_cats', '5', 5, '_bx_events_cat_Fun', ''),
+('bx_events_cats', '6', 6, '_bx_events_cat_Uncategorised', '');
+
+INSERT INTO `sys_form_pre_lists`(`key`, `title`, `module`, `use_for_sets`) VALUES
+('bx_events_repeat_year', '_bx_events_pre_lists_repeat_year', 'bx_events', '0');
+
+INSERT INTO `sys_form_pre_values`(`Key`, `Value`, `Order`, `LKey`, `LKey2`) VALUES
+('bx_events_repeat_year', '1', 1, '_bx_events_cat_repeat_year_every_year', ''),
+('bx_events_repeat_year', '2', 2, '_bx_events_cat_repeat_year_every_2_years', ''),
+('bx_events_repeat_year', '3', 3, '_bx_events_cat_repeat_year_every_3_years', ''),
+('bx_events_repeat_year', '4', 4, '_bx_events_cat_repeat_year_every_4_years', '');
+
+INSERT INTO `sys_form_pre_lists`(`key`, `title`, `module`, `use_for_sets`) VALUES
+('bx_events_repeat_month', '_bx_events_pre_lists_repeat_month', 'bx_events', '0');
+
+INSERT INTO `sys_form_pre_values`(`Key`, `Value`, `Order`, `LKey`, `LKey2`) VALUES
+('bx_events_repeat_month', '0', 0, '_bx_events_cat_repeat_month_every_month', ''),
+('bx_events_repeat_month', '1', 1, '_bx_events_cat_repeat_month_jan', ''),
+('bx_events_repeat_month', '2', 2, '_bx_events_cat_repeat_month_feb', ''),
+('bx_events_repeat_month', '3', 3, '_bx_events_cat_repeat_month_mar', ''),
+('bx_events_repeat_month', '4', 4, '_bx_events_cat_repeat_month_apr', ''),
+('bx_events_repeat_month', '5', 5, '_bx_events_cat_repeat_month_may', ''),
+('bx_events_repeat_month', '6', 6, '_bx_events_cat_repeat_month_jun', ''),
+('bx_events_repeat_month', '7', 7, '_bx_events_cat_repeat_month_jul', ''),
+('bx_events_repeat_month', '8', 8, '_bx_events_cat_repeat_month_aug', ''),
+('bx_events_repeat_month', '9', 9, '_bx_events_cat_repeat_month_sep', ''),
+('bx_events_repeat_month', '10', 10, '_bx_events_cat_repeat_month_oct', ''),
+('bx_events_repeat_month', '11', 11, '_bx_events_cat_repeat_month_nov', ''),
+('bx_events_repeat_month', '12', 12, '_bx_events_cat_repeat_month_dec', '');
+
+
+INSERT INTO `sys_form_pre_lists`(`key`, `title`, `module`, `use_for_sets`) VALUES
+('bx_events_repeat_week_of_month', '_bx_events_pre_lists_repeat_week_of_month', 'bx_events', '0');
+
+INSERT INTO `sys_form_pre_values`(`Key`, `Value`, `Order`, `LKey`, `LKey2`) VALUES
+('bx_events_repeat_week_of_month', '0', 0, '_bx_events_cat_repeat_week_of_month_every_week', ''),
+('bx_events_repeat_week_of_month', '1', 1, '_bx_events_cat_repeat_week_of_month_first_week_of_month', ''),
+('bx_events_repeat_week_of_month', '2', 2, '_bx_events_cat_repeat_week_of_month_second_week_of_month', ''),
+('bx_events_repeat_week_of_month', '3', 3, '_bx_events_cat_repeat_week_of_month_third_week_of_month', ''),
+('bx_events_repeat_week_of_month', '4', 4, '_bx_events_cat_repeat_week_of_month_fourth_week_of_month', ''),
+('bx_events_repeat_week_of_month', '5', 5, '_bx_events_cat_repeat_week_of_month_fifth_week_of_month', '');
+
+
+
+INSERT INTO `sys_form_pre_lists`(`key`, `title`, `module`, `use_for_sets`) VALUES
+('bx_events_repeat_day_of_month', '_bx_events_pre_lists_repeat_day_of_month', 'bx_events', '0');
+
+INSERT INTO `sys_form_pre_values`(`Key`, `Value`, `Order`, `LKey`, `LKey2`) VALUES
+('bx_events_repeat_day_of_month', '0', 0, '_bx_events_cat_repeat_day_of_month_every_day', ''),
+('bx_events_repeat_day_of_month', '1', 1, '1', ''),
+('bx_events_repeat_day_of_month', '2', 2, '2', ''),
+('bx_events_repeat_day_of_month', '3', 3, '3', ''),
+('bx_events_repeat_day_of_month', '4', 4, '4', ''),
+('bx_events_repeat_day_of_month', '5', 5, '5', ''),
+('bx_events_repeat_day_of_month', '6', 6, '6', ''),
+('bx_events_repeat_day_of_month', '7', 7, '7', ''),
+('bx_events_repeat_day_of_month', '8', 8, '8', ''),
+('bx_events_repeat_day_of_month', '9', 9, '9', ''),
+('bx_events_repeat_day_of_month', '10', 10, '10', ''),
+('bx_events_repeat_day_of_month', '11', 11, '11', ''),
+('bx_events_repeat_day_of_month', '12', 12, '12', ''),
+('bx_events_repeat_day_of_month', '13', 13, '13', ''),
+('bx_events_repeat_day_of_month', '14', 14, '14', ''),
+('bx_events_repeat_day_of_month', '15', 15, '15', ''),
+('bx_events_repeat_day_of_month', '16', 16, '16', ''),
+('bx_events_repeat_day_of_month', '17', 17, '17', ''),
+('bx_events_repeat_day_of_month', '18', 18, '18', ''),
+('bx_events_repeat_day_of_month', '19', 19, '19', ''),
+('bx_events_repeat_day_of_month', '20', 20, '20', ''),
+('bx_events_repeat_day_of_month', '21', 21, '21', ''),
+('bx_events_repeat_day_of_month', '22', 22, '22', ''),
+('bx_events_repeat_day_of_month', '23', 23, '23', ''),
+('bx_events_repeat_day_of_month', '24', 24, '24', ''),
+('bx_events_repeat_day_of_month', '25', 25, '25', ''),
+('bx_events_repeat_day_of_month', '26', 26, '26', ''),
+('bx_events_repeat_day_of_month', '27', 27, '27', ''),
+('bx_events_repeat_day_of_month', '28', 28, '28', ''),
+('bx_events_repeat_day_of_month', '29', 29, '29', ''),
+('bx_events_repeat_day_of_month', '30', 30, '30', ''),
+('bx_events_repeat_day_of_month', '31', 31, '31', '');
+
+
+INSERT INTO `sys_form_pre_lists`(`key`, `title`, `module`, `use_for_sets`) VALUES
+('bx_events_repeat_day_of_week', '_bx_events_pre_lists_repeat_day_of_week', 'bx_events', '0');
+
+INSERT INTO `sys_form_pre_values`(`Key`, `Value`, `Order`, `LKey`, `LKey2`) VALUES
+('bx_events_repeat_day_of_week', '0', 0, '_bx_events_cat_repeat_day_of_week_every_day', ''),
+('bx_events_repeat_day_of_week', '1', 1, '_bx_events_cat_repeat_day_of_week_mon', ''),
+('bx_events_repeat_day_of_week', '2', 2, '_bx_events_cat_repeat_day_of_week_tue', ''),
+('bx_events_repeat_day_of_week', '3', 3, '_bx_events_cat_repeat_day_of_week_wed', ''),
+('bx_events_repeat_day_of_week', '4', 4, '_bx_events_cat_repeat_day_of_week_thu', ''),
+('bx_events_repeat_day_of_week', '5', 5, '_bx_events_cat_repeat_day_of_week_fri', ''),
+('bx_events_repeat_day_of_week', '6', 6, '_bx_events_cat_repeat_day_of_week_sat', ''),
+('bx_events_repeat_day_of_week', '7', 7, '_bx_events_cat_repeat_day_of_week_sun', '');
+
+-- STUDIO PAGE & WIDGET
+
+INSERT INTO `sys_std_pages`(`index`, `name`, `header`, `caption`, `icon`) VALUES
+(3, 'bx_events', '_bx_events', '_bx_events', 'bx_events@modules/boonex/events/|std-pi.png');
+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_events', '{url_studio}module.php?name=bx_events', '', 'bx_events@modules/boonex/events/|std-wi.png', '_bx_events', '', '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));
+

+ 37 - 0
modules/boonex/events/install/sql/uninstall.sql

@@ -0,0 +1,37 @@
+
+-- TABLES
+
+DROP TABLE IF EXISTS `bx_events_data`, `bx_events_intervals`, `bx_events_pics`, `bx_events_pics_resized`, `bx_events_views_track`, `bx_events_meta_keywords`, `bx_events_fans`, `bx_events_admins`, `bx_events_votes`, `bx_events_votes_track`, `bx_events_reports`, `bx_events_reports_track`;
+
+-- PROFILES
+
+DELETE FROM sys_profiles WHERE `type` = 'bx_events';
+
+-- STORAGES & TRANSCODERS
+
+DELETE FROM `sys_objects_storage` WHERE `object` IN('bx_events_pics', 'bx_events_pics_resized');
+DELETE FROM `sys_storage_tokens` WHERE `object` IN('bx_events_pics', 'bx_events_pics_resized');
+
+DELETE FROM `sys_objects_transcoder` WHERE `object` IN('bx_events_icon', 'bx_events_thumb', 'bx_events_avatar', 'bx_events_picture', 'bx_events_cover', 'bx_events_cover_thumb');
+DELETE FROM `sys_transcoder_filters` WHERE `transcoder_object` IN('bx_events_icon', 'bx_events_thumb', 'bx_events_avatar', 'bx_events_picture', 'bx_events_cover', 'bx_events_cover_thumb');
+DELETE FROM `sys_transcoder_images_files` WHERE `transcoder_object` IN('bx_events_icon', 'bx_events_thumb', 'bx_events_avatar', 'bx_events_picture', 'bx_events_cover', 'bx_events_cover_thumb');
+
+-- FORMS
+
+DELETE FROM `sys_objects_form` WHERE `module` = 'bx_events';
+DELETE FROM `sys_form_displays` WHERE `module` = 'bx_events';
+DELETE FROM `sys_form_inputs` WHERE `module` = 'bx_events';
+DELETE FROM `sys_form_display_inputs` WHERE `display_name` IN('bx_event_add', 'bx_event_delete', 'bx_event_edit', 'bx_event_edit_cover', 'bx_event_view', 'bx_event_view_full');
+
+-- PRE-VALUES
+
+DELETE FROM `sys_form_pre_lists` WHERE `module` = 'bx_events';
+
+DELETE FROM `sys_form_pre_values` WHERE `Key` IN('bx_events_cats');
+
+-- STUDIO PAGE & WIDGET
+
+DELETE FROM `tp`, `tw`, `tpw`
+USING `sys_std_pages` AS `tp`, `sys_std_widgets` AS `tw`, `sys_std_pages_widgets` AS `tpw`
+WHERE `tp`.`id` = `tw`.`page_id` AND `tw`.`id` = `tpw`.`widget_id` AND `tp`.`name` = 'bx_events';
+

+ 164 - 0
modules/boonex/events/js/intervals.js

@@ -0,0 +1,164 @@
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+/**
+ * Event intervals sub-form
+ */
+function BxDolEventsIntervals (options) {
+
+    this.init(options);
+    this._eForm = null;
+};
+
+BxDolEventsIntervals.prototype.init = function (options) {
+
+    this._sUniqId = options.uniq_id;
+
+    this._sJsInstanceName = options.js_instance_name;
+
+    this._sResultContainerId = 'bx-form-input-reoccurring-intervals-forms-' + this._sUniqId;
+
+    this._sTemplateGhost = options.template_ghost ? options.template_ghost : '<div id="' + this._getIntervalContainerId('{interval_id}') + '"><input type="hidden" name="f[]" value="{interval_id}" />{interval_name} (<a href="javascript:void(0);" onclick="{js_instance_name}.deleteGhost(this, \'{interval_id}\')">delete</a>)</div>';
+
+    this._sTemplateErrorGhosts = options.template_error ? options.template_error : '<div style="color:red;">{error}</div>';
+
+    this._iContentId = undefined == options.content_id || '' == options.content_id ? '' : parseInt(options.content_id);
+};
+
+BxDolEventsIntervals.prototype._getUrlWithStandardParams = function () {
+    return sUrlRoot + 'modules/?r=events/intervals&uid=' + this._sUniqId;
+};
+
+BxDolEventsIntervals.prototype._getIntervalContainerId = function (iIntervalId) {
+	return 'bx-event-interval-' + iIntervalId;
+};
+
+BxDolEventsIntervals.prototype.getCurrentIntervalsCount = function () {
+    return $('#' + $this._sResultContainerId + ' .bx-events-interval-ghost').length;
+};
+
+BxDolEventsIntervals.prototype.addEmptyGhost = function () {
+    var oVars = {
+        js_instance_name: this._sJsInstanceName,
+        file_id: 0,
+        interval_id: 0,
+        repeat_year: '',
+        repeat_month: '',
+        repeat_week_of_month: '',
+        repeat_day_of_month: '',
+        repeat_day_of_week: '',
+        repeat_stop: ''
+    }
+    var sHTML = this._sTemplateGhost;
+    for (var i in oVars)
+        sHTML = sHTML.replace (new RegExp('{'+i+'}', 'g'), oVars[i]);
+
+    $('#' + this._sResultContainerId).prepend(sHTML).addWebForms();
+};
+
+BxDolEventsIntervals.prototype.restoreGhosts = function () {
+    var sUrl = this._getUrlWithStandardParams() + '&f=json' + '&a=restore&c=' + this._iContentId + '&_t=' + (new Date());
+    var $this = this;
+
+    bx_loading(this._sResultContainerId, true);
+
+    $.getJSON(sUrl, function (aData) {
+
+        bx_loading($this._sResultContainerId, false);
+        
+        if (typeof $this._sTemplateGhost == 'object') {
+            $.each($this._sTemplateGhost, function(iIntervalId, sHTML) {
+            	var oIntervalsContainer = $('#' + $this._getIntervalContainerId(iIntervalId));
+                if (oIntervalsContainer.length > 0)
+                    return;
+                
+                if ('object' === typeof(aData) && 'undefined' !== aData[iIntervalId])
+                    sHTML = $this._replaceVars(sHTML, aData[iIntervalId]);
+
+                $('#' + $this._sResultContainerId).prepend(sHTML).addWebForms();
+            });
+        }
+
+        if ('object' === typeof(aData)) {
+
+            $.each(aData, function(iIntervalId, oVars) {
+            	var oIntervalsContainer = $('#' + $this._getIntervalContainerId(iIntervalId));
+                if (oIntervalsContainer.length > 0)
+                    return;
+
+                var sHTML;
+                if (typeof $this._sTemplateGhost == 'object')
+                    sHTML = $this._sTemplateGhost[iIntervalId];
+                else
+                    sHTML = $this._sTemplateGhost;
+
+                if ("undefined" !== typeof(sHTML)) {
+                    sHTML = $this._replaceVars(sHTML, oVars);
+/*
+                    // replace vars
+                    for (var i in oVars)
+                        sHTML = sHTML.replace (new RegExp('{'+i+'}', 'g'), oVars[i]);
+
+                    // set selected values
+                    var oHTML = $(sHTML);
+                    for (var i in oVars)
+                        oHTML.find('select[name="' + i + '[]"] option[value="' + oVars[i] + '"]').attr('selected', 'selected');
+                    sHTML = $('<div></div>').append(oHTML).html();
+*/
+                    $('#' + $this._sResultContainerId).prepend(sHTML).addWebForms();
+                }
+            });
+        }
+    });
+};
+
+BxDolEventsIntervals.prototype.deleteGhost = function (e, iIntervalId) {
+
+    if (0 == parseInt(iIntervalId)) {
+        $(e).parents().filter('.bx-events-interval-ghost').slideUp(function () {
+            $(this).remove();
+        });
+    }
+    else {
+
+        var sUrl = this._getUrlWithStandardParams() + '&a=delete&id=' + iIntervalId;
+        var $this = this;
+
+        var sIntervalContainerId = $this._getIntervalContainerId(iIntervalId);
+        bx_loading(sIntervalContainerId, true);
+
+        $.post(sUrl, function (sMsg) {
+            bx_loading(sIntervalContainerId, false);
+            if ('ok' == sMsg) {
+                $('#' + sIntervalContainerId).slideUp('slow', function () {
+                    $(this).remove();
+                });
+            } else {
+                $('#' + this._sResultContainerId).prepend($this._sTemplateErrorGhosts.replace('{error}', sMsg));
+            }
+        });
+    }
+};
+
+BxDolEventsIntervals.prototype._replaceVars = function (sHTML, oVars) {
+    // replace vars
+    for (var i in oVars)
+        sHTML = sHTML.replace (new RegExp('{'+i+'}', 'g'), oVars[i]);
+
+    // set selected values
+    var oHTML = $(sHTML);
+    for (var i in oVars)
+        oHTML.find('select[name="' + i + '[]"] option[value="' + oVars[i] + '"]').attr('selected', 'selected');
+    sHTML = $('<div></div>').append(oHTML).html();
+
+    return sHTML;
+};
+
+/** @} */

+ 57 - 0
modules/boonex/events/js/manage_tools.js

@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+function BxEventsManageTools(oOptions) {
+	this._sActionsUrl = oOptions.sActionUrl;
+	this._sObjNameGrid = oOptions.sObjNameGrid;
+    this._sObjName = oOptions.sObjName == undefined ? 'oBxEventsManageTools' : oOptions.sObjName;
+
+    this._sAnimationEffect = oOptions.sAnimationEffect == undefined ? 'fade' : oOptions.sAnimationEffect;
+    this._iAnimationSpeed = oOptions.iAnimationSpeed == undefined ? 'slow' : oOptions.iAnimationSpeed;
+    this._sParamsDivider = oOptions.sParamsDivider == undefined ? '#-#' : oOptions.sParamsDivider;
+
+    this._aHtmlIds = oOptions.aHtmlIds == undefined ? {} : oOptions.aHtmlIds;
+    this._oRequestParams = oOptions.oRequestParams == undefined ? {} : oOptions.oRequestParams;
+}
+
+BxEventsManageTools.prototype.onChangeFilter = function(oFilter) {
+	var oFilter1 = $('#bx-grid-filter1-' + this._sObjNameGrid);
+	var sValueFilter1 = oFilter1.length > 0 ? oFilter1.val() : '';
+
+	var oSearch = $('#bx-grid-search-' + this._sObjNameGrid);
+	var sValueSearch = oSearch.length > 0 ? oSearch.val() : '';
+	if(sValueSearch == _t('_sys_grid_search'))
+		sValueSearch = '';
+
+	glGrids[this._sObjNameGrid].setFilter(sValueFilter1 + this._sParamsDivider + sValueSearch, true);
+};
+
+BxEventsManageTools.prototype.onClickSettings = function(sMenuObject, oButton) {
+	if($(oButton).hasClass('bx-btn-disabled'))
+		return false;
+
+	bx_menu_popup(sMenuObject, oButton, {}, {
+		content_id: $(oButton).attr('bx_grid_action_data')
+	});
+};
+
+BxEventsManageTools.prototype.onClickDelete = function(iContentId) {
+	$('.bx-popup-applied:visible').dolPopupHide();
+
+	glGrids[this._sObjNameGrid].actionWithId(iContentId, 'delete', {}, '', false, 1);
+};
+
+BxEventsManageTools.prototype.onClickDeleteWithContent = function(iContentId) {
+	$('.bx-popup-applied:visible').dolPopupHide();
+
+	glGrids[this._sObjNameGrid].actionWithId(iContentId, 'delete_with_content', {}, '', false, 1);
+};
+
+/** @} */

+ 18 - 0
modules/boonex/events/request.php

@@ -0,0 +1,18 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
+ * CC-BY License - http://creativecommons.org/licenses/by/3.0/
+ *
+ * @defgroup    Events Events
+ * @ingroup     TridentModules
+ *
+ * @{
+ */
+
+require_once(BX_DIRECTORY_PATH_INC . "design.inc.php");
+
+check_logged();
+
+BxBaseModProfileRequest::processAsAction($GLOBALS['aModule'], $GLOBALS['aRequest']);
+
+/** @} */

+ 1 - 0
modules/boonex/events/template/account_link.html

@@ -0,0 +1 @@
+<bx_include_base:../modules/base/groups/template/account_link.html />

+ 1 - 0
modules/boonex/events/template/cover.html

@@ -0,0 +1 @@
+<bx_include_base:../modules/base/groups/template/cover.html />

+ 1 - 0
modules/boonex/events/template/css/forms.css

@@ -0,0 +1 @@
+@import url(../../../../base/profile/template/css/forms.css);

+ 1 - 0
modules/boonex/events/template/css/main.css

@@ -0,0 +1 @@
+@import url(../../../../base/groups/template/css/main.css);

+ 1 - 0
modules/boonex/events/template/css/manage_tools.css

@@ -0,0 +1 @@
+@import url(../../../../base/general/template/css/manage_tools.css);

+ 3 - 0
modules/boonex/events/template/entry-share.html

@@ -0,0 +1,3 @@
+
+<bx_include_base:../modules/base/groups/template/entry-share.html />
+

+ 1 - 0
modules/boonex/events/template/entry-text.html

@@ -0,0 +1 @@
+<bx_include_base:../modules/base/profile/template/entry-text.html />

+ 16 - 0
modules/boonex/events/template/form_field_reoccurring.html

@@ -0,0 +1,16 @@
+<div id="bx-form-input-reoccurring-intervals-input-__uniq_id__" class="bx-form-input-files-reoccurring bx-def-margin-sec-top bx-clearfix">
+    <button class="bx-btn bx-btn-small"><bx_text:_bx_events_form_profile_input_reoccurring_add_interval /></button>
+</div>
+__info__
+__error__
+<div id="bx-form-input-reoccurring-intervals-forms-__uniq_id__" class="bx-form-input-reoccurring-intervals bx-clearfix"></div>
+<script>
+    $(document).ready(function() {
+        __js_instance_name__ = new BxDolEventsIntervals(__options__);
+        $('#bx-form-input-reoccurring-intervals-input-__uniq_id__').on('click', function () {
+            __js_instance_name__.addEmptyGhost();
+            return false;
+        });
+        __js_instance_name__.restoreGhosts();
+    });
+</script>

+ 1 - 0
modules/boonex/events/template/form_ghost_template.html

@@ -0,0 +1 @@
+<bx_include_base:../modules/base/profile/template/form_ghost_template.html />

+ 6 - 0
modules/boonex/events/template/form_ghost_template_wrapper.html

@@ -0,0 +1,6 @@
+<div id="bx-events-interval-{interval_id}" class="bx-events-interval-ghost bx-def-margin-sec-top bx-def-padding-sec-top bx-def-border-top bx-clearfix">
+    <div class="bx-events-interval-ghost-form">
+        __nested_form__
+        <div class="bx-events-interval-form-actions bx-def-margin-top bx-clearfix"><a class="bx-btn bx-btn-small" href="javascript:void(0);" onclick="{js_instance_name}.deleteGhost(this, '{interval_id}')"><bx_text:_Delete /></a></div>
+    </div>
+</div>

+ 1 - 0
modules/boonex/events/template/image_popup.html

@@ -0,0 +1 @@
+<bx_include_base:../modules/base/groups/template/image_popup.html />

BIN
modules/boonex/events/template/images/icons/std-mi.png


BIN
modules/boonex/events/template/images/icons/std-pi.png


BIN
modules/boonex/events/template/images/icons/std-si.png


BIN
modules/boonex/events/template/images/icons/std-wi.png


BIN
modules/boonex/events/template/images/no-pciture-big.png


BIN
modules/boonex/events/template/images/no-picture-icon.png


BIN
modules/boonex/events/template/images/no-picture-preview.png


BIN
modules/boonex/events/template/images/no-picture-thumb.png


+ 1 - 0
modules/boonex/events/template/name_link.html

@@ -0,0 +1 @@
+<bx_include_base:../modules/base/groups/template/name_link.html />

+ 1 - 0
modules/boonex/events/template/picture_preview.html

@@ -0,0 +1 @@
+<bx_include_base:../modules/base/groups/template/picture_preview.html />

+ 1 - 0
modules/boonex/events/template/set_acl_popup.html

@@ -0,0 +1 @@
+<bx_include_base:../modules/base/groups/template/set_acl_popup.html />

+ 1 - 0
modules/boonex/events/template/unit.html

@@ -0,0 +1 @@
+<bx_include_base:../modules/base/groups/template/unit.html />

+ 1 - 0
modules/boonex/events/template/unit_live_search.html

@@ -0,0 +1 @@
+<bx_include_base:../modules/base/groups/template/unit_live_search.html />

+ 1 - 0
modules/boonex/events/template/uploader_form_crop_cover.html

@@ -0,0 +1 @@
+<bx_include_base:../modules/base/profile/template/uploader_form_crop_cover.html />

+ 327 - 0
modules/boonex/russian/data/langs/bx_events/ru.xml

@@ -0,0 +1,327 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources name="ru" flag="ru" title="Russian">
+
+	<string name="_bx_events"><![CDATA[События]]></string>
+
+	<string name="_bx_events_option_num_connections_quick"><![CDATA[Число элементов в блоке друзей]]></string>
+	<string name="_bx_events_option_num_rss"><![CDATA[Число элементов в ленте RSS]]></string>
+
+	<string name="_bx_events_form_profile"><![CDATA[События]]></string>
+	<string name="_bx_events_form_profile_display_add"><![CDATA[Добавление события]]></string>
+	<string name="_bx_events_form_profile_display_edit"><![CDATA[Редактирование события]]></string>
+	<string name="_bx_events_form_profile_display_edit_cover"><![CDATA[Редактирование обложки]]></string>
+	<string name="_bx_events_form_profile_display_delete"><![CDATA[Удаление события]]></string>
+	<string name="_bx_events_form_profile_display_view"><![CDATA[Просмотр события]]></string>
+	<string name="_bx_events_form_profile_display_view_full"><![CDATA[Полный просмотр события]]></string>
+	<string name="_bx_events_form_profile_input_sys_do_submit"><![CDATA[Выполнить]]></string>
+    <string name="_bx_events_form_profile_input_sys_join_confirm"><![CDATA[Подтверждение регистрации]]></string>
+    <string name="_bx_events_form_profile_input_join_confirm"><![CDATA[Подтверждение регистрации]]></string>
+    <string name="_bx_events_form_profile_input_sys_allow_view_to"><![CDATA[Конфиденциальность]]></string>
+    <string name="_bx_events_form_profile_input_allow_view_to"><![CDATA[Конфиденциальность]]></string>
+    <string name="_bx_events_form_profile_input_allow_view_to_desc"><![CDATA[Закрытое - все могут найти событие и видеть кто в нём состоит, только участники могут видеть сообщения. Секретное - только участники могут найти событие и видеть сообщения.]]></string>
+    <string name="_bx_events_form_profile_input_sys_initial_members"><![CDATA[Пригласить участников]]></string>
+    <string name="_bx_events_form_profile_input_initial_members"><![CDATA[Пригласить участников]]></string>
+    <string name="_bx_events_form_profile_input_sys_event_name"><![CDATA[Название события]]></string>
+    <string name="_bx_events_form_profile_input_event_name"><![CDATA[Название события]]></string>
+    <string name="_bx_events_form_profile_input_event_name_err"><![CDATA[Эта информация необходима. Пожалуйста, заполните это поле.]]></string>
+    <string name="_bx_events_form_profile_input_sys_event_desc"><![CDATA[Описание]]></string>
+    <string name="_bx_events_form_profile_input_event_desc"><![CDATA[Описание]]></string>
+    <string name="_bx_events_form_profile_input_sys_event_cat"><![CDATA[Категория]]></string>
+	<string name="_bx_events_form_profile_input_event_cat"><![CDATA[Категория]]></string>
+    <string name="_bx_events_form_profile_input_event_cat_err"><![CDATA[Поле категории обязатаельное]]></string>
+	<string name="_bx_events_form_profile_input_sys_picture"><![CDATA[Картинка события]]></string>
+	<string name="_bx_events_form_profile_input_picture"><![CDATA[Загрузить новую картинку события]]></string>
+	<string name="_bx_events_form_profile_input_picture_err"><![CDATA[Картинка события обязательна]]></string>
+	<string name="_bx_events_form_profile_input_sys_cover"><![CDATA[Картинка обложки]]></string>
+	<string name="_bx_events_form_profile_input_cover"><![CDATA[Загрузить новую картинку обложки]]></string>
+	<string name="_bx_events_form_profile_input_sys_delete_confirm"><![CDATA[Подтверждение на удаление]]></string>
+	<string name="_bx_events_form_profile_input_delete_confirm"><![CDATA[Я уверен, что хочу удалить эту группу]]></string>
+	<string name="_bx_events_form_profile_input_delete_confirm_info"><![CDATA[Это действие не может быть отменено.]]></string>
+	<string name="_bx_events_form_profile_input_delete_confirm_error"><![CDATA[Пожалуйста, отметьте этот флажок, если действительно хотите удалить группу.]]></string>
+    <string name="_bx_events_form_profile_input_sys_reoccurring"><![CDATA[Повторяющееся событие]]></string>
+    <string name="_bx_events_form_profile_input_reoccurring"><![CDATA[Повторяющееся событие]]></string>
+    <string name="_bx_events_form_profile_input_reoccurring_add_interval"><![CDATA[Добавить повторяющийся интервал]]></string>
+
+    <string name="_bx_events_form_input_repeat_year"><![CDATA[Повторять: год]]></string>
+    <string name="_bx_events_form_input_repeat_month"><![CDATA[Повторять: месяц]]></string>
+    <string name="_bx_events_form_input_repeat_week_of_month"><![CDATA[Повторять: неделя в месяце]]></string>
+    <string name="_bx_events_form_input_repeat_day_of_month"><![CDATA[Повторять: число месяца]]></string>
+    <string name="_bx_events_form_input_repeat_day_of_week"><![CDATA[Повторять: день недели]]></string>
+    <string name="_bx_events_form_input_stop_repeating"><![CDATA[Отстановить повтор]]></string>
+
+	<string name="_bx_events_acl_action_create_profile"><![CDATA[Создать событие]]></string>
+	<string name="_bx_events_acl_action_delete_profile"><![CDATA[Удалить событие]]></string>
+	<string name="_bx_events_acl_action_view_profile"><![CDATA[Просмотреть событие]]></string>
+	<string name="_bx_events_acl_action_edit_any_profile"><![CDATA[Редактировать любое событие]]></string>
+
+	<string name="_bx_events_page_title_sys_joined_entries"><![CDATA[Участие в событиях]]></string>
+	<string name="_bx_events_page_title_joined_entries"><![CDATA[Участие в событиях]]></string>
+	<string name="_bx_events_page_title_sys_create_profile"><![CDATA[Создать событие]]></string>
+	<string name="_bx_events_page_title_create_profile"><![CDATA[Создать событие]]></string>
+	<string name="_bx_events_page_title_sys_edit_profile"><![CDATA[Редактировать событие]]></string>
+	<string name="_bx_events_page_title_edit_profile"><![CDATA[Редактировать событие]]></string>
+	<string name="_bx_events_page_title_sys_edit_profile_cover"><![CDATA[Редактировать обложку события]]></string>
+	<string name="_bx_events_page_title_edit_profile_cover"><![CDATA[Редактировать обложку]]></string>
+	<string name="_bx_events_page_title_sys_delete_profile"><![CDATA[Удалить событие]]></string>
+	<string name="_bx_events_page_title_delete_profile"><![CDATA[Удалить событие]]></string>
+	<string name="_bx_events_page_title_sys_view_profile_closed"><![CDATA[Просмотр закрытого события]]></string>
+	<string name="_bx_events_page_title_sys_view_profile"><![CDATA[Просмотр события]]></string>
+	<string name="_bx_events_page_title_view_profile"><![CDATA[{display_name}]]></string>
+	<string name="_bx_events_page_title_browse"><![CDATA[События]]></string>
+	<string name="_bx_events_page_title_browse_top"><![CDATA[Лучшие события]]></string>
+	<string name="_bx_events_page_title_browse_recent"><![CDATA[Новые события]]></string>
+	<string name="_bx_events_page_title_browse_connections"><![CDATA[{0} связей]]></string>
+	<string name="_bx_events_page_title_browse_connections_mutual"><![CDATA[{0} и {1} обоюдных связей]]></string>
+	<string name="_bx_events_page_title_sys_profile_friends"><![CDATA[Друзья]]></string>
+	<string name="_bx_events_page_title_profile_friends"><![CDATA[Друзья]]></string>
+	<string name="_bx_events_page_title_sys_group_fans"><![CDATA[Участники]]></string>
+	<string name="_bx_events_page_title_group_fans"><![CDATA[Участники]]></string>
+	<string name="_bx_events_page_title_sys_profile_info"><![CDATA[Инфо события]]></string>
+	<string name="_bx_events_page_title_profile_info"><![CDATA[Информация о событии "{display_name}"]]></string>
+	<string name="_bx_events_page_title_sys_recent"><![CDATA[Новые события]]></string>
+	<string name="_bx_events_page_title_recent"><![CDATA[Новые события]]></string>
+	<string name="_bx_events_page_title_sys_manage"><![CDATA[Управление своими событиями]]></string>
+	<string name="_bx_events_page_title_sys_manage_administration"><![CDATA[Управлять всеми событиями]]></string>
+	<string name="_bx_events_page_title_manage"><![CDATA[Управлять событиями]]></string>
+	<string name="_bx_events_page_title_sys_top"><![CDATA[Лучшие события]]></string>
+	<string name="_bx_events_page_title_top"><![CDATA[Лучшие события]]></string>
+
+	<string name="_bx_events_page_block_title_sys_joined_entries"><![CDATA[Участие в событиях]]></string>
+	<string name="_bx_events_page_block_title_joined_entries"><![CDATA[Участие в событиях]]></string>
+	<string name="_bx_events_page_block_title_create_profile"><![CDATA[Создать событие]]></string>
+	<string name="_bx_events_page_block_title_edit_profile"><![CDATA[Редактировать событие]]></string>
+	<string name="_bx_events_page_block_title_edit_profile_cover"><![CDATA[Редактировать обложку]]></string>
+	<string name="_bx_events_page_block_title_delete_profile"><![CDATA[Удалить событие]]></string>
+	<string name="_bx_events_page_block_title_profile_info_link"><![CDATA["<a href="{profile_link}">{display_name}</a>" - инфо]]></string>
+	<string name="_bx_events_page_block_title_profile_info"><![CDATA[Инфо]]></string>
+	<string name="_bx_events_page_block_title_system_profile_info"><![CDATA[Инфо]]></string>
+	<string name="_bx_events_page_block_title_profile_description"><![CDATA[Описание]]></string>
+	<string name="_bx_events_page_block_title_profile_friends_link"><![CDATA[<a href="{profile_link}">{display_name}</a> - друзья]]></string>
+	<string name="_bx_events_page_block_title_profile_friends"><![CDATA[Друзья]]></string>
+	<string name="_bx_events_page_block_title_system_profile_friends"><![CDATA[Друзья]]></string>
+	<string name="_bx_events_page_block_title_fans_link"><![CDATA[Участники группы: <a href="{profile_link}">{display_name}</a>]]></string>
+    <string name="_bx_events_page_block_title_fans"><![CDATA[Участники]]></string>
+	<string name="_bx_events_page_block_title_system_fans"><![CDATA[Участники]]></string>
+	<string name="_bx_events_page_block_title_profile_actions"><![CDATA[Действия]]></string>
+	<string name="_bx_events_page_block_title_latest_profiles"><![CDATA[Новые события]]></string>
+	<string name="_bx_events_page_block_title_system_manage"><![CDATA[Управлять своими событиями]]></string>
+	<string name="_bx_events_page_block_title_system_manage_administration"><![CDATA[Управлять всеми событиями]]></string>
+	<string name="_bx_events_page_block_title_manage"><![CDATA[Управлять событиями]]></string>
+    <string name="_bx_events_page_block_title_top_profiles"><![CDATA[Лучшие события]]></string>
+    <string name="_bx_events_page_block_title_entry_social_sharing"><![CDATA[Поделиться]]></string>
+    <string name="_bx_events_page_block_title_categories"><![CDATA[Категории событий]]></string>
+
+    <string name="_bx_events_menu_title_submenu"><![CDATA[Под-меню событий]]></string>
+    <string name="_bx_events_menu_set_title_submenu"><![CDATA[Под-меню событий]]></string>
+    <string name="_bx_events_menu_set_title_view_profile_actions"><![CDATA[Событие - Действия]]></string>
+    <string name="_bx_events_menu_title_view_profile_actions"><![CDATA[Событие - Действия]]></string>
+    <string name="_bx_events_menu_set_title_view_profile_actions_more"><![CDATA[Событие - Дополнительные действия]]></string>
+    <string name="_bx_events_menu_title_view_profile_actions_more"><![CDATA[Событие - Дополнительные действия]]></string>
+    <string name="_bx_events_menu_set_title_view_profile_submenu"><![CDATA[Подменю просмотра события]]></string>
+    <string name="_bx_events_menu_title_view_profile_submenu"><![CDATA[Подменю просмотра события]]></string>
+    <string name="_bx_events_menu_title_view_profile_submenu_cover"><![CDATA[Подменю события на обложке]]></string>
+	<string name="_bx_events_menu_set_title_manage_tools"><![CDATA[Подменю инструментов управления]]></string>
+    <string name="_bx_events_menu_title_manage_tools"><![CDATA[Подменю инструментов управления]]></string>
+    <string name="_bx_events_menu_item_title_system_delete"><![CDATA[Удалить]]></string>
+    <string name="_bx_events_menu_item_title_delete"><![CDATA[Удалить]]></string>
+    <string name="_bx_events_menu_item_title_system_delete_with_content"><![CDATA[Удалить вместе с содержимым]]></string>
+    <string name="_bx_events_menu_item_title_delete_with_content"><![CDATA[Удалить вместе с содержимым]]></string>
+    <string name="_bx_events_menu_item_title_system_edit_cover"><![CDATA[Редактировать обложку]]></string>
+    <string name="_bx_events_menu_item_title_edit_cover"><![CDATA[Редактировать обложку]]></string>
+    <string name="_bx_events_menu_item_title_system_edit_profile"><![CDATA[Редактировать событие]]></string>
+    <string name="_bx_events_menu_item_title_edit_profile"><![CDATA[Редактировать событие]]></string>
+    <string name="_bx_events_menu_item_title_system_delete_profile"><![CDATA[Удалить событие]]></string>
+    <string name="_bx_events_menu_item_title_delete_profile"><![CDATA[Удалить событие]]></string>
+    <string name="_bx_events_menu_item_title_system_delete_account"><![CDATA[Удалить аккаунт]]></string>
+    <string name="_bx_events_menu_item_title_delete_account"><![CDATA[Удалить аккаунт]]></string>
+    <string name="_bx_events_menu_item_title_system_profile_type"><![CDATA[Событие]]></string>
+    <string name="_bx_events_menu_item_title_profile_type"><![CDATA[Событие]]></string>
+    <string name="_bx_events_menu_item_title_system_create_profile"><![CDATA[Создать событие]]></string>
+    <string name="_bx_events_menu_item_title_create_profile"><![CDATA[Создать событие]]></string>
+    <string name="_bx_events_menu_item_title_system_view_profile_friends"><![CDATA[Друзья]]></string>
+    <string name="_bx_events_menu_item_title_view_profile_friends"><![CDATA[Друзья]]></string>
+    <string name="_bx_events_menu_item_title_system_view_joined_groups"><![CDATA[События]]></string>
+    <string name="_bx_events_menu_item_title_view_joined_groups"><![CDATA[События]]></string>
+    <string name="_bx_events_menu_item_title_system_view_fans"><![CDATA[Участники]]></string>
+    <string name="_bx_events_menu_item_title_view_fans"><![CDATA[Участники]]></string>
+    <string name="_bx_events_menu_item_title_system_view_profile_info"><![CDATA[Инфо]]></string>
+    <string name="_bx_events_menu_item_title_view_profile_info"><![CDATA[Инфо]]></string>
+    <string name="_bx_events_menu_item_title_system_view_profile_view"><![CDATA[Событие]]></string>
+    <string name="_bx_events_menu_item_title_view_profile_view"><![CDATA[Событие]]></string>
+
+    <string name="_bx_events_menu_item_title_system_befriend"><![CDATA[Add friend]]></string>
+    <string name="_bx_events_menu_item_title_befriend"><![CDATA[Add friend]]></string>
+    <string name="_bx_events_menu_item_title_befriend_sent"><![CDATA[Add friend (requested)]]></string>
+    <string name="_bx_events_menu_item_title_befriend_confirm"><![CDATA[Accept friend request]]></string>
+    <string name="_bx_events_menu_item_title_system_unfriend"><![CDATA[Unfriend]]></string>
+    <string name="_bx_events_menu_item_title_unfriend"><![CDATA[Unfriend]]></string>
+    <string name="_bx_events_menu_item_title_unfriend_cancel_request"><![CDATA[Cancel friend request]]></string>
+    <string name="_bx_events_menu_item_title_unfriend_reject_request"><![CDATA[Reject friend request]]></string>
+
+    <string name="_bx_events_menu_item_title_system_become_fan"><![CDATA[Присоединиться]]></string>
+    <string name="_bx_events_menu_item_title_become_fan"><![CDATA[Присоединиться]]></string>
+    <string name="_bx_events_menu_item_title_become_fan_sent"><![CDATA[Присоединение запрошено]]></string>
+    <string name="_bx_events_menu_item_title_become_fan_confirm"><![CDATA[Одобрить присоединение]]></string>
+    <string name="_bx_events_menu_item_title_system_leave_group"><![CDATA[Покинуть событие]]></string>
+    <string name="_bx_events_menu_item_title_leave_group"><![CDATA[Покинуть событие]]></string>
+    <string name="_bx_events_menu_item_title_leave_group_cancel_request"><![CDATA[Отменить присоединение]]></string>
+    <string name="_bx_events_menu_item_title_leave_group_reject_request"><![CDATA[Отвергнуть присоединение]]></string>
+
+    <string name="_bx_events_menu_item_title_system_subscribe"><![CDATA[Подписаться]]></string>
+    <string name="_bx_events_menu_item_title_subscribe"><![CDATA[Подписаться]]></string>
+    <string name="_bx_events_menu_item_title_system_unsubscribe"><![CDATA[Отписаться]]></string>
+    <string name="_bx_events_menu_item_title_unsubscribe"><![CDATA[Отписаться]]></string>
+    <string name="_bx_events_menu_item_title_system_more_actions"><![CDATA[Дополнительные действия]]></string>
+    <string name="_bx_events_menu_item_title_more_actions"><![CDATA[]]></string>
+    <string name="_bx_events_menu_item_title_system_friends"><![CDATA[Друзья]]></string>
+    <string name="_bx_events_menu_item_title_friends"><![CDATA[Друзья]]></string>
+    <string name="_bx_events_menu_item_title_system_friend_requests"><![CDATA[Число запросов дружбы]]></string>
+    <string name="_bx_events_menu_item_title_friend_requests"><![CDATA[{addon} запросов дружбы]]></string>
+    <string name="_bx_events_menu_item_title_system_manage_my_groups"><![CDATA[Мои события]]></string>
+    <string name="_bx_events_menu_item_title_manage_my_groups"><![CDATA[{addon} событий]]></string>
+    <string name="_bx_events_menu_item_title_system_entries_recent"><![CDATA[Новые]]></string>
+    <string name="_bx_events_menu_item_title_entries_recent"><![CDATA[Новые]]></string>
+    <string name="_bx_events_menu_item_title_system_entries_manage"><![CDATA[Управление]]></string>
+    <string name="_bx_events_menu_item_title_entries_manage"><![CDATA[Управление]]></string>
+    <string name="_bx_events_menu_item_title_system_entries_home"><![CDATA[События]]></string>
+    <string name="_bx_events_menu_item_title_entries_home"><![CDATA[События]]></string>
+    <string name="_bx_events_menu_item_title_system_admt_groups"><![CDATA[События]]></string>
+	<string name="_bx_events_menu_item_title_admt_groups"><![CDATA[События - {addon} неодобрено]]></string>
+	<string name="_bx_events_menu_item_title_manage_my"><![CDATA[Мой события]]></string>
+	<string name="_bx_events_menu_item_title_manage_all"><![CDATA[Все события]]></string>
+	<string name="_bx_events_menu_item_title_system_entries_top"><![CDATA[Популярные]]></string>
+	<string name="_bx_events_menu_item_title_entries_top"><![CDATA[Популярные]]></string>
+
+	<string name="_bx_events_grid_filter_item_title_adm_select_one_filter1"><![CDATA[Все статусы]]></string>
+	<string name="_bx_events_grid_filter_item_title_adm_active"><![CDATA[Активные]]></string>
+	<string name="_bx_events_grid_filter_item_title_adm_pending"><![CDATA[В ожидании]]></string>
+	<string name="_bx_events_grid_filter_item_title_adm_suspended"><![CDATA[Заблокированные]]></string>
+	<string name="_bx_events_grid_column_title_adm_active"><![CDATA[Активные]]></string>
+    <string name="_bx_events_grid_column_title_adm_event_name"><![CDATA[Название]]></string>
+    <string name="_bx_events_grid_column_title_adm_added"><![CDATA[Создание]]></string>
+    <string name="_bx_events_grid_column_title_adm_account"><![CDATA[Аккаунт]]></string>
+    <string name="_bx_events_grid_action_title_adm_delete"><![CDATA[Удалить]]></string>
+    <string name="_bx_events_grid_action_title_adm_delete_with_content"><![CDATA[Удалить вместе с содержимым]]></string>
+    <string name="_bx_events_grid_action_title_adm_more_actions"><![CDATA[Дополнительные действия]]></string>
+	<string name="_bx_events_grid_action_err_delete"><![CDATA[Невозможно удалить выбранные события.]]></string>
+	<string name="_bx_events_grid_txt_account_manager"><![CDATA[Перенаправить в управление аккаунтом.]]></string>
+
+    <string name="_bx_events_txt_account_pending"><![CDATA[Это событие ожидает одобрения. Пожалуйста, дождитесь ее активации.]]></string>
+    <string name="_bx_events_txt_account_suspended"><![CDATA[Это событие заблокировано.]]></string>
+    <string name="_bx_events_txt_N_fans"><![CDATA[{0} участников]]></string>
+    <string name="_bx_events_txt_sample_single"><![CDATA[событие]]></string>
+    <string name="_bx_events_txt_sample_vote_single"><![CDATA[голос за событие]]></string>
+    <string name="_bx_events_txt_to_admins"><![CDATA[В админы]]></string>
+    <string name="_bx_events_txt_from_admins"><![CDATA[Из админов]]></string>
+    <string name="_bx_events_txt_private_group"><![CDATA[Приватная группа]]></string>
+
+    <string name="_bx_events_txt_ntfs_fan_added"><![CDATA[У <a class="bx-ntfs-content-profile" href="{owner_link}">{owner_name}</a> события новый участник - <a href="{subentry_url}">{subentry_sample}</a>]]></string>
+    <string name="_bx_events_txt_ntfs_join_request"><![CDATA[У <a class="bx-ntfs-content-profile" href="{owner_link}">{owner_name}</a> события новый запрос на присоединение от <a href="{subentry_url}">{subentry_sample}</a>]]></string>
+    <string name="_bx_events_txt_ntfs_timeline_post_common"><![CDATA[В <a class="bx-ntfs-content-profile" href="{owner_link}">{owner_name}</a> событии новая публикация от <a href="{subentry_url}">{subentry_sample}</a>]]></string>
+
+    <string name="_bx_events_privacy_group_closed"><![CDATA[Закрытое событие]]></string>
+    <string name="_bx_events_privacy_group_secret"><![CDATA[Секретное событие]]></string>
+
+    <string name="_bx_events_pre_lists_cats"><![CDATA[Категории событий]]></string>
+    <string name="_bx_events_cat_General"><![CDATA[Обобщение]]></string>
+    <string name="_bx_events_cat_Business"><![CDATA[Бизнес]]></string>
+    <string name="_bx_events_cat_Interests"><![CDATA[Увлечение]]></string>
+    <string name="_bx_events_cat_Causes"><![CDATA[Движение]]></string>
+    <string name="_bx_events_cat_Fun"><![CDATA[Юмор]]></string>
+    <string name="_bx_events_cat_Uncategorised"><![CDATA[Без категории]]></string>
+
+    <string name="_bx_events_pre_lists_repeat_year"><![CDATA[Повторять: год]]></string>
+    <string name="_bx_events_cat_repeat_year_every_year"><![CDATA[Каждый год]]></string>
+    <string name="_bx_events_cat_repeat_year_every_2_years"><![CDATA[Каждые 2 года]]></string>
+    <string name="_bx_events_cat_repeat_year_every_3_years"><![CDATA[Каждые 3 года]]></string>
+    <string name="_bx_events_cat_repeat_year_every_4_years"><![CDATA[Каждые 4 года]]></string>
+
+    <string name="_bx_events_pre_lists_repeat_month"><![CDATA[Повторять: месяц]]></string>
+    <string name="_bx_events_cat_repeat_month_every_month"><![CDATA[Каждый месяц]]></string>
+    <string name="_bx_events_cat_repeat_month_jan"><![CDATA[Каждый январь]]></string>
+    <string name="_bx_events_cat_repeat_month_feb"><![CDATA[Каждый февраль]]></string>
+    <string name="_bx_events_cat_repeat_month_mar"><![CDATA[Каждый март]]></string>
+    <string name="_bx_events_cat_repeat_month_apr"><![CDATA[Каждый апрель]]></string>
+    <string name="_bx_events_cat_repeat_month_may"><![CDATA[Каждый май]]></string>
+    <string name="_bx_events_cat_repeat_month_jun"><![CDATA[Каждый июнь]]></string>
+    <string name="_bx_events_cat_repeat_month_jul"><![CDATA[Каждый июль]]></string>
+    <string name="_bx_events_cat_repeat_month_aug"><![CDATA[Каждый август]]></string>
+    <string name="_bx_events_cat_repeat_month_sep"><![CDATA[Каждый сентябрь]]></string>
+    <string name="_bx_events_cat_repeat_month_oct"><![CDATA[Каждый октябрь]]></string>
+    <string name="_bx_events_cat_repeat_month_nov"><![CDATA[Каждый ноябрь]]></string>
+    <string name="_bx_events_cat_repeat_month_dec"><![CDATA[Каждый декабрь]]></string>
+
+    <string name="_bx_events_pre_lists_repeat_week_of_month"><![CDATA[Повторять: неделя в месяце]]></string>
+    <string name="_bx_events_cat_repeat_week_of_month_every_week"><![CDATA[Каждую неделю]]></string>
+    <string name="_bx_events_cat_repeat_week_of_month_first_week_of_month"><![CDATA[Каждую 1-ю неделю месяца]]></string>
+    <string name="_bx_events_cat_repeat_week_of_month_second_week_of_month"><![CDATA[Каждую 2-ю неделю месяца]]></string>
+    <string name="_bx_events_cat_repeat_week_of_month_third_week_of_month"><![CDATA[Каждую 3-ю неделю месяца]]></string>
+    <string name="_bx_events_cat_repeat_week_of_month_fourth_week_of_month"><![CDATA[Каждую 4-ю неделю месяца]]></string>
+    <string name="_bx_events_cat_repeat_week_of_month_fifth_week_of_month"><![CDATA[Каждую 5-ю неделю месяца]]></string>
+
+    <string name="_bx_events_pre_lists_repeat_day_of_month"><![CDATA[Повторять: число месяца]]></string>
+    <string name="_bx_events_cat_repeat_day_of_month_every_day"><![CDATA[Каждый день]]></string>
+
+    <string name="_bx_events_pre_lists_repeat_day_of_week"><![CDATA[Повторять: день недели]]></string>
+    <string name="_bx_events_cat_repeat_day_of_week_every_day"><![CDATA[Каждый день недели]]></string>
+    <string name="_bx_events_cat_repeat_day_of_week_mon"><![CDATA[Каждый понедельник]]></string>
+    <string name="_bx_events_cat_repeat_day_of_week_tue"><![CDATA[Каждый вторник]]></string>
+    <string name="_bx_events_cat_repeat_day_of_week_wed"><![CDATA[Каждую среду]]></string>
+    <string name="_bx_events_cat_repeat_day_of_week_thu"><![CDATA[Каждый четверг]]></string>
+    <string name="_bx_events_cat_repeat_day_of_week_fri"><![CDATA[Каждую пятницу]]></string>
+    <string name="_bx_events_cat_repeat_day_of_week_sat"><![CDATA[Каждую субботу]]></string>
+    <string name="_bx_events_cat_repeat_day_of_week_sun"><![CDATA[Каждое воскресенье]]></string>
+
+    <string name="_bx_events_email_join_request"><![CDATA[Запрос на присоединение к событию]]></string>
+    <string name="_bx_events_email_join_request_subject"><![CDATA[Запрос на присоединение к событию]]></string>
+    <string name="_bx_events_email_join_request_body"><![CDATA[
+<bx_include_auto:_email_header.html />
+<p>Получен запрос на присоединение к событию <a href="{EntryUrl}">{EntryTitle}</a> от <a href="{NewMemberUrl}">{NewMemberDisplayName}</a></p>
+<bx_include_auto:_email_footer.html />]]></string>
+
+    <string name="_bx_events_email_join_reject"><![CDATA[Отклонение запроса на присоединение к событию]]></string>
+    <string name="_bx_events_email_join_reject_subject"><![CDATA[Ваш запрос на присоединение к событию был отклонен]]></string>
+    <string name="_bx_events_email_join_reject_body"><![CDATA[
+<bx_include_auto:_email_header.html />
+<p>Ваш запрос на присоединение к событию <a href="{EntryUrl}">{EntryTitle}</a> был отклонен администратором события.</p>
+<bx_include_auto:_email_footer.html />]]></string>
+
+    <string name="_bx_events_email_join_confirm"><![CDATA[Одобрение запроса на присоединение к событию]]></string>
+    <string name="_bx_events_email_join_confirm_subject"><![CDATA[Ваш запрос на присоединение к событию был одобрен]]></string>
+    <string name="_bx_events_email_join_confirm_body"><![CDATA[
+<bx_include_auto:_email_header.html />
+<p>Ваш запрос на присоединение к событию <a href="{EntryUrl}">{EntryTitle}</a> был одобрен.</p>
+<bx_include_auto:_email_footer.html />]]></string>
+
+    <string name="_bx_events_email_fan_remove"><![CDATA[Удаление из события]]></string>
+    <string name="_bx_events_email_fan_remove_subject"><![CDATA[Вы были удалены из события]]></string>
+    <string name="_bx_events_email_fan_remove_body"><![CDATA[
+<bx_include_auto:_email_header.html />
+<p>Ваш профиль был удален из события <a href="{EntryUrl}">{EntryTitle}</a> администратором события.</p>
+<bx_include_auto:_email_footer.html />]]></string>
+
+    <string name="_bx_events_email_fan_become_admin"><![CDATA[Получение статуса администратора события]]></string>
+    <string name="_bx_events_email_fan_become_admin_subject"><![CDATA[Вы стали администратором события]]></string>
+    <string name="_bx_events_email_fan_become_admin_body"><![CDATA[
+<bx_include_auto:_email_header.html />
+<p>Вы получили статус администратора события <a href="{EntryUrl}">{EntryTitle}</a>.</p>
+<bx_include_auto:_email_footer.html />]]></string>
+
+    <string name="_bx_events_email_admin_become_fan"><![CDATA[Лишение статуса администратора события]]></string>
+    <string name="_bx_events_email_admin_become_fan_subject"><![CDATA[Вы были лишены статуса администратора события]]></string>
+    <string name="_bx_events_email_admin_become_fan_body"><![CDATA[
+<bx_include_auto:_email_header.html />
+<p>Вы были лишены статуса администратора события <a href="{EntryUrl}">{EntryTitle}</a>.</p>
+<bx_include_auto:_email_footer.html />]]></string>
+
+    <string name="_bx_events_email_invitation"><![CDATA[Приглашение на событие]]></string>
+    <string name="_bx_events_email_invitation_subject"><![CDATA[Приглашение на событие "{EntryTitle}"]]></string>
+    <string name="_bx_events_email_invitation_body"><![CDATA[
+<bx_include_auto:_email_header.html />
+<p><a href="{InviterUrl}">{InviterDisplayName}</a> пригласил Вас на событие <a href="{EntryUrl}">{EntryTitle}</a>.</p>
+<bx_include_auto:_email_footer.html />]]></string>
+
+    <string name="_bx_ntfs_alert_action_fan_added"><![CDATA[присоединение нового участника]]></string>
+    <string name="_bx_ntfs_alert_action_join_request"><![CDATA[запрос на присоединение к событию]]></string>
+    <string name="_bx_ntfs_alert_action_timeline_post_common"><![CDATA[сообщение на линейке]]></string>
+</resources>

+ 31 - 24
template/scripts/BxBaseFormView.php

@@ -850,30 +850,7 @@ BLAH;
             if (!$oUploader)
                 continue;
 
-            $sGhostTemplate = false;
-            if (isset($aInput['ghost_template']) && is_object($aInput['ghost_template'])) { // form is not submitted and ghost template is BxDolFormNested object
-
-                $oFormNested = $aInput['ghost_template'];
-                if ($oFormNested instanceof BxDolFormNested)
-                    $sGhostTemplate = $oFormNested->getCode();
-
-            } elseif (isset($aInput['ghost_template']) && is_array($aInput['ghost_template']) && isset($aInput['ghost_template']['inputs'])) { // form is not submitted and ghost template is form array
-
-                $oFormNested = new BxDolFormNested($aInput['name'], $aInput['ghost_template'], $this->aParams['db']['submit_name'], $this->oTemplate);
-                $sGhostTemplate = $oFormNested->getCode();
-
-            } elseif (isset($aInput['ghost_template']) && is_array($aInput['ghost_template']) && $aInput['ghost_template']) { // form is submitted and ghost template is array of BxDolFormNested objects
-
-                $sGhostTemplate = array ();
-                foreach ($aInput['ghost_template'] as $iFileId => $oFormNested)
-                    if (is_object($oFormNested) && $oFormNested instanceof BxDolFormNested)
-                        $sGhostTemplate[$iFileId] = $oFormNested->getCode();
-
-            } elseif (isset($aInput['ghost_template']) && is_string($aInput['ghost_template'])) { // ghost template is just string template, without nested form
-
-                $sGhostTemplate = $aInput['ghost_template'];
-
-            }
+            $sGhostTemplate = $this->genGhostTemplate($aInput);
 
             $aAttrs = !empty($aInput['attrs']) ? $aInput['attrs'] : array();
             if (empty($aInput['attrs']['disabled']))
@@ -903,6 +880,36 @@ BLAH;
         ));
     }
 
+    protected function genGhostTemplate(&$aInput)
+    {
+        $sGhostTemplate = false;
+        if (isset($aInput['ghost_template']) && is_object($aInput['ghost_template'])) { // form is not submitted and ghost template is BxDolFormNested object
+
+            $oFormNested = $aInput['ghost_template'];
+            if ($oFormNested instanceof BxDolFormNested)
+                $sGhostTemplate = $oFormNested->genForm();
+
+        } elseif (isset($aInput['ghost_template']) && is_array($aInput['ghost_template']) && isset($aInput['ghost_template']['inputs'])) { // form is not submitted and ghost template is form array
+
+            $oFormNested = new BxDolFormNested($aInput['name'], $aInput['ghost_template'], $this->aParams['db']['submit_name'], $this->oTemplate);
+            $sGhostTemplate = $oFormNested->getCode();
+
+        } elseif (isset($aInput['ghost_template']) && is_array($aInput['ghost_template']) && $aInput['ghost_template']) { // form is submitted and ghost template is array of BxDolFormNested objects
+
+            $sGhostTemplate = array ();
+            foreach ($aInput['ghost_template'] as $iFileId => $oFormNested)
+                if (is_object($oFormNested) && $oFormNested instanceof BxDolFormNested)
+                    $sGhostTemplate[$iFileId] = $oFormNested->genForm();
+
+        } elseif (isset($aInput['ghost_template']) && is_string($aInput['ghost_template'])) { // ghost template is just string template, without nested form
+
+            $sGhostTemplate = $aInput['ghost_template'];
+
+        }
+
+        return $sGhostTemplate;
+    }
+
     protected function genCustomInputUsernamesSuggestions ($aInput)
     {
         $this->oTemplate->addJs(array(